From 19d6d77549b52f6bed08bc1ba4d1b80a06204a90 Mon Sep 17 00:00:00 2001 From: cnathe Date: Fri, 31 Jul 2026 08:33:13 -0500 Subject: [PATCH 1/6] Sample listing grid updates to include ExpMaterialColor and use SAMPLE_COLOR_REQUIRED_COLUMNS in requiredColumns --- .../src/org/labkey/experiment/api/ExpMaterialTableImpl.java | 6 +++--- .../experiment/controllers/exp/ExperimentController.java | 2 ++ list/src/org/labkey/list/model/ListTable.java | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java index 176aec9b24e..0bf436a70f5 100644 --- a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java @@ -867,6 +867,9 @@ protected void populateColumns() addColumn(SampleSet); addColumn(MaterialExpDate); defaultCols.add(MaterialExpDate.fieldKey()); + addColumn(ExpMaterialColor); + if (colorsEnabled(getContainer())) + defaultCols.add(ExpMaterialColor.fieldKey()); addContainerColumn(Folder, null); if (getContainer().hasProductFolders()) defaultCols.add(Folder.fieldKey()); @@ -886,9 +889,6 @@ protected void populateColumns() addColumn(SampleState); if (isStatusEnabled(getContainer())) defaultCols.add(SampleState.fieldKey()); - addColumn(ExpMaterialColor); - if (colorsEnabled(getContainer())) - defaultCols.add(ExpMaterialColor.fieldKey()); // TODO is this a real Domain??? if (st != null && !"urn:lsid:labkey.com:SampleSource:Default".equals(st.getDomain().getTypeURI())) diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 93211baf5d7..e11c566adea 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -7739,6 +7739,7 @@ private SQLFragment getOrderedRowsSql() sampleColumns.addAll(Arrays.asList( "S.Name AS SampleID", "S.MaterialExpDate AS ExpirationDate", + "S.ExpMaterialColor", // TODO should this be conditional? "S.SampleSet as SampleType", "S.SampleState", "S.isAliquot", @@ -7751,6 +7752,7 @@ private SQLFragment getOrderedRowsSql() sampleColumns.addAll(Arrays.asList( "S.Name AS SampleID", "S.MaterialExpDate AS ExpirationDate", + "S.ExpMaterialColor", // TODO should this be conditional? "S.LabelColor", "S.SampleSet", "S.SampleState", diff --git a/list/src/org/labkey/list/model/ListTable.java b/list/src/org/labkey/list/model/ListTable.java index f388054a4ae..be4d596688f 100644 --- a/list/src/org/labkey/list/model/ListTable.java +++ b/list/src/org/labkey/list/model/ListTable.java @@ -104,9 +104,10 @@ public class ListTable extends FilteredTable implements Updatea { defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Name")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "MaterialExpDate")); + defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "ExpMaterialColor")); // TODO should this be conditional? defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "LabelColor")); - defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Folder")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "SampleSet")); + defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Folder")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "SampleState")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "StoredAmount")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Units")); From 77a461d3523c0d3269c3cbe644736437e84dce12 Mon Sep 17 00:00:00 2001 From: cnathe Date: Fri, 31 Jul 2026 14:46:03 -0500 Subject: [PATCH 2/6] ExperimentService getActiveProjectColors() --- .../src/org/labkey/api/exp}/api/DataColor.java | 2 +- api/src/org/labkey/api/exp/api/ExperimentService.java | 2 ++ experiment/src/org/labkey/experiment/ExpDataIterators.java | 2 +- .../src/org/labkey/experiment/api/DataColorManager.java | 1 + .../src/org/labkey/experiment/api/DataColorTable.java | 1 + .../org/labkey/experiment/api/ExperimentServiceImpl.java | 7 +++++++ 6 files changed, 13 insertions(+), 2 deletions(-) rename {experiment/src/org/labkey/experiment => api/src/org/labkey/api/exp}/api/DataColor.java (96%) diff --git a/experiment/src/org/labkey/experiment/api/DataColor.java b/api/src/org/labkey/api/exp/api/DataColor.java similarity index 96% rename from experiment/src/org/labkey/experiment/api/DataColor.java rename to api/src/org/labkey/api/exp/api/DataColor.java index 02edbd45f17..0db66b1220d 100644 --- a/experiment/src/org/labkey/experiment/api/DataColor.java +++ b/api/src/org/labkey/api/exp/api/DataColor.java @@ -3,7 +3,7 @@ * * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 */ -package org.labkey.experiment.api; +package org.labkey.api.exp.api; import org.labkey.api.data.Container; import org.labkey.api.data.Entity; diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index fd0b9fce06f..9f4d018e61d 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -1161,6 +1161,8 @@ List getExpProtocolsWithParameterValue( @NotNull Set getActiveDataTypeColors(@NotNull Container container, DataTypeForExclusion dataType, long dataTypeId); + @NotNull List getActiveProjectColors(@NotNull Container container); + @Nullable String getDataColorLabel(@NotNull Container container, long colorRowId); boolean ensureDataColorExclusions(long dataTypeId, DataTypeForExclusion dataType, @Nullable Collection disabledColorRowIds, @NotNull Container container, User user); diff --git a/experiment/src/org/labkey/experiment/ExpDataIterators.java b/experiment/src/org/labkey/experiment/ExpDataIterators.java index d63d8503123..0c5e89867fb 100644 --- a/experiment/src/org/labkey/experiment/ExpDataIterators.java +++ b/experiment/src/org/labkey/experiment/ExpDataIterators.java @@ -119,7 +119,7 @@ import org.labkey.experiment.api.ExpMaterialTableImpl; import org.labkey.experiment.api.ExpRunItemTableImpl; import org.labkey.experiment.api.ExpSampleTypeImpl; -import org.labkey.experiment.api.DataColor; +import org.labkey.api.exp.api.DataColor; import org.labkey.experiment.api.DataColorManager; import org.labkey.experiment.api.ExperimentServiceImpl; import org.labkey.experiment.api.SampleTypeServiceImpl; diff --git a/experiment/src/org/labkey/experiment/api/DataColorManager.java b/experiment/src/org/labkey/experiment/api/DataColorManager.java index 64abd476a97..4d014261f43 100644 --- a/experiment/src/org/labkey/experiment/api/DataColorManager.java +++ b/experiment/src/org/labkey/experiment/api/DataColorManager.java @@ -15,6 +15,7 @@ import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.Sort; import org.labkey.api.data.TableSelector; +import org.labkey.api.exp.api.DataColor; import java.util.ArrayList; import java.util.Collections; diff --git a/experiment/src/org/labkey/experiment/api/DataColorTable.java b/experiment/src/org/labkey/experiment/api/DataColorTable.java index 20213be821b..ea990b7e977 100644 --- a/experiment/src/org/labkey/experiment/api/DataColorTable.java +++ b/experiment/src/org/labkey/experiment/api/DataColorTable.java @@ -26,6 +26,7 @@ import org.labkey.api.data.SqlSelector; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; +import org.labkey.api.exp.api.DataColor; import org.labkey.api.exp.api.ExpMaterial; import org.labkey.api.exp.api.ExpSampleType; import org.labkey.api.exp.api.ExperimentService; diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 3f1c735caab..580468372fd 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -123,6 +123,7 @@ import org.labkey.api.exp.XarSource; import org.labkey.api.exp.api.ColumnExporter; import org.labkey.api.exp.api.DataClassDomainKindProperties; +import org.labkey.api.exp.api.DataColor; import org.labkey.api.exp.api.DataType; import org.labkey.api.exp.api.ExpData; import org.labkey.api.exp.api.ExpDataClass; @@ -9156,6 +9157,12 @@ public String getDisabledDataTypeAuditMsg(DataTypeForExclusion type, List .collect(toSet()); } + @Override + public @NotNull List getActiveProjectColors(@NotNull Container container) + { + return DataColorManager.getInstance().getActiveProjectColors(container); + } + // Applies a reconciled set of exclusion changes to exp.DataTypeColorExclusion in one transaction: one key column is // held fixed (fixedColumn = fixedValue), the other varies. Rows in toAdd are inserted; rows in toRemove are deleted. // Shared by ensureDataColorExclusions (fixes DataTypeRowId, varies ColorRowId) and updateColorDataTypeExclusions From a7e4fb4b4ffbe7f4d55bf737296619284c477508 Mon Sep 17 00:00:00 2001 From: cnathe Date: Fri, 31 Jul 2026 16:03:27 -0500 Subject: [PATCH 3/6] remove experimental feature flag --- api/src/org/labkey/api/exp/api/ExperimentService.java | 2 -- experiment/src/org/labkey/experiment/ExperimentModule.java | 3 --- .../src/org/labkey/experiment/api/ExpMaterialTableImpl.java | 3 --- 3 files changed, 8 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index 9f4d018e61d..c988bd7260b 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -134,8 +134,6 @@ public interface ExperimentService extends ExperimentRunTypeSource String EXPERIMENTAL_FEATURE_ALLOW_ROW_ID_MERGE = "org.labkey.experiment.api.SampleTypeUpdateServiceDI#ALLOW_ROW_ID_SAMPLE_MERGE"; - String EXPERIMENTAL_SAMPLE_COLORS = "org.labkey.api.exp.api.ExperimentService#SAMPLE_COLORS"; - int SIMPLE_PROTOCOL_FIRST_STEP_SEQUENCE = 1; int SIMPLE_PROTOCOL_CORE_STEP_SEQUENCE = 10; int SIMPLE_PROTOCOL_EXTRA_STEP_SEQUENCE = 15; diff --git a/experiment/src/org/labkey/experiment/ExperimentModule.java b/experiment/src/org/labkey/experiment/ExperimentModule.java index 2b907df70ea..65a12bf56fb 100644 --- a/experiment/src/org/labkey/experiment/ExperimentModule.java +++ b/experiment/src/org/labkey/experiment/ExperimentModule.java @@ -298,8 +298,6 @@ protected void init() "Support for querying lineage of experiment objects", false, true); OptionalFeatureService.get().addExperimentalFeatureFlag(ExperimentService.EXPERIMENTAL_FEATURE_ALLOW_ROW_ID_MERGE, "Allow RowId to be accepted when merging samples or data class data", "If the incoming data includes a RowId column we will allow the column but ignore it's values.", false, true); - OptionalFeatureService.get().addExperimentalFeatureFlag(ExperimentService.EXPERIMENTAL_SAMPLE_COLORS, "Sample Colors", - "Enable assigning custom colors to individual samples, with an app-level color palette configurable per sample type.", false, true); RoleManager.registerPermission(new DesignVocabularyPermission(), true); RoleManager.registerRole(new SampleTypeDesignerRole()); @@ -1239,7 +1237,6 @@ public JSONObject getPageContextJson(ContainerUser context) { JSONObject json = super.getPageContextJson(context); json.put(SAMPLE_FILES_TABLE, OptionalFeatureService.get().isFeatureEnabled(SAMPLE_FILES_TABLE)); - json.put("SampleColors", OptionalFeatureService.get().isFeatureEnabled(ExperimentService.EXPERIMENTAL_SAMPLE_COLORS)); return json; } } diff --git a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java index 0bf436a70f5..50925692e3e 100644 --- a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java @@ -118,7 +118,6 @@ import org.labkey.api.security.permissions.Permission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; -import org.labkey.api.settings.OptionalFeatureService; import org.labkey.api.test.TestWhen; import org.labkey.api.util.ContextListener; import org.labkey.api.util.GUID; @@ -774,8 +773,6 @@ private static boolean isStatusEnabled(Container c) private boolean colorsEnabled(Container c) { - if (!OptionalFeatureService.get().isFeatureEnabled(ExperimentService.EXPERIMENTAL_SAMPLE_COLORS)) - return false; if (_ss != null) return !ExperimentService.get().getActiveDataTypeColors(c, ExperimentService.DataTypeForExclusion.SampleType, _ss.getRowId()).isEmpty(); return !DataColorManager.getInstance().getActiveProjectColors(c).isEmpty(); From 3b059e9eb6d97198da3c039cff78dd5c8d78923c Mon Sep 17 00:00:00 2001 From: cnathe Date: Wed, 5 Aug 2026 11:12:21 -0500 Subject: [PATCH 4/6] ExperimentService getDataColorLabel -> getDataColor --- api/src/org/labkey/api/audit/SampleTimelineAuditEvent.java | 7 ++++++- api/src/org/labkey/api/exp/api/ExperimentService.java | 2 +- .../org/labkey/experiment/api/ExperimentServiceImpl.java | 3 +-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/src/org/labkey/api/audit/SampleTimelineAuditEvent.java b/api/src/org/labkey/api/audit/SampleTimelineAuditEvent.java index 7d7e7bb3f12..2ca84b2770c 100644 --- a/api/src/org/labkey/api/audit/SampleTimelineAuditEvent.java +++ b/api/src/org/labkey/api/audit/SampleTimelineAuditEvent.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.data.Container; +import org.labkey.api.exp.api.DataColor; import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.qc.DataState; import org.labkey.api.qc.SampleStatusService; @@ -278,7 +279,11 @@ private String getColorLabel(Map row, Container container) { String value = row.get(ExpMaterialColor.name()); if (!StringUtils.isBlank(value)) - return ExperimentService.get().getDataColorLabel(container, Long.parseLong(value)); + { + DataColor dataColor = ExperimentService.get().getDataColor(container, Long.parseLong(value)); + if (dataColor != null) + return dataColor.getLabel(); + } return null; } } diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index c988bd7260b..d7f17f8850a 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -1161,7 +1161,7 @@ List getExpProtocolsWithParameterValue( @NotNull List getActiveProjectColors(@NotNull Container container); - @Nullable String getDataColorLabel(@NotNull Container container, long colorRowId); + @Nullable DataColor getDataColor(@NotNull Container container, long colorRowId); boolean ensureDataColorExclusions(long dataTypeId, DataTypeForExclusion dataType, @Nullable Collection disabledColorRowIds, @NotNull Container container, User user); diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 580468372fd..1c60c276b20 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -9138,11 +9138,10 @@ public String getDisabledDataTypeAuditMsg(DataTypeForExclusion type, List } @Override - public @Nullable String getDataColorLabel(@NotNull Container container, long colorRowId) + public @Nullable DataColor getDataColor(@NotNull Container container, long colorRowId) { return DataColorManager.getInstance().getAllProjectColors(container).stream() .filter(c -> c.getRowId() == colorRowId) - .map(DataColor::getLabel) .findFirst() .orElse(null); } From 195648fb34f00fbe0a6e06fbf8b68479b8d18ed7 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 13 Aug 2026 10:16:02 -0500 Subject: [PATCH 5/6] remove todos --- .../experiment/controllers/exp/ExperimentController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 3f2e5ff89fc..f2482d60011 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -7743,7 +7743,7 @@ private SQLFragment getOrderedRowsSql() sampleColumns.addAll(Arrays.asList( "S.Name AS SampleID", "S.MaterialExpDate AS ExpirationDate", - "S.ExpMaterialColor", // TODO should this be conditional? + "S.ExpMaterialColor", "S.SampleSet as SampleType", "S.SampleState", "S.isAliquot", @@ -7756,7 +7756,7 @@ private SQLFragment getOrderedRowsSql() sampleColumns.addAll(Arrays.asList( "S.Name AS SampleID", "S.MaterialExpDate AS ExpirationDate", - "S.ExpMaterialColor", // TODO should this be conditional? + "S.ExpMaterialColor", "S.LabelColor", "S.SampleSet", "S.SampleState", From 10f748a06d93c969ec0fa83a54a2ef4f84e76b01 Mon Sep 17 00:00:00 2001 From: cnathe Date: Thu, 13 Aug 2026 11:52:41 -0500 Subject: [PATCH 6/6] ExperimentService getAllProjectColors() --- api/src/org/labkey/api/exp/api/ExperimentService.java | 2 ++ .../src/org/labkey/experiment/api/DataColorManager.java | 6 ------ .../org/labkey/experiment/api/ExperimentServiceImpl.java | 8 +++++++- list/src/org/labkey/list/model/ListTable.java | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/ExperimentService.java b/api/src/org/labkey/api/exp/api/ExperimentService.java index 55ab27ee4f1..df5fda1959b 100644 --- a/api/src/org/labkey/api/exp/api/ExperimentService.java +++ b/api/src/org/labkey/api/exp/api/ExperimentService.java @@ -1160,6 +1160,8 @@ List getExpProtocolsWithParameterValue( @NotNull List getActiveProjectColors(@NotNull Container container); + @NotNull List getAllProjectColors(@NotNull Container container); + @Nullable DataColor getDataColor(@NotNull Container container, long colorRowId); boolean ensureDataColorExclusions(long dataTypeId, DataTypeForExclusion dataType, @Nullable Collection disabledColorRowIds, @NotNull Container container, User user); diff --git a/experiment/src/org/labkey/experiment/api/DataColorManager.java b/experiment/src/org/labkey/experiment/api/DataColorManager.java index 4d014261f43..dcc10500385 100644 --- a/experiment/src/org/labkey/experiment/api/DataColorManager.java +++ b/experiment/src/org/labkey/experiment/api/DataColorManager.java @@ -92,12 +92,6 @@ public List getColors(Container container) return CACHE.get(container)._colors; } - @NotNull - public List getActiveColors(Container container) - { - return getColors(container).stream().filter(c -> !c.isArchived()).toList(); - } - @NotNull public List getAllProjectColors(Container container) { diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 6428eb746f5..c9844aad61a 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -9187,7 +9187,7 @@ public String getDisabledDataTypeAuditMsg(DataTypeForExclusion type, List @Override public @Nullable DataColor getDataColor(@NotNull Container container, long colorRowId) { - return DataColorManager.getInstance().getAllProjectColors(container).stream() + return getAllProjectColors(container).stream() .filter(c -> c.getRowId() == colorRowId) .findFirst() .orElse(null); @@ -9209,6 +9209,12 @@ public String getDisabledDataTypeAuditMsg(DataTypeForExclusion type, List return DataColorManager.getInstance().getActiveProjectColors(container); } + @Override + public @NotNull List getAllProjectColors(@NotNull Container container) + { + return DataColorManager.getInstance().getAllProjectColors(container); + } + // Applies a reconciled set of exclusion changes to exp.DataTypeColorExclusion in one transaction: one key column is // held fixed (fixedColumn = fixedValue), the other varies. Rows in toAdd are inserted; rows in toRemove are deleted. // Shared by ensureDataColorExclusions (fixes DataTypeRowId, varies ColorRowId) and updateColorDataTypeExclusions diff --git a/list/src/org/labkey/list/model/ListTable.java b/list/src/org/labkey/list/model/ListTable.java index be4d596688f..0d0f1b0a6f1 100644 --- a/list/src/org/labkey/list/model/ListTable.java +++ b/list/src/org/labkey/list/model/ListTable.java @@ -104,7 +104,7 @@ public class ListTable extends FilteredTable implements Updatea { defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Name")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "MaterialExpDate")); - defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "ExpMaterialColor")); // TODO should this be conditional? + defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "ExpMaterialColor")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "LabelColor")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "SampleSet")); defaultPicklistVisibleColumns.add(FieldKey.fromParts(PICKLIST_SAMPLE_ID, "Folder"));