From 5ef6785da4af3b4fbdc613d6c3c36e4f17e2dffe Mon Sep 17 00:00:00 2001 From: cnathe Date: Wed, 15 Apr 2026 10:21:39 -0500 Subject: [PATCH 1/2] GitHub Issue #1056: ConditionalFormat applied via DomainUtil.getPropertyDescriptor() doesn't handle multiple filter conditions - factor out XML metadata conditional format parsing and query string generation in ConditionalFormat.java to be reusable - use ConditionalFormat.buildFilterQueryString in DomainUtil.getPropertyDescriptor --- .../labkey/api/data/ConditionalFormat.java | 69 ++++++++++--------- .../labkey/api/exp/property/DomainUtil.java | 6 +- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/api/src/org/labkey/api/data/ConditionalFormat.java b/api/src/org/labkey/api/data/ConditionalFormat.java index f57c81dd1a0..822f5f99bc2 100644 --- a/api/src/org/labkey/api/data/ConditionalFormat.java +++ b/api/src/org/labkey/api/data/ConditionalFormat.java @@ -188,6 +188,42 @@ public String getCssStyle() return sb.toString(); } + /** + * Converts the XML filter entries for a single conditional format into a URL query string suitable for + * use as a {@link GWTConditionalFormat} filter value. + */ + @NotNull + public static String buildFilterQueryString(@Nullable ConditionalFormatFiltersType filters) + { + SimpleFilter simpleFilter = new SimpleFilter(); + if (null != filters) + { + ConditionalFormatFilterType[] filterArray = filters.getFilterArray(); + if (filterArray != null) + { + for (ConditionalFormatFilterType filter : filterArray) + { + CompareType compareType = CompareType.getByURLKey(filter.getOperator().toString()); + if (compareType != null) + simpleFilter.addClause(compareType.createFilterClause(FieldKey.fromParts(COLUMN_NAME), filter.getValue())); + else + LOG.warn("Could not find CompareType for " + filter.getOperator() + ", ignoring"); + } + } + } + try + { + // Process it through a URL to get the query string equivalent + URLHelper url = new URLHelper("/test"); + simpleFilter.applyToURL(url, DATA_REGION_NAME); + return url.getQueryString(); + } + catch (URISyntaxException e) + { + throw UnexpectedException.wrap(e); + } + } + /** Converts from the XMLBean representation to our standard class. Does not save to the database */ @NotNull public static List convertFromXML(ConditionalFormatsType conditionalFormats) @@ -200,38 +236,7 @@ public static List convertFromXML(ConditionalFormatsType cond for (ConditionalFormatType xmlFormat : conditionalFormats.getConditionalFormatArray()) { ConditionalFormat format = new ConditionalFormat(); - SimpleFilter simpleFilter = new SimpleFilter(); - ConditionalFormatFiltersType filters = xmlFormat.getFilters(); - if (null != filters) - { - ConditionalFormatFilterType[] filterArray = filters.getFilterArray(); - if (filterArray != null) - { - for (ConditionalFormatFilterType filter : filterArray) - { - CompareType compareType = CompareType.getByURLKey(filter.getOperator().toString()); - if (compareType != null) - { - simpleFilter.addClause(compareType.createFilterClause(FieldKey.fromParts(COLUMN_NAME), filter.getValue())); - } - else - { - LOG.warn("Could not find CompareType for " + filter.getOperator() + ", ignoring"); - } - } - } - } - try - { - // Process it through a URL to get the query string equivalent - URLHelper url = new URLHelper("/test"); - simpleFilter.applyToURL(url, DATA_REGION_NAME); - format.setFilter(url.getQueryString()); - } - catch (URISyntaxException e) - { - throw UnexpectedException.wrap(e); - } + format.setFilter(buildFilterQueryString(xmlFormat.getFilters())); if (xmlFormat.isSetBold() && xmlFormat.getBold()) { format.setBold(true); diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index 933a0fb33aa..181f304da49 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -48,7 +48,6 @@ import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableInfo.IndexDefinition; import org.labkey.api.data.TableSelector; -import org.labkey.api.dataiterator.DataIteratorUtil; import org.labkey.api.defaults.DefaultValueService; import org.labkey.api.exp.ChangePropertyDescriptorException; import org.labkey.api.exp.DomainDescriptor; @@ -97,7 +96,6 @@ import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.view.UnauthorizedException; import org.labkey.data.xml.ColumnType; -import org.labkey.data.xml.ConditionalFormatFilterType; import org.labkey.data.xml.ConditionalFormatType; import org.labkey.data.xml.TableType; @@ -661,9 +659,7 @@ public static GWTPropertyDescriptor getPropertyDescriptor(ColumnType columnXml) gwtFormat.setStrikethrough(formatType.getStrikethrough()); gwtFormat.setTextColor(formatType.getTextColor()); gwtFormat.setBackgroundColor(formatType.getBackgroundColor()); - for (ConditionalFormatFilterType filterType : formatType.getFilters().getFilterArray()) - gwtFormat.setFilter("format.column%7E" + filterType.getOperator().toString() + "=" + filterType.getValue()); - + gwtFormat.setFilter(ConditionalFormat.buildFilterQueryString(formatType.getFilters())); // GitHub Issue #1056 formats.add(gwtFormat); } gwtProp.setConditionalFormats(formats); From 33e729cceee7bb2128f560892e5693f07ed50a72 Mon Sep 17 00:00:00 2001 From: cnathe Date: Wed, 15 Apr 2026 10:28:34 -0500 Subject: [PATCH 2/2] Claude CR feedback: annotation update --- api/src/org/labkey/api/data/ConditionalFormat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/ConditionalFormat.java b/api/src/org/labkey/api/data/ConditionalFormat.java index 822f5f99bc2..19b5877042e 100644 --- a/api/src/org/labkey/api/data/ConditionalFormat.java +++ b/api/src/org/labkey/api/data/ConditionalFormat.java @@ -192,7 +192,7 @@ public String getCssStyle() * Converts the XML filter entries for a single conditional format into a URL query string suitable for * use as a {@link GWTConditionalFormat} filter value. */ - @NotNull + @Nullable public static String buildFilterQueryString(@Nullable ConditionalFormatFiltersType filters) { SimpleFilter simpleFilter = new SimpleFilter();