diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..de51f68a2cda6df56ca45d06ade37f126bfc8e31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/client/src/app/instance/documentation/components/dataset-by-family.component.html b/client/src/app/instance/documentation/components/dataset-by-family.component.html new file mode 100644 index 0000000000000000000000000000000000000000..9ec4e190718bba199f9c9414039e1c9be1d0e03e --- /dev/null +++ b/client/src/app/instance/documentation/components/dataset-by-family.component.html @@ -0,0 +1,51 @@ +<div *ngIf="datasetFamilyList.length === 1"> + <div class="border rounded my-2"> + <p *ngIf="(datasetList | datasetListByFamily:datasetFamilyList[0].id).length === 1" + class="border-bottom bg-light text-primary py-4 pl-4"> + Dataset + </p> + <p *ngIf="(datasetList | datasetListByFamily:datasetFamilyList[0].id).length > 1" + class="border-bottom bg-light text-primary py-4 pl-4"> + List of datasets + </p> + <ul class="p-0"> + <li *ngFor="let dataset of (datasetList | datasetListByFamily:datasetFamilyList[0].id); last as isLast" + class="list-unstyled px-3 pt-3 pb-0"> + <app-dataset-card-doc + [dataset]="dataset" + [survey]="surveyList | surveyByName:dataset.survey_name" + [instanceSelected]="instanceSelected"> + </app-dataset-card-doc> + <hr *ngIf="!isLast"> + </li> + </ul> + </div> +</div> + +<accordion *ngIf="datasetFamilyList.length > 1" [isAnimated]="true"> + <ng-container *ngFor="let family of datasetFamilyList"> + <accordion-group #ag *ngIf="(datasetList | datasetListByFamily:family.id).length > 0" [panelClass]="'custom-accordion'" + [isOpen]="true" class="my-2"> + <button class="btn btn-link btn-block clearfix" accordion-heading> + <span class="pull-left float-left"> + {{ family.label }} + + <span *ngIf="ag.isOpen"> + <span class="fas fa-chevron-up"></span> + </span> + <span *ngIf="!ag.isOpen"> + <span class="fas fa-chevron-down"></span> + </span> + </span> + </button> + <div *ngFor="let dataset of (datasetList | datasetListByFamily:family.id); last as isLast"> + <app-dataset-card-doc + [dataset]="dataset" + [survey]="surveyList | surveyByName:dataset.survey_name" + [instanceSelected]="instanceSelected"> + </app-dataset-card-doc> + <hr *ngIf="!isLast"> + </div> + </accordion-group> + </ng-container> +</accordion> diff --git a/client/src/app/instance/documentation/components/dataset-by-family.component.scss b/client/src/app/instance/documentation/components/dataset-by-family.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..537c2ca10228b7aa40a424334498ba2dcfcd0464 --- /dev/null +++ b/client/src/app/instance/documentation/components/dataset-by-family.component.scss @@ -0,0 +1,32 @@ +/** + * This file is part of Anis Client. + * + * @copyright Laboratoire d'Astrophysique de Marseille / CNRS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +.tabset .tab-pane, .tabset .tab-pane .family-empty { + min-height: 300px; +} + +.tabset .tab-pane { + padding-top: 13px; +} + +.tabset .active.tab-pane { + border: 1px solid #dee2e6; + border-top: none; + border-bottom-left-radius: .25rem; + border-bottom-right-radius: .25rem; +} + +.dataset-card { + width: 95%; + border-bottom: 1px solid #dee2e6; +} + +.dataset-card:last-child { + border: none; +} diff --git a/client/src/app/instance/documentation/components/dataset-by-family.component.ts b/client/src/app/instance/documentation/components/dataset-by-family.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8f09f1df80e97bb388099d481a05eb53d2c34da7 --- /dev/null +++ b/client/src/app/instance/documentation/components/dataset-by-family.component.ts @@ -0,0 +1,29 @@ +/** + * This file is part of Anis Client. + * + * @copyright Laboratoire d'Astrophysique de Marseille / CNRS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; + +import { Dataset, DatasetFamily, Survey } from 'src/app/metamodel/models'; + +@Component({ + selector: 'app-dataset-by-family', + templateUrl: 'dataset-by-family.component.html', + styleUrls: ['dataset-by-family.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +/** + * @class + * @classdesc Documentation dataset by family component. + */ +export class DatasetByFamilyComponent { + @Input() datasetList: Dataset[]; + @Input() datasetFamilyList: DatasetFamily[]; + @Input() surveyList: Survey[]; + @Input() instanceSelected: string; +} diff --git a/client/src/app/instance/documentation/components/dataset-card-doc.component.html b/client/src/app/instance/documentation/components/dataset-card-doc.component.html new file mode 100644 index 0000000000000000000000000000000000000000..ef6dda4c88a7d12e1eb56d5308aca6ba6b904995 --- /dev/null +++ b/client/src/app/instance/documentation/components/dataset-card-doc.component.html @@ -0,0 +1,33 @@ +<div class="card border-0"> + <div class="card-body py-2"> + <div class="row"> + <div class="col"> + <div class="row"> + <p class="lead m-0 d-inline"> + {{ dataset.label }} + </p> + </div> + <div class="row"> + <p class="my-3">{{ dataset.description }}</p> + </div> + <div class="row"> + <button class="btn btn-link p-0" + popover="{{ survey.description }}" + popoverTitle="{{ survey.label }}" + placement="bottom" + triggers="mouseenter:mouseleave"> + <small> + More about {{ survey.label }} survey <span class="fas fa-question-circle"></span> + </small> + </button> + </div> + </div> + <div class="col-auto"> + <button (click)="selectDataset(dataset.name)" + class="btn btn-outline-secondary"> + Select + </button> + </div> + </div> + </div> +</div> diff --git a/client/src/app/instance/documentation/components/dataset-card-doc.component.ts b/client/src/app/instance/documentation/components/dataset-card-doc.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..adcfcf400fa4169fb562d3f332f39c049352b3ec --- /dev/null +++ b/client/src/app/instance/documentation/components/dataset-card-doc.component.ts @@ -0,0 +1,35 @@ +/** + * This file is part of Anis Client. + * + * @copyright Laboratoire d'Astrophysique de Marseille / CNRS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; +import { Router } from '@angular/router'; + +import { Survey, Dataset } from 'src/app/metamodel/models'; + +@Component({ + selector: 'app-dataset-card-doc', + templateUrl: 'dataset-card-doc.component.html', + changeDetection: ChangeDetectionStrategy.OnPush +}) +/** + * @class + * @classdesc Documentation dataset card component. + */ +export class DatasetCardDocComponent { + @Input() survey: Survey; + @Input() dataset: Dataset; + @Input() instanceSelected: string; + + constructor(private router: Router) { } + + selectDataset(datasetName: string) { + this.router.routeReuseStrategy.shouldReuseRoute = () => false; + this.router.navigate([`/instance/${this.instanceSelected}/documentation/${datasetName}`]); + } +} diff --git a/client/src/app/instance/documentation/components/index.ts b/client/src/app/instance/documentation/components/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a4c97d3abd4d83a23b0ce9ee7365150ae024cc47 --- /dev/null +++ b/client/src/app/instance/documentation/components/index.ts @@ -0,0 +1,9 @@ +import { DatasetByFamilyComponent } from './dataset-by-family.component'; +import { DatasetCardDocComponent } from './dataset-card-doc.component'; +import { OutputListComponent } from "./output-list.component"; + +export const dummiesComponents = [ + DatasetByFamilyComponent, + DatasetCardDocComponent, + OutputListComponent +]; diff --git a/client/src/app/instance/documentation/components/output-list.component.html b/client/src/app/instance/documentation/components/output-list.component.html new file mode 100644 index 0000000000000000000000000000000000000000..14fa0ec4fa11969501ef9c13e0b601c44864abba --- /dev/null +++ b/client/src/app/instance/documentation/components/output-list.component.html @@ -0,0 +1,12 @@ +<h4>Available outputs for {{ datasetSelected }}</h4> + +<table id="table" class="attributes-table p-0"> + <tr> + <th>id</th> + <th>attribute</th> + </tr> + <tr *ngFor="let attribute of attributeList"> + <td>{{ attribute.id }}</td> + <td>{{ attribute.name }}</td> + </tr> +</table> diff --git a/client/src/app/instance/documentation/components/output-list.component.ts b/client/src/app/instance/documentation/components/output-list.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d13b94d46d6c91fe403f2c21acf7474a4bc5604 --- /dev/null +++ b/client/src/app/instance/documentation/components/output-list.component.ts @@ -0,0 +1,27 @@ +/** + * This file is part of Anis Client. + * + * @copyright Laboratoire d'Astrophysique de Marseille / CNRS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; + +import { Attribute } from 'src/app/metamodel/models'; + +@Component({ + selector: 'app-output-list', + templateUrl: 'output-list.component.html', + styleUrls: ['../documentation.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +/** + * @class + * @classdesc Documentation output list component. + */ +export class OutputListComponent { + @Input() datasetSelected: string; + @Input() attributeList: Attribute[]; +} diff --git a/client/src/app/instance/documentation/containers/dataset-list.component.html b/client/src/app/instance/documentation/containers/dataset-list.component.html new file mode 100644 index 0000000000000000000000000000000000000000..91d2e14900928758b0ebb8e89f93bc69e3d3bf5d --- /dev/null +++ b/client/src/app/instance/documentation/containers/dataset-list.component.html @@ -0,0 +1,29 @@ +<app-spinner *ngIf="(datasetFamilyListIsLoading | async) + || (datasetListIsLoading | async) + || (surveyListIsLoading | async)"> +</app-spinner> + +<div *ngIf="(datasetFamilyListIsLoaded | async) + && (datasetListIsLoaded | async) + && (surveyListIsLoaded | async)" class="container"> + <div class="row mt-4"> + <ng-container *ngIf="(datasetList | async).length === 0"> + <div class="col-12 lead text-center"> + Oops! No dataset available... + <span *ngIf="!(isAuthenticated | async)"> + Try to sign in to access to protected datasets. + </span> + </div> + </ng-container> + <ng-container *ngIf="(datasetList | async).length > 0"> + <div class="col-12"> + <app-dataset-by-family + [datasetList]="datasetList | async" + [datasetFamilyList]="datasetFamilyList | async" + [surveyList]="surveyList | async" + [instanceSelected]="instanceSelected | async"> + </app-dataset-by-family> + </div> + </ng-container> + </div> +</div> \ No newline at end of file diff --git a/client/src/app/instance/documentation/containers/dataset-list.component.ts b/client/src/app/instance/documentation/containers/dataset-list.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..88997f508376a8db320243e444b2a9225683c8e2 --- /dev/null +++ b/client/src/app/instance/documentation/containers/dataset-list.component.ts @@ -0,0 +1,65 @@ +/** + * This file is part of Anis Client. + * + * @copyright Laboratoire d'Astrophysique de Marseille / CNRS + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Component, OnInit } from '@angular/core'; + +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; + +import * as datasetActions from 'src/app/metamodel/actions/dataset.actions'; +import * as datasetFamilySelector from 'src/app/metamodel/selectors/dataset-family.selector'; +import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector'; +import { Dataset, DatasetFamily, Survey } from 'src/app/metamodel/models'; +import { environment } from 'src/environments/environment'; +import * as authSelector from "../../../auth/auth.selector"; +import * as instanceSelector from "../../../metamodel/selectors/instance.selector"; +import * as surveySelector from "../../../metamodel/selectors/survey.selector"; + +@Component({ + selector: 'app-dataset-list', + templateUrl: 'dataset-list.component.html', + styleUrls: ['../documentation.component.scss'] +}) +/** + * @class + * @classdesc Documentation dataset list container. + * + * @implements OnInit + */ +export class DatasetListComponent implements OnInit { + public instanceSelected: Observable<string>; + public isAuthenticated: Observable<boolean>; + public datasetFamilyListIsLoading: Observable<boolean>; + public datasetFamilyListIsLoaded: Observable<boolean>; + public datasetFamilyList: Observable<DatasetFamily[]>; + public surveyListIsLoading: Observable<boolean>; + public surveyListIsLoaded: Observable<boolean>; + public surveyList: Observable<Survey[]>; + public datasetListIsLoading: Observable<boolean>; + public datasetListIsLoaded: Observable<boolean>; + public datasetList: Observable<Dataset[]>; + + constructor(private store: Store<{ }>) { + this.instanceSelected = store.select(instanceSelector.selectInstanceNameByRoute); + this.isAuthenticated = store.select(authSelector.selectIsAuthenticated); + this.datasetFamilyListIsLoading = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoading); + this.datasetFamilyListIsLoaded = store.select(datasetFamilySelector.selectDatasetFamilyListIsLoaded); + this.datasetFamilyList = store.select(datasetFamilySelector.selectAllDatasetFamilies); + this.surveyListIsLoading = store.select(surveySelector.selectSurveyListIsLoading); + this.surveyListIsLoaded = store.select(surveySelector.selectSurveyListIsLoaded); + this.surveyList = store.select(surveySelector.selectAllSurveys); + this.datasetListIsLoading = store.select(datasetSelector.selectDatasetListIsLoading); + this.datasetListIsLoaded = store.select(datasetSelector.selectDatasetListIsLoaded); + this.datasetList = store.select(datasetSelector.selectAllDatasets); + } + + ngOnInit() { + this.store.dispatch(datasetActions.loadDatasetList()); + } +} diff --git a/client/src/app/instance/documentation/documentation.component.html b/client/src/app/instance/documentation/containers/documentation.component.html similarity index 78% rename from client/src/app/instance/documentation/documentation.component.html rename to client/src/app/instance/documentation/containers/documentation.component.html index a4af4e81b2d3d9add01b31a47ad4b4944f95c267..95e84e96074cd5134d731c5fbaa6746f50b07ee3 100644 --- a/client/src/app/instance/documentation/documentation.component.html +++ b/client/src/app/instance/documentation/containers/documentation.component.html @@ -1,16 +1,18 @@ <div class="container"> + <app-spinner *ngIf="attributeListIsLoading | async"></app-spinner> + <div class="jumbotron"> <div class="row align-items-center"> <div class="col-md-12 order-md-1 text-justify text-md-left pr-md-5"> <h2 class="mb-3">Export server documentation</h2> - + <h4>URL construction</h4> <p> To request the server, you need to construct a correct URL. Just below you can find the URL schema and a description of mandatory parameters: </p> <code>{{ getUrlServer() }}/search/dataset?a=id_attribute&c=id_attribute::operator::value</code> - + <ul> <li> <code>dataset</code>: dataset in which to search. See datasets section for available datasets. @@ -20,51 +22,17 @@ </li> <blockquote>a=1;2;3</blockquote> <li> - <code>c</code>: criteria list separeted with semicolon. A criterion is defined by an id_attribute, + <code>c</code>: criteria list separated with semicolon. A criterion is defined by an id_attribute, an operator and a value. See operators section for available operators. </li> <blockquote>c=3::eq::ping;2::eq::pong</blockquote> </ul> - - <h4>Available parameters</h4> - - <h5>Datasets</h5> - <div *ngIf="datasetListIsLoading | async"> - <span class="fas fa-circle-notch fa-spin fa-3x"></span> - <span class="sr-only">Loading...</span> - </div> - <table *ngIf="datasetListIsLoaded | async" id="table"> - <tr> - <th>Dataset</th> - <th>Description</th> - </tr> - <tr *ngFor="let dataset of datasetList | async"> - <td>{{ dataset.name }}</td> - <td>{{ dataset.description }}</td> - </tr> - </table> - - <!-- <h5>Outputs</h5> - <div *ngIf="attributeListsIsLoading | async"> - <span class="fas fa-circle-notch fa-spin fa-3x"></span> - <span class="sr-only">Loading...</span> - </div> - <div *ngIf="attributeListsIsLoaded | async" class="row"> - <div *ngFor="let dataset of datasetList | async" class="col-auto mb-5"> - <h6>{{ dataset.label }} output list</h6> - <table id="table" class="attributes-table p-0"> - <tr> - <th>id</th> - <th>attribute</th> - </tr> - <tr *ngFor="let attribute of getAttributeList(dataset.name, attributeList | async)"> - <td>{{ attribute.id }}</td> - <td>{{ attribute.name }}</td> - </tr> - </table> - </div> - </div> --> - + + <app-output-list + [datasetSelected]="datasetSelected | async" + [attributeList]="attributeList | async"> + </app-output-list> + <h5>Operators</h5> <table id="table"> <tr> @@ -158,7 +126,7 @@ <td><code>c=1::js::PrimaryHDU,ID|eq|45</code></td> </tr> </table> - + <h4>Examples</h4> We supposed to have the dataset ping with following attributes: @@ -200,4 +168,8 @@ </div> </div> </div> + + <a routerLink='/instance/{{ instanceSelected | async }}/documentation' class="btn btn-outline-secondary mt-3"> + <span class="fas fa-arrow-left"></span> Return to previous page + </a> </div> diff --git a/client/src/app/instance/documentation/documentation.component.ts b/client/src/app/instance/documentation/containers/documentation.component.ts similarity index 51% rename from client/src/app/instance/documentation/documentation.component.ts rename to client/src/app/instance/documentation/containers/documentation.component.ts index ef1e591e1cf2cc8e9387046451201a2352d697d0..49d8b251223ae12942034bb37a68211a5f4318e7 100644 --- a/client/src/app/instance/documentation/documentation.component.ts +++ b/client/src/app/instance/documentation/containers/documentation.component.ts @@ -12,15 +12,17 @@ import { Component, OnInit } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import * as datasetActions from 'src/app/metamodel/actions/dataset.actions'; +import * as attributeActions from 'src/app/metamodel/actions/attribute.actions'; import * as datasetSelector from 'src/app/metamodel/selectors/dataset.selector'; -import { Dataset } from 'src/app/metamodel/models'; import { AppConfigService } from 'src/app/app-config.service'; +import { Attribute } from 'src/app/metamodel/models'; +import * as instanceSelector from "../../../metamodel/selectors/instance.selector"; +import * as attributeSelector from "../../../metamodel/selectors/attribute.selector"; @Component({ selector: 'app-documentation', templateUrl: 'documentation.component.html', - styleUrls: ['documentation.component.scss'] + styleUrls: ['../documentation.component.scss'] }) /** * @class @@ -29,18 +31,22 @@ import { AppConfigService } from 'src/app/app-config.service'; * @implements OnInit */ export class DocumentationComponent implements OnInit { - public datasetListIsLoading: Observable<boolean>; - public datasetListIsLoaded: Observable<boolean>; - public datasetList: Observable<Dataset[]>; + public instanceSelected: Observable<string>; + public datasetSelected: Observable<string>; + public attributeListIsLoading: Observable<boolean>; + public attributeListIsLoaded: Observable<boolean>; + public attributeList: Observable<Attribute[]>; constructor(private store: Store<{ }>, private config: AppConfigService) { - this.datasetListIsLoading = store.select(datasetSelector.selectDatasetListIsLoading); - this.datasetListIsLoaded = store.select(datasetSelector.selectDatasetListIsLoaded); - this.datasetList = store.select(datasetSelector.selectAllDatasets); + this.instanceSelected = store.select(instanceSelector.selectInstanceNameByRoute); + this.datasetSelected = store.select(datasetSelector.selectDatasetNameByRoute); + this.attributeListIsLoading = store.select(attributeSelector.selectAttributeListIsLoading); + this.attributeListIsLoaded = store.select(attributeSelector.selectAttributeListIsLoaded); + this.attributeList = store.select(attributeSelector.selectAllAttributes); } ngOnInit() { - this.store.dispatch(datasetActions.loadDatasetList()); + this.store.dispatch(attributeActions.loadAttributeList()); } /** diff --git a/client/src/app/instance/documentation/documentation-routing.module.ts b/client/src/app/instance/documentation/documentation-routing.module.ts index 879044992fcd0841d2772f1a75c8fd83a779519d..285ad9f802ab495dd3bccd3e83d959d44f0d6757 100644 --- a/client/src/app/instance/documentation/documentation-routing.module.ts +++ b/client/src/app/instance/documentation/documentation-routing.module.ts @@ -10,10 +10,12 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { DocumentationComponent } from './documentation.component'; +import { DatasetListComponent } from "./containers/dataset-list.component"; +import { DocumentationComponent } from "./containers/documentation.component"; const routes: Routes = [ - { path: '', component: DocumentationComponent } + { path: '', component: DatasetListComponent }, + { path: ':dname', component: DocumentationComponent }, ]; @NgModule({ @@ -23,5 +25,6 @@ const routes: Routes = [ export class DocumentationRoutingModule { } export const routedComponents = [ + DatasetListComponent, DocumentationComponent ]; diff --git a/client/src/app/instance/documentation/documentation.component.scss b/client/src/app/instance/documentation/documentation.component.scss index e3c1e5f2327b63123c231d88c1a2a25263105969..9628a449933337140b185beb8686a2df2db1959f 100644 --- a/client/src/app/instance/documentation/documentation.component.scss +++ b/client/src/app/instance/documentation/documentation.component.scss @@ -7,7 +7,7 @@ * file that was distributed with this source code. */ - blockquote { +blockquote { background: #f9f9f9; border-left: 10px solid #ccc; margin: 1.5em 10px; diff --git a/client/src/app/instance/documentation/documentation.module.ts b/client/src/app/instance/documentation/documentation.module.ts index 31a1371dbf8fb3ae30442160747c868e8e96153b..f1505519d6c296391630729e362f0b3de08c8480 100644 --- a/client/src/app/instance/documentation/documentation.module.ts +++ b/client/src/app/instance/documentation/documentation.module.ts @@ -11,12 +11,16 @@ import { NgModule } from '@angular/core'; import { SharedModule } from 'src/app/shared/shared.module'; import { DocumentationRoutingModule, routedComponents } from './documentation-routing.module'; +import { dummiesComponents } from './components'; @NgModule({ imports: [ SharedModule, DocumentationRoutingModule ], - declarations: [routedComponents] + declarations: [ + routedComponents, + dummiesComponents + ] }) export class DocumentationModule { } diff --git a/client/src/app/instance/instance.component.ts b/client/src/app/instance/instance.component.ts index 53fc798c6a9f63911e6127d4a58bec1aad4b4607..214fb769ab385501d5a877f016369ac40eb209f5 100644 --- a/client/src/app/instance/instance.component.ts +++ b/client/src/app/instance/instance.component.ts @@ -30,7 +30,7 @@ export class InstanceComponent implements OnInit { { label: 'Home', icon: 'fas fa-home', routerLink: 'home' }, { label: 'Search', icon: 'fas fa-search', routerLink: 'search' }, { label: 'Search multiple', icon: 'fas fa-search-plus', routerLink: 'search-multiple' }, - { label: 'Documentation', icon: 'fas fa-question', routerLink: 'documentation' } + { label: 'Documentation', icon: 'fas fa-question', routerLink: 'documentation' }, ]; public isAuthenticated: Observable<boolean>; public userProfile: Observable<UserProfile>;