From a8bc5d06224d9a898228be4968309dc83927df8e Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Wed, 3 Feb 2021 11:06:40 +0200 Subject: [PATCH 01/53] Dataset Template Admin Listing Redesign --- .../dataset-profile/dataset-profile.module.ts | 11 ++- .../criteria/dataset-profile.component.html | 42 ++++---- .../criteria/dataset-profile.component.scss | 17 ++++ .../criteria/dataset-profile.component.ts | 24 +---- ...onfirmation-upload-profiles.component.html | 31 ++++-- ...onfirmation-upload-profiles.component.scss | 99 +++++++++++++++++++ ...-confirmation-upload-profiles.component.ts | 18 ++-- .../dataset-profile-listing.component.html | 37 ++++--- .../dataset-profile-listing.component.scss | 57 +++++++++-- .../dataset-profile-listing.component.ts | 42 +++++++- .../listing/pipe/parse-status.pipe.ts | 15 ++- dmp-frontend/src/assets/i18n/de.json | 3 +- dmp-frontend/src/assets/i18n/en.json | 5 +- dmp-frontend/src/assets/i18n/es.json | 3 +- dmp-frontend/src/assets/i18n/gr.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 +- 18 files changed, 325 insertions(+), 91 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 e79d5176d..1ed48c79b 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 @@ -23,7 +23,7 @@ import { DatasetProfileEditorRuleComponent } from '@app/ui/admin/dataset-profile import { DatasetProfileEditorSectionComponent } from '@app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component'; import { DatasetProfileEditorComponent } from '@app/ui/admin/dataset-profile/editor/dataset-profile-editor.component'; import { DatasetProfileCriteriaComponent } from '@app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component'; -import { DialodConfirmationUploadDatasetProfiles } from '@app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; +import { DialogConfirmationUploadDatasetProfiles } from '@app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; import { DatasetProfileListingComponent } from '@app/ui/admin/dataset-profile/listing/dataset-profile-listing.component'; import { CommonFormsModule } from '@common/forms/common-forms.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; @@ -38,14 +38,15 @@ import { DatasetProfileEditorOrganizationsFieldComponent } from './editor/compon import { DatasetProfileEditorDatasetIdentifierFieldComponent } from './editor/components/field-type/dataset-identifier/dataset-profile-editor-dataset-identifier-field.component'; import { DatasetProfileEditorCurrencyFieldComponent } from './editor/components/field-type/currency/dataset-profile-editor-currency-field.component'; import { DatasetProfileEditorValidatorFieldComponent } from './editor/components/field-type/validator/dataset-profile-editor-validator-field.component'; - +import { NgxDropzoneModule } from 'ngx-dropzone'; @NgModule({ imports: [ CommonUiModule, CommonFormsModule, FormattingModule, DatasetProfileRoutingModule, - ConfirmationDialogModule + ConfirmationDialogModule, + NgxDropzoneModule ], declarations: [ DatasetProfileListingComponent, @@ -66,7 +67,7 @@ import { DatasetProfileEditorValidatorFieldComponent } from './editor/components DatasetProfileEditorDatePickerFieldComponent, DatasetProfileEditorWordListFieldComponent, DatasetProfileEditorDefaultValueComponent, - DialodConfirmationUploadDatasetProfiles, + DialogConfirmationUploadDatasetProfiles, DatasetProfileEditorInternalDmpEntitiesFieldComponent, DatasetProfileEditorResearchersAutoCompleteFieldComponent, DatasetProfileEditorDatasetsAutoCompleteFieldComponent, @@ -84,7 +85,7 @@ import { DatasetProfileEditorValidatorFieldComponent } from './editor/components DatasetProfileEditorValidatorFieldComponent ], entryComponents: [ - DialodConfirmationUploadDatasetProfiles + DialogConfirmationUploadDatasetProfiles ] }) export class DatasetProfileModule { } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.html index c303267ef..8ef3a55a2 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.html @@ -1,23 +1,23 @@ -
- -
- - - - - - {{'DATASET-PROFILE-STATUS.NONE' | translate}} - {{'DATASET-PROFILE-STATUS.DRAFT' | translate}} - {{'DATASET-PROFILE-STATUS.FINALIZED' | translate}} - - -
-
- - -
+
+
+
+ {{'CRITERIA.USERS.SHOW' | translate}}:
- + + + + {{'DATASET-PROFILE-STATUS.NONE' | translate}} + {{'DATASET-PROFILE-STATUS.DRAFT' | translate}} + {{'DATASET-PROFILE-STATUS.FINALIZED' | translate}} + + + +
+
+ + + search + +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.scss index e69de29bb..0f748ac5b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.scss @@ -0,0 +1,17 @@ +.mat-form-field{ + display: inline-block !important; +} + +::ng-deep .status-form .mat-form-field-wrapper { + background-color: white !important; + padding-bottom: 0 !important; +} + +::ng-deep .search-form .mat-form-field-wrapper { + background-color: white !important; + padding-bottom: 0 !important; +} + +::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { + padding: 0.3rem 0rem 0.6rem 0rem !important; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.ts index f0b1b3e17..7f3116f7e 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; import { DatasetProfileService } from '@app/core/services/dataset-profile/dataset-profile.service'; -import { DialodConfirmationUploadDatasetProfiles } from '@app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; +import { DialogConfirmationUploadDatasetProfiles } from '@app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; import { BaseCriteriaComponent } from '@app/ui/misc/criteria/base-criteria.component'; import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; import { TranslateService } from '@ngx-translate/core'; @@ -47,26 +47,4 @@ export class DatasetProfileCriteriaComponent extends BaseCriteriaComponent imple } } - openDialog(): void { - const dialogRef = this.dialog.open(DialodConfirmationUploadDatasetProfiles, { - width: '500px', - restoreFocus: false, - data: { - message: this.language.instant('DATASET-WIZARD.UPLOAD.UPLOAD-XML-FILE-TITLE'), - confirmButton: this.language.instant('DATASET-WIZARD.UPLOAD.UPLOAD-XML'), - cancelButton: this.language.instant('DATASET-WIZARD.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.datasetService.uploadFile(data.file, data.name) - .pipe(takeUntil(this._destroyed)) - .subscribe(); - } - }); - } - } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html index dec3649ac..d071e4cb2 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.html @@ -4,22 +4,41 @@

{{ data.message }}

- - + close
+ +
+
+ + + {{ selectedFileName }} + + +
+
+ +
+
+ + +
+
+
- +
- +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss index 226db6ce8..63c42f81e 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-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/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts index 8db9791c4..3b08731b9 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component.ts @@ -7,30 +7,29 @@ import { Inject, Component } from '@angular/core'; templateUrl: './dialog-confirmation-upload-profiles.component.html', styleUrls: ['./dialog-confirmation-upload-profiles.component.scss'] }) -export class DialodConfirmationUploadDatasetProfiles { +export class DialogConfirmationUploadDatasetProfiles { sizeError = false; - btnColore:String="primary"; + selectedFileName= ""; selectFile =false; maxFileSize: number = 1048576; constructor( - public dialogRef: MatDialogRef, + public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any ) { } selectXML(event) { const file: FileList = event.target.files; + 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; } @@ -41,7 +40,6 @@ export class DialodConfirmationUploadDatasetProfiles { } confirm() { - this.data.name = this.data.name; this.data.sucsess = true; this.dialogRef.close(this.data); } @@ -50,4 +48,10 @@ export class DialodConfirmationUploadDatasetProfiles { 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/dataset-profile/listing/dataset-profile-listing.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.html index bd754914e..78e2dca1a 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 @@ -1,9 +1,26 @@
-

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

- - +
+
+

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

+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+ + @@ -31,12 +48,12 @@ {{'DATASET-PROFILE-LISTING.COLUMNS.STATUS' | translate}} - {{ (row.status | parseStatus) | translate}} +
{{ (row.status | parseStatus) | translate}}
- {{'DATASET-PROFILE-LISTING.COLUMNS.ACTIONS' | translate}} + @@ -53,7 +70,7 @@ @@ -63,14 +80,10 @@
+ - - -
- +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.scss index b2318bf16..5696518c5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.scss @@ -1,9 +1,14 @@ .dataset-profile-listing { margin-top: 1rem; + margin-left: 1rem; + margin-right: 2rem; } .mat-table { - margin: 24px; + margin-top: 47px; + margin-bottom: 20px; + border-radius: 4px; + } .mat-fab-bottom-right { @@ -16,6 +21,10 @@ z-index: 5; } +.mat-header-row{ + background: #f3f5f8; +} + .full-width { width: 100%; } @@ -26,20 +35,39 @@ .mat-row { cursor: pointer; + min-height: 4.5em; } mat-row:hover { - background-color: lightgray; + background-color: #eef5f6; } +.status-chip{ + + border-radius: 20px; + padding-left: 1em; + padding-right: 1em; + padding-top: 0.2em; + font-size: .8em; +} + +.status-chip-finalized{ + color: #568b5a; + background: #9dd1a1 0% 0% no-repeat padding-box; +} + +.status-chip-draft{ + color: #00c4ff; + background: #d3f5ff 0% 0% no-repeat padding-box; +} // mat-row:nth-child(even){ // background-color:red; // } -mat-row:nth-child(odd) { - background-color: #0c748914; - // background-color: #eef0fb; -} +// mat-row:nth-child(odd) { +// background-color: #0c748914; +// // background-color: #eef0fb; +// } ::ng-deep .mat-paginator-container { flex-direction: row-reverse !important; @@ -71,3 +99,20 @@ mat-row:nth-child(odd) { height: 30px !important; font-size: 12px !important; } + +.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; +} +.create-btn { + border-radius: 30px; + background-color: #f7dd72; + padding-left: 2em; + padding-right: 2em; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts index 0b17a2951..82a6be1f5 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/dataset-profile-listing.component.ts @@ -1,9 +1,11 @@ import { DataSource } from '@angular/cdk/table'; import { HttpClient } from '@angular/common/http'; import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { ActivatedRoute, Params, Router } from '@angular/router'; +import { DatasetStatus } from '@app/core/common/enum/dataset-status'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; import { DmpModel } from '@app/core/model/dmp/dmp'; @@ -18,6 +20,8 @@ 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 { DialogConfirmationUploadDatasetProfiles } from './criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; +import { ParseStatus } from './pipe/parse-status.pipe'; @Component({ selector: 'app-dataset-profile-listing-component', @@ -46,7 +50,8 @@ export class DatasetProfileListingComponent extends BaseComponent implements OnI private language: TranslateService, private uiNotificationService: UiNotificationService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private dialog: MatDialog ) { super(); } @@ -122,6 +127,41 @@ export class DatasetProfileListingComponent extends BaseComponent implements OnI // debugger; // this.datasetService.makeDatasetPublic(id).pipe(takeUntil(this._destroyed)).subscribe(); // } + + openDialog(): void { + const dialogRef = this.dialog.open(DialogConfirmationUploadDatasetProfiles, { + width: '500px', + restoreFocus: false, + data: { + message: this.language.instant('DATASET-WIZARD.UPLOAD.UPLOAD-XML-FILE-TITLE'), + confirmButton: this.language.instant('DATASET-WIZARD.UPLOAD.UPLOAD-XML'), + cancelButton: this.language.instant('DATASET-WIZARD.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.datasetService.uploadFile(data.file, data.name) + .pipe(takeUntil(this._destroyed)) + .subscribe(); + } + }); + } + + /** + * gets as a a pameter a number representing the status and returns the class that is applied + * to status-chip */ + getStatusClass(status: DatasetStatus):string{ + + if(status == DatasetStatus.Finalized){ + return 'status-chip-finalized' + } + + return 'status-chip-draft'; + } + } export class DatasetDataSource extends DataSource { diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/pipe/parse-status.pipe.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/pipe/parse-status.pipe.ts index 33cbd4b8c..82b75d2ab 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/listing/pipe/parse-status.pipe.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/listing/pipe/parse-status.pipe.ts @@ -1,4 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core'; +import { DatasetStatus } from '@app/core/common/enum/dataset-status'; @Pipe({ name: 'parseStatus', @@ -10,7 +11,17 @@ export class ParseStatus implements PipeTransform { } - parseStatus(status: number): string { - return status != 0 ? 'DATASET-PROFILE-STATUS.FINALIZED' : 'DATASET-PROFILE-STATUS.DRAFT'; + parseStatus(status: DatasetStatus): string { + + switch (status) { + case DatasetStatus.Finalized: + return 'DATASET-PROFILE-STATUS.FINALIZED'; + case DatasetStatus.Draft: + return 'DATASET-PROFILE-STATUS.DRAFT'; + case DatasetStatus.Deleted: + return 'DATASET-PROFILE-STATUS.DRAFT.DELETED'; + default: + return 'DATASET-PROFILE-STATUS.DRAFT.NONE'; + } } } diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index 12b8b6ae5..c10317679 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -1587,6 +1587,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "None", "DRAFT": "Draft", - "FINALIZED": "Finalized" + "FINALIZED": "Finalized", + "DELETED": "Deleted" } } diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 24d7e056e..3908440c5 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1591,6 +1591,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "None", "DRAFT": "Draft", - "FINALIZED": "Finalized" + "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 9aa30926a..cf1c9f364 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1587,6 +1587,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "Ninguno", "DRAFT": "Borrador", - "FINALIZED": "Finalizado" + "FINALIZED": "Finalizado", + "DELETED": "Deleted" } } diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 09d6421a3..1332ffd15 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1587,6 +1587,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "Όλα", "DRAFT": "Πρόχειρα", - "FINALIZED": "Οριστικοποιημένα" + "FINALIZED": "Οριστικοποιημένα", + "DELETED": "Deleted" } } diff --git a/dmp-frontend/src/assets/i18n/sk.json b/dmp-frontend/src/assets/i18n/sk.json index de19ff8da..ed035162a 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -1587,6 +1587,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "ˇŽiadny", "DRAFT": "Návrh", - "FINALIZED": "Dokončené" + "FINALIZED": "Dokončené", + "DELETED": "Deleted" } } diff --git a/dmp-frontend/src/assets/i18n/sr.json b/dmp-frontend/src/assets/i18n/sr.json index 6bb34235f..6f2fd7dc1 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -1534,6 +1534,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "Nijedan", "DRAFT": "Radna verzija", - "FINALIZED": "Završeno" + "FINALIZED": "Završeno", + "DELETED": "Deleted" } } \ No newline at end of file diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 9d5e2e006..6f6303d11 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -1587,6 +1587,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "Hiç Biri", "DRAFT": "Taslak", - "FINALIZED": "Tamamlandı" + "FINALIZED": "Tamamlandı", + "DELETED": "Deleted" } } From 8e93a020191cf391e8a0b986b4e14f7b7fa41873 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 3 Feb 2021 12:21:31 +0200 Subject: [PATCH 02/53] dataset profile editor redesign - initial commit --- .../dataset-profile/dataset-profile.module.ts | 28 ++- .../dataset-profile-editor.component.html | 138 +++++++++------ .../dataset-profile-editor.component.ts | 119 ++++++++++++- .../table-of-contents-entry.ts | 5 + .../table-of-contents/table-of-contents.html | 15 ++ .../table-of-contents/table-of-contents.scss | 70 ++++++++ .../table-of-contents/table-of-contents.ts | 167 ++++++++++++++++++ .../src/app/ui/dataset/dataset.module.ts | 16 +- .../src/app/ui/dataset/dataset.routing.ts | 1 - 9 files changed, 486 insertions(+), 73 deletions(-) create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.html create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.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 1ed48c79b..66094e595 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 @@ -1,6 +1,5 @@ import { NgModule } from '@angular/core'; import { FormattingModule } from '@app/core/formatting.module'; -import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module'; import { DatasetProfileRoutingModule } from '@app/ui/admin/dataset-profile/dataset-profile.routing'; import { DatasetProfileEditorCompositeFieldComponent } from '@app/ui/admin/dataset-profile/editor/components/composite-field/dataset-profile-editor-composite-field.component'; import { DatasetProfileEditorDefaultValueComponent } from '@app/ui/admin/dataset-profile/editor/components/composite-profile-editor-default-value/component-profile-editor-default-value.component'; @@ -25,20 +24,27 @@ import { DatasetProfileEditorComponent } from '@app/ui/admin/dataset-profile/edi import { DatasetProfileCriteriaComponent } from '@app/ui/admin/dataset-profile/listing/criteria/dataset-profile.component'; import { DialogConfirmationUploadDatasetProfiles } from '@app/ui/admin/dataset-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component'; import { DatasetProfileListingComponent } from '@app/ui/admin/dataset-profile/listing/dataset-profile-listing.component'; +import { DatasetModule } from '@app/ui/dataset/dataset.module'; +import { FormProgressIndicationModule } from '@app/ui/misc/dataset-description-form/components/form-progress-indication/form-progress-indication.module'; +import { TableOfContentsModule } from '@app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents.module'; import { CommonFormsModule } from '@common/forms/common-forms.module'; +import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; -import { ParseStatus } from './listing/pipe/parse-status.pipe'; -import { DatasetProfileEditorExternalDatasetsFieldComponent } from './editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component'; +import { AngularStickyThingsModule } from '@w11k/angular-sticky-things'; +import { DatasetProfileEditorCurrencyFieldComponent } from './editor/components/field-type/currency/dataset-profile-editor-currency-field.component'; import { DatasetProfileEditorDataRepositoriesFieldComponent } from './editor/components/field-type/data-repositories/dataset-profile-editor-data-repositories-field.component'; +import { DatasetProfileEditorDatasetIdentifierFieldComponent } from './editor/components/field-type/dataset-identifier/dataset-profile-editor-dataset-identifier-field.component'; +import { DatasetProfileEditorExternalDatasetsFieldComponent } from './editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component'; +import { DatasetProfileEditorOrganizationsFieldComponent } from './editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component'; import { DatasetProfileEditorRegistriesFieldComponent } from './editor/components/field-type/registries/dataset-profile-editor-registries-field.component'; +import { DatasetProfileEditorResearchersFieldComponent } from './editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component'; import { DatasetProfileEditorServicesFieldComponent } from './editor/components/field-type/services/dataset-profile-editor-services-field.component'; import { DatasetProfileEditorTagsFieldComponent } from './editor/components/field-type/tags/dataset-profile-editor-tags-field.component'; -import { DatasetProfileEditorResearchersFieldComponent } from './editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component'; -import { DatasetProfileEditorOrganizationsFieldComponent } from './editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component'; -import { DatasetProfileEditorDatasetIdentifierFieldComponent } from './editor/components/field-type/dataset-identifier/dataset-profile-editor-dataset-identifier-field.component'; -import { DatasetProfileEditorCurrencyFieldComponent } from './editor/components/field-type/currency/dataset-profile-editor-currency-field.component'; import { DatasetProfileEditorValidatorFieldComponent } from './editor/components/field-type/validator/dataset-profile-editor-validator-field.component'; import { NgxDropzoneModule } from 'ngx-dropzone'; +import { ParseStatus } from './listing/pipe/parse-status.pipe'; +import { DatasetProfileTableOfContents } from './table-of-contents/table-of-contents'; + @NgModule({ imports: [ CommonUiModule, @@ -46,7 +52,10 @@ import { NgxDropzoneModule } from 'ngx-dropzone'; FormattingModule, DatasetProfileRoutingModule, ConfirmationDialogModule, - NgxDropzoneModule + NgxDropzoneModule, + FormProgressIndicationModule, + DatasetModule, + AngularStickyThingsModule ], declarations: [ DatasetProfileListingComponent, @@ -82,7 +91,8 @@ import { NgxDropzoneModule } from 'ngx-dropzone'; DatasetProfileEditorOrganizationsFieldComponent, DatasetProfileEditorDatasetIdentifierFieldComponent, DatasetProfileEditorCurrencyFieldComponent, - DatasetProfileEditorValidatorFieldComponent + DatasetProfileEditorValidatorFieldComponent, + DatasetProfileTableOfContents ], entryComponents: [ DialogConfirmationUploadDatasetProfiles 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 c6d9198aa..d9e634bd7 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 @@ -11,86 +11,118 @@

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

- - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - - - - - {{ lang.name }} - - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
- +
+ + {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TITLE' | translate}} + +
+ + + {{'GENERAL.VALIDATION.REQUIRED' | + translate}} + + + + + + {{'GENERAL.VALIDATION.REQUIRED' + | translate}} + + + + + + + + {{ lang.name }} + + + {{'GENERAL.VALIDATION.REQUIRED' | + translate}} + + +
+ +
+
+
{{'DATASET-PROFILE-EDITOR.STEPS.PAGES.TITLE' | translate}}
- +
- +
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}}
- - - - {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}} - - - -
- - -
-
-
+
+ +
+
+ +
- +
- +
- - - + + +
- - + +
@@ -103,4 +135,4 @@
- + \ No newline at end of file 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 d30180f76..6158679c3 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 @@ -26,6 +26,10 @@ import { LanguageInfo } from '@app/core/model/language-info'; import { LanguageInfoService } from '@app/core/services/culture/language-info-service'; import { FormValidationErrorsDialogComponent } from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.component'; import { MatomoService } from '@app/core/services/matomo/matomo-service'; +import { Link, LinkToScroll } from '@app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; +import { ToCEntry } from '../table-of-contents/table-of-contents-entry'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -63,7 +67,9 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn private dialog: MatDialog, private languageInfoService: LanguageInfoService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + + private datasetWizardService: DatasetWizardService ) { super(); // this.profileID = route.snapshot.params['id']; @@ -174,6 +180,9 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn // }); }); this.form.updateValueAndValidity(); + + //this.getPreview(); + } onIsMultiplicityEnabledChange(isMultiplicityEnabled: boolean) { @@ -403,4 +412,110 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn }, }); } -} + + + + + + + links: Link[] = []; + + getLinks(currentLinks: Link[]) { + this.links = currentLinks; + } + + linkToScroll: LinkToScroll; + onStepFound(linkToScroll: LinkToScroll) { + this.linkToScroll = linkToScroll; + } + + datasetWizardModel: DatasetWizardEditorModel; + formGroup: FormGroup; + getPreview() { + let data = this.form.value; + this.datasetProfileService.preview(data).subscribe(x => { + this.datasetWizardModel = new DatasetWizardEditorModel().fromModel({ + datasetProfileDefinition: x + }); + this.formGroup = this.datasetWizardModel.buildForm().get('datasetProfileDefinition'); + }); + //this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue())); + + //this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft; + // if (this.datasetWizardModel.status === DatasetStatus.Finalized) { + // this.formGroup.disable(); + // this.viewOnly = true; + // } + //if (this.viewOnly) { this.formGroup.disable(); } // For future use, to make Dataset edit like DMP. + // this.registerFormListeners(); + // this.dmpValueChanged(null); + // this.breadCrumbs = observableOf([ + // { + // parentComponentName: null, + // label: this.language.instant('DATASET-LISTING.ACTIONS.CREATE-NEW').toUpperCase(), + // url: '/datasets/new/' + // }]); + + + + // this.datasetWizardService.updateDatasetProfile(this.profileUpdateId) + // .pipe(takeUntil(this._destroyed)) + // .subscribe(data => { + // this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); + // this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue())); + + // this.needsUpdate(); + // this.breadCrumbs = observableOf([ + // { + // parentComponentName: null, + // label: this.language.instant('NAV-BAR.MY-DATASET-DESCRIPTIONS'), + // url: '/datasets', + // notFoundResolver: [ + // // { + // // parentComponentName: null, + // // label: this.datasetWizardModel.dmp.grant.label, + // // url: '/grants/edit/' + this.datasetWizardModel.dmp.grant.id + // // }, + // { + // parentComponentName: null, + // label: this.datasetWizardModel.dmp.label, + // url: '/plans/edit/' + this.datasetWizardModel.dmp.id, + // }, + // ] + // }]); + // this.formGroup = this.datasetWizardModel.buildForm(); + // this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft; + // if (this.datasetWizardModel.status === DatasetStatus.Finalized) { + // this.formGroup.disable(); + // this.viewOnly = true; + // } + // // if (this.viewOnly) { this.formGroup.disable(); } // For future use, to make Dataset edit like DMP. + // this.loadDatasetProfiles(); + // }); + } + + getTocEntries(): ToCEntry[] { + if (this.form == null) { return []; } + + const result: ToCEntry[] = []; + (this.form.get('pages') as FormArray).controls.forEach((pageElement, i) => { + result.push({ + id: pageElement.get('id').value, + label: pageElement.get('title').value + } as ToCEntry) + }); + + (this.form.get('sections') as FormArray).controls.forEach((sectionElement, i) => { + const currentSectionPageId = sectionElement.get('page').value; + const pageToAdd = result.filter(x => x.id == currentSectionPageId)[0]; + if (pageToAdd.subEntries == null) pageToAdd.subEntries = []; + + pageToAdd.subEntries.push({ + id: sectionElement.get('id').value, + label: sectionElement.get('title').value + } as ToCEntry) + }); + + return result; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts new file mode 100644 index 000000000..bf65d0f9c --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts @@ -0,0 +1,5 @@ +export interface ToCEntry { + id: string; + label: string; + subEntries: ToCEntry[]; +} diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.html b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.html new file mode 100644 index 000000000..c203eaedf --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.html @@ -0,0 +1,15 @@ +
+ + + +
+ + + {{link.label}} + + + +
+
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 new file mode 100644 index 000000000..b346518fa --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.scss @@ -0,0 +1,70 @@ +.docs-toc-container { + width: 100%; + padding: 5px 0 10px 0px; + cursor: pointer; + // border-left: solid 4px #0c7489; + + .scroll-container { + overflow-y: auto; + // calc(100vh - 250px) + // height: calc(100vh - 250px); + } + + .docs-link { + color: rgba(0, 0, 0, 0.54); + // color: mat-color($app-blue-theme-foreground, secondary-text); + transition: color 100ms; + + &:hover, + &.docs-active { + .link-name { + background-color: #ececec; + border-radius: 6px; + // color: #0c7489; + } + // color: mat-color($primary, if($is-dark-theme, 200, default)); + } + } +} + +.docs-toc-heading { + margin: 0; + padding: 0; + font-size: 13px; + font-weight: bold; +} + +span { + line-height: 16px; + margin: 6px 0 0; + position: relative; + text-decoration: none; + display: block; + overflow: hidden; + color: #21212194; + font-weight: 400; + max-width: 290px; + min-width: 290px; + padding: 0rem .4rem; + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; + width: 100%; + } +} + +.selected { + color: #212121 !important; + font-weight: 700 !important; + opacity: 1 !important; +} + +// .docs-level-mat-expansion-panel { +// margin-left: 12px; +// } + +.docs-level-h5 { + margin-left: 24px; +} 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 new file mode 100644 index 000000000..ec6160e56 --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents.ts @@ -0,0 +1,167 @@ +import { DOCUMENT } from '@angular/common'; +import { Component, EventEmitter, Inject, OnInit, Output, Input } from '@angular/core'; +import { BaseComponent } from '@common/base/base.component'; +import { interval, Subject, Subscription } from 'rxjs'; +import { distinctUntilChanged } from 'rxjs/operators'; +import { type } from 'os'; +import { SimpleChanges } from '@angular/core'; +import { ToCEntry } from './table-of-contents-entry'; + +export interface Link { + /* id of the section*/ + id: string; + /* header type h3/h4 */ + type: string; + /* If the anchor is in view of the page */ + active: boolean; + /* name of the anchor */ + name: string; + /* top offset px of the anchor */ + top: number; + page: number; + section: number; + show: boolean; + selected: boolean; +} + +@Component({ + selector: 'dataset-profile-table-of-contents', + styleUrls: ['./table-of-contents.scss'], + templateUrl: './table-of-contents.html' +}) +export class DatasetProfileTableOfContents extends BaseComponent implements OnInit { + + @Input() links: ToCEntry[]; + container: string; + headerSelectors = '.toc-page-header, .toc-section-header, .toc-compositeField-header'; + @Output() stepFound = new EventEmitter(); + @Output() currentLinks = new EventEmitter(); + subscription: Subscription; + linksSubject: Subject = new Subject(); + + @Input() isActive: boolean; + show: boolean = false; + + constructor( + @Inject(DOCUMENT) private _document: Document) { + super(); + } + + + ngOnInit(): void { + //emit value every 500ms + // const source = interval(500); + // this.subscription = source.subscribe(val => { + // const headers = Array.from(this._document.querySelectorAll(this.headerSelectors)) as HTMLElement[]; + // this.linksSubject.next(headers); + // }); + + // if (!this.links || this.links.length === 0) { + // this.linksSubject.asObservable() + // .pipe(distinctUntilChanged((p: HTMLElement[], q: HTMLElement[]) => JSON.stringify(p) == JSON.stringify(q))) + // .subscribe(headers => { + // const links: Array = []; + + // if (headers.length) { + // let page; + // let section; + // let show + // for (const header of headers) { + // let name; + // let id; + // if (header.classList.contains('toc-page-header')) { // deprecated after removing stepper + // name = header.innerText.trim().replace(/^link/, ''); + // id = header.id; + // page = header.id.split('_')[1]; + // section = undefined; + // show = true; + // } else if (header.classList.contains('toc-section-header')) { + // name = header.childNodes[0].childNodes[0].childNodes[0].childNodes[0].childNodes[0].nodeValue.trim().replace(/^link/, ''); + // id = header.id; + // page = header.id.split('.')[1]; + // section = header.id; + // if (header.id.split('.')[4]) { show = false; } + // else { show = true; } + // } else if (header.classList.contains('toc-compositeField-header')) { + // name = (header.childNodes[0]).nodeValue.trim().replace(/^link/, ''); + // id = header.id; + // // id = header.parentElement.parentElement.parentElement.id; + // show = false; + // } + // const { top } = header.getBoundingClientRect(); + // links.push({ + // name, + // id, + // type: header.tagName.toLowerCase(), + // top: top, + // active: false, + // page: page, + // section: section, + // show: show, + // selected: false + // }); + // } + // } + // this.links = links; + // // Initialize selected for button next on dataset wizard component editor + // this.links.length > 0 ? this.links[0].selected = true : null; + // }) + // } + + } + + ngOnChanges(changes: SimpleChanges) { + // if (!this.isActive && this.links && this.links.length > 0) { + // this.links.forEach(link => { + // link.selected = false; + // }) + // this.links[0].selected = true; + // } + } + + goToStep(link: Link) { + // this.stepFound.emit({ + // page: link.page, + // section: link.section + // }); + // this.currentLinks.emit(this.links); + + // setTimeout(() => { + // const target = document.getElementById(link.id); + // target.scrollIntoView(true); + + // var scrolledY = window.scrollY; + // if (scrolledY) { + // window.scroll(0, scrolledY - 70); + // } + // }, 500); + } + + toggle(headerLink: Link) { + // const headerPage = +headerLink.name.split(" ", 1); + // let innerPage; + // for (const link of this.links) { + // link.selected = false; + // if (link.type === 'mat-expansion-panel') { + // innerPage = +link.name.split(".", 1)[0]; + // if (isNaN(innerPage)) { innerPage = +link.name.split(" ", 1) } + // } else if (link.type === 'h5') { + // innerPage = +link.name.split(".", 1)[0]; + // } + // if (headerPage === innerPage && (link.type !== 'mat-expansion-panel' || (link.type === 'mat-expansion-panel' && link.id.split(".")[4]))) { + // link.show = !link.show; + // } + // } + // headerLink.selected = true; + } + + // getIndex(link: Link): number { + // return +link.id.split("_", 2)[1]; + // } + +} + +export interface LinkToScroll { + page: number; + section: number; +} diff --git a/dmp-frontend/src/app/ui/dataset/dataset.module.ts b/dmp-frontend/src/app/ui/dataset/dataset.module.ts index 720e27218..ec553bef5 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.module.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.module.ts @@ -1,4 +1,5 @@ import { NgModule } from '@angular/core'; +import { FormattingModule } from '@app/core/formatting.module'; import { AutoCompleteModule } from '@app/library/auto-complete/auto-complete.module'; import { ExportMethodDialogModule } from '@app/library/export-method-dialog/export-method-dialog.module'; import { UrlListingModule } from '@app/library/url-listing/url-listing.module'; @@ -22,14 +23,10 @@ import { FormValidationErrorsDialogModule } from '@common/forms/form-validation- import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; import { AngularStickyThingsModule } from '@w11k/angular-sticky-things'; -import { DatasetCopyDialogModule } from './dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module'; -import { DatasetOverviewModule } from './overview/dataset-overview.module'; -import { DatasetCriteriaDialogComponent } from './listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component'; -import { DmpEditorComponent } from '../dmp/editor/dmp-editor.component'; -import { DatasetEditorDetailsComponent } from '../dmp/editor/dataset-editor-details/dataset-editor-details.component'; -import { DatasetEditorDetailsModule } from '../dmp/editor/dataset-editor-details/dataset-editor-details.module'; import { FormProgressIndicationModule } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.module'; -import { FormattingModule } from '@app/core/formatting.module'; +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'; @NgModule({ imports: [ @@ -77,7 +74,10 @@ import { FormattingModule } from '@app/core/formatting.module'; DatasetExternalDataRepositoryDialogEditorComponent, DatasetExternalDatasetDialogEditorComponent, DatasetExternalRegistryDialogEditorComponent, - DatasetExternalServiceDialogEditorComponent + DatasetExternalServiceDialogEditorComponent, + + DatasetEditorComponent, + DatasetDescriptionFormModule ] }) export class DatasetModule { } diff --git a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts index 7d54ef8b6..b024aa044 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts @@ -4,7 +4,6 @@ import { AuthGuard } from '../../core/auth-guard.service'; import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; import { DatasetListingComponent } from './listing/dataset-listing.component'; import { DatasetOverviewComponent } from './overview/dataset-overview.component'; -import { DmpEditorComponent } from '../dmp/editor/dmp-editor.component'; const routes: Routes = [ { From 1614945185a9ee46911ef2cbacf84816e806f8dd Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Thu, 4 Feb 2021 10:33:03 +0200 Subject: [PATCH 03/53] More Dataset Profile editor changes --- .../dataset-profile-editor.component.html | 23 ++- .../dataset-profile-editor.component.ts | 139 +++++++++++++++++- .../table-of-contents-entry.ts | 7 + .../table-of-contents/table-of-contents.html | 6 +- .../table-of-contents/table-of-contents.ts | 16 ++ 5 files changed, 183 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 d9e634bd7..b0be33e63 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 @@ -69,10 +69,29 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}}
- +
- - - {{link.label}} - + + {{link.label}} +
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 ec6160e56..00981444a 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 @@ -36,6 +36,10 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn headerSelectors = '.toc-page-header, .toc-section-header, .toc-compositeField-header'; @Output() stepFound = new EventEmitter(); @Output() currentLinks = new EventEmitter(); + + @Output() itemClick = new EventEmitter(); + + subscription: Subscription; linksSubject: Subject = new Subject(); @@ -159,6 +163,18 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn // return +link.id.split("_", 2)[1]; // } + + itemClicked(item: ToCEntry){ + //leaf node + this.itemClick.emit([item]); + } + + propagateClickToParent(childIds:ToCEntry[], currentItem: ToCEntry){ + childIds.push(currentItem); + this.itemClick.emit(childIds); + } + + } export interface LinkToScroll { From 6470a8e6a6fc54234f0ae0dd449d1b6372342e48 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Thu, 4 Feb 2021 12:22:52 +0200 Subject: [PATCH 04/53] more dataset profile changes --- .../dataset-profile/dataset-profile.module.ts | 4 +- ...aset-profile-editor-section.component.html | 12 +- ...ataset-profile-editor-section.component.ts | 14 +- .../dataset-profile-editor.component.html | 49 +++- .../dataset-profile-editor.component.ts | 243 ++++++++++++------ .../table-of-contents-entry.ts | 11 +- .../table-of-contents-internal-section.html | 5 + .../table-of-contents-internal-section.scss | 70 +++++ .../table-of-contents-internal-section.ts | 40 +++ .../table-of-contents/table-of-contents.html | 7 +- .../table-of-contents/table-of-contents.ts | 12 +- 11 files changed, 355 insertions(+), 112 deletions(-) create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.scss create mode 100644 dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.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 66094e595..7494dc6b2 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 @@ -44,6 +44,7 @@ import { DatasetProfileEditorValidatorFieldComponent } from './editor/components import { NgxDropzoneModule } from 'ngx-dropzone'; 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'; @NgModule({ imports: [ @@ -92,7 +93,8 @@ import { DatasetProfileTableOfContents } from './table-of-contents/table-of-cont DatasetProfileEditorDatasetIdentifierFieldComponent, DatasetProfileEditorCurrencyFieldComponent, DatasetProfileEditorValidatorFieldComponent, - DatasetProfileTableOfContents + DatasetProfileTableOfContents, + DatasetProfileTableOfContentsInternalSection ], entryComponents: [ DialogConfirmationUploadDatasetProfiles 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 c1f35e67a..00f667062 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 @@ -33,7 +33,8 @@ false
--> -

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.SECTION.FIELDS.FIELDS-TITLE' | + +

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.SECTION.FIELDS.SUB-SECTIONS-TITLE' | translate}}

-
- +
+ {{i + 1}}. {{form.get('sections').get(''+i).get('title').value}}
@@ -62,7 +64,7 @@
-
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts index 9f54487c6..95071fd16 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts @@ -15,7 +15,7 @@ import { takeUntil } from 'rxjs/operators'; export class DatasetProfileEditorSectionComponent extends BaseComponent implements OnInit { @Input() form: FormGroup; - @Input() dataModel: SectionEditorModel; + //@Input() dataModel: SectionEditorModel; @Input() indexPath: string; @Input() viewOnly: boolean; @@ -34,26 +34,26 @@ export class DatasetProfileEditorSectionComponent extends BaseComponent implemen const field: FieldEditorModel = new FieldEditorModel(); field.id = Guid.create().toString(); fieldSet.fields.push(field); - if (this.dataModel.fieldSets) { + // if (this.dataModel.fieldSets) { fieldSet.id = Guid.create().toString(); - this.dataModel.fieldSets.push(fieldSet); - } + //this.dataModel.fieldSets.push(fieldSet); + //} (this.form.get('fieldSets')).push(fieldSet.buildForm()); } addSectioninSection() { const section: SectionEditorModel = new SectionEditorModel(); - this.dataModel.sections.push(section); + //this.dataModel.sections.push(section); (this.form.get('sections')).push(section.buildForm()); } DeleteSectionInSection(index) { - this.dataModel.sections.splice(index, 1); + //this.dataModel.sections.splice(index, 1); (this.form.get('sections')).removeAt(index); } deleteFieldSet(index) { - this.dataModel.fieldSets.splice(index, 1); + //this.dataModel.fieldSets.splice(index, 1); (this.form.get('fieldSets')).removeAt(index); } 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 b0be33e63..ea4c54a35 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 @@ -69,28 +69,63 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}}
- +
-
- +
+ +
+ + + + +
+

+ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.SECTION.FIELDS.FIELDS-TITLE' | + translate}}

+
+ + + + + + +
+ + +
+ + - - + -->
- @@ -6,10 +6,11 @@ - + +
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 00981444a..858ba8447 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 @@ -37,7 +37,7 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn @Output() stepFound = new EventEmitter(); @Output() currentLinks = new EventEmitter(); - @Output() itemClick = new EventEmitter(); + @Output() itemClick = new EventEmitter(); subscription: Subscription; @@ -166,13 +166,13 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn itemClicked(item: ToCEntry){ //leaf node - this.itemClick.emit([item]); + this.itemClick.emit(item); } - propagateClickToParent(childIds:ToCEntry[], currentItem: ToCEntry){ - childIds.push(currentItem); - this.itemClick.emit(childIds); - } + // propagateClickToParent(childIds:ToCEntry[], currentItem: ToCEntry){ + // childIds.push(currentItem); + // this.itemClick.emit(childIds); + // } } From 8a9277f0e67979dc92645c878617d1cb8eafd8bc Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Fri, 12 Feb 2021 13:05:40 +0200 Subject: [PATCH 05/53] portuguese language addition (cherry picked from commit 930ef5993661fc228c6ecb83a651bb4484cb3445) --- .../pipes/date-time-culture-format.pipe.ts | 6 + dmp-frontend/src/assets/i18n/pt.json | 1596 +++++++++++++++++ .../src/assets/resources/language.json | 4 + .../src/assets/splash/about/contributors.html | 22 + .../splash/assets/img/flag-of-portugal.png | Bin 0 -> 19164 bytes .../splash/assets/img/flag-of-serbia.png | Bin 0 -> 19984 bytes 6 files changed, 1628 insertions(+) create mode 100644 dmp-frontend/src/assets/i18n/pt.json create mode 100644 dmp-frontend/src/assets/splash/assets/img/flag-of-portugal.png create mode 100644 dmp-frontend/src/assets/splash/assets/img/flag-of-serbia.png diff --git a/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts b/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts index be3da56ae..967c699fa 100644 --- a/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts +++ b/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts @@ -5,6 +5,7 @@ import localeEs from '@angular/common/locales/es'; import localeSk from '@angular/common/locales/sk'; import localeTr from '@angular/common/locales/tr'; import localeSr from '@angular/common/locales/sr'; +import localePt from '@angular/common/locales/pt'; import { Pipe, PipeTransform } from '@angular/core'; import { LangChangeEvent, TranslateService } from '@ngx-translate/core'; import 'moment-timezone'; @@ -77,6 +78,11 @@ export class DateTimeCultureFormatPipe implements PipeTransform { registerLocaleData(localeSr); break; } + case 'pt': { + locale = this.cultureValues.get('pt-PT').name; + registerLocaleData(localePt); + break; + } default: { locale = this.cultureValues.get('en-US').name; break; diff --git a/dmp-frontend/src/assets/i18n/pt.json b/dmp-frontend/src/assets/i18n/pt.json new file mode 100644 index 000000000..7636e7cbd --- /dev/null +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -0,0 +1,1596 @@ +{ + "GENERAL": { + "VALIDATION": { + "REQUIRED": "Obrigatório", + "GRANT-START-AFTER-END": "A data de início do financiamento não pode ser posterior à data de término", + "PATTERN-_": "O caracter \"_\" não é permitido" + }, + "DELETE-CONFIRMATION": { + "TITLE": "Atenção", + "MESSAGE": "Tem a certeza de que quer eliminar este item?", + "POSITIVE": "Sim", + "NEGATIVE": "Cancelar" + }, + "SNACK-BAR": { + "SUCCESSFUL-CREATION": "Criado com sucesso", + "SUCCESSFUL-UPDATE": "Atualizado com sucesso", + "SUCCESSFUL-LOGIN": "Início de sessão bem sucedido", + "SUCCESSFUL-LOGOUT": "Sessão terminada com sucesso", + "SUCCESSFUL-EMAIL-SEND": "Email enviado com sucesso", + "SUCCESSFUL-COPY-TO-CLIPBOARD": "Copied to Clipboard", + "UNSUCCESSFUL-LOGOUT": "Não foi possível terminar a sessão", + "UNSUCCESSFUL-LOGIN": "Não foi possível iniciar a sessão", + "SUCCESSFUL-DATASET-PROFILE-DELETE": "Eliminado com sucesso", + "UNSUCCESSFUL-DATASET-PROFILE-DELETE": "Este modelo não pode ser eliminado, porque existem Datasets associados", + "SUCCESSFUL-DELETE": "Eliminado com sucesso", + "UNSUCCESSFUL-DELETE": "Não eliminado", + "UNSUCCESSFUL-EMAIL-SEND": "Falha no envio de email", + "UNSUCCESSFUL-REMOVE-TEMPLATE": "Falha na remoção do modelo, um ou mais Datasets deste PGD utilizam este modelo" + }, + "ERRORS": { + "HTTP-REQUEST-ERROR": "Ocorreu um erro inesperado" + }, + "NAMES": { + "DATASET": "Dataset" + }, + "STATUSES": { + "EDIT": "Editado", + "FINALISED": "Concluído" + }, + "FORM-VALIDATION-DISPLAY-DIALOG": { + "WARNING": "Atenção!", + "THIS-FIELD": "Campo", + "HAS-ERROR": "Tem erro", + "REQUIRED": "Obrigatório", + "EMAIL": "Email inválido", + "MIN-VALUE": "O valor mínimo deve ser {{min}}", + "MAX-VALUE": "O valor máximo deve ser {{max}}", + "ACTIONS": { + "CANCEL": "Fechar" + } + }, + "CONFIRMATION-DIALOG": { + "DELETE-ITEM": "Eliminar este item?", + "DELETE-USER": "Remover este colaborador?", + "FINALIZE-ITEM": "Concluir este item?", + "UNFINALIZE-ITEM": "Cancelar a Conclusão?", + "PUBLISH-ITEM": "Publicar este item?", + "ADD-DATASET": "Deseja continuar adicionar Datasets ao seu PGD? Poderá sempre adicionar mais Datasets através do menu \"Adicionar Dataset (Assistente)\".", + "ZENODO-DOI": "Deseja criar um identificador de objeto digital (DOI) com a conta {{username}} para o PGD?", + "LEAVE-PAGE": "Se sair, as suas alterações não serão guardadas.", + "LEAVE-WARNING": "Tem alterações não guardadas!", + "PRIVACY-POLICY-NAMES": "Os nomes de todas as pessoas envolvidas neste PGD estarão visíveis publicamente. Concorda com isso?", + "ACTIONS": { + "CONFIRM": "Sim", + "NO": "Não", + "DELETE": "Eliminar", + "REMOVE": "Remover", + "CANCEL": "Cancelar", + "LEAVE": "Sair", + "POLICY-AGREE": "Tornar os nomes visíveis ao público.", + "REQUIRED": "Clicar na caixa de verificação é obrigatório." + } + }, + "NOTIFICATION-DIALOG": { + "POPUP": { + "TITLE": "Dataset em falta", + "MESSAGE": "Pelo menos um Dataset tem de ser criado para poder guardar o PGD.", + "CLOSE": "Fechar" + } + }, + "START-NEW-DMP-DIALOG": { + "IMPORT": "Importar", + "FUNCTION-SUPPORTS": "suporta a função", + "JSON-FILES": "ficheiros .json", + "PRODUCED": "produzido", + "RDA-SPECIFICATIONS": "de acordo com as especificações da RDA", + "MACHINE-ACTIONABLE": "para PGDs acionáveis por máquina", + "UPLOAD-FILE": "Carregar Ficheiro", + "REPLACE-FILE": "Replace File" + }, + "INVITATION-DIALOG": { + "HINT": "Prima vírgula ou \"Enter\" entre os autores", + "SUCCESS": "Convite enviado com sucesso", + "ERROR": "O envio de convite falhou" + }, + "DMP-TO-DATASET-DIALOG": { + "FROM-DMP": "Criou com sucesso o seu", + "DMP": "PGD", + "TO-DATASET": "Será transferido para o", + "DATASET": "Dataset", + "EDITOR": "editor", + "START": "vamos começar" + }, + "ACTIONS": { + "VIEW-ALL": "Ver Tudo", + "SHOW-MORE": "Mostrar mais", + "LOAD-MORE": "Carregar mais", + "SHOW-LESS": "Mostrar menos", + "LOG-IN": "Iniciar Sessão", + "TAKE-A-TOUR": "Necessita de ajuda? Faça uma visita guiada." + }, + "PREPOSITIONS": { + "OF": "de" + }, + "TITLES": { + "PREFIX": "Abrir PGD - ", + "GENERAL": "Criar Planos de Gestão de Dados", + "ABOUT": "Sobre", + "PRIVACY": "Política de Privacidade", + "OPENSOURCE-LICENCES": "Licenciamento Opensource", + "TERMS": "Termos do Serviço", + "COOKIES-POLICY": "Política de Cookies", + "PLANS": "Os meus PGDs", + "EXPLORE-PLANS": "PGDs publicados", + "QUICK-WIZARD": "Novo PGD (Assistente)", + "PLANS-NEW": "Novo PGD (Experiente)", + "DMP-NEW": "Novo PGD", + "DATASETS": "Os meus Datasets", + "EXPLORE": "Datasets publicados", + "DATASETCREATEWIZARD": "Adicionar Dataset (Assistente)", + "GRANTS": "Os meus Grants", + "DMP-PROFILES": "Modelos de PGD", + "DATASET-PROFILES": "Modelos de Dataset", + "USERS": "Utilizadores", + "PROFILE": "O meu Perfil", + "LOGIN": "Iniciar Sessão", + "DMP-OVERVIEW": "Visão geral do PGD", + "DMP-EDIT": "Editar PGD", + "DATASET-OVERVIEW": "Visão geral do Dataset", + "DATASET-EDIT": "Ver/Editar Dataset", + "DMP-NEW-VERSION": "Nova versão do PGD", + "DMP-CLONE": "Duplicar Plano", + "DATASET-NEW": "Novo Dataset", + "GRANT-NEW": "Novo Grant", + "GRANT-EDIT": "Ver/Editar Grant", + "DMP-PROFILE-NEW": "Novo Modelo de PGD", + "DMP-PROFILE-EDIT": "Editar Modelo de PGD", + "DATASET-PROFILES-NEW": "Novo Modelo de Dataset", + "DATASET-PROFILES-EDIT": "Editar Modelo de Dataset", + "EXPLORE-PLANS-OVERVIEW": "Visão geral do PGD publicado", + "DATASET-PUBLIC-EDIT": "Ver Dataset Publicado", + "DMP-PUBLIC-EDIT": "Ver PGD Publicado", + "DATASET-COPY": "Copiar Dataset", + "DATASET-UPDATE": "Atualizar Dataset", + "DATASET-PROFILES-NEW-VERSION": "Nova versão do Modelo de Dataset", + "DATASET-PROFILES-CLONE": "Duplicação do Modelo de Dataset", + "LANGUAGE-EDITOR": "Editor de idioma", + "GUIDE-EDITOR": "Editor do Guia do Utilizador", + "LANGUAGE": "Idioma", + "SIGN-IN": "Entrar na conta" + }, + "FILE-TYPES": { + "PDF": "PDF", + "XML": "XML", + "JSON": "RDA JSON", + "DOC": "DOCX" + }, + "LANGUAGES": { + "ENGLISH": "Inglês", + "GREEK": "Grego", + "SPANISH": "Espanhol", + "GERMAN": "Alemão", + "TURKISH": "Turco", + "SLOVAK": "Eslovaco", + "SERBIAN": "Serbian" + } + }, + "COOKIE": { + "MESSAGE": "Esta página Web utiliza cookies para melhorar a experiência do utilizador.", + "DISMISS": "Aceitar", + "DENY": "Recusar cookies", + "LINK": "Saiba mais", + "POLICY": "Política de Cookies" + }, + "EMAIL-CONFIRMATION": { + "EXPIRED-EMAIL": "O convite por email expirou", + "CARD-TITLE": "Email", + "REQUEST-EMAIL-HEADER": "Está quase! Por favor, preencha o seu email.", + "REQUEST-EMAIL-TEXT": "Terá de o confirmar para utilizar a aplicação.", + "SUBMIT": "Submeter", + "SENT-EMAIL-HEADER": "Foi enviado email!", + "EMAIL-FOUND": "O email já está confirmado" + }, + "HOME": { + "DMPS": "PGDs", + "DATASETS": "Datasets", + "LOGIN": { + "TITLE": "Iniciar sessão", + "TEXT": "Não necessita de ter uma conta registada para o ARGOS" + } + }, + "NAV-BAR": { + "BREADCRUMB-ROOT": "Painel", + "TITLE": "ARGOS", + "GRANTS": "Grants", + "GRANT": "Grant", + "DMP": "PGD", + "DMPS": "PGDs", + "MY-DMPS": "Os meus PGDs", + "DATASETS": "Datasets", + "DATASET": "Dataset", + "PUBLIC-DATASETS": "Explorar ARGOS", + "USERS": "Utilizadores", + "DATASETS-ADMIN": "Modelos de Dataset", + "DMP-PROFILES": "Modelos de PGD", + "ABOUT": "Sobre", + "MY-DATASET-DESCRIPTIONS": "OS MEUS DatasetS", + "DATASET-DESCRIPTION-WIZARD": "Assistente de Dataset", + "PUBLIC DATASETS": "DatasetS PUBLICADOS", + "PUBLIC-DMPS": "PGDs PUBLICADOS", + "HOME": "HOME", + "DMP-WIZARD": "Assistente de DMP", + "DATASET-TEMPLATES": "MODELOS DE Dataset", + "TEMPLATE": "MODELO", + "DMP-TEMPLATES": "MODELOS DE PGD", + "USERS-BREADCRUMB": "UTILIZADORES", + "START-NEW-DMP": "Iniciar novo PGD", + "START-NEW-DMP-TXT": "Inicie um novo ou continue o seu trabalho no Argos! Crie um novo PGD ou carregue um PGD existente para o Argos", + "START-WIZARD": "Iniciar Assistente", + "IMPORT-FROM-FILE": "Importar de ficheiro", + "SEARCH": { + "DATASET": "Dataset", + "DMP": "PGD", + "GRANT": "Grant", + "PUBLISHED": "Publicado" + } + }, + "SIDE-BAR": { + "GENERAL": "GERAL", + "ABOUT": "Sobre", + "DASHBOARD": "Home", + "DMP": "PLANOS DE GESTÃO DE DADOS", + "MY-DMPS": "Os meus PGDs", + "DATASETS": "DatasetS", + "GRANTS": "GRANTS", + "NEW DATASET": "Novo Dataset", + "QUICK-WIZARD": "Novo PGD (Assistente)", + "QUICK-WIZARD-DATASET": "Adicionar Dataset (Assistente)", + "ADD-EXPERT": "Novo PGD (Experiente)", + "MY-DATASET-DESC": "As minhas descrições de Datasets", + "MY-DATASETS": "Os meus Datasets", + "MY-GRANTS": "Os meus Grants", + "HISTORY": "HISTÓRICO", + "HISTORY-VISITED": "VISITADOS RECENTEMENTE", + "HISTORY-EDITED": "EDITADOS RECENTEMENTE", + "PUBLIC": "PUBLICADOS", + "PUBLIC-DMPS": "PGDs públicos", + "PUBLIC-DESC": "Descrições dos Datasets públicos", + "ACCOUNT": "CONTA", + "ADMIN": "Administrador", + "DATASET-TEMPLATES": "Modelos de Dataset", + "DMP-TEMPLATES": "Modelos de PGD", + "USERS": "Utilizadores", + "LANGUAGE-EDITOR": "Editor de idioma", + "GUIDE-EDITOR": "Editor do Guia do Utilizador", + "CO-BRANDING": "Co-Branding", + "SUPPORT": "Suporte", + "FEEDBACK": "Enviar comentários" + }, + "DATASET-PROFILE-EDITOR": { + "TITLE": { + "NEW": "Novo Cliente API", + "NEW-PROFILE": "Novo Modelo de Dataset", + "NEW-PROFILE-VERSION": "Nova Versão de ", + "NEW-PROFILE-CLONE": "Duplicação de " + }, + "FIELDS": { + "DATASET-TITLE": "Nome do Modelo do Dataset", + "DATASET-DESCRIPTION": "Descrição", + "ROLES": "Funções" + }, + "STEPS": { + "PAGES": { + "TITLE": "Descrição da Página", + "PAGE-PREFIX": "Página", + "PAGE-INPUT-TITLE": "Título da Página", + "DATASET-DETAILS": "Detalhes do Dataset", + "EXTERNAL-REFERENCES": "Referências Externas", + "DESCRIPTION": "Descrição" + }, + "FORM": { + "TITLE": "Descrição do Formulário", + "SECTION": { + "TITLE": "Informação da Secção", + "FIELDS": { + "ID": "Identificador Único da Secção", + "TITLE": "Nome da Secção", + "PAGE": "Página a ser exibida", + "ORDER": "Ordem", + "DESCRIPTION": "Descrição", + "FIELDS-TITLE": "Campos", + "SUB-SECTIONS-TITLE": "Sub-Secções" + }, + "ACTIONS": { + "ADD-SUB-SECTION": "Adicionar Sub-Secção +", + "ADD-FIELD": "Adicionar Campo +" + } + }, + "COMPOSITE-FIELD": { + "TITLE": "Informação do Campo Composto", + "SIMPLE-FIELD-TITLE": "Informação do Campo", + "SUB-FIELDS-TITLE": "Campos Subordinados", + "FIELDS": { + "COMPOSITE-CHECKBOX": "Campo Composto", + "MULTIPLICITY-CHECKBOX": "Multiplicidade", + "COMMENT-CHECKBOX": "Incluir Campo de Comentários", + "COMPOSITE-TITLE": "Nome do Campo Composto", + "FIELD-TITLE": "Nome do Campo", + "DESCRIPTION": "Descrição", + "EXTENDED-DESCRIPTION": "Descrição Alargada", + "ADDITIONAL-INFORMATION": "Informação Adicional", + "MULTIPLICITY-MIN": "Multiplicidade Min", + "MULTIPLICITY-MAX": "Multiplicidade Máx", + "MULTIPLICITY-ADD-ONE-FIELD": "Adicionar mais um conjunto de campos", + "ORDER": "Ordem", + "COMMENT-PLACEHOLDER": "Por favor especifique", + "COMMENT-HINT": "Disponibilize informação ou justificação adicional sobre a sua seleção", + "RDA-COMMON-STANDARDS": "Normas RDA" + }, + "ACTIONS": { + "ADD-CHILD-FIELD": "Adicionar Campo Subordinado +" + } + }, + "FIELD": { + "FIELDS": { + "RULES-TITLE": "Regras de Visibilidade", + "FIELD-RULES-VALUE": "Valor", + "ID": "Identificador Único da Secção", + "VIEW-STYLE": "Tipo", + "MULTIPLICITY-MIN": "Multiplicidade Min", + "MULTIPLICITY-MAX": "Multiplicidade Máx", + "ORDER": "Ordem", + "DEFAULT-VALUE": "Valor Padrão", + "VALIDATION": "Validação", + "MULTIPLICITY-CHECKBOX": "Multiplicidade", + "FIELD-TEXT-AREA-TITLE": "Dados da Área de Texto", + "FIELD-TEXT-AREA-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-BOOLEAN-DECISION-TITLE": "Dados Booleanos de Decisão", + "FIELD-BOOLEAN-DECISION-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-CHECKBOX-TITLE": "Dados da caixa de verificação", + "FIELD-CHECKBOX-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-FREE-TEXT-TITLE": "Dados do Texto Livre", + "FIELD-FREE-TEXT-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-COMBO-BOX-TYPE": "Tipo de Caixa de Combinação", + "FIELD-WORD-LIST-TITLE": "Dados da Lista de Palavras", + "FIELD-WORD-LIST-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-WORD-LIST-LABEL": "Etiqueta", + "FIELD-WORD-LIST-VALUE": "Valor", + "FIELD-INTERNAL-DMP-ENTITIES-TYPE": "Tipo de Entidade Interna do PGD", + "FIELD-RESEARCHERS-TITLE": "Autocompletar Investigadores", + "FIELD-RESEARCHERS-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-DATASETS-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-DMPS-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-RADIO-BOX-TITLE": "Dados de Escolha Múltipla", + "FIELD-RADIO-BOX-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-RADIO-BOX-LABEL": "Etiqueta", + "FIELD-RADIO-BOX-VALUE": "Valor", + "FIELD-AUTOCOMPLETE-TITLE": "Autopreenchimento de Dados", + "FIELD-AUTOCOMPLETE-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-AUTOCOMPLETE-SOURCE-TITLE": "Fontes", + "FIELD-AUTOCOMPLETE-ADD_SOURCE": "Adicionar Fonte", + "FIELD-AUTOCOMPLETE-TYPE": "Tipo de Fonte", + "FIELD-AUTOCOMPLETE-TYPE-UNCACHED": "Uncached", + "FIELD-AUTOCOMPLETE-TYPE-CACHED": "Cached", + "FIELD-AUTOCOMPLETE-LABEL": "Etiqueta", + "FIELD-AUTOCOMPLETE-VALUE": "Valor", + "FIELD-AUTOCOMPLETE-SOURCE": "Fonte", + "FIELD-AUTOCOMPLETE-URL": "Url", + "FIELD-AUTOCOMPLETE-OPTIONS-ROOT": "Opções de Raiz", + "FIELD-DATE-PICKER-TITLE": "Escolha da Data", + "FIELD-DATE-PICKER-PLACEHOLDER": "Sugestão de Preenchimento", + "FIELD-DATE-PICKER-LABEL": "Etiqueta", + "FIELD-DATE-PICKER-VALUE": "Valor", + "FIELD-MULTIPLE-AUTOCOMPLETE": "Autopreenchimento Múltiplo", + "FIELD-MULTIPLE-WORDLIST": "Seleção Múltipla" + }, + "DEFAULT-VALUES": { + "NONE": "Nenhum", + "BOOLEAN-DECISION": { + "YES": "Sim", + "NO": "Não" + }, + "CHECK-BOX": { + "CHECKED": "Verificado", + "UNCHECKED": "Não verificado" + } + }, + "ACTIONS": { + "ADD-RULE": "Adicionar Regra de Visibilidade +" + } + }, + "RULE": { + "FIELDS": { + "RULE-TYPE": "Tipo de Regra", + "TARGET": "Id do Campo de Destino", + "VALUE": "Valor Obrigatório", + "RULE-IF": "Se Valor é", + "RULE-THEN": "então mostrar Campo com o Id" + } + } + } + }, + "ACTIONS": { + "SAVE": "Guardar", + "FINALIZE": "Concluir", + "UPDATE": "Atualizar", + "CANCEL": "Cancelar", + "DELETE": "Eliminar", + "ADD-PAGE": "Adicionar Página +", + "ADD-SECTION": "Adicionar Secção +", + "VALIDATE": "Validar" + } + }, + "GRANT-LISTING": { + "TITLE": "Grants", + "SUBTITLE": "Subtítulo do Grant", + "ACTIONS": { + "NEW": "Novo Grant" + } + }, + "DMP-LISTING": { + "DMP": "PGD", + "GRANT": "Grant", + "TITLE": "Plano de Gestão de Dados", + "OWNER": "Proprietário", + "MEMBER": "Membro", + "CREATOR": "Autor", + "EDITED": "Editado", + "FINALIZED": "Concluído", + "PUBLISHED": "Publicado", + "VERSION": "Versão", + "CONTAINED-DATASETS": "Contém Datasets", + "TEXT-INFO": "A informação contida no PGD demonstra como os Datasets foram recolhidos e/ou gerados, como foram processados e analisados, i.e., utilizando ferramentas, normas, metodologias etc., 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", + "LINK-ZENODO": "Comunidade LIBER no Zenodo", + "GET-IDEA": "para ter uma ideia!", + "SORT-BY": "Ordenar por", + "COLUMNS": { + "NAME": "Nome", + "GRANT": "Grant", + "PROFILE": "Modelo", + "CREATION-TIME": "Data de Criação", + "ORGANISATIONS": "Organizações", + "LATEST_VERSION": "Última Versão", + "ACTIONS": "Ações", + "DATASETS": "Datasets", + "STATUS": "Estado", + "PEOPLE": "Pessoas", + "VERSION": "Versão" + }, + "ACTIONS": { + "NEW": "Novo PGD", + "NEW-WITH-WIZARD": "Novo PGD utilizando o Assistente", + "EDIT": "Editar", + "INVITE": "Convidar Colaboradores", + "INVITE-AUTHORS": "Convidar Autores", + "INVITE-SHORT": "Convidar", + "ADD-DATASET": "Adicionar Dataset ao PGD", + "ADD-DATASET-DESCRIPTION": "Adicionar Dataset", + "ADD-DATASET-SHORT": "Adicionar Dataset", + "DATASETS": "Listar todos os Datasets do PGD", + "NEW-VERSION": "Nova Versão", + "START-NEW-VERSION": "Iniciar Nova Versão", + "VIEW-VERSION": "Ver todas as Versões do PGD", + "CLONE": "Duplicar", + "COPY": "Copy", + "DELETE": "Eliminar", + "DEPOSIT": "Depositar", + "EXPORT": "Exportar", + "MAKE-PUBLIC": "Tornar Público", + "PUBLISH": "Publicar", + "FINALIZE": "Concluir", + "UNFINALIZE": "Anular", + "ADV-EXP": "Exportação Avançada", + "EXP-AS": "Exportar como", + "DOWNLOAD-XML": "XML", + "DOWNLOAD-DOCX": "DOCX", + "DOWNLOAD-PDF": "PDF", + "SETTINGS": "Configurações", + "GETDOI": "Obter o DOI" + }, + "TOOLTIP": { + "DMP-STATUS": { + "DRAFT": "Acesso Privado - PGD Editável", + "FINALIZED": "Acesso Privado - PGD Fechado", + "PUBLISHED": "Acesso Público - PGD Fechado" + }, + "LEVEL-OF-ACCESS": "Nível de Acesso", + "INVOLVED-DATASETS": "Datasets Implicados", + "TEMPLATES-INVOLVED": "Modelo de Dataset Implicado" + }, + "VIEW-ALL-VERSIONS": "Todas as versões de", + "EMPTY-LIST": "Lista Vazia" + }, + "DMP-PUBLIC-LISTING": { + "TITLE": "Plano de Gestão de Dados Publicado", + "OWNER": "Proprietário", + "MEMBER": "Membro", + "CREATOR": "Autor", + "VIEW-ONLY": "Ver Apenas", + "TOOLTIP": { + "PUBLISHED": "Acesso Público - PGD Fechado", + "INVOLVED-DATASETS": "Datasets Implicados", + "TEMPLATES-INVOLVED": "Modelo de Dataset Implicado" + }, + "EMPTY-LIST": "Lista Vazia" + }, + "DMP-UPLOAD": { + "TITLE": "Importar o Plano de Gestão de Dados", + "UPLOAD-BUTTON": "Carregar", + "UPLOAD-SUCCESS": "Importação com Successo", + "ACTIONS": { + "IMPORT": "Importar", + "CANCEL": "Cancelar" + }, + "PLACEHOLDER": "Título do PDG" + }, + "DATASET-WIZARD": { + "TITLE": { + "NEW": "Novo Dataset" + }, + "EDITOR": { + "FIELDS": { + "EXTERNAL-DATASET-TYPE": "Tipo", + "EXTERNAL-AUTOCOMPLETE-SUBTITLE": "Fonte: ", + "EXTERNAL-AUTOCOMPLETE-NO-SOURCE": "Fonte não disponibilizada" + } + }, + "FIRST-STEP": { + "TITLE": "Informação do Dataset", + "DMP": "Plano de Gestão de Dados", + "PROFILE": "Modelo do Dataset", + "SUB-TITLE": "Criado em: " + }, + "SECOND-STEP": { + "TITLE": "Referências Externas", + "EXTERNAL-HINT": "Lista de valores fornecidas por fonte(s) externa(s)" + }, + "THIRD-STEP": { + "TITLE": "Descrição" + }, + "ACTIONS": { + "NEXT": "Seguinte", + "BACK": "Voltar", + "BACK-TO": "Voltar para", + "DELETE": "Eliminar", + "GO-TO-GRANT": "Ir para o Grant do Dataset", + "GO-TO-DMP": "Ir para o PGD do Dataset", + "SAVE": "Guardar", + "SAVE-AND-ADD": "Guardar e Adicionar Novo", + "SAVE-AND-CLOSE": "Guardar e Fechar", + "SAVE-AND-FINALISE": "Guardar e Concluir", + "FINALIZE": "Concluir", + "REVERSE": "Reverter", + "INFO": "Datasets de PGDs finalizados não podem ser revertidos para não concluídos", + "LOCK": "O Dataset está bloqueado por outro utilizador", + "DOWNLOAD-PDF": "Exportar para PDF", + "DOWNLOAD-XML": "Exportar para XML", + "DOWNLOAD-DOCX": "Exportar para DOCX", + "COPY-DATASET": "Copiar o Dataset", + "UPDATE-DATASET-PROFILE": "Atualizar o Modelo" + }, + "MESSAGES": { + "DATASET-NOT-FOUND": "O Dataset não existe", + "DATASET-NOT-ALLOWED": "Não tem acesso a este Dataset", + "SUCCESS-UPDATE-DATASET-PROFILE": "O Modelo de Dataset foi atualizado com sucesso" + }, + "UPLOAD": { + "UPLOAD-XML": "Importar", + "UPLOAD-XML-FILE-TITLE": "Importar O Modelo do Dataset", + "UPLOAD-XML-NAME": "Nome do Modelo do Dataset", + "UPLOAD-XML-IMPORT": "Ficheiro", + "UPLOAD-XML-FILE-CANCEL": "Cancelar" + }, + "DIALOGUE": { + "TITLE": "Copiar o Dataset para o PGD", + "DMP-SEARCH": { + "PLACEHOLDER": "Pesquisar PGD" + }, + "COPY": "Copiar", + "CANCEL": "Cancelar", + "NEXT": "Seguinte", + "ERROR-MESSAGE": "Não contém este Modelo de Dataset" + } + }, + "DMP-OVERVIEW": { + "GRANT": "Grant", + "DMP-AUTHORS": "Autores do PGD", + "RESEARCHERS": "Investigadores", + "DATASETS-USED": "Datasets usados", + "COLLABORATORS": "Colaboradores", + "PUBLIC": "Público", + "PRIVATE": "Privado", + "LOCKED": "Bloqueado", + "UNLOCKED": "Desbloqueado", + "YOU": "Você", + "LOCK": "Bloquear", + "TOOLTIP": { + "LEVEL-OF-ACCESS": "Nível de Acesso", + "INVOLVED-DATASETS": "Datasets Implicados", + "TEMPLATES-INVOLVED": "Modelos de Dataset Implicados" + }, + "ERROR": { + "DELETED-DMP": "O PGD requerido foi eliminado", + "FORBIDEN-DMP": "Não está autorizado o acesso a este PGD" + }, + "MULTIPLE-DIALOG": { + "ZENODO-LOGIN": "Entre com o Zenodo", + "USE-DEFAULT": "Use o Token" + } + }, + "DATASET-OVERVIEW": { + "DATASET-AUTHORS": "Autores do Dataset", + "ERROR": { + "DELETED-DATASET": "O Dataset requerido foi eliminado", + "FORBIDEN-DATASET": "Não está autorizado o acesso a este Dataset" + } + }, + "DATASET-LISTING": { + "TITLE": "Datasets", + "DATASET-DESCRIPTION": "Dataset", + "SELECT-DATASETS-TO-CLONE": "Seleccionar quais os Datasets a incluir no novo PGD. Os Datasets seleccionados serão editáveis.", + "SELECT-DATASETS-NONE": "Datasets não disponíveis para este PDG.", + "TEXT-INFO": "Os Datasets são documentados segundo modelos pré-definidos que definem o conteúdo das descrições dos Datasets. No Argos, o PGD pode conter tantas descrições de Datasets quantos os Datasets que documenta. Pesquise ", + "TEXT-INFO-REST": " para ver os Datasets descritos no PGD do Argos", + "LINK-PUBLIC-DATASETS": "Datasets Públicos", + "TEXT-INFO-PAR": "Novos Datasets podem ser adicionados aos PGDs existentes em qualquer altura e ser descritos com mais do que um modelo. Os Datasets podem também ser duplicados e reutilizados em outros PGDs bem como serem removidos sem afetar o PGD como um todo.", + "COLUMNS": { + "NAME": "Nome", + "REFERNCE": "Referência", + "GRANT": "Grant", + "URI": "Uri", + "STATUS": "Estado", + "DESCRIPTION": "Descrição", + "CREATED": "Criado", + "PUBLISHED": "Publicado", + "FINALIZED": "Concluído", + "LAST-EDITED": "Última Edição", + "ACTIONS": "Ações", + "DMP": "PGD", + "PROFILE": "Modelo", + "DATAREPOSITORIES": "Repositório de Dados", + "REGISTRIES": "Registos", + "SERVICES": "Serviços" + }, + "ACTIONS": { + "EDIT": "Editar", + "MAKE-IT-PUBLIC": "Tornar Público", + "VIEW": "Ver", + "NEW": "Novo Dataset", + "CREATE-NEW": "Criar novo Dataset", + "EXPORT": "Exportar", + "INVITE-COLLABORATORS": "Convidar Colaboradores", + "INVITE-SHORT": "Invite" + }, + "STATES": { + "EDITED": "Editado", + "PUBLIC": "Público", + "FINALIZED": "Concluído", + "PUBLISHED": "Publicado" + }, + "TOOLTIP": { + "DATASET-STATUS": { + "DRAFT": "Acesso Privado - Dataset Editável", + "FINALIZED": "Acesso Privado - Dataset Fechado" + }, + "DMP": "PGD", + "GRANT": "Grant", + "TEMPLATES-INVOLVED": "Modelo do Dataset", + "VERSION": "Versão do PGD", + "PART-OF": "Parte de", + "TO-DMP": "Para PGD", + "DMP-FOR": "PGD para" + }, + "EMPTY-LIST": "Lista Vazia" + }, + "DATASET-PUBLIC-LISTING": { + "TITLE": "Datasets Publicados", + "TOOLTIP": { + "FINALIZED": "Acesso Privado - Dataset Fechado", + "DMP": "PGD", + "GRANT": "Grant", + "TEMPLATES-INVOLVED": "Modelo do Dataset" + }, + "EMPTY-LIST": "Lista Vazia" + }, + "DATASET-PROFILE-LISTING": { + "TITLE": "Modelo do Dataset", + "COLUMNS": { + "NAME": "Nome", + "REFERNCE": "Referência", + "GRANT": "Grant", + "URI": "Uri", + "ROLE": "Função", + "TEMPLATE": "Modelo", + "ORGANIZATION": "Organização", + "STATUS": "Estado", + "VISITED": "Visitado", + "EDITED": "Editado", + "DESCRIPTION": "Descrição", + "CREATED": "Criado", + "ACTIONS": "Ações", + "DMP": "PGD", + "PROFILE": "Modelo", + "DATAREPOSITORIES": "Repositórios de Dados", + "REGISTRIES": "Registos", + "SERVICES": "Serviços" + }, + "ACTIONS": { + "EDIT": "Editar", + "MAKE-IT-PUBLIC": "Tornar Público", + "VIEW": "Ver", + "CLONE": "Duplicar", + "NEW-VERSION": "Nova Versão", + "VIEW-VERSIONS": "Todas as Versões de Modelos dos Datasets" + } + }, + "DATASET-UPLOAD": { + "TITLE": "Importar Dataset", + "UPLOAD-BUTTON": "Carregar", + "ACTIONS": { + "IMPORT": "Importar", + "CANCEL": "Cancelar" + }, + "PLACEHOLDER": "Título do Dataset", + "DATASET-PROFILE": { + "SELECT": "Selecionar o Modelo do Dataset" + }, + "SNACK-BAR": { + "SUCCESSFUL-CREATION": "Importado com Sucesso", + "UNSUCCESSFUL": "Algo correu mal" + } + }, + "DMP-PROFILE-EDITOR": { + "TITLE": { + "NEW": "Novo Modelo de PGD", + "EDIT": "Editar" + }, + "FIELDS": { + "TITLE": "Campos", + "LABEL": "Nome", + "TYPE": "Tipo", + "DATATYPE": "Tipo de Dados", + "REQUIRED": "Obrigatório", + "EXTERNAL-AUTOCOMPLETE": { + "TITLE": "Autocompletar Dados", + "MULTIPLE-AUTOCOMPLETE": "Autopreenchimento Múltiplo", + "PLACEHOLDER": "Sugestão de Preenchimento", + "URL": "Url", + "OPTIONS-ROOT": "Opções de Raiz", + "LABEL": "Etiqueta", + "VALUE": "Valor" + } + }, + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar", + "DELETE": "Eliminar", + "FINALIZE": "Concluir", + "DOWNLOAD-XML": "Exportar para XML" + } + }, + "GRANT-EDITOR": { + "TITLE": { + "NEW": "Novo Grant", + "EDIT": "Editar" + }, + "FIELDS": { + "LABEL": "Título", + "ABBREVIATION": "Abreviatura", + "URI": "URL", + "START": "Início", + "END": "Fim", + "DESCRIPTION": "Descrição", + "LOGO": "Logo do Grant" + }, + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar", + "DELETE": "Eliminar", + "GO-TO-DMPS": "Ir para os PGD", + "VISIT-WEBSITE": "Visitar a página Web" + } + }, + "DMP-EDITOR": { + "TITLE": { + "NEW": "Novo Plano de Gestão de Dados", + "EDIT": "Editar", + "EDIT-DMP": "Editar PGD", + "ADD-DATASET": "Adicionar Dataset", + "EDIT-DATASET": "Editar Dataset", + "CLONE-DMP": "Duplicar", + "NEW-VERSION": "Nova Versão", + "CREATE-DATASET": "Criar Dataset", + "SUBTITLE": "DOI" + }, + "FIELDS": { + "NAME": "Título do PGD", + "RELATED-GRANT": "Grant relacionado", + "DESCRIPTION": "Descrição", + "DESCRIPTION-HINT": "Descreva brevemente o contexto e objetivo do PGD", + "ORGANISATIONS": "Organizações", + "ORGANISATIONS-HINT": "Adicione aqui os nomes das organizações que contribuem para a criação e revisão dos PGDs", + "RESEARCHERS": "Investigadores", + "RESEARCHERS-HINT": "Indique os nomes das pessoas que geraram, processaram e analisaram os dados descritos no PGD.", + "AUTHORS": "Autores", + "TEMPLATES": "Modelos", + "TEMPLATE": "Modelo de PGD", + "DATASET-TEMPLATES": "Modelos de Dataset relacionados", + "SELECT-TEMPLATE": "Selecione um modelo para descrever o seu Dataset", + "PROFILE": "Modelo de PGD", + "PROJECT": "Projeto", + "GRANT": "Grant", + "GRANTS": "Grants", + "GRANTS-HINT": "Encontre o Grant da sua investigação ou adicione um novo", + "FUNDER": "Financiador", + "FUNDER-HINT": "Selecione o finaciador da sua investigação ou adicione um novo", + "FUNDING-ORGANIZATIONS": "Organizações de financiamento", + "PROJECT-HINT": "Este campo deverá ser preenchido apenas para projetos onde são aplicáveis múltiplos Grants.", + "STATUS": "Estado do PGD", + "EXTERNAL-SOURCE-HINT": "Lista de valores fornecidos por entidade(s) externa(s)", + "COLLABORATORS": "Colaboradores", + "LANGUAGE": "Idioma", + "LANGUAGE-HINT": "Selecione o idioma do seu PGD", + "LICENSE": "Licença", + "VISIBILITY": "Visibilidade", + "VISIBILITY-HINT": "Selecione como o PGD deverá ser visualizado no Argos. Se selecionar 'Público', o PGD é automaticamente disponibilizado a todos os utilizadores da coleção de 'PGDs Públicos'.", + "PUBLICATION": "Data de Publicação", + "CONTACT": "Contacto", + "COST": "Custos", + "DATASETS": "Datasets" + }, + "ACTIONS": { + "GO-TO-GRANT": "Ir para Grant", + "GO-TO-DATASETS": "Ir para Datasets", + "SAVE-CHANGES": "Guardar Alterações", + "SAVE": "Guardar", + "CANCEL": "Cancelar", + "DELETE": "Eliminar", + "DELETE-DATASET": "Eliminar Dataset", + "DISCARD": "Ignorar", + "FINALISE": "Concluir", + "LOCK": "O PGD está bloqueado por outro utilizador", + "PERMISSION": "Não tem permissão para editar este PGD", + "INSERT-MANUALLY": "Inserir manualmente", + "CREATE-DATASET": "Criar um novo" + }, + "PLACEHOLDER": { + "DESCRIPTION": "Preencha com a descrição", + "ORGANIZATION": "Selecione a organização", + "AUTHORS": "Selecionar autores", + "RESEARCHERS": "Selecionar investigadores" + }, + "SNACK-BAR": { + "UNSUCCESSFUL-DOI": "Criação de DOI sem sucesso", + "SUCCESSFUL-DOI": "Criação de DOI com sucesso", + "UNSUCCESSFUL-FINALIZE": "Finalização do PGD sem sucesso" + }, + "DATASET-TEMPLATE-LIST": { + "TITLE": "Modelos de Datasets disponíveis", + "TEXT": "Perfis de Datasets selecionados: ", + "OK": "OK" + }, + "VISIBILITY": { + "PUBLIC": "Público", + "RESTRICTED": "Restrito" + }, + "STEPPER": { + "USER-GUIDE": "Etapas de orientação", + "MAIN-INFO": "Informação principal", + "FUNDING-INFO": "Informação do financiamento", + "DATASET-SELECTION": "Seleção de Dataset", + "DATASET-INFO": "Informação sobre Dataset", + "LICENSE-INFO": "Informação sobre Licença", + "DATASET": "Dataset", + "PREVIOUS": "Anterior", + "NEXT": "Seguinte" + }, + "MAIN-INFO": { + "INTRO": "Um PGD no Argos inclui informação chave sobre a investigação, nomeadamente a sua finalidade, objetivos e investigadores envolvidos. Inclui também informação sobre a documentação de Datasets da investigação, destacando as etapas seguidas e os meios utilizados nas atividades de gestão de dados.", + "HINT": "Uma breve descrição sobre o tema do PGD, o seu âmbito e objetivos.", + "TYPING": "Digite mais letras do nome para que seja possível encontrá-lo mais facilmente." + }, + "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.", + "FIND": "Não foi possível encontrar um adequado?" + }, + "DATASET-INFO": { + "INTRO": "Um PGD no Argos inclui informação chave sobre a investigação, nomeadamente a sua finalidade, objetivos e investigadores envolvidos. Inclui também informação sobre a documentação de Datasets da investigação, destacando as etapas seguidas e os meios utilizados nas atividades de gestão de dados.", + "SECOND-INTRO": "Os Datasets são documentados segundo modelos pré-definidos. Estes modelos definem o conteúdo das descrições dos Datasets. No Argos, um PGD pode conter tantas descrições de Datasets, quantos os Datasets que documenta.", + "FIND": "Não foi possível encontrar um adequado?", + "HINT": "Selecione um modelo para descrever os seus Datasets. Poderá selecionar mais do que um modelo." + }, + "LICENSE-INFO": { + "INTRO": "Cada PGD pode conter informações específicas sobre a licença, no que se refere à abertura e disponibilidade de dados. Desse modo, pode determinar quem pode ver o seu Dataset e por quanto tempo esses dados serão privados.", + "HINT": "Atribua uma licença ao seu PGD selecionando a mais apropriada da lista.", + "TYPING": "Digite mais letras do nome para que seja possível encontrá-lo mais facilmente." + }, + "DATASET-DESCRIPTION": { + "INTRO": "Em termos gerais, os seus dados de investigação devem ser 'FAIR', ou seja, localizáveis (findable), acessíveis (accessible), interoperáveis (interoperable) e reutilizáveis (re-usable). Estes princípios precedem as escolhas de implementação e não sugerem necessariamente qualquer tecnologia específica, norma ou solução de implementação. Este modelo não pretende ser uma implementação técnica rigorosa dos princípios 'FAIR', mas sim inspirado no conceito geral 'FAIR'." + }, + "CHANGES": "Alterações não guardadas", + "CLONE-DIALOG": { + "CLONE": "Duplicar", + "SAVE": "Guardar", + "CANCEL": "Cancelar" + } + }, + "DMP-PROFILE-LISTING": { + "TITLE": "Modelos de PGD", + "COLUMNS": { + "NAME": "Nome", + "STATUS": "Estado", + "CREATED": "Criado", + "PUBLISHED": "Publicado", + "LAST-EDITED": "Última edição" + }, + "UPLOAD": { + "UPLOAD-XML": "Importar", + "UPLOAD-XML-FILE-TITLE": "Importar Plano de Gestão de Dados", + "UPLOAD-XML-NAME": "Nome do Modelo de PGD", + "UPLOAD-XML-IMPORT": "Ficheiro", + "UPLOAD-XML-FILE-CANCEL": "Cancelar" + } + }, + "DYNAMIC-FORM": { + "FIELDS": { + "LABEL": "Etiqueta" + }, + "ACTIONS": { + "PREVIEW": "Pré-visualização", + "ADD-PAGE": "Adicionar Página +", + "ADD-SECTION": "Adicionar Secção +" + } + }, + "CRITERIA": { + "FILTERS": "Filtros", + "GRANTS": { + "LIKE": "Procurar", + "PERIOD-FROM": "Data de Início do Grant", + "PERIOD-TO": "Data de Fim do Grant", + "GRANT-STATE-TYPE": "Estado do Grant", + "TYPES": { + "NONE": "-", + "ON-GOING": "Em curso", + "FINISHED": "Finalizado" + } + }, + "DATASET-PROFILE": { + "LIKE": "Procurar", + "STATUS": "Estado" + }, + "DATA-SETS": { + "PERIOD-FROM": "Data de Início", + "PERIOD-TO": "Data de Fim", + "STATUS": "Estado", + "NONE": "-", + "TAGS": "Etiquetas", + "SELECT-TAGS": "Selecionar Etiquetas", + "LIKE": "Procurar Datasets", + "DRAFT-LIKE": "Procurar Rascunho de Datasets", + "SELECT-GRANTS": "Selecionar Grants", + "ROLE": "Função", + "ORGANIZATION": "Organização", + "SELECT-ORGANIZATIONS": "Selecionar Organização", + "SELECT-SPEC": "Selecionar Especificação de Dataset", + "RELATED-GRANT": "Grant Relacionado", + "SELECT-DMP": "Selecionar PGD", + "RELATED-DMP": "PGDs Relacionados", + "SELECT-COLLABORATORS": "Selecionar Colaboradores", + "RELATED-COLLABORATORS": "Colaboradores Relacionados", + "SELECT-DATASET-TEMPLATES": "Selecionar Modelos de Datasets", + "RELATED-DATASET-TEMPLATES": "Modelos de Datasets Relacionados", + "ALL-VERSIONS": "Todas as Versões" + }, + "DMP": { + "LIKE": "Procurar PGDs", + "GRANTS": "Grants", + "SELECT-GRANTS": "Selecionar Grants", + "SELECT-COLLABORATORS": "Selecionar Colaboradores", + "RELATED-COLLABORATORS": "Colaboradores Relacionados", + "SELECT-DATASET-TEMPLATES": "Selecionar Modelos de Datasets", + "RELATED-DATASET-TEMPLATES": "Modelos de Datasets Relacionados" + }, + "USERS": { + "LABEL": "Procurar", + "ROLE": "Função", + "SHOW": "Show" + }, + "SELECT": "Selecionar uma opção", + "LIKE": "Procurar" + }, + "DATASET-EDITOR": { + "TITLE": { + "NEW": "Novo Plano de Gestão de Dados", + "EDIT": "Editar", + "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.", + "INTRO-TIP": "Tip: Add new datasets to describe different types of data or disciplinary data to avoid mixing information." + }, + "FIELDS": { + "NAME": "Designação do Dataset", + "TITLE": "Título do Dataset", + "DESCRIPTION": "Descrição", + "PROFILE": "Modelo", + "URI": "Uri", + "DMP": "PGD", + "SELECT-DMP": "Selecionar PGD", + "DATAREPOSITORIES": "Repositório de Dados", + "REGISTRIES": "Registos", + "SERVICES": "Serviços", + "EXTERNAL-DATASETS": "Datasets Externos", + "EXTERNAL-DATASETS-DESCRIPTION": "Datasets relacionados com o descrito no PGD, podem ser utilizados para a sua produção ou como derivado ou subproduto da sua utilização", + "EXTERNAL-DATASET-TYPE": "Tipo de Dataset Externo", + "EXTERNAL-DATASET-INFO": "Informação de Dataset Externo", + "DATAREPOSITORIES-INFO": "Informação de Repositório de Dados", + "EXTERNAL-LINK": "Link Externo", + "TAGS": "Etiquetas", + "CREATE": "Criar Novo" + }, + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar", + "DELETE": "Eliminar", + "UPDATE": "Atualizar" + }, + "PLACEHOLDER": { + "DESCRIPTION": "Preencher com descrição", + "EXTERNAL-LINK": "Forneça uma ligação URL externa" + }, + "HINT": { + "DESCRIPTION": "Briefly describe the context and purpose of the Dataset", + "TITLE": "Uma breve descrição do que o/a ", + "TITLE-REST": "é sobre o seu âmbito e objetivos." + }, + "VERSION-DIALOG": { + "ABOUT": "O versionamento é automático.", + "QUESTION": "Parece que o seu modelo de Dataset está desatualizado. Pretende atualizá-lo de acordo com a última versão?" + } + }, + "DATASET-CREATE-WIZARD": { + "ACTIONS": { + "NEXT": "Seguinte", + "BACK": "Voltar", + "SAVE": "Guardar" + }, + "FIRST-STEP": { + "TITLE": "PGD", + "PLACEHOLDER": "Selecione um PGD existente" + } + }, + "INVITATION-EDITOR": { + "TITLE": "Enviar convites para", + "AUTOCOMPLETE-USER": "Utilizador", + "AUTOCOMPLETE-EMAIL": "Email", + "AUTOCOMPLETE-USER-EMAIL": "Kat ou kat@exemplo.com", + "ACTIONS": { + "SEND-INVITATION": "Enviar Convites", + "CANCEL": "Cancelar" + } + }, + "USERS": { + "LISTING": { + "TITLE": "Utilizadores", + "EMAIL": "Email", + "LAST-LOGGED-IN": "Último acesso", + "LABEL": "Etiqueta", + "ROLES": "Funções", + "NAME": "Nome", + "PERMISSIONS": "Permissões", + "EXPORT": "Export users" + }, + "ACTIONS": { + "EDIT": "Edit", + "SAVE": "Save" + } + }, + "TYPES": { + "APP-ROLE": { + "ADMIN": "Administrador", + "USER": "Utilizador", + "MANAGER": "Gestor" + }, + "DMP-PROFILE-FIELD": { + "DATA-TYPE": { + "DATE": "Data", + "NUMBER": "Número", + "TEXT": "Texto", + "EXTERNAL-AUTOCOMPLETE": "Autopreenchimento Externo" + }, + "TYPE": { + "INPUT": "Entrada" + } + }, + "DATASET-STATUS": { + "DRAFT": "Rascunho", + "FINALISED": "Concluído", + "ANY": "Qualquer", + "DRAFT-DESC": "Registos Rascunho" + }, + "DATASET-ROLE": { + "OWNER": "Proprietário", + "MEMBER": "Membro", + "ANY": "Qualquer" + }, + "EXTERNAL-DATASET-TYPE": { + "SOURCE": "Fonte", + "SOURCES": "Fontes", + "SOURCE:": "Fonte: ", + "NO-SOURCE": "Não ligar à fonte", + "OUTPUT": "Output", + "SELECT": "Selecionar" + }, + "DMP": { + "FINALISED": "Concluído", + "DRAFT": "Rascunho" + }, + "DMP-VISIBILITY": { + "VISIBILITY": "Visibilidade", + "PUBLIC": "Publicado", + "FINALIZED": "Concluído", + "DRAFT": "Rascunho", + "ANY": "Qualquer" + }, + "DATASET-PROFILE-FIELD-VALIDATION-TYPE": { + "NONE": "Nenhum", + "REQUIRED": "Obrigatório" + }, + "DATASET-PROFILE-FIELD-VIEW-STYLE": { + "BOOLEAN-DECISION": "Dados booleanos de decisão", + "CHECKBOX": "Caixa de verificação", + "COMBO-BOX": "Caixa de Combinação", + "INTERNAL-DMP-ENTITIES": "Entidades Internas do PGD", + "FREE-TEXT": "Texto Livre", + "RADIO-BOX": "Escolha Múltipla", + "TEXT-AREA": "Área de Texto", + "DATE-PICKER": "Escolha de Data", + "EXTERNAL-DATASETS": "Datasets Externos", + "DATA-REPOSITORIES": "Repositórios de Dados", + "REGISTRIES": "Registos", + "SERVICES": "Serviços", + "TAGS": "Etiquetas", + "RESEARCHERS": "Investigadores", + "ORGANIZATIONS": "Organizações", + "DATASET-IDENTIFIER": "Identificador de Dataset", + "CURRENCY": "Moeda", + "VALIDATION": "Validator" + }, + "DATASET-PROFILE-COMBO-BOX-TYPE": { + "WORD-LIST": "Lista de Palavras", + "AUTOCOMPLETE": "Autopreenchimento", + "EXTERNAL-SOURCE-HINT": "Lista de valores fornecidas por fonte(s) externa(s)", + "ACTIONS": { + "YES": "Sim", + "NO": "Não" + } + }, + "DATASET-PROFILE-INTERNAL-DMP-ENTITIES-TYPE": { + "RESEARCHERS": "Investigadores", + "DMPS": "PGDs", + "DATASETS": "Datasets", + "EXTERNAL-SOURCE-HINT": "Lista de valores fornecidas por fonte(s) externa(s)" + }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, + "RECENT-ACTIVITY-ORDER": { + "CREATED": "Criado", + "LABEL": "Etiqueta", + "MODIFIED": "Modificado", + "FINALIZED": "Concluído", + "PUBLISHED": "Publicado", + "STATUS": "Estado" + } + }, + "ADDRESEARCHERS-EDITOR": { + "TITLE": "Adicionar Investigador", + "FIRST_NAME": "Nome Próprio", + "LAST_NAME": "Sobrenome", + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar" + } + }, + "ADDORGANIZATION-EDITOR": { + "TITLE": "Adicionar uma Organização", + "NAME": "Nome", + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar" + } + }, + "ADDEDITCOST-EDITOR": { + "ADD-TITLE": "Adicionar um Custo", + "EDIT-TITLE": "Editar o Custo", + "CODE": "Código", + "DESCRIPTION": "Descrição", + "TITLE": "Título", + "VALUE": "Valor", + "ACTIONS": { + "SAVE": "Guardar", + "CANCEL": "Cancelar" + } + }, + "DMP-WIZARD": { + "FIRST-STEP": { + "DMP": "Editor de PGD", + "DATASETS": "Datasets" + }, + "ACTIONS": { + "NEXT": "Seguinte", + "BACK": "Voltar", + "SAVE": "Guardar" + } + }, + "DMP-RELATED-GRANT": { + "RELATED-GRANT": "Grant relacionado" + }, + "DMP-RELATED-COLLABORATOR": { + "RELATED-COLLABORATOR": "Colaborador relacionado", + "SELECT-COLLABORATORS": "Colaboradores selecionados" + }, + "DMP-RELATED-ORGANIZATION": { + "RELATED-ORGANIZATION": "Organização", + "SELECT-ORGANIZATIONS": "Organizações selecionadas" + }, + "DATASET-PROFILE": { + "PREVIEW": "Pré-visualização", + "FORM-DESCRIPTION": "Formulário de descrição", + "PAGES-DESCRIPTION": "Páginas de descrição" + }, + "RECENT-ACTIVITY": { + "MY-TITLE-GRANT": "A minha atividade recente no Grant", + "MY-TITLE-DMP": "A minha atividade recente no PDGs", + "MY-TITLE-DATASET": "A minha atividade recente no Dataset", + "LAST-VISITED-DMP": "Último Plano de Gestão de Dados Visitado", + "LAST-EDITED-DMP": "Último Plano de Gestão de Dados Editado", + "LICENSE": "Os PDGs abaixo são públicos ao abrigo da Licença #" + }, + "FILE-UPLOADER": { + "DEFAULT": "Escolha um ficheiro", + "GRANT": "", + "UPLOAD": "Carregar" + }, + "URL-LISTING-COMPONENT": { + "SHOW-MORE": "Mostrar mais" + }, + "HOMEPAGE": { + "OPEN-DMPS": { + "STATS": "Painel do ARGOS" + }, + "MY-DMPS": { + "STATS": "O meu Painel" + } + }, + "ABOUT": { + "TITLE-DASHED": "-Sobre-", + "TITLE": "Sobre", + "MAIN-CONTENT": "O nosso objetivo é tornar os seus dados de investigação 'FAIR', ou seja localizáveis (findable), acessíveis (accessible), interoperáveis (interoperable) e reutilizáveis (re-usable). Estes princípios precedem as escolhas de implementação e não sugerem necessariamente qualquer tecnologia específica, padrão, ou solução de implementação.", + "CONTRIBUTORS": "Colaboradores", + "WELCOME": "Bem vindo ao ARGOS", + "WELCOME-MESSAGE": "Criar, Ligar, Partilhar Planos de Gestão de Dados" + }, + "FOOTER": { + "CONTACT-SUPPORT": "Contacto de Suporte", + "FAQ": "FAQ", + "GUIDE": "Guia do Utilizador", + "GLOSSARY": "Glossário", + "TERMS-OF-SERVICE": "Condições do Serviço", + "ABOUT": "Sobre", + "COOKIES-POLICY": "Política de Cookies", + "PRIVACY-POLICY": "Política de Privacidade" + }, + "GLOSSARY": { + "TITLE": "Glossário", + "TITLE-DASHED": "-Glossário-", + "CLOSE": "Fechar" + }, + "FAQ": { + "TITLE": "FAQ", + "TITLE-DASHED": "-FAQ-", + "CLOSE": "Fecahr" + }, + "GUIDE": { + "TITLE": "Guia do Utilizador", + "TITLE-DASHED": "-Guia do Utilizador-", + "CLOSE": "Fechar", + "SAVE": "Save" + }, + "PRIVACY-POLICY": { + "TITLE": "-Política de Privacidade-", + "MAIN-CONTENT": "" + }, + "OPENSOURCE-LICENCES": { + "TITLE": "Licenças Opensource", + "MAIN-CONTENT": "" + }, + "TERMS-OF-SERVICE": { + "TITLE": "Condições do Serviço", + "MAIN-CONTENT": "" + }, + "COOKIES-POLICY": { + "TITLE": "Política de Cookies" + }, + "CONTACT": { + "SUPPORT": { + "TITLE": "Contacto de Suporte", + "SUBTITLE": "Como podemos ajudar?", + "SUBJECT": "Assunto", + "DESCRIPTION": "Descrição", + "CANCEL": "Cancelar", + "SEND": "Enviar" + }, + "TITLE-DASHED": "-Contacto de Suporte-", + "GUIDE": "Guia", + "HELP": "Ajuda", + "GLOSSARY": "Glossário" + }, + "LANGUAGE": { + "TITLE": "Idioma", + "TITLE-DASHED": "-Idioma-", + "CLOSE": "Fechar" + }, + "DASHBOARD": { + "MY-GRANTS": "Os meus Grants", + "GRANTS": "Grants", + "MY-DMPS": "Os meus PGDs", + "TITLE": "O que é o ARGOS?", + "DMP-QUESTION": "O que é um PGD no ARGOS?", + "INFO-TEXT": "ARGOS é um serviço aberto e extensível que simplifica a gestão, validação, monitorização e manutenção de Planos de Gestão de Dados. Permite aos intervenientes (investigadores, gestores, coordenadores, investigadores principais, etc.) criar PGDs acionáveis por máquina, que podem ser livremente trocados entre infraestruturas para a execução de aspetos específicos no processo de gestão de Dados, de acordo com as intenções e o compromisso dos proprietários dos Dados.", + "INFO-DMP-TEXT": "Um Plano de Gestão de Dados (PGD) é um documento vivo que descreve os conjuntos de dados que são gerados e/ou reutilizados durante e após a vida útil de uma investigação. Os PGD visam fornecer aos investigadores informações essenciais para a reprodução, redistribuição e redefinição dos resultados da investigação, assegurando assim a sua validade e exploração.", + "NEW-QUESTION": "Novo nos PGDs? Visite", + "START-YOUR-FIRST-DMP": "Começar o seu primeiro PGD", + "OPEN-AIR-GUIDE": "Guia OpenAIRE para Investigadores", + "LEARN-MORE": "para saber mais sobre como criar um PGD!", + "ORGANIZATIONS": "Organizações relacionadas", + "DMPS": "PGDs", + "MY-DATASETS": "Os meus Datasets", + "DATASETS": "Datasets", + "SEARCH": "PESQUISA...", + "DATA-MANAGEMENT-PLANS": "PLANOS DE GESTÃO DE DADOS", + "PERSONAL-USAGE": "Uso Pessoal", + "PUBLIC-USAGE": "Uso Público", + "DATASET-DESCRIPTIONS": "Datasets", + "PUBLIC-DMPS": "PGDs Públicos", + "PUBLIC-DATASETS": "Datasets Públicos", + "RELATED-ORGANISATIONS": "Organizações Relacionadas", + "DRAFTS": "Rascunhos", + "ALL": "TODOS", + "EMPTY-LIST": "Lista Vazia", + "LATEST-ACTIVITY": "Última Atividade", + "DMP-ABOUT-BEG": "Um PGD no Argos consiste em informações-chave sobre a investigação, tais como finalidade, objetivos e investigadores envolvidos, mas também sobre documentação de conjuntos de dados de investigação, nomeadamente", + "DMP-ABOUT-END": ", os que destacam os passos dados e os meios utilizados no decurso da gestão de dados.", + "SELECT-DMP": "Selecione um PGD para o seu Dataset", + "ACTIONS": { + "ADD-DATASET-DESCRIPTION": "Adicione um Dataset", + "ADD-DATASET": "Adicione um Dataset", + "ADD-DMP-DESCRIPTION": "Adicione uma descrição ao PGD" + }, + "TOUR-GUIDE": { + "DMP": "This is your dashboard. You can view and edit all DMPs that you have either contributed to or created yourself.", + "START-NEW": "Create your DMP with Start new DMP.", + "IMPORT-DMP": "You can import a DMP", + "START-WIZARD": "or create new in Argos.", + "DATASET": "This is your dashboard. You can view and edit all Datasets that you have either contributed to or created yourself.", + "NEW-DATASET": "With Add Dataset you can describe new datasets anytime in the research process." + } + }, + "USER-DIALOG": { + "USER-PROFILE": "O Meu Perfil", + "USER-PROFILE-SETTINGS": "Definições do Meu Perfil...", + "EXIT": "Sair ", + "LOG-OUT": "Terminar Sessão" + }, + "USER-PROFILE": { + "SETTINGS": { + "TITLE": "Definições", + "TIMEZONE": "Fuso Horário", + "CULTURE": "Cultura", + "LANGUAGE": "Idioma", + "CONNECTED-WITH": "Connected with", + "NAME": "Name", + "ORGANIZATION": "Organization", + "ROLE": "Role", + "SELECT-ROLE": "Select Role", + "ACCOUNTS": "Accounts", + "EMAILS": "Emails", + "YOUR-EMAIL": "Your Email" + }, + "ASSOCIATED-DMPS": "PGDs Associados", + "DMPS": { + "SHOW-ALL": "Mostrar Todos", + "CREATOR": "Autor", + "MEMBER": "Membro" + }, + "ZENODO": { + "LOGIN": "Iniciar Sessão no Zenodo", + "LOGOUT": "Fechar Sessão no Zenodo", + "AUTHORIZE": "Authorize Zenodo", + "TITLE": "Conta no Zenodo", + "DESCRIPTION": "Conta no Zenodo Associada:" + }, + "ROLE-ORGANIZATION": { + "FACULTY": "Faculty", + "LIBRARIAN": "Librarian", + "RESEARCHER": "Researcher", + "STUDENT": "Student (BA/BSc, MSc)", + "EARLY-CAREER-RESEARCHER": "Early Career Researcher (PhD candidate, post-graduate)", + "RESEARCH-ADMINISTRATOR": "Research Administrator", + "REPOSITORY-MANAGER": "Repository Manager", + "RESEARCH-INFRASTRUCTURE": "Research Infrastructure", + "SERVICE-PROVIDER": "Service Provider", + "PUBLISHER": "Publisher", + "RESEARCH-FUNDER": "Research Funder", + "POLICY-MAKER": "Policymaker", + "SME-INDUSTRY": "SME/ Industry", + "OTHER": "Other" + }, + "ACTIONS": { + "SAVE": "Save", + "LINK-NEW": "Link new", + "LINK-NEW-ACCOUNT": "Link new account", + "ADD": "Add", + "CANCEL": "Cancel" + } + }, + "DATASET-REFERENCED-MODELS": { + "SERVICES": { + "TITLE": "Adicionar Novo Serviço", + "LABEL": "Etiqueta", + "ABBREVIATION": "Abreviatura", + "URI": "Uri" + }, + "DATA-REPOSITORY": { + "TITLE": "Adicionar novo Repositório de Dados", + "LABEL": "Etiqueta", + "ABBREVIATION": "Abreviatura", + "URI": "Uri" + }, + "EXTERNAL-DATASET": { + "TITLE": "Adicionar Novo Dataset Externo", + "LABEL": "Etiqueta", + "ABBREVIATION": "Abreviatura" + }, + "REGISTRY": { + "TITLE": "Adicionar Novo Registo", + "LABEL": "Etiqueta", + "ABBREVIATION": "Abreviatura", + "URI": "Uri" + } + }, + "FACET-SEARCH": { + "FILTER": "Filtro", + "GRANT-STATUS": { + "TITLE": "Estado do Grant", + "OPTIONS": { + "ANY": "Qualquer", + "ACTIVE": "Ativo", + "INACTIVE": "Inativo" + } + }, + "GRANT": { + "TITLE": "Grants relacionados", + "FILTER": "Filtrar Grants" + }, + "PROFILES": { + "TITLE": "Especificações do Dataset" + }, + "ROLE": { + "TITLE": "Função", + "ANY": "Qualquer", + "OWNER": "Proprietário", + "MEMBER": "Membro" + }, + "DMP-ORGANISATIONS": { + "TITLE": "Organização", + "FILTER": "Filtrar Organizações" + } + }, + "DMP-FINALISE-DIALOG": { + "DMP": "PGD", + "DATASETS": "Datasets", + "EMPTY": "Até ao momento não existem Datasets neste PGD", + "SUBMIT": "Submeter", + "FINALISE-TITLE": "Pretende finalizar algum destes Datasets em Rascunho?", + "ALREADY-FINALISED-DATASETS": "Datasets já Concluídos", + "NONE": "Nenhum", + "VALIDATION": { + "AT-LEAST-ONE-DATASET-FINALISED": "Tem de ter pelo menos um Dataset Concluído" + }, + "IMPACT": "Esta ação finalizará o seu PGD, não sendo possível a sua edição.", + "AFTER-FINALIZATION": "Após a finalização do seu PGD poderá publicá-lo, e este ficará publicamente disponível na ferramenta ARGOS." + }, + "DRAFTS": { + "FOR-DMP": "Para PGD:", + "FOR-GRANT": "Para Grant:" + }, + "QUICKWIZARD": { + "CREATE-ADD": { + "CREATE": { + "TITLE": "Criar um novo PDG", + "SUBTITLE": "Crie um novo PGD e descreva o(s) seu(s) Dataset(s) guiando-se passo a passo pelo nosso Assistente através dos elementos essenciais de uma descrição do PGD.", + "QUICKWIZARD_CREATE": { + "TITLE": "Assistente PGDs", + "POST-SELECTION-INFO": "Este Assistente permite-lhe criar um novo PGD fornecendo apenas as informações essenciais para tal e, em seguida, descrever um ou mais Datasets que são geridos no âmbito deste PGD. Após terminar a edição do PGD no Assistente, poderá editar e aceder às suas propriedades avançadas, através do editor. Poderá também adicionar mais Datasets ou editar os anteriores.", + "ACTIONS": { + "DELETE": "Eliminar", + "SAVE": "Guardar", + "SAVE-AND-FINALIZE": "Guardar e Concluir", + "NEXT": "Seguinte", + "BACK": "Voltar", + "CREATE-NEW-GRANT": "Adicionar Grant", + "EXIST-GRANT": "Utilizar Grant Existente", + "CREATE-NEW-FUNDER": "Adicionar Financiador", + "EXIST-FUNDER": "Utilizar Financiador Existente", + "CREATE-NEW-PROJECT": "Adicionar Projeto", + "EXIST-PROJECT": "Utilizar Projeto Existente" + }, + "FIRST-STEP": { + "TITLE": "Grant", + "ABOUT-GRANT": "Encontre o Grant a que o seu PGD está associado e ligue-o às informações dos financiadores. Se o Grant não estiver listado ou se estiver a criar um PGD para um novo Grant ou para outros fins, utilize.\"Adicionar Grant\"", + "ABOUT-NEW-GRANT": "Se estiver a criar um PGD para uma proposta de Grant, para uso institucional, na comunidade de investigação ou para fins de formação e educação, acrescente informações abaixo, criando um novo Grant.", + "ABOUT-FUNDER": "Encontre o financiador que deseja associar ao PGD que será criado e depois selecione um Grant com o qual o financiador está ligado. Se o financiador não estiver listado, utilize \"Adicionar Financiador\"", + "ABOUT-NEW-FUNDER": "Se está a criar um PGD para um Grant, para uso institucional, na comunidade de investigação ou fins de formação e educação e deseja associá-lo a um financiador que não esteja listado, então crie um novo financiador", + "ABOUT-PROJECT": "Encontre o projecto ao qual o seu PGD está associado. Se o projeto não estiver listado, utilize \"Adicionar Projeto\"", + "ABOUT-NEW-PROJECT": "", + "OR": "ou", + "FIELDS": { + "SELECT-GRANT": "Selecione o Grant ao qual o PGD está associado", + "SELECT-FUNDER": "Selecione o financiador do Grant ao qual o PGD está associado", + "SELECT-PROJECT": "Selecione o projeto ao qual o PGD está associado", + "GRANT-LABEL": "Nome do Grant", + "FUNDER-LABEL": "Nome do Financiador", + "PROJECT-LABEL": "Nome do Projeto", + "LABEL-HINT": "Acrescentar o nome do Grant tal como aparece na candidatura à apresentação de propostas", + "DESCRIPTION": "Descrição", + "DESCRIPTION-HINT": "Explicar sucintamente as finalidades e objetivos do Grant" + } + }, + "SECOND-STEP": { + "TITLE": "Perfil do PGD", + "ABOUT": "Um Plano de Gestão de Dados consiste num conjunto de perguntas que deve responder com um nível de detalhe adequado ao Grant ou com relevância para o propósito da criação deste PGD. O conteúdo de cada PGD varia em função do(s) Modelo(s) de Dataset seleccionado(s) que contém(êm) um conjunto de perguntas personalizadas em resposta aos requisitos e políticas dos financiadores, instituições, comunidades de investigação.", + "NEW-TITLE": "", + "DMP-NAME": "PGD do Grant : ", + "FIELDS": { + "NAME": "Título do PGD", + "DESCRIPTION": "Sumário", + "DESCRIPTION-HINT": "Explicar sucintamente as finalidades e objetivos do PGD", + "PROFILE": "Modelo do Dataset", + "PROFILE-HINT": "Selecione um modelo para descrever o(s) seu(s) Dataset(s). Se desejar selecionar vários modelos de Datasets, utilize \"Novo PGD (Experiente)\". Também pode adicionar novos Datasets em qualquer altura após a criação do PGD.", + "HELP": "Se não conseguir encontrar um modelo ou se quiser criar um modelo personalizado para a sua instituição, comunidade de investigação ou necessidades de formação, contacte-nos." + } + }, + "THIRD-STEP": { + "TITLE": "Dataset", + "NEW-TITLE": "", + "DATASET-LABEL": "Título do Dataset", + "DATASET-NAME": "Dataset: ", + "DATASET-NAME-FOR": "Para PGD: ", + "LIST-BUTTON-TOOLTIP": "Lista de Datasets", + "ADD-BUTTON-TOOLTIP": "Adicionar Dataset" + } + } + }, + "ADD": { + "TITLE": "Adicionar Dataset a um PGD existente", + "DATASET-WIZARD": "Asistente de Dataset", + "POST-SELECTION-INFO": "Este Assistente simplifica o processo de adição de novos Datasets aos PGDs existentes, guiando-o e solicitando apenas as peças de informação essenciais para completar a tarefa. O acesso completo aos atributos de um Dataset pode ser obtido posteriormente, através dos menus de acesso ao Dataset no Sistema.", + "SUBTITLE": "Este Assistente permite-lhe descrever Datasets adicionais geridos no contexto de um PGD, fornecendo apenas as informações essenciais para a sua descrição.", + "CREATED": "Criado em" + } + }, + "SAVE-DIALOG": { + "TITLE": "Deseja adicionar outro Dataset?", + "ACTIONS": { + "AFFIRMATIVE": "Sim", + "NEGATIVE": "Não" + } + }, + "HINT": "(Sugestão de nome por defeito)" + }, + "DATASET-PROFILE-STATUS": { + "NONE": "Nenhum", + "DRAFT": "Rascunho", + "FINALIZED": "Concluído" + } +} \ No newline at end of file diff --git a/dmp-frontend/src/assets/resources/language.json b/dmp-frontend/src/assets/resources/language.json index e7d27ab4f..982569340 100644 --- a/dmp-frontend/src/assets/resources/language.json +++ b/dmp-frontend/src/assets/resources/language.json @@ -26,5 +26,9 @@ { "label": "GENERAL.LANGUAGES.SERBIAN", "value": "sr" + }, + { + "label": "GENERAL.LANGUAGES.PORTUGUESE", + "value": "pt" } ] diff --git a/dmp-frontend/src/assets/splash/about/contributors.html b/dmp-frontend/src/assets/splash/about/contributors.html index 53f483731..e21ec04a3 100644 --- a/dmp-frontend/src/assets/splash/about/contributors.html +++ b/dmp-frontend/src/assets/splash/about/contributors.html @@ -122,6 +122,28 @@

Silvia Horáková, Richard Rac, Iryna Kuchma

+
+
+
+ Flag of Serbia +
+
+
+

UNIVERSITY OF BELGRADE - SERBIA.RDM TEAM

+

Nadica Miljković, Milica Ševkušić, Ljiljana Lazarević, Biljana Kosanović, Vladimir Otašević, Obrad Vučkovac

+
+
+
+
+
+ Flag of Portugal +
+
+
+

FCT-FCCN, University of Minho

+

Filipa Pereira, Carla Patinha, André Vieira, Paula Moura, Pedro Principe

+
+
diff --git a/dmp-frontend/src/assets/splash/assets/img/flag-of-portugal.png b/dmp-frontend/src/assets/splash/assets/img/flag-of-portugal.png new file mode 100644 index 0000000000000000000000000000000000000000..7a399847b2f3ddcf96712855566ffcf501d9472b GIT binary patch literal 19164 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

l#}y0n1V_)moU8 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 literal 0 HcmV?d00001 From 35eb42e6319864730afe1aeeaa13421168d52353 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 12 Feb 2021 13:23:39 +0200 Subject: [PATCH 06/53] Redesign dataset profile editor changes. Basic UI outline and functionality. --- .../dataset-profile/dataset-profile.module.ts | 4 +- ...file-editor-composite-field.component.html | 244 ++++++++-- ...file-editor-composite-field.component.scss | 51 ++ ...rofile-editor-composite-field.component.ts | 131 ++++- ...rofile-editor-default-value.component.html | 11 + ...ataset-profile-editor-field.component.html | 68 ++- ...ataset-profile-editor-field.component.scss | 11 + .../dataset-profile-editor-field.component.ts | 102 +++- ...dataset-profile-editor-rule.component.html | 66 ++- .../dataset-profile-editor-rule.component.ts | 126 ++++- ...aset-profile-editor-section.component.html | 43 +- ...aset-profile-editor-section.component.scss | 21 + .../dataset-profile-editor.component.html | 309 ++++++++---- .../dataset-profile-editor.component.scss | 83 ++++ .../dataset-profile-editor.component.ts | 449 +++++++++++++----- .../table-of-contents-entry.ts | 9 +- .../table-of-contents-internal-section.html | 84 +++- .../table-of-contents-internal-section.scss | 63 ++- .../table-of-contents-internal-section.ts | 22 +- .../table-of-contents/table-of-contents.html | 11 +- .../table-of-contents/table-of-contents.scss | 2 +- .../table-of-contents/table-of-contents.ts | 25 +- .../dataset-description-form.module.ts | 4 +- dmp-frontend/src/assets/i18n/de.json | 39 +- dmp-frontend/src/assets/i18n/en.json | 27 ++ dmp-frontend/src/assets/i18n/es.json | 35 +- dmp-frontend/src/assets/i18n/gr.json | 35 +- dmp-frontend/src/assets/i18n/pt.json | 30 +- dmp-frontend/src/assets/i18n/sk.json | 35 +- dmp-frontend/src/assets/i18n/sr.json | 104 +++- dmp-frontend/src/assets/i18n/tr.json | 35 +- 31 files changed, 1927 insertions(+), 352 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 7494dc6b2..f5685d3f9 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 @@ -45,6 +45,7 @@ import { NgxDropzoneModule } from 'ngx-dropzone'; 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 { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; @NgModule({ imports: [ @@ -98,7 +99,8 @@ import { DatasetProfileTableOfContentsInternalSection } from './table-of-content ], entryComponents: [ DialogConfirmationUploadDatasetProfiles - ] + ], + providers:[VisibilityRulesService] }) export class DatasetProfileModule { } 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 6de806122..0f46f7d20 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,11 +1,17 @@ -

+ + + + + + + + + + +
+ {{this.form.get('id').value}} +
-
- - - -
-
- - - -
-
- - - -
-
- -
-
-

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.SUB-FIELDS-TITLE' | translate}} -

-
- - - {{i + 1}}. {{getFieldTile(field, i)}} -
- + + + + + +
+
+ +
+
+
+ {{numbering}}
- -
-
- + + + +
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + +
+ + +
-
- + + + +
+ + +
+ +
+ +
+
+ {{form.get('fields').get(''+i).get('id').value}} + +
+ + + + + +
+
+ + +
+
+ +
+
+ + +

Input tools

+ + + folder + Add Input + + + + visibility_off + + + + + +

Input settings

+ + + + + + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.MULTIPLICITY-CHECKBOX' | translate}} + + + + + + + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.COMMENT-CHECKBOX' | translate}} + + + + + + Make it required + + + + + +

Other actions

+ + + + + delete + Delete + +
+
+
+
+
+ + +Current FORM: {{this.form.value |json}} +
+Target: {{this.targetField?.value |json}} + + 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 046126ff9..694ac521d 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 @@ -8,4 +8,55 @@ .titleStile{ font-weight: bold; +} + +//REFACTOR SECTION + + +//Palete + +$blue-color : #129D99; +$blue-color-light: #5cf7f2; + +.actions-list{ + border-radius: 7px; + box-shadow: 0 1px 0.8em $blue-color; + padding: 1em 0em; + font-size: small; +} + +.field-container{ + box-shadow: 0px 1px 2px rgb(173, 173, 173) ; + padding: 3em; + border-radius: .3em; + border-left: 0.3em solid yellow; + padding-bottom: 2em; + margin-bottom: 2em; + +} +.field-container-active{ + box-shadow: 0px 1px 2px rgb(173, 173, 173) ; + padding: 3em; + border-radius: .3em; + border-left: 0.3em solid $blue-color; + padding-bottom: 2em; + margin-bottom: 2em; + +} +.field-id-container{ + background-color: $blue-color-light; + position: absolute; + right: 0; + top: 0; + padding: .6em 1.2em; + overflow: visible; + .field-id-container-icon{ + position: absolute; + top: -50%; + + } +} + +.main-content-page{ + padding: 1.5em; } \ No newline at end of file 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 e4fd16dfa..70c9fe6b9 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,24 +1,37 @@ -import { Component, Input, OnInit } from '@angular/core'; +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 } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; +import { DatasetProfileFieldViewStyle } from '@app/core/common/enum/dataset-profile-field-view-style'; @Component({ selector: 'app-dataset-profile-editor-composite-field-component', templateUrl: './dataset-profile-editor-composite-field.component.html', styleUrls: ['./dataset-profile-editor-composite-field.component.scss'] }) -export class DatasetProfileEditorCompositeFieldComponent implements OnInit { +export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnChanges { @Input() form: FormGroup; @Input() indexPath: string; @Input() viewOnly: boolean; - isComposite = false; + @Input() numbering: string; + + + previewForm: FormGroup; + // isComposite = false; isMultiplicityEnabled = false; + viewStyleEnum = DatasetProfileFieldViewStyle; constructor() { } + ngOnChanges(){ + this.setTargetField(null); + } ngOnInit() { //this.addNewField(); if (this.form.get('multiplicity')) { @@ -26,11 +39,55 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit { this.isMultiplicityEnabled = true; } } - this.isComposite = (this.form.get('fields') as FormArray).length > 1; + // this.isComposite = (this.form.get('fields') as FormArray).length > 1; if (this.viewOnly) { this.form.get('hasCommentField').disable(); } + + //SET UP TARGET FIELD + if((this.form.get('fields') as FormArray).length>0){ + //get the first field in list + this.targetField = (this.form.get('fields') as FormArray).at(0) as FormGroup; + } + + } + + + generatePreview(){ + const editorModel = new DatasetDescriptionCompositeFieldEditorModel(); + editorModel.title = this.form.get('title').value; + editorModel.description = this.form.get('description').value; + editorModel.extendedDescription = this.form.get('extendedDescription').value; + editorModel.additionalInformation = this.form.get('additionalInformation').value; + editorModel.hasCommentField = this.form.get('hasCommentField').value; + editorModel.fields = []; + + (this.form.get('fields') as FormArray).controls.forEach(field=>{ + const fieldEditorModel = new DatasetDescriptionFieldEditorModel(); + + fieldEditorModel.viewStyle= { + renderStyle: field.get('viewStyle').get('renderStyle').value, + cssClass: null + }; + fieldEditorModel.defaultValue = field.get('defaultValue').value; + switch (field.get('viewStyle').get('renderStyle').value) { + case DatasetProfileFieldViewStyle.TextArea: + fieldEditorModel.data = { + label: field.get('data').get('label').value + }; + break; + + default: + break; + } + + + editorModel.fields.push(fieldEditorModel); + }); + + + this.previewForm = editorModel.buildForm(); } onIsCompositeChange(isComposite: boolean) { @@ -67,4 +124,70 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit { if (formGroup.get('title') && formGroup.get('title').value && formGroup.get('title').value.length > 0) { return formGroup.get('title').value; } return "Field " + (index + 1); } + + + targetField:FormGroup; + validationTypeEnum = ValidationType; + + + addVisibilityRule(targetField: FormGroup){ + const rule: RuleEditorModel = new RuleEditorModel(); + (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; + + if(event.checked){ + if(!validations.includes(ValidationType.Required)){//IS ALREADY REQUIRED + // validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required)); + // validationsControl.updateValueAndValidity(); + validations.push(ValidationType.Required); + // validationsControl.setValue(validations); + validationsControl.updateValueAndValidity(); + } + }else{ + 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{ + // //SET REQUIRED VALIDATOR + // console.log('setting required validator'); + // validations.push(ValidationType.Required); + // validationsControl.setValue(validations); + // validationsControl.updateValueAndValidity(); + // } + } + setTargetField(field:FormGroup){ + this.targetField = field; + } + + + deleteTargetField(){ + if(!this.targetField) return; + + let index = -1; + + const fields = this.form.get('fields') as FormArray; + + for(let i=0;i< fields.length; i++){ + let field = fields.at(i); + if(field.get('id').value === this.targetField.get('id').value){//index found + index = i; + break; + } + } + + if(index>=0){//target found in fields + this.DeleteField(index); + this.targetField = null; + } + + } } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-profile-editor-default-value/component-profile-editor-default-value.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-profile-editor-default-value/component-profile-editor-default-value.component.html index b9c42bc35..ca386a1f2 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-profile-editor-default-value/component-profile-editor-default-value.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/composite-profile-editor-default-value/component-profile-editor-default-value.component.html @@ -1,6 +1,7 @@
+ {{placeHolder}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.DEFAULT-VALUES.NONE' | translate}} @@ -16,6 +17,7 @@ + {{placeHolder}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.DEFAULT-VALUES.CHECK-BOX.CHECKED' | translate}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.DEFAULT-VALUES.CHECK-BOX.UNCHECKED' | translate}} @@ -25,9 +27,11 @@ + {{placeHolder}} + {{placeHolder}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.DEFAULT-VALUES.NONE' | translate }} {{opt.get('label').value}} @@ -37,23 +41,28 @@ + {{placeHolder}} + {{placeHolder}} + {{placeHolder}} + {{placeHolder}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} + {{placeHolder}} {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.DEFAULT-VALUES.NONE' | translate}} {{opt.get('label').value}} @@ -63,6 +72,7 @@ + {{placeHolder}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} @@ -70,6 +80,7 @@ + {{placeHolder}} 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 5dda9d7bc..3b08069f0 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,10 +1,13 @@ + + +
- + - + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.RDA-COMMON-STANDARDS' | translate}} @@ -62,7 +65,7 @@
-
+
@@ -85,13 +88,50 @@
-
-

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.RULES-TITLE' | translate}} -

- -
- -
+
+ + + + +

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.RULES-TITLE' | translate}} +

+ + +
+ + +
+ + + + +
+
+ Preview +
+ +
+ + + +
+
+ + Not initialized yet + +
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.scss index 3db0dee74..9a774bbed 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/dataset-profile-editor-field.component.scss @@ -1,3 +1,14 @@ .full-width { width: 100%; } + + +.preview-box{ + padding: 1em; + border: 1px solid #e8dcdc; + border-radius: 0.3em; +} + +mat-radio-button{ + padding-right: 1em; +} \ No newline at end of file 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 d96993846..53031ca86 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 @@ -1,5 +1,5 @@  -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { FormArray, FormControl, FormGroup } from '@angular/forms'; import { DatasetProfileFieldViewStyle } from '@app/core/common/enum/dataset-profile-field-view-style'; import { ValidationType } from '@app/core/common/enum/validation-type'; @@ -27,13 +27,15 @@ import { DatasetIdentifierDataEditorModel } from '../../../admin/field-data/data import { ExternalDatasetsDataEditorModel } from '../../../admin/field-data/external-datasets-data-editor-models'; import { CurrencyDataEditorModel } from '../../../admin/field-data/currency-data-editor-models'; import { ValidationDataEditorModel } from '../../../admin/field-data/validation-data-editor-models'; +import { DatasetDescriptionFieldEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-dataset-profile-editor-field-component', templateUrl: './dataset-profile-editor-field.component.html', styleUrls: ['./dataset-profile-editor-field.component.scss'] }) -export class DatasetProfileEditorFieldComponent extends BaseComponent implements OnInit { +export class DatasetProfileEditorFieldComponent extends BaseComponent implements OnInit,OnChanges { @Input() viewOnly: boolean; @Input() form: FormGroup; @Input() showOrdinal = true; @@ -42,13 +44,18 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements viewStyleEnum = DatasetProfileFieldViewStyle; isFieldMultiplicityEnabled = false; + @Input() expandView: boolean = true; constructor( public enumUtils: EnumUtils, public datasetProfileService: DatasetProfileService ) { super(); } + ngOnChanges(changes: SimpleChanges): void { + this.generatePreviewForm(); + } ngOnInit() { + this.showPreview = true; if (this.form.get('multiplicity')) { if (this.form.get('multiplicity').value.min > 1 && this.form.get('multiplicity').value.max > 1) { this.isFieldMultiplicityEnabled = true; @@ -59,6 +66,12 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements this.form.get('viewStyle').get('renderStyle').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => { + + + // const previewStatus = this.showPreview; + //!! Important to be before the if statement + this.showPreview = false; + if (this.form.get('data')) { this.form.removeControl('data'); @@ -119,6 +132,11 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements break; } } + + + //reset the preview status + // this.showPreview = previewStatus; + this.showPreview = true; }); } @@ -162,4 +180,84 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements const rule: RuleEditorModel = new RuleEditorModel(); (this.form.get('visible').get('rules')).push(rule.buildForm()); } + + + private _formChangesSubscription:Subscription; + private _showPreview: boolean = false;; + + get showPreview(): boolean{ + + return this._showPreview; + } + + set showPreview(value:boolean){ + if(value == false){//hide preview + //close subsciption + if(this._formChangesSubscription){ + this._formChangesSubscription.unsubscribe(); + this._formChangesSubscription = null; + } + } + + if(value == true){ + this._formChangesSubscription = this.form.valueChanges.subscribe(()=>{ + this.generatePreviewForm(); + }); + //initialize + if(this.form.get('viewStyle').get('renderStyle').value){ + this.generatePreviewForm(); + } + } + + this._showPreview = value; + } + + previewForm: FormGroup; + + generatePreviewForm(){ + this.previewForm = null; + // this._showPreview = false; + const fieldEditorModel = new DatasetDescriptionFieldEditorModel(); + + fieldEditorModel.viewStyle= { + renderStyle: this.form.get('viewStyle').get('renderStyle').value, + cssClass: null + }; + + fieldEditorModel.data = this.form.get('data').value; + fieldEditorModel.value = this.form.get('defaultValue').get('value').value; + fieldEditorModel.validationRequired = (this.form.get('validations').value as Array).includes(ValidationType.Required); + + if(this.form.get('viewStyle').get('renderStyle').value == DatasetProfileFieldViewStyle.CheckBox){ + fieldEditorModel.value = this.form.get('defaultValue').get('value').value === 'true'; + } + + this.previewForm = fieldEditorModel.buildForm(); + + // this._showPreview = true; + }; + + // generatePreview(){ + // const fieldEditorModel = new DatasetDescriptionFieldEditorModel(); + + // fieldEditorModel.viewStyle= { + // renderStyle: this.form.get('viewStyle').get('renderStyle').value, + // cssClass: null + // }; + // fieldEditorModel.defaultValue = this.form.get('defaultValue').value; + // switch (this.form.get('viewStyle').get('renderStyle').value) { + // case DatasetProfileFieldViewStyle.TextArea: + // fieldEditorModel.data = { + // label: this.form.get('data').get('label').value + // }; + // break; + + // default: + // break; + // } + + // // this.previewForm = fieldEditorModel.buildForm(); + + + // } } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.html index b92190104..5386fce2b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/rule/dataset-profile-editor-rule.component.html @@ -10,15 +10,79 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.RULE.FIELDS.RULE-THEN'| translate}} - + + + + + Pick one + + + + + + + {{option.label? option.label:'<'+ ('DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.UNTITLED' | translate) + '>'}} +
+ + {{option.id}} + + +
+
+ + + + + {{option.label? option.label:'<'+ ('DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.UNTITLED' | translate) + '>'}} +
+ + {{option.id}} + +
+
+ + + + + {{option.label? option.label:'<'+ ('DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.UNTITLED' | translate) + '>'}} +
+ + {{option.id}} + +
+
+
+ {{'GENERAL.VALIDATION.REQUIRED' | translate}} +
+
+ + + + + \ No newline at end of file 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 37e753353..e0004a828 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 @@ -1,7 +1,8 @@ -import { Component, Input } from '@angular/core'; -import { FormArray, FormControl } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray, FormControl, FormGroup } from '@angular/forms'; import { DatasetProfileFieldViewStyle } from '../../../../../../core/common/enum/dataset-profile-field-view-style'; import { DatasetProfileComboBoxType } from '../../../../../../core/common/enum/dataset-profile-combo-box-type'; +import { ToCEntryType } from '../../../table-of-contents/table-of-contents-entry'; @Component({ selector: 'app-dataset-profile-editor-rule-component', @@ -9,21 +10,132 @@ import { DatasetProfileComboBoxType } from '../../../../../../core/common/enum/d styleUrls: ['./dataset-profile-editor-rule.component.scss'] }) -export class DatasetProfileEditorRuleComponent { - +export class DatasetProfileEditorRuleComponent implements OnInit{ + @Input() form: FormArray; - + @Input() viewStyleForCheck: DatasetProfileFieldViewStyle; @Input() formControlForCheck: FormControl; @Input() formArrayOptionsForCheck: FormArray; @Input() comboBoxTypeForCheck: DatasetProfileComboBoxType; @Input() viewOnly: boolean; - + targetValidation() { //TODO } - + deleteRule(index) { this.form.removeAt(index); } + + ngOnInit(): void { + this.options = this.getOptions(); + + + this.sectionOptions = []; + this.fieldOptions = []; + this.fieldSetOptions = []; + this.options.forEach(option=>{ + switch (option.type) { + case ToCEntryType.Field: + this.fieldOptions.push(option); + break; + case ToCEntryType.FieldSet: + this.fieldSetOptions.push(option); + break; + case ToCEntryType.Section: + this.sectionOptions.push(option); + break; + default: + break; + } + }); + + } + options: OptionItem[]; + sectionOptions: OptionItem[]; + fieldSetOptions: OptionItem[]; + fieldOptions: OptionItem[]; + + + getOptions():OptionItem[]{ + const rootForm = this.form.root; + if(rootForm){ + // const parentSections = rootForm.get('sections') as FormArray; + + const result:OptionItem[] =[]; + + const sections = rootForm.get('sections') as FormArray; + + if(sections){ + sections.controls.forEach(section=>{ + const subResult = this.buildOptions(section as FormGroup, ToCEntryType.Section,[]); + result.push(...subResult); + }); + } + + //return options + return result; + + } + //nothing found + return []; + } + + private buildOptions(form: FormGroup, type: ToCEntryType, parentIds:string[]):OptionItem[]{ + + const sections = form.get('sections') as FormArray; + const fieldSets = form.get('fieldSets') as FormArray; + const fields = form.get('fields') as FormArray; + + const result:OptionItem[] = []; + + parentIds.push(form.get('id').value); + result.push({ + id: form.get('id').value, + type: type, + label: type ===ToCEntryType.Field? form.get('data').get('label').value :form.get('title').value, + // parentsIds: [form.get('id').value] + parentsIds: [...parentIds] + }); + + if(sections){ + sections.controls.forEach(section=>{ + result.push( ...this.buildOptions(section as FormGroup, ToCEntryType.Section,parentIds) ); + }); + } + if(fieldSets){ + fieldSets.controls.forEach(fieldset=>{ + result.push( ...this.buildOptions(fieldset as FormGroup, ToCEntryType.FieldSet, parentIds) ); + }); + } + if(fields){ + fields.controls.forEach(field=>{ + result.push( ...this.buildOptions(field as FormGroup, ToCEntryType.Field, parentIds) ); //TODO NA TO DOUME + }); + } + + return result; + } + + get parentIds(): string[]{ + + if(!this.formControlForCheck.get('id')) return []; + + const current = this.options.find(opt=> opt.id === this.formControlForCheck.get('id').value); + + if(current){ + return current.parentsIds; + } + return []; + } + } + + +interface OptionItem{ + id: string, + label: string, + type: ToCEntryType, + parentsIds: string[] +} \ No newline at end of file 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 00f667062..b18ee3cbc 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 @@ -1,31 +1,40 @@ 
-

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.SECTION.TITLE' | translate}}

+ + - + + +
{{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-NAME' | translate}} *
+
{{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-NAME-HINT' | translate}}
+ - + + +
{{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION' | translate}} *
+
{{'DATASET-PROFILE-EDITOR.STEPS.SECTION-INFO.SECTION-DESCRIPTION-HINT' | translate}}
+ + + + -

{{'DATASET-PROFILE-EDITOR.STEPS.FORM.SECTION.FIELDS.SUB-SECTIONS-TITLE' | + + + + + + + -

diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.scss b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.scss index 02d304fc1..d98754c6e 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.scss +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.scss @@ -6,3 +6,24 @@ .deleteBtn{ margin-right:2em; } + +.heading { + text-align: left; + font-weight: 700; + font-size: 18px; + letter-spacing: 0px; + color: #212121; + opacity: 0.81; + margin-top: 1.625rem; + margin-bottom: 0.625rem; +} + +.hint { + text-align: left; + font-weight: 400; + font-size: 16px; + letter-spacing: 0px; + color: #212121; + opacity: 0.81; + margin-bottom: 0.125rem; +} 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 ea4c54a35..5ea009c1b 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 @@ -1,4 +1,4 @@ -
+

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

@@ -16,45 +16,99 @@

- + + + + + + +
+ +
+
+
+
+ + {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TITLE' | translate}} + +
+
+ + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}} + +
+
+ + Preview and Finalize + +
+
+
+ +
+ + +
+
+ + + {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TITLE' | translate}}
- - - {{'GENERAL.VALIDATION.REQUIRED' | - translate}} - - - - - - {{'GENERAL.VALIDATION.REQUIRED' - | translate}} - - - - - - - - {{ lang.name }} - - - {{'GENERAL.VALIDATION.REQUIRED' | - translate}} - -
+
1.1 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-NAME'| translate}} *
+
{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-NAME-HINT'| translate}}
+ + + {{'GENERAL.VALIDATION.REQUIRED' | + translate}} + + +
+
+
1.2 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-DESCRIPTION'| translate}} *
+ +
{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-DESCRIPTION-HINT'| translate}}
+ + + {{'GENERAL.VALIDATION.REQUIRED' + | translate}} + + +
+ +
+ +
1.3 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-LANGUAGE'| translate}}
+ + + + + {{ lang.name }} + + + {{'GENERAL.VALIDATION.REQUIRED' | + translate}} + + +
+ +
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}}
-
- -
-
-
-
+ +
+ + +
+ + + +
+
+ + +
+
+
+ +
+
{{'DATASET-PROFILE-EDITOR.STEPS.PAGE-INFO.PAGE-NAME' | translate}} *
+
{{'DATASET-PROFILE-EDITOR.STEPS.PAGE-INFO.PAGE-NAME-HINT' | translate}}
+ + + +
+ + + +
+ +
- + + [form]="selectedTocEntry.form" [indexPath]="'tbd'" [viewOnly]="viewOnly" + > +
-

+ + @@ -96,32 +194,33 @@ (click)="deleteFieldSet(selectedTocEntry.form, i);" [disabled]="viewOnly"> delete --> - + [viewOnly]="viewOnly" + [numbering]="selectedTocEntry.numbering"> - -

- + +
+
- +
+
+ {{'DATASET-PROFILE-EDITOR.STEPS.PAGE-INFO.ACTIONS.NOTHING-HERE-HINT'| translate}} +
+ {{'DATASET-PROFILE-EDITOR.STEPS.PAGE-INFO.ACTIONS.START-CREATING-PAGE-START'| translate}} - + + + {{'DATASET-PROFILE-EDITOR.STEPS.PAGE-INFO.ACTIONS.START-CREATING-PAGE-END'| translate}} + + add + +
@@ -145,48 +244,62 @@ -->
-
+ +
-
- -
-
- - - + + + + + +
+ +
+
+ + + +
+
+ +
+
+ + +
+
+ +
+
+ +
- -
-
- - -
-
- -
-
- -
-
-
+ + + +
\ No newline at end of file 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 5121e378f..4dd2f079b 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 @@ -9,3 +9,86 @@ .deleteBtn{ margin-right:2em; } + + + +// REFACTORED CSS + +.stepper{ + background-color: transparent; +} +.content-displayer{ + background-color: #fff; + border-radius: 7px; + box-shadow: 0px 1px 2px #bfbfbf; + padding: 0em; + // padding-top: 0em; + overflow: visible; + min-height: 30em; +} + +.heading { + text-align: left; + font-weight: 700; + font-size: 18px; + letter-spacing: 0px; + color: #212121; + opacity: 0.81; + margin-top: 1.625rem; + margin-bottom: 0.625rem; +} + +.hint { + text-align: left; + font-weight: 400; + font-size: 16px; + letter-spacing: 0px; + color: #212121; + opacity: 0.81; + margin-bottom: 0.125rem; +} + +//TO CHECK +:host ::ng-deep .mat-horizontal-content-container { + overflow: visible; +} +:host ::ng-deep .mat-form-field-outline{ + background-color: #ffffff4f; +} + +:host ::ng-deep .mat-horizontal-stepper-header-container { + display: none !important; +} + +#progress{ + position: absolute; + height: 100%; + width: 110%; + transform: translateX(-110%); + transition-property: transform; + transition-duration: 600ms; + transition-timing-function: ease-out; + transition-delay: 50ms; + box-shadow: 0px 1px 2px #bfbfbf; + background-color: #f7dd72; +} +#progress-container{ + box-shadow: 0px 1px 2px #bfbfbf; + border-radius: .3em; +} +// .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; +// } + .navigate-btn { + border-radius: 30px; + background-color: #f7dd72; + padding-left: 2em; + padding-right: 2em; + } \ No newline at end of file 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 eab68df12..4e3f295a8 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 @@ -1,7 +1,7 @@ import { of as observableOf, Observable } from 'rxjs'; import { HttpClient, HttpErrorResponse } from '@angular/common/http'; -import { Component, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; import { Form, FormArray, FormControl, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatHorizontalStepper } from '@angular/material/stepper'; @@ -29,8 +29,13 @@ import { MatomoService } from '@app/core/services/matomo/matomo-service'; import { Link, LinkToScroll } from '@app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents'; import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; -import { ToCEntry, ToCEntryType } from '../table-of-contents/table-of-contents-entry'; +import { Foo, ToCEntry, ToCEntryType } from '../table-of-contents/table-of-contents-entry'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { FieldSetEditorModel } from '../admin/field-set-editor-model'; +import { Guid } from '@common/types/guid'; +import { FieldEditorModel } from '../admin/field-editor-model'; +import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; +import { StepperSelectionEvent } from '@angular/cdk/stepper'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -39,7 +44,7 @@ const skipDisable: any[] = require('../../../../../assets/resources/skipDisable. templateUrl: './dataset-profile-editor.component.html', styleUrls: ['./dataset-profile-editor.component.scss'] }) -export class DatasetProfileEditorComponent extends BaseComponent implements OnInit { +export class DatasetProfileEditorComponent extends BaseComponent implements OnInit, AfterViewInit { isNew = true; isNewVersion = false; @@ -59,22 +64,6 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn errorMessages: string[] = []; tocEntryEnumValues = ToCEntryType; - - - profileEditorConfig: { - form: FormGroup, - index: string, - id: string, - sectionEditorModel?: SectionEditorModel - }; - profileEditorCompositeConfig: { - form: FormGroup, - index: string, - id: string - }; - - isSectionControl: boolean = false; - // sectionIdPreviewed:string = null; // currentSubForm:FormGroup = null; // currentSectionIndex: number = null; @@ -92,12 +81,19 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn private httpClient: HttpClient, private matomoService: MatomoService, private enumUtils: EnumUtils, - private datasetWizardService: DatasetWizardService + private datasetWizardService: DatasetWizardService, + private visibilityRulesService: VisibilityRulesService ) { super(); // this.profileID = route.snapshot.params['id']; // this.cloneId = route.snapshot.params['cloneid']; } + ngAfterViewInit(): void { + // setTimeout(() => { + // this.barPercentage = (1 / (this.stepper.steps.length+1)) * 110 - 110; + // }, 0); + } + ngOnInit() { this.matomoService.trackPageView('Admin: Dataset Profile Edit'); @@ -183,13 +179,15 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn this.form.disable(); this.viewOnly = true; } - this.addSection(); - this.addPage(); + // this.addSection(); + // this.addPage(); + this.visibilityRulesService.buildVisibilityRules([],this.form); } }); } prepareForm() { + this.visibilityRulesService.buildVisibilityRules([],this.form); this.form.valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(change => { @@ -519,17 +517,21 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn getTocEntries(): ToCEntry[] { if (this.form == null) { return []; } - const result: ToCEntry[] = []; + + //build parent pages (this.form.get('pages') as FormArray).controls.forEach((pageElement, i) => { result.push({ id: pageElement.get('id').value, label: pageElement.get('title').value, type: ToCEntryType.Page, - form: pageElement + form: pageElement, + numbering: (i + 1).toString(), + subEntriesType: ToCEntryType.Section } as ToCEntry) }); + // build first level sections (this.form.get('sections') as FormArray).controls.forEach((sectionElement, i) => { const currentSectionPageId = sectionElement.get('page').value; const pageToAdd = result.filter(x => x.id == currentSectionPageId)[0]; @@ -540,12 +542,13 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn label: sectionElement.get('title').value, type: ToCEntryType.Section, form: sectionElement, - numbering: pageToAdd.numbering + '.' + i + numbering: pageToAdd.numbering + '.' + (pageToAdd.subEntries.length +1) } as ToCEntry; const sectionItems = this.populateSections(sectionElement.get('sections') as FormArray, item.numbering); const fieldSetItems = this.populateFieldSets(sectionElement.get('fieldSets') as FormArray, item.numbering); if (sectionItems != null) { item.subEntries = sectionItems; + item.subEntriesType = ToCEntryType.Section; } if (fieldSetItems != null) { if (item.subEntries == null) { @@ -553,11 +556,12 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn } else { item.subEntries.push(...fieldSetItems); } + item.subEntriesType = ToCEntryType.FieldSet; + } pageToAdd.subEntries.push(item); }); - return result; } @@ -572,12 +576,13 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn label: sectionElement.get('title').value, type: ToCEntryType.Section, form: sectionElement, - numbering: existingNumbering + '.' + i + numbering: existingNumbering + '.' + (i + 1) } as ToCEntry; const sectionItems = this.populateSections(sectionElement.get('sections') as FormArray, item.numbering); const fieldSetItems = this.populateFieldSets(sectionElement.get('fieldSets') as FormArray, item.numbering); if (sectionItems != null) { item.subEntries = sectionItems; + item.subEntriesType = ToCEntryType.Section; } if (fieldSetItems != null) { if (item.subEntries == null) { @@ -585,6 +590,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn } else { item.subEntries.push(...fieldSetItems); } + item.subEntriesType = ToCEntryType.FieldSet; } result.push(item); }); @@ -602,9 +608,9 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn id: fieldSetElement.get('id').value, label: fieldSetElement.get('title').value, type: ToCEntryType.FieldSet, - subEntries: this.populateSections((fieldSetElement.get('fieldSets') as FormArray), existingNumbering + '.' + i), + //subEntries: this.populateSections((fieldSetElement.get('fieldSets') as FormArray), existingNumbering + '.' + i), form: fieldSetElement, - numbering: existingNumbering + '.' + i + numbering: existingNumbering + '.' + (i + 1) } as ToCEntry) }); @@ -612,89 +618,293 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn return result; } + addNewEntry(tce: Foo) { + + const parent = tce.parent; + + //define entry type + switch (tce.childType) { + case ToCEntryType.Page: //CALLED FROM PAGE + //create section + // this.addPage(); + // this.displayItem(child); + + + //ceate page editor model and give ordinal + const page: PageEditorModel = new PageEditorModel(this.dataModel.pages.length); + this.dataModel.pages.push(page); + (this.form.get('pages')).push(page.buildForm()); + + + //make new entry selected + const pagesArray = (this.form.get('pages') as FormArray); + const addedEntry = pagesArray.at(pagesArray.length-1) as FormGroup; + this.selectedTocEntry = { + form: addedEntry, + label: addedEntry.get('title').value, + type: ToCEntryType.Page, + id: addedEntry.get('id').value, + numbering:pagesArray.value.length, + subEntries:null, + subEntriesType: ToCEntryType.Section + } + + break; + case ToCEntryType.Section: //adding a section + const section: SectionEditorModel = new SectionEditorModel(); + //give id + section.id = Guid.create().toString(); + let sectionsArray:FormArray; + + if (parent.type === ToCEntryType.Page) { + //FIRST LEVEL SECTION + + //give ordinal and link to parent + section.page = parent.id; + section.ordinal = (this.form.get('sections') as FormArray).length; + (this.form.get('sections')).push(section.buildForm()); + + sectionsArray = this.form.get('sections') as FormArray; + } else if( parent.type == ToCEntryType.Section) { //subsection + + //adding page parent MAYBE NOT NEEDED + section.page = parent.form.get('page').value; + //MAYBE NOT NEEDED + section.ordinal = (parent.form.get('sections') as FormArray).length; + (parent.form.get('sections')).push(section.buildForm()); + // (child.form.parent as FormArray).push(section.buildForm()); + + sectionsArray = parent.form.get('sections') as FormArray; + }else{ + console.error('BUg found'); + } + + + const sectionAdded = sectionsArray.at(sectionsArray.length -1) as FormGroup; + + this.selectedTocEntry = { + id: sectionAdded.get('id').value, + label: sectionAdded.get('title').value, + form: sectionAdded, + numbering:'', + subEntries: null, + subEntriesType: undefined, //ADDNEW VALUE TO TOCENTRY TYPE FOR UNDFINED + type: ToCEntryType.Section + } + + break; + case ToCEntryType.FieldSet: + const fieldSet: FieldSetEditorModel = new FieldSetEditorModel(); + + //create one field form fieldset + const field: FieldEditorModel = new FieldEditorModel(); //to ask + field.id = Guid.create().toString(); + field.ordinal = fieldSet.fields.length; + fieldSet.fields.push(field); + + //give fieldset id and ordinal + fieldSet.id = Guid.create().toString(); + fieldSet.ordinal = (parent.form.get('fieldSets') as FormArray).length; + + (parent.form.get('fieldSets')).push(fieldSet.buildForm()); + + const parentArray = parent.form.get('fieldSets') as FormArray; + const addedFieldSet = parentArray.at(parentArray.length - 1); + + this.selectedTocEntry = { + id: addedFieldSet.get('id').value, + label: addedFieldSet.get('title').value, + form: addedFieldSet, + numbering: '', + subEntries: null, //TODO IT SHOULD HAVE CHILDS + subEntriesType: ToCEntryType.Field, + type: ToCEntryType.FieldSet + } + + + break; + + default: + break; + } + + } + + + + + + onRemoveEntry(tce: ToCEntry) { + //define entry type + switch (tce.type) { + case ToCEntryType.Page: + const pages = this.form.get('pages') as FormArray; + + let pageIndex = -1; + //get the index + for (let i = 0; i < pages.length; i++) { + let page = pages.at(i) as FormGroup; + + if (page.controls.id.value === tce.id) { + pageIndex = i; + break; + } + } + + if (pageIndex >= 0) { + //remove page + pages.removeAt(pageIndex); + //clean up sections of removed page + + const sections = (this.form.get('sections') as FormArray).controls; + + const updatedSections = new FormArray([]); + + for (let i = 0; i < sections.length; i++) { + let section = sections[i]; + + if (section.get('page').value != tce.id) { + updatedSections.push(section); + } + } + //replace sections value + this.form.controls.sections = updatedSections; + + //update page orders + for(let i=0; i= 0) { //section found + + const sections = (this.form.get('sections') as FormArray); + + //remove section + sections.removeAt(index); + + //update ordinal + for(let i=0; i< sections.length; i++){ + sections.at(i).get('ordinal').patchValue(i); + } + } else {//NOT FOUND IN FIRST LEVEL CASE + + //LOOK FOR SUBSECTION CASE + let parentFormArray = tce.form.parent as FormArray; + + for (let i = 0; i < parentFormArray.length; i++) { + let section = parentFormArray.at(i); + + if (section.get('id').value == tce.id) { + index = i; + break; + } + } + if (index >= 0) { + parentFormArray.removeAt(index); + + //update odrinal + + for(let i=0; i=0){//fieldset found + parentFormArray.removeAt(idx); + + //patching order + for(let i=0; i{ + if(this.tocEntryIsChildOf(testingChild, subEntry)){ + childFound = true; + return true; + } + }) + + return childFound; + } + return false; + } + selectedTocEntry: ToCEntry displayItem(entry: ToCEntry): void { this.selectedTocEntry = entry; + } - - // console.log(this.form); - // console.log(this.dataModel); - - // this.profileEditorConfig = null; - - // let entry = entries[0]; - // console.log(entries); - - - // if (entry.subEntries && (entry.subEntries.length > 0)) {// its a page - // // this.sectionIdPreviewed = entry.id; - // const valuesArray = this.form.get('sections').value; - - - // let currentVal = entry.id; - - // let indexArray: string[] = valuesArray.map(element => element.page); - - // let index = indexArray.indexOf(currentVal); - // let subForm = (this.form.get('sections') as FormArray).controls[index] as FormGroup; - // let currentEditor = this.dataModel.sections.filter(section => section.page == entry.id)[0]; - - - // this.profileEditorConfig = { - // id: entry.id, - // form: subForm, - // index: index.toString(), - // sectionEditorModel: currentEditor - // }; - - // this.isSectionControl = false; - // // this.currentSubForm = subForm; - // // this.currentSectionIndex = index; - // // this.currentSectionEditorModel = currentEditor; - - // // this.isCompoSiteFieldEditor = true; - - // } else if (entries.length == 2) {//its section - - // this.isSectionControl = true; - - // const valuesArray = this.form.get('sections').value; - - - // let currentVal = entries[1].id // Parent node entry.id; - - // let indexArray: string[] = valuesArray.map(element => element.page); - - // let index = indexArray.indexOf(currentVal); - - - // //Section Form - // const sectionForm = (this.form.get('sections') as FormArray).controls[index] as FormGroup; - - // const sectionFormControls = sectionForm.get('fieldSets')['controls']; - - // const fieldSetsIds = sectionForm.get('fieldSets').value;//.map(fieldset => fieldset.id); - // // const fieldsetIndex = fieldSetsIds.indexOf(entries[0].id); - - // console.log(fieldSetsIds); - - - // const sectionFormControl = sectionFormControls[0]; - - // this.profileEditorCompositeConfig = { - // id: entries[0].id, - // form: sectionFormControl, - // index: 's' + index + 'cf' + 0 - // } - - - // } - - - - - - + get numOfPages(){ + return (this.form.get('pages')).length; } // getSectionIndex(): number{ @@ -734,4 +944,27 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn } + + printForm(){ + console.log(this.form.value); + } + + + + barPercentage = -100; + onStepperSelectionChange(selectionChange: StepperSelectionEvent){ + + this.barPercentage = ((selectionChange.selectedIndex+1) / (this.stepper.steps.length+1)) * 110- 110; + } + + get barPercentageA(){ + if(!this.stepper){ + return -110; + } + + const selectedIndex = this.stepper.selectedIndex + 1; + return (selectedIndex / (this.stepper.steps.length+1)) * 110- 110; + } + + } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts index 3cc284659..cb8afe41b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-entry.ts @@ -3,6 +3,7 @@ import { AbstractControl } from "@angular/forms"; export interface ToCEntry { id: string; label: string; + subEntriesType: ToCEntryType; subEntries: ToCEntry[]; type: ToCEntryType; form: AbstractControl; @@ -13,5 +14,11 @@ export interface ToCEntry { export enum ToCEntryType { Page = 0, Section = 1, - FieldSet = 2 + FieldSet = 2, + Field = 3 +} + +export interface Foo { + childType: ToCEntryType, + parent: ToCEntry } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html index 5c2e2ccac..0ac817cd6 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html @@ -1,5 +1,81 @@ - \ 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 b346518fa..777fb64e1 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,7 +1,7 @@ .docs-toc-container { width: 100%; padding: 5px 0 10px 0px; - cursor: pointer; + // cursor: pointer; // border-left: solid 4px #0c7489; .scroll-container { 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 858ba8447..72a0c21f8 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 @@ -5,7 +5,7 @@ import { interval, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { type } from 'os'; import { SimpleChanges } from '@angular/core'; -import { ToCEntry } from './table-of-contents-entry'; +import { Foo, ToCEntry, ToCEntryType } from './table-of-contents-entry'; export interface Link { /* id of the section*/ @@ -38,14 +38,24 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn @Output() currentLinks = new EventEmitter(); @Output() itemClick = new EventEmitter(); + @Output() newEntry = new EventEmitter(); + @Output() removeEntry = new EventEmitter(); + @Output() createEntry = new EventEmitter(); + + + @Input() itemSelected: ToCEntry; + subscription: Subscription; linksSubject: Subject = new Subject(); @Input() isActive: boolean; show: boolean = false; + tocEntryType = ToCEntryType; + + constructor( @Inject(DOCUMENT) private _document: Document) { super(); @@ -175,6 +185,19 @@ export class DatasetProfileTableOfContents extends BaseComponent implements OnIn // } + addNewEntry(tce: ToCEntry){ + this.newEntry.emit(tce); + } + deleteEntry(currentLink: ToCEntry){ + this.removeEntry.emit(currentLink); + } + + + + createNewEntry(foo: Foo){ + this.createEntry.emit(foo); + } + } export interface LinkToScroll { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.module.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.module.ts index 6dbc01fa1..4280fda84 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.module.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.module.ts @@ -32,7 +32,9 @@ import { FormProgressIndicationModule } from './components/form-progress-indicat ], exports: [ DatasetDescriptionFormComponent, - DatasetDescriptionComponent + DatasetDescriptionComponent, + FormCompositeFieldComponent, + FormFieldComponent ], providers: [ VisibilityRulesService, diff --git a/dmp-frontend/src/assets/i18n/de.json b/dmp-frontend/src/assets/i18n/de.json index c10317679..3821af770 100644 --- a/dmp-frontend/src/assets/i18n/de.json +++ b/dmp-frontend/src/assets/i18n/de.json @@ -280,6 +280,33 @@ "ROLES": "Roles" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Page Description", "PAGE-PREFIX": "Page", @@ -429,9 +456,9 @@ } }, "DMP-LISTING": { - "TITLE": "Datenmanagementpläne", + "DMP": "DMP", "GRANT": "Grant", - "TITLE": "Data Management Plans", + "TITLE": "Datenmanagementpläne", "OWNER": "Besitzer", "MEMBER": "Mitglied", "CREATOR": "Ersteller", @@ -1152,7 +1179,8 @@ "RESEARCHERS": "Researchers", "ORGANIZATIONS": "Organizations", "DATASET-IDENTIFIER": "Dataset Identifier", - "CURRENCY": "Currency" + "CURRENCY": "Currency", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Word List", @@ -1169,6 +1197,9 @@ "DATASETS": "Datensatzbeschreibungen", "EXTERNAL-SOURCE-HINT": "Liste jener Werte, die von externer(n) Quelle(n) stammen" }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Created", "LABEL": "Label", @@ -1590,4 +1621,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 3908440c5..2b254ac8f 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -280,6 +280,33 @@ "ROLES": "Roles" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Page Description", "PAGE-PREFIX": "Page", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index cf1c9f364..020561464 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -280,6 +280,33 @@ "ROLES": "Funciones" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Descripición de la página", "PAGE-PREFIX": "Página", @@ -1152,7 +1179,8 @@ "RESEARCHERS": "Investigadores", "ORGANIZATIONS": "Organizaciones", "DATASET-IDENTIFIER": "Identificador del dataset", - "CURRENCY": "Moneda" + "CURRENCY": "Moneda", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Lista de palabras", @@ -1169,6 +1197,9 @@ "DATASETS": "Descripciones del dataset", "EXTERNAL-SOURCE-HINT": "Lista de valores para seleccionar la(s) fuente(s) externa(s)" }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Creado", "LABEL": "Etiqueta", @@ -1590,4 +1621,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 1332ffd15..3a5c1239d 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -280,6 +280,33 @@ "ROLES": "Ρόλοι" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Περιγραφή Σελίδας", "PAGE-PREFIX": "Σελίδα", @@ -1152,7 +1179,8 @@ "RESEARCHERS": "Ερευνητές", "ORGANIZATIONS": "Οργανισμοί", "DATASET-IDENTIFIER": "Αναγνωριστικό Συνόλου Δεδομένων", - "CURRENCY": "Επικαιρότητα" + "CURRENCY": "Επικαιρότητα", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Λίστα Λέξεων", @@ -1169,6 +1197,9 @@ "DATASETS": "Περιγραφές Συνόλων Δεδομένων", "EXTERNAL-SOURCE-HINT": "Κατάλογος τιμών που παρέχονται από εξωτερικές πηγές" }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Δημιουργημένο", "LABEL": "Ετικέτα", @@ -1590,4 +1621,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 7636e7cbd..301795862 100644 --- a/dmp-frontend/src/assets/i18n/pt.json +++ b/dmp-frontend/src/assets/i18n/pt.json @@ -280,6 +280,33 @@ "ROLES": "Funções" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Descrição da Página", "PAGE-PREFIX": "Página", @@ -1591,6 +1618,7 @@ "DATASET-PROFILE-STATUS": { "NONE": "Nenhum", "DRAFT": "Rascunho", - "FINALIZED": "Concluído" + "FINALIZED": "Concluído", + "DELETED": "Deleted" } } \ 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 ed035162a..cb310b86c 100644 --- a/dmp-frontend/src/assets/i18n/sk.json +++ b/dmp-frontend/src/assets/i18n/sk.json @@ -280,6 +280,33 @@ "ROLES": "Role" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Opis stránky", "PAGE-PREFIX": "Stránka", @@ -1152,7 +1179,8 @@ "RESEARCHERS": "Výskumníci (Researchers)", "ORGANIZATIONS": "Organizácie (Organizations)", "DATASET-IDENTIFIER": "Identifikátor súborov dát (Dataset Identifier)", - "CURRENCY": "Mena (Currency)" + "CURRENCY": "Mena (Currency)", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Zoznam slov", @@ -1169,6 +1197,9 @@ "DATASETS": "Súbory dát", "EXTERNAL-SOURCE-HINT": "Zoznam hodnôt dodaných z externých zdrojov." }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Vytvorené", "LABEL": "Označenie", @@ -1590,4 +1621,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 6f2fd7dc1..04d0e41e6 100644 --- a/dmp-frontend/src/assets/i18n/sr.json +++ b/dmp-frontend/src/assets/i18n/sr.json @@ -17,6 +17,7 @@ "SUCCESSFUL-LOGIN": "Uspešno ste se prijavili", "SUCCESSFUL-LOGOUT": "Uspešno ste se odjavili", "SUCCESSFUL-EMAIL-SEND": "Email uspešno poslat", + "SUCCESSFUL-COPY-TO-CLIPBOARD": "Copied to Clipboard", "UNSUCCESSFUL-LOGOUT": "Neuspešno odjavljivanje", "UNSUCCESSFUL-LOGIN": "Neuspešno prijavljivanje", "SUCCESSFUL-DATASET-PROFILE-DELETE": "Uspešno brisanje", @@ -84,7 +85,8 @@ "PRODUCED": "izrađen", "RDA-SPECIFICATIONS": "prema RDA specifikacijama", "MACHINE-ACTIONABLE": "za mašinski čitljive Planove", - "UPLOAD-FILE": "Uvezite datoteku" + "UPLOAD-FILE": "Uvezite datoteku", + "REPLACE-FILE": "Replace File" }, "INVITATION-DIALOG": { "HINT": "Za razdvajanje autora koristite tastere zapeta \",\" ili \"Enter\"", @@ -277,7 +279,34 @@ "DATASET-DESCRIPTION": "Opis", "ROLES": "Uloge" }, - "STEPS": { + "STEPS": + {"GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Opis stranice", "PAGE-PREFIX": "Stranica", @@ -471,6 +500,7 @@ "START-NEW-VERSION": "Započnite novu verziju", "VIEW-VERSION": "Sve verzije Plana", "CLONE": "Napravite kopiju", + "COPY": "Copy", "DELETE": "Obrišite", "DEPOSIT": "Deponujte", "EXPORT": "Izvezite", @@ -657,7 +687,8 @@ "NEW": "Novi skup podataka", "CREATE-NEW": "Kreirajte novi skup podataka", "EXPORT": "Izvezite", - "INVITE-COLLABORATORS": "Pozovite saradnike" + "INVITE-COLLABORATORS": "Pozovite saradnike", + "INVITE-SHORT": "Invite" }, "STATES": { "EDITED": "Izmenjeno", @@ -990,7 +1021,8 @@ }, "USERS": { "LABEL": "Pretražite", - "ROLE": "Uloga" + "ROLE": "Uloga", + "SHOW": "Show" }, "SELECT": "Odaberite opciju", "LIKE": "Pretražite" @@ -999,7 +1031,8 @@ "TITLE": { "NEW": "Novi plan upravljanja podacima", "EDIT": "Uredite", - "INTRO": "Plan upravljanja podacima (eng. Data Management Plan, skraćeno DMP) 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 koji podržava otvorene i FAIR principe za upravljanje podacima." + "INTRO": "Plan upravljanja podacima (eng. Data Management Plan, skraćeno DMP) 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 koji podržava otvorene i FAIR principe za upravljanje podacima.", + "INTRO-TIP": "Tip: Add new datasets to describe different types of data or disciplinary data to avoid mixing information." }, "FIELDS": { "NAME": "Naziv skupa podataka", @@ -1032,6 +1065,7 @@ "EXTERNAL-LINK": "Dodajte spoljni URL link" }, "HINT": { + "DESCRIPTION": "Briefly describe the context and purpose of the Dataset", "TITLE": "Kratko uputstvo o", "TITLE-REST": "radi se o njegovoj nameni i ciljevima." }, @@ -1069,7 +1103,12 @@ "LABEL": "Oznaka", "ROLES": "Uloge", "NAME": "Ime", - "PERMISSIONS": "Dozvole" + "PERMISSIONS": "Dozvole", + "EXPORT": "Export users" + }, + "ACTIONS": { + "EDIT": "Edit", + "SAVE": "Save" } }, "TYPES": { @@ -1140,7 +1179,8 @@ "RESEARCHERS": "Istraživači", "ORGANIZATIONS": "Institucije", "DATASET-IDENTIFIER": "Identifikatori skupa podataka", - "CURRENCY": "Valuta" + "CURRENCY": "Valuta", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Lista reči", @@ -1156,7 +1196,10 @@ "DMPS": "Planovi upravljanja podacima", "DATASETS": "Skupovi podataka", "EXTERNAL-SOURCE-HINT": "Lista vrednosti obezbeđenih od spoljnih izvora" - }, + }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Kreirano", "LABEL": "Oznaka", @@ -1277,7 +1320,8 @@ "GUIDE": { "TITLE": "Korisničko uputstvo", "TITLE-DASHED": "-Korisničko uputstvo-", - "CLOSE": "Zatvorite" + "CLOSE": "Zatvorite", + "SAVE": "Save" }, "PRIVACY-POLICY": { "TITLE": "-Politika privatnosti-", @@ -1348,6 +1392,14 @@ "ADD-DATASET-DESCRIPTION": "Dodajte skup podataka", "ADD-DATASET": "Dodajte skup podataka", "ADD-DMP-DESCRIPTION": "Dodajte opis Plana" + }, + "TOUR-GUIDE": { + "DMP": "This is your dashboard. You can view and edit all DMPs that you have either contributed to or created yourself.", + "START-NEW": "Create your DMP with Start new DMP.", + "IMPORT-DMP": "You can import a DMP", + "START-WIZARD": "or create new in Argos.", + "DATASET": "This is your dashboard. You can view and edit all Datasets that you have either contributed to or created yourself.", + "NEW-DATASET": "With Add Dataset you can describe new datasets anytime in the research process." } }, "USER-DIALOG": { @@ -1361,7 +1413,15 @@ "TITLE": "Podešavanja", "TIMEZONE": "Vremenska zona", "CULTURE": "Kultura", - "LANGUAGE": "Jezik" + "LANGUAGE": "Jezik", + "CONNECTED-WITH": "Connected with", + "NAME": "Name", + "ORGANIZATION": "Organization", + "ROLE": "Role", + "SELECT-ROLE": "Select Role", + "ACCOUNTS": "Accounts", + "EMAILS": "Emails", + "YOUR-EMAIL": "Your Email" }, "ASSOCIATED-DMPS": "Povezani Planovi", "DMPS": { @@ -1372,8 +1432,32 @@ "ZENODO": { "LOGIN": "Prijavite se na Zenodo", "LOGOUT": "Uklonite Zenodo", + "AUTHORIZE": "Authorize Zenodo", "TITLE": "Zenodo nalog", "DESCRIPTION": "Povezani Zenodo nalog:" + }, + "ROLE-ORGANIZATION": { + "FACULTY": "Faculty", + "LIBRARIAN": "Librarian", + "RESEARCHER": "Researcher", + "STUDENT": "Student (BA/BSc, MSc)", + "EARLY-CAREER-RESEARCHER": "Early Career Researcher (PhD candidate, post-graduate)", + "RESEARCH-ADMINISTRATOR": "Research Administrator", + "REPOSITORY-MANAGER": "Repository Manager", + "RESEARCH-INFRASTRUCTURE": "Research Infrastructure", + "SERVICE-PROVIDER": "Service Provider", + "PUBLISHER": "Publisher", + "RESEARCH-FUNDER": "Research Funder", + "POLICY-MAKER": "Policymaker", + "SME-INDUSTRY": "SME/ Industry", + "OTHER": "Other" + }, + "ACTIONS": { + "SAVE": "Save", + "LINK-NEW": "Link new", + "LINK-NEW-ACCOUNT": "Link new account", + "ADD": "Add", + "CANCEL": "Cancel" } }, "DATASET-REFERENCED-MODELS": { diff --git a/dmp-frontend/src/assets/i18n/tr.json b/dmp-frontend/src/assets/i18n/tr.json index 6f6303d11..4a109178e 100644 --- a/dmp-frontend/src/assets/i18n/tr.json +++ b/dmp-frontend/src/assets/i18n/tr.json @@ -280,6 +280,33 @@ "ROLES": "Görev" }, "STEPS": { + "GENERAL-INFO":{ + "TITLE": "General Info", + "DATASET-TEMPLATE-NAME": "Dataset template name", + "DATASET-TEMPLATE-NAME-HINT": "A title that determines the Dataset template.", + "DATASET-TEMPLATE-DESCRIPTION": "Description", + "DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.", + "DATASET-TEMPLATE-LANGUAGE": "Dataset template language", + "UNTITLED": "Untitled" + }, + "PAGE-INFO":{ + "PAGE-NAME": "Page Name", + "PAGE-NAME-HINT": "Set a name for the dataset page.", + "PAGE-DESCRIPTION": "Description", + "PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the page is about.", + "ACTIONS":{ + "CREATE-FIRST-PAGE": "Create the first page", + "NOTHING-HERE-HINT": "Nothing here yet.", + "START-CREATING-PAGE-START": "Start by ", + "START-CREATING-PAGE-END": "creating the first page." + } + }, + "SECTION-INFO":{ + "SECTION-NAME": "Section Name", + "SECTION-NAME-HINT": "Set a name for the section.", + "SECTION-DESCRIPTION": "Description", + "SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about." + }, "PAGES": { "TITLE": "Sayfa Tanımı", "PAGE-PREFIX": "Sayfa", @@ -1152,7 +1179,8 @@ "RESEARCHERS": "Araştırmacılar", "ORGANIZATIONS": "Kurumlar", "DATASET-IDENTIFIER": "Veri Seti Tanımlayıcısı", - "CURRENCY": "Değer" + "CURRENCY": "Değer", + "VALIDATION": "Validator" }, "DATASET-PROFILE-COMBO-BOX-TYPE": { "WORD-LIST": "Kelime Listesi", @@ -1169,6 +1197,9 @@ "DATASETS": "Veri Seti Tanımları", "EXTERNAL-SOURCE-HINT": "Dış kaynak(lar) tarafından sağlanan değerlerin listesi" }, + "DATASET-PROFILE-VALIDATOR": { + "ACTION": "Validate" + }, "RECENT-ACTIVITY-ORDER": { "CREATED": "Oluşturulmuş", "LABEL": "Etiket", @@ -1590,4 +1621,4 @@ "FINALIZED": "Tamamlandı", "DELETED": "Deleted" } -} +} \ No newline at end of file From 7445ec504280d78b6f579483e9a6b0acfc664556 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Fri, 12 Feb 2021 16:27:35 +0200 Subject: [PATCH 07/53] Dataset profile editor. Dynamic progress bar and confirmation before delete --- ...rofile-editor-composite-field.component.ts | 28 ++++++++++- .../dataset-profile-editor-field.component.ts | 3 +- .../dataset-profile-editor.component.html | 40 +++++++-------- .../dataset-profile-editor.component.ts | 49 +++++++++++-------- 4 files changed, 75 insertions(+), 45 deletions(-) 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 70c9fe6b9..6d7ed3ce9 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 @@ -7,6 +7,9 @@ import { ValidationType } from '@app/core/common/enum/validation-type'; import { MatCheckboxChange } from '@angular/material/checkbox'; import { DatasetDescriptionCompositeFieldEditorModel, DatasetDescriptionFieldEditorModel } 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'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-dataset-profile-editor-composite-field-component', @@ -27,7 +30,10 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh isMultiplicityEnabled = false; viewStyleEnum = DatasetProfileFieldViewStyle; - constructor() { } + constructor( + private dialog: MatDialog, + private language: TranslateService, + ) { } ngOnChanges(){ this.setTargetField(null); @@ -170,6 +176,26 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh deleteTargetField(){ + + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().subscribe(result => { + if (result) { + this._deleteTargetField(); + } + }); + + } + + + private _deleteTargetField(){ if(!this.targetField) return; let index = -1; 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 53031ca86..8be447be9 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 @@ -224,7 +224,8 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements cssClass: null }; - fieldEditorModel.data = this.form.get('data').value; + + fieldEditorModel.data = (this.form.get('data') as FormGroup).getRawValue(); fieldEditorModel.value = this.form.get('defaultValue').get('value').value; fieldEditorModel.validationRequired = (this.form.get('validations').value as Array).includes(ValidationType.Required); 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 5ea009c1b..9dedb01f7 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 @@ -25,21 +25,11 @@
-
+
-
- - {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TITLE' | translate}} - -
-
- - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}} - -
-
- - Preview and Finalize +
+ + {{step.label}}
@@ -56,10 +46,11 @@
- - - {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.TITLE' | translate}} - + + + +
1.1 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-NAME'| translate}} *
@@ -119,8 +110,8 @@
--> - - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.TITLE' | translate}} + +
@@ -251,12 +242,15 @@
-->
+ + Preview and finalize + - +
@@ -296,10 +290,10 @@ - +
\ No newline at end of file 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 4e3f295a8..606f45bd4 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,7 +44,7 @@ const skipDisable: any[] = require('../../../../../assets/resources/skipDisable. templateUrl: './dataset-profile-editor.component.html', styleUrls: ['./dataset-profile-editor.component.scss'] }) -export class DatasetProfileEditorComponent extends BaseComponent implements OnInit, AfterViewInit { +export class DatasetProfileEditorComponent extends BaseComponent implements OnInit { isNew = true; isNewVersion = false; @@ -88,12 +88,6 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn // this.profileID = route.snapshot.params['id']; // this.cloneId = route.snapshot.params['cloneid']; } - ngAfterViewInit(): void { - // setTimeout(() => { - // this.barPercentage = (1 / (this.stepper.steps.length+1)) * 110 - 110; - // }, 0); - } - ngOnInit() { this.matomoService.trackPageView('Admin: Dataset Profile Edit'); @@ -732,9 +726,27 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn + onRemoveEntry(tce: ToCEntry){ + + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this._deleteEntry(tce); + } + }); + + } - onRemoveEntry(tce: ToCEntry) { + private _deleteEntry(tce: ToCEntry) { //define entry type switch (tce.type) { case ToCEntryType.Page: @@ -949,22 +961,19 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn console.log(this.form.value); } - - - barPercentage = -100; - onStepperSelectionChange(selectionChange: StepperSelectionEvent){ - - this.barPercentage = ((selectionChange.selectedIndex+1) / (this.stepper.steps.length+1)) * 110- 110; - } - - get barPercentageA(){ + get barPercentage(){ if(!this.stepper){ return -110; } - const selectedIndex = this.stepper.selectedIndex + 1; - return (selectedIndex / (this.stepper.steps.length+1)) * 110- 110; + return (selectedIndex / this.stepper.steps.length) * 110- 110; } - + get steps(){ + if(!this.stepper){ + return []; + } + + return this.stepper.steps; + } } \ No newline at end of file From 8579071cf75c4dd4a47c5ba51f5b34b5467b5e47 Mon Sep 17 00:00:00 2001 From: Kristan Ntavidi Date: Mon, 15 Feb 2021 19:16:48 +0200 Subject: [PATCH 08/53] Dataset profile editor. Preview step basic implementation. --- ...file-editor-composite-field.component.html | 61 +++--- ...rofile-editor-composite-field.component.ts | 47 ++++- .../dataset-profile-editor-field.component.ts | 20 +- .../dataset-profile-editor.component.html | 22 +- .../dataset-profile-editor.component.ts | 193 +++++++++++++++--- .../table-of-contents-internal-section.html | 20 +- .../table-of-contents-internal-section.scss | 13 ++ .../table-of-contents-internal-section.ts | 2 + .../table-of-contents/table-of-contents.html | 3 +- .../table-of-contents/table-of-contents.ts | 1 + 10 files changed, 298 insertions(+), 84 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 0f46f7d20..e6f85ede5 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 @@ -171,21 +171,23 @@
-

Input tools

- - - folder - Add Input - - - - visibility_off - - - + +

Input tools

+ + + folder + Add Input + + + + visibility_off + + + +

Input settings

@@ -193,7 +195,7 @@ - + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.MULTIPLICITY-CHECKBOX' | translate}} @@ -213,15 +215,17 @@ -

Other actions

- - - - - delete - Delete - + +

Other actions

+ + + + + delete + Delete + +
@@ -235,9 +239,12 @@ --> -Current FORM: {{this.form.value |json}} + + + + + +

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

@@ -22,10 +24,10 @@ -
+
-
+
@@ -46,7 +48,7 @@
- + + + + - +
@@ -295,5 +302,8 @@ console form
+
\ No newline at end of file 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 606f45bd4..6d0b67543 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 @@ -36,6 +36,7 @@ import { Guid } from '@common/types/guid'; import { FieldEditorModel } from '../admin/field-editor-model'; import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; +import { DatasetDescriptionCompositeFieldEditorModel, DatasetDescriptionFieldEditorModel, DatasetDescriptionFormEditorModel, DatasetDescriptionPageEditorModel, DatasetDescriptionSectionEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -612,6 +613,31 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn return result; } + + + private _findTocEntryById(id: string, tocentries: ToCEntry[]): ToCEntry{ + if(!tocentries){ + return null; + } + + let tocEntryFound = tocentries.find(entry=>entry.id === id); + + if(tocEntryFound){ + return tocEntryFound; + } + + for(let entry of tocentries){ + const result = this._findTocEntryById(id, entry.subEntries); + if(result){ + tocEntryFound = result; + break; + } + } + + if(tocEntryFound) return tocEntryFound; + + return null; + } addNewEntry(tce: Foo) { const parent = tce.parent; @@ -633,15 +659,8 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn //make new entry selected const pagesArray = (this.form.get('pages') as FormArray); const addedEntry = pagesArray.at(pagesArray.length-1) as FormGroup; - this.selectedTocEntry = { - form: addedEntry, - label: addedEntry.get('title').value, - type: ToCEntryType.Page, - id: addedEntry.get('id').value, - numbering:pagesArray.value.length, - subEntries:null, - subEntriesType: ToCEntryType.Section - } + + this.selectedTocEntry = this._findTocEntryById(addedEntry.get('id').value, this.getTocEntries()); break; case ToCEntryType.Section: //adding a section @@ -676,15 +695,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn const sectionAdded = sectionsArray.at(sectionsArray.length -1) as FormGroup; - this.selectedTocEntry = { - id: sectionAdded.get('id').value, - label: sectionAdded.get('title').value, - form: sectionAdded, - numbering:'', - subEntries: null, - subEntriesType: undefined, //ADDNEW VALUE TO TOCENTRY TYPE FOR UNDFINED - type: ToCEntryType.Section - } + this.selectedTocEntry = this._findTocEntryById(sectionAdded.get('id').value, this.getTocEntries()); break; case ToCEntryType.FieldSet: @@ -705,16 +716,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn const parentArray = parent.form.get('fieldSets') as FormArray; const addedFieldSet = parentArray.at(parentArray.length - 1); - this.selectedTocEntry = { - id: addedFieldSet.get('id').value, - label: addedFieldSet.get('title').value, - form: addedFieldSet, - numbering: '', - subEntries: null, //TODO IT SHOULD HAVE CHILDS - subEntriesType: ToCEntryType.Field, - type: ToCEntryType.FieldSet - } - + this.selectedTocEntry = this._findTocEntryById(addedFieldSet.get('id').value, this.getTocEntries()); break; @@ -722,6 +724,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn break; } + } @@ -969,6 +972,11 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn return (selectedIndex / this.stepper.steps.length) * 110- 110; } + + get progressStyle(){ + return {'transform': 'translateX('+this.barPercentage+'%) skewX(-25deg)'} + } + get steps(){ if(!this.stepper){ return []; @@ -976,4 +984,133 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn return this.stepper.steps; } + + + generatePreviewForm(){ + + + const model = new DatasetDescriptionFormEditorModel(); + + const toCentries = this.getTocEntries(); + + + //first level is always pages + model.pages = toCentries.map(entry=>{ + if( !(entry.type == ToCEntryType.Page)){ + return null; + } + const pageModel = new DatasetDescriptionPageEditorModel(); + + pageModel.ordinal = entry.form.get('ordinal').value; + pageModel.title = entry.label; + + if(entry.subEntries){ + pageModel.sections = entry.subEntries.map(section=>{ + const sectionModel = new DatasetDescriptionSectionEditorModel(); + + sectionModel.id = section.id; + sectionModel.ordinal = section.form.get('ordinal').value; + sectionModel.description = section.form.get('description').value; + sectionModel.page = entry.form.get('ordinal').value; + sectionModel.title = section.label; + sectionModel.numbering = section.numbering; + + + if(section.subEntriesType == ToCEntryType.Section){ + sectionModel.sections = this._buildSectionsRecursively(section.subEntries); + }else{ + sectionModel.compositeFields = this._buildFormFields(section.subEntries) + } + + return sectionModel; + }) + }; + return pageModel; + + }); + + + this.previewForm = model.buildForm(); + } + + private _buildSectionsRecursively( tocentries: ToCEntry[]): DatasetDescriptionSectionEditorModel[]{ + + + if(!tocentries) return null; + + + const result: Array = []; + + tocentries.forEach(tocentry=>{ + + const sectionModel = new DatasetDescriptionSectionEditorModel(); + sectionModel.id = tocentry.id; + sectionModel.ordinal = tocentry.form.get('ordinal').value; + sectionModel.description = tocentry.form.get('description').value; + // sectionModel.page = entry.form.get('ordinal').value; + sectionModel.title = tocentry.label; + sectionModel.numbering = tocentry.numbering; + + if(tocentry.subEntriesType == ToCEntryType.Section){ + sectionModel.sections = this._buildSectionsRecursively(tocentry.subEntries); + + }else{ + sectionModel.compositeFields = this._buildFormFields(tocentry.subEntries); + } + + result.push(sectionModel); + }) + + return result; + } + + private _buildFormFields(tocentries: ToCEntry[]):DatasetDescriptionCompositeFieldEditorModel[]{ + if(!tocentries) return null; + + const fieldsets:DatasetDescriptionCompositeFieldEditorModel[] = []; + + tocentries.forEach(fs=>{ + + const fieldset = new DatasetDescriptionCompositeFieldEditorModel(); + + fieldset.description = fs.form.get('description').value; + fieldset.extendedDescription = fs.form.get('extendedDescription').value; + fieldset.id = fs.form.get('id').value; + fieldset.multiplicity = fs.form.get('multiplicity').value; + fieldset.additionalInformation = fs.form.get('additionalInformation').value; + fieldset.ordinal = fs.form.get('ordinal').value; + fieldset.hasCommentField = fs.form.get('hasCommentField').value; + fieldset.title = fs.label; + // fieldset.fields = (fs.form.get('fields') as FormArray).getRawValue(); + fieldset.fields = (fs.form.get('fields') as FormArray).controls.map(field=>{ + + const fieldModel = new DatasetDescriptionFieldEditorModel(); + + fieldModel.data = (field.get('data') as FormGroup).getRawValue(); + fieldModel.id = field.get('id').value; + fieldModel.viewStyle = (field.get('viewStyle') as FormGroup).getRawValue(); + fieldModel.defaultValue = field.get('defaultValue').value; + fieldModel.page = field.get('page').value; + fieldModel.validations = field.get('validations').value; + + return fieldModel; + }); + + + + fieldsets.push(fieldset); + }); + + return fieldsets; + } + + onMatStepperSelectionChange(event: StepperSelectionEvent){ + + if(event.selectedIndex === 2){//preview selected + this.generatePreviewForm();//TODO LAZY LOADING IN THE TEMPLATE + } + + } + + previewForm:FormGroup; } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html index 0ac817cd6..2cd2d637b 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html @@ -2,11 +2,14 @@ diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.html index 96016ab7c..3fdbc1221 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/external-datasets/dataset-profile-editor-external-datasets-field.component.html @@ -6,8 +6,8 @@ + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/free-text/dataset-profile-editor-free-text-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/free-text/dataset-profile-editor-free-text-field.component.html index 9509b5a57..cc1248c46 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/free-text/dataset-profile-editor-free-text-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/free-text/dataset-profile-editor-free-text-field.component.html @@ -4,8 +4,8 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-FREE-TEXT-TITLE' | translate}}

+ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-FREE-TEXT-PLACEHOLDER' | translate}}
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component.html index 96016ab7c..3fdbc1221 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component.html @@ -6,8 +6,8 @@ + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/radio-box/dataset-profile-editor-radio-box-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/radio-box/dataset-profile-editor-radio-box-field.component.html index 612a43bc4..3e8b7d00e 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/radio-box/dataset-profile-editor-radio-box-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/radio-box/dataset-profile-editor-radio-box-field.component.html @@ -3,22 +3,22 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RADIO-BOX-TITLE' | translate}}
- +
+ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RADIO-BOX-LABEL' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RADIO-BOX-VALUE' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html index 7de5c855f..94260ad5a 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html @@ -6,7 +6,8 @@ - {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RESEARCHERS-PLACEHOLDER' | translate}} +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html index 95cf28e76..b80906a68 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html @@ -5,8 +5,8 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/services/dataset-profile-editor-services-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/services/dataset-profile-editor-services-field.component.html index 95cf28e76..b80906a68 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/services/dataset-profile-editor-services-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/services/dataset-profile-editor-services-field.component.html @@ -5,8 +5,8 @@ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/tags/dataset-profile-editor-tags-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/tags/dataset-profile-editor-tags-field.component.html index aeb72f4ed..d889208a4 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/tags/dataset-profile-editor-tags-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/tags/dataset-profile-editor-tags-field.component.html @@ -2,8 +2,8 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-DATE-PICKER-TITLE' | translate}}
+ {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/textarea/dataset-profile-editor-text-area-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/textarea/dataset-profile-editor-text-area-field.component.html index bb2b107c7..f3fe6ee4a 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/textarea/dataset-profile-editor-text-area-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/textarea/dataset-profile-editor-text-area-field.component.html @@ -4,7 +4,10 @@ | translate}} - + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-TEXT-AREA-PLACEHOLDER' | translate}} + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/validator/dataset-profile-editor-validator-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/validator/dataset-profile-editor-validator-field.component.html index 78920fe77..64c1759ac 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/validator/dataset-profile-editor-validator-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/validator/dataset-profile-editor-validator-field.component.html @@ -2,8 +2,8 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-DATE-PICKER-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}} +
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/word-list/dataset-profile-editor-word-list-field.component.html b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/word-list/dataset-profile-editor-word-list-field.component.html index 493b890b6..049af17e1 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/word-list/dataset-profile-editor-word-list-field.component.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field-type/word-list/dataset-profile-editor-word-list-field.component.html @@ -7,22 +7,20 @@ + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-WORD-LIST-PLACEHOLDER' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-WORD-LIST-LABEL' | translate}} + - + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-WORD-LIST-VALUE' | translate}} +
@@ -123,12 +178,12 @@ No
--> -
+
-
+
Not initialized yet 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 d42702341..8ba5cd522 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 @@ -29,6 +29,10 @@ import { CurrencyDataEditorModel } from '../../../admin/field-data/currency-data import { ValidationDataEditorModel } from '../../../admin/field-data/validation-data-editor-models'; import { DatasetDescriptionFieldEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; import { Subscription } from 'rxjs'; +import { ViewStyleType } from './view-style-enum'; +import { AutoCompleteFieldDataEditorModel } from '../../../admin/field-data/auto-complete-field-data-editor-model'; +import { DatasetsAutoCompleteFieldDataEditorModel } from '../../../admin/field-data/datasets-autocomplete-field-data-editor-mode'; +import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profile-combo-box-type'; @Component({ selector: 'app-dataset-profile-editor-field-component', @@ -44,6 +48,10 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements viewStyleEnum = DatasetProfileFieldViewStyle; isFieldMultiplicityEnabled = false; + viewType: ViewStyleType; + viewTypeEnum = ViewStyleType; + + @Input() expandView: boolean = true; constructor( @@ -58,83 +66,155 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements this.isFieldMultiplicityEnabled = true; } } + + if(this.form.get('viewStyle').get('renderStyle').value){ + const type = this.form.get('viewStyle').get('renderStyle').value; + + switch(type){ + case DatasetProfileFieldViewStyle.BooleanDecision: + this.viewType = this.viewTypeEnum.BooleanDecision; + break; + case DatasetProfileFieldViewStyle.CheckBox: + this.viewType = this.viewTypeEnum.CheckBox; + break; + case DatasetProfileFieldViewStyle.ComboBox: + + const comboType = this.form.get('data').get('type').value; + if(comboType === DatasetProfileComboBoxType.Autocomplete){ + this.viewType = this.viewTypeEnum.Other; + }else if(comboType === DatasetProfileComboBoxType.WordList){ + this.viewType = this.viewTypeEnum.Select; + } + break; + case DatasetProfileFieldViewStyle.InternalDmpEntities: + this.viewType = this.viewTypeEnum.InternalDmpEntities; + break; + case DatasetProfileFieldViewStyle.FreeText: + this.viewType = this.viewTypeEnum.FreeText; + break; + case DatasetProfileFieldViewStyle.RadioBox: + this.viewType = this.viewTypeEnum.RadioBox; + break; + case DatasetProfileFieldViewStyle.TextArea: + this.viewType = this.viewTypeEnum.TextArea; + break; + case DatasetProfileFieldViewStyle.DatePicker: + this.viewType = this.viewTypeEnum.DatePicker; + break; + case DatasetProfileFieldViewStyle.ExternalDatasets: + this.viewType = this.viewTypeEnum.ExternalDatasets; + break; + case DatasetProfileFieldViewStyle.DataRepositories: + this.viewType = this.viewTypeEnum.DataRepositories; + break; + case DatasetProfileFieldViewStyle.Registries: + this.viewType = this.viewTypeEnum.Registries; + break; + case DatasetProfileFieldViewStyle.Services: + this.viewType = this.viewTypeEnum.Services; + break; + case DatasetProfileFieldViewStyle.Tags: + this.viewType = this.viewTypeEnum.Tags; + break; + case DatasetProfileFieldViewStyle.Researchers: + this.viewType = this.viewTypeEnum.Researchers; + break; + case DatasetProfileFieldViewStyle.Organizations: + this.viewType = this.viewTypeEnum.Organizations; + break; + case DatasetProfileFieldViewStyle.DatasetIdentifier: + this.viewType = this.viewTypeEnum.DatasetIdentifier; + break; + case DatasetProfileFieldViewStyle.Currency: + this.viewType = this.viewTypeEnum.Currency; + break; + case DatasetProfileFieldViewStyle.Validation: + this.viewType = this.viewTypeEnum.Validation; + break; + } + + } + + + + // this.addNewRule(); - this.form.get('viewStyle').get('renderStyle').valueChanges - .pipe(takeUntil(this._destroyed)) - .subscribe(x => { + // this.form.get('viewStyle').get('renderStyle').valueChanges + // .pipe(takeUntil(this._destroyed)) + // .subscribe(x => { - // const previewStatus = this.showPreview; - //!! Important to be before the if statement - this.showPreview = false; + // // const previewStatus = this.showPreview; + // //!! Important to be before the if statement + // this.showPreview = false; - if (this.form.get('data')) { - this.form.removeControl('data'); + // if (this.form.get('data')) { + // this.form.removeControl('data'); - switch (x) { - case DatasetProfileFieldViewStyle.BooleanDecision: - this.form.addControl('data', new BooleanDecisionFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.CheckBox: - this.form.addControl('data', new CheckBoxFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.ComboBox: - this.form.addControl('data', new WordListFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.InternalDmpEntities: - this.form.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.FreeText: - this.form.addControl('data', new FreeTextFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.RadioBox: - this.form.addControl('data', new RadioBoxFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.TextArea: - this.form.addControl('data', new TextAreaFieldDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.DatePicker: - this.form.addControl('data', new DatePickerDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.ExternalDatasets: - this.form.addControl('data', new ExternalDatasetsDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.DataRepositories: - this.form.addControl('data', new DataRepositoriesDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Registries: - this.form.addControl('data', new RegistriesDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Services: - this.form.addControl('data', new ServicesDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Tags: - this.form.addControl('data', new TagsDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Researchers: - this.form.addControl('data', new ResearchersDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Organizations: - this.form.addControl('data', new OrganizationsDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.DatasetIdentifier: - this.form.addControl('data', new DatasetIdentifierDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Currency: - this.form.addControl('data', new CurrencyDataEditorModel().buildForm()); - break; - case DatasetProfileFieldViewStyle.Validation: - this.form.addControl('data', new ValidationDataEditorModel().buildForm()); - break; - } - } + // switch (x) { + // case DatasetProfileFieldViewStyle.BooleanDecision: + // this.form.addControl('data', new BooleanDecisionFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.CheckBox: + // this.form.addControl('data', new CheckBoxFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.ComboBox: + // this.form.addControl('data', new WordListFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.InternalDmpEntities: + // this.form.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.FreeText: + // this.form.addControl('data', new FreeTextFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.RadioBox: + // this.form.addControl('data', new RadioBoxFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.TextArea: + // this.form.addControl('data', new TextAreaFieldDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.DatePicker: + // this.form.addControl('data', new DatePickerDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.ExternalDatasets: + // this.form.addControl('data', new ExternalDatasetsDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.DataRepositories: + // this.form.addControl('data', new DataRepositoriesDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Registries: + // this.form.addControl('data', new RegistriesDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Services: + // this.form.addControl('data', new ServicesDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Tags: + // this.form.addControl('data', new TagsDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Researchers: + // this.form.addControl('data', new ResearchersDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Organizations: + // this.form.addControl('data', new OrganizationsDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.DatasetIdentifier: + // this.form.addControl('data', new DatasetIdentifierDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Currency: + // this.form.addControl('data', new CurrencyDataEditorModel().buildForm()); + // break; + // case DatasetProfileFieldViewStyle.Validation: + // this.form.addControl('data', new ValidationDataEditorModel().buildForm()); + // break; + // } + // } - //reset the preview status - // this.showPreview = previewStatus; - this.showPreview = true; - }); + // //reset the preview status + // // this.showPreview = previewStatus; + // this.showPreview = true; + // }); } defaulValueRequired(viewStile: DatasetProfileFieldViewStyle): boolean { @@ -205,30 +285,26 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements } } - this._formChangesSubscription = this.form.valueChanges.subscribe(()=>{ - this.generatePreviewForm(); - }); //initialize if(this.form.get('viewStyle').get('renderStyle').value){ - this.generatePreviewForm(); + this._generatePreviewForm(); } + this._formChangesSubscription = this.form.valueChanges.subscribe(()=>{ + this._generatePreviewForm(); + }); } - this._showPreview = value; + } previewForm: FormGroup; - generatePreviewForm(){ - + private _generatePreviewForm(){ if(!this.form.get('data')){ return; } - - this.previewForm = null; - // this._showPreview = false; const fieldEditorModel = new DatasetDescriptionFieldEditorModel(); fieldEditorModel.viewStyle= { @@ -244,10 +320,13 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements if(this.form.get('viewStyle').get('renderStyle').value == DatasetProfileFieldViewStyle.CheckBox){ fieldEditorModel.value = this.form.get('defaultValue').get('value').value === 'true'; } + // if(this.form.get('viewStyle').get('renderStyle').value == DatasetProfileFieldViewStyle.Researchers){ + // fieldEditorModel.data = new ResearchersAutoCompleteFieldDataEditorModel().buildForm().getRawValue(); + // } - this.previewForm = fieldEditorModel.buildForm(); - - // this._showPreview = true; + setTimeout(() => { + this.previewForm = fieldEditorModel.buildForm(); + }); }; // generatePreview(){ @@ -273,4 +352,99 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements // } + onInputTypeChange(){ + + + const x = this.viewType; + + this.showPreview = false; + + if (this.form.get('data')) { + this.form.removeControl('data'); + } + + switch (x) { + case this.viewTypeEnum.BooleanDecision: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.BooleanDecision) + this.form.addControl('data', new BooleanDecisionFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.CheckBox: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.CheckBox) + this.form.addControl('data', new CheckBoxFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Select: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ComboBox) + this.form.addControl('data', new WordListFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Other: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ComboBox) + this.form.addControl('data', new AutoCompleteFieldDataEditorModel().buildForm()); //TODO SEE + break; + case this.viewTypeEnum.InternalDmpEntities: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.InternalDmpEntities) + this.form.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm());//TODO TO SEE + break; + case this.viewTypeEnum.FreeText: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.FreeText) + this.form.addControl('data', new FreeTextFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.RadioBox: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.RadioBox) + this.form.addControl('data', new RadioBoxFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.TextArea: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.TextArea) + this.form.addControl('data', new TextAreaFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.DatePicker: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DatePicker) + this.form.addControl('data', new DatePickerDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.ExternalDatasets: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.ExternalDatasets) + this.form.addControl('data', new ExternalDatasetsDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.DataRepositories: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DataRepositories) + this.form.addControl('data', new DataRepositoriesDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Registries: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Registries) + this.form.addControl('data', new RegistriesDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Services: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Services) + this.form.addControl('data', new ServicesDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Tags: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Tags) + this.form.addControl('data', new TagsDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Researchers: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Researchers) + // this.form.addControl('data', new ResearchersDataEditorModel().buildForm()); //TODO TO ASK + this.form.addControl('data', new ResearchersAutoCompleteFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Organizations: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Organizations) + // this.form.addControl('data', new OrganizationsDataEditorModel().buildForm()); + this.form.addControl('data', new DatasetsAutoCompleteFieldDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.DatasetIdentifier: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.DatasetIdentifier) + this.form.addControl('data', new DatasetIdentifierDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Currency: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Currency) + this.form.addControl('data', new CurrencyDataEditorModel().buildForm()); + break; + case this.viewTypeEnum.Validation: + this.form.get('viewStyle').get('renderStyle').setValue(DatasetProfileFieldViewStyle.Validation) + this.form.addControl('data', new ValidationDataEditorModel().buildForm()); + break; + } + setTimeout(() => { //TODO + this.showPreview = true; + }); + } } diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/view-style-enum.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/view-style-enum.ts new file mode 100644 index 000000000..f1da6d5cd --- /dev/null +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/field/view-style-enum.ts @@ -0,0 +1,21 @@ +export enum ViewStyleType{ + TextArea = "textarea", + BooleanDecision = "booleanDecision", + CheckBox = "checkBox", + FreeText = "freetext", + RadioBox = "radiobox", + DatePicker = "datePicker", + InternalDmpEntities = "internalDmpEntities", + ExternalDatasets = "externalDatasets", + DataRepositories = "dataRepositories", + Registries = "registries", + Services = "services", + Tags = "tags", + Researchers = "researchers", + Organizations = "organizations", + DatasetIdentifier = "datasetIdentifier", + Currency = "currency", + Validation = 'validation', + Select ="selection", + Other ="other" +} \ No newline at end of file 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 b18ee3cbc..cd0b3f5ef 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 @@ -57,8 +57,13 @@
-
--> + --> + + +
+
+
diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts index 95071fd16..4e4bc873d 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section/dataset-profile-editor-section.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { FormArray, FormGroup } from '@angular/forms'; import { FieldEditorModel } from '@app/ui/admin/dataset-profile/admin/field-editor-model'; import { FieldSetEditorModel } from '@app/ui/admin/dataset-profile/admin/field-set-editor-model'; @@ -18,6 +18,7 @@ export class DatasetProfileEditorSectionComponent extends BaseComponent implemen //@Input() dataModel: SectionEditorModel; @Input() indexPath: string; @Input() viewOnly: boolean; + @Output() fieldsetAdded = new EventEmitter(); //returns the id of the fieldset added constructor() { super(); } @@ -38,7 +39,15 @@ export class DatasetProfileEditorSectionComponent extends BaseComponent implemen fieldSet.id = Guid.create().toString(); //this.dataModel.fieldSets.push(fieldSet); //} - (this.form.get('fieldSets')).push(fieldSet.buildForm()); + const fieldsetsArray = this.form.get('fieldSets') as FormArray; + fieldsetsArray.push(fieldSet.buildForm()); + + const fieldSetForm = fieldsetsArray.at(fieldsetsArray.length-1); + //emit id inserted + if(fieldSetForm){ + const id: string = fieldSetForm.get('id').value; + this.fieldsetAdded.emit(id); + } } addSectioninSection() { 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 217a169f9..ee14ab7d8 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 @@ -172,7 +172,7 @@ + (fieldsetAdded)="displayItem(_findTocEntryById($event, getTocEntries()))"> @@ -248,7 +248,7 @@ Preview and finalize - + 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 6d0b67543..f2182082d 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 @@ -37,6 +37,7 @@ import { FieldEditorModel } from '../admin/field-editor-model'; import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; import { StepperSelectionEvent } from '@angular/cdk/stepper'; import { DatasetDescriptionCompositeFieldEditorModel, DatasetDescriptionFieldEditorModel, DatasetDescriptionFormEditorModel, DatasetDescriptionPageEditorModel, DatasetDescriptionSectionEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; +import { Rule } from '@app/core/model/dataset-profile-definition/rule'; const skipDisable: any[] = require('../../../../../assets/resources/skipDisable.json'); @@ -884,9 +885,24 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn //in case selectedtocentrhy is child of the removed element if(this.selectedTocEntry ){ - // if(this.tocEntryIsChildOf(this.selectedTocEntry,tce)){ - this.selectedTocEntry = null; + if(this.selectedTocEntry.type == ToCEntryType.Page){ + this.selectedTocEntry = null; + }else{ + const parentId = tce.form.parent.parent.get('id').value; + if(parentId){ + const tocentries = this.getTocEntries(); + const parent = this._findTocEntryById(parentId, tocentries); + + if(parent){ + this.selectedTocEntry = parent; + }else{ + this.selectedTocEntry = null; + } + }else{ + this.selectedTocEntry = null; + } + } } } @@ -1029,10 +1045,36 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn }); + + //populate rules + const rules:Rule[] =[]; + const fieldSets = this._getFieldSets(toCentries); + + fieldSets.forEach(fs=>{ + const fields = fs.form.get('fields') as FormArray; + if(fields){ + fields.controls.forEach(field=>{ + const rulesArray = field.get('visible').get('rules').value; + if(rulesArray){ + rulesArray.forEach(ruleElement => { + const rule: Rule = new Rule(); + rule.targetField = ruleElement.target; + rule.sourceField = field.get('id').value; + rule.requiredValue = ruleElement.value; + rules.push(rule); + }); + } + }); + } + }); + + model.rules = rules; + this.visibilityRules = rules; this.previewForm = model.buildForm(); } + visibilityRules:Rule[]; private _buildSectionsRecursively( tocentries: ToCEntry[]): DatasetDescriptionSectionEditorModel[]{ @@ -1079,6 +1121,7 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn fieldset.multiplicity = fs.form.get('multiplicity').value; fieldset.additionalInformation = fs.form.get('additionalInformation').value; fieldset.ordinal = fs.form.get('ordinal').value; + fieldset.numbering = fs.numbering; fieldset.hasCommentField = fs.form.get('hasCommentField').value; fieldset.title = fs.label; // fieldset.fields = (fs.form.get('fields') as FormArray).getRawValue(); @@ -1089,7 +1132,8 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn fieldModel.data = (field.get('data') as FormGroup).getRawValue(); fieldModel.id = field.get('id').value; fieldModel.viewStyle = (field.get('viewStyle') as FormGroup).getRawValue(); - fieldModel.defaultValue = field.get('defaultValue').value; + // fieldModel.defaultValue = (field.get('defaultValue') as FormGroup).getRawValue(); + fieldModel.value = (field.get('defaultValue') as FormGroup).get('value').value; fieldModel.page = field.get('page').value; fieldModel.validations = field.get('validations').value; @@ -1104,12 +1148,32 @@ export class DatasetProfileEditorComponent extends BaseComponent implements OnIn return fieldsets; } + private _getFieldSets(tocentries: ToCEntry[]):ToCEntry[]{ + + const fieldsets:ToCEntry[] = []; + + if(!tocentries) return fieldsets; + + tocentries.forEach(entry=>{ + if(entry.type == ToCEntryType.FieldSet){ + fieldsets.push(entry); + }else{ + fieldsets.push(...this._getFieldSets(entry.subEntries)); + } + }); + + return fieldsets; + } + onMatStepperSelectionChange(event: StepperSelectionEvent){ if(event.selectedIndex === 2){//preview selected this.generatePreviewForm();//TODO LAZY LOADING IN THE TEMPLATE + }else{ + this.previewForm = null; } + } previewForm:FormGroup; diff --git a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html index 2cd2d637b..debdc0551 100644 --- a/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html +++ b/dmp-frontend/src/app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section.html @@ -1,85 +1,108 @@ + -