From 18e8c9411e53856368936df14a416ef90667d881 Mon Sep 17 00:00:00 2001 From: Baptiste Toulemonde <toulemonde@cines.fr> Date: Mon, 26 Jul 2021 16:35:12 +0200 Subject: [PATCH 1/3] add feature to save locally and impor from json file the path corresponding to the dcat property --- src/app/mapping/class/dataset.ts | 10 +++++++ src/app/mapping/mapping.component.html | 17 ++++++++--- src/app/mapping/mapping.component.scss | 10 +++++-- src/app/mapping/mapping.component.ts | 41 ++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/app/mapping/class/dataset.ts b/src/app/mapping/class/dataset.ts index 67c5bf82c..d4f2f6499 100644 --- a/src/app/mapping/class/dataset.ts +++ b/src/app/mapping/class/dataset.ts @@ -4,4 +4,14 @@ export class Dataset { public usageNote: string; } +export class DatasetPath { + public dcatProperty: string; + public path: string + + constructor(dcatProperty: string, path: string) { + this.dcatProperty = dcatProperty; + this.path = path; + } +} + diff --git a/src/app/mapping/mapping.component.html b/src/app/mapping/mapping.component.html index eea8261a5..d8220f8bd 100644 --- a/src/app/mapping/mapping.component.html +++ b/src/app/mapping/mapping.component.html @@ -1,9 +1,14 @@ <form #form="ngForm"> <div class="card-row"> <div class="card-col"> - <nb-card size="giant" > + <nb-card size="giant"> <nb-card-header>Dataset metadata</nb-card-header> <nb-card-body> + <div class="row"> + <p>Upload Or fill out the form with the path corresponding to the dcat property and save a new file for next mappings:</p> + <button class="button-center" nbButton status="primary" (click)="openFileInputDialog()"><nb-icon icon="upload-outline"></nb-icon>Import file</button> + <input type="file" id="file" (change)="importJson($event)" accept=".json" /> + </div> <ng-container *ngFor="let dataset of datasetModel; let index = index;trackBy:trackByIndex;"> <nb-form-field> @@ -43,7 +48,7 @@ #autoInput #{{dataset.identifier}}="ngModel" fullWidth id="{{dataset.identifier}}" name="{{dataset.identifier}}" nbInput (input)="onChange()" placeholder="Enter value" [nbAutocomplete]="auto" - [(ngModel)]="selectedPaths[index]" autocomplete="false" (focus)="reset()" /> + [(ngModel)]="selectedPaths[index]" autocomplete="false" (focus)="reset()" /> <nb-autocomplete #auto> @@ -63,6 +68,9 @@ </nb-card> </div> </div> + <div class="row"> + <button class="button-center" nbButton status="primary" (click)="downloadJson()">Save locally</button> + </div> <div class="row"> <button class="button-center" nbButton status="primary" (click)="mapDataset()" [disabled]="!form.valid">Check mapping</button> @@ -78,7 +86,7 @@ <nb-list-item *ngFor="let data of mappedMetadatas[index] | keyvalue; trackBy:trackByIndex; "> <div class="row"> <div class="col-5"><label for="{{data.key}}">{{data.key}}</label></div> - <div class="col-5"> <input nbInput [ngModel]="data.value" + <div class="col-5"> <input nbInput [ngModel]="data.value" (ngModelChange)="mappedMetadatas[index].set(data.key, $event)" /> </div> <div class="col-2"><button nbButton ghost> <nb-icon icon="trash-2-outline" status="danger" (click)="deleteProperty(data.key)"> @@ -107,7 +115,8 @@ </div> <div class="row"> <div class="button-center" *ngIf="!first "> - <button nbButton status="primary" (click)=" publishDataset()" [nbSpinner]="loading" nbSpinnerStatus="basic" >Publish</button> + <button nbButton status="primary" (click)=" publishDataset()" [nbSpinner]="loading" + nbSpinnerStatus="basic">Publish</button> </div> </div> diff --git a/src/app/mapping/mapping.component.scss b/src/app/mapping/mapping.component.scss index 9a0e26439..289b1adb3 100644 --- a/src/app/mapping/mapping.component.scss +++ b/src/app/mapping/mapping.component.scss @@ -7,7 +7,8 @@ .row { display: flex; flex: 1 0 calc(100%); - margin: 0 -0.5rem; + margin: 5px -0.5rem; + } .card-col { @@ -53,4 +54,9 @@ .button-center{ vertical-align: middle; margin: auto - } \ No newline at end of file + } + + #file { + display: none; + } + diff --git a/src/app/mapping/mapping.component.ts b/src/app/mapping/mapping.component.ts index 0b54724dd..94632be62 100644 --- a/src/app/mapping/mapping.component.ts +++ b/src/app/mapping/mapping.component.ts @@ -4,13 +4,14 @@ import { HttpResponse } from '@angular/common/http'; import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; +import { FileSaverService } from 'ngx-filesaver'; import { Observable, of, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { environment } from 'src/environments/environment.prod'; import { DatasetCrudService } from '../datasets/services/dataset-crud.service'; -import { Dataset } from './class/dataset'; +import { Dataset, DatasetPath } from './class/dataset'; import { FeedbackDialogComponent } from './dialog/feedback-dialog/feedback-dialog.component'; @@ -40,7 +41,7 @@ export class MappingComponent implements OnInit { @ViewChild('autoInput') input; @Input() catalogId: any; - constructor(private dataSetService: DatasetCrudService, private dialog: MatDialog, private route: Router) { } + constructor(private dataSetService: DatasetCrudService, private dialog: MatDialog, private route: Router, private fileSaverService: FileSaverService) { } ngOnInit() { this.dataSetService.getLocally('./assets/dataset.json').subscribe( @@ -253,6 +254,42 @@ export class MappingComponent implements OnInit { console.log('index = ' + this.index); } + downloadJson() { + let datasetPathArray: DatasetPath[] = []; + for (let i = 0; i < this.datasetModel.length; i++){ + if (this.selectedPaths[i]) { + datasetPathArray.push(new DatasetPath(this.datasetModel[i].identifier, this.selectedPaths[i])); + } else { + datasetPathArray.push(new DatasetPath(this.datasetModel[i].identifier, "")); + } + + } + + const fileName = 'paths.json'; + const fileType = this.fileSaverService.genType(fileName); + const txtBlob = new Blob([(JSON.stringify(datasetPathArray)).toString()], {type: fileName}); + this.fileSaverService.save(txtBlob, fileName); + } + + openFileInputDialog(): void { + document.getElementById('file').click(); + } + + importJson(event: Event) { + const files: FileList = (event.target as HTMLInputElement).files; + const jsonFile = files[0]; + console.log(jsonFile) + let reader = new FileReader(); + let datasetPath: DatasetPath[] = []; + reader.onloadend = () => { + + datasetPath = <DatasetPath[]> JSON.parse(reader.result as string); + datasetPath.forEach(e => { + this.selectedPaths[datasetPath.indexOf(e)] = e.path; + }) + } + reader.readAsText(jsonFile); + } // to delete a property of dcat dataset mapped deleteProperty(key: string) { this.mappedMetadatas[this.index].delete(key); -- GitLab From bd8863b2607eb30df211a288b60d4760fd22214c Mon Sep 17 00:00:00 2001 From: Baptiste Toulemonde <toulemonde@cines.fr> Date: Mon, 26 Jul 2021 22:07:35 +0200 Subject: [PATCH 2/3] fixes --- src/app/mapping/mapping.component.html | 11 +++++++---- src/app/mapping/mapping.component.ts | 20 +++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/app/mapping/mapping.component.html b/src/app/mapping/mapping.component.html index d8220f8bd..06db8c767 100644 --- a/src/app/mapping/mapping.component.html +++ b/src/app/mapping/mapping.component.html @@ -5,9 +5,12 @@ <nb-card-header>Dataset metadata</nb-card-header> <nb-card-body> <div class="row"> - <p>Upload Or fill out the form with the path corresponding to the dcat property and save a new file for next mappings:</p> - <button class="button-center" nbButton status="primary" (click)="openFileInputDialog()"><nb-icon icon="upload-outline"></nb-icon>Import file</button> - <input type="file" id="file" (change)="importJson($event)" accept=".json" /> + <p>Upload Or fill out the form with the path corresponding to the dcat property and save a new + file for next mappings:</p> + <button class="button-center" nbButton status="primary" (click)="openFileInputDialog()"> + <nb-icon icon="upload-outline"></nb-icon>Import file + </button> + <input type="file" id="file" (change)="importJson($event)" accept=".json" /> </div> <ng-container *ngFor="let dataset of datasetModel; let index = index;trackBy:trackByIndex;"> @@ -78,7 +81,7 @@ </form> <div class="card-row"> <div class="card-col"> - <nb-card [nbSpinner]="loadingCr" nbSpinnerStatus="primary" nbSpinnerSize="large" nbSpinnerMessage="loading"> + <nb-card [nbSpinner]="loadingCr" nbSpinnerStatus="primary" nbSpinnerSize="giant" nbSpinnerMessage="loading"> <nb-card-header>Map</nb-card-header> <nb-card-body> <nb-list> diff --git a/src/app/mapping/mapping.component.ts b/src/app/mapping/mapping.component.ts index 94632be62..5e76bf221 100644 --- a/src/app/mapping/mapping.component.ts +++ b/src/app/mapping/mapping.component.ts @@ -71,7 +71,6 @@ export class MappingComponent implements OnInit { } createDataset(item: Object): Map<string, string> { - this.loadingCr = true; let mappedMetadata: Map<string, string> = new Map() for (let i = 0; i < this.selectedPaths.length; i++) { if (this.selectedPaths[i]) { @@ -79,7 +78,7 @@ export class MappingComponent implements OnInit { mappedMetadata.set(this.datasetModel[i].identifier, this.getValue(tab, item)); } } - this.loadingCr = false + this.loadingCr = false; return mappedMetadata; } @@ -106,6 +105,9 @@ export class MappingComponent implements OnInit { case 'dcat:contactPoint': properties += key + ' <' + value + '>;\n'; break; + case 'dct:language': + properties += key + ' <' + value + '>;\n'; + break; default: properties += key + ' "' + value + '";\n'; break; @@ -193,12 +195,12 @@ export class MappingComponent implements OnInit { } else if (i < tab.length - 1 && obj[tab[i]]) { obj = obj[tab[i]]; } else { - if (obj[tab[i]]) { + if (obj[tab[i]] && typeof obj[tab[i]] !== 'object') { return obj[tab[i]]; } else { if (i == tab.length - 2) { this.getKeysFromMetadata(item, ""); - console.log(tab[i]) + console.log(tab[i] + " " + i) this.keys.forEach(k => { let table = k.split(" : "); if (table[table.length - 2] === tab[i]) { @@ -211,7 +213,7 @@ export class MappingComponent implements OnInit { } else if (i < table.length - 1 && obj[table[i]]) { obj = obj[table[i]]; } else { - if (obj[table[i]]) { + if (obj[table[i]] && typeof obj[tab[i]] !== 'object') { return obj[table[i]]; } else { return 'undefined'; @@ -230,13 +232,13 @@ export class MappingComponent implements OnInit { mapDataset() { + this.loadingCr = true; this.mappedMetadatas = []; this.itemsdataset.forEach((dataset: Object) => { - this.mappedMetadatas.push(this.createDataset(dataset)) + this.mappedMetadatas.push(this.createDataset(dataset)); }) - console.log(this.mappedMetadatas) - this.first = false; - } + console.log(this.mappedMetadatas); + this.first = false; } next() { this.loadingCr = true; if (this.index < this.itemsdataset.length) { -- GitLab From d650b63689d775b756a8dd2f4fe4fc6bce36195b Mon Sep 17 00:00:00 2001 From: Baptiste Toulemonde <toulemonde@cines.fr> Date: Tue, 27 Jul 2021 11:43:44 +0200 Subject: [PATCH 3/3] fix path to id # --- src/app/datasets/datasets.component.ts | 2 +- src/app/publishapi/publishapi.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/datasets/datasets.component.ts b/src/app/datasets/datasets.component.ts index f7db5d4bd..a3990d466 100644 --- a/src/app/datasets/datasets.component.ts +++ b/src/app/datasets/datasets.component.ts @@ -227,7 +227,7 @@ export class DatasetsComponent implements OnInit, OnChanges { continue; } - return content.example.split(':'); + return content.example.split('#'); } } } diff --git a/src/app/publishapi/publishapi.component.html b/src/app/publishapi/publishapi.component.html index f667a8174..0faee30e9 100644 --- a/src/app/publishapi/publishapi.component.html +++ b/src/app/publishapi/publishapi.component.html @@ -250,7 +250,7 @@ <div *ngFor="let content of response.contents"> <nb-form-field> <nb-icon nbSuffix icon="question-mark-circle-outline" pack="eva" - nbTooltip="Example: key1:key2:key3" nbTooltipPlacement="right"> + nbTooltip="Example: key1#key2#key3" nbTooltipPlacement="right"> </nb-icon> <input name="default" [(ngModel)]="content.example" nbInput /> </nb-form-field> -- GitLab