diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 346e42a6..82830491 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 { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; -import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; +import { VocabulariesComponent, VocabularyEditorComponent, VocDialog } from './vocabularies/vocabularies.component'; @NgModule({ declarations: [ @@ -49,7 +49,8 @@ import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies ContextViewerComponent, ContextParamsDialog, VocabulariesComponent, - VocabulariesComponent + VocabularyEditorComponent, + VocDialog ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/contexts/context-params.html b/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html similarity index 100% rename from frontends/dnet-is-application/src/app/contexts/context-params.html rename to frontends/dnet-is-application/src/app/contexts/context-params-dialog.html diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.css b/frontends/dnet-is-application/src/app/contexts/contexts.component.css index b8d78c73..c0c2065c 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.css +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.css @@ -1,9 +1,3 @@ -.table-buttons { text-align: right; } -.table-buttons button { - font-size: 0.8em; - padding: 0 !important; - height: 2.5em !important; -} .context-node { padding-top: 1em; diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 94c5b74f..2f26a105 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -53,7 +53,7 @@ export class ContextsComponent implements AfterViewInit ,OnInit { @Component({ selector: 'context-dialog', - templateUrl: 'context-params.html', + templateUrl: 'context-params-dialog.html', styleUrls: ['./contexts.component.css'] }) export class ContextParamsDialog { diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index dd0cb800..7a57a86b 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 } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -133,6 +133,27 @@ export class ISService { }); } + loadVocabularies(onSuccess: Function): void { + this.client.get('./ajax/vocs/').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + saveVocabulary(voc:Vocabulary, onSuccess: Function, relatedForm?: FormGroup): void { + this.client.post('./ajax/vocs/', voc).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); + } + + deleteVocabulary(vocId:string, onSuccess: Function): void { + this.client.delete('./ajax/vocs/' + encodeURIComponent(vocId)).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 1c9084a1..f3b78183 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -76,3 +76,9 @@ export interface ContextNode { populated?: boolean, childs?: ContextNode[] } + +export interface Vocabulary { + id: string, + name: string, + description?: string +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html new file mode 100644 index 00000000..e08a107e --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html @@ -0,0 +1,32 @@ +
+

Edit vocabulary

+

New vocabulary

+ +
+ + ID + + This field is required + + + + Name + + This field is required + + + + Description + + +
+ +
+ + + + {{ vocForm.errors?.['serverError'] }} + +
+ +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html index 843508fe..0817c813 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html @@ -1 +1,44 @@ -

vocabularies works!

+

Vocabularies

+ + + + + Filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id + {{element.id}} + Name {{element.name}} Description {{element.description}} + + +
No data matching the filter "{{input.value}}"
diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index c684c0c8..1d2076d3 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,4 +1,14 @@ -import { Component } from '@angular/core'; +import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { ISService } from '../is.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { Vocabulary } from '../model/controller.model'; +import { ActivatedRoute, Params } from '@angular/router'; +import { Observable, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { KeyValue, ContextParam } from '../model/controller.model'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; @Component({ selector: 'app-vocabularies', @@ -6,6 +16,60 @@ import { Component } from '@angular/core'; styleUrls: ['./vocabularies.component.css'] }) export class VocabulariesComponent { + vocsDatasource: MatTableDataSource = new MatTableDataSource([]); + + colums: string[] = ['id', 'name', 'description', 'buttons']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + } + + ngOnInit() { + this.reload(); + } + + ngAfterViewInit() { + if(this.sort) this.vocsDatasource.sort = this.sort; + } + + reload() { + this.service.loadVocabularies((data: Vocabulary[]) => this.vocsDatasource.data = data); + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.vocsDatasource.filter = filterValue; + } + + newVocabularyDialog(): void { + const dialogRef = this.dialog.open(VocDialog, { + data: { id: '', name: '', description: '' }, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + editVocabularyDialog(vocabulary: Vocabulary): void { + const dialogRef = this.dialog.open(VocDialog, { + data: vocabulary, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + deleteVocabularyDialog(vocabulary: Vocabulary): void { + if (confirm("Are you sure?")) { + this.service.deleteVocabulary(vocabulary.id , (data:void) => this.reload()); + } + } + } @@ -15,5 +79,32 @@ export class VocabulariesComponent { styleUrls: ['./vocabularies.component.css'] }) export class VocabularyEditorComponent { - } + +@Component({ + selector: 'voc-dialog', + templateUrl: 'voc-dialog.html', + styleUrls: ['vocabularies.component.css'] +}) +export class VocDialog { + vocForm = new FormGroup({ + id: new FormControl(''), + name: new FormControl(''), + description : new FormControl('') + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + this.vocForm.get('id')?.setValue(data.id); + this.vocForm.get('name')?.setValue(data.name); + this.vocForm.get('description')?.setValue(data.description); + } + + onSubmit():void { + const voc = Object.assign({}, this.data, this.vocForm.value); + this.service.saveVocabulary(voc, (data: void) => this.dialogRef.close(1), this.vocForm); + } + + onNoClick(): void { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html index e69de29b..dd0279ba 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html @@ -0,0 +1 @@ +VOC EDITOR \ No newline at end of file diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 56a89aba..91fefbac 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -10,6 +10,13 @@ table { width: 100%; } +.table-buttons { text-align: right !important; } +.table-buttons button { + font-size: 0.8em !important; + padding: 0 !important; + height: 2.5em !important; +} + .warning { background-color: darkorange; }