From c9b376f76c3e44ca1fdb65098f9f33b0183e85b1 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 22 Jun 2021 13:00:58 +0300 Subject: [PATCH 001/156] Restyle DMP profile listing (Admin Pages) --- .../dmp-profile-criteria.component.html | 19 ++-- .../dmp-profile-criteria.component.scss | 13 +++ .../dmp-profile-criteria.component.ts | 40 ++++----- .../dmp-profile-listing.component.html | 33 +++++-- .../dmp-profile-listing.component.scss | 88 +++++++++++-------- .../listing/dmp-profile-listing.component.ts | 50 ++++++++++- dmp-frontend/src/assets/i18n/de.json | 5 ++ dmp-frontend/src/assets/i18n/en.json | 5 ++ dmp-frontend/src/assets/i18n/es.json | 5 ++ dmp-frontend/src/assets/i18n/gr.json | 5 ++ dmp-frontend/src/assets/i18n/pt.json | 5 ++ dmp-frontend/src/assets/i18n/sk.json | 5 ++ dmp-frontend/src/assets/i18n/sr.json | 5 ++ dmp-frontend/src/assets/i18n/tr.json | 5 ++ 14 files changed, 200 insertions(+), 83 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html index 5ed6cc96b..fa9141ae4 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html @@ -1,18 +1,11 @@
- -
- - - - - -
+
- - + + + search +
-
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss index e69de29bb..0cea7d62b 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss @@ -0,0 +1,13 @@ + +:host ::ng-deep .search-form-field .mat-form-field-wrapper { + background-color: white !important; + padding-bottom: 0 !important; +} +:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { + padding: 0.3rem 0rem 0.6rem 0rem !important; +} + +.dmp-criteria{ + margin-top: 4em; + margin-bottom: 2em; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.ts index bac44b696..f9b0ed07c 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.ts @@ -53,24 +53,24 @@ export class DmpProfileCriteriaComponent extends BaseCriteriaComponent implement } - openDialog(): void { - const dialogRef = this.dialog.open(DialodConfirmationUploadDmpProfiles, { - restoreFocus: false, - data: { - message: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-TITLE'), - confirmButton: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML'), - cancelButton: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-CANCEL'), - name: '', - file: FileList, - sucsess: false - } - }); - dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(data => { - if (data && data.sucsess && data.name != null && data.file != null) { - this.dmpProfileService.uploadFile(data.file, data.name) - .pipe(takeUntil(this._destroyed)) - .subscribe(); - } - }); - } + // openDialog(): void { + // const dialogRef = this.dialog.open(DialodConfirmationUploadDmpProfiles, { + // restoreFocus: false, + // data: { + // message: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-TITLE'), + // confirmButton: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML'), + // cancelButton: this.language.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-CANCEL'), + // name: '', + // file: FileList, + // sucsess: false + // } + // }); + // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(data => { + // if (data && data.sucsess && data.name != null && data.file != null) { + // this.dmpProfileService.uploadFile(data.file, data.name) + // .pipe(takeUntil(this._destroyed)) + // .subscribe(); + // } + // }); + // } } diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.html index 515549df8..733ea2248 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.html @@ -1,9 +1,26 @@
-

{{titlePrefix}} {{'DMP-PROFILE-LISTING.TITLE' | translate}}

+
+
+

{{titlePrefix}} {{'DMP-PROFILE-LISTING.TITLE' | translate}}

+
+
+
+ + +
+
- +
@@ -17,7 +34,11 @@ {{'DMP-PROFILE-LISTING.COLUMNS.STATUS' | translate}} - {{row.status}} + +
+ {{parseStatus(row.status) | translate}} +
+
@@ -36,12 +57,6 @@
- - -
-
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss index 7720847f5..ea1d13594 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss @@ -1,65 +1,77 @@ .mat-table { - margin: 24px; + margin-top: 47px; + border-radius: 4px; } - .dmp-profile-listing { margin-top: 1.3rem; + margin-left: 1rem; + margin-right: 2rem; + .mat-header-row{ + background: #f3f5f8; + } + .mat-card { + margin: 16px 0; + padding: 0px; + } + .mat-row { cursor: pointer; + min-height: 4.5em; } - - .mat-card { - margin: 1em 0; - } - + mat-row:hover { - background-color: lightgray; + background-color: #eef5f6; } - - mat-row:nth-child(odd) { - background-color: #0c748914; - // background-color: #eef0fb; - } - .mat-fab-bottom-right { - // top: auto !important; - // right: 20px !important; - // bottom: 10px !important; - // left: auto !important; - // position: fixed !important; float: right; z-index: 5; } } - +// PAGINATOR :host ::ng-deep .mat-paginator-container { flex-direction: row-reverse !important; justify-content: space-between !important; background-color: #f6f6f6; - height: 30px; - min-height: 30px !important; + align-items: center; +} +.create-btn { + border-radius: 30px; + background-color: #f7dd72; + padding-left: 2em; + padding-right: 2em; + // color: #000; + + .button-text{ + display: inline-block; + } } -:host ::ng-deep .mat-paginator-page-size { - height: 43px; +.import-btn { + background: #ffffff 0% 0% no-repeat padding-box; + border-radius: 30px; + // color: #129d99; + // border: 1px solid #129d99; + padding-left: 2em; + padding-right: 2em; + color: #000; + border: 1px solid #000; } -:host ::ng-deep .mat-paginator-range-label { - margin: 15px 32px 0 24px !important; +.status-chip{ + border-radius: 20px; + padding-left: 1em; + padding-right: 1em; + padding-top: 0.2em; + font-size: .8em; } -:host ::ng-deep .mat-paginator-range-actions { - width: 55% !important; - min-height: 43px !important; - justify-content: space-between; +.status-chip-inactive{ + color: #ff3d33; + background: #ffd5d3 0% 0% no-repeat padding-box; } -:host ::ng-deep .mat-paginator-navigation-previous { - margin-left: auto !important; -} - -:host ::ng-deep .mat-icon-button { - height: 30px !important; - font-size: 12px !important; -} +.status-chip-active{ + color: #00c4ff; + background: #d3f5ff 0% 0% no-repeat padding-box; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts index 2bcd93061..2832fd381 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts @@ -2,10 +2,12 @@ import { DataSource } from '@angular/cdk/table'; import { HttpClient } from '@angular/common/http'; import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatSort } from '@angular/material/sort'; import { ActivatedRoute, Params, Router } from '@angular/router'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DmpProfileListing } from '@app/core/model/dmp-profile/dmp-profile-listing'; import { DmpProfileCriteria } from '@app/core/query/dmp/dmp-profile-criteria'; @@ -17,6 +19,7 @@ import { BaseComponent } from '@common/base/base.component'; import { TranslateService } from '@ngx-translate/core'; import { merge as observableMerge, Observable, of as observableOf } from 'rxjs'; import { map, startWith, switchMap, takeUntil } from 'rxjs/operators'; +import { DialodConfirmationUploadDmpProfiles } from './criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; @Component({ @@ -38,8 +41,8 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit breadCrumbs: Observable; statuses = [ - { value: '0', viewValue: 'Active' }, - { value: '1', viewValue: 'Inactive' } + { value: '0', viewValue: 'DMP-PROFILE-LISTING.STATUS.ACTIVE' },// active + { value: '1', viewValue: 'DMP-PROFILE-LISTING.STATUS.INACTIVE' }// inactive ]; constructor( @@ -49,7 +52,8 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit public route: ActivatedRoute, public dmpProfileService: DmpProfileService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private dialog: MatDialog, ) { super(); } @@ -88,6 +92,46 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit // debugger; // this.datasetService.makeDatasetPublic(id).pipe(takeUntil(this._destroyed)).subscribe(); // } + + parseStatus(value: number): string{ + const stringVal = value.toString() + try{ + return this.statuses.find(status => status.value === stringVal).viewValue; + }catch{ + return stringVal; + } + } + + openDialog(): void { + const dialogRef = this.dialog.open(DialodConfirmationUploadDmpProfiles, { + restoreFocus: false, + data: { + message: this.languageService.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-TITLE'), + confirmButton: this.languageService.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML'), + cancelButton: this.languageService.instant('DMP-PROFILE-LISTING.UPLOAD.UPLOAD-XML-FILE-CANCEL'), + name: '', + file: FileList, + sucsess: false + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(data => { + if (data && data.sucsess && data.name != null && data.file != null) { + this.dmpProfileService.uploadFile(data.file, data.name) + .pipe(takeUntil(this._destroyed)) + .subscribe(); + } + }); + } + getStatusClass(status: number):string{ + + if(status === 1){//inactive + return 'status-chip-inactive' + } + if(status === 0){ + return 'status-chip-active'; + } + return ''; + } } export class DatasetDataSource extends DataSource { diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 301b3c1f8..8a3311f14 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "DMP Vorlagen", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Name", "STATUS": "Status", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Name der DMP Vorlage", "UPLOAD-XML-IMPORT": "Datei", "UPLOAD-XML-FILE-CANCEL": "Abbrechen" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 3537f2ca6..0b7c4f02f 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "DMP Templates", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Name", "STATUS": "Status", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Name Of DMP Template", "UPLOAD-XML-IMPORT": "File", "UPLOAD-XML-FILE-CANCEL": "Cancel" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index ca04f9851..3902900b3 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "Plantilla del PGD", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Nombre", "STATUS": "Estado", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Nombre de la Plantilla del PGD", "UPLOAD-XML-IMPORT": "Fichero", "UPLOAD-XML-FILE-CANCEL": "Cancelar" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 5990361c2..2c473acd7 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "Templates Σχεδίων Διαχείρισης Δεδομένων", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Τίτλος", "STATUS": "Κατάσταση", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Τίτλος Template Σχεδίου Διαχείρισης Δεδομένων", "UPLOAD-XML-IMPORT": "Αρχείο", "UPLOAD-XML-FILE-CANCEL": "Ακύρωση" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 2323a493d..370855730 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "PGDs", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Nome", "STATUS": "Estado", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Nome do PGD", "UPLOAD-XML-IMPORT": "Ficheiro", "UPLOAD-XML-FILE-CANCEL": "Cancelar" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 1a0eed604..9aaed8a82 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "Šablóny DMP", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Názov", "STATUS": "Stav", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Názov šablóny DMP", "UPLOAD-XML-IMPORT": "Súbor", "UPLOAD-XML-FILE-CANCEL": "Zrušiť" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 9f12e3745..e5cfa472d 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "Obrasci za Planove", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "Ime", "STATUS": "Status", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "Ime obrasca za Plan", "UPLOAD-XML-IMPORT": "Datoteka", "UPLOAD-XML-FILE-CANCEL": "Otkažite" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 71fde2ca2..462462c98 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1060,6 +1060,7 @@ }, "DMP-PROFILE-LISTING": { "TITLE": "VYP Şablonları", + "CREATE-DMP-TEMPLATE": "Create DMP Template", "COLUMNS": { "NAME": "İsim", "STATUS": "Durum", @@ -1073,6 +1074,10 @@ "UPLOAD-XML-NAME": "VYP Şablonu İsmi", "UPLOAD-XML-IMPORT": "Dosya", "UPLOAD-XML-FILE-CANCEL": "İptal" + }, + "STATUS":{ + "ACTIVE": "Active", + "INACTIVE": "Inactive" } }, "DYNAMIC-FORM": { From e2f262b3856a4c86b855026275e2bcdedc198bfb Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 22 Jun 2021 14:12:58 +0300 Subject: [PATCH 002/156] Popup dialog on locked DMP/Datasets overview / editors --- .../dataset-wizard.component.html | 10 ++++----- .../dataset-wizard.component.ts | 12 ++++++++--- .../overview/dataset-overview.component.ts | 11 +++++++++- .../app/ui/dmp/editor/dmp-editor.component.ts | 15 ++++--------- .../dmp/overview/dmp-overview.component.html | 2 +- .../ui/dmp/overview/dmp-overview.component.ts | 21 ++++++++++--------- dmp-frontend/src/assets/i18n/de.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/en.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/es.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/gr.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/pt.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/sk.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/sr.json | 12 +++++++++++ dmp-frontend/src/assets/i18n/tr.json | 12 +++++++++++ 14 files changed, 136 insertions(+), 31 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html index ca513b5b7..9a894bd63 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html @@ -26,16 +26,16 @@
-
-
+
+
- - - + + +
diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index 711414023..c5b7516fe 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -31,7 +31,7 @@ import { ValidationErrorModel } from '@common/forms/validation/error-model/valid import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; -import { Observable, of as observableOf, interval, Subscription } from 'rxjs'; +import { Observable, of as observableOf, interval} from 'rxjs'; import { catchError, debounceTime, map, takeUntil } from 'rxjs/operators'; import { LockService } from '@app/core/services/lock/lock.service'; import { Location } from '@angular/common'; @@ -39,14 +39,13 @@ import { LockModel } from '@app/core/model/lock/lock.model'; import { Guid } from '@common/types/guid'; import { isNullOrUndefined } from 'util'; import { AuthService } from '@app/core/services/auth/auth.service'; -import { environment } from 'environments/environment'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { SaveType } from '@app/core/common/enum/save-type'; import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; -import { ToCEntry, ToCEntryType } from '@app/ui/misc/dataset-description-form/dataset-description.component'; import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; +import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; @Component({ selector: 'app-dataset-wizard-component', @@ -193,6 +192,13 @@ export class DatasetWizardComponent extends BaseComponent implements OnInit, IBr // if (this.viewOnly) { this.formGroup.disable(); } // For future use, to make Dataset edit like DMP. this.loadDatasetProfiles(); this.registerFormListeners(); + + if(lockStatus){ + this.dialog.open(PopupNotificationDialogComponent,{data:{ + title:this.language.instant('DATASET-WIZARD.LOCKED.TITLE'), + message:this.language.instant('DATASET-WIZARD.LOCKED.MESSAGE') + }, maxWidth:'30em'}); + } // this.availableProfiles = this.datasetWizardModel.dmp.profiles; }) }, diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 3ce790c8d..3d5b72096 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -33,6 +33,7 @@ import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; +import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; @Component({ @@ -139,7 +140,15 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { checkLockStatus(id: string) { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) - .subscribe(lockStatus => this.lockStatus = lockStatus); + .subscribe(lockStatus => { + this.lockStatus = lockStatus + if(lockStatus){ + this.dialog.open(PopupNotificationDialogComponent,{data:{ + title:this.language.instant('DATASET-OVERVIEW.LOCKED.TITLE'), + message:this.language.instant('DATASET-OVERVIEW.LOCKED.MESSAGE') + }, maxWidth:'30em'}); + } + }); } onFetchingDeletedCallbackError(redirectRoot: string) { diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index 9d5773803..cd8c9d6b0 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -1,11 +1,11 @@ -import { Component, OnInit, SimpleChanges } from '@angular/core'; -import { FormGroup, AbstractControl, FormControl, FormArray, FormBuilder } from '@angular/forms'; +import { Component, OnInit} from '@angular/core'; +import { FormGroup, AbstractControl, FormControl, FormArray} from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; -import { DmpProfileDefinition, DmpProfile } from '@app/core/model/dmp-profile/dmp-profile'; +import { DmpProfileDefinition } from '@app/core/model/dmp-profile/dmp-profile'; import { DmpProfileListing } from '@app/core/model/dmp-profile/dmp-profile-listing'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { UserModel } from '@app/core/model/user/user'; @@ -33,7 +33,7 @@ import { ValidationErrorModel } from '@common/forms/validation/error-model/valid import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; import { Observable, of as observableOf, interval } from 'rxjs'; -import { catchError, delay, map, takeUntil } from 'rxjs/operators'; +import { map, takeUntil } from 'rxjs/operators'; import { Principal } from "@app/core/model/auth/principal"; import { Role } from "@app/core/common/enum/role"; import { LockService } from '@app/core/services/lock/lock.service'; @@ -42,13 +42,7 @@ import { Guid } from '@common/types/guid'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { ExtraPropertiesFormModel } from './general-tab/extra-properties-form.model'; import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; -import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; -import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; -import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; -import { DatasetDescriptionFormEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; -import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component'; -import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard'; import { DatasetService } from '@app/core/services/dataset/dataset.service'; import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component'; import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model'; @@ -117,7 +111,6 @@ export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadC private formService: FormService, private lockService: LockService, private configurationService: ConfigurationService, - private httpClient: HttpClient, private matomoService: MatomoService ) { super(); diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 1517c084e..5ca21021a 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -103,7 +103,7 @@ horizontal_rule
-
+
add {{'DMP-LISTING.ACTIONS.ADD-DATASET-SHORT' | translate}} diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 5e203919a..28fc75677 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core'; +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { DatasetStatus } from '@app/core/common/enum/dataset-status'; @@ -22,19 +22,13 @@ import { Observable, of as observableOf, interval } from 'rxjs'; import { takeUntil, map } from 'rxjs/operators'; import { Role } from "@app/core/common/enum/role"; import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component'; -import { MultipleChoiceDialogModule } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.module'; import { MultipleChoiceDialogComponent } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.component'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { Oauth2DialogComponent } from '@app/ui/misc/oauth2-dialog/oauth2-dialog.component'; import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; -import { isNullOrUndefined } from 'util'; import { UserService } from '@app/core/services/user/user.service'; import { Location } from '@angular/common'; import { FormGroup, FormArray, FormControl } from '@angular/forms'; import { LockService } from '@app/core/services/lock/lock.service'; -import { ReturnStatement, ConditionalExpr } from '@angular/compiler'; -import { LockModel } from '@app/core/model/lock/lock.model'; -import { Guid } from '@common/types/guid'; import { VersionListingModel } from '@app/core/model/version/version-listing.model'; import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component'; import { DmpModel } from '@app/core/model/dmp/dmp'; @@ -43,11 +37,10 @@ import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; import { ProjectFormModel } from '../editor/grant-tab/project-form-model'; import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model'; -import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; -import { StartNewDatasetDialogComponent } from '../start-new-dataset-dialogue/start-new-dataset-dialog.component'; import { StartNewDmpDialogComponent } from '../start-new-dmp-dialogue/start-new-dmp-dialog.component'; import { HttpClient } from '@angular/common/http'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; @Component({ selector: 'app-dmp-overview', @@ -781,7 +774,15 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { checkLockStatus(id: string) { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) - .subscribe(lockStatus => this.lockStatus = lockStatus); + .subscribe(lockStatus => { + this.lockStatus = lockStatus + if(lockStatus){ + this.dialog.open(PopupNotificationDialogComponent,{data:{ + title:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.TITLE'), + message:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.MESSAGE') + }, maxWidth:'30em'}); + } + }); } getUserFromDMP(): any { diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 8a3311f14..83bcf5f66 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -718,6 +718,10 @@ "CANCEL": "Abbrechen", "NEXT": "Next", "ERROR-MESSAGE": "Diese Vorlage der Datensatzbeschreibung ist nicht enthalten" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Login with Zenodo", "USE-DEFAULT": "Use Default Token" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "The requested dataset is deleted", "FORBIDEN-DATASET": "You are not allowed to access this dataset" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 0b7c4f02f..586f64ce0 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -718,6 +718,10 @@ "CANCEL": "Cancel", "NEXT": "Next", "ERROR-MESSAGE": "Does not contain this Dataset Template" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Login with Zenodo", "USE-DEFAULT": "Use Default Token" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "The requested dataset is deleted", "FORBIDEN-DATASET": "You are not allowed to access this dataset" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 3902900b3..512aa604e 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -718,6 +718,10 @@ "CANCEL": "Cancelar", "NEXT": "Next", "ERROR-MESSAGE": "No contiene esta plantilla de descripción del dataset" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Identificarse con Zenodo", "USE-DEFAULT": "Usar el token por defecto" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "El dataset pedido ha sido eliminado", "FORBIDEN-DATASET": "No tiene permisos para acceder a este Dataset" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 2c473acd7..1dc0d7138 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -718,6 +718,10 @@ "CANCEL": "Ακύρωση", "NEXT": "Επόμενο", "ERROR-MESSAGE": "Αυτο το Template Περιγραφής Συνόλου Δεδομένων δεν περιέχεται" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Σύνδεση με Zenodo", "USE-DEFAULT": "Χρήση Προκαθορισμένου Token" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "H επιλεγμένη Περιγραφή Δεδομένων θα διαγραφεί", "FORBIDEN-DATASET": "Δεν επιτρέπεται η πρόσβαση σε αυτή την Περιγραφή Δεδομένων" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 370855730..164d7e7db 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -718,6 +718,10 @@ "CANCEL": "Cancelar", "NEXT": "Seguinte", "ERROR-MESSAGE": "Não contém este Modelo de Dados" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Entre com o Zenodo", "USE-DEFAULT": "Use o Token" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "O Dataset requerido foi eliminado", "FORBIDEN-DATASET": "Não está autorizado o acesso a este Dataset" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 9aaed8a82..abb01ecde 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -718,6 +718,10 @@ "CANCEL": "Zrušiť", "NEXT": "Ďalej", "ERROR-MESSAGE": "Neobsahuje túto šablónu súboru dát" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Prihlásiť sa do Zenodo", "USE-DEFAULT": "Použite predvolený token" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "Požadovaný DMP je vymazaný", "FORBIDEN-DATASET": "K tomuto DMP nemáte povolený prístup" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index e5cfa472d..37ffc6179 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -718,6 +718,10 @@ "CANCEL": "Otkažite", "NEXT": "Sledeće", "ERROR-MESSAGE": "Ne sadrži obrazac za podatke" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Prijavite se pomoću Zenodo naloga", "USE-DEFAULT": "Koristite podrazumevani znak" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "Traženi skup podataka je obrisan", "FORBIDEN-DATASET": "Nije Vam dozvoljeno da pristupite ovom skupu podataka" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 462462c98..522d1aa13 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -718,6 +718,10 @@ "CANCEL": "İptal", "NEXT": "İleri", "ERROR-MESSAGE": "Bu Veri Seti Şablonunu İçermiyor" + }, + "LOCKED":{ + "TITLE":"Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." } }, "DMP-OVERVIEW": { @@ -744,6 +748,10 @@ "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Zenodo ile oturum aç", "USE-DEFAULT": "Mevcut Jetonu Kullan" + }, + "LOCKED-DIALOG":{ + "TITLE": "DMP is locked", + "MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-OVERVIEW": { @@ -751,6 +759,10 @@ "ERROR": { "DELETED-DATASET": "Seçili Veri Seti silindi", "FORBIDEN-DATASET": "Bu veri setine erişim izniniz yok" + }, + "LOCKED":{ + "TITLE": "Dataset is locked", + "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." } }, "DATASET-LISTING": { From ad0853dc209565e0495d88437612100975d891fa Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 22 Jun 2021 16:48:46 +0300 Subject: [PATCH 003/156] DMP profile editor. Basic restyle --- .../editor/dmp-profile-editor.component.html | 41 +++++++++++++++---- .../editor/dmp-profile-editor.component.scss | 36 ++++++++++++++++ .../editor/dmp-profile-editor.component.ts | 33 +++++++++++---- .../dmp-profile-criteria.component.scss | 4 +- dmp-frontend/src/assets/i18n/de.json | 5 +++ dmp-frontend/src/assets/i18n/en.json | 5 +++ dmp-frontend/src/assets/i18n/es.json | 5 +++ dmp-frontend/src/assets/i18n/gr.json | 5 +++ dmp-frontend/src/assets/i18n/pt.json | 5 +++ dmp-frontend/src/assets/i18n/sk.json | 5 +++ dmp-frontend/src/assets/i18n/sr.json | 5 +++ dmp-frontend/src/assets/i18n/tr.json | 5 +++ 12 files changed, 136 insertions(+), 18 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html index 1ff4715bd..8a894e323 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html @@ -1,9 +1,28 @@
+
+
+

{{'DMP-PROFILE-EDITOR.TITLE.NEW' | translate}}

+

{{formGroup.get('label').value}}

+
+
+
+ +
+
+ +
+
+ +
+
-

{{'DMP-PROFILE-EDITOR.TITLE.NEW' | translate}}

-

{{formGroup.get('label').value}}

- + -
- +
+ @@ -101,12 +120,12 @@
-
+
- +
-
+ + +
+
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.scss index 972e19d7b..ae188ac09 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.scss @@ -1,5 +1,7 @@ .dmp-profile-editor { margin-top: 1.3rem; + margin-left: 1em; + margin-right: 3em; .centered-row-item { align-items: center; @@ -25,3 +27,37 @@ ::ng-deep .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background, .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background { background-color: #b0b0b0; } + +.finalize-btn { + border-radius: 30px; + border: 1px solid #129D99; + background: transparent; + padding-left: 2em; + padding-right: 2em; + box-shadow: 0px 3px 6px #1E202029; + color: #129D99; + &:disabled{ + background-color: #CBCBCB; + color: #FFF; + border: 0px; + } +} + +.action-btn { + border-radius: 30px; + background-color: #f7dd72; + border: 1px solid transparent; + padding-left: 2em; + padding-right: 2em; + box-shadow: 0px 3px 6px #1E202029; + + transition-property: background-color, color; + transition-duration: 200ms; + transition-delay: 50ms; + transition-timing-function: ease-in-out; + &:disabled{ + background-color: #CBCBCB; + color: #FFF; + border: 0px; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.ts index 90cc566e0..0de715ef4 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.ts @@ -23,6 +23,8 @@ import { map, takeUntil } from 'rxjs/operators'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { HttpClient } from '@angular/common/http'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { MatDialog } from '@angular/material'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; @Component({ @@ -50,7 +52,8 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie private formService: FormService, private configurationService: ConfigurationService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private dialog: MatDialog ) { super(); this.host = configurationService.server; @@ -177,13 +180,27 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie } delete() { - this.formGroup.get('status').setValue(DmpProfileStatus.Deleted); - this.dmpProfileService.createDmp(this.formGroup.value) - .pipe(takeUntil(this._destroyed)) - .subscribe( - complete => this.onCallbackSuccess(), - error => this.onCallbackError(error) - ); + this.dialog.open(ConfirmationDialogComponent,{data:{ + isDeleteConfirmation: true, + confirmButton: this.language.instant('DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.CONFIRM-BUTTON'), + cancelButton: this.language.instant("DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.CANCEL-BUTTON"), + message: this.language.instant("DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.MESSAGE") + }}) + .afterClosed() + .subscribe( + confirmed =>{ + if(confirmed){ + this.formGroup.get('status').setValue(DmpProfileStatus.Deleted); + this.dmpProfileService.createDmp(this.formGroup.value) + .pipe(takeUntil(this._destroyed)) + .subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } + } + ) + } finalize() { diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss index 0cea7d62b..88846d9a8 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss @@ -8,6 +8,6 @@ } .dmp-criteria{ - margin-top: 4em; - margin-bottom: 2em; + margin-top: 3em; + margin-bottom: 0em; } \ No newline at end of file diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 83bcf5f66..ac755028c 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -908,6 +908,11 @@ "DELETE": "Löschen", "FINALIZE": "Finalize", "DOWNLOAD-XML": "Download XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 586f64ce0..c8913786a 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -908,6 +908,11 @@ "DELETE": "Delete", "FINALIZE": "Finalize", "DOWNLOAD-XML": "Download XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 512aa604e..4806a5d5c 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -908,6 +908,11 @@ "DELETE": "Borrar", "FINALIZE": "Finalizar", "DOWNLOAD-XML": "Descargar XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 1dc0d7138..bd736b761 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -908,6 +908,11 @@ "DELETE": "Διαγραφή", "FINALIZE": "Οριστικοποίηση", "DOWNLOAD-XML": "Ληψη XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 164d7e7db..eaf12329a 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -908,6 +908,11 @@ "DELETE": "Eliminar", "FINALIZE": "Concluir", "DOWNLOAD-XML": "Exportar para XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index abb01ecde..7d3c8efb7 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -908,6 +908,11 @@ "DELETE": "Vymazať", "FINALIZE": "Dokončiť", "DOWNLOAD-XML": "Stiahnuť XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 37ffc6179..e7075e147 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -908,6 +908,11 @@ "DELETE": "Obrišite", "FINALIZE": "Dovršite", "DOWNLOAD-XML": "Preuzmite XML" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 522d1aa13..ee6213535 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -908,6 +908,11 @@ "DELETE": "Sil", "FINALIZE": "Tamamla", "DOWNLOAD-XML": "XML İndir" + }, + "CONFIRM-DELETE-DIALOG":{ + "MESSAGE": "Would you like to delete this DMP template?", + "CONFIRM-BUTTON": "Yes, delete", + "CANCEL-BUTTON": "No" } }, "GRANT-EDITOR": { From d90ab00833d707f030d958d203e207c108a2f4ba Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 22 Jun 2021 17:51:00 +0300 Subject: [PATCH 004/156] DMP Profile listing. Restyle import dialog --- .../admin/dmp-profile/dmp-profile.module.ts | 4 +- .../editor/dmp-profile-editor.component.html | 2 +- ...onfirmation-upload-profiles.component.html | 26 ++++- ...onfirmation-upload-profiles.component.scss | 99 +++++++++++++++++++ ...-confirmation-upload-profiles.component.ts | 21 ++-- .../dmp-profile-listing.component.scss | 8 +- .../listing/dmp-profile-listing.component.ts | 22 +++-- dmp-frontend/src/assets/i18n/de.json | 7 +- dmp-frontend/src/assets/i18n/en.json | 7 +- dmp-frontend/src/assets/i18n/es.json | 7 +- dmp-frontend/src/assets/i18n/gr.json | 7 +- dmp-frontend/src/assets/i18n/pt.json | 7 +- dmp-frontend/src/assets/i18n/sk.json | 7 +- dmp-frontend/src/assets/i18n/sr.json | 7 +- dmp-frontend/src/assets/i18n/tr.json | 7 +- 15 files changed, 198 insertions(+), 40 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/dmp-profile.module.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/dmp-profile.module.ts index 4e4e79439..5059a98b0 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/dmp-profile.module.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/dmp-profile.module.ts @@ -9,6 +9,7 @@ import { DmpProfileExternalAutocompleteFieldEditorComponent } from './editor/ext import { DialodConfirmationUploadDmpProfiles } from './listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; import { DmpProfileCriteriaComponent } from './listing/criteria/dmp-profile-criteria.component'; import { DmpProfileListingComponent } from './listing/dmp-profile-listing.component'; +import { NgxDropzoneModule } from "ngx-dropzone"; @NgModule({ imports: [ @@ -16,7 +17,8 @@ import { DmpProfileListingComponent } from './listing/dmp-profile-listing.compon CommonFormsModule, UrlListingModule, ConfirmationDialogModule, - DmpProfileRoutingModule + DmpProfileRoutingModule, + NgxDropzoneModule ], declarations: [ DmpProfileEditorComponent, diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html index 8a894e323..e0bc6fda9 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/editor/dmp-profile-editor.component.html @@ -13,7 +13,7 @@
-
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html index 83c70604d..c07d4eca4 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html @@ -4,10 +4,26 @@

{{ data.message }}

- -
+
+
+
+ + + {{ selectedFileName }} + + +
+
+
+
+ +
@@ -15,11 +31,11 @@
- +
- +
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss index 226db6ce8..63c42f81e 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss @@ -1,3 +1,102 @@ .hidden { display: none; +} + + +.cancel-btn { + background: #ffffff 0% 0% no-repeat padding-box; + border: 1px solid #b5b5b5; + border-radius: 30px; + width: 101px; + height: 43px; + color: #212121; + font-weight: 500; +} + +.next-btn { + background: #ffffff 0% 0% no-repeat padding-box; + border: 1px solid #129d99; + border-radius: 30px; + opacity: 1; + width: 101px; + height: 43px; + color: #129d99; + font-weight: 500; +} + +.next-btn[disabled] { + width: 100px; + height: 43px; + background: #ffffff 0% 0% no-repeat padding-box; + border: 1px solid #b5b5b5; + border-radius: 30px; + opacity: 1; +} + +.next-btn:not([disabled]):hover { + background-color: #129d99; + color: #ffffff; +} + +//ngx dropzone +.drop-file { + background-color: #fafafa; + border: 1px dashed #d1d1d1; + border-radius: 4px; + max-width: 480px; + height: 98px; + margin-top: 0.5rem; +} + +.file-preview { + height: auto !important; + width: auto !important; + max-width: 500px !important; + min-height: 1rem !important; + + background-color: #e0e0e0 !important; + background-image: none !important; + color: rgba(0, 0, 0, 0.87) !important; + font-weight: 500 !important; + border-radius: 24px !important; + line-height: 1.25 !important; +} + +.file-label { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 14px !important; +} + +::ng-deep ngx-dropzone-remove-badge { + opacity: 1 !important; + margin-left: .5rem !important; + position: initial !important; +} + + +//attach file + +.attach-btn { + top: -20px; +} + +.attach-file { + width: 156px; + height: 44px; + color: #ffffff; + background: #129d99 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1e202029; + border-radius: 30px; +} + +.attach-file:hover { + background-color: #ffffff; + border: 1px solid #129d99; + color: #129d99; +} + +.close-btn:hover{ + cursor: pointer; } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts index 42a7dfa61..c8081101f 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts @@ -10,9 +10,9 @@ import { Inject, Component } from '@angular/core'; export class DialodConfirmationUploadDmpProfiles { sizeError = false; - btnColore:String="primary"; selectFile =false; maxFileSize: number = 1048576; + selectedFileName: string; constructor( public dialogRef: MatDialogRef, @@ -21,16 +21,20 @@ export class DialodConfirmationUploadDmpProfiles { selectXML(event) { - const file: FileList = event.target.files; + let file: FileList = null; + if(event.target && event.target.files){ + file = event.target.files; + }else if(event.addedFiles && event.addedFiles.length){ + file = event.addedFiles; + } + if(!file) return;//no select closed with cancel . no file selected const size: number = file[0].size; // Get file size. this.sizeError = size > this.maxFileSize; // Checks if file size is valid. const formdata: FormData = new FormData(); if (!this.sizeError) { this.data.file = file; this.selectFile=true; - this.btnColore="primary"; - }else{ - this.btnColore="warn"; + this.selectedFileName = file[0].name; } this.data.name = file[0].name; } @@ -49,5 +53,10 @@ export class DialodConfirmationUploadDmpProfiles { hasProfile():boolean{ return (this.selectFile && !this.sizeError); } - + //remove selected file + onRemove(){ + this.data.name=""; + this.selectFile = false; + this.selectedFileName = ""; + } } diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss index ea1d13594..e797578ad 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.scss @@ -66,12 +66,12 @@ font-size: .8em; } -.status-chip-inactive{ - color: #ff3d33; - background: #ffd5d3 0% 0% no-repeat padding-box; +.status-chip-finalized{ + color: #568b5a; + background: #9dd1a1 0% 0% no-repeat padding-box; } -.status-chip-active{ +.status-chip-draft{ color: #00c4ff; background: #d3f5ff 0% 0% no-repeat padding-box; } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts index 2832fd381..3ec322ecf 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/dmp-profile-listing.component.ts @@ -7,15 +7,16 @@ import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatSort } from '@angular/material/sort'; import { ActivatedRoute, Params, Router } from '@angular/router'; -import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DmpProfileListing } from '@app/core/model/dmp-profile/dmp-profile-listing'; import { DmpProfileCriteria } from '@app/core/query/dmp/dmp-profile-criteria'; import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { DmpProfileCriteriaComponent } from '@app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component'; import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; import { BaseComponent } from '@common/base/base.component'; +import { SnackBarNotificationLevel } from '@common/modules/notification/ui-notification-service'; import { TranslateService } from '@ngx-translate/core'; import { merge as observableMerge, Observable, of as observableOf } from 'rxjs'; import { map, startWith, switchMap, takeUntil } from 'rxjs/operators'; @@ -41,8 +42,8 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit breadCrumbs: Observable; statuses = [ - { value: '0', viewValue: 'DMP-PROFILE-LISTING.STATUS.ACTIVE' },// active - { value: '1', viewValue: 'DMP-PROFILE-LISTING.STATUS.INACTIVE' }// inactive + { value: '0', viewValue: 'DMP-PROFILE-LISTING.STATUS.DRAFT' },// active + { value: '1', viewValue: 'DMP-PROFILE-LISTING.STATUS.FINALIZED' }// inactive ]; constructor( @@ -54,6 +55,7 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit private httpClient: HttpClient, private matomoService: MatomoService, private dialog: MatDialog, + private uiNotificationService: UiNotificationService, ) { super(); } @@ -118,17 +120,23 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit if (data && data.sucsess && data.name != null && data.file != null) { this.dmpProfileService.uploadFile(data.file, data.name) .pipe(takeUntil(this._destroyed)) - .subscribe(); + .subscribe(_=>{ + this.uiNotificationService.snackBarNotification(this.languageService.instant('DMP-PROFILE-LISTING.MESSAGES.TEMPLATE-UPLOAD-SUCCESS'), SnackBarNotificationLevel.Success); + this.refresh(); + }, + error=>{ + this.uiNotificationService.snackBarNotification(error.message, SnackBarNotificationLevel.Error); + }); } }); } getStatusClass(status: number):string{ - if(status === 1){//inactive - return 'status-chip-inactive' + if(status === 1){//finalized + return 'status-chip-finalized' } if(status === 0){ - return 'status-chip-active'; + return 'status-chip-draft'; } return ''; } diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index ac755028c..244a7fbb3 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Abbrechen" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index c8913786a..77484b7a0 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Cancel" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 4806a5d5c..5cc7d6820 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Cancelar" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index bd736b761..abea652e3 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Ακύρωση" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index eaf12329a..b46969729 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Cancelar" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 7d3c8efb7..4a07d4adc 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Zrušiť" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index e7075e147..f2595eea5 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "Otkažite" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index ee6213535..d8375d9e6 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1093,8 +1093,11 @@ "UPLOAD-XML-FILE-CANCEL": "İptal" }, "STATUS":{ - "ACTIVE": "Active", - "INACTIVE": "Inactive" + "DRAFT": "Draft", + "FINALIZED": "Finalized" + }, + "MESSAGES":{ + "TEMPLATE-UPLOAD-SUCCESS":"Template successfully uploaded" } }, "DYNAMIC-FORM": { From 11b4d462cf303e6a169d3c3982fcd59c5dacd4da Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 22 Jun 2021 18:29:58 +0300 Subject: [PATCH 005/156] Add type to External Datasets Data --- .../ExportXmlBuilderDatasetProfile.java | 1 + .../commons/datafield/ExternalDatasetsData.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java index 21d1aa402..974cfc015 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java @@ -290,6 +290,7 @@ public class ExportXmlBuilderDatasetProfile { ExternalDatasetsData externalDatasetsData = (ExternalDatasetsData) field.getData(); dataOut.setAttribute("label", externalDatasetsData.getLabel()); dataOut.setAttribute("multiAutocomplete", externalDatasetsData.getMultiAutoComplete().toString()); + dataOut.setAttribute("type", externalDatasetsData.getType()); break; case DATA_REPOSITORIES: DataRepositoriesData dataRepositoriesData = (DataRepositoriesData) field.getData(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ExternalDatasetsData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ExternalDatasetsData.java index bc43f2d6a..cad4e4f19 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ExternalDatasetsData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ExternalDatasetsData.java @@ -8,6 +8,7 @@ import java.util.Map; public class ExternalDatasetsData extends FieldData { private Boolean multiAutoComplete; + private String type; public Boolean getMultiAutoComplete() { return multiAutoComplete; @@ -17,11 +18,20 @@ public class ExternalDatasetsData extends FieldData { this.multiAutoComplete = multiAutoComplete; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + @Override public ExternalDatasetsData fromData(Object data) { if (data != null) { this.setLabel((String) ((Map) data).get("label")); this.setMultiAutoComplete(((Map) data).get("multiAutoComplete") != null && !((Map) data).get("multiAutoComplete").toString().isEmpty()? Boolean.parseBoolean( ((Map) data).get("multiAutoComplete").toString()) : false); + this.setType(((Map) data).get("type") != null && !((Map) data).get("type").toString().isEmpty()? ((Map) data).get("type").toString() : "other"); } return this; } @@ -38,6 +48,9 @@ public class ExternalDatasetsData extends FieldData { if (this.getMultiAutoComplete() != null) { root.setAttribute("multiAutoComplete", this.getMultiAutoComplete().toString()); } + if (this.getType() != null) { + root.setAttribute("type", this.getType()); + } return root; } @@ -45,6 +58,7 @@ public class ExternalDatasetsData extends FieldData { public ExternalDatasetsData fromXml(Element item) { this.setLabel(item != null ? item.getAttribute("label") : ""); this.setMultiAutoComplete(Boolean.parseBoolean(item.getAttribute("multiAutoComplete"))); + this.setType(item.getAttribute("type") != null ? item.getAttribute("type"): "other"); return this; } @@ -53,6 +67,7 @@ public class ExternalDatasetsData extends FieldData { HashMap dataMap = new HashMap(); dataMap.put("label", item != null && item.getAttributes().getLength() > 0? item.getAttribute("label") : ""); dataMap.put("multiAutoComplete", item != null && item.getAttributes().getLength() > 0? Boolean.parseBoolean(item.getAttribute("multiAutocomplete")) : false); + dataMap.put("type", item != null && item.getAttributes().getLength() > 0? item.getAttribute("type") : "other"); return dataMap; } } From 1a6df44eebd3392673f57ea1ea0956f626f4b8c5 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 23 Jun 2021 10:54:05 +0300 Subject: [PATCH 006/156] Add deactivate guards in dataset editor and dmp editor. --- .../dataset/dataset-wizard/dataset-wizard.component.ts | 9 +++++++-- dmp-frontend/src/app/ui/dataset/dataset.routing.ts | 9 ++++++++- dmp-frontend/src/app/ui/dmp/dmp.routing.ts | 6 +++++- .../src/app/ui/dmp/editor/dmp-editor.component.ts | 7 ++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index c5b7516fe..fbce489b4 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -46,13 +46,17 @@ import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; +import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; @Component({ selector: 'app-dataset-wizard-component', templateUrl: 'dataset-wizard.component.html', styleUrls: ['./dataset-wizard.component.scss'] }) -export class DatasetWizardComponent extends BaseComponent implements OnInit, IBreadCrumbComponent { +export class DatasetWizardComponent extends CheckDeactivateBaseComponent implements OnInit, IBreadCrumbComponent { + canDeactivate(): boolean { + return !this.isDirty(); + } breadCrumbs: Observable; viewOnly = false; @@ -619,8 +623,9 @@ export class DatasetWizardComponent extends BaseComponent implements OnInit, IBr .pipe(takeUntil(this._destroyed)) .subscribe( data => { - this.onCallbackSuccess(data, saveType); + this.hasChanges = false; this.datasetIsOnceSaved = true; + this.onCallbackSuccess(data, saveType); }, error => this.onCallbackError(error)); } diff --git a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts index b024aa044..90f46c598 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { CanDeactivateGuard } from '@app/library/deactivate/can-deactivate.guard'; import { AuthGuard } from '../../core/auth-guard.service'; import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; import { DatasetListingComponent } from './listing/dataset-listing.component'; @@ -14,6 +15,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DATASET-NEW' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'edit/:id', @@ -24,6 +26,7 @@ const routes: Routes = [ public: false, title: 'GENERAL.TITLES.DATASET-EDIT' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'publicEdit/:publicId', @@ -32,7 +35,8 @@ const routes: Routes = [ data: { public: true, title: 'GENERAL.TITLES.DATASET-PUBLIC-EDIT' - } + }, + canDeactivate:[CanDeactivateGuard] }, { path: 'new', @@ -42,6 +46,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DATASET-NEW' }, + canDeactivate:[CanDeactivateGuard] }, { path: '', @@ -67,6 +72,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DATASET-COPY' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'profileupdate/:updateId', @@ -76,6 +82,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DATASET-UPDATE' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'overview/:id', diff --git a/dmp-frontend/src/app/ui/dmp/dmp.routing.ts b/dmp-frontend/src/app/ui/dmp/dmp.routing.ts index b3b8574f7..26295c3c0 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.routing.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.routing.ts @@ -7,6 +7,7 @@ import { DmpWizardComponent } from './wizard/dmp-wizard.component'; import { DmpOverviewComponent } from './overview/dmp-overview.component'; import { DmpCloneComponent } from './clone/dmp-clone.component'; import { AuthGuard } from '@app/core/auth-guard.service'; +import { CanDeactivateGuard } from '@app/library/deactivate/can-deactivate.guard'; const routes: Routes = [ { @@ -38,6 +39,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DMP-EDIT' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'publicEdit/:publicId', @@ -46,6 +48,7 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DMP-PUBLIC-EDIT' }, + canDeactivate:[CanDeactivateGuard] }, { path: 'overview/:id', @@ -78,7 +81,8 @@ const routes: Routes = [ data: { breadcrumbs: 'new', title: 'GENERAL.TITLES.DMP-NEW' - } + }, + canDeactivate:[CanDeactivateGuard] }, // { // path: 'new/dataset', diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index cd8c9d6b0..d36071b0d 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -49,13 +49,17 @@ import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { HttpClient } from '@angular/common/http'; import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; +import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; @Component({ selector: 'app-dmp-editor-component', templateUrl: 'dmp-editor.component.html', styleUrls: ['./dmp-editor.component.scss'] }) -export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadCrumbComponent { +export class DmpEditorComponent extends CheckDeactivateBaseComponent implements OnInit, IBreadCrumbComponent { + canDeactivate(): boolean { + return !this.isDirty(); + } editMode = true; // editMode = false; @@ -491,6 +495,7 @@ export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadC complete => { this.formGroup.get('id').setValue(complete.id); this.formGroup.get('modified').setValue(complete.modified); + this.hasChanges = false; if (showAddDatasetDialog) { this.addDatasetOpenDialog(complete); } From ef7de5efe3212a85a53e946928e9c63972cd0e89 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 23 Jun 2021 11:50:10 +0300 Subject: [PATCH 007/156] External Dataset type (newly added field). --- .../common/enum/external-dataset-type-enum.ts | 5 +++++ .../field-data/field-data.ts | 2 ++ .../external-datasets-data-editor-models.ts | 6 ++++- ...tor-external-datasets-field.component.html | 9 ++++++++ ...ditor-external-datasets-field.component.ts | 22 +++++++++++++++++++ dmp-frontend/src/assets/i18n/de.json | 8 ++++++- dmp-frontend/src/assets/i18n/en.json | 8 ++++++- dmp-frontend/src/assets/i18n/es.json | 8 ++++++- dmp-frontend/src/assets/i18n/gr.json | 8 ++++++- dmp-frontend/src/assets/i18n/pt.json | 8 ++++++- dmp-frontend/src/assets/i18n/sk.json | 8 ++++++- dmp-frontend/src/assets/i18n/sr.json | 8 ++++++- dmp-frontend/src/assets/i18n/tr.json | 8 ++++++- 13 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 dmp-frontend/src/app/core/common/enum/external-dataset-type-enum.ts diff --git a/dmp-frontend/src/app/core/common/enum/external-dataset-type-enum.ts b/dmp-frontend/src/app/core/common/enum/external-dataset-type-enum.ts new file mode 100644 index 000000000..241b00ab1 --- /dev/null +++ b/dmp-frontend/src/app/core/common/enum/external-dataset-type-enum.ts @@ -0,0 +1,5 @@ +export enum ExternalDatasetTypeEnum{ + ReusedDataset = "reused_dataset", + ProducedDataset = "produced_dataset", + Other = "other" +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts b/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts index 47adf26c8..ab020df4f 100644 --- a/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts +++ b/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts @@ -1,3 +1,4 @@ +import { ExternalDatasetTypeEnum } from "@app/core/common/enum/external-dataset-type-enum"; import { DatasetProfileComboBoxType } from "../../../common/enum/dataset-profile-combo-box-type"; import { DatasetProfileInternalDmpEntitiesType } from "../../../common/enum/dataset-profile-internal-dmp-entities-type"; @@ -72,6 +73,7 @@ export interface DmpsAutoCompleteFieldData extends FieldData { export interface ExternalDatasetsFieldData extends FieldData { multiAutoComplete: boolean; + type?: ExternalDatasetTypeEnum; } export interface DataRepositoriesFieldData extends FieldData { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/external-datasets-data-editor-models.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/external-datasets-data-editor-models.ts index e8d7b018e..473c4a822 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/external-datasets-data-editor-models.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/external-datasets-data-editor-models.ts @@ -1,15 +1,18 @@ import { FormGroup } from '@angular/forms'; import { FieldDataEditorModel } from './field-data-editor-model'; import { ExternalDatasetsFieldData } from '../../../../../core/model/dataset-profile-definition/field-data/field-data'; +import { ExternalDatasetTypeEnum } from '@app/core/common/enum/external-dataset-type-enum'; export class ExternalDatasetsDataEditorModel extends FieldDataEditorModel { public label: string; public multiAutoComplete: boolean; + public type: ExternalDatasetTypeEnum; buildForm(disabled: boolean = false, skipDisable: Array = []): FormGroup { const formGroup = this.formBuilder.group({ label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('ExternalDatasetsDataEditorModel.label')) }], - multiAutoComplete: [{ value: this.multiAutoComplete, disabled: (disabled && !skipDisable.includes('ExternalDatasetsDataEditorModel.multiAutoComplete')) }] + multiAutoComplete: [{ value: this.multiAutoComplete, disabled: (disabled && !skipDisable.includes('ExternalDatasetsDataEditorModel.multiAutoComplete')) }], + type: [{ value: this.type, disabled: (disabled && !skipDisable.includes('ExternalDatasetsDataEditorModel.type')) }] }); return formGroup; } @@ -17,6 +20,7 @@ export class ExternalDatasetsDataEditorModel extends FieldDataEditorModel + + + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.EXTERNAL-DATASET-TYPE-NAME' | translate}} + + + {{type.label | translate}} + + +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.ts index 43ce6e6ae..e7d31f1d5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.ts @@ -2,6 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { DatePickerDataEditorModel } from '../../../../admin/field-data/date-picker-data-editor-models'; import { ExternalDatasetsDataEditorModel } from '@app/ui/admin/dataset-profile/admin/field-data/external-datasets-data-editor-models'; +import { ExternalDatasetTypeEnum } from '@app/core/common/enum/external-dataset-type-enum'; @Component({ selector: 'app-dataset-profile-editor-external-datasets-field-component', @@ -13,7 +14,28 @@ export class DatasetProfileEditorExternalDatasetsFieldComponent implements OnIni @Input() form: FormGroup; private data: ExternalDatasetsDataEditorModel = new ExternalDatasetsDataEditorModel(); + externalDatasetTypes = [ + ... Object.keys(ExternalDatasetTypeEnum).map(key=>{ + return { + label: this.parseExtrernalDatasetTypeKey(key), + value: ExternalDatasetTypeEnum[key] + }; + }) + ]; ngOnInit() { if (!this.form.get('data')) { this.form.addControl('data', this.data.buildForm()); } } + + parseExtrernalDatasetTypeKey(key: string): string{ + if(ExternalDatasetTypeEnum[key] === ExternalDatasetTypeEnum.ProducedDataset){ + return 'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.EXTERNAL-DATASET-TYPES.PRODUCED'; + } + if(ExternalDatasetTypeEnum[key] === ExternalDatasetTypeEnum.ReusedDataset){ + return 'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.EXTERNAL-DATASET-TYPES.REUSED'; + } + if(ExternalDatasetTypeEnum[key] === ExternalDatasetTypeEnum.Other){ + return 'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.EXTERNAL-DATASET-TYPES.OTHER'; + } + return key; + } } diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 244a7fbb3..8e8b7e968 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 77484b7a0..c57971ac8 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 5cc7d6820..95bdb417f 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index abea652e3..8bbc59a24 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index b46969729..01f6c2244 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dados de Identificador de Dataset", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Texto de Entrada", "FIELD-VALIDATOR-TITLE": "Dados de Validação", - "FIELD-VALIDATOR-PLACEHOLDER": "Texto de Entrada" + "FIELD-VALIDATOR-PLACEHOLDER": "Texto de Entrada", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "Deve ser fornecida pelo menos uma fonte.", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 4a07d4adc..93a476a3d 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index f2595eea5..5dd4d4ddd 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index d8375d9e6..24359261b 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -441,7 +441,13 @@ "FIELD-DATASET-IDENTIFIER-TITLE": "Dataset Identifier Data", "FIELD-DATASET-IDENTIFIER-PLACEHOLDER": "Input placeholder Text", "FIELD-VALIDATOR-TITLE": "Validator Data", - "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text" + "FIELD-VALIDATOR-PLACEHOLDER": "Input placeholder Text", + "EXTERNAL-DATASET-TYPE-NAME": "Type", + "EXTERNAL-DATASET-TYPES":{ + "PRODUCED": "Produced dataset", + "REUSED": "Reused dataset", + "OTHER": "Other" + } }, "ERROR-MESSAGES": { "FIELD-OTHER-SOURCES-REQUIRED": "At least one source must be provided.", From a48ac5fa0f05cbcaca012ebdab54adc2d5d75021 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 23 Jun 2021 17:29:45 +0300 Subject: [PATCH 008/156] When exporting external dataset fields, export and it's type --- .../eudat/logic/utilities/documents/xml/ExportXmlBuilder.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java index 14b7b30b2..3e94c7f4d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java @@ -2,6 +2,7 @@ package eu.eudat.logic.utilities.documents.xml; import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.models.data.components.commons.datafield.ExternalDatasetsData; import eu.eudat.models.data.user.components.datasetprofile.Field; import eu.eudat.models.data.user.components.datasetprofile.FieldSet; import eu.eudat.models.data.user.components.datasetprofile.Section; @@ -92,6 +93,9 @@ public class ExportXmlBuilder { if (visibilityRuleService.isElementVisible(field.getId())) { Element elementField = element.createElement("field"); elementField.setAttribute("id", field.getId()); + if (field.getViewStyle().getRenderStyle().equals("externalDatasets")) { + elementField.setAttribute("type", ((ExternalDatasetsData)field.getData()).getType()); + } if (field.getValue() != null) { Element valueField = element.createElement("value"); try { From e486169ae501366011e8c3cc32a729f4cadf6bdc Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Thu, 24 Jun 2021 12:46:31 +0300 Subject: [PATCH 009/156] EOSC section added in index page (static page) **Missing one link --- .../dmp-profile-criteria.component.html | 2 +- .../dmp-profile-criteria.component.scss | 2 +- .../assets/splash/assets/img/eosc_logo.png | Bin 0 -> 22925 bytes .../src/assets/splash/css/section.css | 50 +++++++++++++ dmp-frontend/src/assets/splash/index.html | 68 ++++++++++++------ 5 files changed, 99 insertions(+), 23 deletions(-) create mode 100644 dmp-frontend/src/assets/splash/assets/img/eosc_logo.png diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html index fa9141ae4..34dd7626d 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.html @@ -1,6 +1,6 @@
-
+
diff --git a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss index 88846d9a8..7389ee36f 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss +++ b/dmp-frontend/src/app/ui/admin/dmp-profile/listing/criteria/dmp-profile-criteria.component.scss @@ -3,7 +3,7 @@ background-color: white !important; padding-bottom: 0 !important; } -:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { +:host ::ng-deep .search-container .mat-form-field-appearance-outline .mat-form-field-infix { padding: 0.3rem 0rem 0.6rem 0rem !important; } diff --git a/dmp-frontend/src/assets/splash/assets/img/eosc_logo.png b/dmp-frontend/src/assets/splash/assets/img/eosc_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fab95f7e46e522a155b8cd6d66446341d252d81b GIT binary patch literal 22925 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 J=tiU){{b&VoMZq1 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/splash/css/section.css b/dmp-frontend/src/assets/splash/css/section.css index 10943753b..aa7fe5179 100644 --- a/dmp-frontend/src/assets/splash/css/section.css +++ b/dmp-frontend/src/assets/splash/css/section.css @@ -254,3 +254,53 @@ section.media-kit-logo { padding-bottom: 2rem; } } + +.eosc{ + margin-top: 8.5em; + margin-bottom: 5em; +} +.eosc-row{ + justify-content: space-around; +} +.european-open-cloud{ + background: #C2EDED 0% 0% no-repeat padding-box; + height: 453px; + width: 347px; + box-shadow: 0px 3px 6px #0044941A; + transform: matrix(0.99, -0.16, 0.16, 0.99, 0, 0); + display: flex; + align-items: center; + justify-content: center; +} +.eosc_logo{ + height: 117px; +} + +.eosc-desc{ + font-size: 1rem; + color: #292747; + opacity: 1; + margin-bottom: 3.5em; +} +.eosc-header{ + font-weight: 400 !important; + font-size: 2.375em !important; + line-height: 2.66rem !important; + margin-bottom: .7em; +} +.eosc-tag{ + color: #004494; +} +.eosc-learn-more{ + max-width: 256px; + height: 40px; + cursor: pointer; + background: #004494 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1E202029; + border-radius: 30px; + border: none; + color: #FFFFFF; + opacity: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; +} \ No newline at end of file diff --git a/dmp-frontend/src/assets/splash/index.html b/dmp-frontend/src/assets/splash/index.html index a956b1501..ffc5e2d6e 100644 --- a/dmp-frontend/src/assets/splash/index.html +++ b/dmp-frontend/src/assets/splash/index.html @@ -97,33 +97,31 @@
- -
+ +
@@ -233,6 +231,34 @@
+ +
+
+
+
+

Start your

+
+

Argos

 

experience

+
+
+
+

1

 

Select Templates

+
+
+

2

 

Fill the information

+
+
+

3

 

Share DMP

+
+
+
+
+ +
+
+
+
+
From d878562d3dc1e5ce3f368fb7077d2362acdb6ba5 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Thu, 24 Jun 2021 16:00:21 +0300 Subject: [PATCH 010/156] Ui fixes on landpage (static pages) --- .../dmp/editor/dataset-info/dataset-info.component.ts | 3 --- .../src/app/ui/dmp/editor/dmp-editor.component.ts | 2 -- .../src/app/ui/dmp/overview/dmp-overview.component.ts | 2 +- dmp-frontend/src/assets/splash/css/section.css | 3 ++- dmp-frontend/src/assets/splash/index.html | 10 +++++----- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts index 651d65560..c55006816 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts @@ -7,7 +7,6 @@ import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/mu import { map, takeUntil } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { ExternalSourcesService } from '@app/core/services/external-sources/external-sources.service'; -import { isNullOrUndefined } from 'util'; import { MatDialog } from '@angular/material'; import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; @@ -21,8 +20,6 @@ import { Router, Params, ActivatedRoute } from '@angular/router'; import { RequestItem } from '@app/core/query/request-item'; import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; import { DatasetDescriptionFormEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; -import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; -import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; import { DatasetPreviewDialogComponent } from '../../dataset-preview/dataset-preview-dialog.component'; diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index d36071b0d..c0b6676c7 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -26,7 +26,6 @@ import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model'; import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model'; import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; import { IBreadCrumbComponent } from '@app/ui/misc/breadcrumb/definition/IBreadCrumbComponent'; -import { BaseComponent } from '@common/base/base.component'; import { FormService } from '@common/forms/form-service'; import { FormValidationErrorsDialogComponent } from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component'; import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; @@ -47,7 +46,6 @@ import { DatasetService } from '@app/core/services/dataset/dataset.service'; import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component'; import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; -import { HttpClient } from '@angular/common/http'; import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 28fc75677..e0b8b7950 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -160,7 +160,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { setIsUserOwner() { if (this.dmp) { const principal: Principal = this.authentication.current(); - if (principal) this.isUserOwner = principal.id === this.dmp.users.find(x => x.role === Role.Owner).id; + if (principal) this.isUserOwner = !!this.dmp.users.find(x => (x.role === Role.Owner) && (principal.id === x.id)); } } diff --git a/dmp-frontend/src/assets/splash/css/section.css b/dmp-frontend/src/assets/splash/css/section.css index aa7fe5179..0bec5d83f 100644 --- a/dmp-frontend/src/assets/splash/css/section.css +++ b/dmp-frontend/src/assets/splash/css/section.css @@ -257,7 +257,7 @@ section.media-kit-logo { .eosc{ margin-top: 8.5em; - margin-bottom: 5em; + /* margin-bottom: 5em; */ } .eosc-row{ justify-content: space-around; @@ -271,6 +271,7 @@ section.media-kit-logo { display: flex; align-items: center; justify-content: center; + margin-bottom: 4em; } .eosc_logo{ height: 117px; diff --git a/dmp-frontend/src/assets/splash/index.html b/dmp-frontend/src/assets/splash/index.html index ffc5e2d6e..b776ccdb4 100644 --- a/dmp-frontend/src/assets/splash/index.html +++ b/dmp-frontend/src/assets/splash/index.html @@ -101,21 +101,21 @@
-
+
- +
-
+

Connect with OpenAIRE & EOSC

Link your plan directly to underlying OpenAIRE and EOSC services, - soures and semantics and trace the quality of your research. Use Argos + sources and semantics and trace the quality of your research. Use Argos templates that incorporate the fullest collections of repositories, datasets, metadata standards and other resources to choose from when completing your DMP's.

- +

From 4a4042d621025d20d4897776cb819835065c36c8 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 25 Jun 2021 12:32:58 +0300 Subject: [PATCH 011/156] Fix various library issues with postgres and elastic --- dmp-backend/pom.xml | 34 ++++++++++++++- dmp-backend/web/pom.xml | 6 ++- .../ElasticSearchConfiguration.java | 42 +++++++++++++++---- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 335884af1..254577ace 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -69,7 +69,39 @@ org.elasticsearch elasticsearch - 7.6.0 + 7.7.0 + + + org.apache.httpcomponents + httpclient + + + org.apache.httpcomponents + httpcore + + + org.apache.httpcomponents + httpcore-nio + + + + + + org.apache.httpcomponents + httpclient + 4.5.12 + + + + org.apache.httpcomponents + httpcore-nio + 4.4.13 + + + + org.apache.httpcomponents + httpcore + 4.4.13 diff --git a/dmp-backend/web/pom.xml b/dmp-backend/web/pom.xml index 0063c90d7..d3cfd31e6 100644 --- a/dmp-backend/web/pom.xml +++ b/dmp-backend/web/pom.xml @@ -79,9 +79,9 @@ - postgresql + org.postgresql postgresql - 9.1-901.jdbc4 + 42.2.22 @@ -134,6 +134,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.8.1 1.8 1.8 @@ -142,6 +143,7 @@ org.springframework.boot spring-boot-maven-plugin + 1.5.9.RELEASE diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java index 549156f83..e299035e1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java @@ -5,18 +5,27 @@ import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; +import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; +import org.apache.http.nio.reactor.IOReactorException; +import org.apache.http.nio.reactor.IOReactorExceptionHandler; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import java.io.IOException; + /** * Created by ikalyvas on 7/5/2018. */ @Configuration public class ElasticSearchConfiguration { + private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfiguration.class); private Environment environment; @@ -31,12 +40,31 @@ public class ElasticSearchConfiguration { credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(this.environment.getProperty("elasticsearch.username"), this.environment.getProperty("elasticsearch.password"))); - RestHighLevelClient client = new RestHighLevelClient( - RestClient.builder( - new HttpHost(this.environment.getProperty("elasticsearch.host"), - Integer.parseInt(this.environment.getProperty("elasticsearch.port")), "http")) - .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder - .setDefaultCredentialsProvider(credentialsProvider))); - return client; + try { + DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); + ioReactor.setExceptionHandler(new IOReactorExceptionHandler() { + @Override + public boolean handle(IOException e) { + logger.warn("System may be unstable: IOReactor encountered a checked exception : " + e.getMessage(), e); + return true; // Return true to note this exception as handled, it will not be re-thrown + } + + @Override + public boolean handle(RuntimeException e) { + logger.warn("System may be unstable: IOReactor encountered a runtime exception : " + e.getMessage(), e); + return true; // Return true to note this exception as handled, it will not be re-thrown + } + }); + + RestHighLevelClient client = new RestHighLevelClient( + RestClient.builder( + new HttpHost(this.environment.getProperty("elasticsearch.host"), + Integer.parseInt(this.environment.getProperty("elasticsearch.port")), "http")) + .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder + .setDefaultCredentialsProvider(credentialsProvider).setConnectionManager(new PoolingNHttpClientConnectionManager(ioReactor)))); + return client; + }catch (IOReactorException ex) { + throw new RuntimeException(ex); + } } } From d1df83f689a735c9c55f30d969385f1bce509d2d Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 25 Jun 2021 19:27:02 +0300 Subject: [PATCH 012/156] Add query db fallback for DMPs --- .../logic/managers/DataManagementPlanManager.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index dbf63563c..ab1ac3d84 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -130,11 +130,16 @@ public class DataManagementPlanManager { QueryableList items = null; QueryableList authItems = null; if (apiContext.getOperationsContext().getElasticRepository().getDmpRepository() != null) { - DmpCriteria criteria = DmpCriteriaMapper.toElasticCriteria(dataManagementPlanTableRequest.getCriteria()); - dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(criteria); - if (dmps != null && !dmps.isEmpty()) { - List finalDmps = dmps; - items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))); + try { + DmpCriteria criteria = DmpCriteriaMapper.toElasticCriteria(dataManagementPlanTableRequest.getCriteria()); + dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(criteria); + if (dmps != null && !dmps.isEmpty()) { + List finalDmps = dmps; + items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))); + } + } catch (Exception ex) { + logger.error(ex.getMessage(), ex); + items = null; } } if (items == null) { From 03b7699973cee0d552e01e3525a765495def7074 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 25 Jun 2021 19:29:51 +0300 Subject: [PATCH 013/156] Reduce severity --- .../java/eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index ab1ac3d84..0b577f39b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -138,7 +138,7 @@ public class DataManagementPlanManager { items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))); } } catch (Exception ex) { - logger.error(ex.getMessage(), ex); + logger.warn(ex.getMessage(), ex); items = null; } } From dcd7f24cace7396c6533f94a125754c0e43bc47b Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 29 Jun 2021 11:45:20 +0300 Subject: [PATCH 014/156] Fix listing issues and improve elastic query --- .../main/java/eu/eudat/data/entities/DMP.java | 8 +- .../elastic/criteria/DatasetCriteria.java | 27 ++++ .../eudat/elastic/criteria/DmpCriteria.java | 37 ++++++ .../eudat/elastic/criteria/SortCriteria.java | 39 ++++++ .../eudat/elastic/entities/Collaborator.java | 12 +- .../eu/eudat/elastic/entities/Dataset.java | 37 ++++++ .../java/eu/eudat/elastic/entities/Dmp.java | 62 +++++++++- .../elastic/repository/DatasetRepository.java | 24 +++- .../elastic/repository/DmpRepository.java | 92 +++++++++++++- .../logic/managers/DashBoardManager.java | 6 +- .../managers/DataManagementPlanManager.java | 117 +++++++++++++----- .../eudat/logic/managers/DatasetManager.java | 26 +++- .../mapper/elastic/CollaboratorMapper.java | 3 +- .../logic/mapper/elastic/DatasetMapper.java | 5 +- .../eudat/logic/mapper/elastic/DmpMapper.java | 6 +- .../elastic/criteria/DmpCriteriaMapper.java | 28 ++++- .../DataManagementPlanListingModel.java | 56 ++++----- 17 files changed, 505 insertions(+), 80 deletions(-) create mode 100644 dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/SortCriteria.java diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java index 1a475db17..b4f212210 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java @@ -15,11 +15,11 @@ import java.util.stream.Collectors; @NamedEntityGraphs({ @NamedEntityGraph( name = "dataManagementPlanListingModel", - attributeNodes = {@NamedAttributeNode("organisations"), @NamedAttributeNode("researchers"), @NamedAttributeNode("associatedDmps"), - @NamedAttributeNode("grant"), @NamedAttributeNode(value = "users", subgraph = "users"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")}, - subgraphs = { + attributeNodes = { + @NamedAttributeNode("grant"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile")}/*,*/ + /*subgraphs = { @NamedSubgraph(name = "users", attributeNodes = {@NamedAttributeNode("user")}), - } + }*/ ), @NamedEntityGraph( name = "fullyDetailed", diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java index 62d2fc5a4..705093384 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java @@ -21,6 +21,9 @@ public class DatasetCriteria extends Criteria { private List tags; private boolean isPublic; private Short grantStatus; + private int offset; + private int size; + private List sortCriteria; public String getLike() { return like; @@ -117,4 +120,28 @@ public class DatasetCriteria extends Criteria { public void setGrantStatus(Short grantStatus) { this.grantStatus = grantStatus; } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public List getSortCriteria() { + return sortCriteria; + } + + public void setSortCriteria(List sortCriteria) { + this.sortCriteria = sortCriteria; + } } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java index 4f9a89962..fb12d48aa 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java @@ -9,11 +9,16 @@ public class DmpCriteria extends Criteria { private List templates; private List grants; private List collaborators; + private List roles; private List organizations; private boolean isPublic; private List groupIds; private boolean allowAllVersions; private Short grantStatus; + private int offset; + private int size; + private List sortCriteria; + public String getLike() { return like; @@ -55,6 +60,14 @@ public class DmpCriteria extends Criteria { this.collaborators = collaborators; } + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + public List getOrganizations() { return organizations; } @@ -94,4 +107,28 @@ public class DmpCriteria extends Criteria { public void setGrantStatus(Short grantStatus) { this.grantStatus = grantStatus; } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public List getSortCriteria() { + return sortCriteria; + } + + public void setSortCriteria(List sortCriteria) { + this.sortCriteria = sortCriteria; + } } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/SortCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/SortCriteria.java new file mode 100644 index 000000000..0d1876a76 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/SortCriteria.java @@ -0,0 +1,39 @@ +package eu.eudat.elastic.criteria; + +public class SortCriteria { + public enum OrderByType { + ASC, DESC + } + + public enum ColumnType { + COUNT, COLUMN, JOIN_COLUMN + } + + private String fieldName; + private OrderByType orderByType; + private ColumnType columnType; + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public OrderByType getOrderByType() { + return orderByType; + } + + public void setOrderByType(OrderByType orderByType) { + this.orderByType = orderByType; + } + + public ColumnType getColumnType() { + return columnType; + } + + public void setColumnType(ColumnType columnType) { + this.columnType = columnType; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Collaborator.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Collaborator.java index 4a9a06d26..386a0fc22 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Collaborator.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Collaborator.java @@ -4,11 +4,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; import java.util.Map; -import java.util.UUID; public class Collaborator implements ElasticEntity { private String id; private String name; + private int role; public String getId() { return id; @@ -26,11 +26,20 @@ public class Collaborator implements ElasticEntity { this.name = name; } + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + @Override public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { builder.startObject(); builder.field("id", this.id); builder.field("name", this.name); + builder.field("role", this.role); builder.endObject(); return builder; } @@ -39,6 +48,7 @@ public class Collaborator implements ElasticEntity { public Collaborator fromElasticEntity(Map fields) { this.id = (String) fields.get("id"); this.name = (String) fields.get("name"); + this.role = (int) fields.get("role"); return this; } } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java index ee538c06b..c54088f18 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -59,6 +60,9 @@ public class Dataset implements ElasticEntity { private Boolean isPublic; private Short grantStatus; private String formData; + private Date created; + private Date modified; + private Date finalizedAt; public String getId() { return id; @@ -188,6 +192,30 @@ public class Dataset implements ElasticEntity { this.formData = formData; } + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public Date getFinalizedAt() { + return finalizedAt; + } + + public void setFinalizedAt(Date finalizedAt) { + this.finalizedAt = finalizedAt; + } + @Override public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { builder.startObject(); @@ -197,6 +225,9 @@ public class Dataset implements ElasticEntity { builder.field("template", this.template.toString()); builder.field("status", this.status.toString()); builder.field("dmp", this.dmp.toString()); + builder.field("created", this.created); + builder.field("modified", this.modified); + builder.field("finalizedAt", this.finalizedAt); if (this.group != null) { builder.field("group", this.group.toString()); } @@ -263,6 +294,12 @@ public class Dataset implements ElasticEntity { this.dmp = UUID.fromString((String) fields.get("dmp")); this.group = UUID.fromString((String) fields.get("group")); this.grant = UUID.fromString((String) fields.get("grant")); + if (fields.get("created") != null) + this.created = Date.from(Instant.parse((String) fields.get("created"))); + if (fields.get("modified") != null) + this.modified = Date.from(Instant.parse((String) fields.get("modified"))); + if (fields.get("finalizedAt") != null) + this.finalizedAt = Date.from(Instant.parse((String) fields.get("finalizedAt"))); if (fields.get("collaborators") != null) { this.collaborators = ((List) fields.get("collaborators")).stream().map(hashMap -> new Collaborator().fromElasticEntity(hashMap)).collect(Collectors.toList()); } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java index b10147413..8faea3233 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java @@ -5,10 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; public class Dmp implements ElasticEntity { @@ -55,6 +52,11 @@ public class Dmp implements ElasticEntity { private List datasets; private UUID grant; private Short grantStatus; + private Date created; + private Date modified; + private Date finalizedAt; + private Date publishedAt; + private String doi; public UUID getId() { return id; @@ -168,6 +170,46 @@ public class Dmp implements ElasticEntity { this.grantStatus = grantStatus; } + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public Date getFinalizedAt() { + return finalizedAt; + } + + public void setFinalizedAt(Date finalizedAt) { + this.finalizedAt = finalizedAt; + } + + public Date getPublishedAt() { + return publishedAt; + } + + public void setPublishedAt(Date publishedAt) { + this.publishedAt = publishedAt; + } + + public String getDoi() { + return doi; + } + + public void setDoi(String doi) { + this.doi = doi; + } + @Override public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { builder.startObject(); @@ -233,6 +275,11 @@ public class Dmp implements ElasticEntity { builder.field(MapKey.GRANT.getName(), this.grant.toString()); } builder.field(MapKey.GRANTSTATUS.getName(), this.grantStatus); + builder.field(MapKey.CREATED.getName(), this.created); + builder.field(MapKey.MODIFIED.getName(), this.modified); + builder.field(MapKey.FINALIZEDAT.getName(), this.finalizedAt); + builder.field(MapKey.PUBLISHEDAT.getName(), this.publishedAt); + builder.field(MapKey.DOI.getName(), this.doi); builder.endObject(); return builder; } @@ -282,7 +329,12 @@ public class Dmp implements ElasticEntity { ISPUBLIC ("isPublic"), DATASETS ("datasets"), GRANT ("grant"), - GRANTSTATUS ("grantStatus"); + GRANTSTATUS ("grantStatus"), + CREATED ("created"), + MODIFIED ("modified"), + FINALIZEDAT ("finalizedAt"), + PUBLISHEDAT ("publishedAt"), + DOI ("doi"); private final String name; diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java index b8c26a489..33ff68253 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java @@ -24,6 +24,9 @@ import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilters; import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; @@ -120,6 +123,7 @@ public class DatasetRepository extends ElasticRepository sortBuilders = new ArrayList<>(); if (criteria.isPublic()) { boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.public", "true")); boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.status", Dataset.Status.FINALISED.getValue())); @@ -181,8 +185,26 @@ public class DatasetRepository extends ElasticRepository { + switch(sortCriteria.getColumnType()) { + case COLUMN: + sortBuilders.add(SortBuilders.fieldSort(sortCriteria.getFieldName()).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + break; + case JOIN_COLUMN: + List fields = Arrays.asList(sortCriteria.getFieldName().split(":")); + fields.stream().filter(name -> !name.startsWith("dmp")).forEach(field -> { + sortBuilders.add(SortBuilders.fieldSort(field).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + }); + break; + } + }); + + } + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("datasets", boolQuery, ScoreMode.Avg).innerHit(new InnerHitBuilder()); - searchSourceBuilder.query(nestedQueryBuilder); + searchSourceBuilder.query(nestedQueryBuilder).from(criteria.getOffset()).size(criteria.getSize()); + sortBuilders.forEach(searchSourceBuilder::sort); searchRequest.source(searchSourceBuilder); SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); return ((Stream)Arrays.stream(response.getHits().getHits()) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java index 2829c85d1..124c7cc55 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java @@ -23,6 +23,9 @@ import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.SortBuilder; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -97,6 +100,7 @@ public class DmpRepository extends ElasticRepository { searchSourceBuilder.size(count.intValue()); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); + List sortBuilders = new ArrayList<>(); if (criteria.isPublic()) { boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); @@ -125,7 +129,11 @@ public class DmpRepository extends ElasticRepository { } if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getRoles() != null && criteria.getRoles().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".role.keyword", criteria.getRoles())); } if (!criteria.isAllowAllVersions()) { @@ -145,7 +153,26 @@ public class DmpRepository extends ElasticRepository { } else { boolQuery.minimumShouldMatch(boolQuery.should().size()); } - searchSourceBuilder.query(boolQuery); + + if (criteria.getSortCriteria() != null && !criteria.getSortCriteria().isEmpty()) { + criteria.getSortCriteria().forEach(sortCriteria -> { + switch(sortCriteria.getColumnType()) { + case COLUMN: + sortBuilders.add(SortBuilders.fieldSort(sortCriteria.getFieldName()).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + break; + case JOIN_COLUMN: + List fields = Arrays.asList(sortCriteria.getFieldName().split(":")); + fields.forEach(field -> { + sortBuilders.add(SortBuilders.fieldSort(sortCriteria.getFieldName()).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + }); + break; + } + }); + + } + + searchSourceBuilder.query(boolQuery).from(criteria.getOffset()).size(criteria.getSize()); + sortBuilders.forEach(searchSourceBuilder::sort); searchRequest.source(searchSourceBuilder); SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); return Arrays.stream(response.getHits().getHits()).map(x -> new Dmp().fromElasticEntity((Map) this.transformFromString(x.getSourceAsString(), Map.class))).collect(Collectors.toList()); @@ -153,6 +180,67 @@ public class DmpRepository extends ElasticRepository { return null; } + public Long count(DmpCriteria criteria) throws IOException { + if (this.getClient() != null) { + CountRequest countRequest = new CountRequest(this.environment.getProperty("elasticsearch.index")); + + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); + if (criteria.isPublic()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); + } + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { + boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).fields(Stream.of(new Object[][]{ + {Dmp.MapKey.LABEL.getName(), 1.0f}, + {Dmp.MapKey.DESCRIPTION.getName(), 1.0f} + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); + } + + if (criteria.getTemplates() != null && criteria.getTemplates().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.TEMPLATES.getName() + ".id.keyword", criteria.getTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), criteria.getStatus().intValue())); + } + + if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GROUPID.getName(), criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GRANT.getName() + ".keyword", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (!criteria.isAllowAllVersions()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(criteria.isPublic() ? Dmp.MapKey.LASTPUBLICVERSION.getName() : Dmp.MapKey.LASTVERSION.getName(), true)); + } + + if (criteria.getOrganizations() != null && criteria.getOrganizations().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.ORGANIZATIONS.getName() + ".id.keyword", criteria.getOrganizations().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrantStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.GRANTSTATUS.getName(), criteria.getGrantStatus())); + } + + if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { + boolQuery = boolQuery.should(QueryBuilders.matchAllQuery()); + } else { + boolQuery.minimumShouldMatch(boolQuery.should().size()); + } + + countRequest.query(boolQuery); + CountResponse response = this.getClient().count(countRequest, RequestOptions.DEFAULT); + return response.getCount(); + } + return null; + } + public boolean createIndex() { try { if (!this.exists()) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index b6bf4e918..a01ef19ef 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -182,14 +182,14 @@ public class DashBoardManager { .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) .whenComplete((datasetActivities, throwable) -> activity.setRecentDatasetActivities(datasetActivities)); - CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user) + /*CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user) .withHint("grantRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) - .whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities)); + .whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities));*/ - CompletableFuture.allOf(grants, dmps, datasets).join(); + CompletableFuture.allOf(/*grants, */dmps, datasets).join(); return activity; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 0b577f39b..50782785a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -13,6 +13,7 @@ import eu.eudat.data.enumeration.notification.ActiveStatus; import eu.eudat.data.enumeration.notification.ContactType; import eu.eudat.data.enumeration.notification.NotificationType; import eu.eudat.data.enumeration.notification.NotifyState; +import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; import eu.eudat.elastic.criteria.DmpCriteria; @@ -129,13 +130,19 @@ public class DataManagementPlanManager { List dmps = null; QueryableList items = null; QueryableList authItems = null; + Long totalData = 0L; if (apiContext.getOperationsContext().getElasticRepository().getDmpRepository() != null) { try { - DmpCriteria criteria = DmpCriteriaMapper.toElasticCriteria(dataManagementPlanTableRequest.getCriteria()); + DmpCriteria criteria = DmpCriteriaMapper.toElasticCriteria(dataManagementPlanTableRequest.getCriteria(), principalID); + criteria.setOffset(dataManagementPlanTableRequest.getOffset()); + criteria.setSize(dataManagementPlanTableRequest.getLength()); + criteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(dataManagementPlanTableRequest.getOrderings())); dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(criteria); if (dmps != null && !dmps.isEmpty()) { List finalDmps = dmps; items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))); + PaginationManager.applyOrder(items, dataManagementPlanTableRequest); + totalData = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().count(criteria); } } catch (Exception ex) { logger.warn(ex.getMessage(), ex); @@ -144,63 +151,116 @@ public class DataManagementPlanManager { } if (items == null) { items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); + List roles = new LinkedList<>(); + if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) { + if (dataManagementPlanTableRequest.getCriteria().getRole() != null) + roles.add(dataManagementPlanTableRequest.getCriteria().getRole()); + authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID, roles); + } else { + authItems = items; + } + totalData = authItems.count(); + items = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); } - List roles = new LinkedList<>(); - if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) { - if (dataManagementPlanTableRequest.getCriteria().getRole() != null) - roles.add(dataManagementPlanTableRequest.getCriteria().getRole()); - authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID, roles); - } else { - authItems = items; - } - QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); + + DataTableData dataTable = new DataTableData<>(); CompletableFuture itemsFuture; if (fieldsGroup.equals("listing")) { if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) { - itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) - .distinct() - .selectAsync(item -> { + List dmps1 = items.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .distinct().toList(); + dataTable.setData(dmps1.stream().map(dmp -> { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setDmpIds(Collections.singletonList(dmp.getId())); + dmp.setDataset(retrieveRelevantDatasets(datasetCriteria, principalID)); + + + return new DataManagementPlanListingModel().fromDataModelDatasets(dmp); + }).collect(Collectors.toList())); + /*.selectAsync(item -> { item.setDataset( item.getDataset().stream() .filter(dataset -> !dataset.getStatus().equals(Dataset.Status.DELETED.getValue()) && !dataset.getStatus().equals(Dataset.Status.CANCELED.getValue())).collect(Collectors.toList()).stream() - .filter(dataset -> dataset.getDmp().getUsers().stream() + *//*.filter(dataset -> dataset.getDmp().getUsers().stream() .filter(x -> x.getUser().getId().equals(principalID)) - .collect(Collectors.toList()).size() > 0) + .collect(Collectors.toList()).size() > 0)*//* .collect(Collectors.toSet())); return new DataManagementPlanListingModel().fromDataModelDatasets(item); }) - .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + .whenComplete((resultList, throwable) -> dataTable.setData(resultList));*/ } else { - itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) - .distinct() - .selectAsync(item -> { + List dmps1 = items.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .distinct().toList(); + dataTable.setData(dmps1.stream().map(dmp -> { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setDmpIds(Collections.singletonList(dmp.getId())); + datasetCriteria.setIsPublic(true); + dmp.setDataset(retrieveRelevantDatasets(datasetCriteria)); + + + return new DataManagementPlanListingModel().fromDataModelDatasets(dmp); + }).collect(Collectors.toList())); + /*.selectAsync(item -> { item.setDataset( item.getDataset().stream() .filter(dataset -> dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())).collect(Collectors.toSet())); return new DataManagementPlanListingModel().fromDataModelDatasets(item); }) - .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + .whenComplete((resultList, throwable) -> dataTable.setData(resultList));*/ } } else if (fieldsGroup.equals("autocomplete")) { - itemsFuture = pagedItems + dataTable.setData(items .distinct() - .selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAutoComplete(item)) - .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + .select(item -> new DataManagementPlanListingModel().fromDataModelAutoComplete(item))); } else { - itemsFuture = pagedItems + dataTable.setData(items .distinct() - .selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAssociatedProfiles(item)) - .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + .select(item -> new DataManagementPlanListingModel().fromDataModelAssociatedProfiles(item))); } - CompletableFuture countFuture = authItems.distinct().countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); - CompletableFuture.allOf(itemsFuture, countFuture).join(); + //CompletableFuture countFuture = authItems.distinct().countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); + dataTable.setTotalCount(totalData); + //CompletableFuture.allOf(itemsFuture).join(); return dataTable; } + private Set retrieveRelevantDatasets(DatasetCriteria datasetCriteria) { + return retrieveRelevantDatasets(datasetCriteria, null); + } + + private Set retrieveRelevantDatasets (DatasetCriteria datasetCriteria, UUID principal) { + QueryableList datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetCriteria); + if (principal != null) { + UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal); + List roles = new ArrayList<>(); + roles.add(0); + roles.add(1); + datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(datasetItems, userInfo, roles); + } + Long maxDatasets = datasetItems.count(); + DatasetTableRequest datasetTableRequest = new DatasetTableRequest(); + datasetTableRequest.setOffset(0); + datasetTableRequest.setLength(3); + Set datasetsSet = new LinkedHashSet<>(); + try { + datasetItems = PaginationManager.applyPaging(datasetItems, datasetTableRequest); + List datasets = datasetItems.toList(); + datasetsSet.addAll(datasets); + for (int i = 0; i < maxDatasets - datasets.size(); i++) { + Dataset fakedataset = new Dataset(); + fakedataset.setId(UUID.randomUUID()); + datasetsSet.add(fakedataset); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + + return datasetsSet; + } + public eu.eudat.models.data.dmp.DataManagementPlan getSingle(String id, Principal principal, boolean isPublic) throws Exception { eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan(); DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); @@ -864,6 +924,7 @@ public class DataManagementPlanManager { datasetElastic.setCollaborators(dataset1.getDmp().getUsers().stream().map(user -> { Collaborator collaborator = new Collaborator(); collaborator.setId(user.getId().toString()); + collaborator.setRole(user.getRole()); // collaborator.setName(user.getUser().getName()); return collaborator; }).collect(Collectors.toList())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 65809a4e7..069e381e3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -22,6 +22,7 @@ import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.builders.entity.UserInfoBuilder; import eu.eudat.logic.mapper.elastic.DatasetMapper; +import eu.eudat.logic.mapper.elastic.criteria.DmpCriteriaMapper; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.forms.VisibilityRuleService; @@ -137,9 +138,21 @@ public class DatasetManager { if (datasetTableRequest.getCriteria().getIsPublic() != null) { datasetCriteria.setPublic(datasetTableRequest.getCriteria().getIsPublic()); } + + if (!datasetCriteria.isPublic()) { + if (datasetCriteria.getCollaborators() == null) { + datasetCriteria.setSortCriteria(new ArrayList<>()); + } + datasetCriteria.getCollaborators().add(principal.getId()); + } if (datasetTableRequest.getCriteria().getGrantStatus() != null) { datasetCriteria.setGrantStatus(datasetTableRequest.getCriteria().getGrantStatus()); } + if (datasetTableRequest.getOrderings() != null) { + datasetCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(datasetTableRequest.getOrderings())); + } + datasetCriteria.setOffset(datasetTableRequest.getOffset()); + datasetCriteria.setSize(datasetTableRequest.getLength()); List datasets; try { datasets = datasetRepository.exists() ? @@ -206,6 +219,11 @@ public class DatasetManager { datasetCriteria.setDatasetTemplates(datasetTableRequest.getCriteria().getDatasetProfile()); datasetCriteria.setDmps(datasetTableRequest.getCriteria().getDmpIds()); datasetCriteria.setGrants(datasetTableRequest.getCriteria().getGrants()); + if (datasetTableRequest.getOrderings() != null) { + datasetCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(datasetTableRequest.getOrderings())); + } + datasetCriteria.setOffset(datasetTableRequest.getOffset()); + datasetCriteria.setSize(datasetTableRequest.getLength()); List datasets; try { datasets = datasetRepository.exists() ? @@ -214,9 +232,9 @@ public class DatasetManager { logger.warn(ex.getMessage()); datasets = null; } - datasetTableRequest.setQuery(databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class))); - QueryableList items = datasetTableRequest.applyCriteria(); - /*QueryableList items; + /*datasetTableRequest.setQuery(databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class))); + QueryableList items = datasetTableRequest.applyCriteria();*/ + QueryableList items; if (datasets != null) { if (!datasets.isEmpty()) { items = databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)); @@ -227,7 +245,7 @@ public class DatasetManager { items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()})); } else { items = datasetTableRequest.applyCriteria(); - }*/ + } if (principal.getId() != null && datasetTableRequest.getCriteria().getRole() != null) { items.where((builder, root) -> { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/CollaboratorMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/CollaboratorMapper.java index a80260840..2ae10cba8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/CollaboratorMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/CollaboratorMapper.java @@ -5,10 +5,11 @@ import eu.eudat.elastic.entities.Collaborator; public class CollaboratorMapper { - public static Collaborator toElastic(UserInfo user) { + public static Collaborator toElastic(UserInfo user, Integer role) { Collaborator elastic = new Collaborator(); elastic.setId(user.getId().toString()); elastic.setName(user.getName()); + elastic.setRole(role); return elastic; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java index 46d4f632b..dad3924d9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java @@ -50,8 +50,11 @@ public class DatasetMapper { elastic.setDmp(dataset.getDmp().getId()); elastic.setGroup(dataset.getDmp().getGroupId()); elastic.setGrant(dataset.getDmp().getGrant().getId()); + elastic.setCreated(dataset.getCreated()); + elastic.setModified(dataset.getModified()); + elastic.setFinalizedAt(dataset.getFinalizedAt()); if (dataset.getDmp().getUsers() != null) { - elastic.setCollaborators(dataset.getDmp().getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser())).collect(Collectors.toList())); + elastic.setCollaborators(dataset.getDmp().getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser(), user.getRole())).collect(Collectors.toList())); } DataManagementPlanCriteria dmpCriteria = new DataManagementPlanCriteria(); dmpCriteria.setAllVersions(true); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java index 608da5fca..92eb02bfe 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java @@ -34,13 +34,17 @@ public class DmpMapper { elastic.setId(dmp.getId()); elastic.setGroupId(dmp.getGroupId()); if (dmp.getUsers() != null) { - elastic.setCollaborators(dmp.getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser())).collect(Collectors.toList())); + elastic.setCollaborators(dmp.getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser(), user.getRole())).collect(Collectors.toList())); } elastic.setDescription(dmp.getDescription()); elastic.setGrant(dmp.getGrant().getId()); elastic.setLabel(dmp.getLabel()); elastic.setPublic(dmp.isPublic()); elastic.setStatus(dmp.getStatus()); + elastic.setCreated(dmp.getCreated()); + elastic.setModified(dmp.getModified()); + elastic.setFinalizedAt(dmp.getFinalizedAt()); + elastic.setPublishedAt(dmp.getPublishedAt()); DataManagementPlanCriteria dmpCriteria = new DataManagementPlanCriteria(); dmpCriteria.setAllVersions(true); dmpCriteria.setGroupIds(Collections.singletonList(dmp.getGroupId())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java index bb1b0cf7c..810161ff2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java @@ -2,14 +2,20 @@ package eu.eudat.logic.mapper.elastic.criteria; import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.entities.Grant; +import eu.eudat.data.query.definition.helpers.ColumnOrderings; +import eu.eudat.data.query.definition.helpers.Ordering; import eu.eudat.elastic.criteria.DmpCriteria; +import eu.eudat.elastic.criteria.SortCriteria; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.UUID; import java.util.stream.Collectors; public class DmpCriteriaMapper { - public static DmpCriteria toElasticCriteria(DataManagementPlanCriteria criteria) { + public static DmpCriteria toElasticCriteria(DataManagementPlanCriteria criteria, UUID principalID) { DmpCriteria elastic = new DmpCriteria(); elastic.setAllowAllVersions(criteria.getAllVersions()); @@ -23,6 +29,12 @@ public class DmpCriteriaMapper { elastic.setOrganizations(criteria.getOrganisations().stream().map(UUID::fromString).collect(Collectors.toList())); } elastic.setPublic(criteria.getIsPublic()); + if (!elastic.isPublic()) { + elastic.setCollaborators(Collections.singletonList(principalID)); + } + if (criteria.getRole() != null) { + elastic.setRoles(Collections.singletonList(criteria.getRole())); + } if (criteria.getStatus() != null) { elastic.setStatus(criteria.getStatus().shortValue()); } @@ -30,4 +42,18 @@ public class DmpCriteriaMapper { elastic.setGrantStatus(criteria.getGrantStatus()); return elastic; } + + public static List toElasticSorting(ColumnOrderings columnOrderings) { + List sortCriteria = new ArrayList<>(); + if (columnOrderings.getFieldOrderings() != null && columnOrderings.getFieldOrderings().length > 0) { + for (Ordering ordering: columnOrderings.getFieldOrderings()) { + SortCriteria sortCriteria1 = new SortCriteria(); + sortCriteria1.setFieldName(ordering.getFieldName()); + sortCriteria1.setColumnType(ordering.getColumnType() != null ? SortCriteria.ColumnType.valueOf(ordering.getColumnType().name()): SortCriteria.ColumnType.COLUMN); + sortCriteria1.setOrderByType(SortCriteria.OrderByType.valueOf(ordering.getOrderByType().name())); + sortCriteria.add(sortCriteria1); + } + } + return sortCriteria; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java index 1a2483314..48df2685e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java @@ -24,19 +24,19 @@ public class DataManagementPlanListingModel implements DataModel datasets; - private List associatedProfiles; + //private List associatedProfiles; private List users; private String description; - private String grantAbbreviation; - private String grantId; + // private String grantAbbreviation; + // private String grantId; private Date finalizedAt; private Boolean isPublic; private Date publishedAt; @@ -63,19 +63,19 @@ public class DataManagementPlanListingModel implements DataModel getAssociatedProfiles() { + /*public List getAssociatedProfiles() { return associatedProfiles; } public void setAssociatedProfiles(List associatedProfiles) { this.associatedProfiles = associatedProfiles; - } + }*/ public List getUsers() { return users; @@ -140,19 +140,19 @@ public class DataManagementPlanListingModel implements DataModel new AssociatedProfile().fromData(item)).collect(Collectors.toList()); + /*this.creationTime = entity.getCreated(); + this.associatedProfiles = entity.getAssociatedDmps().stream().map(item -> new AssociatedProfile().fromData(item)).collect(Collectors.toList());*/ return this; } @@ -196,7 +196,7 @@ public class DataManagementPlanListingModel implements DataModel new Organisation().fromDataModel(item)).collect(Collectors.toList())); +// this.organisations = LabelBuilder.getLabel(entity.getOrganisations().stream().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList())); this.datasets = entity.getDataset().stream().map(x-> new DatasetUrlListing().fromDataModel(x)).collect(Collectors.toList()); this.users = entity.getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList()); this.description = entity.getDescription(); - this.grantAbbreviation = entity.getGrant().getAbbreviation(); - this.grantId = entity.getGrant().getId().toString(); +// this.grantAbbreviation = entity.getGrant().getAbbreviation(); +// this.grantId = entity.getGrant().getId().toString(); this.finalizedAt = entity.getFinalizedAt(); this.isPublic = entity.isPublic(); this.publishedAt = entity.getPublishedAt(); - if (entity.getAssociatedDmps() != null && !entity.getAssociatedDmps().isEmpty()) { + /*if (entity.getAssociatedDmps() != null && !entity.getAssociatedDmps().isEmpty()) { this.associatedProfiles = new LinkedList<>(); for (DatasetProfile datasetProfile: entity.getAssociatedDmps()) { AssociatedProfile associatedProfile = new AssociatedProfile().fromData(datasetProfile); this.associatedProfiles.add(associatedProfile); } - } + }*/ return this; } From f9814d33020702bfd016119caeccb8a0e75c1ded Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 29 Jun 2021 14:33:57 +0300 Subject: [PATCH 015/156] Update Spring boot framework to version 2.5.2 --- dmp-backend/pom.xml | 64 +++--- dmp-backend/web/pom.xml | 31 +-- .../main/java/eu/eudat/EuDatApplication.java | 2 +- .../java/eu/eudat/cache/ResponsesCache.java | 30 +-- .../DevelDatabaseConfiguration.java | 2 +- .../configurations/WebMVCConfiguration.java | 2 - .../main/java/eu/eudat/controllers/Admin.java | 8 +- .../main/java/eu/eudat/controllers/Login.java | 11 +- .../controllers/UserGuideController.java | 6 +- .../managers/DataManagementPlanManager.java | 87 ++------ .../eudat/logic/managers/DatasetManager.java | 34 +--- .../logic/managers/DatasetProfileManager.java | 29 +-- .../eudat/logic/managers/MetricsManager.java | 192 ++++++++++++++---- .../logic/proxy/fetching/RemoteFetcher.java | 2 +- .../resources/config/application.properties | 13 ++ 15 files changed, 287 insertions(+), 226 deletions(-) diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 254577ace..be51b3cd1 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -10,7 +10,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.9.RELEASE + 2.5.2 @@ -27,25 +27,26 @@ 1.8 0.0.1-SNAPSHOT - 4.3.8.RELEASE + 5.3.8 - 4.2.3.RELEASE - 1.19.1 + 5.3.10.RELEASE + + + - 5.2.11.Final + 5.5.3.Final 1.9 4.11 1.2.17 1.7.12 - 9.0.7.v20131107 - + 1.2.3 - 1 - 3.0.1 - ikalyvas + + @@ -58,7 +59,7 @@ org.springframework spring-context-support - 4.0.0.RELEASE + ${org.springframework.version} org.springframework.boot @@ -139,7 +140,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.9.3 + 2.12.3 @@ -147,13 +148,13 @@ com.fasterxml.jackson.core jackson-core - 2.9.4 + 2.12.3 com.fasterxml.jackson.core jackson-databind - 2.9.4 + 2.12.3 @@ -257,36 +258,53 @@ 1.3.1 + + + javax.validation + validation-api + 2.0.1.Final + + + io.prometheus simpleclient - 0.10.0 + 0.11.0 io.prometheus simpleclient_hotspot - 0.10.0 + 0.11.0 io.prometheus simpleclient_httpserver - 0.10.0 + 0.11.0 io.prometheus simpleclient_pushgateway - 0.10.0 + 0.11.0 - + - io.prometheus - simpleclient_spring_boot - 0.10.0 + io.micrometer + micrometer-registry-prometheus + 1.7.1 + + + org.springframework.boot + spring-boot-starter-actuator + + + + io.micrometer + micrometer-core diff --git a/dmp-backend/web/pom.xml b/dmp-backend/web/pom.xml index d3cfd31e6..6798b6022 100644 --- a/dmp-backend/web/pom.xml +++ b/dmp-backend/web/pom.xml @@ -50,31 +50,37 @@ com.fasterxml.jackson.core jackson-annotations - 2.9.0 + 2.12.3 - + - + + + com.github.ben-manes.caffeine + caffeine + 2.9.0 + + - junit - junit - 4.12 + org.junit.jupiter + junit-jupiter-api + 5.7.2 test @@ -87,7 +93,7 @@ io.springfox springfox-swagger-ui - 2.7.0 + 3.0.0 @@ -101,7 +107,7 @@ org.springframework.social spring-social-linkedin - 1.0.0.RELEASE + 1.0.2.RELEASE @@ -143,7 +149,6 @@ org.springframework.boot spring-boot-maven-plugin - 1.5.9.RELEASE diff --git a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java index d9c2b65d6..31e87ddf5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java +++ b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication diff --git a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java index 0a09a6731..427b61173 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java +++ b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java @@ -1,12 +1,12 @@ package eu.eudat.cache; -import com.google.common.cache.CacheBuilder; +import com.github.benmanes.caffeine.cache.Caffeine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.guava.GuavaCache; +import org.springframework.cache.caffeine.CaffeineCache; import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -29,19 +29,19 @@ public class ResponsesCache { public CacheManager cacheManager() { logger.info("Loading ResponsesCache..."); SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); - List caches = new ArrayList(); - caches.add(new GuavaCache("repositories", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("grants", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("projects", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("funders", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("organisations", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("registries", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("services", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("tags", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("researchers", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("externalDatasets", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("currencies", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); - caches.add(new GuavaCache("licenses", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + List caches = new ArrayList(); + caches.add(new CaffeineCache("repositories", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("grants", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("projects", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("funders", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("organisations", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("registries", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("services", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("tags", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("researchers", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("externalDatasets", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("currencies", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new CaffeineCache("licenses", Caffeine.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); simpleCacheManager.setCaches(caches); logger.info("OK"); return simpleCacheManager; diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java index 1c5c48bed..a1311f1f1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java @@ -2,8 +2,8 @@ package eu.eudat.configurations; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.*; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java index 2c64aa8d1..36d9c502c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java @@ -4,7 +4,6 @@ import eu.eudat.controllers.interceptors.RequestInterceptor; import eu.eudat.logic.handlers.PrincipalArgumentResolver; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.authentication.AuthenticationService; -import io.prometheus.client.spring.boot.EnablePrometheusEndpoint; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @@ -18,7 +17,6 @@ import java.util.List; @EnableAsync @Configuration @EnableScheduling -@EnablePrometheusEndpoint public class WebMVCConfiguration extends WebMvcConfigurerAdapter { private ApiContext apiContext; diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java index 6a89b4429..8cee99ae8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java @@ -44,13 +44,15 @@ public class Admin extends BaseController { private DatasetProfileManager datasetProfileManager; private UserManager userManager; private ConfigLoader configLoader; + private final MetricsManager metricsManager; @Autowired - public Admin(ApiContext apiContext, DatasetProfileManager datasetProfileManager, UserManager userManager/*, Logger logger*/, ConfigLoader configLoader) { + public Admin(ApiContext apiContext, DatasetProfileManager datasetProfileManager, UserManager userManager/*, Logger logger*/, ConfigLoader configLoader, MetricsManager metricsManager) { super(apiContext); this.datasetProfileManager = datasetProfileManager; this.userManager = userManager; this.configLoader = configLoader; + this.metricsManager = metricsManager; } @Transactional @@ -70,7 +72,7 @@ public class Admin extends BaseController { userDatasetProfile.setRole(0); getApiContext().getOperationsContext().getDatabaseRepository().getUserDatasetProfileDao().createOrUpdate(userDatasetProfile); datasetProfileManager.storeDatasetProfileUsers(datasetProfile, profile); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + metricsManager.increaseValue("argos_dataset_templates", 1, "total"); return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); } @@ -89,7 +91,7 @@ public class Admin extends BaseController { eu.eudat.data.entities.DatasetProfile datasetProfile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); datasetProfileManager.storeDatasetProfileUsers(datasetProfile, profile); if (datasetProfile.getStatus() == 1 && oldStatus == 0) { - MetricsManager.increaseValue("argos_dataset_templates", 1, "active"); + metricsManager.increaseValue("argos_dataset_templates", 1, "active"); } return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java index ac75578d9..a6172f284 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java @@ -64,6 +64,7 @@ public class Login { private ConfigurableProviderTokenValidator configurableProviderTokenValidator; private ZenodoTokenValidator zenodoTokenValidator; private ConfigLoader configLoader; + private final MetricsManager metricsManager; // private Logger logger; @@ -75,7 +76,8 @@ public class Login { B2AccessTokenValidator b2AccessTokenValidator, ORCIDTokenValidator orcidTokenValidator, LinkedInTokenValidator linkedInTokenValidator, OpenAIRETokenValidator openAIRETokenValidator, ConfigurableProviderTokenValidator configurableProviderTokenValidator, ZenodoTokenValidator zenodoTokenValidator, - ConfigLoader configLoader, UserManager userManager) { + ConfigLoader configLoader, UserManager userManager, + MetricsManager metricsManager) { this.customAuthenticationProvider = customAuthenticationProvider; this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; this.twitterTokenValidator = twitterTokenValidator; @@ -87,6 +89,7 @@ public class Login { this.zenodoTokenValidator = zenodoTokenValidator; this.configLoader = configLoader; this.userManager = userManager; + this.metricsManager = metricsManager; } @@ -95,7 +98,7 @@ public class Login { public @ResponseBody ResponseEntity> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException, NullEmailException { logger.info("Trying To Login With " + credentials.getProvider()); - MetricsManager.increaseValue("argos_users", 1, "loggedin"); + metricsManager.increaseValue("argos_users", 1, "loggedin"); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @@ -104,7 +107,7 @@ public class Login { public @ResponseBody ResponseEntity> nativelogin(@RequestBody Credentials credentials) throws NullEmailException { logger.info(credentials.getUsername() + " Trying To Login"); - MetricsManager.increaseValue("argos_users", 1, "loggedin"); + metricsManager.increaseValue("argos_users", 1, "loggedin"); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(userManager.authenticate(this.nonVerifiedUserAuthenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @@ -165,7 +168,7 @@ public class Login { ResponseEntity> logout(Principal principal) { this.nonVerifiedUserAuthenticationService.Logout(principal.getToken()); logger.info(principal + " Logged Out"); - MetricsManager.decreaseValue("argos_users", 1, "loggedin"); + metricsManager.decreaseValue("argos_users", 1, "loggedin"); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java index 6cb588eef..811e0c4bd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java @@ -30,16 +30,18 @@ import static eu.eudat.types.Authorities.ADMIN; public class UserGuideController { private Environment environment; + private final MetricsManager metricsManager; @Autowired - public UserGuideController(Environment environment) { + public UserGuideController(Environment environment, MetricsManager metricsManager) { this.environment = environment; + this.metricsManager = metricsManager; } @RequestMapping(path = "{lang}", method = RequestMethod.GET ) public ResponseEntity getUserGuide(@PathVariable(name = "lang") String lang) throws IOException { long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - MetricsManager.calculateValue("argos_languages", (int) files, null); + metricsManager.calculateValue("argos_languages", (int) files, null); Stream walk = Files.walk(Paths.get(this.environment.getProperty("userguide.path"))); List result = walk.filter(Files::isRegularFile) .map(Path::toString).collect(Collectors.toList()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 50782785a..9ffcc6dac 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -109,9 +109,10 @@ public class DataManagementPlanManager { private Environment environment; private RDAManager rdaManager; private UserManager userManager; + private final MetricsManager metricsManager; @Autowired - public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment, RDAManager rdaManager, UserManager userManager) { + public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment, RDAManager rdaManager, UserManager userManager, MetricsManager metricsManager) { this.apiContext = apiContext; this.datasetManager = datasetManager; this.utilitiesService = apiContext.getUtilitiesService(); @@ -119,6 +120,7 @@ public class DataManagementPlanManager { this.environment = environment; this.rdaManager = rdaManager; this.userManager = userManager; + this.metricsManager = metricsManager; } /* @@ -441,7 +443,7 @@ public class DataManagementPlanManager { setNotification = true; } else { - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.increaseValue("argos_managed_dmps", 1, "draft"); } DMP newDmp = dataManagementPlan.toDataModel(); @@ -565,7 +567,7 @@ public class DataManagementPlanManager { if (dataManagementPlan.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue() && dmp1.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) throw new Exception("DMP is finalized, therefore cannot be edited."); } else { - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.increaseValue("argos_managed_dmps", 1, "draft"); } List datasets = new ArrayList<>(); DMP tempDMP = dataManagementPlan.toDataModel(); @@ -681,7 +683,7 @@ public class DataManagementPlanManager { newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList())); this.updateIndex(newDmp); - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.increaseValue("argos_managed_dmps", 1, "draft"); return newDmp.getId(); } @@ -695,16 +697,16 @@ public class DataManagementPlanManager { DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); switch (oldDmp.getStatus()) { case 0: - MetricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); break; case 1: if (oldDmp.getDoi() != null) { - MetricsManager.decreaseValue("argos_managed_dmps", 1, "doied"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "doied"); } if (oldDmp.isPublic()) { - MetricsManager.decreaseValue("argos_managed_dmps", 1, "published"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "published"); } - MetricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); break; } oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); @@ -744,7 +746,7 @@ public class DataManagementPlanManager { else { researcher.setCreationUser(user); researcherRepository.createOrUpdate(researcher); - MetricsManager.increaseValue("argos_researchers", 1, null); + metricsManager.increaseValue("argos_researchers", 1, null); } } } @@ -826,14 +828,14 @@ public class DataManagementPlanManager { project.setType(Project.ProjectType.EXTERNAL.getValue()); if (project.getId() == null) project.setId(UUID.randomUUID()); projectDao.createOrUpdate(project); - MetricsManager.increaseValue("argos_projects", 1, null); + metricsManager.increaseValue("argos_projects", 1, null); } } else { project.setType(Project.ProjectType.EXTERNAL.getValue()); if (project.getId() == null) project.setId(UUID.randomUUID()); projectDao.createOrUpdate(project); - MetricsManager.increaseValue("argos_projects", 1, null); + metricsManager.increaseValue("argos_projects", 1, null); } } } @@ -910,7 +912,7 @@ public class DataManagementPlanManager { return newDataset; }).thenApplyAsync(item -> { futures.add(datasetDao.createOrUpdateAsync(item).whenComplete(((dataset1, throwable) -> { - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); eu.eudat.elastic.entities.Dataset datasetElastic = new eu.eudat.elastic.entities.Dataset(); datasetElastic.setId(dataset1.getId().toString()); datasetElastic.setLabel(dataset1.getLabel()); @@ -969,7 +971,7 @@ public class DataManagementPlanManager { dmp.setPublic(true); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); this.updateIndex(dmp); - MetricsManager.increaseValue("argos_managed_dmps", 1, "published"); + metricsManager.increaseValue("argos_managed_dmps", 1, "published"); DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); criteria.setGroupIds(Collections.singletonList(dmp.getGroupId())); criteria.setAllVersions(true); @@ -982,7 +984,7 @@ public class DataManagementPlanManager { tags = elastic.getTags(); } this.datasetManager.updateTags(dataset, tags); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -1068,11 +1070,11 @@ public class DataManagementPlanManager { this.updateIndex(dmp); UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); sendNotification(dmp, user, NotificationType.DMP_FINALISED); - MetricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); - MetricsManager.increaseValue("argos_managed_dmps", 1, "finalized"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.increaseValue("argos_managed_dmps", 1, "finalized"); this.updateDatasetsIndex(indexDatasets); - MetricsManager.decreaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "draft"); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "finalized"); + metricsManager.decreaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "draft"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "finalized"); } public void undoFinalize(UUID id, Principal principal) throws Exception { @@ -1084,8 +1086,8 @@ public class DataManagementPlanManager { dmp.setStatus(DMP.DMPStatus.ACTIVE.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); this.updateIndex(dmp); - MetricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + metricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); + metricsManager.increaseValue("argos_managed_dmps", 1, "draft"); } public void updateUsers(UUID id, List users, Principal principal) throws Exception { @@ -2143,51 +2145,6 @@ public class DataManagementPlanManager { } - public long countAllDrafts() { - DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); - criteria.setStatus(0); - return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); - } - - public long countAllFinalized() { - DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); - criteria.setStatus(1); - return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); - } - - public long countAllPublished() { - DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); - criteria.setIsPublic(true); - criteria.setOnlyPublic(true); - return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); - } - - public long countAllDoied() { - DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); - criteria.setHasDoi(true); - return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); - } - - public long countAllResearchers() { - ResearcherCriteria criteria = new ResearcherCriteria(); - return apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().getWithCriteria(criteria).count(); - } - - public long countAllProjects() { - ProjectCriteria criteria = new ProjectCriteria(); - return apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCritetia(criteria).count(); - } - - public long countAllFunders() { - FunderCriteria criteria = new FunderCriteria(); - return apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getWithCritetia(criteria).count(); - } - - public long countAllGrants() { - GrantCriteria criteria = new GrantCriteria(); - return apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().getWithCriteria(criteria).count(); - } - /*public DataTableData getPublicPaged(DataManagmentPlanPublicTableRequest dataManagementPlanPublicTableRequest, String fieldsGroup, Principal principal) throws Exception { dataManagementPlanPublicTableRequest.setQuery(databaseRepository.getDmpDao().asQueryable().withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class))); QueryableList items = dataManagementPlanPublicTableRequest.applyCriteria(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 069e381e3..0e030783e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -109,9 +109,10 @@ public class DatasetManager { private UserManager userManager; private ConfigLoader configLoader; private Environment environment; + private final MetricsManager metricsManager; @Autowired - public DatasetManager(ApiContext apiContext, UserManager userManager, ConfigLoader configLoader, Environment environment) { + public DatasetManager(ApiContext apiContext, UserManager userManager, ConfigLoader configLoader, Environment environment, MetricsManager metricsManager) { this.apiContext = apiContext; this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); this.datasetRepository = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository(); @@ -119,6 +120,7 @@ public class DatasetManager { this.userManager = userManager; this.configLoader = configLoader; this.environment = environment; + this.metricsManager = metricsManager; } public DataTableData getPaged(DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { @@ -613,7 +615,7 @@ public class DatasetManager { sendNotification = true; } } else { - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); } if (dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()) && datasetWizardModel.getId() != null) throw new Exception("DMP is finalized, therefore Dataset cannot be edited."); @@ -857,7 +859,7 @@ public class DatasetManager { if (dataset.getStatus() != eu.eudat.data.entities.Dataset.Status.FINALISED.getValue()) throw new Exception("You cannot make public a Dataset That Has not Been Finalised"); datasetDao.createOrUpdate(dataset); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); } public ResponseEntity getDocument(String id, VisibilityRuleService visibilityRuleService, String contentType, Principal principal) throws IllegalAccessException, IOException, InstantiationException { @@ -946,7 +948,7 @@ public class DatasetManager { createServicesIfTheyDontExist(entity); createExternalDatasetsIfTheyDontExist(entity); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + metricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(entity); } @@ -1102,28 +1104,4 @@ public class DatasetManager { listingModel.setProfileLatestVersion(islast); return listingModel; } - - public long countAllDraft() { - eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); - criteria.setStatus(0); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); - } - - public long countAllFinalized() { - eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); - criteria.setStatus(1); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); - } - - public long countAllPublic() { - eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); - criteria.setIsPublic(true); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); - } - - public long countAllWithDoi() { - eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); - criteria.setHasDoi(true); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); - } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 56e97cfb4..c145306b6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -59,12 +59,14 @@ public class DatasetProfileManager { private DatabaseRepository databaseRepository; private Environment environment; private List cache; + private final MetricsManager metricsManager; @Autowired - public DatasetProfileManager(ApiContext apiContext, Environment environment) { + public DatasetProfileManager(ApiContext apiContext, Environment environment, MetricsManager metricsManager) { this.apiContext = apiContext; this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); this.environment = environment; + this.metricsManager = metricsManager; this.cache = new ArrayList<>(); } @@ -92,7 +94,7 @@ public class DatasetProfileManager { DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); apiContext.getOperationsContext().getDatabaseRepository().detachEntity(profile); profile.setId(null); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + metricsManager.increaseValue("argos_dataset_templates", 1, "total"); return profile; } @@ -232,7 +234,7 @@ public class DatasetProfileManager { File localFile = convert(multiPartFile); eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.DatasetProfile profile = xmlBuilder.build(localFile); Files.deleteIfExists(localFile.toPath()); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + metricsManager.increaseValue("argos_dataset_templates", 1, "total"); return profile; } catch (IOException e) { logger.error(e.getMessage(), e); @@ -311,25 +313,4 @@ public class DatasetProfileManager { }).collect(Collectors.toList())); } } - - public long countAlldraft() { - DatasetProfileCriteria criteria = new DatasetProfileCriteria(); - criteria.setStatus(0); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).count(); - } - - public long countAllFinalized() { - DatasetProfileCriteria criteria = new DatasetProfileCriteria(); - criteria.setStatus(1); - return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).count(); - } - - @Transactional - public long countAllUsed() { - DatasetProfileCriteria criteria = new DatasetProfileCriteria(); - criteria.setStatus(1); - criteria.setAllVersions(false); - List datasetProfiles = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).toList(); - return datasetProfiles.stream().filter(StreamDistinctBy.distinctByKey(DatasetProfile::getId)).filter(datasetProfile -> !datasetProfile.getDataset().isEmpty()).count(); - } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 353171093..9dc432068 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -1,5 +1,11 @@ package eu.eudat.logic.managers; +import eu.eudat.data.dao.criteria.*; +import eu.eudat.data.entities.Dataset; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.utilities.helpers.StreamDistinctBy; +import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.Gauge; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,32 +19,16 @@ import javax.transaction.Transactional; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @Component public class MetricsManager { private final static Logger logger = LoggerFactory.getLogger(MetricsManager.class); - private static Map gauges = Stream.of( new Object[][]{ - {"argos_managed_dmps", Gauge.build().name("argos_managed_dmps").help("Number of managed DMPs").labelNames("status").register()}, - - {"argos_funders", Gauge.build().name("argos_funders").help("Number of registered Funders").register()}, - {"argos_grants", Gauge.build().name("argos_grants").help("Number of registered Grants").register()}, - {"argos_projects", Gauge.build().name("argos_projects").help("Number of registered Projects").register()}, - {"argos_researchers", Gauge.build().name("argos_researchers").help("Number of Colaborators/Researchers").register()}, - - {"argos_managed_dataset_descriptions", Gauge.build().name("argos_managed_dataset_descriptions").help("Number of managed Dataset Descriptions").labelNames("status").register()}, - - {"argos_dataset_templates", Gauge.build().name("argos_dataset_templates").help("Number of dataset Templates").labelNames("status").register()}, - - {"argos_users", Gauge.build().name("argos_users").help("Number of users").labelNames("type").register()}, - - {"argos_languages", Gauge.build().name("argos_languages").help("Number of Languages").register()}, - - }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); + private final Map gauges; - public static void increaseValue(String name, int amount, String label) { + public void increaseValue(String name, int amount, String label) { if(label != null) { gauges.get(name).labels(label).inc(amount); @@ -47,7 +37,7 @@ public class MetricsManager { } } - public static void decreaseValue(String name, int amount, String label) { + public void decreaseValue(String name, int amount, String label) { if(label != null) { gauges.get(name).labels(label).dec(amount); } else { @@ -55,7 +45,7 @@ public class MetricsManager { } } - public static Integer getValue(String name, String label) { + public Integer getValue(String name, String label) { if(label != null) { return Double.valueOf(gauges.get(name).labels(label).get()).intValue(); } else { @@ -63,7 +53,7 @@ public class MetricsManager { } } - public static void calculateValue(String name, int amount, String label) { + public void calculateValue(String name, int amount, String label) { Integer orig = getValue(name, label); int diff = orig - amount; if (diff != 0) { @@ -75,19 +65,34 @@ public class MetricsManager { } } - private final DatasetManager datasetManager; - private final DataManagementPlanManager dataManagementPlanManager; - private final DatasetProfileManager datasetProfileManager; + private final ApiContext apiContext; private final UserManager userManager; private final Environment environment; @Autowired - public MetricsManager(DatasetManager datasetManager, DataManagementPlanManager dataManagementPlanManager, DatasetProfileManager datasetProfileManager, UserManager userManager, Environment environment) { - this.datasetManager = datasetManager; - this.dataManagementPlanManager = dataManagementPlanManager; - this.datasetProfileManager = datasetProfileManager; + public MetricsManager(ApiContext apiContext, UserManager userManager, Environment environment, PrometheusMeterRegistry registry) { + this.apiContext = apiContext; this.userManager = userManager; this.environment = environment; + registry.clear(); + this.gauges = Stream.of( new Object[][]{ + {"argos_managed_dmps", Gauge.build().name("argos_managed_dmps").help("Number of managed DMPs").labelNames("status").register(registry.getPrometheusRegistry())}, + + {"argos_funders", Gauge.build().name("argos_funders").help("Number of registered Funders").register(registry.getPrometheusRegistry())}, + {"argos_grants", Gauge.build().name("argos_grants").help("Number of registered Grants").register(registry.getPrometheusRegistry())}, + {"argos_projects", Gauge.build().name("argos_projects").help("Number of registered Projects").register(registry.getPrometheusRegistry())}, + {"argos_researchers", Gauge.build().name("argos_researchers").help("Number of Colaborators/Researchers").register(registry.getPrometheusRegistry())}, + + {"argos_managed_dataset_descriptions", Gauge.build().name("argos_managed_dataset_descriptions").help("Number of managed Dataset Descriptions").labelNames("status").register(registry.getPrometheusRegistry())}, + + {"argos_dataset_templates", Gauge.build().name("argos_dataset_templates").help("Number of dataset Templates").labelNames("status").register(registry.getPrometheusRegistry())}, + + {"argos_users", Gauge.build().name("argos_users").help("Number of users").labelNames("type").register(registry.getPrometheusRegistry())}, + + {"argos_languages", Gauge.build().name("argos_languages").help("Number of Languages").register(registry.getPrometheusRegistry())}, + + }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); + } @PostConstruct @@ -95,24 +100,24 @@ public class MetricsManager { @Scheduled(initialDelay = 1000 * 60 * 60, fixedDelay = 1000 * 60 * 60) public void init() throws IOException { logger.info("Start calculating Metrics"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllDrafts(), "draft"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllFinalized(), "finalized"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllPublished(), "published"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllDoied(), "doied"); + calculateValue("argos_managed_dmps", (int) countAllDraftDMPs(), "draft"); + calculateValue("argos_managed_dmps", (int) countAllFinalizedDMPs(), "finalized"); + calculateValue("argos_managed_dmps", (int) countAllPublishedDMPs(), "published"); + calculateValue("argos_managed_dmps", (int) countAllDoiedDMPs(), "doied"); - calculateValue("argos_funders", (int) dataManagementPlanManager.countAllFunders(), null); - calculateValue("argos_grants", (int) dataManagementPlanManager.countAllGrants(), null); - calculateValue("argos_projects", (int) dataManagementPlanManager.countAllProjects(), null); - calculateValue("argos_researchers", (int) dataManagementPlanManager.countAllResearchers(), null); + calculateValue("argos_funders", (int) countAllFunders(), null); + calculateValue("argos_grants", (int) countAllGrants(), null); + calculateValue("argos_projects", (int) countAllProjects(), null); + calculateValue("argos_researchers", (int) countAllResearchers(), null); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllDraft(), "draft"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllFinalized(), "finalized"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllPublic(), "published"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllWithDoi(), "doied"); + calculateValue("argos_managed_dataset_descriptions", (int) countAllDraftDatasets(), "draft"); + calculateValue("argos_managed_dataset_descriptions", (int) countAllFinalizedDatasets(), "finalized"); + calculateValue("argos_managed_dataset_descriptions", (int) countAllPublicDatasets(), "published"); + calculateValue("argos_managed_dataset_descriptions", (int) countAllDatasetsWithDoi(), "doied"); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAlldraft(), "draft"); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAllFinalized(), "active"); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAllUsed(), "used"); + calculateValue("argos_dataset_templates", (int) countAllDraftTemplates(), "draft"); + calculateValue("argos_dataset_templates", (int) countAllFinalizedTemplates(), "active"); + calculateValue("argos_dataset_templates", (int) countAllUsedTemplates(), "used"); calculateValue("argos_users", (int) userManager.countActiveUsers().intValue(), "loggedin"); calculateValue("argos_users", (int) userManager.countAllUsers().intValue(), "total"); @@ -123,4 +128,103 @@ public class MetricsManager { logger.info("Metrics calculation Completed"); } + private long countAllDraftDMPs() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setStatus(0); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); + } + + private long countAllFinalizedDMPs() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setStatus(1); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); + } + + private long countAllPublishedDMPs() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setIsPublic(true); + criteria.setOnlyPublic(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); + } + + private long countAllDoiedDMPs() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setHasDoi(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); + } + + private long countAllResearchers() { + ResearcherCriteria criteria = new ResearcherCriteria(); + return apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().getWithCriteria(criteria).count(); + } + + private long countAllProjects() { + ProjectCriteria criteria = new ProjectCriteria(); + return apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCritetia(criteria).count(); + } + + private long countAllFunders() { + FunderCriteria criteria = new FunderCriteria(); + return apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getWithCritetia(criteria).count(); + } + + private long countAllGrants() { + GrantCriteria criteria = new GrantCriteria(); + return apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().getWithCriteria(criteria).count(); + } + + public long countAllDraftDatasets() { + eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); + criteria.setStatus(0); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); + } + + public long countAllFinalizedDatasets() { + eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); + criteria.setStatus(1); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); + } + + public long countAllPublicDatasets() { + eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); + criteria.setIsPublic(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); + } + + public long countAllDatasetsWithDoi() { + eu.eudat.data.dao.criteria.DatasetCriteria criteria = new eu.eudat.data.dao.criteria.DatasetCriteria(); + criteria.setHasDoi(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).count(); + } + + public long countAllDraftTemplates() { + DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + criteria.setStatus(0); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).count(); + } + + public long countAllFinalizedTemplates() { + DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + criteria.setStatus(1); + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).count(); + } + + @Transactional + public long countAllUsedTemplates() { + DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + criteria.setStatus(1); + criteria.setAllVersions(false); + List datasetProfiles = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).toList(); + List filteredProfiles = new ArrayList<>(); + for (DatasetProfile datasetProfile : datasetProfiles) { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setDatasetTemplates(Collections.singletonList(datasetProfile.getId())); + Long datasetCount = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetCriteria).count(); + if (datasetCount > 0) { + filteredProfiles.add(datasetProfile); + } + } + return filteredProfiles.stream().filter(StreamDistinctBy.distinctByKey(DatasetProfile::getId)).count(); + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 7b1bb2ac9..43c645f60 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -459,7 +459,7 @@ public class RemoteFetcher { try { String filePath = Paths.get(path).toUri().toURL().toString(); ObjectMapper mapper = new ObjectMapper(); - internalResults = mapper.readValue(new File(filePath), new TypeReference>>(){}); + internalResults = mapper.readValue(new File(filePath), new TypeReference>>(){}); return searchListMap(internalResults, query); } catch (Exception e) { logger.error(e.getMessage(), e); diff --git a/dmp-backend/web/src/main/resources/config/application.properties b/dmp-backend/web/src/main/resources/config/application.properties index 34fd880db..a12b86668 100644 --- a/dmp-backend/web/src/main/resources/config/application.properties +++ b/dmp-backend/web/src/main/resources/config/application.properties @@ -5,6 +5,19 @@ logging.file=/logs/spring-boot-logging.log spring.profiles.active=devel eu.eudat.logic.proxy.allowed.host=https://eestore.paas2.uninett.no +####################Metrics############## +management.endpoint.metrics.enabled=false +management.metrics.enable.http=false +management.metrics.enable.jvm=false +management.metrics.enable.jdbc=false +management.metrics.enable.tomcat=false +management.metrics.enable.logback=false +management.metrics.enable.hikaricp=false +management.metrics.enable.cache=false +management.endpoints.web.exposure.include=prometheus +management.endpoint.prometheus.enabled=true +management.metrics.export.prometheus.enabled=true + ####################INVITATION MAIL CONFIGURATIONS############## ####################GENERIC MAIL CONFIGURATIONS################# mail.subject=Invitation to DMP Plan {dmpname} From d1e3aae36d744d7a8b5a573c30c1989cfdc0055d Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 30 Jun 2021 12:51:12 +0300 Subject: [PATCH 016/156] Fix critical issue with dataset's copy dropdown --- .../data/query/definition/helpers/ColumnOrderings.java | 4 ++++ .../main/java/eu/eudat/elastic/criteria/DmpCriteria.java | 6 +++--- .../eu/eudat/logic/managers/DataManagementPlanManager.java | 3 +-- .../logic/mapper/elastic/criteria/DmpCriteriaMapper.java | 2 +- .../data/listingmodels/DataManagementPlanListingModel.java | 6 +++--- .../dataset-copy-dialogue.component.ts | 3 ++- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java index b01f8078d..7ab879b59 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java @@ -34,6 +34,10 @@ public class ColumnOrderings { ordering.fieldName(ordering.getFieldName().replace("|count|", "")).columnType(Ordering.ColumnType.COUNT); else if (ordering.getFieldName().contains("|join|")) ordering.fieldName(ordering.getFieldName().replace("|join|", "")).columnType(Ordering.ColumnType.JOIN_COLUMN); + else if (ordering.getFieldName().equals("asc")) + ordering.fieldName("label").orderByType(Ordering.OrderByType.ASC); + else if (ordering.getFieldName().equals("desc")) + ordering.fieldName("label").orderByType(Ordering.OrderByType.DESC); return ordering; } } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java index fb12d48aa..e354ec3cf 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DmpCriteria.java @@ -16,7 +16,7 @@ public class DmpCriteria extends Criteria { private boolean allowAllVersions; private Short grantStatus; private int offset; - private int size; + private Integer size; private List sortCriteria; @@ -116,11 +116,11 @@ public class DmpCriteria extends Criteria { this.offset = offset; } - public int getSize() { + public Integer getSize() { return size; } - public void setSize(int size) { + public void setSize(Integer size) { this.size = size; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 50782785a..ae7c63c7a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -69,8 +69,6 @@ import org.springframework.core.env.Environment; import org.springframework.core.io.FileSystemResource; import org.springframework.http.*; import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; @@ -137,6 +135,7 @@ public class DataManagementPlanManager { criteria.setOffset(dataManagementPlanTableRequest.getOffset()); criteria.setSize(dataManagementPlanTableRequest.getLength()); criteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(dataManagementPlanTableRequest.getOrderings())); + dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(criteria); if (dmps != null && !dmps.isEmpty()) { List finalDmps = dmps; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java index 810161ff2..1e7bae4b7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java @@ -48,7 +48,7 @@ public class DmpCriteriaMapper { if (columnOrderings.getFieldOrderings() != null && columnOrderings.getFieldOrderings().length > 0) { for (Ordering ordering: columnOrderings.getFieldOrderings()) { SortCriteria sortCriteria1 = new SortCriteria(); - sortCriteria1.setFieldName(ordering.getFieldName()); + sortCriteria1.setFieldName(ordering.getFieldName() + ".keyword"); sortCriteria1.setColumnType(ordering.getColumnType() != null ? SortCriteria.ColumnType.valueOf(ordering.getColumnType().name()): SortCriteria.ColumnType.COLUMN); sortCriteria1.setOrderByType(SortCriteria.OrderByType.valueOf(ordering.getOrderByType().name())); sortCriteria.add(sortCriteria1); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java index 48df2685e..ad8bcda51 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanListingModel.java @@ -32,7 +32,7 @@ public class DataManagementPlanListingModel implements DataModel datasets; - //private List associatedProfiles; +// private List associatedProfiles; private List users; private String description; // private String grantAbbreviation; @@ -187,8 +187,8 @@ public class DataManagementPlanListingModel implements DataModel new AssociatedProfile().fromData(item)).collect(Collectors.toList());*/ +// this.creationTime = entity.getCreated(); +// this.associatedProfiles = entity.getAssociatedDmps().stream().map(item -> new AssociatedProfile().fromData(item)).collect(Collectors.toList()); return this; } diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts index a5dbca945..37b53eb00 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component.ts @@ -61,7 +61,8 @@ export class DatasetCopyDialogueComponent { const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dmpDataTableRequest.criteria = new DmpCriteria(); dmpDataTableRequest.criteria.like = query; - return this.dmpService.getPaged(dmpDataTableRequest, "profiles").pipe(map(x => x.data), map(x => x.filter(y => this.existsDatasetDescriptionTemplate(y.associatedProfiles)))); + dmpDataTableRequest.criteria.datasetTemplates = [this.data.datasetProfileId]; + return this.dmpService.getPaged(dmpDataTableRequest, "profiles").pipe(map(x => x.data)); } existsDatasetDescriptionTemplate(associatedProfiles: DmpAssociatedProfileModel[]): boolean { From 57d1cf89b42b2884e9f036ae865d56c944fb861a Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 30 Jun 2021 13:01:33 +0300 Subject: [PATCH 017/156] Dataset overview fix. Actions on unlocked dataset. --- .../src/app/ui/dataset/overview/dataset-overview.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 3d5b72096..3b2494b3d 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -173,7 +173,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { setIsUserOwner() { if (this.dataset) { const principal: Principal = this.authentication.current(); - if (principal) this.isUserOwner = principal.id === this.dataset.users.find(x => x.role === Role.Owner).id; + if (principal) this.isUserOwner = !!this.dataset.users.find(x => (x.role === Role.Owner) && (principal.id === x.id)); } } From 295750684f95ebcfe22f56fb53a4589b74b23af1 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 30 Jun 2021 14:09:29 +0300 Subject: [PATCH 018/156] Minor Update --- .../ui/admin/index-managment/index-managment.component.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/admin/index-managment/index-managment.component.html b/dmp-frontend/src/app/ui/admin/index-managment/index-managment.component.html index bf8020a0d..27c0733f8 100644 --- a/dmp-frontend/src/app/ui/admin/index-managment/index-managment.component.html +++ b/dmp-frontend/src/app/ui/admin/index-managment/index-managment.component.html @@ -1,8 +1,9 @@
+
Warning: Danger zone. It might delete Dataset tags if not careful
- +
From 4e3b98f1ff6b375091fb2445b34aab8ada3f38fd Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 30 Jun 2021 17:17:17 +0300 Subject: [PATCH 019/156] Improvements over MS Word Document export --- .../managers/DataManagementPlanManager.java | 2 +- .../utilities/documents/word/WordBuilder.java | 89 ++++++++++++------- 2 files changed, 59 insertions(+), 32 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index ae7c63c7a..2ef9a576b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1257,7 +1257,7 @@ public class DataManagementPlanManager { if (versioned) { fileName += "_" + dmpEntity.getVersion(); } - fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + // fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); FileEnvelope exportEnvelope = new FileEnvelope(); exportEnvelope.setFilename(fileName + ".docx"); String uuid = UUID.randomUUID().toString(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 41675e624..764ac5a6f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -144,67 +144,89 @@ public class WordBuilder { private void createSections(List
sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService, Integer page, String sectionString) { if (createListing) this.addListing(mainDocumentPart, indent, false, true); - sections.forEach(section -> { + boolean hasValue = false; + for (Section section: sections) { + int paragraphPos = -1; String tempSectionString = sectionString != null ? sectionString + "." + (section.getOrdinal() + 1) : "" + (section.getOrdinal() + 1); if (visibilityRuleService.isElementVisible(section.getId())) { if (!createListing) { XWPFParagraph paragraph = addParagraphContent(page + "." + tempSectionString + " " + section.getTitle(), mainDocumentPart, style, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); + paragraphPos = mainDocumentPart.getPosOfParagraph(paragraph); } createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER5, 1, createListing, visibilityRuleService, page, tempSectionString); - createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService, page, tempSectionString); + hasValue = createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService, page, tempSectionString); + + if (!hasValue && paragraphPos > -1) { + mainDocumentPart.removeBodyElement(paragraphPos); + } } - }); + } } - private void createCompositeFields(List
compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService, Integer page, String section) { + private Boolean createCompositeFields(List
compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService, Integer page, String section) { if (createListing) this.addListing(mainDocumentPart, indent, true, true); - compositeFields.forEach(compositeField -> { + boolean hasValue = false; + for (FieldSet compositeField: compositeFields) { if (visibilityRuleService.isElementVisible(compositeField.getId()) && hasVisibleFields(compositeField, visibilityRuleService)) { + int paragraphPos = -1; if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) { XWPFParagraph paragraph = addParagraphContent(page + "." + section + "." + (compositeField.getOrdinal() +1) + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER6, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); + paragraphPos = mainDocumentPart.getPosOfParagraph(paragraph); } - createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); + hasValue = createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); if (compositeField.getMultiplicityItems() != null && !compositeField.getMultiplicityItems().isEmpty()) { for (FieldSet multiplicityFieldset : compositeField.getMultiplicityItems()) { - createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); + hasValue = createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); } } - if (compositeField.getHasCommentField() && compositeField.getCommentFieldValue() != null && !compositeField.getCommentFieldValue().isEmpty() && !createListing) { + if (hasValue && compositeField.getHasCommentField() && compositeField.getCommentFieldValue() != null && !compositeField.getCommentFieldValue().isEmpty() && !createListing) { XWPFParagraph paragraph = addParagraphContent("Comment: " + compositeField.getCommentFieldValue(), mainDocumentPart, ParagraphStyle.COMMENT, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } + if (!hasValue && paragraphPos > -1) { + mainDocumentPart.removeBodyElement(paragraphPos); + } } - }); + } + return hasValue; } - private void createFields(List fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { + private Boolean createFields(List fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, false, false); - fields.forEach(field -> { + boolean hasValue = false; + for (Field field: fields) { if (visibilityRuleService.isElementVisible(field.getId())) { if (!createListing) { try { XWPFParagraph paragraph = addParagraphContent(this.formatter(field), mainDocumentPart, ParagraphStyle.TEXT, numId); - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); + if (paragraph != null) { + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + hasValue = true; + } } catch (IOException e) { logger.error(e.getMessage(), e); } } } - }); + } + return hasValue; } public XWPFParagraph addParagraphContent(String text, XWPFDocument mainDocumentPart, ParagraphStyle style, BigInteger numId) { - XWPFParagraph paragraph = this.options.get(style).apply(mainDocumentPart, text); - if (numId != null) { - paragraph.setNumID(numId); + if (text != null && !text.isEmpty()) { + XWPFParagraph paragraph = this.options.get(style).apply(mainDocumentPart, text); + if (numId != null) { + paragraph.setNumID(numId); + } + return paragraph; } - return paragraph; + return null; } private void addListing(XWPFDocument document, int indent, Boolean question, Boolean hasIndication) { @@ -254,6 +276,7 @@ public class WordBuilder { mapList = Arrays.asList(mapper.readValue(field.getValue().toString(), HashMap[].class)); }catch (Exception e) { logger.warn(e.getMessage(), e); + logger.info("Moving to fallback parsing"); Map map = new HashMap<>(); map.put("label", field.getValue().toString()); mapList.add(map); @@ -304,6 +327,7 @@ public class WordBuilder { WordListData wordListData = (WordListData) field.getData(); if (wordListData.getOptions().isEmpty() && field.getValue() != null) { logger.warn("World List has no values but the field has"); + logger.info("Return value as is"); return field.getValue().toString(); } else if (field.getValue() != null){ ComboBoxData.Option selectedOption = null; @@ -332,21 +356,24 @@ public class WordBuilder { return field.getValue() != null ? field.getValue().toString(): ""; case "datasetIdentifier": case "validation": - Map identifierData; - try { - ObjectMapper mapper = new ObjectMapper(); - identifierData = mapper.readValue(field.getValue().toString(), HashMap.class); - } catch (JsonParseException ex) { - identifierData = new HashMap<>(); - String parsedData = field.getValue().toString().substring(1, field.getValue().toString().length() - 1); - StringTokenizer commaTokens = new StringTokenizer(parsedData, ", "); - while (commaTokens.hasMoreTokens()) { - String token = commaTokens.nextToken(); - StringTokenizer equalTokens = new StringTokenizer(token, "="); - identifierData.put(equalTokens.nextToken(), equalTokens.nextToken()); + if (field.getValue() != null) { + Map identifierData; + try { + ObjectMapper mapper = new ObjectMapper(); + identifierData = mapper.readValue(field.getValue().toString(), HashMap.class); + } catch (JsonParseException ex) { + identifierData = new HashMap<>(); + String parsedData = field.getValue().toString().substring(1, field.getValue().toString().length() - 1); + StringTokenizer commaTokens = new StringTokenizer(parsedData, ", "); + while (commaTokens.hasMoreTokens()) { + String token = commaTokens.nextToken(); + StringTokenizer equalTokens = new StringTokenizer(token, "="); + identifierData.put(equalTokens.nextToken(), equalTokens.nextToken()); + } } + return "id: " + identifierData.get("identifier") + ", Validation Type: " + identifierData.get("type"); } - return "id: " + identifierData.get("identifier") + ", Validation Type: " + identifierData.get("type"); + return ""; } return null; } From 244bfa5c546c9531014798d8cd931ece0b683438 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 2 Jul 2021 14:02:32 +0300 Subject: [PATCH 020/156] Fix various critical issues --- .../java/eu/eudat/elastic/repository/DmpRepository.java | 6 ++++-- .../eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- .../logic/mapper/elastic/criteria/DmpCriteriaMapper.java | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java index 124c7cc55..9121a0027 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java @@ -170,8 +170,10 @@ public class DmpRepository extends ElasticRepository { }); } - - searchSourceBuilder.query(boolQuery).from(criteria.getOffset()).size(criteria.getSize()); + searchSourceBuilder.query(boolQuery).from(criteria.getOffset()); + if (criteria.getSize() != null) { + searchSourceBuilder.size(criteria.getSize()); + } sortBuilders.forEach(searchSourceBuilder::sort); searchRequest.source(searchSourceBuilder); SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 2ef9a576b..23b39d6b0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1814,7 +1814,7 @@ public class DataManagementPlanManager { } private boolean isUserOwnerOfDmp(DMP dmp, Principal principal) { - return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId()); + return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).map(userDMP -> userDMP.getUser().getId())).collect(Collectors.toList()).contains(principal.getId()); } /* diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java index 1e7bae4b7..0fbf92ce8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java @@ -48,7 +48,7 @@ public class DmpCriteriaMapper { if (columnOrderings.getFieldOrderings() != null && columnOrderings.getFieldOrderings().length > 0) { for (Ordering ordering: columnOrderings.getFieldOrderings()) { SortCriteria sortCriteria1 = new SortCriteria(); - sortCriteria1.setFieldName(ordering.getFieldName() + ".keyword"); + sortCriteria1.setFieldName(ordering.getFieldName() + (ordering.getFieldName().contains("label") ?".keyword" : "")); sortCriteria1.setColumnType(ordering.getColumnType() != null ? SortCriteria.ColumnType.valueOf(ordering.getColumnType().name()): SortCriteria.ColumnType.COLUMN); sortCriteria1.setOrderByType(SortCriteria.OrderByType.valueOf(ordering.getOrderByType().name())); sortCriteria.add(sortCriteria1); From 3e98297da9a9245c9e45b6edd0167ee540bd9f83 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 6 Jul 2021 09:37:41 +0300 Subject: [PATCH 021/156] Pt language updates. --- .../add-researcher.component.html | 4 ++-- dmp-frontend/src/assets/i18n/de.json | 4 +++- dmp-frontend/src/assets/i18n/en.json | 4 +++- dmp-frontend/src/assets/i18n/es.json | 4 +++- dmp-frontend/src/assets/i18n/gr.json | 4 +++- dmp-frontend/src/assets/i18n/pt.json | 17 ++++++++++------- dmp-frontend/src/assets/i18n/sk.json | 4 +++- dmp-frontend/src/assets/i18n/sr.json | 4 +++- dmp-frontend/src/assets/i18n/tr.json | 4 +++- 9 files changed, 33 insertions(+), 16 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/editor/add-researcher/add-researcher.component.html b/dmp-frontend/src/app/ui/dmp/editor/add-researcher/add-researcher.component.html index 26d784fd5..1664c9541 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/add-researcher/add-researcher.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/add-researcher/add-researcher.component.html @@ -19,8 +19,8 @@
-
-
+
+
diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 8e8b7e968..de68aea86 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "You are using the DMP editor. Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating.", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index c57971ac8..b5fad029c 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "You are using the DMP editor. Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating.", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 95bdb417f..9afc8a2df 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "You are using the DMP editor. Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating.", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 8bbc59a24..fe7d9e632 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Αποθήκευση", + "CANCEL": "Ακύρωση" }, "FUNDING-INFO": { "INTRO": "You are using the DMP editor. Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating.", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 01f6c2244..ebcdb3037 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -572,8 +572,8 @@ "PUBLISHED": "Publicado", "VERSION": "Versão", "CONTAINED-DATASETS": "Contém Datasets", - "TEXT-INFO": "A informação contida no Plano de Gestão de Dados (PGD) demonstra como os Datasets foram recolhidos e/ou gerados, como foram processados e analisados, que ferramentas, normas e metodologias utilizaram, mas também fornece informação de onde e como os Datasets são alojados, publicados e preservados, incluindo quaisquer custos associados com recursos humanos dedicados a atividades de curadoria/admnistração dos dados ou custos para aquisição ou construção de serviços de gestão de dados.", - "TEXT-INFO-QUESTION": "Não tem a certeza de como um PGD é na prática? Pesquise PGD Públicos e", + "TEXT-INFO": "A informação contida no Plano de Gestão de Dados (PGD) demonstra como os dados foram recolhidos e/ou gerados, como foram processados e analisados, que ferramentas, normas e metodologias utilizaram. Fornece também informação de onde e como os dados são alojados, publicados e preservados.", + "TEXT-INFO-QUESTION": "Não tem a certeza de como um Plano de Gestão de Dados (PGD) é na prática? Pesquise “PGD Públicos” e", "LINK-ZENODO": "Comunidade LIBER no Zenodo", "GET-IDEA": "para ter uma ideia!", "SORT-BY": "Ordenar por", @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "O identificador do investigador já existe.", "ORGANISATION-IDENTIFIER-EXSTS": "O identificador da organização já existe.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "Este identificador está já a ser utilizado por um investigador incluído na lista.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "Este identificador está já a ser utilizado por uma organização incluída na lista." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "Este identificador está já a ser utilizado por uma organização incluída na lista.", + "SAVE":"Guardar", + "CANCEL": "Cancelar" }, "FUNDING-INFO": { "INTRO": "Um Plano de Gestão de Dados (PGD) permite uma maior proximidade com o local onde os seus dados são gerados, analisados e armazenados. O Argos é uma ferramenta aberta, extensível e colaborativa que disponibiliza Planos de Gestão de Dados FAIR e Abertos.", @@ -1538,7 +1540,7 @@ "DATA-MANAGEMENT-PLANS": "PLANOS DE GESTÃO DE DADOS", "PERSONAL-USAGE": "Uso Pessoal", "PUBLIC-USAGE": "Uso Público", - "DATASET-DESCRIPTIONS": "Datasets", + "DATASET-DESCRIPTIONS": "", "PUBLIC-DMPS": "PGDs Públicos", "PUBLIC-DATASETS": "Datasets Públicos", "RELATED-ORGANISATIONS": "Organizações Relacionadas", @@ -1546,8 +1548,8 @@ "ALL": "TODOS", "EMPTY-LIST": "Sem Informação", "LATEST-ACTIVITY": "Última Atividade", - "DMP-ABOUT-BEG": "A criação de um Plano de Gestão de Dados (PGD) no Argos consiste em fornecer informação-chave sobre a investigação, tal como, a sua finalidade, os seus objetivos e quais os investigadores envolvidos, como também sobre a documentação relativa aos dados de investigação", - "DMP-ABOUT-END": "que permite evidenciar os passos dados e os meios utilizados para uma gestão mais eficaz dos dados a produzir ou que já tenham sido produzidos.", + "DMP-ABOUT-BEG": "A criação de um Plano de Gestão de Dados (PGD) no Argos consiste em fornecer informação-chave sobre a investigação, tal como, a sua finalidade, os seus objetivos e quais os investigadores envolvidos, como também sobre a documentação relativa aos dados de investigação que permite evidenciar os passos dados e os meios utilizados para uma gestão mais eficaz dos dados a produzir ou que já tenham sido produzidos.", + "DMP-ABOUT-END": "", "SELECT-DMP": "Selecione um PGD para o seu Dataset", "ACTIONS": { "ADD-DATASET-DESCRIPTION": "Adicione um Dataset", @@ -1793,5 +1795,6 @@ "File format is not supported": "Ficheiro a importar deverá ser em formato .json", "You cannot Remove Datamanagement Plan with Datasets": "Não pode remover o Plano de Gestão de Dados porque contém pelo menos um modelo de dados associado", "Failed to create DOI for the Data Management Plan.": "Não foi possível criar um DOI para o Plano de Gestão de Dados", - "No entity found for query": "Não foi possível eliminar o item pretendido" + "No entity found for query": "Não foi possível eliminar o item pretendido", + "Index: 0, Size: 0" : "Ficheiro a importar deverá ser em formato .json" } \ No newline at end of file diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 93a476a3d..d336fe640 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "Plán manažmentu dát (DMP, z angl. Data Management Plan) tvoria vaše plány manažmentu dát, ktoré sú bližšie miestu, kde sú vygenerované, analyzované a uložené. Argos je otvorený, rozširovateľný, kolaboratívny nástroj, ktorý podporuje plány manažmentu otvorených dát a FAIR dát (Open and FAIR Data Management Plans).", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 5dd4d4ddd..153a8eba8 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "Plan upravljanja podacima (eng. Data Management Plan) se sastoji od Vaših planova za upravljanje podacima i sadrži informacije kako su nastali, kako su analizirani i na koji način su sačuvani podaci. Argos je otvoren kolaboracioni alat sa mogućnošću nadogradnje i koji podržava otvorene FAIR principe za upravljanje podacima.", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 24359261b..14378e788 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1046,7 +1046,9 @@ "RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.", "ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.", "IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.", - "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list." + "IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.", + "SAVE":"Save", + "CANCEL": "Cancel" }, "FUNDING-INFO": { "INTRO": "You are using the DMP editor. Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating.", From 684d784d1ac1534996a325652bea43ca36dccb2b Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 6 Jul 2021 09:46:27 +0300 Subject: [PATCH 022/156] Routing updates. * Start new dmp Button navigates you to home. * Login page redirects you to home page if user is already logged in. --- dmp-frontend/src/app/ui/auth/login/login.component.ts | 5 ++++- dmp-frontend/src/assets/splash/index.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/auth/login/login.component.ts b/dmp-frontend/src/app/ui/auth/login/login.component.ts index 4050b12c0..c001dac0c 100644 --- a/dmp-frontend/src/app/ui/auth/login/login.component.ts +++ b/dmp-frontend/src/app/ui/auth/login/login.component.ts @@ -54,10 +54,13 @@ export class LoginComponent extends BaseComponent implements OnInit, AfterViewIn private mergeLoginService: MergeLoginService, private oauth2DialogService: Oauth2DialogService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, ) { super(); } ngOnInit(): void { + if(this.authService.current()){ + this.router.navigate(['home']); + } this.matomoService.trackPageView('loginPage'); this.route.queryParams .pipe(takeUntil(this._destroyed)) diff --git a/dmp-frontend/src/assets/splash/index.html b/dmp-frontend/src/assets/splash/index.html index b776ccdb4..8b6aa48be 100644 --- a/dmp-frontend/src/assets/splash/index.html +++ b/dmp-frontend/src/assets/splash/index.html @@ -85,7 +85,7 @@ analysed and stored.

From c57e10a0332feb489d8599901cb601b9bb0d53a7 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 6 Jul 2021 10:29:14 +0300 Subject: [PATCH 023/156] Fix issue with zenodo depositions --- .../eu/eudat/logic/managers/DataManagementPlanManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 23b39d6b0..04968ac76 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1,5 +1,6 @@ package eu.eudat.logic.managers; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration; @@ -1997,7 +1998,9 @@ public class DataManagementPlanManager { } dataBuilder.append(" }\n").append("}"); createData = dataBuilder.toString(); - JsonNode createDataJSON = new ObjectMapper().readTree(createData); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); + JsonNode createDataJSON = mapper.readTree(createData); HttpEntity request = new HttpEntity<>(createDataJSON, headers); Map createResponse = null; LinkedHashMap links = null; From efe177f0b1a4d52c0e0aa6f7962e9e9915246e79 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 6 Jul 2021 12:58:38 +0300 Subject: [PATCH 024/156] Fix issues with xml import and issues with zenodo deposit --- .../main/java/eu/eudat/controllers/DMPs.java | 2 +- .../managers/DataManagementPlanManager.java | 32 ++++++++++++++---- .../models/rda/mapper/DatasetRDAMapper.java | 2 +- .../models/rda/mapper/FundingRDAMapper.java | 12 +++++-- .../models/rda/mapper/ProjectRDAMapper.java | 33 ++++++++++++------- 5 files changed, 57 insertions(+), 24 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index f7f7b907c..a929458e7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -260,7 +260,7 @@ public class DMPs extends BaseController { if (files[0].getContentType().equals(APPLICATION_JSON.toString())) { this.dataManagementPlanManager.createFromRDA(files, principal, profiles); } else if (files[0].getContentType().equals(APPLICATION_ATOM_XML.toString()) || files[0].getContentType().equals(TEXT_XML.toString())) { - this.dataManagementPlanManager.createDmpFromXml(this.getApiContext(), files, principal); + this.dataManagementPlanManager.createDmpFromXml(files, principal, profiles); } else { return ResponseEntity.badRequest().body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("File format is not supported")); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 04968ac76..14d618c79 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1476,7 +1476,7 @@ public class DataManagementPlanManager { * Data Import * */ - public List createDmpFromXml(ApiContext apiContext, MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception { + public List createDmpFromXml(MultipartFile[] files, Principal principal, String[] profiles) throws IOException, JAXBException, Exception { List dataManagementPlans = new ArrayList<>(); // Jaxb approach. JAXBContext jaxbContext; @@ -1532,16 +1532,26 @@ public class DataManagementPlanManager { projectEditor.setExistProject(project); List associatedProfiles = new LinkedList<>(); + if (profiles != null && profiles.length > 0) { + for (String profile : profiles) { + DatasetProfile exProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(profile)); + AssociatedProfile associatedProfile = new AssociatedProfile().fromData(exProfile); + associatedProfiles.add(associatedProfile); + } + } + for (AssociatedProfileImportModels a : dataManagementPlans.get(0).getProfilesImportModels()) { - AssociatedProfile associatedProfile = new AssociatedProfile(); - associatedProfile.setId(a.getId()); - associatedProfile.setLabel(a.getLabel()); - associatedProfiles.add(associatedProfile); + try { + DatasetProfile exProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(a.getId()); + AssociatedProfile associatedProfile = new AssociatedProfile().fromData(exProfile); + associatedProfiles.add(associatedProfile); + } catch (Exception ignored) { + } } List organisations = new ArrayList<>(); for (OrganisationImportModel org : dataManagementPlans.get(0).getOrganisationImportModels()) { eu.eudat.models.data.dmp.Organisation organisation = new eu.eudat.models.data.dmp.Organisation(); - organisation.setLabel(org.getOrganaisationNameImport()); + organisation.setName(org.getOrganaisationNameImport()); organisation.setReference(org.getOrganaisationReferenceImport()); organisation.setKey(organisation.getReference().split(":")[0]); organisations.add(organisation); @@ -1593,7 +1603,11 @@ public class DataManagementPlanManager { for (DatasetImportModels das: dataManagementPlans.get(0).getDatasetImportModels()) { eu.eudat.data.entities.Dataset dataset = new eu.eudat.data.entities.Dataset(); dataset.setLabel(das.getName()); - dataset.setProfile(databaseRepository.getDatasetProfileDao().find(das.getProfile())); + try { + dataset.setProfile(databaseRepository.getDatasetProfileDao().find(das.getProfile())); + } catch (Exception ignored) { + dataset.setProfile(databaseRepository.getDatasetProfileDao().find(associatedProfiles.get(0).getId())); + } dataset.setProperties(new ObjectMapper().writeValueAsString(das.getFieldImportModels())); dataset.setStatus((short) 0); dataset.setRegistries(new HashSet<>()); @@ -1972,6 +1986,9 @@ public class DataManagementPlanManager { i++; } dataBuilder.append("],\n"); + if (dmp.getGrant().getReference() == null) { + dmp.getGrant().setReference("dmp:" + dmp.getGrant().getId()); + } String grantReferenceHead = dmp.getGrant().getReference().split(":")[0]; if (grantReferenceHead.equals("openaire")) { String grantReferenceTail = dmp.getGrant().getReference().split(":")[3]; @@ -1980,6 +1997,7 @@ public class DataManagementPlanManager { dataBuilder.append(" \"grants\": [{\n"); dataBuilder.append(" \t\t\"id\": \"").append(finalId).append("\"\n}],\n"); } + dataBuilder.append(" \"creators\": [{\n"); dataBuilder.append(" \t\t\"name\": \"").append(dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName()).append("\",\n"); if (dmp.getOrganisations() != null && !dmp.getOrganisations().isEmpty()) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java index d5161094d..3473fec6c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java @@ -108,7 +108,7 @@ public class DatasetRDAMapper { for (int i = 0; i < keywordNodes.size(); i++) { rda.setAdditionalProperty("keyword" + (i + 1), keywordNodes.get(i).get("id").asText()); } - } else { + } else if (apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().exists()) { List tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString()).getTags().stream().map(Tag::getName).collect(Collectors.toList()); rda.setKeyword(tags); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/FundingRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/FundingRDAMapper.java index 8edba7ce4..cc31766f3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/FundingRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/FundingRDAMapper.java @@ -6,11 +6,13 @@ import eu.eudat.data.entities.Grant; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.rda.Funding; +import javax.transaction.Transactional; import java.util.Date; import java.util.UUID; public class FundingRDAMapper { + @Transactional public static Funding toRDA(Grant grant) { Funding rda = new Funding(); String referencePrefix; @@ -22,9 +24,13 @@ public class FundingRDAMapper { } else { rda.setFunderId(FunderIdRDAMapper.toRDA(grant.getFunder().getId())); } - referencePrefix = grant.getReference().split(":")[0]; - shortReference = grant.getReference().substring(referencePrefix.length() + 1); - rda.setGrantId(GrantIdRDAMapper.toRDA(shortReference)); + if (grant.getReference() != null) { + referencePrefix = grant.getReference().split(":")[0]; + shortReference = grant.getReference().substring(referencePrefix.length() + 1); + rda.setGrantId(GrantIdRDAMapper.toRDA(shortReference)); + } else { + rda.setGrantId(GrantIdRDAMapper.toRDA(grant.getId().toString())); + } return rda; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java index ba3f90383..0d33cda2b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/ProjectRDAMapper.java @@ -4,25 +4,34 @@ import eu.eudat.data.entities.Funder; import eu.eudat.data.entities.Grant; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.rda.Project; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.transaction.Transactional; import java.util.*; public class ProjectRDAMapper { + private final static Logger logger = LoggerFactory.getLogger(ProjectRDAMapper.class); + @Transactional public static Project toRDA(eu.eudat.data.entities.Project project, Grant grant) { Project rda = new Project(); - rda.setTitle(project.getLabel()); - rda.setDescription(project.getDescription()); - if (project.getStartdate() != null) { - rda.setStart(project.getStartdate().toString()); - } - if (project.getEnddate() != null) { - rda.setEnd(project.getEnddate().toString()); - } - rda.setFunding(Collections.singletonList(FundingRDAMapper.toRDA(grant))); - - if (rda.getTitle() == null) { - throw new IllegalArgumentException("Project Title is missing"); + try { + rda.setTitle(project.getLabel()); + rda.setDescription(project.getDescription()); + if (project.getStartdate() != null) { + rda.setStart(project.getStartdate().toString()); + } + if (project.getEnddate() != null) { + rda.setEnd(project.getEnddate().toString()); + } + rda.setFunding(Collections.singletonList(FundingRDAMapper.toRDA(grant))); + + if (rda.getTitle() == null) { + throw new IllegalArgumentException("Project Title is missing"); + } + } catch (Exception e) { + logger.error(e.getLocalizedMessage(), e); } return rda; From d5cd90814a6012cf4335c001851815a4e20e0f3d Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 6 Jul 2021 13:33:58 +0300 Subject: [PATCH 025/156] Improve error handling --- .../web/src/main/java/eu/eudat/controllers/DMPs.java | 7 +------ .../eudat/logic/managers/DataManagementPlanManager.java | 9 +++++++-- .../java/eu/eudat/models/rda/mapper/DmpRDAMapper.java | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index a929458e7..b01dc68c9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -243,7 +243,6 @@ public class DMPs extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).payload(cloneId)); } - @Transactional @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> delete(@PathVariable UUID id, Principal principal) { @@ -279,7 +278,6 @@ public class DMPs extends BaseController { } } - @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/finalize/{id}"}) public ResponseEntity> makeFinalize(@PathVariable String id, Principal principal, @RequestBody DatasetsToBeFinalized datasetsToBeFinalized) { try { @@ -291,7 +289,6 @@ public class DMPs extends BaseController { } } - @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/unfinalize/{id}"}) public ResponseEntity> undoFinalize(@PathVariable String id, Principal principal) { try { @@ -304,7 +301,6 @@ public class DMPs extends BaseController { } - @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/updateusers/{id}"}) public ResponseEntity> updateUsers(@PathVariable String id, @RequestBody List users, Principal principal) { try { @@ -320,7 +316,6 @@ public class DMPs extends BaseController { * DOI Generation * */ - @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/createZenodoDoi/{id}"}) public ResponseEntity> createZenodoDoi(@PathVariable String id, Principal principal) { try { @@ -328,7 +323,7 @@ public class DMPs extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully created DOI for Data Datamanagement Plan in question.").payload(zenodoDOI)); } catch (Exception e) { logger.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Failed to create DOI for the Data Management Plan.")); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Failed to create DOI for the Data Management Plan: " + e.getMessage())); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 14d618c79..2ab542edd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1407,7 +1407,7 @@ public class DataManagementPlanManager { return fileEnvelope; } - public ResponseEntity getRDAJsonDocument(String id, DatasetManager datasetManager, Principal principal) throws IOException { + public ResponseEntity getRDAJsonDocument(String id, DatasetManager datasetManager, Principal principal) throws Exception { eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); if (!dmp.isPublic() && dmp.getUsers().stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId())) throw new UnauthorisedException(); @@ -2091,7 +2091,12 @@ public class DataManagementPlanManager { restTemplate.put(addFileUrl, addFileMapRequest); Files.deleteIfExists(file.getFile().toPath()); - ResponseEntity jsonFile = getRDAJsonDocument(id.toString(), datasetManager, principal); + ResponseEntity jsonFile; + try { + jsonFile = getRDAJsonDocument(id.toString(), datasetManager, principal); + } catch (Exception e) { + throw e; + } UUID jsonFileUUID = UUID.randomUUID(); File tempJsonFile = new File(this.environment.getProperty("temp.temp") + jsonFileUUID.toString() + ".json"); try (FileOutputStream jsonFos = new FileOutputStream(tempJsonFile)) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 5bd15e34d..075b3796a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -36,7 +36,7 @@ public class DmpRDAMapper { } Map extraProperties; if (dmp.getExtraProperties() == null) { - throw new IllegalArgumentException("DMP is missing required Data for RDA export"); + throw new IllegalArgumentException("DMP is missing language and contact properties"); } else { extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap(); if (extraProperties.get("language") == null) { From 1c22ed2321f42e458abee462dd0740bee1ec9b7f Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 6 Jul 2021 16:33:46 +0300 Subject: [PATCH 026/156] Add extraProperties for xml export/import and restore pdf export for zenodo deposit --- .../managers/DataManagementPlanManager.java | 39 +++++++++++++++++-- .../eudat/models/data/dmp/DmpImportModel.java | 37 ++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 2ab542edd..b7f04db20 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1292,6 +1292,22 @@ public class DataManagementPlanManager { dmpName.setTextContent(dmp.getLabel()); dmpElement.appendChild(dmpName); + if (dmp.getExtraProperties() != null && !dmp.getExtraProperties().isEmpty()) { + Map extraProperties = new ObjectMapper().readValue(dmp.getExtraProperties(), HashMap.class); + Element language = xmlDoc.createElement("language"); + language.setTextContent(extraProperties.get("language") != null ? extraProperties.get("language").toString() : null); + dmpElement.appendChild(language); + Element visibility = xmlDoc.createElement("visibility"); + visibility.setTextContent(extraProperties.get("visible") != null ? extraProperties.get("visible").toString() : null); + dmpElement.appendChild(visibility); + Element publicDate = xmlDoc.createElement("publicDate"); + publicDate.setTextContent(extraProperties.get("publicDate") != null ? extraProperties.get("publicDate").toString() : null); + dmpElement.appendChild(publicDate); + Element costs = xmlDoc.createElement("costs"); + costs.setTextContent(extraProperties.get("costs") != null ? extraProperties.get("costs").toString() : null); + dmpElement.appendChild(costs); + } + DMPProfile dmpProfile = dmp.getProfile(); Element dmpProfileElement = xmlDoc.createElement("dmpProfile"); Element dmpProfileName = xmlDoc.createElement("dmpProfileName"); @@ -1580,6 +1596,21 @@ public class DataManagementPlanManager { dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property. dm.setDynamicFields(dynamicFields); // Sets dynamicFields property. dm.setDefinition(dmpProfile); + ObjectMapper mapper = new ObjectMapper(); + Map extraPropertiesMap = new HashMap<>(); + if (dataManagementPlans.get(0).getLanguage() != null) { + extraPropertiesMap.put("language", dataManagementPlans.get(0).getLanguage()); + } + if (dataManagementPlans.get(0).getVisibility() != null) { + extraPropertiesMap.put("visible", dataManagementPlans.get(0).getVisibility()); + } + if (dataManagementPlans.get(0).getPublicDate() != null) { + extraPropertiesMap.put("publicDate", dataManagementPlans.get(0).getPublicDate()); + } + if (dataManagementPlans.get(0).getCosts() != null) { + extraPropertiesMap.put("costs", mapper.readValue(dataManagementPlans.get(0).getCosts(), ArrayList.class)); + } + dm.setExtraProperties(extraPropertiesMap); //createOrUpdate(apiContext, dm, principal); DMP dmp = this.createOrUpdate(dm, principal); @@ -2081,13 +2112,13 @@ public class DataManagementPlanManager { if (unpublishedUrl == null) { // Second step, add the file to the entry. FileEnvelope file = getWordDocument(id.toString(), principal, configLoader); - /*String name = file.getFilename().substring(0, file.getFilename().length() - 5); + String name = file.getFilename().substring(0, file.getFilename().length() - 5); File pdfFile = datasetManager.convertToPDF(file, environment); - String fileName = name + ".pdf";*/ - FileSystemResource fileSystemResource = new FileSystemResource(file.getFile()); + String fileName = name + ".pdf"; + FileSystemResource fileSystemResource = new FileSystemResource(pdfFile); HttpEntity addFileMapRequest = new HttpEntity<>(fileSystemResource, null); - String addFileUrl = links.get("bucket") + "/" + file.getFilename() + "?access_token=" + zenodoToken; + String addFileUrl = links.get("bucket") + "/" + fileName + "?access_token=" + zenodoToken; restTemplate.put(addFileUrl, addFileMapRequest); Files.deleteIfExists(file.getFile().toPath()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java index 699e73fa3..231565c73 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java @@ -19,6 +19,10 @@ public class DmpImportModel { private List associatedUsersImportModels; private List dynamicFieldsImportModels; private List datasetImportModels; + private String language; + private Boolean visibility; + private String publicDate; + private String costs; @XmlElement(name = "description") public String getDescriptionImport() { @@ -113,4 +117,37 @@ public class DmpImportModel { @XmlElement(name = "dataset") public List getDatasetImportModels() { return datasetImportModels; } public void setDatasetImportModels(List datasetImportModels) { this.datasetImportModels = datasetImportModels; } + + @XmlElement(name = "language") + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + @XmlElement(name = "visibility") + public Boolean getVisibility() { + return visibility; + } + + public void setVisibility(Boolean visibility) { + this.visibility = visibility; + } + @XmlElement(name = "publicDate") + public String getPublicDate() { + return publicDate; + } + + public void setPublicDate(String publicDate) { + this.publicDate = publicDate; + } + @XmlElement(name = "costs") + public String getCosts() { + return costs; + } + + public void setCosts(String costs) { + this.costs = costs; + } } From d603fed61f724f98a2a5d978012b8a35af9d9d3c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 6 Jul 2021 16:56:37 +0300 Subject: [PATCH 027/156] When new version is made keep all it's contributors --- .../logic/managers/DataManagementPlanManager.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index b7f04db20..5a070671b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -632,6 +632,16 @@ public class DataManagementPlanManager { copyDatasets(newDmp, databaseRepository.getDatasetDao()); + databaseRepository + .getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), oldDmp.getId())) + .toList().stream().forEach(userDMP -> { + UserDMP temp = new UserDMP(); + temp.setUser(userDMP.getUser()); + temp.setRole(userDMP.getRole()); + temp.setDmp(newDmp); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(temp); + }); + newDmp.setUsers(new HashSet<>(databaseRepository.getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), newDmp.getId())).toList())); DatasetCriteria criteria1 = new DatasetCriteria(); From 6e21ad127d2a99bac89b8f73a81f1b3e4237dd92 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 7 Jul 2021 08:17:48 +0300 Subject: [PATCH 028/156] Language Pt fix --- dmp-frontend/src/app/ui/dashboard/dashboard.component.html | 2 +- dmp-frontend/src/assets/i18n/de.json | 1 + dmp-frontend/src/assets/i18n/en.json | 1 + dmp-frontend/src/assets/i18n/es.json | 1 + dmp-frontend/src/assets/i18n/gr.json | 1 + dmp-frontend/src/assets/i18n/pt.json | 3 ++- dmp-frontend/src/assets/i18n/sk.json | 1 + dmp-frontend/src/assets/i18n/sr.json | 1 + dmp-frontend/src/assets/i18n/tr.json | 1 + 9 files changed, 10 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index ed8022f1a..61b9e8242 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -13,7 +13,7 @@ {{'DASHBOARD.NEW-QUESTION' | translate}} {{'DASHBOARD.OPEN-AIR-GUIDE' | translate}} {{'DASHBOARD.LEARN-MORE' | translate}}

{{'DASHBOARD.DMP-ABOUT-BEG' | translate}} - {{'DASHBOARD.DATASET-DESCRIPTIONS' | translate}} + {{'DASHBOARD.DATASET-DESCRIPTIONS-DASHBOARD-TEXT' | translate}} {{'DASHBOARD.DMP-ABOUT-END' | translate}}

diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index de68aea86..cb8b5da50 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Personal Usage", "PUBLIC-USAGE": "Public Usage", "DATASET-DESCRIPTIONS": "Datasets", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Datasets", "PUBLIC-DMPS": "Public DMPs", "PUBLIC-DATASETS": "Public Datasets", "RELATED-ORGANISATIONS": "Related Organisations", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index b5fad029c..60e3e4bd3 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Personal Usage", "PUBLIC-USAGE": "Public Usage", "DATASET-DESCRIPTIONS": "Datasets", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Datasets", "PUBLIC-DMPS": "Public DMPs", "PUBLIC-DATASETS": "Public Datasets", "RELATED-ORGANISATIONS": "Related Organisations", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 9afc8a2df..ac861ed3a 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Uso personal", "PUBLIC-USAGE": "Public Usage", "DATASET-DESCRIPTIONS": "Descripciones de los datasets", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Descripciones de los datasets", "PUBLIC-DMPS": "Public DMPs", "PUBLIC-DATASETS": "Public Dataset Descriptions", "RELATED-ORGANISATIONS": "Organizaciones relacionadas", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index fe7d9e632..ee4741459 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Προσωπική Χρήση", "PUBLIC-USAGE": "Δημόσια Χρήση", "DATASET-DESCRIPTIONS": "Περιγραφές Συνόλου Δεδομένων", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Περιγραφές Συνόλου Δεδομένων", "PUBLIC-DMPS": "Δημόσια Σχέδια Διαχείρισης Δεδομένων", "PUBLIC-DATASETS": "Δημόσιες Περιγραφές Συνόλου Δεδομένων", "RELATED-ORGANISATIONS": "Σχετικοί Οργανισμοί", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index ebcdb3037..830471d29 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1540,7 +1540,8 @@ "DATA-MANAGEMENT-PLANS": "PLANOS DE GESTÃO DE DADOS", "PERSONAL-USAGE": "Uso Pessoal", "PUBLIC-USAGE": "Uso Público", - "DATASET-DESCRIPTIONS": "", + "DATASET-DESCRIPTIONS": "Datasets", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "", "PUBLIC-DMPS": "PGDs Públicos", "PUBLIC-DATASETS": "Datasets Públicos", "RELATED-ORGANISATIONS": "Organizações Relacionadas", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index d336fe640..3ee09b999 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Osobné použitie", "PUBLIC-USAGE": "Verejné použitie", "DATASET-DESCRIPTIONS": "Súbory dát", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Súbory dát", "PUBLIC-DMPS": "Verejné DMP", "PUBLIC-DATASETS": "Verejné súbory dát", "RELATED-ORGANISATIONS": "Ďalšie organizácie", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 153a8eba8..490455dec 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Lična upotreba", "PUBLIC-USAGE": "Javna upotreba", "DATASET-DESCRIPTIONS": "Skupovi podataka", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Skupovi podataka", "PUBLIC-DMPS": "Javno dostupni Planovi", "PUBLIC-DATASETS": "Javno dostupni skupovi podataka", "RELATED-ORGANISATIONS": "Povezane institucije", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 14378e788..6083b7189 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1541,6 +1541,7 @@ "PERSONAL-USAGE": "Kişisel Kullanım", "PUBLIC-USAGE": "Genel Kullanım", "DATASET-DESCRIPTIONS": "Veri Setleri", + "DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Veri Setleri", "PUBLIC-DMPS": "Herkese açık VYP'ler", "PUBLIC-DATASETS": "Herkese açık Veri Setleri", "RELATED-ORGANISATIONS": "Bağlantılı Kurumlar", From b8b78f665363a696312ca0399447baf67cf166b8 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 7 Jul 2021 20:39:22 +0300 Subject: [PATCH 029/156] user guide path fix (cherry picked from commit bd15b1e2c76c99c70257bedac55bcd9ee8800b34) --- .../controllers/UserGuideController.java | 7 +- user-guide/UserGuide_pt.html | 2525 +++++++++++++++++ 2 files changed, 2528 insertions(+), 4 deletions(-) create mode 100644 user-guide/UserGuide_pt.html diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java index 6cb588eef..b7b07e474 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java @@ -50,13 +50,12 @@ public class UserGuideController { } InputStream is = new FileInputStream(fileName); - String[] filepath = fileName.split("\\.")[0].split("\\\\"); - String simplename = filepath[filepath.length - 1]; + Path path = Paths.get(fileName); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentLength(is.available()); responseHeaders.setContentType(MediaType.TEXT_HTML); - responseHeaders.set("Content-Disposition", "attachment;filename=" + simplename); + responseHeaders.set("Content-Disposition", "attachment;filename=" + path.getFileName().toString()); responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); @@ -71,7 +70,7 @@ public class UserGuideController { @RequestMapping(value = "current", method = RequestMethod.POST) public @ResponseBody ResponseEntity> updateGuide(@RequestBody UserGuide guide, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws Exception { - String fileName = this.environment.getProperty("userguide.path") + guide.getName() + ".html"; + String fileName = this.environment.getProperty("userguide.path") + guide.getName(); OutputStream os = new FileOutputStream(fileName); os.write(guide.getHtml().getBytes()); os.close(); diff --git a/user-guide/UserGuide_pt.html b/user-guide/UserGuide_pt.html new file mode 100644 index 000000000..f9c00ecc7 --- /dev/null +++ b/user-guide/UserGuide_pt.html @@ -0,0 +1,2525 @@ + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+

 

+
+
    +
  1. +

    Entities & Terminology

    +
  2. +
      +
    1. +

      Key entities

      +
    2. +

       

      +

      Data Management Plan (DMP) is a collection of dataset descriptions, associated with an activity (“project” or “grant”). A DMP may be versioned, is exportable to various forms, currently machine readable (xml, json) and human readable (pdf/openxml) and can be assigned a DOI and published in Zenodo.

      +

       

      +

      Dataset in Argos describes data according to a set of rules that is the dataset template.

      +

       

      +

      Dataset Template is the set of rules that describe what Datasets contain and how they are handled. Dataset Templates are modified by Admins and contain attributes/fields, behavioral rules (e.g. toggling visibility of fields) and validation rules. Dataset Templates are linked to DMPs so that users are provided with specific formats of descriptions.

      +

       

      +

      Project is a logical entity that defines the context where one or more Data Management Plans may be formed in.

      +

       

      +

      Grant is a logical entity that defines the context where one or more Data Management Plans may be formed in.

      +

       

      +

      Users are associated to DMPs and other entities (e.g. Datasets, Organizations) for authorization and may map to researchers.

      +

       

      +

      Import - Import function supports upload of .json files that are produced according to RDA specifications for machine-actionable DMPs

      +

       

      +

      +

       

      +

      + + + + + + +
      +

      Start New DMP is an easy way to start writing a DMP. It provides an editor that goes through the essential elements of a DMP and guides the process of its creation step by step.

      +

       

      +

      From “Homepage”

      +

      +

       

      +

      From Dashboard

      +

      +

      or

      +

      +

       

      +

      From “Add Dataset”

      +

      +
      +

       

      +

       

      +

      + + + + + + +
      +

      Add Dataset is an easy way to add new datasets to pre-existing DMPs.

      +

       

      +

      From Dashboard

      +

      +

       

      +

      From “My Datasets”

      +

      +

       

      +

      From “My DMPs”

      +

      +

       

      +

      From Dataset Editor

      +

      +
      +

       

      +
    3. +

      Secondary entities

      +
    4. +

       

      +

      Repository  - an electronic database or an information system where data are stored and maintained

      +

       

      +

      Data set - a collection of data which are bind together under a specific format

      +

       

      +

      Registry - a database of entities and descriptions

      +

       

      +

      Service - a software of specific operations and tasks that interacts with other software and hardware

      +

       

      +

      Researcher - an individual practicing research

      +

       

      +

      Funding organization - an organisation that funds research programmes and/ or researchers’ activities

      +

       

      +
    +
  3. +

    Navigation

    +
  4. +
      +
    1. +

      Homepage

      +
    2. +

       

      +

      The homepage can be found under argos.openaire.eu, also accessible from  the OpenAIRE Service catalogue and the EOSC.

      +

       

      +

      +

       

      +

      About - informs about the scope and main functions of the tool (How it works, ROADMAP, FAQs, Contributors)

      +

       

      +

      Resources - provides useful information about using Argos and includes dissemination material (Media Kit, User Guide, Co-branding)

      +

       

      +

      Contact - a contact form that facilitates communication with Argos team

      +

       

      +

      Sign in - enters the tool as a user

      +
    3. +

      Login

      +
    4. +

       

      +

      Different login options are available to choose from social media to research and scholarly communication channels.

      +

      +

       

      +

      Note! No user account is required.

      +

       

      +
    5. +

      User Account Menu

      +
    6. +

       

      +

      A dedicated, customisable space of the user’s personal profile.

      +

       

      +

      + + + + + + + +
      +

      +
      +

      My profile settings -  displays the profile page which contains details such as name, email, zenodo account details etc.

      +

       

      +

      Associated DMPs - a collection of users’ DMPs

      +

       

      +

      Log out - terminates the session, and redirects to the login page.

      +
      +

       

      +

       

      +
    7. +

      Main Menu

      +
    8. +

       

      +

      The main menu is located on the left side of the screen. Depending on how users view the tool, i.e. whether they have logged in or not, the main menu changes to include features that are available only in individuals’ dashboards.

      +

       

      +

      + + + + + + + +
      +

      Main menu - not logged in

      +

       

      +

      +

       

      +

      Home  - gets you back to the homepage / dashboard

      +

       

      +

      Public DMPs - a collection of DMPs publicly available in Argos

      +

       

      +

      Public Datasets - a collection of Datasets publicly available in Argos

      +

       

      +

      Co-Branding - a page to view the software and learn how to contribute

      +

       

      +

      Support - a contact form that facilitates communication with Argos team

      +

       

      +

      Send feedback - a feedback form to contribute thoughts and opinions about using Argos

      +

       

      +

      About - informs about the scope and main functions of the tool

      +

       

      +

      Terms of Service - provides the legal status for using of ARGOS

      +

       

      +

      Glossary - includes the terminology used in the tool and explains basic components

      +

       

      +

      User Guide - a guide for users to learn how to use Argos

      +

       

      +
      +

      Main menu - logged in

      +

       

      +

      +

       

      +

      Home  - gets you back to the homepage / dashboard

      +

       

      +

      My DMPs - includes all DMPs which the user is either the owner or the collaborator of

      +

       

      +

      My Datasets - includes all Datasets which the user is either the owner or the collaborator of

      +

       

      +

      Public DMPs - a collection of DMPs publicly available in Argos

      +

       

      +

      Public Datasets - a collection of Datasets publicly available in Argos

      +

       

      +

      About - informs about the scope and main functions of the tool

      +

       

      +

      Terms of Service - provides the legal status for using of ARGOS

      +

       

      +

      Glossary - includes the terminology used in the tool and explains basic components

      +

       

      +

      User Guide - a guide for users to learn how to use Argos

      +

       

      +

      Contact support - a contact form that facilitates communication with Argos team

      +

       

      +
      +
    9. +

      Dashboard

      +
    10. +

       

      +

      Dashboard is the console that appears after entering Argos from the Homepage and includes condensed information based on Argos function and their use.

      +

       

      +

      Dashboard - Not logged in

      +

       

      +

      +

       

      +

      + + + + + + + +
      +

      +
      +

      Latest Activity - displays publicly available DMPs and Datasets according to the date of their publication in Argos and their Label (DMPs or Datasets)

      +
      +

       

      +

      + + + + + + + +
      +

      +
      +

      Public Usage - shows the number of publicly available DMPs, Datasets, Grants and Organizations included in Argos

      +

       

      +

      Note! When logged in to ARGOS the Homepage becomes a personal Dashboard, hence the numbers change to correspond to information provided by the individual’s activity.

      +
      +

       

      +

      Dashboard - Logged in

      +

       

      +

      +

       

      +

       

      +

      + + + + + + + +
      +

      +
      +

      Latest Activity - displays users’ DMPs and Datasets classified according to the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets)

      +
      +

       

      +

      + + + + + + + +
      +

      +
      +

      Personal Usage - shows users activity in DMPs, Datasets, Grants and Organizations

      +
      +

       

      +
    11. +

      My DMPs / My Datasets

      +
    12. +

       

      +

      Contains all DMPs and Datasets which the user is either the owner or the collaborator of. Both DMPs and Datasets on the user dashboard are classified by the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets).

      +

       

      +

      My DMPs

      +

      Each DMP card is green and shows the role of the person viewing the DMP, the status of the writing process, the version of the current DMP, the grant associated with the DMP, the number and name of datasets that the DMP has.

      +

       

      +

      +

       

      +

      Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

      +

       

      +

      Add Dataset - adds more Datasets to existing DMPs

      +

       

      +

      Invite - provides people with edit rights on the document

      +

       

      +

      Clone - creates an exact replica of the DMP

      +

       

      +

      + + + + + + + +
      +

      +
      +

      New version - starts a new version of the DMP

      +

      All DMP Versions  - shows the history of the different versions of the existing DMP

      +

      Delete - permanently removes DMPs

      +

       

      +
      +

       

      +

       

      +

      My Datasets

      +

      Each Dataset card is yellow and shows the role of the person viewing the Dataset, the status of the writing process, the grant associated with the DMP and the tite of the DMP that the dataset is part of.

      +

       

      +

      +

       

      +

      Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

      +

       

      +

      Invite - Sends email or searches the Argos Users Catalogue to find colleagues/ collaborators. Invitation sent provides people with edit rights on the document.

      +

       

      +

       

      +

      + + + + + + + +
      +

      +
      +

      Copy Dataset - creates a copy of the dataset

      +

      Delete - permanently removes Datasets

      +
      +
    13. +

      Public DMPs / Public Datasets

      +
    14. +

       

      +

      Contains DMPs outputs that are openly available in Argos. That means that DMP owners and members are making their DMP and/or Dataset outputs available to all Argos and non-Argos users who might want to consult or re-use them under the framework provided by the assigned DMP license.

      +

      Both DMPs and Datasets on the user dashboard are classified by the date of their last modification and their label (DMPs or Datasets). Users can also search for the DMP or Dataset from the search bar.

      +

       

      +

      Public DMPs

      +

      Each Public DMP card is green and displays the title of the DMP, its status (published), the version of the DMP, the grant associated with it, the number and name of datasets that the DMP contains.

      +

       

      +

      +

       

      +

      Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

      +

       

      +

      Clone - creates an exact replica of the DMP

      +

      + + + + + + + +
      +

      +
      +

      All DMP Versions - shows the history of the different versions of the existing DMP

      +

       

      +
      +

       

      +

       

      +

      Public Datasets

      +

      Each Public Dataset card is yellow and displays the title of the dataset, the status of the dataset (published), the grant associated with the DMP and the title of the DMP that the dataset is part of.

      +

       

      +

      +

       

      +

      Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

      +

       

      +

      + + + + + + + +
      +

      +
      +

      Copy Dataset - creates a copy of the dataset

      +
      +
    15. +

      Create DMPs

      +
    16. +

       

      +

      There are many ways to create new DMPs in Argos.

      +

       

      +

      Start new DMP - Start Wizard

      +

      +

       

      +

      There are four steps involved in creating a DMP: Main Info - Funding Info - License Info - Dataset Info

      +

       

      +

       

      +
        +
      1. Main Info
      2. +

         

        +

        +

        +

         

        +

         

        +

        Title - title of the DMP

        +

         

        +

        Description - brief description of what the DMP is about, it’s scope and objectives

        +

         

        +

        Language - the language of the DMP

        +

         

        +

        Visibility - how the DMP is displayed in Argos. By choosing Public, the DMP is automatically made available to all users from the “Public DMPs” collection.

        +

         

        +

        Researchers - the people that have produced, processed, analysed the data described in the DMP

        +

         

        +

        Organizations - the names of the organizations contributing to the creation and revision of the DMPs

        +

         

        +

        Contact - the contact details of the DMP owner

        +

         

        +

         

        +
      3. Funding Info
      4. +

         

        +

        +

         

        +

        Funding organizations - A drop-down menu where users may find the organisation that their research is funded by. In case that the name of a funding organisation can not be found in Argos, users may create a new record with the name and details of the funding organisation (“Insert it manually”).

        +

         

        +

        Grants - A drop-down menu to select the grant that is associated with the research project of the given funding organisation. In case that the grant can not be found in Argos, users may create a new record with the number and name of the grant (“Insert it manually”).

        +

         

        +

        Project - This field is to be completed only for projects where multiple grants apply. Otherwise, it is left blank and is later filled automatically by Argos metadata.

        +

         

        +

        Note!  There may be many projects associated with a grant number.

        +

         

        +

         

        +
      5. License Info
      6. +

         

        +

        +

        License - A list of licenses to choose from and assign to DMPs

        +

         

        +

         

        +
      7. Dataset Info
      8. +

         

        +

        +

         

        +

        Dataset Info - Select a template to describe your datasets. You may select more than one template.

        +

         

        +

        Save DMPs

        +

         

        +

        Discard - undo all changes made to the dataset

        +

         

        +

        Save - keeps all changes made to the DMP and continues work on the same page

        +

         

        +

        Save & Add Dataset - keeps all changes made to the DMP and the Dataset editor starts to describe the first dataset of the DMP

        + +
      +
    17. +

      Add Dataset(s)

      +
    18. +

      There are two ways to create datasets: when creating the first dataset of the DMP and when adding datasets to existing DMPs. Add datasets are linked to and are associated with at least one DMP in Argos. A dataset can not exist as an orphan record.

      +

       

      +

      First dataset

      +

      +

      Once the DMP is created, the user can fill in the description for their data in the Dataset Editor.

      +

       

      +

      Add dataset - Adds more Dataset to existing DMPs

      +

      There are three steps involved in adding a Dataset: Select a DMP for your Dataset - Select Template - Edit Dataset

      +

       

      +
        +
      1. Select a DMP for your Dataset
      2. +

        +

        Selects an existing DMP from the drop-down menu

        +

         

        +
      3. Select Template
      4. +

        +

        Selects the template of the Dataset that users are required to describe their datasets with by corresponding to their grant funding organisations.

        +

         

        +
      5. Edit Dataset
      6. +

        +

        A Dataset Editor to add information that describes management activities according to the selected template.

        +

         

        +

        Save Datasets

        +

        There are many ways to Save a DMP in Argos. They all serve the same function, but the difference lies in the follow up action.

        +

         

        +

        +

         

        +

        Discard - undo all changes made to the dataset

        +

         

        +

        Save - keeps all changes made and continues work on the same page

        +

         

        +

        Save & Close - keeps all changes made, but the editor’s window closes and the user is redirected to their dashboard

        +

         

        +

        Save & Add New - keeps all changes made and a new editor starts to describe a new dataset

        +
      +
    19. +

      DMPs/ Datasets records

      +
    20. +

      Records of DMPs and Datasets in Argos after editing and after finalization.

      +

      Users can view the DMPs and Datasets they create from their dashboard. By opening a record they have created, they are provided with additional functionalities that are binded to the completion of the DMP writing process. Different functionalities apply according to the status of the DMP, i.e. before or after the DMP finalization.

      +

       

      +

       

      +

      DMPs before finalization

      +

      +

       

      +

      Before finalization, the DMP can be further edited, deleted or cloned. Users can review information that they have added regarding grant, researchers, DMP description and datasets used. New datasets can be added at any time from this page. Users can export the DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP.

      +

       

      +

       

      +

      Invite

      +

      +

       

      +

       

      +

      DMPs after finalization

      +

      +

       

      +

      After the DMP finalization, the DMP can be made publicly visible in Argos and deposited in Zenodo. Users can export the finalized DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP. Finalization is possible to be reverted.

      +

       

      +

       

      +

      Datasets before finalization

      +

      Argos offers different options before and after the Dataset finalization.

      +

       

      +

      +

       

      +

      Before finalization, the Dataset can be further edited, deleted or cloned. Users can access the whole DMP that the dataset is part of from that page and review information that they have added regarding grant, researchers and Dataset description. Users can export the description of the dataset and invite colleagues to collaborate on its completion.

      +

       

      +

       

      +

      Datasets after finalization

      +

      +

       

      +

      After finalization, the Dataset can be exported and shared with colleagues for review.

      +

       

      +

       

      +

       

      +

       

      +

       

      +
    +
+
+
+
+
+ + + + + + From cce9df8eb7eaf9e5bf666948bfc5f5acfe34daa9 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 9 Jul 2021 13:03:09 +0300 Subject: [PATCH 030/156] Fixes * Feedback message on error saving dataset. * Unsubscribe backend calls on dashboard component destroy. --- .../src/app/ui/dashboard/drafts/drafts.component.ts | 8 ++++++-- .../recent-edited-activity.component.ts | 3 +++ .../recent-edited-dataset-activity.component.ts | 2 ++ .../recent-edited-dmp-activity.component.ts | 1 + .../recent-visited-activity.component.ts | 2 ++ .../ui/dataset/dataset-wizard/dataset-wizard.component.ts | 6 ++++++ dmp-frontend/src/assets/i18n/de.json | 4 ++++ dmp-frontend/src/assets/i18n/en.json | 4 ++++ dmp-frontend/src/assets/i18n/es.json | 4 ++++ dmp-frontend/src/assets/i18n/gr.json | 4 ++++ dmp-frontend/src/assets/i18n/pt.json | 4 ++++ dmp-frontend/src/assets/i18n/sk.json | 4 ++++ dmp-frontend/src/assets/i18n/sr.json | 4 ++++ dmp-frontend/src/assets/i18n/tr.json | 4 ++++ 14 files changed, 52 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts index ecbf545bd..95d88f121 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts @@ -78,7 +78,9 @@ export class DraftsComponent extends BaseComponent implements OnInit { const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, 5, { fields: fields }); dmpDataTableRequest.criteria = new DatasetCriteria(); dmpDataTableRequest.criteria.status = DmpStatus.Draft; - this.datasetService.getPaged(dmpDataTableRequest).subscribe(response => { + this.datasetService.getPaged(dmpDataTableRequest) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { this.datasetDrafts = response.data; this.totalCount = response.totalCount; this.totalCountDraftDatasets.emit(this.datasetDrafts.length); @@ -314,7 +316,9 @@ export class DraftsComponent extends BaseComponent implements OnInit { dmpDataTableRequest.criteria = new DatasetCriteria(); dmpDataTableRequest.criteria.status = DmpStatus.Draft; dmpDataTableRequest.criteria.like = this.formGroup.get("like").value; - this.datasetService.getPaged(dmpDataTableRequest).subscribe(response => { + this.datasetService.getPaged(dmpDataTableRequest) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { this.datasetDrafts = response.data; this.totalCount = response.totalCount; this.totalCountDraftDatasets.emit(this.datasetDrafts.length); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index 84eac2e7c..c951e6735 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -100,6 +100,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn allDataTableRequest.criteria.order = this.formGroup.get('order').value; this.dashboardService .getRecentActivity(allDataTableRequest) + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.allRecentActivities = response; this.allRecentActivities.forEach(recentActivity => { @@ -123,6 +124,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn const allDataTableRequest = this.setPublicDataTableRequest(); this.dashboardService .getRecentActivity(allDataTableRequest) + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.allRecentActivities = response; this.allRecentActivities.forEach(recentActivity => { @@ -619,6 +621,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn allDataTableRequest.criteria.order = this.formGroup.get("order").value; this.dashboardService .getRecentActivity(allDataTableRequest) + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.allRecentActivities = response; this.allRecentActivities.forEach(recentActivity => { diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts index 0955ec5c3..a9edf18ca 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts @@ -77,6 +77,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen datasetDataTableRequest.criteria.like = ""; this.datasetService .getPaged(datasetDataTableRequest) + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.datasetActivities = response.data; this.totalCount = response.totalCount; @@ -130,6 +131,7 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen } this.datasetService .getPaged(datasetDataTableRequest) + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.datasetActivities = response.data; this.totalCount = response.totalCount; diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts index e0492ccd8..013a03fdd 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts @@ -90,6 +90,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O dmpDataTableRequest.criteria.like = ""; this.dmpService .getPaged(dmpDataTableRequest, "listing") + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.dmpActivities = response.data; this.totalCount = response.totalCount; diff --git a/dmp-frontend/src/app/ui/dashboard/recent-visited-activity/recent-visited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-visited-activity/recent-visited-activity.component.ts index 6cb7c8111..3edf9340e 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-visited-activity/recent-visited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-visited-activity/recent-visited-activity.component.ts @@ -8,6 +8,7 @@ import { AuthService } from '@app/core/services/auth/auth.service'; import { DmpService } from '@app/core/services/dmp/dmp.service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { BaseComponent } from '@common/base/base.component'; +import { takeUntil } from "rxjs/operators"; @Component({ selector: "app-recent-visited-activity", @@ -38,6 +39,7 @@ export class RecentVisitedActivityComponent extends BaseComponent dmpDataTableRequest.criteria.like = ""; this.dmpService .getPaged(dmpDataTableRequest, "listing") + .pipe(takeUntil(this._destroyed)) .subscribe(response => { this.dmpActivities = response.data; }); diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index fbce489b4..0853efffb 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -854,6 +854,12 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme } onCallbackError(error: any) { + const errmes = error && error.message? error.message as string : null; + let feedbackMessage = this.language.instant('DATASET-EDITOR.ERRORS.ERROR-OCCURED'); + if(errmes){ + feedbackMessage += errmes; + } + this.uiNotificationService.snackBarNotification(feedbackMessage, SnackBarNotificationLevel.Warning); this.setErrorModel(error.error); } diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index cb8b5da50..aaf859785 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Die Versionierung ist automatisiert.", "QUESTION": "Es scheint, dass Ihre Vorlage der Datensatzbeschreibung veraltet ist. Möchten Sie sie auf die neueste Version aktualisieren?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 60e3e4bd3..58b94a5e7 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Versioning is automated.", "QUESTION": "It seems your Dataset Template is outdated. Do you want to update it to the latest version?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index ac861ed3a..ae36b9a06 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Versionado es automático.", "QUESTION": "Parece que su plantilla de descripción del dataset está desactualizada. ¿Queire actualizarla a la última versión?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index ee4741459..e83fcaf30 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Η δημιουργία νέας έκδοσης συμβαίνει αυτόματα", "QUESTION": "Το Template το Συνόλου Δεδομένων που επιλέξατε χρειάζεται επικαιροποίηση. Θα θέλατε να το ενημερώσετε στην πιο πρόσφατη έκδοσή του;" + }, + "ERRORS":{ + "ERROR-OCCURED": "Προέκυψε κάποιο σφάλμα.", + "MESSAGE": "Μήνυμα: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 830471d29..e7e7a04cc 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "O versionamento é automático.", "QUESTION": "O seu modelo de dados está desatualizado. Pretende atualizá-lo de acordo com a última versão?" + }, + "ERRORS":{ + "ERROR-OCCURED": "Um erro ocorreu.", + "MESSAGE": "Mensangem: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 3ee09b999..b46eb4250 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Verziovanie je automatizované.", "QUESTION": "Zdá sa, že Vaša šablóna súboru dát je zastaraná. Chcete ju aktualizovať na najnovšiu verziu?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 490455dec..c612c8c34 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Verzionisanje je automatsko.", "QUESTION": "Izgleda da je obrazac za skup podataka zastareo. Da li želite da koristite najnoviju verziju?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 6083b7189..78ed3739b 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1228,6 +1228,10 @@ "VERSION-DIALOG": { "ABOUT": "Sürüm Otomatiktir.", "QUESTION": "Veri Seti Şablonunuz güncel değil. Son sürüme güncellenmesini ister misiniz?" + }, + "ERRORS":{ + "ERROR-OCCURED": "An error occured.", + "MESSAGE": "Message: " } }, "DATASET-CREATE-WIZARD": { From c33ffc153b51a81d32c471a98a707238449066c1 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Tue, 13 Jul 2021 10:42:36 +0300 Subject: [PATCH 031/156] Try translate finalize errors messages on Pt. --- .../app/ui/dataset/overview/dataset-overview.component.ts | 6 +++++- dmp-frontend/src/assets/i18n/pt.json | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 3b2494b3d..9d7834dbe 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -310,7 +310,11 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { } onUpdateCallbackError(error) { - this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error); + this.uiNotificationService.snackBarNotification(error.error.message ? this.tryTranslate( error.error.message) : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error); + } + tryTranslate(errorMessage: string): string{ + return errorMessage.replace('Field value of', this.language.instant('Field value of')) + .replace('must be filled', this.language.instant('must be filled')); } public getOrcidPath(): string { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index e7e7a04cc..6f45ee0ff 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1801,5 +1801,7 @@ "You cannot Remove Datamanagement Plan with Datasets": "Não pode remover o Plano de Gestão de Dados porque contém pelo menos um modelo de dados associado", "Failed to create DOI for the Data Management Plan.": "Não foi possível criar um DOI para o Plano de Gestão de Dados", "No entity found for query": "Não foi possível eliminar o item pretendido", - "Index: 0, Size: 0" : "Ficheiro a importar deverá ser em formato .json" + "Index: 0, Size: 0" : "Ficheiro a importar deverá ser em formato .json", + "Field value of": "O campo", + "must be filled": "deve ser preenchido" } \ No newline at end of file From ee0c7df17072e9c62360566d2323bff9b5aa6839 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Thu, 15 Jul 2021 17:12:17 +0300 Subject: [PATCH 032/156] Pt translations on dataset-profiles-editor / listing --- .../editor/dataset-profile-editor.component.html | 2 +- .../listing/dataset-profile-listing.component.html | 2 +- dmp-frontend/src/assets/i18n/de.json | 6 ++++-- dmp-frontend/src/assets/i18n/en.json | 6 ++++-- dmp-frontend/src/assets/i18n/es.json | 6 ++++-- dmp-frontend/src/assets/i18n/gr.json | 6 ++++-- dmp-frontend/src/assets/i18n/pt.json | 6 ++++-- dmp-frontend/src/assets/i18n/sk.json | 6 ++++-- dmp-frontend/src/assets/i18n/sr.json | 6 ++++-- dmp-frontend/src/assets/i18n/tr.json | 6 ++++-- 10 files changed, 34 insertions(+), 18 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html index 515959dc0..1e90e19a7 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html @@ -290,7 +290,7 @@
- +
+
diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index 0853efffb..c2207d5ce 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -32,7 +32,7 @@ import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; import { Observable, of as observableOf, interval} from 'rxjs'; -import { catchError, debounceTime, map, takeUntil } from 'rxjs/operators'; +import { catchError, debounceTime, filter, map, takeUntil } from 'rxjs/operators'; import { LockService } from '@app/core/services/lock/lock.service'; import { Location } from '@angular/common'; import { LockModel } from '@app/core/model/lock/lock.model'; @@ -778,20 +778,47 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme } reverse() { - this.viewOnly = false; - this.datasetWizardModel.status = DatasetStatus.Draft; - setTimeout(x => { this.formGroup = null; }); - setTimeout(x => { - this.formGroup = this.datasetWizardModel.buildForm(); - this.registerFormListeners(); + + this.dialog.open(ConfirmationDialogComponent, { + data:{ + message: this.language.instant('DATASET-WIZARD.ACTIONS.UNDO-FINALIZATION-QUESTION'), + confirmButton: this.language.instant('DATASET-WIZARD.ACTIONS.CONFIRM'), + cancelButton: this.language.instant('DATASET-WIZARD.ACTIONS.REJECT'), + }, + maxWidth: '30em' + }) + .afterClosed() + .pipe( + filter(x=> x), + takeUntil(this._destroyed) + ).subscribe( _ => { + this.viewOnly = false; + this.datasetWizardModel.status = DatasetStatus.Draft; + setTimeout(x => { this.formGroup = null; }); + setTimeout(x => { + this.formGroup = this.datasetWizardModel.buildForm(); + this.registerFormListeners(); + }); }); + + } saveFinalize() { - this.formService.touchAllFormFields(this.formGroup); - if (!this.isFormValid()) { - this.showValidationErrorsDialog(); + // this.formService.touchAllFormFields(this.formGroup); + + if (!this.isSemiFormValid(this.formGroup) || (this.table0fContents && this.table0fContents.hasVisibleInvalidFields())) { + // this.showValidationErrorsDialog(); + this.dialog.open(FormValidationErrorsDialogComponent, { + data:{ + errorMessages:[this.language.instant('DATASET-WIZARD.MESSAGES.MISSING-FIELDS')] + } + }) + + + this.touchForm(); + this.hintErrors = true; return; } const dialogRef = this.dialog.open(ConfirmationDialogComponent, { @@ -805,9 +832,9 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result) { - if (!this.isFormValid()) { return; } + // if (!this.isFormValid()) { return; } this.formGroup.get('status').setValue(DatasetStatus.Finalized); - this.submit(); + this.submit(SaveType.finalize); } }); } @@ -819,10 +846,11 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'new', this.formGroup.get('dmp').value.id]); }) } else if (saveType === this.saveAnd.close) { this.router.navigate(['/reload']).then(() => { this.router.navigate(['/plans', 'edit', this.formGroup.get('dmp').value.id]); }); + } else if (saveType === SaveType.finalize) { + this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'edit', data.id]); }); } else { this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft; - // setTimeout(() => { this.formGroup = null; }); setTimeout(() => { this.formGroup.get('id').patchValue(data.id); diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 9d7834dbe..881c3f51b 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -12,7 +12,7 @@ import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/serv import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; import { UserService } from '@app/core/services/user/user.service'; -import { takeUntil } from 'rxjs/operators'; +import { filter, takeUntil } from 'rxjs/operators'; import { Principal } from '@app/core/model/auth/principal'; import { Role } from '@app/core/common/enum/role'; import { Location } from '@angular/common'; @@ -479,31 +479,54 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { // } finalize(dataset: DatasetOverviewModel) { - const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - restoreFocus: false, + + + this.dialog.open(ConfirmationDialogComponent, { data: { - message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'), - confirmButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.AFFIRMATIVE'), - cancelButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.NEGATIVE'), - isDeleteConfirmation: false - } - }); - dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { - if (result) { - this.datasetWizardService.getSingle(dataset.id) - .pipe(takeUntil(this._destroyed)) - .subscribe(data => { - this.datasetWizardModel = data; - this.datasetWizardModel.status = DatasetStatus.Finalized; - this.datasetWizardService.createDataset(this.datasetWizardModel) - .pipe(takeUntil(this._destroyed)) - .subscribe( - data => this.onUpdateCallbackSuccess(), - error => this.onUpdateCallbackError(error) - ); - }); - } - }); + message: this.language.instant('DATASET-OVERVIEW.FINALISE-POPUP.MESSAGE'), + confirmButton: this.language.instant('DATASET-OVERVIEW.FINALISE-POPUP.CONFIRM'), + cancelButton: this.language.instant('DATASET-OVERVIEW.FINALISE-POPUP.CANCEL'), + }, + maxWidth: '30em' + }) + .afterClosed() + .pipe( + filter(x => x), + takeUntil(this._destroyed) + ) + .subscribe( _ =>{ + this.router.navigate(['datasets','edit',dataset.id]); + }) + + + + + + // const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + // restoreFocus: false, + // data: { + // message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'), + // confirmButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.AFFIRMATIVE'), + // cancelButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.NEGATIVE'), + // isDeleteConfirmation: false + // } + // }); + // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + // if (result) { + // this.datasetWizardService.getSingle(dataset.id) + // .pipe(takeUntil(this._destroyed)) + // .subscribe(data => { + // this.datasetWizardModel = data; + // this.datasetWizardModel.status = DatasetStatus.Finalized; + // this.datasetWizardService.createDataset(this.datasetWizardModel) + // .pipe(takeUntil(this._destroyed)) + // .subscribe( + // data => this.onUpdateCallbackSuccess(), + // error => this.onUpdateCallbackError(error) + // ); + // }); + // } + // }); } hasReversableStatus(dataset: DatasetOverviewModel): boolean { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents-internal/table-of-contents-internal.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents-internal/table-of-contents-internal.ts index 5e65e1c16..9724daff3 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents-internal/table-of-contents-internal.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents-internal/table-of-contents-internal.ts @@ -142,8 +142,11 @@ export class TableOfContentsInternal implements OnInit { return entry.subEntries.some(_ => this.invalidChildsVisible(_)); } if(entry.type === this.tocEntryTypeEnum.FieldSet){ + const id = entry.form.get('id').value + if(!this.visibilityRulesService.checkElementVisibility(id)){ + return false; + } const fieldsArray = entry.form.get('fields') as FormArray; - const hasError = !fieldsArray.controls.every(field=>{//every invalid field should be invisible if(field.invalid){ const id = field.get('id').value; diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents.html index d4ca182f3..6a10aeaac 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents.html @@ -27,7 +27,7 @@
- this.internalTable.invalidChildsVisible(e)); + } + } export interface LinkToScroll { diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 14746f6df..43dcbee82 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "DOCX herunterladen", "COPY-DATASET": "Datensatzbeschreibung kopieren", "UPDATE-DATASET-PROFILE": "Vorlage aktualisieren", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "Datensatzbeschreibung ist nicht vorhanden", "DATASET-NOT-ALLOWED": "Sie haben keinen Zugriff auf diese Datensatzbeschreibung", - "SUCCESS-UPDATE-DATASET-PROFILE": "Vorlage der Datensatzbeschreibung erfolgreich aktualisiert" + "SUCCESS-UPDATE-DATASET-PROFILE": "Vorlage der Datensatzbeschreibung erfolgreich aktualisiert", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "Importieren", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index ca3101c01..6913e67da 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Download DOCX", "COPY-DATASET": "Copy Dataset", "UPDATE-DATASET-PROFILE": "Update Template", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "Dataset does not exist", "DATASET-NOT-ALLOWED": "You have no access to this Dataset", - "SUCCESS-UPDATE-DATASET-PROFILE": "Dataset Template updated successfully" + "SUCCESS-UPDATE-DATASET-PROFILE": "Dataset Template updated successfully", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "Import", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index c4a23e765..eef1d9145 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Descargar DOCX", "COPY-DATASET": "Copiar la descripción del dataset", "UPDATE-DATASET-PROFILE": "Plantilla de modificación", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "No existe la descripción del dataset", "DATASET-NOT-ALLOWED": "No tiene acceso a la descricipción de este dataset", - "SUCCESS-UPDATE-DATASET-PROFILE": "Plantilla de descripción del dataset actualizada correctamente" + "SUCCESS-UPDATE-DATASET-PROFILE": "Plantilla de descripción del dataset actualizada correctamente", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "Importar", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 0673ac5ac..bfa8afbfa 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Ληψη DOCX", "COPY-DATASET": "Αντιφραφή Περιγραφής Συνόλου Δεδομένων", "UPDATE-DATASET-PROFILE": "Ενημέρωση Template", - "VALIDATE":"Επικύρωση" + "VALIDATE":"Επικύρωση", + "UNDO-FINALIZATION-QUESTION" :"Αναίρεση Οριστικοποίησης?", + "CONFIRM" : "Ναι", + "REJECT": "Oχι" }, "MESSAGES": { "DATASET-NOT-FOUND": "Η Περιγραφή Συνόλου Δεδομένων δεν υπάρχει", "DATASET-NOT-ALLOWED": "Δεν έχετε πρόσβαση σε αυτή την Περιγραφή Συνόλου Δεδομένων", - "SUCCESS-UPDATE-DATASET-PROFILE": "Επιτυχία ενημέρωσης της Περιγραφής Συνόλου Δεδομένων" + "SUCCESS-UPDATE-DATASET-PROFILE": "Επιτυχία ενημέρωσης της Περιγραφής Συνόλου Δεδομένων", + "MISSING-FIELDS": "Υπάρχουν ορισμένα υποχρεωτικά πεδία που δεν έχουν συμπληρωθεί. Ελέγξτε τη φόρμα και βεβαιωθείτε ότι έχουν συμπληρωθεί όλα τα απαιτούμενα πεδία. (Τα πεδία που λείπουν επισημαίνονται με κόκκινο χρώμα)" }, "UPLOAD": { "UPLOAD-XML": "Εισαγωγή", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 1b9138389..de2cd7b96 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Exportar para DOCX", "COPY-DATASET": "Copiar o Dataset", "UPDATE-DATASET-PROFILE": "Atualizar o Modelo", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Desfazer a finalização??", + "CONFIRM" : "Sim", + "REJECT": "Não" }, "MESSAGES": { "DATASET-NOT-FOUND": "O Dataset não existe", "DATASET-NOT-ALLOWED": "Não tem acesso a este Dataset", - "SUCCESS-UPDATE-DATASET-PROFILE": "O Dataset foi atualizado com sucesso" + "SUCCESS-UPDATE-DATASET-PROFILE": "O Dataset foi atualizado com sucesso", + "MISSING-FIELDS": "Alguns campos obrigatórios não foram preenchidos. Por favor, verifique o formulário e certifique-se de que todos os campos obrigatórios foram preenchidos. (Os campos ausentes são marcados em vermelho)" }, "UPLOAD": { "UPLOAD-XML": "Importar", @@ -729,6 +733,11 @@ "LOCKED":{ "TITLE":"Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. You may view the dataset but you cannot make any changes. If you would like to modify it please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancelar" } }, "DMP-OVERVIEW": { diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 9611808ee..2a35ac9f0 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Stiahnuť DOCX", "COPY-DATASET": "Kopírovať súbor dát", "UPDATE-DATASET-PROFILE": "Aktualizovať šablónu", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "Súbor dát neexistuje", "DATASET-NOT-ALLOWED": "K tomuto súboru dát nemáte prístup", - "SUCCESS-UPDATE-DATASET-PROFILE": "Šablóna súboru dát bola úspešne aktualizovaná" + "SUCCESS-UPDATE-DATASET-PROFILE": "Šablóna súboru dát bola úspešne aktualizovaná", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "Importovať", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 17fa54c26..e8878736a 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "Preuzmite DOCX", "COPY-DATASET": "Kopirajte skup podataka", "UPDATE-DATASET-PROFILE": "Ažurirajte obrazac", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "Skup podataka ne postoji", "DATASET-NOT-ALLOWED": "Nemate pristup ovom skupu podataka", - "SUCCESS-UPDATE-DATASET-PROFILE": "Obrazac skupa podataka je ažuriran uspešno" + "SUCCESS-UPDATE-DATASET-PROFILE": "Obrazac skupa podataka je ažuriran uspešno", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "Uvezite", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 42b27bbde..c0e2eecfd 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -702,12 +702,16 @@ "DOWNLOAD-DOCX": "DOCX İndir", "COPY-DATASET": "Veri Seti Tanımını Kopyala", "UPDATE-DATASET-PROFILE": "Şablonu Güncelle", - "VALIDATE":"Validate" + "VALIDATE":"Validate", + "UNDO-FINALIZATION-QUESTION" :"Undo finalization?", + "CONFIRM" : "Yes", + "REJECT": "No" }, "MESSAGES": { "DATASET-NOT-FOUND": "Veri Seti mevcut değildir", "DATASET-NOT-ALLOWED": "Bu Veri Setine erişiminiz yok", - "SUCCESS-UPDATE-DATASET-PROFILE": "Veri Seti Tanımı başarılı olarak güncellendi" + "SUCCESS-UPDATE-DATASET-PROFILE": "Veri Seti Tanımı başarılı olarak güncellendi", + "MISSING-FIELDS": "There are some required fields left unfilled. Please check the form and make sure that all required fields are filled. (Missing fields are marked in red color)" }, "UPLOAD": { "UPLOAD-XML": "İçeri Aktar", @@ -770,6 +774,11 @@ "LOCKED":{ "TITLE": "Dataset is locked", "MESSAGE": "Somebody else is modifying the dataset at this moment. If you would like to modify or view it, please come back later." + }, + "FINALISE-POPUP":{ + "MESSAGE":"You will be directed to Dataset Editor where you can finalize the selected dataset. Would you like to proceed?", + "CONFIRM":"OK", + "CANCEL":"Cancel" } }, "DATASET-LISTING": { From 1b731fdf2078b19c219dfe26718f1ba2ab4d9939 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 21 Jul 2021 11:09:13 +0300 Subject: [PATCH 040/156] Changes on multi-auto complete component. * Give precedence on autocomplete option-selected over onblur. * Invitation dialog on blur commit given email till that time, on emails list. --- .../multiple-auto-complete.component.ts | 52 +++++++++++++++++-- .../dmp-invitation-dialog.component.ts | 3 +- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts index fd9854690..d209c4593 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts @@ -8,7 +8,8 @@ import { MatFormFieldControl } from '@angular/material/form-field'; import { AutoCompleteGroup } from '@app/library/auto-complete/auto-complete-group'; import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; import { BaseComponent } from '@common/base/base.component'; -import { Observable, of as observableOf, Subject } from 'rxjs'; +import { isNullOrUndefined } from '@swimlane/ngx-datatable'; +import { BehaviorSubject, combineLatest, Observable, of as observableOf, Subject, Subscription } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, mergeMap, startWith, takeUntil, switchMap } from 'rxjs/operators'; export class CustomComponentBase extends BaseComponent { @@ -50,6 +51,11 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp id = `multiple-autocomplete-${MultipleAutoCompleteComponent.nextId++}`; stateChanges = new Subject(); + + valueOnBlur = new BehaviorSubject(null); + onSelectAutoCompleteValue = new BehaviorSubject(null); + valueAssignSubscription: Subscription; + focused = false; controlType = 'multiple-autocomplete'; describedBy = ''; @@ -123,7 +129,36 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp } } - ngOnInit() { } + ngOnInit() { + this.valueAssignSubscription = combineLatest(this.valueOnBlur.asObservable(), this.onSelectAutoCompleteValue.asObservable()) + .pipe(debounceTime(100)) + .subscribe(latest =>{ + const fromBlur = latest[0]; + const fromAutoComplete = latest[1]; + + if(isNullOrUndefined(fromBlur) && isNullOrUndefined(fromAutoComplete)){ + return; + } + //higher precedence + if(!isNullOrUndefined(fromAutoComplete)){ + this.optionSelectedInternal(fromAutoComplete); + + // consumed and flush + this.onSelectAutoCompleteValue.next(null); + this.valueOnBlur.next(null); + return; + } + + if(!isNullOrUndefined(fromBlur)){ + this.optionSelectedInternal(fromBlur); + + // consumed and flush + this.onSelectAutoCompleteValue.next(null); + this.valueOnBlur.next(null); + return; + } + }); + } ngDoCheck(): void { if (this.ngControl) { @@ -178,7 +213,8 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp } _optionSelected(event: MatAutocompleteSelectedEvent) { - this.optionSelectedInternal(event.option.value); + // this.optionSelectedInternal(event.option.value); + this.onSelectAutoCompleteValue.next(event.option.value); this.autocompleteInput.nativeElement.value = ''; } @@ -235,7 +271,8 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp public onBlur($event: MouseEvent) { if (this.inputValue && this.inputValue.length > 1 && this.autocomplete.options && this.autocomplete.options.length > 0 && this.autoSelectFirstOptionOnBlur) { - this.optionSelectedInternal(this.autocomplete.options.first.value); + // this.optionSelectedInternal(this.autocomplete.options.first.value); + this.valueOnBlur.next(this.autocomplete.options.first.value); } // Clear text if not an option @@ -271,6 +308,10 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp ngOnDestroy() { this.stateChanges.complete(); this.fm.stopMonitoring(this.elRef.nativeElement); + if(this.valueAssignSubscription){ + this.valueAssignSubscription.unsubscribe(); + this.valueAssignSubscription = null; + } } //Configuration getters @@ -332,7 +373,8 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp const value = event.value; // Add our fruit if ((value || '').trim()) { - this.optionSelectedInternal(value); + // this.optionSelectedInternal(value); + this.valueOnBlur.next(value); } // Reset the input value if (input) { diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts index a57ee5cb6..d15a9dd9c 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts @@ -68,7 +68,8 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni valueAssign: (item) => { const result = typeof(item) === 'string' ? item : item.email; return result; - } + }, + autoSelectFirstOptionOnBlur: true }; add(event: MatChipInputEvent): void { From 596550d3de40e4d42d447953d05acb145607f3a4 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 21 Jul 2021 11:17:32 +0300 Subject: [PATCH 041/156] Extend user token duration to 10 days --- .../authentication/AbstractAuthenticationService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java index e9f347342..2983bfa1d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java @@ -100,7 +100,7 @@ public abstract class AbstractAuthenticationService implements AuthenticationSer UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) .issuedAt(new Date()).user(credential.getUserInfo()) - .token(UUID.randomUUID()).expiresAt(Timestamp.valueOf(LocalDateTime.now().plusDays(1))) + .token(UUID.randomUUID()).expiresAt(Timestamp.valueOf(LocalDateTime.now().plusDays(10))) .build(); userToken = apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); @@ -200,7 +200,7 @@ public abstract class AbstractAuthenticationService implements AuthenticationSer UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) .token(UUID.randomUUID()).user(userInfo) - .expiresAt(Timestamp.valueOf(LocalDateTime.now().plusDays(1))).issuedAt(new Date()) + .expiresAt(Timestamp.valueOf(LocalDateTime.now().plusDays(10))).issuedAt(new Date()) .build(); apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); From a212f4e5a1543a613a8dff79336ad1a891d39792 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 21 Jul 2021 12:16:22 +0300 Subject: [PATCH 042/156] Subtle border on invalid emails inputs (in invitation dialog) * Mutli auto compolete component extended --- .../multiple-auto-complete-configuration.ts | 2 ++ .../multiple-auto-complete.component.html | 2 +- .../multiple-auto-complete.component.ts | 18 ++++++++++++++++++ .../dmp-invitation-dialog.component.scss | 12 ++++++++++++ .../dmp-invitation-dialog.component.ts | 8 +++++++- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete-configuration.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete-configuration.ts index 32b99b46c..6c88bba4a 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete-configuration.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete-configuration.ts @@ -36,4 +36,6 @@ export interface MultipleAutoCompleteConfiguration { autoSelectFirstOptionOnBlur?: boolean; + appendClassToItem?: {class: string, applyFunc: (item:any) => boolean}[]; + } diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html index 3c89cd3ff..63ed19aec 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html @@ -1,7 +1,7 @@
- +
{{_displayFn(selectedItem)}}
diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts index d209c4593..4cdb40be1 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts @@ -365,6 +365,9 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp get popupItemActionIcon(): string { return this.configuration.popupItemActionIcon != null ? this.configuration.popupItemActionIcon : ''; } + get appendClassToItem(): {class: string, applyFunc: (item: any) => boolean}[]{ + return this.configuration.appendClassToItem !== null ? this.configuration.appendClassToItem : null; + } //Chip Functions _addItem(event: MatChipInputEvent): void { @@ -400,4 +403,19 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp if (event != null) { event.stopPropagation(); } this.optionActionClicked.emit(item); } + + + private readonly empyObj = {}; + computeClass(value: any){ + if(!(this.appendClassToItem && this.appendClassToItem.length)){ + return this.empyObj; + } + + const classes = this.appendClassToItem.filter(e=> e.applyFunc(value)); + return classes.reduce((r, current) => { + r[current.class] = true; + return r; + } , {}); + + } } diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.scss b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.scss index 4919dc0e8..650d75379 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.scss +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.scss @@ -121,3 +121,15 @@ background: #129d99; color: #ffffff; } + +@keyframes blink{ + 0% {border: 1px solid rgba(255, 0, 0, 0.2);} + 50% {border: 1px solid rgba(255, 0, 0, 0.5);} + 100% {border: 1px solid rgba(255, 0, 0, 0.2);} +} + +:host ::ng-deep .invalid-email{ + border: 1px solid red; + // animation: blink 1.4s infinite; + // animation-fill-mode: both; +} diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts index d15a9dd9c..0e9299f0e 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation-dialog.component.ts @@ -69,7 +69,13 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni const result = typeof(item) === 'string' ? item : item.email; return result; }, - autoSelectFirstOptionOnBlur: true + autoSelectFirstOptionOnBlur: true, + appendClassToItem: [{class: 'invalid-email', applyFunc: (item)=> { + const val = typeof(item) === 'string'? item : item.email; + const regexp = new RegExp(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/); + return !regexp.test(val); + } + }] }; add(event: MatChipInputEvent): void { From 008b6321ea9a828175238532b87a2366e97b7fc2 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 21 Jul 2021 12:25:13 +0300 Subject: [PATCH 043/156] Error dialog component on dataset wizard (update) * On single error case, show it indepentently (not as list item) --- .../form-validation-errors-dialog.component.html | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dmp-frontend/src/common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component.html b/dmp-frontend/src/common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component.html index 465324b54..e36977ed5 100644 --- a/dmp-frontend/src/common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component.html +++ b/dmp-frontend/src/common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component.html @@ -5,9 +5,14 @@
-
    -
  • {{error}}
  • -
+ +
    +
  • {{error}}
  • +
+
+ + {{errorMessages[0]}} +
From 1d397d28cf2bab75904b12ae311f17bbf3eebf04 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 21 Jul 2021 16:41:38 +0300 Subject: [PATCH 044/156] Add ability to scroll on table of contents (dataset templates admin) --- .../dataset-profile-editor.component.html | 2 +- .../table-of-contents/table-of-contents.html | 15 ++++-- .../table-of-contents/table-of-contents.scss | 32 +++++++++++- .../table-of-contents/table-of-contents.ts | 51 +++++++++++++++++-- 4 files changed, 92 insertions(+), 8 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html index 1e90e19a7..f3d90a719 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html @@ -247,7 +247,7 @@
-
+
-

{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TEMPLATE-OUTLINE' | translate}}

+
+

{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TEMPLATE-OUTLINE' | translate}}

- +
+
+ keyboard_arrow_up +
+
+
+
+ keyboard_arrow_down +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss index ebd142270..dc1e64f35 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss @@ -1,10 +1,12 @@ - +$scroller-height: 3em; .scroll-container { // overflow-y: auto; max-height: 60vh; overflow-y: scroll; padding-left: .2em; padding-right: 1em; + // padding-top: $scroller-height; + // padding-bottom: $scroller-height; } // #style-6::-webkit-scrollbar-track @@ -59,4 +61,32 @@ opacity: 0.6; font-size: 1.6em; margin-top: 0px; +} + +.table-container{ + position: relative; +} +.table-scroller{ + // background-color: #5cf7f221; + position: absolute; + width: 95%; + height: $scroller-height; + display: flex; + align-items: center; + justify-content: center; + // z-index: -9999; +} +.top-scroller{ + top: 1px; + background: rgb(255,255,255); + background: linear-gradient(0deg, rgba(255,255,255,0) 0%, rgba(92,247,242,0.4542191876750701) 100%); +} +.bottom-scroller{ + bottom: 1px; + background: rgb(255,255,255); + background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(92,247,242,0.4542191876750701) 100%); +} + +.opacity-0{ + opacity: 0 !important; } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.ts index 69717e782..685742eff 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.ts @@ -1,8 +1,8 @@ import { DOCUMENT } from '@angular/common'; -import { Component, EventEmitter, Inject, OnInit, Output, Input } from '@angular/core'; +import { Component, EventEmitter, Inject, OnInit, Output, Input, AfterViewInit } from '@angular/core'; import { BaseComponent } from '@common/base/base.component'; import { interval, Subject, Subscription } from 'rxjs'; -import { distinctUntilChanged } from 'rxjs/operators'; +import { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators'; import { type } from 'os'; import { SimpleChanges } from '@angular/core'; import { NewEntryType, TableUpdateInfo, ToCEntry, ToCEntryType } from './table-of-contents-entry'; @@ -18,7 +18,7 @@ import { ContentObserver } from '@angular/cdk/observers'; styleUrls: ['./table-of-contents.scss'], templateUrl: './table-of-contents.html' }) -export class DatasetProfileTableOfContents extends BaseComponent implements OnInit { +export class DatasetProfileTableOfContents extends BaseComponent implements OnInit, AfterViewInit { @Input() links: ToCEntry[]; @Input() itemSelected: ToCEntry; @@ -42,6 +42,11 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn private VALID_DROP_TIME = 500;//ms overcontainer: string = null; + $clock = interval(10); + scrollTableTop = false; + scrollTableBottom = false; + pxToScroll = 15; + constructor( @Inject(DOCUMENT) private _document: Document, private dragulaService: DragulaService, @@ -449,6 +454,46 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn + } + ngAfterViewInit(): void { + + const top = document.querySelector('.top-scroller'); + const bottom = document.querySelector('.bottom-scroller'); + const tableDiv = document.querySelector('#tocentrytable'); + + try { + top.addEventListener('mouseover', (e) => {this.scrollTableTop = true; }); + bottom.addEventListener('mouseover', (e) => {this.scrollTableBottom = true; }); + + top.addEventListener('mouseout', (e) => {this.scrollTableTop = false}); + bottom.addEventListener('mouseout', (e) => {this.scrollTableBottom = false;}); + + + this.$clock + .pipe( + takeUntil(this._destroyed), + filter(() => this.scrollTableTop) + ) + .subscribe(()=>{ + try{ + tableDiv.scrollBy(0, -this.pxToScroll); + } catch {} + }); + this.$clock + .pipe( + takeUntil(this._destroyed), + filter(() => this.scrollTableBottom) + ) + .subscribe(()=>{ + try{ + tableDiv.scrollBy(0, this.pxToScroll); + } catch {} + }); + } catch { + console.log('could not find scrolling elements'); + } + + } private _scrollIntoDragginItem(id: string){ From 4c22799f913b5f2886b04b28b51d63e3dcb36753 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 23 Jul 2021 11:23:35 +0300 Subject: [PATCH 045/156] Bug fixes on dataset templates editor Admin (partial) * Make use of observables instead of setTimeouts * Remove not nessecary calculations --- ...file-editor-composite-field.component.html | 171 +++++++++--------- ...rofile-editor-composite-field.component.ts | 55 +++++- ...ataset-profile-editor-field.component.html | 11 +- .../dataset-profile-editor-field.component.ts | 3 + .../dataset-profile-editor-rule.component.ts | 19 +- ...ile-editor-section-fieldset.component.html | 5 +- ...ofile-editor-section-fieldset.component.ts | 114 +++++++----- .../dataset-profile-editor.component.html | 2 +- .../table-of-contents/table-of-contents.ts | 20 +- 9 files changed, 236 insertions(+), 164 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html index 2f205b4ef..4c63edc38 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html @@ -76,46 +76,40 @@
-
- - - - -
- - - -
-
- - - -
-
- - - -
- -
- - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - -
-
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + +
@@ -123,59 +117,56 @@
-
+
-
- -
- - - - - - - - -
-
-
- + + + + + + + +
+
+ + - -
+ +
+ +
+ +
+
+ +
+
-->
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts index 4e3762bec..2e3480803 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts @@ -21,8 +21,9 @@ import { AutoCompleteFieldData, BooleanDecisionFieldData, CheckBoxFieldData, Cur import { CompositeField } from '@app/core/model/dataset-profile-definition/composite-field'; import {Field as FieldDefinition} from '@app/core/model/dataset-profile-definition/field'; import { Subject } from 'rxjs'; -import { debounceTime } from 'rxjs/operators'; +import { debounceTime, delay, map, takeUntil, tap } from 'rxjs/operators'; import { GENERAL_ANIMATIONS } from '../../animations/animations'; +import { BaseComponent } from '@common/base/base.component'; @Component({ selector: 'app-dataset-profile-editor-composite-field-component', @@ -30,7 +31,7 @@ import { GENERAL_ANIMATIONS } from '../../animations/animations'; styleUrls: ['./dataset-profile-editor-composite-field.component.scss'], animations:[GENERAL_ANIMATIONS] }) -export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnChanges { +export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent implements OnInit, OnChanges { @Input() form: FormGroup; @Input() indexPath: string; @@ -61,7 +62,9 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh private language: TranslateService, public enumUtils: EnumUtils, public datasetProfileService: DatasetProfileService - ) { } + ) { + super(); + } ngOnChanges(){ // this.setTargetField(null); @@ -112,16 +115,52 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh this.showExtendedDescription = !!this.form.get('extendedDescription').value; this.showAdditionalInfo = !!this.form.get('additionalInformation').value; - this.form.valueChanges.subscribe(changes=>{ + this.form.valueChanges.pipe(takeUntil(this._destroyed)).subscribe(changes=>{ // this.previewForm = null; this.previewDirty = true; this.generatePreviewForm(); }); - this.previewSubject$.pipe(debounceTime(600)).subscribe(model=>{ - const updatedForm = model.buildForm(); - this.reloadPreview(updatedForm) - }) + this.previewSubject$ + .pipe(debounceTime(600)) + .pipe( + takeUntil(this._destroyed), + map(model => model.buildForm()), + map(updatedForm =>{ + const previewContainer = document.getElementById('preview_container'+ this.form.get('id').value); + // let clientHeight = -1; + if(previewContainer){ + // console.log(previewContainer); + const clientHeight = previewContainer.clientHeight; + // console.log(clientHeight); + + if(clientHeight){ + previewContainer.style.height = clientHeight.toString() + 'px'; + + // console.log('height:' ,previewContainer.style.height); + } + } + this.showPreview = false; + this.previewDirty = true; + this.previewForm = updatedForm; + return previewContainer; + }), + delay(100), + tap( previewContainer =>{ + this.showPreview = true; + this.previewDirty = false; + }), + delay(100) + ) + .subscribe(previewContainer=>{ + + if(previewContainer){ + previewContainer.style.height = 'auto'; + } + + // const updatedForm = model.buildForm(); + // this.reloadPreview(updatedForm) + }); this.generatePreviewForm(); diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html index 0e73c87e1..610d39d31 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html @@ -15,12 +15,10 @@
  • delete
  • -
    - - +
    - + -
    +
    - {{'DATASET-PROFILE-EDITOR.ACTIONS.FIELD.PREVIEW' | translate}} + {{'DATASET-PROFILE-EDITOR.ACTIONS.FIELD.PREVIEW' | translate}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.STATUS.PREVIEW-UPDATED' | translate}} @@ -184,7 +184,7 @@
    -
    +
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss index bae52298c..9b73377a3 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss @@ -129,6 +129,11 @@ $blue-color-light: #5cf7f2; padding-bottom: 0px; } +.previewer-text{ + font-weight: bold; + font-style: italic; +} + // ::ng-deep .underline-line-field .mat-form-field-appearance-legacy .mat-form-field-wapper{ // padding-bottom: 1.25em !important; // } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.html index 4f8382bc4..38426a3d6 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.html @@ -1,5 +1,5 @@ 
    -
    +
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.ts index 8fc445bec..0fd24684a 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-section-fieldset.component.ts @@ -9,11 +9,13 @@ import { debounceTime, delay, tap } from 'rxjs/operators'; import { FieldEditorModel } from '../../../admin/field-editor-model'; import { FieldSetEditorModel } from '../../../admin/field-set-editor-model'; import { ToCEntry, ToCEntryType } from '../../../table-of-contents/table-of-contents-entry'; +import { GENERAL_ANIMATIONS } from '../../animations/animations'; @Component({ selector: 'app-dataset-profile-editor-section-fieldset-component', templateUrl: './dataset-profile-editor-section-fieldset.component.html', - styleUrls: ['./dataset-profile-editor-section-fieldset.component.scss'] + styleUrls: ['./dataset-profile-editor-section-fieldset.component.scss'], + animations:[GENERAL_ANIMATIONS] }) export class DatasetProfileEditorSectionFieldSetComponent implements OnInit, OnChanges, OnDestroy { @@ -144,7 +146,8 @@ export class DatasetProfileEditorSectionFieldSetComponent implements OnInit, OnC this.numbering = this.tocentry.numbering; this._selectedFieldSetId = null; - this.scroller.next(null); + // this.scroller.next(null); + this._scrollOnTop(true); }else if(this.tocentry.type === ToCEntryType.FieldSet){ this.form = this.tocentry.form.parent.parent; const numberingArray = this.tocentry.numbering.split('.'); @@ -170,10 +173,14 @@ export class DatasetProfileEditorSectionFieldSetComponent implements OnInit, OnC el.scrollIntoView({behavior: "smooth", block:'start'}); } } - private _scrollOnTop(){ + private _scrollOnTop(instant?: boolean){ const el = this.myElement.nativeElement.querySelector('#topofcontainer'); if(el){ - el.scrollIntoView({behavior:'smooth', block:'end'}); + if(instant){ + el.scrollIntoView({ block:'end'}); + }else{ + el.scrollIntoView({behavior:'smooth', block:'end'}); + } } } ngOnInit() { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html index f752d8b63..efba00df8 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.html @@ -276,7 +276,7 @@
    -
    +
    @@ -388,11 +388,10 @@ - +
    @@ -411,7 +410,6 @@ translate}}
    -
    @@ -424,7 +422,6 @@ translate}}
    -
    - + -->
    - -
    - - + +
    + +
    -
    +
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.scss index 176d82dd0..eb455bc3a 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.scss @@ -346,7 +346,7 @@ $blue-color-light: #5cf7f2; background: #f4f4f4; position: sticky; top: 0.01em; - z-index: 99; + z-index: 9999; } #title-column{ @@ -354,3 +354,9 @@ $blue-color-light: #5cf7f2; align-items: baseline; padding-right: 15px; } +.side-actions{ + display: flex; + height: 40vh; + position: sticky; + top: 2em; +} \ No newline at end of file From 06961c0254872d80a83290cc9f81eec627a0ada3 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 23 Jul 2021 17:03:29 +0300 Subject: [PATCH 050/156] Deactivate Guard on dataset template editor --- .../app/library/deactivate/can-deactivate.guard.ts | 2 +- .../dataset-profile/dataset-profile.routing.ts | 13 +++++++++---- .../editor/animations/animations.ts | 2 +- ...set-profile-editor-composite-field.component.ts | 3 ++- .../dataset-profile-editor-field.component.ts | 2 +- .../rule/dataset-profile-editor-rule.component.ts | 1 + .../editor/dataset-profile-editor.component.ts | 14 ++++++++++++-- .../confirmation-dialog.component.html | 8 ++++---- .../confirmation-dialog.component.scss | 3 ++- 9 files changed, 33 insertions(+), 15 deletions(-) diff --git a/dmp-frontend/src/app/library/deactivate/can-deactivate.guard.ts b/dmp-frontend/src/app/library/deactivate/can-deactivate.guard.ts index 75d89ac2d..8e6df7ff9 100644 --- a/dmp-frontend/src/app/library/deactivate/can-deactivate.guard.ts +++ b/dmp-frontend/src/app/library/deactivate/can-deactivate.guard.ts @@ -30,7 +30,7 @@ export class CanDeactivateGuard extends BaseComponent implements CanDeactivate x ? true : false)); diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.routing.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.routing.ts index 4fb6f9404..1bf042f25 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.routing.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.routing.ts @@ -5,6 +5,7 @@ import { DatasetProfileListingComponent } from './listing/dataset-profile-listin import { AdminAuthGuard } from '@app/core/admin-auth-guard.service'; import { AppRole } from '@app/core/common/enum/app-role'; import { SpecialAuthGuard } from '@app/core/special-auth-guard.service'; +import { CanDeactivateGuard } from '@app/library/deactivate/can-deactivate.guard'; const routes: Routes = [ { @@ -16,7 +17,8 @@ const routes: Routes = [ permissions: [AppRole.Admin, AppRole.DatasetTemplateEditor] } }, - canActivate: [SpecialAuthGuard] + canActivate: [SpecialAuthGuard], + canDeactivate:[CanDeactivateGuard] }, { path: ':id', @@ -27,7 +29,8 @@ const routes: Routes = [ permissions: [AppRole.Admin, AppRole.DatasetTemplateEditor] } }, - canActivate: [SpecialAuthGuard] + canActivate: [SpecialAuthGuard], + canDeactivate:[CanDeactivateGuard] }, { path: 'clone/:cloneid', @@ -38,7 +41,8 @@ const routes: Routes = [ permissions: [AppRole.Admin, AppRole.DatasetTemplateEditor] } }, - canActivate: [SpecialAuthGuard] + canActivate: [SpecialAuthGuard], + canDeactivate:[CanDeactivateGuard] }, { path: 'newversion/:newversionid', @@ -49,7 +53,8 @@ const routes: Routes = [ permissions: [AppRole.Admin, AppRole.DatasetTemplateEditor] } }, - canActivate: [SpecialAuthGuard] + canActivate: [SpecialAuthGuard], + canDeactivate:[CanDeactivateGuard] }, { path: 'versions/:groupId', diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/animations/animations.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/animations/animations.ts index 4542d8b4a..5b4cd484a 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/animations/animations.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/animations/animations.ts @@ -83,7 +83,7 @@ export const GENERAL_ANIMATIONS = [ transition(":enter", [style({opacity:0}), animate('1000ms 800ms ease', style({'opacity':1}))]), ]), trigger('fade-in-fast',[ - transition(":enter", [style({opacity:0}), animate('1000ms 200ms ease', style({'opacity':1}))]), + transition(":enter", [style({opacity:0}), animate('800ms 100ms ease', style({'opacity':1}))]), ]), diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts index 2e3480803..d6ac1fcfe 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts @@ -364,7 +364,8 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i fieldsForm.controls.forEach((field, idx)=>{ field.get('ordinal').setValue(idx); field.updateValueAndValidity(); - }) + }); + this.form.markAsDirty();//deactivate guard } getFieldTile(formGroup: FormGroup, index: number) { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts index 73746d533..5d3ae69d5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts @@ -794,7 +794,7 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required)); validationsControl.updateValueAndValidity(); } - + this.form.markAsDirty();//deactivate guard } get isRequired(){ diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.ts index cd8f546b8..150d58c69 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.ts @@ -42,6 +42,7 @@ export class DatasetProfileEditorRuleComponent implements OnInit { deleteRule(index) { this.form.removeAt(index); + this.form.markAsDirty();//deactivate guard } ngOnInit(): void { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index 60b689d58..456e5fabd 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -44,6 +44,7 @@ import { GENERAL_ANIMATIONS, STEPPER_ANIMATIONS } from './animations/animations' import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profile-combo-box-type'; import { UserService } from '@app/core/services/user/user.service'; import { MatInput } from '@angular/material'; +import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -55,7 +56,10 @@ const skipDisable: any[] = require('../../../../../assets/resources/skipDisable. animations:[...STEPPER_ANIMATIONS, ...GENERAL_ANIMATIONS], providers:[VisibilityRulesService] }) -export class DatasetProfileEditorComponent extends BaseComponent implements OnInit { +export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent implements OnInit { + canDeactivate(): boolean { + return !this.form.dirty; + } isNew = true; isNewVersion = false; @@ -425,6 +429,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn this.datasetProfileService.updateForm(this.datasetProfileId, data) .pipe(takeUntil(this._destroyed)) .subscribe(() => { + this.form.markAsPristine();//deactivate guard this.router.navigate(['/dataset-profiles']); this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-PROFILE-EDITOR.FEEDBACK-MESSAGES.SAVE-SUCCESS'), SnackBarNotificationLevel.Success); },error=> this.onCallbackError(error)); @@ -434,6 +439,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn this.datasetProfileService.newVersion(this.newVersionId, data) .pipe(takeUntil(this._destroyed)) .subscribe(() => { + this.form.markAsPristine();//deactivate guard this.router.navigate(['/dataset-profiles']); this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-PROFILE-EDITOR.FEEDBACK-MESSAGES.SAVE-SUCCESS'), SnackBarNotificationLevel.Success); }, @@ -447,6 +453,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn this.datasetProfileService.createForm(data) .pipe(takeUntil(this._destroyed)) .subscribe(() => { + this.form.markAsPristine();//deactivate guard this.router.navigate(['/dataset-profiles']); this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-PROFILE-EDITOR.FEEDBACK-MESSAGES.SAVE-SUCCESS'), SnackBarNotificationLevel.Success); }, error=> this.onCallbackError(error)); @@ -1183,7 +1190,8 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn //in case selectedtocentrhy is child of the removed element - this.refreshToCEntries(); + // this.refreshToCEntries(); + this.onDataNeedsRefresh(); this.form.updateValueAndValidity(); } @@ -1572,6 +1580,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn this.displayItem(this._findTocEntryById(params.draggedItemId, tocentries)); } } + this.form.markAsDirty(); } cloneFieldSet(fieldset: FormGroup){ @@ -1944,6 +1953,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn email.value = ''; this.userFormDisabled = false; + this.form.markAsDirty(); // email.focus(); // this.inputUserState = 'triggered'; diff --git a/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.html b/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.html index 258eb7cda..199b9ed9b 100644 --- a/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.html +++ b/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.html @@ -1,14 +1,14 @@
    -
    -
    +
    +
    {{ data.icon }}
    -
    {{ data.warning }}
    +
    {{ data.warning }}
    close
    -
    +
    close
    diff --git a/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.scss b/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.scss index 5bd8b98b0..804e34258 100644 --- a/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.scss +++ b/dmp-frontend/src/common/modules/confirmation-dialog/confirmation-dialog.component.scss @@ -14,7 +14,8 @@ } .warn-text { - color: #f44336; + // color: #f44336; + } .cancel { From a7abe6c2d89c827f44cdfce1ebfcc909091afbb0 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 23 Jul 2021 17:09:12 +0300 Subject: [PATCH 051/156] minor fix --- .../dataset-profile/editor/dataset-profile-editor.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index 456e5fabd..951c168ad 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -2039,6 +2039,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent removeUser(user: any) { this.userChipList.splice(this.userChipList.indexOf(user), 1); this.form.patchValue({'users': this.userChipList}); + this.form.markAsDirty();//deactivate guard } From 9da0f4e77602a5b183087344b03428dfc025879b Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 23 Jul 2021 18:27:49 +0300 Subject: [PATCH 052/156] Allow to re insert users on Dataset profile --- .../java/eu/eudat/logic/managers/DatasetProfileManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 56e97cfb4..bfe0ede59 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -289,6 +289,10 @@ public class DatasetProfileManager { userDatasetProfile1.setRole(1); apiContext.getOperationsContext().getDatabaseRepository().getUserDatasetProfileDao().createOrUpdate(userDatasetProfile1); }); + entity.getUsers().stream().filter(userDatasetProfile -> model.getUsers().stream().filter(userInfoListingModel -> userDatasetProfile.getUser().getId().equals(userInfoListingModel.getId())).count() > 0 && userDatasetProfile.getRole() == 2).forEach(userDatasetProfile -> { + userDatasetProfile.setRole(1); + apiContext.getOperationsContext().getDatabaseRepository().getUserDatasetProfileDao().createOrUpdate(userDatasetProfile); + }); } if (entity.getUsers() != null && !entity.getUsers().isEmpty()) { entity.getUsers().stream().filter(userDatasetProfile -> model.getUsers().stream().filter(userInfoListingModel -> userDatasetProfile.getUser().getId().equals(userInfoListingModel.getId())).count() == 0).forEach(userDatasetProfile -> { From 6a2099c2b9d75c410270acad66b16e83cbcd51eb Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 26 Jul 2021 10:28:58 +0300 Subject: [PATCH 053/156] Add user role check up when it's getting dataset profiles for the manager listing --- .../java/eu/eudat/logic/managers/DatasetProfileManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index bfe0ede59..244287173 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -102,7 +102,8 @@ public class DatasetProfileManager { if (principal.getAuthz().contains(Authorities.ADMIN)) { authItems = items; } else if (principal.getAuthz().contains(Authorities.DATASET_PROFILE_MANAGER)) { - authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getAuthenticated(items, principal.getId(), null); + List roles = Collections.singletonList(1); + authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getAuthenticated(items, principal.getId(), roles); } QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetProfileTableRequestItem); List datasetProfiles = pagedItems.select(item -> new DatasetProfileListingModel().fromDataModel(item)); From e185e9468424a54f34880837161e6ef3289d1277 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Fri, 30 Jul 2021 11:15:54 +0300 Subject: [PATCH 054/156] pt userguide update --- user-guide/UserGuide_pt.html | 1098 +++++++++++++++++----------------- 1 file changed, 541 insertions(+), 557 deletions(-) diff --git a/user-guide/UserGuide_pt.html b/user-guide/UserGuide_pt.html index f9c00ecc7..d6f1fba6d 100644 --- a/user-guide/UserGuide_pt.html +++ b/user-guide/UserGuide_pt.html @@ -1950,562 +1950,546 @@ -
    -
    -
    - -
    -
    -
    -
    -

     

    -
    -
      -
    1. -

      Entities & Terminology

      -
    2. -
        -
      1. -

        Key entities

        -
      2. -

         

        -

        Data Management Plan (DMP) is a collection of dataset descriptions, associated with an activity (“project” or “grant”). A DMP may be versioned, is exportable to various forms, currently machine readable (xml, json) and human readable (pdf/openxml) and can be assigned a DOI and published in Zenodo.

        -

         

        -

        Dataset in Argos describes data according to a set of rules that is the dataset template.

        -

         

        -

        Dataset Template is the set of rules that describe what Datasets contain and how they are handled. Dataset Templates are modified by Admins and contain attributes/fields, behavioral rules (e.g. toggling visibility of fields) and validation rules. Dataset Templates are linked to DMPs so that users are provided with specific formats of descriptions.

        -

         

        -

        Project is a logical entity that defines the context where one or more Data Management Plans may be formed in.

        -

         

        -

        Grant is a logical entity that defines the context where one or more Data Management Plans may be formed in.

        -

         

        -

        Users are associated to DMPs and other entities (e.g. Datasets, Organizations) for authorization and may map to researchers.

        -

         

        -

        Import - Import function supports upload of .json files that are produced according to RDA specifications for machine-actionable DMPs

        -

         

        -

        -

         

        -

        - - - - - - -
        -

        Start New DMP is an easy way to start writing a DMP. It provides an editor that goes through the essential elements of a DMP and guides the process of its creation step by step.

        -

         

        -

        From “Homepage”

        -

        -

         

        -

        From Dashboard

        -

        -

        or

        -

        -

         

        -

        From “Add Dataset”

        -

        -
        -

         

        -

         

        -

        - - - - - - -
        -

        Add Dataset is an easy way to add new datasets to pre-existing DMPs.

        -

         

        -

        From Dashboard

        -

        -

         

        -

        From “My Datasets”

        -

        -

         

        -

        From “My DMPs”

        -

        -

         

        -

        From Dataset Editor

        -

        -
        -

         

        -
      3. -

        Secondary entities

        -
      4. -

         

        -

        Repository  - an electronic database or an information system where data are stored and maintained

        -

         

        -

        Data set - a collection of data which are bind together under a specific format

        -

         

        -

        Registry - a database of entities and descriptions

        -

         

        -

        Service - a software of specific operations and tasks that interacts with other software and hardware

        -

         

        -

        Researcher - an individual practicing research

        -

         

        -

        Funding organization - an organisation that funds research programmes and/ or researchers’ activities

        -

         

        -
      -
    3. -

      Navigation

      -
    4. -
        -
      1. -

        Homepage

        -
      2. -

         

        -

        The homepage can be found under argos.openaire.eu, also accessible from  the OpenAIRE Service catalogue and the EOSC.

        -

         

        -

        -

         

        -

        About - informs about the scope and main functions of the tool (How it works, ROADMAP, FAQs, Contributors)

        -

         

        -

        Resources - provides useful information about using Argos and includes dissemination material (Media Kit, User Guide, Co-branding)

        -

         

        -

        Contact - a contact form that facilitates communication with Argos team

        -

         

        -

        Sign in - enters the tool as a user

        -
      3. -

        Login

        -
      4. -

         

        -

        Different login options are available to choose from social media to research and scholarly communication channels.

        -

        -

         

        -

        Note! No user account is required.

        -

         

        -
      5. -

        User Account Menu

        -
      6. -

         

        -

        A dedicated, customisable space of the user’s personal profile.

        -

         

        -

        - - - - - - - -
        -

        -
        -

        My profile settings -  displays the profile page which contains details such as name, email, zenodo account details etc.

        -

         

        -

        Associated DMPs - a collection of users’ DMPs

        -

         

        -

        Log out - terminates the session, and redirects to the login page.

        -
        -

         

        -

         

        -
      7. -

        Main Menu

        -
      8. -

         

        -

        The main menu is located on the left side of the screen. Depending on how users view the tool, i.e. whether they have logged in or not, the main menu changes to include features that are available only in individuals’ dashboards.

        -

         

        -

        - - - - - - - -
        -

        Main menu - not logged in

        -

         

        -

        -

         

        -

        Home  - gets you back to the homepage / dashboard

        -

         

        -

        Public DMPs - a collection of DMPs publicly available in Argos

        -

         

        -

        Public Datasets - a collection of Datasets publicly available in Argos

        -

         

        -

        Co-Branding - a page to view the software and learn how to contribute

        -

         

        -

        Support - a contact form that facilitates communication with Argos team

        -

         

        -

        Send feedback - a feedback form to contribute thoughts and opinions about using Argos

        -

         

        -

        About - informs about the scope and main functions of the tool

        -

         

        -

        Terms of Service - provides the legal status for using of ARGOS

        -

         

        -

        Glossary - includes the terminology used in the tool and explains basic components

        -

         

        -

        User Guide - a guide for users to learn how to use Argos

        -

         

        -
        -

        Main menu - logged in

        -

         

        -

        -

         

        -

        Home  - gets you back to the homepage / dashboard

        -

         

        -

        My DMPs - includes all DMPs which the user is either the owner or the collaborator of

        -

         

        -

        My Datasets - includes all Datasets which the user is either the owner or the collaborator of

        -

         

        -

        Public DMPs - a collection of DMPs publicly available in Argos

        -

         

        -

        Public Datasets - a collection of Datasets publicly available in Argos

        -

         

        -

        About - informs about the scope and main functions of the tool

        -

         

        -

        Terms of Service - provides the legal status for using of ARGOS

        -

         

        -

        Glossary - includes the terminology used in the tool and explains basic components

        -

         

        -

        User Guide - a guide for users to learn how to use Argos

        -

         

        -

        Contact support - a contact form that facilitates communication with Argos team

        -

         

        -
        -
      9. -

        Dashboard

        -
      10. -

         

        -

        Dashboard is the console that appears after entering Argos from the Homepage and includes condensed information based on Argos function and their use.

        -

         

        -

        Dashboard - Not logged in

        -

         

        -

        -

         

        -

        - - - - - - - -
        -

        -
        -

        Latest Activity - displays publicly available DMPs and Datasets according to the date of their publication in Argos and their Label (DMPs or Datasets)

        -
        -

         

        -

        - - - - - - - -
        -

        -
        -

        Public Usage - shows the number of publicly available DMPs, Datasets, Grants and Organizations included in Argos

        -

         

        -

        Note! When logged in to ARGOS the Homepage becomes a personal Dashboard, hence the numbers change to correspond to information provided by the individual’s activity.

        -
        -

         

        -

        Dashboard - Logged in

        -

         

        -

        -

         

        -

         

        -

        - - - - - - - -
        -

        -
        -

        Latest Activity - displays users’ DMPs and Datasets classified according to the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets)

        -
        -

         

        -

        - - - - - - - -
        -

        -
        -

        Personal Usage - shows users activity in DMPs, Datasets, Grants and Organizations

        -
        -

         

        -
      11. -

        My DMPs / My Datasets

        -
      12. -

         

        -

        Contains all DMPs and Datasets which the user is either the owner or the collaborator of. Both DMPs and Datasets on the user dashboard are classified by the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets).

        -

         

        -

        My DMPs

        -

        Each DMP card is green and shows the role of the person viewing the DMP, the status of the writing process, the version of the current DMP, the grant associated with the DMP, the number and name of datasets that the DMP has.

        -

         

        -

        -

         

        -

        Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

        -

         

        -

        Add Dataset - adds more Datasets to existing DMPs

        -

         

        -

        Invite - provides people with edit rights on the document

        -

         

        -

        Clone - creates an exact replica of the DMP

        -

         

        -

        - - - - - - - -
        -

        -
        -

        New version - starts a new version of the DMP

        -

        All DMP Versions  - shows the history of the different versions of the existing DMP

        -

        Delete - permanently removes DMPs

        -

         

        -
        -

         

        -

         

        -

        My Datasets

        -

        Each Dataset card is yellow and shows the role of the person viewing the Dataset, the status of the writing process, the grant associated with the DMP and the tite of the DMP that the dataset is part of.

        -

         

        -

        -

         

        -

        Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

        -

         

        -

        Invite - Sends email or searches the Argos Users Catalogue to find colleagues/ collaborators. Invitation sent provides people with edit rights on the document.

        -

         

        -

         

        -

        - - - - - - - -
        -

        -
        -

        Copy Dataset - creates a copy of the dataset

        -

        Delete - permanently removes Datasets

        -
        -
      13. -

        Public DMPs / Public Datasets

        -
      14. -

         

        -

        Contains DMPs outputs that are openly available in Argos. That means that DMP owners and members are making their DMP and/or Dataset outputs available to all Argos and non-Argos users who might want to consult or re-use them under the framework provided by the assigned DMP license.

        -

        Both DMPs and Datasets on the user dashboard are classified by the date of their last modification and their label (DMPs or Datasets). Users can also search for the DMP or Dataset from the search bar.

        -

         

        -

        Public DMPs

        -

        Each Public DMP card is green and displays the title of the DMP, its status (published), the version of the DMP, the grant associated with it, the number and name of datasets that the DMP contains.

        -

         

        -

        -

         

        -

        Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

        -

         

        -

        Clone - creates an exact replica of the DMP

        -

        - - - - - - - -
        -

        -
        -

        All DMP Versions - shows the history of the different versions of the existing DMP

        -

         

        -
        -

         

        -

         

        -

        Public Datasets

        -

        Each Public Dataset card is yellow and displays the title of the dataset, the status of the dataset (published), the grant associated with the DMP and the title of the DMP that the dataset is part of.

        -

         

        -

        -

         

        -

        Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

        -

         

        -

        - - - - - - - -
        -

        -
        -

        Copy Dataset - creates a copy of the dataset

        -
        -
      15. -

        Create DMPs

        -
      16. -

         

        -

        There are many ways to create new DMPs in Argos.

        -

         

        -

        Start new DMP - Start Wizard

        -

        -

         

        -

        There are four steps involved in creating a DMP: Main Info - Funding Info - License Info - Dataset Info

        -

         

        -

         

        -
          -
        1. Main Info
        2. -

           

          -

          -

          -

           

          -

           

          -

          Title - title of the DMP

          -

           

          -

          Description - brief description of what the DMP is about, it’s scope and objectives

          -

           

          -

          Language - the language of the DMP

          -

           

          -

          Visibility - how the DMP is displayed in Argos. By choosing Public, the DMP is automatically made available to all users from the “Public DMPs” collection.

          -

           

          -

          Researchers - the people that have produced, processed, analysed the data described in the DMP

          -

           

          -

          Organizations - the names of the organizations contributing to the creation and revision of the DMPs

          -

           

          -

          Contact - the contact details of the DMP owner

          -

           

          -

           

          -
        3. Funding Info
        4. -

           

          -

          -

           

          -

          Funding organizations - A drop-down menu where users may find the organisation that their research is funded by. In case that the name of a funding organisation can not be found in Argos, users may create a new record with the name and details of the funding organisation (“Insert it manually”).

          -

           

          -

          Grants - A drop-down menu to select the grant that is associated with the research project of the given funding organisation. In case that the grant can not be found in Argos, users may create a new record with the number and name of the grant (“Insert it manually”).

          -

           

          -

          Project - This field is to be completed only for projects where multiple grants apply. Otherwise, it is left blank and is later filled automatically by Argos metadata.

          -

           

          -

          Note!  There may be many projects associated with a grant number.

          -

           

          -

           

          -
        5. License Info
        6. -

           

          -

          -

          License - A list of licenses to choose from and assign to DMPs

          -

           

          -

           

          -
        7. Dataset Info
        8. -

           

          -

          -

           

          -

          Dataset Info - Select a template to describe your datasets. You may select more than one template.

          -

           

          -

          Save DMPs

          -

           

          -

          Discard - undo all changes made to the dataset

          -

           

          -

          Save - keeps all changes made to the DMP and continues work on the same page

          -

           

          -

          Save & Add Dataset - keeps all changes made to the DMP and the Dataset editor starts to describe the first dataset of the DMP

          - -
        -
      17. -

        Add Dataset(s)

        -
      18. -

        There are two ways to create datasets: when creating the first dataset of the DMP and when adding datasets to existing DMPs. Add datasets are linked to and are associated with at least one DMP in Argos. A dataset can not exist as an orphan record.

        -

         

        -

        First dataset

        -

        -

        Once the DMP is created, the user can fill in the description for their data in the Dataset Editor.

        -

         

        -

        Add dataset - Adds more Dataset to existing DMPs

        -

        There are three steps involved in adding a Dataset: Select a DMP for your Dataset - Select Template - Edit Dataset

        -

         

        -
          -
        1. Select a DMP for your Dataset
        2. -

          -

          Selects an existing DMP from the drop-down menu

          -

           

          -
        3. Select Template
        4. -

          -

          Selects the template of the Dataset that users are required to describe their datasets with by corresponding to their grant funding organisations.

          -

           

          -
        5. Edit Dataset
        6. -

          -

          A Dataset Editor to add information that describes management activities according to the selected template.

          -

           

          -

          Save Datasets

          -

          There are many ways to Save a DMP in Argos. They all serve the same function, but the difference lies in the follow up action.

          -

           

          -

          -

           

          -

          Discard - undo all changes made to the dataset

          -

           

          -

          Save - keeps all changes made and continues work on the same page

          -

           

          -

          Save & Close - keeps all changes made, but the editor’s window closes and the user is redirected to their dashboard

          -

           

          -

          Save & Add New - keeps all changes made and a new editor starts to describe a new dataset

          -
        -
      19. -

        DMPs/ Datasets records

        -
      20. -

        Records of DMPs and Datasets in Argos after editing and after finalization.

        -

        Users can view the DMPs and Datasets they create from their dashboard. By opening a record they have created, they are provided with additional functionalities that are binded to the completion of the DMP writing process. Different functionalities apply according to the status of the DMP, i.e. before or after the DMP finalization.

        -

         

        -

         

        -

        DMPs before finalization

        -

        -

         

        -

        Before finalization, the DMP can be further edited, deleted or cloned. Users can review information that they have added regarding grant, researchers, DMP description and datasets used. New datasets can be added at any time from this page. Users can export the DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP.

        -

         

        -

         

        -

        Invite

        -

        -

         

        -

         

        -

        DMPs after finalization

        -

        -

         

        -

        After the DMP finalization, the DMP can be made publicly visible in Argos and deposited in Zenodo. Users can export the finalized DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP. Finalization is possible to be reverted.

        -

         

        -

         

        -

        Datasets before finalization

        -

        Argos offers different options before and after the Dataset finalization.

        -

         

        -

        -

         

        -

        Before finalization, the Dataset can be further edited, deleted or cloned. Users can access the whole DMP that the dataset is part of from that page and review information that they have added regarding grant, researchers and Dataset description. Users can export the description of the dataset and invite colleagues to collaborate on its completion.

        -

         

        -

         

        -

        Datasets after finalization

        -

        -

         

        -

        After finalization, the Dataset can be exported and shared with colleagues for review.

        -

         

        -

         

        -

         

        -

         

        -

         

        -
      -
    -
    -
    -
    -
    - - - - + \ No newline at end of file From 4e87bd270e575783223eb9ee81ee9f82d0c7a86e Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 2 Aug 2021 18:31:10 +0300 Subject: [PATCH 055/156] Improve error handling when user has no zenodo access token --- .../web/src/main/java/eu/eudat/logic/managers/UserManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java index 4dfe09d9a..e7b00d0e6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java @@ -167,7 +167,7 @@ public class UserManager { try { this.updateDOIToken(ZenodoAccessType.REFRESH_TOKEN, principal.getZenodoRefresh(), this.environment.getProperty("zenodo.login.redirect_uri"), principal); return true; - }catch (IOException e) { + }catch (Exception e) { this.deleteDOIToken(principal); throw new ExpiredTokenException("Zenodo Token is expired."); } From ce8b49deb0b1f9ab6f467b998f20b02423e84856 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 3 Aug 2021 12:15:54 +0300 Subject: [PATCH 056/156] Fix issue with DMP disappearing when editing Datasets --- .../java/eu/eudat/elastic/entities/Dmp.java | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java index 8faea3233..eee7e035d 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; @@ -287,30 +288,43 @@ public class Dmp implements ElasticEntity { @Override public Dmp fromElasticEntity(Map fields) { this.id = UUID.fromString((String) fields.get(MapKey.ID.getName())); - this.label = (String) fields.get(MapKey.LABEL.getName()); - this.description = (String) fields.get(MapKey.DESCRIPTION.getName()); - if (fields.get(MapKey.GROUPID.getName()) != null) { - this.groupId = UUID.fromString((String) fields.get(MapKey.GROUPID.getName())); - } - this.status = Short.valueOf(fields.get(MapKey.STATUS.getName()).toString()); - if (fields.get(MapKey.TEMPLATES.getName()) != null) { - this.templates = ((List>) fields.get(MapKey.TEMPLATES.getName())).stream().map(hashMap -> new DatasetTempalate().fromElasticEntity(hashMap)).collect(Collectors.toList()); - } - if (fields.get(MapKey.COLLABORATORS.getName()) != null) { - this.collaborators = ((List>) fields.get(MapKey.COLLABORATORS.getName())).stream().map(map -> new Collaborator().fromElasticEntity(map)).collect(Collectors.toList()); - } - if (fields.get(MapKey.ORGANIZATIONS.getName()) != null) { - this.organizations = ((List>) fields.get(MapKey.ORGANIZATIONS.getName())).stream().map(map -> new Organization().fromElasticEntity(map)).collect(Collectors.toList()); - } - this.lastVersion = (Boolean) fields.get(MapKey.LASTVERSION.getName()); - this.lastPublicVersion = (Boolean) fields.get(MapKey.LASTPUBLICVERSION.getName()); - this.isPublic = (Boolean) fields.get(MapKey.ISPUBLIC.getName()); - if (fields.get(MapKey.DATASETS.getName()) != null) { - this.datasets = ((List>) fields.get(MapKey.DATASETS.getName())).stream().map(map -> new Dataset().fromElasticEntity(map)).collect(Collectors.toList()); - } - this.grant = UUID.fromString((String) fields.get(MapKey.GRANT.getName())); - if (fields.get(MapKey.GRANTSTATUS.getName()) != null) { - this.grantStatus = Short.valueOf(fields.get(MapKey.GRANTSTATUS.getName()).toString()); + if (fields.size() > 1) { + this.label = (String) fields.get(MapKey.LABEL.getName()); + this.description = (String) fields.get(MapKey.DESCRIPTION.getName()); + if (fields.get(MapKey.GROUPID.getName()) != null) { + this.groupId = UUID.fromString((String) fields.get(MapKey.GROUPID.getName())); + } + this.status = Short.valueOf(fields.get(MapKey.STATUS.getName()).toString()); + if (fields.get(MapKey.TEMPLATES.getName()) != null) { + this.templates = ((List>) fields.get(MapKey.TEMPLATES.getName())).stream().map(hashMap -> new DatasetTempalate().fromElasticEntity(hashMap)).collect(Collectors.toList()); + } + if (fields.get(MapKey.COLLABORATORS.getName()) != null) { + this.collaborators = ((List>) fields.get(MapKey.COLLABORATORS.getName())).stream().map(map -> new Collaborator().fromElasticEntity(map)).collect(Collectors.toList()); + } + if (fields.get(MapKey.ORGANIZATIONS.getName()) != null) { + this.organizations = ((List>) fields.get(MapKey.ORGANIZATIONS.getName())).stream().map(map -> new Organization().fromElasticEntity(map)).collect(Collectors.toList()); + } + this.lastVersion = (Boolean) fields.get(MapKey.LASTVERSION.getName()); + this.lastPublicVersion = (Boolean) fields.get(MapKey.LASTPUBLICVERSION.getName()); + this.isPublic = (Boolean) fields.get(MapKey.ISPUBLIC.getName()); + if (fields.get(MapKey.DATASETS.getName()) != null) { + this.datasets = ((List>) fields.get(MapKey.DATASETS.getName())).stream().map(map -> new Dataset().fromElasticEntity(map)).collect(Collectors.toList()); + } + this.grant = UUID.fromString((String) fields.get(MapKey.GRANT.getName())); + if (fields.get(MapKey.GRANTSTATUS.getName()) != null) { + this.grantStatus = Short.valueOf(fields.get(MapKey.GRANTSTATUS.getName()).toString()); + } + this.created = Date.from(Instant.parse(fields.get(MapKey.CREATED.getName()).toString())); + this.modified = Date.from(Instant.parse(fields.get(MapKey.MODIFIED.getName()).toString())); + if (fields.get(MapKey.FINALIZEDAT.getName()) != null) { + this.finalizedAt = Date.from(Instant.parse(fields.get(MapKey.FINALIZEDAT.getName()).toString())); + } + if (fields.get(MapKey.PUBLISHEDAT.getName()) != null) { + this.publishedAt = Date.from(Instant.parse(fields.get(MapKey.PUBLISHEDAT.getName()).toString())); + } + if (fields.get(MapKey.DOI.getName()) != null) { + this.doi = fields.get(MapKey.DOI.getName()).toString(); + } } return this; } From 5de811a76d784d7d0ec2d3d7de0491ae88a1e55c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 4 Aug 2021 18:38:49 +0300 Subject: [PATCH 057/156] Vastly improve and optimize DMP and Dataset Queries (and with elastic) --- .../definition/helpers/ColumnOrderings.java | 10 +- .../elastic/criteria/DatasetCriteria.java | 9 + .../eu/eudat/elastic/entities/Dataset.java | 70 +++--- .../elastic/repository/DatasetRepository.java | 224 +++++++++++++----- .../elastic/repository/DmpRepository.java | 162 +++++-------- .../eudat/elastic/repository/Repository.java | 2 + .../eu/eudat/controllers/TagController.java | 6 +- .../logic/managers/DashBoardManager.java | 163 ++++++++----- .../eudat/logic/managers/DatasetManager.java | 37 +-- .../logic/mapper/elastic/DatasetMapper.java | 1 + .../elastic/criteria/DmpCriteriaMapper.java | 2 +- .../services/forms/VisibilityRuleService.java | 2 +- .../forms/VisibilityRuleServiceImpl.java | 2 +- 13 files changed, 414 insertions(+), 276 deletions(-) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java index 7ab879b59..808cd20e2 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java @@ -6,22 +6,22 @@ import java.util.List; public class ColumnOrderings { - private String[] fields; + private List fields; - public String[] getFields() { + public List getFields() { return fields; } - public void setFields(String[] fields) { + public void setFields(List fields) { this.fields = fields; } - public Ordering[] getFieldOrderings() { + public List getFieldOrderings() { List orderings = new LinkedList<>(); for (String field : fields) { orderings.add(this.orderingFromString(field)); } - return orderings.toArray(new Ordering[orderings.size()]); + return orderings; } private Ordering orderingFromString(String field) { diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java index 705093384..b00fec7df 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java @@ -18,6 +18,7 @@ public class DatasetCriteria extends Criteria { private List collaborators; private Boolean allowAllVersions; private List organiztions; + private Boolean hasTags; private List tags; private boolean isPublic; private Short grantStatus; @@ -144,4 +145,12 @@ public class DatasetCriteria extends Criteria { public void setSortCriteria(List sortCriteria) { this.sortCriteria = sortCriteria; } + + public Boolean getHasTags() { + return hasTags; + } + + public void setHasTags(Boolean hasTags) { + this.hasTags = hasTags; + } } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java index c54088f18..c53f08d29 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java @@ -283,38 +283,46 @@ public class Dataset implements ElasticEntity { @Override public Dataset fromElasticEntity(Map fields) { if (fields != null) { - this.id = (String) fields.get("id"); - if (fields.get("tags") != null) { - this.tags = ((List) fields.get("tags")).stream().map(hashMap -> new Tag().fromElasticEntity(hashMap)).collect(Collectors.toList()); + if (fields.size() == 1) { + if (fields.containsKey("id")) { + this.id = (String) fields.get("id"); + } else if (fields.containsKey("tags")) { + this.tags = ((List) fields.get("tags")).stream().map(hashMap -> new Tag().fromElasticEntity(hashMap)).collect(Collectors.toList()); + } + }else if (fields.size() > 1) { + this.id = (String) fields.get("id"); + if (fields.get("tags") != null) { + this.tags = ((List) fields.get("tags")).stream().map(hashMap -> new Tag().fromElasticEntity(hashMap)).collect(Collectors.toList()); + } + this.label = (String) fields.get("label"); + this.description = (String) fields.get("description"); + this.template = UUID.fromString((String) fields.get("template")); + this.status = Short.valueOf((String) fields.get("status")); + this.dmp = UUID.fromString((String) fields.get("dmp")); + this.group = UUID.fromString((String) fields.get("group")); + this.grant = UUID.fromString((String) fields.get("grant")); + if (fields.get("created") != null) + this.created = Date.from(Instant.parse((String) fields.get("created"))); + if (fields.get("modified") != null) + this.modified = Date.from(Instant.parse((String) fields.get("modified"))); + if (fields.get("finalizedAt") != null) + this.finalizedAt = Date.from(Instant.parse((String) fields.get("finalizedAt"))); + if (fields.get("collaborators") != null) { + this.collaborators = ((List) fields.get("collaborators")).stream().map(hashMap -> new Collaborator().fromElasticEntity(hashMap)).collect(Collectors.toList()); + } + this.lastVersion = Boolean.parseBoolean((String) fields.get("lastVersion")); + this.lastPublicVersion = Boolean.parseBoolean((String) fields.get("lastPublicVersion")); + if (fields.get("organizations") != null) { + this.organizations = ((List) fields.get("organizations")).stream().map(hashMap -> new Organization().fromElasticEntity(hashMap)).collect(Collectors.toList()); + } + if (fields.get("public") != null) { + this.isPublic = Boolean.valueOf((String) fields.get("public")); + } + if (fields.get("grantStatus") != null) { + this.grantStatus = Short.valueOf((String) fields.get("grantStatus")); + } + this.formData = (String) fields.get("formData"); } - this.label = (String) fields.get("label"); - this.description = (String) fields.get("description"); - this.template = UUID.fromString((String) fields.get("template")); - this.status = Short.valueOf((String) fields.get("status")); - this.dmp = UUID.fromString((String) fields.get("dmp")); - this.group = UUID.fromString((String) fields.get("group")); - this.grant = UUID.fromString((String) fields.get("grant")); - if (fields.get("created") != null) - this.created = Date.from(Instant.parse((String) fields.get("created"))); - if (fields.get("modified") != null) - this.modified = Date.from(Instant.parse((String) fields.get("modified"))); - if (fields.get("finalizedAt") != null) - this.finalizedAt = Date.from(Instant.parse((String) fields.get("finalizedAt"))); - if (fields.get("collaborators") != null) { - this.collaborators = ((List) fields.get("collaborators")).stream().map(hashMap -> new Collaborator().fromElasticEntity(hashMap)).collect(Collectors.toList()); - } - this.lastVersion = Boolean.parseBoolean((String) fields.get("lastVersion")); - this.lastPublicVersion = Boolean.parseBoolean((String) fields.get("lastPublicVersion")); - if (fields.get("organizations") != null) { - this.organizations = ((List) fields.get("organizations")).stream().map(hashMap -> new Organization().fromElasticEntity(hashMap)).collect(Collectors.toList()); - } - if (fields.get("public") != null) { - this.isPublic = Boolean.valueOf((String) fields.get("public")); - } - if (fields.get("grantStatus") != null) { - this.grantStatus = Short.valueOf((String) fields.get("grantStatus")); - } - this.formData = (String) fields.get("formData"); } return this; } diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java index 33ff68253..91fd936e1 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java @@ -24,6 +24,7 @@ import org.elasticsearch.search.aggregations.bucket.filter.ParsedFilters; import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.fetch.subphase.FetchSourceContext; import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; @@ -122,68 +123,9 @@ public class DatasetRepository extends ElasticRepository sortBuilders = new ArrayList<>(); - if (criteria.isPublic()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.public", "true")); - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.status", Dataset.Status.FINALISED.getValue())); - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.lastPublicVersion", "true")); - } - if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { - boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).allowLeadingWildcard(true).fields(Stream.of(new Object[][]{ - {"datasets.label", 1.0f}, - {"datasets.description", 1.0f}, - {"datasets.formData", 1.0f} - }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); - } + BoolQueryBuilder boolQuery = createBoolQuery(criteria); - if (criteria.getDatasetTemplates() != null && criteria.getDatasetTemplates().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.template", criteria.getDatasetTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.status", criteria.getStatus().toString())); - } - - if (criteria.getDmps() != null && criteria.getDmps().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.dmp", criteria.getDmps().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.group", criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.grant", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrantStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.grantStatus", criteria.getGrantStatus().toString())); - } - - if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.collaborators.id", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (!criteria.isPublic()) { - if (criteria.getAllowAllVersions() != null && !criteria.getAllowAllVersions()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.lastVersion", "true")); - } - } - - if (criteria.getOrganiztions() != null && criteria.getOrganiztions().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.organizations.id", criteria.getOrganiztions())); - } - - if (criteria.getTags() != null && criteria.getTags().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.tags.name", criteria.getTags().stream().map(Tag::getName).collect(Collectors.toList()))); - } - - if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { - boolQuery.should(QueryBuilders.matchAllQuery()); - } else { - boolQuery.minimumShouldMatch(boolQuery.should().size()); - } if (criteria.getSortCriteria() != null && !criteria.getSortCriteria().isEmpty()) { criteria.getSortCriteria().forEach(sortCriteria -> { @@ -202,8 +144,11 @@ public class DatasetRepository extends ElasticRepository 0) { + searchSourceBuilder.size(criteria.getSize()); + } sortBuilders.forEach(searchSourceBuilder::sort); searchRequest.source(searchSourceBuilder); SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); @@ -215,6 +160,161 @@ public class DatasetRepository extends ElasticRepository queryIds(DatasetCriteria criteria) throws IOException { + if (this.getClient() != null) { + SearchRequest searchRequest = new SearchRequest(this.environment.getProperty("elasticsearch.index")); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + /*CountRequest countRequest = new CountRequest("dmps").routing("datasets").routing("id"); + countRequest.query(QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery("datasets.status.keyword", Stream.of(Dataset.Status.DELETED.getValue(), Dataset.Status.CANCELED.getValue()).collect(Collectors.toList())))); + CountResponse countResponse = getClient().count(countRequest, RequestOptions.DEFAULT); + Long count = countResponse.getCount();*/ + + SearchRequest countRequest = new SearchRequest(this.environment.getProperty("elasticsearch.index")); + NestedAggregationBuilder nestedAggregationBuilder = AggregationBuilders.nested("by_dataset", "datasets"); + FiltersAggregationBuilder filtersAggregationBuilder = AggregationBuilders.filters("dataset_query", QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery("datasets.status.keyword", Stream.of(Dataset.Status.DELETED.getValue(), Dataset.Status.CANCELED.getValue()).collect(Collectors.toList())))); + nestedAggregationBuilder.subAggregation(filtersAggregationBuilder); + SearchSourceBuilder countSourceBuilder = new SearchSourceBuilder(); + countSourceBuilder.aggregation(nestedAggregationBuilder); + countRequest.source(countSourceBuilder); + SearchResponse countResponse = getClient().search(countRequest, RequestOptions.DEFAULT); + Long count = ((ParsedFilters)((ParsedNested)countResponse.getAggregations().asMap().get("by_dataset")).getAggregations().get("dataset_query")).getBuckets().get(0).getDocCount(); + + + searchSourceBuilder.size(count.intValue()); + + List sortBuilders = new ArrayList<>(); + BoolQueryBuilder boolQuery = createBoolQuery(criteria); + + + if (criteria.getSortCriteria() != null && !criteria.getSortCriteria().isEmpty()) { + criteria.getSortCriteria().forEach(sortCriteria -> { + switch(sortCriteria.getColumnType()) { + case COLUMN: + sortBuilders.add(SortBuilders.fieldSort(sortCriteria.getFieldName()).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + break; + case JOIN_COLUMN: + List fields = Arrays.asList(sortCriteria.getFieldName().split(":")); + fields.stream().filter(name -> !name.startsWith("dmp")).forEach(field -> { + sortBuilders.add(SortBuilders.fieldSort(field).order(SortOrder.fromString(sortCriteria.getOrderByType().name()))); + }); + break; + } + }); + + } + + NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("datasets", boolQuery, ScoreMode.None).innerHit(new InnerHitBuilder().setFetchSourceContext(new FetchSourceContext(true, new String[]{"datasets.id"}, null))); + searchSourceBuilder.query(nestedQueryBuilder).from(criteria.getOffset()).size(criteria.getSize()).fetchSource("datasets.id", null); + sortBuilders.forEach(searchSourceBuilder::sort); + searchRequest.source(searchSourceBuilder); + SearchResponse response = this.getClient().search(searchRequest, RequestOptions.DEFAULT); + return ((Stream)Arrays.stream(response.getHits().getHits()) + .map(hit -> hit.getInnerHits().values()).flatMap(Collection::stream) + .map(SearchHits::getHits).flatMap(Arrays::stream) + .map(x -> new Dataset().fromElasticEntity(this.transformFromString(x.getSourceAsString(), Map.class)))).collect(Collectors.toList()); + } + return null; + } + + @Override + public Long count(DatasetCriteria criteria) throws IOException { + if (this.getClient() != null) { + //CountRequest countRequest = new CountRequest(this.environment.getProperty("elasticsearch.index")); + + SearchRequest countRequest = new SearchRequest(this.environment.getProperty("elasticsearch.index")); + BoolQueryBuilder boolQuery = createBoolQuery(criteria); + NestedAggregationBuilder nestedAggregationBuilder = AggregationBuilders.nested("by_dataset", "datasets"); + FiltersAggregationBuilder filtersAggregationBuilder = AggregationBuilders.filters("dataset_query", boolQuery); + nestedAggregationBuilder.subAggregation(filtersAggregationBuilder); + SearchSourceBuilder countSourceBuilder = new SearchSourceBuilder(); + countSourceBuilder.aggregation(nestedAggregationBuilder); + countRequest.source(countSourceBuilder); + SearchResponse countResponse = getClient().search(countRequest, RequestOptions.DEFAULT); + return ((ParsedFilters)((ParsedNested)countResponse.getAggregations().asMap().get("by_dataset")).getAggregations().get("dataset_query")).getBuckets().get(0).getDocCount(); + + + + /*NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("datasets", boolQuery, ScoreMode.None).innerHit(new InnerHitBuilder()); + countRequest.query(nestedQueryBuilder); + CountResponse response = this.getClient().count(countRequest, RequestOptions.DEFAULT); + return response.getCount();*/ + } + return null; + } + + private BoolQueryBuilder createBoolQuery(DatasetCriteria criteria) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery("datasets.status", Stream.of(Dataset.Status.DELETED.getValue(), Dataset.Status.CANCELED.getValue()).collect(Collectors.toList()))); + if (criteria.isPublic()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.public", "true")); + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.status", Dataset.Status.FINALISED.getValue())); + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.lastPublicVersion", "true")); + } + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { + boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).allowLeadingWildcard(true).fields(Stream.of(new Object[][]{ + {"datasets.label", 1.0f}, + {"datasets.description", 1.0f}, + {"datasets.formData", 1.0f} + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); + } + + if (criteria.getDatasetTemplates() != null && criteria.getDatasetTemplates().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.template", criteria.getDatasetTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.status", criteria.getStatus().toString())); + } + + if (criteria.getDmps() != null && criteria.getDmps().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.dmp", criteria.getDmps().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.group", criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.grant", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrantStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.grantStatus", criteria.getGrantStatus().toString())); + } + + if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.collaborators.id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (!criteria.isPublic()) { + if (criteria.getAllowAllVersions() != null && !criteria.getAllowAllVersions()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery("datasets.lastVersion", "true")); + } + } + + if (criteria.getOrganiztions() != null && criteria.getOrganiztions().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.organizations.id", criteria.getOrganiztions())); + } + + if (criteria.getTags() != null && criteria.getTags().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery("datasets.tags.name", criteria.getTags().stream().map(Tag::getName).collect(Collectors.toList()))); + } + + if (criteria.getHasTags() != null) { + boolQuery = criteria.getHasTags() == true ? boolQuery.should(QueryBuilders.existsQuery("datasets.tags.id")) : boolQuery.mustNot(QueryBuilders.existsQuery("datasets.tags.id")); + } + + if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { + boolQuery.should(QueryBuilders.matchAllQuery()); + } else { + boolQuery.minimumShouldMatch(boolQuery.should().size()); + } + + + + return boolQuery; + } + @Override public boolean exists() throws IOException { if (this.getClient() != null) { diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java index 9121a0027..4acfea5f6 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java @@ -99,60 +99,8 @@ public class DmpRepository extends ElasticRepository { searchSourceBuilder.size(count.intValue()); - BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); List sortBuilders = new ArrayList<>(); - if (criteria.isPublic()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); - } - if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { - boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).fields(Stream.of(new Object[][]{ - {Dmp.MapKey.LABEL.getName(), 1.0f}, - {Dmp.MapKey.DESCRIPTION.getName(), 1.0f} - }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); - } - - if (criteria.getTemplates() != null && criteria.getTemplates().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.TEMPLATES.getName() + ".id.keyword", criteria.getTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), criteria.getStatus().intValue())); - } - - if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GROUPID.getName(), criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GRANT.getName() + ".keyword", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getRoles() != null && criteria.getRoles().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".role.keyword", criteria.getRoles())); - } - - if (!criteria.isAllowAllVersions()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(criteria.isPublic() ? Dmp.MapKey.LASTPUBLICVERSION.getName() : Dmp.MapKey.LASTVERSION.getName(), true)); - } - - if (criteria.getOrganizations() != null && criteria.getOrganizations().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.ORGANIZATIONS.getName() + ".id.keyword", criteria.getOrganizations().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrantStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.GRANTSTATUS.getName(), criteria.getGrantStatus())); - } - - if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { - boolQuery = boolQuery.should(QueryBuilders.matchAllQuery()); - } else { - boolQuery.minimumShouldMatch(boolQuery.should().size()); - } + BoolQueryBuilder boolQuery = createBoolQuery(criteria); if (criteria.getSortCriteria() != null && !criteria.getSortCriteria().isEmpty()) { criteria.getSortCriteria().forEach(sortCriteria -> { @@ -170,8 +118,8 @@ public class DmpRepository extends ElasticRepository { }); } - searchSourceBuilder.query(boolQuery).from(criteria.getOffset()); - if (criteria.getSize() != null) { + searchSourceBuilder.query(boolQuery).from(criteria.getOffset()).fetchSource("id", null); + if (criteria.getSize() > 0) { searchSourceBuilder.size(criteria.getSize()); } sortBuilders.forEach(searchSourceBuilder::sort); @@ -182,59 +130,12 @@ public class DmpRepository extends ElasticRepository { return null; } + @Override public Long count(DmpCriteria criteria) throws IOException { if (this.getClient() != null) { CountRequest countRequest = new CountRequest(this.environment.getProperty("elasticsearch.index")); - BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); - if (criteria.isPublic()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); - } - if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { - boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).fields(Stream.of(new Object[][]{ - {Dmp.MapKey.LABEL.getName(), 1.0f}, - {Dmp.MapKey.DESCRIPTION.getName(), 1.0f} - }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); - } - - if (criteria.getTemplates() != null && criteria.getTemplates().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.TEMPLATES.getName() + ".id.keyword", criteria.getTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), criteria.getStatus().intValue())); - } - - if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GROUPID.getName(), criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GRANT.getName() + ".keyword", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (!criteria.isAllowAllVersions()) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(criteria.isPublic() ? Dmp.MapKey.LASTPUBLICVERSION.getName() : Dmp.MapKey.LASTVERSION.getName(), true)); - } - - if (criteria.getOrganizations() != null && criteria.getOrganizations().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.ORGANIZATIONS.getName() + ".id.keyword", criteria.getOrganizations().stream().map(UUID::toString).collect(Collectors.toList()))); - } - - if (criteria.getGrantStatus() != null) { - boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.GRANTSTATUS.getName(), criteria.getGrantStatus())); - } - - if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { - boolQuery = boolQuery.should(QueryBuilders.matchAllQuery()); - } else { - boolQuery.minimumShouldMatch(boolQuery.should().size()); - } + BoolQueryBuilder boolQuery = createBoolQuery(criteria); countRequest.query(boolQuery); CountResponse response = this.getClient().count(countRequest, RequestOptions.DEFAULT); @@ -243,6 +144,59 @@ public class DmpRepository extends ElasticRepository { return null; } + private BoolQueryBuilder createBoolQuery(DmpCriteria criteria) { + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(Dmp.MapKey.STATUS.getName(), Collections.singletonList(Dmp.DMPStatus.DELETED.getValue()))); + if (criteria.isPublic()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.ISPUBLIC.getName(), true)); + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), Dmp.DMPStatus.FINALISED.getValue())); + } + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) { + boolQuery = boolQuery.should(QueryBuilders.queryStringQuery(criteria.getLike()).fields(Stream.of(new Object[][]{ + {Dmp.MapKey.LABEL.getName(), 1.0f}, + {Dmp.MapKey.DESCRIPTION.getName(), 1.0f} + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Float) data[1])))); + } + + if (criteria.getTemplates() != null && criteria.getTemplates().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.TEMPLATES.getName() + ".id.keyword", criteria.getTemplates().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.STATUS.getName(), criteria.getStatus().intValue())); + } + + if (criteria.getGroupIds() != null && criteria.getGroupIds().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GROUPID.getName(), criteria.getGroupIds().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrants() != null && criteria.getGrants().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.GRANT.getName() + ".keyword", criteria.getGrants().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (!criteria.isAllowAllVersions()) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(criteria.isPublic() ? Dmp.MapKey.LASTPUBLICVERSION.getName() : Dmp.MapKey.LASTVERSION.getName(), true)); + } + + if (criteria.getOrganizations() != null && criteria.getOrganizations().size() > 0) { + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.ORGANIZATIONS.getName() + ".id.keyword", criteria.getOrganizations().stream().map(UUID::toString).collect(Collectors.toList()))); + } + + if (criteria.getGrantStatus() != null) { + boolQuery = boolQuery.should(QueryBuilders.termQuery(Dmp.MapKey.GRANTSTATUS.getName(), criteria.getGrantStatus())); + } + + if (boolQuery.should().isEmpty() && boolQuery.mustNot().isEmpty()) { + boolQuery = boolQuery.should(QueryBuilders.matchAllQuery()); + } else { + boolQuery.minimumShouldMatch(boolQuery.should().size()); + } + return boolQuery; + } + public boolean createIndex() { try { if (!this.exists()) { diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java index 36d7be4a2..71cf4c209 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java @@ -18,6 +18,8 @@ public interface Repository { List query(C criteria) throws ExecutionException, InterruptedException, IOException; + Long count(C criteria) throws ExecutionException, InterruptedException, IOException; + boolean exists() throws IOException; void clear() throws IOException; diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java index e7acb4f09..d7c9435ba 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java @@ -1,10 +1,8 @@ package eu.eudat.controllers; import eu.eudat.elastic.criteria.DatasetCriteria; -import eu.eudat.elastic.criteria.TagCriteria; import eu.eudat.elastic.entities.Dataset; import eu.eudat.elastic.entities.Tag; -import eu.eudat.elastic.repository.Repository; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; @@ -49,7 +47,9 @@ public class TagController extends BaseController { /*List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getTags(externalUrlCriteria, type); TagExternalSourcesModel researchersExternalSourcesModel = new TagExternalSourcesModel().fromExternalItem(remoteRepos);*/ if (this.getApiContext().getOperationsContext().getElasticRepository().getDatasetRepository().exists()) { - List tags = this.getApiContext().getOperationsContext().getElasticRepository().getDatasetRepository().query(new DatasetCriteria()).stream().map(Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList()); + DatasetCriteria criteria = new DatasetCriteria(); + criteria.setHasTags(true); + List tags = this.getApiContext().getOperationsContext().getElasticRepository().getDatasetRepository().query(criteria).stream().map(Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).filter(tag -> tag.getName().startsWith(query)).collect(Collectors.toList()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(tags).status(ApiMessageCode.NO_MESSAGE)); } else { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 01eb9e4e4..dc722306e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -8,13 +8,12 @@ import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.DatasetDao; import eu.eudat.data.dao.entities.GrantDao; import eu.eudat.data.dao.entities.OrganisationDao; -import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.Dataset; -import eu.eudat.data.entities.Grant; -import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.*; import eu.eudat.data.query.PaginationService; +import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.elastic.entities.Dmp; import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; +import eu.eudat.logic.mapper.elastic.criteria.DmpCriteriaMapper; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.models.HintedModelFactory; @@ -26,6 +25,8 @@ import eu.eudat.models.data.dashboard.recent.model.RecentDmpModel; import eu.eudat.models.data.dashboard.recent.tablerequest.RecentActivityTableRequest; import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; +import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; +import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.queryable.QueryableList; import eu.eudat.types.searchbar.SearchBarItemType; @@ -97,8 +98,8 @@ public class DashBoardManager { } public DashBoardStatistics getMeStatistics(Principal principal) throws IOException { - List datasets = null; - List dmps = null; + Long datasets = 0L; + Long dmps = 0L; DashBoardStatistics statistics = new DashBoardStatistics(); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); DatasetDao datasetRepository = databaseRepository.getDatasetDao(); @@ -112,7 +113,8 @@ public class DashBoardManager { eu.eudat.elastic.criteria.DatasetCriteria datasetElasticCriteria = new eu.eudat.elastic.criteria.DatasetCriteria(); datasetElasticCriteria.setAllowAllVersions(false); datasetElasticCriteria.setPublic(false); - datasets = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(datasetElasticCriteria); + datasetElasticCriteria.setCollaborators(Collections.singletonList(principal.getId())); + datasets = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().count(datasetElasticCriteria); }catch (Exception e) { logger.warn(e.getMessage(), e); datasets = null; @@ -126,33 +128,40 @@ public class DashBoardManager { eu.eudat.elastic.criteria.DmpCriteria dmpElasticCriteria = new eu.eudat.elastic.criteria.DmpCriteria(); dmpElasticCriteria.setAllowAllVersions(false); dmpElasticCriteria.setPublic(false); - dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(dmpElasticCriteria); + dmpElasticCriteria.setCollaborators(Collections.singletonList(principal.getId())); + dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().count(dmpElasticCriteria); }catch (Exception e) { logger.warn(e.getMessage(), e); dmps = null; } } dataManagementPlanCriteria.setAllVersions(false); - GrantCriteria grantCriteria = new GrantCriteria(); + dataManagementPlanCriteria.setOnlyPublic(false); + dataManagementPlanCriteria.setIsPublic(false); + GrantCriteria grantCriteria = new GrantCriteria(); grantCriteria.setActive(true); OrganisationCriteria organisationCriteria = new OrganisationCriteria(); organisationCriteria.setActive(true); List roles = new LinkedList<>(); - List finalDmps = dmps; - CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated((dmps != null && !dmps.isEmpty()) ? dataManagementPlanRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))) : dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).distinct().countAsync() - .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); - List finalDatasets = datasets; - CompletableFuture datasetFuture = datasetRepository.getAuthenticated((datasets != null && !datasets.isEmpty()) ? datasetRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))) : datasetRepository.getWithCriteria(datasetCriteria), user, roles).countAsync() - .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); + if ((dmps == null || dmps == 0L) && (datasets == null || datasets == 0L)) { + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).distinct().countAsync() + .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); + CompletableFuture datasetFuture = datasetRepository.getAuthenticated( datasetRepository.getWithCriteria(datasetCriteria), user, roles).countAsync() + .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); + CompletableFuture.allOf(dmpFuture, datasetFuture).join(); + } else { + statistics.setTotalDataManagementPlanCount(dmps); + statistics.setTotalDataSetCount(datasets); + } CompletableFuture grantFuture = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user).countAsync() .whenComplete((grantsStats, throwable) -> statistics.setTotalGrantCount(grantsStats)); CompletableFuture orgnanisationFuture = organisationRepository.getAuthenticated(organisationRepository.getWithCriteria(organisationCriteria).withHint("organisationRecentActivity"), user).countAsync() .whenComplete((organisationStats, throwable) -> statistics.setTotalOrganisationCount(organisationStats)); - CompletableFuture.allOf(dmpFuture, datasetFuture, grantFuture, orgnanisationFuture).join(); + CompletableFuture.allOf( grantFuture, orgnanisationFuture).join(); return statistics; } @@ -185,14 +194,14 @@ public class DashBoardManager { .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) .whenComplete((datasetActivities, throwable) -> activity.setRecentDatasetActivities(datasetActivities)); - /*CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user) + CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user) .withHint("grantRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) - .whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities));*/ + .whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities)); - CompletableFuture.allOf(/*grants, */dmps, datasets).join(); + CompletableFuture.allOf(grants, dmps, datasets).join(); return activity; } @@ -228,7 +237,13 @@ public class DashBoardManager { datasetElasticCriteria.setLike(tableRequest.getCriteria().getLike()); datasetElasticCriteria.setAllowAllVersions(false); datasetElasticCriteria.setPublic(!isAuthenticated); - datasets = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(datasetElasticCriteria); + datasetElasticCriteria.setOffset(tableRequest.getDatasetOffset()); + datasetElasticCriteria.setSize(tableRequest.getLength()); + if (isAuthenticated) { + datasetElasticCriteria.setCollaborators(Collections.singletonList(principal.getId())); + } + datasetElasticCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(tableRequest.getOrderings())); + datasets = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().queryIds(datasetElasticCriteria); }catch (Exception e) { logger.warn(e.getMessage(), e); datasets = null; @@ -241,10 +256,16 @@ public class DashBoardManager { dmpElasticCriteria.setLike(tableRequest.getCriteria().getLike()); dmpElasticCriteria.setAllowAllVersions(false); dmpElasticCriteria.setPublic(!isAuthenticated); + dmpElasticCriteria.setOffset(tableRequest.getDmpOffset()); + dmpElasticCriteria.setSize(tableRequest.getLength()); + if (isAuthenticated) { + dmpElasticCriteria.setCollaborators(Collections.singletonList(principal.getId())); + } + dmpElasticCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(tableRequest.getOrderings())); dmps = apiContext.getOperationsContext().getElasticRepository().getDmpRepository().query(dmpElasticCriteria); }catch (Exception e) { logger.warn(e.getMessage(), e); - datasets = null; + dmps = null; } } @@ -253,6 +274,8 @@ public class DashBoardManager { dmpList = dataManagementPlanRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))).distinct(); } else { dmpList = dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria).distinct(); + PaginationService.applyOrder(dmpList, tableRequest.getOrderings()); + dmpList.skip(tableRequest.getDmpOffset()).take(tableRequest.getLength()); } if (datasets != null && !datasets.isEmpty()) { @@ -260,50 +283,50 @@ public class DashBoardManager { datasetList = datasetRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); } else { datasetList = datasetRepository.getWithCriteria(datasetCriteria); + for (int i = 0; i< tableRequest.getOrderings().getFields().size(); i++) { + if (tableRequest.getOrderings().getFields().get(i).contains("publishedAt")) { + String newField = tableRequest.getOrderings().getFields().get(i).toCharArray()[0] + "dmp:publishedAt|join|"; + tableRequest.getOrderings().getFields().set(i, newField); + } + } + } + if (tableRequest.getOrderings().getFields().get(0).contains("publishedAt")) { + tableRequest.getOrderings().getFields().set(0, tableRequest.getOrderings().getFields().get(0).charAt(0) + "dmp:" + tableRequest.getOrderings().getFields().get(0).substring(1) + "|join|"); + } + PaginationService.applyOrder(datasetList, tableRequest.getOrderings()); + datasetList.skip(tableRequest.getDatasetOffset()).take(tableRequest.getLength()); if (isAuthenticated) { List roles = new LinkedList<>(); + roles.add(UserDMP.UserDMPRoles.USER.getValue()); + roles.add(UserDMP.UserDMPRoles.OWNER.getValue()); dmpList = dataManagementPlanRepository.getAuthenticated(dmpList, principal.getId(), roles); datasetList = datasetRepository.getAuthenticated(datasetList, user, roles); } - PaginationService.applyOrder(dmpList, tableRequest.getOrderings()); - for (int i = 0; i< tableRequest.getOrderings().getFields().length; i++) { - if (tableRequest.getOrderings().getFields()[i].contains("publishedAt")) { - String newField = tableRequest.getOrderings().getFields()[i].toCharArray()[0] + "dmp:publishedAt|join|"; - tableRequest.getOrderings().getFields()[i] = newField; - } - } - PaginationService.applyOrder(datasetList, tableRequest.getOrderings()); + /*CompletableFuture future = CompletableFuture.runAsync(() -> */{ - recentActivityModels.addAll(dmpList - .withHint(HintedModelFactory.getHint(RecentDmpModel.class)) - // .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) - .skip(tableRequest.getDmpOffset()) - .take(tableRequest.getLength()) - .select(item -> { - item.setDataset( - item.getDataset().stream() - .filter(dataset -> !dataset.getStatus().equals(Dataset.Status.DELETED.getValue()) && !dataset.getStatus().equals(Dataset.Status.CANCELED.getValue())).collect(Collectors.toList()).stream() - .filter(dataset -> dataset.getDmp().getUsers().stream() - .filter(x -> x.getUser().getId().equals(principal.getId())) - .collect(Collectors.toList()).size() > 0) - .collect(Collectors.toSet())); - return new RecentDmpModel().fromEntity(item); - })); + List dmps1 = dmpList.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .distinct().toList(); + recentActivityModels.addAll(dmps1.stream().map(dmp -> { + DatasetCriteria datasetCriteria1 = new DatasetCriteria(); + datasetCriteria1.setDmpIds(Collections.singletonList(dmp.getId())); + if (isAuthenticated) { + dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1, principal.getId())); + } else { + dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1)); + } + return new RecentDmpModel().fromDataModel(dmp); + }).collect(Collectors.toList())); - recentActivityModels.addAll(datasetList - .withHint(HintedModelFactory.getHint(RecentDatasetModel.class)) - // .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) - .skip(tableRequest.getDatasetOffset()) - .take(tableRequest.getLength()) - .select(item -> { - return new RecentDatasetModel().fromEntity(item); - })); + List recentDatasetModels = datasetList + .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) + .select(item -> new RecentDatasetModel().fromEntity(item)); + recentActivityModels.addAll(recentDatasetModels); }/*);*/ //GK: Shuffle the deck otherwise we will summon the DMPodia when sorting with status @@ -322,7 +345,7 @@ public class DashBoardManager { //CompletableFuture.allOf(future).join(); // CompletableFuture.allOf(dmps, datasets).join(); - return recentActivityModels.stream().sorted(this.comparators.get(tableRequest.getCriteria().getOrder())).limit(tableRequest.getLength()).collect(Collectors.toList()); + return recentActivityModels; } public List searchUserData(String like, Principal principal) { @@ -383,4 +406,38 @@ public class DashBoardManager { return searchBarItems; } + + private Set retrieveRelevantDatasets(DatasetCriteria datasetCriteria) { + return retrieveRelevantDatasets(datasetCriteria, null); + } + + private Set retrieveRelevantDatasets (DatasetCriteria datasetCriteria, UUID principal) { + QueryableList datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetCriteria); + if (principal != null) { + UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal); + List roles = new ArrayList<>(); + roles.add(0); + roles.add(1); + datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(datasetItems, userInfo, roles); + } + Long maxDatasets = datasetItems.count(); + DatasetTableRequest datasetTableRequest = new DatasetTableRequest(); + datasetTableRequest.setOffset(0); + datasetTableRequest.setLength(3); + Set datasetsSet = new LinkedHashSet<>(); + try { + datasetItems = PaginationManager.applyPaging(datasetItems, datasetTableRequest); + List datasets = datasetItems.toList(); + datasetsSet.addAll(datasets); + for (int i = 0; i < maxDatasets - datasets.size(); i++) { + Dataset fakedataset = new Dataset(); + fakedataset.setId(UUID.randomUUID()); + datasetsSet.add(fakedataset); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + + return datasetsSet; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 40b301685..b96934677 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -88,7 +88,6 @@ import java.nio.file.Files; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.zip.ZipEntry; @@ -157,7 +156,7 @@ public class DatasetManager { List datasets; try { datasets = datasetRepository.exists() ? - datasetRepository.query(datasetCriteria) : null; + datasetRepository.queryIds(datasetCriteria) : null; } catch (Exception ex) { logger.warn(ex.getMessage(), ex); datasets = null; @@ -186,8 +185,12 @@ public class DatasetManager { if (principal.getId() == null) { throw new UnauthorisedException("You are not allowed to access those datasets"); } - if (datasetTableRequest.getCriteria().getRole() != null) + if (datasetTableRequest.getCriteria().getRole() != null) { roles.add(datasetTableRequest.getCriteria().getRole()); + } else { + roles.add(UserDMP.UserDMPRoles.USER.getValue()); + roles.add(UserDMP.UserDMPRoles.OWNER.getValue()); + } authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo, roles); pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); } else { @@ -215,6 +218,7 @@ public class DatasetManager { } public DataTableData getPaged(DatasetPublicTableRequest datasetTableRequest, Principal principal) throws Exception { + Long count = 0L; DatasetCriteria datasetCriteria = new DatasetCriteria(); datasetCriteria.setLike(datasetTableRequest.getCriteria().getLike()); datasetCriteria.setDatasetTemplates(datasetTableRequest.getCriteria().getDatasetProfile()); @@ -228,7 +232,8 @@ public class DatasetManager { List datasets; try { datasets = datasetRepository.exists() ? - datasetRepository.query(datasetCriteria) : new LinkedList<>(); + datasetRepository.queryIds(datasetCriteria) : new LinkedList<>(); + count = datasetRepository.exists() ? datasetRepository.count(datasetCriteria) : 0L; } catch (Exception ex) { logger.warn(ex.getMessage()); datasets = null; @@ -254,22 +259,22 @@ public class DatasetManager { return builder.and(builder.equal(userJoin.join("user", JoinType.LEFT).get("id"), principal.getId()), builder.equal(userJoin.get("role"), datasetTableRequest.getCriteria().getRole())); }); } - String[] strings = new String[1]; - strings[0] = "-dmp:publishedAt|join|"; + List strings = new ArrayList<>(); + strings.add("-dmp:publishedAt|join|"); datasetTableRequest.getOrderings().setFields(strings); + if (count == 0L) { + count = items.count(); + } QueryableList pagedItems = PaginationManager.applyPaging(items, datasetTableRequest); DataTableData dataTable = new DataTableData<>(); - CompletableFuture> itemsFuture = pagedItems. - selectAsync(this::mapModel).whenComplete((resultList, throwable) -> { - dataTable.setData(resultList.stream().filter(Objects::nonNull).collect(Collectors.toList())); - }); + List datasetListis = pagedItems. + select(this::mapModel); - CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> { - dataTable.setTotalCount(count); - }); + dataTable.setData(datasetListis.stream().filter(Objects::nonNull).collect(Collectors.toList())); - CompletableFuture.allOf(itemsFuture, countFuture).join(); + dataTable.setTotalCount(count); + //CompletableFuture.allOf(countFuture).join(); return dataTable; } @@ -1079,7 +1084,9 @@ public class DatasetManager { ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(wizardModel.getDatasetProfileDefinition()); JsonNode propertiesJson = mapper.readTree(json); - List tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(new DatasetCriteria()).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList()); + DatasetCriteria criteria = new DatasetCriteria(); + criteria.setHasTags(true); + List tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(criteria).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList()); Set tagNodes = new HashSet<>(); tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "renderStyle", "tags", true)); tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "rdaProperty", "dataset.keyword")); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java index dad3924d9..96eae1dca 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java @@ -31,6 +31,7 @@ public class DatasetMapper { if (tags != null && !tags.isEmpty()) { DatasetCriteria criteria = new DatasetCriteria(); criteria.setTags(tags); + criteria.setHasTags(true); List tags1 = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(criteria).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream) .filter(StreamDistinctBy.distinctByKey(Tag::getId)).filter(tag -> tags.stream().anyMatch(tag1 -> tag1.getName().equals(tag.getName()))).collect(Collectors.toList()); if (tags1.isEmpty()) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java index 0fbf92ce8..d2345621f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/criteria/DmpCriteriaMapper.java @@ -45,7 +45,7 @@ public class DmpCriteriaMapper { public static List toElasticSorting(ColumnOrderings columnOrderings) { List sortCriteria = new ArrayList<>(); - if (columnOrderings.getFieldOrderings() != null && columnOrderings.getFieldOrderings().length > 0) { + if (columnOrderings.getFieldOrderings() != null && !columnOrderings.getFieldOrderings().isEmpty()) { for (Ordering ordering: columnOrderings.getFieldOrderings()) { SortCriteria sortCriteria1 = new SortCriteria(); sortCriteria1.setFieldName(ordering.getFieldName() + (ordering.getFieldName().contains("label") ?".keyword" : "")); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleService.java index cb2c2d0ee..5b664b36a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleService.java @@ -9,7 +9,7 @@ import java.util.Map; * Created by ikalyvas on 3/5/2018. */ public interface VisibilityRuleService { - Boolean isElementVisible(String id); + boolean isElementVisible(String id); void buildVisibilityContext(List sources); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java index 61435c407..dbd00ed5b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java @@ -16,7 +16,7 @@ public class VisibilityRuleServiceImpl implements VisibilityRuleService { private VisibilityContext visibilityContext; private Map properties; - public Boolean isElementVisible(String id) { + public boolean isElementVisible(String id) { if (!this.elementVisibility.containsKey(id) || this.elementVisibility.get(id)) return true; return false; } From 6bc5aaed25fdba1be1b6acb3f88328b828808721 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Mon, 16 Aug 2021 18:36:10 +0300 Subject: [PATCH 058/156] pt user guide update --- .../ui/dmp/overview/dmp-overview.component.ts | 2 +- .../src/assets/images/guide/pt/Picture1.png | Bin 0 -> 18838 bytes .../src/assets/images/guide/pt/Picture10.png | Bin 0 -> 12712 bytes .../src/assets/images/guide/pt/Picture11.png | Bin 0 -> 5697 bytes .../src/assets/images/guide/pt/Picture12.png | Bin 0 -> 39372 bytes .../src/assets/images/guide/pt/Picture13.png | Bin 0 -> 40794 bytes .../src/assets/images/guide/pt/Picture14.png | Bin 0 -> 40908 bytes .../src/assets/images/guide/pt/Picture15.png | Bin 0 -> 12100 bytes .../src/assets/images/guide/pt/Picture16.png | Bin 0 -> 7898 bytes .../src/assets/images/guide/pt/Picture17.png | Bin 0 -> 59427 bytes .../src/assets/images/guide/pt/Picture18.png | Bin 0 -> 22967 bytes .../src/assets/images/guide/pt/Picture19.png | Bin 0 -> 7378 bytes .../src/assets/images/guide/pt/Picture2.png | Bin 0 -> 4361 bytes .../src/assets/images/guide/pt/Picture20.png | Bin 0 -> 28140 bytes .../src/assets/images/guide/pt/Picture21.png | Bin 0 -> 6883 bytes .../src/assets/images/guide/pt/Picture22.png | Bin 0 -> 17351 bytes .../src/assets/images/guide/pt/Picture23.png | Bin 0 -> 15994 bytes .../src/assets/images/guide/pt/Picture24.png | Bin 0 -> 16120 bytes .../src/assets/images/guide/pt/Picture25.png | Bin 0 -> 10643 bytes .../src/assets/images/guide/pt/Picture26.png | Bin 0 -> 1966 bytes .../src/assets/images/guide/pt/Picture27.png | Bin 0 -> 27001 bytes .../src/assets/images/guide/pt/Picture28.png | Bin 0 -> 29843 bytes .../src/assets/images/guide/pt/Picture29.png | Bin 0 -> 33187 bytes .../src/assets/images/guide/pt/Picture3.png | Bin 0 -> 18838 bytes .../src/assets/images/guide/pt/Picture30.png | Bin 0 -> 28670 bytes .../src/assets/images/guide/pt/Picture31.png | Bin 0 -> 43408 bytes .../src/assets/images/guide/pt/Picture32.png | Bin 0 -> 16906 bytes .../src/assets/images/guide/pt/Picture33.png | Bin 0 -> 16921 bytes .../src/assets/images/guide/pt/Picture34.png | Bin 0 -> 49926 bytes .../src/assets/images/guide/pt/Picture35.png | Bin 0 -> 105311 bytes .../src/assets/images/guide/pt/Picture36.png | Bin 0 -> 5553 bytes .../src/assets/images/guide/pt/Picture37.png | Bin 0 -> 58600 bytes .../src/assets/images/guide/pt/Picture38.png | Bin 0 -> 8602 bytes .../src/assets/images/guide/pt/Picture39.png | Bin 0 -> 58624 bytes .../src/assets/images/guide/pt/Picture4.png | Bin 0 -> 10433 bytes .../src/assets/images/guide/pt/Picture40.png | Bin 0 -> 63063 bytes .../src/assets/images/guide/pt/Picture41.png | Bin 0 -> 45271 bytes .../src/assets/images/guide/pt/Picture5.png | Bin 0 -> 41716 bytes .../src/assets/images/guide/pt/Picture6.png | Bin 0 -> 5877 bytes .../src/assets/images/guide/pt/Picture7.png | Bin 0 -> 32959 bytes .../src/assets/images/guide/pt/Picture8.png | Bin 0 -> 8657 bytes .../src/assets/images/guide/pt/Picture9.png | Bin 0 -> 47630 bytes user-guide/UserGuide_pt.html | 960 +++++++++--------- 43 files changed, 457 insertions(+), 505 deletions(-) create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture1.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture10.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture11.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture12.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture13.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture14.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture15.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture16.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture17.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture18.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture19.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture2.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture20.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture21.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture22.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture23.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture24.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture25.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture26.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture27.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture28.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture29.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture3.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture30.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture31.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture32.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture33.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture34.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture35.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture36.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture37.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture38.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture39.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture4.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture40.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture41.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture5.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture6.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture7.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture8.png create mode 100644 dmp-frontend/src/assets/images/guide/pt/Picture9.png diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index e0b8b7950..6f69debc0 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -504,7 +504,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { maxWidth: '600px', restoreFocus: false, data: { - message: this.language.instant(message), + message: message ? this.language.instant(message) : this.language.instant('GENERAL.ERRORS.HTTP-REQUEST-ERROR'), titles: [this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.ZENODO-LOGIN'), this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.USE-DEFAULT')] } }); diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture1.png b/dmp-frontend/src/assets/images/guide/pt/Picture1.png new file mode 100644 index 0000000000000000000000000000000000000000..df300831d2e3ffce6fa9d796fdbc31970d442eba GIT binary patch literal 18838 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 XWLcX=BCjWbE~QOA9(Z@2Yh?C6AZq_8 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture10.png b/dmp-frontend/src/assets/images/guide/pt/Picture10.png new file mode 100644 index 0000000000000000000000000000000000000000..2a12e8c6752df0fbef5b0a7cc5a055791b6a7e94 GIT binary patch literal 12712 zcmeI3RZtwk_wNG%LeSv81h>T<7IzO2+#y(SXK{B4?hq^_K^F;&yDmeVZ3B}G}Sm;U6X!O_uPj%_44 z6)zo0!YeUmcy+r;h81<(BJ-$4O&#T?m6o;YEkTrfXA&j{SSxMW(F4 zmSUmr*C&ZnU!}rLLjQIom=VfBa6jvzRxxLmAnOvwYa+454SWwF8nFD>9cRhSYAy#M ztwfuWYPG0|(X>O=~=4H92syK6Wqh%$#a2;DIRX-mLf>_lLLn zYz(}X$|fU;ADhu)%E;@ZO+tI3IDOXT7`k-Ov(iznC-AU0NXreQn6Ku(_L~2OEtFnK ztIGk%lIWBo!AU>* zm79i=vJ&^*(Mouw?DF_8$HC4jpvQxj2N%;D_VR`nWsyR_rc^%(kq9?Q(&XXIZ?k;4mz+#*F*?$vlKiW{`+D zclDs{JM(YC4W2^X+t@%P=JR@?l+`%j~g=Q@m zRT&!u*f`N2_ykgJ!RliJ@Dj|M0-0i{79h7nSLRtw5yhO;JV3UVrE))*yEAjy88iKK;{Nf6ppt|fwK;5_R9tUc58~b&+eVw^;2GQROoNAek&$Q<<|ON&=^ZcVdc$ z<`}u)IyGY;M{CF$1~wih5IJ*j!M8y|YkvoUmrUAWZvqA+nC>uZF0a$3EN+%Ibl;5mxKzu4}fWxPPpT(_C z!GJ!Z)X7pL{}c|QAc4%$g=MH_s-DRRjF({iVL{Za%{#;X>w&)hV&MbXQ3|4hbh1Bg z>r0C!shVy=iwk`^PDq#5Z!@nW*Gn*cTQ3@cq~bt|i`mfov9qZb z^zm{2NKbg{A9+%h4wMHUdrwMjie_WhP$ISX0VPgd8*JfZgy%BkFd{^_RL$*orcm5X zGFw)Thfs?Aame-1`Qm+HA_J{CTwWOL_A4L6F7rBR-eBZ%%h1ttEYDtS-dfmmspFha zWzV8mKYxwg$WjF9o9#O9lhRQa+6YLX*Of`YxM;PyPtx(98*;ZBDJ%f&7d ziY(bvKjzB;i@BcQv0Viw3(DY0cdmx7Ut?d`;#ILgoWdMbXntMJxx; zpFr26JX=1;t>vWIQ9attg$^f$%r!M_-tS9)uS`1=BJmblZV6Mcz0C#?i`ovZuodJf zbUVHt>q-i!&tC*&M|lnI*I}P_G7a@-i|qK!QP29JjE&4cf4R%`N~-Vt@{*ivRgzb% z=hd}i0_=2Y{Ur>irkT@H^yT6F{pIga6sx);8})yxDt-SLhviCD~ghD zavV`{VqjBM8xt=?-1!fgkuuzq7_VX7AO(nG$fgSz^6e|*u`D?K89j<@!;o4$W4EBF z-|Z#n+#RZH)g(2e2IjH$${sLW*R7dIyafxO3Jg{hL@i{`>frReR& zCyR?b)TYs6SwHH@hnz3b)X@t^R*>dSe$?3)U>YFy^7IHHz<`yQw z%Ecb0cV&}e^aKQHo+3#4lD^!dwOa&LNyMc{BihlUiMn*Vt7OC{>G3KA`^v@YAH)!! zMEhdKwbT!cK@C%d!kO_S40v1{lF$343ey2gHrhg1KuKbJw$w};x0w-$tTj@tr+_<% ze$#w%IO;MX<{M8V#@M|o@(wu2?ewT0$5RlTKfk$?(9m*&z~`!ctoNi{rA$NX3s4JB z@l}TwB=WM;9S#qF0WDJ@txR6pv+O_x^S3LyeLIKn3o$WZX5>$lc<)||3K^1O#9qU2 zqUVa>avDtf;Db?cJZ=)D002q!)5Mhb-{y&NDOgIMmM zmOy*$8mC#@8oL>-u3HYIyD<#Z2@+n^S4<}9xi>Vkum8#8DcaFd$b$ISh%N`a-+A;v zuI4dTGFLbr@qjeaO{kt92g`RG?_ESSoB)v4*eBO>e&{0Ug=wEq!s;pz*-4Ru@_HPJ z9LD5?hw+maJf93J<_GN$3 z-sQ(A)9!GsYXFjmTnP{5-?|2iLe&Pz_Q>F-kd}=YsyDaeZ?k(hfa|Vg2e?Gnd#aoa zQ;C*+pBR2G)~!~}Q*i=?Kk}Scsd^D}A&_nkzU6QIrJ?;fiiJ~7u}91` zRJEFC*}maB%bO*MYuBmogPStbZE%$Ue{@GqNrYYvdhN8_J|O<)6|!D0e_YlOe_a$w zV1n383F)x$?Y|G+UjNbe4xiDqn+m8<0bpUC;QSu)ELXST-W#a`cxE|TT#A;?&(_W% zCb2TMw~A$$;@<+8yC5~342OJ`oPDo<(s7+Hu73Capl+nH6&>k18Xs9#SH}}NmRaQ}>@yA?fNa(lsH^gc6sY?H0YPpsAkrR)9mUn^GoWq)n+BDpH z$1THN&EK6-e{*4YH}PZK7k@eB;c5-gb6uYhHQoMj)Eove5=9g z3O!)VIfkOH_?T6H?TM_ElpB``X_fWCcSoa}HpDdVO!0St&59(Ni40rF#oecn0Y^~3rXoO!amuqKaAJXb^1fV7{S+7}f+f4NuIYVxI@+keq+Zun;~AvK?K>b0i8q%>^pV8Hl!At@T&#bxC~K z`?KV5|cUD-q>I#n->QN56ZM249?hxtF{rVuapY!$Mf=$gK zxKnr{TSOsZ#cyej;4svyx8B^}juUb6bW2Gh-My^XXLU5v&TrQhm^VyFb1X?ZmZi!(?wRF&C`P)(x2{3Isiy z7D8@-sxp}V0{Uo<2kq2J8V2IeEtVs(D?0h@R*R=CWC#|O%(t-O7SA}_{Rs5=^cJPi zH2s5wY}}&QeW*=|auWBX#PFjZiqZlUY~r(`BsMDMS2KRL4P9Ewoqecdv{a*L*~jZA%!iHaY1DQ3kKH@IX)-d`Yz6$+os zlSia)buq^M*Vz5VFhV(|`evp;_aS1gy17<@x}=e^^Lf~L4zZ5R0HoRR5(l;G zvsJ3%*U1E~rLR|HuWl%3>r2lHg-ZT>)fd`Ta2WPfYrczb!Vue+Cv?&0$iMiB&{r}o zt^AG3gtf@b;@UZ*)Z=R1{n|uHoQY`$H1EveEabzebIF6cfApjKmDOc-;pM6?j1gg~ zv4+)SL6p@8jg17KQ+jvjm)Cqg<{Nr)lvrMt!s8Va<8Yp`$br->^mNkd=2*FS|Et3N z^+ueoL)OJkv!!g{22sA^+ZEAkVh{9zBaL`1jO05QoJhNmpd5s9V6CWkj^hJE+Zx*` zhBzaSSk5=^`yx=)*(L#b8RwH*fj?MS*#vpVrOpBZ@+y8dm)|@jR19tA9Nd+=mLji- zTf#v_g7u)2LePB8Lp-ZakNTqaG2w2@R|eZvP&6!#aBtB(y1((8SiZtj7cn`idgIxm zFzCe=_5Iw;Vif_H~`p@Wj@Q|0C6nM9EE_)o7#?YC!0^L*hdL=hHX* z;5KEMKO1YA9E06o&+kb%M_V+J%-$!2Jgy+`v<;L0#CiUefGmDVUCh!2AUZ(}>x%CW zh7PW&?$mzz{9WWEi|;yrL&BZ8i}Js}kN<_#{C~6m4PE_r6Y|jr$#yG)?)^_vqrSL0 zgdLui`)Gdl8k+Ss12YRu3c`k2ZVmn}*+NkIk?Cha2&}At17}#_8S(@A+#uUXRTz>~ z#IXK@TARyO51?#Jq&~W*5R1;w;lO(}5SWOKS8IM-tWZbaD5whv!Z#{el~*9a8V1?88KwuI5*8=n`WasD8kx2pfgCQ?r=31M<@9n*j|Hi!ZDV{(!r~*Tc zA!ym1wRkoMZ9{JpxAkS-`dA%>;w-oYkn&*Qh}te`$W73Eq@;?A%l;v0AL?;|MHo@C zIs7hNK}{jDa#+|G?W|7|@PNl!5|k-D;e&HWJcl8~$oSgmm#pRPOt}6pK9qZJ>b}vH z-G66t_#y$hA?kGa(^jAGO&^7c#1t5Ey1?zF5$p;Rnr_6J`ngeJ5VLNVU^cqtoX~5_ ztEWs`EZ*07xR!LtoVY8pUP>pm5@jK z6iNc_3tZVB#FTA~-^>pVX{OZ6)3RkqDe;WbDU=2bQMrykzgB*%k-B|amE2)f+B1^j zu0%0rd^*kLS2)>&c}$lq+AaH?M?-H1gV%Q`#3ifAsf!=k+NSJ3k&6Tu#$@(wo;E_q zE#5Ntx@oZ*29PGJyXWiPJhqSx{`o}}=cDp_Eitm3%l6P^1O3lAc&FRrA?)w^hcm2^ z5rM4McZwG>i{Av8jjpMg&7P@g*CmP_AA|dvZg82GeEC_W(U2A`Qgwmucd8!`9AfL6 zx}qKa1dj?ov-P$k*I0LDfoded-E8WA@!wk~<*(tC^KwQzOh12h?0b$2sg>RhdroyQ z4zDk$RWihp33%;*LP?SrId57Jz2r<5NE=+XoGHiOP<=Pe&H$tuTCC8;X492QFa2CW-Q*YExNXNcc zytSK6@LSh-*G30pUUaIX(EqDglI;|RLD&WVtteBetDFhm7WGE1KkBIN<0ATalcBia z6Rt7rIcBD%`K#|P@37&6z!`}^q(e^zvl&}hneY7L+wG^|^mDm<%qJl6Eh8bjAO3F8 zaj|Po*<~AfjlsO)vJP{aXN?@~I@x@wXHtycKohgcIq4`IS6I-~9wObXsUVkbGPE%Y zTN_B64-VOvg?fF)R*1f`nrcI!TpWlKA5xPh2`vKcWQ~}DoVFE8(y}u_CSc| zQPuu1Wi?DdGK<6dj{8FHAn*i-{`ogKgUWuf;|8{6BugWkERYbrHEfr@z}`qhVz>C^8Q}4zO1l} zsJNCmWwOJtA9y?A5ZXIZog#5&3Juc}y7sU?1tV2_+bOY4ehb};yLO$$-sFgff&P`Z zEI?@}4Gbcgfk1v5VSZ}P$8<*&Ws-iuZH5t_wyp><+}sq0=Q0@ zn0(ACkfT@0BfR))dRCn;@h;UV$^w?q1~B(ZKUokEChW&N)Ed&b+?WjC8ac^=OfZd( zi12(e8;^g<-)#{y=gz(=KhG<+^H$gjoTFTP?V>ONYkJ3F@8eSyx~{NCvw4`QNVbO0 z5Wg31?Gm%ua+o4m!cbpWow)3C6voyo*iKwTa-u+8?cRTn^m(2#Nr}Lxq`lGcmEMb;uo$>@vY>~;rV*U z(nnJwv=`*VLB#;$H@c!PF@I{06dlD_EY*Pr-DoX_$^nlTsGEhkb^6>6zmC}3$>GK8 zvwUji_YOY0X@G0>vo3Y~uyQ$2EYkhiH3*zsuWo0iLgBr!c#1({dddIZ6l+ zwv|W_vx$-|Mh<<^CJg7dm@In7EgF);W0N!~?tgoSMic|!Mh`8hC2}xOku|^+U5fp4 zz(M=qK(&Qk8GoQBXE*sr{%WcfJ+KkSyD`Jl>9d6q%y7XY7@IOseJ0M!=5M~>z#Y!d z@a5}$+5;9mm-D|1tD^-jUt^vWk8_91x{JO?=J%*Ft;uzl`|Aq-C&=xQk{{f|bLuR8 zH&1^sb9f7L+wR!8vzX?jGG+<@oFs@hl9XlUYk6MMG%K3A;y@1+pQ*e6IvQWc@gN7k z(j|7)ngGb!R(YU2Fx1DFK)9foK{(%SXEc`P-@&BsbKopssZFglTcEIQH5jM5`IydX z{n{)fIGhclQgs|E-h}tNf|yn|z+f_N*tCPHrSC{GNq=Ju;VkEh$bxD_~X@E~}|TaF5U?6mb`0b2| z4H;qEI{o!0uMe#bEglkC#6?7|O0k&9VmzpNX19eo&|FcbsaRpbmdNdsrHtgPp}~?% zhkMt_5GUWWM=`~5VV^ha`-Ck#b$pG-EF32}D5@%L^kvQS+0Cfm(0-G|KOiZ?FzZ;( z#tEp9l4t9eBoA(m>zZMQ3u}k+2cOMk2BA%OciH+Y%>%hw{VvOlx=m>AtAX#hsc~e@ z*P<3yj^q!H-6)V-|44s# zz_RuF3$Ke~9{BN&L-JCtHGR_M4t9nuV?U*-IlB+59}I#^wF)aOc#mhojQ$T zVt#3`62|E`B^3~?iA}t8mao(QlaEUe3gmS+bBHQ2pe_Z8BNNHB46k+)($s=1jQ<6$ zIQQbYCGr*$r*!%9x|`a^_5PqP0nuO)G29L>*HgYJ3^rbNcPnmNi>gtQ@*&;tN(@#5-x$sn$JkyX&gXU7n075wB}ztUqaLeATz!s&I9&57QtaaaKE*AE%jDHq+#laJ&g&qy*V|+ z3c|NV!`nBO2*3<$%Qo1pKhuh!S5JYfsR0ND;o4^bR>nSz7;(yYXYK@`JdzR97Lj>pBt->)WLZ;88wFQIioQFZkMMQNftn0f>6*)>(`?XYY_S)C~ z3D)Mdn>+?)jGF8FQ-pwWaq52fV`j0o3G>mI;ciCOMRVW;`yX32eS0{CXeS z()X0N14=th(#{vIlag&KdrcOc+1F8lIfwU_(}yi&jGka`kt2Ug4Doak?+hLDmS;^* zDj`hFc}i}3mJ8ce!w8>FV;66@Q<}$p`&M+#Yn!k4=Rv*~O}94z2Lik3?y7#c`_0rc z2-}L{`S=FNwK*+@3LBSizerM^j`XR_!^p8u1xr?N7~-{$*?m?De0gjY<1L8GJb5aGQ;0)h{Oob0%9R-`e5IB>-Chqc4eX#3wg4|V1R-TkyES=WC+E@SSDd;bt{o;w| z_vdT=yJsgnE#74hx-rCfvL1YpxYX4HHccwxM~AV!Jg}c+KGwK0Lj&XkUj+N(b>_8F zs0c>nkT`NMh_kPM|IWu}51K(giP{(Mj+vYj;kJ#A6uGI5A1k!)yqNlRDX54)Um=o0 zo9PvF^15P7-h&cmqSJ8Q%!6Fs-SOJQAqm`ZE#m>~5Z|;WY^yKG56sGV!h=4oa>{*j zc;_pG>W{-nqrPm(12+AFH?I+NKem=KO=dTJ%|z#o;k&(qzC5?XmT+eu9b2LD__rSM&&qAlZpMQWt+RnpgRHItpMM$CN$1?;Q9Y*)x%%lB|K59dO>% z1?gUXGcK4Se(zbWzsWnPSTO?K>hQ_RZGz`*Q^p04rmv_wUefY`bKQz;{l&_2Tv6223tl#OU^Bu|W587x_`(w;I#5wY1bB@hI68g&yOpr`?SgY4@H z9Vo`7hk7>w%iaVUHb9&~>~V!n*js1KU$^89nS}vfuDu7Z z=+;@>+0A+osQGEy5fw$b&a1K|F~Z*hzaP`zjITy7WUCSqW|n;Y+ONM~B==Nlwq6alGA)yg8^=ckWDvbdSq#CT>`U z%B0mX2?0(4n81?O@;}U~?g9_4VU^&bx4s8WEjCyOcqiXuMb$vJ?hoF^OvD9qc}`m? zdI;s*T5k0SkM`3*d&t|BHKw9$8z473o5ZcIR>QZ_sV11d z=OKt#?T8Fan{*^FpKJ!;BUxO$;-o6Te#%$(-3tKX?ArfQb|0S?W2^xhUpqD|jd#A; z?=?HSH9(A3y+blvy1;CIy!C_B<)BMsCS{{E?{}pVYXiAfHlbz4V+L;MO@D)(o_0LX zc*tJQzmw`@04#^njb#5ic}4E|*b|fQ>@KNDdlX=fMJ^#Ur~1V!$cCKU>mG01Peal* z+n)e$Xr6y5FkHz)r@JeAECD$H6hL%TwZCexy+}81@EPse$H&g|n&d{;*u`*X4I|*3 z`Mq-)9?#GKA#YYLv~M&acsz52SU<2#qF3wT!`7(hL}N5j9&G~5s2T2KH{$@>^SMQO z{nSa?a?3D0$}*^O%&9;H`BHtaCi^%ck)31N+V^SXjtlQX@cZnBDBlq`z{l$jP;jp? zw8yTX_E6^{sIpqhWi=vIrf8(1IxbjqHojRO%nQy^;x$E4ZT8!wT-&{=!mEpZyoYmr z8g}>G=fP1M*b{I(5kAUvbxG6wcf0Nzz~@MW^Bl(y-;;KB!%DKQ8hpArhQM#47rYO| z4&t8rfm94z2YjL}jtt!VlL_H^ar`E~Xs}e~s0M$9kP>D=v)p;=4@BQo~`v*r`26E>`JKm05EWQLM3}_rLETX zDD$!lYdmsFxpkD-3Id_XIp}>YS>JjNu0Dc}jzXNwu;de#qL7Y(Qu7F#l0T(sYX8ob zu{;huVy(!tDwl;-AXG2Zq%bG+;q4kthu)jAUq2Bzhvc+}o&L+n&TFJUswv(#ZJQ`M z%qyZiAuD^kkZ7B1Y<&=WE1sJ0QqPj-lGUW(rUX-ElNxqUC-jYevM9jf$N&VypFS!0 z`7z#WhjJk3C0h1<3F}R%|HWv_EHDT09ZD zOj&zF%FpPY6hfGZen|?jptNau*#j!WIP*L)KD_Zeb=ml!w6V2B2B+pwUWoLB&cPrC zl1F}?@CkPrUzZFDTV^IQQDxrWR&lK*K1svoImP3})fnL>hU)s5#oNNm(FW%DL~r+> zrobiAq&eE*Z-K!gYEZ1}(bHdNi~e7z?>a$m3hp!{@a8`Pd8$v()Hc+eyVR0)(k;DZ zIR>dmd*iYLK4s)nnr>xemUa(CQ;2h#Cs}z!wX;~ZpO<+#u@T>d+6)IF_z5|(6H~jz zn6a_tPj@bdsd@3qlD%aoX9e1Q`X&B%WTpY#MMlEB$cA;1p^Dv zb5i_Nk1wf($z<{2i5WZ4YP)a)$i6F1FjY{Ft68 z@SKaB`9HPwY)RhYyIL+SvYMpm5RrNYXd?u->ujlEM}iG zwBM&!4DH`8tIzu~hRd#$80}EX7mOC)5T=VqjjBMnKmwx(=ec^Tv%VJ@buuyYE0uWlvn$!SSMd_!i0j+{7Bje34EATAT%P@y=YgeZmG2?wsncJQT z_Y2Rg7?}cY2bGg8+(=*N-kd%H{O7~ZZ9epMv|W)ZpC@P z7;eid;D@-JG##A*?h_%CV}niarI2LIn@(lqr#1o)R>G4hu$ZC^ zVT{T!AUk@#f>^|M@oiRQ?nRDkZipCh_S{v7{tUFAGOe@jJ0Z;m3%U?#GGf)hQozgi z<%yBbg+$*hZPXuDE@`uD|MC z>2%J&#~DgqoElcK*DG#=$Jj}Nhy`_7@3(i=YM{z;G3~E;k7I-M4TX-cUsUs1-F)Kq zz+iB+!;1C7?i%uLWJQgWpW+y+g0H18ZR#=&k3m>Kr*Ox+>gXauu1IHIHznbJm#JnM zndzauoo)9*0sQtAO4LEX*SHr&&R5cUzy20>x8GsqhG$1OdZ>Gus~IER)u?fmfXwjx z89Rb9xf|JU8bjDpZC<}b)KTl2)mCcTbboDff|{-<1i@JQ9eFZ=oe&1BX+(!+B!pME zuz6V?Mz~P9@%&Ue{+X3RDl~Bkq?4nZ*wocV`(C~?;~k31#Q9}_*V&fYZ`gu_=^QExF(R4bRiBTyQqOGSFb#*76v4|uCT z>x5n67=LbcaORsE{CkP<(*;vMJJ61JZ|q;Bd=PH&Zho|;%TD;e<}>UAHSvFCLItVy zT4R3=UcUCElWxoeItv4-T~yg*Lsu#lqY|p5LAUdf^8GrosmM=Pw#^~JXySPb4A|^3~TDT}Qsvkv<@~2nO zvx}d`0MOv+22wJiw@dg}G>n2sO1D4ICquHbM_l+hegh$>< zf`v=i<2G2*`?cOBw-Oj9mp}0vB5PW^*)!H+6e)BeeQ^W^kEVIHzl=LY9LpDPG#6LC zo!rvCo{!4W^9l*WR^}Z1UFR6k&Pk=ol!(jGAtf(F1^wbWJpUB^_=cHm%sNBIPf;+Fi>_uIi86rx#5- zd9=O8$^!J>s2piaVED#%fM>fj)Kad6!n(QhNpE}6_FMTs1&!6%-jY3d#+L|W5*xXl z%~R}Hn`Rv~JQmck4>HJRWbL*=jbJBN8(ExG`i^mZI&=ISs_-5oiL6ssYPv17hEI;5 zwq!i+$R&Mo`<(sBz0g+P){>Rp3T}Z!mSthwDXS%s?2>Ck zu^uL@2sz}&v+lv_mvwDA@KpEMF_wWDIM~Kfl#w15z#)>WM+p$d&Y;wK@ fBD9y&yXWY1UL)n}v!$2a6|a=!)Maa=&BOi+b_d_= literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture11.png b/dmp-frontend/src/assets/images/guide/pt/Picture11.png new file mode 100644 index 0000000000000000000000000000000000000000..a343e526db07b72e9b557113ccee2811993f4253 GIT binary patch literal 5697 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 O40#!4=}JjM|NjA1KbLv{ literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture12.png b/dmp-frontend/src/assets/images/guide/pt/Picture12.png new file mode 100644 index 0000000000000000000000000000000000000000..bebc361458e25009a9f700258975e47da2080738 GIT binary patch literal 39372 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Ξ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 LRsF1N7x#Yvkn>4^ literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture15.png b/dmp-frontend/src/assets/images/guide/pt/Picture15.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa855b8f6364ce72b87971393207c70c46782c6 GIT binary patch literal 12100 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture17.png b/dmp-frontend/src/assets/images/guide/pt/Picture17.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6f8ad7094d14561f8889291891c57519e685ea GIT binary patch literal 59427 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture18.png b/dmp-frontend/src/assets/images/guide/pt/Picture18.png new file mode 100644 index 0000000000000000000000000000000000000000..08f903a0c52143bb07df3cdca31477c2115e12fc GIT binary patch literal 22967 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture19.png b/dmp-frontend/src/assets/images/guide/pt/Picture19.png new file mode 100644 index 0000000000000000000000000000000000000000..c350bf0bd7392da88caddd132bacb79b4da24185 GIT binary patch literal 7378 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture2.png b/dmp-frontend/src/assets/images/guide/pt/Picture2.png new file mode 100644 index 0000000000000000000000000000000000000000..eddb0746aa219c4ce20d78898c22814e248b6a0e GIT binary patch literal 4361 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

    TWuu^NurH?x1g{3a| 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 Am;e9( literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture22.png b/dmp-frontend/src/assets/images/guide/pt/Picture22.png new file mode 100644 index 0000000000000000000000000000000000000000..7d79d84c165605714944519ca1a57bdb33afb3f0 GIT binary patch literal 17351 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture24.png b/dmp-frontend/src/assets/images/guide/pt/Picture24.png new file mode 100644 index 0000000000000000000000000000000000000000..9498ad56c543abc10b522cb9669832d86eb6ecfe GIT binary patch literal 16120 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%0At}=Jlbv3JPPgxrm<}I?q%w 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture25.png b/dmp-frontend/src/assets/images/guide/pt/Picture25.png new file mode 100644 index 0000000000000000000000000000000000000000..b99c519006e53dde34763acd9801efc662604f29 GIT binary patch literal 10643 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 GKmQljGWSdX literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture26.png b/dmp-frontend/src/assets/images/guide/pt/Picture26.png new file mode 100644 index 0000000000000000000000000000000000000000..63e1d9f14e000bd9ebad651bae357efd84d8ca49 GIT binary patch literal 1966 zcmdUv`#%$k8^?D_2d?mIDUpI8KfRLcsKw6u>Z=5z{dc9BW}0dy@7{^hhnk# z;NU$nfRZv*0Xf$enf4^*YMi*Kd zjqVc&1iqc^QT=_TGt;ZgZ9bnLh3dsosXQL<6$ZVxw`cODBKaG(XJy$N-u9igB|JFb z?C;kuE$To^ry2BRHp>y#c&oi-oy!r4#Y;OoPtm9g)s=0;6+c8Lin7+ZO0sUKO&u9p z^t=-0ZWVf!+Q665LGuAo|_tNdELBhr_X`t+J@Ee%#-SAg{h2 z8EPObn8{4Wdm-QC@uHFDnuJaffNw zRPWK=f~9Uo4WKIUb8I#nGCNJ$Wj8J_wUdY+CdOGT7EdJny$?y<EYd7I5Ju1)5m=5$kx_Y7@~7?bJM#8Mx)U-Ha5Ikn!>u^e+>^!EiZ?5!PnQ<2N&=$ zNW}TdPit#yu&K${eLY^yU(Ks4RX!F|C=@c8yt=wdrT*(KO1*5T1n4+Vke9?%|K|nB z2I=)m&XI|7^^FAp6wv?bhoQ*o2a+7=x;Z&`hdMHfU{A?bszBcwje;bh{i*W2c>jnX zxbmLi@l(=AQ{JLdr_KxIwxr={`f7u!b*L=$9J?pXiqeR%EA1ADzBC{x*u@}>#b(>) zW%G&2ir4vX=QRU+6Hg}7b*)Vo&r17_*{X-{4wpfSJMIylFVyD!^U5L2LJr~l%?zpE z`>jjOz-A9Bxw)y<$puV$cO8^$Ua^VM^P)7$U#bC^urEBm^LN1mc zepQoOLv3ZN8;3L3Y=@i%u4<=(W7X`8FOB7Z2^B#G5rf$KrIFJ?k3e zpA;OsXB(AClRBD7YAS9T!K`XBqki?q7RdT$ybra~0pjr5wMazdWfh?m20oB=rnQN1 zx-1Mb{9)X3JEu)G$=?o1wB8r%Ovs1KOPhl|4K$7 zcO6?naD#*zI3?65Cf)6~)y}_K^#vsV=ZWk(ZEu&ZtoYuouVs3C_NG>rkBm7mYR-6m z@)$SQ%OJ%wH!|o0)N{x<*jxQ7(A~%cblx?{2;<%i9goxVk_JT=W7~is)+lh82lKL~ zjmPEB$0L3M8FEeiHT8W|f{(U9o3q@GF%wG~yRh66X8cU`Bv+ar`**b){B!QnLFWiy8RCT7C z82(jVVNu4d5I^@&9j$gwLt*2pnPGG~*yJtF_@@8?C*z!RtHv3QH8mS_E@{XJ6KGI~ zm@~QwjO!IL`oR9h#w!-G7k*RCy#}$rqEPoH1#fdLD+aQDn=0$O5_FxAx7C~-Lno&Wq)1XARpHd(agf*cPH zRI@bGw82`t4kkdKAiYc4@^)8W%DyuYYtHa1fXnO#}fgYq&SZ2au* z>=gx3oU^O6LT2i&7Dl7XN#!07gLePOaBDy*Ej;c zE?Hl=aFKzQnsR1Rq&|r9bSMb(^X7*QBuQldRmI?gnW6aUAg;wyhM0?O(l6+#l;7I@ zviFDmI^*(S0@Mudz@v)P%)GB84;Pmh-&r>NT$te1uV5H~QE)O6x=m?1-&i#wG~&!O z;*2A@4yq#~mFkeBS!D9IQNU95Tc(w-yrZ`Mn}iu;>j`F?7qR^<=*@Ve4fACcN|QeN zRoS$#lm|L-J{Sb^UpYU=e7QV?33U9^^R9IfO9|@ic!dFUG%@gAfcCsuwvvhK)hs2@ z;|0$D-Q9ARYVF$mwg0ZCsD*g^?@xZ;SFQQqPyTTUTDLH^=yIR}$<7C)6;$<}k@GdI z>-bMQhp!DNuH;%(o)du3D~KU4O9d&EHf>Jedqhz%v8;7jx9OT0a<@eB z;=jJMH2%CYji-)`>+yLZC~%@^R2^ej%%$d^^*Oj6O(FeMR>ZpAc4>vp0`E=<4`){yQ!JBvwaG+>P~5 zZu6&)X^hKhMxG|`&X$Ug7Y_|@B0kSI$tI7poLw(0$zDKQMxy>SE2B(#4~wyD^{pTF zYDPsC_gw)Mc@>1-u^6=PTm7!UX_!EW#JJ#U1-kjv?_eq3AkZ%JfX199V!1cDy82VO9Wxr7Hp4b=X1r(W zx0|Mv&yM$?f4cr*>@U=bAgxvfb(8L{0Z$JX5w_l+ZI#_?my@<8UC^7eL1!n$`w3C% zQ5uzEZqa`-=mB*A4`*mf{!a?=x^;NA-B05(`oo#DEQ}M>zZv@-r-Jg;v})R)bg|l#*P%gjud$k+ z=2XK+;!qe#KU@R8Oa*mcG;ubtv0YaYRz!x>60m|z_`w!)J2NIvc5~lQ?cS1CRzg28 zLr#4rlX1N2J|m&4ZJk(5qQq2y>Y;5t#1aX8$>wFWX2QSBUYOBe83EAJJ@emgtbUY{ zj+1Qm)D9Xcz!^75g6NYU@vbt>UlXCOrA$=)$^I0Y;eBd@Es{90RW;@261-BolHn3x zq20`J-46SOXRBs0T2>6SKW;x$+Qm0@&!(=z`?r;QW93=_qtrG<-bT{>a0RaT09--d zO_hSzxfXkV;&?D7aG3hk zcO`wy#&0cGFRW}loHofoPd?cOVJYk>Lbc54DLsFD*adPsbzrL>i5W*{lW}fM~uevTQi$iUAJzGY@+#u#*5+F&d-R$v}RJ;zCDEdrG#T4|JhFCseahQ zfI^$$^;SA5*dEi|*r7=k;D!|b3l*t{i=zv)!69m$mSXSTu-loG6jaHeIH6L#k9Dd@ zZ|ai!Ck1ps?Prz$6Fe;}>%7QKu|yG>**APRtb$c&D#ueF-x~(xM4!f^j&trk6`=z2 zo>DZk8{5tIb{9rM++J7tyz`(60mj#=ycDV)=Mq>!1qE9DVDJ%|e*A6j{q2(pC)5m# z#i>jXKK13kr+_rZ;Yd$zW;i{NyjE;2JLl2HP;8rNU6n$hmtVmOx)6SL{E`c2xjN6m zHU=xZQ<@hZsnMqH!i@6$_r>+X(8_d3_Y23eD1&=BI3aWob1W}W&ayO;;d1H1n^Oos z8`=*G4s$uZf8T}5HH)W;HS){8G)o2?tLQJsf-I8Iq)ri}^IKr*c_ zN<-ZDOnpr14k_ZB3`S$jiLtZoXhw*Qx0&vWHPYpxXh1Gs_q`zTIR%gz_bV5=R?jZp zF^5J5PyYKi@ZSYAP zaYO2vf9W_0Ty9hNJK;v$s55()q~$@GF1B{S6x7 zqfhrpakmhq2FOEAWTkH3(Q#`Y=2=*iV2sbHInzm$9!y&Qlgi#_7wPZfLB%xvL^`kU zkJ_w-KQXOBpn?B5H*?+ThTe=9x>Yg`wxJ!V(s(Ai^u7P&B|LbAsDnEDq} z&|#Zw%leP@TMh!u4r*N$K40#@Uj&=`QPp$6nk}BR0xGoYx~Y_@v#(YV(&*{U+1|ag zi?fSV3iRZ%roPJR=n)*zDB?xcbL&~l-n#i0k^EG3y_@(n0eU!9QVMPEUQr(GzR!e} zdZyc(l)ED{@9i$hsoY!&up3Mm$jNmR0kLt`_e#M8an6tT9-O5R4%?-+Qh83ksUcns zntkXo@FOlIzhVMcr9E~jl`cqu-Mynev9T~_AFc3RPntG?Jdq_6@g-Bw0@npZ=w#mo ztE(eP$>|&%$X`Ok?lkeltT4Vw*rS&Hh-~RVHT=fqm!hscqe27l1D*^m% z&Y2%TWC#@MG}YT7{A}@=mph3FFM{rEEGUvk;uscIO_~D5^{oogM@(oJkn-e-@b6P8#{&B?Y z8w1nUvV+kqU9aqYM@*pQCK!Drl`rIt{gc$2&A4BAxPq9nM1A{NrJQCh-8@;W=Vur_RKSh1W4jE&z+0GsfdDgLfkH@1c|z#h8=T>pW#gL3b=;s0GcdTx>*1RO zP~VM>hb08T%^t~92hKCx)V~{`!ts{@J70jA&FgLC_oT;jgy2pt2xR#S-9)Yu5IeiE z;zCS-emzEf;vw41W9}!7i+ptp{8433g}>D-LwY*(5_Hnlkn*{NpAL$;DbC5}1D9ScW3CL09LmA+A071o-yO zU1&6mVKTLW;Zpot#*f#z0swUped=xtar!H=EomutpHOE9h=_T@#d|ZE-DPCD+i&D> zT#bx+7x^Sy?&ZCQ)cM-ex1Jjd6T*c#9#BF2g2zML46%;bhvQ3*k!8IcM33Trn5WyX z)C=Q6za3PnJ*X;iVkIIB2#f1aL|{_QT)#zR<7to_PJ!9+pow+^>ZYFd_YQ+H5kLF- z>1}XrVB8aw%)~d~vw60z0}*ajQK%p-yXKR}_`MhL20Be#Uqi^>_vIL;2B6E@C0+r96< zG$uKz*Wj1>b-DbduDeiW_bZ8NjU1CCGS2?k?UI?(JiKQmm1#l}Ei0|LWFm!}y41!r zsq{U??KSW`g(#BvQE#28}H3663j~zXH!T-&8?;?Le zSZN0*b|l4=?`R|uxS4%2qA@}C-2C$@=$3_*jxZYDA4Rp8q3;zZBf-G>?UbD4_w+E= zGxonV9>BFfg4P=?_(fS1r-GYi+OG8+2+HP{8i?j zG2JmxjxzC^c%Sgfz;Q2^^vS(1Ib8f`HLLlb%Nohf$90;IV*h#HYtOU>homeW3wgP= zRC3*P(E3=hV3P*B_e|tv@PL#eX-)Nd&VygeZ}d@Dp4zg7MYKGVQ5d?-2>B8F_-tr80kf^ZT2-cN z>v;@CYAGq30iilY0c<~|k!te%A59ESGa+11x)sHJ2;T}pB8=%UlJC@n&p+Y8bUzI3 z*PRC)v^?qE)b}H0<7v^dc@QADt`c>e**7s#&G~90aR#5n&>z|(6=i>x%D2BGSNhT_ zKs(U@P2dm)H&HF)1yR`CV%`ZT@@t^)>N8!UitmWp(-SEFyyA%k(794@Do0|9^pvaF z3^WRfs=YafoHJEUY||fubE}bAk^L?iSh-bu)Tw*Fs@u}o8ObbAo#93mErf*0rkK)8 zmalDH4NvXlj!5|n36T9HKB7Z1U^M!+;-Su0@=lT0N#5jR=wfhTHSl*dj(?fWdCeh4 zcHaHeBm+?hxN09$S8l1OUDPZd#tX|Yy+nw4MMJzB1ZlqLc&8kGO(GpLDpkR0)loY3 z2;XHJIL!Fy1K|oq24*Xg;baez-poYjERNfx?+fe)S&ydf+=I+2HxJ_mj%nK{Zg{UdNzNAw5GYqq+lvL_Rt09@;x)sbqz@Js4`?a`>G=X~-4A#+!tq=+xE#9aa=HS2q3v8*VCGPU^%`3lGX85@w&TSFfPeqlFX zrbi{G=N6%-R9#q@X9rB`(mC4``3z}D?TP(mxzOl!J17IcgzFsR3Ws=P^&Zx!?r1q! z+BY<@Uq_Evc$}1T zoal(oUMfDr%2_w^W~R=<}2(Jo3vF^n#9Y7Z82fF+ppKo z4&t4Dov-abt%PNa&-B!ad+6xGZ-)LdE=}*fb>zr1ykO(YqpnqP4vWh+CFI0teJ92z5%b_*@jKkNT@37sZZvXC=X@Y$ED^}@CM1_ zmeeN!XcdvDV>dl^vAAYb*CS7xRNe|VPrXpl8j9nOT-iob~ zy&Tw)_)||U8<&04IDbu;|3t5Bmlv?W`VpTrN`#L&q@08d>P&nJ@Xr3$ zZ1xIdpRKOMEnCPcB!g{*8pHacCIXwyqTyHSuFk#MZaOiG_N)0`K6h${7|H4{;#03F zTgzVw(;6vtZ}VtOPljqI3L`;3FcS4)C;BDbyK&!lG|d=RpahE@wF1um-ldNR;-Z9|hu_(TkhM6uG?KNk1G0`94X z-F$kWan-2_@}nO9XR;nycfw`sS)`H~cz3pwk}++3ssQ)pLN)mbMa2#i+fUBk z;>KVLQbiL4qze-Iq;wQ6m~ctM=}Lx))vb_rhc*@^~CgkFeSXBi!SwlK}-h zU?g_R7ni3*jDzw%_LJ2bK;gi0&~lA0kAfilNqHcI1PIh?f6B~s{DY^-T*{9i<#;D@ z`*(3R!NTB^3h|dgfUTzgd$~JAGg4)(+|~6CR@Y*N)!~Ci?>>&YiUPl+v%Yl9LjA=1 zrgEEBGxi~)k5^@WyL=Uq?Pu?_#LAdE%IAp$@(y^f75PNnjoL~5LrL6A&)@Wb4+%!u zH|iI`sK6_K)vF?$Xihf1nJ8?Sl~9|0s907H9t~;X&`(A+E+nFXm`t!*+OwtkhmKm= z@#0p(gB`MCH+uyV%`J(#C74;>%yfE2^uN?!BQru-ZNdF8{G)ll5%VKo_KC;IT@pQ5 zts>>d_b#z1msb<}U23p5?#y13S#9Wa5&R4RkdTZmON+WK)TIrW@4c6d(f`UVK|ei& z4Hxush?}<~3pG9hrE3*l>5|8v%Ve4G)He*SL;7m^lJvP^h3$FvIZ7(2{dR> zxf;pVrNrH{Ani4d{pIp*w%j3)%dT|64jcEl_9r&QmmCjI4MFbaVqFfd_ZQ>>|C$&^ zliAp!UmqIP@21NZ$&GxXT3gGsO7D30y0O!B_K(PMn>+a;H&377q!BWmJE(sI!soYU zTm>y4hq`z>aQmlAB!{o?%Su2McO;tgK|$E!*~v89ra?{MpQny#L5EsF_nmw5==Ysn zfPd-caqS|DGsl0qwQcpPQ?R!)?oEDF4k$oYe5uN&BLnjwPZ7+%iSHWLOv0}>@79vb z^mvKR_6D}z_sxgn0(}Ym-`w!4$r!^R*W42F6|3t)(SE1(Id{nvatR-==K$@;nP z3k0?^)pyb_Ayps8Xc8Rhi{$FpIQ1)d7g__GWH^?Vq3_>{L%7XR9HL)so1C(Ng_0Xi z@m29%TrZ01%D|SLaSg}0jU<~J_=KnpX6lX7CJVYl+q6I0%}W20#Zk>25^6`>XJplm zF`sAErx;FxuKn+yLkej*_H<`hv2aWNGk;=1EG6&6vKBlngf3rI76$_OeAdi_AgE)3K~>qk)4C~KKMQcjfxxiz1LK^<312F(x{%8rA1&K5FQXR3ZkzJM`g{^F!)>R9qBzfGo$o=T? z_L`7jH#MT?Ds{j~YO7AD@U4{GtF#iDh;}P_X4WX`@FXQ3)vy47%5uDBZigTkkW@jf zRtcPt}u$;psQn&6y3CT0y4ao58o5fKoeO{+I`T|4)0SZoOl-p_<9V3BBo zsS%dg(2L#G^|6xA1uVYO+q#;?H?_1LOePxW<%n>yMcUk;dYmH93w`QIiADg2Gnd^x zZY(`w2^YoFJt%N735Lu)tlgmOPr3dT?|N=8koJ>V61kEY%=l^-e(|;IFK3DPa{QA^ z?YCZHS-yj~rYC3Ln!D#f>(d?&zmre?&Y>Au7WiYkESKXk@PXLc+=gmZf}PSA!-+Ov z&`OgZ{y2Z)3VXE67SD{-xO~_j!{4N$e-+vJr8JksRLiTPnx1@uo|FcL01g&oPRpP`q@n+p?82xVcBic+w$q24rP<+E zRC5EoSd3($FQxnvw11%S;#Q!~P*8Q`j~JX6x#XDqSwX#i&FbGZ;+R1(a?%P~EW7yN z#OfyECU-8HT;!Jmd3>5WH=$AS07P|$OP=gGHrjiHqAZh4db?b(6|3x@EdHGsg?_*< zAX4QlZeUXC(;WlU{jQyeN=+LQ3KhQZ7~gQ>>+iFfc72FdQq$Rx7wW|FJ$`~r6&%g> zFx7|sVU2v-mLbdiXpXL3p5U4Sda95?m-;v=`D9^lE`3%fx>$P#SlyGi8h&t7S#fCX z$OREtI^-sKReD$3UPu^_)!$9+M=!}6DH$J_YoF`_81A~HVldGwTInwmb1^rdF416I zLW;MoDI?~ul&jrE86Uj>Kwgi9=$KTyFoTEzCHbK1Zk*rKRe9BjMo!^|M}W&tsyr`) z4qMJUSLrW5PsB&us3WebSaDa76I!&H=7xGi>JDu|54#hbJO#VnyqXcUK=fO|LTHUSh9z0liISS&dF(p+{l^Mrj2x0c0xwWnuCcnOJV`;VR7Y z@NhSV=FFd~9;6s$-oOGkD_)cskkqh;X57KQD0Q!kf|SZ6<3-i`2ay_dniHWY}( z=EjJjm{=~?z2j>#dxQL%pS`cL8q2jdY|=Pl*`U<{qzmeHQ7WCX7}_r^o^3WE-tL8LB`|8rnC$cvsT66Q%Y6DtqH~YMX{~l&5G2ot7P{lji-J;A<7}R4IV+Umc9h`&EEsC*Zmx_BLUy}0)M7#PfTyO z5iq)_`#q<4?s-nX$EXLIi3P}MK!d_Gv;UaMPtS}G%`yzP=Ry;vj1q?motaRcu0^;IPrmM&O3Nycw3~u%h zO~ADhAOE>)TGBC;J8wEGbvZsM`gXs1%wMi23y*6a!iIdGe8!3ytURN;6mIG%guhJv z?V?tg&;HFjBKSJ?I~ja*=~v=ru%jVpH_DLh0E|`>TFpMoukS#A>M3`yJ4@he>zO4D zIf=ty=9fTO(q4f^@vnjIPlQQR?j6TCLtm24N>YEVzWb#S4x)>?b)^c+GuQ6{C)yK} zgYUmL3+Q|IN0U3gpu$IWyInSR)88;0AFetMwaRZBqUI@~E zZLzvg7Clv6u!JyJUv#N?XGg1KzS9Lfv46Zy)kE1Z5s zr}!jf|JsYl``@h{_lbW7IJ_Y*qHLPRAQf@7*u&h&d&hb)@}$JuX!#Wa-Ww{`t~*9%NC3(AhM&H3fVY^>rwajV%|`zs06yqXCGoLB{V+e3&Z zz$~cps{pM55S(s>lakJ<(#^g%f(CJ5m>x0OKmc_)*

    7<#R!#cTAWrOr{m8$g|LW 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture28.png b/dmp-frontend/src/assets/images/guide/pt/Picture28.png new file mode 100644 index 0000000000000000000000000000000000000000..c08ffb1790e021063f4e5eeba47402d77855896f GIT binary patch literal 29843 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture3.png b/dmp-frontend/src/assets/images/guide/pt/Picture3.png new file mode 100644 index 0000000000000000000000000000000000000000..df300831d2e3ffce6fa9d796fdbc31970d442eba GIT binary patch literal 18838 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 XWLcX=BCjWbE~QOA9(Z@2Yh?C6AZq_8 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture30.png b/dmp-frontend/src/assets/images/guide/pt/Picture30.png new file mode 100644 index 0000000000000000000000000000000000000000..d3fcf94bc5ebc89aba827e6d987dacac577d0166 GIT binary patch literal 28670 zcmZ^qWl$VJxA!AB2?Ta=SX_d;J3$g$f-Vr;7hfDga9bb*w*VoK;J&c92baJCyFhUF z;CAyo_x<+P{V+Y}be-zzny&7dbLRhx(b7yFIYzzn&%v;hQs#*VxW+#;{w%zm6eqr5VQ1@6aEl$p~M$w^=tC2cmV+=v@&sZm9+mx>hK=}f`K&n z`1o+oEtr+HHHL(Q#N6DR+m^3q3C`JScn46y%sEFg#ACT9DE7z6iFc4 zg2_A94>2e1yCxON;&fN5|4NB#EUzgOhKL2pQBz~=Zf&nHZar)t{}FTGJ9)g~yU>g- z$jvp48}}PXVNI-f=m?blV~ZU%J4;A-k$ao6B_$E*Bp|o(cl{S5@_S&Op;^E!HYEGv zINCw_;xeZ-7#IIBx!BILxH2LO&2D?NyCZaNiDg*@uJ-ic^_(TVFb!EOqOhf z{{8vvJhcYyTP0ral;0oN=4B*9IQxA1@#pym_aoZlg&M(mq56=(@oSdO#=GN5fTZ8u zofC4cs$#mzG;Nw5WYm@$WO^nIxx8BoxHITBH3*f9B{SW#bGJVC>%D{TElfFEoJtQ^ z5gsgT2@gkD(AFH)I>lTj*jZpy3it%&r*5@%ejLg~%A8qTj+wW#bG1HiM38+c=^3j_ z@DG@5J1@ITg@!ar=C;bntiide!Di?F5|KMHb*`Qp!P|$*C8@WWpW+fWE)G!J2M2xY z>r9)Qn{Jnfrh5ANEh=oSY~5_!Y=UfQt-clo+Dr*BnDpZE(o%5CQ3O8b=+ICsK%0h! z=8!sZI+rj#m?Ff=s>l;LGqbT;jL6KSD6guL=V@0 zJ-+;+T$}cAOb9n%aWm`ob(xB27V6 z8_jU`faPE>$(lqhbW+>k<6tTI7i5#wsIgxP!-Nq}U3L$jM6!~ig%d=E!g{QH z4xia7pOGspy4XWHB35&lI7*oGgrUZFQQM9`YxxuFPAR)Cc7Zwo#^f(q2{C;_=pzS( z%Rk{8xgy=NQHq|QrcbHo0xTVBJkwHHZ>iuji*dOnA#D1zf zccDy_Y{q`QVTd4}s(D)dL4)7#_XY*cKLEpf5}S{6gu_CmcSa%3B7|WJos%^tOHp|Z zlXfctgw6r&=!+)gL=a+NVNaAlC1p}X^1gmiMhtQp`p2k$yqnOgWjvfkvA51Gv~85x z%Lm<{M2riz!0nJoI+1VS?zI6%4@kfVY0?u zZJbL&L~yppUC-QcAk>Lj3t1n9J-ZyAXjxiCWt9?lIJY#*u2i8(wZEhEm`fj@sQ%#* z4ma;`4m zq=f^2*(@iiUJ!HH=NZzGF8{$_y858g`|Onu#M{b2AW5SIpVYk7)^~h+zuD??yYqg` zoYmQ&RrBUA@15O&^P>Z0-dvCa zlIXMUh-bwO4Kp-V6&2nObwR*9WUkF>>nXNE6Bwys$d{L51b8uRVpYQO^ zyx-h(R72b?kD;QpbP$*Od*-zbx!1U4KIfJXk?<*kh6GNW9Dl1I6&Xnld;(Jg|5o=EG{}Fk(Ksd%O#G2=_nh!YiHx4pwb~)-ol-^Um5GEfLskWJ2tgzXe)SR1wYS{de1$XS?y4$;{jBG+M~ zMoi4bf0jC3z%70+vsrM~T)~R|#^T+UpARf7$%}2y$>FA9aTY}6!afGBN>+{@b`aTZ$MW12-W_3WTyIuZZ}^ z);mki@&n7sUX|crX)Gl>Fx6^8a4CW$!p3{9R+v|KBIfRsj%0?(8v|ty505im-o_6i zNUmY4r^W$Mqst&l&V=`)iy1Vua#lh3kl<6s)=O<1WAU46i=9e=CLw4Zq2+=11`8a8 zP6()fZ0s|Sf9o{fdeNkRAZ=tE9Z7(gM|uAS+iVzyP~DoGMPF?*e%ng5@b!OsR&>wC zRoREWd**nM)#7c}J2PCc_;&ys!4;yIVQA=0)3az|1JC>%v6ZZzS&UOKSw$F#WZ-u9eab$LH_fR^oL zjU%A8H4l+hmSk@1gv`g4LOc*aXSL0ZK24pnU%E*M@@|8`hbSpm&!E1$%>pO;?&8}{ zjIHQY@512IJoFhWmYC2YpZZ0e|reJi#$cgnDZbPV* z5_WL4KIHx7{fvdf@L1-D50r*5-7wSAI?)scp1Jcc@ii;A8Fknh*ifm2`JNyLBQdOj z{gs+#N}C3kx%%4TQuMNMO)ZDp#^7F>Ul6ZwboU5GAP4~Kk7W64ga-H^lFSWZnb(Sc z7aiX~AkvZFN!{U1u+wg^p!Z7)PaDw7R2w$Vitf{0yxoH({k+^y+3DR{C@*}cVZ!nQ zp#okpqRbt|QrG5$gHfB``XnnuQM9XL$DB9D8SS=Z1J40vrYebXovFQn0U2oJgyOo2 zqjpu+sv|xpWuurCoMupz3qXjZ&u_bx3jXkG{a#{FGj3oDnrLop1SM1n4Ft{g$O$lX zx676{)GcmMSlijIE&V3GH~<-#n1yGhLH3WkvVtNSCc8Fu0!cqZEv!R_yhVYWbZgP3@*s^(Tc;%gLLB1{5)p z^Wt0D7X+2DBbcdBO|Ult{RXW6bhUd;%aJA!Y>CB=r<1Iwb+Eec#IEG)L2#PVot&*3 zy&e6EsaJXBoyzBc7ALNF1&bLMfMtsP!G4dMs{pt8OS$-F)v>|O^D?reFL{ZFW`KB+ zcG;u**Y&e$^o;bBF%Hdx8k)6n4FuXm7I1+E$3%0dXgoyd>F&EXi#T#Ii);!-mTu=~ znv=gpZ1|+#=%7jd^6Xokn{lib2}~^g{`fnb4IMoq`(9Ca3QskO7!>pDHX%Xvjj7F3 z9rfQ#Zx%bxqcMKZ>k_$YrAUoNtCsa1-oSA?^NW^-UbBcV^qC+%$T&QUpeZ21lMg$p z;~pEyL>@F@YjK0BF>jC=QtxHv6-E*?wRE%-1}E%+>+6QW_}V$CtB|CVNxsrbHaSBb zEIa|?S5(>2n(bH5dQ@3#kt{@{AXwG{rJljeT!IAFhS0f+`nxys+v?%r-|6~>+G>AL z6r?jwpqD-+m5C5h(ZI+7vH8IsPtSe&OaR>6e-AZ_Qpw!^ZCRAneU)t*T{%nn&B!P+e4wbBjcQ(T zqm->oHdslVAD>-2FFT=dmA}{UhIqA*C@&-SDv1gwMnk^Hd%_t|r*HuGy^eHx{&t4~ zZs9^F-S#A?Ny2TVTU}2-9T61;-rHtaTP5;1__^^KH?z68w3Jgh(|ck^3@XqF``I7v z&fHsGbkh{8Ald=v3Fv9d-eBhoKF;C)=;p|2Wkx3BKQF z{L--Gy^{V-xfyyI(Qx^&!zH<7D%*RWeep*NRu)q;sM)aB-bzVNCL?EQOVol`c;&J7 z*;JP#I{KZGnG(B)x}G&ND;?MD?sgmwBC4Me(MtS7Ki?VUUSl+d#YLBq zX)lSdcWc0|&>)tduV`#9Z3AT0ResfYXf#B%Q#zFy5K-oSGFkLVB8Ji+y8#oki*cXz z5Il;QwT05q2$S^VT7h2ta_s8MJQXcAhY3=)J zce})r#0tf7;L(AsM1kVeT&rxaFcWD*3;DQVI@(N=w3sjNwKBAQwUe~VUxBOwB{gN# z@b9%S_|5W)q6@DI=qwHYD$DgvvVcnL*UMC5nOlms%#kCE+Y~ z_9Tbgk%Tg2GIdHQf-r5;3~VWa++%a4?O#ik12+;R>nGch89WN6VVNXBa=XW+?=q#X z$rw=LZUlE1zpWXB+n(K`;^4;*$|^P4=bFLpxQdu!Y!y!O0iIHy_rEVsOggN-rV+qb zg(h!g{SlCJKc}qB9{gI*IUFmmcu8I@rB7T{aI2+}dD zaP!uWzlv#q8NLpbfgg6}m28bUp)x2H5cPIHt;y<|uCFJ2o7brx}b+p_($ zpiE20Pmk~Liy{L&KQMH~1&&s)ajRg=26fKF6>u*%7}d2 zj;3CnEVm|hcQXJtGF3D<`=KAcfVhPGqBUX_T5!LfCn&D3XFlPh&(gLH)@9^{U%e_a zwSilU{Jd*1nKPwSQu3fr+lnHxw6u3GBujqFS6Wv325L-QX%7Fm$EQth+60tZQ2gZW zc3_1vY(c@w$hg;fE~V?ChT(UG?CAEH*m6ApxnhHc+hR@jf%*NmfYbBli|Pq$&7qen z8XEG=F+Y00@q3<3^meNU9-nBsGjh||TpP{iRekleUd%<9ntoc(ajZ|bq4&XA!30&CnUXu z7%WWt!}_vqk?KtBsAsE{C496pcRSp=Xoy33H*!$}gScdh;)dYKDK|NgXznIu<2b}}tTWM@&a9JnEh-Zk{s|~d}(4#E^if>>nVj_G!?=YyYSvM9$eCFf2l7&0D{}=ql5cM{(348nt z=No3FE^b;u8`h$qKc8YMUgKP^vR9hp@;#jn9|(w3X}VL)^u5@jHl6ER4FU-NxbB=} z$6HnBHM_&?PN}VE*Wqh!O+1g`e)DhRiC-q?q}p5_v9k{GnBR4S=ybKGBx4)qL2vpZ z=p`iw&|M&=A}yE8AF;%MW%pkhjs7LRC4VUGxs~__YKc$=db#^4OO{sGweY9+)zhrFTCGKqgt1dSa1D0vrxwug zz%y>sU|Qs=4q8YXBF}+d{XuKodt=WbpNX{Mc-t1Aj}pqx&x>s|L+FEK1XrlSNcPex z&-jm5Zu5)Ux1JJ!3?CR$)SZ`VZ|(VO)dLs#S_Okukq z#ZizyN#BK*eol&oyzto!2ASf^i07EE6tR@!*<{%=*!V@K6l!`VL3j)gI)d7F$1`*h zFEQ~jGs)B>HHo^l83}ZCdEN7itf-4uqXC%Yi+s|tba*oT1IQ3Hz;r(mV=NuaOM7lY z=8}T2=Z`cdppUQ*aId>P@iLL`K#ewne67IO60F9k+{5-N6S|r1S1|ZZcAYO)@lb%X zWlef|XFbdozf(Ki3vie zq$?fBYrO7VSY@-E*2(QG{<>@$^g;7Iy-JOwB1(5oDTgQYvJ$S1_*jPX#uwr z2^nL2i*pa8pKXpbDUtfU9G7wI#!;u@b$-ss)0cND5BX#30lHb(niVMb@@s; zU~f=0p(!xDsPM;gmzln_Szg5T!gTE-#-7PxL3Xb0GR-`I6>> z^3i^8xjMd}{v~yzKxzdtrfDcT+vpKn{_@4w3CNYUJ}YLQA{=@hIqd2IWxnxWctt|v zv@sbIilUj-=ss`|!+x2XI>_Ph#zZj`0G^*!%2t6*PNTE(nRE1pa)yL#$ik3K0z~>c~ZGkxUNv$t&?E#+TyQPgz z^j!P*XR(HpeulSc@n#pOnQ;6RjnK%V}s?~F1y##%& z5T+gFs(^CMpOaC-ZYl$yT$26a4Q<)8jg`TtAjd3()@RUx5+{S2p-=s96I14|wT;hF zw}drK(smASYy9yP<&07qE}!+Xew*vjkRbrcbnPz+?**1sH%q#l0}|8#^16iIle?n6 z?1&*7b*4OdeM`tPFSHt*FYi9*==HJ|XJ66QYFyxcSFbm14y0M3Cri=|7*6$3H+v?} zP~>*5gR#52=l1KA8blh~0+U9VZx~VPxbKb8u?y(ByV_DsKR;&)7MNJniK$M~0=K#M zg)31EQQh)+R=p&vie%W|-D3N3^zye|K=F(w=ex43>PDBgTCt?Q>J6?=wHw;YIx-BW%^#!UI>i1cp~B6@e*@pV~}t1eOi88 zS-!bqctc#{g+9=Fv*>3jxu1jBAX~YdooXuXr5j?)>`jA|V0d_>;SJ<#Y2mMMZ|ZIc zSmBMWSma^-T+p^?u0)h5+DPdg_#1BiaCD4ngH!4JE(eH&1tRQse^kYY>IH{K_z3U; zHkyA$N5?}qCavxr1FbQ*&2OoHyic&_`~|&?{Cnr|7uvwU{JQIKnh!dD*j14yC$j9= zTJlup_76TnQ?ao6LU^DDB zV=pa>xPB>D*3*I8F<@ZQ`17t(vH-CaI;f?xjjDk;6Z+Dq%@o$q-m*L-`ND#z#@-$x zmwNs-Fn~9xgGyVQaSFI6c0DN6r|(2&hGgu*S~h|Y;wYHffB)j z(e7HWuHA4J&qRAxh1XVjF2klbPlA2( z8J$DBSWsxi9kj8=_TVFc_u4EdV0dA=ab|jxy`Pok03GSXih?>%2a9!i2RY2Dw{IGV ztMyFwFmjHMfAF{ojc87M9$;JoH(RteHAJm~OLJfD86H{Mcn&1kL&`Zn_;&p3_hL&N!mc=Z-s#4Tzs?ShD- z?D@WlWMX2Yc2aWq;ccD1{vB_a4QYnxPz*}JC#t%=%}%7>R4swf$`=iJH><93A;QQ} zMT`wCkP)Agg?VRHv|ZLXYz+QdSFO{{2&~@jMUD0Ul;VxI^0q=v`G@bEXpeA~8{Xah zL{3>aP*PCzj7fJKE(~04S9`NVgN*%!E8?3Pg{vFt;$CvpVU{6H%MiDl!NaSo-d!>U#%$Dc8yv0O>VAyd^5FPf!8W#*SL?T22WimHc>+~1yQeN)f zdynhEQ2DjAD-SYiNI31Osu6wU;tH>;3sQXNx zjEI1Pck73heG`Ony?CC7OR`PZ+pZKVMnl7SFYi|>m$e*^2{X(Fw9d~Z^c%BHoE7wW z0Qx*EgV)>wQ0@^JTdMoR7t zm>0EbI+s^jAW!#qCwIMihODQDf|0vtZmv{}(6%bWz)I%>GX$@Mi@eJc8WToyd{f=Z z#fb`QPVK5)OzAJN-OmbfMiNZ(#@lcVxXhMpc!#)RdlGJfo5!e^hv$NgZ0|nUJahrS z+mWGr{UgV3{5o%H8k;&?kyuq!h^=F}z`kAUlmp~KSN~8eRSnuCn@^57q3c8p$wDh7 z-W`8!Zn)^>IWgDRXhh1b(OAPZGR~_p<}KmoJ;H0GpTluIQ8~O5!#83gPFN97#u+3~ zcQ&^q;dYr<K}@#t@^4O~V&=SY8R z0D~^=+RrpZP>2wI-WcqPsE}G>C3tp#+Vw^*92cfa498qn<03-hHKePZ9+DA<>093` z)Ijjy@XO+uOiZM$0qIsvE#$tmczjV4`Yfx{)Kfp|&gQz#wARJh2tnC!OUv4hxIMcf zPuqVO@g*M^Srtz!IVxz}NQ)cpb3qPnugA}vJq5|2l`U)qDaEm?AuBC{oFgC5;nE${ zn?VEr{(dA{g>*x=hkR0yQ9I9_MD|OrR;G7XpT}!pNY`4?)X)U|SQh*zw(1o!2H=4} zMJg-qA+TE@Iklo?(N=J^`2*I`?O9&R;oz?z2=>vfRTrwHZ=)$J@hsf|=b!H7LsQxxd&G1lm>x~Cob!E!d; zRVH^Yhp)xB1tQmaU#y7}jNj6OJwCd?Hb!|fNc%4Z!DLmqRcmn3%-=y8K^~~pVyg7~ z5|<3~(g{~B-vRflK({Ft*5sQrHAV@hBUUZxoK7mY@%kyLv$a!y>c?O8i0p-K!NY`6 zcs6~a-+#1JYK$G>)>&fB0s9Y9BRr^4)YJeoRvIZ8T0Q3WFICQx?A`e3*6B@sa9-cq z-t556?k>Fb`GKSsR9dFXWjR9OvhgSpb2k+NTl02_+`6l=dX&ytGfxMp%1o>Ha9p@4 zPj*$e=TzD4NE=mhKLE}T(Z*4{G9ByEEXR=iVh+0B;LMhKj0I0O>7Cj1#cA=zGtJ>% z*cp0S_*@Wew{x-MVYAmwcqL}U<24`}n0>nAW@CLD>cjwtb%0r)HX#hNnxd>O-MV?Y zp1X^7TnrP0*_;*bCFUYG7iy(GmN&OzEDXAf@h%Ra)*XyIm#6-zkia}$I}+M5p-z3s z9RZ(`8JDk;&uzA0^R9HRp*J|3+8$uq#-n=~4%Ze!_{-lRUpxF~^)f_D z<*eO^GtyQ{qOWCxFqTna!+fID`Ltwto&dP!^>G-g-AQ6#i#&=WYV9wgh5wm1u(a%t zIR2LdcewMg+_kSiS9Jya`1x~=&?{IK5q{X^TaD8Y|2D)OO}-2_Hd6Z20`>5yIj!`O zCJK4t2a@>ZiHRKU#sL@SduZUC#8&r6v>P1*4s;iDJ|5nUqN)aZsARt~UT=0~Z%$L) z7_dxC<^>;S<0?A`DxbXnDvL*|zbXa~KF!>I<%(^-6?B?_!+mlPuGt+}h*Rzf42;($ zYp#6v$6+3^HT^^eQT+9Ipq+qCR#cC=6*Pw|t+XSQ8g-4oyUHC8qMtlkr+4n;RvDXv|DdVJ9-`vMW7H`)M zRf(a(p{Wh|T!I5g_Z*oXqUor_XFZGcDfrKCNDl9xg^!cIwaFOQxAIZwP`+!2nI}Q5 zf`bNV2;unaq4M#T5$?K@Q*#bjq)Yf}{$BVZps2Ss#~TsvI&!f4cgPaHJ;5`3^;uJ= zzEl1i%R4AiD<|dSHk_&c9PPQMe~tMFGBy@Q>esXZ$YDMMp8sw1X~yjvV{7NsSm<8` zien#QlR66G6HG@b)HI0lMX&b)n;L<`uiciqYiiw@*GP}0DyyOp_D{(2%qJ^`04E*k*2Eb{yvatow1l{i5ro45&8)2L{=Azs##&|)d3 zN_c}wpW11n!9_FY2_+kCO*Pw_V0X}FV==1feeCb5+pc%fO*FXNC%bd%*(tvzC>`An zhM0jqFD$(M2e}TLYFpy*Wv-D|`$|B_`3no*D}r}%_*&Cb5yd-vdV0cEU#mz`g+}M* z8cMA8<|MKm(Is~Z3YWZdA%uHWdvFoneHIL4I$2B1@*ciGDHoTV;``^~s4Oio$S^$F zlbr=CKszTrENc@ri%Ywrp-kg}H&oLe5Zy4(r?+XhTEs!0VTS5*;f5pUc38%aAlwC2 zRm&LNELcZNeVk;vBclT^3|x*5-h}owv?$hiMI#ou28Xzy_^I6LgxLtmCMcQ2_vd@% z{wOLfEpSXjg{c~WH+@ye3k@AQo=5o=Cc#7C32()OvAwx#sk>{6HtU zzth=?!BJ3X#Ef_S?=J;~1wBF4vL`joq6efGROCT_lo+AHX%l9;5$M)uYTS^Ps==#1 zv#mcEjhuH=Xa+P@z7K<)-;Ffhsplkm!OGi@3{ZE*QaiB7gzQ48v$0il?QVWg^{Z>< zc+=50nFL6rHI1$&@Wr3$Yc6%#tApL)Bog|(y4VT88U5iNr$lO!1^@bIWG<-5(9Ok@ zDr=8jdpQ`JLtmf7h8e;)GkVWBlK7HNfRXC5BrRvVAY<**=jMoF!&?3j-i1Uo`dR!4 zr-@%e0j~&|Pb4k;(NRk$DK2ltVINZU^=JLW)HGFwugi7zhJ5P$FZijSpl!NAdBR4~ z56_91jin3QHxXtEfo}z%`nE}_$uS53{+yL4vviJvB-*4eD&(B?YSrMGeR!bYphV3LPHe0{vV#02;1}@Z6-HPVit}o&cMZ}s zX>GU8Y`Ga=$Ku6K&bm{jrahp-*3vE%_Ok~MAwLugO!2eRmim6tTie-KOzc9Irwknr z!d27$O}{w;OjQmR5o!M5!1pr?g7R+NA{89v_~GZz#T8Fjz|=9KPT*R>rCO`;a|mf|{VJrn4u_zd`qH;RFgLRz3Y$aMN)c-Y!UvzezIG)2~ zvi&xN4F!Y*!aLGM|!f0Wxmtgd*p1v&+lCgw;5M&z=*C0 zmK3!)b7k)!4oY>L;JY1WJwqzzDlTQcKrHrC{-iAPqsro0v?vL>*jyB`>9Qo6S z^zwmJ|Co@f7v@}FSd><0C-9VRP0ATzT~RWAw3wI?Y-JF6hqo+P*f&IEDW9&^RnVC^ zia{2yPdzF;W7HKPa+Dxv46|kQ&tGr+gG4Uuu#?g=oM}E_rOl>mXM9PZLP~ed3^D;X zN$8N_vZ@18f4zW=Ro<@_y;*=TvOW&g*sk8Grw{{@)%#0n<={oSYLTdHvMM?ThF=wz z@4=trqW98|=ZjU=t*yVdEn|G7IdbLh(G0%eGd9US-boDkw0~y_BqKFisN-#Y<%>CQ zVDRy(T*vo+N#MS*2?jIpNFtGQjuO&)Y7mzH8rH-)V;25C?j z{u~}j`co_29YQ+FXm+X=s;OV@3YD9!PxIe+?yb@bv+R)n_y}qF)^HG_jwE-CgRWK+#`kRvKm=U=P??0$F9NAcb_bQqzeiP z&cymiBoV~YHrV0mO0og3Yqy`DBaTtCSTwx1A&ZzZr?c=I!in(smu5)p;5TY(+pSf7 zgY*rF@deW?K)^K9v0ZEQ5TK}Bo{9kKYxHPhyXdY{6| zpK~DV&*d*K>59H#^@LThmAmxp`qFk!y_>Km6g^N+h^~!dF_!;pg9e#5@J|fr$@?5K6m@zg=4KMpPMw>0H?~BICXvX5 z-VDRN=;4YY^b@4vLJp`Co7SvzXz8irDLlgx%m3y!Dc$U2*N#wne{QM+ld>|y?^Bb> zIauV7e3O=gS0ML=x?6=Ld1Gsq;R{5}?sr?Dbuk??Bkg4*t5y{YHEe$OLc0bxT4S{5cQ0?HIU;_0LhBn)a1H7Ls;yN`rXIkwEpiuN z!aVm*Rf$cM^8&L#d>XQOqvhUuT8uJU=aNcELmMeIr6!trDQ8oAFQaD9Rm78hHVO z4qM@HhXhaGCw8)-V6kx6-#bY_?=RnKcywVmHJWN$(O!)o(lFaxOPCnlcf6m4UsuFV z<}S9eUCPx!AW3l`CB-((0j<(?sdJAb$SPsvIa*KoOBaX-#?=?4wyX94^A8y zrAp2KFZHD;2e6IAizL%po_zaSE{MDjfT<$oCl}^zyg@6ZN2BG=N}fh}97Xl59$rl% z()e}`*qV9NUpcujp9jru0?sB;C`T7@jMtghY`?~3?X8(A&0n}b4pdF_F8n?Ir^feR zT)2J-;5sNBQmwn7blfmZ2vbgUuSdkT#=l`Iu`UYu@PygHA)~G~L10o!K*Fk<*JcFHwF&$G8NV|Ojl-NF|jh!buR>)T7}^rF(LFV z-OJ9PALMiq`jjn)h-T|1jmPsV86nwqq9Vm)E+ z4-VzDxXnTrfAl`a@4x%K&@he}lv1ba7IF-WX|iZD2CkC-%glx_SpEqXR`&(J+ifjM zrrqauGNe$U5D<59?q|b&w>V^xYtKFfcY(RhwmTfx(ID=^d2O3qD3k;wCGAyqT2<-N z@@wF18jz84dL&{ObLWn$mJa!ucqd2yR{+D@=V1{&qX+RwASR znA9MVtS39a>*{xTw#vxWwb=12DQg<7Xj2g*qv7J5$Ib@RhxGm)M&~LXE3d#IuId5B zr^=jFCM;8;^BLxVN?vf2;S!(;hi&-NmQT~{^Xr;=_wJLc(ufX+;EU$XvC7mHVB}%q z2fN3?4Igj!F|N&_KIvx2_+59ciM6YTPM4fT zEdPMN=blIXO4arb3yuC>acBqzDMG5+>+<*e>?fQ9Q@dHWpOQSWlo#d8l`BUm9+zf~ zzvlRGl>2y1{viT+Z_8Jo)`Ua5IppQV+yRG)C?G zz#ZYKgo_1(2WNSf0=%mC9!QKngboBXb*@djl_$8#y=%NaKYuBbm~?HMlk?}HGoqQ= z{t;`-+&x)?Tc^1JkU=QMFTS~Iy(GG_xDkpEudP7r*$j-j1YS_t`>37~^4@ z5+vNZ;yDF3c`_!>qjBMlVzKp2*+4plVy?o-%JCVl0D*Xvm1?clxx^AWk!#2cclTpe z@yHe4NAsJ-I#|e46R_VRZhYs0tR~rf-C1xDJ6T@Dix;3wBuWP(3@8FT6{sp`=gV!z3ix|g;?nF%`Z4do8;W?(k?RqlOuAzeP z1HcY0w@H)Bj#Y+6xIoB@fvaNPux{LM_eLiEvzyN>ut+BZ^&1}+EPVfkxA>-2cGlQg z&g16PRJ790*_eOY+HBKWtqwPhMMYOB=q*5do5PeNw`qU-JI{h-sz& z2UX|%-%$1c9g>+&3hsKeT(yB=Kiv21RZs^L)22P914>pNf+F1)np1e&%x^Bq2Q08X zjr0DCYMVu+6N7g-j)qDc@n&|D$0w?*l|0BtwFH_xAP(LiW4Du(_Q#lOI2%IhcdN zUR&g8|DnQr4OSvP#XXBC{8?K|EF>g!NSkuw`44iCS65fpXw@S3<4Z|S4y~!-yQJON z+T6@RB_zE32WK~%$MVHe-K_BZBk9^&T6S0e@LXOm?_gtLX=!V(T=>D<`PJ2^?$7`J z{o342aejV&D04GSxaRdZy7UIP_CjMISHcIJap!ssj5|0u7*m&%d)m^{0$wsUF)?k) z;K?`tFR70FH@9JYg4mLOATUo`b0*F+>fpva&9^w`>i*4+-f&*^!5Zg>g&bamKQB`@Sw`%VYb! z9l5i8c&KD&R|1Fy8opTj56Qf@=Xopmu+$cSj1dHt1W-mG2L}h!F~0xzY3&`$cPX;f ziZUp6b-O(N9L493Ep2QR-ijBwQTW>Yinr_@^Rw{Ja|~gRZ;oD7;S*MKpSal zJTc0MLNajt|Frj|;ZU~k!x3Rp!U!4Wi7-lb*(Osmw8+wilCevLne1Vv$TpTqB@`wU zJx^sRWjDrP5)q#4%b3CN5XK0@n0aqK&-?rR-VgudJ&ynT;r;UeGRMt*-PdxS=XGA^ zb*_&EQ!M7aBDMqjfgpTs)hbw)@m1t~OEQ45Dc4!dbE=62(w*X;cGy9)`{duKl}3PdIYNWn(vOFvKg-U>3`0_vgIECIM-_GqW zDShtN9Xh6?wZFB^le{^8#Yqd23jdL_J${~qNb~@q;bY7>?qB%>^dl~58*N^C**0pC z$0L^~lY}yj6%OA~e!Ts^`8V0XpVDaoXVAZztbYHIAtXC~Dle4#9K_!I#N>D#825Un zQI%+;27K_o)CWMX@%@o7x;klu!Fnv+5s|WBtdCezF7eu)#)0_O6#Z7ikU9_?U^N!q35_NB$DI{vBb_4z-m zugLV*EuS+)#~2cVCLFZhHS!%#ufbc{Bda8rRx)5pRIij*l07k1Es zSCr6x7Cm~DxQloUdW;aEJ4N95mq1&QPV(B7)dO!(@0AB~$9)FKEa@8NGjEsq@0&k) zT#nlsuSz1*{erzNRGq<|>iXDH)p(@+`R-c1T(}hug`AQ6_f((I3U0U++f7h}&uD;%ZdXXSVCQOcCU89Lu;Qu+53VnOWOjqanex~e?XPF+P8cn0Ph)bTkJgVzbT z2*1#%V_pN7zvT|ZU`b00Ht6Q55#1s(ir1K*IHb(JvA^YXC}eLP z#P|Zm7^VY+yX~R8xRz#td0r6b_u^Y2D&86ko29 zNX0nkvaI~b14va0+X7F`)}D@?ojN9*hWq(f9HGmI|6?Bz!rgMmBg&i)QDg*0L{ulo z3br#-c~xCY)n5&CwNo-%qb<7I!n3iU(>%RJDVOa{`?y|l8!4SR7KagtaWO%>M%r?j zO3^^R+Y8ulBhwLh9lR7s4J4U%LRTDr00^d-(r(!oC$ct6u!yy%*`EN*%GUbhe_QA! z;k-|~QymmR7Olwi*7QSZ3-$x{HoCST!;PuaQgQNZN>Imc|C|(UD13Eta zIEb934LX5W09m4T*&Nx@bty{Sc9BIDrBmf(8AYcHBBwL3(L8x5#XFk?@9Kv3+D9m2blovU}IIp%uFWtLzJ8d<=YYD-@AWrWIjz9YzQ{W>9UlRfy)mQ*>o!Z zLP{=o%4CB@;z8D8M;&bJjqNWvEG^ZANzbQ|%prV*sIg5k-YYZy**_QAMsm~Lf$Tbo zu7s})b&4vP*?Bg0e0BD?{HO6X_Xyi~X73MSS$1=9kXLG97_S{!6M4P!9NIxt&;J)- zqp!`s66!A%#3%HoCHn%r$O%)CA{cM~8!JP*D|ecCIXsU>fAjr_V+pO0V1B36tX_9d zTwGj0UXBsy?a~sOnb0a}T$BEb$c8-v-_fMB6J)RY{=muPsaLIE%_ud}*VkvY$f6+7 zxX9d%vB<>Zy%tn72B{Ir{`v z<60Z~wFN1F-P#CQYf(e0p%hT{cfZ&FmGNsteyur7;1 z%Ef&j=lvM3G4VC%G~B&s4>C0Llk_!i;{Bj8ESCXQIdn(}u}+p4iAc+PRa{(~Zh$YH zob;-+J9)+4p4Ke4wRB40Zw&c7rb+oO!^thBswVkFX+CcGG10i2qHXS%9ZYo}?q#KN~r|Ibo~X{3(*kDGiPBOM&v15^SR| zn_Fw+VVG~)l+3?D_6ZPnbJnAV^mgWGPm(rv#}^(bR>UdF?KQg`A2G!FKx=08pFdTG znr6MxDqqq9){bO6+RrmQI2yEUp89jLvL0iy2c)SrDhbib99eoi>lbx?mM?n<=PY8b znHG+jOm3CfS@mQW>C2y@nZM4s&`1q3vYh>;BWp9*u#U zNyFy1YuFQd03igJtvZ&D7(^bF0w(NtKZW)BqxvJs`yr?Yj8SzZ_Z_w1; z#mhe>nY+4Y;@vrturzFhdrP$?BbY!hFzp+^p@lR&W=ujf??c-9beVRCu5jN#4U{U28`9s z_O$BAL6P!ZY&iz)w5;$Tk=sVBLYh`T5$Ih@z^x}N7|K`|XQ_eol!_hD7-DO%{R>?p zIIqLb(ozV!xQ6Yj_I)<{l(RLq*1)6}7&9!d<;a~!|1bb=W`iYoxzr;WzPi-K% z)@ANSN}(ZG2P>3N+H(Vp0LyW05Nc|zshX;X4jE67yVdZTcqRN{ylR@3!w9-LK{-`< zR+h9L7j#NsrIxf=8z8m=e(gL2XCmv6x|=k5P?SB!*L1x@@q%%92%s2oRd3_5ya1#cFV1XHLw-eS|HZH zubXBxCC$=bD!m(3PkC}`qZdao&1r>qQ=Yp6PRL%V-ly)j zWb|Z*YK^qvj(zov`p&WAwIMJ~k2u~{F6pCP`ex3pfk*yxDa)wo2u6<9Gva2mqnAP2 z1I&A490&BssuFHhm^cvy<1N>PEvo+>i5QbJN10vtCVUNjHEJUY!rf!O*lWce7GLv{ zJ2YTBJ$P+NH=gme__(n-h`O<{!Kl9%-K+L>a|8a>NfsW~$1(EOj2th@%B%c3U^@`6 zv0U%)a8tr!-SjyVRg@F{HK$Ljo-;T5Ms8~p_#I*oQJ?D+vENoKUyX8&bgOa7Q~z4| zs`P3az`#O#fNg@kT&8mOBL4x$@jn02az)T0NL$JUk~=x0m>M);+(WfZE4bI5h$fb1 zXt?<`>|7ze9d=8aFF%aq_!T6@$tUSoyi5;lsdE zKD9i~4O)tbSI7yKNG*H~Nj<8i73$qgI92tPaJouOz6&FiK^^d^(}gzN&caQ{hByF< zgS2vN)U&GdMv#*~`K5Zs(JOQ9goT;BR)bxcVg&Y_3ttz+R=jOP(6$S-QKxu0Z?4>V zPR%y&lSpNKyIv-o(8YFz>q0hOMaG|EV9O$>6C%8?Ml5)ZF1PzE^1bSU+Z{siw8s%1 zylfw>ou}Bd^bIsuLd2km(qFnQ2EMKT7?ZqIba#jqCNS0<@d5E;q_!zpNEY?;jxBW5 zUS}yoUwFT;5OSX*k!dXjmgU~N$3K;xdk`hS-YM9Cor0J&{PArj}vr0oaXEWXHmzH*4EXu&3iGFT! zt}xbRBTBwm=wHF@=qRd9rHul`8x90XWglz67k!)5P6f0g2RGaY!%te=Z@E**Sk<@0h{y(jbA`X|70QJ3wUur~VbMDMSr1q!x%+_rS;Z6xO6SUNva z9?vplNgdLtclzSf>8*F&AvW5*mY##Xd*%|oZTTs&vpx{;QSs;AfLE(gi$r@CRet|y znUe8%y1V`BAX_ztcl`&YEG3?vR^OgtZ6J9dnHxl8nq2q{*GEPD=rW}Ri#*Mhy#+)j zFMBFJ6^N6aYi1^Gro@)jWd}SxI9hh}VtDzyv$=0-2_QQR`mJ8st;KpX1qdnBL4op9 zp4MOXKF^h8E;+cB>3dPzJD;@fCFaV;?TQmLI~D4cBTcn^*lPPMCIvfK{b8p!mD-s} zg`G9tpdn>asm4YR3mzyQwLS{_Q)A3HA#FiU+w4L^t0x5eBvCmAqrb&HK}i;9B}a7= zWi3-;6?IZ)ebqbnKDS5<(2#?{VezoL;c2ZE7f$Hd;w2Y86#CRS9TQJrz30M;Zj2O} z#Z#g_X>R zA&+U&da4ljO!kZB#dxIWhQ`C0r%ef)t}Ep(Sw>II+OsBlq3kb`8m*M|h#ZRy%!d*U zAE)BrbGQzL;WXUwu8ML^jfYuE_;b_AvoC>s48dKir*vEOmIbq>S`BpGfg@8A=pD?q zO6LvV=-%VP25f5RXYHrisI>VFhf{#K87cpdu!$6C>db74SKN;XaHF2lwQ#4{CNYhl z(GZ8-MA{`qLsNq1tS@n4AVBR*VS{(icMSgip7CnQEvLcLn`+}3KL4l2w?t_6i%9Im zm*~(UxV7%|sKWyt*LZ5M!+N>O^bs|@aA*ab8mzMg-Uac?=PYII1??z`3m9M9$HK_a4M?^}mJ2G4!r*3V#<(@h1tteonm)RkkMTRT*65jlmqZ?ENfVx1h}z}0bs zY0gHHZFJAGke>CrT78mn$9liqS>==O@thMnMCRiBJR{xmvX5=}!o?r^iDLI?0y>*6 z{eSKW^C{dMMUYC`7}_gVQNip|n$W(`OY^@Cc3(&=KUHY9@PVSn%TN|hUtE`0vc7Em zh|CsG<_*e!C|prF4LJ|Y6p4o(FT^!`D!hglsL6MtN5oT>)`brvg{;j7(l0zjPsXXZ z%$G%^L`;58Uu>?|C3FA*n00!`#oGfvP*#KRu+S`tKpWZK)4Gi-I;r!GTQF!UR(@}s zz-W*VHB*}1cBlBB`?DEJc z-~0KFPc0qO2OZYgD*Lg`4cZ5eh-r<@M6h?8w?>bp#1bTHRMiQjz2XVEI|A<(=OT93 z;4UMI$?#>veby&zr^ktihh9c*{n^^B={oK! zUs~&S@-Tq2#e(_@ng_M3_?G#*y8?|U^TFk$hfEDAt~T))$KbPq2FpF%2tK`54_ju& zj4nec6BpHpw0hKH0{S^MONmaImOjj~XiJctA4?zyO;#*rS*P7w`aQ?)GkkG0=sBi4 z*N*M%N7uDm(p}86>wrYiUJJHA!LTmxS&KF$**3KOBj=U&x}HTlSlZ98YiHHHe$n`% zj6Ns0caUu;k-(|Hh8F=T;dg;R4FNB1FtiB{Zr=#RnGS!@9+2eT??FTi>*o&UpWlv; zvVNwn0TH8r-J`2{Kb`!mkjxCsm~z@+~{ zDOgTvwD%|~e_w;ta?@jKwhwey@5!jBs1`ChD?rK98S~tIIb#p|E2{IHyKz(qxi}Iv zjZ*)&=mT84PBuy^bzXnbD7xPTESjT24$3hjbL4i zy~{zIBwLXw92N0cp2qDNLP2xanwwlsY?J>+{x^>U#=4oC!R;pUHpxUrQ&O$XPG*L^ zfrAjoc=jnf6gF?{7`p)L%Q6qphvzZ3Ra(Hwzu}FA<3`+P=N!o^iYC|32+%Wi1kVYZpJb85Fn?9 zm;DR0vUZCU<;A@h3ZXP!X3T?vB#T%q%ys>hlsfmqJx-wzT4>4Cs_p$6BNXj%kb1HZT7Cc~WaQUP>$LlrXW0l|Wk zQ5p^vm?wB9%q={P1ik_h^Ej|o%mAN*n0UY;Qw1pOSf{^|XE<1Qr9B$21cHE$EE2J> zoSAsu4Y(bqrQ0OFEB#pfIZ3MjhG(@-E;u&VL_EQJ-nt6* zo5r0i)bv*Z+F@i@e|!J^|Gc4z3Jb)ESz}-o+y?<^Rb{89Kku73CM+|`;amxB2kyMD z6gJo-u)H{dw9?)m4OUGd2&Trw3qB}Bz^&6;SM1+@lb{q|1DPqY*{@(RS$pwEIvE9S z%d8%Wt_Y)*F3*(A1(-5t=n1M^*B{07B_>` zN0%}^$V4`^?l}!rQ}`JOdQXyt!drvPZ(~DF8=3DJSw$&tu*Z&W<)#oxW2q7pzyb>g zsX>b*5&~iac?0x#fql>M)lHZkXN0Bgjyp2RD#_5bp! z?lhV+rL%2-lytg&pHH4P_(x!v;{SMvx_t$(KCOSE2=@*e<*C(d_XW2@m!HI>JMu&X zwP=Td52J?NiJ!5LRj#X_2L=Y%uPh&#j&eqA+pVl^gE3El?(?1LWCeU7@v#$IKfTNx9HJhF>Os|2}-* zP}-$WynFaN;eMpr9}5zm5g37sg_Ilq^>Mt0fZ*Ve7gM1}lsY;K-fSu@jMv7N&pLMu z^G0HwZBoXpJ)`w~979J%ozR~9fz>wzto!%`(9I8jX;-Y=SeQt>=xbXAV5hX@4XC6u z@7Qg~k|a%Xqh_pAercFo*hYXS##4f@ zcU4C>6dIPWP*7eY+AM4O&SJC3Z9c@5H-XCzg?cIQv; zW>HbaxhlU9VMzA2KconVn3-#&s0I1kISJI^`#RXc)NM*TM&WJKqh6_IRfC|dSMD7b zfKJ05A8v!SUt`7x2B+<0h| zX?8#nzar|F)4&|#m9Q*wzrVY?!1e3bZ}|D0ymf2N>||u5*}`Zovsu}H{K03x2zXM& zj=d7)RSjte+r#)HkX_T`*sRX{xCqUXcf!kPG;9K3VisHw;ADYRkdte)!!Ap6yP;c> zy!kGkIF2QYV|6YuaXjWa1Hto*TB{vLT3EzLyFge&gM%i9q|L}k+m{vR&rjIh{9}oK z+KxP)oZN&{Qb^*Dn(gRqTj5FgwXHjTm${LbgKnB@T>cnz7Q4;KFb#F~=JBfRan~Y;=>lhg^T@CX9p9xjFlrGbuC8A{lqu-*G zfk+W2kEeoyHWxuSBh!u^#lL#^q)!#3@xB!6+DI)N`4{VJ=CEDJ$aA)~t&7~wMK>Rx z)*nzs#ri&%*C<2C_vQTx3d!SJqvI_-JyLrmB!JQlN!6RkTOXtk^UK9D`2IG{W?ykW zI#AO7yL%8fZ#H_qF{^h4Z?jZaAUqlfDw><4Y-^{D{y>_|PM=3V3ulz~rd>411)nYj zQC?kdh>}NeCnQ*tZI6qYWw?7W`L*k)xba|>tHokjnG=ZAy$H6kHIdhQu`~C=a$|Uay^A8{bX3-$52wyQ^Dev(4Ht4LLxhvj2BEXFvr#q$URfQ- zH_;a12MnZYi{&~_A@JfY<4NM23vvsFM6uWWAdk1w7bX!Yq8Meoiv7s6_UIOMnoqJx zB;y`Gd%$l@W9O_<*y2PXDn~i%DX#0mB>&0d`$vyhr{38nPZYEmZ~&47DRhR=9g|8A z--uzUoSmJWg=uJDERv`iulxG?mKad}K+DI5h6T0hQlL^twa4Ylm$ekv7RSRDs8s4` ze|lcH4oXknmuXHq7j$7E-}8|ZIo2)CY_nQ27vf1+wt)h=AT z$O25p2le!%pxE_%=^NaFhmS`J3k!2=M@C#;zIs(1;Z4NxOqQ3Imp%};#F0p(UED~! z#hc%MC$BZE)i+x2P^)^hxKh)fq|N@aXfU(5Xcc;Y%!5O{q_04(9qo}Nv*V-nCKG3RxcuCwjwrhz9to?KHvJg$CUR3tf%yP zZQ@3?$ZKLW%~j+M4{Tj!eDi1jyYsNToD;nxnmm%sE8E-A;hX!hy`5931p4?fL)y4O zUtxD=g2V{fZs^+A>+%JQd#fb%K&7x@9v`!E#IU>G2Yyu1mv!qY=~m^?dGwDnzr-$- zG(fqaeRwE7y>#QUa-0nF4C|+togG2pyvI7&2Cy0|oI9E3;{a!6xVz_z5$fPxK0XC6 zUhDws*DM$+kEW!i9z1fSU6D_VmB@j$fBuXvRYNf|Je-~78~9s`wJY#rtn|MAxoMmF z1<_0*p{4sx=PP0E*5rCI`#sN2Ot1&=<*y8?N zhUk9e_pZQ?6Ltq~vT}PoxC7kisM_AthYl~JORKxTig*qbznU`0(oUnbgoI7BX?QDd z%ZTiWOXQE9bOzv*xlTcFPZ|ATnGTNPUCzfCBsH}qv^Z$+?w+iyuAW_$H(E0}nP+hW zgJI2Lcv7AGtFEr0*jNGyWYF+*QdFKYSh*5xm%`x7$^QIOXr+XQc1~FXN^R7Jq!rMmMGm4ERFcb(ga!m@By6(@ zoats5lcjMcEf)^`3ee%F!$3li4 z1dRD)S=s&pm6ykyv*V5}Zsl!mq({7Xz0&mPwsYQWDD{Dphpz}P@C;@>tSOL&YiqGS ze{U=Ib(ly|=B&>KAM2r6U^Y}%U-clQ9m<|%YyKiMrVZe*S_9Z9HvEEv!H%V_En%e1 z>qgl;2_8*iOk+Lc5a~4F&>Lcr!YLR4Da}r-7ENU&mj*naIiQoi>UZimR$p6z-vzMe zur{&v#fxLuEZd^B{-6&mhiJu(_=M}&K21~y@t-wjGC^9Q9oU!2$`6{7k90}w*;Cy% zy$AxT^#r`Si=emE<$$k|BYey?KKEs2me*G$wq(mQabCB@3m13TFtc8Tk$b+b=tEtN z&)xoYY$3X2T$J!YE-8ebCAq1TyS}MKuDFP_4USZINZ=>n{pE~C$1f=f_-|Lnc3af7e6@YtX`J~kBGTe8IWI8 z)GAg|Qlj+|a7Ox(AOZEjU?h(oJsLn1oUcItJ-v8f>Nf)esUssf(pSL_At50PGAe69 zK|$T$zTG2}$;GAe)>c;bDAeNW)|+2jCDCyT7?67e2`cI7xnN^sLt`O`>%e()cW+F77ZW*rq0@hST`tX5~_U`T5s)*~s=Zp_q z8IdQp(PvS27(o4|n(5w#Gg;xL2JS8XnU!1hjSY$tW4z_+-}sBBPcygbQ6;|HjdQep z0lMpa^W4m7XrLLtZdF#%ko5E2iP5~bfxq4Z;!nw`xre@2D(ww)lIZsxp6p30xK!6$ zwl~=+GpyLgGO${*lx8XmV5*se`Ga;hyo@k5i=12?4a*HlTDNMf>G)t;k07O}ykY#S z*(cgFUGn!xsOnA?*#2=*r%Z77-@2{-_TOWYgQE8LRXUg(#J;cfd<{7uJHF$r2-Q9s zx9iRG;RVXQfA#VQO*x10;p2yd)F1x0O+(XgEwx`Z`i^~iXKRStri%5uCKu6|t>3q{ z8ZQW1CnN+|J|MXqb`R7p^Lh}z<~Ex9_SWAZ*p~3#0q*&0f&R~)Ki@8{#w(@)LgzKu zrR4j+>ciE+fi}Eb3OoQ%07K>`7wxkId|Afs{T&OL)W zckVJ0;N9Ly5~AL{{k!X?Aun~OY?yB2w(`JQ5-54+PDL!yrRl@lI-#?IuG^hEB%S~K z?)EyBSlqc&%B(0OspVy~b>-=7tediie_X~lURIE8h?vTp9<>EmB)s&v(cyM@{c7ki zs;C$>F;R;da`yyz&T!4Iz$z=*{aJVu=k7fq`233C^BscSmXkT(T~5>WR$uYmuwI#$ zk}T=3#{JAkZo$r?0m>2O>x>=n`yt^R!i7{j| z&}*T(va!iMka0#N$=Sid{*$|{(#;wxlfi42&cHx!&0&|Wo3wKOJ(Bw_C$zNdGl8wU z8ULBT7-Odowb$(piRZ>fttGqKpb|45r33g&Y|BN3$-xeNG#tt1{pmwnYGP^N>^CZy z(KH2y`h|gY5(-u7o0*B>doS4WaQ0%pS8kJ0@AnPUdGouU9OtAC=&PAbdPD+oCa*ZM< z!2L@1DvtmF<=ndRRNBoWWOUS(u4ImpgY77~U-?K*IsaOE;^GF_@Z)x3=9`nDRoUA< z6+cvOicfW})&!j%*xU$7$lrkUB3exgwga874}S>!t7E6AUWw&jX+OM817cVG8kd=u zM7P*FrvLy02?Pukm>FMm)7LkyhO<4qQBs{$v$Z<}0l>zb++&QZmJem3?0RSQgDK$i zLPurSfu+AhrZ9A5Tz%+~==!Vq=!WZ(+I|K7!fPgO{TtxAj(&K6Q5KS_e*h&^ z^?hS#R&RE0yki?k%spghzf|k7YY%e>FjCgfw58pgLhtYMTP>GZI;u8#?%Mf46vYNO zd}$;MuA%iGZhB_OM{=FNnk0(S&bLc6y9-Pcs8O3tym#rl45ajbaSHUJrp&qDH+#dr zszFB5ZYDv!&}uXHk9Ncu8$bB{0+%I{lH-@}XXYP1Tz$e`(;~Tcy9^qJ!H;}q4;`iR z^Jx2z>bxID*g(gPS64T(GoD`6zgC-P=K@`wes9f6&#R-+I}HBK*MbtSFW&218A>TK zd9u+*09MGl_IK;?U5o#FVrqPPU3~%hYD1bM`X4)WdL&ct#amz7DDNO{FrGPZB&Qkn z6!+-pEb8$U9IA)b-#kPF(Y5Gn{y?r+ZTg;_DbY|*6*jsS9-nNY5~Q->$T8AKZc%Y7 zxZ>{aj2W!v=>u12{`RN;E<8!E`j>~);?8=!qE-LAp|*C)y|GbCf{Pp6IS4PS(b^Q1 zm5tc`G?tEe)MBKW&*6Yz&&rrM{aqfQkpx=;ayHIji*l1GH~f@gi?g$QO;yEz373l@ z{O8fUs`dX`T0gwIUlxdedd}({mkbqap3+hJj%PdnYvWHqEuL zG^^J0C&nIG|7$RK_h~2X=Uu-?;D#MBFET%d$QuMT1{X5$@3ysm>h~*qH<0DCE@?vTx@Tf%XQNAkXy0V^lX09Mc>qq5IZ+>=}qNlRp>qVX4lN=D~@y&JRQM|Xkx#o0! zy>L$^B>V1Dk$)Ffh(x|Go#ZKk?A8JQSLm3v`~Uw0JpO-m8KuU*fWcry_%2`XDK2mP zdsG0^ssZagJUptKnrP|j>gw(Xb)1>H0ZkB0vB(#eVq3ijT=aPjb?{`*8| z3xj;xQR_TiLl)a~%_nnW&f1+aKV`Zg9~E1bH3C2ei=1A)2@suRad)IAXlkLb3EU;R zV9F_$$dv(q3~=tN$^UuqW?o*ppgH#X>er(8?Ecu1SR+toH8Ov1M%s7#v|ap=LA*?a zXid&`He1@w0u8_J5kx-bi$D0QN7j0Baeu*gZI?*&)lLB2ixI|E z$ahBuqqX<%L)Y-_A5Cmagt~N;2d^#co^;G9H&wJ29YtRWipG2GqJIfh!3w({B6NSB zY+yWFB`z0^!WMp9pZskX3cHzOWMHbNBs4bcz9x2{J}xHQo7=rYlZ??{&&?2@V;mgs zaM}m@vh3iG(+f$w*$PI_JFVdlbMD^Gr2}0P`R{M7p4m%9Q&UrOR1(eCcg1|yVjqc8 zOT5|abnal7nw>jBIAGg6cY|Gm54OX$*$C#VU1ob0o0{S)gc7U*XHIh4jKOy`0QuG4xWg9X6JHlbNC0)m=B~2&IosyomXrxt2(MKlSAMNQ;&Ge*-}AX< zK8fPl*&d+BOSdCQ|I?K@|AWYtHb)0f2kiOgs$AT4`DG4;nrwZ^x0Do0po+?a<+~l~ znwt65)qDsf65j$|R>s9-;@-To?>|*5fifh^Jpn9W0gdFajq$>7&{_j8kyl3sIjbAJn? zuc@h#^bX`#K&KEli?RTr9;d2Lt>i#5_Va*eP84;5j*G4ALX*ORM|Q93#0ePHaRFPjmrT}u2DYOcyg7*VK(b4$euNit=wOu`s8B1W-45Ok1Kft0{I7iXJphf z*RWY7ZV9+-#w$(<7MkpC!5{ZB4ioX|4XTG#Nl!WQ)Hp26>dVpmB@(aXk+kTzD^bq* zSB;t#-qdnzyHOmbpRA|#Y@HaBdPWu)YH9kpEznxi(wi-!Ap;uU0OB3+GilrtJ9}VR z?eQTy3blN^`B}uuHSm+fUODqR;BZgDR|?-7c<5PDgWwhlL^>9< z*ZP2_Jatd+UnJs*a3q63v<8vWAvrDY88Odn?Bc^2W?%ZVn|Utd@xQrm^Ov;s(Yela z-LYSQwVQ0sQM6vG!v+H`YPz+m0Uj~_atJx1q z9CTt4AUn|-J%iw=Q7!~2H_2upRbWXxs)@!Hs_y75|DDmd;vJLcY>_#{z^VBXif1hd z8Nsoa&>nPNTzo1plo?q|k=-vHVm{MMB*^^7dQ?lMFu=1zq|@tEj@N->N}~k0RRW3iB|O{FE!}iyK6ZUJI3FJ%-vUi<}52+VmMc zbw?b;u-?6!;7vb{QXer-csl3wq8Tylby}UZr@J7cO5j)#!b(g}UFFzPi zDQNb0;@ZW-IqKRrRXykW&*&j?+&5dCH76t-SGLu|MiDjpZyub}_Pe>SUV2w;CzSOX zt8X3IHOLgZzOIfx5Y5COpGyM)6-Jr<|;jJ^EhpdQP>?meO zMxdrAs~?R!txxN>P3{#u29kPYwxr&h-~C;s=n^pK=c@~b=Y(xp@tmxJvKzc~0lWvc zZ-&Oh$yq^KSeoDJ+`!|F>89NhXa(rZ*TLN0Pig~=a8%XBK1=1OVv^s^c4+iDOK`MG z)iDmAK)0Q19+5uAt)e(0)P9Y^qZQNH_C${R2b2`pL27o%syRYG?%5%O4Wp;@p(53XwbO@03FHzl4#_wjSJ z%%jM|f=Cg_YF4F^Z8F1EQNUq`FffLg?TfgMMqz)D3gj?)b{SM~mzKy0t1t>fwtb&& z=7FFo^=H&z%|Dd=t>&5Skm+ARjSl|yC&$p5TrF9{81Tuu{o7s@l4=gzZyV+U3s@ae zIoxGTY50wLpmn5C;98VzW@b`)*7y3&I=*+pKL!hQvSY)+AeYwGOO#VdX`l*)z>HCh zTIIVIu(evQx{_7sqXYKI8H4;=y(sPa_GbnhP=w~fYAJfOVlG0H+<1p^9C8ly+1ewD z5w-7ZyH-nI9(2mmGSVRCC#y9wqO!5i-#t)kI0L1!9c)gW$a@%9 zrf33Otk8n0bgJ)ys`Z!`a(MC(5-7$jzhn+*Oece-g;>y%_JUHfp&V$9Ngd-NWZ;>T z)&xIAT*Ed!fS4%w{CxhpOx2KE!x~tK{Ub1452mjE6$D-Vj&}I$bs0iRY1> zJ(pKN!DcDAo{1a&Cj_PgpZf5cN%@5-8y8oALIzoxv;vbn{4vE0_JvI+1y>)z^8H$3 z#YL{HUaw_x@zw_~7R;C-mjWaf&1h>sl$8q_DC!#- zk%&A!ONeQHA-7)in2c+G^&LQ<%1qv%k9N7LvXY0%rR$6PURv^@snK+oaI2Km(=g(& zv$Lvub|*Bq;b+1NtB++xL2tT^)v6S4qRQq6wdP+ZuJ~iW2`2EoEgN69NY-8B;$|Bq z+0$6zc-#ByQR@@A8sRxxN4 z02fnS?PSXFnDbeAb}yNWH6HGGLv(bN9qu&;h^arP0J8H`#_LR%j8{L%u9I9ks*B~= zS$s$zc#)PYs@SrPQc?nHI%-$S6;Yu+s>4GfS>1bBW|dvQd;$_k_$f8u-5O}>UD4G3 zW9GU3(VBHPrME$&VstjjE6?Suh7Gk1l{2{*0}ZLTS=UdSoHnDEc1s+cHBfbBxc-@e z#uV+c(mAU_W96Fm%LJcuUx*mHBo%VHA-+4$BJ=PKGK!~Z)`@%SY;)tw^6HJjXoZ;8KHub5XMk|%uXp(uLt|?zm!hbKd(XqD07neYT zh&759MH&EXuoTRc3`nq1AP{Xo-sH8>IKIEXy;`h_&Rc}6Tq=U<4%tMRwOznv98>n; ztpU;p69A>!yJuRHvc$s(4pDw1w9_kHQ4tvY@+l|WMcP}wv8w1bVEjI1@ifaHPon@s zn{<9?nS$WF9NV?rkD^}8vs@3uwK+dS@FH@f8$36;+!$Z7$JOF{SwHR?!T)JV##=F7 zwe6^uYu3W=Oesh}FeS<>XLNG)J`jRl_cM#h=+``2%>jO5GGknCiUf>eP*{WD5tb=uM3+OJ-)B+^S;@^f-k|5V7!-=LEF6@qO|B zZ`z2~lpjZ5Uu28kl*MHGp$S~t^70Zu;2dOx*@5TbyXKW@M zCRqqj4WYr6Y9z%kM^Zhlsc10Ume5udEPE(OTgVS=hjx8(`(fm@z~9s$g5X8F1_^jF zuU6yES@?NH3Sw4$D3*VZXCj*m3c9omRoSO1pUieN)6oYmQDh7ID{XkM=;>!on5Y#$ zt=gY7NJbi8E^>CuWD5owkA9tYk0!0%=r5E>UM<8Oo((`9HneoL%b{ZO=Jedl zR_=c^jLelN*vrOZi;8H<>R@*h&Co9SqpyXjHo#utfXD#^>|Z93pccr5u-Sp znvdYODd0V_g>o^o*wrI}NV=wyRu4eKTG;~!hmumA`Sa@$L~IX@B&@t*sj+`^7No9G zqA4IKlbKDWW;pgCFf%%g%KcgeUW67%_F4#{2}`LF9xF_=M%tJ<>VOlL+!xcLVc;@c zA=n5tx-T|#0-B-rkj@<7ZM3)HP$D`SAK-p|)&l2UGlO&zSVYB7Ff6_LMOcc<<&o0X zg~HxhA03x2dE{q&FB~E^tPn0Rx1YH@^`n%}@%c(5bx-&6@}0h?T@N+dbJ)M(g%G)R zE0Ms|U%U(Y{g*ms6HX>+!1N-H@-U3UVBPHNH@7~*S7E3^XApr@r|pwhgqcE8?o5JR zgp4PqL^7loOzLDD-$>7O)TJd}5$eCNo0g{buF#+?E0<&-4BIj#ZDSJ^h~u`1z4V$4 z59~`lOnPqoBbdh}TIlqvQ0@^0R|*tujSsoZCdbiJYru)0o(a^a&StNA(}p-%$TG10 zR%$M|%#bUToB5pSr)eGS)qJt@PIkt^i*qMbkA~ghPYg)P9iGv20oh*EU3r!=`ysOo zZR~?3XwMi5CKvI&&cf)?AntdwaUDmgX2pVxBpZMq^3V4K+n@VvWKfaU`8+kDY^` z$5TwMp@y?xty*+BgjUXVT+7k(Ct-!4`^Im6;E>At>I!WNxSBmv&w;54e(II^npas1 z?5Fuo@ZkPcdMSF6PpB-38UPVku;|LEBs|Q+o`Ghw{UbJ7;GY1^4oA!pVxD6x6P}Rv zODzxx=>-6%M$<7HjA&TedLCfUdqw7N7JmDy1#TZN*Z1! zmksLuQyo!B{>=Qrs~w++CqKPv_(7Ou54o|u3h29g>7NR&wIwSe9`PLY*db|OFpgvT zGZ=o)OrnUaIaQJI6V%!7@(gswON&C^7`D<_Kj1KouJIP}6_eZ(cx%iPxT;TUFkc}V z;QG6RMX3CBK~o-%U51kt zReOs+0_AmcP?jk(Gq8vbeeF8I$yx1uqA4|1+3bnQt?DO9U~K~Mv0Ovx&H0Z3-Pjn7z;Ul77lPcx?&q1#3KaO?-2^!Tl$PnKE&>`VRLwEAUf zf%6}G5cd3@B(o?{rHIy&4xGS|J48>S*}mY|^+Ug-L0geKz&VQ5MNxpn;C(Ss@%-pU zeIK!%r+>^`L@V?KUd$2Vg|S&(xlSlwBZic4-I8XQ=b2W3g7T-_Wb z1Z<`BR-osm5Q7Gpo)`pow))L-P*HJFP0K)pT4u~F@z6Ogs`V5<(9C}l1H7bwZK~QO zTJtrzs0~oA$H4aSXiBT+oc#?lLl(^tn@4jQHs*yE zi8O^b=AmP9r!pYx6)BIh8$St7$?+_0_wWqkARc}ncC(Zxr$6Km=Y&VVS3#@m+sdWw z`L3@vq@py&dF>sAkmSAdQw?dh&)~cXV z)fKJDw6I&NLC|}c`;GV1^7<@IdIL6HaFqe>3(LAkL-0-2@{{eq-hXZW36@Dc_+pCs zMnT_)2LqB363Eqi5(eG%HibOWxVOP1_8@e#E0|AGfr&AWyAS{Kvx=v(B7JllOe%2# z3gj+KE^)9?F73?GyXryD;st%A%^rF$2`-bEeMN-i-#4888n7QqZA!bgtVVMf3e$sc z?a_9~`t+09bXsizhzrqB> z-TRDLY3OXMX!~4ZfgRX=+b0wcFDxnB(X&0A&6Y9kqpw3e*Q}wpi*)fSE8a6&h{-OU4MW(}T@4wn}e?Lp|!Iv_Nr%A$E#1bh$)$^)Pf|R2FebYpw2q zUA#a|P3!lqOf*Dzr?IiuYKx>=g({lw82HB4v3h{z@HL3fV>a6hiES~`w$=NBK>$yp zRBg+vx_3^CC+9WtuNM^glh)XT#RRGU;Ar(~-ij8*>=@Ocl1rP5W>_lT8>&?|y$2|g z2WQK@&QH#Xw_7pLY9#(7=t!ZPsaGjF^VksBTzXy6U?OYP$1(zQ*@KqsRyVZ}7G|g^ z;V^vsQ`W(g&#z7|=E2hF@_vV>;o%Lo+s%eGD4?E!-bZEsup)=I%{gTGGTN$?sUUmL z9&lN)jfXd2bbe;4U@ZM%%@oSk%g2ZlwUSXT`F^(usKKVIH(QTLQ34>xQnjpn){5jD z%o?DLDMqwZI6fia{PRT>S!2b?$&Ne`oDxN^@tCYtbhY`xn%4o&uD~E(aNA+p6_W7TRJ%ps5@UK0a~8RIN6xd1z1zb#x7g zCRbO>$vPiri;MCDLW@h^mm^D>Rf%|)A_QON7>_~EW)w619O48j4KgwdoA*5iHonw! zUNfmm0%4&|vy)@|MGNf$M={Z`iZ@{OcVq018&l(xAK!*+^Fcmc3>zY5vF_To2?>a~ zo*wyR^X>P0K9!hr7QWx=#gPK)0-mw!IoMajY9upE^N4H&ak6eU%Y1)bX02}K;L=ef zRX|>(V!G{yeNAT5-9l_VG^%<3`|v&wQ#wMaExn|mK%XXC?;}t>G?`nQ*r79n`jci7 z5Pl?Zrbg;X`{El|QZ`$lc6WU)+o5Wn1qjHK7I=Qb2c9jkgP^96w;56FtR4HXk~SQ5 zGuV-!$G-2r;Tja$%d%zFAVs7cDG*aT^Gc}Tapq@M*52eCKf`YR?TngMUomkxboAvA zCnv493aXH!0=i3!(g6o^8AfUA-_*05>jfX{=}qL#dUSeNTWbc>$kI>xHtt(we?bYng#vw%%{ zZ8yswPbVt3t$aQ}h_QOQX?%;51(MqLIB%du3_xN}wh5N?b10r2@4-}^21V+p0y{4S z;kpD!C&pMA{hfxL=$X@!GfWJMmaXC|Rc`!a?u@`Pqww0} z$&w#)0#!GS3FEH(HU}iJ1?G$7s5!wBSJ=sBINHA1j+l~!lEnuy^Ud`)$|8CY@hJeV zF9`Q{Ba3TEqh;CWHcmQp>nJTUm%TCUkt@pRi{F;?ErH0DD&}= zuc@gedp~tGLmE&}otN@m!Z43m*E_6<20`2nYi{M7u4{DjmG$0GjIZc9mo@h-PNB5Y zvR!tb!_`2cQy7dPki-L)_k+VL$^T@hHUoy6oRy$Hz4Fn3vfJTMAJMi;xzU6IMLaz{ z)6sU}N5B3QMvIEtB5E^h2GskZj+5hXRQORh53O>rSjkrSrro=jG>BK5`W$wf0)bkX zw0L{-HLX$cr)4a7YNnXY0g(NYBSf+6*3=yT{t^CzMAo?3LNFiur6p|0pYh>sK9}ja ziVPonANVcXbC(4{nQw1@<_i*#!6ZrHK_|USBJu%YdnbvpA4y$0+)dw?eciiFg-?7% zH&Eil(ymRKuh7DzogD{n#n-}C+&`=SD0!^-7R;JHjI_L1T?9Ityr^(q!ZGw$c1Rax@RnoX{@xKGvA_9PB1z$Yg?1`tEuRq#`$@Y zV4v#t>~aOMon+KjR98OYYi0~UU@`TZ@ohwx?l@I+oK=O2))T>S&lppK-G+cDt=WcI zmhS?N2*f3UUFb=*0^;pb5eM&6EVh32K>0-7$Vx0DL>(7Kslm~eK0zcJt z6ZX>-6m4tZ3lurFp>r6IIqgZ#!_ImaADBu8M%uSp0R*-IgA%X9R-_puPjeW@q%%%% zJ1y@b4$5~rHZLZ=`m_9vG|bO64U{=P;!X_q7oUv$p2;JF0m}qcYcrfr=0tpVXih!x z_4sr1lhlgaso&Oi!@WXSFM`=e4+;z6j3>zWFk059%&~@^MJPV zm~zrOZp6bxBFL!!7oJbqM1YOFr0(98QEPk!_8dBM{ua?)Y!u|uf17u-k5d~>afq6R zrQ%ak?lm0Ajz2hfN;?Nw5+Ufl`R3Fq5`B91hdQb??CKMDTkyf0e7EM4vf{fBt&Y~q z?QY@21g7_?VFB%*?e9N-wK(dPEA%q)aWKPD_kxQ!URoQI*+OPSF15YukKuat(=Pu- z=dBm}ES!SUe%kjmyuIG{hArKq_v-uIrulo33?+6uFU7q$D?6Sw47~T^43aPQm*|KY z!IH=XHHmZpJXPT;V{=}Y)D7kfG@fT_2QMV|3BYe9wh89m@Py3&aM|jedvwrRKBCkj zatk;F(mh{ry*&SnO4^>y)H5&=*njpy_DQ8f!NqZC=y@Y*49mFXW?J+0^o=jRP4pWF z{jBbl!Y~`@d+pFpU&cRGqA(OQF)@jat(nRYa3~|q@NvqFp!O5eADH{h(GX zauIq@LqLGI=pgRju-VA+xuwzU38xyqxWu8Glluu7m_9h9Fc$U+};oI8V`57#N9QW z=lAHXl*>b$L|*g8Hb{vALLj^E{~j3yoV<*cW>~FTqa|Z=du6n|RB}2VbFrA0+N%%nw(ZeHN5a?6;ooo)q=J3koCO^b;P_?Tf5pYI@o0rd3+rZU&1WnLz+Bj@*lM})OJ4to-8mdnoJtp=<;f{=3i(rHmN*pB`YJmBy(y12w zCka)p{gF?|F>e<;#bay$PLVL$yTVN^4Mh=AwEf(+2@Jo-PP>vkjd!0qg8lms<2_^TQbM=RdIVXg-kFC3A`2lGA{9)Ge4LXPO*3Q87!k zBSieScHyDEY`ebG0WW!mzTWIb#z{)DsXV!M8;mwy%rw$%qR4me#lnn^{<};T#C1b} zJa3WPul|969}PAWHTCSrC4(a>c-!|h8px*Wp273DhSco(`}>chHoj;xTR;0087rrE zHKFZE!sbv9J#4A z&dHy&ybkYHYy_2r;-s=gTrk6KHGUUmJ8==?RgHuA zilVc@btLotM{E6kh>wbMoQCyY>cW=5_SM@&~adyz7WBp$DN*=8;wbNhC8Hl=|5WbzZ;cHUKU#x}V_J?HdG-&I)*vFYC{2#3!u$Jn~+D!-u8=+{qo4>=t z6@50bZhDwxD_@wqFv~k8JT#XaTU(y0rR~8aqgH#QELH>dQ zSOXNssikZeY;>_gdQT!t@SY3v3pxKpj&}Vl*o42*$nX?yyg4H3L6*+}b9XwU*B`3r)`h7gU z9c{@zlm!s@HN!Yd)5SDLRiB}BW<~DLQwTq^=27xjpFMf*b-Be`*i1q}N058;&>QI6 zZD@QfE!1w4=x~+UK*JCXKiA`+a9gQ#G~gJ$bgx_FotQK-hAn#mFs!N@`(GbG)COM< ze6y2PtguzGgDlAwx4=$)HAt*_TDW6W|l5?jy8ps zY)-i?^Q0WRHL(`n61>7?}_p5d^EdZ{K$gwT0Lb4;>gl$gZOBL zBW}4IK=TQ;A+o>THH-p|p5x%dZ5OJ4$7C$Ln>Bmq#Y=mNSSEZW3%h4T0=BBzm0cks zxD1aS2ezF{VStgoPx(89=UiyB#m4xGP~j`%i6QtsW`l6h{?My#mN_krLq%p5md#7y z*7~d;=c@!~pWbRbO?1|j?Ji{RYbt!rVW*8D?(Xj1Sp5177<|tZ!($@^$R%+5M$f5-& zB^#Q^yy;iat<5Vl0D&N19a(xdQjyuCm)rP_V(4Py*1ZfUJBRz6pH7@N;IvMCTkevwl6=`)aS z!(tveC@m9eS1PPj?`LG`5Ii1CZx}6%9Bh7R7!jdu>CjTib6UR54Z`v>BVuV5L<++< z-eH@)fg5P#=JJdVAQsX;QtxOX4zw(^R8oyXH5GH0d@s@CB!(0LK)pu(6AIvT*D7B3 zORRZBbd$Z!2o4LLtK_lTz#-@mTv53FaH2+^E9kh}BZ#nwQX#6Qe|T_I6xjxi%A+BU zjeZ#0M_TK4%RBI5aPC;~V)?tBG&dz;X<-Gk^U~W?*6jb)ucbe)V6m^4u4%f;S!lgt z<1wRv>5(e$0O@F#rLXW4dkDN19l$&|VrA9giEt7qFl{wXcH zPwoaa$;@(Z22k?@H;?F1{o`4oVa0sHzw?V~uYZPCS3d@FmD$Z4T3M#$o&yR@eBERz zzUnF|j*RzhMR*9NGMqzvTy(LVkoFrEdpMV7fJ=C2u@&F+-1j#C+5?z=25(TB&C1ek zSWX&iYrj3^?3Bra$my{j6!f)pgtMc5CH5xIPUoA#VEQw{xaXOZpVTs4T@NNPV}-4b z{dIZqt&*Hv!?2<}JtE}+=<7b7ee{zp;m*|>Z-C`SsqJp=IOWC4BUdf$i9F(if#aTp zM$x8Q79spgd;6dJjfEa9jim#anb3Gi_Zs|M=MpxKk2XM+eEJ6zh_1OAxa}r&G7@lBL&GZ2{Nj;+ zXgNYWLJO|%$xrVXo|=9TckK(I$O&WoP4rc8G0sB?0PwTJHbw$u8=2QHAG zr7_SR1n0KX`Ywd+cEr}*BTaOSEo7I z{ct}&C+;SbC9#`ZWY*PbpVi+n$%*Hf&tjxkww6)vk1>w|0G`wC0Y8zGgs*tskk3OF zHwOsjGZ*cK6m+!xe#+~`Us=i(_2Q#MY0l=O`wXkD7Uaoyu|x{oD^2FLd#jeGKO`%A zsBV*}^S+jUwtEl?XD3Eh_5Qx1qq0JoM|%&03{M5}A`e>JCp(Q8w8wTQPM|ABO*|i?3a|<+hBF-x~g0!Vh#_}$mXM^9Npeej+~427CD<@r9$^2{+<4Wt zwHe>Cq3-_p0{>uf%e_g;%AzAny>&dFyHxfSII7)<$Ocb;_X1EUWmCFQ-BUl|tbYHOi&b%NjI z8K#H%x9AxdNXA1~2nYVoGOG6-RrJEBGo`3(A{5;kS-((Hnz4Jy1MBR5fT58 zF+xM}EUm0;{rn7=nVF#_B?NtsO&uH@B%2o(7yl5*$;nOLaxS{Q>eSTL;iJQeykTW! z+HP(K(*Da2-vxb+&vDb9X9AObC^IMjBO>#dc64lf{3#h%$mTNf6If{};eNp1KVR56 zIPROR!T!tW%AsTocfLzN7(2%#9tU?mVtr*m_D10mhgz2OFcUD2yMsv|E+zS0XDsOO zLk`miGKOy>fBu-1D|Opao_+Asc|mlvwzh^}K&bJM5J2q0q!sdmXgn!1leP;WLGaQe zkxJyzqenp~4h3BWxEEcx33&)nyCZ|T#!hhSe@STn(TE@u$q!6CS+OxOwr*~`Oa^hV zTYA^$<_~^M0`S)^A=A#pi=FxJ6^LW^nB>?05R3)Amdw&YnL(icuv@I*GXKg*Qo0p!S zMMt-}taj$~W|xz~c`&`5%LT@Re8eI%Nq7q z)RODp5;m};kV?+gOaA2w;^*3VyG?G(it~aZ-NB0KLCJrfq~cE>tlsM8ZE>ytP@l$4 znkkB z%adZF5#dmRPSTwFa~Ze9wKb|Ke2>r@+&4>L+VQm)f}YRL=*Da$>i&NA3d-kOg@41@Pdmh7?_y3qw&D--qeGuw7pY zN=m%>c{AfD8>5Qv?Fp6=a!#|{h%39ov|oss&J_TFX{2j(6)&peUH{$%iT~^u>^fbg zT47}z|GFIJC&lv&6C%;EFBzghi;M<4w958*%MSPlMNyI9Iqi`9Y7)v;KadZxQ^3@rZQ4E^Z2^r!~B_CKQ9 zDu;eU^in;-#?ESLYNXc=Br?%1I?O`zi$VLoYulgG3YI zXL$jZ+#|_tDUv7lqzBl~_Z-;eC5%*SBR|&Jbg+UfcOWbXw7jn!wR{0W{mc7((rXCh zx*P{a{~8)5An-Rbj)s;i(8QUIaH*1Pip_HAMjEMrbC4Fvclz;`s*jNP1U|O|Nn;h& zM8iuVue;>iO>9fFP`^I`rMdLn0b~R6<}@W;)@^x#nKDD{|9*@IuV@6gf@4ThWs{oN z*g=9^YY{hEls?@hBPrNq-dbe|Hj?U1Br=WzN#cVa7?!3WACqLQen$mgq1gO=^Z|&@mxj_WB`Z+j*WosiA74Qf0k1UBw!qg!kCX*@ z6u+Y)eC#cn$B7I$1lBlg0Cea3cn4h#%9Tp_x8UlsgUT(VY7EKANEq-q{O2S!ZVjqg zO)~UI{@1uNI3SkQhKgcn8YTcCGR{@|9E9?Uc(9R7lDH!o9;1-gOgQl32=y@{g&Fd! zTDD#UzlC^$n~RH3x`i<1MP>^36FeoQ`8%|^(~$z07n8Q&iyX7N>(fZ^aj1mtmJufyjq(79J1DVGE29$7iAml9>$P;zIMHg z%27Z`0lS)qyN6zC1?<}9Ty2ekw~23-{ODP?0mp?hoNR?wmJ4+e&1_#Iu!ZtyY)Gc= zGIC0TZbofxU$&9=YX*li053Y7FP>?eBnft1mm=pW|>1UI&NW@>7@ zbC!Q^8{UStyqqJR;torWXZ9bWgnR_$M8GaWLm$EEmx7ie>5ed81oy5CQJSa2GJE(- z$zSvlnACjyB#klRTVYZSj9AIgL&?r!eWWoIO$m@#4a0V?NN%+C#DWCjlX0NvbR}e8 zo#Sv0u?ZdJ5i@6`FNF!Gau}!x{0iFzz7{egFZ~HAd;+R8zUv9@ZmhUstoHOUN%K;-JH?W_R~*`_1g(d zl1IyNg4^pu*_|W{NuihaS4VH5wI*i0cy(jp`H3dE7OcW=Nzdz%(Cfo6y^~a{zaFrd21hA6_7(%^F1p%puJ(vH0Y%Dl`s#QOraP#* zJ>?0|Dd~&=s{ExFz9>E5_-#d4B;hLp4Ok>G`c{3!D#~;h9Z7mCW%+JoW@e_s0+VMO zC5YSP4V%5Wx%o%=TSq+QsebXeJ{7SCf@q34bpr% znQ^_No>1MsLnSb-Tz~?i2kalIkA3L4+FfJ@ zH#GFH%8o1F`wKQ~j*7tq-84m!Bam`zoDYhTwjKZ9ZTuh>2O&gP43MOl zf0n|!;Y*}80FzhfK8Iu?llT*A0mM5Iyrsny`jT*CFhY6W%<3Kw51^m8O1b(U$YoTT zf{;`L8m~SK<;^Kqg1;Zd?b)QH+uU2pc+sW)g@me`5EdEd*;UAdR>Ia;dd_Pc z&J#PyB@p)!ObZT&qh<)}yIK2L9iAMM7e)U}*82O#^i=<3q8O6cEejR$0vdZ*%e)R{ zp5WhpcT-Q>5m-W~XuC&=jQ*f(UZVs>k{fmof&!J`pcueZfc8L28&;cemCQ#euUcMl zI-olGx7Yhv*)j4TVXMfC4zmXwHYUwxXY9hOA-geyzH7DT1mrGC5T9&?~F736JqDRc7uohUCulYSa+wh}Bpd$hZ+n{VWT zZ)?DT9g5^Hbi)kvr+@@l-wV~hh+z8BQp`PZ1?z_S1hHn%kLk4&9b$!;pH8LP-9&}> z$|m{1U+=?^zb4pa4ej&O2sNsXkrsqk!seM|J>kA_ZE-46{ruSz}I4Ovg8225_@@ z_d~x%AFY0};kLz-tfKE$B&xzms@=(VDUPGgKPy^D0gn+T`{oc!SgZHnxr z;Es}X0KBu9`Xm{-isT5^3OFQF>Q3nsZ%gT!eVQzKf=!O<(?jCEw)xM?%yxLfD~#C) zh;Q3A(0qB9ub(;au$-7>T1ndaEs)z{`IP`%yPJbfLhLZxw>o?gl!!c>j*^Yl3c{>N zCc)V>HrK{zF4EZ?WvMvi&ZvPR1M(&Mf>Q(e&j4KhsgnLnKvs>E5ycL~8%1+@QskF^ z5p*imy8nN$nHd3zY5cU-?OWk7UgT&3gE0L1Jwo>GU)Rim5o99hJ}~6o3#o2LPl}Eo zacEZBWyMYG5aAPb>h5?UlMyxnxA>=}q(xnOUN+OZc_4+vZe`%dvnlD#D6fMX zim`{%CLL^Q(+WSPC6#|PQv?>lH$R(T$YN>FD5J?|lSKz(C;+_vw{~y_8XR7JCuUA@ z0r41@Jp1=n4={7YbXD@n{Amp$Jukmq(+I>+K0&7EdcBYN#->icQ4;w=p@hxuGO7_Z zj&HCeqgui(uR<0cE)WC6kMTk%yRjKo2Pr;9Mf9aZARH7WB&}@F%U%l1O1^2TWR*#q zdz6(MnoG``P17xJ-H1R6#QxB{nPLg;zpSW)${iX`hGGbkMST@e`*iJg-$;Ya9Y{@w zPcDupaGgi~2k2&O=r-#EoMGtzrA`hJb=suwY!78gkY5!Plni?{L25AoPQY@fCRGW+ zcvrE?kr!u9Gl&U5hm7)?cjAx_A_fl7`YXKXCq)x^FH0Y=dE!38akJQn5=t;ST43m6k7-Yu9P zA^9(~$vn)*fg4ct)#~!%u^KG&W8V@^2vp*6^FHDLjZ(`6$1_ENFGI{ecA+WaI>1Q{ z7w?d2lmck8mX(xyRc|gLY2;a{p_N1lp>(4ZZpFZ@ry3x^=FdHVkDyXo|GOL zD|gyf@g%7vqPiWb$%E%D@9u-j$8d(drAwm9`z%`vp2!Fg@y^^AL$7s3${%t1pnfN6 zZdzRQ_33FQ#(Ra#VeeDX?3=$2hO$0vrf)m@AXz;ptbw}SUu;IGa)MH{m2w0!2T1{M zK0uOue$e%apM0vf>o2xEnHtObfqNQTRwfQ#E>=lVh=TR#h+kqG7NpC$RBZ2C|B?Q8 z@d~B*QjR@Qs&G<8J!y756kc(=wO({`06#IIq>oN^xy(8?8a1wgkoBk7WsmP9{F#=D zv6D$^{V_s!PCbsilKuX)gZ+d$|8jsRcq}2mo=N6xs07{j=z!@A242m(9Ek9Nq(vt+ z`m9P%p(3AQ9A4e!-!iLthz?1_8H(ahpIo)|oD~k%xYRtMZD4k+9*bfdFDW(aO*^sG zBvaBcFP}SpYgcDVP+2v|7ar9S6FmZXxLFLx;)h^kI7%XU?d80d7^7TJp1>p73 zA``6YU;6xCgg44`7{pKy}cun2JcXx=~pr2_kd%gn( z(Sc?Z7zlJw@4C_NB#kP=cQtzNfIvz5GF}H}D|j8#3YO>iy8?4A;d@HClLS|}lFPgt?xeG5Vf?GjMP+m$xSV^2(m~M_ z7g~+7s;fco+Q7B*i*=PCBd8%t-HswT1H|A%CRM?!xaR4|p(P!z>jImob|pIRExsIk zU|gJx8_VUQuKp5ZDv6D?vB9drU4h+T-gADaH*XcHo9*=@83AJqodc zE&v@aj0V_vJ9;^YESCO5$WJIjXwcrSD+PlXun9zvcsp;3IZ5BiO(oQ`cU&$!EMg*F z@NjqmLltlcYlzZ|@)R-^ic%*1(rzF_u8!EMyj_vSu_5KYN`!Zgk_G*#6LY7dlYxA| zCAM%1LiQszvRBi3?bBZiR1jo$(ui}XwHdI`*lB_m*nSxOBCwyl-8NiN@XTK3Ot@d@ z#UT^aPIN1?d{jqzFyUuf#ATKkXt4K5e~JcSYpwMs#%ay7%rt;Km0f`%57>E>yg%-o zE%eA9daQf3tcEF@!xD=qFrZSr6d15}^6hMTN6~BC0uFb{)^}GiYb1+(jy*0cbZRFh>BblFt?`vT@mxNgTsWN;< z5d-@iz>&$|kYuSN zo#9yJ`Av4gOHG*qJ*uPzdl|JEZJtf`9QnxHY1QCP+Hp!<#?O8;53UkFs+Qw%!3Sx+ z%bfEtHBC?u7u$%$PBe|`KtHPvMt*8^J-_3p7fdosLe=|LfEReIC8zjtpExA5UC+u^ zaEfxq)GTS0pj`QA!lqf*5~BokDBekn41j%#zJ4;tiSYIH70O434>eK`Dm~uLZNNMK z#~FRC4z;Z=npcmu#=qbtatGK<>^Z4T68XdUBvOdl`+&&e3=C*EGaj*h=hLMsk%Yb; zq$QZj82_f)Sfv%ecs7ms&EU2UVEEsPaYgh!bn!$xQ>O@l{0)fJXI z-1kp(2!NV9FuF>3S~HrwPPAM&a3YJL4NZ}lOGc5F-KNyKPu-+U!Nd1Fi|jTw3yVz_ zg2#lAWs+5Ib_!01f4U@0i@Ozli_u0z0Y<9SK1qFm;y!Yh(uYy6!E7BD)%w8}F(cwT z4pcCzJ_>k@{NT&nRShYBOj1XElC&!Dvt+e2GJ>~>9kQfCbdHL4T~)gpT^~)L*p3pWNEuEGU8|kkr zJL9fSOX(|OfT>I8VNwe2?q~$UdrEZMr`20+3miotWEb=$&K8rB?x~l=eX4McS+!BM zPoN}!&3VhW{E%tA)*eYLuw!>hgJl^y_^{=GUrBBv3I)s`RUKdo0W^(El-n;a5^cX} zK(-epQoF$((X_cSjANEDhyAXroFUZqwbwsTYYyghG z9w+YzaTy@cl$g)*m@@5Yr5loqdx0r}@&%WZ+{a1zP8N+RUhh-t32gNBmb&ACsDyw< z;PrsK{jKXla($CtsPAI-l^-&6|E~Wi0+k|lS@+n)J0{L*61qZt;B>mG7830q=6`2K zUFylL8+*Pr2b$FSTUU+Tn74BJ`B-X2pr6v&0nu*Kc^~cI=LZr-eVbisn|-u9#qH|R zLuokBQy*5()0iZ6xz6aPb@4fRlk`H$uQxNPW*WB=;?9)5Mhlaa62c20)vSNyi{neW zPO-1g7juM@#3m`PvP1iN&2+Oy!*q8-8UGsZ=nD!COR-v1*Th+j+D0Ls(54V%eABs+ zEPhErZ(}_t>;;8ladhKYeWnn-I{H>_7=#1h|T5*LdHcVy}8)`&zHpk zww^_GMmL9l9QJJ+&`+gVBt)m9@$PQ`s`#hX-*U@GNJreq`v+a1+MZ0dW4Fi#gm-;b zXc-0TN=>8L80AHZ-L!qMF>MTYlwPURuRTpxgdTJ$GJGO4gJ^U|lf7A0lnNgL2@#5n z7sQ=^)`e>amgBuZAQg$A)ESD@Kgq%^9Z~F|gI`M?GW#xh&H&_l2-S(NOXhM`poDsG zg*p9xQX4~BoIVqq(A4u;yM0>Kf@Buozkmr$Nw+{v1YS1ck{L`GapEJZ)wZ4_I1~N> z(rp10@BTyh6!TdX0}*h45md&!su*mC4&xjbKuajdMIz%)qO9SHOh97dkIEgz`52#J z1sqIZ7?1SR2=4L30t*H81!1A=tbvPs_~0ma;tQ-!FtOh&$&+YmUVrwlkkaGe}43>QUHq&-0TEWv$R%NiR7=b_tj(p!xblku;fxR|%J7ds`iri6<@&3E3$2uEQMqlrK>uXmS}_G$Xps85;4xu68rsM=bK4uY zz1I^kDTgNld8lENc;599?J9x&g3O}jHrot}bdu`GXnRI?7Ahr~BB+7HQ7ZSr0g<1& z)k*~Fw^M#epXsW`Y}i*wvVL!wS56lprrUA#p$s}B{?;T@ND7=+O}*%J%6U3*pJ8KK zwLLxE7*%>GG?N# zd|F>8W-l|=B)qLWi6Iz(TN9^AK7QM&xUfrfJ`g8`6+7ZfxI$soh#5gA&F~X^A9W_5 zvm=t!QOCl>%<@bm!ir!SpCQNu#tg(cM-wM*&<8bQdvSmHIE70HuNnjdSr^Awx-+kR zS=paLDR8IDrD85w$_pvnMeof?&c{iDGMc`(0XbNve-*o*!$E__MJ!OFNA%>0GUEM2 z2g)IZ95j>agLQh7*#kxsjfyi)&CyB`VwEh&SlISP6_ETJ&%Q-^x$+j9yVT;~V zJtF*DC<1o+`PgI%rLOVy5ADY_Z1Ub-BwtFUVz8SO8r1mFLYTWb4(b3Zw9jwPn-kAp zRW?^HsONZL>P6AADDtbcxVF*GKqn4|)!(-)Y=X8*UzmC8A~xChucZSqPe3Psn8Lb_ z>mXY`wZVt7<8aIWD_=pXgg&%a|CWEfl~1T*2VDvWd^+F8wH4Yg*= zZ#KbK#kPW7ryVyTSGx<>?)&jap4aQ1M>DQa z0&wKb&34_jW(SU>jM#Vw#Sy5t?eNUc)+IX_HesQF)u;{hX41=-B$$;M91FT)tA_?( zc7pK(6-YWx-q&rdW!O+ips0GQmeV2{U>s)$@QnSs(5qjaq9I7fP0vrqCLo|i{YLA; zRqcGhO2X&w3+FWpBze%AKWr*yO?qn}PL3$~K0^6B;!rYFl;;;IPW`wSvKOq#0Fn?t zykyE(YD3_dWWuGldifMb2E$i=K9g8ZVmb#oZC09VPRxDhl!&dfD>3QQzEWspwt6Vd zn#LujSt{CUr8njTTN2Ed*XV(+AyI=&qijx7XO6r{+pkc4Pm|u|HeGVs_pJDO?Ur92 za(+y@x96A=At9&nz)~K8OB0bk2)%|YShJD2X)2>#lNr<}`RdxJ+`=!$k`Q;2i2y{N zAO+3o%f3PK?uc)YM7Qz?Uj-jFS+`6X#3i;X!0l_qT>U}9B}4`!)X&_#%?&-%NQQQk zyy_zy@r181bzTGd=~j2UW2rj{+w{4asBextuBUSKbuocA?iqzZ^n8UQMy4a~<7k`aN<}00eH^9o}zPXxh*5 zr}4;p`i-tbzx@i`YqFfG2ax#C5GXnM4CSWoM3?RIgD;%9Iw?ZwC+bx^atrv5X-V21 zziJ7WL_i;2!O~KP(ADejd{}BXIWAUqNAP~w=oKPi(QC0t1WBYTmevN@q5PvR{~O%n zgnlA`F^nIVgdx2_2FFmW#|q^c)LpC<04s=kFZQ4FEImL9?&w|oa_guex@xe|bDDyE z?0U=FkGP;5{7iW0_4UEdc_&=?0sUzKatatncka>g`|6;X*S>8wA9_V%!vX$YYb7uL zC#!fX<5q;?p3P-kD5bA1fF_qFELnloYyf5qz$nvKnSuCC8rlzY_wZE+l~jnLb`*=~jwQyi7zBzKeGjc>1dO+9dLd$2l^pf)S5{cI=Q>3)8{g3WjKhVz@(#MnZl+>m;EKOqNXjWplk|L#UGY?YH`RmKkkrJI**qRu8me8=rkBf=WYo~h;d8jEA z7?p~b3XqN+c|tuC&vNN61JjKG0KcP1p>F0Ha9MDa|OuZ$}?BjTrAfllK9cx^fq>+2qnQlWy6+=MJ}Ys z67ZaSX;OG?vETEYSH4dTM0b=T=oe0&#t%OvHth8CO~o8JV*RNdCwRM|X|&Rf7nzHz+4sQiPw2t^{lM3zaW>%yP)#^FLo z$R`m^8V`82q}mOw-HI$XIrZEM5HV_>^z-AtB$Ez)^>gdVPfL((4lI>Nap!c$CgoGY zHQ~M~;A6!f%}ZS!(=n{@FA3~hN_dB)Z5ONn8>%h-_3 zQeAYm(xu9k;>&Wp!9lE=<<8s!*FK-pSw*m0j~;Vks={KN?R&xOd$*DI4H8#vwp-ruKtnNp!g$*L}E# zG*TKpwYjR^LjO;eQx~y#j@v+X!zdw+`lv7()R5^?-Om1{EdU5XUZMz?#`MnqX^M<^ z0N@@HiYI1dQdgTTT1cU*qMVMCJEFk=W;;@vWvc z80a^7iOyc-A#_3(pPBfMu~3{~?|=`!IdZX{ORasDjHjN~uyo__ybO~^Z-zD!3~E3f z!nx(oQE^SG7A01rHatY~WPL>Nn9*Ujo@pJ1F5xKYKCT(Ysja?MhNhNL|3T#(6u&Jr zurLnuOjM=yVSk*&FlWM$_9d2NcC2gqh2TKkM@8UT>HSrmmVLQnT!4p%qtlc+ia!-W zE&U4HN7b?ma>wLHl^J5Sr0gjW>^V}fmRRMVOQbs`ZH-C#o04;rOIm}P*3*%m``l{| zZJaFbKp9?cc{H#wWfTZF)(aec*gofGOO5COPqQ|8_u^xepnj?g#WpY*hZny3ri~gi zT;8ZKk!RFuviPA!T-%ul74yxmLQf~rM$vWPQ52#Fnp2#Ou?4RXoIpyJ7~9zd)?Vn3 zt8NitNv@9ME|YZPe{|o~8$O_sh?E|S^rT-wB}u3<55}-wDp|pZPQ1uF7UNLYJa|g7 z>(C566MDydzNHx;;{yhTcB~FjvG=IiKX{NS0Eb5=VWGE|Zt)s@@6Y_F9iyMoVLWO2 zMB#bKN03!L`tWuk<|Wy$GHxZ^5IG5-L@zl`#_1lv#6qu-n?0eVtJNnre!li}O6@tR zrkP+^H-wz!O_+GRo?}S_Wrh@(`wx@dPoG2Yw1s76uw+vMP*YRe1vn0}^?ycpD~0&z zX0a9G;?t4=HvDGVT6&>H(SM@PKpBb&#PJ+>Lbm(%wkrD!Q}hM&Acnt#ya76=T+R0O3~&F`VuX3IIWlxGOT!gg^Qf+kyTPNYo8ILyLKfa@9HcB)N4$&R-4 zQpwPw-aPYIp8^G?B2=0e98@1CBFyG9m6)t2H4x?S)OI}wo0btqlRc0jw8IhKys1Xl zv;@3VLZoGN<`8on@uNQvBh_)V!VZr3glEM|^(A4mq*jOUyTo^j;M(`F;g`f5f*5Yy z0LR1{z=68*&t<`FN}Di!Xy7Yw6Ll|AS=uDBoGIq61Wa&^aFSc)76{m}s0CMKTy78v zA5|OG$W{jWMJx*9_Q9PZRwtuPh0I2joVGGcvY>b7C6C}nT81m&<38`ysG9T(=%^Y~ zA?`g6##>=iIOHLo;}g1U#Mn0hSiH`uM$+wcUqE0{KDJRDu6cGqeoWaUy3^gUM8bNa zpNMK70N;+Vu7z}S%ig(Eu>=qv6Pt4h&fIBA2{n5Pe`vlB@nb4`%UUi7SCq#le=K0e zwI%Ka4G)lF9$u8x8A)u%OTV>B=5EJ_G4SFYC>6F%E18eQ3PRZb2tm~(n{1)Gl$|DS zkocxMO?(&?C(}v1C$BItXj2OCSiMCVy3BVDSYh%9yHOV=IZIB5LwQ6ObJ`djQQ+D7 zh^DZFv@GdvB1;arkk`-PVY(T5x=z895c_ULco`sLB^8f+(*T#qU0VTh;kq(p07+62 z>OoeCCTtQQ9=eRKZsLrUtp8?umvIG?U;i7j{w2`%N^Sh6fTXxc{9D zBOqW2)zqjD-gzbgqMHS}NXd`@KDUnjGJUN7Oe)FR>TZF}-6it-@M~FQkp1Ba3@tuC z6J(9HaJ`6>F58Vn&-%92A2*^Cx{4*%i&H<$vEFSH?`868t2h-?vH&h9_VB@B~cYPS+p}Su4d#)}}*Bf1zC3?0pwV(dnt(Q<8m&anFBH;}y z_u@pTOYGAe1n#l~j}DP=9W+Pjq(LU*>JA_$DNsKJ#$|=Z1HOfKO8azm*VGy3eZbX- zx^nw%La3e0MzRx{m(LmdloCv!%I%Nz1EBYQ7=(6n+@OX*m&%N8y;IDP`9{bLoBs;k za-{n|!3Vc)5OJ>9IMtxnK&unbTF4+lD&?@H6%IjX~$?AYMTM5!3ilExk+cjXF_8l!XmuF28xYr zAZ-`f*PN_iEtSlYtQ_T6oh5xp5=w}`(&h_og|ZmEdF}XBYD5kwq{OjdrGFJr2$3s! zp#cnm1*zXky+NZ(01e{}}i-|_2(pq5? zgUaBIqTAsj(Z?@=sC3!#I3dse5HmXFgS+0h++*Mi*g@t6FoWnAw0*W`Cv- zh&5G+HyW+dTX}2BIZazu+bx-f>nWEWz!+;rHBLahOi6~OWdA1&W*qiQy8v{DOLJT( z%qMpM*cu?#Rm`kT$_LSgmxProJk9(ZIH&S>TcnC&p=JW!jinK>$QV}k7st!ZA zv59Szmk+b{No@-B8X5Bn zEPpo?qfj1O`(cdcmir7;Bbs8Fg zjDJOKb?^SZ{Qt^p{wngCt(N&3{CRxGI6i*4DUjP-TB=!Kya`;Pd7I1oUwl^Qb*IK#& z?)y{briHt%l%XucQp3RU?^@M!8DnFks;p9Dj{BqcSHpVMRK+_QT25!Ve6*;o+ds6{ zw6p~7&V2$C3t;ry!|f2BY&=yX^Z*vbo>*yYUN3K zq*QkRs=(s!5yf;x~`wWf>1R2K1wwC#iNI}7dYHfaJA=$Z*r}O zhbb>n(5q`7)zz?EHB3aBJgR|kb#xd?FKL(;u@;;^6y~WcGxXecBx!RgePij`gC--b z%F*`g_$O0ZO#3rO?$Mi3E{>#R)FQmY*ikhsq`V=uMfrsW<`0iH2gZ`RiA=Cb76zu zf&$lzuAN^*zHjg8n-#7X@+5gg2AbE|O zBIfkO$=zEcjx>&udB<4IG^w{QDncwQ!%})U)I2C-*y0RC&RZqX;VXC&^ zrNBk&$o0tPbzMWaCI_{Qi>K?@c<<}Vs%MiA9@IrvK*T@zxw@WO7d(6Brzn?Obro^<8Kmz%l>4j~mySukdw~?w@W?n27j9ij#67Ijvkd(HYAoOyhIsS-@;V zkGqG*yJnfk7H?OrXI4V4j->2NX=>F}U;wiutmk-FfiB3~+zrEj0K{AhbPLXRY5U1Jfs%O>-%--XMr5b zWNfF#ndwzgzbU_^)0T(W8Zz;%P87bMoxL~EQaB!T*t7ofagB##hUEL;U@MlgV7H(# z-@Wo#OqAF2$+S%u)kyz@Z1);|zN;C6yN-0O5g&y+SR^uW-%sD+ZF{i21i&*h|4)6t z+DmR+ZH28HlQ56qSJOa0BZY?TxI<$@%c9F=_H<*h%EAis$cJb51|@xr3~OG#lz#ub zvEpr&l|zqTWlg1_y;gLk7T>oyv%>5^T%Y4gV`Hm#lufs3=+=4b8ie~>-!~}fgiJ8H zyBmf0juk+bUg8)HMGs+l4xaf#{ouViWH?o_rlnA{Eg z@W|4;J(xdv~a^^1i{;rgn0unohfi!+PZxb#qs%$g>8OKoirz2egh)tV7=W zZ8MoSW&$6Xm{pEBaI`#=yH{Q_X&d@MbLg~m?RfncT>LrE8QyG~?$C4ZzEH=M@wSP7 z;W=UNJiw|A5 zt9kVO*ZC6!Je>W?EF|BhKAL%|;u8FjU)B1R=Uv9L3L_)s;=u&j)m7T^c0Y8j;62H= zBBKvxEZ)u!JgA8$uP85noV#n1cj-$*m%$je{cZTS`}@hMs;_8_&zEp9ck+kZxmMrD z7Ypu@#-#-uMs4%!KGVvGA`HTrWX+pFO%8oZrNCf!-G`Awk8NzmzGYUao@_r_n6It< zE`9gyniKqq*@3A?d2PKl`4IWN3eU;j`I9OP=6*u$&xy$w>4i0tfNTaZZUA1*8Or=j z(kRXJQ6V8mYUG0+RZxbQZPQVLD!|lPv4U%g)v2;WvGo1>ZDFt}%|I{MfkFHh5NXBy`Rr#IGu9nY-0-c@zd##|kk@l4kXH!XO05k*JiIt`TKhOYU| z=@!CBeUQ-*J4wp)ci1f6g@Z0Ie63$*IBfsz1jXrK2(~ghvQt75sF7T)F z{lT!tg?{Zk9}%C3K9`}g;7)+4-!IftB8!B6l^E4vwRgRArju^no^BrIEZ^1`>FFPt zYlKmLrqaKjhYPmyxgBu5~K>4lFnUmU}H`~UKVMuQmMJ=O{kLeavJAcal zO(N4>U3@IX`G+3=u(O%N8`2@mbU(YtBQO!4qJvhg5xA$R^~lh`6TeOm*9T);BwvT( zm=`LjmsOF)m}M=g1uh?taSYNee5rL$4BAmnGJ)GQ`F@GZj+Sjl(TYDxt0*r~FO7_R z>Y8+KQ1g+AQSq$_Q$v%=+H3D2Ju*J-4nvFQzxn2jHgK>8Omw@U@qKj~_DiJ`3t8{) z2ye5Hj!!}rZ9CdD85uls;>KHBTbdfW4NSjv>ua!!#p*a*#nF=rsx3H}4+ZTAzOgZD zd=|IAnD?5NuCe8Pv6X9#?+dHec2qMnsPX5n4!=MhVU_*ttW0Owuk_M~Kj+)+k;{oq z{N#Kbt#17t@2EF_{zwoDnm@9zvHCu9zRNaDaUk{EYmS&v{y<6|x^G}0e4mQ#a+Z<+?C1}W#n z&EKr0e~b3V53H?oad4Lt0quCWcJ_Z|`85^>{>t6F^E=mFMl!TGqH%rp;&ji+8`gQ* z(5hzX&%t^6JCXK2d=^fXHiCf&?vTOXwOs8dQiKYa&(-`?m#f9~DEl^e^V!GB!hC$D zcbAQIn&Kp8=&_|QEdR_guxHy|(yYwJW&sr-(+Ty$jj^+vC^~Zs&L}-2qWoF5cYW15 zW7a1~`RPwbFYo20FG>;uEI~he*J?@`(lcnQW;`-UF}teYJkFmzYcQUgaohsqa4Ebk zzz|L29DnLo6ynJsA@$+cEmrHK9uRtdA=pR}10@!8&U$yuv(@^Q^*`;u z@;+rbJyOMl?9pp5{ZMC!edl;M|6bXBJ}%DV1W!Sp^|ig8Y391ES@JMwonb~%UU4o& zJ~r*}O1_hhGMjw^csMrg7+wpel4|w%Ju8hNCK(*$^uQMu}3axu0Bku_aNGzwnjXFW#EGP-Ar`(KS`RCS| zAKyFN&U0A_2`G_*7VdoYrAfQ9_0*@qW4^6|DR#=(aN>8;9TxEajILcVrI2`D?_dXm z$!Bh?Z>)-`k%=v4oalQV^{`w%?I{gh5INh%87Wih_!$Up>2Q&|@{DVXNiFf|f zFaqbT?Ed{_G!E0R#2oOT-`Cd{?(VvWQV;!&Bxr5hpW%Kbg42hNEt;5^+#dg*7z7VX z2wCux<@pmP#p9|BkiT$8r^~;AK}V%+Enaf%zZ4`c1pK$Icli$m$-MZ#wI}~S7|H)n zn3Tk23H;Ndm|Nt0TmL@xYVYK?N6qh@E1?S4%E|K- z@tg}6H|Md{uQ?u`KYx&36wF!Y8qbbS&etUw{dVdJ=mfYWWQ5;gN-ou6#>GG?DmFm8r) zgzo)zb3y#RatNxP>nJXbG_J`8f0u+}2d@>gSXlHmoLi1R&ElAlq-y?QXZMlziaf-S z0DM1KmtW3G`ckg>^hrpdCQI=|aEDS$-S-(Kzl7nPD@4!_%Nzr9je0^Z+7qQbli$uy zpE~bdMl>|YWHR~V zs|u|?K5_5uoTFQ_jSYWR(`4J;BYl=;^r&!s9>HH*ZMyK| zhrUi={l{}v@yV$Iiw`2-WF+c-qzIHcJaP38)Lp ztW(Jc-K;EzdjkB%2t>;3si|+)re$-l7~MVGD%;!C#|++1N=g*hM&0}N{HRKV&zPS@ zxsrdx)Y~uaw~(}4b5(7x<{_+f-El)q{9{4vfOWzQe(^=COAW8F_rqcn)2T6qUs0g1?<+~|=O=lt|H2Jpojq0)gX$7aCnp~IYj9H!m3>K^U_UR+5 zuC?H8*BWCJ#Vl2|U}Hm*^6hbvgm~@p+6EQ(2>UmizZ*rS0F@$+yRiAo2QyQ3!%?&j z*>zf)T4}C+A5g4Wwll7k>FMdk4a;^kY2O*m&5Vo-E4dU8c8H%~JtkAS}Gjajn4tG#*8S>Sj7^GQkh!n@fqMDDj)nSL81yt8N}VY#Q@ zMkfnSzEe0@gl=xKj5Sh5wxJD={l5Q7m|A#b9Gp6+HGaIFy;uIJ!{STT7shw;1{Nl; zwM_DJ4P&DuS}r0#4v6B!oDMuB@&*O3-nJ7g#(XxclZ! zwrOsHvfr-UwzKm$p_6ZSeqplsT=p278tzm+vsKD=eKt6v{(Y;&;<1q2TF*m9#$1wf z7{Z`bB0M{sXxp{Iz*jrX$0DevR@(TH%S!C~fuG-qKV2WvP0C5QN*_M@G5I#KLY^k8 zZpMwQf8Z;{`4ekIR>Ip~-)$-%jg1zP|B9v|F#oP6E$-?LJ#Yz6X?eh}bMyu*BG$A& zPritmO!g=(b#`)5G>XX892uNKFTdP&)k?QtF|u(@N1Pl=iV4dUzZqvgo(^aiftHam zdCtmM9If+p=w~Ek|6K1QVY0w`)!teeewzuZwcS|nZ13-!r|BYtYocX$C1#=X6EC0m z)%u^LS->4!Jl8lz`2KR)$4|_33mu#K(M!Hp`r^%R&-iT<>yIwGk2RcgE93if+I&r> zJh+^lx(U~Id~xkqC)9&KkyOg;)HL^eTY_2qlR0 zPz0oxocQ|wF8=?!v(~vf>)d6{WX;;MXZC)cdCKQoHLTq!4t^LEE}f-@8X7`qN9Y^h zdzjs^F8=~3ZUOKFT`){chJ45w%B4%VDmL1vSK)41tb9}}+@3Pdvm2Am?ADI1&d*&u zDRn~%UG@34U5fL`ZMJ;Gv+!$JqW4j19qu38#d!tzPy&XK9g*o8G6#dv8r!sYfn=n1HL%-=#YnpwTX#&%ca|cF zX}n0KIIF(614~{yDFrh)Kpo93Ta$>5r%naQ8!dsB^#uc~Cc^QN9v04iJ z$_fHe99{tRhX)5160(gD+a(FiRWZ|AN2lwQiKYTa&$Z-qhq`LGb6u&4XFm|`Q#KFk zdeGct4zaY%n;yjE)-;NoRv!Y_ZNw+Q0c+}%xYAAqWs2?6WXYN*KNymZ(*ca+r8R># zUEscsIt0ku)jmE)IJ&?4_c1$eZt;1TOHovcky%b%)~V))nUu64jt=>|3ZpceW9#|P zkiEmV-1QVQ0YE*|`raGgt=|*+26URui&T__3n{Ny$DZ;VXOZDiV@(711`1EVryjF> z_FP>;Mcck7+vKzEWO#EL46nQB94pa=G4!-U8RD#r>^!R%w3lG5T9(1EM7^vy$TR=C zF+n{?e@Am?DFV@9Nfh`a|7-&+_P2uR@IqnQI0WKYF52=oIr$vsoWS`Oe_~3;U<5Mx zV~WkxXGq%Md2XN8(9fSIUu-OJaRa@1;aLWT=1e6`WxPOz2Nt)6J~K(P zM0j9FX*FDI`E+lI+xwnLf9}T&cNHPeM{tl+_3rVde9~^)#<5HdpF1Y~hAFlOA^^N` zDMl4^Uo1J%C|?7^_+8^ml-ydyMC4JJfrEjIvAaq&U$$f(d|ShmOCEN7Hk zVOJa~e_W-6%l9U*&0Hz*i4iTIFycc%ytWG;Yv3FnGdFZfTqC*6JB?nmsAxdup{|*3 zq|xf|?c)#utqw&w4gNEj-Ij~f(6?RXcY-{g=~Mx8e5lqR6M6BAIvKt{@gupzs9p3) z@X)d3_nwbeQG62OGICeAF~37!SX6mE9_z=vitV1RimFb);SP_am^^2K*>ut z2ez}*u4pfz9-nMflk6Nw_fBnz`Fau4PO=+${v_4J=9ma* zx;CjLup(yBSYjSjbG8oyQYj(#X`bVJvIHzjNd;5G%(034&%hTh($mlO$0Q4uBEj6C zDA#HI=q5In_Spwrm+pF36f#NUpwF=gVIp5?IExvNci1sz&$ zU;~`tBCd{@51CgU)_(rEyKV66uXiL*{0K{yOISX6;W||9B_A3CDJDbh42oSu^Y|}! zmZ&T%d1U8IZ|HiZA0i^znGn)b`=$^x2cOAD{Av6K&fd60e4hAHi(;lCDFBn(6_}pS zpOGs)+@z>c{ds@!zD2bMxR2+2iivrC6xst20#cDg4_IqRVdmL8k`Sv4F%cIpjLOMn z<%i8-h%bPBF1K3-#tfc$d4Ru+$MV#E`ErvcYO#0F!|gn@v`d}LB|my|4nIE7U2}zd z+Fn9jV_YjZA7@^Po%#rSe9i8uP@WhM!sEFPsw&cPc>!X0H}qs-T~t&F_(?i4G~MvA z>+?!V9E36uCZJvGZdCQO!uaXPCpaKSxk4_*S4yuBSj=OZjc~z&L3a{TO?>w~ALjWf zk-t-r?tph`%HfVKIF8=~5Ka`b+L+s73EeAg@QTcRAaxDc6JZ@bf63U;EQS50(B5JjWI-?t=~@m2mF49Kc`(jQ7!*4%iE$l-P##%96sDE zQJN9sBybeHKnEKn=R5}-eVW$JMBp}4jbAN5tB;;bfGcsC$XF?ovYnK!k{t`A4IY83 z-O%zK-sirt={@wp?s-`eNNUu@*06Go^ zXrK1-)~l}1$(eUooQA-=cHQ0(GG3+f=Rvc3dme+khHqIs?toP71d%4Wr-ovq$4=bO ztj-ri?3KNCqDMzR#!_j;8Igj3IE#jkXO>xGH44BF>hO-za`^#6=Z!2x9l`&)B-oG% zv5r&!qT}MRIOE|6Baw2^*rF$^l=AeEJ)M=PZU2E0rMzRhnOqadk^|Bf3@Q z_ZMsY%>=+BlsvBfL1PQtVP925BHNaeEXwF{Z;|)16N*@4{8JudW|78Kx2USBj6oIO z0Si=7iKUpxS9)XxFSw_jfgfscV>6t$dL*l~p~g6KEGRuIgVHvY3vqpTX-BQH0(lVt zP)jr`tM1i(LABT?jaGIn#yR$@v_&M;QBy6QopEru^V3e)3Tg7QzpAS9r}X}@fGq_F zp9penAyA|n4tMoCXgIJS44Pm%8XwxjVjadQqfKEH3Z#%TVNI$_|Jd}0w2y-w3pFz) z5JhS~%*V+h_3)KHRKV$(!}rZ)p^b9If?A*Z9H3E(k_)DD`74wN`bVAf_xXb*G}e_| zySJtAeY{|@gI~(9XU|9R`!KepTw`h3NkAEGywYYo758gAHJ#q^qDOQiGW;4DoPtIn zz6Q#E*-7J5957}(W@{g0zzq`3hw&(C)^7iD@$k_vBxN%Fw&dWf+=GdpM7XVQ~6o9kWQTb z+~!Ow>74ZSssWd196I`V~gaD3l>^ zIqq$upXt>gce5Tzss`iwx*Ffi&l&mYBE7NtS0sTN$;n{W03-WWti^>Ccw@`8=N>NO zi%Tg z>V(3VK2r2@HY+dAC)9zuYk|kjgwc4p#D2|u)e!+SK~Aqr$}#ZMW3SjHAP5u)lpige zT$AW7bcNesW!h}%(x=C;LS_Me)=Q;@IUO!Fo7CEkv1q3lEP$j}ky|e_Tv}$Aq ztuI`rs1P<|hJDNJma4SxF&lWX&aOrJQ${!bi!$T%4VRb3A)dP7RR6noC)aNAW$+HR zAh*IoW}f>wnn@zE-Co7G-BZw5lG9Yjp{BPiJAAWwpVGL1?1xd2Da`nm-bP`q@X(&T z@-6JfNH%VDv0sD(2-N_t8ULiOiW&brZE5Uj)arP#w?_yrH?c87K{7_m{Ix2BR|r! zvro$^Dg8-RF;gXHdSWFdCExaBe`TIU71h;UD)NEU{5kW(4SRh33d3Nk$WK1(y!2mO zavXqJxAgyh3jW_c4=tY8%%Mr9hlYp!99EW>mvij=)yfG~URDAXD{$NOIGZh_Q>Ck$LC(x1Wx49kzg+L1 zNnhp9;+V-nIlSk4rhDPP3I%42<3O;`Il+rZatZEbh|v}R+w41kxEf{SWK%%C*6 z5)X1j=X)=oMLIv85!F+>s;V7(XghXkw|qG!_+j-o8hac)h{hRbJ%WQT1UO3W*D#e# zO}E7AFog}S^zk7dg8aVo*rokc?}v5B$z09TIM>Y)*ZzCN*?8CV1FHebuXsY;P~L{F zn8m+aL7=&>L?d@%VM&SHLC?y*UXf#%TD|U^u#8AV871Ey20*K+ zAG8O0zS11+=b)gDBCyIJWQA1RsvkjD6Z^bB9wjdY5Ohk` ziKnU`W!1$vgC9We(FUocC%+=x>ox!GUxHj&QEtV9a5((Yzb&v#i2F;d+QQ9IdseLD zWwndCIy#&^-w<>GAA$*@~|IfEZ%AXgl`yv7!Kl}M_8#_c}9oa*q8 znjw~dTJuBKzfG!fiKw!fw4V6cM>~|A6y)S+05sZL*!(Pfu!%fqw%QL*ct^fX%MZuj z)&j*p*fd*8;D+RqJ~M8aqWm{n84A8w-^FGc2?HvT=HCf*s$Gu`aha{h)UDNn8&R~= zZ3B_-gH^vq)Aq!oln-T60)NEk?yMk+b|3qXkQht#yE4B!PBT!;`XMWA>?SOd{R>Vh z6kuQqv#juzU>vf==&bbDkzl8|+0_x7!R%w$sDvzX2{VuMHY}36EIgc5S67!cW9Z%w z>gcHXZQ?sO;fpF}Q0Qy=i61{~8)flgtc}6azyVsdk3L;M)hum=LYYvC{q*vLfz1kc z`~fw(?o%I8hJLv1L$+Fdzy%3CejzUjXN%}NYh(Yblgg{=noDY%p828S{_px*4gA#<7M=2C zeB3f<{;?H_iIP7bto`HliLF-~8yoXAVxwetnOC7#yI{gw+l&KdC9EtuJ&cPGf`oX}!fav}c^p3&Az2*orwp$xA62r39{0zm# z#T%5f1GJcA>oq^KMlU)=>R?Jtlf9#&tOQAp%(brXw+WjrjdyiK%mtXG3-|5*k3SH1 zj;TXx3J(1x@@EvkhT>aahHTo0T*Q6|591J*mOd46A?)Pj1s)!za`$KJ>BtnBUrZ=4 z8jY3^fdK#j70;QNI3d-1<~zbHPu6p-Kkz=Ir@^)!EO_R`=;@H{Z*4z&xB)MJM#f(? zXWM$Z>hKOM38`w7?b%`k8y3lVn{KZ^2y>I_;(`Z_{Z~=^Fj7p^9DDnZ`a%2!B_J?s zC*ewNG`>z>N9P#E;8S@yBq=HBl?xXvuYk;$>BD0oONWodF9zv+wBvHtqFl&q7idfEVfPMW4lvD^%QIm{aYH;PfvqK5E-yCsj zDnjY(@Ek5}1&-T5G-SLPW)DHvMadke^@qMxoIdpWl@Xs)l5pv+0{J&sS1CmCmVN2I z*@_au#rocXIzU^IF9ekxG%HN+h@^4gy2}E)e+L2DqANs(KWM_{MJxplnEPk<`=g1? zpuowBi-C9E(+(__%!YnKIz$pNfG-LaMV~h|V(&3^H2vEK+j0a)>r0K^*sZKox!z9 zyoc2ZpSiBp{aABbEJ}4F0Ikg!jMCiLi&AG|^y5F=B~n23=L20i?j{GW#t%HZKhI{x za7}i~jlq+${Wj{2uojHwt(cbw`xOJ0+pO@NhewLhT6-pFtpgJk7dT$v$L@Ru!~OQx zNhy4zKnPAL_zxrJjC|YJh<6VgxIgwgw>e{7#EQ>PRjcIgB4^M81nBBh8_qh#O+Ng+ ze_bn$CFYH>ZVMihG;D8g-~Gd&us+T0VLICTPvgUcz>||4R@--fwIwTEyDVaDX9rH| zk2d2c7L4V{IQmSDn9+A&zZ_gk<}ungpEaW?D3il#>+mRU?Bcd2`-$O{q@)*#Bi5CVBTRBovVC`0@pLVBlCTs|}u8@_sh#7jM#m^@(Hja30GOb+Vc&D!XoW zk~d^#Iie-`g|i3NCinmrRwT+-8Y|;Py6);?!ao>L4=k&{WR3IC6!lQgm4lqkh(6arla~zru)F!*u5^eBRfBkZI^8m{(=>cj1L#;xr(iM?{uS`L$n#uAS@rY23*&b8QBeK<@O zobg(7AoB;F*Ka3Eh|v@Aoi@K5aaQQw_TH)4<2|ow0q#uAXf>_#B5N6BvA8V|fVeHR zaEf$JNyonR_S@z$g0DHpR!CXZ{T!~W)ee{V$1D)4F}cW9)*mBxiL z&yTGUDl2&fHM_q;+AfxBitmW%nU246xNEJkWNIFh{9ff`XMpL>f1avPR-{|_%a}#6 ztJyH?pGk?>hnH{A?el7E4g?_=|9-(djGw(*`S6Zm^dZ zVPap#P7f$utoL+k~s;SW~7kMpackWp-XUIy#=b z#CNxDcX!v=$Ost|!#P&zevc{I)S%6Sv1VmuU6`L|hcuq*r~eIhxbrfHJ;)%qo-1urDTq)|?%^2^li^vC@#a<0fRlD|H_B-mC-wTJeKAmh>X@1+v zOONF_aL*E(ZE|0fFh`sFWzF7A{>S7?zxxV?low#bOLT5>sX#1wkA%xhn6t2aib&!# z|157_w*tkGORhdLpGemcr8p=!sWD|Z^8%=b1NM6dbtBJ=pBPzp?&`6yyu2YMP&qZ9 z^p+|&Khg9IkU5Ty*YKt z{3Mi?N?Yppg$aYs@A;npR3=LKeNy=mr<6aEp$|&{bia zFOIXYw56)Lq4?$;6g)DA6emFlf|(a)=IlZ+g?5C6g()@GbgJCPl7wWal5q!-)$;P}E%Y}Or|FE#!lKqE=dF)ly oS1)hN3_5dSSuDqg{hSXuWI|IZXW?^yj<7s>pm!g4*E;ln0h>N|e*gdg literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture32.png b/dmp-frontend/src/assets/images/guide/pt/Picture32.png new file mode 100644 index 0000000000000000000000000000000000000000..1c3683198847cc65f0ebbd0a1470d52861c975af GIT binary patch literal 16906 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 VSI`~c;~cK2D{Cp0Df}D!{{S#CQbqs( literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture34.png b/dmp-frontend/src/assets/images/guide/pt/Picture34.png new file mode 100644 index 0000000000000000000000000000000000000000..7215a9244c345969d5a1f85894d6aee4f3af2ca1 GIT binary patch literal 49926 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture35.png b/dmp-frontend/src/assets/images/guide/pt/Picture35.png new file mode 100644 index 0000000000000000000000000000000000000000..18ec4223a3014de51f85f8156fae413ce95f4a82 GIT binary patch literal 105311 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 H4R)KR=W0 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�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 Cvbi__ literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture36.png b/dmp-frontend/src/assets/images/guide/pt/Picture36.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a60ce163d3655e14d4a063b1474b8813e7eb23 GIT binary patch literal 5553 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�t^OQT3T9JSwSEWYiny8 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture4.png b/dmp-frontend/src/assets/images/guide/pt/Picture4.png new file mode 100644 index 0000000000000000000000000000000000000000..3c552cd3029f4b533a027e5848346a2e22abd657 GIT binary patch literal 10433 zcmch-XFOa_9Pgh52|*Bv5S<_if`|wf(UWKqLG&Pqy80F^5mBNhh`ypl@150K)Q#SI z)>>uRrmS|??>@T^?(5#yzdYEpd(O_xIWuSGTi){tf32fIfBo+DOP4OuzkH$k=F+9h z^5oy8)K|$zRj%1C^4De0HyX;9N{2bnhO=18MCb7=2V8$PE}E#KaSIAdUDf)t&RU!v0vJWHC_VgCCwr>C>K z&AaKoODvR1uZ3@H%V2gC6`TmaDG+z#_*BCftrTs2^#{z&Aj7OWSt=#Q?cS5a zVu>|!;Y}xAs1oCN5MwhBwWC^?1tVn*pQ;#jkO@=P9ZIDV>Ji$YUxvXOROF_W2|+yh zxBn~t?fT~;cJUAol0<^WFGEJ7C+mA(Qk`Gfccse^v`H@+qKY)^l`dV?dW z<#Y#_hwxjMM01}XYCv&)LhPWq^_)1JSD_ppFV-A)Av-lwqcu|&shGyCQgy9^b!;!U zZtDqBY|LKqc!r||8wJd9Ds2#SnX46D5?ZZW3h*UiK&`2}TTR5RDU`2f;v;RvGi;3K zNg}zH7x@NxHBM9OzTT@X$C!Z~>ADtT2{3m+tQFw02ybu)9hmuHyV09PWv*u4oPp=Z zOJiY7{CADoO}{?6-F%tiYL2e|ran4a4)dZjltH(ZG*LEs(0YDK=%5w*cTDGpnQuUk zXmAfr9Zt2LB}B_^=J!nKtfWZ;Elg@04fySZ%HX(HDT;vsCKc9d{DQf883D5L=O_56 zqWD_pnIG$e$#Go1+ZF0s{aKoTr>^r!1FkOjbmfU}Q{;VpW~&|a`PW-tH2EFj%!C;4 zLJ9`@6NEh>13yKb3gRBeFPY^9J>fpv3mrQ`Wn^&q?X`Q&xzy$A2H@h*OXp{xmcUMW z>71AVLN@w$s%yXhL4@TA-|1ecqLx@Q;SDC{pyi->rpkL)EbvHEcKH*9iE0H;2^75> z${lbR7_4_vY+U7o4zw<2$njqd7xI`7p=Tc*OqLvL^xndGn|{m=z@K1Z5s_??XL&HO z))NmdO>a?ho!)kvz7grY;OzN6bLVisw~1FT9diswg& zv0d_zoA;a6yII{RnK6eeNY-v%b!a*47W)m8_dU}+4w{N_pIdn3I$dtnG!523zZsD` zC5(-MTJY&T2CoqE2WE{&>#0>0^0+_zXokQ;6;hXw!gmF7)ApZ(U+SyItZ+g%GL4@> zq=GL6Z(a&|RtbidM>kpH8rkMBVty;MqSkI*Od2^{^3V@oq*stcVp*U( z`zqBPv)CJQ+vOrUfX2z7%+py_t?P*vPzQ@!VH6aYg(lFNPJc*Ob{qr6n5*(7^=|jQb=beSEJ7$tH297GSEVmkkzm^w#|dSA0_3S(maE&cUsGla+&nwpMW9o7 zACe-%e0}zo+oR;pzfQ9;9N~uh!A?_4XZv*kLDHAH=uQSjK)Of&gQFU%4*4q!bR%P! zD-7@0xyb_pf6nxrXt-X{%aw}CkRgPmBS87r`ZO8@=Z}$Rkl!!~n?(fdS9#6YCQ4cRbTr**g?giM z3pLeZraE71X)#A;-qFg+j!}@My`dW`juju4+l2#+t%{COisv$U4Jepz9DXbNfx5;0ENRE_d=V2Ee@bw? zQBe!Cpw=IUg*(nG;c{#CZbMncErBO%-0VhjdRKY*4mbaZhd+oRe7?r@r{`$93SpON zH6NM&myyT5$h6K?TP5_ykVU)~X`!|eEX{MHYkOQ@cgSBGAP?M5m5As4|VczewN*aq)yT8pf+}LGDS#U2QoJ7H>0zNF?nEmfKT*c>=%b z&=bv>dP8>O7eJ4e@=Lpkclt#A*``rz%5SaYAG@i+iihnCmEVhKDS{u5f62tvFXCYb zIlKP5z6}6o)6l2Dz}^_{jONdLP}S6thcS9gMtgQNN}uzL;NwA`t>1GWwq3(n_PBOi z?-@$@OF?k|(rS&$EE>vKpYWPje;hdvgDI@ZNOv;d8y)TJ_yr68#GB!ZX+V?Loc{i! znt^xe;MH*BwCi1;dLN~?JVu9EWyV*$Zx8a@fq4ykr1HW>nK({WpG8Gf)>vk2`NA3k z3>j#zQ#0s7fvSirb9uTMelBx1#o-Sx3omZd2&Ki&QF@p2IAo|{&d+wwajQLZwQeaC z>+!N}C&=cavbL%*!7O`TA1$VBx#5edrM#t^EK1ipxcS^M81!N9T z=j(`tsKMR1;(gFtSAfYp_#ew$F%6K2B8Hki*8VTxExCw{Ga=XYPsi(@p?kBCLGc^2 zBR@C#iomd0YizmrO`X#%HdvEd6?m?;5iUvCT~ZWt>#t+%ixKMoVo-YYd_1!0Oc0v; z$QG6q*rT&_%Zh%VlOwyX^>hb<8oBM2ydeROi@3ZeuEk?&21}KcDJpqs&2GJVi{GkV zgA4K@V2HJNzAIWH={1gsVMj#u$8gA0c2jtq87)%3uQ#NGU1!j3z`0?(_u8+ao_JfL@q%%Eb%Mq!J)?^(D$Ud5nAJ)$I05yKp27bQ`#7qr$1;L8v%H*^?n zKdWsoJX1kJ2UZ7u;tQqhEp#d-O6l?Q4Vm6pefbPLgR2%tgO1Y3;TYs32NbfE-^qt8 z9yc^Oc1A#q)ZWn!6R2Ms--0-*nm}+PfuxzBtk!yUD}L_I>s5j zq#}%r$%@QPjYZCwVL%0I@=~|cL}E9du90isWjpda*400HfvwTY*Xe7G2|g&zohfJ} zTLa~byfoMK#GOr$HR&Y{!dH}@p*xjPF!3dlpF=R~uri2Q{@7ofWlo-pscbZvhuUst z@uqy1W6ib8e7})Vk#DAgMCm?TeTs~@^v?U6ec%1IZ12`ESXJX{&28$NBljF#+Q$rx z{CgS0V`{_2=1gH3t&wrprtjK`N3e4%n$y#z6lto^$f|5s6U$xH$x z4ibSyGjRCs-5=l>LtO*`_^ek1m$*S)WRfr-koFVRP`zUl#JS>Al@d00H==haH4r7Y zl>Ak3!$hQ%GMYk<<*iPP%{`xvN8~k{f&P39d|YcFQPgxyWuZT#z`|-{nz4&7rr5ti z@sOFB@=e1Kw<7QB(a-l2O5Bw=z3n{BoW?a|M*CyRnXXvS0R}d%Z%)f9hU_G-OH<8u zRBevUUxm@xAe##!aC1R!j8D040&^RHzsiu=+~Y>(T?uCo>L+za3p|hh=t!=PS9!Ay z{aJDkeQc5)P|`b{mE+%|cU;rN2FpT4x|`xv{D+tjeMJrCv!?6O6|uvXYcumxI8d3? zr~`1Tr95f3fFWpj1)iaA^Vy}xukuBrByzZ1S5*w`S-w!i3G`=Sp#(~a_%(Slia4?q z58uqH<8E(qe>Ah*K&ezN{C^p&|NmD!@!KLf!us(PxS00TW%d@YaxgXU<8-696O=e% z#O_$_+o(mjwLd6{$g$7xe@bf^OwGgx|Ni-mv2}mr@rWRA% zAeV5wtxO;%O0SC;v+j@|#N;buGr7_6hhCZ^_{-~47QQYq4)gei)LKlw`vaZHL9Sq6?2Px87dZ`p$L>l;3}QO=cji1z z0_Pf+W_~#zm73N)DzRvmJvRucrLiE}_ce!85>ck4UevTUhn$f7?&b0osr$@Rn*bs| z-oEz6(<~!ZEA(itLq{-;!{&GaIy02(75h`?KiICzs;_6!V|n&gBCxj&M!1JzbG0s} zCY2vvLeGv+c<;>dOc{ni&GhR6=8)Q)_HVa^N6W1`J^TfA(vmJ*xtxCTs+m*F6by2> z5<1p=u$Wrb?W9uh-+lexBNmhiW=+x_|Nd-WUiq%U^|HvYq`wTJ<+(oCcdnr9^;GxLo?%3uYZ8YX7@KeKtoqw$X>m3(?bIO)T!j1SLb>iDoX$>;n!*^B;zCK^ zd^Zd7Mk{RxJZAZdyWTcmSH)bUNoc#_wB)sF?Yl=JX7%Et7Vu}i1HkR+iiYNrWB!ZR zCg{aJ!q0bhQ?f&e@teKccvqQO!{a49K&isz7WgYh8wQY}oyk&*!1=GffvZ_0p{Pw8 zgqlM%CG7^2L_D(9qx#WdEW83Rfpl3$WTiRP<#Z`0!+?@A9N#x`k&jHaE&`>m&w{9E zaZWqJtLE@t@-)~s|EN6@yRTfw)cl4m5TcT;5i@MPHW-;db3*~!#cUi;P0tV+s!ll| z-+?q%&f;JMAYb;H#^;p?h28zkXVRS=U*-iDgM8zbuvUd)8c>z*A24syaQ%zrRT(|R zu6d@*@4`I(t<{j|xD^0X-TSr1gfM=D_{BVJrri#4S@asyM)wPsY59`~FPnW2hJDmk zW|>=E`JoRtV>85Wh26~LbyV$U(R*#BtoA8vpx%AW!^Cuw&$+hp{?RvnH(7N^Y@IYu zikdDLKxS&yoLQ3VUd4|a`d1;LKpQ%^nJWa$1b{96Dtp zuZ3EQrc7>U(zH#C_C*T5Iadet(c15cZj9P!ST|=9H#MMNPRDM7^}C|W895=0Vp;Z@ zn-&nGad~TGaa7V?&Xd2XS1A)%`^MyzUk%1*(=qBEX{9`Qkmnh4xcr4-T^7HZQkTVJ zy%|*5u>n59119tuhB3uD!TQi0eU^5D7UU`U#qV6(zf$|eZMhB3uWIUG8cObb?qkZJ z*GvzB-YD3u(v^12z;4O`%|61PT@j2T^t-wCHm%k;q&*3)nCExIFo`eTRpK)Qz{wC| z9iGeUh16z%r5skK9BT4RfXx zPWDI8>qPp8XGO{@7gzSwubw9(mo#N8e6t2r8Q}6?Nr|QZS;TCWBg+N(k=(4%=|%N0 z#+4!Jvr|vth6kDF@N5kKKL9%a-}(sihfwlTe1S(HfM&Ub!?l>ai6W4ljQ8fa*KYH{ zZ{sSv|0qeXw?J9*zR7HhzwcV%npTE_d^2HGGpcA<5`>v2kdv~frTc^Av@*r8_}xhT zCKupjuk*sjMiu!ZMsqdCQly;j8tshTwi(yEKn||0r~6NA`{N0J_+y?}&!NJFU@xTS z-Bbd6$TTHtI$b2+d3l^>ZLDvtC--}iQSQ`T>{lea^lxm8{A4{8|2ou0Bl?AWPxQ+? z-LzO1dAwHilG)5`LX~|kSGGp3u-%XrLaGP3-yJcks2-)2_jU&dJr*wecZg9X`$7MM zg~UgV8(BXu+dY@GA08}A6fypx9?g-=1z!Hl;ttK-WbBxR@-d6ABo}^>HvF>0aWLiA|d_5z?&+;{tgGMvqJf-ec%lL3GOetk&Bb?mpcLuUy6 zk+&1|g;)Ap{|b#vv>bLXYauzda6NT?$0GS+%4B(>AU>OOlg1?u5h2zx?Lkj`oe@NE znkrpDHgL-M{0n&KeLv7tkrtVFhA)<26k>?HEA>#+r22ku!s8r=;U@Tgq-C`?3;3F%VC^#|Vu zArp*#lR@D&-wnZe;*@0u>0meGQR@i~-UwYMGfYj2Yc~dAml4<$r_w&=?;n}qDmP^A zC2CA}S$ao2mKSvdz5nU%MW4cPn>{AJh1Nh>)LX(?$yf)`nS(?l~}j& zqKF&dl=iPoe)N?jncJEvu4d^Hn|#D9TL7r$^2e9FzYo`AKa3x>U*jJ1=O31&?8o;^ zHQPx%X@TiSllFYVYa2HP$Qg@0ul`SH7=Bh~h3p50ZFK2!r4>VNaHb55+mqCwYkx&T zSols06mZg9o4FZXXrnbCm*W@cLg4wSjAd3a*LpnF<@Lq@Nuz(F>4g4C?)49B3|R$( z9kGrUr+E&pCHb=o{-=#zmQslGleSZIPa!;ff`i*6oTi=c$@yLBr|CvRrdOVo;{dr$ z4Jli4cln+cJzU%9?`-@yTkWNaOdcwmRoZw|;3J-AgvX3Kx*HqQXE&w1d{fV#IG^aP$^Az>S<;5yCQFRE z%6^OE51PW!@Q``iD!V$|58`~>M<$~oCKohCw<^J!hsSwGL_k$diQ^A6Q z{DL=Qe_~TU&@oZwgG~jW@;+IKkoG!Q0HMPFyfZ7ZWMV&HZQaW_KgsKk6LAQm!t#nx z)_@;SYRjFNH+a~VW>oK)EN$GmA36fA<)C3?`IGpJ$t>&Ak;66j4`w_*S1toFa^hM+ z6sNx|!Lzm!qvs@x)}Io~D`=x0<57nUs8-Tz7pJ>DrCN|hPlSAfHqXhZvN37psQ=3Y zi?IDf(c)(aN9OU&cs&+2?+PAPZd)cX2rgEW8)_cxwb~Uf(+qf}IBOf<@fyA==I( z)eX28r@LyLMqQ#Rw$06T3rl?sp1%C$tVXkKGckReWOO>6eX~nxLJ}Zt^>QMH^3K3R zAjmDjP8Lz$Xo#8Zf%gg|ytqlcu+Ll+m2W(bw6FIJwrRgE1sV?=L<@H(GPj~ zirS@wr-ilS0uc_`s9K_Q>i@UfruNc%a11i61efe7Vk#Jwd<3 z#O95n*ROJ9DR_N_TyNokq=JQV+uVFC6=)8pr{2PNF22! zvk)DOQv?Ms?-_0irRFS>Mamg`fRAKMp@6^e7Be-R`}TTA&4&Zr1s?)zvg#SK?A5;Zb%9w~ zZ9a#8BnrI8Nb;zw)whZFI}WWauRsi;ao^iaAOqKLm@3%rVOa015uBCGn5Zo%`K|A% zxy=hg|fb2P*-~g_8kTguVJqMRktGjB8=C;3!jC5oExCIxqJpAAl*Lv|QXa6oD|?Sonxcn_m=Oc&YnM7_#OK># z*Z4!QJXygyoD+R`Qt;nD%y1d&?ls{ojaat&>f8))^5*cEa8{nb0JpXBEusw;3LYGq zliTrp+aBS0b=@QbO|c_gOR0HEsCz%mD!DUdPnu#1`#NBp?{4IitV?Q~u@OE1*qjXU z(#APqNfv1VMzF@zvYxl5xy*!^1{Vuqjf{7{!twzB1WH9>XYDYxAxWoAn@d{{#iEU_ zE-uA;%cX~?Aq=lrMqO*?H3XD07s`nHFOUe!g$WLeV{)LERQ6zGTCBZ5poMXOWah){ zsp`sGvO7dfE2z&6^>%RKT7tez(X(-k?Kp?fb9xu}B52 zYQ9Fwmy5PUVsYQYCnyy#t9#Yw`k$bgtXtKgZMVv(y0m0$Q**R)8Cb6{6#Wxbw0;ez zRW~DP+=bi``*QiG=r7bi+SM%AegkgAZHC`}=XW>Xz!LIE8oSo|tD+iTcY6PN5a|51duPO_^wHoQH2QFs{EUXmuA4z`cGnD0%v> zG<5_tYuV2qxyj>?c1qIkBN-64oYMuR7gW$fo9TbgKDOdyAphiYSSf0MImc&?W~{m;d%7Cg$97q>m( zX_wc@1?Hh0U(VIU`J+BJ3nQjeZw;RW+Z0i$`-2loHCv|Mp5_K1O_qn4UfF*Rm3Iro z35JPQqQbUT3?P9eEYn4WB)Zbo6!~7v^Tcl!MoRGhjS=5ukl-= z@Cdu{j^kA$K6ju%VQmKGhu1aToR!X~rbY{Vni+l%&g;I*FN{l0IUYj4nr3S)#%}*O z87`h$jc@-V?66ym6FJa?9u*H@LHM0Pf% za>X`J;YHK(^Z%Fh0sl)n`S#Gm*s^w$_PIY(iI~jJjdqYGi3L4rd8?^xFSn{i<8Pg9 zok51QaDEI_D)6PdJ5(^DCG4qYy1aGj*?zhobzk=7BBY zbJ8Kgox0MDDYct;J1U}{7*SGZbIzEoXqfFtI=TP7Yy-Hpg=}K(X0|;Hh+8AF`bz?Y z_>>8dc%-ydqwr=P%=Y_cBlGgmfuH~hj6p3>~h%yo;X zise%U56k^BCtiIH3OXxhl4@v=p$T?OQ#-_m_*@zNp*u!b#^IXJ(PSisB`V zMsL$YOYSDCJzo_K%1Yr8!;H`Ki5b%4kGN$VV;Gx%u^hrpHKP2F_jd|_OD*X9?C4jh zbdbf_CugJO(Cv$@${vHMa_jDI)wTmadkp6GLa5Id!74)=bz}mWSD>G_9uw}RUM#=1 zrsM*dB~3I>Mff;a`Vwi$FX^()&L25H)@N?-Ws&jvxT-|U07xTQ4KjA28<3hZiyM|d zm_Mnw1M4<0GEaEa@b8D$g7=iI74J<a z?hj^lukmm9C*gmiT-cC}I- z+rHYr4kR-Mkso!7P^Y`HULS|ILfBpZSga*U*o+$6rzd>1x=7XAK3zs%2qCz6Wyp$) zQBKhOh}D-mZ|7Z`XK<0#2_|Y9rcnj!_0F~~$jKqLL9E}>;unK9a}k@Q-3NrWFX1Sd zh8d^)Ts*-NmP|&Q!=`Bg{QX@SJS0szxo_~<<9Q46w4!DGps~0@DF!5Lj6@Zs1FwMd z2;YQDUywn&&tg_%;IItp-!WVX#{OB@R6E3vOatvJ)|hT8z?jQo68|{C4_70`$ozS> za%bnGe7h#!E8n1xptpqUi<|;>aGAwhE9*!!!xiW(3oI1#z$(-ct?Zv z6d9kpI1#Bi%I9DPH=5N{uI%v^%&kK5w{YlV!#rkHZk%~qc~(9`}!@f z(6c`k0h;$lu_rcjbNwLH7T12FORw)cxX6s{)7;gcj$f!5XnUfmSfz0RH(*1>KtF3(DmS|X6bvgL6`b~y3>oYV_Vely47?hca&#sJ&t#g^834l z9bqM5_gVfhq4!9|7hn*^SNnN5`~(%LK+SB|S zJEE=^lXh9H8b#BbP?7GuYp$uRd<$%BPR}r8oCbv(FTKk)pPl;8Tr8K&qPlM*Z~*WtlkV=4Bjo- zH_!*XoqL8ds;w=%rrfSlN$qv8MC}koDy$=c2=!zMTfQhI!f=Y6Ljf>n&Tv4J4$27U z%rsmo1teAv31po~23?ymmw!)uqey(a)GXiWq)qOl6ZJPyK3*)FSbI|@ayOMNWveaQ zYCHW17}eY!Xw2BUuCSq#Ij;E{F?@2}gxn?SyW;n7|;EYN_)3p#K4x+4VC3 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture40.png b/dmp-frontend/src/assets/images/guide/pt/Picture40.png new file mode 100644 index 0000000000000000000000000000000000000000..31a51c6189e022a27cb0db02110bc21b89293c00 GIT binary patch literal 63063 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 Z^eOeSO9rCs-<}}^sI0A2pxD%|g#-Xua&&->7 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 literal 0 HcmV?d00001 diff --git a/dmp-frontend/src/assets/images/guide/pt/Picture8.png b/dmp-frontend/src/assets/images/guide/pt/Picture8.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5b410f978a5604cd5ac7bd35c37c765a2dfab0 GIT binary patch literal 8657 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 literal 0 HcmV?d00001 diff --git a/user-guide/UserGuide_pt.html b/user-guide/UserGuide_pt.html index d6f1fba6d..a06222f7d 100644 --- a/user-guide/UserGuide_pt.html +++ b/user-guide/UserGuide_pt.html @@ -1950,544 +1950,496 @@ -

    -
    -
    -
    -
    -
    -

     

    -
    -
      -
    1. -

      Terminologia

      +
      +
      +

      1.    Terminologia

      +

      1.1 Termos chave

      +
        +
      • +

        Plano de Gestão de Dados (PGD) – Corresponde a um conjunto de Datasets, associado a uma determinada atividade (grant ou projeto). O PGD pode ser versionado e exportado em vários formatos. É, atualmente, “machine readable” (xml, json) e “human readable” (pdf/openxml). Pode, igualmente, ser-lhe atribuído um DOI e proceder-se à sua publicação no Zenodo.

      • -
          -
        1. -

          Termos chave

          +
        2. +

          Dataset - Descreve os dados de acordo com um conjunto de regras, através de um modelo de dados.

        3. -

           

          -

          Um Plano de Gestão de Dados (PGD) é um conjunto de descrições de datasets, associado a uma determinada atividade (projeto ou grant). Um PGD pode ser versionado e exportado para vários formatos. É, atualmente, machine readable (xml, json) e human readable (pdf/openxml). Pode, igualmente, ser-lhe atribuído um DOI e proceder-se à sua publicação no Zenodo.

          -

          Um Dataset no Argos descreve os dados de acordo com um conjunto de regras, através de um modelo pré-definido.

          -

          Um Modelo de Dados constitui um conjunto de regras que descrevem o que os datasets contêm e como são tratados. Estes modelos estão ligados a PGDs, de modo a que os utilizadores tenham acesso a formatos específicos de descrições de dados. Os modelos são modificados por administradores.

          Um Grant e/ou um Projeto definem o contexto em que um ou mais PGDs podem ser criados.

          A função Importação suporta o upload de ficheiros em formato .json, que são produzidos de acordo com as especificações da RDA para PGDs acionáveis por máquina.

          -

          -

           

          -

           

          - +
        4. +

          Modelo de Dados – é composto por um conjunto de questões que descrevem o que os Datasets contêm e como são tratados. Estes modelos estão ligados a PGDs, de modo a que os utilizadores tenham acesso a formatos específicos consoante a instituição a que reportam. Os modelos só podem ser modificados por administradores. Um grant e/ou um projeto definem o contexto em que um ou mais PGDs podem ser criados.

          +
        5. +
        6. +

          Importar ficheiro - Suporta a função de importar ficheiros em formato .json, que são produzidos de acordo com as especificações da Research Data Alliance (RDA) para PGDs acionáveis por máquina.


          Paste Picture 1

          +
        7. + +
          +

          O botão “Criar novo PGD” permite de forma simples iniciar o seu plano. Esta opção fornece um editor que percorre os elementos essenciais de um PGD, guiando o processo de criação do documento passo a passo.

          +


          A partir do "Início"


          Paste Picture 2
          Paste Picture 3

          +
          +

          A partir de “Adicione um Dataset”


          Paste Picture 4



          Adicionar um Dataset
          é uma forma simples de adicionar novos modelos de dados a PGDs pré-existentes.

          A partir do “Início”


          Paste Picture 5

          +

          A partir de “Os meus Datasets”


          Paste Picture 6


          A partir de “Os meus PGDs”


          Paste Picture 7

          +

          A partir do “Editor de Dataset”


          Paste Picture 8


          +

          1.2  Outros termos

          +
          +
            +
          • +

            Repositório - Base de dados eletrónica ou sistema de informação onde os dados são armazenados e mantidos.

            +
          • +
          • +

            Registo – Uma base de dados de entidades e descrições.

            +
          • +
          • +

            Serviço - Um software de operações e tarefas específicas, que interage com outro software e hardware.

            +
          • +
          • +

            Investigador – Um indivíduo que pratica investigação.

            +
          • +
          • +

            Financiador – Uma organização que financia projetos de investigação e/ou atividades de investigadores.

            +
          • +
          +
          +

           

          +

          2. Navegação

          +

          2.1 Página Inicial

          +
          +

          A página inicial poderá ser encontrada em https://argos.openaire.eu/splash/, também acessível através do Catálogo de Serviços do OpenAIRE e EOSC.

          +


          Paste Picture 9

          +
            +
          • +

            Sobre – Informa sobre o âmbito e principais funções da ferramenta (como funciona, Roadmap, FAQs, quais os contribuidores).

            +
          • +
          • +

            Recursos - Fornece informação útil sobre a utilização do Argos e inclui material de divulgação (Media Kit, Guia do Utilizador, Co-branding).

            +
          • +
          • +

            Contactos – Um formulário de contacto que permite a comunicação com a equipa do Argos.

            +
          • +
          • +

            Sign in – Entrar na aplicação como utilizador.

            +
          • +
          +

           

          +

          2.2    Login

          +


          Estão disponíveis diferentes opções de login, desde meios de comunicação social a canais de investigação e comunicação académica.

          +


          Paste Picture 10


          +

          Atenção! Não é necessária uma conta de utilizador.

          +

          2.3   Menu do Utilizador

          +
          +

          Espaço dedicado e que poderá ser customizado de acordo com o perfil pessoal do utilizador.

          +
          - - + +
          -

          Start New DMP is an easy way to start writing a DMP. It provides an editor that goes through the essential elements of a DMP and guides the process of its creation step by step.

          -

           

          -

          From “Homepage”

          -

          -

           

          -

          From Dashboard

          -

          -

          or

          -

          -

           

          -

          From “Add Dataset”

          -

          +
          Paste Picture 11 +

          Definições do Meu Perfil -  Exibe a página de perfil que contém detalhes tais como: nome, e-mail, dados da conta Zenodo, etc.

          +

          PGDs associados - Coleção dos PGDs do utilizador.

          +

          Log out - Termina a sessão e redireciona para a página de login.

          -

           

          -

           

          -

          - +

           

          +

          2.4   Menu Principal

          +


          O menu principal está localizado no lado esquerdo do ecrã.

          +

          Dependendo da forma como os utilizadores vêem a ferramenta, ou seja, se já efetuaram o login ou não, o menu principal altera-se para incluir características que estão apenas disponíveis no painel dos respetivos  utilizadores.

          +
          - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          -

          Add Dataset is an easy way to add new datasets to pre-existing DMPs.

          -

           

          -

          From Dashboard

          -

          -

           

          -

          From “My Datasets”

          -

          -

           

          -

          From “My DMPs”

          -

          -

           

          -

          From Dataset Editor

          -

          +
          +


          Menu Principal – 
          Antes de  Iniciar a Sessão

          +
          +

           

          +
          +


          Menu Principal - Após Iniciar 
          a Sessão

          +


          Paste Picture 12 




          +

           

          +
          +

           

          +

          Paste Picture 13

          +

           

          +
          Início  - Direciona o utilizador para a página inicial/painel. +

           

          +
          Início  - Direciona o utilizador para a página inicial/painel.
          PGDs públicos – Conjunto de PGDs que estão disponíveis publicamente no Argos. +

           

          +
          Os meus PGDs - Inclui todos os PGDs dos quais o utilizador é proprietário ou colaborador.
          Datasets públicos – Conjunto de Datasets que estão disponíveis publicamente no Argos. +

           

          +
          Os meus Datasets - Inclui todos os Datasets dos quais o utilizador é proprietário ou colaborador.
          Co-Branding - Página para visualizar o software e aprender como contribuir para a aplicação. +

           

          +
          PGDs públicos - Conjunto de PGDs que estão disponíveis publicamente no Argos.
          Suporte - Formulário de contacto que permite a comunicação com a equipa do Argos. +

           

          +
          Datasets públicos - Conjunto de Datasets que estão disponíveis publicamente no Argos.
          Enviar comentários - Formulário de feedback para contribuir com sugestões e opiniões sobre a utilização de Argos. +

           

          +
          Sobre - Informa sobre o âmbito e principais funcionalidades da ferramenta.
          Sobre - Informa sobre o âmbito e principais funcionalidades da ferramenta. +

           

          +
          Condições do Serviço - Providencia o status legal para a utilização do Argos.
          Condições do Serviço - Providencia o status legal para a utilização do Argos. +

           

          +
          Glossário - Inclui os termos usados na ferramenta e explica os componentes básicos.
          Glossário - Inclui os termos usados na ferramenta e explica os componentes básicos. +

           

          +
          Guia do Utilizador - Guia para os utilizadores aprenderem a usar o Argos.
          Guia do Utilizador - Guia para os utilizadores aprenderem a usar o Argos. +

           

          +
          +

          Contacto de suporte - Formulário de contacto que permite a comunicação com a equipa do Argos.

          -

           

          -
        8. -

          Secondary entities

          -
        9. -

           

          -

          Repository  - an electronic database or an information system where data are stored and maintained

          -

           

          -

          Data set - a collection of data which are bind together under a specific format

          -

           

          -

          Registry - a database of entities and descriptions

          -

           

          -

          Service - a software of specific operations and tasks that interacts with other software and hardware

          -

           

          -

          Researcher - an individual practicing research

          -

           

          -

          Funding organization - an organisation that funds research programmes and/ or researchers’ activities

          -

           

          -
        -
      • -

        Navigation

        -
      • -
          -
        1. -

          Homepage

          -
        2. -

           

          -

          The homepage can be found under argos.openaire.eu, also accessible from  the OpenAIRE Service catalogue and the EOSC.

          -

           

          -

          -

           

          -

          About - informs about the scope and main functions of the tool (How it works, ROADMAP, FAQs, Contributors)

          -

           

          -

          Resources - provides useful information about using Argos and includes dissemination material (Media Kit, User Guide, Co-branding)

          -

           

          -

          Contact - a contact form that facilitates communication with Argos team

          -

           

          -

          Sign in - enters the tool as a user

          -
        3. -

          Login

          -
        4. -

           

          -

          Different login options are available to choose from social media to research and scholarly communication channels.

          -

          -

           

          -

          Note! No user account is required.

          -

           

          -
        5. -

          User Account Menu

          -
        6. -

           

          -

          A dedicated, customisable space of the user’s personal profile.

          -

           

          -

          - +

           

          +

          2.5   Início

          +
          +

          O “Início” é a informação que aparece depois de entrar no Argos a partir da página inicial.

          +

          Inclui informação condensada baseada na função Argos e na sua utilização.

          +


          Início –
          Antes de iniciar a sessão


          Paste Picture 14


          +
          - - - + +
          -

          -
          -

          My profile settings -  displays the profile page which contains details such as name, email, zenodo account details etc.

          -

           

          -

          Associated DMPs - a collection of users’ DMPs

          -

           

          -

          Log out - terminates the session, and redirects to the login page.

          +
          Paste Picture 15 +


          Última Atividade
          - Exibe os PGDs e Datasets publicamente disponíveis, de acordo com a data da sua publicação no Argos e a sua etiqueta (PGDs ou Datasets).

          -

           

          -

           

          -
        7. -

          Main Menu

          +

          + + + + + + + +
          Paste Picture 16 +


          Uso Público
          - Mostra o número de PGDs, Datasets, Grants e Organizações publicamente disponíveis e incluídas no Argos.

          +

           

          +

          Atenção! Após iniciar a sessão no Argos, a página inicial torna-se num painel pessoal e, como tal, os números alteram-se de acordo com a atividade do utilizador.

          +
          +

           

          +

          Início - Após Iniciar a Sessão


          Paste Picture 17


          + + + + + + + +
          Paste Picture 18 +


          Última Atividade
          - Exibe os PGDs e Datasets do utilizador, de acordo com a data da sua última modificação, estado  do documento (rascunho, finalizado, publicado) e a sua etiqueta (PGDs ou Datasets).

          +
          +

           

          + + + + + + + +
          Paste Picture 19 +


          Uso Pessoal
          - Mostra a atividade do utilizador nos PGDs, Datasets, Grants e Organizações.

          +
          +

           

          +

          2.6   Os Meus PGDs / Os Meus Datasets

          +
          +

          Contém todos os PGDs e Datasets de que o utilizador é proprietário ou colaborador. Tanto os PGDs, como os Datasets, são classificados pela data da sua última modificação, o estado do documento (rascunho, finalizado, publicado) e a sua etiqueta (PGDs ou Datasets).

          +

          Os Meus PGDs

          +

          Quando a etiqueta é verde trata-se de um PGD, mostrando o papel da pessoa que vê o PGD, o estado do processo de escrita, a versão atual do PGD, o grant associado ao PGD, o número e nome dos Datasets que o PGD tem.


          Paste Picture 20

          +
            +
          • +

            Exportar - Suporta o download dos outputs do PGD nos seguintes formatos: PDF, Document, XML, RDA JSON (pode ser importado para outras ferramentas de PGD compatíveis com a RDA).

          • -

             

            -

            The main menu is located on the left side of the screen. Depending on how users view the tool, i.e. whether they have logged in or not, the main menu changes to include features that are available only in individuals’ dashboards.

            -

             

            -

            - - - - - - - -
            -

            Main menu - not logged in

            -

             

            -

            -

             

            -

            Home  - gets you back to the homepage / dashboard

            -

             

            -

            Public DMPs - a collection of DMPs publicly available in Argos

            -

             

            -

            Public Datasets - a collection of Datasets publicly available in Argos

            -

             

            -

            Co-Branding - a page to view the software and learn how to contribute

            -

             

            -

            Support - a contact form that facilitates communication with Argos team

            -

             

            -

            Send feedback - a feedback form to contribute thoughts and opinions about using Argos

            -

             

            -

            About - informs about the scope and main functions of the tool

            -

             

            -

            Terms of Service - provides the legal status for using of ARGOS

            -

             

            -

            Glossary - includes the terminology used in the tool and explains basic components

            -

             

            -

            User Guide - a guide for users to learn how to use Argos

            -

             

            -
            -

            Main menu - logged in

            -

             

            -

            -

             

            -

            Home  - gets you back to the homepage / dashboard

            -

             

            -

            My DMPs - includes all DMPs which the user is either the owner or the collaborator of

            -

             

            -

            My Datasets - includes all Datasets which the user is either the owner or the collaborator of

            -

             

            -

            Public DMPs - a collection of DMPs publicly available in Argos

            -

             

            -

            Public Datasets - a collection of Datasets publicly available in Argos

            -

             

            -

            About - informs about the scope and main functions of the tool

            -

             

            -

            Terms of Service - provides the legal status for using of ARGOS

            -

             

            -

            Glossary - includes the terminology used in the tool and explains basic components

            -

             

            -

            User Guide - a guide for users to learn how to use Argos

            -

             

            -

            Contact support - a contact form that facilitates communication with Argos team

            -

             

            -
            -
          • -

            Dashboard

            +
          +
            +
          • +

            Adicionar Dataset - Permite adicionar mais Datasets aos PGDs existentes.

          • -

             

            -

            Dashboard is the console that appears after entering Argos from the Homepage and includes condensed information based on Argos function and their use.

            -

             

            -

            Dashboard - Not logged in

            -

             

            -

            -

             

            -

            - - - - - - - -
            -

            -
            -

            Latest Activity - displays publicly available DMPs and Datasets according to the date of their publication in Argos and their Label (DMPs or Datasets)

            -
            -

             

            -

            - - - - - - - -
            -

            -
            -

            Public Usage - shows the number of publicly available DMPs, Datasets, Grants and Organizations included in Argos

            -

             

            -

            Note! When logged in to ARGOS the Homepage becomes a personal Dashboard, hence the numbers change to correspond to information provided by the individual’s activity.

            -
            -

             

            -

            Dashboard - Logged in

            -

             

            -

            -

             

            -

             

            -

            - - - - - - - -
            -

            -
            -

            Latest Activity - displays users’ DMPs and Datasets classified according to the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets)

            -
            -

             

            -

            - - - - - - - -
            -

            -
            -

            Personal Usage - shows users activity in DMPs, Datasets, Grants and Organizations

            -
            -

             

            -
          • -

            My DMPs / My Datasets

            +
          +
            +
          • +

            Convidar - Fornece direitos de edição sobre o documento.

          • -

             

            -

            Contains all DMPs and Datasets which the user is either the owner or the collaborator of. Both DMPs and Datasets on the user dashboard are classified by the date of their last modification, the status of the document (draft, finalized, published) and their label (DMPs or Datasets).

            -

             

            -

            My DMPs

            -

            Each DMP card is green and shows the role of the person viewing the DMP, the status of the writing process, the version of the current DMP, the grant associated with the DMP, the number and name of datasets that the DMP has.

            -

             

            -

            -

             

            -

            Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

            -

             

            -

            Add Dataset - adds more Datasets to existing DMPs

            -

             

            -

            Invite - provides people with edit rights on the document

            -

             

            -

            Clone - creates an exact replica of the DMP

            -

             

            -

            - +
          • +

            Duplicar - Cria uma réplica exata do PGD.

            +
          • + +
            - - - + +
            -

            -
            -

            New version - starts a new version of the DMP

            -

            All DMP Versions  - shows the history of the different versions of the existing DMP

            -

            Delete - permanently removes DMPs

            -

             

            +
            Paste Picture 21 +


            Nova Versão
            - Inicia uma nova versão do PGD.

            +

            Ver todas as Versões do PGD  - Mostra o histórico das diferentes versões do PGD.

            +

            Eliminar - Remove permanentemente o PGD.

            -

             

            -

             

            -

            My Datasets

            -

            Each Dataset card is yellow and shows the role of the person viewing the Dataset, the status of the writing process, the grant associated with the DMP and the tite of the DMP that the dataset is part of.

            -

             

            -

            -

             

            -

            Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

            -

             

            -

            Invite - Sends email or searches the Argos Users Catalogue to find colleagues/ collaborators. Invitation sent provides people with edit rights on the document.

            -

             

            -

             

            -

            - +
            +


            Os Meus Datasets

            +

            Quando a etiqueta é amarelo trata-se de um Dataset e mostra o papel da pessoa que visualiza o Dataset, o estado do processo de escrita, o grant associado ao PGD e o título do PGD do qual o Dataset faz parte.


            Paste Picture 22

            +
              +
            • +

              Exportar - Suporta o download dos outputs do Dataset nos seguintes formatos: PDF, Document, XML, RDA JSON (pode ser importado para outras ferramentas de PGD compatíveis com a RDA).

              +
            • +
            • +

              Convidar - Possibilidade de envio de e-mail ou pesquisa no Catálogo de Utilizadores do Argos, de modo a encontrar colegas/colaboradores. O convite enviado fornece direitos de edição sobre o documento.

              +
            • +
            • +

              Copiar o Dataset - Cria uma cópia do Dataset.

              +
            • +
            • +

              Eliminar - Remove permanentemente o Dataset.

              +
            • +
            +
            +

            2.7   PGDs Públicos / Datasets Públicos

            +


            Contém informação de PGDs que estão disponíveis em acesso aberto no Argos. Isto significa que os proprietários e membros do PGD estão a disponibilizar os seus PGDs e Datasets associados a todos os utilizadores (Argos e não Argos), que queiram consultá-los ou reutilizá-los no âmbito da licença atribuída.

            +

            Tanto os PGDs como os Datasets são organizados e apresentados pela data da sua última modificação e pela sua etiqueta (PGDs ou Datasets). Os utilizadores também podem procurar o PGD ou Dataset a partir da barra de pesquisa.

            +

            PGDs Públicos

            +

            Quando a etiqueta é verde trata-se de um PGD e exibe o título do PGD, o seu estado, a sua versão, o grant associado, o número e o nome dos Datasets que o PGD contém.

            +


            Paste Picture 23

            +
              +
            • +

              Exportar - Suporta o download dos outputs do PGD nos seguintes formatos: PDF, Document, XML, RDA JSON (pode ser importado para outras ferramentas de PGD compatíveis com a RDA).

              +
            • +
            +
              +
            • +

              Duplicar - Cria uma cópia idêntica do PGD.

              +
            • +
            +

            Datasets Públicos

            +

            Quando a etiqueta é amarelo trata-se de um Dataset Público e mostra o título do Dataset, o seu estado, o grant associado ao PGD e o papel da pessoa que visualiza o Dataset, o estado do processo de escrita, o grant associado ao PGD e o título do PGD do qual o Dataset faz parte.


            Paste Picture 24

            +
              +
            • +

              Exportar - Suporta o download dos outputs do Dataset nos seguintes formatos: PDF, Document, XML, RDA JSON (pode ser importado para outras ferramentas de PGD compatíveis com a RDA).

              +
            • +
            +

             

            +
            - - - + +
            -

            -
            -

            Copy Dataset - creates a copy of the dataset

            -

            Delete - permanently removes Datasets

            +
            Paste Picture 25 +

            Copiar o Dataset - Cria uma cópia do Dataset.

            -
          • -

            Public DMPs / Public Datasets

            +



            +

            2.8   Criar novo PGD

            +


            Existem várias formas de criar um novo PGD no Argos.

            +
            Paste Picture 26


            +

            Existem 4 etapas envolvidas na criação de um PGD:

            +

            - Informação Geral;

            +

            - Informação sobre o Financiamento;

            +

            - Informação sobre a Licença;

            +

            - Informação sobre os Datasets.

            +

            Informação Geral

            +

            Paste Picture 27

            Paste Picture 28


            +
              +
            • +

              Título do PGD - Título do documento.

            • -

               

              -

              Contains DMPs outputs that are openly available in Argos. That means that DMP owners and members are making their DMP and/or Dataset outputs available to all Argos and non-Argos users who might want to consult or re-use them under the framework provided by the assigned DMP license.

              -

              Both DMPs and Datasets on the user dashboard are classified by the date of their last modification and their label (DMPs or Datasets). Users can also search for the DMP or Dataset from the search bar.

              -

               

              -

              Public DMPs

              -

              Each Public DMP card is green and displays the title of the DMP, its status (published), the version of the DMP, the grant associated with it, the number and name of datasets that the DMP contains.

              -

               

              -

              -

               

              -

              Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

              -

               

              -

              Clone - creates an exact replica of the DMP

              -

              - - - - - - - -
              -

              -
              -

              All DMP Versions - shows the history of the different versions of the existing DMP

              -

               

              -
              -

               

              -

               

              -

              Public Datasets

              -

              Each Public Dataset card is yellow and displays the title of the dataset, the status of the dataset (published), the grant associated with the DMP and the title of the DMP that the dataset is part of.

              -

               

              -

              -

               

              -

              Export - supports download of the DMP outputs in the following formats: PDF, Document, XML, RDA JSON (can be imported to other RDA compliant DMP tools)

              -

               

              -

              - - - - - - - -
              -

              -
              -

              Copy Dataset - creates a copy of the dataset

              -
              -
            • -

              Create DMPs

              +
            • +

              Descrição - Breve descrição do contexto e objetivos do PGD.

            • -

               

              -

              There are many ways to create new DMPs in Argos.

              -

               

              -

              Start new DMP - Start Wizard

              -

              -

               

              -

              There are four steps involved in creating a DMP: Main Info - Funding Info - License Info - Dataset Info

              -

               

              -

               

              -
                -
              1. Main Info
              2. -

                 

                -

                -

                -

                 

                -

                 

                -

                Title - title of the DMP

                -

                 

                -

                Description - brief description of what the DMP is about, it’s scope and objectives

                -

                 

                -

                Language - the language of the DMP

                -

                 

                -

                Visibility - how the DMP is displayed in Argos. By choosing Public, the DMP is automatically made available to all users from the “Public DMPs” collection.

                -

                 

                -

                Researchers - the people that have produced, processed, analysed the data described in the DMP

                -

                 

                -

                Organizations - the names of the organizations contributing to the creation and revision of the DMPs

                -

                 

                -

                Contact - the contact details of the DMP owner

                -

                 

                -

                 

                -
              3. Funding Info
              4. -

                 

                -

                -

                 

                -

                Funding organizations - A drop-down menu where users may find the organisation that their research is funded by. In case that the name of a funding organisation can not be found in Argos, users may create a new record with the name and details of the funding organisation (“Insert it manually”).

                -

                 

                -

                Grants - A drop-down menu to select the grant that is associated with the research project of the given funding organisation. In case that the grant can not be found in Argos, users may create a new record with the number and name of the grant (“Insert it manually”).

                -

                 

                -

                Project - This field is to be completed only for projects where multiple grants apply. Otherwise, it is left blank and is later filled automatically by Argos metadata.

                -

                 

                -

                Note!  There may be many projects associated with a grant number.

                -

                 

                -

                 

                -
              5. License Info
              6. -

                 

                -

                -

                License - A list of licenses to choose from and assign to DMPs

                -

                 

                -

                 

                -
              7. Dataset Info
              8. -

                 

                -

                -

                 

                -

                Dataset Info - Select a template to describe your datasets. You may select more than one template.

                -

                 

                -

                Save DMPs

                -

                 

                -

                Discard - undo all changes made to the dataset

                -

                 

                -

                Save - keeps all changes made to the DMP and continues work on the same page

                -

                 

                -

                Save & Add Dataset - keeps all changes made to the DMP and the Dataset editor starts to describe the first dataset of the DMP

                -
              -
            • -

              Add Dataset(s)

              +
            • +

              Idioma - Idioma do PGD.

            • -

              There are two ways to create datasets: when creating the first dataset of the DMP and when adding datasets to existing DMPs. Add datasets are linked to and are associated with at least one DMP in Argos. A dataset can not exist as an orphan record.

              -

               

              -

              First dataset

              -

              -

              Once the DMP is created, the user can fill in the description for their data in the Dataset Editor.

              -

               

              -

              Add dataset - Adds more Dataset to existing DMPs

              -

              There are three steps involved in adding a Dataset: Select a DMP for your Dataset - Select Template - Edit Dataset

              -

               

              -
                -
              1. Select a DMP for your Dataset
              2. -

                -

                Selects an existing DMP from the drop-down menu

                -

                 

                -
              3. Select Template
              4. -

                -

                Selects the template of the Dataset that users are required to describe their datasets with by corresponding to their grant funding organisations.

                -

                 

                -
              5. Edit Dataset
              6. -

                -

                A Dataset Editor to add information that describes management activities according to the selected template.

                -

                 

                -

                Save Datasets

                -

                There are many ways to Save a DMP in Argos. They all serve the same function, but the difference lies in the follow up action.

                -

                 

                -

                -

                 

                -

                Discard - undo all changes made to the dataset

                -

                 

                -

                Save - keeps all changes made and continues work on the same page

                -

                 

                -

                Save & Close - keeps all changes made, but the editor’s window closes and the user is redirected to their dashboard

                -

                 

                -

                Save & Add New - keeps all changes made and a new editor starts to describe a new dataset

                -
              -
            • -

              DMPs/ Datasets records

              +
            • +

              Visibilidade – Informação sobre como será disponibilizado o PGD no Argos. Ao selecionar “Público” o PGD é disponibilizado a todos os utilizadores, através da opção “PGDs Públicos”.

            • -

              Records of DMPs and Datasets in Argos after editing and after finalization.

              -

              Users can view the DMPs and Datasets they create from their dashboard. By opening a record they have created, they are provided with additional functionalities that are binded to the completion of the DMP writing process. Different functionalities apply according to the status of the DMP, i.e. before or after the DMP finalization.

              -

               

              -

               

              -

              DMPs before finalization

              -

              -

               

              -

              Before finalization, the DMP can be further edited, deleted or cloned. Users can review information that they have added regarding grant, researchers, DMP description and datasets used. New datasets can be added at any time from this page. Users can export the DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP.

              -

               

              -

               

              -

              Invite

              -

              -

               

              -

               

              -

              DMPs after finalization

              -

              -

               

              -

              After the DMP finalization, the DMP can be made publicly visible in Argos and deposited in Zenodo. Users can export the finalized DMP, they can start working on a new version and/ or invite colleagues to collaborate on completing the DMP. Finalization is possible to be reverted.

              -

               

              -

               

              -

              Datasets before finalization

              -

              Argos offers different options before and after the Dataset finalization.

              -

               

              -

              -

               

              -

              Before finalization, the Dataset can be further edited, deleted or cloned. Users can access the whole DMP that the dataset is part of from that page and review information that they have added regarding grant, researchers and Dataset description. Users can export the description of the dataset and invite colleagues to collaborate on its completion.

              -

               

              -

               

              -

              Datasets after finalization

              -

              -

               

              -

              After finalization, the Dataset can be exported and shared with colleagues for review.

              -

               

              -

               

              -

               

              -

               

              -

               

              -
        -
    -
    -
    -
    +
  • +

    Investigadores - As pessoas que produziram, processaram e analisaram os dados descritos no PGD.

    +
  • +
  • +

    Organizações - Nomes das organizações que contribuem para a criação e a revisão dos PGDs.

    +
  • +
  • +

    Contacto - Detalhe do proprietário do PGD.

    +
  • + +
    +

    Informação sobre o Financiamento

    +
    Paste Picture 29


    +
      +
    • +

      Organizações de Financiamento - Integra uma lista onde os utilizadores podem selecionar a organização através da qual a investigação é financiada. Caso o nome de uma organização financiadora não possa ser encontrado no Argos, os utilizadores podem criar um novo registo com o nome e detalhes da organização financiadora ("Inserir manualmente").

      +
    • +
    • +

      Grants - Integra um menu pendente para selecionar o grant que está associado ao projeto de investigação da organização financiadora em questão. Caso o grant não seja encontrado no Argos, os utilizadores podem criar um novo registo com o número e nome do mesmo ("Inserir manualmente").

      +
    • +
    • +

      Projeto - Este campo é para ser preenchido apenas por projetos onde múltiplos grants são aplicáveis. De outra forma, este campo não deverá ser preenchido, sendo mais tarde adicionada informação de forma automática pelos metadados do Argos.

      +
    • +
    +

    Informação sobre a Licença

    +
    Paste Picture 30


    +
      +
    • +

      Licença - Inclui uma lista de licenças a escolher e a atribuir aos PGDs.

      +
    • +
    +
    +

    Informação sobre os Datasets

    +
    Paste Picture 31

    +
      +
    • +

      Informação sobre os Datasets – Permite selecionar o modelo para descrever os seus datasets. Poderá selecionar mais do que um modelo de dados.

      +
    • +
    • +

      Guardar Salva todas as alterações efetuadas ao PGD, permitindo continuar a trabalhar na mesma página.

      +
    • +
    • +

      Guardar & Adicionar Dataset – Salva todas as alterações efetuadas ao PGD, sendo dado início ao Editor do Dataset para começar a descrever o primeiro conjunto de dados do PGD.

      +
    • +
    +

    +

    2.9  Adicionar Dataset(s)

    +
    +

    Existem duas maneiras de criar Datasets:

    +

    - Criar o primeiro Dataset do PGD;

    +

    - Adicionar Datasets aos PGDs existentes.

    +

     

    +

    No Argos, os Datasets estão ligados e associados a pelo menos um PGD. Um Dataset não pode existir como registo único.

    +

     

    +

    Primeiro Dataset

    +
    Paste Picture 32

    +


    Uma vez criado o PGD, o utilizador poderá preencher a descrição dos seus dados no “Editor de Dataset”.

    +

     

    +
      +
    • +

      Adicionar Dataset - Adiciona mais Datasets a PGDs já existentes.

      +
    • +
    +

    São três os passos a seguir para adicionar um Dataset:

    +
      +
    • +
        +
      • +

        Selecionar o PGD para o seu Dataset;

        +
      • +
      • +

        Selecionar o modelo de dados respetivo;

        +
      • +
      • +

        Editar o Dataset.

        +
      • +
      +
    • +
    +
    +

    Selecione um PGD para o seu Dataset

    +
    Paste Picture 33


    +

    Selecione um PGD já existente na lista.

    +
    +

    Selecione um Modelo

    +
    +

    Paste Picture 34

    +
    +

    Selecionar o modelo de dados para descrever o seu Dataset, de acordo com a organização que financia o seu grant.

    +


    Edite o Dataset

    +
    +

    O “Editor de Dataset” apoia na descrição de informação de acordo com o modelo selecionado.

    +
    Paste Picture 35

    +
      +
    • +

      Guardar Datasets - Existem várias formas de guardar Datasets no Argos. Todas têm a mesma finalidade, diferindo da ação de acompanhamento.

      +
    • +
    +
      +
    • +

      Ignorar – Não guarda as alterações realizadas no Dataset.

      +
    • +
    • +

      Guardar – Salva todas as alterações realizadas e permite continuar a trabalhar na mesma página.

      +
    • +
    • +

      Concluir – Salva todas as alterações realizadas, encerrando a janela do editor e redirecionando para o “Início”.

      +
      +

      Paste Picture 36

      +
    • +
    +
    +

    2.10 Registo de PGDs/Datasets

    +

    Regista os PGDs e Datasets no Argos, após a sua edição e conclusão.

    +

    Os utilizadores podem visualizar os PGDs e Datasets que criaram. Ao abrir um registo que tenham criado, são-lhes fornecidas funcionalidades adicionais que estão ligadas à conclusão do processo de escrita dos PGDs.

    +

    São aplicáveis funcionalidades diferentes consoante o estado do PGD, ou seja, antes ou depois da conclusão do PGD.

    +


    Antes de concluir o PGD


    Paste Picture 37

    +
    +

    Antes de concluir o PGD, este pode ainda ser editado, eliminado ou duplicado. Os utilizadores podem rever a informação que acrescentaram relativamente a grants, investigadores, descrição do PGD e Datasets e/ou modelos de dados utilizados.

    +

    Podem ser adicionados novos Datasets em qualquer altura, a partir desta página.

    +

    Os utilizadores podem exportar o PGD, começar a trabalhar numa nova versão e/ou convidar colegas a colaborar na conclusão do seu plano.

    +


    Convidar

    +
    Paste Picture 38


    +

    Após concluir o PGD


    Paste Picture 39

    +
    +

    Após a conclusão do PGD, este poderá ser tornado publicamente visível no Argos e depositado no Zenodo.

    +

    Os utilizadores podem exportar o PGD finalizado, começar a trabalhar numa nova versão e/ou convidar colegas a colaborar na conclusão do plano.

    +

    É possível reverter a conclusão do PGD.

    +

     

    +

    Antes de concluir os Datasets

    +
    Paste Picture 40


    +

    Antes de concluir o Dataset, este pode ainda ser editado, eliminado ou duplicado.

    +

    Os utilizadores podem aceder a todo o PGD do qual o Dataset faz parte, a partir dessa página, e rever a informação que acrescentaram relativamente ao grant, investigadores e descrição do Dataset.

    +

    Os utilizadores podem exportar a descrição do Dataset e convidar os colegas a colaborar na sua conclusão.

    +

     

    +

     Após concluir os Datasets

    +
    Paste Picture 41

    +


    Após a conclusão do Dataset, este poderá ser exportado e partilhado com colegas para revisão.


    +

     

    diff --git a/dmp-frontend/src/polyfills.ts b/dmp-frontend/src/polyfills.ts index adefaa3b1..5dc0b3e49 100644 --- a/dmp-frontend/src/polyfills.ts +++ b/dmp-frontend/src/polyfills.ts @@ -38,7 +38,7 @@ import 'core-js/es6/reflect'; /*************************************************************************************************** * Zone JS is required by Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js'; // Included with Angular CLI. diff --git a/dmp-frontend/src/tsconfig.app.json b/dmp-frontend/src/tsconfig.app.json index d9b21b2b4..d1370a69b 100644 --- a/dmp-frontend/src/tsconfig.app.json +++ b/dmp-frontend/src/tsconfig.app.json @@ -6,8 +6,11 @@ "types": ["node"], "typeRoots": [ "../node_modules/@types" ] }, - "exclude": [ - "test.ts", - "**/*.spec.ts" + "files": [ + "main.ts", + "polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" ] } diff --git a/dmp-frontend/tsconfig.json b/dmp-frontend/tsconfig.json index 4d05665e4..c554a09e7 100644 --- a/dmp-frontend/tsconfig.json +++ b/dmp-frontend/tsconfig.json @@ -5,9 +5,8 @@ "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, - "module": "esnext", - "moduleResolution": "node", - "emitDecoratorMetadata": true, + "module": "es2020", + "moduleResolution": "node", "experimentalDecorators": true, "importHelpers": true, "skipLibCheck": true, diff --git a/dmp-frontend/tslint.json b/dmp-frontend/tslint.json index b82bc955a..e38acd69b 100644 --- a/dmp-frontend/tslint.json +++ b/dmp-frontend/tslint.json @@ -20,7 +20,10 @@ "class-name": true, "comment-format": [ true - ], + ], + "deprecation": { + "severity": "warning" + }, "curly": true, "eofline": true, "forin": true, @@ -79,8 +82,7 @@ "no-switch-case-fall-through": true, "no-trailing-whitespace": true, "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-use-before-declare": true, + "no-unused-expression": true, "no-var-keyword": true, "object-literal-sort-keys": false, "one-line": [ From faeb7e0d62ea4d76100fdd6ce3979fa4a6b2b5df Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Mon, 27 Sep 2021 16:25:17 +0300 Subject: [PATCH 071/156] improvement on computing ordinal on mutliplicity fields --- .../components/form-section/form-section.component.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts index a07ea16ca..18a75fe08 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts @@ -74,8 +74,17 @@ export class FormSectionComponent implements OnInit, OnChanges { addMultipleField(fieldsetIndex: number) { const compositeFieldToBeCloned = (this.form.get('compositeFields').get('' + fieldsetIndex) as FormGroup).getRawValue(); const multiplicityItemsArray = ((this.form.get('compositeFields').get('' + fieldsetIndex).get('multiplicityItems'))); + + const ordinal = multiplicityItemsArray.length? multiplicityItemsArray.controls.reduce((ordinal, currentControl)=>{ + const currentOrdinal = currentControl.get('ordinal').value as number; + + if(currentOrdinal>= ordinal){ + return currentOrdinal +1; + } + return ordinal as number; + },0) : 0; const idMappings = [] as {old: string, new: string}[]; - const compositeField: DatasetDescriptionCompositeFieldEditorModel = new DatasetDescriptionCompositeFieldEditorModel().cloneForMultiplicity(compositeFieldToBeCloned, multiplicityItemsArray.length,idMappings); + const compositeField: DatasetDescriptionCompositeFieldEditorModel = new DatasetDescriptionCompositeFieldEditorModel().cloneForMultiplicity(compositeFieldToBeCloned, ordinal ,idMappings); From 06364873cad78ba03c1521243c8862b3e36708a5 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 27 Sep 2021 18:11:55 +0300 Subject: [PATCH 072/156] Fix issue with unordered multiplicity fields --- .../main/java/eu/eudat/logic/managers/DatasetManager.java | 2 +- .../eudat/logic/utilities/documents/word/WordBuilder.java | 7 +++++-- .../data/user/components/datasetprofile/FieldSet.java | 4 ++-- .../dataset-description-form.model.ts | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index b96934677..d3104b350 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -741,7 +741,7 @@ public class DatasetManager { } private String propertiesModelToString(PagedDatasetProfile pagedDatasetProfile) { - Map values = new HashMap(); + Map values = new LinkedHashMap<>(); pagedDatasetProfile.toMap(values); JSONObject jobject = new JSONObject(values); return jobject.toString(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 035c0a2a0..e14dc5efa 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.math.BigInteger; import java.util.*; +import java.util.stream.Collectors; public class WordBuilder { private static final Logger logger = LoggerFactory.getLogger(WordBuilder.class); @@ -178,7 +179,8 @@ public class WordBuilder { } hasValue = createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); if (compositeField.getMultiplicityItems() != null && !compositeField.getMultiplicityItems().isEmpty()) { - for (FieldSet multiplicityFieldset : compositeField.getMultiplicityItems()) { + List
    list = compositeField.getMultiplicityItems().stream().sorted(Comparator.comparingInt(FieldSet::getOrdinal)).collect(Collectors.toList()); + for (FieldSet multiplicityFieldset : list) { hasValue = createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); } } @@ -198,7 +200,8 @@ public class WordBuilder { private Boolean createFields(List fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, false, false); boolean hasValue = false; - for (Field field: fields) { + List tempFields = fields.stream().sorted(Comparator.comparingInt(Field::getOrdinal)).collect(Collectors.toList()); + for (Field field: tempFields) { if (visibilityRuleService.isElementVisible(field.getId())) { if (!createListing) { try { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java index 2dfd6020b..80ece4c30 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/user/components/datasetprofile/FieldSet.java @@ -175,12 +175,12 @@ public class FieldSet implements Comparable, PropertiesModelBuilder, ViewStyleDe private FieldSet CloneForMultiplicity2(List key, Map properties,String[] ids, int index){ FieldSet newFieldSet = new FieldSet(); - newFieldSet.id = ids[0]+"_"+ids[1]+"_"+ids[2]; + newFieldSet.id = ids[0]+"_"+ids[1]+"_"+ids[2] + (ids.length > 4 ? "_" + ids[3] : ""); newFieldSet.description = this.description; newFieldSet.extendedDescription = this.extendedDescription; newFieldSet.additionalInformation=this.additionalInformation; newFieldSet.title = this.title; - newFieldSet.ordinal = this.ordinal; + newFieldSet.ordinal = ids.length > 4 ? Integer.valueOf(ids[3]) : this.ordinal; newFieldSet.fields = new LinkedList(); for (Field field: this.fields) { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts index de0e2e870..993b73227 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts @@ -196,7 +196,7 @@ export class DatasetDescriptionCompositeFieldEditorModel extends BaseFormModel { cloneForMultiplicity(item: CompositeField, ordinal: number, idMappings:{old:string, new:string}[] = []): DatasetDescriptionCompositeFieldEditorModel { const newItem: DatasetDescriptionCompositeFieldEditorModel = new DatasetDescriptionCompositeFieldEditorModel(); - newItem.id = 'multiple_' + item.id + '_' + Guid.create(); + newItem.id = 'multiple_' + item.id + '_' + Guid.create() + '_' + ordinal; idMappings.push({old: item.id, new: newItem.id }); item.fields.forEach((field, index) => { From 99e4d231c29c770e40ce8b69ec88ca5d802b117c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 27 Sep 2021 18:14:21 +0300 Subject: [PATCH 073/156] Possible patch some leaks --- .../eu/eudat/logic/proxy/fetching/LocalFetcher.java | 3 ++- .../logic/services/utilities/MailServiceImpl.java | 1 + .../eu/eudat/models/rda/mapper/LanguageRDAMapper.java | 10 ++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java index 5562f1f89..43478f359 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java @@ -22,6 +22,7 @@ public class LocalFetcher { JAXBContext context = JAXBContext.newInstance(Config.class); Unmarshaller unmarshaller = context.createUnmarshaller(); Config config = (Config) unmarshaller.unmarshal(is); + is.close(); ConfigSingle currencyConfig = config.getConfigs().stream().filter(configSingle -> configSingle.getType().equals("currency")).findFirst().get(); return retrieveData(currencyConfig); @@ -39,7 +40,7 @@ public class LocalFetcher { Unmarshaller unmarshaller = context.createUnmarshaller(); Object object = unmarshaller.unmarshal(is); - + is.close(); Method reader = null; if (configSingle.getParseField() != null && !configSingle.getParseField().isEmpty()) { reader = new PropertyDescriptor(configSingle.getParseField(), aClass).getReadMethod(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java index 0a782c6f2..3f73d4996 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java @@ -86,6 +86,7 @@ public class MailServiceImpl implements MailService { InputStream inputStream = resource.getInputStream(); StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); + inputStream.close(); return writer.toString(); } catch (IOException e) { logger.error(e.getMessage(), e); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java index 0dfe20c0e..527ffe932 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java @@ -1,17 +1,16 @@ package eu.eudat.models.rda.mapper; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.models.rda.Language; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; public class LanguageRDAMapper { private final static Map langMap = new HashMap<>(); @@ -20,9 +19,12 @@ public class LanguageRDAMapper { static { String json = null; try { - json = new BufferedReader(new InputStreamReader(LanguageRDAMapper.class.getClassLoader().getResource("internal/rda-lang-map.json").openStream(), StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining("\n")); + ObjectMapper mapper = new ObjectMapper(); + InputStreamReader isr = new InputStreamReader(LanguageRDAMapper.class.getClassLoader().getResource("internal/rda-lang-map.json").openStream(), StandardCharsets.UTF_8); + json = mapper.readValue(isr, String.class); + isr.close(); langMap.putAll(new org.json.JSONObject(json).toMap()); + } catch (IOException e) { logger.error(e.getMessage(), e); } From fc7c39081a221ca28cb37e3605dcb07f974301b1 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 28 Sep 2021 14:15:50 +0300 Subject: [PATCH 074/156] Improve configuration loader --- ...igLoader.java => DefaultConfigLoader.java} | 82 +++++++++++++++---- .../configloaders/ProductionConfigLoader.java | 3 +- 2 files changed, 68 insertions(+), 17 deletions(-) rename dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/{DevelConfigLoader.java => DefaultConfigLoader.java} (76%) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java similarity index 76% rename from dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java rename to dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java index 14d5099f0..5c41211a6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java @@ -8,7 +8,6 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Profile; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.w3c.dom.Document; @@ -26,16 +25,13 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import java.io.*; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service("configLoader") -@Profile("devel") -public class DevelConfigLoader implements ConfigLoader { - private static final Logger logger = LoggerFactory.getLogger(DevelConfigLoader.class); +//@Profile("devel") +public class DefaultConfigLoader implements ConfigLoader { + private static final Logger logger = LoggerFactory.getLogger(DefaultConfigLoader.class); private ExternalUrls externalUrls; private List rdaProperties; @@ -53,10 +49,10 @@ public class DevelConfigLoader implements ConfigLoader { try { JAXBContext jaxbContext = JAXBContext.newInstance(ExternalUrls.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = getClass().getClassLoader().getResource(fileUrl).openStream(); + is = getStreamFromPath(fileUrl); externalUrls = (ExternalUrls) jaxbUnmarshaller.unmarshal(is); } catch (Exception ex) { - logger.error("Cannot find resource in classpath", ex); + logger.error("Cannot find resource", ex); } finally { try { if (is != null) is.close(); @@ -89,7 +85,7 @@ public class DevelConfigLoader implements ConfigLoader { String filePath = environment.getProperty("configuration.h2020template"); InputStream is = null; try { - is = getClass().getClassLoader().getResource(filePath).openStream(); + is = getStreamFromPath(filePath); this.document = new XWPFDocument(is); } catch (IOException | NullPointerException e) { logger.error(e.getMessage(), e); @@ -106,7 +102,7 @@ public class DevelConfigLoader implements ConfigLoader { String filePath = environment.getProperty("configuration.configurable_login_providers"); InputStream is = null; try { - is = getClass().getClassLoader().getResource(filePath).openStream(); + is = getStreamFromPath(filePath); ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); this.configurableProviders = mapper.readValue(is, ConfigurableProviders.class); } catch (IOException | NullPointerException e) { @@ -145,12 +141,34 @@ public class DevelConfigLoader implements ConfigLoader { public ExternalUrls getExternalUrls() { - this.setExternalUrls(); + if (externalUrls == null) { + externalUrls = new ExternalUrls(); + this.setExternalUrls(); + } else { + while (externalUrls.getMaxresults() == null) { + try { + Thread.sleep(100L); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + } return externalUrls; } public List getRdaProperties() { - this.setRdaProperties(); + if (rdaProperties == null) { + rdaProperties = new ArrayList<>(); + this.setRdaProperties(); + } else { + while (rdaProperties.size() == 0) { + try { + Thread.sleep(100L); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + } return rdaProperties; } @@ -160,11 +178,34 @@ public class DevelConfigLoader implements ConfigLoader { } public ConfigurableProviders getConfigurableProviders() { - this.setConfigurableProviders(); + if (configurableProviders == null) { + configurableProviders = new ConfigurableProviders(); + this.setConfigurableProviders(); + } else { + while (configurableProviders.getProviders().size() == 0) { + try { + Thread.sleep(100L); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + } return configurableProviders; } public Map getKeyToSourceMap() { + if (keyToSourceMap == null) { + keyToSourceMap = new HashMap<>(); + this.setKeyToSourceMap(); + } else { + while (keyToSourceMap.size() == 0) { + try { + Thread.sleep(100L); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + } this.setKeyToSourceMap(); return keyToSourceMap; } @@ -173,7 +214,7 @@ public class DevelConfigLoader implements ConfigLoader { InputStream is = null; Document doc; try { - is = getClass().getClassLoader().getResource(filePath).openStream(); + is = getStreamFromPath(filePath); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); doc = documentBuilder.parse(is); @@ -211,4 +252,13 @@ public class DevelConfigLoader implements ConfigLoader { } return values; } + + private InputStream getStreamFromPath(String filePath) { + try { + return new FileInputStream(filePath); + } catch (FileNotFoundException e) { + logger.info("loading from classpath"); + return getClass().getClassLoader().getResourceAsStream(filePath); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java index 1e2d36e3b..7f3c48109 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +/* @Service("configLoader") @Profile({ "production", "staging" }) public class ProductionConfigLoader implements ConfigLoader { @@ -236,4 +237,4 @@ public class ProductionConfigLoader implements ConfigLoader { } return values; } -} \ No newline at end of file +}*/ From defac6afcc0b0727ad254d004c13e6d12917c348 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 28 Sep 2021 14:17:03 +0300 Subject: [PATCH 075/156] Fix issue with date formats on RDA import --- .../eu/eudat/logic/managers/RDAManager.java | 5 +-- .../utilities/json/MultiDateDeserializer.java | 41 +++++++++++++++++++ .../main/java/eu/eudat/models/rda/Dmp.java | 4 ++ .../models/rda/mapper/LanguageRDAMapper.java | 5 +-- 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/MultiDateDeserializer.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java index 242a365c9..f277d98ac 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java @@ -1,6 +1,5 @@ package eu.eudat.logic.managers; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.entities.DMP; @@ -12,7 +11,6 @@ import org.springframework.stereotype.Component; import javax.transaction.Transactional; import java.io.IOException; -import java.io.Serializable; import java.text.SimpleDateFormat; @Component @@ -43,9 +41,8 @@ public class RDAManager { public DMP convertToEntity(String json, String[] profiles) throws IOException { ObjectMapper mapper = new ObjectMapper(); - mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")); - Dmp rda = mapper.readValue(json, RDAModel.class).getDmp(); + Dmp rda = mapper.readValue(json, RDAModel.class).getDmp(); return dmpRDAMapper.toEntity(rda, profiles); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/MultiDateDeserializer.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/MultiDateDeserializer.java new file mode 100644 index 000000000..636b8faa2 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/MultiDateDeserializer.java @@ -0,0 +1,41 @@ +package eu.eudat.logic.utilities.json; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +public class MultiDateDeserializer extends StdDeserializer { + + private static final List DATE_FORMATS = Arrays.asList("yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ss.S"); + + + public MultiDateDeserializer() { + super(Date.class); + } + + protected MultiDateDeserializer(Class vc) { + super(vc); + } + + @Override + public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { + String text = p.getText(); + + for (String dateFormat: DATE_FORMATS) { + try { + return new SimpleDateFormat(dateFormat).parse(text); + } catch (ParseException ignored) { + } + } + throw new JsonParseException(p, "No supported Date format"); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/Dmp.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/Dmp.java index 773ac5f72..a6dfb29d0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/Dmp.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/Dmp.java @@ -9,6 +9,8 @@ import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import eu.eudat.logic.utilities.json.MultiDateDeserializer; /** @@ -71,6 +73,7 @@ public class Dmp implements Serializable * */ @JsonProperty("created") + @JsonDeserialize(using = MultiDateDeserializer.class) @JsonPropertyDescription("") private Date created; /** @@ -147,6 +150,7 @@ public class Dmp implements Serializable * */ @JsonProperty("modified") + @JsonDeserialize(using = MultiDateDeserializer.class) @JsonPropertyDescription("Must be set each time DMP is modified. Indicates DMP version.") private Date modified; /** diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java index 527ffe932..dd2343a2d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/LanguageRDAMapper.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; @@ -17,13 +18,11 @@ public class LanguageRDAMapper { private static final Logger logger = LoggerFactory.getLogger(LanguageRDAMapper.class); static { - String json = null; try { ObjectMapper mapper = new ObjectMapper(); InputStreamReader isr = new InputStreamReader(LanguageRDAMapper.class.getClassLoader().getResource("internal/rda-lang-map.json").openStream(), StandardCharsets.UTF_8); - json = mapper.readValue(isr, String.class); + langMap.putAll(mapper.readValue(isr, LinkedHashMap.class)); isr.close(); - langMap.putAll(new org.json.JSONObject(json).toMap()); } catch (IOException e) { logger.error(e.getMessage(), e); From 91729bab6d5e999a8add4ab6bc98e39e89ca8b7a Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 30 Sep 2021 18:02:53 +0300 Subject: [PATCH 076/156] Optimize queries --- .../eudat/data/dao/entities/DatasetDao.java | 2 + .../data/dao/entities/DatasetDaoImpl.java | 11 +++++ .../java/eu/eudat/data/entities/Dataset.java | 9 ++-- .../eu/eudat/queryable/QueryableList.java | 2 + .../eudat/queryable/collector/Collector.java | 11 ++++- .../QueryableHibernateList.java | 43 +++++++++++++----- .../jpa/predicates/GroupByPredicate.java | 10 +++++ .../managers/DataManagementPlanManager.java | 9 +++- .../eudat/logic/managers/DatasetManager.java | 44 +++++++++++++------ .../listingmodels/DatasetListingModel.java | 12 ++--- 10 files changed, 116 insertions(+), 37 deletions(-) create mode 100644 dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/GroupByPredicate.java diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java index bcf5d134f..126958e11 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java @@ -13,6 +13,8 @@ public interface DatasetDao extends DatabaseAccessLayer { QueryableList getWithCriteria(DatasetCriteria criteria); + QueryableList filterFromElastic(DatasetCriteria criteria, List ids); + QueryableList getAuthenticated(QueryableList query, UserInfo principal, List roles); Dataset isPublicDataset(UUID id); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java index 3c5b3d3bc..50462c163 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java @@ -87,6 +87,16 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa return query; } + public QueryableList filterFromElastic(DatasetCriteria criteria, List ids) { + QueryableList query = getDatabaseService().getQueryable(Dataset.getHints(), Dataset.class); + + query.where(((builder, root) -> root.get("id").in(ids))); + if (!criteria.getAllVersions()) + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.and(builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), builder1.notEqual(nestedRoot.get("dmp").get("status"), DMP.DMPStatus.DELETED.getValue())), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); + + return query; + } + @Override public Dataset createOrUpdate(Dataset item) { return getDatabaseService().createOrUpdate(item, Dataset.class); @@ -121,6 +131,7 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa }); } else { query.where((builder, root) -> builder.equal(root.join("dmp", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal.getId())); + } return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java index 66c917cb0..41081cefb 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java @@ -16,13 +16,14 @@ import java.util.stream.Collectors; @NamedEntityGraphs({ @NamedEntityGraph( name = "datasetListingModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode(value = "datasetDataRepositories", subgraph = "datasetDataRepositories"), - @NamedAttributeNode(value = "datasetExternalDatasets", subgraph = "datasetExternalDatasets"), @NamedAttributeNode("registries"), - @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, + attributeNodes = {/*@NamedAttributeNode("services"), @NamedAttributeNode(value = "datasetDataRepositories", subgraph = "datasetDataRepositories"), + @NamedAttributeNode(value = "datasetExternalDatasets", subgraph = "datasetExternalDatasets"), @NamedAttributeNode("registries"),*/ + @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode(value = "profile", subgraph = "profile"), @NamedAttributeNode("creator")}, subgraphs = { @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users"), @NamedAttributeNode("grant"), @NamedAttributeNode("organisations")}), @NamedSubgraph(name = "datasetDataRepositories", attributeNodes = {@NamedAttributeNode("dataRepository")}), - @NamedSubgraph(name = "datasetExternalDatasets", attributeNodes = {@NamedAttributeNode("externalDataset")}) + @NamedSubgraph(name = "datasetExternalDatasets", attributeNodes = {@NamedAttributeNode("externalDataset")}), + @NamedSubgraph(name = "profile", attributeNodes = {@NamedAttributeNode("label")}) }), @NamedEntityGraph( diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java index f11c15876..ac457b28a 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java @@ -44,6 +44,8 @@ public interface QueryableList { QueryableList orderBy(OrderByPredicate predicate); + QueryableList groupBy(GroupByPredicate predicate); + QueryableList withHint(String hint); Long count(); diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java index 5de816bab..a6d710b11 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java @@ -1,6 +1,9 @@ package eu.eudat.queryable.collector; +import com.fasterxml.jackson.databind.ObjectMapper; + import javax.persistence.Tuple; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -9,9 +12,13 @@ import java.util.stream.Collectors; public class Collector { public List buildFromTuple(List results, Map> groupedResults, List fields, String key) { - return groupedResults.keySet().stream() + return results.stream().map(tuple -> { + Map parsedResult = new HashMap<>(); + tuple.getElements().forEach(tupleElement -> parsedResult.put(tupleElement.getAlias(), tuple.get(tupleElement.getAlias()))); + return parsedResult; + }).collect(Collectors.toList());/*groupedResults.keySet().stream() .map(x -> buildOne(groupedResults.get(x), fields, key)) - .collect(Collectors.toList()); + .collect(Collectors.toList());*/ } private Map buildOne(List tuples, List fields, String key) { diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index 9c461f295..a347e3a2b 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -1,5 +1,6 @@ package eu.eudat.queryable.jpa.hibernatequeryablelist; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.collector.Collector; import eu.eudat.queryable.exceptions.NotSingleResultException; @@ -33,6 +34,7 @@ public class QueryableHibernateList implements QueryableLi private List> nestedPredicates = new LinkedList<>(); private boolean distinct = false; private List> orderings = new LinkedList<>(); + private List> groupings = new LinkedList<>(); private List fields = new LinkedList<>(); private Integer length; private Integer offset; @@ -150,6 +152,11 @@ public class QueryableHibernateList implements QueryableLi return this; } + public QueryableList groupBy(GroupByPredicate predicate) { + this.groupings.add(predicate); + return this; + } + public Long count() { CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); @@ -205,6 +212,14 @@ public class QueryableHibernateList implements QueryableLi return predicates.toArray(new Order[predicates.size()]); } + private Expression[] generateGroupPredicates(List> groupByPredicates, Root root) { + List predicates = new LinkedList<>(); + for (GroupByPredicate groupPredicate : groupByPredicates) { + predicates.add(groupPredicate.applyPredicate(this.manager.getCriteriaBuilder(), root)); + } + return predicates.toArray(new Expression[predicates.size()]); + } + public List toList() { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); @@ -212,22 +227,20 @@ public class QueryableHibernateList implements QueryableLi this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); + if (!this.groupings.isEmpty()) this.query.groupBy(this.generateGroupPredicates(this.groupings, this.root)); if (!this.fields.isEmpty()) this.selectFields(); if (distinct) this.query.distinct(true); - //if (!this.fields.isEmpty()) return this.toListWithFields(); + //if (!this.fields.isEmpty()) this.query.multiselect(this.parseFields(this.fields)); + ObjectMapper mapper = new ObjectMapper(); + if (!this.fields.isEmpty()) return this.toListWithFields().stream().map(m -> mapper.convertValue(m, this.tClass)).collect(Collectors.toList()); return this.toListWithOutFields(); } public List toListWithFields() { - CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); - else this.query = builder.createQuery(this.tClass); - this.root = this.query.from(this.tClass); - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); - if (!this.fields.isEmpty()) this.selectFields(); - if (distinct) this.query.distinct(true); - List results = this.manager.createQuery(query).getResultList(); + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.offset != null) typedQuery.setFirstResult(this.offset); + if (this.length != null) typedQuery.setMaxResults(this.length); + List results = typedQuery.getResultList(); Map> groupedResults = results.stream() .collect(Collectors.groupingBy(x -> x.get("id"))); return this.collector.buildFromTuple(results, groupedResults, this.fields, "id"); @@ -252,6 +265,7 @@ public class QueryableHibernateList implements QueryableLi this.root = this.query.from(this.tClass); this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); + if (!this.groupings.isEmpty()) this.query.groupBy(this.generateGroupPredicates(this.groupings, this.root)); if (!this.fields.isEmpty()) this.selectFields(); if (distinct) this.query.distinct(true); if (!this.fields.isEmpty()) return this.toListAsyncWithFields(); @@ -356,6 +370,8 @@ public class QueryableHibernateList implements QueryableLi if (!this.orderings.isEmpty()) criteriaQuery.orderBy(this.generateOrderPredicates(this.orderings, criteriaRoot)); + if (!this.groupings.isEmpty()) criteriaQuery.groupBy(this.generateGroupPredicates(this.groupings, this.root)); + TypedQuery typedQuery = this.manager.createQuery(criteriaQuery); typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); return typedQuery; @@ -466,4 +482,11 @@ public class QueryableHibernateList implements QueryableLi .createQuery(update) .executeUpdate(); } + + private Path[] parseFields(List selectedFields) { + List paths = new ArrayList<>(); + selectedFields.forEach(s -> paths.add(root.get(s))); + + return paths.toArray(new Path[0]); + } } diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/GroupByPredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/GroupByPredicate.java new file mode 100644 index 000000000..849878e4e --- /dev/null +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/GroupByPredicate.java @@ -0,0 +1,10 @@ +package eu.eudat.queryable.jpa.predicates; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Root; + +public interface GroupByPredicate { + Expression applyPredicate(CriteriaBuilder builder, Root root); + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 5a070671b..3a03a12bc 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1171,8 +1171,13 @@ public class DataManagementPlanManager { .forEach(datasetEntity -> { Map properties = new HashMap<>(); if (datasetEntity.getProperties() != null) { - JSONObject jObject = new JSONObject(datasetEntity.getProperties()); - properties = jObject.toMap(); + try { + properties = new ObjectMapper().readValue(datasetEntity.getProperties(), LinkedHashMap.class); + } catch (IOException e) { + logger.error(e.getLocalizedMessage(), e); + } + /*JSONObject jObject = new JSONObject(datasetEntity.getProperties()); + properties = jObject.toMap();*/ } // Custom style for the Dataset title. diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index d3104b350..b295a54b5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -155,28 +155,33 @@ public class DatasetManager { datasetCriteria.setSize(datasetTableRequest.getLength()); List datasets; try { + long start = System.currentTimeMillis(); datasets = datasetRepository.exists() ? datasetRepository.queryIds(datasetCriteria) : null; + long end = System.currentTimeMillis(); + logger.info("Elastic took " + (end - start)/ 1000f + "s"); } catch (Exception ex) { logger.warn(ex.getMessage(), ex); datasets = null; } + long start = System.currentTimeMillis(); UserInfo userInfo = builderFactory.getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); // QueryableList items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); QueryableList items; if (datasets != null) { if (!datasets.isEmpty()) { - items = databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)); - List finalDatasets = datasets; - items.where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); + //items = databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + final List datasetIds = datasets.stream().map(datasetE -> UUID.fromString(datasetE.getId())).distinct().collect(Collectors.toList()); + items = databaseRepository.getDatasetDao().filterFromElastic(datasetTableRequest.getCriteria(), datasetIds).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id")); + //items.where((builder, root) -> root.get("id").in(datasetIds)); } else { - items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id")); //items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()})); } } else { - items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class));//.withFields(Collections.singletonList("id")); } List roles = new LinkedList<>(); QueryableList pagedItems; @@ -187,9 +192,6 @@ public class DatasetManager { } if (datasetTableRequest.getCriteria().getRole() != null) { roles.add(datasetTableRequest.getCriteria().getRole()); - } else { - roles.add(UserDMP.UserDMPRoles.USER.getValue()); - roles.add(UserDMP.UserDMPRoles.OWNER.getValue()); } authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo, roles); pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); @@ -209,10 +211,26 @@ public class DatasetManager { DataTableData dataTable = new DataTableData<>(); - dataTable.setData(pagedItems.select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); + + /* long countStart = System.currentTimeMillis(); + List pagedIds = pagedItems.toList().stream().map(Dataset::getId).collect(Collectors.toList()); + long countEnd = System.currentTimeMillis(); + + logger.info("Paged Ids took " + (countEnd - countStart)/ 1000f + "s");*/ dataTable.setTotalCount(authItems.count()); + // items = databaseRepository.getDatasetDao().asQueryable().where((builder, root) -> root.get("id").in(pagedIds)).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + // PaginationManager.applyOrder(items, datasetTableRequest); + long dataStart = System.currentTimeMillis(); + dataTable.setData(pagedItems.select(this::mapModel).stream().filter(Objects::nonNull).collect(Collectors.toList())); + + long dataEnd = System.currentTimeMillis(); + + logger.info("Data retrieval took " + (dataEnd - dataStart)/1000f + "s" ); + + long end = System.currentTimeMillis(); + logger.info("DB took " + (end - start)/ 1000f + "s"); //CompletableFuture.allOf(itemsFuture, countFuture).join(); return dataTable; } @@ -1122,10 +1140,10 @@ public class DatasetManager { @Transactional private DatasetListingModel mapModel(Dataset item) { - if (item.getProfile() == null) - return null; + /*if (item.getProfile() == null) + return null;*/ DatasetListingModel listingModel = new DatasetListingModel().fromDataModel(item); - DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + /*DatasetProfileCriteria criteria = new DatasetProfileCriteria(); criteria.setGroupIds(Collections.singletonList(item.getProfile().getGroupId())); List profiles = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).toList(); boolean islast = false; @@ -1133,7 +1151,7 @@ public class DatasetManager { profiles = profiles.stream().sorted(Comparator.comparing(DatasetProfile::getVersion)).collect(Collectors.toList()); islast = profiles.get(0).getId().equals(item.getProfile().getId()); } - listingModel.setProfileLatestVersion(islast); + listingModel.setProfileLatestVersion(islast);*/ return listingModel; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java index c0bb5a74f..3f4ffcb38 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DatasetListingModel.java @@ -196,14 +196,14 @@ public class DatasetListingModel implements DataModel new eu.eudat.models.data.dataset.Registry().fromDataModel(item)).collect(Collectors.toList())); - this.dataRepositories = LabelBuilder.getLabel(entity.getDatasetDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item.getDataRepository())).collect(Collectors.toList())); - this.services = LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList())); + //this.grantAbbreviation = entity.getDmp() != null ? entity.getDmp().getGrant().getAbbreviation() : ""; + // this.grantId = entity.getDmp() != null ? entity.getDmp().getGrant().getId().toString() : ""; + //this.registries = LabelBuilder.getLabel(entity.getRegistries().stream().map(item -> new eu.eudat.models.data.dataset.Registry().fromDataModel(item)).collect(Collectors.toList())); + // this.dataRepositories = LabelBuilder.getLabel(entity.getDatasetDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item.getDataRepository())).collect(Collectors.toList())); + //this.services = LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList())); if (entity.getFinalizedAt() == null && entity.getStatus() == Dataset.Status.FINALISED.getValue()) { this.finalizedAt = entity.getDmp().getFinalizedAt(); } else { From 0886424b29d73e9671f575e463ab605e174d9125 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 1 Oct 2021 12:36:43 +0300 Subject: [PATCH 077/156] Fix db creation scripts for linux --- dmp-db-scema/createDB/createdb.sh | 3 ++- dmp-db-scema/main/data-dump.sql | 2 +- dmp-db-scema/main/dmp-dump.sql | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dmp-db-scema/createDB/createdb.sh b/dmp-db-scema/createDB/createdb.sh index 747cdc5df..cf2859aa2 100644 --- a/dmp-db-scema/createDB/createdb.sh +++ b/dmp-db-scema/createDB/createdb.sh @@ -2,4 +2,5 @@ cd .. source Docker/dmp-db.env export $(cut -d= -f1 Docker/dmp-db.env) psql -d postgres -U postgres -w --set=POSTGRES_USER="$POSTGRES_USER" --set=POSTGRES_PASSWORD="$POSTGRES_PASSWORD" --set=POSTGRES_DB="$POSTGRES_DB" -f main/createDatabase.sql -./initdb.sh +PGPASSWORD=$POSTGRES_PASSWORD psql -d $POSTGRES_DB -U $POSTGRES_USER --set=POSTGRES_USER="$POSTGRES_USER" -f main/dmp-dump.sql; +PGPASSWORD=$POSTGRES_PASSWORD psql --set=ADMIN_USERNAME="$ADMIN_USERNAME" --set=ADMIN_PASSWORD="$ADMIN_PASSWORD" -d $POSTGRES_DB -U $POSTGRES_USER -f main/data-dump.sql; diff --git a/dmp-db-scema/main/data-dump.sql b/dmp-db-scema/main/data-dump.sql index a6b354637..1ddeee509 100644 --- a/dmp-db-scema/main/data-dump.sql +++ b/dmp-db-scema/main/data-dump.sql @@ -1,6 +1,6 @@ INSERT INTO public."UserInfo"(email, authorization_level, usertype, userstatus, name, created, additionalinfo) VALUES ('fake@email.org', 1, 1, 0, :'ADMIN_USERNAME', now(), '{}'); -INSERT INTO public."Credential" VALUES (uuid_generate_v4(), 0, 5, :'ADMIN_USERNAME', :'ADMIN_PASSWORD', now(), now(), (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME'), 'dmp'); +INSERT INTO public."Credential" VALUES (uuid_generate_v4(), 0, 5, :'ADMIN_USERNAME', 'fake@email.org', :'ADMIN_PASSWORD', now(), now(), (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME'), 'dmp'); INSERT INTO public."UserRole"("Role", "UserId") VALUES (2, (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME')); diff --git a/dmp-db-scema/main/dmp-dump.sql b/dmp-db-scema/main/dmp-dump.sql index 6da64c270..b340e568f 100644 --- a/dmp-db-scema/main/dmp-dump.sql +++ b/dmp-db-scema/main/dmp-dump.sql @@ -583,7 +583,7 @@ CREATE TABLE public."EmailConfirmation" ( ); -ALTER TABLE public."LoginConfirmationEmail" OWNER TO :POSTGRES_USER; +ALTER TABLE public."EmailConfirmation" OWNER TO :POSTGRES_USER; -- -- Name: Notification; Type: TABLE; Schema: public; Owner: :POSTGRES_USER @@ -1060,8 +1060,8 @@ ALTER TABLE ONLY public."Lock" -- Name: LoginConfirmationEmail LoginConfirmationEmail_pkey; Type: CONSTRAINT; Schema: public; Owner: :POSTGRES_USER -- -ALTER TABLE ONLY public."LoginConfirmationEmail" - ADD CONSTRAINT "LoginConfirmationEmail_pkey" PRIMARY KEY ("ID"); +ALTER TABLE ONLY public."EmailConfirmation" + ADD CONSTRAINT "EmailConfirmation_pkey" PRIMARY KEY ("ID"); -- From 67b10528e3bed27aa4d5bb3ffe4b544ca29c0e4b Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 1 Oct 2021 12:36:43 +0300 Subject: [PATCH 078/156] Fix db creation scripts for linux --- dmp-db-scema/createDB/createdb.sh | 3 ++- dmp-db-scema/main/data-dump.sql | 2 +- dmp-db-scema/main/dmp-dump.sql | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dmp-db-scema/createDB/createdb.sh b/dmp-db-scema/createDB/createdb.sh index 747cdc5df..cf2859aa2 100644 --- a/dmp-db-scema/createDB/createdb.sh +++ b/dmp-db-scema/createDB/createdb.sh @@ -2,4 +2,5 @@ cd .. source Docker/dmp-db.env export $(cut -d= -f1 Docker/dmp-db.env) psql -d postgres -U postgres -w --set=POSTGRES_USER="$POSTGRES_USER" --set=POSTGRES_PASSWORD="$POSTGRES_PASSWORD" --set=POSTGRES_DB="$POSTGRES_DB" -f main/createDatabase.sql -./initdb.sh +PGPASSWORD=$POSTGRES_PASSWORD psql -d $POSTGRES_DB -U $POSTGRES_USER --set=POSTGRES_USER="$POSTGRES_USER" -f main/dmp-dump.sql; +PGPASSWORD=$POSTGRES_PASSWORD psql --set=ADMIN_USERNAME="$ADMIN_USERNAME" --set=ADMIN_PASSWORD="$ADMIN_PASSWORD" -d $POSTGRES_DB -U $POSTGRES_USER -f main/data-dump.sql; diff --git a/dmp-db-scema/main/data-dump.sql b/dmp-db-scema/main/data-dump.sql index a6b354637..1ddeee509 100644 --- a/dmp-db-scema/main/data-dump.sql +++ b/dmp-db-scema/main/data-dump.sql @@ -1,6 +1,6 @@ INSERT INTO public."UserInfo"(email, authorization_level, usertype, userstatus, name, created, additionalinfo) VALUES ('fake@email.org', 1, 1, 0, :'ADMIN_USERNAME', now(), '{}'); -INSERT INTO public."Credential" VALUES (uuid_generate_v4(), 0, 5, :'ADMIN_USERNAME', :'ADMIN_PASSWORD', now(), now(), (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME'), 'dmp'); +INSERT INTO public."Credential" VALUES (uuid_generate_v4(), 0, 5, :'ADMIN_USERNAME', 'fake@email.org', :'ADMIN_PASSWORD', now(), now(), (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME'), 'dmp'); INSERT INTO public."UserRole"("Role", "UserId") VALUES (2, (SELECT public."UserInfo"."id" FROM public."UserInfo" WHERE name = :'ADMIN_USERNAME')); diff --git a/dmp-db-scema/main/dmp-dump.sql b/dmp-db-scema/main/dmp-dump.sql index 6da64c270..b340e568f 100644 --- a/dmp-db-scema/main/dmp-dump.sql +++ b/dmp-db-scema/main/dmp-dump.sql @@ -583,7 +583,7 @@ CREATE TABLE public."EmailConfirmation" ( ); -ALTER TABLE public."LoginConfirmationEmail" OWNER TO :POSTGRES_USER; +ALTER TABLE public."EmailConfirmation" OWNER TO :POSTGRES_USER; -- -- Name: Notification; Type: TABLE; Schema: public; Owner: :POSTGRES_USER @@ -1060,8 +1060,8 @@ ALTER TABLE ONLY public."Lock" -- Name: LoginConfirmationEmail LoginConfirmationEmail_pkey; Type: CONSTRAINT; Schema: public; Owner: :POSTGRES_USER -- -ALTER TABLE ONLY public."LoginConfirmationEmail" - ADD CONSTRAINT "LoginConfirmationEmail_pkey" PRIMARY KEY ("ID"); +ALTER TABLE ONLY public."EmailConfirmation" + ADD CONSTRAINT "EmailConfirmation_pkey" PRIMARY KEY ("ID"); -- From b66bde871a37aeb716519dba745d8d7bfbd5b75e Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 5 Oct 2021 12:56:20 +0300 Subject: [PATCH 079/156] Fix issue of new DMPs not showing on the user's listing with elasticsearch active (#7010) --- .../eudat/logic/managers/DataManagementPlanManager.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 5a070671b..6442a8e81 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -151,6 +151,7 @@ public class DataManagementPlanManager { } if (items == null) { items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); + } List roles = new LinkedList<>(); if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) { if (dataManagementPlanTableRequest.getCriteria().getRole() != null) @@ -159,8 +160,11 @@ public class DataManagementPlanManager { } else { authItems = items; } + if (items == null) { totalData = authItems.count(); items = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); + } else { + items = authItems; } @@ -532,6 +536,9 @@ public class DataManagementPlanManager { if (dataManagementPlan.getAssociatedUsers().size() == 0) assignUser(newDmp, user); + UUID dmpId = newDmp.getId(); + newDmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList())); + this.updateIndex(newDmp); if (setNotification) { @@ -586,6 +593,8 @@ public class DataManagementPlanManager { datasets.add(dataset); } + this.updateIndex(result); + return result; } From 54c862ecbb29b2d8e2dee2bf7d83cefc1f0ae2b4 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 5 Oct 2021 13:09:02 +0300 Subject: [PATCH 080/156] Minor metrics refactor --- .../main/java/eu/eudat/controllers/Admin.java | 5 +- .../main/java/eu/eudat/controllers/Login.java | 7 ++- .../controllers/UserGuideController.java | 3 +- .../managers/DataManagementPlanManager.java | 39 ++++++------- .../eudat/logic/managers/DatasetManager.java | 7 ++- .../logic/managers/DatasetProfileManager.java | 5 +- .../eudat/logic/managers/MetricsManager.java | 55 ++++++++++--------- .../main/java/eu/eudat/types/MetricNames.java | 21 +++++++ 8 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java index 6a89b4429..26c9cb70a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java @@ -20,6 +20,7 @@ import eu.eudat.models.data.listingmodels.UserInfoListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.MetricNames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -70,7 +71,7 @@ public class Admin extends BaseController { userDatasetProfile.setRole(0); getApiContext().getOperationsContext().getDatabaseRepository().getUserDatasetProfileDao().createOrUpdate(userDatasetProfile); datasetProfileManager.storeDatasetProfileUsers(datasetProfile, profile); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + MetricsManager.increaseValue(MetricNames.DATASET_TEMPLATE, 1, MetricNames.TOTAL); return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); } @@ -89,7 +90,7 @@ public class Admin extends BaseController { eu.eudat.data.entities.DatasetProfile datasetProfile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); datasetProfileManager.storeDatasetProfileUsers(datasetProfile, profile); if (datasetProfile.getStatus() == 1 && oldStatus == 0) { - MetricsManager.increaseValue("argos_dataset_templates", 1, "active"); + MetricsManager.increaseValue(MetricNames.DATASET_TEMPLATE, 1, MetricNames.ACTIVE); } return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java index ac75578d9..f1d773ddf 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java @@ -35,6 +35,7 @@ import eu.eudat.models.data.login.LoginInfo; import eu.eudat.models.data.principal.PrincipalModel; import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.MetricNames; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -95,7 +96,7 @@ public class Login { public @ResponseBody ResponseEntity> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException, NullEmailException { logger.info("Trying To Login With " + credentials.getProvider()); - MetricsManager.increaseValue("argos_users", 1, "loggedin"); + MetricsManager.increaseValue(MetricNames.USERS, 1, MetricNames.LOGGEDIN); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @@ -104,7 +105,7 @@ public class Login { public @ResponseBody ResponseEntity> nativelogin(@RequestBody Credentials credentials) throws NullEmailException { logger.info(credentials.getUsername() + " Trying To Login"); - MetricsManager.increaseValue("argos_users", 1, "loggedin"); + MetricsManager.increaseValue(MetricNames.USERS, 1, MetricNames.LOGGEDIN); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(userManager.authenticate(this.nonVerifiedUserAuthenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @@ -165,7 +166,7 @@ public class Login { ResponseEntity> logout(Principal principal) { this.nonVerifiedUserAuthenticationService.Logout(principal.getToken()); logger.info(principal + " Logged Out"); - MetricsManager.decreaseValue("argos_users", 1, "loggedin"); + MetricsManager.decreaseValue(MetricNames.USERS, 1, MetricNames.LOGGEDIN); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java index b7b07e474..f9b519105 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserGuideController.java @@ -6,6 +6,7 @@ import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.userguide.UserGuide; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.MetricNames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.http.HttpHeaders; @@ -39,7 +40,7 @@ public class UserGuideController { @RequestMapping(path = "{lang}", method = RequestMethod.GET ) public ResponseEntity getUserGuide(@PathVariable(name = "lang") String lang) throws IOException { long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - MetricsManager.calculateValue("argos_languages", (int) files, null); + MetricsManager.calculateValue(MetricNames.LANGUAGES, (int) files, null); Stream walk = Files.walk(Paths.get(this.environment.getProperty("userguide.path"))); List result = walk.filter(Files::isRegularFile) .map(Path::toString).collect(Collectors.toList()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 6442a8e81..329382b83 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -59,6 +59,7 @@ import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.models.data.userinfo.UserListingModel; import eu.eudat.queryable.QueryableList; import eu.eudat.types.Authorities; +import eu.eudat.types.MetricNames; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; @@ -445,7 +446,7 @@ public class DataManagementPlanManager { setNotification = true; } else { - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); } DMP newDmp = dataManagementPlan.toDataModel(); @@ -572,7 +573,7 @@ public class DataManagementPlanManager { if (dataManagementPlan.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue() && dmp1.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) throw new Exception("DMP is finalized, therefore cannot be edited."); } else { - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); } List datasets = new ArrayList<>(); DMP tempDMP = dataManagementPlan.toDataModel(); @@ -700,7 +701,7 @@ public class DataManagementPlanManager { newDmp.setDataset(new HashSet<>(databaseRepository.getDatasetDao().getWithCriteria(criteria1).toList())); this.updateIndex(newDmp); - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); return newDmp.getId(); } @@ -714,16 +715,16 @@ public class DataManagementPlanManager { DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); switch (oldDmp.getStatus()) { case 0: - MetricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); break; case 1: if (oldDmp.getDoi() != null) { - MetricsManager.decreaseValue("argos_managed_dmps", 1, "doied"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.DOIED); } if (oldDmp.isPublic()) { - MetricsManager.decreaseValue("argos_managed_dmps", 1, "published"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.PUBLISHED); } - MetricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.FINALIZED); break; } oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); @@ -763,7 +764,7 @@ public class DataManagementPlanManager { else { researcher.setCreationUser(user); researcherRepository.createOrUpdate(researcher); - MetricsManager.increaseValue("argos_researchers", 1, null); + MetricsManager.increaseValue(MetricNames.RESEARCHER, 1, null); } } } @@ -845,14 +846,14 @@ public class DataManagementPlanManager { project.setType(Project.ProjectType.EXTERNAL.getValue()); if (project.getId() == null) project.setId(UUID.randomUUID()); projectDao.createOrUpdate(project); - MetricsManager.increaseValue("argos_projects", 1, null); + MetricsManager.increaseValue(MetricNames.PROJECT, 1, null); } } else { project.setType(Project.ProjectType.EXTERNAL.getValue()); if (project.getId() == null) project.setId(UUID.randomUUID()); projectDao.createOrUpdate(project); - MetricsManager.increaseValue("argos_projects", 1, null); + MetricsManager.increaseValue(MetricNames.PROJECT, 1, null); } } } @@ -929,7 +930,7 @@ public class DataManagementPlanManager { return newDataset; }).thenApplyAsync(item -> { futures.add(datasetDao.createOrUpdateAsync(item).whenComplete(((dataset1, throwable) -> { - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.DRAFT); eu.eudat.elastic.entities.Dataset datasetElastic = new eu.eudat.elastic.entities.Dataset(); datasetElastic.setId(dataset1.getId().toString()); datasetElastic.setLabel(dataset1.getLabel()); @@ -988,7 +989,7 @@ public class DataManagementPlanManager { dmp.setPublic(true); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); this.updateIndex(dmp); - MetricsManager.increaseValue("argos_managed_dmps", 1, "published"); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.PUBLISHED); DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); criteria.setGroupIds(Collections.singletonList(dmp.getGroupId())); criteria.setAllVersions(true); @@ -1001,7 +1002,7 @@ public class DataManagementPlanManager { tags = elastic.getTags(); } this.datasetManager.updateTags(dataset, tags); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); + MetricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.PUBLISHED); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -1087,11 +1088,11 @@ public class DataManagementPlanManager { this.updateIndex(dmp); UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); sendNotification(dmp, user, NotificationType.DMP_FINALISED); - MetricsManager.decreaseValue("argos_managed_dmps", 1, "draft"); - MetricsManager.increaseValue("argos_managed_dmps", 1, "finalized"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.FINALIZED); this.updateDatasetsIndex(indexDatasets); - MetricsManager.decreaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "draft"); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", indexDatasets.size(), "finalized"); + MetricsManager.decreaseValue(MetricNames.DATASET, indexDatasets.size(), MetricNames.DRAFT); + MetricsManager.increaseValue(MetricNames.DATASET, indexDatasets.size(), MetricNames.FINALIZED); } public void undoFinalize(UUID id, Principal principal) throws Exception { @@ -1103,8 +1104,8 @@ public class DataManagementPlanManager { dmp.setStatus(DMP.DMPStatus.ACTIVE.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); this.updateIndex(dmp); - MetricsManager.decreaseValue("argos_managed_dmps", 1, "finalized"); - MetricsManager.increaseValue("argos_managed_dmps", 1, "draft"); + MetricsManager.decreaseValue(MetricNames.DMP, 1, MetricNames.FINALIZED); + MetricsManager.increaseValue(MetricNames.DMP, 1, MetricNames.DRAFT); } public void updateUsers(UUID id, List users, Principal principal) throws Exception { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index d3104b350..38ceea346 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -48,6 +48,7 @@ import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.queryable.QueryableList; import eu.eudat.types.Authorities; +import eu.eudat.types.MetricNames; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -619,7 +620,7 @@ public class DatasetManager { sendNotification = true; } } else { - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.DRAFT); } if (dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()) && datasetWizardModel.getId() != null) throw new Exception("DMP is finalized, therefore Dataset cannot be edited."); @@ -889,7 +890,7 @@ public class DatasetManager { if (dataset.getStatus() != eu.eudat.data.entities.Dataset.Status.FINALISED.getValue()) throw new Exception("You cannot make public a Dataset That Has not Been Finalised"); datasetDao.createOrUpdate(dataset); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "published"); + MetricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.PUBLISHED); } public ResponseEntity getDocument(String id, VisibilityRuleService visibilityRuleService, String contentType, Principal principal) throws IllegalAccessException, IOException, InstantiationException { @@ -978,7 +979,7 @@ public class DatasetManager { createServicesIfTheyDontExist(entity); createExternalDatasetsIfTheyDontExist(entity); - MetricsManager.increaseValue("argos_managed_dataset_descriptions", 1, "draft"); + MetricsManager.increaseValue(MetricNames.DATASET, 1, MetricNames.DRAFT); return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(entity); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 244287173..049aac08d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -27,6 +27,7 @@ import eu.eudat.models.data.listingmodels.UserInfoListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.queryable.QueryableList; import eu.eudat.types.Authorities; +import eu.eudat.types.MetricNames; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -92,7 +93,7 @@ public class DatasetProfileManager { DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); apiContext.getOperationsContext().getDatabaseRepository().detachEntity(profile); profile.setId(null); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + MetricsManager.increaseValue(MetricNames.DATASET_TEMPLATE, 1, MetricNames.TOTAL); return profile; } @@ -233,7 +234,7 @@ public class DatasetProfileManager { File localFile = convert(multiPartFile); eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.DatasetProfile profile = xmlBuilder.build(localFile); Files.deleteIfExists(localFile.toPath()); - MetricsManager.increaseValue("argos_dataset_templates", 1, "total"); + MetricsManager.increaseValue(MetricNames.DATASET_TEMPLATE, 1, MetricNames.TOTAL); return profile; } catch (IOException e) { logger.error(e.getMessage(), e); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 353171093..7e39b9dec 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -1,5 +1,6 @@ package eu.eudat.logic.managers; +import eu.eudat.types.MetricNames; import io.prometheus.client.Gauge; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,20 +22,20 @@ import java.util.stream.Stream; public class MetricsManager { private final static Logger logger = LoggerFactory.getLogger(MetricsManager.class); private static Map gauges = Stream.of( new Object[][]{ - {"argos_managed_dmps", Gauge.build().name("argos_managed_dmps").help("Number of managed DMPs").labelNames("status").register()}, + {MetricNames.DMP, Gauge.build().name(MetricNames.DMP).help("Number of managed DMPs").labelNames("status").register()}, - {"argos_funders", Gauge.build().name("argos_funders").help("Number of registered Funders").register()}, - {"argos_grants", Gauge.build().name("argos_grants").help("Number of registered Grants").register()}, - {"argos_projects", Gauge.build().name("argos_projects").help("Number of registered Projects").register()}, - {"argos_researchers", Gauge.build().name("argos_researchers").help("Number of Colaborators/Researchers").register()}, + {MetricNames.FUNDERS, Gauge.build().name(MetricNames.FUNDERS).help("Number of registered Funders").register()}, + {MetricNames.GRANTS, Gauge.build().name(MetricNames.GRANTS).help("Number of registered Grants").register()}, + {MetricNames.PROJECT, Gauge.build().name(MetricNames.PROJECT).help("Number of registered Projects").register()}, + {MetricNames.RESEARCHER, Gauge.build().name(MetricNames.RESEARCHER).help("Number of Colaborators/Researchers").register()}, - {"argos_managed_dataset_descriptions", Gauge.build().name("argos_managed_dataset_descriptions").help("Number of managed Dataset Descriptions").labelNames("status").register()}, + {MetricNames.DATASET, Gauge.build().name(MetricNames.DATASET).help("Number of managed Dataset Descriptions").labelNames("status").register()}, - {"argos_dataset_templates", Gauge.build().name("argos_dataset_templates").help("Number of dataset Templates").labelNames("status").register()}, + {MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates").labelNames("status").register()}, - {"argos_users", Gauge.build().name("argos_users").help("Number of users").labelNames("type").register()}, + {MetricNames.USERS, Gauge.build().name(MetricNames.USERS).help("Number of users").labelNames("type").register()}, - {"argos_languages", Gauge.build().name("argos_languages").help("Number of Languages").register()}, + {MetricNames.LANGUAGES, Gauge.build().name(MetricNames.LANGUAGES).help("Number of Languages").register()}, }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); @@ -95,30 +96,30 @@ public class MetricsManager { @Scheduled(initialDelay = 1000 * 60 * 60, fixedDelay = 1000 * 60 * 60) public void init() throws IOException { logger.info("Start calculating Metrics"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllDrafts(), "draft"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllFinalized(), "finalized"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllPublished(), "published"); - calculateValue("argos_managed_dmps", (int) dataManagementPlanManager.countAllDoied(), "doied"); + calculateValue(MetricNames.DMP, (int) dataManagementPlanManager.countAllDrafts(), MetricNames.DRAFT); + calculateValue(MetricNames.DMP, (int) dataManagementPlanManager.countAllFinalized(), MetricNames.FINALIZED); + calculateValue(MetricNames.DMP, (int) dataManagementPlanManager.countAllPublished(), MetricNames.PUBLISHED); + calculateValue(MetricNames.DMP, (int) dataManagementPlanManager.countAllDoied(), MetricNames.DOIED); - calculateValue("argos_funders", (int) dataManagementPlanManager.countAllFunders(), null); - calculateValue("argos_grants", (int) dataManagementPlanManager.countAllGrants(), null); - calculateValue("argos_projects", (int) dataManagementPlanManager.countAllProjects(), null); - calculateValue("argos_researchers", (int) dataManagementPlanManager.countAllResearchers(), null); + calculateValue(MetricNames.FUNDERS, (int) dataManagementPlanManager.countAllFunders(), null); + calculateValue(MetricNames.GRANTS, (int) dataManagementPlanManager.countAllGrants(), null); + calculateValue(MetricNames.PROJECT, (int) dataManagementPlanManager.countAllProjects(), null); + calculateValue(MetricNames.RESEARCHER, (int) dataManagementPlanManager.countAllResearchers(), null); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllDraft(), "draft"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllFinalized(), "finalized"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllPublic(), "published"); - calculateValue("argos_managed_dataset_descriptions", (int) datasetManager.countAllWithDoi(), "doied"); + calculateValue(MetricNames.DATASET, (int) datasetManager.countAllDraft(), MetricNames.DRAFT); + calculateValue(MetricNames.DATASET, (int) datasetManager.countAllFinalized(), MetricNames.FINALIZED); + calculateValue(MetricNames.DATASET, (int) datasetManager.countAllPublic(), MetricNames.PUBLISHED); + calculateValue(MetricNames.DATASET, (int) datasetManager.countAllWithDoi(), MetricNames.DOIED); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAlldraft(), "draft"); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAllFinalized(), "active"); - calculateValue("argos_dataset_templates", (int) datasetProfileManager.countAllUsed(), "used"); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) datasetProfileManager.countAlldraft(), MetricNames.DRAFT); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) datasetProfileManager.countAllFinalized(), MetricNames.ACTIVE); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) datasetProfileManager.countAllUsed(), MetricNames.USED); - calculateValue("argos_users", (int) userManager.countActiveUsers().intValue(), "loggedin"); - calculateValue("argos_users", (int) userManager.countAllUsers().intValue(), "total"); + calculateValue(MetricNames.USERS, (int) userManager.countActiveUsers().intValue(), MetricNames.LOGGEDIN); + calculateValue(MetricNames.USERS, (int) userManager.countAllUsers().intValue(), MetricNames.TOTAL); long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - calculateValue("argos_languages", (int) files, null); + calculateValue(MetricNames.LANGUAGES, (int) files, null); logger.info("Metrics calculation Completed"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java new file mode 100644 index 000000000..5e55d702d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java @@ -0,0 +1,21 @@ +package eu.eudat.types; + +public class MetricNames { + public static final String DATASET_TEMPLATE = "argos_dataset_templates"; + public static final String USERS = "argos_users"; + public static final String DMP = "argos_managed_dmps"; + public static final String DATASET = "argos_managed_dataset_descriptions"; + public static final String RESEARCHER = "argos_researchers"; + public static final String PROJECT = "argos_projects"; + public static final String FUNDERS = "argos_funders"; + public static final String GRANTS = "argos_grants"; + public static final String LANGUAGES = "argos_languages"; + public static final String DRAFT = "draft"; + public static final String FINALIZED = "finalized"; + public static final String PUBLISHED = "published"; + public static final String DOIED = "doied"; + public static final String ACTIVE = "active"; + public static final String USED = "used"; + public static final String LOGGEDIN = "loggedin"; + public static final String TOTAL = "total"; +} From 3ec942cfa700c117a5b1102f8628c73ba0d72cae Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 5 Oct 2021 17:58:46 +0300 Subject: [PATCH 081/156] Add support for Html text when exporting to docx (alpha) --- .../managers/DataManagementPlanManager.java | 4 +- .../documents/types/ParagraphStyle.java | 4 +- .../utilities/documents/word/WordBuilder.java | 22 ++++++- .../documents/word/XWPFHtmlDocument.java | 63 +++++++++++++++++++ .../documents/word/XWPFHtmlRelation.java | 11 ++++ 5 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlDocument.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlRelation.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 329382b83..db10a0feb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1142,7 +1142,7 @@ public class DataManagementPlanManager { wordBuilder.addParagraphContent("Data Management Plan Information", document, ParagraphStyle.HEADER1, BigInteger.ZERO); // DMP title custom style. wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.HEADER2, BigInteger.ZERO); - wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO); wordBuilder.addParagraphContent("Funder", document, ParagraphStyle.HEADER3, BigInteger.ZERO); if (dmpEntity.getGrant().getFunder() != null) @@ -1246,7 +1246,7 @@ public class DataManagementPlanManager { }*/ - wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO); // Dataset Description custom style. XWPFParagraph datasetDescriptionParagraph = document.createParagraph(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java index ba104013d..db6e0e207 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java @@ -4,7 +4,7 @@ package eu.eudat.logic.utilities.documents.types; * Created by ikalyvas on 2/26/2018. */ public enum ParagraphStyle { - TEXT(0), HEADER1(1), HEADER2(2), HEADER3(3), HEADER4(4), TITLE(5), FOOTER(6), COMMENT(7), HEADER5(8), HEADER6(9); + TEXT(0), HEADER1(1), HEADER2(2), HEADER3(3), HEADER4(4), TITLE(5), FOOTER(6), COMMENT(7), HEADER5(8), HEADER6(9), HTML(10); private Integer value; @@ -38,6 +38,8 @@ public enum ParagraphStyle { return HEADER5; case 9: return HEADER6; + case 10: + return HTML; default: throw new RuntimeException("Unsupported ParagraphStyle Code"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index e14dc5efa..82d71f9ff 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -13,6 +13,7 @@ import eu.eudat.models.data.user.components.datasetprofile.FieldSet; import eu.eudat.models.data.user.components.datasetprofile.Section; import eu.eudat.models.data.user.composite.DatasetProfilePage; import eu.eudat.models.data.user.composite.PagedDatasetProfile; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber; @@ -48,6 +49,19 @@ public class WordBuilder { run.setFontSize(11); return paragraph; }); + this.options.put(ParagraphStyle.HTML, (mainDocumentPart, item) -> { + try { + XWPFHtmlDocument xwpfHtmlDocument = XWPFHtmlDocument.addHtmlDocument(mainDocumentPart); + if (item != null) { + xwpfHtmlDocument.setHtml(item); + } + mainDocumentPart.getDocument().getBody().addNewAltChunk().setId(xwpfHtmlDocument.getId()); + } catch (InvalidFormatException e) { + logger.error(e.getLocalizedMessage(), e); + } + + return null; + }); this.options.put(ParagraphStyle.TITLE, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); paragraph.setStyle("Title"); @@ -223,10 +237,12 @@ public class WordBuilder { public XWPFParagraph addParagraphContent(String text, XWPFDocument mainDocumentPart, ParagraphStyle style, BigInteger numId) { if (text != null && !text.isEmpty()) { XWPFParagraph paragraph = this.options.get(style).apply(mainDocumentPart, text); - if (numId != null) { - paragraph.setNumID(numId); + if (paragraph != null) { + if (numId != null) { + paragraph.setNumID(numId); + } + return paragraph; } - return paragraph; } return null; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlDocument.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlDocument.java new file mode 100644 index 000000000..526813e10 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlDocument.java @@ -0,0 +1,63 @@ +package eu.eudat.logic.utilities.documents.word; + +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.apache.poi.openxml4j.opc.OPCPackage; +import org.apache.poi.openxml4j.opc.PackagePart; +import org.apache.poi.openxml4j.opc.PackagePartName; +import org.apache.poi.openxml4j.opc.PackagingURIHelper; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.UUID; + +public class XWPFHtmlDocument extends POIXMLDocumentPart { + + private String html; + private String id; + + public XWPFHtmlDocument(PackagePart pkg, String id) { + super(pkg); + this.html = "HTML import

    "; + this.id = id; + } + + public String getHtml() { + return html; + } + + public void setHtml(String html) { + this.html = this.html.replace("

    ", html); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + protected void commit() throws IOException { + PackagePart packagePart = getPackagePart(); + OutputStream outputStream = packagePart.getOutputStream(); + Writer writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(html); + writer.close(); + outputStream.close(); + } + + public static XWPFHtmlDocument addHtmlDocument(XWPFDocument document) throws InvalidFormatException { + OPCPackage oPCPackage = document.getPackage(); + String id = UUID.randomUUID().toString(); + PackagePartName partName = PackagingURIHelper.createPartName("/word/" + id + ".html"); + PackagePart part = oPCPackage.createPart(partName, "text/html"); + XWPFHtmlDocument xWPFHtmlDocument = new XWPFHtmlDocument(part, id); + document.addRelation(xWPFHtmlDocument.getId(), new XWPFHtmlRelation(), xWPFHtmlDocument); + return xWPFHtmlDocument; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlRelation.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlRelation.java new file mode 100644 index 000000000..669dc47c9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/XWPFHtmlRelation.java @@ -0,0 +1,11 @@ +package eu.eudat.logic.utilities.documents.word; + +import org.apache.poi.ooxml.POIXMLRelation; + +public class XWPFHtmlRelation extends POIXMLRelation { + public XWPFHtmlRelation() { + super("text/html", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk", + "/word/htmlDoc#.html"); + } +} From 907ad142695d641110c7c1cfb6417182a77c2128 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 6 Oct 2021 12:25:44 +0300 Subject: [PATCH 082/156] #7028 Text area fields minRows defaults to 3 --- .../components/form-field/form-field.component.html | 4 ++-- .../components/form-section/form-section.component.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.html index e574948cc..8b9593738 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-field/form-field.component.html @@ -98,11 +98,11 @@
    - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html index b9926dd1c..2ef2eacbe 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html @@ -32,7 +32,7 @@
    -
    @@ -97,7 +97,7 @@
    -
    From 407961e137f702b6c9033cfc2d4db7e9de7d28d5 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 6 Oct 2021 14:21:54 +0300 Subject: [PATCH 083/156] Fix critical issue with DMP queries without elastic --- .../java/eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index db10a0feb..27af3fdd8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -161,7 +161,7 @@ public class DataManagementPlanManager { } else { authItems = items; } - if (items == null) { + if (dmps == null) { totalData = authItems.count(); items = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); } else { From ef5e6a92e08b0cf0c93e3ea098218493f183661d Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 6 Oct 2021 15:02:21 +0300 Subject: [PATCH 084/156] Fix critical issue with Dataset Template xml import --- .../datasetProfileModel/DatasetProfile.java | 4 +++- .../datasetProfileXml/datasetProfileModel/Page.java | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java index cec5df6f1..2ae1a2d34 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java @@ -52,7 +52,9 @@ public class DatasetProfile { List sectionDatasetEntity = new LinkedList<>(); for (Page xmlPage: page) { pagesDatasetEntity.add(xmlPage.toAdminCompositeModelPage()); - sectionDatasetEntity.add(xmlPage.toAdminCompositeModelSection()); + for (int i = 0; i < xmlPage.getSections().size(); i++) { + sectionDatasetEntity.add(xmlPage.toAdminCompositeModelSection(i)); + } } newDatasetEntityProfile.setPages(pagesDatasetEntity); newDatasetEntityProfile.setSections(sectionDatasetEntity); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java index b30f82d29..5ef139834 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java @@ -3,13 +3,14 @@ package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileM import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; @XmlRootElement(name = "page") public class Page { private String id; private int ordinal; private String title; - private Sections sections; + private List sections; @XmlAttribute(name = "id") public String getId() { @@ -39,11 +40,11 @@ public class Page { } @XmlElement(name = "sections") - public Sections getSections() { + public List getSections() { return sections; } - public void setSections(Sections sections) { + public void setSections(List sections) { this.sections = sections; } @@ -55,7 +56,7 @@ public class Page { return pageEntity; } - public eu.eudat.models.data.admin.components.datasetprofile.Section toAdminCompositeModelSection(){ + public eu.eudat.models.data.admin.components.datasetprofile.Section toAdminCompositeModelSection(int i){ /* eu.eudat.models.data.admin.components.datasetprofile.Section sectionEntity =new eu.eudat.models.data.admin.components.datasetprofile.Section(); // List sectionsListEntity = new LinkedList<>(); // for (Section xmlsection:this.sections.section) { @@ -68,6 +69,6 @@ public class Page { sectionEntity.setId(this.id); sectionEntity.setOrdinal(this.ordinal); sectionEntity.setTitle(this.title);*/ - return sections.toAdminCompositeModelSection(); + return sections.get(i).toAdminCompositeModelSection(); } } From cb1d7b53409cc4dfa3c72a98e8ce217c1c56392c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 6 Oct 2021 15:15:41 +0300 Subject: [PATCH 085/156] Replace altChunk html to docx with direct parsing (manual) --- dmp-backend/pom.xml | 6 + .../documents/word/HtmlToWorldBuilder.java | 109 ++++++++++++++++++ .../utilities/documents/word/WordBuilder.java | 12 +- 3 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 254577ace..2fd661beb 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -186,6 +186,12 @@ fop 2.3 + + + org.jsoup + jsoup + 1.14.3 + fr.opensagres.xdocreport diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java new file mode 100644 index 000000000..029d706e1 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java @@ -0,0 +1,109 @@ +package eu.eudat.logic.utilities.documents.word; + +import org.apache.poi.xwpf.usermodel.*; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.nodes.TextNode; +import org.jsoup.select.Elements; +import org.jsoup.select.NodeTraversor; +import org.jsoup.select.NodeVisitor; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHighlightColor; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class HtmlToWorldBuilder implements NodeVisitor { + + private final Map properties = new LinkedHashMap<>(); + private final XWPFParagraph paragraph; + private XWPFRun run; + private Boolean dumpRun; + private final String identation; + private Boolean isIdentationUsed; + + public static void convert(XWPFDocument document, Document htmlDocument, String identation) { + Elements htmlParagraphs = htmlDocument.select("p"); + if (!htmlParagraphs.isEmpty()) { + for (Element htmlParagraph : htmlParagraphs) { + XWPFParagraph paragraph = document.createParagraph(); + HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); + NodeTraversor.traverse(htmlToWorldBuilder, htmlParagraph); + } + } else { + XWPFParagraph paragraph = document.createParagraph(); + HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); + NodeTraversor.traverse(htmlToWorldBuilder, htmlDocument); + } + } + + public HtmlToWorldBuilder(XWPFParagraph paragraph, String identation) { + this.paragraph = paragraph; + this.run = this.paragraph.createRun(); + this.dumpRun = false; + this.identation = identation; + this.isIdentationUsed = false; + this.run.setFontSize(11); + } + + @Override + public void head(Node node, int i) { + String name = node.nodeName(); + if (name.equals("#text")) { + String text = !isIdentationUsed ? identation + ((TextNode)node).text() : ((TextNode)node).text(); + this.run.setText(text); + this.isIdentationUsed = true; + this.dumpRun = true; + } else { + properties.put(name, true); + } + if (dumpRun) { + this.run = this.paragraph.createRun(); + this.run.setFontSize(11); + this.dumpRun = false; + } + parseProperties(); + + } + + private void parseProperties() { + properties.entrySet().forEach(stringBooleanEntry -> { + switch (stringBooleanEntry.getKey()) { + case "i" : + case "em": + this.run.setItalic(stringBooleanEntry.getValue()); + break; + case "b": + case "strong": + this.run.setBold(stringBooleanEntry.getValue()); + break; + case "u": + case "ins": + this.run.setUnderline(stringBooleanEntry.getValue() ? UnderlinePatterns.SINGLE : UnderlinePatterns.NONE); + break; + case "small": + this.run.setFontSize(stringBooleanEntry.getValue() ? 8 : 11); + break; + case "del": + this.run.setStrikeThrough(stringBooleanEntry.getValue()); + break; + case "mark": + this.run.setTextHighlightColor(stringBooleanEntry.getValue() ? STHighlightColor.YELLOW.toString() : STHighlightColor.NONE.toString()); + break; + case "sub": + this.run.setSubscript(stringBooleanEntry.getValue() ? VerticalAlign.SUBSCRIPT : VerticalAlign.BASELINE); + break; + case "sup": + this.run.setSubscript(stringBooleanEntry.getValue() ? VerticalAlign.SUPERSCRIPT : VerticalAlign.BASELINE); + break; + } + }); + } + + @Override + public void tail(Node node, int i) { + String name = node.nodeName(); + properties.put(name, false); + parseProperties(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 82d71f9ff..abd14e990 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -13,8 +13,9 @@ import eu.eudat.models.data.user.components.datasetprofile.FieldSet; import eu.eudat.models.data.user.components.datasetprofile.Section; import eu.eudat.models.data.user.composite.DatasetProfilePage; import eu.eudat.models.data.user.composite.PagedDatasetProfile; -import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl; @@ -50,7 +51,7 @@ public class WordBuilder { return paragraph; }); this.options.put(ParagraphStyle.HTML, (mainDocumentPart, item) -> { - try { + /*try { XWPFHtmlDocument xwpfHtmlDocument = XWPFHtmlDocument.addHtmlDocument(mainDocumentPart); if (item != null) { xwpfHtmlDocument.setHtml(item); @@ -60,7 +61,12 @@ public class WordBuilder { logger.error(e.getLocalizedMessage(), e); } - return null; + return null;*/ + XWPFParagraph paragraph = null; + Document htmlDoc = Jsoup.parse(item); + HtmlToWorldBuilder.convert(mainDocumentPart, htmlDoc, " "); + + return paragraph; }); this.options.put(ParagraphStyle.TITLE, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); From 74ec2126f0f309432e9d9f5270ae35df90466ef7 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 6 Oct 2021 16:32:06 +0300 Subject: [PATCH 086/156] Visibility Rules fix * Reduce sourceValue visibility value based on logic. --- .../visibility-rules/visibility-rules.service.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service.ts index ea4f32950..96859fffb 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service.ts @@ -69,12 +69,13 @@ export class VisibilityRulesService { } else { const visibilityDependencySource = visibilityRule.sourceVisibilityRules.filter(x => x.sourceControlId === sourceId); - visibilityDependencySource.forEach(x => { + const shouldBeVisible = visibilityDependencySource.reduce((isVisible, x) => { const shouldBeHidden = value !== null && (this.parseValue(value) !== this.parseValue(x.sourceControlValue)); + return this.VISIBILITY_RULE_LOGIC === 'OR'? (isVisible || !shouldBeHidden) : (isVisible && !shouldBeHidden); // if(value !== null && ) - visibilityMap.set(sourceId, !shouldBeHidden); - }); + }, this.VISIBILITY_RULE_LOGIC === 'AND'); + visibilityMap.set(sourceId, shouldBeVisible); } From 524cededb631ddf91663ced8db1212a819abc0b5 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 6 Oct 2021 18:16:39 +0300 Subject: [PATCH 087/156] Fix issue when exporting to docx/pdf --- .../managers/DataManagementPlanManager.java | 10 +++++-- .../forms/VisibilityRuleServiceImpl.java | 26 ++++++++++++++----- .../utilities/documents/word/WordBuilder.java | 12 +++++---- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 27af3fdd8..10f9cdb4d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1181,8 +1181,14 @@ public class DataManagementPlanManager { .forEach(datasetEntity -> { Map properties = new HashMap<>(); if (datasetEntity.getProperties() != null) { - JSONObject jObject = new JSONObject(datasetEntity.getProperties()); - properties = jObject.toMap(); + ObjectMapper objectMapper = new ObjectMapper(); + try { + properties = objectMapper.readValue(datasetEntity.getProperties(), LinkedHashMap.class); + } catch (IOException e) { + logger.error(e.getLocalizedMessage(), e); + } + /*JSONObject jObject = new JSONObject(datasetEntity.getProperties()); + properties = jObject.toMap();*/ } // Custom style for the Dataset title. diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java index dbd00ed5b..d46e138de 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/forms/VisibilityRuleServiceImpl.java @@ -3,9 +3,7 @@ package eu.eudat.logic.services.forms; import eu.eudat.models.data.user.components.commons.Rule; import org.springframework.stereotype.Service; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Created by ikalyvas on 3/5/2018. @@ -23,6 +21,15 @@ public class VisibilityRuleServiceImpl implements VisibilityRuleService { public void setProperties(Map properties) { this.properties = properties; + this.properties.entrySet().stream() + .filter(stringObjectEntry -> stringObjectEntry.getValue() instanceof String && ((String) stringObjectEntry.getValue()).startsWith("[") && ((String) stringObjectEntry.getValue()).endsWith("]")).forEach(stringObjectEntry -> { + stringObjectEntry.setValue(parseArray((String) stringObjectEntry.getValue())); + }); + } + + private List parseArray(String original) { + String parsed = original.replace("[", "").replace("\"", "").replace("]", ""); + return Arrays.asList(parsed.split(",")); } public void buildVisibilityContext(List sources) { @@ -34,12 +41,19 @@ public class VisibilityRuleServiceImpl implements VisibilityRuleService { private void evaluateVisibility(VisibilityRule rule) { List sources = rule.getVisibilityRuleSources(); for(int i = 0; i < sources.size(); i++){ - if (!properties.containsKey(sources.get(i).getVisibilityRuleSourceId()) || !properties.get(sources.get(i).getVisibilityRuleSourceId()).equals(sources.get(i).getVisibilityRuleSourceValue())) { + if (properties.containsKey(sources.get(i).getVisibilityRuleSourceId()) && (isContained(properties.get(sources.get(i).getVisibilityRuleSourceId()), sources.get(i).getVisibilityRuleSourceValue()) || properties.get(sources.get(i).getVisibilityRuleSourceId()).equals(sources.get(i).getVisibilityRuleSourceValue()))) { + this.elementVisibility.put(rule.getVisibilityRuleTargetId(), true); + }else{ this.elementVisibility.put(rule.getVisibilityRuleTargetId(), false); return; - }else{ - this.elementVisibility.put(rule.getVisibilityRuleTargetId(), true); } } } + + private Boolean isContained(Object values, String source) { + if (values instanceof List) { + return ((Collection) values).contains(source); + } + return false; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index abd14e990..b5e6816e0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -225,11 +225,13 @@ public class WordBuilder { if (visibilityRuleService.isElementVisible(field.getId())) { if (!createListing) { try { - XWPFParagraph paragraph = addParagraphContent(this.formatter(field), mainDocumentPart, ParagraphStyle.TEXT, numId); - if (paragraph != null) { - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); - hasValue = true; + if (field.getValue() != null && !field.getValue().toString().isEmpty()) { + XWPFParagraph paragraph = addParagraphContent(this.formatter(field), mainDocumentPart, ParagraphStyle.TEXT, numId); + if (paragraph != null) { + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + hasValue = true; + } } } catch (IOException e) { logger.error(e.getMessage(), e); From 9919886c267c8af2a23a54d156f2cae484509f0c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 8 Oct 2021 11:02:56 +0300 Subject: [PATCH 088/156] Fix issues with dataset sorting on Dashboard with Elasticsearch --- .../logic/managers/DashBoardManager.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 9b5e25f68..a8b155744 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -11,6 +11,7 @@ import eu.eudat.data.dao.entities.OrganisationDao; import eu.eudat.data.entities.*; import eu.eudat.data.query.PaginationService; import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; +import eu.eudat.elastic.criteria.SortCriteria; import eu.eudat.elastic.entities.Dmp; import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; import eu.eudat.logic.mapper.elastic.criteria.DmpCriteriaMapper; @@ -40,6 +41,7 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; @Component @@ -243,6 +245,10 @@ public class DashBoardManager { datasetElasticCriteria.setCollaborators(Collections.singletonList(principal.getId())); } datasetElasticCriteria.setSortCriteria(DmpCriteriaMapper.toElasticSorting(tableRequest.getOrderings())); + datasetElasticCriteria.getSortCriteria().stream().filter(sortCriteria -> sortCriteria.getFieldName().equals("publishedAt")).forEach(sortCriteria -> { + sortCriteria.setFieldName("dmp:" + sortCriteria.getFieldName()); + sortCriteria.setColumnType(SortCriteria.ColumnType.JOIN_COLUMN); + }); datasets = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().queryIds(datasetElasticCriteria); }catch (Exception e) { logger.warn(e.getMessage(), e); @@ -283,14 +289,16 @@ public class DashBoardManager { datasetList = datasetRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); } else { datasetList = datasetRepository.getWithCriteria(datasetCriteria); - for (int i = 0; i< tableRequest.getOrderings().getFields().size(); i++) { - if (tableRequest.getOrderings().getFields().get(i).contains("publishedAt")) { - String newField = tableRequest.getOrderings().getFields().get(i).toCharArray()[0] + "dmp:publishedAt|join|"; - tableRequest.getOrderings().getFields().set(i, newField); - } - } - } + IntStream.range(0, tableRequest.getOrderings().getFields().size()).filter(i -> tableRequest.getOrderings().getFields().get(i).contains("publishedAt")) + .forEach(i -> tableRequest.getOrderings().getFields().set(i, tableRequest.getOrderings().getFields().get(i).toCharArray()[0] + "dmp:publishedAt|join|")); + // tableRequest.getOrderings().getFields().stream().filter(s -> s.contains("publishedAt")).forEach(s -> s = s.toCharArray()[0] + "dmp:publishedAt|join|" ); + /*for (int i = 0; i< tableRequest.getOrderings().getFields().size(); i++) { + if (tableRequest.getOrderings().getFields().get(i).contains("publishedAt")) { + String newField = tableRequest.getOrderings().getFields().get(i).toCharArray()[0] + "dmp:publishedAt|join|"; + tableRequest.getOrderings().getFields().set(i, newField); + } + }*/ /*if (tableRequest.getOrderings().getFields().get(0).contains("publishedAt")) { tableRequest.getOrderings().getFields().set(0, tableRequest.getOrderings().getFields().get(0).charAt(0) + "dmp:" + tableRequest.getOrderings().getFields().get(0).substring(1) + "|join|"); }*/ From 1d48ee81b95532be40afa450f11f1b0332e6e8e2 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 8 Oct 2021 11:18:22 +0300 Subject: [PATCH 089/156] Add additional null check for Elastic's Dmp Repository --- .../main/java/eu/eudat/elastic/repository/DmpRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java index 4acfea5f6..4d2a9cc90 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DmpRepository.java @@ -174,7 +174,7 @@ public class DmpRepository extends ElasticRepository { } if (criteria.getCollaborators() != null && criteria.getCollaborators().size() > 0) { - boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().map(UUID::toString).collect(Collectors.toList()))); + boolQuery = boolQuery.should(QueryBuilders.termsQuery(Dmp.MapKey.COLLABORATORS.getName() + ".id.keyword", criteria.getCollaborators().stream().filter(Objects::nonNull).map(UUID::toString).collect(Collectors.toList()))); } if (!criteria.isAllowAllVersions()) { From 0e97e6c0a8d9ab55c037db2ec11c64608549a765 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 8 Oct 2021 12:14:09 +0300 Subject: [PATCH 090/156] Fix issues with external sources --- .../java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java | 6 +++--- .../web/src/main/resources/externalUrls/ExternalUrls.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 7b1bb2ac9..a5a4c293d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -528,14 +528,14 @@ public class RemoteFetcher { private void mapToMap(String key, Map source, Map destination, boolean isTitle) { if (source != null) { String content = source.get("content"); - if (isTitle) { + /*if (isTitle) { String classId = source.get("classid"); if (classId.equals("main title")) { destination.put(key, content); } - } else { + } else {*/ destination.put(key, content); - } +// } } } } diff --git a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml index 74f4f8726..4bb95d5c9 100644 --- a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml +++ b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml @@ -806,7 +806,7 @@ External https://api.ror.org/organizations?query={like}&page={page} 1 - application/vnd.api+json; charset=utf-8 + application/json; charset=utf-8 $['items'][*] From 7fe84d7de56b7a1b755153b58e2469ce5d53ef27 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 8 Oct 2021 16:52:01 +0300 Subject: [PATCH 091/156] Eliminate Duplicate user when making a new version --- .../java/eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 2c7eb2fa5..0c839f545 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -647,7 +647,7 @@ public class DataManagementPlanManager { newDmp.setId(tempDmp.getId()); // Assign creator. - assignUser(newDmp, user); + //assignUser(newDmp, user); copyDatasets(newDmp, databaseRepository.getDatasetDao()); From 29919f981ac86fa6c57cd12e9d7ac7cfb1a2a461 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 12 Oct 2021 15:41:20 +0300 Subject: [PATCH 092/156] Fix issue with recent activity sorting --- .../logic/managers/DashBoardManager.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index a8b155744..739a5f80d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -38,6 +38,7 @@ import org.springframework.stereotype.Component; import javax.transaction.Transactional; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -338,7 +339,7 @@ public class DashBoardManager { }/*);*/ //GK: Shuffle the deck otherwise we will summon the DMPodia when sorting with status - int pos = -1; + /*int pos = -1; for (int i = (recentActivityModels.size() / 2); i < recentActivityModels.size(); i++) { RecentActivityModel recentActivityModel = recentActivityModels.remove(i); while (pos < recentActivityModels.size()) { @@ -348,7 +349,21 @@ public class DashBoardManager { } } recentActivityModels.add(pos, recentActivityModel); - } + }*/ + //GK: No one likes to play shuffle with the recent activities. So just re-sort them based on how they have been sorted already + + recentActivityModels = recentActivityModels.stream().sorted((o1, o2) -> { + try { + String order = tableRequest.getOrderings().getFields().get(0).toCharArray()[0] + ""; + String field = tableRequest.getOrderings().getFields().get(0).substring(1); + field = field.equals("label") ? "title" : field; + field = field.substring(0, 1).toUpperCase() + field.substring(1); + return (order.equals("+") ? 1 : -1 ) * ((Comparable)o1.getClass().getMethod("get" + field).invoke(o1)).compareTo(o2.getClass().getMethod("get" + field).invoke(o2)); + } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + logger.error(e.getLocalizedMessage(), e); + } + return 0; + }).collect(Collectors.toList()); //CompletableFuture.allOf(future).join(); // CompletableFuture.allOf(dmps, datasets).join(); From 6de12fd0e8c9136078bc0185ab93b932040776da Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 12 Oct 2021 18:05:38 +0300 Subject: [PATCH 093/156] Fix issue with RDA Common Standards --- ...ataset-profile-editor-field.component.html | 26 ++-- .../dataset-profile-editor-field.component.ts | 139 +++++++++--------- 2 files changed, 82 insertions(+), 83 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html index 610d39d31..63a60bf65 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html @@ -18,7 +18,7 @@
    - +
    - + DatePicker icon {{enumUtils.toDatasetProfileViewTypeString(viewTypeEnum.DatePicker)}} @@ -167,7 +167,7 @@ {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + @@ -187,7 +187,7 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.RDA-COMMON-STANDARDS' | translate}} -- - + {{property}} @@ -253,28 +253,28 @@
    {{'DATASET-PROFILE-EDITOR.ACTIONS.FIELD.PREVIEW' | translate}}
    --> - -
    {{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION' | translate}}
    {{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION-HINT' | translate}}
    - - - - +
    +
    + +
    +
    - -
    {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-DESCRIPTION-HINT'| translate}}
    - - - {{'GENERAL.VALIDATION.REQUIRED' - | translate}} - - +
    +
    + +
    +
    + + {{'GENERAL.VALIDATION.REQUIRED'| translate}} + +
    +
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index 43310bd90..e5fb0b33b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -45,6 +45,7 @@ import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profil import { UserService } from '@app/core/services/user/user.service'; import { MatInput } from '@angular/material/input'; import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; +import {AngularEditorConfig} from "@kolkov/angular-editor"; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -57,6 +58,40 @@ const skipDisable: any[] = require('../../../../../assets/resources/skipDisable. providers:[VisibilityRulesService] }) export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent implements OnInit { + editorConfig: AngularEditorConfig = { + editable: true, + spellcheck: true, + height: 'auto', + minHeight: '0', + maxHeight: 'auto', + width: '100%', + minWidth: '0', + translate: 'yes', + enableToolbar: true, + showToolbar: true, + placeholder: 'Enter text here...', + defaultParagraphSeparator: '', + defaultFontName: '', + defaultFontSize: '', + sanitize: true, + toolbarPosition: 'top', + toolbarHiddenButtons: [ + [ + 'heading', + 'fontName' + ], + [ + 'fontSize', + 'backgroundColor', + 'customClasses', + 'insertImage', + 'insertVideo', + 'removeFormat', + 'toggleEditorMode' + ] + ] + }; + canDeactivate(): boolean { return !this.form.dirty; } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.html index fe07ba1df..45f9e968c 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.html @@ -34,7 +34,7 @@ {{'DATASET-PROFILE-LISTING.COLUMNS.DESCRIPTION' | translate}} - {{row.description}} + diff --git a/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.html b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.html index 9c670a435..81bd11179 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.html @@ -1,8 +1,12 @@

    {{ 'DMP-EDITOR.DATASET-TEMPLATE-LIST.TITLE' | translate }}

    - - {{profile.label}} + +
    + {{profile.label}} +
    + +

    diff --git a/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.scss b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.scss new file mode 100644 index 000000000..34a1934de --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.scss @@ -0,0 +1,7 @@ +.list-option { + flex-grow: 1; + white-space: nowrap; + width: calc(100% - 16px); + overflow: hidden; + text-overflow: ellipsis; +} diff --git a/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.ts b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.ts index 165d7554c..6ee413cc2 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/available-profiles/available-profiles.component.ts @@ -9,6 +9,7 @@ import { BaseComponent } from '@common/base/base.component'; import { takeUntil } from 'rxjs/operators'; @Component({ + styleUrls: ['available-profiles.component.scss'], selector: 'app-available-profiles-component', templateUrl: 'available-profiles.component.html', }) diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html index 747b63432..0d2718efb 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html @@ -12,7 +12,17 @@

    -
    {{form.get('description').value}}
    -
    - {{form.get('extendedDescription').value}} -
    +
    + +
    +
    + {{'DATASET-EDITOR.QUESTION.EXTENDED-DESCRIPTION.VIEW-MORE' | translate}} +
    +
    +
    +
    + + {{'DATASET-EDITOR.QUESTION.EXTENDED-DESCRIPTION.VIEW-LESS' | translate}} + +
    +
    diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.scss b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.scss index 3024dfe73..b6469481f 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.scss +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.scss @@ -21,3 +21,11 @@ h6 { text-transform: none; font-weight: 400; } + +.more { + text-decoration: underline; + color: #F7DD72; + cursor: pointer; + font-size: 1rem; + font-weight: 400; +} diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.ts index 4a9776b5b..797650d47 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.ts @@ -13,6 +13,8 @@ export class FormCompositeTitleComponent implements OnInit { @Input() isChild: Boolean = false; @Input() tocentry:ToCEntry; + public showExtendedDescription: boolean = false; + constructor() { } ngOnInit() { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html index 2ef2eacbe..5408c7bb4 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.html @@ -7,7 +7,7 @@ -
    {{form.get('description').value}}
    +
    @@ -135,4 +135,4 @@ - \ No newline at end of file + diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 1c7087ccf..eaf38eea3 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Finalized", "DELETED": "Deleted" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 913634fc3..06b8f42d3 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Finalized", "DELETED": "Deleted" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 0735e6090..10171573c 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Finalizado", "DELETED": "Deleted" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 46ce0e673..ad549453e 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "Προέκυψε κάποιο σφάλμα.", "MESSAGE": "Μήνυμα: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "Δείτε περισσότερα", + "VIEW-LESS": "Δείτε λιγότερα" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Οριστικοποιημένα", "DELETED": "Deleted" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 56efd16f9..88b079bbc 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "Um erro ocorreu.", "MESSAGE": "Mensangem: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1818,4 +1824,4 @@ "Index: 0, Size: 0" : "Ficheiro a importar deverá ser em formato .json", "Field value of": "O campo", "must be filled": "deve ser preenchido" -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 850293fb0..274f54910 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Dokončené", "DELETED": "Deleted" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 59f2a2c93..f4f28155c 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 6107aec1c..941b6a297 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1246,6 +1246,12 @@ "ERRORS":{ "ERROR-OCCURED": "An error occured.", "MESSAGE": "Message: " + }, + "QUESTION": { + "EXTENDED-DESCRIPTION": { + "VIEW-MORE": "View more", + "VIEW-LESS": "View less" + } } }, "DATASET-CREATE-WIZARD": { @@ -1810,4 +1816,4 @@ "FINALIZED": "Tamamlandı", "DELETED": "Silindi" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/styles.scss b/dmp-frontend/src/styles.scss index 6ca804bb1..b57d42eba 100644 --- a/dmp-frontend/src/styles.scss +++ b/dmp-frontend/src/styles.scss @@ -251,4 +251,48 @@ .translateY-3{ transform:translateY(3px); -} \ No newline at end of file +} + +// CSS for (@kolkov/angular-editor) +.angular-editor-textarea { + min-height: 150px !important; +} + +.form-field-subscript-wrapper { + font-size: 75%; + padding-left: 12px; + margin-top: 8px; +} + +.editor-wrapper { + border: 1px solid transparent !important; + border-radius: 5px; +} + +.angular-editor-toolbar { + margin-left: 1px; + margin-right: 1px; +} + +.angular-editor-textarea, .angular-editor-toolbar { + border: none !important; +} + +.angular-editor { + border: 1px solid #ddd !important; + border-radius: 5px; + background-color: #fff; +} + +.editor-wrapper:hover, .angular-editor:hover { + border: 1px solid #000 !important; +} + +.editor-wrapper:focus-within, .angular-editor:focus-within { + border: 1px solid #034459 !important; +} + +.required.editor-wrapper, .required .editor .angular-editor { + border: 1px solid #f44336 !important; +} +// end of CSS for (@kolkov/angular-editor) From a4fef8e4626e972de7c85434f5e0b976b1a08d57 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 12 Oct 2021 18:17:16 +0300 Subject: [PATCH 096/156] Refactor PDF conversion --- .../main/java/eu/eudat/controllers/DMPs.java | 9 ++- .../java/eu/eudat/controllers/Datasets.java | 3 +- .../managers/DataManagementPlanManager.java | 9 +-- .../eudat/logic/managers/DatasetManager.java | 68 +++---------------- .../utilities/documents/pdf/PDFUtils.java | 45 ++++++++++++ 5 files changed, 67 insertions(+), 67 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/pdf/PDFUtils.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index b01dc68c9..04bad9b77 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -20,6 +20,7 @@ import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.pdf.PDFUtils; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.datasetwizard.DatasetsToBeFinalized; import eu.eudat.models.data.dmp.DataManagementPlan; @@ -69,17 +70,15 @@ public class DMPs extends BaseController { private DynamicGrantConfiguration dynamicGrantConfiguration; private Environment environment; private DataManagementPlanManager dataManagementPlanManager; - private DatasetManager datasetManager; private ConfigLoader configLoader; @Autowired public DMPs(ApiContext apiContext, DynamicGrantConfiguration dynamicGrantConfiguration, Environment environment, - DataManagementPlanManager dataManagementPlanManager, DatasetManager datasetManager, ConfigLoader configLoader) { + DataManagementPlanManager dataManagementPlanManager, ConfigLoader configLoader) { super(apiContext); this.dynamicGrantConfiguration = dynamicGrantConfiguration; this.environment = environment; this.dataManagementPlanManager = dataManagementPlanManager; - this.datasetManager = datasetManager; this.configLoader = configLoader; } @@ -175,7 +174,7 @@ public class DMPs extends BaseController { public @ResponseBody ResponseEntity getRDAJsonDocument(@PathVariable String id, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) { try { - return this.dataManagementPlanManager.getRDAJsonDocument(id, datasetManager, principal); + return this.dataManagementPlanManager.getRDAJsonDocument(id, principal); } catch (Exception e) { return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseItem<>().message(e.getMessage()).status(ApiMessageCode.ERROR_MESSAGE)); } @@ -187,7 +186,7 @@ public class DMPs extends BaseController { @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException, InterruptedException { FileEnvelope file = this.dataManagementPlanManager.getWordDocument(id, principal, configLoader); String name = file.getFilename().substring(0, file.getFilename().length() - 5); - File pdffile = datasetManager.convertToPDF(file, environment); + File pdffile = PDFUtils.convertToPDF(file, environment); InputStream resource = new FileInputStream(pdffile); logger.info("Mime Type of " + name + " is " + new MimetypesFileTypeMap().getContentType(file.getFile())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java index 631125177..d5dbac43e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java @@ -16,6 +16,7 @@ import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.pdf.PDFUtils; import eu.eudat.models.data.dataset.DatasetOverviewModel; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.datasetwizard.DataManagentPlanListingModel; @@ -221,7 +222,7 @@ public class Datasets extends BaseController { if (fileName.endsWith(".docx")){ fileName = fileName.substring(0, fileName.length() - 5); } - File pdffile = datasetManager.convertToPDF(file, environment); + File pdffile = PDFUtils.convertToPDF(file, environment); InputStream resource = new FileInputStream(pdffile); HttpHeaders responseHeaders = new HttpHeaders(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 0c839f545..4061e0e2c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -37,6 +37,7 @@ import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.logic.services.utilities.UtilitiesService; import eu.eudat.logic.utilities.builders.XmlBuilder; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.pdf.PDFUtils; import eu.eudat.logic.utilities.documents.types.ParagraphStyle; import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; @@ -1464,7 +1465,7 @@ public class DataManagementPlanManager { return fileEnvelope; } - public ResponseEntity getRDAJsonDocument(String id, DatasetManager datasetManager, Principal principal) throws Exception { + public ResponseEntity getRDAJsonDocument(String id, Principal principal) throws Exception { eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); if (!dmp.isPublic() && dmp.getUsers().stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId())) throw new UnauthorisedException(); @@ -1694,7 +1695,7 @@ public class DataManagementPlanManager { // datasets.add(new DatasetListingModel().fromDataModel(dataset)); } - logger.info(dm.toString()); + //logger.info(dm.toString()); } return dataManagementPlans; @@ -2154,7 +2155,7 @@ public class DataManagementPlanManager { // Second step, add the file to the entry. FileEnvelope file = getWordDocument(id.toString(), principal, configLoader); String name = file.getFilename().substring(0, file.getFilename().length() - 5); - File pdfFile = datasetManager.convertToPDF(file, environment); + File pdfFile = PDFUtils.convertToPDF(file, environment); String fileName = name + ".pdf"; FileSystemResource fileSystemResource = new FileSystemResource(pdfFile); HttpEntity addFileMapRequest = new HttpEntity<>(fileSystemResource, null); @@ -2165,7 +2166,7 @@ public class DataManagementPlanManager { ResponseEntity jsonFile; try { - jsonFile = getRDAJsonDocument(id.toString(), datasetManager, principal); + jsonFile = getRDAJsonDocument(id.toString(), principal); } catch (Exception e) { throw e; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 1c8594b45..03d9d5038 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -556,54 +556,6 @@ public class DatasetManager { return fileEnvelope; } - public File convertToPDF(FileEnvelope file, Environment environment) throws IOException, InterruptedException { - LinkedMultiValueMap map = new LinkedMultiValueMap<>(); - String uuid = UUID.randomUUID().toString(); - map.add("files", new FileSystemResource(file.getFile())); - map.add("filename", uuid + ".pdf"); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - headers.add("Content-disposition", "attachment; filename=" + uuid + ".pdf"); - headers.add("Content-type", "application/pdf"); - - HttpEntity> requestEntity = new HttpEntity>( - map, headers); - - byte[] queueResult = new RestTemplate().postForObject(environment.getProperty("pdf.converter.url") + "convert/office" - , requestEntity, byte[].class); - - File resultPdf = new File(environment.getProperty("temp.temp") + uuid + ".pdf"); - FileOutputStream output = new FileOutputStream(resultPdf); - IOUtils.write(queueResult, output); - output.close(); - Files.deleteIfExists(file.getFile().toPath()); - - return resultPdf; - } - - private File extractFromZip(File file, String filename) throws IOException { - byte[] buffer = new byte[1024]; - File newFile = new File(filename); - ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); - ZipEntry zipEntry = zis.getNextEntry(); - while (zipEntry != null) { - String zippedFileName = zipEntry.getName(); - if (zippedFileName.equals("pdf")) { - - FileOutputStream fos = new FileOutputStream(newFile); - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - fos.close(); - zipEntry = zis.getNextEntry(); - } - } - zis.closeEntry(); - zis.close(); - return newFile; - } - public eu.eudat.data.entities.Dataset createOrUpdate(DatasetWizardModel datasetWizardModel, Principal principal) throws Exception { Boolean sendNotification = false; Dataset tempDataset = null; @@ -1094,15 +1046,17 @@ public class DatasetManager { if (!tagNodes.isEmpty()) { tagNodes.forEach(node -> { JsonNode value = node.get("value"); - String stringValue = value.toString().replaceAll("=", ":"); - JSONArray values = new JSONArray(stringValue); - if (values != null) { - values.iterator().forEachRemaining(element -> { - Map data = ((JSONObject) element).toMap(); - this.addTag(tags, wizardModel.getTags(), data.get("id").toString(), data.get("name").toString()); - }); - } else { - this.addTag(tags, wizardModel.getTags(), "", value.asText()); + if (!value.toString().equals("\"\"")) { + String stringValue = value.toString().replaceAll("=", ":"); + JSONArray values = new JSONArray(stringValue); + if (values != null) { + values.iterator().forEachRemaining(element -> { + Map data = ((JSONObject) element).toMap(); + this.addTag(tags, wizardModel.getTags(), data.get("id").toString(), data.get("name").toString()); + }); + } else { + this.addTag(tags, wizardModel.getTags(), "", value.asText()); + } } }); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/pdf/PDFUtils.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/pdf/PDFUtils.java new file mode 100644 index 000000000..6f842b1f3 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/pdf/PDFUtils.java @@ -0,0 +1,45 @@ +package eu.eudat.logic.utilities.documents.pdf; + +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import org.apache.commons.io.IOUtils; +import org.springframework.core.env.Environment; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.util.UUID; + +public class PDFUtils { + + public static File convertToPDF(FileEnvelope file, Environment environment) throws IOException { + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + String uuid = UUID.randomUUID().toString(); + map.add("files", new FileSystemResource(file.getFile())); + map.add("filename", uuid + ".pdf"); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.add("Content-disposition", "attachment; filename=" + uuid + ".pdf"); + headers.add("Content-type", "application/pdf"); + + HttpEntity> requestEntity = new HttpEntity>( + map, headers); + + byte[] queueResult = new RestTemplate().postForObject(environment.getProperty("pdf.converter.url") + "forms/libreoffice/convert" + , requestEntity, byte[].class); + + File resultPdf = new File(environment.getProperty("temp.temp") + uuid + ".pdf"); + FileOutputStream output = new FileOutputStream(resultPdf); + IOUtils.write(queueResult, output); + output.close(); + Files.deleteIfExists(file.getFile().toPath()); + + return resultPdf; + } +} From f9bf688085357a200ccd80d9c0b0697647321c72 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Tue, 12 Oct 2021 18:53:07 +0300 Subject: [PATCH 097/156] dataset-wizard.component.html: Added in dropdown list "Save & Continue" option (same as Save). | assets/i18n/: Added DATASET-WIZARD.ACTIONS.SAVE-AND-CONTINUE in language files. --- .../app/ui/dataset/dataset-wizard/dataset-wizard.component.html | 1 + dmp-frontend/src/assets/i18n/de.json | 1 + dmp-frontend/src/assets/i18n/en.json | 1 + dmp-frontend/src/assets/i18n/es.json | 1 + dmp-frontend/src/assets/i18n/gr.json | 1 + dmp-frontend/src/assets/i18n/pt.json | 1 + dmp-frontend/src/assets/i18n/sk.json | 1 + dmp-frontend/src/assets/i18n/sr.json | 1 + dmp-frontend/src/assets/i18n/tr.json | 1 + 9 files changed, 9 insertions(+) diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html index 923de03f4..9a0a489c8 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html @@ -40,6 +40,7 @@ + diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index eaf38eea3..3a96f16ce 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Gehe zu Datansatzbeschreibung Förderung", "GO-TO-DMP": "Gehe zu Datensatzbeschreibung DMP", "SAVE": "Speichern", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Save & Add New", "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-FINALISE": "Speichern und Fertigstellen", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 06b8f42d3..9d7750272 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Go to Dataset's Grant", "GO-TO-DMP": "Go to Dataset's DMP", "SAVE": "Save", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Save & Add New", "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-FINALISE": "Save and Finalize", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 10171573c..b8758d2a8 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Ir a la subvención de la descripción del dataset", "GO-TO-DMP": "Ir al PGD de la descripción del dataset", "SAVE": "Grabar", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Save & Add New", "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-FINALISE": "Grabar y finalizar", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index ad549453e..bc4ca2531 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Μετάβαση σε Περιγραφή Συνόλου Δεδομένων της Επιχορήγησης", "GO-TO-DMP": "Μετάβαση σε Περιγραφή Συνόλου Δεδομένων του Σχεδίου Διαχείρισης Δεδομένων", "SAVE": "Save", + "SAVE-AND-CONTINUE": "Αποθήκευση & Συνέχεια", "SAVE-AND-ADD": "Αποθήκευση & Προσθήκη Νέου", "SAVE-AND-CLOSE": " Αποθήκευση & Κλείσμο", "SAVE-AND-FINALISE": "Αποθήκευση και Οριστικοποίηση", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 88b079bbc..684c00bcf 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Ir para o Grant do Dataset", "GO-TO-DMP": "Ir para o PGD do Dataset", "SAVE": "Guardar", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Guardar e Adicionar Novo", "SAVE-AND-CLOSE": "Guardar e Fechar", "SAVE-AND-FINALISE": "Guardar e Concluir", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 274f54910..10090dbaa 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Prejsť na Grant súboru dát", "GO-TO-DMP": "Prejsť na DMP súboru dát", "SAVE": "Uložiť", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Uložiť a pridať nový", "SAVE-AND-CLOSE": "Uložiť a zavrieť", "SAVE-AND-FINALISE": "Uložiť a dokončiť", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index f4f28155c..60a55825e 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Pređite na grant za skupove podataka", "GO-TO-DMP": "Pređite na Plan za skup podataka", "SAVE": "Sačuvajte", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Sačuvajte i dodajte novi", "SAVE-AND-CLOSE": "Sačuvajte i zatvorite", "SAVE-AND-FINALISE": "Sačuvajte i završite", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 941b6a297..9bc8613bd 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -693,6 +693,7 @@ "GO-TO-GRANT": "Veri Seti Hibesine Git", "GO-TO-DMP": "Veri Seti VYP'na Git", "SAVE": "Kaydet", + "SAVE-AND-CONTINUE": "Save & Continue", "SAVE-AND-ADD": "Kaydet & Yeni Ekle", "SAVE-AND-CLOSE": "Kaydet & Kapat", "SAVE-AND-FINALISE": "Kaydet ve Bitir", From 045dd51014b1cb599b43d8214a0e22a7d2755733 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 13 Oct 2021 16:10:56 +0300 Subject: [PATCH 098/156] Prevent the selection of an already selected dataset Templates --- .../dmp/editor/dataset-info/dataset-info.component.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts index 63a34f93c..4980c991e 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dataset-info/dataset-info.component.ts @@ -248,6 +248,16 @@ export class DatasetInfoComponent extends BaseComponent implements OnInit { onOptionSelected(){ try{ const profiles = this.formGroup.get('profiles').value as {id:string, label:string}[]; + const profileCounts: Map = new Map(); + profiles.forEach((value) => profileCounts.set(value.id, (profileCounts.get(value.id) !== undefined ? profileCounts.get(value.id): 0 ) + 1)); + const duplicateProfiles = profiles.filter((value) => { + let isOk = profileCounts.get(value.id) > 1; + if (isOk) { + profileCounts.set(value.id, 0); + } + return isOk; + }); + duplicateProfiles.forEach((value) => profiles.splice(profiles.lastIndexOf(value), 1)); profiles.sort((a,b)=> a.label.localeCompare(b.label)); }catch{ console.info('Could not sort Dataset Templates') From 65644c3a35541acf1eb2d5082bb0a3e60cdb6d3a Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 13 Oct 2021 17:47:50 +0300 Subject: [PATCH 099/156] Add extra sanity checks --- .../java/eu/eudat/elastic/entities/Dmp.java | 3 + .../elastic/repository/DatasetRepository.java | 30 ++-- .../eudat/logic/managers/DocumentManager.java | 159 ------------------ .../documents/word/HtmlToWorldBuilder.java | 3 +- .../documents/xml/ExportXmlBuilder.java | 2 +- .../eudat/models/rda/mapper/DmpRDAMapper.java | 8 +- .../models/rda/mapper/KeywordRDAMapper.java | 8 +- 7 files changed, 32 insertions(+), 181 deletions(-) delete mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java index eee7e035d..547c23e25 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dmp.java @@ -287,6 +287,9 @@ public class Dmp implements ElasticEntity { @Override public Dmp fromElasticEntity(Map fields) { + if (fields == null || fields.isEmpty()) { + return null; + } this.id = UUID.fromString((String) fields.get(MapKey.ID.getName())); if (fields.size() > 1) { this.label = (String) fields.get(MapKey.LABEL.getName()); diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java index c7a74fe90..dcc158405 100644 --- a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java @@ -55,24 +55,26 @@ public class DatasetRepository extends ElasticRepository()); + if (!found) { + if (dmp.getDatasets() == null) { + dmp.setDatasets(new ArrayList<>()); + } + dmp.getDatasets().add(entity); } - dmp.getDatasets().add(entity); + IndexRequest request = new IndexRequest(this.environment.getProperty("elasticsearch.index")).id(dmp.getId().toString()).source(dmp.toElasticEntity(builder));//new IndexRequest("datasets", "doc", entity.getId()).source(entity.toElasticEntity(builder)); + this.getClient().index(request, RequestOptions.DEFAULT); } - IndexRequest request = new IndexRequest(this.environment.getProperty("elasticsearch.index")).id(dmp.getId().toString()).source(dmp.toElasticEntity(builder));//new IndexRequest("datasets", "doc", entity.getId()).source(entity.toElasticEntity(builder)); - this.getClient().index(request, RequestOptions.DEFAULT); return entity; } return null; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java deleted file mode 100644 index c9419512d..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java +++ /dev/null @@ -1,159 +0,0 @@ -package eu.eudat.logic.managers; - -import eu.eudat.data.dao.entities.DatasetDao; -import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.forms.VisibilityRuleService; -import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; -import eu.eudat.logic.utilities.documents.word.WordBuilder; -import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; -import eu.eudat.models.HintedModelFactory; -import eu.eudat.models.data.datasetwizard.DatasetWizardModel; -import eu.eudat.models.data.user.composite.PagedDatasetProfile; -import org.apache.commons.io.IOUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; -import org.springframework.core.io.FileSystemResource; -import org.springframework.http.*; -import org.springframework.http.converter.ByteArrayHttpMessageConverter; -import org.springframework.stereotype.Service; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.io.*; -import java.net.URL; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * Created by ikalyvas on 10/16/2018. - */ -@Service -public class DocumentManager { - private static final Logger logger = LoggerFactory.getLogger(DocumentManager.class); - - private ApiContext context; - private DatasetManager datasetManager; - private ConfigLoader configLoader; - private Environment environment; - - public DocumentManager(ApiContext context, DatasetManager datasetManager, ConfigLoader configLoader, Environment environment) { - this.context = context; - this.datasetManager = datasetManager; - this.configLoader = configLoader; - this.environment = environment; - } - - public File getWordDocument(ConfigLoader configLoader, DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { - WordBuilder wordBuilder = new WordBuilder(); - DatasetWizardModel dataset = new DatasetWizardModel(); - XWPFDocument document = configLoader.getDocument(); - eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); - Map properties = new HashMap<>(); - if (datasetEntity.getProperties() != null) { - JSONObject jobject = new JSONObject(datasetEntity.getProperties()); - properties = jobject.toMap(); - } - PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); - visibilityRuleService.setProperties(properties); - visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); - wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); - File exportFile = new File(dataset.getLabel() + ".docx"); - FileOutputStream out = new FileOutputStream(exportFile); - document.write(out); - out.close(); - return exportFile; - } - - public FileEnvelope getXmlDocument(eu.eudat.data.entities.Dataset datasetEntity, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { - ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); - DatasetWizardModel dataset = new DatasetWizardModel(); - Map properties = new HashMap<>(); - if (datasetEntity.getProperties() != null) { - JSONObject jobject = new JSONObject(datasetEntity.getProperties()); - properties = jobject.toMap(); - } - PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); - visibilityRuleService.setProperties(properties); - visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); - File file = xmlBuilder.build(pagedDatasetProfile, UUID.fromString(id), visibilityRuleService, environment); - FileEnvelope fileEnvelope = new FileEnvelope(); - fileEnvelope.setFile(file); - fileEnvelope.setFilename(datasetEntity.getLabel()); - return fileEnvelope; - } - - public File convertToPDF(File file, Environment environment, String label) throws IOException, InterruptedException { - LinkedMultiValueMap map = new LinkedMultiValueMap<>(); - map.add("file", new FileSystemResource(file)); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - headers.add("Content-disposition", "attachment; filename=" + label + ".docx"); - - headers.add("Content-type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - - HttpEntity> requestEntity = new HttpEntity>( - map, headers); - - Map queueResult = new RestTemplate().postForObject( - environment.getProperty("pdf.converter.url") + - "api/v1/", requestEntity, Map.class); - - Map mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + - "/api/v1/" + queueResult.get("id"), Map.class); - logger.info("Status: " + mediaResult.get("status")); - while (!mediaResult.get("status").equals("finished")) { - Thread.sleep(500); - mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + - "api/v1/" + queueResult.get("id"), Map.class); - logger.info("Polling"); - } - RestTemplate restTemplate = new RestTemplate(); - restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); - HttpHeaders headers2 = new HttpHeaders(); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM)); - HttpEntity entity = new HttpEntity(headers2); - - ResponseEntity response = restTemplate.exchange(environment.getProperty("pdf.converter.url") + - mediaResult.get("result_url"), HttpMethod.GET, entity, byte[].class, "1"); - - UUID uuid = UUID.randomUUID(); - File zip = new File(uuid + ".zip"); - if (response.getStatusCode().equals(HttpStatus.OK)) { - FileOutputStream output = new FileOutputStream(zip); - IOUtils.write(response.getBody(), output); - } - return extractFromZip(zip, label + ".pdf"); - } - - private File extractFromZip(File file, String filename) throws IOException { - byte[] buffer = new byte[1024]; - File newFile = new File(filename); - ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); - ZipEntry zipEntry = zis.getNextEntry(); - while (zipEntry != null) { - String zippedFileName = zipEntry.getName(); - if (zippedFileName.equals("pdf")) { - - FileOutputStream fos = new FileOutputStream(newFile); - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); - } - fos.close(); - zipEntry = zis.getNextEntry(); - } - } - zis.closeEntry(); - zis.close(); - return newFile; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java index 029d706e1..ddcba3bca 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java @@ -63,7 +63,7 @@ public class HtmlToWorldBuilder implements NodeVisitor { this.dumpRun = false; } parseProperties(); - + properties.clear(); } private void parseProperties() { @@ -105,5 +105,6 @@ public class HtmlToWorldBuilder implements NodeVisitor { String name = node.nodeName(); properties.put(name, false); parseProperties(); + properties.clear(); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java index 5f5c96786..8b57c6a99 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java @@ -124,7 +124,7 @@ public class ExportXmlBuilder { } catch (IOException ex) { try { Map jsonElement = mapper.readValue(field.getValue().toString(), Map.class); - valueField.setTextContent((jsonElement.get("label") != null ? jsonElement.get("label").toString() : jsonElement.get("name").toString())); + valueField.setTextContent((jsonElement.get("label") != null ? jsonElement.get("label").toString() : jsonElement.get("name") != null ? jsonElement.get("name").toString() : "")); } catch (IOException e) { valueField.setTextContent(field.getValue().toString()); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 075b3796a..84799b0f3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -127,9 +127,11 @@ public class DmpRDAMapper { entity.setDescription(rda.getDescription()); DatasetProfile defaultProfile = ((DatasetProfile)entity.getAssociatedDmps().toArray()[0]); entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, defaultProfile)).collect(Collectors.toSet())); - Map result = ProjectRDAMapper.toEntity(rda.getProject().get(0), apiContext); - entity.setProject((Project) result.get("project")); - result.entrySet().stream().filter(entry -> entry.getKey().startsWith("grant")).forEach(entry -> entity.setGrant((Grant) entry.getValue())); + if (rda.getProject().size() > 0) { + Map result = ProjectRDAMapper.toEntity(rda.getProject().get(0), apiContext); + entity.setProject((Project) result.get("project")); + result.entrySet().stream().filter(entry -> entry.getKey().startsWith("grant")).forEach(entry -> entity.setGrant((Grant) entry.getValue())); + } Map extraProperties = new HashMap<>(); extraProperties.put("language", LanguageRDAMapper.mapRDAIsoToLanguageIso(rda.getLanguage())); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/KeywordRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/KeywordRDAMapper.java index 1c7cb8a31..2e8a93d37 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/KeywordRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/KeywordRDAMapper.java @@ -17,9 +17,11 @@ public class KeywordRDAMapper { ObjectMapper mapper = new ObjectMapper(); try { value = JavaToJson.objectStringToJson(value); - List tags = Arrays.asList(mapper.readValue(value, Tag[].class)); - List keywordNames = tags.stream().map(Tag::getName).collect(Collectors.toList()); - return keywordNames; + if (!value.isEmpty()) { + List tags = Arrays.asList(mapper.readValue(value, Tag[].class)); + List keywordNames = tags.stream().map(Tag::getName).collect(Collectors.toList()); + return keywordNames; + } } catch (IOException e) { logger.error(e.getMessage(), e); } From d0d918682b74033cc054f02bb87e3b54e334b457 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 13 Oct 2021 17:48:46 +0300 Subject: [PATCH 100/156] Refactor remote fetcher and made it independent of sun libraries --- .../logic/proxy/fetching/LocalFetcher.java | 4 +- .../logic/proxy/fetching/RemoteFetcher.java | 186 ++++-------------- .../proxy/fetching/RemoteFetcherUtils.java | 128 ++++++++++++ .../proxy/fetching/entities/Results.java | 37 ++++ 4 files changed, 202 insertions(+), 153 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcherUtils.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/entities/Results.java diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java index 43478f359..12514ad40 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/LocalFetcher.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Component; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; -import java.beans.PropertyDescriptor; import java.io.InputStream; import java.lang.reflect.Method; import java.util.*; @@ -43,7 +42,8 @@ public class LocalFetcher { is.close(); Method reader = null; if (configSingle.getParseField() != null && !configSingle.getParseField().isEmpty()) { - reader = new PropertyDescriptor(configSingle.getParseField(), aClass).getReadMethod(); + String camelCaseGetter =configSingle.getParseField() != null && !configSingle.getParseField().isEmpty() ? "get" + configSingle.getParseField().substring(0, 1).toUpperCase() + configSingle.getParseField().substring(1) : ""; + reader = aClass.getMethod(camelCaseGetter); } ObjectMapper objectMapper = new ObjectMapper(); List> values = new ArrayList<>(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 7ed37c941..1ad74110a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -12,29 +12,20 @@ import eu.eudat.logic.proxy.config.UrlConfiguration; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; -import net.minidev.json.JSONArray; +import eu.eudat.logic.proxy.fetching.entities.Results; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; +import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; -import java.beans.PropertyDescriptor; -import java.io.*; +import java.io.File; +import java.io.StringReader; import java.lang.reflect.Method; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLEncoder; import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; @@ -153,22 +144,36 @@ public class RemoteFetcher { } - private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { + private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) { List> results = new LinkedList<>(); - if (urlConfigs == null || urlConfigs.isEmpty()) return results; + if (urlConfigs == null || urlConfigs.isEmpty()) { + return results; + } // throw new NoURLFound("No Repository urls found in configuration"); urlConfigs.sort(Comparator.comparing(UrlConfiguration::getOrdinal)); - for (UrlConfiguration urlConfig : urlConfigs) { + urlConfigs.forEach(urlConfiguration -> { + ifFunderQueryExist(urlConfiguration, externalUrlCriteria); + if (urlConfiguration.getType() == null || urlConfiguration.getType().equals("External")) { + try { + results.addAll(getAllResultsFromUrl(urlConfiguration.getUrl(), fetchStrategy, urlConfiguration.getData(), urlConfiguration.getPaginationPath(), externalUrlCriteria, urlConfiguration.getLabel(), urlConfiguration.getKey(), urlConfiguration.getContentType(), urlConfiguration.getFirstpage(), urlConfiguration.getRequestBody(), urlConfiguration.getRequestType())); + } catch (Exception e) { + logger.error(e.getLocalizedMessage(), e); + } + } else if (urlConfiguration.getType() != null && urlConfiguration.getType().equals("Internal")) { + results.addAll(getAllResultsFromMockUpJson(urlConfiguration.getUrl(), externalUrlCriteria.getLike())); + } + }); + /* for (UrlConfiguration urlConfig : urlConfigs) { ifFunderQueryExist(urlConfig, externalUrlCriteria); if (urlConfig.getType() == null || urlConfig.getType().equals("External")) { results.addAll(getAllResultsFromUrl(urlConfig.getUrl(), fetchStrategy, urlConfig.getData(), urlConfig.getPaginationPath(), externalUrlCriteria, urlConfig.getLabel(), urlConfig.getKey(), urlConfig.getContentType(), urlConfig.getFirstpage(), urlConfig.getRequestBody(), urlConfig.getRequestType())); } else if (urlConfig.getType() != null && urlConfig.getType().equals("Internal")) { results.addAll(getAllResultsFromMockUpJson(urlConfig.getUrl(), externalUrlCriteria.getLike())); } - } + }*/ return results; } @@ -183,7 +188,7 @@ public class RemoteFetcher { } } - private String replaceCriteriaOnUrl(String path, ExternalUrlCriteria externalUrlCriteria, String firstPage) { + protected String replaceCriteriaOnUrl(String path, ExternalUrlCriteria externalUrlCriteria, String firstPage) { String completedPath = path; if (externalUrlCriteria.getLike() != null) { if ((path.contains("openaire") || path.contains("orcid") || path.contains("ror")) && externalUrlCriteria.getLike().equals("")) { @@ -233,7 +238,7 @@ public class RemoteFetcher { return completedPath; } - private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage, String requestBody, String requestType) throws HugeResultSet { + private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage, String requestBody, String requestType) throws Exception { Set pages = new HashSet<>(); String replacedPath = replaceCriteriaOnUrl(path, externalUrlCriteria, firstPage); @@ -253,6 +258,7 @@ public class RemoteFetcher { Optional optionalResults = pages.parallelStream() .map(page -> getResultsFromUrl(path + "&page=" + page, jsonDataPath, jsonPaginationPath, contentType, replacedBody, requestType)) + .filter(Objects::nonNull) .reduce((result1, result2) -> { result1.getResults().addAll(result2.getResults()); return result1; @@ -264,7 +270,7 @@ public class RemoteFetcher { } - private Results getResultsFromUrl(String urlString, DataUrlConfiguration jsonDataPath, String jsonPaginationPath, String contentType, String requestBody, String requestType) { + protected Results getResultsFromUrl(String urlString, DataUrlConfiguration jsonDataPath, String jsonPaginationPath, String contentType, String requestBody, String requestType) { try { RestTemplate restTemplate = new RestTemplate(); @@ -292,103 +298,23 @@ public class RemoteFetcher { DocumentContext jsonContext = JsonPath.parse(response.getBody()); if (jsonDataPath.getFieldsUrlConfiguration().getSource() != null) { - results = new Results(jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() - + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() - + "," + jsonDataPath.getFieldsUrlConfiguration().getSource() + "]"), - new HashMap<>(1, 1)); + results = RemoteFetcherUtils.getFromJsonWithSource(jsonContext, jsonDataPath); } else if (jsonDataPath.getFieldsUrlConfiguration().getCount() != null) { // parsing services.openaire.eu - results = new Results(jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() - + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), - new HashMap<>(1, 1)); - List> fixedResults = results.getResults().stream().map(item -> { - for (int i = 0; i < 2; i++) { - String id; - if (i == 0) { - id = jsonDataPath.getFieldsUrlConfiguration().getId().replace("'", ""); - } else { - id = jsonDataPath.getFieldsUrlConfiguration().getName().replace("'", ""); - } - if (!(item.get(id) instanceof String)) { - Object obj = item.get(id); - if (obj instanceof JSONArray) { - JSONArray jarr = (JSONArray) obj; - if (jarr.get(0) instanceof String) { - item.put(id, jarr.get(0).toString()); - } else { - for (int j = 0; j < jarr.size(); j++) { - mapToMap(id, (Map)jarr.get(j), item, i == 1); - } - } - } else { - if (obj instanceof Map) { - mapToMap(id, (Map) obj, item, i == 1); - } else if (obj != null){ - item.put(id, obj.toString()); - } - } - } - } - return item; - }).collect(Collectors.toList()); - - results = new Results(fixedResults, new HashMap<>(1, 1)); + results = RemoteFetcherUtils.getFromJsonWithParsedData(jsonContext, jsonDataPath); } else if (jsonDataPath.getFieldsUrlConfiguration().getPath() != null) { - results = new Results(jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getPath() - + "," + jsonDataPath.getFieldsUrlConfiguration().getHost() + "]"), - new HashMap<>(1, 1)); - - List> multiResults = results.results.stream().map(result -> { - ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(); - externalUrlCriteria.setPath(result.get("path")); - externalUrlCriteria.setHost(result.get("host")); - String replacedPath = replaceCriteriaOnUrl(jsonDataPath.getUrlConfiguration().getUrl(), externalUrlCriteria, jsonDataPath.getUrlConfiguration().getFirstpage()); - return getResultsFromUrl(replacedPath, jsonDataPath.getUrlConfiguration().getData(), jsonDataPath.getUrlConfiguration().getData().getPath(), jsonDataPath.getUrlConfiguration().getContentType(), requestBody, requestType); - }).filter(Objects::nonNull).map(results1 -> results1.results.get(0)).collect(Collectors.toList()); - results = new Results(multiResults, new HashMap<>(1, 1)); + results = RemoteFetcherUtils.getFromJsonWithRecursiveFetching(jsonContext, jsonDataPath, this, requestBody, requestType); } else if (jsonDataPath.getFieldsUrlConfiguration().getTypes() != null) { - List> tempRes = jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getId() + "," + jsonDataPath.getFieldsUrlConfiguration().getName() - + "," + jsonDataPath.getFieldsUrlConfiguration().getTypes() + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "]"); - List> finalRes = new ArrayList<>(); - tempRes.forEach(map -> { - Map resMap = new HashMap<>(); - map.forEach((key, value) -> { - if (key.equals(jsonDataPath.getFieldsUrlConfiguration().getTypes().substring(1, jsonDataPath.getFieldsUrlConfiguration().getTypes().length() - 1))) { - resMap.put("tags", ((JSONArray) value).toJSONString()); - } else if (key.equals(jsonDataPath.getFieldsUrlConfiguration().getUri().substring(1, jsonDataPath.getFieldsUrlConfiguration().getTypes().length() - 1))) { - resMap.put(key, ((JSONArray) value).toJSONString()); - } else { - resMap.put(key, (String) value); - } - }); - - finalRes.add(resMap); - }); - - results = new Results(finalRes, - new HashMap<>(1, 1)); + results = RemoteFetcherUtils.getFromJsonWithType(jsonContext, jsonDataPath); } else if (jsonDataPath.getFieldsUrlConfiguration().getFirstName() != null) { - results = new Results(jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getId() + "," + jsonDataPath.getFieldsUrlConfiguration().getFirstName() - + "," + jsonDataPath.getFieldsUrlConfiguration().getLastName() + "]"), - new HashMap<>(1, 1)); - results.getResults().stream().forEach(entry -> { - String name = entry.get(jsonDataPath.getFieldsUrlConfiguration().getFirstName().replace("'", "")) + " " + entry.get(jsonDataPath.getFieldsUrlConfiguration().getLastName().replace("'", "")); - entry.put("name", name); - entry.remove(jsonDataPath.getFieldsUrlConfiguration().getFirstName().replace("'", "")); - entry.remove(jsonDataPath.getFieldsUrlConfiguration().getLastName().replace("'", "")); - }); + results = RemoteFetcherUtils.getFromJsonWithFirstAndLastName(jsonContext, jsonDataPath); } else { results = new Results(jsonContext.read(jsonDataPath.getPath() + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), new HashMap<>(1, 1)); } - results.results = results.results.stream().map(e -> e.entrySet().stream().collect(Collectors.toMap(x -> this.transformKey(jsonDataPath,x.getKey()), Map.Entry::getValue))) - .collect(Collectors.toList()); + results.setResults(results.getResults().stream().map(e -> e.entrySet().stream().collect(Collectors.toMap(x -> this.transformKey(jsonDataPath,x.getKey()), Map.Entry::getValue))) + .collect(Collectors.toList())); } else if (response.getHeaders().get("Content-Type").get(0).contains("xml")) { Class aClass = Class.forName(jsonDataPath.getParseClass()); @@ -398,7 +324,8 @@ public class RemoteFetcher { Object data = unmarshaller.unmarshal(stringReader); Method reader = null; if (jsonDataPath.getParseField() != null && !jsonDataPath.getParseField().isEmpty()) { - reader = new PropertyDescriptor(jsonDataPath.getParseField(), aClass).getReadMethod(); + String camelCaseGetter = jsonDataPath.getParseField() != null && !jsonDataPath.getParseField().isEmpty() ? "get" + jsonDataPath.getParseField().substring(0, 1).toUpperCase() + jsonDataPath.getParseField().substring(1) : ""; + reader = aClass.getMethod(camelCaseGetter); } ObjectMapper objectMapper = new ObjectMapper(); List> values = new ArrayList<>(); @@ -448,8 +375,6 @@ public class RemoteFetcher { } catch (Exception exception) { logger.error(exception.getMessage(), exception); } //maybe print smth... - finally { - } return null; } @@ -494,48 +419,7 @@ public class RemoteFetcher { } - static class Results { - List> results; - Map pagination; - Results() { - this.results = new ArrayList<>(); - this.pagination = new HashMap<>(); - } - Results(List> results, Map pagination) { - this.results = results; - this.pagination = pagination; - } - List> getResults() { - return results; - } - - public void setResults(List> results) { - this.results = results; - } - - Map getPagination() { - return pagination; - } - - public void setPagination(Map pagination) { - this.pagination = pagination; - } - } - - private void mapToMap(String key, Map source, Map destination, boolean isTitle) { - if (source != null) { - String content = source.get("content"); - /*if (isTitle) { - String classId = source.get("classid"); - if (classId.equals("main title")) { - destination.put(key, content); - } - } else {*/ - destination.put(key, content); -// } - } - } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcherUtils.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcherUtils.java new file mode 100644 index 000000000..a518ca2f7 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcherUtils.java @@ -0,0 +1,128 @@ +package eu.eudat.logic.proxy.fetching; + +import com.jayway.jsonpath.DocumentContext; +import eu.eudat.logic.proxy.config.DataUrlConfiguration; +import eu.eudat.logic.proxy.config.ExternalUrlCriteria; +import eu.eudat.logic.proxy.fetching.entities.Results; +import net.minidev.json.JSONArray; + +import java.util.*; +import java.util.stream.Collectors; + +public class RemoteFetcherUtils { + + public static Results getFromJsonWithSource(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath) { + return new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() + + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + + "," + jsonDataPath.getFieldsUrlConfiguration().getSource() + "]"), + new HashMap<>(1, 1)); + } + + public static Results getFromJsonWithParsedData(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath) { + Results results = new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), + new HashMap<>(1, 1)); + List> fixedResults = results.getResults().stream().map(item -> { + for (int i = 0; i < 2; i++) { + String id; + if (i == 0) { + id = jsonDataPath.getFieldsUrlConfiguration().getId().replace("'", ""); + } else { + id = jsonDataPath.getFieldsUrlConfiguration().getName().replace("'", ""); + } + if (!(item.get(id) instanceof String)) { + Object obj = item.get(id); + if (obj instanceof JSONArray) { + JSONArray jarr = (JSONArray) obj; + if (jarr.get(0) instanceof String) { + item.put(id, jarr.get(0).toString()); + } else { + for (int j = 0; j < jarr.size(); j++) { + mapToMap(id, (Map)jarr.get(j), item, i == 1); + } + } + } else { + if (obj instanceof Map) { + mapToMap(id, (Map) obj, item, i == 1); + } else if (obj != null){ + item.put(id, obj.toString()); + } + } + } + } + return item; + }).collect(Collectors.toList()); + + return new Results(fixedResults, new HashMap<>(1, 1)); + } + + public static Results getFromJsonWithRecursiveFetching(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath, RemoteFetcher remoteFetcher, String requestBody, String requestType) { + Results results = new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getPath() + + "," + jsonDataPath.getFieldsUrlConfiguration().getHost() + "]"), + new HashMap<>(1, 1)); + + List> multiResults = results.getResults().stream().map(result -> { + ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(); + externalUrlCriteria.setPath(result.get("path")); + externalUrlCriteria.setHost(result.get("host")); + String replacedPath = remoteFetcher.replaceCriteriaOnUrl(jsonDataPath.getUrlConfiguration().getUrl(), externalUrlCriteria, jsonDataPath.getUrlConfiguration().getFirstpage()); + return remoteFetcher.getResultsFromUrl(replacedPath, jsonDataPath.getUrlConfiguration().getData(), jsonDataPath.getUrlConfiguration().getData().getPath(), jsonDataPath.getUrlConfiguration().getContentType(), requestBody, requestType); + }).filter(Objects::nonNull).map(results1 -> results1.getResults().get(0)).collect(Collectors.toList()); + return new Results(multiResults, new HashMap<>(1, 1)); + } + + public static Results getFromJsonWithType(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath) { + List> tempRes = jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getId() + "," + jsonDataPath.getFieldsUrlConfiguration().getName() + + "," + jsonDataPath.getFieldsUrlConfiguration().getTypes() + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "]"); + List> finalRes = new ArrayList<>(); + tempRes.forEach(map -> { + Map resMap = new HashMap<>(); + map.forEach((key, value) -> { + if (key.equals(jsonDataPath.getFieldsUrlConfiguration().getTypes().substring(1, jsonDataPath.getFieldsUrlConfiguration().getTypes().length() - 1))) { + resMap.put("tags", ((JSONArray) value).toJSONString()); + } else if (key.equals(jsonDataPath.getFieldsUrlConfiguration().getUri().substring(1, jsonDataPath.getFieldsUrlConfiguration().getTypes().length() - 1))) { + resMap.put(key, ((JSONArray) value).toJSONString()); + } else { + resMap.put(key, (String) value); + } + }); + + finalRes.add(resMap); + }); + + return new Results(finalRes, + new HashMap<>(1, 1)); + } + + public static Results getFromJsonWithFirstAndLastName(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath) { + Results results = new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getId() + "," + jsonDataPath.getFieldsUrlConfiguration().getFirstName() + + "," + jsonDataPath.getFieldsUrlConfiguration().getLastName() + "]"), + new HashMap<>(1, 1)); + results.getResults().stream().forEach(entry -> { + String name = entry.get(jsonDataPath.getFieldsUrlConfiguration().getFirstName().replace("'", "")) + " " + entry.get(jsonDataPath.getFieldsUrlConfiguration().getLastName().replace("'", "")); + entry.put("name", name); + entry.remove(jsonDataPath.getFieldsUrlConfiguration().getFirstName().replace("'", "")); + entry.remove(jsonDataPath.getFieldsUrlConfiguration().getLastName().replace("'", "")); + }); + return results; + } + + private static void mapToMap(String key, Map source, Map destination, boolean isTitle) { + if (source != null) { + String content = source.get("content"); + /*if (isTitle) { + String classId = source.get("classid"); + if (classId.equals("main title")) { + destination.put(key, content); + } + } else {*/ + destination.put(key, content); +// } + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/entities/Results.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/entities/Results.java new file mode 100644 index 000000000..7cd0067e7 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/entities/Results.java @@ -0,0 +1,37 @@ +package eu.eudat.logic.proxy.fetching.entities; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Results { + List> results; + Map pagination; + + public Results() { + this.results = new ArrayList<>(); + this.pagination = new HashMap<>(); + } + + public Results(List> results, Map pagination) { + this.results = results; + this.pagination = pagination; + } + + public List> getResults() { + return results; + } + + public void setResults(List> results) { + this.results = results; + } + + public Map getPagination() { + return pagination; + } + + public void setPagination(Map pagination) { + this.pagination = pagination; + } +} From 942782fe3c5234622c2c7e9fbc8d9008cba47da7 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 13 Oct 2021 17:49:32 +0300 Subject: [PATCH 101/156] Use metrics predifined names instead of plain Strings --- .../eudat/logic/managers/MetricsManager.java | 62 ++++++++++--------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index de5b54006..952e6a248 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -1,11 +1,10 @@ package eu.eudat.logic.managers; -import eu.eudat.types.MetricNames; import eu.eudat.data.dao.criteria.*; -import eu.eudat.data.entities.Dataset; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.helpers.StreamDistinctBy; +import eu.eudat.types.MetricNames; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.Gauge; import org.slf4j.Logger; @@ -20,7 +19,10 @@ import javax.transaction.Transactional; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -77,20 +79,20 @@ public class MetricsManager { this.environment = environment; registry.clear(); this.gauges = Stream.of( new Object[][]{ - {MetricNames.DMP, Gauge.build().name("argos_managed_dmps").help("Number of managed DMPs").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DMP, Gauge.build().name(MetricNames.DMP).help("Number of managed DMPs").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.FUNDERS, Gauge.build().name("argos_funders").help("Number of registered Funders").register(registry.getPrometheusRegistry())}, - {MetricNames.GRANTS, Gauge.build().name("argos_grants").help("Number of registered Grants").register(registry.getPrometheusRegistry())}, - {MetricNames.PROJECT, Gauge.build().name("argos_projects").help("Number of registered Projects").register(registry.getPrometheusRegistry())}, - {MetricNames.RESEARCHER, Gauge.build().name("argos_researchers").help("Number of Colaborators/Researchers").register(registry.getPrometheusRegistry())}, + {MetricNames.FUNDERS, Gauge.build().name(MetricNames.FUNDERS).help("Number of registered Funders").register(registry.getPrometheusRegistry())}, + {MetricNames.GRANTS, Gauge.build().name(MetricNames.GRANTS).help("Number of registered Grants").register(registry.getPrometheusRegistry())}, + {MetricNames.PROJECT, Gauge.build().name(MetricNames.PROJECT).help("Number of registered Projects").register(registry.getPrometheusRegistry())}, + {MetricNames.RESEARCHER, Gauge.build().name(MetricNames.RESEARCHER).help("Number of Colaborators/Researchers").register(registry.getPrometheusRegistry())}, - {MetricNames.DATASET, Gauge.build().name("argos_managed_dataset_descriptions").help("Number of managed Dataset Descriptions").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DATASET, Gauge.build().name(MetricNames.DATASET).help("Number of managed Dataset Descriptions").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.DATASET_TEMPLATE, Gauge.build().name("argos_dataset_templates").help("Number of dataset Templates").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.USERS, Gauge.build().name("argos_users").help("Number of users").labelNames("type").register(registry.getPrometheusRegistry())}, + {MetricNames.USERS, Gauge.build().name(MetricNames.USERS).help("Number of users").labelNames("type").register(registry.getPrometheusRegistry())}, - {MetricNames.LANGUAGES, Gauge.build().name("argos_languages").help("Number of Languages").register(registry.getPrometheusRegistry())}, + {MetricNames.LANGUAGES, Gauge.build().name(MetricNames.LANGUAGES).help("Number of Languages").register(registry.getPrometheusRegistry())}, }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); @@ -101,30 +103,30 @@ public class MetricsManager { @Scheduled(initialDelay = 1000 * 60 * 60, fixedDelay = 1000 * 60 * 60) public void init() throws IOException { logger.info("Start calculating Metrics"); - calculateValue("argos_managed_dmps", (int) countAllDraftDMPs(), "draft"); - calculateValue("argos_managed_dmps", (int) countAllFinalizedDMPs(), "finalized"); - calculateValue("argos_managed_dmps", (int) countAllPublishedDMPs(), "published"); - calculateValue("argos_managed_dmps", (int) countAllDoiedDMPs(), "doied"); + calculateValue(MetricNames.DMP, (int) countAllDraftDMPs(), MetricNames.DRAFT); + calculateValue(MetricNames.DMP, (int) countAllFinalizedDMPs(), MetricNames.FINALIZED); + calculateValue(MetricNames.DMP, (int) countAllPublishedDMPs(), MetricNames.PUBLISHED); + calculateValue(MetricNames.DMP, (int) countAllDoiedDMPs(), MetricNames.DOIED); - calculateValue("argos_funders", (int) countAllFunders(), null); - calculateValue("argos_grants", (int) countAllGrants(), null); - calculateValue("argos_projects", (int) countAllProjects(), null); - calculateValue("argos_researchers", (int) countAllResearchers(), null); + calculateValue(MetricNames.FUNDERS, (int) countAllFunders(), null); + calculateValue(MetricNames.GRANTS, (int) countAllGrants(), null); + calculateValue(MetricNames.PROJECT, (int) countAllProjects(), null); + calculateValue(MetricNames.RESEARCHER, (int) countAllResearchers(), null); - calculateValue("argos_managed_dataset_descriptions", (int) countAllDraftDatasets(), "draft"); - calculateValue("argos_managed_dataset_descriptions", (int) countAllFinalizedDatasets(), "finalized"); - calculateValue("argos_managed_dataset_descriptions", (int) countAllPublicDatasets(), "published"); - calculateValue("argos_managed_dataset_descriptions", (int) countAllDatasetsWithDoi(), "doied"); + calculateValue(MetricNames.DATASET, (int) countAllDraftDatasets(), MetricNames.DRAFT); + calculateValue(MetricNames.DATASET, (int) countAllFinalizedDatasets(), MetricNames.FINALIZED); + calculateValue(MetricNames.DATASET, (int) countAllPublicDatasets(), MetricNames.PUBLISHED); + calculateValue(MetricNames.DATASET, (int) countAllDatasetsWithDoi(), MetricNames.DOIED); - calculateValue("argos_dataset_templates", (int) countAllDraftTemplates(), "draft"); - calculateValue("argos_dataset_templates", (int) countAllFinalizedTemplates(), "active"); - calculateValue("argos_dataset_templates", (int) countAllUsedTemplates(), "used"); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) countAllDraftTemplates(), MetricNames.DRAFT); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) countAllFinalizedTemplates(), MetricNames.ACTIVE); + calculateValue(MetricNames.DATASET_TEMPLATE, (int) countAllUsedTemplates(), MetricNames.USED); - calculateValue("argos_users", (int) userManager.countActiveUsers().intValue(), "loggedin"); - calculateValue("argos_users", (int) userManager.countAllUsers().intValue(), "total"); + calculateValue(MetricNames.USERS, (int) userManager.countActiveUsers().intValue(), MetricNames.LOGGEDIN); + calculateValue(MetricNames.USERS, (int) userManager.countAllUsers().intValue(), MetricNames.TOTAL); long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); - calculateValue("argos_languages", (int) files, null); + calculateValue(MetricNames.LANGUAGES, (int) files, null); logger.info("Metrics calculation Completed"); } From e8366aa61a4d01dbc16cb137c7f62d20b6659b0c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 13 Oct 2021 17:50:15 +0300 Subject: [PATCH 102/156] Fix critical issue with dataset pagination --- .../src/app/ui/dataset/listing/dataset-listing.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html index c152d1d34..f03d171f4 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html @@ -65,7 +65,7 @@
    -
    +
    From 887789d9e5893a08d01815ed32b2c0ca15829072 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 13 Oct 2021 18:17:53 +0300 Subject: [PATCH 103/156] Dockerfiile update --- dmp-backend/Dockerfile.CI | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dmp-backend/Dockerfile.CI b/dmp-backend/Dockerfile.CI index 5b8884b7d..3f8b7c0b3 100644 --- a/dmp-backend/Dockerfile.CI +++ b/dmp-backend/Dockerfile.CI @@ -1,4 +1,4 @@ -FROM maven:3-jdk-8-alpine AS MAVEN_BUILD +FROM maven:3-openjdk-11 AS MAVEN_BUILD COPY pom.xml /build/ COPY data /build/data/ @@ -9,7 +9,7 @@ COPY web /build/web/ WORKDIR /build/ RUN mvn package -FROM openjdk:8-jre-alpine +FROM adoptopenjdk/openjdk11:alpine-jre WORKDIR /app COPY --from=MAVEN_BUILD /build/web/target/web-1.0-SNAPSHOT.jar /app/app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${PROF}", "-Dspring.config.location=/files/config/", "-jar","/app/app.jar"] From c3f28936af61277fb7d0a7e423520793819826ed Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 13 Oct 2021 18:47:41 +0300 Subject: [PATCH 104/156] Dockerfile update --- dmp-backend/Dockerfile.CI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/Dockerfile.CI b/dmp-backend/Dockerfile.CI index 3f8b7c0b3..866a3a692 100644 --- a/dmp-backend/Dockerfile.CI +++ b/dmp-backend/Dockerfile.CI @@ -12,4 +12,4 @@ RUN mvn package FROM adoptopenjdk/openjdk11:alpine-jre WORKDIR /app COPY --from=MAVEN_BUILD /build/web/target/web-1.0-SNAPSHOT.jar /app/app.jar -ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${PROF}", "-Dspring.config.location=/files/config/", "-jar","/app/app.jar"] +ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${PROF}", "-Dspring.config.additional-location=/files/config/", "-jar","/app/app.jar"] From eeb5479a98bfae27b2e82ea97407bb5436f1fd79 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Fri, 15 Oct 2021 13:56:45 +0300 Subject: [PATCH 105/156] form-composite-title.component.html: [Bug fix] Show "view more/less" functionality only if there is extendedDescription. --- .../form-composite-title/form-composite-title.component.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html index 0d2718efb..fc710c640 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-composite-title/form-composite-title.component.html @@ -14,13 +14,12 @@
    -
    +
    {{'DATASET-EDITOR.QUESTION.EXTENDED-DESCRIPTION.VIEW-MORE' | translate}}
    -
    -
    +
    {{'DATASET-EDITOR.QUESTION.EXTENDED-DESCRIPTION.VIEW-LESS' | translate}} From 7a3f3f2fd51ccb4b9ef952260e5af81955a6dbb5 Mon Sep 17 00:00:00 2001 From: "k.triantafyllou" Date: Tue, 19 Oct 2021 11:08:38 +0300 Subject: [PATCH 106/156] Add reordering for inputs in a dataset template --- .../dataset-profile/dataset-profile.module.ts | 33 +-- ...file-editor-composite-field.component.html | 107 ++++---- ...file-editor-composite-field.component.scss | 19 +- ...rofile-editor-composite-field.component.ts | 234 +++++++++++------- ...ataset-profile-editor-field.component.html | 7 +- .../dataset-profile-editor-field.component.ts | 9 +- .../dataset-profile-editor.component.ts | 10 +- .../transition-group-item.directive.ts | 16 ++ .../transition-group.component.ts | 106 ++++++++ .../transition-group.module.ts | 13 + dmp-frontend/src/assets/config/config.json | 2 +- dmp-frontend/src/assets/i18n/de.json | 4 +- dmp-frontend/src/assets/i18n/en.json | 4 +- dmp-frontend/src/assets/i18n/es.json | 4 +- dmp-frontend/src/assets/i18n/gr.json | 4 +- dmp-frontend/src/assets/i18n/pt.json | 4 +- dmp-frontend/src/assets/i18n/sk.json | 4 +- dmp-frontend/src/assets/i18n/sr.json | 4 +- dmp-frontend/src/assets/i18n/tr.json | 4 +- dmp-frontend/src/styles.scss | 5 + 20 files changed, 407 insertions(+), 186 deletions(-) create mode 100644 dmp-frontend/src/app/ui/transition-group/transition-group-item.directive.ts create mode 100644 dmp-frontend/src/app/ui/transition-group/transition-group.component.ts create mode 100644 dmp-frontend/src/app/ui/transition-group/transition-group.module.ts diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts index 660ab6101..44a213352 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts @@ -53,26 +53,27 @@ import { DatasetProfileTableOfContents } from './table-of-contents/table-of-cont import { DatasetProfileTableOfContentsInternalSection } from './table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section'; import {HttpClientModule} from "@angular/common/http"; import {AngularEditorModule} from "@kolkov/angular-editor"; +import {TransitionGroupModule} from "@app/ui/transition-group/transition-group.module"; @NgModule({ - imports: [ - CommonUiModule, - CommonFormsModule, - FormattingModule, - DatasetProfileRoutingModule, - ConfirmationDialogModule, - NgxDropzoneModule, - FormProgressIndicationModule, - DatasetModule, - AngularStickyThingsModule, - DragDropModule, - MatBadgeModule, - DragulaModule, - AutoCompleteModule, - HttpClientModule, AngularEditorModule, - ], + imports: [ + CommonUiModule, + CommonFormsModule, + FormattingModule, + DatasetProfileRoutingModule, + ConfirmationDialogModule, + NgxDropzoneModule, + FormProgressIndicationModule, + DatasetModule, + AngularStickyThingsModule, + DragDropModule, + MatBadgeModule, + DragulaModule, + AutoCompleteModule, + HttpClientModule, AngularEditorModule, TransitionGroupModule, + ], declarations: [ DatasetProfileListingComponent, DatasetProfileCriteriaComponent, diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html index 1069e7252..3604c017b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html @@ -1,4 +1,3 @@ - - -
    - - -
    - - - - - - - - -
    +
    +
    + + + + + + + +
    +
      +
    • + keyboard_arrow_up +
    • +
    • + keyboard_arrow_down +
    • +
    +
    +

    - - - +
  • @@ -221,7 +226,7 @@ - + - + - + - + - + - + - - + + @@ -383,9 +388,9 @@ more_vert - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.DESCRIPTION' | translate}} - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.EXTENDED-DESCRIPTION' | translate}} - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.ADDITIONAL-INFORMATION' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.DESCRIPTION' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.EXTENDED-DESCRIPTION' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.ADDITIONAL-INFORMATION' | translate}}
  • @@ -393,21 +398,21 @@
    - +
    - - - diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss index 9b73377a3..a53d303c5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.scss @@ -53,7 +53,7 @@ $blue-color-light: #5cf7f2; .field-id-container-icon{ position: absolute; top: -50%; - + } } @@ -64,7 +64,7 @@ $blue-color-light: #5cf7f2; .fielset-header{ font-size: 1.5em; font-weight: bold; - + // .numbering{ // padding: 0.5em 0em; // } @@ -84,7 +84,7 @@ $blue-color-light: #5cf7f2; color: #212121; } -:host ::ng-deep .fieldset-checkbox-action-dataset-profile-editor +:host ::ng-deep .fieldset-checkbox-action-dataset-profile-editor { .mat-checkbox-label{ font-size: 0.8em; @@ -134,6 +134,13 @@ $blue-color-light: #5cf7f2; font-style: italic; } -// ::ng-deep .underline-line-field .mat-form-field-appearance-legacy .mat-form-field-wapper{ -// padding-bottom: 1.25em !important; -// } \ No newline at end of file +.field-input { + position: relative; +} + +.field-input .arrows { + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); +} diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts index 306eaa17a..89dead325 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts @@ -1,30 +1,56 @@ -import { Component, Input, OnChanges, OnInit } from '@angular/core'; -import { FormArray, FormControl, FormGroup} from '@angular/forms'; -import { FieldEditorModel } from '../../../admin/field-editor-model'; -import { Guid } from '@common/types/guid'; -import { RuleEditorModel } from '../../../admin/rule-editor-model'; -import { ValidationType } from '@app/core/common/enum/validation-type'; -import { MatCheckboxChange } from '@angular/material/checkbox'; -import { DatasetDescriptionCompositeFieldEditorModel, DatasetDescriptionFieldEditorModel, DatasetDescriptionFormEditorModel, DatasetDescriptionSectionEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; -import { DatasetProfileFieldViewStyle } from '@app/core/common/enum/dataset-profile-field-view-style'; -import { MatDialog } from '@angular/material/dialog'; -import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; -import { TranslateService } from '@ngx-translate/core'; -import { ViewStyleType } from '../field/view-style-enum'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { DatasetProfileService } from '@app/core/services/dataset-profile/dataset-profile.service'; -import { EditorCustomValidators } from '../../custom-validators/editor-custom-validators'; -import { Field, FieldSet } from '@app/core/model/admin/dataset-profile/dataset-profile'; -import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profile-combo-box-type'; -import { DatasetProfileInternalDmpEntitiesType } from '@app/core/common/enum/dataset-profile-internal-dmp-entities-type'; -import { AutoCompleteFieldData, BooleanDecisionFieldData, CheckBoxFieldData, CurrencyFieldData, DataRepositoriesFieldData, DatasetIdentifierFieldData, DatePickerFieldData, DmpsAutoCompleteFieldData, ExternalDatasetsFieldData, FieldDataOption, FreeTextFieldData, OrganizationsFieldData, RadioBoxFieldData, RegistriesFieldData, ResearchersAutoCompleteFieldData, ServicesFieldData, TagsFieldData, TextAreaFieldData, ValidationFieldData, WordListFieldData } from '@app/core/model/dataset-profile-definition/field-data/field-data'; -import { CompositeField } from '@app/core/model/dataset-profile-definition/composite-field'; +import {Component, Input, OnChanges, OnInit, ViewChild} from '@angular/core'; +import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms'; +import {FieldEditorModel} from '../../../admin/field-editor-model'; +import {Guid} from '@common/types/guid'; +import {RuleEditorModel} from '../../../admin/rule-editor-model'; +import {ValidationType} from '@app/core/common/enum/validation-type'; +import {MatCheckboxChange} from '@angular/material/checkbox'; +import { + DatasetDescriptionCompositeFieldEditorModel, + DatasetDescriptionFieldEditorModel, + DatasetDescriptionSectionEditorModel +} from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; +import {DatasetProfileFieldViewStyle} from '@app/core/common/enum/dataset-profile-field-view-style'; +import {MatDialog} from '@angular/material/dialog'; +import {ConfirmationDialogComponent} from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import {TranslateService} from '@ngx-translate/core'; +import {ViewStyleType} from '../field/view-style-enum'; +import {EnumUtils} from '@app/core/services/utilities/enum-utils.service'; +import {DatasetProfileService} from '@app/core/services/dataset-profile/dataset-profile.service'; +import {EditorCustomValidators} from '../../custom-validators/editor-custom-validators'; +import {Field, FieldSet} from '@app/core/model/admin/dataset-profile/dataset-profile'; +import {DatasetProfileComboBoxType} from '@app/core/common/enum/dataset-profile-combo-box-type'; +import {DatasetProfileInternalDmpEntitiesType} from '@app/core/common/enum/dataset-profile-internal-dmp-entities-type'; +import { + AutoCompleteFieldData, + BooleanDecisionFieldData, + CheckBoxFieldData, + CurrencyFieldData, + DataRepositoriesFieldData, + DatasetIdentifierFieldData, + DatePickerFieldData, + DmpsAutoCompleteFieldData, + ExternalDatasetsFieldData, + FieldDataOption, + FreeTextFieldData, + OrganizationsFieldData, + RadioBoxFieldData, + RegistriesFieldData, + ResearchersAutoCompleteFieldData, + ServicesFieldData, + TagsFieldData, + TextAreaFieldData, + ValidationFieldData, + WordListFieldData +} from '@app/core/model/dataset-profile-definition/field-data/field-data'; +import {CompositeField} from '@app/core/model/dataset-profile-definition/composite-field'; import {Field as FieldDefinition} from '@app/core/model/dataset-profile-definition/field'; -import { Subject } from 'rxjs'; -import { debounceTime, delay, map, takeUntil, tap } from 'rxjs/operators'; -import { GENERAL_ANIMATIONS } from '../../animations/animations'; -import { BaseComponent } from '@common/base/base.component'; +import {Subject} from 'rxjs'; +import {debounceTime, delay, map, takeUntil, tap} from 'rxjs/operators'; +import {GENERAL_ANIMATIONS} from '../../animations/animations'; +import {BaseComponent} from '@common/base/base.component'; import {AngularEditorConfig} from "@kolkov/angular-editor"; +import {TransitionGroupComponent} from "@app/ui/transition-group/transition-group.component"; @Component({ selector: 'app-dataset-profile-editor-composite-field-component', @@ -73,7 +99,8 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i @Input() numbering: string; @Input() hasFocus: boolean = false; - + @ViewChild("inputs") inputs: TransitionGroupComponent; + showPreview: boolean = true; previewDirty: boolean = false; @@ -96,7 +123,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i private language: TranslateService, public enumUtils: EnumUtils, public datasetProfileService: DatasetProfileService - ) { + ) { super(); } @@ -104,6 +131,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // this.setTargetField(null); // this.showExtendedDescription = !!this.form.get('extendedDescription').value; // this.showAdditionalInfo = !!this.form.get('additionalInformation').value; + console.log(this.form.get('fields')['controls']) } get firstField(){ @@ -153,7 +181,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // this.previewForm = null; this.previewDirty = true; this.generatePreviewForm(); - + }); this.previewSubject$ .pipe(debounceTime(600)) @@ -191,7 +219,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i if(previewContainer){ previewContainer.style.height = 'auto'; } - + // const updatedForm = model.buildForm(); // this.reloadPreview(updatedForm) }); @@ -207,7 +235,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } private reloadPreview(updatedForm: FormGroup){ setTimeout(() => { - + const previewContainer = document.getElementById('preview_container'+ this.form.get('id').value); // let clientHeight = -1; if(previewContainer){ @@ -227,7 +255,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i setTimeout(() => { - + this.showPreview = true; this.previewDirty = false; @@ -238,7 +266,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } }); } - }); + }); }); } @@ -247,7 +275,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i private generatePreviewForm(){ const formValue:FieldSet = this.form.getRawValue(); const fields:FieldDefinition[] = formValue.fields.map(editorField=>this._fieldToFieldDefinition(editorField)); - + const compositeField: CompositeField = { id: formValue.id, @@ -268,7 +296,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } return model; }) - } + } const section = new DatasetDescriptionSectionEditorModel(); @@ -314,7 +342,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // (this.form.get('fields') as FormArray).controls.forEach(field=>{ // const fieldEditorModel = new DatasetDescriptionFieldEditorModel(); - + // fieldEditorModel.viewStyle= { // renderStyle: field.get('viewStyle').get('renderStyle').value, // cssClass: null @@ -322,15 +350,15 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // fieldEditorModel.defaultValue = field.get('defaultValue').value; // switch (field.get('viewStyle').get('renderStyle').value) { // case DatasetProfileFieldViewStyle.TextArea: - // fieldEditorModel.data = { + // fieldEditorModel.data = { // label: field.get('data').get('label').value // }; // break; - + // default: // break; // } - + // editorModel.fields.push(fieldEditorModel); // }); @@ -369,7 +397,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i minControl.updateValueAndValidity(); maxControl.updateValueAndValidity(); - + } addNewField() { @@ -380,11 +408,11 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i const fieldForm = field.buildForm(); // fieldForm.setValidators(this.customFieldValidator()); - + // fieldForm.get('viewStyle').get('renderStyle').setValidators(Validators.required); (this.form.get('fields')).push(fieldForm); - + this.setTargetField(fieldForm); fieldForm.updateValueAndValidity(); } @@ -393,7 +421,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i const fieldsForm = this.form.get('fields'); fieldsForm.removeAt(index); - + this.inputs.init(); // calculate ordinals fieldsForm.controls.forEach((field, idx)=>{ field.get('ordinal').setValue(idx); @@ -417,7 +445,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i (targetField.get('visible').get('rules')).push(rule.buildForm()); } toggleRequired(targetField: FormGroup, event:MatCheckboxChange){ - + let validationsControl = targetField.get('validations') as FormControl; let validations: Array = validationsControl.value; @@ -433,12 +461,12 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required)); validationsControl.updateValueAndValidity(); } - - + + // if(validations.includes(ValidationType.Required)){//IS ALREADY REQUIRED // validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required)); // validationsControl.updateValueAndValidity(); - // }else{ + // }else{ // //SET REQUIRED VALIDATOR // console.log('setting required validator'); // validations.push(ValidationType.Required); @@ -446,17 +474,13 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // validationsControl.updateValueAndValidity(); // } } - setTargetField(field:FormGroup){ - this.targetField = field; + setTargetField(field:AbstractControl){ + this.targetField = field; } - - - - deleteTargetField(){ - + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { restoreFocus: false, data: { @@ -471,7 +495,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i this._deleteTargetField(); } }); - + } @@ -498,7 +522,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } deleteField(index: number){ - + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { restoreFocus: false, data: { @@ -513,21 +537,21 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i this.DeleteField(index); } }); - + } addNewInput(type: ViewStyleType){ - + const fieldsArray = this.form.get('fields') as FormArray; - + let targetOrdinal = fieldsArray.length; try{ targetOrdinal = fieldsArray.controls.map(control=> control.get('ordinal').value).reduce((a,b)=>Math.max(a,b)) +1; }catch{ - + } @@ -550,8 +574,8 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // const fieldForm = field.buildForm(); // fieldForm.setValidators(this.customFieldValidator()); // fieldForm.get('viewStyle').get('renderStyle').setValidators(Validators.required); - - + + // if (fieldForm.get('data')) { // fieldForm.removeControl('data'); @@ -573,7 +597,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.CheckBox:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.CheckBox) // fieldForm.addControl('data', new CheckBoxFieldDataEditorModel().buildForm()); const data: CheckBoxFieldData = { @@ -582,12 +606,12 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i field.viewStyle.renderStyle = DatasetProfileFieldViewStyle.CheckBox; field.data = data; - + break; } case this.viewTypeEnum.Select:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ComboBox) // fieldForm.addControl('data', new WordListFieldDataEditorModel().buildForm()); @@ -610,7 +634,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Other:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ComboBox) // fieldForm.addControl('data', new AutoCompleteFieldDataEditorModel().buildForm()); //TODO SEE @@ -630,10 +654,10 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i break; }case this.viewTypeEnum.InternalDmpEntities:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.InternalDmpEntities) // fieldForm.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm());//TODO TO SEE - + const data: DmpsAutoCompleteFieldData = { label:'', multiAutoComplete: false, @@ -648,7 +672,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.FreeText:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.FreeText) // fieldForm.addControl('data', new FreeTextFieldDataEditorModel().buildForm()); @@ -662,7 +686,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.RadioBox:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.RadioBox) // fieldForm.addControl('data', new RadioBoxFieldDataEditorModel().buildForm()); // fieldForm.get('data').setValidators(EditorCustomValidators.atLeastOneElementListValidator('options')); @@ -679,7 +703,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.TextArea:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.TextArea) // fieldForm.addControl('data', new TextAreaFieldDataEditorModel().buildForm()); @@ -694,7 +718,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.DatePicker:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DatePicker) // fieldForm.addControl('data', new DatePickerDataEditorModel().buildForm()); const data: DatePickerFieldData = { @@ -707,7 +731,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.ExternalDatasets:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ExternalDatasets) // fieldForm.addControl('data', new ExternalDatasetsDataEditorModel().buildForm()); const data: ExternalDatasetsFieldData = { @@ -721,7 +745,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.DataRepositories:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DataRepositories) // fieldForm.addControl('data', new DataRepositoriesDataEditorModel().buildForm()); @@ -737,10 +761,10 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Registries:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Registries) // fieldForm.addControl('data', new RegistriesDataEditorModel().buildForm()); - + const data:RegistriesFieldData = { label: '', multiAutoComplete: false @@ -753,7 +777,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Services:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Services) // fieldForm.addControl('data', new ServicesDataEditorModel().buildForm()); @@ -769,7 +793,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Tags:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Tags) // fieldForm.addControl('data', new TagsDataEditorModel().buildForm()); @@ -783,7 +807,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Researchers:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Researchers) // this.form.addControl('data', new ResearchersDataEditorModel().buildForm()); //TODO TO ASK // fieldForm.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm()); @@ -798,10 +822,10 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // field.viewStyle.renderStyle = DatasetProfileFieldViewStyle.InternalDmpEntities; // field.data = {label:''} - + field.viewStyle.renderStyle = DatasetProfileFieldViewStyle.Researchers; field.data = data; - + @@ -809,7 +833,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Organizations:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Organizations) // fieldForm.addControl('data', new OrganizationsDataEditorModel().buildForm()); // this.form.addControl('data', new OrganizationsDataEditorModel().buildForm()) @@ -819,8 +843,8 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i autoCompleteSingleDataList:[], label:'', multiAutoComplete: false, - - } as OrganizationsFieldData; //TODO + + } as OrganizationsFieldData; //TODO field.viewStyle.renderStyle = DatasetProfileFieldViewStyle.Organizations; field.data = data; @@ -829,7 +853,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.DatasetIdentifier:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DatasetIdentifier) // fieldForm.addControl('data', new DatasetIdentifierDataEditorModel().buildForm()); @@ -839,12 +863,12 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i field.viewStyle.renderStyle = DatasetProfileFieldViewStyle.DatasetIdentifier; field.data = data; - + break; } case this.viewTypeEnum.Currency:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Currency) // fieldForm.addControl('data', new CurrencyDataEditorModel().buildForm()); @@ -858,7 +882,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } case this.viewTypeEnum.Validation:{ - + // fieldForm.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Validation) // fieldForm.addControl('data', new ValidationDataEditorModel().buildForm()); @@ -874,9 +898,10 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } (this.form.get('fields')).push(new FieldEditorModel().fromModel(field).buildForm()); + this.inputs.init(); // fieldForm.get('viewStyle').get('renderStyle').updateValueAndValidity(); // fieldForm.get('data').updateValueAndValidity(); - + } @@ -930,7 +955,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i // private _atLeastOneElementListValidator(arrayToCheck): ValidatorFn{ // return (control: AbstractControl): ValidationErrors | null=>{ - + // const fa = control.get(arrayToCheck) as FormArray; // if(fa.length === 0){ @@ -948,6 +973,37 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i return {'width':width+'em'} } + + get fieldsArray(): FormArray { + if(this.form && this.form.get('fields')) { + return this.form.get('fields') as FormArray; + } + return null; + } + + move(index, direction: "up" | "down" = "up") { + this.inputs.init(); + if (direction === "up" && this.canGoUp(index)) { + let temp = this.fieldsArray.at(index); + this.fieldsArray.removeAt(index); + this.fieldsArray.insert(index-1, temp); + } else if (direction === "down" && this.canGoDown(index)) { + let temp = this.fieldsArray.at(index+1); + this.fieldsArray.removeAt(index+1); + this.fieldsArray.insert(index, temp); + } + this.fieldsArray.controls.forEach((field, index) => { + field.get('ordinal').setValue(index); + }); + } + + canGoUp(index: number): boolean { + return index > 0; + } + + canGoDown(index: number): boolean { + return index < (this.fieldsArray.length - 1); + } } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html index 63a60bf65..7a82c2b48 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.html @@ -1,8 +1,9 @@ -
    -
    +
    + +
    • @@ -12,7 +13,7 @@ -
    • +
    • delete
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts index 6dbf3db7e..5d1d9a30d 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.ts @@ -274,7 +274,7 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements private _formChangesSubscription:Subscription; - private _showPreview: boolean = false;; + private _showPreview: boolean = false; // get showPreview(): boolean{ @@ -801,12 +801,7 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements get isRequired(){ let validationsControl = this.form.get('validations') as FormControl; let validations: Array = validationsControl.value; - - if(validations.includes(ValidationType.Required)){ - return true; - } - return false; - + return validations.includes(ValidationType.Required); } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index e5fb0b33b..cd4385d16 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -311,14 +311,14 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent }, 400); // this._initializeFormValidity(tocentries); - //Checking invalid visibilty RULES + //Checking invalid visibilty RULES const fieldsetEntries = this._getAllFieldSets(this.toCEntries); const fieldSetHavingInvalidVisibilityRules:ToCEntry[] = fieldsetEntries .filter(entry=>{ const fieldsFormGroup = entry.form.get('fields'); const invalid = (fieldsFormGroup as FormArray).controls.filter(field=>{ return this.hasInvalidVisibilityRule(field as FormGroup); - + }); if(invalid && invalid.length){ return true; @@ -342,7 +342,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent if(confirm){ this.removeFieldSetVisibilityRules(fieldSetHavingInvalidVisibilityRules); this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-PROFILE-EDITOR.ERRORS.INVALID-VISIBILITY-RULES.REMOVE-SUCCESS'), SnackBarNotificationLevel.Success); - + }else{ console.log('User not confirmed'); } @@ -393,7 +393,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent return true; } return false; - + }catch{ return false; } @@ -1227,7 +1227,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent //in case selectedtocentrhy is child of the removed element // this.refreshToCEntries(); - this.onDataNeedsRefresh(); + this.onDataNeedsRefresh(); this.form.updateValueAndValidity(); } diff --git a/dmp-frontend/src/app/ui/transition-group/transition-group-item.directive.ts b/dmp-frontend/src/app/ui/transition-group/transition-group-item.directive.ts new file mode 100644 index 000000000..a9b08f970 --- /dev/null +++ b/dmp-frontend/src/app/ui/transition-group/transition-group-item.directive.ts @@ -0,0 +1,16 @@ +import {Directive, ElementRef} from "@angular/core"; + +@Directive({ + selector: '[transition-group-item]' +}) +export class TransitionGroupItemDirective { + prevPos: any; + newPos: any; + el: HTMLElement; + moved: boolean; + moveCallback: any; + + constructor(elRef: ElementRef) { + this.el = elRef.nativeElement; + } +} diff --git a/dmp-frontend/src/app/ui/transition-group/transition-group.component.ts b/dmp-frontend/src/app/ui/transition-group/transition-group.component.ts new file mode 100644 index 000000000..62d89b8e1 --- /dev/null +++ b/dmp-frontend/src/app/ui/transition-group/transition-group.component.ts @@ -0,0 +1,106 @@ +import {TransitionGroupItemDirective} from "./transition-group-item.directive"; +import {AfterViewInit, Component, ContentChildren, Input, OnDestroy, QueryList} from "@angular/core"; +import {Subscription} from "rxjs"; +import Timeout = NodeJS.Timeout; + +@Component({ + selector: '[transition-group]', + template: '' +}) +export class TransitionGroupComponent implements AfterViewInit, OnDestroy { + @ContentChildren(TransitionGroupItemDirective) items: QueryList; + private subscription: Subscription; + private timeout: Timeout; + + ngAfterViewInit() { + this.init(); + this.subscription = this.items.changes.subscribe(items => { + items.forEach(item => item.prevPos = item.newPos || item.prevPos); + items.forEach(this.runCallback); + this.refreshPosition('newPos'); + items.forEach(item => item.prevPos = item.prevPos || item.newPos); // for new items + + const animate = () => { + items.forEach(this.applyTranslation); + this['_forceReflow'] = document.body.offsetHeight; // force reflow to put everything in position + this.items.forEach(this.runTransition.bind(this)); + } + + const willMoveSome = items.some((item) => { + const dx = item.prevPos.left - item.newPos.left; + const dy = item.prevPos.top - item.newPos.top; + return dx || dy; + }); + + if (willMoveSome) { + animate(); + } else { + setTimeout(() => { // for removed items + this.refreshPosition('newPos'); + animate(); + }, 0); + } + }); + } + + ngOnDestroy() { + this.clear(); + if (this.subscription) { + this.subscription.unsubscribe(); + } + } + + clear() { + if (this.timeout) { + clearTimeout(this.timeout); + } + } + + init() { + this.clear(); + this.refreshPosition('prevPos'); + this.refreshPosition('newPos'); + } + + runCallback(item: TransitionGroupItemDirective) { + if (item.moveCallback) { + item.moveCallback(); + } + } + + runTransition(item: TransitionGroupItemDirective) { + if (!item.moved) { + return; + } + const cssClass = 'list-move'; + let el = item.el; + let style: any = el.style; + el.classList.add(cssClass); + style.transform = style.WebkitTransform = style.transitionDuration = ''; + el.addEventListener('transitionend', item.moveCallback = (e: any) => { + if (!e || /transform$/.test(e.propertyName)) { + el.removeEventListener('transitionend', item.moveCallback); + item.moveCallback = null; + el.classList.remove(cssClass); + } + }); + } + + refreshPosition(prop: string) { + this.items.forEach(item => { + item[prop] = item.el.getBoundingClientRect(); + }); + } + + applyTranslation(item: TransitionGroupItemDirective) { + item.moved = false; + const dx = item.prevPos.left - item.newPos.left; + const dy = item.prevPos.top - item.newPos.top; + if (dx || dy) { + item.moved = true; + let style: any = item.el.style; + style.transform = style.WebkitTransform = 'translate(' + dx + 'px,' + dy + 'px)'; + style.transitionDuration = '0s'; + } + } +} diff --git a/dmp-frontend/src/app/ui/transition-group/transition-group.module.ts b/dmp-frontend/src/app/ui/transition-group/transition-group.module.ts new file mode 100644 index 000000000..a1d3d0cd9 --- /dev/null +++ b/dmp-frontend/src/app/ui/transition-group/transition-group.module.ts @@ -0,0 +1,13 @@ +import {NgModule} from "@angular/core"; +import {CommonModule} from "@angular/common"; +import {TransitionGroupItemDirective} from "./transition-group-item.directive"; +import {TransitionGroupComponent} from "./transition-group.component"; + +@NgModule({ + declarations: [TransitionGroupItemDirective, TransitionGroupComponent], + imports: [CommonModule], + exports: [TransitionGroupItemDirective, TransitionGroupComponent] +}) +export class TransitionGroupModule { + +} diff --git a/dmp-frontend/src/assets/config/config.json b/dmp-frontend/src/assets/config/config.json index ea878f347..35b504a22 100644 --- a/dmp-frontend/src/assets/config/config.json +++ b/dmp-frontend/src/assets/config/config.json @@ -10,7 +10,7 @@ "loginProviders": { "enabled": [1, 2, 3, 4, 5, 6, 7, 8], "facebookConfiguration": { "clientId": "" }, - "googleConfiguration": { "clientId": "" }, + "googleConfiguration": { "clientId": "524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com" }, "linkedInConfiguration": { "clientId": "", "oauthUrl": "https://www.linkedin.com/oauth/v2/authorization", diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 3a96f16ce..6497a015c 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 9d7750272..a146bbf73 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Make Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index b8758d2a8..ec066abf0 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index bc4ca2531..ae060c04e 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 684c00bcf..b6fefd66c 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Adione Questão Condicionada", "DELETE-INPUT": "Eliminar este input", "PREVIEW": "Pré-visualização", - "NOT-INITIALIZED": "Ainda não iniciado" + "NOT-INITIALIZED": "Ainda não iniciado", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Adicionar novo input", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index 10090dbaa..19d26b22c 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 60a55825e..3627e2048 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 9bc8613bd..eea5922d5 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -533,7 +533,9 @@ "ADD-VISIBILITY-RULE": "Add Conditional Question", "DELETE-INPUT": "Delete this input", "PREVIEW": "Preview", - "NOT-INITIALIZED": "Not initialized yet" + "NOT-INITIALIZED": "Not initialized yet", + "MOVE-UP": "Move this input above", + "MOVE-DOWN": "Move this input below" }, "FIELDSET": { "ADD-INPUT": "Add input", diff --git a/dmp-frontend/src/styles.scss b/dmp-frontend/src/styles.scss index b57d42eba..bd009402b 100644 --- a/dmp-frontend/src/styles.scss +++ b/dmp-frontend/src/styles.scss @@ -296,3 +296,8 @@ border: 1px solid #f44336 !important; } // end of CSS for (@kolkov/angular-editor) + +/* Transition Group */ +.list-move { + transition: transform 1s; +} From 81a5964a553d3be31e1eaaef264784eeb7257cec Mon Sep 17 00:00:00 2001 From: "k.triantafyllou" Date: Tue, 19 Oct 2021 11:50:24 +0300 Subject: [PATCH 107/156] Remove google client id, commited by mistake --- dmp-frontend/src/assets/config/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-frontend/src/assets/config/config.json b/dmp-frontend/src/assets/config/config.json index 35b504a22..ea878f347 100644 --- a/dmp-frontend/src/assets/config/config.json +++ b/dmp-frontend/src/assets/config/config.json @@ -10,7 +10,7 @@ "loginProviders": { "enabled": [1, 2, 3, 4, 5, 6, 7, 8], "facebookConfiguration": { "clientId": "" }, - "googleConfiguration": { "clientId": "524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com" }, + "googleConfiguration": { "clientId": "" }, "linkedInConfiguration": { "clientId": "", "oauthUrl": "https://www.linkedin.com/oauth/v2/authorization", From 35c4ec821e600b0d2264a5cf378753551af7ff80 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 20 Oct 2021 12:40:44 +0300 Subject: [PATCH 108/156] Add a special query logic with group by and count --- .../QueryableHibernateList.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index a347e3a2b..75cad534f 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -164,8 +164,16 @@ public class QueryableHibernateList implements QueryableLi if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); else criteriaQuery.select(criteriaBuilder.count(this.root)); criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.groupings.isEmpty()) criteriaQuery.groupBy(this.generateGroupPredicates(this.groupings, this.root)); //if (distinct) criteriaQuery.distinct(true); - return this.manager.createQuery(criteriaQuery).getSingleResult(); + + //GK: Group By special case. When group by is used, since it will result in a list of how many elements have the grouped field common + // then it will instead return the number of the distinct values of the grouped field + if (this.groupings.isEmpty()) { + return this.manager.createQuery(criteriaQuery).getSingleResult(); + } else { + return (long) this.manager.createQuery(criteriaQuery).getResultList().size(); + } } @Async @@ -176,8 +184,15 @@ public class QueryableHibernateList implements QueryableLi if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); else criteriaQuery.select(criteriaBuilder.count(this.root)); criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.groupings.isEmpty()) criteriaQuery.groupBy(this.generateGroupPredicates(this.groupings, this.root)); //if (distinct) criteriaQuery.distinct(true); - return CompletableFuture.supplyAsync(() -> this.manager.createQuery(criteriaQuery).getSingleResult()); + return CompletableFuture.supplyAsync(() -> { + if (this.groupings.isEmpty()) { + return this.manager.createQuery(criteriaQuery).getSingleResult(); + } else { + return (long) this.manager.createQuery(criteriaQuery).getResultList().size(); + } + }); } From e66362ec384964608bb900800675e387ea7a7fd6 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 20 Oct 2021 12:42:08 +0300 Subject: [PATCH 109/156] Add prometheus metric for the number of grants used based on DMP status (ref #6462) --- .../eudat/logic/managers/MetricsManager.java | 32 +++++++++++++++++++ .../main/java/eu/eudat/types/MetricNames.java | 1 + 2 files changed, 33 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 952e6a248..77e7351aa 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -94,6 +94,8 @@ public class MetricsManager { {MetricNames.LANGUAGES, Gauge.build().name(MetricNames.LANGUAGES).help("Number of Languages").register(registry.getPrometheusRegistry())}, + {MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them").labelNames("status").register(registry.getPrometheusRegistry())} + }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); } @@ -108,6 +110,11 @@ public class MetricsManager { calculateValue(MetricNames.DMP, (int) countAllPublishedDMPs(), MetricNames.PUBLISHED); calculateValue(MetricNames.DMP, (int) countAllDoiedDMPs(), MetricNames.DOIED); + calculateValue(MetricNames.DMP_WITH_GRANT, (int) countAllDraftDMPsWithGrantId(), MetricNames.DRAFT); + calculateValue(MetricNames.DMP_WITH_GRANT, (int) countAllFinalizedDMPsWithGrantId(), MetricNames.FINALIZED); + calculateValue(MetricNames.DMP_WITH_GRANT, (int) countAllPublishedDMPsWithGrantId(), MetricNames.PUBLISHED); + calculateValue(MetricNames.DMP_WITH_GRANT, (int) countAllDoiedDMPsWithGrantId(), MetricNames.DOIED); + calculateValue(MetricNames.FUNDERS, (int) countAllFunders(), null); calculateValue(MetricNames.GRANTS, (int) countAllGrants(), null); calculateValue(MetricNames.PROJECT, (int) countAllProjects(), null); @@ -156,6 +163,31 @@ public class MetricsManager { return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).count(); } + private long countAllDraftDMPsWithGrantId() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setStatus(0); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).groupBy((builder, root) -> root.get("grant")).count(); + } + + private long countAllFinalizedDMPsWithGrantId() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setStatus(1); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).groupBy((builder, root) -> root.get("grant")).count(); + } + + private long countAllPublishedDMPsWithGrantId() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setIsPublic(true); + criteria.setOnlyPublic(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).groupBy((builder, root) -> root.get("grant")).count(); + } + + private long countAllDoiedDMPsWithGrantId() { + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setHasDoi(true); + return apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria).groupBy((builder, root) -> root.get("grant")).count(); + } + private long countAllResearchers() { ResearcherCriteria criteria = new ResearcherCriteria(); return apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().getWithCriteria(criteria).count(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java index 5e55d702d..909c59012 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java +++ b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java @@ -10,6 +10,7 @@ public class MetricNames { public static final String FUNDERS = "argos_funders"; public static final String GRANTS = "argos_grants"; public static final String LANGUAGES = "argos_languages"; + public static final String DMP_WITH_GRANT = "argos_managed_dmps_with_grantid"; public static final String DRAFT = "draft"; public static final String FINALIZED = "finalized"; public static final String PUBLISHED = "published"; From ae0618d5bec36ed9cb4ef4740acbced950d1c38c Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 20 Oct 2021 13:41:04 +0300 Subject: [PATCH 110/156] Fix multiplicty bug on Admin Template Editor. --- ...file-editor-composite-field.component.html | 2 +- ...rofile-editor-composite-field.component.ts | 31 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html index 3604c017b..188936b9c 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html @@ -379,7 +379,7 @@ {{'DATASET-PROFILE-EDITOR.ACTIONS.FIELDSET.COMMENT-FIELD' | translate}}
  • - + {{'DATASET-PROFILE-EDITOR.ACTIONS.FIELDSET.MULTIPLICITY' | translate}}
  • diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts index 89dead325..d8ff4acb7 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, OnChanges, OnInit, ViewChild} from '@angular/core'; +import {Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core'; import {AbstractControl, FormArray, FormControl, FormGroup} from '@angular/forms'; import {FieldEditorModel} from '../../../admin/field-editor-model'; import {Guid} from '@common/types/guid'; @@ -118,6 +118,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i private myCustomValidators:EditorCustomValidators = new EditorCustomValidators(); + isMultiplicityEnabled = false; constructor( private dialog: MatDialog, private language: TranslateService, @@ -127,11 +128,21 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i super(); } - ngOnChanges(){ + ngOnChanges(changes: SimpleChanges){ // this.setTargetField(null); // this.showExtendedDescription = !!this.form.get('extendedDescription').value; // this.showAdditionalInfo = !!this.form.get('additionalInformation').value; - console.log(this.form.get('fields')['controls']) + // console.log(this.form.get('fields')['controls']) + if( changes['form']){ + + try{ + const multiplicity = this.form.get('multiplicity').value; + this.isMultiplicityEnabled = multiplicity.min > 0 || multiplicity.max >0; + } catch{ + this.isMultiplicityEnabled = false; + } + } + } get firstField(){ @@ -142,17 +153,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } } - get isMultiplicityEnabled(){ - if(!this.form.get('multiplicity')){ - return false; - } - - if (this.form.get('multiplicity').value.min > 0 || this.form.get('multiplicity').value.max > 0) { - return true; - } - - return false; - } + ngOnInit() { @@ -381,7 +382,6 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i } onIsMultiplicityEnabledChange(isMultiplicityEnabled: MatCheckboxChange) { - const multiplicity = this.form.get('multiplicity') as FormGroup; const minControl = multiplicity.get('min'); @@ -395,6 +395,7 @@ export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent i maxControl.setValue(0); } + this.isMultiplicityEnabled = isMultiplicityEnabled.checked; minControl.updateValueAndValidity(); maxControl.updateValueAndValidity(); From 2c294695902ca32e2fdd6233fab5bce9ccb81275 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 25 Oct 2021 16:06:08 +0300 Subject: [PATCH 111/156] Allow to configure the path of the email templates (ref #7122) --- .../services/utilities/ConfirmationEmailServiceImpl.java | 4 ++-- .../logic/services/utilities/InvitationServiceImpl.java | 2 +- .../src/main/resources/config/application-devel.properties | 5 +++++ .../web/src/main/resources/config/application.properties | 5 +++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java index 61ced9d27..f089d15c0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java @@ -61,7 +61,7 @@ public class ConfirmationEmailServiceImpl implements ConfirmationEmailService { } private String createContent(UUID confirmationToken, MailService mailService) { - String content = mailService.getMailTemplateContent("classpath:templates/email/emailConfirmation.html"); + String content = mailService.getMailTemplateContent(this.environment.getProperty("email.confirmation")); content = content.replace("{confirmationToken}", confirmationToken.toString()); content = content.replace("{expiration_time}", secondsToTime(Integer.parseInt(this.environment.getProperty("conf_email.expiration_time_seconds")))); content = content.replace("{host}", this.environment.getProperty("dmp.domain")); @@ -85,7 +85,7 @@ public class ConfirmationEmailServiceImpl implements ConfirmationEmailService { } private String createMergeContent(UUID confirmationToken, MailService mailService, String userName) { - String content = mailService.getMailTemplateContent("classpath:templates/email/emailMergeConfirmation.html"); + String content = mailService.getMailTemplateContent(this.environment.getProperty("email.merge")); content = content.replace("{userName}", userName); content = content.replace("{confirmationToken}", confirmationToken.toString()); content = content.replace("{expiration_time}", secondsToTime(Integer.parseInt(this.environment.getProperty("conf_email.expiration_time_seconds")))); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java index d2d893470..1fdca59fb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java @@ -80,7 +80,7 @@ public class InvitationServiceImpl implements InvitationService { return CompletableFuture.runAsync(() -> { SimpleMail mail = new SimpleMail(); mail.setSubject(createSubject(dmp, mailService.getMailTemplateSubject())); - mail.setContent(createContent(invitation.getId(), dmp, recipient, mailService.getMailTemplateContent("classpath:templates/email/email.html"), role)); + mail.setContent(createContent(invitation.getId(), dmp, recipient, mailService.getMailTemplateContent(this.environment.getProperty("email.invite")), role)); mail.setTo(invitation.getInvitationEmail()); try { mailService.sendSimpleMail(mail); diff --git a/dmp-backend/web/src/main/resources/config/application-devel.properties b/dmp-backend/web/src/main/resources/config/application-devel.properties index 599d404c3..9b70fe237 100644 --- a/dmp-backend/web/src/main/resources/config/application-devel.properties +++ b/dmp-backend/web/src/main/resources/config/application-devel.properties @@ -27,6 +27,11 @@ configuration.rda=RDACommonStandards.txt configuration.h2020template=documents/h2020.docx configuration.configurable_login_providers=configurableLoginProviders.json +####################EMAIL FILE TEMPLATES OVERRIDES CONFIGURATIONS########## +email.invite=classpath:templates/email/email.html +email.confirmation=classpath:templates/email/emailConfirmation.html +email.merge=classpath:templates/email/emailMergeConfirmation.html + #############FACEBOOK LOGIN CONFIGURATIONS######### facebook.login.clientId= facebook.login.clientSecret= diff --git a/dmp-backend/web/src/main/resources/config/application.properties b/dmp-backend/web/src/main/resources/config/application.properties index 1103dca16..7eda52fd3 100644 --- a/dmp-backend/web/src/main/resources/config/application.properties +++ b/dmp-backend/web/src/main/resources/config/application.properties @@ -39,6 +39,11 @@ configuration.rda=RDACommonStandards.txt configuration.h2020template=documents/h2020.docx configuration.configurable_login_providers=ConfigurableLoginProviders.json +####################EMAIL FILE TEMPLATES OVERRIDES CONFIGURATIONS########## +email.invite=file:templates/email/email.html +email.confirmation=file:templates/email/emailConfirmation.html +email.merge=file:templates/email/emailMergeConfirmation.html + #############LOGIN CONFIGURATIONS######### #############GENERIC LOGIN CONFIGURATIONS######### autouser.root.email= From 93baa4a2814bca6fbe3dd36d233e622b90caad28 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 26 Oct 2021 16:21:28 +0300 Subject: [PATCH 112/156] Add support for more html tags on the Document/PDF exporter --- .../documents/word/HtmlToWorldBuilder.java | 149 +++++++++++++++--- 1 file changed, 130 insertions(+), 19 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java index ddcba3bca..6506b5418 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java @@ -8,33 +8,27 @@ import org.jsoup.nodes.TextNode; import org.jsoup.select.Elements; import org.jsoup.select.NodeTraversor; import org.jsoup.select.NodeVisitor; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHighlightColor; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; -import java.util.LinkedHashMap; -import java.util.Map; +import java.math.BigInteger; +import java.util.*; public class HtmlToWorldBuilder implements NodeVisitor { private final Map properties = new LinkedHashMap<>(); - private final XWPFParagraph paragraph; + private XWPFParagraph paragraph; private XWPFRun run; private Boolean dumpRun; private final String identation; private Boolean isIdentationUsed; + private XWPFNumbering numbering; + private Queue abstractNumId; + private BigInteger numberingLevel; public static void convert(XWPFDocument document, Document htmlDocument, String identation) { - Elements htmlParagraphs = htmlDocument.select("p"); - if (!htmlParagraphs.isEmpty()) { - for (Element htmlParagraph : htmlParagraphs) { - XWPFParagraph paragraph = document.createParagraph(); - HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); - NodeTraversor.traverse(htmlToWorldBuilder, htmlParagraph); - } - } else { - XWPFParagraph paragraph = document.createParagraph(); - HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); - NodeTraversor.traverse(htmlToWorldBuilder, htmlDocument); - } + XWPFParagraph paragraph = document.createParagraph(); + HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); + NodeTraversor.traverse(htmlToWorldBuilder, htmlDocument); } public HtmlToWorldBuilder(XWPFParagraph paragraph, String identation) { @@ -44,6 +38,8 @@ public class HtmlToWorldBuilder implements NodeVisitor { this.identation = identation; this.isIdentationUsed = false; this.run.setFontSize(11); + this.abstractNumId = new ArrayDeque<>(); + this.numberingLevel = BigInteger.valueOf(-1); } @Override @@ -62,11 +58,11 @@ public class HtmlToWorldBuilder implements NodeVisitor { this.run.setFontSize(11); this.dumpRun = false; } - parseProperties(); + parseProperties(node); properties.clear(); } - private void parseProperties() { + private void parseProperties(Node node) { properties.entrySet().forEach(stringBooleanEntry -> { switch (stringBooleanEntry.getKey()) { case "i" : @@ -85,6 +81,9 @@ public class HtmlToWorldBuilder implements NodeVisitor { this.run.setFontSize(stringBooleanEntry.getValue() ? 8 : 11); break; case "del": + case "strike": + case "strikethrough": + case "s": this.run.setStrikeThrough(stringBooleanEntry.getValue()); break; case "mark": @@ -96,6 +95,75 @@ public class HtmlToWorldBuilder implements NodeVisitor { case "sup": this.run.setSubscript(stringBooleanEntry.getValue() ? VerticalAlign.SUPERSCRIPT : VerticalAlign.BASELINE); break; + case "div": + case "p": + this.paragraph = this.paragraph.getDocument().createParagraph(); + this.run = this.paragraph.createRun(); + if (stringBooleanEntry.getValue()) { + if (node.hasAttr("align")) { + String alignment = node.attr("align"); + this.paragraph.setAlignment(ParagraphAlignment.valueOf(alignment.toUpperCase(Locale.ROOT))); + } + } + break; + case "blockquote": + this.paragraph = this.paragraph.getDocument().createParagraph(); + this.run = this.paragraph.createRun(); + if (stringBooleanEntry.getValue()) { + this.paragraph.setIndentationLeft(720); + } + break; + case "ul": + if (stringBooleanEntry.getValue()) { + createNumbering(STNumberFormat.BULLET); + } else { + this.paragraph = this.paragraph.getDocument().createParagraph(); + this.run = this.paragraph.createRun(); + this.numberingLevel = this.numberingLevel.subtract(BigInteger.ONE); + ((ArrayDeque)this.abstractNumId).removeLast(); + } + break; + case "ol": + if (stringBooleanEntry.getValue()) { + createNumbering(STNumberFormat.DECIMAL); + } else { + this.paragraph = this.paragraph.getDocument().createParagraph(); + this.run = this.paragraph.createRun(); + this.numberingLevel = this.numberingLevel.subtract(BigInteger.ONE); + ((ArrayDeque)this.abstractNumId).removeLast(); + } + break; + case "li": + if (stringBooleanEntry.getValue()) { + this.paragraph = this.paragraph.getDocument().createParagraph(); + this.paragraph.setIndentationLeft(720 * numberingLevel.intValue()); + this.run = this.paragraph.createRun(); + this.paragraph.setNumID(((ArrayDeque)abstractNumId).getLast()); + } + break; + case "font": + if (stringBooleanEntry.getValue()) { + if (node.hasAttr("color")) { + this.run.setColor(node.attr("color").substring(1)); + } + } else { + this.run.setColor("000000"); + } + break; + case "a": + if (stringBooleanEntry.getValue()) { + if (node.hasAttr("href")) { + this.run = createHyperLinkRun(node.attr("href")); + this.run.setColor("0000FF"); + this.run.setUnderline(UnderlinePatterns.SINGLE); + } + } else { + this.run = paragraph.createRun(); + } + break; + case "br": + this.run.addCarriageReturn(); + break; } }); } @@ -104,7 +172,50 @@ public class HtmlToWorldBuilder implements NodeVisitor { public void tail(Node node, int i) { String name = node.nodeName(); properties.put(name, false); - parseProperties(); + parseProperties(node); properties.clear(); } + + //GK: This function creates one numbering.xml for the word document and adds a specific format. + //It imitates the numbering.xml that is usually generated by word editors like LibreOffice + private void createNumbering(STNumberFormat.Enum format) { + CTAbstractNum ctAbstractNum = CTAbstractNum.Factory.newInstance(); + if (this.numbering == null) this.numbering = this.paragraph.getDocument().createNumbering(); + BigInteger tempNumId = BigInteger.ONE; + boolean found = false; + while (!found) { + Object o = numbering.getAbstractNum(tempNumId); + found = (o == null); + if (!found) tempNumId = tempNumId.add(BigInteger.ONE); + } + ctAbstractNum.setAbstractNumId(tempNumId); + CTLvl ctLvl = ctAbstractNum.addNewLvl(); + this.numberingLevel = numberingLevel.add(BigInteger.ONE); + ctLvl.setIlvl(numberingLevel); + ctLvl.addNewNumFmt().setVal(format); + ctLvl.addNewStart().setVal(BigInteger.ONE); + if (format == STNumberFormat.BULLET) { + ctLvl.addNewLvlText().setVal("\u2022"); + } else { + ctLvl.addNewLvlText().setVal("%1."); + } + XWPFAbstractNum xwpfAbstractNum = new XWPFAbstractNum(ctAbstractNum); + + this.abstractNumId.add(this.numbering.addAbstractNum(xwpfAbstractNum)); + this.numbering.addNum(((ArrayDeque)abstractNumId).getLast()); + } + + private XWPFHyperlinkRun createHyperLinkRun(String uri) { + String rId = this.paragraph.getDocument().getPackagePart().addExternalRelationship(uri, XWPFRelation.HYPERLINK.getRelation()).getId(); + + CTHyperlink cthyperLink=paragraph.getCTP().addNewHyperlink(); + cthyperLink.setId(rId); + cthyperLink.addNewR(); + + return new XWPFHyperlinkRun( + cthyperLink, + cthyperLink.getRArray(0), + paragraph + ); + } } From 900a377d5f03b6bc7d99191f8fe92c8fc4ae7c1c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 26 Oct 2021 17:54:58 +0300 Subject: [PATCH 113/156] Fix critical issue with RDA Comoon Standard text load --- .../logic/proxy/config/configloaders/DefaultConfigLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java index 5c41211a6..9c1eca88c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DefaultConfigLoader.java @@ -67,7 +67,7 @@ public class DefaultConfigLoader implements ConfigLoader { BufferedReader reader; List rdaList = new LinkedList<>(); try { - reader = new BufferedReader(new FileReader(getClass().getClassLoader().getResource(filePath).getFile())); + reader = new BufferedReader(new InputStreamReader(getStreamFromPath(filePath))); String line = reader.readLine(); while (line != null) { rdaList.add(line); From fd26e2a74289affd8cbaa0f7db8a07f72fefef28 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 27 Oct 2021 18:16:44 +0300 Subject: [PATCH 114/156] Fix issue with DMP index not updating after a new user is invited --- .../eudat/controllers/UserInvitationController.java | 3 ++- .../logic/managers/DataManagementPlanManager.java | 2 +- .../eu/eudat/logic/managers/InvitationsManager.java | 11 +++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java index ecb46650e..c751742f2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java @@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.xml.bind.JAXBException; +import java.io.IOException; import java.util.List; import java.util.UUID; @@ -42,7 +43,7 @@ public class UserInvitationController extends BaseController { @Transactional @RequestMapping(method = RequestMethod.GET, value = {"/exchange/{invitationID}"}, produces = "application/json") public @ResponseBody - ResponseEntity> exchange(@PathVariable UUID invitationID, Principal principal) throws JAXBException { + ResponseEntity> exchange(@PathVariable UUID invitationID, Principal principal) throws JAXBException, IOException { UUID dmpId = invitationsManager.assignUserAcceptedInvitation(invitationID, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).payload(dmpId)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 4061e0e2c..10113c819 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1843,7 +1843,7 @@ public class DataManagementPlanManager { }); } - private void updateIndex(DMP dmp) throws IOException { + public void updateIndex(DMP dmp) throws IOException { DmpMapper mapper = new DmpMapper(apiContext, datasetManager); Dmp elastic = mapper.toElastic(dmp); apiContext.getOperationsContext().getElasticRepository().getDmpRepository().createOrUpdate(elastic); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java index 25a660855..9c9e30537 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Component; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; +import java.io.IOException; import java.io.StringReader; import java.util.*; import java.util.stream.Collectors; @@ -26,10 +27,12 @@ import java.util.stream.Stream; public class InvitationsManager { private ApiContext apiContext; + private DataManagementPlanManager dataManagementPlanManager; @Autowired - public InvitationsManager(ApiContext apiContext) { + public InvitationsManager(ApiContext apiContext, DataManagementPlanManager dataManagementPlanManager) { this.apiContext = apiContext; + this.dataManagementPlanManager = dataManagementPlanManager; } public void inviteUsers(Invitation invitation, Principal principal) throws Exception { @@ -79,7 +82,7 @@ public class InvitationsManager { return userModels; } - public UUID assignUserAcceptedInvitation(UUID invitationID, Principal principal) throws UnauthorisedException, JAXBException { + public UUID assignUserAcceptedInvitation(UUID invitationID, Principal principal) throws UnauthorisedException, JAXBException, IOException { eu.eudat.data.entities.Invitation invitation = apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().find(invitationID); if (invitation == null) throw new UnauthorisedException("There is no Data Management Plan assigned to this Link"); @@ -98,6 +101,8 @@ public class InvitationsManager { apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), existingUserDMP, datamanagementPlan); invitation.setAcceptedInvitation(true); apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); + datamanagementPlan.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), datamanagementPlan.getId())).toList())); + dataManagementPlanManager.updateIndex(datamanagementPlan); return datamanagementPlan.getId(); } } else { @@ -121,6 +126,8 @@ public class InvitationsManager { apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), userDMP, datamanagementPlan); invitation.setAcceptedInvitation(true); apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); + datamanagementPlan.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), datamanagementPlan.getId())).toList())); + dataManagementPlanManager.updateIndex(datamanagementPlan); return datamanagementPlan.getId(); } return invitation.getDmp().getId(); From 5a66754cbdb30d345f386491ea71e90cd248508c Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 29 Oct 2021 15:08:58 +0300 Subject: [PATCH 115/156] Make DMP language Mandatory and set default language to English --- .../main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java | 6 +++--- .../dmp/editor/general-tab/extra-properties-form.model.ts | 4 ++-- .../app/ui/dmp/editor/main-info/main-info.component.html | 4 ++-- .../src/app/ui/dmp/editor/main-info/main-info.component.ts | 3 +++ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 84799b0f3..5a3574a33 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -39,9 +39,9 @@ public class DmpRDAMapper { throw new IllegalArgumentException("DMP is missing language and contact properties"); } else { extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap(); - if (extraProperties.get("language") == null) { + /*if (extraProperties.get("language") == null) { throw new IllegalArgumentException("DMP must have it's language property defined"); - } + }*/ if (extraProperties.get("contact") == null) { throw new IllegalArgumentException("DMP must have it's contact property defined"); } @@ -72,7 +72,7 @@ public class DmpRDAMapper { } else { rda.setEthicalIssuesExist(Dmp.EthicalIssuesExist.UNKNOWN); } - rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString())); + rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language") != null ? extraProperties.get("language").toString() : "en")); if (extraProperties.get("costs") != null) { rda.setCost(new ArrayList<>()); ((List) extraProperties.get("costs")).forEach(costl -> { diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts index 6d55a0fd4..061348b2d 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts @@ -55,11 +55,11 @@ export class ExtraPropertiesFormModel { createValidationContext(): ValidationContext { const baseContext: ValidationContext = new ValidationContext(); - baseContext.validation.push({ key: 'language', validators: [BackendErrorValidator(this.validationErrorModel, 'language')] }); + baseContext.validation.push({ key: 'language', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'language')] }); baseContext.validation.push({ key: 'license', validators: [BackendErrorValidator(this.validationErrorModel, 'license')] }); baseContext.validation.push({ key: 'visible', validators: [BackendErrorValidator(this.validationErrorModel, 'visible')] }); baseContext.validation.push({ key: 'publicDate', validators: [BackendErrorValidator(this.validationErrorModel, 'publicDate')] }); - baseContext.validation.push({ key: 'contact', validators: [BackendErrorValidator(this.validationErrorModel, 'contact')] }); + baseContext.validation.push({ key: 'contact', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'contact')] }); baseContext.validation.push({ key: 'costs', validators: [BackendErrorValidator(this.validationErrorModel, 'costs')] }); return baseContext; } diff --git a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html index 29c17b5a0..38fb47a86 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html @@ -34,11 +34,11 @@
    -
    1.3 {{'DMP-EDITOR.FIELDS.LANGUAGE' | translate}}
    +
    1.3 {{'DMP-EDITOR.FIELDS.LANGUAGE' | translate}}*
    {{'DMP-EDITOR.FIELDS.LANGUAGE-HINT' | translate}}
    - + {{ lang.name }} diff --git a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.ts b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.ts index e6c422196..56fedce6f 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.ts @@ -111,6 +111,9 @@ export class MainInfoComponent extends BaseComponent implements OnInit { if (isNullOrUndefined(this.formGroup.get('extraProperties').get('contact').value)) { this.formGroup.get('extraProperties').get('contact').patchValue(associate.id); } + if (isNullOrUndefined(this.formGroup.get('extraProperties').get('language').value)) { + this.formGroup.get('extraProperties').get('language').patchValue('en'); + } } // Researchers From 0010ad846a2ceb7b4cec291ac94b0b452846f253 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 1 Nov 2021 11:39:43 +0200 Subject: [PATCH 116/156] When exporting to word/PDF HTML styled text, it will be preperly indented and it can read the change line character --- .../documents/word/HtmlToWorldBuilder.java | 39 ++++++++++++++----- .../utilities/documents/word/WordBuilder.java | 20 ++-------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java index 6506b5418..dae0c3e2b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java @@ -2,10 +2,8 @@ package eu.eudat.logic.utilities.documents.word; import org.apache.poi.xwpf.usermodel.*; import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; import org.jsoup.nodes.TextNode; -import org.jsoup.select.Elements; import org.jsoup.select.NodeTraversor; import org.jsoup.select.NodeVisitor; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; @@ -19,36 +17,37 @@ public class HtmlToWorldBuilder implements NodeVisitor { private XWPFParagraph paragraph; private XWPFRun run; private Boolean dumpRun; - private final String identation; + private final float indentation; private Boolean isIdentationUsed; private XWPFNumbering numbering; private Queue abstractNumId; private BigInteger numberingLevel; - public static void convert(XWPFDocument document, Document htmlDocument, String identation) { + public static HtmlToWorldBuilder convert(XWPFDocument document, Document htmlDocument, float indentation) { XWPFParagraph paragraph = document.createParagraph(); - HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, identation); + HtmlToWorldBuilder htmlToWorldBuilder = new HtmlToWorldBuilder(paragraph, indentation); NodeTraversor.traverse(htmlToWorldBuilder, htmlDocument); + return htmlToWorldBuilder; } - public HtmlToWorldBuilder(XWPFParagraph paragraph, String identation) { + public HtmlToWorldBuilder(XWPFParagraph paragraph, float indentation) { this.paragraph = paragraph; this.run = this.paragraph.createRun(); this.dumpRun = false; - this.identation = identation; + this.indentation = indentation; this.isIdentationUsed = false; this.run.setFontSize(11); this.abstractNumId = new ArrayDeque<>(); this.numberingLevel = BigInteger.valueOf(-1); + this.setDefaultIndentation(); } @Override public void head(Node node, int i) { String name = node.nodeName(); if (name.equals("#text")) { - String text = !isIdentationUsed ? identation + ((TextNode)node).text() : ((TextNode)node).text(); + String text = ((TextNode)node).text(); this.run.setText(text); - this.isIdentationUsed = true; this.dumpRun = true; } else { properties.put(name, true); @@ -99,6 +98,8 @@ public class HtmlToWorldBuilder implements NodeVisitor { case "p": this.paragraph = this.paragraph.getDocument().createParagraph(); this.run = this.paragraph.createRun(); + this.isIdentationUsed = false; + this.setDefaultIndentation(); if (stringBooleanEntry.getValue()) { if (node.hasAttr("align")) { String alignment = node.attr("align"); @@ -111,6 +112,9 @@ public class HtmlToWorldBuilder implements NodeVisitor { this.run = this.paragraph.createRun(); if (stringBooleanEntry.getValue()) { this.paragraph.setIndentationLeft(720); + } else { + this.isIdentationUsed = false; + this.setDefaultIndentation(); } break; case "ul": @@ -119,6 +123,8 @@ public class HtmlToWorldBuilder implements NodeVisitor { } else { this.paragraph = this.paragraph.getDocument().createParagraph(); this.run = this.paragraph.createRun(); + this.isIdentationUsed = false; + this.setDefaultIndentation(); this.numberingLevel = this.numberingLevel.subtract(BigInteger.ONE); ((ArrayDeque)this.abstractNumId).removeLast(); } @@ -129,6 +135,8 @@ public class HtmlToWorldBuilder implements NodeVisitor { } else { this.paragraph = this.paragraph.getDocument().createParagraph(); this.run = this.paragraph.createRun(); + this.isIdentationUsed = false; + this.setDefaultIndentation(); this.numberingLevel = this.numberingLevel.subtract(BigInteger.ONE); ((ArrayDeque)this.abstractNumId).removeLast(); } @@ -136,7 +144,7 @@ public class HtmlToWorldBuilder implements NodeVisitor { case "li": if (stringBooleanEntry.getValue()) { this.paragraph = this.paragraph.getDocument().createParagraph(); - this.paragraph.setIndentationLeft(720 * numberingLevel.intValue()); + this.paragraph.setIndentationLeft(Math.round(indentation * 720) * (numberingLevel.intValue() + 1)); this.run = this.paragraph.createRun(); this.paragraph.setNumID(((ArrayDeque)abstractNumId).getLast()); } @@ -218,4 +226,15 @@ public class HtmlToWorldBuilder implements NodeVisitor { paragraph ); } + + private void setDefaultIndentation() { + if (!isIdentationUsed) { + this.paragraph.setIndentationLeft(Math.round(indentation * 720.0F)); + this.isIdentationUsed = true; + } + } + + public XWPFParagraph getParagraph() { + return paragraph; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index b5e6816e0..f5d78ba40 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -51,22 +51,10 @@ public class WordBuilder { return paragraph; }); this.options.put(ParagraphStyle.HTML, (mainDocumentPart, item) -> { - /*try { - XWPFHtmlDocument xwpfHtmlDocument = XWPFHtmlDocument.addHtmlDocument(mainDocumentPart); - if (item != null) { - xwpfHtmlDocument.setHtml(item); - } - mainDocumentPart.getDocument().getBody().addNewAltChunk().setId(xwpfHtmlDocument.getId()); - } catch (InvalidFormatException e) { - logger.error(e.getLocalizedMessage(), e); - } - - return null;*/ - XWPFParagraph paragraph = null; - Document htmlDoc = Jsoup.parse(item); - HtmlToWorldBuilder.convert(mainDocumentPart, htmlDoc, " "); - - return paragraph; + Document htmlDoc = Jsoup.parse(item.replaceAll("\n", "
    ")); + HtmlToWorldBuilder htmlToWorldBuilder = HtmlToWorldBuilder.convert(mainDocumentPart, htmlDoc, 0.5F); + htmlToWorldBuilder.getParagraph().setIndentationLeft(0); + return htmlToWorldBuilder.getParagraph(); }); this.options.put(ParagraphStyle.TITLE, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); From 6ff9ea2d05d7262acc395ff8acd6fd36a5185667 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 1 Nov 2021 11:49:20 +0200 Subject: [PATCH 117/156] When exporting to word/PDF HTML styled text, make
    tag to be parsed once --- .../logic/utilities/documents/word/HtmlToWorldBuilder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java index dae0c3e2b..b1a66e9e5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/HtmlToWorldBuilder.java @@ -170,7 +170,9 @@ public class HtmlToWorldBuilder implements NodeVisitor { } break; case "br": - this.run.addCarriageReturn(); + if (stringBooleanEntry.getValue()) { + this.run.addCarriageReturn(); + } break; } }); From 7bdfcb70af6af0214e990040c79978ab423f1552 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Mon, 1 Nov 2021 14:45:02 +0200 Subject: [PATCH 118/156] Created common component for rich text editor configuration & added rich text for dmp and dataset description. 1. library/rich-text-editor: [NEW] Common component which configures a rich text editor. 2. dataset-editor.component.html & main-info.component.html: Use to allow rich text in dataset and dmp description. 3. dataset-overview.component.html & dmp-overview.component.html: Show dataset and dmp description as innerHTML. 4. dataset.module.ts & dmp.module.ts: Imported RichTextEditorModule. --- .../rich-text-editor.component.scss | 45 ++++++++++++++ .../rich-text-editor.component.ts | 58 +++++++++++++++++++ .../rich-text-editor.module.ts | 21 +++++++ .../dataset-editor.component.html | 10 +++- .../src/app/ui/dataset/dataset.module.ts | 4 +- .../overview/dataset-overview.component.html | 2 +- dmp-frontend/src/app/ui/dmp/dmp.module.ts | 4 +- .../editor/main-info/main-info.component.html | 6 +- .../dmp/overview/dmp-overview.component.html | 2 +- 9 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.scss create mode 100644 dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.ts create mode 100644 dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.module.ts diff --git a/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.scss b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.scss new file mode 100644 index 000000000..721812d6a --- /dev/null +++ b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.scss @@ -0,0 +1,45 @@ +::ng-deep .angular-editor-textarea { + min-height: 150px !important; +} + +//.form-field-subscript-wrapper { +// font-size: 75%; +// padding-left: 12px; +// margin-top: 8px; +//} + +.editor-wrapper { + border: 1px solid transparent !important; + border-radius: 5px; +} + +::ng-deep .angular-editor-toolbar { + margin-left: 1px; + margin-right: 1px; +} + +::ng-deep .angular-editor-textarea, ::ng-deep .angular-editor-toolbar { + border: none !important; +} + +::ng-deep .angular-editor { + border: 1px solid #ddd !important; + border-radius: 5px; + background-color: #fff; +} + +.editor-wrapper:hover, ::ng-deep .angular-editor:hover { + border: 1px solid #000 !important; +} + +.editor-wrapper:focus-within, ::ng-deep .angular-editor:focus-within { + border: 1px solid #034459 !important; +} + +.required.editor-wrapper, .required .editor ::ng-deep .angular-editor { + border: 1px solid #f44336 !important; +} + +.full-width { + width: 100%; +} diff --git a/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.ts b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.ts new file mode 100644 index 000000000..0a820532b --- /dev/null +++ b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.component.ts @@ -0,0 +1,58 @@ +import {Component, Input} from "@angular/core"; +import {AngularEditorConfig} from "@kolkov/angular-editor"; + +@Component({ + selector: 'rich-text-editor-component', + template: ` +
    + +
    + `, + styleUrls: ['./rich-text-editor.component.scss'] +}) +export class RichTextEditorComponent { + @Input() parentFormGroup; + @Input() controlName; + @Input() id: string = "editor1"; + @Input() placeholder: string = "Enter text"; + @Input() required: boolean = false; + @Input() wrapperClasses: string = ""; + + editorConfig: AngularEditorConfig = { + editable: true, + spellcheck: true, + height: 'auto', + minHeight: '0', + maxHeight: 'auto', + width: '100%', + minWidth: '0', + translate: 'yes', + enableToolbar: true, + showToolbar: true, + placeholder: '', + defaultParagraphSeparator: '', + defaultFontName: '', + defaultFontSize: '', + sanitize: true, + toolbarPosition: 'top', + toolbarHiddenButtons: [ + [ + 'heading', + 'fontName' + ], + [ + 'fontSize', + 'backgroundColor', + 'customClasses', + 'insertImage', + 'insertVideo', + 'removeFormat', + 'toggleEditorMode' + ] + ] + }; + + constructor() { + } +} diff --git a/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.module.ts b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.module.ts new file mode 100644 index 000000000..a4470d71b --- /dev/null +++ b/dmp-frontend/src/app/library/rich-text-editor/rich-text-editor.module.ts @@ -0,0 +1,21 @@ +import {NgModule} from "@angular/core"; +import {HttpClientModule} from "@angular/common/http"; +import {CommonUiModule} from "@common/ui/common-ui.module"; +import {CommonFormsModule} from "@common/forms/common-forms.module"; +import {AngularEditorModule} from "@kolkov/angular-editor"; +import {RichTextEditorComponent} from "@app/library/rich-text-editor/rich-text-editor.component"; + +@NgModule({ + imports: [ + CommonUiModule, + CommonFormsModule, + HttpClientModule, AngularEditorModule + ], + declarations: [ + RichTextEditorComponent + ], + exports: [ + RichTextEditorComponent + ] +}) +export class RichTextEditorModule { } diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-editor/dataset-editor.component.html b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-editor/dataset-editor.component.html index 30d3ff105..99b1c968e 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-editor/dataset-editor.component.html +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-editor/dataset-editor.component.html @@ -29,11 +29,15 @@ {{'DATASET-EDITOR.FIELDS.DMP' | translate}} {{'DATASET-EDITOR.HINT.TITLE-REST' | translate}} -->
    - - + + +
    {{formGroup.get('description').getError('backendError').message}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} - +
    diff --git a/dmp-frontend/src/app/ui/dataset/dataset.module.ts b/dmp-frontend/src/app/ui/dataset/dataset.module.ts index ec553bef5..9a0d0ee1e 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.module.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.module.ts @@ -27,6 +27,7 @@ import { FormProgressIndicationModule } from '../misc/dataset-description-form/c import { DatasetCopyDialogModule } from './dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module'; import { DatasetCriteriaDialogComponent } from './listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component'; import { DatasetOverviewModule } from './overview/dataset-overview.module'; +import {RichTextEditorModule} from "@app/library/rich-text-editor/rich-text-editor.module"; @NgModule({ imports: [ @@ -45,7 +46,8 @@ import { DatasetOverviewModule } from './overview/dataset-overview.module'; FormValidationErrorsDialogModule, DatasetCopyDialogModule, DatasetOverviewModule, - FormProgressIndicationModule + FormProgressIndicationModule, + RichTextEditorModule ], declarations: [ DatasetListingComponent, diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html index a60513212..2fa0562ca 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -91,7 +91,7 @@
    {{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}}
    -

    {{ dataset.description }}

    +

    horizontal_rule diff --git a/dmp-frontend/src/app/ui/dmp/dmp.module.ts b/dmp-frontend/src/app/ui/dmp/dmp.module.ts index c62ff93dc..01f0355b6 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.module.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.module.ts @@ -49,6 +49,7 @@ import { DmpToDatasetDialogComponent } from './dmp-to-dataset/dmp-to-dataset-dia import { FormProgressIndicationComponent } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.component'; import { FormProgressIndicationModule } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.module'; import { DatasetPreviewDialogComponent } from './dataset-preview/dataset-preview-dialog.component'; +import {RichTextEditorModule} from "@app/library/rich-text-editor/rich-text-editor.module"; @NgModule({ imports: [ @@ -66,7 +67,8 @@ import { DatasetPreviewDialogComponent } from './dataset-preview/dataset-preview DatasetEditorDetailsModule, DatasetDescriptionFormModule, NgxDropzoneModule, - FormProgressIndicationModule + FormProgressIndicationModule, + RichTextEditorModule ], declarations: [ DmpListingComponent, diff --git a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html index 38fb47a86..3f5fa53a7 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/main-info/main-info.component.html @@ -25,9 +25,9 @@
    1.2 {{'DMP-EDITOR.FIELDS.DESCRIPTION' | translate}}
    {{'DMP-EDITOR.FIELDS.DESCRIPTION-HINT' | translate}}
    - - - + +
    diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 5ca21021a..d6ecd837f 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -82,7 +82,7 @@
    {{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}}
    -

    {{ dmp.description }}

    +

    horizontal_rule From 03009edaa3a236e22878caa2c07d28c36514c0a7 Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Mon, 1 Nov 2021 15:10:00 +0200 Subject: [PATCH 119/156] Use when html editor is needed - replace in dataset template descriprion, section & question descriptions. 1. dataset-profile-editor-section.component.html & dataset-profile-editor.component.html & dataset-profile-editor-composite-field.component.html: Replace with (custom common component when rich text editor is set). 2. dataset-profile-editor-section.component.ts & dataset-profile-editor.component.ts & dataset-profile-editor-composite-field.component.ts: Remove AngularEditorConfig (this is set in RichTextEditorComponent). 3. dataset-profile.module.ts: Instead of AngularEditorModule, import RichTextEditorModule (common component where rich text editor is set). 4. styles.scss: Moved css for angular editor to dedicated css file (src/app/library/rich-text-editor/rich-text-editor.component.scss) and keep here only "form-field-subscript-wrapper" class. --- .../dataset-profile/dataset-profile.module.ts | 6 +- ...file-editor-composite-field.component.html | 16 ++--- ...rofile-editor-composite-field.component.ts | 34 --------- ...aset-profile-editor-section.component.html | 7 +- ...ataset-profile-editor-section.component.ts | 34 --------- .../dataset-profile-editor.component.html | 8 +-- .../dataset-profile-editor.component.ts | 36 +--------- dmp-frontend/src/styles.scss | 70 +++++++++---------- 8 files changed, 54 insertions(+), 157 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts index 44a213352..ff0b0b52e 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts @@ -51,9 +51,8 @@ import { DatasetProfileEditorSectionFieldSetComponent } from './editor/component import { ParseStatus } from './listing/pipe/parse-status.pipe'; import { DatasetProfileTableOfContents } from './table-of-contents/table-of-contents'; import { DatasetProfileTableOfContentsInternalSection } from './table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section'; -import {HttpClientModule} from "@angular/common/http"; -import {AngularEditorModule} from "@kolkov/angular-editor"; import {TransitionGroupModule} from "@app/ui/transition-group/transition-group.module"; +import { RichTextEditorModule } from "@app/library/rich-text-editor/rich-text-editor.module"; @@ -72,7 +71,8 @@ import {TransitionGroupModule} from "@app/ui/transition-group/transition-group.m MatBadgeModule, DragulaModule, AutoCompleteModule, - HttpClientModule, AngularEditorModule, TransitionGroupModule, + TransitionGroupModule, + RichTextEditorModule ], declarations: [ DatasetProfileListingComponent, diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html index 188936b9c..434dd727d 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html @@ -78,17 +78,17 @@
    {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.DESCRIPTION' | translate}}
    -
    - -
    + +
    {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.EXTENDED-DESCRIPTION' | translate}}
    -
    - -
    + +
    diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts index d8ff4acb7..4ae05edfc 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.ts @@ -49,7 +49,6 @@ import {Subject} from 'rxjs'; import {debounceTime, delay, map, takeUntil, tap} from 'rxjs/operators'; import {GENERAL_ANIMATIONS} from '../../animations/animations'; import {BaseComponent} from '@common/base/base.component'; -import {AngularEditorConfig} from "@kolkov/angular-editor"; import {TransitionGroupComponent} from "@app/ui/transition-group/transition-group.component"; @Component({ @@ -59,39 +58,6 @@ import {TransitionGroupComponent} from "@app/ui/transition-group/transition-grou animations:[GENERAL_ANIMATIONS] }) export class DatasetProfileEditorCompositeFieldComponent extends BaseComponent implements OnInit, OnChanges { - editorConfig: AngularEditorConfig = { - editable: true, - spellcheck: true, - height: 'auto', - minHeight: '0', - maxHeight: 'auto', - width: '100%', - minWidth: '0', - translate: 'yes', - enableToolbar: true, - showToolbar: true, - placeholder: 'Enter text here...', - defaultParagraphSeparator: '', - defaultFontName: '', - defaultFontSize: '', - sanitize: true, - toolbarPosition: 'top', - toolbarHiddenButtons: [ - [ - 'heading', - 'fontName' - ], - [ - 'fontSize', - 'backgroundColor', - 'customClasses', - 'insertImage', - 'insertVideo', - 'removeFormat'//, - // 'toggleEditorMode' - ] - ] - }; @Input() form: FormGroup; @Input() indexPath: string; diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.html index 4bf4fe5c2..391dd4238 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.html @@ -30,10 +30,9 @@
    {{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION' | translate}}
    {{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION-HINT' | translate}}
    -
    - -
    + +
    {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-DESCRIPTION-HINT'| translate}}
    -
    - -
    + +
    {{'GENERAL.VALIDATION.REQUIRED'| translate}} diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts index cd4385d16..0fc6b11de 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/dataset-profile-editor.component.ts @@ -45,8 +45,6 @@ import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profil import { UserService } from '@app/core/services/user/user.service'; import { MatInput } from '@angular/material/input'; import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component'; -import {AngularEditorConfig} from "@kolkov/angular-editor"; - const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -58,39 +56,6 @@ const skipDisable: any[] = require('../../../../../assets/resources/skipDisable. providers:[VisibilityRulesService] }) export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent implements OnInit { - editorConfig: AngularEditorConfig = { - editable: true, - spellcheck: true, - height: 'auto', - minHeight: '0', - maxHeight: 'auto', - width: '100%', - minWidth: '0', - translate: 'yes', - enableToolbar: true, - showToolbar: true, - placeholder: 'Enter text here...', - defaultParagraphSeparator: '', - defaultFontName: '', - defaultFontSize: '', - sanitize: true, - toolbarPosition: 'top', - toolbarHiddenButtons: [ - [ - 'heading', - 'fontName' - ], - [ - 'fontSize', - 'backgroundColor', - 'customClasses', - 'insertImage', - 'insertVideo', - 'removeFormat', - 'toggleEditorMode' - ] - ] - }; canDeactivate(): boolean { return !this.form.dirty; @@ -378,6 +343,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent const renderStyle = field.get('viewStyle').get('renderStyle').value; if(renderStyle && ![ DatasetProfileFieldViewStyle.TextArea, + DatasetProfileFieldViewStyle.RichTextArea, DatasetProfileFieldViewStyle.FreeText, DatasetProfileFieldViewStyle.BooleanDecision, DatasetProfileFieldViewStyle.RadioBox, diff --git a/dmp-frontend/src/styles.scss b/dmp-frontend/src/styles.scss index bd009402b..4d24d173e 100644 --- a/dmp-frontend/src/styles.scss +++ b/dmp-frontend/src/styles.scss @@ -254,47 +254,47 @@ } // CSS for (@kolkov/angular-editor) -.angular-editor-textarea { - min-height: 150px !important; -} - .form-field-subscript-wrapper { font-size: 75%; padding-left: 12px; margin-top: 8px; } -.editor-wrapper { - border: 1px solid transparent !important; - border-radius: 5px; -} - -.angular-editor-toolbar { - margin-left: 1px; - margin-right: 1px; -} - -.angular-editor-textarea, .angular-editor-toolbar { - border: none !important; -} - -.angular-editor { - border: 1px solid #ddd !important; - border-radius: 5px; - background-color: #fff; -} - -.editor-wrapper:hover, .angular-editor:hover { - border: 1px solid #000 !important; -} - -.editor-wrapper:focus-within, .angular-editor:focus-within { - border: 1px solid #034459 !important; -} - -.required.editor-wrapper, .required .editor .angular-editor { - border: 1px solid #f44336 !important; -} +//.angular-editor-textarea { +// min-height: 150px !important; +//} +// +//.editor-wrapper { +// border: 1px solid transparent !important; +// border-radius: 5px; +//} +// +//.angular-editor-toolbar { +// margin-left: 1px; +// margin-right: 1px; +//} +// +//.angular-editor-textarea, .angular-editor-toolbar { +// border: none !important; +//} +// +//.angular-editor { +// border: 1px solid #ddd !important; +// border-radius: 5px; +// background-color: #fff; +//} +// +//.editor-wrapper:hover, .angular-editor:hover { +// border: 1px solid #000 !important; +//} +// +//.editor-wrapper:focus-within, .angular-editor:focus-within { +// border: 1px solid #034459 !important; +//} +// +//.required.editor-wrapper, .required .editor .angular-editor { +// border: 1px solid #f44336 !important; +//} // end of CSS for (@kolkov/angular-editor) /* Transition Group */ From 193e7410a8210bb55d36afea71518caa6dfc737d Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Mon, 1 Nov 2021 15:30:21 +0200 Subject: [PATCH 120/156] Added rich text area field type for response in dataset > chapter > section > questions. 1. dataset-profile.module.ts: Added in declarations "DatasetProfileEditorRichTextAreaFieldComponent". 2. dataset-profile-editor-composite-field.component.html: Added RichTextArea as input field type for response to a question. 3. dataset-profile-editor-composite-field.component.ts: In method "addNewInput()" added case for RichTextArea. 4. dataset-profile-field-view-style.ts & view-style-enum.ts: Added RichTextArea. 5. field-data.ts: Added interface RichTextAreaFieldData. 6. enum-utils.service.ts: In methods "toDatasetProfileFieldViewStyleString()" and "toDatasetProfileViewTypeString()" added cases for RichTextArea 7. field-editor-model.ts: Added richTextarea. 8. component-profile-editor-default-value.component.html: Added for RichTextArea (how rich text area is initialized when this type is selected as response). 9. dataset-profile-editor-field.component.html: Added for RichTextArea (to select it) and (to show it). 10. dataset-profile-editor-field.component.ts: Added RichTextArea case everywhere. 11. dataset-wizard.component.ts & dmp-editor.component.ts: In method "_getPlaceHolder()" added case for richTextarea. 12. dataset-description-form.module.ts: Imported RichTextEditorModule. 13. form-field.component.html: Added RichTextArea case with . 14. assets/i18n/: Added DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RICH-TEXT-AREA-TITLE, DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RICH-TEXT-AREA-PLACEHOLDER and DMP-EDITOR.TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RICH-TEXT-AREA. 15. field-data/rich-text-area-field-data-editor-model.ts & field-type/rich-textarea/: [NEW] Files for Rich Text Area field type. --- .../enum/dataset-profile-field-view-style.ts | 1 + .../field-data/field-data.ts | 4 ++++ .../services/utilities/enum-utils.service.ts | 2 ++ .../rich-text-area-field-data-editor-model.ts | 18 ++++++++++++++++++ .../admin/field-editor-model.ts | 2 ++ .../dataset-profile/dataset-profile.module.ts | 2 ++ ...ofile-editor-composite-field.component.html | 6 ++++++ ...profile-editor-composite-field.component.ts | 16 ++++++++++++++++ ...profile-editor-default-value.component.html | 7 +++++++ ...-editor-rich-text-area-field.component.html | 13 +++++++++++++ ...-editor-rich-text-area-field.component.scss | 3 +++ ...le-editor-rich-text-area-field.component.ts | 18 ++++++++++++++++++ ...dataset-profile-editor-field.component.html | 5 +++++ .../dataset-profile-editor-field.component.ts | 16 +++++++++++++++- .../editor/components/field/view-style-enum.ts | 3 ++- .../dataset-wizard/dataset-wizard.component.ts | 3 ++- .../app/ui/dmp/editor/dmp-editor.component.ts | 3 ++- .../form-field/form-field.component.html | 13 +++++++++++++ .../dataset-description-form.module.ts | 4 +++- dmp-frontend/src/assets/i18n/de.json | 3 +++ dmp-frontend/src/assets/i18n/en.json | 3 +++ dmp-frontend/src/assets/i18n/es.json | 3 +++ dmp-frontend/src/assets/i18n/gr.json | 3 +++ dmp-frontend/src/assets/i18n/pt.json | 3 +++ dmp-frontend/src/assets/i18n/sk.json | 3 +++ dmp-frontend/src/assets/i18n/sr.json | 3 +++ dmp-frontend/src/assets/i18n/tr.json | 3 +++ 27 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/rich-text-area-field-data-editor-model.ts create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/rich-textarea/dataset-profile-editor-rich-text-area-field.component.html create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/rich-textarea/dataset-profile-editor-rich-text-area-field.component.scss create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/rich-textarea/dataset-profile-editor-rich-text-area-field.component.ts diff --git a/dmp-frontend/src/app/core/common/enum/dataset-profile-field-view-style.ts b/dmp-frontend/src/app/core/common/enum/dataset-profile-field-view-style.ts index a82869dec..4344a5eea 100644 --- a/dmp-frontend/src/app/core/common/enum/dataset-profile-field-view-style.ts +++ b/dmp-frontend/src/app/core/common/enum/dataset-profile-field-view-style.ts @@ -1,5 +1,6 @@ export enum DatasetProfileFieldViewStyle { TextArea = "textarea", + RichTextArea = "richTextarea", BooleanDecision = "booleanDecision", ComboBox = "combobox", CheckBox = "checkBox", diff --git a/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts b/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts index ab020df4f..c1714c52b 100644 --- a/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts +++ b/dmp-frontend/src/app/core/model/dataset-profile-definition/field-data/field-data.ts @@ -39,6 +39,10 @@ export interface TextAreaFieldData extends FieldData { } +export interface RichTextAreaFieldData extends FieldData { + +} + export interface WordListFieldData extends FieldData { type: DatasetProfileComboBoxType; options: Array; diff --git a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts index a7dada1f9..985806d78 100644 --- a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts +++ b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts @@ -79,6 +79,7 @@ export class EnumUtils { case DatasetProfileFieldViewStyle.FreeText: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.FREE-TEXT'); case DatasetProfileFieldViewStyle.RadioBox: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RADIO-BOX'); case DatasetProfileFieldViewStyle.TextArea: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.TEXT-AREA'); + case DatasetProfileFieldViewStyle.RichTextArea: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RICH-TEXT-AREA'); case DatasetProfileFieldViewStyle.DatePicker: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.DATE-PICKER'); case DatasetProfileFieldViewStyle.ExternalDatasets: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.EXTERNAL-DATASETS'); case DatasetProfileFieldViewStyle.DataRepositories: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.DATA-REPOSITORIES'); @@ -101,6 +102,7 @@ export class EnumUtils { case ViewStyleType.FreeText: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.FREE-TEXT'); case ViewStyleType.RadioBox: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RADIO-BOX'); case ViewStyleType.TextArea: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.TEXT-AREA'); + case ViewStyleType.RichTextArea: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RICH-TEXT-AREA'); case ViewStyleType.DatePicker: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.DATE-PICKER'); case ViewStyleType.ExternalDatasets: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.EXTERNAL-DATASETS'); case ViewStyleType.DataRepositories: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.DATA-REPOSITORIES'); diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/rich-text-area-field-data-editor-model.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/rich-text-area-field-data-editor-model.ts new file mode 100644 index 000000000..9ba1e2389 --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-data/rich-text-area-field-data-editor-model.ts @@ -0,0 +1,18 @@ +import { FormGroup } from '@angular/forms'; +import { RichTextAreaFieldData } from '../../../../../core/model/dataset-profile-definition/field-data/field-data'; +import { FieldDataEditorModel } from './field-data-editor-model'; + +export class RichTextAreaFieldDataEditorModel extends FieldDataEditorModel { + + buildForm(disabled: boolean = false, skipDisable: Array = []): FormGroup { + const formGroup = this.formBuilder.group({ + label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('RichTextAreaFieldDataEditorModel.label')) }] + }); + return formGroup; + } + + fromModel(item: RichTextAreaFieldData): RichTextAreaFieldDataEditorModel { + this.label = item.label; + return this; + } +} diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-editor-model.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-editor-model.ts index 51ebd8030..ad245c0c1 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-editor-model.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/admin/field-editor-model.ts @@ -10,6 +10,7 @@ import { FieldDataEditorModel } from './field-data/field-data-editor-model'; import { FreeTextFieldDataEditorModel } from './field-data/free-text-field-data-editor-model'; import { RadioBoxFieldDataEditorModel } from './field-data/radio-box-field-data-editor-model'; import { TextAreaFieldDataEditorModel } from './field-data/text-area-field-data-editor-model'; +import { RichTextAreaFieldDataEditorModel } from './field-data/rich-text-area-field-data-editor-model'; import { WordListFieldDataEditorModel } from './field-data/word-list-field-data-editor-model'; import { ViewStyleEditorModel } from './view-style-editor-model'; import { VisibilityEditorModel } from './visibility-editor-model'; @@ -66,6 +67,7 @@ export class FieldEditorModel extends BaseFormModel { if (this.viewStyle.renderStyle === 'radiobox') { this.data = new RadioBoxFieldDataEditorModel().fromModel(item.data); } if (this.viewStyle.renderStyle === 'checkBox') { this.data = new CheckBoxFieldDataEditorModel().fromModel(item.data); } if (this.viewStyle.renderStyle === 'textarea') { this.data = new TextAreaFieldDataEditorModel().fromModel(item.data); } + if (this.viewStyle.renderStyle === 'richTextarea') { this.data = new RichTextAreaFieldDataEditorModel().fromModel(item.data); } if (this.viewStyle.renderStyle === 'freetext') { this.data = new FreeTextFieldDataEditorModel().fromModel(item.data); } if (this.viewStyle.renderStyle === 'booleanDecision') { this.data = new BooleanDecisionFieldDataEditorModel().fromModel(item.data); } if (this.viewStyle.renderStyle === 'datePicker') { this.data = new DatePickerDataEditorModel().fromModel(item.data); } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts index ff0b0b52e..b5fd6b6b0 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/dataset-profile.module.ts @@ -53,6 +53,7 @@ import { DatasetProfileTableOfContents } from './table-of-contents/table-of-cont import { DatasetProfileTableOfContentsInternalSection } from './table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section'; import {TransitionGroupModule} from "@app/ui/transition-group/transition-group.module"; import { RichTextEditorModule } from "@app/library/rich-text-editor/rich-text-editor.module"; +import {DatasetProfileEditorRichTextAreaFieldComponent} from "@app/ui/admin/dataset-profile/editor/components/field-type/rich-textarea/dataset-profile-editor-rich-text-area-field.component"; @@ -90,6 +91,7 @@ import { RichTextEditorModule } from "@app/library/rich-text-editor/rich-text-ed DatasetProfileEditorFreeTextFieldComponent, DatasetProfileEditorRadioBoxFieldComponent, DatasetProfileEditorTextAreaFieldComponent, + DatasetProfileEditorRichTextAreaFieldComponent, DatasetProfileEditorDatePickerFieldComponent, DatasetProfileEditorWordListFieldComponent, DatasetProfileEditorDefaultValueComponent, diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html index 434dd727d..e56e4ce9f 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component.html @@ -268,6 +268,12 @@ {{enumUtils.toDatasetProfileViewTypeString(viewTypeEnum.TextArea)}} +
    - + - + diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index e1dff9949..927a98f10 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index ae8af2e0b..ea7c76aea 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index ee158ee03..5bf81b680 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -84,7 +84,7 @@ "JSON-FILES": "ficheros .json", "PRODUCED": "producido", "RDA-SPECIFICATIONS": "de acuerdo a las especificaciones RDA", - "MACHINE-ACTIONABLE": "para PGDs procesables por máquinas", + "MACHINE-ACTIONABLE": "para PGDs procesables por máquinas", "UPLOAD-FILE": "Subir fichero", "REPLACE-FILE": "Reemplar ichero" }, @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "Una breve descripción acerca del Dataset, su alcance y objetivos.", "DATASET-TEMPLATE-LANGUAGE": "Idioma de la plantilla del Dataset", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Seleccione un idioma", - "DATASET-TEMPLATE-USERS": "Usuarios", - "DATASET-TEMPLATE-NO-USERS-YET": "... Aún no hay usuarios", - "DATASET-TEMPLATE-REMOVE-USER": "Eliminar usuario", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validar y añadir usuario", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Descripción de la plantilla del Dataset", "UNTITLED": "Sin título", "QUESTION": "Pregunta", @@ -431,7 +432,7 @@ "FIELD-MULTIPLE-AUTOCOMPLETE": "Autocompeltado múltiple", "FIELD-MULTIPLE-WORDLIST": "Selección múltiple", "FIELD-CURRENCY-TITLE": "Datos de moneda", - "FIELD-CURRENCY-PLACEHOLDER": "Introduzca marcador del texto", + "FIELD-CURRENCY-PLACEHOLDER": "Introduzca marcador del texto", "FIELD-REGISTRIES-TITLE": "Datos de registros", "FIELD-REGISTRIES-PLACEHOLDER": "Introduzca marcador del texto", "FIELD-SERVICES-TITLE": "Datos de servicios", @@ -1240,7 +1241,7 @@ "EXTERNAL-LINK": "Facilite una URL" }, "HINT": { - "DESCRIPTION": "Describa brevemente el contexto y propósito del Dataset", + "DESCRIPTION": "Describa brevemente el contexto y propósito del Dataset", "TITLE": "Una breve descripción sobre el ", "TITLE-REST": " su alcance y objetivos." }, diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 264f52dd3..5ba205304 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json index 53e7b1c83..76503ef92 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "Uma breve descrição do que é o modelo de dados, o seu âmbito e objetivos.", "DATASET-TEMPLATE-LANGUAGE": "Idioma do modelo de dados", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Selecione o idioma", - "DATASET-TEMPLATE-USERS": "Utilizadores", - "DATASET-TEMPLATE-REMOVE-USER": "Remover Utilizador", - "DATASET-TEMPLATE-NO-USERS-YET": "... Ainda sem utilizadores", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validar e adicionar utilizador", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Descrição do modelo de dados", "UNTITLED": "Sem título", "QUESTION": "Questão", diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index f659c6741..3a8726434 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index ead608601..be76fe7be 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 165c783ac..05590c73d 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -289,10 +289,11 @@ "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", "DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language", - "DATASET-TEMPLATE-USERS": "Users", - "DATASET-TEMPLATE-REMOVE-USER": "Remove User", - "DATASET-TEMPLATE-NO-USERS-YET": "... No users yet", - "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add User", + "DATASET-TEMPLATE-USERS": "Editors", + "DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.", + "DATASET-TEMPLATE-REMOVE-USER": "Remove Editor", + "DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet", + "DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor", "DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description", "UNTITLED": "Untitled", "QUESTION": "Question", From b2825c836936b8e0bf15015d1f401524281ec447 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Dec 2021 18:03:31 +0200 Subject: [PATCH 153/156] Fix issue with parsing some custom auto complete sources --- .../logic/managers/DatasetProfileManager.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index 35502693f..ee4bbd793 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -176,7 +176,7 @@ public class DatasetProfileManager { response = restTemplate.exchange(url, HttpMethod.GET, entity, Object.class); jsonContext = JsonPath.parse(response.getBody()); jsonItems = jsonContext.read(singleData.getOptionsRoot() + "['" + singleData.getAutoCompleteOptions().getLabel() + "','" + singleData.getAutoCompleteOptions().getValue() + "','" + singleData.getAutoCompleteOptions().getSource() + "','" + "uri" + "']"); - jsonItems.forEach(item -> result.add(new ExternalAutocompleteFieldModel(item.get(singleData.getAutoCompleteOptions().getValue()), item.get(singleData.getAutoCompleteOptions().getLabel()), item.get(singleData.getAutoCompleteOptions().getSource()) != null ? item.get(singleData.getAutoCompleteOptions().getSource()) : singleData.getAutoCompleteOptions().getSource(), item.get("uri")))); + jsonItems.forEach(item -> result.add(new ExternalAutocompleteFieldModel(parseItem(item.get(singleData.getAutoCompleteOptions().getValue())), parseItem(item.get(singleData.getAutoCompleteOptions().getLabel())), item.get(singleData.getAutoCompleteOptions().getSource()) != null ? parseItem(item.get(singleData.getAutoCompleteOptions().getSource())) : singleData.getAutoCompleteOptions().getSource(), parseItem(item.get("uri"))))); break; case CACHED: headers.setAccept(Collections.singletonList(MediaType.valueOf("text/plain; charset=utf-8"))); @@ -202,6 +202,20 @@ public class DatasetProfileManager { //return result; } + private String parseItem(Object item) { + if (item instanceof String) { + return (String) item; + } + if (item instanceof List) { + List listedItems = (List) item; + return parseItem(listedItems.get(0)); + } + if (item instanceof Map) { + return (String) ((Map)item).get("$"); + } + return item.toString(); + } + public ResponseEntity getDocument(eu.eudat.models.data.user.composite.DatasetProfile datasetProfile, String label) throws IllegalAccessException, IOException, InstantiationException { FileEnvelope envelope = getXmlDocument(datasetProfile, label); InputStream resource = new FileInputStream(envelope.getFile()); From de4c430d911ccfc47cfdc48d4f99e598d542c3f9 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Dec 2021 16:49:23 +0200 Subject: [PATCH 154/156] Fix issue with related datasets on dashboard --- .../main/java/eu/eudat/logic/managers/DashBoardManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 3dc89f416..5b5bf2d0f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -325,9 +325,11 @@ public class DashBoardManager { recentActivityModels.addAll(dmps1.stream().map(dmp -> { DatasetCriteria datasetCriteria1 = new DatasetCriteria(); datasetCriteria1.setDmpIds(Collections.singletonList(dmp.getId())); + datasetCriteria1.setAllVersions(false); if (isAuthenticated) { dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1, principal.getId())); } else { + datasetCriteria1.setIsPublic(true); dmp.setDataset(retrieveRelevantDatasets(datasetCriteria1)); } return new RecentDmpModel().fromDataModel(dmp); @@ -447,14 +449,14 @@ public class DashBoardManager { roles.add(1); datasetItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(datasetItems, userInfo, roles); } - Long maxDatasets = datasetItems.count(); + Long maxDatasets = datasetItems.distinct().count(); DatasetTableRequest datasetTableRequest = new DatasetTableRequest(); datasetTableRequest.setOffset(0); datasetTableRequest.setLength(3); Set datasetsSet = new LinkedHashSet<>(); try { datasetItems = PaginationManager.applyPaging(datasetItems, datasetTableRequest); - List datasets = datasetItems.toList(); + List datasets = datasetItems.distinct().toList(); datasetsSet.addAll(datasets); for (int i = 0; i < maxDatasets - datasets.size(); i++) { Dataset fakedataset = new Dataset(); From 197de17aa56ad89c1108097251e047e5da37099c Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Mon, 6 Dec 2021 15:32:38 +0200 Subject: [PATCH 155/156] no message --- .../main/java/eu/eudat/logic/managers/MetricsManager.java | 6 ++++++ .../web/src/main/java/eu/eudat/types/MetricNames.java | 1 + 2 files changed, 7 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 03a153947..8fe25d561 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -109,6 +109,9 @@ public class MetricsManager { {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())} + {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, + {MetricNames.NEXUS + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS + MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, + }).collect(Collectors.toMap(data -> (String)data[0], data -> (Gauge) data[1])); } @@ -172,6 +175,9 @@ public class MetricsManager { long files = Files.list(Paths.get(this.environment.getProperty("userguide.path"))).count(); calculateValue(MetricNames.LANGUAGES, (int) files, null); + calculateValue(MetricNames.INSTALLATIONS, 1, null); + calculateValue(MetricNames.NEXUS + MetricNames.INSTALLATIONS, 1, null); + logger.info("Metrics calculation Completed"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java index 20d8c0c52..a1d7dab89 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java +++ b/dmp-backend/web/src/main/java/eu/eudat/types/MetricNames.java @@ -2,6 +2,7 @@ package eu.eudat.types; public class MetricNames { public static final String DATASET_TEMPLATE = "argos_dataset_templates"; + public static final String INSTALLATIONS = "installations"; public static final String USERS = "argos_users"; public static final String DMP = "argos_managed_dmps"; public static final String DATASET = "argos_managed_dataset_descriptions"; From 2cb985c23c4ceda99efc78bcc8e77b3eceeb0bcf Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Tue, 7 Dec 2021 16:52:49 +0200 Subject: [PATCH 156/156] bug fix --- .../src/main/java/eu/eudat/logic/managers/MetricsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java index 8fe25d561..aa356d1a0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/MetricsManager.java @@ -107,7 +107,7 @@ public class MetricsManager { {MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())} + {MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, {MetricNames.NEXUS + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS + MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())},