Skip to content
Snippets Groups Projects
Commit 169fb9bd authored by Charly Maeder's avatar Charly Maeder
Browse files

Merge branch 'master' into fix/describe_repository_api

parents 4a8ecce1 002f843c
Branches fix/describe_repository_api
No related tags found
1 merge request!18Feature/request history
......@@ -36,12 +36,13 @@ import { MappingComponent } from './mapping/mapping.component';
import { NebularModule } from './nebular.module';
import { AppRoutingModule } from './app-routing.module';
import { NbLayoutModule, NbThemeModule, NbTooltipModule, NbSpinnerModule, NbSelectModule, NbTabsetModule, NbAutocompleteModule, NbListModule, NbAccordionModule } from '@nebular/theme';
import { NbLayoutModule, NbThemeModule, NbTooltipModule, NbSpinnerModule, NbSelectModule, NbTabsetModule, NbAutocompleteModule, NbListModule, NbAccordionModule, NbDialogModule } from '@nebular/theme';
import { DashboardComponent } from './dashboard/dashboard.component';
import { FeedbackDialogComponent } from './mapping/dialog/feedback-dialog/feedback-dialog.component';
import { NbToastrModule } from '@nebular/theme';
import { DatasetsDialogComponent } from './datasets/datasets-dialog/datasets-dialog.component';
import { NbDialogModule } from '@nebular/theme';
......@@ -61,6 +62,7 @@ import { NbDialogModule } from '@nebular/theme';
StatsComponent,
DashboardComponent,
MappingComponent,
FeedbackDialogComponent,
DatasetsDialogComponent,
],
imports: [
......@@ -94,7 +96,7 @@ import { NbDialogModule } from '@nebular/theme';
NbToastrModule.forRoot(),
NbDialogModule.forRoot(),
],
entryComponents: [DatasetsDialogComponent],
entryComponents: [DatasetsDialogComponent, FeedbackDialogComponent],
providers: [
AppConfiguration,
ParseXmlService,
......
......@@ -56,7 +56,7 @@ export class DatasetsComponent implements OnInit, OnChanges {
}
ngOnInit() {
this.dataSetService.itemsDataset = [];
this.dataSetService.resetDataset()
}
......@@ -315,7 +315,7 @@ export class DatasetsComponent implements OnInit, OnChanges {
for (const id of datasetId) {
const requestPromise = this.launchRequest(datasetRequestPathName, datasetRequestHttpMethod, false, id)
.then((dataset) => {
this.dataSetService.saveDatasets(dataset);
this.dataSetService.saveDatasets(dataset, id);
});
requestPromises.push(requestPromise);
}
......
......@@ -15,20 +15,22 @@ export class DatasetCrudService {
fds2Token: string = this.sessionStorage.getFDPToken();
public results: string[] = [];
itemsDataset: Object[] = [];
ids: number[] = [];
constructor(private http: HttpClient, private appConfig: AppConfiguration, private parserService: ParseXmlService, private sessionStorage: TokenStorageService) { }
createDataset(data: string): Observable<any> {
async createDataset(data: string): Promise<any> {
if (this.fds2Token) {
const httpOptions = {
headers: new HttpHeaders({
'Accept': 'text/turtle',
'Content-Type': 'text/turtle',
'Authorization': 'Bearer ' + this.fds2Token
})
};
const httpOptions = new Headers();
httpOptions.append( 'Accept', 'text/turtle');
httpOptions.append('Content-Type', 'text/turtle');
httpOptions.append('Authorization', 'Bearer '+ this.fds2Token );
const myInit = { method: 'POST', body: data , headers: httpOptions };
const myRequest = new Request(`${FDP_URL}/dataset`, myInit);
return this.http.post(FDP_URL + "/dataset", data, httpOptions);
return fetch(myRequest, myInit)
}
}
......@@ -104,12 +106,16 @@ export class DatasetCrudService {
getLocally<T = any>(path: string): Observable<T> {
return this.http.get<T>(`${path}`);
}
saveDatasets(obj: Object) {
saveDatasets(obj: Object, id: number) {
this.itemsDataset.push(obj);
this.ids.push(id);
}
resetDataset() {
this.itemsDataset = [];
this.ids = [];
}
}
<nb-card [size]="'medium'">
<nb-card-header>
<h3 style="text-align: center;">Feedback: </h3>
</nb-card-header>
<nb-card-body>
<nb-card >
<nb-card-body>
<p class="error" *ngIf="data.notPostedMetadatas.length > 0">An error occurred while publishing the following Datasets: </p>
<ul class="error" *ngFor="let data of data.notPostedMetadatas">
<li class="error">{{ data }}</li>
</ul>
</nb-card-body>
</nb-card>
<nb-card>
<nb-card-body>
<p class="success" *ngIf="data.postedMetadatas.length > 0">The following datasets have been published successfully: </p>
<ul *ngFor="let data of data.postedMetadatas">
<li class="success" >{{ data }}</li>
</ul>
</nb-card-body>
</nb-card>
</nb-card-body>
<nb-card-footer>
<div class="row">
<div class="button-center">
<button nbButton status="primary" (click)="close()">Close</button>
</div>
</div>
</nb-card-footer>
</nb-card>
\ No newline at end of file
.error {
color: crimson;
}
.success {
color: forestgreen;
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FeedbackDialogComponent } from './feedback-dialog.component';
describe('FeedbackDialogComponent', () => {
let component: FeedbackDialogComponent;
let fixture: ComponentFixture<FeedbackDialogComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FeedbackDialogComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(FeedbackDialogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { NbDialogRef } from '@nebular/theme';
@Component({
selector: 'app-feedback-dialog',
templateUrl: './feedback-dialog.component.html',
styleUrls: ['./feedback-dialog.component.scss']
})
export class FeedbackDialogComponent implements OnInit {
constructor(private dialog: MatDialogRef<FeedbackDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: {postedMetadatas: string[], notPostedMetadatas: string[]} ) { }
ngOnInit(): void {
}
close() {
this.dialog.close();
}
}
<form #form="ngForm">
<div class="card-row">
<div class="card-col">
<nb-card size="giant" [nbSpinner]="loading" nbSpinnerStatus="primary" nbSpinnerSize="large"
nbSpinnerMessage="Loading...">
<nb-card size="giant" >
<nb-card-header>Dataset metadata</nb-card-header>
<nb-card-body>
......@@ -35,7 +34,7 @@
required #autoInput #{{dataset.identifier}}="ngModel" fullWidth
id="{{dataset.identifier}}" name="{{dataset.identifier}}" nbInput
(input)="onChange()" placeholder="Enter value" [nbAutocomplete]="auto"
[(ngModel)]="selectedPaths[index]" (focus)="reset()" />
[(ngModel)]="selectedPaths[index]" autocomplete="false" (focus)="reset()" />
<div
*ngIf="dataset.identifier.invalid && (dataset.identifier.dirty || dataset.identifier.touched)">
champ obligatoire</div>
......@@ -44,7 +43,7 @@
#autoInput #{{dataset.identifier}}="ngModel" fullWidth
id="{{dataset.identifier}}" name="{{dataset.identifier}}" nbInput
(input)="onChange()" placeholder="Enter value" [nbAutocomplete]="auto"
[(ngModel)]="selectedPaths[index]" (focus)="reset()" />
[(ngModel)]="selectedPaths[index]" autocomplete="false" (focus)="reset()" />
<nb-autocomplete #auto>
......@@ -71,7 +70,7 @@
</form>
<div class="card-row">
<div class="card-col">
<nb-card [nbSpinner]="loading" nbSpinnerStatus="primary" nbSpinnerSize="large" nbSpinnerMessage="loading">
<nb-card [nbSpinner]="loadingCr" nbSpinnerStatus="primary" nbSpinnerSize="large" nbSpinnerMessage="loading">
<nb-card-header>Map</nb-card-header>
<nb-card-body>
<nb-list>
......@@ -79,7 +78,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 autofocus [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)">
......@@ -108,11 +107,9 @@
</div>
<div class="row">
<div class="button-center" *ngIf="!first ">
<button nbButton status="primary" (click)=" publishDataset()">Publish</button>
<button nbButton status="primary" (click)=" publishDataset()" [nbSpinner]="loading" nbSpinnerStatus="basic" >Publish</button>
</div>
</div>
<nb-alert status="success" *ngIf="messageOk" closable style="margin-top: 10px;">{{ messageOk }}
</nb-alert>
</nb-card-footer>
</nb-card>
......
import { HttpResponse } from '@angular/common/http';
import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { Observable, of } from 'rxjs';
import { MatDialog } from '@angular/material/dialog';
import { Router } from '@angular/router';
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 { ParseXmlService } from '../services/parse-xml.service';
import { Dataset } from './class/dataset';
import { FeedbackDialogComponent } from './dialog/feedback-dialog/feedback-dialog.component';
@Component({
......@@ -27,13 +33,14 @@ export class MappingComponent implements OnInit {
index: number = 0
first: boolean = true;
loading: boolean = false;
loadingCr = false;
FDP_URL = environment.fdpUrl;
messageOk: string;
ids: number[];
@ViewChild('autoInput') input;
@Input() catalogId: any;
constructor(private dataSetService: DatasetCrudService, private parserService: ParseXmlService) { }
constructor(private dataSetService: DatasetCrudService, private dialog: MatDialog, private route: Router) { }
ngOnInit() {
this.dataSetService.getLocally('./assets/dataset.json').subscribe(
......@@ -54,17 +61,16 @@ export class MappingComponent implements OnInit {
populatecatalogue() {
this.itemsdataset = this.dataSetService.itemsDataset;
this.ids = this.dataSetService.ids;
this.ids
this.keys = [];
for (let i = 0; i < this.itemsdataset.length; i++) {
if (i === 0) {
this.getKeysFromMetadata(this.itemsdataset[i], '');
this.keysMap.set(this.itemsdataset.length, this.keys);
this.filteredOptions = of(this.keysMap.get(1));
}
}
this.getKeysFromMetadata(this.itemsdataset[0], '');
this.keysMap.set(this.itemsdataset.length, this.keys);
this.filteredOptions = of(this.keysMap.get(1));
}
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]) {
......@@ -72,18 +78,21 @@ export class MappingComponent implements OnInit {
mappedMetadata.set(this.datasetModel[i].identifier, this.getValue(tab, item));
}
}
this.loadingCr = false
return mappedMetadata;
}
publishDataset() {
let data: string = '';
let properties: string = '';
let result = '';
let postedDatastes = [];
let notPostedDatasets = [];
this.loading = true;
const requestPromises: Promise<any>[] = [];
for (let i = 0; i < this.mappedMetadatas.length; i++) {
let title = "";
properties = "";
this.messageOk = "";
this.mappedMetadatas[i].forEach((value: string, key: string) => {
if (key === 'dct:title') { title = value };
switch (key) {
......@@ -112,29 +121,65 @@ export class MappingComponent implements OnInit {
a dcat:Dataset, dcat:Resource;\n\
dct:isPartOf c:'+ this.catalogId + ';\n' + properties + '.';
let query = 'query=PREFIX dcat: <http://www.w3.org/ns/dcat#>\n\
/*let query = 'query=PREFIX dcat: <http://www.w3.org/ns/dcat#>\n\
PREFIX dct: <http://purl.org/dc/terms/>\n\
SELECT ?dataset\n\
where {\n\
?dataset a dcat:Dataset;\n\
dct:title "' + title + '" ;\n\
dct:isPartOf <https://f2ds.eosc-pillar.eu/catalog/' + this.catalogId + '>. } '
console.log('data: ' + data);
this.dataSetService.createDataset(data).subscribe(
r => {
console.log(r);
this.loading = true;
},
() => {
this.messageOk = "Dataset published successfully"
this.loading = false;
dct:isPartOf <https://f2ds.eosc-pillar.eu/catalog/' + this.catalogId + '>. } '*/
let requestPromise = this.dataSetService.createDataset(data).then((resp: HttpResponse<any>) => {
if (resp.status.toString().startsWith('2')) {
postedDatastes.push(this.ids[i]);
} else {
notPostedDatasets.push(this.ids[i]);
}
)
})
requestPromises.push(requestPromise);
}
Promise.all(requestPromises).finally(() => {
this.loading = false;
this.dialog.open(FeedbackDialogComponent, {
data: {
postedMetadatas: postedDatastes,
notPostedMetadatas: notPostedDatasets
}
}).afterClosed().subscribe(() => this.route.navigateByUrl('/dashboard'));
})
}
/* function to get recursively all the keys and values from the JSON object */
getKeysFromMetadata(obj: Object, keyParent: string) {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
if (Array.isArray(obj[key])) {
obj[key].forEach(e => {
if (typeof e === 'object') {
this.getKeysFromMetadata(e, keyParent + ' : ' + key + ' : ' + obj[key].indexOf(e));
} else {
this.keys.push(keyParent + ' : ' + key + ' : ' + obj[key].indexOf(e))
}
});
} else {
if (keyParent) {
this.getKeysFromMetadata(obj[key], keyParent + ' : ' + key);
} else {
this.getKeysFromMetadata(obj[key], key);
}
}
} else {
if (keyParent) {
this.keys.push(keyParent + ' : ' + key)
} else {
this.keys.push(key)
}
}
});
}
private getValue(tab: string[], item: Object): string {
let obj: Object
......@@ -150,12 +195,39 @@ export class MappingComponent implements OnInit {
if (obj[tab[i]]) {
return obj[tab[i]];
} else {
return 'undefined';
if (i == tab.length - 2) {
this.getKeysFromMetadata(item, "");
console.log(tab[i])
this.keys.forEach(k => {
let table = k.split(" : ");
if (table[table.length - 2] === tab[i]) {
for (let i = 0; i < tab.length; i++) {
if (table.length == 1) {
return item[tab[0]];
} else {
if (i == 0) {
obj = item[table[i]]
} else if (i < table.length - 1 && obj[table[i]]) {
obj = obj[table[i]];
} else {
if (obj[table[i]]) {
return obj[table[i]];
} else {
return 'undefined';
}
}
}
}
}
})
}
}
}
}
}
}
mapDataset() {
this.mappedMetadatas = [];
this.itemsdataset.forEach((dataset: Object) => {
......@@ -165,6 +237,7 @@ export class MappingComponent implements OnInit {
this.first = false;
}
next() {
this.loadingCr = true;
if (this.index < this.itemsdataset.length) {
this.index += 1;
this.createDataset(this.itemsdataset[this.index])
......@@ -172,6 +245,7 @@ export class MappingComponent implements OnInit {
}
}
prev() {
this.loadingCr = true;
if (this.index > 0) {
this.index -= 1;
}
......@@ -184,36 +258,6 @@ export class MappingComponent implements OnInit {
this.mappedMetadatas[this.index].delete(key);
}
/* function to get recursively all the keys and values from the JSON object */
getKeysFromMetadata(obj: Object, keyParent: string) {
Object.keys(obj).forEach(key => {
if (typeof obj[key] === 'object') {
if (Array.isArray(obj[key])) {
obj[key].forEach(e => {
if (typeof e === 'object') {
this.getKeysFromMetadata(e, keyParent + ' : ' + key + ' : ' + obj[key].indexOf(e));
} else {
this.keys.push(keyParent + ' : ' + key + ' : ' + obj[key].indexOf(e))
}
});
} else {
if (keyParent) {
this.getKeysFromMetadata(obj[key], keyParent + ' : ' + key);
} else {
this.getKeysFromMetadata(obj[key], key);
}
}
} else {
if (keyParent) {
this.keys.push(keyParent + ' : ' + key)
} else {
this.keys.push(key)
}
}
});
}
trackByIndex(index: number, obj: any): any {
return index;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment