From a7c49ca4af2b56a759b81b7b75f87c4fa2095941 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 24 Apr 2024 11:35:23 +0300 Subject: [PATCH] canRemoveItem logic added to multiple auto complete and Teamplates control @ DmpEditor --- .../multiple-auto-complete.component.html | 4 +- .../multiple-auto-complete.component.ts | 13 +++-- .../dmp-editor.component.html | 3 +- .../dmp-editor.component.ts | 53 +++++++++---------- dmp-frontend/src/assets/i18n/en.json | 2 +- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html index da1db5be5..69e9fb675 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.html @@ -4,14 +4,14 @@
- + {{_displayFn(selectedItem)}} - diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts index d87dbc8d4..ee85651df 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts @@ -435,16 +435,16 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp } _canRemoveItem(item: any): boolean { - if(this.configuration.canRemoveItem != null) { - return this.configuration.canRemoveItem(item).canRemove; + if(item != null && this.configuration.canRemoveItem != null) { + return this.configuration.canRemoveItem(item)?.canRemove; } return true; } _canRemoveItemMessage(item: any): string { - if(this.configuration.canRemoveItem != null) { + if(item != null && this.configuration.canRemoveItem != null) { const canRemoveResuslt = this.configuration.canRemoveItem(item); - if (canRemoveResuslt.canRemove) return canRemoveResuslt.message; + if (!canRemoveResuslt?.canRemove) return canRemoveResuslt.message; } return null; } @@ -492,3 +492,8 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp } } + +export interface MultipleAutoCompleteCanRemoveItem { + canRemove: boolean; + message: string; +} 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 bfb3efd29..b0969e728 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 @@ -299,8 +299,7 @@
{{'DMP-EDITOR.FIELDS.DESCRIPTION-TEMPLATES' | translate}}
{{'DMP-EDITOR.FIELDS.DESCRIPTION-TEMPLATES-HINT' | translate}} - - + {{formGroup.get('descriptionTemplates').get(section.id).getError('backendError').message}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} 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 07290e5a4..4923564c5 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 @@ -1,7 +1,7 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { DatePipe } from '@angular/common'; -import { Component, EventEmitter, OnInit } from '@angular/core'; -import { FormArray, UntypedFormArray, UntypedFormGroup } from '@angular/forms'; +import { Component, OnInit } from '@angular/core'; +import { FormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { DescriptionStatus } from '@app/core/common/enum/description-status'; @@ -17,6 +17,7 @@ import { DmpUserType } from '@app/core/common/enum/dmp-user-type'; import { IsActive } from '@app/core/common/enum/is-active.enum'; import { LockTargetType } from '@app/core/common/enum/lock-target-type'; import { AppPermission } from '@app/core/common/enum/permission.enum'; +import { DescriptionTemplate } from '@app/core/model/description-template/description-template'; import { DescriptionSectionPermissionResolver } from '@app/core/model/description/description'; import { DmpBlueprint, DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { Dmp, DmpPersist } from '@app/core/model/dmp/dmp'; @@ -35,9 +36,10 @@ import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/serv import { UserService } from '@app/core/services/user/user.service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; +import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; +import { MultipleAutoCompleteCanRemoveItem } from '@app/library/auto-complete/multiple/multiple-auto-complete.component'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; -import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; -import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; +import { DescriptionTemplatePreviewDialogComponent } from '@app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component'; import { BaseEditor } from '@common/base/base-editor'; import { FormService } from '@common/forms/form-service'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; @@ -45,14 +47,10 @@ import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/ import { FilterService } from '@common/modules/text-filter/filter-service'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; -import { Observable, interval, of } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; import { DmpEditorModel, DmpFieldIndicator } from './dmp-editor.model'; import { DmpEditorResolver } from './dmp-editor.resolver'; import { DmpEditorService } from './dmp-editor.service'; -import { DescriptionTemplatePreviewDialogComponent } from '@app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component'; -import { DescriptionTemplate } from '@app/core/model/description-template/description-template'; -import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; @Component({ selector: 'app-dmp-editor', @@ -402,8 +400,8 @@ export class DmpEditorComponent extends BaseEditor implemen if (formControlBySection == null || this.formGroup == null) return false; for (let controlName of formControlBySection.fieldControlNames) { - if (this.isFormControlValid(controlName) === false ) { - return true; + if (this.isFormControlValid(controlName) === false) { + return true; } } @@ -413,7 +411,7 @@ export class DmpEditorComponent extends BaseEditor implemen isFormControlValid(controlName: string): boolean { if (!this.formGroup?.get(controlName)) return true; if (!this.formGroup.get(controlName).touched) return true; - + return this.formGroup.get(controlName).valid; } @@ -614,43 +612,47 @@ export class DmpEditorComponent extends BaseEditor implemen }); } - onRemoveDescriptionTemplate(event, sectionId: Guid){ + onRemoveDescriptionTemplate(event, sectionId: Guid) { let foundDescription = false; const descriptionsInSection = this.descriptionsInSection(sectionId); let descriptionTemplatesInSection = this.formGroup.get('descriptionTemplates').get(sectionId.toString()).value as Guid[]; - if (descriptionsInSection && descriptionsInSection.length > 0){ + if (descriptionsInSection && descriptionsInSection.length > 0) { for (let index = 0; index < descriptionsInSection.length; index++) { const description = descriptionsInSection[index]; - if(description.dmpDescriptionTemplate?.descriptionTemplateGroupId === event.groupId) { + if (description.dmpDescriptionTemplate?.descriptionTemplateGroupId === event.groupId) { foundDescription = true; this.uiNotificationService.snackBarNotification(this.language.instant('DMP-EDITOR.UNSUCCESSFUL-REMOVE-TEMPLATE'), SnackBarNotificationLevel.Error); break; - } + } } - if(foundDescription) { + if (foundDescription) { if (descriptionTemplatesInSection) this.formGroup.get('descriptionTemplates').get(sectionId.toString()).patchValue(descriptionTemplatesInSection); else this.formGroup.get('descriptionTemplates').get(sectionId.toString()).patchValue([]); } } } - canRemoveDescriptionTemplate(item: DescriptionTemplate, sectionId){ - if(item){ + canRemoveDescriptionTemplate(item: DescriptionTemplate, sectionId): MultipleAutoCompleteCanRemoveItem { + if (item) { const descriptionsInSection = this.descriptionsInSection(sectionId); - if (descriptionsInSection && descriptionsInSection.length > 0){ + if (descriptionsInSection && descriptionsInSection.length > 0) { for (let index = 0; index < descriptionsInSection.length; index++) { const description = descriptionsInSection[index]; - if(description.dmpDescriptionTemplate?.descriptionTemplateGroupId === item.groupId) { - return {canRemove: false, + if (description.dmpDescriptionTemplate?.descriptionTemplateGroupId === item.groupId) { + return { + canRemove: false, message: 'DMP-EDITOR.UNSUCCESSFUL-REMOVE-TEMPLATE' - } as CanRemoveDescriptionTemplate - } + } as MultipleAutoCompleteCanRemoveItem + } } } } + return { + canRemove: true, + } as MultipleAutoCompleteCanRemoveItem; } // @@ -666,8 +668,3 @@ export class DmpEditorComponent extends BaseEditor implemen return this.languageInfoService.getLanguageInfoValues(); } } - -export interface CanRemoveDescriptionTemplate { - canRemove: boolean; - message: string; -} diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 4e59a3494..7fc76d511 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1453,7 +1453,7 @@ "DESCRIPTION": "Description", "NO-TEMPLATE-MESSAGE": "If you can't find a template or if you want to create a personalized template for your institution, research community or training needs, please contact us.", "DESCRIPTION-TEMPLATES-MAX-MULTIPLICITY": "Description Templates has reached the maximun multiplicity", - "UNSUCCESSFUL-REMOVE-TEMPLATE": "Failed to remove template, one or more Descriptions of this Plan use this template", + "UNSUCCESSFUL-REMOVE-TEMPLATE": "Cannot remove template, because it's already being used by one or more Descriptions.", "FIELDS": { "TITLE": "Title of Plan", "DESCRIPTION": "Description",