From da51bfa198bef2c452864b38e50a3381a4e3e5fc Mon Sep 17 00:00:00 2001 From: XingY Date: Fri, 13 Mar 2026 17:07:08 -0700 Subject: [PATCH 1/2] GitHub Issue 943 and 942 --- api/src/org/labkey/api/data/MultiChoice.java | 7 ++++++- api/src/org/labkey/api/query/QueryChangeListener.java | 6 ++++-- api/src/org/labkey/api/util/PageFlowUtil.java | 8 ++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/api/src/org/labkey/api/data/MultiChoice.java b/api/src/org/labkey/api/data/MultiChoice.java index 1e09ac40ac1..53e6d0b28ba 100644 --- a/api/src/org/labkey/api/data/MultiChoice.java +++ b/api/src/org/labkey/api/data/MultiChoice.java @@ -219,7 +219,12 @@ protected Array(Stream str) str.filter(Objects::nonNull) .map(s -> StringUtils.trimToNull(s.toString())) .filter(Objects::nonNull) - .forEach(setCaseSensitive::add); + .forEach(s -> + { + // GitHub Issue 942: Add error for duplicate values for MVTC fields + if (!setCaseSensitive.add(s)) + throw new ConversionExceptionWithMessage("Duplicate value provided: " + s); + }); array = setCaseSensitive.toArray(new String[0]); } diff --git a/api/src/org/labkey/api/query/QueryChangeListener.java b/api/src/org/labkey/api/query/QueryChangeListener.java index 0eaf4b5d209..72cda199c3f 100644 --- a/api/src/org/labkey/api/query/QueryChangeListener.java +++ b/api/src/org/labkey/api/query/QueryChangeListener.java @@ -224,7 +224,9 @@ private static String getUpdatedFilterStrFromMVTC(String filterStr, String prefi if (oldType.getPropertyType() != PropertyType.MULTI_CHOICE || newType.getPropertyType() == PropertyType.MULTI_CHOICE) return filterStr; - String columnNameEncoded = PageFlowUtil.encodeURIComponent(QueryKey.encodePart(columnName)); + // GitHub Issue 943: Converting between TC and MVTC results in bad saved views + // single quote should decode to match url filter + String columnNameEncoded = PageFlowUtil.encodeURIComponent(QueryKey.encodePart(columnName), true); String colLower = columnNameEncoded.toLowerCase(); String sLower = filterStr.toLowerCase(); @@ -285,7 +287,7 @@ private static String getUpdatedMVTCFilterStr(String filterStr, String prefix, S if (oldType.getPropertyType() == PropertyType.MULTI_CHOICE || newType.getPropertyType() != PropertyType.MULTI_CHOICE) return filterStr; - String columnNameEncoded = PageFlowUtil.encodeURIComponent(QueryKey.encodePart(columnName)); + String columnNameEncoded = PageFlowUtil.encodeURIComponent(QueryKey.encodePart(columnName), true); String colLower = columnNameEncoded.toLowerCase(); String sLower = filterStr.toLowerCase(); diff --git a/api/src/org/labkey/api/util/PageFlowUtil.java b/api/src/org/labkey/api/util/PageFlowUtil.java index a39139f9d5f..d33245c3592 100644 --- a/api/src/org/labkey/api/util/PageFlowUtil.java +++ b/api/src/org/labkey/api/util/PageFlowUtil.java @@ -747,6 +747,14 @@ public static String wafEncode(@Nullable String plain) return encode(s, true); } + public static @NotNull String encodeURIComponent(String s, boolean decodeSingleQuote) + { + String encoded = encode(s, true); + if (!decodeSingleQuote) + return encoded; + return Strings.CS.replace(encoded, "%27", "'"); + } + /** * Intended to be equivalent to JavaScript encodeURI(). */ From 7972373b426dacece7ffd2b71d5303c4a6b78fec Mon Sep 17 00:00:00 2001 From: XingY Date: Tue, 17 Mar 2026 09:39:00 -0700 Subject: [PATCH 2/2] Left align, code review changes --- api/src/org/labkey/api/data/MultiChoice.java | 1 + api/src/org/labkey/api/util/PageFlowUtil.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/data/MultiChoice.java b/api/src/org/labkey/api/data/MultiChoice.java index 53e6d0b28ba..d46d506a5ad 100644 --- a/api/src/org/labkey/api/data/MultiChoice.java +++ b/api/src/org/labkey/api/data/MultiChoice.java @@ -56,6 +56,7 @@ public static class DisplayColumn extends DataColumn public DisplayColumn(ColumnInfo col) { super(col, false); + setTextAlign("left"); // GitHub Issue 933: Left align MV cells in grids } @Override diff --git a/api/src/org/labkey/api/util/PageFlowUtil.java b/api/src/org/labkey/api/util/PageFlowUtil.java index d33245c3592..c1240a601cc 100644 --- a/api/src/org/labkey/api/util/PageFlowUtil.java +++ b/api/src/org/labkey/api/util/PageFlowUtil.java @@ -749,7 +749,7 @@ public static String wafEncode(@Nullable String plain) public static @NotNull String encodeURIComponent(String s, boolean decodeSingleQuote) { - String encoded = encode(s, true); + String encoded = encodeURIComponent(s); if (!decodeSingleQuote) return encoded; return Strings.CS.replace(encoded, "%27", "'");