diff --git a/core/src/main/java/com/exadel/aem/toolkit/api/annotations/assets/dependson/DependsOn.java b/core/src/main/java/com/exadel/aem/toolkit/api/annotations/assets/dependson/DependsOn.java index 9a1a6d9df..0f58a2534 100644 --- a/core/src/main/java/com/exadel/aem/toolkit/api/annotations/assets/dependson/DependsOn.java +++ b/core/src/main/java/com/exadel/aem/toolkit/api/annotations/assets/dependson/DependsOn.java @@ -35,11 +35,11 @@ String query(); /** - * Defines the {@code dependsOnAction} attribute value - * @return String value, one of {@link DependsOnActions} items or a custom-defined action name + * Defines the {@code dependsOnAction} attribute value(s) + * @return String value(s), items from {@link DependsOnActions} or custom-defined action names * @see DependsOnActions */ - String action() default DependsOnActions.VISIBILITY; + String[] action() default {DependsOnActions.VISIBILITY}; /** * Defines custom static parameters to be used by DependsOn actions diff --git a/plugin/src/main/java/com/exadel/aem/toolkit/plugin/handlers/dependson/DependsOnHandler.java b/plugin/src/main/java/com/exadel/aem/toolkit/plugin/handlers/dependson/DependsOnHandler.java index cbf062fe2..de9383f6d 100644 --- a/plugin/src/main/java/com/exadel/aem/toolkit/plugin/handlers/dependson/DependsOnHandler.java +++ b/plugin/src/main/java/com/exadel/aem/toolkit/plugin/handlers/dependson/DependsOnHandler.java @@ -65,15 +65,23 @@ public void accept(Source source, Target target) { * @param target Resulting {@code Target} object */ private static void handleDependsOn(DependsOn value, Target target) { - if (StringUtils.isAnyBlank(value.query(), value.action())) { + String query = value.query(); + String[] actions = value.action(); + + if (StringUtils.isBlank(query) || actions.length == 0 || Arrays.stream(actions).anyMatch(StringUtils::isBlank)) { PluginRuntime.context().getExceptionHandler().handle(new ValidationException(EMPTY_VALUES_EXCEPTION_MESSAGE)); return; } Map valueMap = Maps.newHashMap(); - String escapedQuery = escapeValue(value.query()); + String escapedQuery = escapeValue(query); valueMap.put(DialogConstants.PN_DEPENDS_ON, escapedQuery); - valueMap.put(DialogConstants.PN_DEPENDS_ON_ACTION, value.action()); + + String actionValue = actions.length > 1 + ? String.join(DialogConstants.SEPARATOR_COMMA, actions) + : actions[0]; + valueMap.put(DialogConstants.PN_DEPENDS_ON_ACTION, actionValue); valueMap.putAll(buildParamsMap(value, 0)); + target.getOrCreateTarget(CoreConstants.NN_GRANITE_DATA).attributes(valueMap); } @@ -84,32 +92,35 @@ private static void handleDependsOn(DependsOn value, Target target) { */ private static void handleDependsOnConfig(DependsOnConfig value, Target target) { List validDeclarations = Arrays.stream(value.value()) - .filter(dependsOn -> StringUtils.isNoneBlank(dependsOn.action(), dependsOn.query())) - .collect(Collectors.toList()); + .filter(dependsOn -> StringUtils.isNotBlank(dependsOn.query()) + && dependsOn.action().length > 0 + && Arrays.stream(dependsOn.action()).allMatch(StringUtils::isNotBlank)) + .collect(Collectors.toList()); if (value.value().length != validDeclarations.size()) { PluginRuntime.context().getExceptionHandler() - .handle(new ValidationException(EMPTY_VALUES_EXCEPTION_MESSAGE)); + .handle(new ValidationException(EMPTY_VALUES_EXCEPTION_MESSAGE)); } Map valueMap = new HashMap<>(); String queries = validDeclarations.stream() - .map(DependsOn::query) - .map(str -> StringUtils.replace(str, ";", "\\\\;")) - .collect(Collectors.joining(DialogConstants.SEPARATOR_SEMICOLON)); + .map(DependsOn::query) + .map(str -> StringUtils.replace(str, ";", "\\\\;")) + .collect(Collectors.joining(DialogConstants.SEPARATOR_SEMICOLON)); String actions = validDeclarations.stream() - .map(DependsOn::action) - .collect(Collectors.joining(DialogConstants.SEPARATOR_SEMICOLON)); + .map(dependsOn -> dependsOn.action().length > 1 + ? String.join(DialogConstants.SEPARATOR_COMMA, dependsOn.action()) + : dependsOn.action()[0]) + .filter(StringUtils::isNotBlank) + .collect(Collectors.joining(DialogConstants.SEPARATOR_SEMICOLON)); valueMap.put(DialogConstants.PN_DEPENDS_ON, queries); valueMap.put(DialogConstants.PN_DEPENDS_ON_ACTION, actions); - Map counter = new HashMap<>(); validDeclarations.stream() - // Counting actions separately - .map(dependsOn -> DependsOnHandler.buildParamsMap(dependsOn, counter.merge(dependsOn.action(), 1, Integer::sum) - 1)) - .forEach(valueMap::putAll); + .map(dependsOn -> DependsOnHandler.buildParamsMap(dependsOn, counter.merge(String.join(",", dependsOn.action()), 1, Integer::sum) - 1)) + .forEach(valueMap::putAll); target.getOrCreateTarget(CoreConstants.NN_GRANITE_DATA).attributes(valueMap); } @@ -129,7 +140,7 @@ private static Map buildParamsMap(DependsOn dependsOn, int index String paramName = StringUtils.joinWith( CoreConstants.SEPARATOR_HYPHEN, DialogConstants.PN_DEPENDS_ON, - dependsOn.action(), + String.join(DialogConstants.SEPARATOR_COMMA, dependsOn.action()), param.name()); if (index > 0) { paramName = StringUtils.joinWith(CoreConstants.SEPARATOR_HYPHEN, paramName, index); diff --git a/plugin/src/main/java/com/exadel/aem/toolkit/plugin/utils/DialogConstants.java b/plugin/src/main/java/com/exadel/aem/toolkit/plugin/utils/DialogConstants.java index d4a85fd41..94b960da2 100644 --- a/plugin/src/main/java/com/exadel/aem/toolkit/plugin/utils/DialogConstants.java +++ b/plugin/src/main/java/com/exadel/aem/toolkit/plugin/utils/DialogConstants.java @@ -29,6 +29,7 @@ public class DialogConstants { public static final String WILDCARD = "*"; public static final String SEPARATOR_DOT = "."; + public static final String SEPARATOR_COMMA = ","; public static final String SEPARATOR_SEMICOLON = ";"; public static final String RELATIVE_PATH_PREFIX = CoreConstants.RELATIVE_PATH_PREFIX; diff --git a/plugin/src/test/com/exadel/aem/toolkit/plugin/handlers/dependson/cases/DependsOnSemicolon.java b/plugin/src/test/com/exadel/aem/toolkit/plugin/handlers/dependson/cases/DependsOnSemicolon.java index 7b0b57928..883ec8fd7 100644 --- a/plugin/src/test/com/exadel/aem/toolkit/plugin/handlers/dependson/cases/DependsOnSemicolon.java +++ b/plugin/src/test/com/exadel/aem/toolkit/plugin/handlers/dependson/cases/DependsOnSemicolon.java @@ -40,10 +40,15 @@ public class DependsOnSemicolon { @DialogField @TextField - @DependsOn(query = "';' === ';'") + @DependsOn(query = "@field1 === ';'") @DependsOn(query = "';' === ';'", action = DependsOnActions.REQUIRED) private String multipleActions; + @DialogField + @TextField + @DependsOn(query = "';' === ';'", action = {DependsOnActions.VISIBLE, DependsOnActions.REQUIRED}) + private String multipleActionsPerQuery; + @DialogField @TextField @DependsOn(query = "['a', 'b', 'c', 'd', 'e','[]','t;rex'].includes(@type(coral-multifield-item));") diff --git a/plugin/src/test/resources/handlers/dependsOn/dependsOnSemicolon/_cq_dialog.xml b/plugin/src/test/resources/handlers/dependsOn/dependsOnSemicolon/_cq_dialog.xml index ebd59f3bc..60d9d3a7a 100644 --- a/plugin/src/test/resources/handlers/dependsOn/dependsOnSemicolon/_cq_dialog.xml +++ b/plugin/src/test/resources/handlers/dependsOn/dependsOnSemicolon/_cq_dialog.xml @@ -41,9 +41,19 @@ renderHidden="{Boolean}false" required="{Boolean}false"> + + + { - const action = actions[i]; - actionCounter[action] = actionCounter[action] || 0; - const data = ns.parseActionData($el[0], action, actionCounter[action]++); - return new QueryObserver($el, query, action, data); + const queryObservers = queries.map((query, i) => { + const observerActions = actions[i].split(','); + const resultActions = observerActions.map(action => { + actionCounter[action] = actionCounter[action] || 0; + const data = ns.parseActionData($el[0], action, actionCounter[action]++); + return new QueryObserver($el, query, action, data); + }); + return resultActions; }); + return queryObservers.flat(); } /**