diff --git a/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java b/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java index 625e9d4909..6b57ae7e4b 100644 --- a/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java +++ b/src/org/labkey/test/components/ui/grids/ResponsiveGrid.java @@ -256,7 +256,7 @@ private GridFilterModal initFilterColumn(CharSequence columnIdentifier, Filter.O { filterPanel.selectArrayFilterOperator(operator); } - if (value != null) + if (value != null && !((List) value).isEmpty()) { List values = (List) value; filterPanel.selectValue(values.get(0)); diff --git a/src/org/labkey/test/util/data/TestArrayDataUtils.java b/src/org/labkey/test/util/data/TestArrayDataUtils.java new file mode 100644 index 0000000000..e42856303b --- /dev/null +++ b/src/org/labkey/test/util/data/TestArrayDataUtils.java @@ -0,0 +1,43 @@ +package org.labkey.test.util.data; + +import org.labkey.remoteapi.query.Filter; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class TestArrayDataUtils +{ + /** + * Filtering Map according to filter and then sorting values in alphabetical order. + * + * @return filtered Map + */ + public static Map filterMap(Map> sourceMap, List searchValues, Filter.Operator filterType) + { + return sourceMap.entrySet().stream() + .filter(entry -> isMatch(entry.getValue(), searchValues, filterType)) + .collect(Collectors.toMap( + Map.Entry::getKey, + e -> e.getValue().stream().sorted().collect(Collectors.joining(", ")), + (e1, e2) -> e1, + LinkedHashMap::new + )); + } + + private static boolean isMatch(List actualValues, List searchValues, Filter.Operator type) + { + return switch (type) + { + case ARRAY_CONTAINS_ALL -> actualValues.containsAll(searchValues); + case ARRAY_CONTAINS_ANY -> searchValues.stream().anyMatch(actualValues::contains); + case ARRAY_CONTAINS_EXACT -> actualValues.size() == searchValues.size() && actualValues.containsAll(searchValues); + case ARRAY_CONTAINS_NONE -> searchValues.stream().noneMatch(actualValues::contains); + case ARRAY_CONTAINS_NOT_EXACT -> !(actualValues.size() == searchValues.size() && actualValues.containsAll(searchValues)); + case ARRAY_ISEMPTY -> actualValues.isEmpty(); + case ARRAY_ISNOTEMPTY -> !actualValues.isEmpty(); + default -> true; + }; + } +} \ No newline at end of file