diff --git a/src/main/java/de/metas/ui/web/window/descriptor/factory/standard/GridTabVOBasedDocumentEntityDescriptorFactory.java b/src/main/java/de/metas/ui/web/window/descriptor/factory/standard/GridTabVOBasedDocumentEntityDescriptorFactory.java
index 100edf841..0a5dd5d70 100644
--- a/src/main/java/de/metas/ui/web/window/descriptor/factory/standard/GridTabVOBasedDocumentEntityDescriptorFactory.java
+++ b/src/main/java/de/metas/ui/web/window/descriptor/factory/standard/GridTabVOBasedDocumentEntityDescriptorFactory.java
@@ -43,6 +43,7 @@
import de.metas.ui.web.window.model.IDocumentFieldValueProvider;
import de.metas.ui.web.window.model.lookup.LabelsLookup;
import de.metas.ui.web.window.model.sql.SqlDocumentsRepository;
+import lombok.NonNull;
/*
* #%L
@@ -388,7 +389,7 @@ else if (actionType == ButtonFieldActionType.genericZoomInto)
//
.setReadonlyLogic(readonlyLogic)
.setAlwaysUpdateable(alwaysUpdateable)
- .setMandatoryLogic(gridFieldVO.isMandatory() ? ConstantLogicExpression.TRUE : gridFieldVO.getMandatoryLogic())
+ .setMandatoryLogic(extractMandatoryLogic(gridFieldVO))
.setDisplayLogic(gridFieldVO.getDisplayLogic())
//
.setDefaultFilterField(gridFieldVO.isSelectionColumn())
@@ -631,6 +632,13 @@ private static boolean extractAlwaysUpdateable(final GridFieldVO gridFieldVO)
return gridFieldVO.isAlwaysUpdateable();
}
+ private static ILogicExpression extractMandatoryLogic(@NonNull final GridFieldVO gridFieldVO)
+ {
+ final ILogicExpression mandatoryLogic = gridFieldVO.getMandatoryLogic();
+
+ return mandatoryLogic.isNullExpression() ? ConstantLogicExpression.of(gridFieldVO.isMandatory()) : mandatoryLogic;
+ }
+
private final void collectSpecialField(final DocumentFieldDescriptor.Builder field)
{
if (_specialFieldsCollector == null)
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 d12e85a32..1c3d00b26 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
@@ -1707,7 +1707,7 @@ public DocumentValidStatus checkAndGetValidStatus()
continue;
}
- final DocumentValidStatus validState = documentField.updateStatusIfInvalidAndGet(changesCollector);
+ final DocumentValidStatus validState = documentField.updateStatusIfInitialInvalidAndGet(changesCollector);
if (!validState.isValid())
{
logger.trace("Considering document invalid because {} is not valid: {}", documentField, validState);
diff --git a/src/main/java/de/metas/ui/web/window/model/DocumentField.java b/src/main/java/de/metas/ui/web/window/model/DocumentField.java
index 9d1b61372..36b414524 100644
--- a/src/main/java/de/metas/ui/web/window/model/DocumentField.java
+++ b/src/main/java/de/metas/ui/web/window/model/DocumentField.java
@@ -490,7 +490,7 @@ public DocumentValidStatus getValidStatus()
}
@Override
- public DocumentValidStatus updateStatusIfInvalidAndGet(final IDocumentChangesCollector changesCollector)
+ public DocumentValidStatus updateStatusIfInitialInvalidAndGet(final IDocumentChangesCollector changesCollector)
{
if (_validStatus.isInitialInvalid())
{
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 f270e24c0..dd0fb9766 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
@@ -86,7 +86,11 @@ default DocumentPath getDocumentPath()
@Override
DocumentValidStatus getValidStatus();
- DocumentValidStatus updateStatusIfInvalidAndGet(IDocumentChangesCollector changesCollector);
+ /**
+ * Note: it's not clear why it is enough to only evaluate the while the initial status is invalid..
+ * Yet I keep it that way for now, because it works as far as we see. And changing it might result in a performance degradation.
+ */
+ DocumentValidStatus updateStatusIfInitialInvalidAndGet(IDocumentChangesCollector changesCollector);
IDocumentField copy(Document document, CopyMode copyMode);
}