From c616d5311bd2ec036fa8f470d5e7996a69a9b88d Mon Sep 17 00:00:00 2001 From: "kamil.orwat" Date: Tue, 22 Apr 2025 13:13:02 +0200 Subject: [PATCH 1/4] Fixed bug - Support multiselect with integers --- .../acm/core/code/arg/MultiSelectArgument.java | 6 +++--- .../src/components/CodeArgumentInput.tsx | 18 ++++++++---------- ui.frontend/src/utils/api.types.ts | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java index 7f493193..932575f6 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java @@ -12,7 +12,7 @@ public class MultiSelectArgument extends Argument { private Display display = Display.AUTO; - private Map options = new LinkedHashMap<>(); + private Map options = new LinkedHashMap<>(); public MultiSelectArgument(String name) { super(name, ArgumentType.MULTISELECT); @@ -27,11 +27,11 @@ public void setValue(V value) { super.setValue(value); } - public Map getOptions() { + public Map getOptions() { return options; } - public void setOptions(Map options) { + public void setOptions(Map options) { this.options = options; } diff --git a/ui.frontend/src/components/CodeArgumentInput.tsx b/ui.frontend/src/components/CodeArgumentInput.tsx index 226d8a4f..f32c7d8a 100644 --- a/ui.frontend/src/components/CodeArgumentInput.tsx +++ b/ui.frontend/src/components/CodeArgumentInput.tsx @@ -20,7 +20,7 @@ const CodeArgumentInput: React.FC = ({ arg }) => { const controllerRules = (arg: Argument) => ({ validate: (value: ArgumentValue) => { - if (arg.required && (value === null || value === undefined || value === '' || (typeof value === 'number' && isNaN(value)) || (typeof value == 'boolean' && !value))) { + if (arg.required && (value === null || value === undefined || value === '' || (typeof value === 'number' && isNaN(value)) || (typeof value == 'boolean' && !value) || (Array.isArray(value) && value.length === 0))) { return 'Value is required'; } if (arg.validator) { @@ -114,7 +114,7 @@ const CodeArgumentInput: React.FC = ({ arg }) => { orientation="horizontal" label={argLabel(arg)} errorMessage={fieldState.error ? fieldState.error.message : undefined} - validationState={fieldState.error ? 'invalid' : 'valid'} + isInvalid={!!fieldState.error} aria-label={`Argument '${arg.name}'`} > {Object.entries(arg.options).map(([label, val]) => ( @@ -130,7 +130,7 @@ const CodeArgumentInput: React.FC = ({ arg }) => { selectedKey={field.value?.toString() || ''} onSelectionChange={field.onChange} errorMessage={fieldState.error ? fieldState.error.message : undefined} - validationState={fieldState.error ? 'invalid' : 'valid'} + isInvalid={!!fieldState.error} aria-label={`Argument '${arg.name}'`} > {Object.entries(arg.options).map(([label, val]) => ( @@ -157,8 +157,9 @@ const CodeArgumentInput: React.FC = ({ arg }) => { orientation="horizontal" label={argLabel(arg)} errorMessage={fieldState.error ? fieldState.error.message : undefined} - validationState={fieldState.error ? 'invalid' : 'valid'} + isInvalid={!!fieldState.error} aria-label={`Argument '${arg.name}'`} + value={field.value.map(String)} > {Object.entries(arg.options).map(([label, val]) => ( @@ -171,9 +172,9 @@ const CodeArgumentInput: React.FC = ({ arg }) => {
field.onChange(Array.from(val as Set))} aria-label={`Argument '${arg.name}'`} > @@ -220,10 +221,7 @@ const CodeArgumentInput: React.FC = ({ arg }) => { }; function argLabel(arg: Argument): string { - if (arg.label) { - return arg.label; - } - return Strings.capitalizeWords(arg.name); + return arg.label ? arg.label : Strings.capitalizeWords(arg.name); } export default CodeArgumentInput; diff --git a/ui.frontend/src/utils/api.types.ts b/ui.frontend/src/utils/api.types.ts index cac5f825..cf60e543 100644 --- a/ui.frontend/src/utils/api.types.ts +++ b/ui.frontend/src/utils/api.types.ts @@ -58,7 +58,7 @@ export type SelectArgument = Argument & { }; export type MultiSelectArgument = Argument & { - options: Record; + options: Record; display: 'AUTO' | 'CHECKBOX' | 'DROPDOWN'; }; From 7d9c11b405f157c2751d2fdbc5f34c1b2686ccc1 Mon Sep 17 00:00:00 2001 From: "kamil.orwat" Date: Tue, 22 Apr 2025 13:16:42 +0200 Subject: [PATCH 2/4] Only integers and strings allowed --- .../com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java index 932575f6..59a21506 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java @@ -32,6 +32,10 @@ public Map getOptions() { } public void setOptions(Map options) { + boolean match = options.keySet().stream().allMatch(key -> key instanceof String || key instanceof Integer); + if (!match) { + throw new IllegalArgumentException("Multi-select keys can only be of type String or Integer!"); + } this.options = options; } From 5a8a4692f6e76a60f834ba076803ceab3d8d7d5a Mon Sep 17 00:00:00 2001 From: "kamil.orwat" Date: Mon, 28 Apr 2025 11:37:07 +0200 Subject: [PATCH 3/4] Adjusted to comments --- .../aem/acm/core/code/arg/MultiSelectArgument.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java index 59a21506..b0792171 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/code/arg/MultiSelectArgument.java @@ -12,7 +12,7 @@ public class MultiSelectArgument extends Argument { private Display display = Display.AUTO; - private Map options = new LinkedHashMap<>(); + private Map options = new LinkedHashMap<>(); public MultiSelectArgument(String name) { super(name, ArgumentType.MULTISELECT); @@ -27,16 +27,13 @@ public void setValue(V value) { super.setValue(value); } - public Map getOptions() { + public Map getOptions() { return options; } - public void setOptions(Map options) { - boolean match = options.keySet().stream().allMatch(key -> key instanceof String || key instanceof Integer); - if (!match) { - throw new IllegalArgumentException("Multi-select keys can only be of type String or Integer!"); - } - this.options = options; + public void setOptions(Map options) { + this.options = options.entrySet().stream() + .collect(Collectors.toMap(e -> ObjectUtils.toString(e.getKey()), Map.Entry::getValue)); } public void setOptions(Collection options) { From 8354e3eedca39417655dee9436897ad9e1c7eea0 Mon Sep 17 00:00:00 2001 From: "kamil.orwat" Date: Tue, 29 Apr 2025 09:24:26 +0200 Subject: [PATCH 4/4] reduced size in ListView --- ui.frontend/src/components/CodeArgumentInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui.frontend/src/components/CodeArgumentInput.tsx b/ui.frontend/src/components/CodeArgumentInput.tsx index f32c7d8a..3d527e9d 100644 --- a/ui.frontend/src/components/CodeArgumentInput.tsx +++ b/ui.frontend/src/components/CodeArgumentInput.tsx @@ -172,7 +172,7 @@ const CodeArgumentInput: React.FC = ({ arg }) => {
field.onChange(Array.from(val as Set))}