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
+
+
+
+
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;
}