From 57fb891fb275f462c80ffdb80a6a89c30f8d937c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Hiszpa=C5=84ski?= Date: Sun, 4 Feb 2024 11:00:58 +0100 Subject: [PATCH] It is now possible to define whether the single control is readonly or not Modifiable property of control can be also controlled with conditions --- .../content/control/PropertyControl.java | 1 + .../control/constraints/Constraints.java | 1 + .../content/mapper/ControlMapper.java | 4 +- .../content/mapper/PropertyPageMapper.java | 14 +++--- .../mapper/PropertyPageMapperConfigurer.java | 4 ++ .../content/mapper/SimpleControlMapper.java | 9 +++- .../content/mapper/TableMapper.java | 28 ++++++++---- .../json-schemas/control/checkbox.json | 3 ++ .../resources/json-schemas/control/combo.json | 3 ++ .../resources/json-schemas/control/date.json | 3 ++ .../json-schemas/control/datetime.json | 3 ++ .../resources/json-schemas/control/money.json | 3 ++ .../json-schemas/control/number.json | 3 ++ .../resources/json-schemas/control/radio.json | 3 ++ .../resources/json-schemas/control/table.json | 3 ++ .../resources/json-schemas/control/text.json | 3 ++ .../json-schemas/control/textarea.json | 3 ++ .../json-schemas/property/constraints.json | 3 ++ .../PropertyPageMapperIntegrationTest.java | 42 +++++++++--------- .../mapper/SimpleControlMapperTest.java | 43 ++++++++++++------- .../content/mapper/TableMapperTest.java | 41 ++++++++++++++---- 21 files changed, 155 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/PropertyControl.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/PropertyControl.java index 108d9f9..041b070 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/PropertyControl.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/PropertyControl.java @@ -33,4 +33,5 @@ public abstract class PropertyControl extends Control { private Object value; private CustomValidation customValidation; private boolean required; + private boolean readonly; } diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/constraints/Constraints.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/constraints/Constraints.java index 6373ac7..fbfd139 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/constraints/Constraints.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/control/constraints/Constraints.java @@ -29,4 +29,5 @@ public class Constraints { private Constraint visibility; private Constraint requirement; + private Constraint modifiable; } diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/ControlMapper.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/ControlMapper.java index 2b2f1e1..240d9aa 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/ControlMapper.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/ControlMapper.java @@ -20,11 +20,9 @@ import com.avispa.ecm.model.configuration.propertypage.content.control.Control; -import java.util.List; - /** * @author Rafał Hiszpański */ interface ControlMapper { - void processControl(C control, List fillBlacklist, Object context); + void processControl(C control, PropertyPageMapperConfigurer configurer, Object context); } \ No newline at end of file diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapper.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapper.java index 2959051..ed0702e 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapper.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapper.java @@ -56,7 +56,7 @@ public PropertyPageContent convertToContent(PropertyPageMapperConfigurer configu propertyPageContent.setContext(configurer.getContext()); propertyPageContent.setId(propertyPage.getId()); - processControls(propertyPageContent.getControls(), configurer.getFillBlacklist(), context); + processControls(propertyPageContent.getControls(), configurer, context); return propertyPageContent; } @@ -81,20 +81,20 @@ private Optional getPropertyPageContent(Content content) { return Optional.empty(); } - private void processControls(List controls, List fillBlacklist, Object context) { + private void processControls(List controls, PropertyPageMapperConfigurer configurer, Object context) { for(Control control : controls) { if (control instanceof Columns columns) { - processControls(columns.getControls(), fillBlacklist, context); + processControls(columns.getControls(), configurer, context); } else if (control instanceof Group group) { - processControls(group.getControls(), fillBlacklist, context); + processControls(group.getControls(), configurer, context); } else if (control instanceof Tabs tabs) { for(Tab tab : tabs.getTabs()) { - processControls(tab.getControls(), fillBlacklist, context); + processControls(tab.getControls(), configurer, context); } } else if (control instanceof Table table) { - tableMapper.processControl(table, fillBlacklist, context); + tableMapper.processControl(table, configurer, context); } else { - simpleControlMapper.processControl(control, fillBlacklist, context); + simpleControlMapper.processControl(control, configurer, context); } } } diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperConfigurer.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperConfigurer.java index 94f4dd3..f6d6bb4 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperConfigurer.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperConfigurer.java @@ -51,4 +51,8 @@ public static PropertyPageMapperConfigurer edit() { private static PropertyPageMapperConfigurer writable(PropertyPageContext context, List ignoredFields) { return new PropertyPageMapperConfigurer(context, ignoredFields); } + + public boolean isReadonly() { + return context == PropertyPageContext.READONLY; + } } diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapper.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapper.java index c1a7e62..c5ce767 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapper.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapper.java @@ -48,7 +48,7 @@ class SimpleControlMapper extends BaseControlsMapper { this.displayService = displayService; } - public void processControl(Control control, List fillBlacklist, Object context) { + public void processControl(Control control, PropertyPageMapperConfigurer configurer, Object context) { if (control instanceof Label label) { try { label.setExpression(expressionResolver.resolve(context, label.getExpression())); @@ -60,6 +60,11 @@ public void processControl(Control control, List fillBlacklist, Object c propertyControl.setLabel(displayService.getDisplayValueFromAnnotation(context.getClass(), propertyControl.getProperty())); } + // mark all controls as readonly if property page is in readonly mode + if (configurer.isReadonly()) { + propertyControl.setReadonly(true); + } + if (control instanceof ComboRadio comboRadio) { if (comboRadio.getLoadSettings() instanceof DynamicLoad dynamicLoad) { try { @@ -71,7 +76,7 @@ public void processControl(Control control, List fillBlacklist, Object c comboRadio.setOptions(dictionaryControlLoader.loadDictionary(comboRadio, context)); } - fillPropertyValue(propertyControl, fillBlacklist, context); + fillPropertyValue(propertyControl, configurer.getFillBlacklist(), context); } } diff --git a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapper.java b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapper.java index a1393fe..fa02ce2 100644 --- a/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapper.java +++ b/src/main/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapper.java @@ -45,7 +45,7 @@ class TableMapper extends BaseControlsMapper { super(dictionaryControlLoader); } - public void processControl(Table table, List fillBlacklist, Object context) { + public void processControl(Table table, PropertyPageMapperConfigurer configurer, Object context) { Class tableRowClass = getTableRowClass(table, context.getClass()); table.getControls().stream() @@ -61,16 +61,28 @@ public void processControl(Table table, List fillBlacklist, Object conte comboRadio.setOptions(dictionaryControlLoader.loadDictionary(comboRadio, tableRowClass)); }); - // table controls except for checkboxes are always required + // mark table as readonly if property page is in readonly mode + if (configurer.isReadonly()) { + table.setReadonly(true); + } + table.getControls() - .forEach(control -> control.setRequired(!(control instanceof Checkbox))); + .forEach(control -> { + // table controls except for checkboxes are always required + control.setRequired(!(control instanceof Checkbox)); - // always add row id - Hidden hidden = new Hidden(); - hidden.setProperty("id"); - table.getControls().add(hidden); + // rewrite readonly value to the whole table + control.setReadonly(table.isReadonly()); + }); + + // add row id when table is not readonly + if (!table.isReadonly()) { + Hidden hidden = new Hidden(); + hidden.setProperty("id"); + table.getControls().add(hidden); + } - fillPropertyValue(table, fillBlacklist, context); + fillPropertyValue(table, configurer.getFillBlacklist(), context); } /** diff --git a/src/main/resources/json-schemas/control/checkbox.json b/src/main/resources/json-schemas/control/checkbox.json index a33febc..9dc0081 100644 --- a/src/main/resources/json-schemas/control/checkbox.json +++ b/src/main/resources/json-schemas/control/checkbox.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/combo.json b/src/main/resources/json-schemas/control/combo.json index 876f2ac..ab084e6 100644 --- a/src/main/resources/json-schemas/control/combo.json +++ b/src/main/resources/json-schemas/control/combo.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/date.json b/src/main/resources/json-schemas/control/date.json index b96c121..d6553ed 100644 --- a/src/main/resources/json-schemas/control/date.json +++ b/src/main/resources/json-schemas/control/date.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/datetime.json b/src/main/resources/json-schemas/control/datetime.json index 3c806ce..fd8424d 100644 --- a/src/main/resources/json-schemas/control/datetime.json +++ b/src/main/resources/json-schemas/control/datetime.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/money.json b/src/main/resources/json-schemas/control/money.json index 2fc8536..49619dc 100644 --- a/src/main/resources/json-schemas/control/money.json +++ b/src/main/resources/json-schemas/control/money.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/number.json b/src/main/resources/json-schemas/control/number.json index 9ae5946..ae49921 100644 --- a/src/main/resources/json-schemas/control/number.json +++ b/src/main/resources/json-schemas/control/number.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/radio.json b/src/main/resources/json-schemas/control/radio.json index 164730c..30c7ba3 100644 --- a/src/main/resources/json-schemas/control/radio.json +++ b/src/main/resources/json-schemas/control/radio.json @@ -19,6 +19,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "loadSettings": { "type": "object", "oneOf": [ diff --git a/src/main/resources/json-schemas/control/table.json b/src/main/resources/json-schemas/control/table.json index 45bac26..1c2798a 100644 --- a/src/main/resources/json-schemas/control/table.json +++ b/src/main/resources/json-schemas/control/table.json @@ -12,6 +12,9 @@ "label": { "type": "string" }, + "readonly": { + "type": "boolean" + }, "property": { "type": "string", "pattern": "^[a-zA-Z](?:[a-zA-Z\\d.]*[a-zA-Z\\d])?+$" diff --git a/src/main/resources/json-schemas/control/text.json b/src/main/resources/json-schemas/control/text.json index d4137bb..05dcbf5 100644 --- a/src/main/resources/json-schemas/control/text.json +++ b/src/main/resources/json-schemas/control/text.json @@ -11,6 +11,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "constraints": { "$ref": "../property/constraints.json#" } diff --git a/src/main/resources/json-schemas/control/textarea.json b/src/main/resources/json-schemas/control/textarea.json index f60b5bc..89ffcf0 100644 --- a/src/main/resources/json-schemas/control/textarea.json +++ b/src/main/resources/json-schemas/control/textarea.json @@ -19,6 +19,9 @@ "required": { "type": "boolean" }, + "readonly": { + "type": "boolean" + }, "rows": { "type": "integer", "minimum": 0 diff --git a/src/main/resources/json-schemas/property/constraints.json b/src/main/resources/json-schemas/property/constraints.json index 95d53ce..1a74e86 100644 --- a/src/main/resources/json-schemas/property/constraints.json +++ b/src/main/resources/json-schemas/property/constraints.json @@ -8,6 +8,9 @@ }, "requirement": { "$ref": "#/$defs/constraint" + }, + "modifiable": { + "$ref": "#/$defs/constraint" } }, "$defs": { diff --git a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperIntegrationTest.java b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperIntegrationTest.java index ecfbc5d..3ee4b47 100644 --- a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperIntegrationTest.java +++ b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/PropertyPageMapperIntegrationTest.java @@ -185,12 +185,12 @@ void columnsTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Columns); + assertInstanceOf(Columns.class, controls.get(0)); Columns columns = (Columns) controls.get(0); assertEquals(2, columns.getControls().size()); - assertTrue(columns.getControls().get(0) instanceof ComboRadio); - assertTrue(columns.getControls().get(1) instanceof Money); + assertInstanceOf(ComboRadio.class, columns.getControls().get(0)); + assertInstanceOf(Money.class, columns.getControls().get(1)); } @Test @@ -205,7 +205,7 @@ void comboTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof ComboRadio); + assertInstanceOf(ComboRadio.class, controls.get(0)); ComboRadio combo = (ComboRadio) controls.get(0); assertEquals("Combo test", combo.getLabel()); assertEquals("testString", combo.getProperty()); @@ -229,7 +229,7 @@ void dateTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof PropertyControl); + assertInstanceOf(PropertyControl.class, controls.get(0)); PropertyControl date = (PropertyControl) controls.get(0); assertEquals("Date test", date.getLabel()); assertEquals("testDate", date.getProperty()); @@ -248,7 +248,7 @@ void moneyTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Money); + assertInstanceOf(Money.class, controls.get(0)); Money money = (Money) controls.get(0); assertEquals("Money test", money.getLabel()); assertEquals("objectName", money.getProperty()); @@ -268,7 +268,7 @@ void numberTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Number); + assertInstanceOf(Number.class, controls.get(0)); Number number = (Number) controls.get(0); assertEquals("Number test", number.getLabel()); assertEquals("testInt", number.getProperty()); @@ -289,7 +289,7 @@ void radioTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof ComboRadio); + assertInstanceOf(ComboRadio.class, controls.get(0)); ComboRadio radio = (ComboRadio) controls.get(0); assertEquals("Radio test", radio.getLabel()); assertEquals("testString", radio.getProperty()); @@ -310,21 +310,21 @@ void tableTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Table); + assertInstanceOf(Table.class, controls.get(0)); Table table = (Table) controls.get(0); assertEquals("table", table.getProperty()); assertEquals(3, table.getControls().size()); PropertyControl control1 = table.getControls().get(0); - assertTrue(control1 instanceof Text); + assertInstanceOf(Text.class, control1); assertTrue(control1.isRequired()); PropertyControl control2 = table.getControls().get(1); - assertTrue(control2 instanceof Number); + assertInstanceOf(Number.class, control2); assertTrue(control2.isRequired()); PropertyControl control3 = table.getControls().get(2); - assertTrue(control3 instanceof Hidden); + assertInstanceOf(Hidden.class, control3); assertEquals("id", control3.getProperty()); } @@ -340,18 +340,18 @@ void tabsTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Tabs); + assertInstanceOf(Tabs.class, controls.get(0)); Tabs tabs = (Tabs) controls.get(0); assertEquals("Tabs test", tabs.getLabel()); assertEquals(2, tabs.getTabs().size()); Tab tab1 = tabs.getTabs().get(0); assertEquals("Tab 1", tab1.getName()); - assertTrue(tab1.getControls().get(0) instanceof Number); + assertInstanceOf(Number.class, tab1.getControls().get(0)); Tab tab2 = tabs.getTabs().get(1); assertEquals("Tab 2", tab2.getName()); - assertTrue(tab2.getControls().get(0) instanceof PropertyControl); + assertInstanceOf(PropertyControl.class, tab2.getControls().get(0)); } @Test @@ -366,7 +366,7 @@ void textareaTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Textarea); + assertInstanceOf(Textarea.class, controls.get(0)); Textarea textarea = (Textarea) controls.get(0); assertEquals("Textarea test", textarea.getLabel()); assertEquals("testString", textarea.getProperty()); @@ -385,8 +385,8 @@ void twoControlsTest() { List controls = propertyPageContent.getControls(); assertEquals(2, controls.size()); - assertTrue(controls.get(0) instanceof Label); - assertTrue(controls.get(1) instanceof Text); + assertInstanceOf(Label.class, controls.get(0)); + assertInstanceOf(Text.class, controls.get(1)); } @Test @@ -481,7 +481,7 @@ void nestedPropertyTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Text); + assertInstanceOf(Text.class, controls.get(0)); Text text = (Text) controls.get(0); assertEquals("Nested field", text.getValue()); } @@ -498,7 +498,7 @@ void tablePropertyTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Table); + assertInstanceOf(Table.class, controls.get(0)); Table table = (Table) controls.get(0); PropertyControl control1 = table.getControls().get(0); @@ -520,7 +520,7 @@ void constraintsTest() { List controls = propertyPageContent.getControls(); assertEquals(1, controls.size()); - assertTrue(controls.get(0) instanceof Number); + assertInstanceOf(Number.class, controls.get(0)); Number number = (Number) controls.get(0); Constraints constraints = number.getConstraints(); diff --git a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapperTest.java b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapperTest.java index 1bfeeb6..ce53638 100644 --- a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapperTest.java +++ b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/SimpleControlMapperTest.java @@ -30,11 +30,11 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import java.util.List; import java.util.Map; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -62,7 +62,7 @@ void givenLabelWithCorrectExpression_whenProcess_thenExpressionWasResolved() { TestDocument testDocument = new TestDocument(); - simpleControlMapper.processControl(label, List.of(), testDocument); + simpleControlMapper.processControl(label, PropertyPageMapperConfigurer.edit(), testDocument); verify(expressionResolver).resolve(testDocument, "$value('testString')"); } @@ -76,7 +76,7 @@ void givenPropertyWithoutLabel_whenProcess_thenLabelTakenFromAnnotation() { testDocument.setObjectName("Test document"); testDocument.setTestInt(12); - simpleControlMapper.processControl(text, List.of(), testDocument); + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.edit(), testDocument); assertEquals("Some test integer", text.getLabel()); assertEquals("12", text.getValue()); @@ -85,12 +85,13 @@ void givenPropertyWithoutLabel_whenProcess_thenLabelTakenFromAnnotation() { @Test void givenPropertyFromBlacklist_whenProcess_thenValueNotFilled() { Text text = new Text(); - text.setProperty("testInt"); + text.setProperty("id"); TestDocument testDocument = new TestDocument(); - testDocument.setTestInt(12); + testDocument.setId(UUID.randomUUID()); - simpleControlMapper.processControl(text, List.of("testInt"), testDocument); + // insert configuration excludes "id" property + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.insert(), testDocument); assertEquals("", text.getValue()); } @@ -101,7 +102,7 @@ void givenUnknownProperty_whenProcess_thenValueIsEmptyString() { text.setLabel("Label"); text.setProperty("nonExisting"); - simpleControlMapper.processControl(text, List.of(), new TestDocument()); + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.edit(), new TestDocument()); assertEquals("", text.getValue()); } @@ -113,7 +114,7 @@ void givenComboWithoutType_whenProcess_thenDictionaryLoadAttempt() { combo.setProperty("testString"); var context = new TestDocument(); - simpleControlMapper.processControl(combo, List.of(), context); + simpleControlMapper.processControl(combo, PropertyPageMapperConfigurer.edit(), context); verify(dictionaryControlLoader).loadDictionary(combo, context); } @@ -128,7 +129,7 @@ void givenComboWithTypeExpression_whenProcess_thenTypeDeductionAttempt() { combo.setLoadSettings(new DynamicLoad("$value('typeName')")); TestDocument testDocument = new TestDocument(); - simpleControlMapper.processControl(combo, List.of(), testDocument); + simpleControlMapper.processControl(combo, PropertyPageMapperConfigurer.edit(), testDocument); verify(expressionResolver).resolve(testDocument, "$value('typeName')"); } @@ -147,7 +148,7 @@ void givenControlWithObjectAsProperty_whenProcess_thenReturnMap() { testDocument.setNestedObject(nestedObject); - simpleControlMapper.processControl(text, List.of(), testDocument); + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.edit(), testDocument); assertEquals(Map.of("objectName", "Nested", "id", id.toString()), text.getValue()); } @@ -157,7 +158,7 @@ void givenControlWithNullObjectAsProperty_whenProcess_thenReturnMap() { Text text = new Text(); text.setProperty("nestedObject"); - simpleControlMapper.processControl(text, List.of(), new TestDocument()); + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.edit(), new TestDocument()); assertEquals("", text.getValue()); } @@ -165,18 +166,30 @@ void givenControlWithNullObjectAsProperty_whenProcess_thenReturnMap() { @Test void givenNestedPropertyOnBlacklist_whenProcess_thenValueNotFilled() { Text text = new Text(); - text.setProperty("nestedObject.objectName"); + text.setProperty("nestedObject.id"); TestDocument testDocument = new TestDocument(); - testDocument.setObjectName("Test document"); + testDocument.setId(UUID.randomUUID()); NestedObject nestedObject = new NestedObject(); - nestedObject.setObjectName("Nested"); + nestedObject.setId(UUID.randomUUID()); testDocument.setNestedObject(nestedObject); - simpleControlMapper.processControl(text, List.of("objectName"), testDocument); + // insert configuration excludes "id" property + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.insert(), testDocument); assertEquals("", text.getValue()); } + + @Test + void givenReadonlyMode_whenProcess_thenReadonlyIsPropagatedToControl() { + Text text = new Text(); + text.setProperty("id"); + text.setReadonly(false); + + simpleControlMapper.processControl(text, PropertyPageMapperConfigurer.readonly(), new TestDocument()); + + assertTrue(text.isReadonly()); + } } \ No newline at end of file diff --git a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapperTest.java b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapperTest.java index 0c1bfcd..b4c222e 100644 --- a/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapperTest.java +++ b/src/test/java/com/avispa/ecm/model/configuration/propertypage/content/mapper/TableMapperTest.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -62,8 +63,8 @@ void givenTableForNonExistingProperty_whenProcessControl_thenExceptionIsThrown(S table.setProperty(propertyName); TestDocument testDocument = new TestDocument(); - List emptyList = List.of(); - assertThrows(EcmException.class, () -> tableMapper.processControl(table, emptyList, testDocument)); + var config = PropertyPageMapperConfigurer.edit(); + assertThrows(EcmException.class, () -> tableMapper.processControl(table, config, testDocument)); } @Test @@ -82,7 +83,7 @@ void givenComboPropertyInTable_whenProcessControl_thenDictionaryLoadAttempt() { document.setObjectName("Table document"); testDocument.setTable(List.of(document)); - tableMapper.processControl(table, List.of(), testDocument); + tableMapper.processControl(table, PropertyPageMapperConfigurer.edit(), testDocument); verify(dictionaryControlLoader).loadDictionary(any(Combo.class), eq(Document.class)); } @@ -98,7 +99,7 @@ void givenDocumentWithNullList_whenProcessControl_thenTableSizeIsZero() { controls.add(text); table.setControls(controls); - tableMapper.processControl(table, List.of(), new TestDocument()); + tableMapper.processControl(table, PropertyPageMapperConfigurer.edit(), new TestDocument()); assertEquals(0, table.getSize()); } @@ -119,7 +120,7 @@ void givenPropertyInTable_whenProcessControl_thenTableIsCorrectlyProcessed() { document.setObjectName("Table document"); testDocument.setTable(List.of(document)); - tableMapper.processControl(table, List.of(), testDocument); + tableMapper.processControl(table, PropertyPageMapperConfigurer.edit(), testDocument); assertAll(() -> { assertEquals(1, table.getSize()); @@ -145,7 +146,7 @@ void givenNonExistingPropertyInTable_whenProcessControl_thenEmptyValueIsPopulate TestDocument testDocument = new TestDocument(); testDocument.setTable(List.of(new Document())); - tableMapper.processControl(table, List.of(), testDocument); + tableMapper.processControl(table, PropertyPageMapperConfigurer.edit(), testDocument); PropertyControl control = table.getControls().get(0); assertEquals(List.of(""), control.getValue()); @@ -164,13 +165,14 @@ void givenPropertyFromBlackListInTable_whenProcessControl_thenValueNotFilled() { TestDocument testDocument = new TestDocument(); Document document = new Document(); - document.setObjectName("Table document"); + document.setId(UUID.randomUUID()); Document document2 = new Document(); - document2.setObjectName("Table document 2"); + document2.setId(UUID.randomUUID()); testDocument.setTable(List.of(document, document2)); - tableMapper.processControl(table, List.of("objectName"), testDocument); + // insert configuration excludes "id" property + tableMapper.processControl(table, PropertyPageMapperConfigurer.insert(), testDocument); assertAll(() -> { assertEquals(2, table.getSize()); @@ -181,4 +183,25 @@ void givenPropertyFromBlackListInTable_whenProcessControl_thenValueNotFilled() { assertEquals(List.of("", ""), control.getValue()); }); } + + @Test + void givenReadonlyMode_whenProcess_thenReadonlyIsPropagatedToTableAndSubControls() { + Table table = new Table(); + table.setProperty("table"); + table.setReadonly(false); + + List controls = new ArrayList<>(); + Text text = new Text(); + text.setProperty("objectName"); + controls.add(text); + table.setControls(controls); + + TestDocument testDocument = new TestDocument(); + testDocument.setTable(List.of(new Document())); + + tableMapper.processControl(table, PropertyPageMapperConfigurer.readonly(), testDocument); + + assertTrue(table.isReadonly()); + table.getControls().forEach(control -> assertTrue(control.isReadonly())); + } } \ No newline at end of file