From 6425d4f483844fad69c426e2bcb130daadcf505b Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 5 Mar 2025 10:25:48 -0800 Subject: [PATCH 1/8] Introduce HtmlWriter. Start using it in DataRegion. --- .../executescript/SamplesConfirmGridView.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 356357c2a..1b71660d9 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -46,7 +46,9 @@ import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.SimpleNamedObject; import org.labkey.api.util.StringExpression; +import org.labkey.api.util.element.Input; import org.labkey.api.view.GridView; +import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.analysis.model.ISampleInfo; import org.labkey.flow.analysis.model.Workspace; import org.labkey.flow.data.FlowFCSFile; @@ -329,12 +331,15 @@ protected boolean isRecordSelectorChecked(RenderContext ctx, String checkboxValu } @Override - protected void renderExtraRecordSelectorContent(RenderContext ctx, Writer out) throws IOException + protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter out) throws IOException { - // Add a hidden input for spring form binding -- if this value is posed, the row was unchecked. - out.write(""); + // Add a hidden input for spring form binding -- if this value is posted, the row was unchecked. + out.write( + new Input.InputBuilder() + .type("hidden") + .name(SpringActionController.FIELD_MARKER + getRecordSelectorName(ctx)) + .value("0") + ); } @Override From f60362100cfc17c911da4bd0e0feed13f02e8b65 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 6 Mar 2025 14:00:09 -0800 Subject: [PATCH 2/8] DataRegion refactor --- .../executescript/ChooseRunsRegion.java | 39 ++++++++++--------- .../executescript/SamplesConfirmGridView.java | 4 +- .../org/labkey/flow/view/GraphDataRegion.java | 21 +++++----- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 843766d10..2528d55c6 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -21,7 +21,9 @@ import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; import org.labkey.api.data.UpdateColumn; +import org.labkey.api.util.HtmlString; import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.analysis.model.CompensationMatrix; import org.labkey.flow.data.FlowCompensationControl; import org.labkey.flow.data.FlowExperiment; @@ -32,7 +34,6 @@ import java.io.File; import java.io.IOException; import java.io.Writer; -import java.sql.SQLException; import java.util.List; public class ChooseRunsRegion extends DataRegion @@ -46,15 +47,15 @@ public ChooseRunsRegion(ChooseRunsToAnalyzeForm form) @Override - protected void renderFormBegin(RenderContext ctx, Writer out, int mode) throws IOException + protected void renderFormBegin(RenderContext ctx, Writer oldWriter, int mode) { - renderHiddenFormFields(ctx, out, mode); + renderHiddenFormFields(ctx, HtmlWriter.of(oldWriter), mode); } @Override - protected String getNoRowsMessage() + protected HtmlString getNoRowsMessage() { - return "No runs available. Please import some FCS files or import a FlowJo workspace associated with FCS files."; + return HtmlString.of("No runs available. Please import some FCS files or import a FlowJo workspace associated with FCS files."); } @Override @@ -66,16 +67,18 @@ protected boolean isRecordSelectorEnabled(RenderContext ctx) // Allows subclasses to do pre-row and post-row processing // CONSIDER: Separate as renderTableRow and renderTableRowContents? @Override - protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException + protected void renderTableRow(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException { - out.write(""); + oldWriter.write(">"); DisplayColumn detailsColumn = getDetailsUpdateColumn(ctx, renderers, true); DisplayColumn updateColumn = getDetailsUpdateColumn(ctx, renderers, false); @@ -99,20 +102,20 @@ protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordS if (renderer.getColumnInfo() != null && "name".equalsIgnoreCase(renderer.getColumnInfo().getName())) nameColumn = i+1; visibleCount++; - renderer.renderGridDataCell(ctx, out); + renderer.renderGridDataCell(ctx, oldWriter); } } - out.write("\n"); + oldWriter.write("\n"); if (disabledReason != null) { - out.write(""); - out.write(" "); - out.write(""); - out.write(PageFlowUtil.filter(disabledReason)); - out.write(""); - out.write(""); + oldWriter.write(""); + oldWriter.write(" "); + oldWriter.write(""); + oldWriter.write(PageFlowUtil.filter(disabledReason)); + oldWriter.write(""); + oldWriter.write(""); } } diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 1b71660d9..d884077d8 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -297,9 +297,9 @@ public Map prepareMessages(RenderContext ctx) throws IOException } @Override - protected void renderFormBegin(RenderContext ctx, Writer out, int mode) throws IOException + protected void renderFormBegin(RenderContext ctx, Writer oldWriter, int mode) { - renderHiddenFormFields(ctx, out, mode); + renderHiddenFormFields(ctx, HtmlWriter.of(oldWriter), mode); } @Override diff --git a/flow/src/org/labkey/flow/view/GraphDataRegion.java b/flow/src/org/labkey/flow/view/GraphDataRegion.java index 856e7be87..8ecb0115a 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -31,9 +31,6 @@ /** * Render row of values and row of graphs for every row in the grid. * Replaces GraphView. - * - * User: kevink - * Date: 7/20/11 */ public class GraphDataRegion extends DataRegion { @@ -72,24 +69,24 @@ public void addQueryColumns(Set columns) } @Override - protected void renderTableRow(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException, IOException + protected void renderTableRow(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException, IOException { - super.renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex); + super.renderTableRow(ctx, oldWriter, showRecordSelectors, renderers, rowIndex); - out.write(""); + oldWriter.write(" class=\"" + rowClass + "\""); + oldWriter.write(">"); // skip one cell for the [details] column - out.write(" "); - out.write(""); + oldWriter.write(" "); + oldWriter.write(""); for (GraphColumn graphColumn : _graphColumns) { if (graphColumn.isVisible(ctx)) - graphColumn.renderGraph(ctx, out); + graphColumn.renderGraph(ctx, oldWriter); } - out.write("\n"); + oldWriter.write("\n"); } } From ffc3ecd165b4935efb0e55427c5398198d5084ac Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 6 Mar 2025 18:26:57 -0800 Subject: [PATCH 3/8] More DataRegion methods --- .../executescript/ChooseRunsRegion.java | 10 ++--- .../executescript/SamplesConfirmGridView.java | 10 ++--- .../src/org/labkey/flow/view/GraphColumn.java | 6 +++ .../org/labkey/flow/view/GraphDataRegion.java | 9 ++-- .../labkey/ms2/compare/CompareDataRegion.java | 42 +++++++++---------- 5 files changed, 43 insertions(+), 34 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 2528d55c6..2674ca9af 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -47,9 +47,9 @@ public ChooseRunsRegion(ChooseRunsToAnalyzeForm form) @Override - protected void renderFormBegin(RenderContext ctx, Writer oldWriter, int mode) + protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int mode) { - renderHiddenFormFields(ctx, HtmlWriter.of(oldWriter), mode); + renderHiddenFormFields(ctx, out, mode); } @Override @@ -67,9 +67,9 @@ protected boolean isRecordSelectorEnabled(RenderContext ctx) // Allows subclasses to do pre-row and post-row processing // CONSIDER: Separate as renderTableRow and renderTableRowContents? @Override - protected void renderTableRow(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException + protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException { - HtmlWriter out = HtmlWriter.of(oldWriter); + Writer oldWriter = out.unwrap(); oldWriter.write(" prepareMessages(RenderContext ctx) throws IOException } @Override - protected void renderFormBegin(RenderContext ctx, Writer oldWriter, int mode) + protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int mode) { - renderHiddenFormFields(ctx, HtmlWriter.of(oldWriter), mode); + renderHiddenFormFields(ctx, out, mode); } @Override - protected void renderFormEnd(RenderContext ctx, Writer out) + protected void renderFormEnd(RenderContext ctx, HtmlWriter out) { // No-op. Don't close the form. } @@ -331,7 +331,7 @@ protected boolean isRecordSelectorChecked(RenderContext ctx, String checkboxValu } @Override - protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter out) throws IOException + protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter out) { // Add a hidden input for spring form binding -- if this value is posted, the row was unchecked. out.write( diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index a875980ee..1e56fddb9 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -32,6 +32,7 @@ import org.labkey.api.view.ActionURL; import org.labkey.api.view.HttpView; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.FlowPreference; import org.labkey.flow.controllers.FlowParam; import org.labkey.flow.controllers.well.WellController; @@ -129,6 +130,11 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep renderGraph(ctx, out); } + public void renderGraph(RenderContext ctx, HtmlWriter out) throws IOException + { + renderGraph(ctx, out.unwrap()); + } + public void renderGraph(RenderContext ctx, Writer out) throws IOException { if (!ctx.containsKey(INCLUDE_UTIL_SCRIPT)) diff --git a/flow/src/org/labkey/flow/view/GraphDataRegion.java b/flow/src/org/labkey/flow/view/GraphDataRegion.java index 8ecb0115a..2179a43bc 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -20,6 +20,7 @@ import org.labkey.api.data.DataRegion; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; +import org.labkey.api.writer.HtmlWriter; import java.io.IOException; import java.io.Writer; @@ -69,9 +70,11 @@ public void addQueryColumns(Set columns) } @Override - protected void renderTableRow(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException, IOException + protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException, IOException { - super.renderTableRow(ctx, oldWriter, showRecordSelectors, renderers, rowIndex); + super.renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex); + + Writer oldWriter = out.unwrap(); oldWriter.write("\n"); } diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index 5068da5b1..c78b83b4d 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -17,15 +17,15 @@ package org.labkey.ms2.compare; import org.labkey.api.data.DataRegion; -import org.labkey.api.data.RenderContext; import org.labkey.api.data.DisplayColumn; +import org.labkey.api.data.RenderContext; import org.labkey.ms2.MS2Manager; -import java.util.List; -import java.io.Writer; import java.io.IOException; -import java.sql.SQLException; +import java.io.Writer; import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; public class CompareDataRegion extends DataRegion { @@ -69,14 +69,14 @@ public void setOffset(int offset) } @Override - protected void renderGridHeaderColumns(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers) + protected void renderGridHeaderColumns(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers) throws IOException, SQLException { // Add an extra row and render the multi-column captions - out.write(""); + oldWriter.write(""); if (showRecordSelectors) - out.write(""); + oldWriter.write(""); boolean shade = false; int columnIndex = 0; @@ -91,20 +91,20 @@ protected void renderGridHeaderColumns(RenderContext ctx, Writer out, boolean sh } if (_offset > 0) { - out.write(""); - out.write(_columnHeader); - out.write(""); + oldWriter.write(""); + oldWriter.write(_columnHeader); + oldWriter.write(""); } for (String caption : _multiColumnCaptions) { - out.write("" + caption + ""); + oldWriter.write(">" + caption + ""); shade = !shade; } if (_colSpan * _multiColumnCaptions.size() + _offset < renderers.size()) { - out.write(" "); + oldWriter.write(" "); } - out.write("\n"); + oldWriter.write("\n"); - super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers); + super.renderGridHeaderColumns(ctx, oldWriter, showRecordSelectors, renderers); } @Override From c072f1bc2d79b7f3b1409f767fe0bf8e2ca1ba10 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Fri, 7 Mar 2025 11:45:49 -0800 Subject: [PATCH 4/8] Eliminate Writer parameter from all DataRegion methods. Remove some IOExceptions. --- .../controllers/executescript/SamplesConfirmGridView.java | 2 +- ms2/src/org/labkey/ms2/compare/CompareDataRegion.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 09ba028ad..2dd9e9412 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -279,7 +279,7 @@ private static class SamplesConfirmDataRegion extends DataRegion protected int matchedCount = 0; @Override - public Map prepareMessages(RenderContext ctx) throws IOException + public Map prepareMessages(RenderContext ctx) { Map messages = super.prepareMessages(ctx); diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index c78b83b4d..fa8e535ae 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -19,6 +19,7 @@ import org.labkey.api.data.DataRegion; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; +import org.labkey.api.writer.HtmlWriter; import org.labkey.ms2.MS2Manager; import java.io.IOException; @@ -69,9 +70,11 @@ public void setOffset(int offset) } @Override - protected void renderGridHeaderColumns(RenderContext ctx, Writer oldWriter, boolean showRecordSelectors, List renderers) + protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) throws IOException, SQLException { + Writer oldWriter = out.unwrap(); + // Add an extra row and render the multi-column captions oldWriter.write(""); @@ -126,7 +129,7 @@ protected void renderGridHeaderColumns(RenderContext ctx, Writer oldWriter, bool } oldWriter.write("\n"); - super.renderGridHeaderColumns(ctx, oldWriter, showRecordSelectors, renderers); + super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers); } @Override From 6c8c3760e0f5d9e7e560204e78e8d2f41a935c15 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Sun, 9 Mar 2025 12:34:31 -0700 Subject: [PATCH 5/8] Refactor most DataRegion subclasses --- .../executescript/ChooseRunsRegion.java | 87 ++++++----- .../src/org/labkey/flow/view/GraphColumn.java | 30 ++-- .../org/labkey/flow/view/GraphDataRegion.java | 37 ++--- .../labkey/ms2/compare/CompareDataRegion.java | 144 +++++++++++------- 4 files changed, 171 insertions(+), 127 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 2674ca9af..20acf2c84 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -16,13 +16,14 @@ package org.labkey.flow.controllers.executescript; +import org.apache.commons.lang3.mutable.MutableInt; import org.labkey.api.data.DataRegion; import org.labkey.api.data.DetailsColumn; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; import org.labkey.api.data.UpdateColumn; +import org.labkey.api.util.DOM.Renderable; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.PageFlowUtil; import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.analysis.model.CompensationMatrix; import org.labkey.flow.data.FlowCompensationControl; @@ -33,9 +34,16 @@ import java.io.File; import java.io.IOException; -import java.io.Writer; import java.util.List; +import static org.labkey.api.util.DOM.Attribute.colspan; +import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.Attribute.title; +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; + public class ChooseRunsRegion extends DataRegion { ChooseRunsToAnalyzeForm _form; @@ -69,53 +77,52 @@ protected boolean isRecordSelectorEnabled(RenderContext ctx) @Override protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException { - Writer oldWriter = out.unwrap(); - - oldWriter.write(""); - DisplayColumn detailsColumn = getDetailsUpdateColumn(ctx, renderers, true); DisplayColumn updateColumn = getDetailsUpdateColumn(ctx, renderers, false); + MutableInt visibleCount = new MutableInt(0); + MutableInt nameColumn = new MutableInt(0); - int visibleCount = 0; - if (showRecordSelectors || (detailsColumn != null || updateColumn != null)) - { - visibleCount++; - renderActionColumn(ctx, out, rowIndex, showRecordSelectors, detailsColumn, updateColumn); - } - - int nameColumn = 0; - for (int i = 0, renderersSize = renderers.size(); i < renderersSize; i++) - { - DisplayColumn renderer = renderers.get(i); - if (renderer.isVisible(ctx)) - { - if (renderer instanceof DetailsColumn || renderer instanceof UpdateColumn) - continue; + TR( + disabledReason != null ? cl("disabledRow").at(title, disabledReason) : null, + (Renderable) ret -> { + if (showRecordSelectors || (detailsColumn != null || updateColumn != null)) + { + visibleCount.increment(); + renderActionColumn(ctx, out, rowIndex, showRecordSelectors, detailsColumn, updateColumn); + } - if (renderer.getColumnInfo() != null && "name".equalsIgnoreCase(renderer.getColumnInfo().getName())) - nameColumn = i+1; - visibleCount++; - renderer.renderGridDataCell(ctx, out); + for (int i = 0, renderersSize = renderers.size(); i < renderersSize; i++) + { + DisplayColumn renderer = renderers.get(i); + if (renderer.isVisible(ctx)) + { + if (renderer instanceof DetailsColumn || renderer instanceof UpdateColumn) + continue; + + if (renderer.getColumnInfo() != null && "name".equalsIgnoreCase(renderer.getColumnInfo().getName())) + nameColumn.setValue(i + 1); + visibleCount.increment(); + renderer.renderGridDataCell(ctx, out); + } + } + return ret; } - } - - oldWriter.write("\n"); + ).appendTo(out); if (disabledReason != null) { - oldWriter.write(""); - oldWriter.write(" "); - oldWriter.write(""); - oldWriter.write(PageFlowUtil.filter(disabledReason)); - oldWriter.write(""); - oldWriter.write(""); + TR( + cl("disabledRow"), + TD( + at(style,"border-right:0;", colspan, nameColumn.getValue()), + HtmlString.NBSP + ), + TD( + at(style, "font-size:smaller;", colspan, visibleCount.getValue()), + disabledReason + ) + ).appendTo(out); } } diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index 1e56fddb9..7a74d471d 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -27,6 +27,8 @@ import org.labkey.api.query.QuerySettings; import org.labkey.api.settings.AppProps; import org.labkey.api.util.DOM.Renderable; +import org.labkey.api.util.HtmlString; +import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.view.ActionURL; @@ -38,7 +40,6 @@ import org.labkey.flow.controllers.well.WellController; import org.labkey.flow.query.FlowQuerySettings; -import java.io.IOException; import java.io.Writer; import static org.labkey.api.util.DOM.Attribute.alt; @@ -50,6 +51,7 @@ import static org.labkey.api.util.DOM.BR; import static org.labkey.api.util.DOM.IMG; import static org.labkey.api.util.DOM.SPAN; +import static org.labkey.api.util.DOM.WBR; import static org.labkey.api.util.DOM.at; import static org.labkey.api.util.DOM.cl; @@ -74,7 +76,6 @@ public GraphColumn(ColumnInfo colinfo) static public Pair parseObjectIdGraph(@NotNull String objectIdGraph) { Integer objectId = null; - String graphSpec = null; String[] parts = objectIdGraph.split(SEP, 2); if (parts.length != 2) @@ -92,7 +93,7 @@ static public Pair parseObjectIdGraph(@NotNull String objectIdG } } - graphSpec = parts[1]; + String graphSpec = parts[1]; if (graphSpec.isEmpty()) { throw new IllegalArgumentException("error parsing graph spec: expected second part to be non-empty string: " + objectIdGraph); @@ -125,29 +126,24 @@ protected FlowQuerySettings.ShowGraphs showGraphs(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer out) { - renderGraph(ctx, out); + renderGraph(ctx, HtmlWriter.of(out)); } - public void renderGraph(RenderContext ctx, HtmlWriter out) throws IOException - { - renderGraph(ctx, out.unwrap()); - } - - public void renderGraph(RenderContext ctx, Writer out) throws IOException + public void renderGraph(RenderContext ctx, HtmlWriter out) { if (!ctx.containsKey(INCLUDE_UTIL_SCRIPT)) { - out.write(String.format("", AppProps.getInstance().getContextPath(), PageConfig.getScriptNonceHeader(ctx.getRequest()))); + out.write(JavaScriptFragment.unsafe(String.format("", AppProps.getInstance().getContextPath(), PageConfig.getScriptNonceHeader(ctx.getRequest())))); ctx.put(INCLUDE_UTIL_SCRIPT, true); } Object boundValue = getColumnInfo().getValue(ctx); if ((!(boundValue instanceof String))) { - LOG.debug("error parsing graph spec: expected pair of values, but got '" + boundValue + "'"); - out.write(" "); + LOG.debug("error parsing graph spec: expected pair of values, but got '{}'", boundValue); + out.write(HtmlString.NBSP); return; } @@ -163,7 +159,7 @@ public void renderGraph(RenderContext ctx, Writer out) throws IOException catch (IllegalArgumentException ex) { LOG.debug(ex.getMessage()); - out.write(" "); + out.write(HtmlString.NBSP); return; } @@ -182,13 +178,13 @@ public void renderGraph(RenderContext ctx, Writer out) throws IOException ) ).appendTo(out); ensureErrorHandler(); - out.write(""); + WBR().appendTo(out); } else if (showGraphs(ctx) == FlowQuerySettings.ShowGraphs.Thumbnail) { if (objectId == null) { - out.write(" "); + out.write(HtmlString.NBSP); } else { diff --git a/flow/src/org/labkey/flow/view/GraphDataRegion.java b/flow/src/org/labkey/flow/view/GraphDataRegion.java index 2179a43bc..c4e2874d4 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -20,15 +20,22 @@ import org.labkey.api.data.DataRegion; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; +import org.labkey.api.util.DOM.Renderable; +import org.labkey.api.util.HtmlString; import org.labkey.api.writer.HtmlWriter; import java.io.IOException; -import java.io.Writer; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static org.labkey.api.util.DOM.Attribute.colspan; +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; + /** * Render row of values and row of graphs for every row in the grid. * Replaces GraphView. @@ -74,22 +81,18 @@ protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRec { super.renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex); - Writer oldWriter = out.unwrap(); - - oldWriter.write(""); - // skip one cell for the [details] column - oldWriter.write(" "); - oldWriter.write(""); + TR( + cl(getRowClass(ctx, rowIndex)), - for (GraphColumn graphColumn : _graphColumns) - { - if (graphColumn.isVisible(ctx)) - graphColumn.renderGraph(ctx, out); - } - oldWriter.write("\n"); + // skip one cell for the [details] column + TD(HtmlString.NBSP), + TD(at(colspan, renderers.size())), + (Renderable) ret -> { + _graphColumns.stream() + .filter(gc -> gc.isVisible(ctx)) + .forEach(gc -> gc.renderGraph(ctx, out)); + return ret; + } + ).appendTo(out); } } diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index fa8e535ae..38f7bd685 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -16,18 +16,28 @@ package org.labkey.ms2.compare; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; import org.labkey.api.data.DataRegion; import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.RenderContext; +import org.labkey.api.util.DOM.Renderable; +import org.labkey.api.util.HtmlString; import org.labkey.api.writer.HtmlWriter; import org.labkey.ms2.MS2Manager; import java.io.IOException; -import java.io.Writer; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import static org.labkey.api.util.DOM.Attribute.align; +import static org.labkey.api.util.DOM.Attribute.colspan; +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; + public class CompareDataRegion extends DataRegion { List _multiColumnCaptions; @@ -73,61 +83,89 @@ public void setOffset(int offset) protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) throws IOException, SQLException { - Writer oldWriter = out.unwrap(); - // Add an extra row and render the multi-column captions - oldWriter.write(""); - - if (showRecordSelectors) - oldWriter.write(""); - - boolean shade = false; - int columnIndex = 0; - for (int i = 0; i < _offset; i++) - { - if (shade) - { - renderers.get(columnIndex).addDisplayClass("labkey-alternate-row"); - } - shade = !shade; - columnIndex++; - } - if (_offset > 0) - { - oldWriter.write(""); - oldWriter.write(_columnHeader); - oldWriter.write(""); - } - - for (String caption : _multiColumnCaptions) - { - oldWriter.write(" 0 ? TD(at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), _columnHeader) : null, + (Renderable) ret -> { + final MutableBoolean shade = new MutableBoolean(false); + final MutableInt columnIndex = new MutableInt(0); + for (int i = 0; i < _offset; i++) + { + if (shade.booleanValue()) + { + renderers.get(columnIndex.getValue()).addDisplayClass("labkey-alternate-row"); + } + shade.setValue(!shade.getValue()); + columnIndex.increment(); + } + + for (String caption : _multiColumnCaptions) { - renderers.get(columnIndex++).addDisplayClass("labkey-alternate-row"); + TD( + at(align, "center", colspan, _colSpan).cl(shade.isTrue(), "labkey-alternate-row"), + (Renderable) rend -> { + if (shade.isTrue()) + { + for (int i = 0; i < _colSpan; i++) + { + renderers.get(columnIndex.getAndIncrement()).addDisplayClass("labkey-alternate-row"); + } + } + else + { + columnIndex.add(_colSpan); + } + return rend; + }, + caption + ).appendTo(out); +// oldWriter.write("" + caption + ""); + shade.setValue(!shade.getValue()); } - } - else - { - columnIndex += _colSpan; - } - - oldWriter.write(">" + caption + ""); - shade = !shade; - } - if (_colSpan * _multiColumnCaptions.size() + _offset < renderers.size()) - { - oldWriter.write(" "); - } - oldWriter.write("\n"); + + return ret; + }, + _colSpan * _multiColumnCaptions.size() + _offset < renderers.size() ? TD(at(colspan, renderers.size() - _colSpan * _multiColumnCaptions.size() + _offset), HtmlString.NBSP) : null + ).appendTo(out); + +// oldWriter.write(""); + +// if (showRecordSelectors) +// oldWriter.write(""); +// +// if (_offset > 0) +// { +// oldWriter.write(""); +// oldWriter.write(_columnHeader); +// oldWriter.write(""); +// } + +// +// if (_colSpan * _multiColumnCaptions.size() + _offset < renderers.size()) +// { +// oldWriter.write(" "); +// } +// oldWriter.write("\n"); super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers); } From 1f80e0a45f1aae29162315f7a6b90bc0d3710a8f Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 10 Mar 2025 14:29:13 -0700 Subject: [PATCH 6/8] Add missing TD --- .../executescript/ChooseRunsRegion.java | 4 +- .../executescript/SamplesConfirmGridView.java | 2 +- .../labkey/ms2/compare/CompareDataRegion.java | 48 ++++--------------- 3 files changed, 12 insertions(+), 42 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 20acf2c84..6e207b427 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -63,7 +63,7 @@ protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int mode) @Override protected HtmlString getNoRowsMessage() { - return HtmlString.of("No runs available. Please import some FCS files or import a FlowJo workspace associated with FCS files."); + return HtmlString.of("No runs available. Please import some FCS files or import a FlowJo workspace associated with FCS files."); } @Override @@ -115,7 +115,7 @@ protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRec TR( cl("disabledRow"), TD( - at(style,"border-right:0;", colspan, nameColumn.getValue()), + at(style, "border-right:0;", colspan, nameColumn.getValue()), HtmlString.NBSP ), TD( diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 2dd9e9412..075a54bac 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -338,7 +338,7 @@ protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter ou new Input.InputBuilder() .type("hidden") .name(SpringActionController.FIELD_MARKER + getRecordSelectorName(ctx)) - .value("0") + .value(0) ); } diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index 38f7bd685..c5c71f039 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -100,6 +100,14 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea columnIndex.increment(); } + if (_offset > 0) + { + TD( + at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), + _columnHeader + ).appendTo(out); + } + for (String caption : _multiColumnCaptions) { TD( @@ -120,21 +128,7 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea }, caption ).appendTo(out); -// oldWriter.write("" + caption + ""); + shade.setValue(!shade.getValue()); } @@ -143,30 +137,6 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea _colSpan * _multiColumnCaptions.size() + _offset < renderers.size() ? TD(at(colspan, renderers.size() - _colSpan * _multiColumnCaptions.size() + _offset), HtmlString.NBSP) : null ).appendTo(out); -// oldWriter.write(""); - -// if (showRecordSelectors) -// oldWriter.write(""); -// -// if (_offset > 0) -// { -// oldWriter.write(""); -// oldWriter.write(_columnHeader); -// oldWriter.write(""); -// } - -// -// if (_colSpan * _multiColumnCaptions.size() + _offset < renderers.size()) -// { -// oldWriter.write(" "); -// } -// oldWriter.write("\n"); - super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers); } From 3a78c3a1b611eea3a0fcb554b300f055f27b17c1 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 10 Mar 2025 15:48:23 -0700 Subject: [PATCH 7/8] IOExceptions be gone! --- .../flow/controllers/executescript/ChooseRunsRegion.java | 2 +- flow/src/org/labkey/flow/view/GraphDataRegion.java | 2 +- ms2/src/org/labkey/ms2/compare/CompareDataRegion.java | 2 +- nab/src/org/labkey/nab/GetNabRunsAction.java | 4 ---- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 6e207b427..370919f22 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -75,7 +75,7 @@ protected boolean isRecordSelectorEnabled(RenderContext ctx) // Allows subclasses to do pre-row and post-row processing // CONSIDER: Separate as renderTableRow and renderTableRowContents? @Override - protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws IOException + protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) { String disabledReason = getDisabledReason(ctx); DisplayColumn detailsColumn = getDetailsUpdateColumn(ctx, renderers, true); diff --git a/flow/src/org/labkey/flow/view/GraphDataRegion.java b/flow/src/org/labkey/flow/view/GraphDataRegion.java index c4e2874d4..b4b7c9d85 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -77,7 +77,7 @@ public void addQueryColumns(Set columns) } @Override - protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException, IOException + protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException { super.renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex); diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index c5c71f039..096a4d932 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -81,7 +81,7 @@ public void setOffset(int offset) @Override protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) - throws IOException, SQLException + throws SQLException { // Add an extra row and render the multi-column captions TR( diff --git a/nab/src/org/labkey/nab/GetNabRunsAction.java b/nab/src/org/labkey/nab/GetNabRunsAction.java index 6ed918112..23713b84e 100644 --- a/nab/src/org/labkey/nab/GetNabRunsAction.java +++ b/nab/src/org/labkey/nab/GetNabRunsAction.java @@ -156,10 +156,6 @@ else if (form.getMaxRows() != null) { throw new RuntimeSQLException(e); } - catch (IOException e) - { - throw new RuntimeException(e); - } List runs = new ArrayList<>(); for (Integer rowId : rowIds) { From 0f38ca2357e9fb557bb1094a700f7f2960a15773 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 11 Mar 2025 07:51:33 -0700 Subject: [PATCH 8/8] Fix flow graphs --- flow/src/org/labkey/flow/view/GraphColumn.java | 3 +-- .../org/labkey/flow/view/GraphDataRegion.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index 7a74d471d..8a438d5bb 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -28,7 +28,6 @@ import org.labkey.api.settings.AppProps; import org.labkey.api.util.DOM.Renderable; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.view.ActionURL; @@ -135,7 +134,7 @@ public void renderGraph(RenderContext ctx, HtmlWriter out) { if (!ctx.containsKey(INCLUDE_UTIL_SCRIPT)) { - out.write(JavaScriptFragment.unsafe(String.format("", AppProps.getInstance().getContextPath(), PageConfig.getScriptNonceHeader(ctx.getRequest())))); + out.write(HtmlString.unsafe(String.format("", AppProps.getInstance().getContextPath(), PageConfig.getScriptNonceHeader(ctx.getRequest())))); ctx.put(INCLUDE_UTIL_SCRIPT, true); } diff --git a/flow/src/org/labkey/flow/view/GraphDataRegion.java b/flow/src/org/labkey/flow/view/GraphDataRegion.java index b4b7c9d85..1434d9fa8 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -24,7 +24,6 @@ import org.labkey.api.util.HtmlString; import org.labkey.api.writer.HtmlWriter; -import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -86,13 +85,15 @@ protected void renderTableRow(RenderContext ctx, HtmlWriter out, boolean showRec // skip one cell for the [details] column TD(HtmlString.NBSP), - TD(at(colspan, renderers.size())), - (Renderable) ret -> { - _graphColumns.stream() - .filter(gc -> gc.isVisible(ctx)) - .forEach(gc -> gc.renderGraph(ctx, out)); - return ret; - } + TD( + at(colspan, renderers.size()), + (Renderable) ret -> { + _graphColumns.stream() + .filter(gc -> gc.isVisible(ctx)) + .forEach(gc -> gc.renderGraph(ctx, out)); + return ret; + } + ) ).appendTo(out); } }