From 8b5a54814d7fdbac955892e6f2b06af8f9e42259 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Wed, 31 Jan 2024 21:16:39 +0200 Subject: [PATCH] description template changes in frontend --- ...iption-template-field-autocomplete-type.ts | 4 - .../enum/description-template-field-type.ts | 5 +- .../description-template-persist.ts | 108 ++---- .../description-template.ts | 107 ++---- .../src/app/core/pipes/field-value.pipe.ts | 6 +- .../services/utilities/enum-utils.service.ts | 4 +- ...late-editor-composite-field.component.html | 4 +- ...mplate-editor-composite-field.component.ts | 292 +++------------- ...-editor-auto-complete-field.component.html | 20 +- ...te-editor-auto-complete-field.component.ts | 6 +- ...datasets-autocomplete-field.component.html | 2 +- ...tor-dmps-autocomplete-field.component.html | 2 +- ...tor-external-datasets-field.component.html | 2 +- ...e-editor-multiplicity-field.component.html | 2 +- ...archers-auto-complete-field.component.html | 2 +- ...le-editor-researchers-field.component.html | 2 +- ...emplate-editor-select-field.component.html | 4 +- ...-template-editor-select-field.component.ts | 4 +- ...ption-template-editor-field.component.html | 18 +- ...ription-template-editor-field.component.ts | 302 ++++------------- ...description-template-editor.component.html | 8 - .../description-template-editor.component.ts | 94 +++--- .../description-template-editor.model.ts | 316 ++++++++++-------- .../description-template-editor.resolver.ts | 79 +++-- .../editor/description-editor.resolver.ts | 50 ++- .../form-field/form-field.component.html | 64 ++-- .../form-field/form-field.component.ts | 18 +- .../description-form.component.html | 2 +- .../description-form.component.ts | 5 +- .../visibility-rules.service.ts | 31 +- .../table-of-contents.component.ts | 2 +- dmp-frontend/src/assets/i18n/en.json | 10 +- 32 files changed, 559 insertions(+), 1016 deletions(-) delete mode 100644 dmp-frontend/src/app/core/common/enum/description-template-field-autocomplete-type.ts diff --git a/dmp-frontend/src/app/core/common/enum/description-template-field-autocomplete-type.ts b/dmp-frontend/src/app/core/common/enum/description-template-field-autocomplete-type.ts deleted file mode 100644 index ed3534b95..000000000 --- a/dmp-frontend/src/app/core/common/enum/description-template-field-autocomplete-type.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum DescriptionTemplateFieldAutocompleteType { - UNCACHED = 0, - CACHED = 1 -} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/common/enum/description-template-field-type.ts b/dmp-frontend/src/app/core/common/enum/description-template-field-type.ts index 841ae1d32..59360d7b6 100644 --- a/dmp-frontend/src/app/core/common/enum/description-template-field-type.ts +++ b/dmp-frontend/src/app/core/common/enum/description-template-field-type.ts @@ -1,7 +1,6 @@ export enum DescriptionTemplateFieldType { - COMBO_BOX = "combobox", //Delete - AUTO_COMPLETE = "autocomplete", - SELECT = "wordlist", + EXTERNAL_SELECT = "externalSelect", + SELECT = "select", BOOLEAN_DECISION = "booleanDecision", RADIO_BOX = "radiobox", INTERNAL_DMP_ENTRIES = "internalDmpEntities", //Delete diff --git a/dmp-frontend/src/app/core/model/description-template/description-template-persist.ts b/dmp-frontend/src/app/core/model/description-template/description-template-persist.ts index 106c7d6f2..9461057c5 100644 --- a/dmp-frontend/src/app/core/model/description-template/description-template-persist.ts +++ b/dmp-frontend/src/app/core/model/description-template/description-template-persist.ts @@ -1,4 +1,3 @@ -import { DescriptionTemplateFieldAutocompleteType } from "@app/core/common/enum/description-template-field-autocomplete-type"; import { DescriptionTemplateFieldDataExternalDatasetType } from "@app/core/common/enum/description-template-field-data-external-dataset-type"; import { DescriptionTemplateFieldType } from "@app/core/common/enum/description-template-field-type"; import { DescriptionTemplateFieldValidationType } from "@app/core/common/enum/description-template-field-validation-type"; @@ -25,7 +24,6 @@ export interface UserDescriptionTemplatePersist { export interface DescriptionTemplateDefinitionPersist { pages?: DescriptionTemplatePagePersist[]; - sections?: DescriptionTemplateSectionPersist[]; } @@ -33,6 +31,7 @@ export interface DescriptionTemplatePagePersist { id: string; ordinal: number; title: string; + sections: DescriptionTemplateSectionPersist[]; } export interface DescriptionTemplateSectionPersist { @@ -40,7 +39,6 @@ export interface DescriptionTemplateSectionPersist { ordinal: number; defaultVisibility: boolean; multiplicity: boolean; - page: string; title: string; description: string; @@ -92,115 +90,47 @@ export interface DescriptionTemplateBaseFieldDataPersist { // // Field Types // -export interface DescriptionTemplateAutoCompleteDataPersist extends DescriptionTemplateBaseFieldDataPersist { - multiAutoComplete: boolean; - autoCompleteSingleDataList: DescriptionTemplateAutoCompleteSingleDataPersist[]; -} -export interface DescriptionTemplateBooleanDecisionDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateDatasetAutoCompleteDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateDmpAutoCompleteDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateCheckBoxDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateDatePickerDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateExternalDatasetDataPersist extends DescriptionTemplateBaseFieldDataPersist { - multiAutoComplete: boolean; +export interface DescriptionTemplateExternalDatasetDataPersist extends DescriptionTemplateLabelAndMultiplicityDataPersist { type: DescriptionTemplateFieldDataExternalDatasetType; } -export interface DescriptionTemplateFreeTextDataPersist extends DescriptionTemplateBaseFieldDataPersist { +export interface DescriptionTemplateExternalSelectDataPersist extends DescriptionTemplateLabelAndMultiplicityDataPersist { + sources: DescriptionTemplateExternalSelectSourcePersist[]; } -export interface DescriptionTemplatePlaceholderAndMultiplicityDataPersist extends DescriptionTemplateBaseFieldDataPersist { - multiAutoComplete: boolean; -} -export interface DescriptionTemplateLicenseDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { +export interface DescriptionTemplateLabelAndMultiplicityDataPersist extends DescriptionTemplateBaseFieldDataPersist { + multipleSelect: boolean; } -export interface DescriptionTemplateOrganizationDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplatePublicationDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { +export interface DescriptionTemplateLabelDataPersist extends DescriptionTemplateBaseFieldDataPersist { } export interface DescriptionTemplateRadioBoxDataPersist extends DescriptionTemplateBaseFieldDataPersist { options: DescriptionTemplateRadioBoxOptionPersist[]; } -export interface DescriptionTemplateRegistryDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateResearcherAutoCompleteDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateResearcherDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateRichTextAreaDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateServiceDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateTagDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateTaxonomyDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateTextAreaDataPersist extends DescriptionTemplateBaseFieldDataPersist { +export interface DescriptionTemplateSelectDataPersist extends DescriptionTemplateLabelAndMultiplicityDataPersist { + options: DescriptionTemplateSelectOptionPersist[]; } export interface DescriptionTemplateUploadDataPersist extends DescriptionTemplateBaseFieldDataPersist { types: DescriptionTemplateUploadOptionPersist[]; } -export interface DescriptionTemplateValidationDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateDatasetIdentifierDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateCurrencyDataPersist extends DescriptionTemplateBaseFieldDataPersist { -} - -export interface DescriptionTemplateSelectDataPersist extends DescriptionTemplateBaseFieldDataPersist { - options: DescriptionTemplateComboBoxOptionPersist[]; - multiList: boolean; -} - -export interface DescriptionTemplateDataRepositoryDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplateJournalRepositoryDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - -export interface DescriptionTemplatePublicationRepositoryDataPersist extends DescriptionTemplatePlaceholderAndMultiplicityDataPersist { -} - // // Others // -export interface DescriptionTemplateAutoCompleteSingleDataPersist { - autocompleteType: DescriptionTemplateFieldAutocompleteType; +export interface DescriptionTemplateExternalSelectSourcePersist { url: string; - autoCompleteOptions: DescriptionTemplateComboBoxOptionPersist; - optionsRoot: string; - hasAuth: boolean; - auth: DescriptionTemplateAuthAutoCompleteDataPersist method: string; + optionsRoot: string; + sourceBinding: DescriptionTemplateExternalSelectSourceBindingPersist; + hasAuth: boolean; + auth: DescriptionTemplateExternalSelectAuthDataPersist } -export interface DescriptionTemplateAuthAutoCompleteDataPersist { +export interface DescriptionTemplateExternalSelectAuthDataPersist { url: string; method: string; body: string; @@ -208,11 +138,15 @@ export interface DescriptionTemplateAuthAutoCompleteDataPersist { type: string; } -export interface DescriptionTemplateComboBoxOptionPersist { +export interface DescriptionTemplateSelectOptionPersist { + label: string; + value: string; +} + +export interface DescriptionTemplateExternalSelectSourceBindingPersist { label: string; value: string; source: string; - uri: string; } export interface DescriptionTemplateRadioBoxOptionPersist { diff --git a/dmp-frontend/src/app/core/model/description-template/description-template.ts b/dmp-frontend/src/app/core/model/description-template/description-template.ts index 13103ab45..fc81139eb 100644 --- a/dmp-frontend/src/app/core/model/description-template/description-template.ts +++ b/dmp-frontend/src/app/core/model/description-template/description-template.ts @@ -29,7 +29,6 @@ export interface UserDescriptionTemplate extends BaseEntity { export interface DescriptionTemplateDefinition { pages?: DescriptionTemplatePage[]; - sections?: DescriptionTemplateSection[]; } @@ -37,6 +36,7 @@ export interface DescriptionTemplatePage { id: string; ordinal: number; title: string; + sections: DescriptionTemplateSection[]; } export interface DescriptionTemplateSection { @@ -44,13 +44,9 @@ export interface DescriptionTemplateSection { ordinal: number; defaultVisibility: boolean; multiplicity: boolean; - numbering: string; - page: string; title: string; description: string; - extendedDescription: string; - - sections?: DescriptionTemplateSection[]; + sections: DescriptionTemplateSection[]; fieldSets: DescriptionTemplateFieldSet[]; } @@ -100,82 +96,27 @@ export interface DescriptionTemplateBaseFieldData { // // Field Types // -export interface DescriptionTemplateAutoCompleteData extends DescriptionTemplateBaseFieldData { - multiAutoComplete: boolean; - autoCompleteSingleDataList: DescriptionTemplateAutoCompleteSingleData[]; +export interface DescriptionTemplateLabelData extends DescriptionTemplateBaseFieldData { } -export interface DescriptionTemplateBooleanDecisionData extends DescriptionTemplateBaseFieldData { +export interface DescriptionTemplateLabelAndMultiplicityData extends DescriptionTemplateBaseFieldData { + multipleSelect: boolean; } -export interface DescriptionTemplateCheckBoxData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateCurrencyData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateDataRepositoryData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateDatasetAutoCompleteData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateDatasetIdentifierData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateDatePickerData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateDmpAutoCompleteData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateExternalDatasetData extends DescriptionTemplateBaseFieldData { - multiAutoComplete: boolean; +export interface DescriptionTemplateExternalDatasetData extends DescriptionTemplateLabelAndMultiplicityData { type?: DescriptionTemplateFieldDataExternalDatasetType; } -export interface DescriptionTemplateFreeTextData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplatePlaceholderAndMultiplicityData extends DescriptionTemplateBaseFieldData { - multiAutoComplete: boolean; -} - -export interface DescriptionTemplateLicenseData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateOrganizationData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplatePublicationData extends DescriptionTemplatePlaceholderAndMultiplicityData { +export interface DescriptionTemplateExternalSelectData extends DescriptionTemplateLabelAndMultiplicityData { + sources: DescriptionTemplateExternalSelectSource[]; } export interface DescriptionTemplateRadioBoxData extends DescriptionTemplateBaseFieldData { options: DescriptionTemplateRadioBoxOption[]; } -export interface DescriptionTemplateRegistryData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateResearcherAutoCompleteData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateResearcherData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateRichTextAreaData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateServiceData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateTagData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateTaxonomyData extends DescriptionTemplatePlaceholderAndMultiplicityData { -} - -export interface DescriptionTemplateTextAreaData extends DescriptionTemplateBaseFieldData { +export interface DescriptionTemplateSelectData extends DescriptionTemplateLabelAndMultiplicityData { + options: DescriptionTemplateSelectOption[]; } export interface DescriptionTemplateUploadData extends DescriptionTemplateBaseFieldData { @@ -183,28 +124,20 @@ export interface DescriptionTemplateUploadData extends DescriptionTemplateBaseFi maxFileSizeInMB: number; } -export interface DescriptionTemplateValidationData extends DescriptionTemplateBaseFieldData { -} - -export interface DescriptionTemplateSelectData extends DescriptionTemplateBaseFieldData { - options: DescriptionTemplateComboBoxOption[]; - multiList: boolean; -} // // Others // -export interface DescriptionTemplateAutoCompleteSingleData { - autocompleteType: string; +export interface DescriptionTemplateExternalSelectSource { url: string; - autoCompleteOptions: DescriptionTemplateComboBoxOption; - optionsRoot: string; - hasAuth: boolean; - auth: DescriptionTemplateAuthAutoCompleteData method: string; + optionsRoot: string; + sourceBinding: DescriptionTemplateExternalSelectSourceBinding; + hasAuth: boolean; + auth: DescriptionTemplateExternalSelectAuthData } -export interface DescriptionTemplateAuthAutoCompleteData { +export interface DescriptionTemplateExternalSelectAuthData { url: string; method: string; body: string; @@ -212,11 +145,15 @@ export interface DescriptionTemplateAuthAutoCompleteData { type: string; } -export interface DescriptionTemplateComboBoxOption { +export interface DescriptionTemplateExternalSelectSourceBinding { label: string; value: string; source: string; - uri: string; +} + +export interface DescriptionTemplateSelectOption { + label: string; + value: string; } export interface DescriptionTemplateRadioBoxOption { diff --git a/dmp-frontend/src/app/core/pipes/field-value.pipe.ts b/dmp-frontend/src/app/core/pipes/field-value.pipe.ts index 2b52fa4f1..8eca47f68 100644 --- a/dmp-frontend/src/app/core/pipes/field-value.pipe.ts +++ b/dmp-frontend/src/app/core/pipes/field-value.pipe.ts @@ -33,11 +33,11 @@ export class FieldValuePipe implements PipeTransform { return this.date.transform(controlValue.value, 'dd/MM/yyyy'); case DescriptionTemplateFieldType.FREE_TEXT: return value; - case DescriptionTemplateFieldType.AUTO_COMPLETE: + case DescriptionTemplateFieldType.EXTERNAL_SELECT: case DescriptionTemplateFieldType.SELECT: - if (value && controlValue.data.options && !controlValue.data.multiList) { + if (value && controlValue.data.options && !controlValue.data.multipleSelect) { return controlValue.data.options.find(option => value == option.value).label; - } else if (value && controlValue.data.options && controlValue.data.multiList) { + } else if (value && controlValue.data.options && controlValue.data.multipleSelect) { return controlValue.data.options.filter(option => value.includes(option.value)).map(option => option.label).join(','); } break; diff --git a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts index ff6b6a35c..7d0e34402 100644 --- a/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts +++ b/dmp-frontend/src/app/core/services/utilities/enum-utils.service.ts @@ -156,12 +156,10 @@ export class EnumUtils { toDescriptionTemplateFieldTypeString(status: DescriptionTemplateFieldType): string { switch (status) { - case DescriptionTemplateFieldType.COMBO_BOX: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.COMBO-BOX'); - case DescriptionTemplateFieldType.AUTO_COMPLETE: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.AUTO-COMPLETE'); + case DescriptionTemplateFieldType.EXTERNAL_SELECT: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.EXTERNAL-SELECT'); case DescriptionTemplateFieldType.SELECT: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.SELECT'); case DescriptionTemplateFieldType.BOOLEAN_DECISION: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.BOOLEAN-DECISION'); case DescriptionTemplateFieldType.RADIO_BOX: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.RADIO-BOX'); - case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.INTERNAL-DMP-ENTITIES'); case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.INTERNAL-DMP-ENTITIES-RESEARCHERS'); case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.INTERNAL-DMP-ENTITIES-DMPS'); case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DATASETS: return this.language.instant('TYPES.DESCRIPTION-TEMPLATE-FIELD-TYPE.INTERNAL-DMP-ENTITIES-DATASETS'); diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html index 03161e52c..a0ee1d587 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.html @@ -233,9 +233,9 @@ Publications icon {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.PUBLICATIONS)}} - diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.ts index fb2a62d4f..16dbe047e 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/composite-field/description-template-editor-composite-field.component.ts @@ -5,32 +5,15 @@ import { MatDialog } from '@angular/material/dialog'; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; import { ValidationType } from '@app/core/common/enum/validation-type'; import { - DescriptionTemplateAutoCompleteData, - DescriptionTemplateBooleanDecisionData, - DescriptionTemplateCheckBoxData, - DescriptionTemplateComboBoxOption, - DescriptionTemplateCurrencyData, - DescriptionTemplateDataRepositoryData, - DescriptionTemplateDatasetIdentifierData, - DescriptionTemplateDatePickerData, - DescriptionTemplateDmpAutoCompleteData, + DescriptionTemplateExternalSelectData, + DescriptionTemplateSelectOption, DescriptionTemplateExternalDatasetData, DescriptionTemplateField, - DescriptionTemplateFreeTextData, - DescriptionTemplateLicenseData, - DescriptionTemplateOrganizationData, - DescriptionTemplatePublicationData, DescriptionTemplateRadioBoxData, - DescriptionTemplateRegistryData, - DescriptionTemplateResearcherAutoCompleteData, - DescriptionTemplateRichTextAreaData, - DescriptionTemplateServiceData, - DescriptionTemplateTagData, - DescriptionTemplateTaxonomyData, - DescriptionTemplateTextAreaData, DescriptionTemplateUploadData, - DescriptionTemplateValidationData, - DescriptionTemplateSelectData + DescriptionTemplateSelectData, + DescriptionTemplateLabelData, + DescriptionTemplateLabelAndMultiplicityData } from '@app/core/model/description-template/description-template'; import { ConfigurationService } from "@app/core/services/configuration/configuration.service"; import { DescriptionTemplateService } from '@app/core/services/description-template/description-template.service'; @@ -497,258 +480,91 @@ export class DescriptionTemplateEditorCompositeFieldComponent extends BaseCompon } as DescriptionTemplateField; switch (type) { - case DescriptionTemplateFieldType.BOOLEAN_DECISION: { - - const data: DescriptionTemplateBooleanDecisionData = { + case DescriptionTemplateFieldType.EXTERNAL_SELECT: { + const data: DescriptionTemplateExternalSelectData = { + sources: [], + multipleSelect: false, label: '', - fieldType: DescriptionTemplateFieldType.BOOLEAN_DECISION, - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.CHECK_BOX: { - - const data: DescriptionTemplateCheckBoxData = { - label: '', - fieldType: DescriptionTemplateFieldType.CHECK_BOX, - } - field.data = data; - - break; - } - case DescriptionTemplateFieldType.COMBO_BOX: { - - const firstOption = { label: '', value: '' } as DescriptionTemplateComboBoxOption; - const data: DescriptionTemplateSelectData = { - label: '', - multiList: false, - options: [firstOption], - fieldType: DescriptionTemplateFieldType.SELECT - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.AUTO_COMPLETE: { - - const data: DescriptionTemplateAutoCompleteData = { - autoCompleteSingleDataList: [], - multiAutoComplete: false, - label: '', - fieldType: DescriptionTemplateFieldType.AUTO_COMPLETE - } - field.data = data; - break; - } case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES: { - - const data: DescriptionTemplateDmpAutoCompleteData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.FREE_TEXT: { - - const data: DescriptionTemplateFreeTextData = { - label: '', - fieldType: DescriptionTemplateFieldType.FREE_TEXT + fieldType: type } field.data = data; break; } case DescriptionTemplateFieldType.RADIO_BOX: { - const data: DescriptionTemplateRadioBoxData = { label: '', options: [], - fieldType: DescriptionTemplateFieldType.RADIO_BOX + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.TEXT_AREA: { - - const data: DescriptionTemplateTextAreaData = { + case DescriptionTemplateFieldType.SELECT: { + const firstOption = { label: '', value: '' } as DescriptionTemplateSelectOption; + const data: DescriptionTemplateSelectData = { label: '', - fieldType: DescriptionTemplateFieldType.TEXT_AREA + multipleSelect: false, + options: [firstOption], + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.RICH_TEXT_AREA: { - - const data: DescriptionTemplateRichTextAreaData = { + case DescriptionTemplateFieldType.BOOLEAN_DECISION: + case DescriptionTemplateFieldType.CHECK_BOX: + case DescriptionTemplateFieldType.FREE_TEXT: + case DescriptionTemplateFieldType.TEXT_AREA: + case DescriptionTemplateFieldType.RICH_TEXT_AREA: + case DescriptionTemplateFieldType.DATE_PICKER: + case DescriptionTemplateFieldType.TAGS: + case DescriptionTemplateFieldType.DATASET_IDENTIFIER: + case DescriptionTemplateFieldType.CURRENCY: + case DescriptionTemplateFieldType.VALIDATION: { + const data: DescriptionTemplateLabelData = { label: '', - fieldType: DescriptionTemplateFieldType.RICH_TEXT_AREA + fieldType: type } field.data = data; + break; } - case DescriptionTemplateFieldType.UPLOAD: { - - const data: DescriptionTemplateUploadData = { + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS: + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS: + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DATASETS: + case DescriptionTemplateFieldType.EXTERNAL_DATASETS: + case DescriptionTemplateFieldType.DATA_REPOSITORIES: + case DescriptionTemplateFieldType.JOURNAL_REPOSITORIES: + case DescriptionTemplateFieldType.PUB_REPOSITORIES: + case DescriptionTemplateFieldType.LICENSES: + case DescriptionTemplateFieldType.TAXONOMIES: + case DescriptionTemplateFieldType.PUBLICATIONS: + case DescriptionTemplateFieldType.REGISTRIES: + case DescriptionTemplateFieldType.SERVICES: + case DescriptionTemplateFieldType.RESEARCHERS: + case DescriptionTemplateFieldType.ORGANIZATIONS: { + const data: DescriptionTemplateLabelAndMultiplicityData = { label: '', - types: [], - maxFileSizeInMB: this.configurationService.maxFileSizeInMB, - fieldType: DescriptionTemplateFieldType.UPLOAD - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.DATE_PICKER: { - - const data: DescriptionTemplateDatePickerData = { - label: '', - fieldType: DescriptionTemplateFieldType.DATE_PICKER + multipleSelect: false, + fieldType: type } field.data = data; break; } case DescriptionTemplateFieldType.EXTERNAL_DATASETS: { - const data: DescriptionTemplateExternalDatasetData = { label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.EXTERNAL_DATASETS + multipleSelect: false, + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.DATA_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { + case DescriptionTemplateFieldType.UPLOAD: { + const data: DescriptionTemplateUploadData = { label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.PUB_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.JOURNAL_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.TAXONOMIES: { - - const data: DescriptionTemplateTaxonomyData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.TAXONOMIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.LICENSES: { - - const data: DescriptionTemplateLicenseData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.LICENSES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.PUBLICATIONS: { - - const data: DescriptionTemplatePublicationData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.PUBLICATIONS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.REGISTRIES: { - - const data: DescriptionTemplateRegistryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.REGISTRIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.SERVICES: { - - const data: DescriptionTemplateServiceData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.SERVICES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.TAGS: { - - const data: DescriptionTemplateTagData = { - label: '', - fieldType: DescriptionTemplateFieldType.TAGS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.RESEARCHERS: { - - const data: DescriptionTemplateResearcherAutoCompleteData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.ORGANIZATIONS: { - - const data: DescriptionTemplateOrganizationData = { - // autoCompleteSingleDataList: [], //TODO maybe remove - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.ORGANIZATIONS - - }; - field.data = data; - break; - } - case DescriptionTemplateFieldType.DATASET_IDENTIFIER: { - - const data: DescriptionTemplateDatasetIdentifierData = { - label: '', - fieldType: DescriptionTemplateFieldType.DATASET_IDENTIFIER - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.CURRENCY: { - - const data: DescriptionTemplateCurrencyData = { - label: '', - fieldType: DescriptionTemplateFieldType.CURRENCY - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.VALIDATION: { - - const data: DescriptionTemplateValidationData = { - label: '', - fieldType: DescriptionTemplateFieldType.VALIDATION + types: [], + maxFileSizeInMB: this.configurationService.maxFileSizeInMB, + fieldType: type } field.data = data; break; diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.html index 8c4632d20..d6cbb123a 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.html @@ -1,9 +1,9 @@
{{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TITLE' | translate}}
- + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} - {{form.get('data').get('multiAutoComplete').getError('backendError').message}} + {{form.get('data').get('multipleSelect').getError('backendError').message}} @@ -50,20 +50,20 @@ {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-LABEL' | translate}} - - {{singleForm.get('autoCompleteOptions').get('label').getError('backendError').message}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + {{singleForm.get('sourceBinding').get('label').getError('backendError').message}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-VALUE' | translate}} - - {{singleForm.get('autoCompleteOptions').get('value').getError('backendError').message}} + + {{singleForm.get('sourceBinding').get('value').getError('backendError').message}} {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-SOURCE' | translate}} - - {{singleForm.get('autoCompleteOptions').get('source').getError('backendError').message}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + {{singleForm.get('sourceBinding').get('source').getError('backendError').message}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-HAS-AUTH' | translate}}
diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.ts index 2089fa7f3..399292193 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/auto-complete/description-template-editor-auto-complete-field.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { UntypedFormArray, UntypedFormGroup } from '@angular/forms'; -import { DescriptionTemplateAutoCompleteFieldEditorModel } from '../../../description-template-editor.model'; +import { DescriptionTemplateExternalSelectDataEditorModel } from '../../../description-template-editor.model'; @Component({ selector: 'app-description-template-editor-auto-complete-field-component', @@ -13,11 +13,11 @@ export class DescriptionTemplateEditorAutoCompleteFieldComponent implements OnIn multiForm: UntypedFormArray; ngOnInit() { - this.multiForm = (this.form.get('data').get('autoCompleteSingleDataList')); + this.multiForm = (this.form.get('data').get('sources')); } addSource() { - (this.multiForm).push(new DescriptionTemplateAutoCompleteFieldEditorModel().buildForm()); + (this.multiForm).push(new DescriptionTemplateExternalSelectDataEditorModel().buildForm()); } removeSource(index: number) { diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/datasets-auto-complete/dataset-profile-editor-datasets-autocomplete-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/datasets-auto-complete/dataset-profile-editor-datasets-autocomplete-field.component.html index 7801ea8d0..db2accc21 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/datasets-auto-complete/dataset-profile-editor-datasets-autocomplete-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/datasets-auto-complete/dataset-profile-editor-datasets-autocomplete-field.component.html @@ -1,7 +1,7 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/dmps-auto-complete/dataset-profile-editor-dmps-autocomplete-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/dmps-auto-complete/dataset-profile-editor-dmps-autocomplete-field.component.html index 825e863cf..ccea3f6a0 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/dmps-auto-complete/dataset-profile-editor-dmps-autocomplete-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/dmps-auto-complete/dataset-profile-editor-dmps-autocomplete-field.component.html @@ -1,7 +1,7 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/external-datasets/description-template-editor-external-datasets-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/external-datasets/description-template-editor-external-datasets-field.component.html index db5790a8e..2d4f2bf0a 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/external-datasets/description-template-editor-external-datasets-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/external-datasets/description-template-editor-external-datasets-field.component.html @@ -1,7 +1,7 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-EXTERNAL-DATASETS-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/multiplicity-field/description-template-editor-multiplicity-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/multiplicity-field/description-template-editor-multiplicity-field.component.html index be9ef3417..38560ca4a 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/multiplicity-field/description-template-editor-multiplicity-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/multiplicity-field/description-template-editor-multiplicity-field.component.html @@ -1,6 +1,6 @@
- + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html index 9295c3262..f72411c66 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers-auto-complete/dataset-profile-editor-researchers-auto-complete-field.component.html @@ -1,7 +1,7 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html index c9891beb3..007731bf5 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component.html @@ -1,7 +1,7 @@
{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-RESEARCHERS-TITLE' | translate}}
- + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-AUTOCOMPLETE' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.html index 1f6f531f6..6d66f1cff 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.html @@ -8,9 +8,9 @@ {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.ERROR-MESSAGES.FIELD-SELECT-AT-LEAST-ONE-REQUIRED' |translate}}
- + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-MULTIPLE-SELECT' | translate}} - {{form.get('data').get('multiList').getError('backendError').message}} + {{form.get('data').get('multipleSelect').getError('backendError').message}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.ts index 8dd79d5e7..41de6421e 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/select/description-template-editor-select-field.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { UntypedFormArray, UntypedFormGroup } from '@angular/forms'; -import { DescriptionTemplateComboBoxOptionEditorModel } from '../../../description-template-editor.model'; +import { DescriptionTemplateSelectOptionEditorModel } from '../../../description-template-editor.model'; @Component({ selector: 'app-description-template-editor-select-field-component', @@ -15,7 +15,7 @@ export class DescriptionTemplateEditorSelectFieldComponent implements OnInit { } addNewRow() { - const selectOptions: DescriptionTemplateComboBoxOptionEditorModel = new DescriptionTemplateComboBoxOptionEditorModel(); + const selectOptions: DescriptionTemplateSelectOptionEditorModel = new DescriptionTemplateSelectOptionEditorModel(); (this.form.get('data').get('options')).push(selectOptions.buildForm()); } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.html index 318dc9383..29a4040c1 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.html @@ -131,17 +131,25 @@ Publications icon {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.PUBLICATIONS)}} - + Other icon - {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.AUTO_COMPLETE)}} + {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.EXTERNAL_SELECT)}} - + InternalDmpEntities icon - {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.INTERNAL_DMP_ENTRIES)}} + {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.INTERNAL_DMP_ENTRIES_DMPS)}} + + + InternalDmpEntities icon + {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.INTERNAL_DMP_ENTRIES_DATASETS)}} + + + InternalDmpEntities icon + {{enumUtils.toDescriptionTemplateFieldTypeString(descriptionTemplateFieldTypeEnum.INTERNAL_DMP_ENTRIES_RESEARCHERS)}} Tags icon @@ -199,7 +207,7 @@
- + diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.ts index 8a6a6637d..2d80e067d 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field/description-template-editor-field.component.ts @@ -7,31 +7,14 @@ import { MatSlideToggleChange } from '@angular/material/slide-toggle'; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; import { ValidationType } from '@app/core/common/enum/validation-type'; import { - DescriptionTemplateAutoCompleteData, - DescriptionTemplateBooleanDecisionData, - DescriptionTemplateCheckBoxData, - DescriptionTemplateComboBoxOption, - DescriptionTemplateCurrencyData, - DescriptionTemplateDataRepositoryData, - DescriptionTemplateDatasetIdentifierData, - DescriptionTemplateDatePickerData, - DescriptionTemplateDmpAutoCompleteData, DescriptionTemplateExternalDatasetData, - DescriptionTemplateFreeTextData, - DescriptionTemplateLicenseData, - DescriptionTemplateOrganizationData, - DescriptionTemplatePublicationData, + DescriptionTemplateExternalSelectData, + DescriptionTemplateLabelAndMultiplicityData, + DescriptionTemplateLabelData, DescriptionTemplateRadioBoxData, - DescriptionTemplateRegistryData, - DescriptionTemplateResearcherAutoCompleteData, - DescriptionTemplateRichTextAreaData, - DescriptionTemplateServiceData, - DescriptionTemplateTagData, - DescriptionTemplateTaxonomyData, - DescriptionTemplateTextAreaData, - DescriptionTemplateUploadData, - DescriptionTemplateValidationData, - DescriptionTemplateSelectData + DescriptionTemplateSelectData, + DescriptionTemplateSelectOption, + DescriptionTemplateUploadData } from '@app/core/model/description-template/description-template'; import { DescriptionTemplateFieldPersist } from '@app/core/model/description-template/description-template-persist'; import { ConfigurationService } from "@app/core/services/configuration/configuration.service"; @@ -121,7 +104,8 @@ export class DescriptionTemplateEditorFieldComponent extends BaseComponent imple case DescriptionTemplateFieldType.FREE_TEXT: case DescriptionTemplateFieldType.BOOLEAN_DECISION: case DescriptionTemplateFieldType.RADIO_BOX: - case DescriptionTemplateFieldType.COMBO_BOX: + case DescriptionTemplateFieldType.SELECT: + case DescriptionTemplateFieldType.EXTERNAL_SELECT: case DescriptionTemplateFieldType.CHECK_BOX: case DescriptionTemplateFieldType.DATE_PICKER: return true; @@ -131,7 +115,7 @@ export class DescriptionTemplateEditorFieldComponent extends BaseComponent imple onInputTypeChange() { - const x = this.fieldType; + const type = this.fieldType; const field: DescriptionTemplateFieldPersist = this.form.getRawValue(); field.defaultValue = undefined; @@ -139,260 +123,92 @@ export class DescriptionTemplateEditorFieldComponent extends BaseComponent imple field.visibilityRules = []; } - - switch (x) { - case DescriptionTemplateFieldType.BOOLEAN_DECISION: { - - const data: DescriptionTemplateBooleanDecisionData = { + switch (type) { + case DescriptionTemplateFieldType.EXTERNAL_SELECT: { + const data: DescriptionTemplateExternalSelectData = { + sources: [], + multipleSelect: false, label: '', - fieldType: DescriptionTemplateFieldType.BOOLEAN_DECISION, - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.CHECK_BOX: { - - const data: DescriptionTemplateCheckBoxData = { - label: '', - fieldType: DescriptionTemplateFieldType.CHECK_BOX, - } - field.data = data; - - break; - } - case DescriptionTemplateFieldType.SELECT: { - - const firstOption = { label: '', value: '' } as DescriptionTemplateComboBoxOption; - const data: DescriptionTemplateSelectData = { - label: '', - multiList: false, - options: [firstOption], - fieldType: DescriptionTemplateFieldType.SELECT - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.AUTO_COMPLETE: { - - const data: DescriptionTemplateAutoCompleteData = { - autoCompleteSingleDataList: [], - multiAutoComplete: false, - label: '', - fieldType: DescriptionTemplateFieldType.AUTO_COMPLETE - } - field.data = data; - break; - } case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES: { - - const data: DescriptionTemplateDmpAutoCompleteData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.FREE_TEXT: { - - const data: DescriptionTemplateFreeTextData = { - label: '', - fieldType: DescriptionTemplateFieldType.FREE_TEXT + fieldType: type } field.data = data; break; } case DescriptionTemplateFieldType.RADIO_BOX: { - const data: DescriptionTemplateRadioBoxData = { label: '', options: [], - fieldType: DescriptionTemplateFieldType.RADIO_BOX + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.TEXT_AREA: { - - const data: DescriptionTemplateTextAreaData = { + case DescriptionTemplateFieldType.SELECT: { + const firstOption = { label: '', value: '' } as DescriptionTemplateSelectOption; + const data: DescriptionTemplateSelectData = { label: '', - fieldType: DescriptionTemplateFieldType.TEXT_AREA + multipleSelect: false, + options: [firstOption], + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.RICH_TEXT_AREA: { - - const data: DescriptionTemplateRichTextAreaData = { + case DescriptionTemplateFieldType.BOOLEAN_DECISION: + case DescriptionTemplateFieldType.CHECK_BOX: + case DescriptionTemplateFieldType.FREE_TEXT: + case DescriptionTemplateFieldType.TEXT_AREA: + case DescriptionTemplateFieldType.RICH_TEXT_AREA: + case DescriptionTemplateFieldType.DATE_PICKER: + case DescriptionTemplateFieldType.TAGS: + case DescriptionTemplateFieldType.DATASET_IDENTIFIER: + case DescriptionTemplateFieldType.CURRENCY: + case DescriptionTemplateFieldType.VALIDATION: { + const data: DescriptionTemplateLabelData = { label: '', - fieldType: DescriptionTemplateFieldType.RICH_TEXT_AREA + fieldType: type } field.data = data; + break; } - case DescriptionTemplateFieldType.UPLOAD: { - - const data: DescriptionTemplateUploadData = { + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS: + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS: + case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DATASETS: + case DescriptionTemplateFieldType.EXTERNAL_DATASETS: + case DescriptionTemplateFieldType.DATA_REPOSITORIES: + case DescriptionTemplateFieldType.JOURNAL_REPOSITORIES: + case DescriptionTemplateFieldType.PUB_REPOSITORIES: + case DescriptionTemplateFieldType.LICENSES: + case DescriptionTemplateFieldType.TAXONOMIES: + case DescriptionTemplateFieldType.PUBLICATIONS: + case DescriptionTemplateFieldType.REGISTRIES: + case DescriptionTemplateFieldType.SERVICES: + case DescriptionTemplateFieldType.RESEARCHERS: + case DescriptionTemplateFieldType.ORGANIZATIONS: { + const data: DescriptionTemplateLabelAndMultiplicityData = { label: '', - types: [], - maxFileSizeInMB: this.configurationService.maxFileSizeInMB, - fieldType: DescriptionTemplateFieldType.UPLOAD - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.DATE_PICKER: { - - const data: DescriptionTemplateDatePickerData = { - label: '', - fieldType: DescriptionTemplateFieldType.DATE_PICKER + multipleSelect: false, + fieldType: type } field.data = data; break; } case DescriptionTemplateFieldType.EXTERNAL_DATASETS: { - const data: DescriptionTemplateExternalDatasetData = { label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.EXTERNAL_DATASETS + multipleSelect: false, + fieldType: type } field.data = data; break; } - case DescriptionTemplateFieldType.DATA_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { + case DescriptionTemplateFieldType.UPLOAD: { + const data: DescriptionTemplateUploadData = { label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.PUB_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.JOURNAL_REPOSITORIES: { - - const data: DescriptionTemplateDataRepositoryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.DATA_REPOSITORIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.TAXONOMIES: { - - const data: DescriptionTemplateTaxonomyData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.TAXONOMIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.LICENSES: { - - const data: DescriptionTemplateLicenseData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.LICENSES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.PUBLICATIONS: { - - const data: DescriptionTemplatePublicationData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.PUBLICATIONS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.REGISTRIES: { - - const data: DescriptionTemplateRegistryData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.REGISTRIES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.SERVICES: { - - const data: DescriptionTemplateServiceData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.SERVICES - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.TAGS: { - - const data: DescriptionTemplateTagData = { - label: '', - fieldType: DescriptionTemplateFieldType.TAGS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.RESEARCHERS: { - - const data: DescriptionTemplateResearcherAutoCompleteData = { - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.RESEARCHERS - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.ORGANIZATIONS: { - - const data: DescriptionTemplateOrganizationData = { - // autoCompleteSingleDataList: [], //TODO maybe remove - label: '', - multiAutoComplete: false, - fieldType: DescriptionTemplateFieldType.ORGANIZATIONS - - }; - field.data = data; - break; - } - case DescriptionTemplateFieldType.DATASET_IDENTIFIER: { - - const data: DescriptionTemplateDatasetIdentifierData = { - label: '', - fieldType: DescriptionTemplateFieldType.DATASET_IDENTIFIER - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.CURRENCY: { - - const data: DescriptionTemplateCurrencyData = { - label: '', - fieldType: DescriptionTemplateFieldType.CURRENCY - } - field.data = data; - break; - } - case DescriptionTemplateFieldType.VALIDATION: { - - const data: DescriptionTemplateValidationData = { - label: '', - fieldType: DescriptionTemplateFieldType.VALIDATION + types: [], + maxFileSizeInMB: this.configurationService.maxFileSizeInMB, + fieldType: type } field.data = data; break; diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html index cc4e92f5c..3427367a0 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html @@ -19,12 +19,7 @@
- - -
- -
@@ -50,9 +45,6 @@
- - - 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 bdb36ac5f..e314e7b01 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 @@ -432,47 +432,51 @@ export class DescriptionTemplateEditorComponent extends BaseEditor { - result.push({ + + const page = { id: pageElement.get('id').value, label: pageElement.get('title').value, type: ToCEntryType.Page, form: pageElement, numbering: (i + 1).toString(), - subEntriesType: ToCEntryType.Section - } as ToCEntry) - }); - - // build first level sections - (this.formGroup.get('definition').get('sections') as UntypedFormArray).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 = []; - - const item = { - id: sectionElement.get('id').value, - label: sectionElement.get('title').value, - type: ToCEntryType.Section, - form: sectionElement, - numbering: pageToAdd.numbering + '.' + (pageToAdd.subEntries.length + 1) + subEntriesType: ToCEntryType.Section, + subEntries: [] } as ToCEntry; - const sectionItems = this.populateSections(sectionElement.get('sections') as UntypedFormArray, item.numbering); - const fieldSetItems = this.populateFieldSets(sectionElement.get('fieldSets') as UntypedFormArray, item.numbering); - if (sectionItems != null) { - item.subEntries = sectionItems; - item.subEntriesType = ToCEntryType.Section; - } - if (fieldSetItems != null) { - if (item.subEntries == null) { - item.subEntries = fieldSetItems; - } else { - item.subEntries.push(...fieldSetItems); + + const subEntries = []; + (pageElement.get('sections') as UntypedFormArray).controls.forEach((sectionElement, i) => { + + const item = { + id: sectionElement.get('id').value, + label: sectionElement.get('title').value, + type: ToCEntryType.Section, + form: sectionElement, + numbering: page.numbering + '.' + (subEntries.length + 1) + } as ToCEntry; + const sectionItems = this.populateSections(sectionElement.get('sections') as UntypedFormArray, item.numbering); + const fieldSetItems = this.populateFieldSets(sectionElement.get('fieldSets') as UntypedFormArray, item.numbering); + + if (sectionItems != null) { + item.subEntries = sectionItems; + item.subEntriesType = ToCEntryType.Section; } - item.subEntriesType = ToCEntryType.FieldSet; - } - pageToAdd.subEntries.push(item); + if (fieldSetItems != null) { + if (item.subEntries == null) { + item.subEntries = fieldSetItems; + } else { + item.subEntries.push(...fieldSetItems); + } + item.subEntriesType = ToCEntryType.FieldSet; + } + subEntries.push(item); + }); + + page.subEntries = subEntries; + result.push(page); }); + this._sortToCentries(result);//ordeby ordinal this._updateNumbering(result, '');//update nubering if needed return result; @@ -555,7 +559,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor x.get('id')?.value === parent.id).get('sections') as UntypedFormArray; try { - const max = sectionsArray.controls.filter(control => control.get('page').value === parent.id) - .map(control => control.get('ordinal').value) + const max = sectionsArray.controls.map(control => control.get('ordinal').value) .reduce((a, b) => Math.max(a, b)); section.ordinal = max + 1; @@ -612,7 +612,6 @@ export class DescriptionTemplateEditorComponent extends BaseEditor control.get('ordinal').value).reduce((a, b) => Math.max(a, b)); section.ordinal = maxOrdinal + 1; @@ -640,9 +639,11 @@ export class DescriptionTemplateEditorComponent extends BaseEditor -1 ){ + } + if (sectionIndex > -1) { //create one field form fieldset const field: DescriptionTemplateFieldEditorModel = new DescriptionTemplateFieldEditorModel(this.editorModel.validationErrorModel); field.id = Guid.create().toString(); @@ -665,7 +667,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor UserDescriptionTemplateEditorModel.reapplyValidators({ formGroup: control as UntypedFormGroup, @@ -202,7 +195,6 @@ export class UserDescriptionTemplateEditorModel implements UserDescriptionTempla export class DescriptionTemplateDefinitionEditorModel implements DescriptionTemplateDefinitionPersist { pages: DescriptionTemplatePageEditorModel[] = []; - sections: DescriptionTemplateSectionEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -213,7 +205,6 @@ export class DescriptionTemplateDefinitionEditorModel implements DescriptionTemp public fromModel(item: DescriptionTemplateDefinition): DescriptionTemplateDefinitionEditorModel { if (item) { if (item.pages) { item.pages.map(x => this.pages.push(new DescriptionTemplatePageEditorModel(this.validationErrorModel).fromModel(x))); } - if (item.sections) { item.sections.map(x => this.sections.push(new DescriptionTemplateSectionEditorModel(this.validationErrorModel).fromModel(x))); } } return this; } @@ -241,15 +232,6 @@ export class DescriptionTemplateDefinitionEditorModel implements DescriptionTemp }), context.getValidation('pages') ) ), - sections: this.formBuilder.array( - (this.sections ?? []).map( - (item, index) => new DescriptionTemplateSectionEditorModel( - this.validationErrorModel - ).fromModel(item).buildForm({ - rootPath: `${rootPath}sections[${index}].` - }), context.getValidation('sections') - ) - ), }); } @@ -262,7 +244,6 @@ export class DescriptionTemplateDefinitionEditorModel implements DescriptionTemp const baseContext: ValidationContext = new ValidationContext(); const baseValidationArray: Validation[] = new Array(); baseValidationArray.push({ key: 'pages', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}pages`)] }); - baseValidationArray.push({ key: 'sections', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}sections`)] }); baseContext.validation = baseValidationArray; return baseContext; @@ -283,27 +264,13 @@ export class DescriptionTemplateDefinitionEditorModel implements DescriptionTemp ); } - static reapplySectionsValidators(params: { - formArray: UntypedFormArray, - validationErrorModel: ValidationErrorModel, - rootPath: string - }): void { - const { validationErrorModel, rootPath, formArray } = params; - formArray?.controls?.forEach( - (control, index) => DescriptionTemplateSectionEditorModel.reapplyValidators({ - formGroup: control as UntypedFormGroup, - rootPath: `${rootPath}sections[${index}].`, - validationErrorModel: validationErrorModel - }) - ); - } - } export class DescriptionTemplatePageEditorModel implements DescriptionTemplatePagePersist { id: string; ordinal: number; title: string; + sections: DescriptionTemplateSectionEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -316,6 +283,7 @@ export class DescriptionTemplatePageEditorModel implements DescriptionTemplatePa this.id = item.id; this.ordinal = item.ordinal; this.title = item.title; + if (item.sections) { item.sections.map(x => this.sections.push(new DescriptionTemplateSectionEditorModel(this.validationErrorModel).fromModel(x))); } } return this; } @@ -336,7 +304,16 @@ export class DescriptionTemplatePageEditorModel implements DescriptionTemplatePa return this.formBuilder.group({ id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], ordinal: [{ value: this.ordinal, disabled: disabled }, context.getValidation('ordinal').validators], - title: [{ value: this.title, disabled: disabled }, context.getValidation('title').validators] + title: [{ value: this.title, disabled: disabled }, context.getValidation('title').validators], + sections: this.formBuilder.array( + (this.sections ?? []).map( + (item, index) => new DescriptionTemplateSectionEditorModel( + this.validationErrorModel + ).fromModel(item).buildForm({ + rootPath: `${rootPath}sections[${index}].` + }), context.getValidation('sections') + ) + ), }); } @@ -351,11 +328,21 @@ export class DescriptionTemplatePageEditorModel implements DescriptionTemplatePa baseValidationArray.push({ key: 'id', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}id`)] }); baseValidationArray.push({ key: 'ordinal', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}ordinal`)] }); baseValidationArray.push({ key: 'title', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}title`)] }); + baseValidationArray.push({ key: 'sections', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}sections`)] }); baseContext.validation = baseValidationArray; return baseContext; } + static reapplySectionsValidators(params: { + formArray: UntypedFormArray, + validationErrorModel: ValidationErrorModel, + rootPath: string + }): void { + const { validationErrorModel, rootPath, formArray } = params; + + } + static reapplyValidators(params: { formGroup: UntypedFormGroup, validationErrorModel: ValidationErrorModel, @@ -368,6 +355,14 @@ export class DescriptionTemplatePageEditorModel implements DescriptionTemplatePa validationErrorModel }); + (formGroup.get('sections') as FormArray)?.controls?.forEach( + (control, index) => DescriptionTemplateSectionEditorModel.reapplyValidators({ + formGroup: control as UntypedFormGroup, + rootPath: `${rootPath}sections[${index}].`, + validationErrorModel: validationErrorModel + }) + ); + ['id', 'ordinal', 'title'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); @@ -382,10 +377,9 @@ export class DescriptionTemplateSectionEditorModel implements DescriptionTemplat ordinal: number; defaultVisibility: boolean = false; // TODO: check if used and remove multiplicity: boolean = false; - page: string; title: string; description: string; - sections?: DescriptionTemplateSectionEditorModel[] = []; + sections: DescriptionTemplateSectionEditorModel[] = []; fieldSets: DescriptionTemplateFieldSetEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -400,7 +394,6 @@ export class DescriptionTemplateSectionEditorModel implements DescriptionTemplat this.ordinal = item.ordinal; this.defaultVisibility = item.defaultVisibility; this.multiplicity = item.multiplicity; - this.page = item.page; this.title = item.title; this.description = item.description; if (item.sections) { item.sections.map(x => this.sections.push(new DescriptionTemplateSectionEditorModel(this.validationErrorModel).fromModel(x))); } @@ -427,7 +420,6 @@ export class DescriptionTemplateSectionEditorModel implements DescriptionTemplat ordinal: [{ value: this.ordinal, disabled: disabled }, context.getValidation('ordinal').validators], defaultVisibility: [{ value: this.defaultVisibility, disabled: disabled }, context.getValidation('defaultVisibility').validators], multiplicity: [{ value: this.multiplicity, disabled: disabled }, context.getValidation('multiplicity').validators], - page: [{ value: this.page, disabled: disabled }, context.getValidation('page').validators], title: [{ value: this.title, disabled: disabled }, context.getValidation('title').validators], description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], sections: this.formBuilder.array( @@ -463,7 +455,6 @@ export class DescriptionTemplateSectionEditorModel implements DescriptionTemplat baseValidationArray.push({ key: 'ordinal', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}ordinal`)] }); baseValidationArray.push({ key: 'defaultVisibility', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}defaultVisibility`)] }); baseValidationArray.push({ key: 'multiplicity', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}multiplicity`)] }); - baseValidationArray.push({ key: 'page', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}page`)] }); baseValidationArray.push({ key: 'title', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}title`)] }); baseValidationArray.push({ key: 'description', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}description`)] }); baseValidationArray.push({ key: 'sections', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}sections`)] }); @@ -731,7 +722,7 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF visibilityRules: DescriptionTemplateRuleEditorModel[] = []; validations: DescriptionTemplateFieldValidationType[] = []; includeInExport: boolean = false; - data: DescriptionTemplateBaseFieldEditorModel = new DescriptionTemplateBaseFieldEditorModel(); + data: DescriptionTemplateLabelDataEditorModel = new DescriptionTemplateLabelDataEditorModel(); protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -809,10 +800,10 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF return baseContext; } - private getFieldEditorModel(fieldType: DescriptionTemplateFieldType): DescriptionTemplateBaseFieldEditorModel { + private getFieldEditorModel(fieldType: DescriptionTemplateFieldType): DescriptionTemplateLabelDataEditorModel { switch (fieldType) { - case DescriptionTemplateFieldType.AUTO_COMPLETE: - return new DescriptionTemplateAutoCompleteFieldEditorModel(this.validationErrorModel); + case DescriptionTemplateFieldType.EXTERNAL_SELECT: + return new DescriptionTemplateExternalSelectDataEditorModel(this.validationErrorModel); case DescriptionTemplateFieldType.RADIO_BOX: return new DescriptionTemplateRadioBoxFieldEditorModel(this.validationErrorModel); case DescriptionTemplateFieldType.SELECT: @@ -827,7 +818,7 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF case DescriptionTemplateFieldType.DATASET_IDENTIFIER: case DescriptionTemplateFieldType.CURRENCY: case DescriptionTemplateFieldType.VALIDATION: - return new DescriptionTemplateBaseFieldEditorModel(this.validationErrorModel); + return new DescriptionTemplateLabelDataEditorModel(this.validationErrorModel); case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_RESEARCHERS: case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DMPS: case DescriptionTemplateFieldType.INTERNAL_DMP_ENTRIES_DATASETS: @@ -842,7 +833,7 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF case DescriptionTemplateFieldType.SERVICES: case DescriptionTemplateFieldType.RESEARCHERS: case DescriptionTemplateFieldType.ORGANIZATIONS: - return new DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel(this.validationErrorModel); + return new DescriptionTemplateLabelAndMultiplicityFieldEditorModel(this.validationErrorModel); case DescriptionTemplateFieldType.EXTERNAL_DATASETS: return new DescriptionTemplateExternalDatasetFieldEditorModel(this.validationErrorModel); case DescriptionTemplateFieldType.UPLOAD: @@ -868,7 +859,7 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF control?.addValidators(context.getValidation(keyField).validators); }); - DescriptionTemplateBaseFieldEditorModel.reapplyBaseFieldValidators({ + DescriptionTemplateLabelDataEditorModel.reapplyBaseFieldValidators({ formGroup: formGroup?.get('data') as UntypedFormGroup, rootPath: `${rootPath}data.`, validationErrorModel: validationErrorModel @@ -884,7 +875,7 @@ export class DescriptionTemplateFieldEditorModel implements DescriptionTemplateF } } -export class DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplateBaseFieldDataPersist { +export class DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateLabelDataPersist { label: string; fieldType: DescriptionTemplateFieldType; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -893,7 +884,7 @@ export class DescriptionTemplateBaseFieldEditorModel implements DescriptionTempl public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { } - fromModel(item: DescriptionTemplateBaseFieldDataPersist): DescriptionTemplateBaseFieldEditorModel { + fromModel(item: DescriptionTemplateLabelData): DescriptionTemplateLabelDataEditorModel { if (item) { this.label = item.label; this.fieldType = item.fieldType; @@ -908,7 +899,7 @@ export class DescriptionTemplateBaseFieldEditorModel implements DescriptionTempl }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplateBaseFieldEditorModel.createValidationContext({ + context = DescriptionTemplateLabelDataEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); @@ -942,7 +933,7 @@ export class DescriptionTemplateBaseFieldEditorModel implements DescriptionTempl }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplateBaseFieldEditorModel.createValidationContext({ + const context = DescriptionTemplateLabelDataEditorModel.createValidationContext({ rootPath, validationErrorModel }); @@ -955,18 +946,18 @@ export class DescriptionTemplateBaseFieldEditorModel implements DescriptionTempl } } -export class DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel extends DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplatePlaceholderAndMultiplicityDataPersist { - multiAutoComplete: boolean; +export class DescriptionTemplateLabelAndMultiplicityFieldEditorModel extends DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateLabelAndMultiplicityDataPersist { + multipleSelect: boolean; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); constructor( public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { super(validationErrorModel); } - fromModel(item: DescriptionTemplatePlaceholderAndMultiplicityDataPersist): DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel { + fromModel(item: DescriptionTemplateLabelAndMultiplicityDataPersist): DescriptionTemplateLabelAndMultiplicityFieldEditorModel { if (item) { super.fromModel(item); - this.multiAutoComplete = item.multiAutoComplete; + this.multipleSelect = item.multipleSelect; } return this; } @@ -978,14 +969,14 @@ export class DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel exten }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel.createValidationContext({ + context = DescriptionTemplateLabelAndMultiplicityFieldEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); } const formGroup = super.buildForm({ context, disabled, rootPath }); - formGroup.setControl('multiAutoComplete', new FormControl({ value: this.multiAutoComplete, disabled: disabled }, context.getValidation('multiAutoComplete').validators)); + formGroup.setControl('multipleSelect', new FormControl({ value: this.multipleSelect, disabled: disabled }, context.getValidation('multipleSelect').validators)); return formGroup; } @@ -995,7 +986,7 @@ export class DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel exten }): ValidationContext { const { rootPath = '', validationErrorModel } = params; const baseContext: ValidationContext = super.createValidationContext({ rootPath, validationErrorModel }); - baseContext.validation.push({ key: 'multiAutoComplete', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}multiAutoComplete`)] }); + baseContext.validation.push({ key: 'multipleSelect', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}multipleSelect`)] }); return baseContext; } @@ -1006,12 +997,12 @@ export class DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel exten }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel.createValidationContext({ + const context = DescriptionTemplateLabelAndMultiplicityFieldEditorModel.createValidationContext({ rootPath, validationErrorModel }); - ['multiAutoComplete'].forEach(keyField => { + ['multipleSelect'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); control?.addValidators(context.getValidation(keyField).validators); @@ -1024,7 +1015,7 @@ export class DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel exten // External Dataset Field // // -export class DescriptionTemplateExternalDatasetFieldEditorModel extends DescriptionTemplatePlaceholderAndMultiplicityFieldEditorModel implements DescriptionTemplateExternalDatasetDataPersist { +export class DescriptionTemplateExternalDatasetFieldEditorModel extends DescriptionTemplateLabelAndMultiplicityFieldEditorModel implements DescriptionTemplateExternalDatasetDataPersist { type: DescriptionTemplateFieldDataExternalDatasetType; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -1091,23 +1082,23 @@ export class DescriptionTemplateExternalDatasetFieldEditorModel extends Descript // // -// Autocomplete Field +// External Select Field // // -export class DescriptionTemplateAutoCompleteFieldEditorModel extends DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplateAutoCompleteDataPersist { - multiAutoComplete: boolean; - autoCompleteSingleDataList: DescriptionTemplateAutoCompleteSingleDataEditorModel[] = []; +export class DescriptionTemplateExternalSelectDataEditorModel extends DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateExternalSelectDataPersist { + multipleSelect: boolean; + sources: DescriptionTemplateExternalSelectSourceEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); constructor( public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { super(validationErrorModel); } - fromModel(item: DescriptionTemplateAutoCompleteDataPersist): DescriptionTemplateAutoCompleteFieldEditorModel { + fromModel(item: DescriptionTemplateExternalSelectDataPersist): DescriptionTemplateExternalSelectDataEditorModel { if (item) { super.fromModel(item); - this.multiAutoComplete = item.multiAutoComplete; - if (item.autoCompleteSingleDataList) { item.autoCompleteSingleDataList.map(x => this.autoCompleteSingleDataList.push(new DescriptionTemplateAutoCompleteSingleDataEditorModel(this.validationErrorModel).fromModel(x))); } + this.multipleSelect = item.multipleSelect; + if (item.sources) { item.sources.map(x => this.sources.push(new DescriptionTemplateExternalSelectSourceEditorModel(this.validationErrorModel).fromModel(x))); } } return this; } @@ -1119,21 +1110,21 @@ export class DescriptionTemplateAutoCompleteFieldEditorModel extends Description }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplateAutoCompleteFieldEditorModel.createValidationContext({ + context = DescriptionTemplateExternalSelectDataEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); } const formGroup = super.buildForm({ context, disabled, rootPath }); - formGroup.setControl('multiAutoComplete', new FormControl({ value: this.multiAutoComplete, disabled: disabled }, context.getValidation('multiAutoComplete').validators)); - formGroup.setControl('autoCompleteSingleDataList', this.formBuilder.array( - (this.autoCompleteSingleDataList ?? []).map( - (item, index) => new DescriptionTemplateAutoCompleteSingleDataEditorModel( + formGroup.setControl('multipleSelect', new FormControl({ value: this.multipleSelect, disabled: disabled }, context.getValidation('multipleSelect').validators)); + formGroup.setControl('sources', this.formBuilder.array( + (this.sources ?? []).map( + (item, index) => new DescriptionTemplateExternalSelectSourceEditorModel( this.validationErrorModel ).fromModel(item).buildForm({ - rootPath: `${rootPath}autoCompleteSingleDataList[${index}].` - }), context.getValidation('autoCompleteSingleDataList') + rootPath: `${rootPath}sources[${index}].` + }), context.getValidation('sources') ))); return formGroup; } @@ -1144,8 +1135,8 @@ export class DescriptionTemplateAutoCompleteFieldEditorModel extends Description }): ValidationContext { const { rootPath = '', validationErrorModel } = params; const baseContext: ValidationContext = super.createValidationContext({ rootPath, validationErrorModel }); - baseContext.validation.push({ key: 'multiAutoComplete', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}multiAutoComplete`)] }); - baseContext.validation.push({ key: 'autoCompleteSingleDataList', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}autoCompleteSingleDataList`)] }); + baseContext.validation.push({ key: 'multipleSelect', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}multipleSelect`)] }); + baseContext.validation.push({ key: 'sources', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}sources`)] }); return baseContext; } @@ -1156,21 +1147,21 @@ export class DescriptionTemplateAutoCompleteFieldEditorModel extends Description }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplateAutoCompleteFieldEditorModel.createValidationContext({ + const context = DescriptionTemplateExternalSelectDataEditorModel.createValidationContext({ rootPath, validationErrorModel }); - ['multiAutoComplete'].forEach(keyField => { + ['multipleSelect'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); control?.addValidators(context.getValidation(keyField).validators); }); (formGroup.get('options') as FormArray).controls?.forEach( - (control, index) => DescriptionTemplateAutoCompleteSingleDataEditorModel.reapplyValidators({ + (control, index) => DescriptionTemplateExternalSelectSourceEditorModel.reapplyValidators({ formGroup: control as UntypedFormGroup, - rootPath: `${rootPath}autoCompleteSingleDataList[${index}].`, + rootPath: `${rootPath}sources[${index}].`, validationErrorModel: validationErrorModel } ) @@ -1178,28 +1169,26 @@ export class DescriptionTemplateAutoCompleteFieldEditorModel extends Description } } -export class DescriptionTemplateAutoCompleteSingleDataEditorModel implements DescriptionTemplateAutoCompleteSingleDataPersist { - autocompleteType: DescriptionTemplateFieldAutocompleteType; +export class DescriptionTemplateExternalSelectSourceEditorModel implements DescriptionTemplateExternalSelectSourcePersist { url: string; - autoCompleteOptions: DescriptionTemplateComboBoxOptionEditorModel = new DescriptionTemplateComboBoxOptionEditorModel(); - optionsRoot: string; - hasAuth: boolean; - auth: DescriptionTemplateAuthAutoCompleteDataEditorModel = new DescriptionTemplateAuthAutoCompleteDataEditorModel(); method: string; + optionsRoot: string; + sourceBinding: DescriptionTemplateExternalSelectSourceBindingEditorModel = new DescriptionTemplateExternalSelectSourceBindingEditorModel(); + hasAuth: boolean; + auth: DescriptionTemplateExternalSelectAuthDataEditorModel = new DescriptionTemplateExternalSelectAuthDataEditorModel(); protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); constructor( public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { } - fromModel(item: DescriptionTemplateAutoCompleteSingleDataPersist): DescriptionTemplateAutoCompleteSingleDataEditorModel { + fromModel(item: DescriptionTemplateExternalSelectSourcePersist): DescriptionTemplateExternalSelectSourceEditorModel { if (item) { - this.autocompleteType = item.autocompleteType; this.url = item.url; - this.autoCompleteOptions = new DescriptionTemplateComboBoxOptionEditorModel(this.validationErrorModel).fromModel(item.autoCompleteOptions); + this.sourceBinding = new DescriptionTemplateExternalSelectSourceBindingEditorModel(this.validationErrorModel).fromModel(item.sourceBinding); this.optionsRoot = item.optionsRoot; this.hasAuth = item.hasAuth; - this.auth = new DescriptionTemplateAuthAutoCompleteDataEditorModel(this.validationErrorModel).fromModel(item.auth); + this.auth = new DescriptionTemplateExternalSelectAuthDataEditorModel(this.validationErrorModel).fromModel(item.auth); this.method = item.method; } return this; @@ -1212,20 +1201,19 @@ export class DescriptionTemplateAutoCompleteSingleDataEditorModel implements Des }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplateAutoCompleteSingleDataEditorModel.createValidationContext({ + context = DescriptionTemplateExternalSelectSourceEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); } return this.formBuilder.group({ - autocompleteType: [{ value: this.autocompleteType, disabled: disabled }, context.getValidation('autocompleteType').validators], url: [{ value: this.url, disabled: disabled }, context.getValidation('url').validators], optionsRoot: [{ value: this.optionsRoot, disabled: disabled }, context.getValidation('optionsRoot').validators], hasAuth: [{ value: this.hasAuth, disabled: disabled }, context.getValidation('hasAuth').validators], method: [{ value: this.method, disabled: disabled }, context.getValidation('method').validators], - autoCompleteOptions: this.autoCompleteOptions.buildForm({ - rootPath: `${rootPath}autoCompleteOptions.` + sourceBinding: this.sourceBinding.buildForm({ + rootPath: `${rootPath}sourceBinding.` }), auth: this.auth.buildForm({ rootPath: `${rootPath}auth.` @@ -1241,7 +1229,6 @@ export class DescriptionTemplateAutoCompleteSingleDataEditorModel implements Des const baseContext: ValidationContext = new ValidationContext(); const baseValidationArray: Validation[] = new Array(); - baseValidationArray.push({ key: 'autocompleteType', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}autocompleteType`)] }); baseValidationArray.push({ key: 'url', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}url`)] }); baseValidationArray.push({ key: 'optionsRoot', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}optionsRoot`)] }); baseValidationArray.push({ key: 'hasAuth', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}hasAuth`)] }); @@ -1262,24 +1249,24 @@ export class DescriptionTemplateAutoCompleteSingleDataEditorModel implements Des }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplateAutoCompleteSingleDataEditorModel.createValidationContext({ + const context = DescriptionTemplateExternalSelectSourceEditorModel.createValidationContext({ rootPath, validationErrorModel }); - ['autocompleteType', 'url', 'optionsRoot', 'hasAuth', 'method'].forEach(keyField => { + ['url', 'optionsRoot', 'hasAuth', 'method'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); control?.addValidators(context.getValidation(keyField).validators); }); - DescriptionTemplateComboBoxOptionEditorModel.reapplyValidators({ - formGroup: formGroup?.get('autoCompleteOptions') as UntypedFormGroup, - rootPath: `${rootPath}autoCompleteOptions.`, + DescriptionTemplateExternalSelectSourceBindingEditorModel.reapplyValidators({ + formGroup: formGroup?.get('sourceBinding') as UntypedFormGroup, + rootPath: `${rootPath}sourceBinding.`, validationErrorModel: validationErrorModel }); - DescriptionTemplateComboBoxOptionEditorModel.reapplyValidators({ + DescriptionTemplateExternalSelectAuthDataEditorModel.reapplyValidators({ formGroup: formGroup?.get('auth') as UntypedFormGroup, rootPath: `${rootPath}auth.`, validationErrorModel: validationErrorModel @@ -1288,23 +1275,19 @@ export class DescriptionTemplateAutoCompleteSingleDataEditorModel implements Des } } -export class DescriptionTemplateComboBoxOptionEditorModel implements DescriptionTemplateComboBoxOptionPersist { +export class DescriptionTemplateSelectOptionEditorModel implements DescriptionTemplateSelectOptionPersist { label: string; value: string; - source: string; - uri: string; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); constructor( public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { } - fromModel(item: DescriptionTemplateComboBoxOptionPersist): DescriptionTemplateComboBoxOptionEditorModel { + fromModel(item: DescriptionTemplateSelectOptionPersist): DescriptionTemplateSelectOptionEditorModel { if (item) { this.label = item.label; this.value = item.value; - this.source = item.source; - this.uri = item.uri; } return this; } @@ -1316,7 +1299,80 @@ export class DescriptionTemplateComboBoxOptionEditorModel implements Description }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplateComboBoxOptionEditorModel.createValidationContext({ + context = DescriptionTemplateSelectOptionEditorModel.createValidationContext({ + validationErrorModel: this.validationErrorModel, + rootPath + }); + } + + return this.formBuilder.group({ + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + value: [{ value: this.value, disabled: disabled }, context.getValidation('value').validators], + }); + } + + static createValidationContext(params: { + rootPath?: string, + validationErrorModel: ValidationErrorModel + }): ValidationContext { + const { rootPath = '', validationErrorModel } = params; + + const baseContext: ValidationContext = new ValidationContext(); + const baseValidationArray: Validation[] = new Array(); + baseValidationArray.push({ key: 'label', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}label`)] }); + baseValidationArray.push({ key: 'value', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}value`)] }); + + baseContext.validation = baseValidationArray; + return baseContext; + } + + static reapplyValidators(params: { + formGroup: UntypedFormGroup, + validationErrorModel: ValidationErrorModel, + rootPath: string + }): void { + + const { formGroup, rootPath, validationErrorModel } = params; + const context = DescriptionTemplateSelectOptionEditorModel.createValidationContext({ + rootPath, + validationErrorModel + }); + + ['label', 'value'].forEach(keyField => { + const control = formGroup?.get(keyField); + control?.clearValidators(); + control?.addValidators(context.getValidation(keyField).validators); + }) + } +} + +export class DescriptionTemplateExternalSelectSourceBindingEditorModel implements DescriptionTemplateExternalSelectSourceBindingPersist { + label: string; + value: string; + source: string; + protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); + + constructor( + public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() + ) { } + + fromModel(item: DescriptionTemplateExternalSelectSourceBinding): DescriptionTemplateExternalSelectSourceBindingEditorModel { + if (item) { + this.label = item.label; + this.value = item.value; + this.source = item.source; + } + return this; + } + + buildForm(params?: { + context?: ValidationContext, + disabled?: boolean, + rootPath?: string + }): UntypedFormGroup { + let { context = null, disabled = false, rootPath } = params ?? {} + if (context == null) { + context = DescriptionTemplateExternalSelectSourceBindingEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); @@ -1326,7 +1382,6 @@ export class DescriptionTemplateComboBoxOptionEditorModel implements Description label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], value: [{ value: this.value, disabled: disabled }, context.getValidation('value').validators], source: [{ value: this.source, disabled: disabled }, context.getValidation('source').validators], - uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], }); } @@ -1341,7 +1396,6 @@ export class DescriptionTemplateComboBoxOptionEditorModel implements Description baseValidationArray.push({ key: 'label', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}label`)] }); baseValidationArray.push({ key: 'value', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}value`)] }); baseValidationArray.push({ key: 'source', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}source`)] }); - baseValidationArray.push({ key: 'uri', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}uri`)] }); baseContext.validation = baseValidationArray; return baseContext; @@ -1354,12 +1408,12 @@ export class DescriptionTemplateComboBoxOptionEditorModel implements Description }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplateComboBoxOptionEditorModel.createValidationContext({ + const context = DescriptionTemplateExternalSelectSourceBindingEditorModel.createValidationContext({ rootPath, validationErrorModel }); - ['label', 'value', 'source', 'uri'].forEach(keyField => { + ['label', 'value', 'source'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); control?.addValidators(context.getValidation(keyField).validators); @@ -1367,7 +1421,7 @@ export class DescriptionTemplateComboBoxOptionEditorModel implements Description } } -export class DescriptionTemplateAuthAutoCompleteDataEditorModel implements DescriptionTemplateAuthAutoCompleteDataPersist { +export class DescriptionTemplateExternalSelectAuthDataEditorModel implements DescriptionTemplateExternalSelectAuthDataPersist { url: string; method: string; body: string; @@ -1379,7 +1433,7 @@ export class DescriptionTemplateAuthAutoCompleteDataEditorModel implements Descr public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { } - fromModel(item: DescriptionTemplateAuthAutoCompleteDataPersist): DescriptionTemplateAuthAutoCompleteDataEditorModel { + fromModel(item: DescriptionTemplateExternalSelectAuthDataPersist): DescriptionTemplateExternalSelectAuthDataEditorModel { if (item) { this.url = item.url; this.method = item.method; @@ -1397,7 +1451,7 @@ export class DescriptionTemplateAuthAutoCompleteDataEditorModel implements Descr }): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { - context = DescriptionTemplateAuthAutoCompleteDataEditorModel.createValidationContext({ + context = DescriptionTemplateExternalSelectAuthDataEditorModel.createValidationContext({ validationErrorModel: this.validationErrorModel, rootPath }); @@ -1437,7 +1491,7 @@ export class DescriptionTemplateAuthAutoCompleteDataEditorModel implements Descr }): void { const { formGroup, rootPath, validationErrorModel } = params; - const context = DescriptionTemplateAuthAutoCompleteDataEditorModel.createValidationContext({ + const context = DescriptionTemplateExternalSelectAuthDataEditorModel.createValidationContext({ rootPath, validationErrorModel }); @@ -1455,7 +1509,7 @@ export class DescriptionTemplateAuthAutoCompleteDataEditorModel implements Descr // Radiobox Field // // -export class DescriptionTemplateRadioBoxFieldEditorModel extends DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplateRadioBoxDataPersist { +export class DescriptionTemplateRadioBoxFieldEditorModel extends DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateRadioBoxDataPersist { options: DescriptionTemplateRadioBoxDataEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -1598,9 +1652,9 @@ export class DescriptionTemplateRadioBoxDataEditorModel implements DescriptionTe // Select Field // // -export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplateSelectDataPersist { - options: DescriptionTemplateComboBoxOptionEditorModel[] = []; - multiList: boolean; +export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateSelectDataPersist { + options: DescriptionTemplateSelectOptionEditorModel[] = []; + multipleSelect: boolean; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); constructor( @@ -1610,8 +1664,8 @@ export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTempla fromModel(item: DescriptionTemplateSelectDataPersist): DescriptionTemplateSelectFieldEditorModel { if (item) { super.fromModel(item); - this.multiList = item.multiList; - if (item.options) { item.options.map(x => this.options.push(new DescriptionTemplateComboBoxOptionEditorModel(this.validationErrorModel).fromModel(x))); } + this.multipleSelect = item.multipleSelect; + if (item.options) { item.options.map(x => this.options.push(new DescriptionTemplateSelectOptionEditorModel(this.validationErrorModel).fromModel(x))); } } return this; } @@ -1630,10 +1684,10 @@ export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTempla } const formGroup = super.buildForm({ context, disabled, rootPath }); - formGroup.setControl('multiList', new FormControl({ value: this.multiList, disabled: disabled }, context.getValidation('multiList').validators)); + formGroup.setControl('multipleSelect', new FormControl({ value: this.multipleSelect, disabled: disabled }, context.getValidation('multipleSelect').validators)); formGroup.setControl('options', this.formBuilder.array( (this.options ?? []).map( - (item, index) => new DescriptionTemplateComboBoxOptionEditorModel( + (item, index) => new DescriptionTemplateSelectOptionEditorModel( this.validationErrorModel ).fromModel(item).buildForm({ rootPath: `${rootPath}options[${index}].` @@ -1649,7 +1703,7 @@ export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTempla const { rootPath = '', validationErrorModel } = params; const baseContext: ValidationContext = super.createValidationContext({ rootPath, validationErrorModel }); baseContext.validation.push({ key: 'options', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}options`)] }); - baseContext.validation.push({ key: 'multiList', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}multiList`)] }); + baseContext.validation.push({ key: 'multipleSelect', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}multipleSelect`)] }); return baseContext; } @@ -1665,14 +1719,14 @@ export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTempla validationErrorModel }); - ['multiList'].forEach(keyField => { + ['multipleSelect'].forEach(keyField => { const control = formGroup?.get(keyField); control?.clearValidators(); control?.addValidators(context.getValidation(keyField).validators); }); (formGroup.get('options') as FormArray).controls?.forEach( - (control, index) => DescriptionTemplateComboBoxOptionEditorModel.reapplyValidators({ + (control, index) => DescriptionTemplateSelectOptionEditorModel.reapplyValidators({ formGroup: control as UntypedFormGroup, rootPath: `${rootPath}options[${index}].`, validationErrorModel: validationErrorModel @@ -1686,7 +1740,7 @@ export class DescriptionTemplateSelectFieldEditorModel extends DescriptionTempla // Upload Field // // -export class DescriptionTemplateUploadFieldEditorModel extends DescriptionTemplateBaseFieldEditorModel implements DescriptionTemplateUploadDataPersist { +export class DescriptionTemplateUploadFieldEditorModel extends DescriptionTemplateLabelDataEditorModel implements DescriptionTemplateUploadDataPersist { types: DescriptionTemplateUploadOptionEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts index 72df809e8..09eccc504 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { DescriptionTemplateType } from '@app/core/model/description-template-type/description-template-type'; -import { DescriptionTemplate, DescriptionTemplateAutoCompleteData, DescriptionTemplateBaseFieldData, DescriptionTemplateComboBoxOption, DescriptionTemplateDefinition, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateMultiplicity, DescriptionTemplatePage, DescriptionTemplateRadioBoxData, DescriptionTemplateRadioBoxOption, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData } from '@app/core/model/description-template/description-template'; +import { DescriptionTemplate, DescriptionTemplateExternalSelectData, DescriptionTemplateBaseFieldData, DescriptionTemplateSelectOption, DescriptionTemplateDefinition, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateMultiplicity, DescriptionTemplatePage, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData } from '@app/core/model/description-template/description-template'; import { DescriptionTemplateService } from '@app/core/services/description-template/description-template.service'; import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service'; import { BaseEditorResolver } from '@common/base/base-editor.resolver'; @@ -33,48 +33,45 @@ export class DescriptionTemplateEditorResolver extends BaseEditorResolver { [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.ordinal)].join('.'), [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.title)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.id)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.defaultVisibility)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.multiplicity)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.numbering)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.page)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.title)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.description)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.extendedDescription)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.sections)].join('.'), // TODO: it is recursive here + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.id)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.defaultVisibility)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.multiplicity)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.title)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.description)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.sections)].join('.'), // TODO: it is recursive here - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.id)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.ordinal)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.numbering)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.title)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.description)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.extendedDescription)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.additionalInformation)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.hasCommentField)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.min)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.max)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.placeholder)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.tableView)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.id)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.ordinal)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.numbering)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.schematics)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), - // [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.fieldType)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.includeInExport)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.validations)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.id)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.numbering)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.title)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.description)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.extendedDescription)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.additionalInformation)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.hasCommentField)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.min)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.max)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.placeholder)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.multiplicity), nameof(x => x.tableView)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.id)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.ordinal)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.numbering)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.schematics)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), + // [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.fieldType)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.includeInExport)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.validations)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.target)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.value)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.label)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.fieldType)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multiList)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.label)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.value)].join('.'), - [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multiAutoComplete)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.target)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.value)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.label)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.fieldType)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multipleSelect)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.label)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.value)].join('.'), + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multipleSelect)].join('.'), nameof(x => x.createdAt), nameof(x => x.hash), 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 63b2c8859..c649a02c1 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 @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { DescriptionTemplate, DescriptionTemplateBaseFieldData, DescriptionTemplateComboBoxOption, DescriptionTemplateDefinition, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplatePage, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData } from '@app/core/model/description-template/description-template'; +import { DescriptionTemplate, DescriptionTemplateBaseFieldData, DescriptionTemplateSelectOption, DescriptionTemplateDefinition, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplatePage, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData } from '@app/core/model/description-template/description-template'; import { Description, DescriptionField, DescriptionReference, DescriptionTag, PropertyDefinition } from '@app/core/model/description/description'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { Dmp, DmpDescriptionTemplate } from '@app/core/model/dmp/dmp'; import { Reference } from '@app/core/model/reference/reference'; import { Tag } from '@app/core/model/tag/tag'; @@ -80,30 +80,28 @@ export class DescriptionEditorResolver extends BaseEditorResolver { (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('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.id)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.page)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.title)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.description)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.extendedDescription)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.id)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.ordinal)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.title)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.description)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.extendedDescription)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.additionalInformation)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.hasCommentField)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.id)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.validations)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.target)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.value)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.label)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.fieldType)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.label)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.value)].join('.'), - (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multiList)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.id)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.ordinal)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.title)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.description)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.id)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.ordinal)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.title)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.description)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.extendedDescription)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.additionalInformation)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.hasCommentField)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.id)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.defaultValue)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.validations)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.target)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.visibilityRules), nameof(x => x.value)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.label)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.fieldType)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.label)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.options), nameof(x => x.value)].join('.'), + (prefix ? prefix + '.' : '') + [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.multipleSelect)].join('.'), ] } diff --git a/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.html b/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.html index 438910015..6cbafb962 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.html +++ b/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.html @@ -16,15 +16,15 @@ {{'GENERAL.VALIDATION.URL.MESSAGE' | translate}} -
+
- + - + @@ -38,7 +38,7 @@
- + {{opt.label}} @@ -50,12 +50,12 @@
- + - + @@ -69,12 +69,12 @@
- + - + @@ -88,12 +88,12 @@
- + - + @@ -187,12 +187,12 @@
- + - + @@ -207,12 +207,12 @@
- + - + @@ -226,12 +226,12 @@
- + - + @@ -245,12 +245,12 @@
- + - + @@ -265,12 +265,12 @@
- + - + @@ -285,12 +285,12 @@
- + - + @@ -305,12 +305,12 @@
- + - + @@ -325,12 +325,12 @@
- + - + @@ -345,12 +345,12 @@
- + - + @@ -373,12 +373,12 @@
- + - + @@ -393,12 +393,12 @@
- + - + diff --git a/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.ts b/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.ts index b31d1282d..11749fefb 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-form/components/form-field/form-field.component.ts @@ -6,7 +6,7 @@ import { MatDialog } from "@angular/material/dialog"; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; import { DescriptionTemplateFieldValidationType } from '@app/core/common/enum/description-template-field-validation-type'; import { ReferenceType } from '@app/core/common/enum/reference-type'; -import { DescriptionTemplateAutoCompleteData, DescriptionTemplateAutoCompleteSingleData, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateUploadData, DescriptionTemplateSelectData } from '@app/core/model/description-template/description-template'; +import { DescriptionTemplateExternalSelectData, DescriptionTemplateExternalSelectSource, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateSelectData, DescriptionTemplateUploadData } from '@app/core/model/description-template/description-template'; import { FetcherReference, Reference } from '@app/core/model/reference/reference'; import { ReferenceSearchLookup } from '@app/core/query/reference-search.lookup'; import { DmpService } from '@app/core/services/dmp/dmp.service'; @@ -42,7 +42,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn // @Input() form: UntypedFormGroup; @Input() datasetProfileId: any; @Input() isChild: Boolean = false; - autocompleteOptions: DescriptionTemplateAutoCompleteSingleData[]; + autocompleteOptions: DescriptionTemplateExternalSelectSource[]; visible: boolean = true; @@ -136,7 +136,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn this.isRequired = this.field.validations?.includes(DescriptionTemplateFieldValidationType.Required); if (this.field?.data?.fieldType === DescriptionTemplateFieldType.SELECT) { - if ((this.field.data as DescriptionTemplateSelectData).multiList) { + if ((this.field.data as DescriptionTemplateSelectData).multipleSelect) { const originalValue = this.propertiesFormGroup.get(this.field.id).get('value').value; if (originalValue !== null && typeof originalValue === 'string') { let values = (this.propertiesFormGroup.get(this.field.id).get('value').value).slice(1, -1).split(', ').filter((value) => !value.includes('"')); @@ -155,8 +155,8 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn } // Setup autocomplete configuration if needed - if (this.field?.data?.fieldType === DescriptionTemplateFieldType.AUTO_COMPLETE) { - if (!((this.field.data as DescriptionTemplateAutoCompleteData).multiAutoComplete)) { + if (this.field?.data?.fieldType === DescriptionTemplateFieldType.EXTERNAL_SELECT) { + if (!((this.field.data as DescriptionTemplateExternalSelectData).multipleSelect)) { this.singleAutoCompleteConfiguration = { filterFn: this.searchFromAutocomplete.bind(this), initialItems: () => this.searchFromAutocomplete(''), @@ -177,7 +177,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn } } if (isNullOrUndefined(this.datasetProfileId)) { - this.autocompleteOptions = (this.field.data as DescriptionTemplateAutoCompleteData).autoCompleteSingleDataList; + this.autocompleteOptions = (this.field.data as DescriptionTemplateExternalSelectData).sources; } } @@ -350,7 +350,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn distinctUntilChanged() ) .subscribe(item => { - // if (this.field?.data?.fieldType === DescriptionTemplateFieldType.ComboBox && this.form.get('data').value.type === DatasetProfileComboBoxType.Select && this.form.get('data').value.multiList) { + // if (this.field?.data?.fieldType === DescriptionTemplateFieldType.ComboBox && this.form.get('data').value.type === DatasetProfileComboBoxType.Select && this.form.get('data').value.multipleSelect) { // item.forEach(element => { // this.visibilityRulesService.updateValueAndVisibility(this.field?.id, element); // }); @@ -380,7 +380,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn // const autocompleteRequestItem: RequestItem = new RequestItem(); // autocompleteRequestItem.criteria = new DatasetExternalAutocompleteOptionsCriteria(); // //TODO: refactor this - // //autocompleteRequestItem.criteria.autoCompleteSingleDataList = this.autocompleteOptions; + // //autocompleteRequestItem.criteria.sources = this.autocompleteOptions; // // autocompleteRequestItem.criteria.like = query; // // return this.datasetExternalAutocompleteService.queryApi(autocompleteRequestItem); // return null; @@ -439,7 +439,7 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn } makeAutocompleteConfiguration(myfunc: Function, title: string, subtitle?: string): void { - if (!((this.field.data as DescriptionTemplateAutoCompleteData).multiAutoComplete)) { + if (!((this.field.data as DescriptionTemplateExternalSelectData).multipleSelect)) { this.singleAutoCompleteConfiguration = { filterFn: myfunc.bind(this), initialItems: (extraData) => myfunc(''), diff --git a/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.html b/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.html index f8dabcd80..b468cf3e4 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.html +++ b/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.html @@ -13,7 +13,7 @@ - +
diff --git a/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.ts b/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.ts index 1bf5e7e6a..3b711a70e 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-form/description-form.component.ts @@ -32,7 +32,6 @@ export class DescriptionFormComponent extends BaseComponent implements OnInit, A @Input() TOCENTRY_ID_PREFIX = ""; @Output() visibilityRulesInstance = new EventEmitter(); - public sectionsPerPage: { [key: string]: DescriptionTemplateSection[] } = {}; // public hiddenEntriesIds: string[] = []; constructor( @@ -62,9 +61,7 @@ export class DescriptionFormComponent extends BaseComponent implements OnInit, A } init() { - this.descriptionTemplate?.definition?.pages.forEach(page => { - this.sectionsPerPage[page.id] = this.descriptionTemplate.definition.sections.filter(x => x.page == page.id); - }) + // this.tocentries = this.getTocEntries(); // const rules_to_append = this._enrichWithMultiplicityRules(this.tocentries); diff --git a/dmp-frontend/src/app/ui/description/editor/description-form/visibility-rules/visibility-rules.service.ts b/dmp-frontend/src/app/ui/description/editor/description-form/visibility-rules/visibility-rules.service.ts index 1424d3c53..766ac4518 100644 --- a/dmp-frontend/src/app/ui/description/editor/description-form/visibility-rules/visibility-rules.service.ts +++ b/dmp-frontend/src/app/ui/description/editor/description-form/visibility-rules/visibility-rules.service.ts @@ -5,7 +5,7 @@ import { Observable, Subject } from 'rxjs'; import { VisibilityRule } from './models/visibility-rule'; import { VisibilityRuleSource } from './models/visibility-rule-source'; import { VisibilityRulesContext } from './models/visibility-rules-context'; -import { DescriptionTemplate, DescriptionTemplateSection } from '@app/core/model/description-template/description-template'; +import { DescriptionTemplate, DescriptionTemplatePage, DescriptionTemplateSection } from '@app/core/model/description-template/description-template'; import { Rule } from './models/rule'; @Injectable() @@ -17,7 +17,7 @@ export class VisibilityRulesService { private visibilityRuleContext: VisibilityRulesContext; private form: AbstractControl; - public isVisibleMap : { [key: string]: boolean } = {}; + public isVisibleMap: { [key: string]: boolean } = {}; private elementVisibilityMapSubject = new Subject<{ [key: string]: boolean }>(); private elementComputationalMap = new Map>(); /// keep saved the values of each form control validity value @@ -416,24 +416,25 @@ export class VisibilityRulesService { public getVisibilityRulesFromDescriptionTempalte(descriptionTemplate: DescriptionTemplate): Rule[] { //console.log('getVisibilityRulesFromDescriptionTempalte: ' + descriptionTemplate); - const result: Rule[] = this.getVisibilityRulesFromDescriptionTempalteSections(descriptionTemplate?.definition?.sections); + const result: Rule[] = this.getVisibilityRulesFromDescriptionTempalteSections(descriptionTemplate?.definition?.pages); return result; } - public getVisibilityRulesFromDescriptionTempalteSections(sections: DescriptionTemplateSection[]): Rule[] { + public getVisibilityRulesFromDescriptionTempalteSections(pages: DescriptionTemplatePage[]): Rule[] { //console.log('getVisibilityRulesFromDescriptionTempalteSections: ' + sections); const result: Rule[] = []; - - sections.forEach(section => { - if (section.sections != null) { result.push(...this.getVisibilityRulesFromDescriptionTempalteSections(section.sections)); }; - section?.fieldSets?.forEach(fieldSet => { - fieldSet?.fields?.forEach(field => { - field.visibilityRules?.forEach(visibilityRule => { - result.push({ - sourceField: field.id.toString(), - targetField: visibilityRule.target, - requiredValue: visibilityRule.value - }) + pages.forEach(page => { + page?.sections?.forEach(section => { + if (section.sections != null) { result.push(...this.getVisibilityRulesFromDescriptionTempalteSections(section.sections)); }; + section?.fieldSets?.forEach(fieldSet => { + fieldSet?.fields?.forEach(field => { + field.visibilityRules?.forEach(visibilityRule => { + result.push({ + sourceField: field.id.toString(), + targetField: visibilityRule.target, + requiredValue: visibilityRule.value + }) + }); }); }); }); 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 8f107d4b7..17b7ff55f 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 @@ -428,7 +428,7 @@ export class TableOfContentsComponent extends BaseComponent implements OnInit, O ordinal: pageElement.ordinal }; - const sections = descriptionTemplate.definition.sections.filter(x => x.page == pageElement.id); + const sections = descriptionTemplate.definition.pages.find(x => x.id == pageElement.id)?.sections; sections.forEach(section => { const tempResults = this._buildRecursivelySection(section); diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index d3dedccf5..6a9370c33 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -2189,7 +2189,6 @@ "DATASET-PROFILE-FIELD-VIEW-STYLE": { "BOOLEAN-DECISION": "Boolean Decision", "CHECKBOX": "Checkbox", - "COMBO-BOX": "Combo Box", "INTERNAL-DMP-ENTITIES": "Internal DMP Entities", "FREE-TEXT": "Free Text", "RADIO-BOX": "Radio Box", @@ -2217,14 +2216,13 @@ }, "DESCRIPTION-TEMPLATE-FIELD-TYPE": { "COMBO-BOX": "Combo Box", - "AUTO-COMPLETE": "Custom", + "EXTERNAL-SELECT": "Custom", "SELECT": "Select", "BOOLEAN-DECISION": "Boolean Decision", "RADIO-BOX": "Radio Box", - "INTERNAL-DMP-ENTITIES": "Internal DMP Entities", - "INTERNAL-DMP-ENTITIES-RESEARCHERS": "Researchers", - "INTERNAL-DMP-ENTITIES-DMPS": "DMPs", - "INTERNAL-DMP-ENTITIES-DATASETS": "Descriptions", + "INTERNAL-DMP-ENTITIES-RESEARCHERS": "Internal Researchers", + "INTERNAL-DMP-ENTITIES-DMPS": "Internal DMPs", + "INTERNAL-DMP-ENTITIES-DATASETS": "Internal Descriptions", "CHECKBOX": "Checkbox", "FREE-TEXT": "Free Text", "TEXT-AREA": "Text Area",