From 2313ffffe9572d48dba9fbc53b8f7f4b586b1c51 Mon Sep 17 00:00:00 2001 From: Laurent Fasani Date: Tue, 30 Jul 2024 14:28:01 +0200 Subject: [PATCH] [2163] Make EMF default form support non changeable features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-sirius/sirius-web/issues/2163 Signed-off-by: Laurent Fasani Signed-off-by: Florian ROUËNÉ --- CHANGELOG.adoc | 1 + .../emf/forms/EEnumIfDescriptionProvider.java | 10 ++++++++-- .../forms/EStringIfDescriptionProvider.java | 8 ++++++++ .../forms/InstantIfDescriptionProvider.java | 8 ++++++++ .../forms/LocalDateIfDescriptionProvider.java | 18 ++++++++++-------- ...tainmentReferenceIfDescriptionProvider.java | 7 +++++++ .../emf/forms/NumberIfDescriptionProvider.java | 1 + .../DateTimeWidgetPropertySection.tsx | 16 ++++++++++++---- 8 files changed, 55 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 423c126853..3b62354aa4 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -106,6 +106,7 @@ This will allow specifier to create images that fir perfectly in the project tem - https://github.com/eclipse-sirius/sirius-web/issues/3833[#3833] [gantt] Enhance Gantt to support Date and DateTime - https://github.com/eclipse-sirius/sirius-web/issues/3816[#3816] [form] Make EMF default form support Integer null value - https://github.com/eclipse-sirius/sirius-web/issues/3826[#3826] [form] Make EMF default form support attributes with a date +- https://github.com/eclipse-sirius/sirius-web/issues/2163[#2163] [form] Make EMF default form support non changeable features == v2024.9.0 diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EEnumIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EEnumIfDescriptionProvider.java index e942990f55..2f42aef77a 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EEnumIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EEnumIfDescriptionProvider.java @@ -95,9 +95,16 @@ private RadioDescription getRadioDescription() { .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) .kindProvider(this.propertiesValidationProvider.getKindProvider()) .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } + private Function getIsReadOnlyProvider() { + return variableManager -> variableManager.get(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, EAttribute.class) + .map(attr -> !attr.isChangeable()) + .orElse(false); + } + private Function getLabelProvider() { return new EStructuralFeatureLabelProvider(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, this.composedAdapterFactory); } @@ -172,8 +179,7 @@ private BiFunction getNewValueHandler() { EObject eObject = optionalEObject.get(); EAttribute eAttribute = optionalEAttribute.get(); EClassifier eType = eAttribute.getEType(); - if (eType instanceof EEnum) { - EEnum eEnum = (EEnum) eType; + if (eType instanceof EEnum eEnum) { EEnumLiteral literal = eEnum.getEEnumLiteral(id); if (literal != null) { Object value = EcoreUtil.createFromString(eEnum, literal.getLiteral()); diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EStringIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EStringIfDescriptionProvider.java index ba48a4e16f..aaef09b690 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EStringIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/EStringIfDescriptionProvider.java @@ -38,6 +38,7 @@ * @author sbegaudeau */ public class EStringIfDescriptionProvider { + private static final String IF_DESCRIPTION_ID = "EString"; private static final String TEXTAREA_DESCRIPTION_ID = "Textarea"; @@ -82,9 +83,16 @@ private TextareaDescription getTextareaDescription() { .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) .kindProvider(this.propertiesValidationProvider.getKindProvider()) .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } + private Function getIsReadOnlyProvider() { + return variableManager -> variableManager.get(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, EAttribute.class) + .map(attr -> !attr.isChangeable()) + .orElse(false); + } + private Function getLabelProvider() { return new EStructuralFeatureLabelProvider(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, this.composedAdapterFactory); } diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/InstantIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/InstantIfDescriptionProvider.java index aca1e0b874..c494ca1388 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/InstantIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/InstantIfDescriptionProvider.java @@ -39,6 +39,7 @@ * @author lfasani */ public class InstantIfDescriptionProvider { + private static final String IF_DESCRIPTION_ID = "java.time.Instant"; private static final String DATE_TIME_DESCRIPTION_ID = "DateTime"; @@ -84,9 +85,16 @@ private DateTimeDescription getDateTimeDescription() { .kindProvider(this.propertiesValidationProvider.getKindProvider()) .messageProvider(this.propertiesValidationProvider.getMessageProvider()) .type(DateTimeType.DATE_TIME) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } + private Function getIsReadOnlyProvider() { + return variableManager -> variableManager.get(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, EAttribute.class) + .map(attr -> !attr.isChangeable()) + .orElse(false); + } + private Function getLabelProvider() { return new EStructuralFeatureLabelProvider(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, this.composedAdapterFactory); } diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/LocalDateIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/LocalDateIfDescriptionProvider.java index cabeee3b47..348c95e815 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/LocalDateIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/LocalDateIfDescriptionProvider.java @@ -12,11 +12,7 @@ *******************************************************************************/ package org.eclipse.sirius.components.emf.forms; -import java.time.Instant; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Objects; @@ -43,6 +39,7 @@ * @author lfasani */ public class LocalDateIfDescriptionProvider { + private static final String IF_DESCRIPTION_ID = "java.time.LocalDate"; private static final String DATE_DESCRIPTION_ID = "Date"; @@ -88,9 +85,16 @@ private DateTimeDescription getDateTimeDescription() { .kindProvider(this.propertiesValidationProvider.getKindProvider()) .messageProvider(this.propertiesValidationProvider.getMessageProvider()) .type(DateTimeType.DATE) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } + private Function getIsReadOnlyProvider() { + return variableManager -> variableManager.get(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, EAttribute.class) + .map(attr -> !attr.isChangeable()) + .orElse(false); + } + private Function getLabelProvider() { return new EStructuralFeatureLabelProvider(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, this.composedAdapterFactory); } @@ -106,8 +110,7 @@ private Function getValueProvider() { Object value = eObject.eGet(eAttribute); if (value instanceof LocalDate localDate) { - Instant instant = localDate.atStartOfDay(ZoneId.of("UTC")).toInstant(); - return DateTimeFormatter.ISO_INSTANT.format(instant); + return DateTimeFormatter.ISO_LOCAL_DATE.format(localDate); } } return ""; @@ -127,8 +130,7 @@ private BiFunction getNewValueHandler() { eObject.eSet(eAttribute, null); status = new Success(); } else { - Instant instant = Instant.parse(newValue); - LocalDate localDate = LocalDateTime.ofInstant(instant, ZoneOffset.UTC).toLocalDate(); + LocalDate localDate = LocalDate.parse(newValue); eObject.eSet(eAttribute, localDate); status = new Success(); } diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NonContainmentReferenceIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NonContainmentReferenceIfDescriptionProvider.java index 3aa24d036a..bd2cc8d83d 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NonContainmentReferenceIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NonContainmentReferenceIfDescriptionProvider.java @@ -116,9 +116,16 @@ private ReferenceWidgetDescription getReferenceWidgetDescription() { .setHandlerProvider(this::handleSetReference) .addHandlerProvider(this::handleAddReferenceValues) .moveHandlerProvider(this::handleMoveReferenceValue) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } + private Function getIsReadOnlyProvider() { + return variableManager -> variableManager.get(EMFFormDescriptionProvider.ESTRUCTURAL_FEATURE, EStructuralFeature.class) + .map(attr -> !attr.isChangeable()) + .orElse(false); + } + private List getReferenceValue(VariableManager variableManager) { List value = List.of(); EStructuralFeature.Setting setting = this.resolveSetting(variableManager); diff --git a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NumberIfDescriptionProvider.java b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NumberIfDescriptionProvider.java index b4a1d41d7e..696d8cca3d 100644 --- a/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NumberIfDescriptionProvider.java +++ b/packages/emf/backend/sirius-components-emf-forms/src/main/java/org/eclipse/sirius/components/emf/forms/NumberIfDescriptionProvider.java @@ -85,6 +85,7 @@ private TextfieldDescription getTextfieldDescription() { .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) .kindProvider(this.propertiesValidationProvider.getKindProvider()) .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .isReadOnlyProvider(this.getIsReadOnlyProvider()) .build(); } diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx index d5b9539ec6..9ab9f22634 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx @@ -94,7 +94,7 @@ export const DateTimeWidgetPropertySection: PropertySectionComponent) => { const { value } = event.target; - if (value?.length > 0) { + if (value != null) { setState((prevState) => ({ ...prevState, editedValue: value })); } }; @@ -127,7 +127,6 @@ export const DateTimeWidgetPropertySection: PropertySectionComponent) => { @@ -179,9 +178,12 @@ const convertToLocalDateTimeString = (dateTimeType: string, dateTimeString: stri return `${year}-${month}-${day}T${hours}:${minutes}`; }; -const convertToUTCDateTimeString = (dateTimeString: string): string => { +const convertToUTCDateTimeString = (dateTimeType: string, dateTimeString: string): string => { const dateTime = new Date(dateTimeString); + if (dateTimeString.length == 0) { + return ''; + } // Get the local date and time components const year = String(dateTime.getUTCFullYear()).padStart(4, '0'); const month = String(dateTime.getUTCMonth() + 1).padStart(2, '0'); @@ -190,5 +192,11 @@ const convertToUTCDateTimeString = (dateTimeString: string): string => { const minutes = String(dateTime.getUTCMinutes()).padStart(2, '0'); const seconds = String(dateTime.getUTCSeconds()).padStart(2, '0'); + if (dateTimeType === 'DATE') { + return `${year}-${month}-${day}`; + } else if (dateTimeType === 'TIME') { + return `${hours}:${minutes}`; + } + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}Z`; };