From 08ecfd65df5d3fa6fb34b17f01b92a639127cb00 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Thu, 26 Jun 2025 16:52:07 -0700 Subject: [PATCH 01/20] Issue 53306: Some LKS forms don't distinguish between fields differing only by special chars --- .../api/assay/actions/UploadWizardAction.java | 6 +++--- .../org/labkey/api/data/AbstractTableInfo.java | 2 +- .../api/data/AbstractWrappedColumnInfo.java | 6 ------ api/src/org/labkey/api/data/BaseColumnInfo.java | 16 +--------------- api/src/org/labkey/api/data/ColumnInfo.java | 2 -- api/src/org/labkey/api/data/DisplayColumn.java | 2 +- api/src/org/labkey/api/data/Table.java | 2 +- api/src/org/labkey/api/data/TableViewForm.java | 2 +- .../labkey/api/data/TableWrapperDynaClass.java | 2 +- .../org/labkey/api/exp/SamplePropertyHelper.java | 2 +- .../labkey/api/reports/report/ScriptReport.java | 3 ++- .../plate/PlateSampleFilePropertyHelper.java | 2 +- .../experiment/summarizeMaterialInputs.jsp | 2 +- .../list/model/ListQueryUpdateService.java | 2 +- .../mothership/AssignedToDisplayColumn.java | 2 +- 15 files changed, 16 insertions(+), 37 deletions(-) diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index 4fd40ab5c45..dc848ce9c3e 100644 --- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java +++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java @@ -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); } diff --git a/api/src/org/labkey/api/data/AbstractTableInfo.java b/api/src/org/labkey/api/data/AbstractTableInfo.java index b776002aea0..715418ba31c 100644 --- a/api/src/org/labkey/api/data/AbstractTableInfo.java +++ b/api/src/org/labkey/api/data/AbstractTableInfo.java @@ -693,7 +693,7 @@ protected ColumnInfo resolveColumn(String name) { if (null != col) // #19358 { - String propName = col.getPropertyName(); + String propName = BaseColumnInfo.propNameFromName(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..8b896c9e77e 100644 --- a/api/src/org/labkey/api/data/BaseColumnInfo.java +++ b/api/src/org/labkey/api/data/BaseColumnInfo.java @@ -86,8 +86,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 +251,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 +269,6 @@ public void setFieldKey(@NotNull FieldKey key) { checkLocked(); _fieldKey = Objects.requireNonNull(key); - _propertyName = null; } @@ -887,16 +883,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 @@ -1727,7 +1713,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 f3457a0ee7e..b1dd656791d 100644 --- a/api/src/org/labkey/api/data/ColumnInfo.java +++ b/api/src/org/labkey/api/data/ColumnInfo.java @@ -216,8 +216,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 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/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/exp/SamplePropertyHelper.java b/api/src/org/labkey/api/exp/SamplePropertyHelper.java index 088fb67b7b0..943c0450561 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(); diff --git a/api/src/org/labkey/api/reports/report/ScriptReport.java b/api/src/org/labkey/api/reports/report/ScriptReport.java index e90af0a0204..ea4535d8cf3 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; @@ -220,7 +221,7 @@ protected List outputColumnNames(Results r) ArrayList ret = new ArrayList<>(count); for (int col = 1; col <= count; col++) { - String alias = r.getColumn(col).getPropertyName(); + String alias = ColumnInfo.propNameFromName(r.getColumn(col).getName()); if (!aliases.add(alias)) { int i; 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/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/list/src/org/labkey/list/model/ListQueryUpdateService.java b/list/src/org/labkey/list/model/ListQueryUpdateService.java index 83f11f4ca6f..0bbf73645e4 100644 --- a/list/src/org/labkey/list/model/ListQueryUpdateService.java +++ b/list/src/org/labkey/list/model/ListQueryUpdateService.java @@ -370,7 +370,7 @@ protected Map updateRow(User user, Container container, Map list = MothershipManager.get().getAssignedToList(_container); new SelectBuilder() - .name(getColumnInfo().getPropertyName()) + .name(getColumnInfo().getName()) .addOption("") .addOptions( list.stream() From b9cf772b1840fda518b84d3f35d6dbc38f5e1459 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Fri, 27 Jun 2025 14:51:05 -0700 Subject: [PATCH 02/20] Update expected field names --- assay/src/org/labkey/assay/AssayIntegrationTestCase.jsp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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; From 45027f547cd553f377a6c760d30f0663ee0ff32d Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Fri, 27 Jun 2025 18:22:34 -0700 Subject: [PATCH 03/20] Update input element names --- .../api/assay/actions/UploadWizardAction.java | 2 +- .../actions/SetDefaultValuesAssayAction.java | 2 +- .../experiment/ProvenanceAssayHelper.java | 7 +-- .../labkey/test/tests/search/SearchTest.java | 6 +-- .../labkey/test/tests/study/AssayTest.java | 53 ++++++++++--------- .../test/tests/study/AutoLinkToStudyTest.java | 2 +- .../tests/study/LinkAssayToStudyTest.java | 43 +++++++-------- .../test/tests/study/StudyExportTest.java | 3 +- .../labkey/test/tests/study/StudyTest.java | 3 +- .../test/tests/study/TargetStudyTest.java | 8 +-- 10 files changed, 69 insertions(+), 60 deletions(-) diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index dc848ce9c3e..7b3156a0ef5 100644 --- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java +++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java @@ -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/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java b/assay/src/org/labkey/assay/actions/SetDefaultValuesAssayAction.java index 0c4901c1000..f6ff0a5a625 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("ParticipantVisitResolver"))) ThawListResolverType.validationHelper(target, errors); } } \ No newline at end of file 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..17bb2ad419c 100644 --- a/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java +++ b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java @@ -17,6 +17,7 @@ import org.labkey.test.pages.ReactAssayDesignerPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.params.experiment.SampleTypeDefinition; +import org.labkey.test.tests.study.AssayTest; import org.labkey.test.util.PostgresOnlyTest; import org.labkey.test.util.SampleTypeHelper; @@ -82,9 +83,9 @@ protected void populateAssay(String assayName, String runName, String runData) waitForElement(Locator.tagWithName("select", "targetStudy")); clickAndWait(Locator.lkButton("Next")); - setFormElement(Locator.name("name"), runName); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), runData); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, runData); clickAndWait(Locator.lkButton("Save and Finish")); } diff --git a/study/test/src/org/labkey/test/tests/search/SearchTest.java b/study/test/src/org/labkey/test/tests/search/SearchTest.java index 0a41204e1b8..7708b59b795 100644 --- a/study/test/src/org/labkey/test/tests/search/SearchTest.java +++ b/study/test/src/org/labkey/test/tests/search/SearchTest.java @@ -451,9 +451,9 @@ private void addSearchableIssues() goToModule("Issues"); File file = TestFileUtils.getSampleData("fileTypes/tsv_sample.tsv"); issuesHelper.addIssue(ISSUE_TITLE, _userHelper.getDisplayNameForEmail(USER1), - Maps.of("type", "UFO", - "area", "Area51", - "priority", "1", + Maps.of("Type", "UFO", + "Area", "Area51", + "Priority", "1", "comment", ISSUE_BODY), file); diff --git a/study/test/src/org/labkey/test/tests/study/AssayTest.java b/study/test/src/org/labkey/test/tests/study/AssayTest.java index ed61f915364..b0672287bd3 100644 --- a/study/test/src/org/labkey/test/tests/study/AssayTest.java +++ b/study/test/src/org/labkey/test/tests/study/AssayTest.java @@ -45,11 +45,15 @@ @Category({Daily.class, Assays.class}) public class AssayTest extends AbstractAssayTest { + public static final Locator ASSAY_NAME_FIELD_LOCATOR = Locator.name("Name"); + public static final Locator COMMENTS_FIELD_LOCATOR = Locator.name("Comments"); private static final String INVESTIGATOR = "Dr. No"; private static final String GRANT = "SPECTRE"; private static final String DESCRIPTION = "World Domination."; private static final String SAMPLE_FIELD_TEST_ASSAY = "SampleFieldTestAssay"; private static final String SAMPLE_FIELD_PROJECT_NAME = "Sample Field Test Project"; + public static final Locator TEXT_AREA_DATA_PROVIDER_LOCATOR = Locator.xpath("//input[@value='textAreaDataProvider']"); + public static final Locator TEXT_AREA_DATA_COLLECTOR_LOCATOR = Locator.textarea("TextAreaDataCollector.textArea"); @Override protected String getProjectName() @@ -189,9 +193,9 @@ private void importSampleAssayData(String runName, String sampleId) goToManageAssays(); clickAndWait(Locator.linkWithText(SAMPLE_FIELD_TEST_ASSAY)); clickButton("Import Data", "Run Data"); - setFormElement(Locator.name("name"), runName); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), "SampleField\n" + sampleId); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, "SampleField\n" + sampleId); clickButton("Save and Finish"); } @@ -361,51 +365,52 @@ private void uploadRuns(String folder, String asUser) assertTextPresent(TEST_ASSAY_RUN_PROP_NAME + "0 is required and must be of type Text (String)."); assertTextPresent(PROTOCOL_DOC.getName()); waitAndClick(Locator.linkWithText("remove")); - setFormElement(Locator.name("name"), TEST_RUN1); - setFormElement(Locator.name("comments"), TEST_RUN1_COMMENTS); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); clickButton("Save and Finish"); - assertFormElementEquals(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), ""); + Locator loc4 = Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"); + assertEquals("", getFormElement(loc4)); assertTextPresent("Data file contained zero data rows"); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN1_DATA1); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); clickButton("Save and Import Another Run"); - setFormElement(Locator.name("name"), TEST_RUN2); - setFormElement(Locator.name("comments"), TEST_RUN2_COMMENTS); + setFormElement(ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); + setFormElement(COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA1); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName()); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA2); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); clickButton("Save and Finish"); assertTextPresent("Could not convert value 'g' (String) for Double field 'VisitID'"); assertTextPresent(PROTOCOL_DOC2.getName()); - assertFormElementEquals(Locator.name("name"), TEST_RUN2); - assertFormElementEquals(Locator.name("comments"), TEST_RUN2_COMMENTS); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA3); + assertEquals(TEST_RUN2, getFormElement(ASSAY_NAME_FIELD_LOCATOR)); + assertEquals(TEST_RUN2_COMMENTS, getFormElement(COMMENTS_FIELD_LOCATOR)); + click(TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); clickButton("Save and Import Another Run"); assertTextPresent("Missing value for required property: " + TEST_ASSAY_DATA_PROP_NAME + "6"); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA4); + click(TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); clickButton("Save and Import Another Run"); - assertFormElementEquals(Locator.name("name"), ""); - assertFormElementEquals(Locator.name("comments"), ""); - setFormElement(Locator.name("name"), TEST_RUN3); - setFormElement(Locator.name("comments"), TEST_RUN3_COMMENTS); + assertEquals("", getFormElement(ASSAY_NAME_FIELD_LOCATOR)); + assertEquals("", getFormElement(COMMENTS_FIELD_LOCATOR)); + setFormElement(ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); + setFormElement(COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName().substring(0, PROTOCOL_DOC2.getName().lastIndexOf(".")) + "-1"); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN3_DATA1); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); clickButton("Save and Finish"); // Verify the first run did not have a file, the second run had the attached file and the third run had a file diff --git a/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java b/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java index e3f110ca1c4..80280698b86 100644 --- a/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java @@ -290,7 +290,7 @@ private void importAssayRun(File runFile, String assayName, String runName) DataRegionTable runTable = new DataRegionTable("Runs", getDriver()); runTable.clickHeaderButtonAndWait("Import Data"); clickButton("Next"); - setFormElement(Locator.name("name"), runName); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); checkRadioButton(Locator.radioButtonById("Fileupload")); setFormElement(Locator.input("__primaryFile__"), runFile); clickButton("Save and Finish"); diff --git a/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java b/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java index 0bcf824844b..79a799c754f 100644 --- a/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java @@ -186,51 +186,52 @@ private void uploadRuns(String folder, String asUser) assertTextPresent(TEST_ASSAY_RUN_PROP_NAME + "0 is required and must be of type Text (String)."); assertTextPresent(PROTOCOL_DOC.getName()); waitAndClick(Locator.linkWithText("remove")); - setFormElement(Locator.name("name"), TEST_RUN1); - setFormElement(Locator.name("comments"), TEST_RUN1_COMMENTS); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); clickButton("Save and Finish"); - assertFormElementEquals(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), ""); + Locator loc4 = Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"); + assertEquals("", getFormElement(loc4)); assertTextPresent("Data file contained zero data rows"); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN1_DATA1); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); clickButton("Save and Import Another Run"); - setFormElement(Locator.name("name"), TEST_RUN2); - setFormElement(Locator.name("comments"), TEST_RUN2_COMMENTS); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); + setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA1); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName()); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA2); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); clickButton("Save and Finish"); assertTextPresent("Could not convert value 'g' (String) for Double field 'VisitID'"); assertTextPresent(PROTOCOL_DOC2.getName()); - assertFormElementEquals(Locator.name("name"), TEST_RUN2); - assertFormElementEquals(Locator.name("comments"), TEST_RUN2_COMMENTS); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA3); + assertEquals(TEST_RUN2, getFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals(TEST_RUN2_COMMENTS, getFormElement(AssayTest.COMMENTS_FIELD_LOCATOR)); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); clickButton("Save and Import Another Run"); assertTextPresent("Missing value for required property: " + TEST_ASSAY_DATA_PROP_NAME + "6"); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN2_DATA4); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); clickButton("Save and Import Another Run"); - assertFormElementEquals(Locator.name("name"), ""); - assertFormElementEquals(Locator.name("comments"), ""); - setFormElement(Locator.name("name"), TEST_RUN3); - setFormElement(Locator.name("comments"), TEST_RUN3_COMMENTS); + assertEquals("", getFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals("", getFormElement(AssayTest.COMMENTS_FIELD_LOCATOR)); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); + setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName().substring(0, PROTOCOL_DOC2.getName().lastIndexOf(".")) + "-1"); - setFormElement(Locator.id("TextAreaDataCollector.textArea"), TEST_RUN3_DATA1); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); clickButton("Save and Finish"); // Verify the first run did not have a file, the second run had the attached file and the third run had a file diff --git a/study/test/src/org/labkey/test/tests/study/StudyExportTest.java b/study/test/src/org/labkey/test/tests/study/StudyExportTest.java index 11960206259..59e9074e64d 100644 --- a/study/test/src/org/labkey/test/tests/study/StudyExportTest.java +++ b/study/test/src/org/labkey/test/tests/study/StudyExportTest.java @@ -210,7 +210,8 @@ protected void verifyStudyAndDatasets() // verify visit modifications manageVisitPage.goToEditVisit(MODIFIED_VISIT); - assertFormElementEquals(Locator.name("datasetStatus"), "OPTIONAL"); + Locator loc = Locator.name("datasetStatus"); + assertEquals("OPTIONAL", getFormElement(loc)); assertOptionEquals(Locator.name("cohortId"), GROUP_2); } diff --git a/study/test/src/org/labkey/test/tests/study/StudyTest.java b/study/test/src/org/labkey/test/tests/study/StudyTest.java index 07c2fcee02f..5e150b369db 100644 --- a/study/test/src/org/labkey/test/tests/study/StudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/StudyTest.java @@ -818,7 +818,8 @@ protected void verifyStudyAndDatasets(boolean isVisitBased) clickButton("Submit"); assertTextPresent("Updatable Value"); clickAndWait(Locator.tagWithAttribute("a", "data-original-title","edit").index(0)); - assertFormElementEquals(Locator.input("quf_Bad Name"), "Updatable Value"); + Locator loc = Locator.input("quf_Bad Name"); + assertEquals("Updatable Value", getFormElement(loc)); setFormElement(Locator.input("quf_Bad Name"), "Updatable Value11"); clickButton("Submit"); assertTextPresent("Updatable Value11"); diff --git a/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java b/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java index 534599d6a91..a55607e1434 100644 --- a/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java @@ -168,16 +168,16 @@ protected void uploadRuns() clickButton("Import Data"); - setFormElement(Locator.name("name"), TEST_RUN1); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); + setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); String data1 = TEST_RUN1_DATA1 .replace("${Study1ContainerID}", _study1ContainerId) .replace("${Study1Label}", _study1Label); - setFormElement(Locator.name("TextAreaDataCollector.textArea"), data1); + setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, data1); clickButton("Save and Finish"); assertTextPresent("Couldn't resolve TargetStudy 'StudyNotExist' to a study folder."); - click(Locator.xpath("//input[@value='textAreaDataProvider']")); + click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); String data2 = data1.replace("StudyNotExist", ""); setFormElement(Locator.name("TextAreaDataCollector.textArea"), data2); clickButton("Save and Finish"); From 99abd18237eae4f62fd1d5f41bbca8bd40f823e5 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sat, 28 Jun 2025 09:18:42 -0700 Subject: [PATCH 04/20] Fix build --- .../experiment/ProvenanceAssayHelper.java | 8 +-- .../labkey/test/tests/study/AssayTest.java | 51 +++++++++---------- .../test/tests/study/AutoLinkToStudyTest.java | 3 +- .../tests/study/LinkAssayToStudyTest.java | 41 +++++++-------- .../test/tests/study/TargetStudyTest.java | 9 ++-- 5 files changed, 56 insertions(+), 56 deletions(-) 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 17bb2ad419c..0d1517163ab 100644 --- a/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java +++ b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java @@ -14,10 +14,10 @@ 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; -import org.labkey.test.tests.study.AssayTest; import org.labkey.test.util.PostgresOnlyTest; import org.labkey.test.util.SampleTypeHelper; @@ -83,9 +83,9 @@ protected void populateAssay(String assayName, String runName, String runData) waitForElement(Locator.tagWithName("select", "targetStudy")); clickAndWait(Locator.lkButton("Next")); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, 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/study/test/src/org/labkey/test/tests/study/AssayTest.java b/study/test/src/org/labkey/test/tests/study/AssayTest.java index b0672287bd3..3a075594fdb 100644 --- a/study/test/src/org/labkey/test/tests/study/AssayTest.java +++ b/study/test/src/org/labkey/test/tests/study/AssayTest.java @@ -24,6 +24,7 @@ import org.labkey.test.categories.Assays; import org.labkey.test.categories.Daily; import org.labkey.test.components.CustomizeView; +import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.components.domain.DomainFieldRow; import org.labkey.test.components.domain.DomainFormPanel; import org.labkey.test.pages.ReactAssayDesignerPage; @@ -45,15 +46,11 @@ @Category({Daily.class, Assays.class}) public class AssayTest extends AbstractAssayTest { - public static final Locator ASSAY_NAME_FIELD_LOCATOR = Locator.name("Name"); - public static final Locator COMMENTS_FIELD_LOCATOR = Locator.name("Comments"); private static final String INVESTIGATOR = "Dr. No"; private static final String GRANT = "SPECTRE"; private static final String DESCRIPTION = "World Domination."; private static final String SAMPLE_FIELD_TEST_ASSAY = "SampleFieldTestAssay"; private static final String SAMPLE_FIELD_PROJECT_NAME = "Sample Field Test Project"; - public static final Locator TEXT_AREA_DATA_PROVIDER_LOCATOR = Locator.xpath("//input[@value='textAreaDataProvider']"); - public static final Locator TEXT_AREA_DATA_COLLECTOR_LOCATOR = Locator.textarea("TextAreaDataCollector.textArea"); @Override protected String getProjectName() @@ -193,9 +190,9 @@ private void importSampleAssayData(String runName, String sampleId) goToManageAssays(); clickAndWait(Locator.linkWithText(SAMPLE_FIELD_TEST_ASSAY)); clickButton("Import Data", "Run Data"); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, "SampleField\n" + sampleId); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, runName); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, "SampleField\n" + sampleId); clickButton("Save and Finish"); } @@ -365,52 +362,52 @@ private void uploadRuns(String folder, String asUser) assertTextPresent(TEST_ASSAY_RUN_PROP_NAME + "0 is required and must be of type Text (String)."); assertTextPresent(PROTOCOL_DOC.getName()); waitAndClick(Locator.linkWithText("remove")); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); - setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); clickButton("Save and Finish"); Locator loc4 = Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"); assertEquals("", getFormElement(loc4)); assertTextPresent("Data file contained zero data rows"); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); clickButton("Save and Import Another Run"); - setFormElement(ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); - setFormElement(COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName()); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); clickButton("Save and Finish"); assertTextPresent("Could not convert value 'g' (String) for Double field 'VisitID'"); assertTextPresent(PROTOCOL_DOC2.getName()); - assertEquals(TEST_RUN2, getFormElement(ASSAY_NAME_FIELD_LOCATOR)); - assertEquals(TEST_RUN2_COMMENTS, getFormElement(COMMENTS_FIELD_LOCATOR)); - click(TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); + assertEquals(TEST_RUN2, getFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals(TEST_RUN2_COMMENTS, getFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR)); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); clickButton("Save and Import Another Run"); assertTextPresent("Missing value for required property: " + TEST_ASSAY_DATA_PROP_NAME + "6"); - click(TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); clickButton("Save and Import Another Run"); - assertEquals("", getFormElement(ASSAY_NAME_FIELD_LOCATOR)); - assertEquals("", getFormElement(COMMENTS_FIELD_LOCATOR)); - setFormElement(ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); - setFormElement(COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); + assertEquals("", getFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals("", getFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR)); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName().substring(0, PROTOCOL_DOC2.getName().lastIndexOf(".")) + "-1"); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); clickButton("Save and Finish"); // Verify the first run did not have a file, the second run had the attached file and the third run had a file diff --git a/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java b/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java index 80280698b86..0e478c59f01 100644 --- a/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/AutoLinkToStudyTest.java @@ -12,6 +12,7 @@ import org.labkey.test.categories.Assays; import org.labkey.test.categories.Daily; import org.labkey.test.components.CustomizeView; +import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.components.ext4.Window; import org.labkey.test.pages.query.ExecuteQueryPage; import org.labkey.test.util.ApiPermissionsHelper; @@ -290,7 +291,7 @@ private void importAssayRun(File runFile, String assayName, String runName) DataRegionTable runTable = new DataRegionTable("Runs", getDriver()); runTable.clickHeaderButtonAndWait("Import Data"); clickButton("Next"); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, runName); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, runName); checkRadioButton(Locator.radioButtonById("Fileupload")); setFormElement(Locator.input("__primaryFile__"), runFile); clickButton("Save and Finish"); diff --git a/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java b/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java index 79a799c754f..d3cbb867335 100644 --- a/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/LinkAssayToStudyTest.java @@ -24,6 +24,7 @@ import org.labkey.test.TestTimeoutException; import org.labkey.test.categories.Assays; import org.labkey.test.categories.Daily; +import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.tests.AbstractAssayTest; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.LogMethod; @@ -186,52 +187,52 @@ private void uploadRuns(String folder, String asUser) assertTextPresent(TEST_ASSAY_RUN_PROP_NAME + "0 is required and must be of type Text (String)."); assertTextPresent(PROTOCOL_DOC.getName()); waitAndClick(Locator.linkWithText("remove")); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); - setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN1_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); clickButton("Save and Finish"); Locator loc4 = Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"); assertEquals("", getFormElement(loc4)); assertTextPresent("Data file contained zero data rows"); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN1_DATA1); clickButton("Save and Import Another Run"); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); - setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN2); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN2_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "0"), TEST_ASSAY_RUN_PROP1); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA1); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName()); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA2); clickButton("Save and Finish"); assertTextPresent("Could not convert value 'g' (String) for Double field 'VisitID'"); assertTextPresent(PROTOCOL_DOC2.getName()); - assertEquals(TEST_RUN2, getFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR)); - assertEquals(TEST_RUN2_COMMENTS, getFormElement(AssayTest.COMMENTS_FIELD_LOCATOR)); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); + assertEquals(TEST_RUN2, getFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals(TEST_RUN2_COMMENTS, getFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR)); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA3); clickButton("Save and Import Another Run"); assertTextPresent("Missing value for required property: " + TEST_ASSAY_DATA_PROP_NAME + "6"); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN2_DATA4); clickButton("Save and Import Another Run"); - assertEquals("", getFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR)); - assertEquals("", getFormElement(AssayTest.COMMENTS_FIELD_LOCATOR)); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); - setFormElement(AssayTest.COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); + assertEquals("", getFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR)); + assertEquals("", getFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR)); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN3); + setFormElement(AssayConstants.COMMENTS_FIELD_LOCATOR, TEST_RUN3_COMMENTS); setFormElement(Locator.name(TEST_ASSAY_RUN_PROP_NAME + "5"), PROTOCOL_DOC2); clickButton("Save and Finish"); assertTextPresent(PROTOCOL_DOC2.getName().substring(0, PROTOCOL_DOC2.getName().lastIndexOf(".")) + "-1"); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, TEST_RUN3_DATA1); clickButton("Save and Finish"); // Verify the first run did not have a file, the second run had the attached file and the third run had a file diff --git a/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java b/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java index a55607e1434..624ae30cb34 100644 --- a/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java +++ b/study/test/src/org/labkey/test/tests/study/TargetStudyTest.java @@ -24,6 +24,7 @@ import org.labkey.test.TestFileUtils; import org.labkey.test.categories.Assays; import org.labkey.test.categories.Daily; +import org.labkey.test.components.assay.AssayConstants; import org.labkey.test.tests.AbstractAssayTest; import org.labkey.test.util.DataRegionTable; import org.labkey.test.util.LogMethod; @@ -168,16 +169,16 @@ protected void uploadRuns() clickButton("Import Data"); - setFormElement(AssayTest.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + setFormElement(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, TEST_RUN1); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); String data1 = TEST_RUN1_DATA1 .replace("${Study1ContainerID}", _study1ContainerId) .replace("${Study1Label}", _study1Label); - setFormElement(AssayTest.TEXT_AREA_DATA_COLLECTOR_LOCATOR, data1); + setFormElement(AssayConstants.TEXT_AREA_DATA_COLLECTOR_LOCATOR, data1); clickButton("Save and Finish"); assertTextPresent("Couldn't resolve TargetStudy 'StudyNotExist' to a study folder."); - click(AssayTest.TEXT_AREA_DATA_PROVIDER_LOCATOR); + click(AssayConstants.TEXT_AREA_DATA_PROVIDER_LOCATOR); String data2 = data1.replace("StudyNotExist", ""); setFormElement(Locator.name("TextAreaDataCollector.textArea"), data2); clickButton("Save and Finish"); From d16d0ab575b8dfd96e5e412c806d1c78878ed8d0 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sat, 28 Jun 2025 10:09:26 -0700 Subject: [PATCH 05/20] Test fixes --- api/src/org/labkey/api/exp/SamplePropertyHelper.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/api/src/org/labkey/api/exp/SamplePropertyHelper.java b/api/src/org/labkey/api/exp/SamplePropertyHelper.java index 943c0450561..b259e01d0f7 100644 --- a/api/src/org/labkey/api/exp/SamplePropertyHelper.java +++ b/api/src/org/labkey/api/exp/SamplePropertyHelper.java @@ -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); } From b26f4443a82813feb8050f3ee194bcd5bf667814 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sat, 28 Jun 2025 16:53:26 -0600 Subject: [PATCH 06/20] Test fixes --- .../org/labkey/test/tests/assay/AssayReimportIndexTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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(); From 6a24d8f6e98f9348b6132d386bf1ec666d805dcf Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sun, 29 Jun 2025 07:38:08 -0600 Subject: [PATCH 07/20] Test fixes --- api/src/org/labkey/api/data/DisplayColumnGroup.java | 2 +- .../test/tests/experiment/ExpSchemaPropagateFilterTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/org/labkey/api/data/DisplayColumnGroup.java b/api/src/org/labkey/api/data/DisplayColumnGroup.java index 5e8dc9d4331..c8a962adf6a 100644 --- a/api/src/org/labkey/api/data/DisplayColumnGroup.java +++ b/api/src/org/labkey/api/data/DisplayColumnGroup.java @@ -91,7 +91,7 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) private String getGroupFormFieldName(RenderContext ctx) { - return ColumnInfo.propNameFromName(getColumns().get(0).getFormFieldName(ctx)); + return getColumns().get(0).getFormFieldName(ctx); } public void writeCopyableJavaScript(RenderContext ctx, Writer out) throws IOException diff --git a/study/test/src/org/labkey/test/tests/experiment/ExpSchemaPropagateFilterTest.java b/study/test/src/org/labkey/test/tests/experiment/ExpSchemaPropagateFilterTest.java index df76601af06..789a9767c69 100644 --- a/study/test/src/org/labkey/test/tests/experiment/ExpSchemaPropagateFilterTest.java +++ b/study/test/src/org/labkey/test/tests/experiment/ExpSchemaPropagateFilterTest.java @@ -238,15 +238,15 @@ private void createAssays() // Re-import the assay. assayRunFile = TestFileUtils.getSampleData("/assay/" + ASSAY_NAME_PARENT +"_Reimport.tsv"); - reImportAssayRun(null, ASSAY_NAME_PARENT, ASSAY_RUN_PARENT, Map.of("name", ASSAY_REIMPORT_RUN_PARENT), assayRunFile); + reImportAssayRun(null, ASSAY_NAME_PARENT, ASSAY_RUN_PARENT, Map.of("Name", ASSAY_REIMPORT_RUN_PARENT), assayRunFile); assayFile = TestFileUtils.getSampleData("/assay/" + ASSAY_NAME_SUBFOLDER + ".xar.xml"); assayRunFile = TestFileUtils.getSampleData("/assay/" + ASSAY_NAME_SUBFOLDER + ".tsv"); - createAssayAndPopulate(SUB_FOLDER_A, ASSAY_NAME_SUBFOLDER, assayFile, Map.of("name", ASSAY_RUN_SUBFOLDER), assayRunFile); + createAssayAndPopulate(SUB_FOLDER_A, ASSAY_NAME_SUBFOLDER, assayFile, Map.of("Name", ASSAY_RUN_SUBFOLDER), assayRunFile); // Re-import the assay. assayRunFile = TestFileUtils.getSampleData("/assay/" + ASSAY_NAME_SUBFOLDER +"_Reimport.tsv"); - reImportAssayRun(SUB_FOLDER_A, ASSAY_NAME_SUBFOLDER, ASSAY_RUN_SUBFOLDER, Map.of("name", ASSAY_REIMPORT_RUN_SUBFOLDER), assayRunFile); + reImportAssayRun(SUB_FOLDER_A, ASSAY_NAME_SUBFOLDER, ASSAY_RUN_SUBFOLDER, Map.of("Name", ASSAY_REIMPORT_RUN_SUBFOLDER), assayRunFile); } From b5f34d1140f903995c2975a9e20e9d57fa0261fb Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Wed, 2 Jul 2025 07:24:35 -0600 Subject: [PATCH 08/20] Test fixes --- api/src/org/labkey/api/view/template/PageConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/src/org/labkey/api/view/template/PageConfig.java b/api/src/org/labkey/api/view/template/PageConfig.java index 2d6c17edb2b..40730843c0c 100644 --- a/api/src/org/labkey/api/view/template/PageConfig.java +++ b/api/src/org/labkey/api/view/template/PageConfig.java @@ -103,10 +103,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() From 5fbb177220724c603e169c3279d87e3127e914ee Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sun, 6 Jul 2025 13:41:38 -0700 Subject: [PATCH 09/20] Test fixes, consolidate code, add comments --- api/src/org/labkey/api/data/AbstractTableInfo.java | 2 +- api/src/org/labkey/api/data/BaseColumnInfo.java | 14 +------------- api/src/org/labkey/api/data/ColumnInfo.java | 10 +++++++++- .../org/labkey/api/data/DisplayColumnGroup.java | 3 ++- api/src/org/labkey/api/data/ImportAliasable.java | 2 +- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/api/src/org/labkey/api/data/AbstractTableInfo.java b/api/src/org/labkey/api/data/AbstractTableInfo.java index 715418ba31c..41fb68c173b 100644 --- a/api/src/org/labkey/api/data/AbstractTableInfo.java +++ b/api/src/org/labkey/api/data/AbstractTableInfo.java @@ -693,7 +693,7 @@ protected ColumnInfo resolveColumn(String name) { if (null != col) // #19358 { - String propName = BaseColumnInfo.propNameFromName(col.getName()); + String propName = ColumnInfo.propNameFromName(col.getName()); if (null != propName && propName.equalsIgnoreCase(name)) return col; } diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java index 8b896c9e77e..fb15dc6d6fc 100644 --- a/api/src/org/labkey/api/data/BaseColumnInfo.java +++ b/api/src/org/labkey/api/data/BaseColumnInfo.java @@ -1387,6 +1387,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) { @@ -1417,19 +1418,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) { diff --git a/api/src/org/labkey/api/data/ColumnInfo.java b/api/src/org/labkey/api/data/ColumnInfo.java index b1dd656791d..479ab39901d 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; @@ -382,9 +383,16 @@ static String labelFromName(String name) return BaseColumnInfo.labelFromName(name); } + /** @return a version of the supplied name that conforms to Java's local variable naming convention */ static String propNameFromName(String name) { - return BaseColumnInfo.propNameFromName(name); + if (name == null) + return null; + + if (name.isEmpty()) + return null; + + return Introspector.decapitalize(legalNameFromName(name)); } static String legalNameFromName(String name) diff --git a/api/src/org/labkey/api/data/DisplayColumnGroup.java b/api/src/org/labkey/api/data/DisplayColumnGroup.java index c8a962adf6a..d36130c5fd2 100644 --- a/api/src/org/labkey/api/data/DisplayColumnGroup.java +++ b/api/src/org/labkey/api/data/DisplayColumnGroup.java @@ -60,7 +60,8 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) TD( isCopyable() ? (DOM.Renderable) ret -> { - String id = getGroupFormFieldName(ctx) + "CheckBox"; + // Use propName because ids can't have spaces + String id = ColumnInfo.propNameFromName(getGroupFormFieldName(ctx)) + "CheckBox"; InputBuilder.checkbox().name(id).id(id).appendTo(out); StringBuilder onChange = new StringBuilder("b = this.checked;"); diff --git a/api/src/org/labkey/api/data/ImportAliasable.java b/api/src/org/labkey/api/data/ImportAliasable.java index 1e123b91fed..87b85595959 100644 --- a/api/src/org/labkey/api/data/ImportAliasable.java +++ b/api/src/org/labkey/api/data/ImportAliasable.java @@ -67,7 +67,7 @@ public static Map createImportMap(List // Then propName variant of name for (T property : reversedProperties) { - m.put(BaseColumnInfo.propNameFromName(property.getName()), property); + m.put(ColumnInfo.propNameFromName(property.getName()), property); } // Then aliases for (T property : reversedProperties) From 16b746506357c6bfd211185b6675547fc61a0db5 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sun, 6 Jul 2025 13:45:55 -0700 Subject: [PATCH 10/20] Code cleanup --- api/src/org/labkey/api/data/BaseColumnInfo.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java index fb15dc6d6fc..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; @@ -1631,12 +1630,6 @@ public Set getSuggestedColumns() { return null; } - - @Override - public boolean isShowAsPublicDependency() - { - return false; - } } @Override From 221f85d329927a4cf5ea9f7bf8127b6d9f14207d Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sun, 6 Jul 2025 20:19:44 -0700 Subject: [PATCH 11/20] Test fixes --- api/src/org/labkey/api/data/DisplayColumnGroup.java | 8 ++++---- .../org/labkey/mothership/CreateIssueDisplayColumn.java | 4 ++-- .../test/pages/mothership/StackTraceDetailsPage.java | 6 +++--- .../org/labkey/test/util/mothership/MothershipHelper.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/api/src/org/labkey/api/data/DisplayColumnGroup.java b/api/src/org/labkey/api/data/DisplayColumnGroup.java index d36130c5fd2..c8696fdafc6 100644 --- a/api/src/org/labkey/api/data/DisplayColumnGroup.java +++ b/api/src/org/labkey/api/data/DisplayColumnGroup.java @@ -60,8 +60,7 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) TD( isCopyable() ? (DOM.Renderable) ret -> { - // Use propName because ids can't have spaces - String id = ColumnInfo.propNameFromName(getGroupFormFieldName(ctx)) + "CheckBox"; + String id = getGroupFormFieldName(ctx) + "CheckBox"; InputBuilder.checkbox().name(id).id(id).appendTo(out); StringBuilder onChange = new StringBuilder("b = this.checked;"); @@ -90,9 +89,10 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) ).appendTo(out); } - private String getGroupFormFieldName(RenderContext ctx) + /** Use propName because DOM ids and function names can't have spaces */ + private String getGroupFormFieldName(RenderContext ctx) { - return getColumns().get(0).getFormFieldName(ctx); + return ColumnInfo.propNameFromName(getColumns().get(0).getFormFieldName(ctx)); } public void writeCopyableJavaScript(RenderContext ctx, Writer out) throws IOException diff --git a/mothership/src/org/labkey/mothership/CreateIssueDisplayColumn.java b/mothership/src/org/labkey/mothership/CreateIssueDisplayColumn.java index 24160c653ed..4e636ca9d6d 100644 --- a/mothership/src/org/labkey/mothership/CreateIssueDisplayColumn.java +++ b/mothership/src/org/labkey/mothership/CreateIssueDisplayColumn.java @@ -41,9 +41,9 @@ public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out) _saveButton.render(ctx, out); out.write("\t"); PageFlowUtil.button("Create Issue") - .onClick("document.forms.CreateIssue.elements['assignedTo'].value = document.forms[" + + .onClick("document.forms.CreateIssue.elements['AssignedTo'].value = document.forms[" + PageFlowUtil.jsString(ctx.getCurrentRegion().getFormId()) + - "].elements['assignedTo'].value; document.forms.CreateIssue.submit();") + "].elements['AssignedTo'].value; document.forms.CreateIssue.submit();") .appendTo(out); } } diff --git a/mothership/test/src/org/labkey/test/pages/mothership/StackTraceDetailsPage.java b/mothership/test/src/org/labkey/test/pages/mothership/StackTraceDetailsPage.java index 9256d5d8fc6..0cb6c0b49bb 100644 --- a/mothership/test/src/org/labkey/test/pages/mothership/StackTraceDetailsPage.java +++ b/mothership/test/src/org/labkey/test/pages/mothership/StackTraceDetailsPage.java @@ -94,9 +94,9 @@ protected ElementCache newElementCache() protected class ElementCache extends LabKeyPage.ElementCache { - Input bugNumberInput = new Input(Locator.name("bugNumber").findWhenNeeded(this), getDriver()); - Input commentsTextArea = new Input(Locator.name("comments").findWhenNeeded(this), getDriver()); - OptionSelect assignedToSelect = OptionSelect(Locator.name("assignedTo")).findWhenNeeded(this); + Input bugNumberInput = new Input(Locator.name("BugNumber").findWhenNeeded(this), getDriver()); + Input commentsTextArea = new Input(Locator.name("Comments").findWhenNeeded(this), getDriver()); + OptionSelect assignedToSelect = OptionSelect(Locator.name("AssignedTo")).findWhenNeeded(this); WebElement saveButton = Locator.lkButton("Save").findWhenNeeded(this); WebElement createIssueButton = Locator.lkButton("Create Issue").findWhenNeeded(this); DataRegionTable exceptionReportsDataRegion = new DataRegionTable("ExceptionReports", getDriver()); diff --git a/mothership/test/src/org/labkey/test/util/mothership/MothershipHelper.java b/mothership/test/src/org/labkey/test/util/mothership/MothershipHelper.java index 3b195007f7b..3a1c636dbcb 100644 --- a/mothership/test/src/org/labkey/test/util/mothership/MothershipHelper.java +++ b/mothership/test/src/org/labkey/test/util/mothership/MothershipHelper.java @@ -187,13 +187,13 @@ public void updateStackTrace(int exceptionStackTraceId, String bugNumber, String Map params = new HashMap<>(); params.put(ID_COLUMN, exceptionStackTraceId); if (bugNumber != null) - params.put("bugNumber", bugNumber); + params.put("BugNumber", bugNumber); if (comments != null) - params.put("comments", comments); + params.put("Comments", comments); if (assignedToEmail != null) { String assignedToId = assignedToEmail.isEmpty() ? "" : new APIUserHelper(this).getUserId(assignedToEmail).toString(); - params.put("assignedTo", assignedToId); + params.put("AssignedTo", assignedToId); } command.setParameters(params); try From 759e7a08c17115c82d37df57ae5e8d162cef5019 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Mon, 7 Jul 2025 16:12:32 -0700 Subject: [PATCH 12/20] Test fixes --- .../api/assay/actions/UploadWizardAction.java | 2 +- api/src/org/labkey/api/data/TableViewForm.java | 2 +- api/src/org/labkey/api/query/UserIdForeignKey.java | 14 +++++++++++++- .../api/study/actions/StudyPickerColumn.java | 2 +- .../api/study/publish/PublishConfirmForm.java | 3 ++- .../api/study/publish/publishChooseStudy.jsp | 5 +++-- .../api/study/query/PublishResultsQueryView.java | 4 ++-- .../tests/experiment/ProvenanceAssayHelper.java | 2 +- issues/src/org/labkey/issue/IssuesController.java | 10 ++++++---- issues/src/org/labkey/issue/query/IssuesTable.java | 2 +- issues/src/org/labkey/issue/view/updateView.jsp | 4 ++-- .../src/org/labkey/test/tests/study/AssayTest.java | 2 +- .../test/tests/study/AutoLinkToStudyTest.java | 2 +- .../test/tests/study/LinkAssayToStudyTest.java | 2 +- 14 files changed, 36 insertions(+), 20 deletions(-) diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index 7b3156a0ef5..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); } diff --git a/api/src/org/labkey/api/data/TableViewForm.java b/api/src/org/labkey/api/data/TableViewForm.java index d1ddc86bb19..94992b8d419 100644 --- a/api/src/org/labkey/api/data/TableViewForm.java +++ b/api/src/org/labkey/api/data/TableViewForm.java @@ -480,7 +480,7 @@ else if (_validateRequired && null != _tinfo) Container container = fk.getLookupContainer() != null ? fk.getLookupContainer() : getContainer(); try { - Object remappedValue = cache.remap(SchemaKey.fromParts(fk.getLookupSchemaName()), fk.getLookupTableName(), getUser(), container, ContainerFilter.Type.CurrentPlusProjectAndShared, str); + Object remappedValue = cache.remap(fk.getLookupSchemaKey(), fk.getLookupTableName(), getUser(), container, ContainerFilter.Type.CurrentPlusProjectAndShared, str); if (remappedValue != null) { values.put(propName, remappedValue); 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/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/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/publishChooseStudy.jsp b/api/src/org/labkey/api/study/publish/publishChooseStudy.jsp index 026a8f9bbd2..e780f2fdb4b 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); 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/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java index 0d1517163ab..d2b0074ebac 100644 --- a/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java +++ b/experiment/test/src/org/labkey/test/tests/experiment/ProvenanceAssayHelper.java @@ -80,7 +80,7 @@ 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(AssayConstants.ASSAY_NAME_FIELD_LOCATOR, runName); diff --git a/issues/src/org/labkey/issue/IssuesController.java b/issues/src/org/labkey/issue/IssuesController.java index f2b9b65184a..36e32fbf244 100644 --- a/issues/src/org/labkey/issue/IssuesController.java +++ b/issues/src/org/labkey/issue/IssuesController.java @@ -721,7 +721,7 @@ public JSONArray getIssues() /** * Parse out the issues forms from the JSON data */ - public List getIssueForms() + public List getIssueForms(User user, Container container) { if (_issueForms == null) { @@ -732,6 +732,8 @@ public List getIssueForms() for (JSONObject rec : JsonUtil.toJSONObjectList(issues)) { IssuesForm form = new IssuesForm(); + form.setUser(user); + form.setContainer(container); Map stringMap = new CaseInsensitiveHashMap<>(); for (String prop : rec.keySet()) { @@ -780,7 +782,7 @@ abstract class AbstractIssueApiAction extends MutatingApiAction @Override public void validateForm(IssuesApiForm form, Errors errors) { - if (form.getIssueForms().isEmpty()) + if (form.getIssueForms(getUser(), getContainer()).isEmpty()) { errors.reject(SpringActionController.ERROR_MSG, "At least one issue record is required"); return; @@ -789,7 +791,7 @@ public void validateForm(IssuesApiForm form, Errors errors) // Fetch the default IssueListDef defaultIssueListDef = IssueManager.getDefaultIssueListDef(getContainer()); - for (IssuesForm issuesForm : form.getIssueForms()) + for (IssuesForm issuesForm : form.getIssueForms(getUser(), getContainer())) { Issue.action action = getAction(issuesForm); IssueListDef formIssueListDef = IssueServiceImpl.getIssueListDef(getContainer(), issuesForm.getBean()); @@ -824,7 +826,7 @@ public ApiResponse execute(IssuesApiForm form, BindException errors) throws Exce try (DbScope.Transaction transaction = IssuesSchema.getInstance().getSchema().getScope().ensureTransaction()) { - for (IssuesForm issuesForm : form.getIssueForms()) + for (IssuesForm issuesForm : form.getIssueForms(getUser(), getContainer())) { Issue.action action = getAction(issuesForm); 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 @@