diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index 4fd40ab5c45..62583ab7189 100644 --- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java +++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java @@ -677,7 +677,7 @@ protected ModelAndView getRunPropertiesView(FormType newRunForm, boolean errorRe if (!newRunForm.getBatchProperties().isEmpty()) { - JspView batchPropsView = new JspView<>("/org/labkey/assay/view/newUploadBatchProperties.jsp", newRunForm); + JspView> batchPropsView = new JspView<>("/org/labkey/assay/view/newUploadBatchProperties.jsp", newRunForm); batchPropsView.setTitle("Batch Properties"); vbox.addView(batchPropsView); } @@ -769,9 +769,9 @@ protected void addHiddenRunProperties(FormType newRunForm, InsertView insertView public static String getInputName(DomainProperty property, String disambiguationId) { if (disambiguationId != null) - return ColumnInfo.propNameFromName(disambiguationId + "_" + property.getName()); + return disambiguationId + "_" + property.getName(); else - return ColumnInfo.propNameFromName(property.getName()); + return property.getName(); } public static String getInputName(DomainProperty property) @@ -783,7 +783,7 @@ protected void addHiddenProperties(Map properties, Inser { for (Map.Entry entry : properties.entrySet()) { - String name = ColumnInfo.propNameFromName(entry.getKey().getName()); + String name = entry.getKey().getName(); String value = entry.getValue(); insertView.getDataRegion().addHiddenFormField(name, value); } @@ -940,7 +940,7 @@ public void validateStep(FormType form, Errors errors) { validatePostedProperties(getViewContext(), form.getBatchProperties(), errors); - if (ThawListResolverType.NAME.equals(form.getRequest().getParameter("participantVisitResolver"))) + if (ThawListResolverType.NAME.equals(form.getRequest().getParameter(AbstractAssayProvider.PARTICIPANT_VISIT_RESOLVER_PROPERTY_NAME))) ThawListResolverType.validationHelper(form, errors); } diff --git a/api/src/org/labkey/api/assay/pipeline/AssayRunAsyncContext.java b/api/src/org/labkey/api/assay/pipeline/AssayRunAsyncContext.java index eaa4369ebc2..710e6e9d3a4 100644 --- a/api/src/org/labkey/api/assay/pipeline/AssayRunAsyncContext.java +++ b/api/src/org/labkey/api/assay/pipeline/AssayRunAsyncContext.java @@ -18,6 +18,7 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.labkey.api.assay.AbstractAssayProvider; import org.labkey.api.assay.AssayProvider; import org.labkey.api.assay.AssayRunUploadContext; import org.labkey.api.assay.AssayService; @@ -206,7 +207,7 @@ public void logProperties(Logger logger) { if(entry.getValue() == null) valueText = "[Blank]"; - else if(entry.getKey().getName().equals("TargetStudy")) + else if(entry.getKey().getName().equals(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME)) valueText = ContainerManager.getForId(getTargetStudy()).getName(); else valueText = entry.getValue(); diff --git a/api/src/org/labkey/api/data/AbstractTableInfo.java b/api/src/org/labkey/api/data/AbstractTableInfo.java index b776002aea0..16b03db90a6 100644 --- a/api/src/org/labkey/api/data/AbstractTableInfo.java +++ b/api/src/org/labkey/api/data/AbstractTableInfo.java @@ -74,6 +74,7 @@ import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.ActionURL; import org.labkey.api.view.ViewContext; +import org.labkey.api.view.template.PageConfig; import org.labkey.data.xml.AuditType; import org.labkey.data.xml.ColumnType; import org.labkey.data.xml.FilterGroupType; @@ -693,7 +694,8 @@ protected ColumnInfo resolveColumn(String name) { if (null != col) // #19358 { - String propName = col.getPropertyName(); + // Keep backwards compatible with historic value + String propName = PageConfig.makeIdFromName(col.getName()); if (null != propName && propName.equalsIgnoreCase(name)) return col; } diff --git a/api/src/org/labkey/api/data/AbstractWrappedColumnInfo.java b/api/src/org/labkey/api/data/AbstractWrappedColumnInfo.java index 1f7772d9f49..0373df34aff 100644 --- a/api/src/org/labkey/api/data/AbstractWrappedColumnInfo.java +++ b/api/src/org/labkey/api/data/AbstractWrappedColumnInfo.java @@ -215,12 +215,6 @@ public boolean isShouldLog() return delegate.isShouldLog(); } - @Override - public String getPropertyName() - { - return delegate.getPropertyName(); - } - @Override public boolean isVersionColumn() { diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java index e999cf251c8..f9325449a98 100644 --- a/api/src/org/labkey/api/data/BaseColumnInfo.java +++ b/api/src/org/labkey/api/data/BaseColumnInfo.java @@ -56,7 +56,6 @@ import org.labkey.data.xml.DbSequenceType; import org.labkey.data.xml.PropertiesType; -import java.beans.Introspector; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.sql.ResultSet; @@ -86,8 +85,6 @@ public class BaseColumnInfo extends ColumnRenderPropertiesImpl implements Mutabl @NotNull private FieldKey _fieldKey; - // _propertyName is computed from getName(); - private String _propertyName = null; private DatabaseIdentifier _alias; private String _sqlTypeName; private JdbcType _jdbcType = null; @@ -253,7 +250,6 @@ public void setName(@NotNull String name) FieldKey newFieldKey = new FieldKey(null, name); assert !_lockName || 0 == _fieldKey.compareTo(newFieldKey); _fieldKey = newFieldKey; - _propertyName = null; } @@ -272,7 +268,6 @@ public void setFieldKey(@NotNull FieldKey key) { checkLocked(); _fieldKey = Objects.requireNonNull(key); - _propertyName = null; } @@ -887,16 +882,6 @@ public void setShouldLog(boolean shouldLog) _shouldLog = shouldLog; } - @Override - public String getPropertyName() - { - // this is surprisingly expensive, cache it! - if (null == _propertyName) - _propertyName = propNameFromName(getName()); - return _propertyName; - } - - /** * Version column can be used for optimistic concurrency. * for now we assume that this column is never updated @@ -1401,6 +1386,7 @@ else if (Character.isUpperCase(c) && Character.isLowerCase(chars[i - 1])) return buf.toString(); } + /** @return a version of the supplied name that is considered a valid Java identifier */ public static String legalNameFromName(String name) { @@ -1431,19 +1417,6 @@ public static String legalNameFromName(String name) return buf.toString(); } - - public static String propNameFromName(String name) - { - if (name == null) - return null; - - if (name.isEmpty()) - return null; - - return Introspector.decapitalize(legalNameFromName(name)); - } - - // TODO why is there here? and not something like RequestHelper or PageFlowUtil public static boolean booleanFromString(String str) { @@ -1657,12 +1630,6 @@ public Set getSuggestedColumns() { return null; } - - @Override - public boolean isShowAsPublicDependency() - { - return false; - } } @Override @@ -1727,7 +1694,7 @@ public static Collection createFromDatabaseMetaData(String schem col._label = reader.getLabel(); col._description = reader.getDescription(); - if (NON_EDITABLE_COL_NAMES.contains(col.getPropertyName())) + if (NON_EDITABLE_COL_NAMES.contains(col.getName())) col.setUserEditable(false); colMap.put(col.getName(), col); diff --git a/api/src/org/labkey/api/data/ColumnInfo.java b/api/src/org/labkey/api/data/ColumnInfo.java index aee4c8880c3..384e3dc8966 100644 --- a/api/src/org/labkey/api/data/ColumnInfo.java +++ b/api/src/org/labkey/api/data/ColumnInfo.java @@ -31,6 +31,7 @@ import org.labkey.api.util.StringExpression; import org.labkey.data.xml.ColumnType; +import java.beans.Introspector; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -216,8 +217,6 @@ static int findColumn(ResultSet rs, String name) boolean isShouldLog(); - String getPropertyName(); - /** * Version column can be used for optimistic concurrency. * for now we assume that this column is never updated @@ -383,12 +382,7 @@ static String labelFromName(String name) { return BaseColumnInfo.labelFromName(name); } - - static String propNameFromName(String name) - { - return BaseColumnInfo.propNameFromName(name); - } - + static String legalNameFromName(String name) { return BaseColumnInfo.legalNameFromName(name); diff --git a/api/src/org/labkey/api/data/DisplayColumn.java b/api/src/org/labkey/api/data/DisplayColumn.java index 61f3d0ca621..a71f807180b 100644 --- a/api/src/org/labkey/api/data/DisplayColumn.java +++ b/api/src/org/labkey/api/data/DisplayColumn.java @@ -329,7 +329,7 @@ public Object getJsonValue(RenderContext ctx) public String getName() { if (null != getColumnInfo()) - return getColumnInfo().getPropertyName(); + return getColumnInfo().getName(); else return super.getName(); } diff --git a/api/src/org/labkey/api/data/DisplayColumnGroup.java b/api/src/org/labkey/api/data/DisplayColumnGroup.java index 5e8dc9d4331..748236c44a9 100644 --- a/api/src/org/labkey/api/data/DisplayColumnGroup.java +++ b/api/src/org/labkey/api/data/DisplayColumnGroup.java @@ -19,6 +19,7 @@ import org.labkey.api.util.DOM; import org.labkey.api.util.InputBuilder; import org.labkey.api.view.HttpView; +import org.labkey.api.view.template.PageConfig; import org.labkey.api.writer.HtmlWriter; import java.io.IOException; @@ -89,9 +90,10 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) ).appendTo(out); } + /** Use propName because DOM ids and function names can't have spaces */ private String getGroupFormFieldName(RenderContext ctx) { - return ColumnInfo.propNameFromName(getColumns().get(0).getFormFieldName(ctx)); + return PageConfig.makeIdFromName(getColumns().get(0).getFormFieldName(ctx)); } public void writeCopyableJavaScript(RenderContext ctx, Writer out) throws IOException diff --git a/api/src/org/labkey/api/data/ImportAliasable.java b/api/src/org/labkey/api/data/ImportAliasable.java index 1e123b91fed..0d529e0954d 100644 --- a/api/src/org/labkey/api/data/ImportAliasable.java +++ b/api/src/org/labkey/api/data/ImportAliasable.java @@ -17,6 +17,7 @@ import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.exp.MvColumn; +import org.labkey.api.view.template.PageConfig; import java.util.ArrayList; import java.util.List; @@ -64,10 +65,10 @@ public static Map createImportMap(List { m.put(property.getPropertyURI(), property); } - // Then propName variant of name + // Then propName variant of name, kept for backwards compatibility for (T property : reversedProperties) { - m.put(BaseColumnInfo.propNameFromName(property.getName()), property); + m.put(PageConfig.makeIdFromName(property.getName()), property); } // Then aliases for (T property : reversedProperties) diff --git a/api/src/org/labkey/api/data/Table.java b/api/src/org/labkey/api/data/Table.java index 71cb01b91e0..68022adf203 100644 --- a/api/src/org/labkey/api/data/Table.java +++ b/api/src/org/labkey/api/data/Table.java @@ -1189,7 +1189,7 @@ public static void ensureRequiredColumns(TableInfo table, Map cols = tinfo.getColumns(); Map> propMap = new CaseInsensitiveHashMap<>(); for (ColumnInfo col : cols) - propMap.put(col.getPropertyName(), col.getJavaClass()); + propMap.put(col.getName(), col.getJavaClass()); init(tinfo.getName(), propMap); } diff --git a/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java b/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java index c6d6adbdc0c..2e476cdbc21 100644 --- a/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java +++ b/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java @@ -273,7 +273,7 @@ public HttpView getView(FormType domainIdForm, boolean reshow, BindException err if (entry.getValue() != null) { String stringValue = entry.getValue().toString(); - decodePropertyValues(formDefaults, ColumnInfo.propNameFromName(entry.getKey().getName()), stringValue); + decodePropertyValues(formDefaults, entry.getKey().getName(), stringValue); } } view.setInitialValues(formDefaults); @@ -408,7 +408,7 @@ public boolean handlePost(FormType domainIdForm, BindException errors) throws Ex Map values = new HashMap<>(); for (DomainProperty property : domain.getProperties()) { - String propName = ColumnInfo.propNameFromName(property.getName()); + String propName = property.getName(); String value = encodePropertyValues(domainIdForm, propName); PropertyType type = property.getPropertyDescriptor().getPropertyType(); if (value != null && !value.isEmpty()) diff --git a/api/src/org/labkey/api/exp/SamplePropertyHelper.java b/api/src/org/labkey/api/exp/SamplePropertyHelper.java index 088fb67b7b0..b259e01d0f7 100644 --- a/api/src/org/labkey/api/exp/SamplePropertyHelper.java +++ b/api/src/org/labkey/api/exp/SamplePropertyHelper.java @@ -130,7 +130,7 @@ public void addSampleColumns(InsertView view, User user) } } - public void addSampleColumns(InsertView view, User user, @Nullable AssayRunUploadForm defaultValueContext, boolean errorReshow) throws ExperimentException + public void addSampleColumns(InsertView view, User user, @Nullable AssayRunUploadForm defaultValueContext, boolean errorReshow) throws ExperimentException { DataRegion region = view.getDataRegion(); List sampleNames = getSampleNames(); @@ -215,10 +215,9 @@ public Map> getPostedPropertyValues(HttpServ for (DomainProperty sampleProperty : _domainProperties) { String name = UploadWizardAction.getInputName(sampleProperty, sampleName); - String inputName = ColumnInfo.propNameFromName(name); // handle the hidden input field prefixed with FIELD_MARKER for checkboxes - String value = request.getParameter(inputName); - if (value == null && request.getParameter(SpringActionController.FIELD_MARKER + inputName) != null) + String value = request.getParameter(name); + if (value == null && request.getParameter(SpringActionController.FIELD_MARKER + name) != null) value = "0"; values.put(sampleProperty, value); } diff --git a/api/src/org/labkey/api/query/UserIdForeignKey.java b/api/src/org/labkey/api/query/UserIdForeignKey.java index 95f5fb69bba..444c5d3f0d1 100644 --- a/api/src/org/labkey/api/query/UserIdForeignKey.java +++ b/api/src/org/labkey/api/query/UserIdForeignKey.java @@ -53,11 +53,23 @@ public UserIdForeignKey(UserSchema userSchema) public TableInfo getLookupTableInfo() { TableInfo tinfoUsersData = CoreSchema.getInstance().getTableInfoUsersData(); - FilteredTable ret = new FilteredTable<>(tinfoUsersData, _userSchema); + FilteredTable ret = new FilteredTable<>(tinfoUsersData, _userSchema); ret.addWrapColumn(tinfoUsersData.getColumn("UserId")); ret.addColumn(ret.wrapColumn("DisplayName", tinfoUsersData.getColumn("DisplayName"))); ret.setTitleColumn("DisplayName"); ret.setPublic(false); return ret; } + + @Override + public SchemaKey getLookupSchemaKey() + { + return SchemaKey.fromParts("core"); + } + + @Override + public String getLookupTableName() + { + return "Users"; + } } diff --git a/api/src/org/labkey/api/reports/report/ScriptEngineReport.java b/api/src/org/labkey/api/reports/report/ScriptEngineReport.java index f9bb2ae27ec..dbf0cdf6269 100644 --- a/api/src/org/labkey/api/reports/report/ScriptEngineReport.java +++ b/api/src/org/labkey/api/reports/report/ScriptEngineReport.java @@ -65,6 +65,7 @@ import org.labkey.api.view.HttpView; import org.labkey.api.view.VBox; import org.labkey.api.view.ViewContext; +import org.labkey.api.view.template.PageConfig; import org.labkey.api.writer.ContainerUser; import org.labkey.vfs.FileLike; import org.labkey.vfs.FileSystemLike; @@ -408,7 +409,8 @@ protected List outputColumnNames(Results r) continue; } - alias = ColumnInfo.propNameFromName(name).toLowerCase(); + // Stay consistent with previous script-friendly identifier now used primarily for DOM ids + alias = PageConfig.makeIdFromName(name).toLowerCase(); if (!aliases.add(alias)) { @@ -433,7 +435,8 @@ protected List outputColumnNames(Results r) private String oldLegalName(FieldKey fkey, @NotNull SqlDialect dialect) { String r = AliasManager.makeLegalName(StringUtils.join(fkey.getParts(),"_"), dialect, false); - return ColumnInfo.propNameFromName(r).toLowerCase(); + // Stay consistent with previous script-friendly identifier + return ColumnInfo.legalNameFromName(r).toLowerCase(); } /** diff --git a/api/src/org/labkey/api/reports/report/ScriptReport.java b/api/src/org/labkey/api/reports/report/ScriptReport.java index e90af0a0204..75077f8c8dd 100644 --- a/api/src/org/labkey/api/reports/report/ScriptReport.java +++ b/api/src/org/labkey/api/reports/report/ScriptReport.java @@ -25,6 +25,7 @@ import org.labkey.api.data.BaseColumnInfo; import org.labkey.api.data.BooleanFormat; import org.labkey.api.data.ColumnHeaderType; +import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; @@ -66,6 +67,7 @@ import org.labkey.api.view.HttpView; import org.labkey.api.view.TabStripView; import org.labkey.api.view.ViewContext; +import org.labkey.api.view.template.PageConfig; import org.labkey.api.writer.ContainerUser; import org.labkey.api.writer.VirtualFile; import org.labkey.vfs.FileLike; @@ -220,7 +222,8 @@ protected List outputColumnNames(Results r) ArrayList ret = new ArrayList<>(count); for (int col = 1; col <= count; col++) { - String alias = r.getColumn(col).getPropertyName(); + // Stay consistent with previous script-friendly identifier now used primarily for DOM ids + String alias = PageConfig.makeIdFromName(r.getColumn(col).getName()); if (!aliases.add(alias)) { int i; diff --git a/api/src/org/labkey/api/study/actions/StudyPickerColumn.java b/api/src/org/labkey/api/study/actions/StudyPickerColumn.java index e6a991b0f02..570b24fc280 100644 --- a/api/src/org/labkey/api/study/actions/StudyPickerColumn.java +++ b/api/src/org/labkey/api/study/actions/StudyPickerColumn.java @@ -45,7 +45,7 @@ public class StudyPickerColumn extends UploadWizardAction.InputDisplayColumn public StudyPickerColumn(ColumnInfo col) { - this(col, "targetStudy"); + this(col, AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME); } public StudyPickerColumn(ColumnInfo col, String inputName) diff --git a/api/src/org/labkey/api/study/assay/ThawListListResolver.java b/api/src/org/labkey/api/study/assay/ThawListListResolver.java index 56afc966c69..456a34e23fa 100644 --- a/api/src/org/labkey/api/study/assay/ThawListListResolver.java +++ b/api/src/org/labkey/api/study/assay/ThawListListResolver.java @@ -158,7 +158,7 @@ else if (childDateObject instanceof String) } Container childTargetStudy = null; - Object childTargetStudyObject = dataRow.get("TargetStudy"); + Object childTargetStudyObject = dataRow.get(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME); if (childTargetStudyObject != null) { Set studies = StudyService.get().findStudy(childTargetStudyObject, null); diff --git a/api/src/org/labkey/api/study/publish/PublishConfirmForm.java b/api/src/org/labkey/api/study/publish/PublishConfirmForm.java index 65a70cb56f8..28cd2d42cfc 100644 --- a/api/src/org/labkey/api/study/publish/PublishConfirmForm.java +++ b/api/src/org/labkey/api/study/publish/PublishConfirmForm.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.labkey.api.action.BaseViewAction; import org.labkey.api.action.HasBindParameters; +import org.labkey.api.assay.AbstractAssayProvider; import org.labkey.api.data.DataRegionSelection; import org.labkey.api.view.ViewForm; import org.springframework.beans.PropertyValue; @@ -40,7 +41,7 @@ private void convertStringArrayParam(PropertyValue pv) { // springBindParameters() almost works as-is, except for trimming leading/trailing '\t' chars // consider hooking spring's built-in converter for String[]? maybe use json encoding see ConvertType.parseParams() - convertStringArrayParam(pvs.getPropertyValue("targetStudy")); + convertStringArrayParam(pvs.getPropertyValue(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME)); convertStringArrayParam(pvs.getPropertyValue("participantId")); convertStringArrayParam(pvs.getPropertyValue("visitId")); convertStringArrayParam(pvs.getPropertyValue("date")); diff --git a/api/src/org/labkey/api/study/publish/StudyPublishService.java b/api/src/org/labkey/api/study/publish/StudyPublishService.java index f644d8de188..a4729a9e2da 100644 --- a/api/src/org/labkey/api/study/publish/StudyPublishService.java +++ b/api/src/org/labkey/api/study/publish/StudyPublishService.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.labkey.api.assay.AbstractAssayProvider; import org.labkey.api.assay.AssayProtocolSchema; import org.labkey.api.data.AbstractTableInfo; import org.labkey.api.data.Container; @@ -57,7 +58,7 @@ public interface StudyPublishService String SOURCE_LSID_PROPERTY_NAME = "SourceLSID"; String LSID_PROPERTY_NAME = "LSID"; String ROWID_PROPERTY_NAME = "RowId"; - String TARGET_STUDY_PROPERTY_NAME = "TargetStudy"; + String TARGET_STUDY_PROPERTY_NAME = AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME; String AUTO_LINK_TARGET_PROPERTY_URI = "terms.labkey.org#AutoCopyTargetContainer"; String AUTO_LINK_CATEGORY_PROPERTY_URI = "terms.labkey.org#AutoLinkCategory"; diff --git a/api/src/org/labkey/api/study/publish/publishChooseStudy.jsp b/api/src/org/labkey/api/study/publish/publishChooseStudy.jsp index 026a8f9bbd2..ea05a2f9eda 100644 --- a/api/src/org/labkey/api/study/publish/publishChooseStudy.jsp +++ b/api/src/org/labkey/api/study/publish/publishChooseStudy.jsp @@ -36,6 +36,7 @@ <%@ page import="org.labkey.api.view.JspView" %> <%@ page import="java.util.Iterator" %> <%@ page import="java.util.List" %> +<%@ page import="org.labkey.api.assay.AbstractAssayProvider" %> <%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> <%@ page extends="org.labkey.api.jsp.JspBase" %> <% @@ -60,8 +61,8 @@ List> parameters = postURL.getParameters(); postURL.deleteParameters(); - SelectBuilder options = new SelectBuilder().name("targetStudy").label("Choose target study") - .id("targetStudy") + SelectBuilder options = new SelectBuilder().name(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME).label("Choose target study") + .id(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME) .layout(Input.Layout.HORIZONTAL) .formGroup(true); @@ -117,8 +118,8 @@ var exceedsMaxRow = <%=exceedsMaxRows%>; toggleStudies = function(){ - var studySelect = $("select[id='targetStudy']"); - var studySelectLabel = $("label[for='targetStudy']"); + var studySelect = $("select[id='TargetStudy']"); + var studySelectLabel = $("label[for='TargetStudy']"); var chooseStudy = $("input[id='chooseStudy']"); if (chooseStudy.prop('checked')){ diff --git a/api/src/org/labkey/api/study/query/PublishResultsQueryView.java b/api/src/org/labkey/api/study/query/PublishResultsQueryView.java index f4582218469..85ced7be755 100644 --- a/api/src/org/labkey/api/study/query/PublishResultsQueryView.java +++ b/api/src/org/labkey/api/study/query/PublishResultsQueryView.java @@ -173,7 +173,7 @@ public DataView createDataView() DataRegion dataRegion = view.getDataRegion(); if (_targetStudyContainer != null) - dataRegion.addHiddenFormField("targetStudy", _targetStudyContainer.getId()); + dataRegion.addHiddenFormField(AbstractAssayProvider.TARGET_STUDY_PROPERTY_NAME, _targetStudyContainer.getId()); dataRegion.addHiddenFormField("attemptPublish", "true"); if (_filter != null) @@ -992,7 +992,7 @@ private static class TargetStudyInputColumn extends StudyPickerColumn public TargetStudyInputColumn(ResolverHelper resolverHelper, ColumnInfo targetStudyCol) { - super(targetStudyCol, "targetStudy"); + super(targetStudyCol); _resolverHelper = resolverHelper; } diff --git a/api/src/org/labkey/api/view/template/PageConfig.java b/api/src/org/labkey/api/view/template/PageConfig.java index 2d6c17edb2b..4d1a1c28a03 100644 --- a/api/src/org/labkey/api/view/template/PageConfig.java +++ b/api/src/org/labkey/api/view/template/PageConfig.java @@ -25,6 +25,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.DataRegion; import org.labkey.api.module.Module; import org.labkey.api.settings.AppProps; @@ -48,6 +49,7 @@ import org.labkey.api.view.ViewServlet; import org.springframework.web.servlet.ModelAndView; +import java.beans.Introspector; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; @@ -103,10 +105,10 @@ public enum TrueFalse private record EventHandler(String id, String selector, @NotNull String event, @NotNull String handler) { public EventHandler { - assert (null==id) != (null==selector) : "exactly one of id or selector must be non-null"; - assert !StringUtils.containsWhitespace(id) : "id should not contain any whitespace"; - assert !StringUtils.containsWhitespace(event) : "event name should not contain any whitespace"; - assert !event.startsWith("on") : "event name should not include the 'on' prefix"; + assert (null==id) != (null==selector) : "exactly one of id or selector must be non-null '" + id + "', '" + selector + "'"; + assert !StringUtils.containsWhitespace(id) : "id should not contain any whitespace. '" + id + "'"; + assert !StringUtils.containsWhitespace(event) : "event name should not contain any whitespace. '" + event + "'"; + assert !event.startsWith("on") : "event name should not include the 'on' prefix. '" + event + "'"; } public String getKey() @@ -602,6 +604,19 @@ public String makeId(String prefix) return prefix + _sid + _uid.incrementAndGet(); // we can concatenate without a separator because _sid is fixed width } + /** @return a version of the supplied name that conforms to Java's local variable naming convention, which ensures + * it can serve as a valid DOM id attribute value. This does not ensure that the ID is unique across properties. + * See issue 53306 for more context. */ + public static String makeIdFromName(String name) + { + if (name == null) + return null; + + if (name.isEmpty()) + return null; + + return Introspector.decapitalize(ColumnInfo.legalNameFromName(name)); + } @NotNull public static String getScriptNonceHeader(HttpServletRequest request) diff --git a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java index 12040e7ae65..608e5078b1d 100644 --- a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java +++ b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java @@ -302,7 +302,7 @@ protected Object getValue(Map row, DomainProperty property) private static final String PRIMARY_PREV_UPLOAD_PATH = "PreviouslyUploadedFilePaths"; @Override - public void addSampleColumns(InsertView view, User user, final AssayRunUploadForm defaultValueContext, final boolean errorReshow) + public void addSampleColumns(InsertView view, User user, final AssayRunUploadForm defaultValueContext, final boolean errorReshow) { final File reshowFile; if (errorReshow) diff --git a/assay/src/org/labkey/assay/AssayIntegrationTestCase.jsp b/assay/src/org/labkey/assay/AssayIntegrationTestCase.jsp index 03480c3a52a..ad37910bef8 100644 --- a/assay/src/org/labkey/assay/AssayIntegrationTestCase.jsp +++ b/assay/src/org/labkey/assay/AssayIntegrationTestCase.jsp @@ -620,7 +620,7 @@ ); // create a run - var run = assayImportFile(c, user, provider, assayProtocol, createAssayDataFile(fileContents), false, Map.of("runExpMaterialsLookup", runSample1.getName())); + var run = assayImportFile(c, user, provider, assayProtocol, createAssayDataFile(fileContents), false, Map.of("RunExpMaterialsLookup", runSample1.getName())); // Verify pre-conditions assertEquals(4, run.getMaterialInputs().size()); @@ -636,8 +636,8 @@ // Act // Replace "RunExpMaterialsLookup" lookup runSample1 -> runSample2 var errors = new BatchValidationException(); - var updatedRunRow = CaseInsensitiveHashMap.of("RowId", run.getRowId(), "RunExpMaterialsLookup", runSample2.getRowId()); - runsTable.getUpdateService().updateRows(user, c, List.of((Map) updatedRunRow), null, errors, null, null); + Map updatedRunRow = CaseInsensitiveHashMap.of("RowId", run.getRowId(), "RunExpMaterialsLookup", runSample2.getRowId()); + runsTable.getUpdateService().updateRows(user, c, List.of(updatedRunRow), null, errors, null, null); if (errors.hasErrors()) throw errors; diff --git a/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java b/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java index 0c4901c1000..0991438eec1 100644 --- a/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java +++ b/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java @@ -225,7 +225,7 @@ protected void decodePropertyValues(Map formDefaults, String pro @Override public void validateCommand(AssayDomainIdForm target, Errors errors) { - if (ThawListResolverType.NAME.equals(target.getRequest().getParameter("participantVisitResolver"))) + if (ThawListResolverType.NAME.equals(target.getRequest().getParameter(AbstractAssayProvider.PARTICIPANT_VISIT_RESOLVER_PROPERTY_NAME))) ThawListResolverType.validationHelper(target, errors); } } \ No newline at end of file diff --git a/assay/test/src/org/labkey/test/tests/assay/AssayReimportIndexTest.java b/assay/test/src/org/labkey/test/tests/assay/AssayReimportIndexTest.java index c3226e32095..856102368f7 100644 --- a/assay/test/src/org/labkey/test/tests/assay/AssayReimportIndexTest.java +++ b/assay/test/src/org/labkey/test/tests/assay/AssayReimportIndexTest.java @@ -72,7 +72,7 @@ public void testIndexLatestAssayRun() clickButton("Import Data"); clickButton("Next"); AssayImportPage importPage = new AssayImportPage(getDriver()); - importPage.setNamedInputText("name", firstRun); + importPage.setNamedInputText("Name", firstRun); importPage.setNamedTextAreaValue("TextAreaDataCollector.textArea", firstRunData); importPage.clickSaveAndFinish(); SearchAdminAPIHelper.waitForIndexer(); @@ -91,7 +91,7 @@ public void testIndexLatestAssayRun() clickButton("Re-import run"); clickButton("Next"); AssayImportPage importPage2 = new AssayImportPage(getDriver()); - importPage2.setNamedInputText("name", secondRun); + importPage2.setNamedInputText("Name", secondRun); importPage2.setNamedTextAreaValue("TextAreaDataCollector.textArea", secondRunData); importPage2.clickSaveAndFinish(); SearchAdminAPIHelper.waitForIndexer(); diff --git a/experiment/src/org/labkey/experiment/api/ExpRunTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpRunTableImpl.java index 6a7e8d2539c..c2794b0db88 100644 --- a/experiment/src/org/labkey/experiment/api/ExpRunTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpRunTableImpl.java @@ -1046,7 +1046,7 @@ else if (Column.WorkflowTask.toString().equalsIgnoreCase(columnName)) catch (ConversionException e) { Container remapContainer = fk.getLookupContainer() != null ? fk.getLookupContainer() : container; - Object remappedValue = _cache.remap(SchemaKey.fromParts(fk.getLookupSchemaName()), fk.getLookupTableName(), user, remapContainer, ContainerFilter.Type.CurrentPlusProjectAndShared, String.valueOf(value)); + Object remappedValue = _cache.remap(fk.getLookupSchemaKey(), fk.getLookupTableName(), user, remapContainer, ContainerFilter.Type.CurrentPlusProjectAndShared, String.valueOf(value)); if (remappedValue != null) value = remappedValue; } diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 8702a5e0d69..b76c251efc5 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -5741,7 +5741,7 @@ public boolean handlePost(DeriveMaterialForm form, BindException errors) } catch (DuplicateMaterialException e) { - errors.addError(new ObjectError(ColumnInfo.propNameFromName(e.getColName()), null, null, e.getMessage())); + errors.addError(new ObjectError(e.getColName(), null, null, e.getMessage())); return false; } catch (ExperimentException e) diff --git a/experiment/src/org/labkey/experiment/summarizeMaterialInputs.jsp b/experiment/src/org/labkey/experiment/summarizeMaterialInputs.jsp index e26f094df9f..11bcd7da583 100644 --- a/experiment/src/org/labkey/experiment/summarizeMaterialInputs.jsp +++ b/experiment/src/org/labkey/experiment/summarizeMaterialInputs.jsp @@ -74,7 +74,7 @@ DisplayColumnGroup group = groups.get(propEntry.getKey()); if (group != null && group.isCopyable()) { - String propName = group.getColumns().get(i).getColumnInfo().getPropertyName(); + String propName = group.getColumns().get(i).getColumnInfo().getName(); String propValue = String.valueOf(propEntry.getValue()); handler.append("summarize_setProperty(" + q(propName) + "," + q(propValue) + ");\n"); } diff --git a/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java index 1d3d57c92fd..d2b0074ebac 100644 --- a/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java +++ b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java @@ -14,6 +14,7 @@ import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.TestFileUtils; +import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.pages.ReactAssayDesignerPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.experiment.SampleTypeDefinition; @@ -79,12 +80,12 @@ protected void populateAssay(String assayName, String runName, String runData) clickAndWait(Locator.linkWithText(assayName)); waitForElement(Locator.lkButton("Import Data")); clickAndWait(Locator.lkButton("Import Data")); - waitForElement(Locator.tagWithName("select", "targetStudy")); + waitForElement(AssayConstants.TARGET_STUDY_FIELD_LOCATOR); clickAndWait(Locator.lkButton("Next")); - setFormElement(Locator.name("name"), runName); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), runData); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, runName); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, runData); clickAndWait(Locator.lkButton("Save and Finish")); } diff --git a/issues/src/org/labkey/issue/IssuesController.java b/issues/src/org/labkey/issue/IssuesController.java index f2b9b65184a..00cc6cf279d 100644 --- a/issues/src/org/labkey/issue/IssuesController.java +++ b/issues/src/org/labkey/issue/IssuesController.java @@ -33,6 +33,7 @@ import org.labkey.api.action.BaseViewAction; import org.labkey.api.action.FormViewAction; import org.labkey.api.action.HasBindParameters; +import org.labkey.api.action.HasViewContext; import org.labkey.api.action.Marshal; import org.labkey.api.action.Marshaller; import org.labkey.api.action.MutatingApiAction; @@ -695,10 +696,23 @@ public static DOM.Renderable getUndefinedIssueListMessage(ContainerUser context, return DOM.SPAN(at(DOM.cl("labkey-error")), warningMessage, DOM.P(), button); } - public static class IssuesApiForm extends SimpleApiJsonForm + public static class IssuesApiForm extends SimpleApiJsonForm implements HasViewContext { private JSONArray _issues; private List _issueForms; + private ViewContext _context; + + @Override + public void setViewContext(ViewContext context) + { + _context = context; + } + + @Override + public ViewContext getViewContext() + { + return _context; + } // used for form binding public void setIssues(JSONArray issues) @@ -732,6 +746,8 @@ public List getIssueForms() for (JSONObject rec : JsonUtil.toJSONObjectList(issues)) { IssuesForm form = new IssuesForm(); + form.setUser(getViewContext().getUser()); + form.setContainer(getViewContext().getContainer()); Map stringMap = new CaseInsensitiveHashMap<>(); for (String prop : rec.keySet()) { diff --git a/issues/src/org/labkey/issue/query/IssuesTable.java b/issues/src/org/labkey/issue/query/IssuesTable.java index 93292413a75..46ce3f7e9ce 100644 --- a/issues/src/org/labkey/issue/query/IssuesTable.java +++ b/issues/src/org/labkey/issue/query/IssuesTable.java @@ -784,7 +784,7 @@ static class AssignedToForeignKey extends UserIdForeignKey static public ColumnInfo initColumn(BaseColumnInfo column) { column.setFk(new IssuesTable.AssignedToForeignKey(column.getParentTable().getUserSchema())); - column.setDisplayColumnFactory(colInfo -> new UserIdRenderer(colInfo)); + column.setDisplayColumnFactory(UserIdRenderer::new); return column; } diff --git a/issues/src/org/labkey/issue/view/updateView.jsp b/issues/src/org/labkey/issue/view/updateView.jsp index 7e5da595cc4..bb4c1466c00 100644 --- a/issues/src/org/labkey/issue/view/updateView.jsp +++ b/issues/src/org/labkey/issue/view/updateView.jsp @@ -309,13 +309,13 @@