From b66932b413d352f5c76b5e0d5d6218bad326c870 Mon Sep 17 00:00:00 2001 From: amentis Date: Tue, 19 Mar 2024 18:27:30 +0200 Subject: [PATCH] fix start new description dialog --- .../DmpDescriptionTemplateBuilder.java | 1 + .../query/DmpDescriptionTemplateQuery.java | 2 + .../app/ui/dashboard/dashboard.component.ts | 45 +++++++------ .../description-copy-dialog.component.html | 10 ++- .../description-copy-dialog.component.ts | 26 ++++--- .../listing/description-listing.component.ts | 45 +++++++------ .../listing/description-listing.module.ts | 2 + ...tart-new-description-dialog.component.html | 16 +++-- .../start-new-description-dialog.component.ts | 67 ++++++++++++++----- .../start-new-description-dialog.module.ts | 2 + .../dmp-editor.component.html | 16 ++--- .../dmp-editor.component.scss | 18 ++--- .../dmp-editor.component.ts | 30 +++++---- .../dmp-editor-blueprint/dmp-editor.model.ts | 4 +- dmp-frontend/src/assets/i18n/en.json | 13 +++- 15 files changed, 192 insertions(+), 105 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpDescriptionTemplateBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpDescriptionTemplateBuilder.java index 7bfcb82c9..f00afb7eb 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpDescriptionTemplateBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpDescriptionTemplateBuilder.java @@ -73,6 +73,7 @@ public class DmpDescriptionTemplateBuilder extends BaseBuilder { - // if (result) { - // if (result.startNewDmp) { - // this.openNewDmpDialog(); - // } else { - // this.router.navigate(['/plans', 'edit', result.formGroup.get('dmp').value.id]); - // } - // } - // }); + const formGroup = this.fb.group({ + dmpId: this.fb.control(null, Validators.required), + sectionId: this.fb.control(null, Validators.required), + }) + + const dialogRef = this.dialog.open(StartNewDescriptionDialogComponent, { + disableClose: false, + restoreFocus: false, + data: { + startNewDmp: false, + formGroup: formGroup + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + if (result.startNewDmp) { + this.openNewDmpDialog(); + } else { + this.router.navigate(['/descriptions', 'edit', result.formGroup.get('dmpId').value, result.formGroup.get('sectionId').value]); + } + } + }); } public dashboardTour: GuidedTour = { diff --git a/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.html b/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.html index 5107e3b7a..b1576211b 100644 --- a/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.html +++ b/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.html @@ -5,9 +5,17 @@
- + +
+ + {{'DESCRIPTION-COPY-DIALOG.DMP-SECTION' | translate}} + + {{section.label}} + + +
diff --git a/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.ts b/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.ts index f66faf66c..dccbdf344 100644 --- a/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.ts +++ b/dmp-frontend/src/app/ui/description/description-copy-dialog/description-copy-dialog.component.ts @@ -17,6 +17,7 @@ import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { nameof } from 'ts-simple-nameof'; import { FilterService } from '@common/modules/text-filter/filter-service'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; @Component({ selector: 'description-copy-dialog-component', @@ -26,10 +27,11 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms export class DescriptionCopyDialogComponent { dmpModel: Dmp; + sections: DmpBlueprintDefinitionSection[] = []; descriptionDescriptionTemplateLabel: String; dmpAutoCompleteConfiguration: SingleAutoCompleteConfiguration = { //TODO: add filter to only get DMPs that have connection with the same Description Template group. - initialItems: (data?: any) => this.dmpService.query(this.buildDmpLookup(null,null,null,null, this.dmpDescriptionTemplateLookup)).pipe(map(x => x.items)), - filterFn: (searchQuery: string, data?: any) => this.dmpService.query(this.buildDmpLookup(searchQuery, null, null, null, this.dmpDescriptionTemplateLookup)).pipe(map(x => x.items)), + initialItems: (data?: any) => this.dmpService.query(this.buildDmpLookup(null,null,null, this.dmpDescriptionTemplateLookup)).pipe(map(x => x.items)), + filterFn: (searchQuery: string, data?: any) => this.dmpService.query(this.buildDmpLookup(searchQuery, null, null, this.dmpDescriptionTemplateLookup)).pipe(map(x => x.items)), getSelectedItem: (selectedItem: any) => this.dmpService.query(this.buildDmpLookup(null, null, [selectedItem])).pipe(map(x => x.items[0])), displayFn: (item: Dmp) => item.label, titleFn: (item: Dmp) => item.label, @@ -41,19 +43,22 @@ export class DescriptionCopyDialogComponent { isActive: [IsActive.Active] } as DmpDescriptionTemplateLookup; - private buildDmpLookup(like?: string, excludedIds?: Guid[], ids?: Guid[], statuses?: DmpStatus[], dmpDescriptionTemplateSubQuery?: DmpDescriptionTemplateLookup): DmpLookup { + private buildDmpLookup(like?: string, excludedIds?: Guid[], ids?: Guid[], dmpDescriptionTemplateSubQuery?: DmpDescriptionTemplateLookup): DmpLookup { const lookup: DmpLookup = new DmpLookup(); lookup.page = { size: 100, offset: 0 }; if (excludedIds && excludedIds.length > 0) { lookup.excludedIds = excludedIds; } if (ids && ids.length > 0) { lookup.ids = ids; } lookup.isActive = [IsActive.Active]; - lookup.statuses = statuses; + lookup.statuses = [DmpStatus.Draft]; lookup.project = { fields: [ nameof(x => x.id), nameof(x => x.label), - [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.sectionId)].join('.'), - [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.descriptionTemplateGroupId)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.id)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.label)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.hasTemplates)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.descriptionTemplateGroupId)].join('.'), ] }; @@ -76,10 +81,11 @@ export class DescriptionCopyDialogComponent { } findSection(dmp: Dmp){ - if(dmp.dmpDescriptionTemplates.length == 1){ - this.data.formGroup.get('sectionId').setValue(dmp.dmpDescriptionTemplates[0].sectionId); - }else if(dmp.dmpDescriptionTemplates.length > 1){ - //TODO + this.sections = dmp.blueprint.definition.sections.filter(x => x.hasTemplates == true); + if(this.sections.length == 1){ + this.data.formGroup.get('sectionId').setValue(this.sections[0].id); + }else { + this.data.formGroup.get('sectionId').setValue(null); } return dmp.id diff --git a/dmp-frontend/src/app/ui/description/listing/description-listing.component.ts b/dmp-frontend/src/app/ui/description/listing/description-listing.component.ts index 059f33ca5..4b3abd396 100644 --- a/dmp-frontend/src/app/ui/description/listing/description-listing.component.ts +++ b/dmp-frontend/src/app/ui/description/listing/description-listing.component.ts @@ -1,7 +1,7 @@ import { HttpClient } from '@angular/common/http'; import { Component, OnInit, ViewChild } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; @@ -34,6 +34,7 @@ import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { debounceTime, takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; +import { StartNewDescriptionDialogComponent } from '../start-new-description-dialog/start-new-description-dialog.component'; @Component({ selector: 'app-description-listing-component', @@ -83,7 +84,8 @@ export class DescriptionListingComponent extends BaseComponent implements OnInit private authentication: AuthService, private guidedTourService: GuidedTourService, private httpClient: HttpClient, - private matomoService: MatomoService + private matomoService: MatomoService, + private fb: UntypedFormBuilder, ) { super(); } @@ -355,25 +357,28 @@ export class DescriptionListingComponent extends BaseComponent implements OnInit } addNewDescription() { - //TODO: Add new description dialog + const formGroup = this.fb.group({ + dmpId: this.fb.control(null, Validators.required), + sectionId: this.fb.control(null, Validators.required), + }) - // const dialogRef = this.dialog.open(StartNewDescriptionDialogComponent, { - // disableClose: false, - // restoreFocus: false, - // data: { - // startNewDmp: false, - // formGroup: new DescriptionWizardEditorModel().buildForm() - // } - // }); - // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { - // if (result) { - // if (result.startNewDmp) { - // this.openNewDmpDialog(); - // } else { - // this.router.navigate(['/plans', 'edit', result.formGroup.get('dmp').value.id]); - // } - // } - // }); + const dialogRef = this.dialog.open(StartNewDescriptionDialogComponent, { + disableClose: false, + restoreFocus: false, + data: { + startNewDmp: false, + formGroup: formGroup, + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + if (result.startNewDmp) { + this.openNewDmpDialog(); + } else { + this.router.navigate(['/descriptions', 'edit', result.formGroup.get('dmpId').value, result.formGroup.get('sectionId').value]); + } + } + }); } hasLikeCriteria(): boolean { diff --git a/dmp-frontend/src/app/ui/description/listing/description-listing.module.ts b/dmp-frontend/src/app/ui/description/listing/description-listing.module.ts index a86d9ff85..921643574 100644 --- a/dmp-frontend/src/app/ui/description/listing/description-listing.module.ts +++ b/dmp-frontend/src/app/ui/description/listing/description-listing.module.ts @@ -6,6 +6,7 @@ import { CommonFormsModule } from '@common/forms/common-forms.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; import { DescriptionListingRoutingModule } from './description-listing.routing'; import { DescriptionCopyDialogModule } from '../description-copy-dialog/description-copy-dialog.module'; +import { StartNewDescriptionDialogModule } from '../start-new-description-dialog/start-new-description-dialog.module'; @NgModule({ imports: [ @@ -13,6 +14,7 @@ import { DescriptionCopyDialogModule } from '../description-copy-dialog/descript CommonFormsModule, FormattingModule, DescriptionCopyDialogModule, + StartNewDescriptionDialogModule, DescriptionListingRoutingModule ], declarations: [ diff --git a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.html b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.html index 7cdd40f3b..3dbc5a008 100644 --- a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.html +++ b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.html @@ -6,7 +6,15 @@
- + + +
+
+ + {{'START-NEW-DESCRIPTION-DIALOG.DMP-SECTION' | translate}} + + {{section.label}} +
@@ -18,11 +26,11 @@
- +
- - + +
diff --git a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts index 5fe33618f..c96045d26 100644 --- a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts +++ b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts @@ -2,13 +2,19 @@ import { Component, Inject } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { IsActive } from '@app/core/common/enum/is-active.enum'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { Dmp } from '@app/core/model/dmp/dmp'; +import { DmpDescriptionTemplateLookup } from '@app/core/query/dmp-description-template.lookup'; +import { DmpLookup } from '@app/core/query/dmp.lookup'; import { DmpService } from '@app/core/services/dmp/dmp.service'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { BaseComponent } from '@common/base/base.component'; +import { FilterService } from '@common/modules/text-filter/filter-service'; +import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { nameof } from 'ts-simple-nameof'; @Component({ selector: 'app-start-new-description-dialog', @@ -19,21 +25,49 @@ export class StartNewDescriptionDialogComponent extends BaseComponent { public isDialog: boolean = false; public formGroup: UntypedFormGroup; + public sections: DmpBlueprintDefinitionSection[] = []; dmpAutoCompleteConfiguration: SingleAutoCompleteConfiguration = { - filterFn: this.searchDmp.bind(this), - initialItems: (extraData) => this.searchDmp(''), - displayFn: (item) => this.getDatasetDisplay(item), - titleFn: (item) => item['label'], - subtitleFn: (item) => { try { return this.language.instant('DATASET-WIZARD.FIRST-STEP.SUB-TITLE') + new Date(item['creationTime']).toISOString(); } catch { return '-'; } } + initialItems: (data?: any) => this.dmpService.query(this.buildAutocompleteLookup()).pipe(map(x => x.items)), + filterFn: (searchQuery: string, data?: any) => this.dmpService.query(this.buildAutocompleteLookup(searchQuery)).pipe(map(x => x.items)), + getSelectedItem: (selectedItem: any) => this.dmpService.query(this.buildAutocompleteLookup(null, null, [selectedItem])).pipe(map(x => x.items[0])), + displayFn: (item: Dmp) => item.label, + titleFn: (item: Dmp) => item.label, + valueAssign: (item: Dmp) => this.findSection(item), }; + private buildAutocompleteLookup(like?: string, excludedIds?: Guid[], ids?: Guid[], statuses?: DmpStatus[], dmpDescriptionTemplateSubQuery?: DmpDescriptionTemplateLookup): DmpLookup { + const lookup: DmpLookup = new DmpLookup(); + lookup.page = { size: 100, offset: 0 }; + if (excludedIds && excludedIds.length > 0) { lookup.excludedIds = excludedIds; } + if (ids && ids.length > 0) { lookup.ids = ids; } + lookup.isActive = [IsActive.Active]; + lookup.statuses = [DmpStatus.Draft]; + lookup.project = { + fields: [ + nameof(x => x.id), + nameof(x => x.label), + nameof(x => x.createdAt), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.id)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.label)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.hasTemplates)].join('.'), + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.descriptionTemplateGroupId)].join('.'), + ] + }; + if (dmpDescriptionTemplateSubQuery != null) lookup.dmpDescriptionTemplateSubQuery = dmpDescriptionTemplateSubQuery; + lookup.order = { items: [nameof(x => x.label)] }; + if (like) { lookup.like = this.filterService.transformLike(like); } + return lookup; + } + constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public dialog: MatDialog, private language: TranslateService, - private dmpService: DmpService + private dmpService: DmpService, + private filterService: FilterService, ) { super(); this.formGroup = data.formGroup; @@ -60,16 +94,15 @@ export class StartNewDescriptionDialogComponent extends BaseComponent { this.dialogRef.close(this.data); } - searchDmp(query: string): Observable { - // TODO refactor - // const fields: Array = new Array(); - // fields.push('-created'); - // const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); - // dmpDataTableRequest.criteria = new DmpCriteria(); - // dmpDataTableRequest.criteria.like = query; - // dmpDataTableRequest.criteria.status = DmpStatus.Draft; - // return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete").pipe(map(x => x.data)); - return null; + findSection(dmp: Dmp){ + this.sections = dmp.blueprint.definition.sections.filter(x => x.hasTemplates == true); + if(this.sections.length == 1){ + this.formGroup.get('sectionId').setValue(this.sections[0].id); + }else { + this.formGroup.get('sectionId').setValue(null); + } + + return dmp.id } getDatasetDisplay(item: any): string { diff --git a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.module.ts b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.module.ts index 2afb2699f..3a4be040c 100644 --- a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.module.ts +++ b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.module.ts @@ -3,12 +3,14 @@ import { FormattingModule } from '@app/core/formatting.module'; import { CommonFormsModule } from '@common/forms/common-forms.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; import { StartNewDescriptionDialogComponent } from './start-new-description-dialog.component'; +import { AutoCompleteModule } from '@app/library/auto-complete/auto-complete.module'; @NgModule({ imports: [ CommonUiModule, CommonFormsModule, FormattingModule, + AutoCompleteModule ], declarations: [ StartNewDescriptionDialogComponent, diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html index 918378dcd..993effdfe 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html @@ -22,7 +22,7 @@ {{'DMP-EDITOR.ACTIONS.SAVE' | translate}}
- + @@ -86,18 +86,18 @@
  • {{section.label}}
  • -
      -
    1. +
        +
      1. {{'DMP-EDITOR.DESCRIPTION' | translate}}: {{ description.label }}
        - close - check + close + check
      -
    -
    +
    {{'DMP-EDITOR.ACTIONS.NEXT-STEP' | translate}}
    chevron_right
    diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.scss b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.scss index 7d61731ea..1c7dc7cd4 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.scss +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.scss @@ -38,7 +38,7 @@ } } -.datasetsInSection { +.descriptionsInSection { counter-reset: item } @@ -116,7 +116,7 @@ opacity: 1; } -.stepper-list .active-dataset { +.stepper-list .active-description { color: #212121; font-weight: 700; opacity: 1; @@ -149,11 +149,11 @@ mat-icon.size-16 { margin-top: 0.4rem; } -.remove-dataset { +.remove-description { color: #f16868; } -.remove-dataset:hover { +.remove-description:hover { color: #f16868; } @@ -186,7 +186,7 @@ mat-icon.size-16 { cursor: pointer; } -.add-dataset-btn { +.add-description-btn { background: var(--secondary-color) 0% 0% no-repeat padding-box; box-shadow: 0px 3px 6px #1e202029; font-weight: 500; @@ -197,11 +197,11 @@ mat-icon.size-16 { font-size: 13.8px; } -.add-dataset-option { +.add-description-option { list-style-type: none; } -.add-dataset-action { +.add-description-action { display: flex; align-items: center; cursor: pointer; @@ -215,7 +215,7 @@ mat-icon.size-16 { cursor: pointer; } -.dataset-next { +.description-next { background: var(--secondary-color) 0% 0% no-repeat padding-box; color: #212121; box-shadow: 0px 3px 6px #1e202029; @@ -224,7 +224,7 @@ mat-icon.size-16 { } .previous-disabled, -.add-dataset-btn-disabled { +.add-description-btn-disabled { border: 1px solid #b5b5b5; color: #b5b5b5 !important; cursor: auto !important; diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts index dfc182d89..d2e27bb8a 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts @@ -205,7 +205,7 @@ export class DmpEditorComponent extends BaseEditor implemen prepareForm(data: Dmp) { try { this.editorModel = data ? new DmpEditorModel().fromModel(data) : new DmpEditorModel(); - if (data.descriptions) { + if (data && data.descriptions) { if (data.status == DmpStatus.Finalized) { data.descriptions = data.descriptions.filter(x => x.isActive === IsActive.Active && x.status === DescriptionStatus.Finalized); } else { @@ -217,19 +217,23 @@ export class DmpEditorComponent extends BaseEditor implemen this.selectedBlueprint = data?.blueprint; this.isDeleted = data ? data.isActive === IsActive.Inactive : false; - const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { - dmpId: data.id, - sectionIds: data?.blueprint?.definition?.sections?.map(x => x.id), - permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription] + if (data){ + const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { + dmpId: data.id, + sectionIds: data?.blueprint?.definition?.sections?.map(x => x.id), + permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription] + } + this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel) + .pipe(takeUntil(this._destroyed)).subscribe( + complete => { + this.permissionPerSection = complete, + this.buildForm(); + }, + error => this.onCallbackError(error) + ); + }else{ + this.buildForm(); } - this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel) - .pipe(takeUntil(this._destroyed)).subscribe( - complete => { - this.permissionPerSection = complete, - this.buildForm(); - }, - error => this.onCallbackError(error) - ); } catch (error) { this.logger.error('Could not parse Dmp item: ' + data + error); diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts index 355a682f1..ce0a0f1c5 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts @@ -123,9 +123,9 @@ export class DmpEditorModel extends BaseEditorModel implements DmpPersist { baseValidationArray.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'status')] }); baseValidationArray.push({ key: 'properties', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'properties')] }); baseValidationArray.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'description')] }); - baseValidationArray.push({ key: 'language', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'language')] }); + baseValidationArray.push({ key: 'language', validators: [BackendErrorValidator(this.validationErrorModel, 'language')] }); baseValidationArray.push({ key: 'blueprint', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'blueprint')] }); - baseValidationArray.push({ key: 'accessType', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'accessType')] }); + baseValidationArray.push({ key: 'accessType', validators: [BackendErrorValidator(this.validationErrorModel, 'accessType')] }); baseValidationArray.push({ key: 'descriptionTemplates', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'descriptionTemplates')] }); baseValidationArray.push({ key: 'users', validators: [BackendErrorValidator(this.validationErrorModel, `users`)] }); baseValidationArray.push({ key: 'hash', validators: [] }); diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 7c59ef515..422f06e87 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1127,7 +1127,8 @@ }, "DESCRIPTION-COPY-DIALOG": { "TITLE": "Copy Description to DMP", - "PLACEHOLDER": "Search DMP" + "SELECT-DMP": "Select DMP", + "DMP-SECTION": "Select Section" }, "PREFILL-DESCRIPTION-DIALOG": { "TITLE": "Initialize your Dataset", @@ -2776,7 +2777,7 @@ "LATEST-ACTIVITY": "Latest Activity", "DMP-ABOUT-BEG": "A DMP in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets, namely", "DMP-ABOUT-END": ", that highlight the steps followed and the means used across data management activities.", - "SELECT-DMP": "Select a DMP for your Dataset", + "SELECT-DMP": "Select a DMP for your Description", "ACTIONS": { "ADD-DESCRIPTION": "Add Description", "ADD-DMP-DESCRIPTION": "Add DMP Description" @@ -2941,6 +2942,14 @@ "CANCEL": "Cancel" } }, + "START-NEW-DESCRIPTION-DIALOG": { + "SELECT-DMP": "Select DMP", + "DMP-SECTION": "Select Section", + "ACTIONS": { + "NEXT": "Next", + "CANCEL": "Cancel" + } + }, "DRAFTS": { "FOR-DMP": "For DMP:", "FOR-GRANT": "For Grant:"