From 6e28b2224ed5492160beaa306a83defc1fe66930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Sch=C3=B6neberg?= Date: Tue, 29 Aug 2017 17:18:01 +0200 Subject: [PATCH] Make the change in Document.java Execution, IDocumentField and IDocumentChangesCollector: minor improvements verify if lookup value is still valid https://github.com/metasfresh/metasfresh-webui-api/issues/551 --- .../ui/web/process/ProcessRestController.java | 5 ++++- .../ui/web/window/controller/Execution.java | 2 +- .../de/metas/ui/web/window/model/Document.java | 17 ++++++++++++++++- .../window/model/IDocumentChangesCollector.java | 2 +- .../ui/web/window/model/IDocumentField.java | 6 ++++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/metas/ui/web/process/ProcessRestController.java b/src/main/java/de/metas/ui/web/process/ProcessRestController.java index ea2fb4c30..8e894beca 100644 --- a/src/main/java/de/metas/ui/web/process/ProcessRestController.java +++ b/src/main/java/de/metas/ui/web/process/ProcessRestController.java @@ -219,8 +219,11 @@ public List processParametersChangeEvents( final IProcessInstancesRepository instancesRepository = getRepository(processId); return Execution.callInNewExecution("", () -> { - final IDocumentChangesCollector changesCollector = Execution.getCurrentDocumentChangesCollectorOrNull(); + + final IDocumentChangesCollector changesCollector = Execution.getCurrentDocumentChangesCollectorOrNull(); // get our collector to fill with the changes that we will record + instancesRepository.forProcessInstanceWritable(pinstanceId, changesCollector, processInstance -> { + processInstance.processParameterValueChanges(events, REASON_Value_DirectSetFromCommitAPI); return null; // void }); diff --git a/src/main/java/de/metas/ui/web/window/controller/Execution.java b/src/main/java/de/metas/ui/web/window/controller/Execution.java index 5e1a6cf58..bfc47ce36 100644 --- a/src/main/java/de/metas/ui/web/window/controller/Execution.java +++ b/src/main/java/de/metas/ui/web/window/controller/Execution.java @@ -94,7 +94,7 @@ public static IDocumentChangesCollector getCurrentDocumentChangesCollector() } /** - * @return actual {@link IDocumentChangesCollector} or {@link NullDocumentChangesCollector} + * @return actual {@link IDocumentChangesCollector} or {@link NullDocumentChangesCollector}. Never returns {@code null}. */ public static IDocumentChangesCollector getCurrentDocumentChangesCollectorOrNull() { diff --git a/src/main/java/de/metas/ui/web/window/model/Document.java b/src/main/java/de/metas/ui/web/window/model/Document.java index 9a3760d28..1a6662303 100644 --- a/src/main/java/de/metas/ui/web/window/model/Document.java +++ b/src/main/java/de/metas/ui/web/window/model/Document.java @@ -1137,7 +1137,7 @@ public void processValueChange(final String fieldName, final Object value, final } } - public void processValueChanges(final List events, final ReasonSupplier reason) throws DocumentFieldReadonlyException + public void processValueChanges(@NonNull final List events, final ReasonSupplier reason) throws DocumentFieldReadonlyException { for (final JSONDocumentChangedEvent event : events) { @@ -1451,6 +1451,21 @@ else if (DependencyType.LookupValues == triggeringDependencyType) final boolean lookupValuesStaled = documentField.setLookupValuesStaled(triggeringFieldName); if (lookupValuesStaled && !lookupValuesStaledOld) { + // https://github.com/metasfresh/metasfresh-webui-api/issues/551 check if we can leave the old value as it is + final Object valueOld = documentField.getValue(); + if (valueOld != null) + { + final boolean currentValueStillValid = documentField.getLookupValues() // because we did setLookupValuesStaled(), this causes a reload + .stream() + .anyMatch(value -> Objects.equals(value, valueOld)); // check if the current value is still value after we reloaded the list + if(!currentValueStillValid) + { + documentField.setValue(null, changesCollector); + changesCollector.collectValueIfChanged(documentField, valueOld, reason); + } + } + + // https://github.com/metasfresh/metasfresh-webui-frontend/issues/1165 - the value was not stale, but now it is => notify the frontend so it shall invalidate its cache changesCollector.collectLookupValuesStaled(documentField, reason); } } diff --git a/src/main/java/de/metas/ui/web/window/model/IDocumentChangesCollector.java b/src/main/java/de/metas/ui/web/window/model/IDocumentChangesCollector.java index c11f8d862..ae0627bf6 100644 --- a/src/main/java/de/metas/ui/web/window/model/IDocumentChangesCollector.java +++ b/src/main/java/de/metas/ui/web/window/model/IDocumentChangesCollector.java @@ -36,7 +36,7 @@ public interface IDocumentChangesCollector /** * Mark the changes of given document path as primary changes. * - * Primary changes are those changes which are on a document which was directly references by REST endpoint. + * Primary changes are those changes which are on a document which was directly referenced by REST endpoint. * * @param documentPath */ diff --git a/src/main/java/de/metas/ui/web/window/model/IDocumentField.java b/src/main/java/de/metas/ui/web/window/model/IDocumentField.java index 8f1ce1238..f270e24c0 100644 --- a/src/main/java/de/metas/ui/web/window/model/IDocumentField.java +++ b/src/main/java/de/metas/ui/web/window/model/IDocumentField.java @@ -68,6 +68,12 @@ default DocumentPath getDocumentPath() void setDisplayed(LogicExpressionResult displayed); + /** + * Notify this instance that it's lookup values are staled. So next time they are needed, they need to be reloaded. + * + * @param triggeringFieldName + * @return + */ boolean setLookupValuesStaled(String triggeringFieldName); LookupValuesList getLookupValues();