From 50fe2256204385f31dc1c7df0d2c3dfac383d59a Mon Sep 17 00:00:00 2001 From: Laurent Fasani Date: Tue, 16 Apr 2024 14:47:43 +0200 Subject: [PATCH] [3441] Use a DateTime widget for AbstractTask entity Bug: https://github.com/eclipse-sirius/sirius-web/issues/3441 Signed-off-by: Laurent Fasani --- CHANGELOG.adoc | 1 + .../AbstractTaskPropertiesConfigurer.java | 138 ++++++++++++------ 2 files changed, 95 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index e8b570cbdd..52c6ace8c3 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -140,6 +140,7 @@ They still support returning an `java.time.Instant` object directly. - https://github.com/eclipse-sirius/sirius-web/issues/3279[#3279] [core] Image URLs are now sanitized in a similar manner in all datafetchers, as a result absolute URLs to external images are better supported and a leading slash is now required anymore. - https://github.com/eclipse-sirius/sirius-web/issues/3296[#3296] [diagram] Add a hook `useStore` to retrieve local `setNodes`, `setEdges`, `onEdgesChange` and `onNodesChange`, this hook is used to align how nodes and edges are manipulated during processing of ReactFlow events. - https://github.com/eclipse-sirius/sirius-web/issues/3397[#3397] [diagram] Add helper lines when resizing nodes +- https://github.com/eclipse-sirius/sirius-web/issues/3441[#3441] [starters] Use a DateTime widget for AbstractTask entity == v2024.3.0 diff --git a/packages/starters/backend/sirius-components-task-starter/src/main/java/org/eclipse/sirius/components/task/starter/configuration/AbstractTaskPropertiesConfigurer.java b/packages/starters/backend/sirius-components-task-starter/src/main/java/org/eclipse/sirius/components/task/starter/configuration/AbstractTaskPropertiesConfigurer.java index 41c3c5f9bc..281321f268 100644 --- a/packages/starters/backend/sirius-components-task-starter/src/main/java/org/eclipse/sirius/components/task/starter/configuration/AbstractTaskPropertiesConfigurer.java +++ b/packages/starters/backend/sirius-components-task-starter/src/main/java/org/eclipse/sirius/components/task/starter/configuration/AbstractTaskPropertiesConfigurer.java @@ -21,6 +21,7 @@ import java.util.Objects; import java.util.Optional; import java.util.UUID; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; @@ -31,11 +32,15 @@ import org.eclipse.sirius.components.collaborative.forms.services.api.IPropertiesDescriptionRegistry; import org.eclipse.sirius.components.collaborative.forms.services.api.IPropertiesDescriptionRegistryConfigurer; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.forms.DateTimeType; import org.eclipse.sirius.components.forms.description.AbstractControlDescription; import org.eclipse.sirius.components.forms.description.CheckboxDescription; +import org.eclipse.sirius.components.forms.description.DateTimeDescription; import org.eclipse.sirius.components.forms.description.GroupDescription; import org.eclipse.sirius.components.forms.description.IfDescription; -import org.eclipse.sirius.components.forms.description.TextfieldDescription; +import org.eclipse.sirius.components.representations.Failure; +import org.eclipse.sirius.components.representations.IStatus; +import org.eclipse.sirius.components.representations.Success; import org.eclipse.sirius.components.representations.VariableManager; import org.eclipse.sirius.components.task.AbstractTask; import org.eclipse.sirius.components.task.Person; @@ -45,6 +50,7 @@ import org.eclipse.sirius.components.task.TaskTag; import org.eclipse.sirius.components.task.Team; import org.eclipse.sirius.components.view.emf.compatibility.IPropertiesWidgetCreationService; +import org.eclipse.sirius.components.view.emf.compatibility.PropertiesConfigurerService; import org.springframework.stereotype.Component; /** @@ -58,15 +64,20 @@ public class AbstractTaskPropertiesConfigurer implements IPropertiesDescriptionR private final IPropertiesWidgetCreationService propertiesWidgetCreationService; private final IObjectService objectService; + private final PropertiesConfigurerService propertiesConfigurerService; - public AbstractTaskPropertiesConfigurer(IPropertiesWidgetCreationService propertiesWidgetCreationService, IObjectService objectService) { + public AbstractTaskPropertiesConfigurer(PropertiesConfigurerService propertiesConfigurerService, + IPropertiesWidgetCreationService propertiesWidgetCreationService, IObjectService objectService) { + this.propertiesConfigurerService = Objects.requireNonNull(propertiesConfigurerService); this.propertiesWidgetCreationService = Objects.requireNonNull(propertiesWidgetCreationService); this.objectService = Objects.requireNonNull(objectService); } @Override public void addPropertiesDescriptions(IPropertiesDescriptionRegistry registry) { + String formDescriptionId = UUID.nameUUIDFromBytes("abstractTask".getBytes()).toString(); + List controls = new ArrayList<>(this.getGeneralControlDescription()); Predicate canCreatePagePredicate = variableManager -> variableManager.get(VariableManager.SELF, Object.class) @@ -76,6 +87,7 @@ public void addPropertiesDescriptions(IPropertiesDescriptionRegistry registry) { GroupDescription groupDescription = this.propertiesWidgetCreationService.createSimpleGroupDescription(controls); registry.add(this.propertiesWidgetCreationService.createSimplePageDescription(formDescriptionId, groupDescription, canCreatePagePredicate)); + } private List getGeneralControlDescription() { @@ -139,58 +151,96 @@ private List getGeneralControlDescription() { return controls; } - private TextfieldDescription getEndTimeWidget() { - var endTime = this.propertiesWidgetCreationService.createTextField("abstractTask.endTime", "End Time", - task -> { - Instant endInstant = ((AbstractTask) task).getEndTime(); - try { - return DateTimeFormatter.ISO_INSTANT.format(endInstant); - } catch (DateTimeException | NullPointerException e) { - // Ignore - } - return ""; - }, - (task, newValue) -> { - if (newValue != null && newValue.isBlank()) { - ((AbstractTask) task).setEndTime(null); - } else { + private DateTimeDescription getStartTimeWidget() { + Function valueProvider = variableManager -> { + return variableManager.get(VariableManager.SELF, Object.class) + .map(task -> { + Instant startInstant = ((AbstractTask) task).getStartTime(); try { - Instant instant = Instant.parse(newValue); - ((AbstractTask) task).setEndTime(instant); - } catch (DateTimeParseException e) { + return DateTimeFormatter.ISO_INSTANT.format(startInstant); + } catch (DateTimeException | NullPointerException e) { // Ignore } - } - }, - TaskPackage.Literals.ABSTRACT_TASK__END_TIME); - return endTime; - } - - private TextfieldDescription getStartTimeWidget() { - var startTime = this.propertiesWidgetCreationService.createTextField("abstractTask.startTime", "Start Time", - task -> { - Instant startInstant = ((AbstractTask) task).getStartTime(); + return ""; + }) + .orElse(""); + }; + BiFunction newValueHandler = (variableManager, newValue) -> { + var taskOpt = variableManager.get(VariableManager.SELF, Object.class); + if (taskOpt.isPresent()) { + if (newValue == null || newValue.isBlank()) { + ((AbstractTask) taskOpt.get()).setStartTime(null); + } else { try { - return DateTimeFormatter.ISO_INSTANT.format(startInstant); - } catch (DateTimeException | NullPointerException e) { + Instant instant = Instant.parse(newValue); + ((AbstractTask) taskOpt.get()).setStartTime(instant); + } catch (DateTimeParseException e) { // Ignore } - return ""; - }, - (task, newValue) -> { - if (newValue != null && newValue.isBlank()) { - ((AbstractTask) task).setStartTime(null); - } else { + } + return new Success(); + } else { + return new Failure(""); + } + }; + String id = "abstractTask.startTime"; + return DateTimeDescription.newDateTimeDescription(id) + .idProvider(variableManager -> id) + .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) + .labelProvider(variableManager -> "Start Time") + .stringValueProvider(valueProvider) + .newValueHandler(newValueHandler) + .diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(TaskPackage.Literals.ABSTRACT_TASK__START_TIME)) + .kindProvider(this.propertiesConfigurerService.getKindProvider()) + .messageProvider(this.propertiesConfigurerService.getMessageProvider()) + .type(DateTimeType.DATE_TIME) + .build(); + } + + private DateTimeDescription getEndTimeWidget() { + Function valueProvider = variableManager -> { + return variableManager.get(VariableManager.SELF, Object.class) + .map(task -> { + Instant endInstant = ((AbstractTask) task).getEndTime(); try { - Instant instant = Instant.parse(newValue); - ((AbstractTask) task).setStartTime(instant); - } catch (DateTimeParseException e) { + return DateTimeFormatter.ISO_INSTANT.format(endInstant); + } catch (DateTimeException | NullPointerException e) { // Ignore } + return ""; + }) + .orElse(""); + }; + BiFunction newValueHandler = (variableManager, newValue) -> { + var taskOpt = variableManager.get(VariableManager.SELF, Object.class); + if (taskOpt.isPresent()) { + if (newValue == null || newValue.isBlank()) { + ((AbstractTask) taskOpt.get()).setEndTime(null); + } else { + try { + Instant instant = Instant.parse(newValue); + ((AbstractTask) taskOpt.get()).setEndTime(instant); + } catch (DateTimeParseException e) { + // Ignore } - }, - TaskPackage.Literals.ABSTRACT_TASK__START_TIME); - return startTime; + } + return new Success(); + } else { + return new Failure(""); + } + }; + String id = "abstractTask.endTime"; + return DateTimeDescription.newDateTimeDescription(id) + .idProvider(variableManager -> id) + .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) + .labelProvider(variableManager -> "End Time") + .stringValueProvider(valueProvider) + .newValueHandler(newValueHandler) + .diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(TaskPackage.Literals.ABSTRACT_TASK__END_TIME)) + .kindProvider(this.propertiesConfigurerService.getKindProvider()) + .messageProvider(this.propertiesConfigurerService.getMessageProvider()) + .type(DateTimeType.DATE_TIME) + .build(); } private Function> getDependenciesProvider() {