From d7c12aa43901dcc0569554f82abeb2bc49cf0ccf Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Wed, 5 Feb 2020 14:37:51 -0800 Subject: [PATCH 1/8] - include non-user editable columns details view by default - infer column 'showInDetailsView' unless explicitly set --- .../org/labkey/api/data/BaseColumnInfo.java | 26 +++++++++++++++---- .../api/data/ColumnRenderPropertiesImpl.java | 24 +++++++++++++++-- api/src/org/labkey/api/view/DataView.java | 2 +- api/src/org/labkey/api/view/InsertView.java | 2 +- api/src/org/labkey/api/view/UpdateView.java | 2 +- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java index 521a09e85ab..4961f9ee79f 100644 --- a/api/src/org/labkey/api/data/BaseColumnInfo.java +++ b/api/src/org/labkey/api/data/BaseColumnInfo.java @@ -73,7 +73,6 @@ public class BaseColumnInfo extends ColumnRenderPropertiesImpl implements ColumnInfo { private static final Logger LOG = Logger.getLogger(ColumnInfo.class); - private static final Set NON_EDITABLE_COL_NAMES = new CaseInsensitiveHashSet("created", "createdBy", "modified", "modifiedBy", "_ts", "entityId", "container"); private FieldKey _fieldKey; private String _name; @@ -350,7 +349,8 @@ public void setExtraAttributesFrom(ColumnInfo col) setDefaultValueType(col.getDefaultValueType()); setDefaultValue(col.getDefaultValue()); setImportAliasesSet(col.getImportAliasSet()); - setShownInDetailsView(col.isShownInDetailsView()); + if (((BaseColumnInfo) col)._shownInDetailsView != null) + setShownInDetailsView(col.isShownInDetailsView()); setShownInInsertView(col.isShownInInsertView()); setShownInUpdateView(col.isShownInUpdateView()); setConditionalFormats(col.getConditionalFormats()); @@ -1603,9 +1603,6 @@ public static Collection createFromDatabaseMetaData(String schem col._label = reader.getLabel(); col._description = reader.getDescription(); - if (NON_EDITABLE_COL_NAMES.contains(col.getPropertyName())) - col.setUserEditable(false); - colMap.put(col.getName(), col); } } @@ -1711,6 +1708,25 @@ private static void inferMetadata(BaseColumnInfo col) col.setReadOnly(true); } + if (NON_EDITABLE_COL_NAMES.contains(colName)) + { + col.setUserEditable(false); + col.setShownInDetailsView(false); + col.setShownInInsertView(false); + col.setShownInUpdateView(false); + } + + if (colName.equalsIgnoreCase("entityid") || colName.equalsIgnoreCase("lsid") || + colName.equalsIgnoreCase("lastindexed") || + SqlDialect.isGUIDType(col.getSqlTypeName())) + { + col.setHidden(true); + col.setUserEditable(false); + col.setShownInDetailsView(false); + col.setShownInInsertView(false); + col.setShownInUpdateView(false); + } + if (JdbcType.INTEGER == col.getJdbcType() && (colName.equalsIgnoreCase("createdby") || colName.equalsIgnoreCase("modifiedby")) && (schema.getScope().isLabKeyScope())) diff --git a/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java b/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java index 3ca6e807558..62aa6954bab 100644 --- a/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java +++ b/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Sort.SortDirection; import org.labkey.api.exp.PropertyType; import org.labkey.api.gwt.client.DefaultScaleType; @@ -40,6 +41,10 @@ */ public abstract class ColumnRenderPropertiesImpl implements ColumnRenderProperties { + protected static final Set NON_EDITABLE_COL_NAMES = new CaseInsensitiveHashSet( + "created", "createdBy", "modified", "modifiedBy", + "_ts", "entityId", "container", "lsid", "lastIndexed"); + protected SortDirection _sortDirection = SortDirection.ASC; protected String _inputType; protected int _inputLength = -1; @@ -70,7 +75,7 @@ public abstract class ColumnRenderPropertiesImpl implements ColumnRenderProperti protected DefaultScaleType _defaultScale = DefaultScaleType.LINEAR; protected boolean _shownInInsertView = true; protected boolean _shownInUpdateView = true; - protected boolean _shownInDetailsView = true; + protected Boolean _shownInDetailsView; protected StringExpression _url; protected String _urlTargetWindow; protected String _urlCls; @@ -299,7 +304,22 @@ public void setHidden(boolean hidden) @Override public boolean isShownInDetailsView() { - return _shownInDetailsView; + if (_shownInDetailsView != null) + return _shownInDetailsView; + + return inferShownInDetailsView(); + } + + // CONSIDER: Refactor BaseColumnInfo.inferMetadata() to use infer metadata methods? + protected boolean inferShownInDetailsView() + { + if (isAutoIncrement()) + return false; + + if (NON_EDITABLE_COL_NAMES.contains(getName())) + return false; + + return true; } public void setShownInDetailsView(boolean shownInDetailsView) diff --git a/api/src/org/labkey/api/view/DataView.java b/api/src/org/labkey/api/view/DataView.java index 0e5c2c812a9..6bd65fdc752 100644 --- a/api/src/org/labkey/api/view/DataView.java +++ b/api/src/org/labkey/api/view/DataView.java @@ -143,7 +143,7 @@ public DataRegion getDataRegion() { DataRegion dr = new DataRegion(); dr.setTable(form.getTable()); - List allCols = form.getTable().getUserEditableColumns(); + List allCols = form.getTable().getColumns(); List includedCols = new ArrayList<>(); for (ColumnInfo col : allCols) { diff --git a/api/src/org/labkey/api/view/InsertView.java b/api/src/org/labkey/api/view/InsertView.java index e1005757af6..8af6632be64 100644 --- a/api/src/org/labkey/api/view/InsertView.java +++ b/api/src/org/labkey/api/view/InsertView.java @@ -70,7 +70,7 @@ public InsertView(List cols, BindException errors) @Override protected boolean isColumnIncluded(ColumnInfo col) { - return col.isShownInInsertView(); + return col.isUserEditable() && col.isShownInInsertView(); } public void setInitialValues(Map initialValues) diff --git a/api/src/org/labkey/api/view/UpdateView.java b/api/src/org/labkey/api/view/UpdateView.java index 3d26d9e1e19..42cec472695 100644 --- a/api/src/org/labkey/api/view/UpdateView.java +++ b/api/src/org/labkey/api/view/UpdateView.java @@ -45,7 +45,7 @@ public UpdateView(TableViewForm form, BindException errors) @Override protected boolean isColumnIncluded(ColumnInfo col) { - return col.isShownInUpdateView(); + return col.isUserEditable() && col.isShownInUpdateView(); } @Override From 7eb983660d9ab6cce49be4eb85d18093507bca40 Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Wed, 5 Feb 2020 14:39:57 -0800 Subject: [PATCH 2/8] use thread details as detailsURL for announcement.Announcements table --- announcements/resources/schemas/comm.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/announcements/resources/schemas/comm.xml b/announcements/resources/schemas/comm.xml index c4f560ce414..fdb317cb1e9 100644 --- a/announcements/resources/schemas/comm.xml +++ b/announcements/resources/schemas/comm.xml @@ -19,6 +19,7 @@ + org.labkey.announcements.AnnouncementsController$ThreadAction.class?rowId=${RowId} Row Id From 6ffd35df97d40e0258b2aa0b7a1f5dc3f4e9e46e Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Wed, 5 Feb 2020 15:05:22 -0800 Subject: [PATCH 3/8] unnecessary bindParameters override --- api/src/org/labkey/api/query/QueryForm.java | 2 +- study/src/org/labkey/study/query/DatasetQueryView.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/api/src/org/labkey/api/query/QueryForm.java b/api/src/org/labkey/api/query/QueryForm.java index fc86bd656c9..20078fc4c12 100644 --- a/api/src/org/labkey/api/query/QueryForm.java +++ b/api/src/org/labkey/api/query/QueryForm.java @@ -158,7 +158,7 @@ protected Container getContainer() } @Override - public @NotNull BindException bindParameters(PropertyValues params) + public final @NotNull BindException bindParameters(PropertyValues params) { return doBindParameters(params); } diff --git a/study/src/org/labkey/study/query/DatasetQueryView.java b/study/src/org/labkey/study/query/DatasetQueryView.java index 09d9ebeb00a..0271a852767 100644 --- a/study/src/org/labkey/study/query/DatasetQueryView.java +++ b/study/src/org/labkey/study/query/DatasetQueryView.java @@ -586,10 +586,6 @@ public static class DatasetFilterForm extends QueryViewAction.QueryExportForm private int _datasetId; private int _visitRowId; - public @NotNull BindException bindParameters(PropertyValues params) - { - return BaseViewAction.springBindParameters(this, "form", params); - } public String getCohortFilterType() { From af0473cedf0afcfb0a60bc281b4a828666cfeaec Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Wed, 5 Feb 2020 15:08:40 -0800 Subject: [PATCH 4/8] implement hasPermissions to appease DataRegion details view --- .../org/labkey/assay/query/AssayProviderTable.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/assay/src/org/labkey/assay/query/AssayProviderTable.java b/assay/src/org/labkey/assay/query/AssayProviderTable.java index 1fc8455e1ab..d094a02e16c 100644 --- a/assay/src/org/labkey/assay/query/AssayProviderTable.java +++ b/assay/src/org/labkey/assay/query/AssayProviderTable.java @@ -23,6 +23,9 @@ import org.labkey.api.assay.AssayProvider; import org.labkey.api.assay.AssaySchema; import org.labkey.api.assay.AssayService; +import org.labkey.api.security.UserPrincipal; +import org.labkey.api.security.permissions.Permission; +import org.labkey.api.security.permissions.ReadPermission; /** * User: kevink @@ -49,9 +52,17 @@ public AssayProviderTable(@NotNull AssaySchema schema) ExprColumn runLSIDPrefixCol = new ExprColumn(this, "RunLSIDPrefix", new SQLFragment(ExprColumn.STR_TABLE_ALIAS + ".RunLSIDPrefix"), JdbcType.INTEGER); runLSIDPrefixCol.setHidden(true); + runLSIDPrefixCol.setShownInDetailsView(false); addColumn(runLSIDPrefixCol); } + @Override + public boolean hasPermission(@NotNull UserPrincipal user, @NotNull Class perm) + { + return ReadPermission.class.isAssignableFrom(perm) && + getUserSchema().getContainer().hasPermission(user, perm); + } + @Override @NotNull public SQLFragment getFromSQL() { From c83b7b26410d1a15574b52b240eec8aada9ed2f2 Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Wed, 5 Feb 2020 16:14:16 -0800 Subject: [PATCH 5/8] add verify check for QueryView without detailsURL and showDetailsColumn is true --- api/src/org/labkey/api/query/QueryView.java | 10 ++++ .../query/controllers/QueryController.java | 5 +- .../labkey/query/persist/QueryManager.java | 57 ++++++++++++------- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/api/src/org/labkey/api/query/QueryView.java b/api/src/org/labkey/api/query/QueryView.java index 2e92ad8e145..e947cfdc3aa 100644 --- a/api/src/org/labkey/api/query/QueryView.java +++ b/api/src/org/labkey/api/query/QueryView.java @@ -3024,6 +3024,11 @@ public void setShowRStudioButton(boolean showRStudioButton) _showRStudioButton = showRStudioButton; } + public final boolean isShowDetailsColumn() + { + return _showDetailsColumn; + } + public void setShowDetailsColumn(boolean showDetailsColumn) { _showDetailsColumn = showDetailsColumn; @@ -3044,6 +3049,11 @@ public void setUpdateURL(DetailsURL updateURL) _updateURL = updateURL; } + public final DetailsURL getDetailsURL() + { + return _detailsURL; + } + public void setDetailsURL(String detailsURL) { _detailsURL = null==detailsURL ? null : DetailsURL.fromString(detailsURL); diff --git a/query/src/org/labkey/query/controllers/QueryController.java b/query/src/org/labkey/query/controllers/QueryController.java index 5e39d6e7d07..bcf819b238d 100644 --- a/query/src/org/labkey/query/controllers/QueryController.java +++ b/query/src/org/labkey/query/controllers/QueryController.java @@ -5991,8 +5991,9 @@ public ApiResponse execute(QueryForm form, BindException errors) } SchemaKey schemaKey = SchemaKey.fromString(form.getSchemaName()); - QueryManager.get().validateQueryMetadata(schemaKey, form.getQueryName(), getUser(), getContainer(), parseErrors, parseWarnings); - QueryManager.get().validateQueryViews(schemaKey, form.getQueryName(), getUser(), getContainer(), parseErrors, parseWarnings); + QueryManager.get().validateQueryMetadata(schema, table, getUser(), getContainer(), parseErrors, parseWarnings); + QueryManager.get().validateQueryView(form, errors, schema, table, getUser(), getContainer(), parseErrors, parseWarnings); + QueryManager.get().validateQueryCustomViews(schema, table, schemaKey, form.getQueryName(), getUser(), getContainer(), parseErrors, parseWarnings); for (QueryParseException e : parseErrors) { diff --git a/query/src/org/labkey/query/persist/QueryManager.java b/query/src/org/labkey/query/persist/QueryManager.java index 5d52ede8a4a..e104a3f82ad 100644 --- a/query/src/org/labkey/query/persist/QueryManager.java +++ b/query/src/org/labkey/query/persist/QueryManager.java @@ -32,6 +32,7 @@ import org.labkey.api.data.DbSchema; import org.labkey.api.data.DbSchemaType; import org.labkey.api.data.DbScope; +import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.FilterInfo; import org.labkey.api.data.JsonWriter; import org.labkey.api.data.SimpleFilter; @@ -46,9 +47,11 @@ import org.labkey.api.query.FieldKey; import org.labkey.api.query.QueryChangeListener; import org.labkey.api.query.QueryDefinition; +import org.labkey.api.query.QueryForm; import org.labkey.api.query.QueryParseException; import org.labkey.api.query.QueryParseWarning; import org.labkey.api.query.QueryService; +import org.labkey.api.query.QueryView; import org.labkey.api.query.SchemaKey; import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; @@ -58,6 +61,7 @@ import org.labkey.query.ExternalSchema; import org.labkey.query.ExternalSchemaDocumentProvider; import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.validation.BindException; import java.net.URISyntaxException; import java.sql.ResultSet; @@ -661,18 +665,10 @@ public boolean validateQuery(TableInfo table, boolean testAllColumns, @NotNull L * Experimental. The goal is to provide a more thorough validation of query metadata, including warnings of potentially * invalid conditions, like autoincrement columns set userEditable=true. */ - public boolean validateQueryMetadata(SchemaKey schemaPath, String queryName, User user, Container container, + public boolean validateQueryMetadata(UserSchema schema, TableInfo table, User user, Container container, @NotNull List errors, @NotNull List warnings) { Set columns = new HashSet<>(); - UserSchema schema = QueryService.get().getUserSchema(user, container, schemaPath); - if (null == schema) - throw new IllegalArgumentException("Could not find the schema '" + schemaPath.getName() + "'!"); - - TableInfo table = schema.getTable(queryName); - if (null == table) - throw new IllegalArgumentException("The query '" + queryName + "' was not found in the schema '" + schemaPath.getName() + "'!"); - try { //validate foreign keys and other metadata warnings @@ -849,21 +845,42 @@ private boolean validateFk(ColumnInfo col, User user, Container container, Table } /** - * Experimental. The goal is to provide a more thorough validation of saved views, including errors like invalid - * column names or case errors (which cause problems for case-sensitive js) + * Experimental. Checks the QueryView configuration for: + * - non empty column list + * - has a details URL if showDetailsColumn is true */ - public boolean validateQueryViews(SchemaKey schemaPath, String queryName, User user, Container container, - @NotNull List errors, @NotNull List warnings) throws QueryParseException + public boolean validateQueryView(QueryForm form, BindException e, + UserSchema schema, TableInfo table, + User user, Container container, + @NotNull List errors, + @NotNull List warnings) { - UserSchema schema = QueryService.get().getUserSchema(user, container, schemaPath); - if (null == schema) - throw new IllegalArgumentException("Could not find the schema '" + schemaPath.getName() + "'!"); + int errorCount = e.getErrorCount(); + QueryView qview = schema.createView(form, e); - TableInfo table = schema.getTable(queryName); - if (null == table) - throw new IllegalArgumentException("The query '" + queryName + "' was not found in the schema '" + schema.getSchemaName() + "'!"); + List displayColumns = qview.getDisplayColumns(); + if (displayColumns.isEmpty()) + { + warnings.add(new QueryParseWarning(schema.getSchemaName() + "." + table.getPublicName() + " QueryView has no display columns", null, 0, 0)); + } + + if (qview.isShowDetailsColumn() && qview.getDetailsURL() == null && !qview.getTable().hasDetailsURL()) + { + warnings.add(new QueryParseWarning(schema.getSchemaName() + "." + table.getPublicName() + " QueryView has showDetailsColumn=true but QueryView and TableInfo have no details URL", null, 0, 0)); + } + + return errors.isEmpty() && e.getErrorCount() == errorCount; + } - //validate views + /** + * Experimental. The goal is to provide a more thorough validation of saved views, including errors like invalid + * column names or case errors (which cause problems for case-sensitive js) + */ + public boolean validateQueryCustomViews(UserSchema schema, TableInfo table, + SchemaKey schemaPath, String queryName, + User user, Container container, + @NotNull List errors, @NotNull List warnings) throws QueryParseException + { try { List views = QueryService.get().getCustomViews(user, container, null, schema.getSchemaName(), queryName, true); From 581944715ac0082766a23e1c2b5ffd924dca1d52 Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Tue, 11 Feb 2020 16:29:08 -0800 Subject: [PATCH 6/8] unmodifiable column name set --- api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java b/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java index 62aa6954bab..91134de7dcf 100644 --- a/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java +++ b/api/src/org/labkey/api/data/ColumnRenderPropertiesImpl.java @@ -26,6 +26,7 @@ import org.labkey.api.query.FieldKey; import org.labkey.api.util.StringExpression; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import java.util.regex.Matcher; @@ -41,9 +42,9 @@ */ public abstract class ColumnRenderPropertiesImpl implements ColumnRenderProperties { - protected static final Set NON_EDITABLE_COL_NAMES = new CaseInsensitiveHashSet( + protected static final Set NON_EDITABLE_COL_NAMES = Collections.unmodifiableSet(new CaseInsensitiveHashSet( "created", "createdBy", "modified", "modifiedBy", - "_ts", "entityId", "container", "lsid", "lastIndexed"); + "_ts", "entityId", "container", "lsid", "lastIndexed")); protected SortDirection _sortDirection = SortDirection.ASC; protected String _inputType; From e5e5ce8270883b6b79810df8654037f01da3dede Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Tue, 11 Feb 2020 16:30:59 -0800 Subject: [PATCH 7/8] Switch to query table to render sample set details --- experiment/resources/schemas/exp.xml | 3 ++ .../experiment/api/ExpSampleSetTableImpl.java | 17 ++++++++ .../controllers/exp/ExperimentController.java | 39 ++++--------------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/experiment/resources/schemas/exp.xml b/experiment/resources/schemas/exp.xml index f55e8c11408..95a7fecab04 100644 --- a/experiment/resources/schemas/exp.xml +++ b/experiment/resources/schemas/exp.xml @@ -340,6 +340,9 @@ true Contains the LSID prefix for all materials that are part of this sample set + false + false + false Contains an optional description about the contents or purpose of this sample set diff --git a/experiment/src/org/labkey/experiment/api/ExpSampleSetTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpSampleSetTableImpl.java index cc2e3c735fa..3c0c4873334 100644 --- a/experiment/src/org/labkey/experiment/api/ExpSampleSetTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpSampleSetTableImpl.java @@ -16,6 +16,7 @@ package org.labkey.experiment.api; +import org.jetbrains.annotations.NotNull; import org.labkey.api.data.AbstractTableInfo; import org.labkey.api.data.BaseColumnInfo; import org.labkey.api.data.ContainerFilter; @@ -26,7 +27,10 @@ import org.labkey.api.query.DetailsURL; import org.labkey.api.query.ExprColumn; import org.labkey.api.query.UserSchema; +import org.labkey.api.security.UserPrincipal; import org.labkey.api.security.permissions.InsertPermission; +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.view.ActionURL; import org.labkey.experiment.controllers.exp.ExperimentController; @@ -46,6 +50,16 @@ public ExpSampleSetTableImpl(String name, UserSchema schema, ContainerFilter cf) addAllowablePermission(UpdatePermission.class); } + @Override + public boolean hasPermission(@NotNull UserPrincipal user, @NotNull Class perm) + { + // Allow DetailsView to render + if (ReadPermission.class.isAssignableFrom(perm) && getUserSchema().getContainer().hasPermission(user, perm)) + return true; + + return super.hasPermission(user, perm); + } + public BaseColumnInfo createColumn(String alias, Column column) { switch (column) @@ -76,6 +90,9 @@ public BaseColumnInfo createColumn(String alias, Column column) " m WHERE m.CpasType = " + ExprColumn.STR_TABLE_ALIAS + ".LSID)"); ExprColumn sampleCountColumnInfo = new ExprColumn(this, "SampleCount", sql, JdbcType.INTEGER); sampleCountColumnInfo.setDescription("Contains the number of samples currently stored in this sample set"); + sampleCountColumnInfo.setShownInDetailsView(false); + sampleCountColumnInfo.setShownInInsertView(false); + sampleCountColumnInfo.setShownInUpdateView(false); return sampleCountColumnInfo; } case Properties: diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 5b4ece411ec..eb6d552ff9d 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -75,6 +75,7 @@ import org.labkey.api.data.TSVWriter; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; +import org.labkey.api.data.TableViewForm; import org.labkey.api.exp.AbstractParameter; import org.labkey.api.exp.DuplicateMaterialException; import org.labkey.api.exp.ExperimentDataHandler; @@ -626,10 +627,12 @@ public ModelAndView getView(ExpObjectForm form, BindException errors) QuerySettings settings = schema.getSettings(getViewContext(), "Material", _source.getName()); QueryView queryView = new SampleSetContentsView(_source, schema, settings, errors); - DetailsView detailsView = new DetailsView(getMaterialSourceRegion(getViewContext()), _source.getRowId()); - detailsView.getDataRegion().getDisplayColumn("Name").setURL(null); - detailsView.getDataRegion().getDisplayColumn("LSID").setVisible(false); - detailsView.getDataRegion().getDisplayColumn("MaterialLSIDPrefix").setVisible(false); + ExpSchema expSchema = (ExpSchema)QueryService.get().getUserSchema(getUser(), getContainer(), ExpSchema.SCHEMA_NAME); + TableInfo sampleSetsTable = expSchema.getTable(ExpSchema.TableType.SampleSets); + + TableViewForm detailsViewForm = new TableViewForm(sampleSetsTable); + detailsViewForm.setPkVal(_source.getRowId()); + DetailsView detailsView = new DetailsView(detailsViewForm); detailsView.setTitle("Sample Set Properties"); detailsView.getDataRegion().getButtonBar(DataRegion.MODE_DETAILS).setStyle(ButtonBar.Style.separateButtons); @@ -722,7 +725,6 @@ public ModelAndView getView(ExpObjectForm form, BindException errors) ActionButton uploadButton = new ActionButton(importURL, "Import More Samples", ActionButton.Action.LINK); uploadButton.setDisplayPermission(UpdatePermission.class); detailsView.getDataRegion().getButtonBar(DataRegion.MODE_DETAILS).add(uploadButton); - } } } @@ -3442,33 +3444,6 @@ private List getRuns(List sampleSets) } } - private DataRegion getMaterialSourceRegion(ViewContext model) - { - TableInfo tableInfo = ExperimentServiceImpl.get().getTinfoMaterialSource(); - - QuerySettings settings = new QuerySettings(model, "MaterialsSource"); - settings.setSelectionKey(DataRegionSelection.getSelectionKey(tableInfo.getSchema().getName(), tableInfo.getName(), "SampleSets", settings.getDataRegionName())); - - DataRegion dr = new DataRegion(); - dr.setSettings(settings); - dr.addColumns(tableInfo.getUserEditableColumns()); - dr.removeColumns("lastindexed"); - dr.getDisplayColumn(0).setVisible(false); - - dr.getDisplayColumn("idcol1").setVisible(false); - dr.getDisplayColumn("idcol2").setVisible(false); - dr.getDisplayColumn("idcol3").setVisible(false); - dr.getDisplayColumn("lsid").setVisible(false); - dr.getDisplayColumn("materiallsidprefix").setVisible(false); - dr.getDisplayColumn("parentcol").setVisible(false); - - ActionURL url = new ActionURL(ExperimentController.ShowMaterialSourceAction.class, model.getContainer()); - dr.getDisplayColumn(1).setURL(url.toString() + "rowId=${RowId}"); - dr.setShowRecordSelectors(getContainer().hasOneOf(getUser(), DeletePermission.class, UpdatePermission.class)); - - return dr; - } - @RequiresPermission(DesignSampleSetPermission.class) public class UpdateMaterialSourceAction extends BaseSampleSetAction { From 16f01217e42623d394f1d116d4ac1fe92ee7fe4d Mon Sep 17 00:00:00 2001 From: Kevin Krouse Date: Tue, 11 Feb 2020 16:32:14 -0800 Subject: [PATCH 8/8] include non-editable columns in update view --- api/src/org/labkey/api/view/UpdateView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/view/UpdateView.java b/api/src/org/labkey/api/view/UpdateView.java index 42cec472695..3d26d9e1e19 100644 --- a/api/src/org/labkey/api/view/UpdateView.java +++ b/api/src/org/labkey/api/view/UpdateView.java @@ -45,7 +45,7 @@ public UpdateView(TableViewForm form, BindException errors) @Override protected boolean isColumnIncluded(ColumnInfo col) { - return col.isUserEditable() && col.isShownInUpdateView(); + return col.isShownInUpdateView(); } @Override