diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 843766d102..370919f22a 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -16,12 +16,15 @@ 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.PageFlowUtil; +import org.labkey.api.util.DOM.Renderable; +import org.labkey.api.util.HtmlString; +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; @@ -31,10 +34,16 @@ import java.io.File; import java.io.IOException; -import java.io.Writer; -import java.sql.SQLException; 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; @@ -46,15 +55,15 @@ public ChooseRunsRegion(ChooseRunsToAnalyzeForm form) @Override - protected void renderFormBegin(RenderContext ctx, Writer out, int mode) throws IOException + protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int mode) { renderHiddenFormFields(ctx, out, 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,53 +75,54 @@ 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, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) { - out.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; } - } - - out.write("\n"); + ).appendTo(out); if (disabledReason != null) { - out.write(""); - out.write(" "); - out.write(""); - out.write(PageFlowUtil.filter(disabledReason)); - out.write(""); - out.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/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 356357c2a2..075a54bac1 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -15,8 +15,8 @@ */ package org.labkey.flow.controllers.executescript; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.labkey.api.action.SpringActionController; import org.labkey.api.collections.NamedObject; @@ -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; @@ -277,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); @@ -295,13 +297,13 @@ public Map prepareMessages(RenderContext ctx) throws IOException } @Override - protected void renderFormBegin(RenderContext ctx, Writer out, int mode) throws IOException + protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int 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. } @@ -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) { - // 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 diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index a875980ee9..8a438d5bbb 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -27,17 +27,18 @@ 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.PageFlowUtil; import org.labkey.api.util.Pair; 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; import org.labkey.flow.query.FlowQuerySettings; -import java.io.IOException; import java.io.Writer; import static org.labkey.api.util.DOM.Attribute.alt; @@ -49,6 +50,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; @@ -73,7 +75,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) @@ -91,7 +92,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); @@ -124,24 +125,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, 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(HtmlString.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; } @@ -157,7 +158,7 @@ public void renderGraph(RenderContext ctx, Writer out) throws IOException catch (IllegalArgumentException ex) { LOG.debug(ex.getMessage()); - out.write(" "); + out.write(HtmlString.NBSP); return; } @@ -176,13 +177,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 856e7be87e..1434d9fa85 100644 --- a/flow/src/org/labkey/flow/view/GraphDataRegion.java +++ b/flow/src/org/labkey/flow/view/GraphDataRegion.java @@ -20,20 +20,24 @@ 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. - * - * User: kevink - * Date: 7/20/11 */ public class GraphDataRegion extends DataRegion { @@ -72,24 +76,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, HtmlWriter out, boolean showRecordSelectors, List renderers, int rowIndex) throws SQLException { super.renderTableRow(ctx, out, showRecordSelectors, renderers, rowIndex); - out.write(""); - // skip one cell for the [details] column - out.write(" "); - out.write(""); + TR( + cl(getRowClass(ctx, rowIndex)), - for (GraphColumn graphColumn : _graphColumns) - { - if (graphColumn.isVisible(ctx)) - graphColumn.renderGraph(ctx, out); - } - out.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 5068da5b1c..096a4d932d 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -16,16 +16,27 @@ 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.RenderContext; 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.util.List; -import java.io.Writer; import java.io.IOException; -import java.sql.SQLException; 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 { @@ -69,62 +80,62 @@ public void setOffset(int offset) } @Override - protected void renderGridHeaderColumns(RenderContext ctx, Writer out, boolean showRecordSelectors, List renderers) - throws IOException, SQLException + protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolean showRecordSelectors, List renderers) + throws SQLException { // Add an extra row and render the multi-column captions - out.write(""); - - if (showRecordSelectors) - out.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) - { - out.write(""); - out.write(_columnHeader); - out.write(""); - } - - for (String caption : _multiColumnCaptions) - { - out.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++) { - renderers.get(columnIndex++).addDisplayClass("labkey-alternate-row"); + if (shade.booleanValue()) + { + renderers.get(columnIndex.getValue()).addDisplayClass("labkey-alternate-row"); + } + shade.setValue(!shade.getValue()); + columnIndex.increment(); } - } - else - { - columnIndex += _colSpan; - } - - out.write(">" + caption + ""); - shade = !shade; - } - if (_colSpan * _multiColumnCaptions.size() + _offset < renderers.size()) - { - out.write(" "); - } - out.write("\n"); + + if (_offset > 0) + { + TD( + at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), + _columnHeader + ).appendTo(out); + } + + for (String caption : _multiColumnCaptions) + { + 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); + + shade.setValue(!shade.getValue()); + } + + return ret; + }, + _colSpan * _multiColumnCaptions.size() + _offset < renderers.size() ? TD(at(colspan, renderers.size() - _colSpan * _multiColumnCaptions.size() + _offset), HtmlString.NBSP) : null + ).appendTo(out); super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers); } diff --git a/nab/src/org/labkey/nab/GetNabRunsAction.java b/nab/src/org/labkey/nab/GetNabRunsAction.java index 6ed918112c..23713b84e5 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) {