diff --git a/api/src/org/labkey/api/data/MultiChoice.java b/api/src/org/labkey/api/data/MultiChoice.java index 1e09ac40ac1..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 @@ -219,7 +220,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..c1240a601cc 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 = encodeURIComponent(s); + if (!decodeSingleQuote) + return encoded; + return Strings.CS.replace(encoded, "%27", "'"); + } + /** * Intended to be equivalent to JavaScript encodeURI(). */