diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index d0d3fa3ee..de8fadab1 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -319,7 +319,6 @@ import static org.labkey.api.util.DOM.TD; import static org.labkey.api.util.DOM.TR; import static org.labkey.api.util.DOM.UL; -import static org.labkey.api.util.DOM.X.FORM; import static org.labkey.api.util.DOM.at; import static org.labkey.api.util.DOM.cl; import static org.labkey.targetedms.TargetedMSModule.EXPERIMENT_FOLDER_WEB_PARTS; @@ -491,7 +490,7 @@ else if (FolderType.QC.toString().equals(folderSetupForm.getFolderType())) addDataPipelineTab(c); addRawFilesPipelineTab(c); - // Inform listeners so that any additinal folder configuration can be done. + // Inform listeners so that any additional folder configuration can be done. TargetedMSService.get().getTargetedMSFolderTypeListeners().forEach(listener -> listener.folderCreated(c, getUser())); return true; @@ -511,7 +510,6 @@ public URLHelper getSuccessURL(FolderSetupForm folderSetupForm) { return getContainer().getStartURL(getUser()); } - } public static void addDashboardTab(String tab, Container c, String... includeWebParts) @@ -530,9 +528,8 @@ public static void addDashboardTab(String tab, Container c, String... includeWeb } } - private static class ChromatogramCrawlerForm + public static class ChromatogramCrawlerForm { - } @RequiresPermission(ApplicationAdminPermission.class) @@ -547,8 +544,8 @@ public void validateCommand(ChromatogramCrawlerForm target, Errors errors) public ModelAndView getView(ChromatogramCrawlerForm form, boolean reshow, BindException errors) { return new HtmlView("Chromatogram Crawler", DIV("Crawl all containers under the parent " + getContainer().getPath(), - FORM(at(method, "POST"), - new Button.ButtonBuilder("Start Crawl").submit(true).build()))); + DOM.LK.FORM(at(method, "POST"), + new Button.ButtonBuilder("Start Crawl").submit(true).build()))); } @Override @@ -4327,8 +4324,6 @@ public void addNavTrail(NavTree root, TargetedMSRun run) @RequiresPermission(ReadPermission.class) public abstract class ShowRunSplitDetailsAction extends AbstractShowRunDetailsAction { - protected String _dataRegion; - public ShowRunSplitDetailsAction() { super(RunDetailsForm.class); @@ -4346,7 +4341,6 @@ public ModelAndView getHtmlView(final RunDetailsForm form, BindException errors) if(_run.getPeptideCount() > 0) { view = createInitializedQueryView(form, errors, false, getDataRegionNamePeptide()); - _dataRegion = view.getDataRegionName(); vBox.addView(view); } @@ -4354,7 +4348,6 @@ public ModelAndView getHtmlView(final RunDetailsForm form, BindException errors) if(_run.getSmallMoleculeCount() > 0) { view = createInitializedQueryView(form, errors, false, getDataRegionNameSmallMolecule()); - _dataRegion = view.getDataRegionName(); vBox.addView(view); } diff --git a/src/org/labkey/targetedms/TargetedMSModule.java b/src/org/labkey/targetedms/TargetedMSModule.java index 0b8049356..c48db59fa 100644 --- a/src/org/labkey/targetedms/TargetedMSModule.java +++ b/src/org/labkey/targetedms/TargetedMSModule.java @@ -57,7 +57,6 @@ import org.labkey.api.view.NavTree; import org.labkey.api.view.Portal; import org.labkey.api.view.ViewContext; -import org.labkey.api.view.WebPartConfigurationException; import org.labkey.api.view.WebPartFactory; import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.ClientDependency; diff --git a/src/org/labkey/targetedms/view/ChromatogramsDataRegion.java b/src/org/labkey/targetedms/view/ChromatogramsDataRegion.java index 3d1e71224..09d107b3e 100644 --- a/src/org/labkey/targetedms/view/ChromatogramsDataRegion.java +++ b/src/org/labkey/targetedms/view/ChromatogramsDataRegion.java @@ -15,6 +15,8 @@ package org.labkey.targetedms.view; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; import org.json.JSONArray; import org.json.JSONObject; import org.labkey.api.collections.ResultSetRowMapFactory; @@ -25,18 +27,20 @@ import org.labkey.api.data.MenuButton; import org.labkey.api.data.RenderContext; import org.labkey.api.data.Results; +import org.labkey.api.data.RuntimeSQLException; import org.labkey.api.data.UpdateColumn; import org.labkey.api.query.FilteredTable; +import org.labkey.api.util.DOM; +import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.URLHelper; +import org.labkey.api.view.HttpView; import org.labkey.api.view.NavTree; import org.labkey.api.view.ViewContext; -import org.labkey.api.view.template.PageConfig; +import org.labkey.api.writer.HtmlWriter; import org.labkey.targetedms.query.ChromatogramGridQuerySettings; -import java.io.IOException; -import java.io.Writer; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -45,6 +49,12 @@ import java.util.LinkedList; import java.util.List; +import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.TD; +import static org.labkey.api.util.DOM.TR; +import static org.labkey.api.util.DOM.at; +import static org.labkey.api.util.DOM.cl; + /** * User: vsharma * Date: 4/28/12 @@ -114,46 +124,46 @@ private MenuButton createSplitGraphButton() } @Override - protected void renderTable(RenderContext ctx, Writer out) throws SQLException, IOException + protected void renderTable(RenderContext ctx, HtmlWriter out) throws SQLException { super.renderTable(ctx, out); - out.write("\n\n"); + out.write(JavaScriptFragment.unsafe(script.toString())); + out.writeElementEnd(DOM.Element.script); } @Override - protected void renderGridHeaderColumns(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers) + protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) { // No need to render the headers for this specialized grid - they just take space } @Override - protected int renderTableContents(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers) throws SQLException, IOException + protected int renderTableContents(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) throws SQLException { - int rowIndex = 0; + MutableInt rowIndex = new MutableInt(0); int maxRowSize = getSettings().getMaxRowSize(); - int count = 0; Results results = ctx.getResults(); @@ -162,43 +172,57 @@ protected int renderTableContents(RenderContext ctx, Writer out, boolean showRec { assert rs != null; ResultSetRowMapFactory factory = ResultSetRowMapFactory.create(rs); + MutableBoolean hasRows = new MutableBoolean(rs.next()); - while (rs.next()) + // Render chromatograms in a grid with maximum width == maxRowSize + while (hasRows.getValue().booleanValue()) { - if (count == 0) - { - out.write(""); - } - ctx.setRow(factory.getRowMap(rs)); - renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex++); - count++; - if (count == maxRowSize) - { - out.write("\n"); - count = 0; - } + MutableInt count = new MutableInt(0); + MutableBoolean firstRow = new MutableBoolean(true); + + TR( + cl(getRowClass(ctx, rowIndex.intValue())), + (DOM.Renderable) ret -> { + do + { + if (hasRows.getValue().booleanValue()) + { + try + { + ctx.setRow(factory.getRowMap(rs)); + renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex.getAndIncrement()); + hasRows.setValue(rs.next()); + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + } + else + { + // We're out of ResultSet rows, so finish the row by adding empty TDs, one per renderer, + // just like renderTableRows() does. But no need to do this if it's just a single row. + if (!firstRow.booleanValue()) + { + for (int i = 0; i < renderers.size(); i++) + TD(at(style, "border:0;")).appendTo(out); + } + } + } while (count.incrementAndGet() < maxRowSize); + + return ret; + } + ).appendTo(out); + + firstRow.setValue(false); } } - if (count != 0) - { - while(count < maxRowSize) - { - out.write(""); - count++; - } - out.write("\n"); - } - - return rowIndex; + return rowIndex.intValue(); } @Override - protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException + protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) { DisplayColumn detailsColumn = getDetailsUpdateColumn(ctx, renderers, true); DisplayColumn updateColumn = getDetailsUpdateColumn(ctx, renderers, false); @@ -207,6 +231,7 @@ protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordS renderActionColumn(ctx, out, rowIndex, showRecordSelectors, detailsColumn, updateColumn); for (DisplayColumn renderer : renderers) + { if (renderer.isVisible(ctx)) { if (renderer instanceof DetailsColumn || renderer instanceof UpdateColumn) @@ -214,7 +239,7 @@ protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordS renderer.renderGridDataCell(ctx, out); } - + } } @Override diff --git a/src/org/labkey/targetedms/view/passport/ProteinListView.java b/src/org/labkey/targetedms/view/passport/ProteinListView.java index 60143bca5..eea6dca8d 100644 --- a/src/org/labkey/targetedms/view/passport/ProteinListView.java +++ b/src/org/labkey/targetedms/view/passport/ProteinListView.java @@ -16,9 +16,6 @@ import org.labkey.targetedms.passport.PassportController; import org.springframework.validation.Errors; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - public class ProteinListView extends QueryView { public ProteinListView(UserSchema schema, QuerySettings settings, @Nullable Errors errors) @@ -26,12 +23,6 @@ public ProteinListView(UserSchema schema, QuerySettings settings, @Nullable Erro super(schema, settings, errors); } - @Override - protected void renderView(Object model, HttpServletRequest request, HttpServletResponse response) throws Exception - { - super.renderView(model, request, response); - } - @Override protected void populateButtonBar(DataView view, ButtonBar bar) { diff --git a/test/src/org/labkey/test/tests/targetedms/TargetedMSExperimentTest.java b/test/src/org/labkey/test/tests/targetedms/TargetedMSExperimentTest.java index 9c5bb3c6f..feebe62ce 100644 --- a/test/src/org/labkey/test/tests/targetedms/TargetedMSExperimentTest.java +++ b/test/src/org/labkey/test/tests/targetedms/TargetedMSExperimentTest.java @@ -294,15 +294,15 @@ protected void verifyPeptide() //Verify the spectrum shows up correctly. //Verify we get the expected number of chromatogram graphs. - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'PeptidePrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PeptidePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram silac_1_to_4')]"), 3); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'PeptidePrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PeptidePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram silac_1_to_4')]"), 3); //Click on a precursor icon link. clickAndWait(Locator.linkWithHref("precursorAllChromatogramsChart.view")); //Verify expected values in detail view. Verify chromatogram. assertTextPresentInThisOrder("Precursor Chromatograms: LTSLNVVAGSDLR", "YAL038W", "672.8777"); - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram silac_1_to_4')]"), 1); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram silac_1_to_4')]"), 1); goBack(); clickAndWait(Locator.linkContainingText("YAL038W")); @@ -367,11 +367,11 @@ protected void verifyMolecule() assertTextPresent("Molecule Precursors"); // Check the chromatogram plots - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 2); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 2); ensureComparisonPlots("PC aa C26:0"); //Click on Molecule Precursor Chromatogram link @@ -385,11 +385,11 @@ protected void verifyMolecule() assertElementPresent(Locator.xpath("//tr[td[text()='m/z']][td[normalize-space()='650.4755']]")); // Check the chromatogram plots - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 1); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 1); ensureComparisonPlots("PC aa C26:0"); //Go back to Document Summary page @@ -409,11 +409,11 @@ protected void verifyMolecule() clickAndWait(Locator.linkContainingText("lysoPC a C14:0").index(0)); assertTextPresent("Small Molecule Summary"); // Check the chromatogram plots - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 2); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 2); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 2); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'MoleculePrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 2); ensureComparisonPlots("lysoPC a C14:0"); assertElementPresent(Locator.xpath("//a[contains(@href, 'moleculePrecursorAllChromatogramsChart.view')]")); @@ -422,11 +422,11 @@ protected void verifyMolecule() clickAndWait(Locator.linkContainingText("lysoPC a C14:0").index(1)); assertTextPresent("Molecule Precursor Chromatograms"); // Check the chromatogram plots - assertElementPresent(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]")); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 1); - waitForElements(Locator.xpath("//table[contains(@lk-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 1); + assertElementPresent(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]")); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_02_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13417_03_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_02_WAA283_3805_071514')]"), 1); + waitForElements(Locator.xpath("//table[contains(@data-region-name, 'PrecursorChromatograms')]//div[contains(@alt, 'Chromatogram 13418_03_WAA283_3805_071514')]"), 1); ensureComparisonPlots("lysoPC a C14:0"); //Go to Small Molecule Transition List