diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 02253e0c..882a6f33 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -29,7 +29,7 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; -import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent } from './dsm/dsm.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent, DsmBrowseDialog } from './dsm/dsm.component'; @NgModule({ declarations: [ @@ -54,7 +54,8 @@ import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComp DsmSearchComponent, DsmResultsComponent, DsmApiComponent, - DsmAddApiComponent + DsmAddApiComponent, + DsmBrowseDialog ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html new file mode 100644 index 00000000..0c0d3131 --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html @@ -0,0 +1,36 @@ +

{{data.label}}

+ +
+ + Filter + + + + + + + + + + + + + + + + + + + + + + +
Name + {{element.name}} + # datasources {{element.total}}
No data matching the filter "{{input.value}}"
+ +
+ +
+ +
diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html index 8c0318ce..9d2b170c 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html @@ -1 +1,17 @@ -

dsm search

+

Datasource Manager: Search

+ +
+ + Search... + + +
+ +
+

Or browse using:

+ +
diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 14e8440d..3428d691 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,11 +1,47 @@ -import { Component } from '@angular/core'; +import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { BrowseTerm, KeyValue } from '../model/controller.model'; +import { ISService } from '../is.service'; +import { ActivatedRoute, Params } from '@angular/router'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; +import { Observable, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VocabularyTerm } from '../model/controller.model'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { EmitterVisitorContext } from '@angular/compiler'; +import { Router } from '@angular/router'; + @Component({ selector: 'app-dsm-search', templateUrl: './dsm-search.component.html', styleUrls: ['./dsm.component.css'] }) -export class DsmSearchComponent { +export class DsmSearchComponent implements OnInit { + searchText:string = ''; + browsableFields:KeyValue[] = []; + + constructor(public service: ISService, public route: ActivatedRoute, public router: Router, public dialog: MatDialog) { + } + + ngOnInit() { + this.service.dsmBrowsableFields((data: KeyValue[]) => this.browsableFields = data); + } + + search() { + this.router.navigate(['/dsm/results/0/100'], { + queryParams: { value: this.searchText } + }); + } + + browseField(field:string, label:string) { + const dialogRef = this.dialog.open(DsmBrowseDialog, { + data: { field: field, label: label }, + width: '80%' + }); + } } @@ -15,7 +51,6 @@ export class DsmSearchComponent { styleUrls: ['./dsm.component.css'] }) export class DsmResultsComponent { - } @Component({ @@ -35,3 +70,39 @@ export class DsmApiComponent { export class DsmAddApiComponent { } + + + + +@Component({ + selector: 'dsm-browse-dialog', + templateUrl: 'dsm-browse-dialog.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmBrowseDialog implements OnInit{ + + datasource: MatTableDataSource = new MatTableDataSource([]); + colums: string[] = ['name', 'total']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + } + + ngOnInit(): void { + this.service.dsmBrowse(this.data.field, (res:BrowseTerm[]) => this.datasource.data = res); + } + + ngAfterViewInit() { + if (this.sort) this.datasource.sort = this.sort; + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.datasource.filter = filterValue; + } + + onNoClick(): void { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 4164d44b..1b523ea4 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -186,6 +186,20 @@ export class ISService { }); } + dsmBrowsableFields(onSuccess: Function) { + this.client.get('./ajax/dsm/browsableFields').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + dsmBrowse(field:string, onSuccess: Function) { + this.client.get('./ajax/dsm/browse/' + encodeURIComponent(field)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index d1cbeb29..5a312013 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -11,6 +11,13 @@ export interface KeyValue { v: string; } + +export interface BrowseTerm { + term: string, + name: string, + total: number +} + export interface Module { group: string; name: string; diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 91fefbac..5b998665 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -30,11 +30,15 @@ a, a:not([href]) { -webkit-user-select: none; -moz-user-select: none; user-select: none; - text-decoration: underline; + text-decoration: none; text-underline-offset: 3px; color: #336699; } +a:hover, a:not([href]):hover { + text-decoration: underline; +} + table { table-layout: fixed !important; }