From c681ec0d84ab071e14332ba9c52b8cd87262551f Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Tue, 16 Jun 2026 16:57:16 -0700 Subject: [PATCH 1/3] Issue #980: Deprecate the UI for deriving samples in LKS --- api/src/org/labkey/api/settings/AppProps.java | 1 + .../src/org/labkey/experiment/ExperimentModule.java | 8 ++++++++ .../experiment/controllers/exp/ExperimentController.java | 6 ++++-- .../controllers/exp/SampleTypeContentsView.java | 5 ++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/api/src/org/labkey/api/settings/AppProps.java b/api/src/org/labkey/api/settings/AppProps.java index 9f45bb43cfc..35ee6f6aa5d 100644 --- a/api/src/org/labkey/api/settings/AppProps.java +++ b/api/src/org/labkey/api/settings/AppProps.java @@ -46,6 +46,7 @@ public interface AppProps String SCOPE_OPTIONAL_FEATURE = "ExperimentalFeature"; // Startup property prefix for all optional features; "Experimental" for historical reasons. String EXPERIMENTAL_NO_GUESTS = "disableGuestAccount"; String EXPERIMENTAL_BLOCKER = "blockMaliciousClients"; + String DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP = "deriveSamplesNotInApp"; String EXPERIMENTAL_RESOLVE_PROPERTY_URI_COLUMNS = "resolve-property-uri-columns"; String ADMIN_PROVIDED_ALLOWED_EXTERNAL_RESOURCES = "allowedExternalResources"; String QUANTITY_COLUMN_SUFFIX_TESTING = "quantityColumnSuffixTesting"; diff --git a/experiment/src/org/labkey/experiment/ExperimentModule.java b/experiment/src/org/labkey/experiment/ExperimentModule.java index 679035c9d02..4c330759e82 100644 --- a/experiment/src/org/labkey/experiment/ExperimentModule.java +++ b/experiment/src/org/labkey/experiment/ExperimentModule.java @@ -96,6 +96,7 @@ import org.labkey.api.security.User; import org.labkey.api.security.roles.RoleManager; import org.labkey.api.settings.AppProps; +import org.labkey.api.settings.OptionalFeatureFlag; import org.labkey.api.settings.OptionalFeatureService; import org.labkey.api.usageMetrics.UsageMetricsService; import org.labkey.api.util.GUID; @@ -264,6 +265,13 @@ protected void init() ExperimentService.get().registerNameExpressionType("aliquots", "exp", "MaterialSource", "aliquotnameexpression"); ExperimentService.get().registerNameExpressionType("dataclass", "exp", "DataClass", "nameexpression"); + OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag( + AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP, + "Show Derive Samples button in LabKey Server UI", + "Shows the Derive Samples button in samples grids in the LabKey Server UI. This option will be removed in LabKey Server 26.11", + false, + false, + OptionalFeatureService.FeatureType.Deprecated)); OptionalFeatureService.get().addExperimentalFeatureFlag(AppProps.EXPERIMENTAL_RESOLVE_PROPERTY_URI_COLUMNS, "Resolve property URIs as columns on experiment tables", "If a column is not found on an experiment table, attempt to resolve the column name as a Property URI and add it as a property column", false, true); if (CoreSchema.getInstance().getSqlDialect().isSqlServer()) diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index ac89d3f9d0d..a306dc18213 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -205,6 +205,7 @@ import org.labkey.api.security.permissions.UpdatePermission; import org.labkey.api.settings.AppProps; import org.labkey.api.settings.ConceptURIProperties; +import org.labkey.api.settings.OptionalFeatureService; import org.labkey.api.sql.LabKeySql; import org.labkey.api.study.Dataset; import org.labkey.api.study.StudyService; @@ -1107,7 +1108,8 @@ public ModelAndView getView(Object o, BindException errors) protected void populateButtonBar(DataView view, ButtonBar bar) { super.populateButtonBar(view, bar); - bar.add(SampleTypeContentsView.getDeriveSamplesButton(getContainer(),null)); + if (OptionalFeatureService.get().isFeatureEnabled(AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP)) + bar.add(SampleTypeContentsView.getDeriveSamplesButton(getContainer(),null)); } }; view.setShowDetailsColumn(false); @@ -1247,7 +1249,7 @@ public VBox getView(ExpObjectForm form, BindException errors) throws Exception } } - if (getContainer().hasPermission(getUser(), InsertPermission.class)) + if (getContainer().hasPermission(getUser(), InsertPermission.class) && OptionalFeatureService.get().isFeatureEnabled(AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP)) { ActionURL deriveURL = new ActionURL(DeriveSamplesChooseTargetAction.class, getContainer()); deriveURL.addParameter("rowIds", _material.getRowId()); diff --git a/experiment/src/org/labkey/experiment/controllers/exp/SampleTypeContentsView.java b/experiment/src/org/labkey/experiment/controllers/exp/SampleTypeContentsView.java index 54f0312916e..c7c3ea5984d 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/SampleTypeContentsView.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/SampleTypeContentsView.java @@ -33,6 +33,8 @@ import org.labkey.api.query.QuerySettings; import org.labkey.api.query.QueryView; import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.settings.AppProps; +import org.labkey.api.settings.OptionalFeatureService; import org.labkey.api.study.StudyUrls; import org.labkey.api.study.publish.StudyPublishService; import org.labkey.api.util.PageFlowUtil; @@ -215,7 +217,8 @@ protected void populateButtonBar(DataView view, ButtonBar bar) { super.populateButtonBar(view, bar); - bar.add(getDeriveSamplesButton(getContainer(), _source.getRowId())); + if (OptionalFeatureService.get().isFeatureEnabled(AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP)) + bar.add(getDeriveSamplesButton(getContainer(), _source.getRowId())); ActionButton linkToStudyButton = getLinkToStudyButton(view); if (linkToStudyButton != null) From e22d18549c18bd35347886e9f46b749f36efa9f5 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 17 Jun 2026 07:36:12 -0700 Subject: [PATCH 2/3] Update description --- experiment/src/org/labkey/experiment/ExperimentModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experiment/src/org/labkey/experiment/ExperimentModule.java b/experiment/src/org/labkey/experiment/ExperimentModule.java index 4c330759e82..15b56e92747 100644 --- a/experiment/src/org/labkey/experiment/ExperimentModule.java +++ b/experiment/src/org/labkey/experiment/ExperimentModule.java @@ -267,8 +267,8 @@ protected void init() OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag( AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP, - "Show Derive Samples button in LabKey Server UI", - "Shows the Derive Samples button in samples grids in the LabKey Server UI. This option will be removed in LabKey Server 26.11", + "Show Derive Sample buttons and links in LabKey Server UI", + "Shows the Derive Samples button in samples grids and a link from the sample lineage page in the LabKey Server UI. This option will be removed in LabKey Server 26.11", false, false, OptionalFeatureService.FeatureType.Deprecated)); From cfa6703a92d51af3679341ef6735a7616e274b4e Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 17 Jun 2026 08:38:38 -0700 Subject: [PATCH 3/3] Update description --- experiment/src/org/labkey/experiment/ExperimentModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/experiment/src/org/labkey/experiment/ExperimentModule.java b/experiment/src/org/labkey/experiment/ExperimentModule.java index 15b56e92747..b2d28bd7ac9 100644 --- a/experiment/src/org/labkey/experiment/ExperimentModule.java +++ b/experiment/src/org/labkey/experiment/ExperimentModule.java @@ -267,8 +267,8 @@ protected void init() OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag( AppProps.DEPRECATED_DERIVE_SAMPLES_NOT_IN_APP, - "Show Derive Sample buttons and links in LabKey Server UI", - "Shows the Derive Samples button in samples grids and a link from the sample lineage page in the LabKey Server UI. This option will be removed in LabKey Server 26.11", + "Derive Samples in LabKey Server UI", + "Enables the UI for deriving samples in LabKey Server UI from either the samples grids or a sample lineage page. This option will be removed in LabKey Server 26.11", false, false, OptionalFeatureService.FeatureType.Deprecated));