From ce1cb02d4373a8cf76f3a4d12810becea482e38c Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Wed, 7 Feb 2024 17:59:11 +0200 Subject: [PATCH 1/5] Fixed issue with paths on dmp blueprint listing actions --- .../editor/dmp-blueprint-editor.component.ts | 4 +++- .../listing/dmp-blueprint-listing.component.html | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts index ab7c183ed..18de7bda0 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts @@ -128,7 +128,9 @@ export class DmpBlueprintEditorComponent extends BaseEditor this.initModelFlags(d['action'])); + this.route.data.subscribe(d => { + this.initModelFlags(d['action']); + }); } private initModelFlags(action: string): void { diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html index a8807adfe..a6b6ac261 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.html @@ -90,20 +90,20 @@ more_horiz - - - - - + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.ERROR-MESSAGES.FIELD-RADIO-AT-LEAST-ONE-REQUIRED' | translate}} + {{form.get('data').get('options').getError('backendError').message}}
diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/section-fieldset/description-template-editor-section-fieldset.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/section-fieldset/description-template-editor-section-fieldset.component.html index 8e97fb165..dc1f89400 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/section-fieldset/description-template-editor-section-fieldset.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/section-fieldset/description-template-editor-section-fieldset.component.html @@ -65,7 +65,7 @@ [hasFocus]="fieldset.get('id').value === selectedFieldSetId" [datasetProfileId]="datasetProfileId" [validationErrorModel]="validationErrorModel" - [rootPath]="rootPath"> + [rootPath]="rootPath + 'fieldSets[' + i + '].'"> diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts index 027bc2fd4..e6064e396 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts @@ -616,6 +616,10 @@ export class DescriptionTemplateEditorComponent extends BaseEditor { parentSectionRootPath = parentSectionRootPath + 'sections[' + index +'].' }); + + sectionsArray = parent.form.get('sections') as UntypedFormArray; + + //adding page parent MAYBE NOT NEEDED + try { + const maxOrdinal = sectionsArray.controls.map(control => control.get('ordinal').value).reduce((a, b) => Math.max(a, b)); + section.ordinal = maxOrdinal + 1; + } catch { + section.ordinal = sectionsArray.length; + } + + //store rootPath for next levels/components + this.rootPath = 'definition.pages['+ pageIndex +'].'+ parentSectionRootPath; + + sectionsArray.push(section.buildForm({ rootPath: 'definition.pages['+ pageIndex +'].' + parentSectionRootPath + 'sections[' + sectionsArray.length + '].' })); + // (child.form.parent as FormArray).push(section.buildForm()); + } - - sectionsArray = parent.form.get('sections') as UntypedFormArray; - - //adding page parent MAYBE NOT NEEDED - try { - const maxOrdinal = sectionsArray.controls.map(control => control.get('ordinal').value).reduce((a, b) => Math.max(a, b)); - section.ordinal = maxOrdinal + 1; - } catch { - section.ordinal = sectionsArray.length; - } - - sectionsArray.push(section.buildForm({ rootPath: 'definition.pages['+ pageIndex +'].' + parentSectionRootPath + 'sections[' + sectionsArray.length + '].' })); - // (child.form.parent as FormArray).push(section.buildForm()); - } else { console.error('Section can only be child of a page or another section'); } @@ -687,8 +694,6 @@ export class DescriptionTemplateEditorComponent extends BaseEditor item.buildForm({ rootPath: `${rootPath}sources[${index}].` - }), context.getValidation('sources') - ))); + }) + ), context.getValidation('sources').validators + )); return formGroup; } @@ -1583,8 +1584,9 @@ export class DescriptionTemplateRadioBoxDataEditorModel extends DescriptionTempl this.validationErrorModel ).fromModel(item).buildForm({ rootPath: `${rootPath}options[${index}].` - }), context.getValidation('options') - ))); + }) + ), context.getValidation('options').validators + )); return formGroup; } @@ -1729,8 +1731,9 @@ export class DescriptionTemplateSelectDataEditorModel extends DescriptionTemplat this.validationErrorModel ).fromModel(item).buildForm({ rootPath: `${rootPath}options[${index}].` - }), context.getValidation('options') - ))); + }) + ), context.getValidation('options').validators + )); return formGroup; } From 3a514af843ca376a7ee2c9eabda8796fb48a1e24 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Thu, 8 Feb 2024 09:40:16 +0200 Subject: [PATCH 4/5] more description editor changes --- .../enums/DmpBlueprintSystemFieldType.java | 16 +-- .../eu/eudat/commons/enums/FieldType.java | 34 ++--- .../DescriptionFieldDepositBuilder.java | 2 +- .../model/persist/DescriptionPersist.java | 86 ++++++------- .../descriptionproperties/FieldPersist.java | 2 +- .../description/DescriptionServiceImpl.java | 11 +- .../FieldDataHelperServiceProvider.java | 2 +- .../ExportXmlBuilderDatasetProfile.java | 2 +- .../editor/description-editor.component.ts | 7 +- .../editor/description-editor.model.ts | 2 +- .../editor/description-editor.resolver.ts | 2 + .../table-of-contents-internal.html | 4 +- .../table-of-contents-internal.ts | 7 +- .../table-of-contents.component.ts | 116 +++++++++--------- 14 files changed, 152 insertions(+), 141 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/DmpBlueprintSystemFieldType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/DmpBlueprintSystemFieldType.java index 283ead523..73a371059 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/DmpBlueprintSystemFieldType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/DmpBlueprintSystemFieldType.java @@ -7,16 +7,16 @@ import java.util.Map; public enum DmpBlueprintSystemFieldType implements DatabaseEnum { - Text((short)0), - HtmlText((short)1), - Researchers((short)2), - Organizations((short)3), + Text((short)0), //TODO: Rename to "Title" + HtmlText((short)1), //TODO: Rename to "Description" + Researchers((short)2), //TODO: replace by reference type + Organizations((short)3), //TODO: replace by reference type Language((short)4), Contact((short)5), - Funder((short)6), - Grant((short)7), - Project((short)8), - License((short)9), + Funder((short)6), //TODO: replace by reference type + Grant((short)7), //TODO: replace by reference type + Project((short)8), //TODO: replace by reference type + License((short)9), //TODO: replace by reference type AccessRights((short)10); private final Short value; diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/FieldType.java b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/FieldType.java index 186442ad2..97324ed53 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/enums/FieldType.java +++ b/dmp-backend/core/src/main/java/eu/eudat/commons/enums/FieldType.java @@ -6,31 +6,31 @@ import eu.eudat.data.converters.enums.DatabaseEnum; import java.util.Map; public enum FieldType implements DatabaseEnum { - EXTERNAL_SELECT(Names.ExternalSelect), + EXTERNAL_SELECT(Names.ExternalSelect), //TODO: remove SELECT(Names.Select), BOOLEAN_DECISION(Names.BooleanDecision), RADIO_BOX(Names.RadioBox), - INTERNAL_DMP_ENTRIES_RESEARCHERS(Names.InternalDmpResearchers), - INTERNAL_DMP_ENTRIES_DMPS(Names.InternalDmpDmps), - INTERNAL_ENTRIES_DESCRIPTIONS(Names.InternalDmpDescriptions), + INTERNAL_DMP_ENTRIES_RESEARCHERS(Names.InternalDmpResearchers), //TODO: remove + INTERNAL_DMP_ENTRIES_DMPS(Names.InternalDmpDmps), //TODO: rename InternalEntitiesDmps + INTERNAL_DMP_ENTRIES_DATASETS(Names.InternalDmpDescriptions), CHECK_BOX(Names.CheckBox), FREE_TEXT(Names.FreeText), TEXT_AREA(Names.TextArea), RICH_TEXT_AREA(Names.RichTextarea), UPLOAD(Names.Upload), DATE_PICKER(Names.DatePicker), - EXTERNAL_DATASETS(Names.ExternalDatasets), - DATA_REPOSITORIES(Names.DataRepositories), - JOURNAL_REPOSITORIES(Names.JournalRepositories), - PUB_REPOSITORIES(Names.PubRepositories), - LICENSES(Names.Licenses), - TAXONOMIES(Names.Taxonomies), - PUBLICATIONS(Names.Publications), - REGISTRIES(Names.Registries), - SERVICES(Names.Services), + EXTERNAL_DATASETS(Names.ExternalDatasets), //TODO: replace with reference type + DATA_REPOSITORIES(Names.DataRepositories), //TODO: replace with reference type + JOURNAL_REPOSITORIES(Names.JournalRepositories), //TODO: replace with reference type + PUB_REPOSITORIES(Names.PubRepositories), //TODO: replace with reference type + LICENSES(Names.Licenses), //TODO: replace with reference type + TAXONOMIES(Names.Taxonomies), //TODO: replace with reference type + PUBLICATIONS(Names.Publications), //TODO: replace with reference type + REGISTRIES(Names.Registries), //TODO: replace with reference type + SERVICES(Names.Services), //TODO: replace with reference type TAGS(Names.Tags), - RESEARCHERS(Names.Researchers), - ORGANIZATIONS(Names.Organizations), + RESEARCHERS(Names.Researchers), //TODO: replace with reference type + ORGANIZATIONS(Names.Organizations), //TODO: replace with reference type DATASET_IDENTIFIER(Names.DatasetIdentifier), CURRENCY(Names.Currency), VALIDATION(Names.Validation); @@ -43,7 +43,7 @@ public enum FieldType implements DatabaseEnum { public static final String RadioBox = "radiobox"; public static final String InternalDmpResearchers = "internalDmpResearchers"; public static final String InternalDmpDmps = "internalDmpDmps"; - public static final String InternalDmpDescriptions = "internalDmpDescriptions"; + public static final String InternalDmpDescriptions = "internalDmpDatasets"; public static final String CheckBox = "checkBox"; public static final String FreeText = "freetext"; public static final String TextArea = "textarea"; @@ -101,7 +101,7 @@ public enum FieldType implements DatabaseEnum { public static boolean isTextListType(FieldType fieldType){ return fieldType.equals(FieldType.SELECT) || fieldType.equals(FieldType.TAGS) || fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS) || fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_DMPS) || - fieldType.equals(FieldType.INTERNAL_ENTRIES_DESCRIPTIONS); + fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_DATASETS); } public static boolean isDateType(FieldType fieldType){ diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/deposit/DescriptionFieldDepositBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/deposit/DescriptionFieldDepositBuilder.java index 59c548e0c..ba146f952 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/deposit/DescriptionFieldDepositBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/deposit/DescriptionFieldDepositBuilder.java @@ -86,7 +86,7 @@ public class DescriptionFieldDepositBuilder extends BaseDepositBuilder m.setFieldType(FieldType.RADIO_BOX); case INTERNAL_DMP_ENTRIES_RESEARCHERS -> m.setFieldType(FieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS); case INTERNAL_DMP_ENTRIES_DMPS -> m.setFieldType(FieldType.INTERNAL_DMP_ENTRIES_DMPS); - case INTERNAL_ENTRIES_DESCRIPTIONS -> m.setFieldType(FieldType.INTERNAL_DMP_ENTRIES_DATASETS); + case INTERNAL_DMP_ENTRIES_DATASETS -> m.setFieldType(FieldType.INTERNAL_DMP_ENTRIES_DATASETS); case CHECK_BOX -> m.setFieldType(FieldType.CHECK_BOX); case FREE_TEXT -> m.setFieldType(FieldType.FREE_TEXT); case TEXT_AREA -> m.setFieldType(FieldType.TEXT_AREA); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java index 255e251fe..245287eaf 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java @@ -173,49 +173,49 @@ public class DescriptionPersist { DescriptionTemplateEntity descriptionTemplate = this.isValidGuid(item.getDescriptionTemplateId()) ? this.entityManager.find(DescriptionTemplateEntity.class, item.getDescriptionTemplateId()) : null; DefinitionEntity definition = descriptionTemplate == null ? null : this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, descriptionTemplate.getDefinition()); return Arrays.asList( - this.spec() - .iff(() -> this.isValidGuid(item.getId())) - .must(() -> this.isValidHash(item.getHash())) - .failOn(DescriptionPersist._hash).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._hash}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> !this.isValidGuid(item.getId())) - .must(() -> !this.isValidHash(item.getHash())) - .failOn(DescriptionPersist._hash).failWith(messageSource.getMessage("Validation_OverPosting", new Object[]{}, LocaleContextHolder.getLocale())), - this.spec() - .must(() -> !this.isEmpty(item.getLabel())) - .failOn(DescriptionPersist._label).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._label}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> !this.isEmpty(item.getLabel())) - .must(() -> this.lessEqualLength(item.getLabel(), DescriptionEntity._labelLength)) - .failOn(DescriptionPersist._label).failWith(messageSource.getMessage("Validation_MaxLength", new Object[]{DescriptionPersist._label}, LocaleContextHolder.getLocale())), - this.spec() - .must(() -> this.isValidGuid(item.getDmpId())) - .failOn(DescriptionPersist._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpId}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> item.getStatus() == DescriptionStatus.Finalized) - .must(() -> this.isValidGuid(item.getDescriptionTemplateId())) - .failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> item.getStatus() == DescriptionStatus.Finalized) - .must(() -> this.isValidGuid(item.getDmpDescriptionTemplateId())) - .failOn(DescriptionPersist._dmpDescriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpDescriptionTemplateId}, LocaleContextHolder.getLocale())), - this.spec() - .must(() -> !this.isNull(item.getStatus())) - .failOn(DescriptionPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._status}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> item.getStatus() == DescriptionStatus.Finalized) - .must(() -> !this.isListNullOrEmpty(item.getTags())) - .failOn(DescriptionPersist._tags).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._tags}, LocaleContextHolder.getLocale())), - - this.spec() - .iff(() -> item.getStatus() == DescriptionStatus.Finalized) - .must(() -> !this.isNull(item.getProperties())) - .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())), - this.refSpec() - .iff(() -> !this.isNull(item.getProperties())) - .on(DescriptionPersist._properties) - .over(item.getProperties()) - .using(() -> this.validatorFactory.validator(PropertyDefinitionPersist.PropertyDefinitionPersistValidator.class).setStatus(item.getStatus()).withDefinition(definition)) +// this.spec() +// .iff(() -> this.isValidGuid(item.getId())) +// .must(() -> this.isValidHash(item.getHash())) +// .failOn(DescriptionPersist._hash).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._hash}, LocaleContextHolder.getLocale())), +// this.spec() +// .iff(() -> !this.isValidGuid(item.getId())) +// .must(() -> !this.isValidHash(item.getHash())) +// .failOn(DescriptionPersist._hash).failWith(messageSource.getMessage("Validation_OverPosting", new Object[]{}, LocaleContextHolder.getLocale())), +// this.spec() +// .must(() -> !this.isEmpty(item.getLabel())) +// .failOn(DescriptionPersist._label).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._label}, LocaleContextHolder.getLocale())), +// this.spec() +// .iff(() -> !this.isEmpty(item.getLabel())) +// .must(() -> this.lessEqualLength(item.getLabel(), DescriptionEntity._labelLength)) +// .failOn(DescriptionPersist._label).failWith(messageSource.getMessage("Validation_MaxLength", new Object[]{DescriptionPersist._label}, LocaleContextHolder.getLocale())), +// this.spec() +// .must(() -> this.isValidGuid(item.getDmpId())) +// .failOn(DescriptionPersist._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpId}, LocaleContextHolder.getLocale())), +// this.spec() +// .iff(() -> item.getStatus() == DescriptionStatus.Finalized) +// .must(() -> this.isValidGuid(item.getDescriptionTemplateId())) +// .failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())), +// this.spec() +// .iff(() -> item.getStatus() == DescriptionStatus.Finalized) +// .must(() -> this.isValidGuid(item.getDmpDescriptionTemplateId())) +// .failOn(DescriptionPersist._dmpDescriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpDescriptionTemplateId}, LocaleContextHolder.getLocale())), +// this.spec() +// .must(() -> !this.isNull(item.getStatus())) +// .failOn(DescriptionPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._status}, LocaleContextHolder.getLocale())), +// this.spec() +// .iff(() -> item.getStatus() == DescriptionStatus.Finalized) +// .must(() -> !this.isListNullOrEmpty(item.getTags())) +// .failOn(DescriptionPersist._tags).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._tags}, LocaleContextHolder.getLocale())), +// +// this.spec() +// .iff(() -> item.getStatus() == DescriptionStatus.Finalized) +// .must(() -> !this.isNull(item.getProperties())) +// .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())), +// this.refSpec() +// .iff(() -> !this.isNull(item.getProperties())) +// .on(DescriptionPersist._properties) +// .over(item.getProperties()) +// .using(() -> this.validatorFactory.validator(PropertyDefinitionPersist.PropertyDefinitionPersistValidator.class).setStatus(item.getStatus()).withDefinition(definition)) ); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptionproperties/FieldPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptionproperties/FieldPersist.java index f3bc32ab8..b4937bb3a 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptionproperties/FieldPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptionproperties/FieldPersist.java @@ -130,7 +130,7 @@ public class FieldPersist { .must(() -> this.isUUID(item.getTextValue())) .failOn(FieldPersist._textValue).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{FieldPersist._textValue}, LocaleContextHolder.getLocale())), this.spec() - .iff(()-> !this.isNull(item.getTextListValue()) && (fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_DMPS) || fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS) || fieldType.equals(FieldType.INTERNAL_ENTRIES_DESCRIPTIONS))) + .iff(()-> !this.isNull(item.getTextListValue()) && (fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_DMPS) || fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS) || fieldType.equals(FieldType.INTERNAL_DMP_ENTRIES_DATASETS))) .must(() -> item.getTextListValue().stream().allMatch(this::isUUID)) .failOn(FieldPersist._textListValue).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{FieldPersist._textListValue}, LocaleContextHolder.getLocale())), this.navSpec() diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java index 039e2d5e3..f90ef3514 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java @@ -155,12 +155,13 @@ public class DescriptionServiceImpl implements DescriptionService { data.setId(UUID.randomUUID()); data.setIsActive(IsActive.Active); data.setCreatedAt(Instant.now()); + data.setCreatedById(this.userScope.getUserId()); data.setDmpId(model.getDmpId()); data.setDmpDescriptionTemplateId(model.getDmpDescriptionTemplateId()); } - DmpDescriptionTemplateEntity dmpDescriptionTemplate = this.entityManager.find(DmpDescriptionTemplateEntity.class, data.getDescriptionTemplateId()); - if (dmpDescriptionTemplate == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + DmpDescriptionTemplateEntity dmpDescriptionTemplate = this.entityManager.find(DmpDescriptionTemplateEntity.class, data.getDmpDescriptionTemplateId()); + if (dmpDescriptionTemplate == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DescriptionTemplateEntity descriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, model.getDescriptionTemplateId()); if (descriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -385,6 +386,8 @@ public class DescriptionServiceImpl implements DescriptionService { PropertyDefinitionFieldSetItemEntity data = new PropertyDefinitionFieldSetItemEntity(); if (persist == null) return data; if (persist.getFields() != null && !persist.getFields().isEmpty()){ + data.setOrdinal(persist.getOrdinal()); + data.setComment(persist.getComment()); data.setFields(new HashMap<>()); for (String key: persist.getFields().keySet()) { eu.eudat.commons.types.descriptiontemplate.FieldEntity fieldEntity = fieldSetEntity != null ? fieldSetEntity.getAllField().stream().findFirst().orElse(null) : null; @@ -400,7 +403,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (persist == null) return data; if (FieldType.isTextType(fieldType)) { - if (FieldType.UPLOAD.equals(fieldType)){ + if (FieldType.UPLOAD.equals(fieldType) && !this.conventionService.isNullOrEmpty(persist.getTextValue())){ StorageFile storageFile = this.storageFileService.copyToStorage(UUID.fromString(persist.getTextValue()), StorageType.Main, true, new BaseFieldSet().ensure(StorageFile._id)); this.storageFileService.updatePurgeAt(storageFile.getId(), null); data.setTextValue(storageFile.getId().toString()); @@ -415,7 +418,7 @@ public class DescriptionServiceImpl implements DescriptionService { for (UUID id : ids){ if (!existingIds.contains(id)) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); } - } if (FieldType.INTERNAL_ENTRIES_DESCRIPTIONS.equals(fieldType) && !this.conventionService.isListNullOrEmpty(persist.getTextListValue())){ + } if (FieldType.INTERNAL_DMP_ENTRIES_DATASETS.equals(fieldType) && !this.conventionService.isListNullOrEmpty(persist.getTextListValue())){ List ids = persist.getTextListValue().stream().map(UUID::fromString).toList(); Set existingIds = this.queryFactory.query(DescriptionQuery.class).ids(ids).isActive(IsActive.Active).collectAs(new BaseFieldSet().ensure(Description._id)).stream().map(DescriptionEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/fielddatahelper/FieldDataHelperServiceProvider.java b/dmp-backend/core/src/main/java/eu/eudat/service/fielddatahelper/FieldDataHelperServiceProvider.java index 4c4db3cae..570b9c7f3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/fielddatahelper/FieldDataHelperServiceProvider.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/fielddatahelper/FieldDataHelperServiceProvider.java @@ -24,7 +24,7 @@ public class FieldDataHelperServiceProvider { case REGISTRIES: case SERVICES: case RESEARCHERS: - case INTERNAL_ENTRIES_DESCRIPTIONS: + case INTERNAL_DMP_ENTRIES_DATASETS: case INTERNAL_DMP_ENTRIES_DMPS: case INTERNAL_DMP_ENTRIES_RESEARCHERS: case ORGANIZATIONS: { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java index e1c1406cf..503b5c57b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java @@ -290,7 +290,7 @@ public class ExportXmlBuilderDatasetProfile { dataOut.setAttribute("label", baseFieldDataObject.getLabel()); break; case INTERNAL_DMP_ENTRIES_RESEARCHERS: - case INTERNAL_ENTRIES_DESCRIPTIONS: + case INTERNAL_DMP_ENTRIES_DATASETS: case INTERNAL_DMP_ENTRIES_DMPS: // InternalDmpBaseDataEntity internalDmpEntitiesData = (InternalDmpBaseDataEntity) field.getData(); // dataOut.setAttribute("label", internalDmpEntitiesData.getLabel()); diff --git a/dmp-frontend/src/app/ui/description/editor/description-editor.component.ts b/dmp-frontend/src/app/ui/description/editor/description-editor.component.ts index fb86d56fa..f9732bd47 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-editor.component.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-editor.component.ts @@ -784,9 +784,12 @@ export class DescriptionEditorComponent extends BaseEditor { this.editorModel.properties = new DescriptionPropertyDefinitionEditorModel().fromModel(null, descriptionTemplate, null); - this.formGroup.removeControl('properties'); - this.formGroup.addControl('properties', this.editorModel.buildProperties()); + this.formGroup.setControl('properties', this.editorModel.buildProperties()); this.item.descriptionTemplate = descriptionTemplate; + + const sectionId = this.item.dmpDescriptionTemplate.sectionId; + this.item.dmpDescriptionTemplate = this.item.dmp.dmpDescriptionTemplates.find(x => x.sectionId == sectionId && x.descriptionTemplateGroupId == descriptionTemplate.groupId); + this.formGroup.get('dmpDescriptionTemplateId').setValue(this.item.dmpDescriptionTemplate.id); }); // this.formGroup.removeControl('descriptionProfileDefinition'); // this.getDefinition(profiledId); diff --git a/dmp-frontend/src/app/ui/description/editor/description-editor.model.ts b/dmp-frontend/src/app/ui/description/editor/description-editor.model.ts index 81c6f9d50..f6fc3f81a 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-editor.model.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-editor.model.ts @@ -34,7 +34,7 @@ export class DescriptionEditorModel extends BaseEditorModel implements Descripti this.dmpId = item.dmp?.id; this.dmpDescriptionTemplateId = item.dmpDescriptionTemplate?.id; this.descriptionTemplateId = item.descriptionTemplate?.id; - this.status = item.status; + this.status = item.status ?? DescriptionStatus.Draft; this.description = item.description; this.tags = item.descriptionTags?.map(x => x.tag?.label); this.properties = new DescriptionPropertyDefinitionEditorModel().fromModel(item.properties, descriptionTemplate, item.descriptionReferences); diff --git a/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts b/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts index 3e82c9783..889484c29 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-editor.resolver.ts @@ -68,6 +68,7 @@ export class DescriptionEditorResolver extends BaseEditorResolver { (prefix ? prefix + '.' : '') + [nameof(x => x.id)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.label)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.version)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.groupId)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.id)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.ordinal)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.title)].join('.'), @@ -121,6 +122,7 @@ export class DescriptionEditorResolver extends BaseEditorResolver { // (prefix ? prefix + '.' : '') + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.minMultiplicity)].join('.'), // (prefix ? prefix + '.' : '') + [nameof(x => x.blueprint), nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.descriptionTemplates), nameof(x => x.maxMultiplicity)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.id)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.sectionId)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.descriptionTemplateGroupId)].join('.'), (prefix ? prefix + '.' : '') + [nameof(x => x.dmpDescriptionTemplates), nameof(x => x.currentDescriptionTemplate), nameof(x => x.id)].join('.'), diff --git a/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents-internal/table-of-contents-internal.html b/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents-internal/table-of-contents-internal.html index 3ffaf7c2c..8653b61f4 100644 --- a/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents-internal/table-of-contents-internal.html +++ b/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents-internal/table-of-contents-internal.html @@ -1,10 +1,12 @@
+ - + + false); if (this.selected) { @@ -73,13 +73,14 @@ export class TableOfContentsInternal implements OnInit { if (entry.type === ToCEntryType.FieldSet) { const fieldSetId = entry.id; - const element = document.getElementById(this.TOCENTRY_ID_PREFIX + fieldSetId); + // const element = document.getElementById(this.TOCENTRY_ID_PREFIX + fieldSetId); + const element = document.getElementById(fieldSetId); if (element) { element.click();//open mat expansion panel //scroll asyn in 200 ms so the expansion panel is expanded and the element coordinates are updated setTimeout(() => { - const element = document.getElementById(this.TOCENTRY_ID_PREFIX + fieldSetId); + const element = document.getElementById(fieldSetId); if (element) { element.scrollIntoView({ behavior: 'smooth' }); } diff --git a/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents.component.ts b/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents.component.ts index 619d7b364..9d9cb97fd 100644 --- a/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents.component.ts +++ b/dmp-frontend/src/app/ui/description/editor/table-of-contents/table-of-contents.component.ts @@ -83,9 +83,9 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O if (this.descriptionTemplate) { this.tocentries = this.getTocEntries(this.descriptionTemplate); - if (this.visibilityRulesService) { - this.hiddenEntries = this._findHiddenEntries(this.tocentries); - } + // if (this.visibilityRulesService) { + // this.hiddenEntries = this._findHiddenEntries(this.tocentries); + // } } else { @@ -96,57 +96,57 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O 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 (!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; - }) - } + // 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[1].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; + // }) + // } } } @@ -201,9 +201,9 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O } if (changes['descriptionTemplate'] && changes.descriptionTemplate != null) { this.tocentries = this.getTocEntries(this.descriptionTemplate); - if (this.visibilityRulesService) { - this.hiddenEntries = this._findHiddenEntries(this.tocentries); - } + // if (this.visibilityRulesService) { + // this.hiddenEntries = this._findHiddenEntries(this.tocentries); + // } } if ('visibilityRulesService') { @@ -365,7 +365,7 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O id: item.id, label: item.title, numbering: 's', - subEntries: tempResult, + subEntries: null, subEntriesType: ToCEntryType.Field, type: ToCEntryType.FieldSet, ordinal: item.ordinal @@ -383,7 +383,7 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O subEntriesType: null, type: ToCEntryType.Field, ordinal: item.ordinal, - hidden: true + hidden: false }; } From 2204119503af99c4eee1cdc7a211e0826cf6aa69 Mon Sep 17 00:00:00 2001 From: amentis Date: Thu, 8 Feb 2024 10:46:30 +0200 Subject: [PATCH 5/5] description template field type validation fix --- .../descriptiontemplatedefinition/FieldPersist.java | 8 ++++++-- .../fielddata/BaseFieldDataPersist.java | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/FieldPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/FieldPersist.java index ec02d1b10..e93482197 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/FieldPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/FieldPersist.java @@ -154,8 +154,12 @@ public class FieldPersist { .iff(() -> !this.isNull(item.getData()) && item.getData().getFieldType() != null) .on(FieldPersist._data) .over(item.getData()) - .using(() -> this.fieldDataHelperServiceProvider.get(item.getData().getFieldType()).getPersistModelValidator()) - ); + .using(() -> this.fieldDataHelperServiceProvider.get(item.getData().getFieldType()).getPersistModelValidator()), + this.spec() + .iff(() -> !this.isNull(item.getData())) + .must(() -> !this.isNull(item.getData().getFieldType())) + .failOn(FieldPersist._data + '.' + BaseFieldDataPersist._fieldType).failWith(messageSource.getMessage("Validation_Required", new Object[]{BaseFieldDataPersist._fieldType}, LocaleContextHolder.getLocale())) + ); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/fielddata/BaseFieldDataPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/fielddata/BaseFieldDataPersist.java index b09df07c5..d6ec01609 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/fielddata/BaseFieldDataPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/descriptiontemplatedefinition/fielddata/BaseFieldDataPersist.java @@ -18,7 +18,8 @@ import java.util.List; use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "fieldType", - visible = true) + visible = true, + defaultImpl = LabelDataPersist.class) @JsonSubTypes({ @JsonSubTypes.Type(value = ExternalSelectDataPersist.class, name = FieldType.Names.ExternalSelect), @JsonSubTypes.Type(value = LabelDataPersist.class, name = FieldType.Names.BooleanDecision),