From d0373d6da1ca2e4ff0676c1227cb93581b0da07a Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Tue, 11 Mar 2025 22:11:54 -0700 Subject: [PATCH 01/10] DisplayColumn refactor --- .../luminex/LuminexUploadWizardAction.java | 28 ++++++--- .../AnalytePropStandardsDisplayColumn.java | 2 +- .../query/ExclusionUIDisplayColumn.java | 4 +- .../labkey/luminex/query/GuideSetTable.java | 8 +-- .../NegativeBeadDisplayColumnFactory.java | 16 ++--- .../query/NegativeBeadDisplayColumnGroup.java | 63 ++++++++++--------- ms2/src/org/labkey/ms2/DeltaScanColumn.java | 2 +- .../labkey/ms2/GroupNumberDisplayColumn.java | 2 +- .../org/labkey/ms2/HydrophobicityColumn.java | 2 +- .../labkey/ms2/compare/CompareDataRegion.java | 1 - .../PeptideAggregrationDisplayColumn.java | 23 +------ .../ms2/query/PeptideCountCoverageColumn.java | 6 +- .../ms2/query/QueryAACoverageColumn.java | 2 +- .../UniquePeptideCountCoverageColumn.java | 9 +-- 14 files changed, 78 insertions(+), 90 deletions(-) diff --git a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java index f5435ee0d2..bc96da5289 100644 --- a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java +++ b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java @@ -18,6 +18,7 @@ import jakarta.servlet.ServletException; import org.apache.commons.collections4.keyvalue.MultiKey; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.action.LabKeyError; import org.labkey.api.action.SpringActionController; @@ -53,11 +54,13 @@ import org.labkey.api.study.assay.ParticipantVisitResolverType; import org.labkey.api.util.HtmlString; import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.util.element.Input; import org.labkey.api.view.HttpView; import org.labkey.api.view.InsertView; import org.labkey.api.view.JspView; import org.labkey.api.view.VBox; import org.labkey.api.view.ViewServlet; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.model.Analyte; import org.labkey.luminex.model.SinglePointControl; import org.labkey.luminex.model.Titration; @@ -85,6 +88,10 @@ import java.util.Set; import java.util.TreeSet; +import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.TD; +import static org.labkey.api.util.DOM.at; + /** * Adds Analyte Properties as third wizard step, handles analyte and titration definition input view UI and post, saves * last entered default values for analyte domain and standard properties @@ -421,13 +428,19 @@ else if (titrationEntry.getValue().isStandard()) view.getDataRegion().addGroup(new DisplayColumnGroup(cols, titrationEntry.getKey(), true) { @Override - public void writeSameCheckboxCell(RenderContext ctx, Writer out) throws IOException + public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) { String titrationCellName = PageFlowUtil.filter(getTitrationColumnCellName(titrationEntry.getValue().getName())); String groupName = ColumnInfo.propNameFromName(getColumns().get(0).getFormFieldName(ctx)); String id = groupName + "CheckBox"; - out.write(""); - out.write(""); + + TD( + at(style, "display:" + (hideCell ? "none" : "table-cell")). + name(titrationCellName), + new Input.InputBuilder().type("checkbox").name(id).id(id) + + ).appendTo(out); + StringBuilder onchange = new StringBuilder("b = this.checked;"); for (DisplayColumn col : getColumns()) { @@ -435,7 +448,6 @@ public void writeSameCheckboxCell(RenderContext ctx, Writer out) throws IOExcept } onchange.append("if (b) { ").append(groupName).append("Updated(); }"); HttpView.currentPageConfig().addHandler(id, "change", onchange.toString()); - out.write(""); } @Override @@ -548,7 +560,7 @@ private boolean toShowStandardCheckboxColumn(boolean errorReshow, Set return (errorReshow && requestParamValue.equals("true")) || (!errorReshow && standardTitrations.contains(standard)); } - private DisplayColumnFactory createAnalytePropertyDisplayColumnFactory(final String inputName, final String displayName) + private DisplayColumnFactory createAnalytePropertyDisplayColumnFactory(final String inputName, final @NotNull String displayName) { return colInfo -> new DataColumn(colInfo) { @@ -559,9 +571,9 @@ public String getFormFieldName(RenderContext ctx) } @Override - public void renderTitle(RenderContext ctx, Writer out) throws IOException + public HtmlString getTitle(RenderContext ctx) { - out.write(displayName); + return HtmlString.of(displayName); } @Override @@ -569,7 +581,7 @@ public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable St { out.write(""); - renderTitle(ctx, out); + out.write(getTitle(ctx).toString()); String sb = "Type: " + getBoundColumn().getFriendlyTypeName() + "\n"; PageFlowUtil.popupHelp(HtmlString.of(sb), displayName).appendTo(out); diff --git a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java index 9bff06b831..787f120199 100644 --- a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java @@ -127,7 +127,7 @@ public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable St String titrationCellName = PageFlowUtil.filter(LuminexUploadWizardAction.getTitrationColumnCellName(_titration.getName())); out.write(""); - renderTitle(ctx, out); + out.write(getTitle(ctx).toString()); out.write(""); } diff --git a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java index 56a165b82e..21e982faca 100644 --- a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java @@ -82,9 +82,9 @@ public void addQueryFieldKeys(Set keys) } @Override - public void renderTitle(RenderContext ctx, Writer out) + public HtmlString getTitle(RenderContext ctx) { - // Don't render a title, to keep the column narrow + return null; // Don't render a title, to keep the column narrow } @Override diff --git a/luminex/src/org/labkey/luminex/query/GuideSetTable.java b/luminex/src/org/labkey/luminex/query/GuideSetTable.java index 4992046ea4..a1255ac8fe 100644 --- a/luminex/src/org/labkey/luminex/query/GuideSetTable.java +++ b/luminex/src/org/labkey/luminex/query/GuideSetTable.java @@ -64,10 +64,6 @@ import java.util.List; import java.util.Map; -/** - * User: jeckels - * Date: Aug 26, 2011 - */ public class GuideSetTable extends AbstractCurveFitPivotTable { public GuideSetTable(final LuminexProtocolSchema schema, ContainerFilter cf, boolean filter) @@ -125,9 +121,9 @@ public HtmlString getFormattedHtml(RenderContext ctx) } @Override - public void renderTitle(RenderContext ctx, Writer out) + public HtmlString getTitle(RenderContext ctx) { - // no title + return null; // no title } @Override diff --git a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java index 69ab607c0e..226fd10e48 100644 --- a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java +++ b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java @@ -16,6 +16,7 @@ package org.labkey.luminex.query; import org.apache.commons.beanutils.ConvertUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.DataColumn; @@ -23,6 +24,7 @@ import org.labkey.api.data.DisplayColumnFactory; import org.labkey.api.data.RenderContext; import org.labkey.api.util.HtmlString; +import org.labkey.api.util.HtmlStringBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.HttpView; import org.labkey.luminex.LuminexDataHandler; @@ -58,15 +60,15 @@ public String getFormFieldName(RenderContext ctx) } @Override - public void renderTitle(RenderContext ctx, Writer out) throws IOException + public @NotNull HtmlString getTitle(RenderContext ctx) { - out.write("\n"); - - out.write(PageFlowUtil.filter(_displayName)); + "\n") + .append(_displayName).getHtmlString(); } @Override @@ -74,7 +76,7 @@ public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable St { out.write(""); - renderTitle(ctx, out); + out.write(getTitle(ctx).toString()); StringBuilder sb = new StringBuilder(); sb.append("The analyte to use in the FI-Bkgd-Neg transform script calculation. Available options are " + "those selected as Negative Control analytes.\n\n"); diff --git a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java index 494d13ecf4..f107310d79 100644 --- a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java +++ b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java @@ -19,13 +19,16 @@ import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.DisplayColumnGroup; import org.labkey.api.data.RenderContext; +import org.labkey.api.util.DOM; +import org.labkey.api.util.element.Input; import org.labkey.api.view.HttpView; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexDataHandler; -import java.io.IOException; -import java.io.Writer; import java.util.List; +import static org.labkey.api.util.DOM.TD; + public class NegativeBeadDisplayColumnGroup extends DisplayColumnGroup { private final String _inputName; @@ -37,33 +40,35 @@ public NegativeBeadDisplayColumnGroup(List columns, String inputN } @Override - public void writeSameCheckboxCell(RenderContext ctx, Writer out) throws IOException + public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) { - out.write(""); - if (isCopyable()) - { - String inputName = ColumnInfo.propNameFromName(_inputName); - String id = inputName + "CheckBox"; - out.write(""); - StringBuilder onChange = new StringBuilder("b = this.checked;\n"); - for (int i = 1; i < getColumns().size(); i++) - { - DisplayColumn col = getColumns().get(i); - if (col.getColumnInfo() != null) - { - onChange.append("s = document.getElementsByName('") - .append(col.getFormFieldName(ctx)) - .append("')[0].options.length;\n") - .append("document.getElementsByName('") - .append(col.getFormFieldName(ctx)) - .append("')[0].style.display = b || s == 0 ? 'none' : 'block';\n"); - } - } - onChange.append(" if (b) { ") - .append(inputName) - .append("Updated(); }"); - HttpView.currentPageConfig().addHandler(id, "change", onChange.toString()); - } - out.write(""); + TD( + isCopyable() ? (DOM.Renderable) ret -> { + String inputName = ColumnInfo.propNameFromName(_inputName); + String id = inputName + "CheckBox"; + new Input.InputBuilder().type("checkbox").name(id).id(id).appendTo(out); + StringBuilder onChange = new StringBuilder("b = this.checked;\n"); + + getColumns().forEach(col -> { + if (col.getColumnInfo() != null) + { + onChange.append("s = document.getElementsByName('") + .append(col.getFormFieldName(ctx)) + .append("')[0].options.length;\n") + .append("document.getElementsByName('") + .append(col.getFormFieldName(ctx)) + .append("')[0].style.display = b || s == 0 ? 'none' : 'block';\n"); + } + }); + + onChange.append(" if (b) { ") + .append(inputName) + .append("Updated(); }"); + HttpView.currentPageConfig().addHandler(id, "change", onChange.toString()); + + return ret; + } : + null + ).appendTo(out); } } diff --git a/ms2/src/org/labkey/ms2/DeltaScanColumn.java b/ms2/src/org/labkey/ms2/DeltaScanColumn.java index 3b9fc11a0b..e388f9561a 100644 --- a/ms2/src/org/labkey/ms2/DeltaScanColumn.java +++ b/ms2/src/org/labkey/ms2/DeltaScanColumn.java @@ -108,7 +108,7 @@ public Object getValue(RenderContext ctx) @Override - public Class getValueClass() + public Class getValueClass() { return Double.class; } diff --git a/ms2/src/org/labkey/ms2/GroupNumberDisplayColumn.java b/ms2/src/org/labkey/ms2/GroupNumberDisplayColumn.java index 4953c5e190..46e82974df 100644 --- a/ms2/src/org/labkey/ms2/GroupNumberDisplayColumn.java +++ b/ms2/src/org/labkey/ms2/GroupNumberDisplayColumn.java @@ -65,7 +65,7 @@ public Object getDisplayValue(RenderContext ctx) } @Override - public Class getDisplayValueClass() + public Class getDisplayValueClass() { return String.class; } diff --git a/ms2/src/org/labkey/ms2/HydrophobicityColumn.java b/ms2/src/org/labkey/ms2/HydrophobicityColumn.java index c7126f2bf6..5260cf0996 100644 --- a/ms2/src/org/labkey/ms2/HydrophobicityColumn.java +++ b/ms2/src/org/labkey/ms2/HydrophobicityColumn.java @@ -58,7 +58,7 @@ public Object getValue(RenderContext ctx) } @Override - public Class getValueClass() + public Class getValueClass() { return Double.class; } diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index 096a4d932d..13180f2191 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -26,7 +26,6 @@ import org.labkey.api.writer.HtmlWriter; import org.labkey.ms2.MS2Manager; -import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; diff --git a/ms2/src/org/labkey/ms2/query/PeptideAggregrationDisplayColumn.java b/ms2/src/org/labkey/ms2/query/PeptideAggregrationDisplayColumn.java index 0243298c46..c2c49c702b 100644 --- a/ms2/src/org/labkey/ms2/query/PeptideAggregrationDisplayColumn.java +++ b/ms2/src/org/labkey/ms2/query/PeptideAggregrationDisplayColumn.java @@ -28,14 +28,10 @@ import java.util.Objects; import java.util.Set; -/** - * User: jeckels - * Date: Apr 9, 2007 - */ public abstract class PeptideAggregrationDisplayColumn extends SimpleDisplayColumn { - private ColumnInfo _groupingColumn; - private ColumnInfo _peptideColumn; + private final ColumnInfo _groupingColumn; + private final ColumnInfo _peptideColumn; private static final Logger LOG = LogManager.getLogger(PeptideAggregrationDisplayColumn.class); private boolean _loggedError = false; @@ -147,19 +143,6 @@ private void logError(String message) protected abstract Object calculateValue(RenderContext ctx, List peptides) throws SQLException; - - @Override - public boolean isFilterable() - { - return false; - } - - @Override - public boolean isSortable() - { - return false; - } - @Override public void addQueryColumns(Set set) { @@ -175,5 +158,5 @@ public void addQueryColumns(Set set) } @Override - public abstract Class getValueClass(); + public abstract Class getValueClass(); } diff --git a/ms2/src/org/labkey/ms2/query/PeptideCountCoverageColumn.java b/ms2/src/org/labkey/ms2/query/PeptideCountCoverageColumn.java index 5a80520bb8..95fd42389d 100644 --- a/ms2/src/org/labkey/ms2/query/PeptideCountCoverageColumn.java +++ b/ms2/src/org/labkey/ms2/query/PeptideCountCoverageColumn.java @@ -21,10 +21,6 @@ import java.util.List; -/** - * User: jeckels - * Date: Apr 9, 2007 - */ public class PeptideCountCoverageColumn extends PeptideAggregrationDisplayColumn { public PeptideCountCoverageColumn(ColumnInfo colInfo, ColumnInfo peptideColumn, String caption) @@ -33,7 +29,7 @@ public PeptideCountCoverageColumn(ColumnInfo colInfo, ColumnInfo peptideColumn, } @Override - public Class getValueClass() + public Class getValueClass() { return Integer.class; } diff --git a/ms2/src/org/labkey/ms2/query/QueryAACoverageColumn.java b/ms2/src/org/labkey/ms2/query/QueryAACoverageColumn.java index 64cff55d29..3617230524 100644 --- a/ms2/src/org/labkey/ms2/query/QueryAACoverageColumn.java +++ b/ms2/src/org/labkey/ms2/query/QueryAACoverageColumn.java @@ -56,7 +56,7 @@ public ColumnInfo getColumnInfo() } @Override - public Class getValueClass() + public Class getValueClass() { return Double.class; } diff --git a/ms2/src/org/labkey/ms2/query/UniquePeptideCountCoverageColumn.java b/ms2/src/org/labkey/ms2/query/UniquePeptideCountCoverageColumn.java index ecd5252fee..e8c742cf45 100644 --- a/ms2/src/org/labkey/ms2/query/UniquePeptideCountCoverageColumn.java +++ b/ms2/src/org/labkey/ms2/query/UniquePeptideCountCoverageColumn.java @@ -19,14 +19,9 @@ import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.RenderContext; -import java.util.List; import java.util.HashSet; -import java.sql.SQLException; +import java.util.List; -/** - * User: jeckels - * Date: Apr 9, 2007 - */ public class UniquePeptideCountCoverageColumn extends PeptideAggregrationDisplayColumn { public UniquePeptideCountCoverageColumn(ColumnInfo colInfo, ColumnInfo peptideColumn, String caption) @@ -41,7 +36,7 @@ protected Object calculateValue(RenderContext ctx, List peptides) } @Override - public Class getValueClass() + public Class getValueClass() { return Integer.class; } From cb2b80a6da468004ef5f953efaf8bf7e153f1d32 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 12 Mar 2025 14:59:00 -0700 Subject: [PATCH 02/10] Remove unused methods from DisplayColumn, refactor --- .../controllers/executescript/ChooseRunsRegion.java | 1 - .../query/AnalytePropStandardsDisplayColumn.java | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java index 370919f22a..68d1ca85b8 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java +++ b/flow/src/org/labkey/flow/controllers/executescript/ChooseRunsRegion.java @@ -33,7 +33,6 @@ import org.labkey.flow.data.FlowWell; import java.io.File; -import java.io.IOException; import java.util.List; import static org.labkey.api.util.DOM.Attribute.colspan; diff --git a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java index 787f120199..e946be23f8 100644 --- a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java @@ -21,6 +21,7 @@ import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SimpleDisplayColumn; import org.labkey.api.data.SqlSelector; +import org.labkey.api.util.DOM; import org.labkey.api.util.PageFlowUtil; import org.labkey.luminex.LuminexRunUploadForm; import org.labkey.luminex.LuminexUploadWizardAction; @@ -32,6 +33,10 @@ import java.util.Map; import java.util.Set; +import static org.labkey.api.util.DOM.Attribute.name; +import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.at; + public class AnalytePropStandardsDisplayColumn extends SimpleDisplayColumn { private final LuminexRunUploadForm _form; @@ -112,13 +117,11 @@ else if (defVal == null || defVal.equalsIgnoreCase("true")) } @Override - public void renderInputWrapperBegin(Writer out) throws IOException + public DOM._Attributes getInputAttributes() { String titrationCellName = LuminexUploadWizardAction.getTitrationColumnCellName(_titration.getName()); - out.write(""); + return at(style, "display:" + (_hideCell ? "none" : "table-cell"), name, titrationCellName); } @Override From 8676dd04eaf3aff45a8ae6aec7b0718ae47e52b8 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Wed, 12 Mar 2025 18:34:44 -0700 Subject: [PATCH 03/10] renderInputHtml(), renderDetailsCaptionCell(), and renderHiddenFormInput() --- .../executescript/SamplesConfirmGridView.java | 6 +-- .../luminex/LuminexUploadWizardAction.java | 21 ++++++--- .../AnalytePropStandardsDisplayColumn.java | 23 +++++++--- .../NegativeBeadDisplayColumnFactory.java | 45 +++++++++++-------- .../viability/data/MultiValueInputColumn.java | 31 ++++++------- 5 files changed, 77 insertions(+), 49 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 075a54bac1..b054e2a543 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -504,9 +504,9 @@ protected String getSelectInputDisplayValue(NamedObject entry) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter) throws IOException { - super.renderGridCellContents(ctx, out); + super.renderGridCellContents(ctx, oldWriter); // Render hidden form inputs for candidate well ids. List candidates = (List)ctx.get(CANDIDATE_FILES_FIELD_KEY, List.class); @@ -515,7 +515,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep String sampleId = ctx.get(SAMPLE_ID_FIELD_KEY, String.class); for (FlowFCSFile candidate : candidates) { - out.write("\n"); + oldWriter.write("\n"); } } } diff --git a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java index bc96da5289..4678992cb8 100644 --- a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java +++ b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java @@ -577,15 +577,24 @@ public HtmlString getTitle(RenderContext ctx) } @Override - public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException + public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls) { - out.write(""); + Writer oldWriter = out.unwrap(); - out.write(getTitle(ctx).toString()); - String sb = "Type: " + getBoundColumn().getFriendlyTypeName() + "\n"; - PageFlowUtil.popupHelp(HtmlString.of(sb), displayName).appendTo(out); + try + { + oldWriter.write(""); + + oldWriter.write(getTitle(ctx).toString()); + String sb = "Type: " + getBoundColumn().getFriendlyTypeName() + "\n"; + PageFlowUtil.popupHelp(HtmlString.of(sb), displayName).appendTo(oldWriter); - out.write(""); + oldWriter.write(""); + } + catch (IOException e) + { + throw new RuntimeException(e); + } } }; } diff --git a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java index e946be23f8..fbe96011ea 100644 --- a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java @@ -23,6 +23,7 @@ import org.labkey.api.data.SqlSelector; import org.labkey.api.util.DOM; import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexRunUploadForm; import org.labkey.luminex.LuminexUploadWizardAction; import org.labkey.luminex.model.Analyte; @@ -60,7 +61,7 @@ public AnalytePropStandardsDisplayColumn(LuminexRunUploadForm form, Titration ti } @Override - public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException + public void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, Object value) throws IOException { String titrationName = _titration.getName(); String propertyName = PageFlowUtil.filter(LuminexUploadWizardAction.getTitrationCheckboxName(titrationName, _analyteName)); @@ -113,7 +114,7 @@ else if (defVal == null || defVal.equalsIgnoreCase("true")) } } - out.write(""); + oldWriter.write(""); } @Override @@ -125,13 +126,21 @@ public DOM._Attributes getInputAttributes() } @Override - public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException + public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls) { String titrationCellName = PageFlowUtil.filter(LuminexUploadWizardAction.getTitrationColumnCellName(_titration.getName())); - out.write(""); - out.write(getTitle(ctx).toString()); - out.write(""); + Writer oldWriter = out.unwrap(); + try + { + oldWriter.write(""); + oldWriter.write(getTitle(ctx).toString()); + oldWriter.write(""); + } + catch (IOException e) + { + throw new RuntimeException(e); + } } @Override diff --git a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java index 226fd10e48..74ac7a487c 100644 --- a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java +++ b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java @@ -27,6 +27,7 @@ import org.labkey.api.util.HtmlStringBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.HttpView; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexDataHandler; import java.io.IOException; @@ -72,27 +73,35 @@ public String getFormFieldName(RenderContext ctx) } @Override - public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException + public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls) { - out.write(""); + Writer oldWriter = out.unwrap(); + try + { + oldWriter.write(""); - out.write(getTitle(ctx).toString()); - StringBuilder sb = new StringBuilder(); - sb.append("The analyte to use in the FI-Bkgd-Neg transform script calculation. Available options are " + - "those selected as Negative Control analytes.\n\n"); - sb.append("Type: ").append(getBoundColumn().getFriendlyTypeName()).append("\n"); - PageFlowUtil.popupHelp(HtmlString.of(sb), _displayName).appendTo(out); + oldWriter.write(getTitle(ctx).toString()); + StringBuilder sb = new StringBuilder(); + sb.append("The analyte to use in the FI-Bkgd-Neg transform script calculation. Available options are " + + "those selected as Negative Control analytes.\n\n"); + sb.append("Type: ").append(getBoundColumn().getFriendlyTypeName()).append("\n"); + PageFlowUtil.popupHelp(HtmlString.of(sb), _displayName).appendTo(oldWriter); - out.write(""); + oldWriter.write(""); + } + catch (IOException e) + { + throw new RuntimeException(e); + } } @Override - public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException + public void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, Object value) throws IOException { String strValue = ConvertUtils.convert(value); boolean hidden = _initNegativeControlAnalytes.contains(_analyteName); - out.write(""); + oldWriter.write(""); } }; } diff --git a/viability/src/org/labkey/viability/data/MultiValueInputColumn.java b/viability/src/org/labkey/viability/data/MultiValueInputColumn.java index b2e1f152ed..8b7ed8ada8 100644 --- a/viability/src/org/labkey/viability/data/MultiValueInputColumn.java +++ b/viability/src/org/labkey/viability/data/MultiValueInputColumn.java @@ -21,6 +21,7 @@ import org.labkey.api.data.RenderContext; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.HttpView; +import org.labkey.api.writer.HtmlWriter; import java.io.Writer; import java.io.IOException; @@ -41,34 +42,34 @@ public MultiValueInputColumn(ColumnInfo col, List values) } @Override - public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException + public void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, Object value) throws IOException { String id = ctx.getForm().getFormFieldName(getColumnInfo()); - out.write("
"); - out.write("\n"); + oldWriter.write(");\n});\n"); + oldWriter.write("\n"); } @Override From 60e1f6bd234715712695fcb2a107fb323bf5ef8c Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 13 Mar 2025 08:09:09 -0700 Subject: [PATCH 04/10] Migrate renderGridCellContents() and renderDetailsCellContents() --- .../executescript/SamplesConfirmGridView.java | 20 +++++------ .../src/org/labkey/flow/query/FlowSchema.java | 17 +++++----- .../src/org/labkey/flow/view/GraphColumn.java | 4 +-- .../flow/webparts/AnalysisScriptsWebPart.java | 11 +++--- .../query/AnalyteSinglePointControlTable.java | 5 +-- .../luminex/query/AnalyteTitrationTable.java | 5 +-- .../query/ExclusionUIDisplayColumn.java | 7 ++-- .../labkey/luminex/query/GuideSetTable.java | 7 ++-- .../luminex/query/LuminexProtocolSchema.java | 11 +++--- .../query/QCFlagHighlightDisplayColumn.java | 34 ++++++++++++------- .../luminex/query/WellExclusionTable.java | 6 ++-- ms2/src/org/labkey/ms2/MS2Controller.java | 3 +- .../org/labkey/ms2/ProteinDisplayColumn.java | 20 ++++++----- .../labkey/ms2/ProteinListDisplayColumn.java | 9 ++--- .../labkey/ms2/pipeline/mascot/MascotRun.java | 15 +++----- .../viability/ViabilityAssaySchema.java | 19 +++++++---- 16 files changed, 109 insertions(+), 84 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index b054e2a543..1ed897eca2 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -369,23 +369,23 @@ public MatchedFlagDisplayColumn() } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { Boolean match = ctx.get(MATCHED_FLAG_FIELD_KEY, Boolean.class); if (match != null) { - out.write(""); + oldWriter.write("/_images/check.png\" />"); String fileName = ctx.get(SAMPLE_NAME_FIELD_KEY, String.class); - PageFlowUtil.popupHelp(HtmlString.of("Matched the previously imported FCS file '" + fileName + "'"), "Matched").appendTo(out); + PageFlowUtil.popupHelp(HtmlString.of("Matched the previously imported FCS file '" + fileName + "'"), "Matched").appendTo(oldWriter); } else { - out.write("/_images/cancel.png\" />"); - PageFlowUtil.popupHelp(HtmlString.of("Failed to match a previously imported FCS file. Please manually select a matching FCS file or skip importing this row."), "Not matched").appendTo(out); + oldWriter.write("/_images/cancel.png\" />"); + PageFlowUtil.popupHelp(HtmlString.of("Failed to match a previously imported FCS file. Please manually select a matching FCS file or skip importing this row."), "Not matched").appendTo(oldWriter); } } } @@ -504,9 +504,9 @@ protected String getSelectInputDisplayValue(NamedObject entry) } @Override - public void renderGridCellContents(RenderContext ctx, Writer oldWriter) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { - super.renderGridCellContents(ctx, oldWriter); + super.renderGridCellContents(ctx, out); // Render hidden form inputs for candidate well ids. List candidates = (List)ctx.get(CANDIDATE_FILES_FIELD_KEY, List.class); @@ -515,7 +515,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter) throws I String sampleId = ctx.get(SAMPLE_ID_FIELD_KEY, String.class); for (FlowFCSFile candidate : candidates) { - oldWriter.write("\n"); + out.write(new Input.InputBuilder().type("hidden").name("selectedSamples.rows[" + sampleId + "].candidateFile").value(candidate.getRowId())); } } } diff --git a/flow/src/org/labkey/flow/query/FlowSchema.java b/flow/src/org/labkey/flow/query/FlowSchema.java index ef9f0b5bac..8499840935 100644 --- a/flow/src/org/labkey/flow/query/FlowSchema.java +++ b/flow/src/org/labkey/flow/query/FlowSchema.java @@ -74,6 +74,7 @@ import org.labkey.api.util.StringExpressionFactory; import org.labkey.api.view.ActionURL; import org.labkey.api.view.ViewContext; +import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.analysis.web.FCSAnalyzer; import org.labkey.flow.analysis.web.StatisticSpec; import org.labkey.flow.controllers.FlowController; @@ -454,7 +455,7 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) return new DataColumn(colInfo) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { String targetStudyId = (String)getBoundColumn().getValue(ctx); if (targetStudyId != null && targetStudyId.length() > 0) @@ -467,11 +468,11 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep var urlProvider = PageFlowUtil.urlProvider(ProjectUrls.class); if (study != null && urlProvider != null) { - out.write(""); - out.write(study.getLabel().replaceAll(" ", " ")); - out.write(""); + oldWriter.write(""); + oldWriter.write(study.getLabel().replaceAll(" ", " ")); + oldWriter.write(""); } } } @@ -881,12 +882,12 @@ public String renderURL(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { String url = renderURL(ctx); if (url != null) { - out.write(PageFlowUtil.iconLink("fa fa-download", null).href(url).toString()); + oldWriter.write(PageFlowUtil.iconLink("fa fa-download", null).href(url).toString()); } } }; diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index 8a438d5bbb..47b2c7a85b 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -125,9 +125,9 @@ protected FlowQuerySettings.ShowGraphs showGraphs(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) { - renderGraph(ctx, HtmlWriter.of(out)); + renderGraph(ctx, HtmlWriter.of(oldWriter)); } public void renderGraph(RenderContext ctx, HtmlWriter out) diff --git a/flow/src/org/labkey/flow/webparts/AnalysisScriptsWebPart.java b/flow/src/org/labkey/flow/webparts/AnalysisScriptsWebPart.java index 7f906ee47b..014889c8b6 100644 --- a/flow/src/org/labkey/flow/webparts/AnalysisScriptsWebPart.java +++ b/flow/src/org/labkey/flow/webparts/AnalysisScriptsWebPart.java @@ -35,6 +35,7 @@ import org.labkey.api.view.Portal; import org.labkey.api.view.SimpleWebPartFactory; import org.labkey.api.view.ViewContext; +import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.controllers.editscript.ScriptController; import org.labkey.flow.controllers.executescript.AnalysisScriptController; import org.labkey.flow.data.FlowProtocolStep; @@ -151,7 +152,7 @@ public FlowScript getScript(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { FlowScript script = getScript(ctx); if (script != null) @@ -161,21 +162,21 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep if (script.hasStep(FlowProtocolStep.calculateCompensation)) { ActionURL url = script.urlFor(AnalysisScriptController.ChooseRunsToAnalyzeAction.class, FlowProtocolStep.calculateCompensation); - out.write("Compensation"); + oldWriter.write("Compensation"); and = "
"; } if (script.hasStep(FlowProtocolStep.analysis)) { ActionURL url = script.urlFor(AnalysisScriptController.ChooseRunsToAnalyzeAction.class, FlowProtocolStep.analysis); - out.write(and); - out.write("Statistics and Graphs"); + oldWriter.write(and); + oldWriter.write("Statistics and Graphs"); } } else { - out.write(" "); + oldWriter.write(" "); } } } diff --git a/luminex/src/org/labkey/luminex/query/AnalyteSinglePointControlTable.java b/luminex/src/org/labkey/luminex/query/AnalyteSinglePointControlTable.java index d74536fee3..9414bdd314 100644 --- a/luminex/src/org/labkey/luminex/query/AnalyteSinglePointControlTable.java +++ b/luminex/src/org/labkey/luminex/query/AnalyteSinglePointControlTable.java @@ -44,6 +44,7 @@ import org.labkey.api.settings.AppProps; import org.labkey.api.util.HtmlString; import org.labkey.api.util.Pair; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.AbstractLuminexControlUpdateService; import org.labkey.luminex.LuminexDataHandler; import org.labkey.luminex.model.Analyte; @@ -120,7 +121,7 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) return new JavaScriptDisplayColumn(colInfo, List.of("clientapi/ext3", "vis/vis", "luminex/LeveyJenningsPlotHelpers.js", "luminex/LeveyJenningsReport.css")) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) { int protocolId = schema.getProtocol().getRowId(); int analyte = (int)ctx.get("analyte"); @@ -130,7 +131,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) HtmlString html = HtmlString.unsafe(String.format("", AppProps.getInstance().getContextPath() + "/luminex/ljPlotIcon.png")); - renderLink(out, html, onClick, null); + renderLink(oldWriter, html, onClick, null); } @Override diff --git a/luminex/src/org/labkey/luminex/query/AnalyteTitrationTable.java b/luminex/src/org/labkey/luminex/query/AnalyteTitrationTable.java index 0001bcfe28..c697e526bd 100644 --- a/luminex/src/org/labkey/luminex/query/AnalyteTitrationTable.java +++ b/luminex/src/org/labkey/luminex/query/AnalyteTitrationTable.java @@ -46,6 +46,7 @@ import org.labkey.api.util.Pair; import org.labkey.api.view.NavTree; import org.labkey.api.view.PopupMenu; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.AbstractLuminexControlUpdateService; import org.labkey.luminex.LuminexDataHandler; import org.labkey.luminex.model.Analyte; @@ -125,7 +126,7 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) return new JavaScriptDisplayColumn(colInfo, List.of("clientapi/ext3", "vis/vis", "luminex/LeveyJenningsPlotHelpers.js", "luminex/LeveyJenningsReport.css")) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { int protocolId = schema.getProtocol().getRowId(); int analyte = (int)ctx.get("analyte"); @@ -143,7 +144,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep ljPlotsNav.addChild(new NavTree("High MFI").setScript(String.format(jsFuncCall, protocolId, analyte, titration, "HighMFI"))); PopupMenu ljPlotsMenu = new PopupMenu(ljPlotsNav, PopupMenu.Align.LEFT, PopupMenu.ButtonStyle.IMAGE); - ljPlotsMenu.renderMenuButton(ctx, out, false, null); + ljPlotsMenu.renderMenuButton(ctx, oldWriter, false, null); } @Override diff --git a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java index 21e982faca..4e1f964d58 100644 --- a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java @@ -28,6 +28,7 @@ import org.labkey.api.util.HtmlString; import org.labkey.api.util.Link; import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.writer.HtmlWriter; import java.io.IOException; import java.io.Writer; @@ -88,7 +89,7 @@ public HtmlString getTitle(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { String type = (String)ctx.get(_typeFieldKey); String description = (String)ctx.get(_descriptionFieldKey); @@ -111,11 +112,11 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep // add onclick handler to call the well exclusion window creation function String onClick = "openExclusionsWellWindow(" + _protocolId + ", " + runId + ", " + dataId + ", " + jsString(wellID) + ", " + (description == null ? null : jsString(description)) + ", " + jsString(type) + ");"; - new Link.LinkBuilder(img).href("#").onClick(onClick).clearClasses().appendTo(out); + new Link.LinkBuilder(img).href("#").onClick(onClick).clearClasses().appendTo(oldWriter); } else { - out.write(img.toString()); + oldWriter.write(img.toString()); } } diff --git a/luminex/src/org/labkey/luminex/query/GuideSetTable.java b/luminex/src/org/labkey/luminex/query/GuideSetTable.java index a1255ac8fe..6ef069f5e1 100644 --- a/luminex/src/org/labkey/luminex/query/GuideSetTable.java +++ b/luminex/src/org/labkey/luminex/query/GuideSetTable.java @@ -51,6 +51,7 @@ import org.labkey.api.assay.AssaySchema; import org.labkey.api.assay.AssayService; import org.labkey.api.util.HtmlString; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexDataHandler; import org.labkey.luminex.model.AnalyteSinglePointControl; import org.labkey.luminex.model.AnalyteTitration; @@ -149,12 +150,12 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) { return new DataColumn(colInfo){ @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { if ( (Boolean)ctx.get(this.getColumnInfo().getFieldKey()) ) - out.write("Value-based"); + oldWriter.write("Value-based"); else - out.write("Run-based"); + oldWriter.write("Run-based"); } }; } diff --git a/luminex/src/org/labkey/luminex/query/LuminexProtocolSchema.java b/luminex/src/org/labkey/luminex/query/LuminexProtocolSchema.java index 3ac19c4dc6..a5a08e5578 100644 --- a/luminex/src/org/labkey/luminex/query/LuminexProtocolSchema.java +++ b/luminex/src/org/labkey/luminex/query/LuminexProtocolSchema.java @@ -69,6 +69,7 @@ import org.labkey.api.view.NavTree; import org.labkey.api.view.ViewContext; import org.labkey.api.view.template.ClientDependency; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexAssayProvider; import org.labkey.luminex.LuminexDataHandler; import org.labkey.luminex.LuminexResultsDataRegion; @@ -623,7 +624,7 @@ public void addQueryFieldKeys(Set keys) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { Map pdfs = new HashMap<>(); for (Map.Entry entry : _pdfColumns.entrySet()) @@ -641,9 +642,9 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep { ActionURL url = PageFlowUtil.urlProvider(ExperimentUrls.class).getShowFileURL(getContainer()); url.addParameter("rowId", entry.getKey().toString()); - out.write(""); - out.write(""); - out.write(""); + oldWriter.write(""); + oldWriter.write(""); + oldWriter.write(""); } } else if (pdfs.size() > 1) @@ -664,7 +665,7 @@ else if (pdfs.size() > 1) new LinkBuilder(image) .onMouseOver("return showHelpDiv(this, 'Titration Curves', " + PageFlowUtil.jsString(PageFlowUtil.filter(sb.toString())) + ");") .clearClasses() - .appendTo(out); + .appendTo(oldWriter); } } }; diff --git a/luminex/src/org/labkey/luminex/query/QCFlagHighlightDisplayColumn.java b/luminex/src/org/labkey/luminex/query/QCFlagHighlightDisplayColumn.java index 23f2414793..f7db287cb3 100644 --- a/luminex/src/org/labkey/luminex/query/QCFlagHighlightDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/QCFlagHighlightDisplayColumn.java @@ -20,16 +20,17 @@ import org.labkey.api.data.DataColumn; import org.labkey.api.data.RenderContext; import org.labkey.api.query.FieldKey; -import java.io.IOException; -import java.io.Writer; +import org.labkey.api.util.DOM; +import org.labkey.api.writer.HtmlWriter; + import java.util.ArrayList; import java.util.List; import java.util.Set; -/** - * User: cnathe - * Date: 1/9/12 - */ +import static org.labkey.api.util.DOM.Attribute.style; +import static org.labkey.api.util.DOM.SPAN; +import static org.labkey.api.util.DOM.at; + public class QCFlagHighlightDisplayColumn extends DataColumn { private final FieldKey _qcFlagsEnabledKey; @@ -49,19 +50,26 @@ public void addQueryFieldKeys(Set keys) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { // comma separated list of enabled states for any associated QC Flags (i.e. true,false) String flagsEnabled = ctx.get(_qcFlagsEnabledKey, String.class); List enabled = parseBooleans(flagsEnabled); if (enabled.contains(true)) - out.write(""); - - super.renderGridCellContents(ctx, out); - - if (enabled.contains(true)) - out.write(""); + { + SPAN( + at(style, "color:red;"), + (DOM.Renderable) ret -> { + super.renderGridCellContents(ctx, out); + return ret; + } + ).appendTo(out); + } + else + { + super.renderGridCellContents(ctx, out); + } } private List parseBooleans(String s) diff --git a/luminex/src/org/labkey/luminex/query/WellExclusionTable.java b/luminex/src/org/labkey/luminex/query/WellExclusionTable.java index ffdf01f081..eb1f7e9e4e 100644 --- a/luminex/src/org/labkey/luminex/query/WellExclusionTable.java +++ b/luminex/src/org/labkey/luminex/query/WellExclusionTable.java @@ -48,8 +48,10 @@ import org.labkey.api.assay.AssayProvider; import org.labkey.api.assay.AssayRunDatabaseContext; import org.labkey.api.assay.AssayService; +import org.labkey.api.util.HtmlString; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.UnauthorizedException; +import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexManager; import org.labkey.luminex.LuminexRunCreator; @@ -111,10 +113,10 @@ public TableInfo getLookupTableInfo() wellsCol.setDisplayColumnFactory(colInfo -> new DataColumn(colInfo) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { Object o = getDisplayValue(ctx); - out.write(null == o ? " " : PageFlowUtil.filter(o.toString())); + out.write(null == o ? HtmlString.NBSP : HtmlString.of(o.toString())); } @Override diff --git a/ms2/src/org/labkey/ms2/MS2Controller.java b/ms2/src/org/labkey/ms2/MS2Controller.java index 1e8004272f..b7eaeb8922 100644 --- a/ms2/src/org/labkey/ms2/MS2Controller.java +++ b/ms2/src/org/labkey/ms2/MS2Controller.java @@ -153,6 +153,7 @@ import org.labkey.api.view.ViewContext; import org.labkey.api.view.WebPartView; import org.labkey.api.view.template.PageConfig; +import org.labkey.api.writer.HtmlWriter; import org.labkey.ms2.compare.CompareDataRegion; import org.labkey.ms2.compare.CompareExcelWriter; import org.labkey.ms2.compare.CompareQuery; @@ -2976,7 +2977,7 @@ public ModelAndView getView(Object o, BindException errors) DataColumn descriptionColumn = new DataColumn(MS2Manager.getTableInfoRuns().getColumn("Description")) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { if (null != ctx.get("Container") && !((Boolean)ctx.get("deleted")).booleanValue()) super.renderGridCellContents(ctx, out); diff --git a/ms2/src/org/labkey/ms2/ProteinDisplayColumn.java b/ms2/src/org/labkey/ms2/ProteinDisplayColumn.java index b1de9ed96e..7253feb012 100644 --- a/ms2/src/org/labkey/ms2/ProteinDisplayColumn.java +++ b/ms2/src/org/labkey/ms2/ProteinDisplayColumn.java @@ -21,14 +21,15 @@ import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.RenderContext; import org.labkey.api.query.FieldKey; +import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.view.ActionURL; -import org.labkey.api.view.HttpView; +import org.labkey.api.writer.HtmlWriter; -import java.io.IOException; -import java.io.Writer; import java.util.Map; import java.util.Set; +import static org.labkey.api.util.DOM.SCRIPT; + public class ProteinDisplayColumn extends AJAXDetailsDisplayColumn { private final FieldKey _seqIdFK; @@ -47,17 +48,20 @@ public ProteinDisplayColumn(ColumnInfo col, ActionURL url, Map } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { if (!_renderedCSS) { - out.write(""); + """; + + SCRIPT( + JavaScriptFragment.unsafe(script) + ).appendTo(out); + _renderedCSS = true; } super.renderGridCellContents(ctx, out); diff --git a/ms2/src/org/labkey/ms2/ProteinListDisplayColumn.java b/ms2/src/org/labkey/ms2/ProteinListDisplayColumn.java index 5440ab333e..e109fac815 100644 --- a/ms2/src/org/labkey/ms2/ProteinListDisplayColumn.java +++ b/ms2/src/org/labkey/ms2/ProteinListDisplayColumn.java @@ -23,6 +23,7 @@ import org.labkey.api.util.PageFlowUtil; import org.labkey.api.collections.CaseInsensitiveHashMap; import org.labkey.api.query.FieldKey; +import org.labkey.api.writer.HtmlWriter; import java.io.Writer; import java.io.IOException; @@ -221,13 +222,13 @@ public Object getValue(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { Map row = ctx.getRow(); if (!row.containsKey(_columnName)) { - out.write("ProteinGroupId not present in ResultSet"); + oldWriter.write("ProteinGroupId not present in ResultSet"); return; } Object groupIdObject = row.get(_columnName); @@ -237,7 +238,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep } if (!(groupIdObject instanceof Number)) { - out.write("ProteinGroupId is of unexpected type: " + groupIdObject.getClass()); + oldWriter.write("ProteinGroupId is of unexpected type: " + groupIdObject.getClass()); return; } int groupId = ((Number) groupIdObject).intValue(); @@ -250,7 +251,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep { for (ProteinSummary summary : summaryList) { - writeInfo(summary, out, url, groupId); + writeInfo(summary, oldWriter, url, groupId); } } } diff --git a/ms2/src/org/labkey/ms2/pipeline/mascot/MascotRun.java b/ms2/src/org/labkey/ms2/pipeline/mascot/MascotRun.java index cc70da3822..1b5be134ce 100644 --- a/ms2/src/org/labkey/ms2/pipeline/mascot/MascotRun.java +++ b/ms2/src/org/labkey/ms2/pipeline/mascot/MascotRun.java @@ -20,9 +20,11 @@ import org.labkey.api.data.SimpleDisplayColumn; import org.labkey.api.data.SimpleFilter; import org.labkey.api.query.FieldKey; +import org.labkey.api.util.HtmlString; import org.labkey.api.view.JspView; import org.labkey.api.view.ViewContext; import org.labkey.api.view.WebPartView; +import org.labkey.api.writer.HtmlWriter; import org.labkey.ms2.MS2Controller; import org.labkey.ms2.MS2Manager; import org.labkey.ms2.MS2Peptide; @@ -33,16 +35,9 @@ import org.labkey.ms2.peptideview.QueryPeptideMS2RunView; import org.springframework.web.servlet.ModelAndView; -import java.io.IOException; import java.io.PrintWriter; -import java.io.Writer; import java.util.Map; -/** - * User: arauch - * Date: Jul 21, 2005 - * Time: 10:19:11 PM - */ public class MascotRun extends MS2Run { private String mascotFile; @@ -173,17 +168,17 @@ public CurrentPeptideColumn(long currentPeptideId) } @Override - public void renderDetailsCellContents(RenderContext ctx, Writer out) throws IOException + public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out) { renderGridCellContents(ctx, out); } @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { if (_currentPeptideId.equals(ctx.getRow().get("rowId"))) { - out.write(""); // html checkmark + out.write(HtmlString.unsafe("")); // html checkmark } } } diff --git a/viability/src/org/labkey/viability/ViabilityAssaySchema.java b/viability/src/org/labkey/viability/ViabilityAssaySchema.java index 0eab1ad435..2159f38ee3 100644 --- a/viability/src/org/labkey/viability/ViabilityAssaySchema.java +++ b/viability/src/org/labkey/viability/ViabilityAssaySchema.java @@ -56,6 +56,7 @@ import org.labkey.api.query.QuerySettings; import org.labkey.api.security.User; import org.labkey.api.study.assay.SpecimenForeignKey; +import org.labkey.api.util.DOM; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; import org.labkey.api.util.PageFlowUtil; @@ -63,10 +64,9 @@ import org.labkey.api.view.ActionURL; import org.labkey.api.view.HttpView; import org.labkey.api.view.ViewContext; +import org.labkey.api.writer.HtmlWriter; import org.springframework.validation.BindException; -import java.io.IOException; -import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -76,6 +76,11 @@ import java.util.Map; import java.util.Set; +import static org.labkey.api.util.DOM.Attribute.align; +import static org.labkey.api.util.DOM.Attribute.src; +import static org.labkey.api.util.DOM.IMG; +import static org.labkey.api.util.DOM.at; + public class ViabilityAssaySchema extends AssayProtocolSchema { public enum UserTables @@ -382,7 +387,7 @@ public DisplayColumn createRenderer(ColumnInfo colInfo) return new DataColumn(colInfo) { @Override - public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { super.renderGridCellContents(ctx, out); @@ -408,10 +413,12 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep .unsafeAppend("

") .getHtmlString(); - HtmlString imgHtml = HtmlString.unsafe(""); + DOM.Renderable image = IMG( + at(align, "top", src, HttpView.currentContext().getContextPath() + "/_images/mv_indicator.gif"). + cl("labkey-mv-indicator") + ); - PageFlowUtil.popupHelp(popupHtml, "Unmatched Specimen IDs").link(imgHtml).width(0).appendTo(out); + PageFlowUtil.popupHelp(popupHtml, "Unmatched Specimen IDs").link(image).width(0).appendTo(out); } } From 08c6e001c79a685a119481d48a6fa487c20776e5 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 13 Mar 2025 17:15:04 -0700 Subject: [PATCH 05/10] Clean up --- .../controllers/executescript/SamplesConfirmGridView.java | 4 ++-- luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java | 2 +- .../labkey/luminex/query/NegativeBeadDisplayColumnGroup.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java index 1ed897eca2..d610f9e3ee 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -335,7 +335,7 @@ protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter ou { // Add a hidden input for spring form binding -- if this value is posted, the row was unchecked. out.write( - new Input.InputBuilder() + new Input.InputBuilder<>() .type("hidden") .name(SpringActionController.FIELD_MARKER + getRecordSelectorName(ctx)) .value(0) @@ -515,7 +515,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) String sampleId = ctx.get(SAMPLE_ID_FIELD_KEY, String.class); for (FlowFCSFile candidate : candidates) { - out.write(new Input.InputBuilder().type("hidden").name("selectedSamples.rows[" + sampleId + "].candidateFile").value(candidate.getRowId())); + out.write(new Input.InputBuilder<>().type("hidden").name("selectedSamples.rows[" + sampleId + "].candidateFile").value(candidate.getRowId())); } } } diff --git a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java index 4678992cb8..7468acdd7a 100644 --- a/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java +++ b/luminex/src/org/labkey/luminex/LuminexUploadWizardAction.java @@ -437,7 +437,7 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) TD( at(style, "display:" + (hideCell ? "none" : "table-cell")). name(titrationCellName), - new Input.InputBuilder().type("checkbox").name(id).id(id) + new Input.InputBuilder<>().type("checkbox").name(id).id(id) ).appendTo(out); diff --git a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java index f107310d79..0055351476 100644 --- a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java +++ b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnGroup.java @@ -46,7 +46,7 @@ public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out) isCopyable() ? (DOM.Renderable) ret -> { String inputName = ColumnInfo.propNameFromName(_inputName); String id = inputName + "CheckBox"; - new Input.InputBuilder().type("checkbox").name(id).id(id).appendTo(out); + new Input.InputBuilder<>().type("checkbox").name(id).id(id).appendTo(out); StringBuilder onChange = new StringBuilder("b = this.checked;\n"); getColumns().forEach(col -> { From 5acf5678ba418c876bf0d504b2c1300766ff2a22 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 13 Mar 2025 17:18:13 -0700 Subject: [PATCH 06/10] CR CR --- .../controllers/executescript/SamplesConfirmGridView.java | 7 ++++--- 1 file changed, 4 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 d610f9e3ee..80a4d4baad 100644 --- a/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java +++ b/flow/src/org/labkey/flow/controllers/executescript/SamplesConfirmGridView.java @@ -46,7 +46,7 @@ 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.util.element.Input.InputBuilder; import org.labkey.api.view.GridView; import org.labkey.api.writer.HtmlWriter; import org.labkey.flow.analysis.model.ISampleInfo; @@ -335,7 +335,7 @@ protected void renderExtraRecordSelectorContent(RenderContext ctx, HtmlWriter ou { // Add a hidden input for spring form binding -- if this value is posted, the row was unchecked. out.write( - new Input.InputBuilder<>() + new InputBuilder<>() .type("hidden") .name(SpringActionController.FIELD_MARKER + getRecordSelectorName(ctx)) .value(0) @@ -515,7 +515,8 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) String sampleId = ctx.get(SAMPLE_ID_FIELD_KEY, String.class); for (FlowFCSFile candidate : candidates) { - out.write(new Input.InputBuilder<>().type("hidden").name("selectedSamples.rows[" + sampleId + "].candidateFile").value(candidate.getRowId())); + out.write(new InputBuilder<>().type("hidden").name("selectedSamples.rows[" + sampleId + "].candidateFile").value(candidate.getRowId())); + out.write("\n"); } } } From 2717fb77ea63b5f2ed93c7550bdecfda679ce8d9 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 13 Mar 2025 17:50:11 -0700 Subject: [PATCH 07/10] Better scripty stuff --- .../luminex/query/ExclusionUIDisplayColumn.java | 4 ++-- .../query/NegativeBeadDisplayColumnFactory.java | 17 +++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java index 4e1f964d58..cc07e919ab 100644 --- a/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/ExclusionUIDisplayColumn.java @@ -26,7 +26,7 @@ import org.labkey.api.util.DOM; import org.labkey.api.util.DOM.Attribute; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.Link; +import org.labkey.api.util.Link.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.writer.HtmlWriter; @@ -112,7 +112,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit // add onclick handler to call the well exclusion window creation function String onClick = "openExclusionsWellWindow(" + _protocolId + ", " + runId + ", " + dataId + ", " + jsString(wellID) + ", " + (description == null ? null : jsString(description)) + ", " + jsString(type) + ");"; - new Link.LinkBuilder(img).href("#").onClick(onClick).clearClasses().appendTo(oldWriter); + new LinkBuilder(img).href("#").onClick(onClick).clearClasses().appendTo(oldWriter); } else { diff --git a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java index 74ac7a487c..d3815e0e5b 100644 --- a/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java +++ b/luminex/src/org/labkey/luminex/query/NegativeBeadDisplayColumnFactory.java @@ -23,10 +23,11 @@ import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.DisplayColumnFactory; import org.labkey.api.data.RenderContext; +import org.labkey.api.util.DOM; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.util.PageFlowUtil; -import org.labkey.api.view.HttpView; import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexDataHandler; @@ -34,6 +35,8 @@ import java.io.Writer; import java.util.Set; +import static org.labkey.api.util.DOM.SCRIPT; + public class NegativeBeadDisplayColumnFactory implements DisplayColumnFactory { private final String _analyteName; @@ -63,12 +66,14 @@ public String getFormFieldName(RenderContext ctx) @Override public @NotNull HtmlString getTitle(RenderContext ctx) { + String script = """ + LABKEY.requiresExt4Sandbox(function() { + LABKEY.requiresScript('luminex/NegativeBeadPopulation.js'); + }); + """; + return HtmlStringBuilder.of() - .unsafeAppend("\n") + .append(DOM.createHtml(SCRIPT(JavaScriptFragment.unsafe(script)))) .append(_displayName).getHtmlString(); } From bb7a99555354c669deb56652e1d2d497f42cddd6 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Fri, 14 Mar 2025 07:05:24 -0700 Subject: [PATCH 08/10] Fix assay upload wizard --- .../query/AnalytePropStandardsDisplayColumn.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java index fbe96011ea..b0e61d811c 100644 --- a/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java +++ b/luminex/src/org/labkey/luminex/query/AnalytePropStandardsDisplayColumn.java @@ -23,6 +23,7 @@ import org.labkey.api.data.SqlSelector; import org.labkey.api.util.DOM; import org.labkey.api.util.PageFlowUtil; +import org.labkey.api.util.element.Input.InputBuilder; import org.labkey.api.writer.HtmlWriter; import org.labkey.luminex.LuminexRunUploadForm; import org.labkey.luminex.LuminexUploadWizardAction; @@ -61,7 +62,7 @@ public AnalytePropStandardsDisplayColumn(LuminexRunUploadForm form, Titration ti } @Override - public void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, Object value) throws IOException + public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value) { String titrationName = _titration.getName(); String propertyName = PageFlowUtil.filter(LuminexUploadWizardAction.getTitrationCheckboxName(titrationName, _analyteName)); @@ -91,30 +92,30 @@ public void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, defVal = new SqlSelector(LuminexProtocolSchema.getSchema(), selectedSQL).exists() ? "true" : "false"; } - String checked = ""; + boolean checked = false; if (_errorReshow) { // if reshowing form on error, preselect based on request value if (_form.getViewContext().getRequest().getParameter(propertyName) != null) - checked = "CHECKED"; + checked = true; } else if (_standardTitrations.contains(_titration)) { if (_standardTitrations.size() == 1) { // if there is only one standard, then preselect the checkbox - checked = "CHECKED"; + checked = true; } else if (defVal == null || defVal.equalsIgnoreCase("true")) { // if > 1 standard and default value exists, set checkbox based on default value // else if no default value and titration is standard, then preselect the checkbox - checked = "CHECKED"; + checked = true; } } - oldWriter.write(""); + out.write(new InputBuilder<>().type("checkbox").value(1).name(propertyName).checked(checked)); } @Override From 2ad8a498c2c66626c438be789d9d671ddfaa36a3 Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Mon, 17 Mar 2025 11:15:43 -0700 Subject: [PATCH 09/10] Don't encode NBSP. Code cleanup. Delete unused class --- ms2/src/org/labkey/ms2/MS2Controller.java | 36 ++- .../labkey/ms2/compare/CompareDataRegion.java | 11 +- .../ms2/query/AbstractRunCompareView.java | 262 ------------------ 3 files changed, 19 insertions(+), 290 deletions(-) delete mode 100644 ms2/src/org/labkey/ms2/query/AbstractRunCompareView.java diff --git a/ms2/src/org/labkey/ms2/MS2Controller.java b/ms2/src/org/labkey/ms2/MS2Controller.java index b7eaeb8922..9355e0a865 100644 --- a/ms2/src/org/labkey/ms2/MS2Controller.java +++ b/ms2/src/org/labkey/ms2/MS2Controller.java @@ -195,7 +195,6 @@ import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; -import java.io.Writer; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; @@ -1235,7 +1234,7 @@ protected boolean getRequiresSameType() @Override public ModelAndView getSetupView(RunListForm form, BindException errors, int runListId) { - JspView extraCompareOptions = new JspView<>("/org/labkey/ms2/compare/compareSearchEngineProteinOptions.jsp"); + JspView> extraCompareOptions = new JspView<>("/org/labkey/ms2/compare/compareSearchEngineProteinOptions.jsp"); ActionURL nextURL = getViewContext().cloneActionURL().setAction(ApplyCompareViewAction.class); return pickView(nextURL, "Select a view to apply a filter to all the runs.", extraCompareOptions, runListId, "Compare"); @@ -1341,7 +1340,7 @@ public ModelAndView getSetupView(PeptideFilteringComparisonForm form, BindExcept { CompareOptionsBean bean = new CompareOptionsBean<>(new ActionURL(ComparePeptideQueryAction.class, getContainer()), runListId, form); - return new JspView("/org/labkey/ms2/compare/comparePeptideQueryOptions.jsp", bean); + return new JspView>("/org/labkey/ms2/compare/comparePeptideQueryOptions.jsp", bean); } @Override @@ -1887,7 +1886,7 @@ public void addNavTrail(NavTree root) } // extraFormHtml gets inserted between the view dropdown and the button. - private HttpView pickView(ActionURL nextURL, String viewInstructions, HttpView embeddedView, int runListId, String buttonText) + private HttpView pickView(ActionURL nextURL, String viewInstructions, HttpView embeddedView, int runListId, String buttonText) { JspView pickView = new JspView<>("/org/labkey/ms2/pickView.jsp", new PickViewBean()); @@ -1920,7 +1919,7 @@ protected boolean getRequiresSameType() @Override public ModelAndView getSetupView(RunListForm form, BindException errors, int runListId) { - JspView extraExportView = new JspView("/org/labkey/ms2/extraExportOptions.jsp"); + JspView extraExportView = new JspView<>("/org/labkey/ms2/extraExportOptions.jsp"); return pickView(getViewContext().cloneActionURL().setAction(ApplyExportRunsViewAction.class), "Select a view to apply a filter to all the runs and to indicate what columns to export.", extraExportView, runListId, "Export"); } @@ -1963,12 +1962,12 @@ public void export(ExportForm form, HttpServletResponse response, BindException @RequiresPermission(ReadPermission.class) public class ShowCompareAction extends SimpleViewAction { - private StringBuilder _title = new StringBuilder(); + private final StringBuilder _title = new StringBuilder(); @Override public ModelAndView getView(ExportForm form, BindException errors) { - return compareRuns(form.getRunList(), false, _title, form.getColumn(), errors); + return compareRuns(form.getRunList(), false, _title, errors); } @Override @@ -1985,7 +1984,7 @@ public class ExportCompareToExcel extends ExportAction @Override public void export(ExportForm form, HttpServletResponse response, BindException errors) throws Exception { - ModelAndView view = compareRuns(form.getRunList(), true, null, form.getColumn(), errors); + ModelAndView view = compareRuns(form.getRunList(), true, null, errors); if (view != null) { throw new ExportException(view); @@ -2171,7 +2170,7 @@ public ModelAndView getSetupView(SpectraCountForm form, BindException errors, in { CompareOptionsBean bean = new CompareOptionsBean<>(new ActionURL(SpectraCountAction.class, getContainer()), runListId, form); - return new JspView("/org/labkey/ms2/compare/spectraCountOptions.jsp", bean); + return new JspView>("/org/labkey/ms2/compare/spectraCountOptions.jsp", bean); } @Override @@ -2282,7 +2281,7 @@ public void addNavTrail(NavTree root) } } - private ModelAndView compareRuns(int runListIndex, boolean exportToExcel, StringBuilder title, String column, BindException errors) + private ModelAndView compareRuns(int runListIndex, boolean exportToExcel, StringBuilder title, BindException errors) { ActionURL currentURL = getViewContext().getActionURL(); @@ -2352,7 +2351,7 @@ private ModelAndView compareRuns(int runListIndex, boolean exportToExcel, String rgn.setColSpan(query.getColumnsPerRun()); rgn.setMultiColumnCaptions(runCaptions); - HttpView filterView = new CurrentFilterView(query); + HttpView filterView = new CurrentFilterView(query); GridView compareView = new GridView(rgn, errors); rgn.setShowPagination(false); @@ -2544,10 +2543,9 @@ public ApiResponse execute(final ExportForm form, BindException errors) throws E { MS2Run run = form.validateRun(); AbstractMS2RunView peptideView = getPeptideView(form.getGrouping(), run); - WebPartView gridView = peptideView.createGridView(form); - if (gridView instanceof QueryView) + AbstractMS2QueryView queryView = peptideView.createGridView(form); + if (queryView != null) { - QueryView queryView = (QueryView)gridView; int count = DataRegionSelection.setSelectionForAll(queryView, queryView.getSettings().getSelectionKey(), true); return new DataRegionSelection.SelectionResponse(count); } @@ -3564,7 +3562,7 @@ private ProteinsView(ActionURL currentURL, MS2Run run, DetailsForm form, List sequenceView; bean.run = run; if (showPeptides && !form.isSimpleSequenceView()) { @@ -3949,7 +3947,7 @@ public ModelAndView getView(DetailsForm form, BindException errors) ms2Run = form.validateRun(); MS2Run[] runs = new MS2Run[] { ms2Run }; QueryPeptideMS2RunView peptideView = new QueryPeptideMS2RunView(getViewContext(), runs); - WebPartView gv = peptideView.createGridView(form); + AbstractMS2QueryView gv = peptideView.createGridView(form); VBox vBox = new VBox(); vBox.setFrame(WebPartView.FrameType.DIALOG); vBox.addView(gv); @@ -4011,11 +4009,11 @@ public ModelAndView getView(PieSliceSectionForm form, BindException errors) if (StringUtils.isBlank(sliceDefinition)) sliceDefinition = "Miscellaneous or Defunct Category"; String html = "" + PageFlowUtil.filter(sliceDefinition) + ""; - HttpView definitionView = new HtmlView("Definition", HtmlString.unsafe(html)); + HtmlView definitionView = new HtmlView("Definition", HtmlString.unsafe(html)); vbox.addView(definitionView); String sqids = form.getSqids(); - String sqidArr[] = sqids.split(","); + String[] sqidArr = sqids.split(","); List proteins = new ArrayList<>(sqidArr.length); for (String curSqid : sqidArr) { @@ -4814,7 +4812,7 @@ public void export(DetailsForm form, HttpServletResponse response, BindException } } } - if (paramsFile == null || !NetworkDrive.exists(paramsFile)) + if (!NetworkDrive.exists(paramsFile)) { // If not, fall back on the default name paramsFile = new File(run.getPath() + "/" + run.getParamsFileName()); diff --git a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java index 13180f2191..344bc35564 100644 --- a/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java +++ b/ms2/src/org/labkey/ms2/compare/CompareDataRegion.java @@ -43,17 +43,10 @@ public class CompareDataRegion extends DataRegion int _offset = 0; int _colSpan; private final ResultSet _rs; - private final String _columnHeader; public CompareDataRegion(ResultSet rs) - { - this(rs, " "); - } - - public CompareDataRegion(ResultSet rs, String columnHeader) { _rs = rs; - _columnHeader = columnHeader; setName(MS2Manager.getDataRegionNameCompare()); setShowPagination(false); } @@ -85,7 +78,7 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea // Add an extra row and render the multi-column captions TR( showRecordSelectors ? TD() : null, - _offset > 0 ? TD(at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), _columnHeader) : null, + _offset > 0 ? TD(at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), HtmlString.NBSP) : null, (Renderable) ret -> { final MutableBoolean shade = new MutableBoolean(false); final MutableInt columnIndex = new MutableInt(0); @@ -103,7 +96,7 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea { TD( at(colspan, _offset, style, "text-align: center; vertical-align: bottom;"), - _columnHeader + HtmlString.NBSP ).appendTo(out); } diff --git a/ms2/src/org/labkey/ms2/query/AbstractRunCompareView.java b/ms2/src/org/labkey/ms2/query/AbstractRunCompareView.java deleted file mode 100644 index a632c2ef29..0000000000 --- a/ms2/src/org/labkey/ms2/query/AbstractRunCompareView.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2007-2018 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.labkey.ms2.query; - -import org.labkey.api.data.ColumnInfo; -import org.labkey.api.data.Container; -import org.labkey.api.data.DataRegion; -import org.labkey.api.data.DisplayColumn; -import org.labkey.api.data.SimpleFilter; -import org.labkey.api.data.Sort; -import org.labkey.api.data.TableInfo; -import org.labkey.api.query.CustomView; -import org.labkey.api.query.FieldKey; -import org.labkey.api.query.QueryService; -import org.labkey.api.query.QuerySettings; -import org.labkey.api.query.QueryView; -import org.labkey.api.security.permissions.ReadPermission; -import org.labkey.api.util.PageFlowUtil; -import org.labkey.api.view.ActionURL; -import org.labkey.api.view.DataView; -import org.labkey.api.view.UnauthorizedException; -import org.labkey.api.view.ViewContext; -import org.labkey.ms2.MS2Controller; -import org.labkey.ms2.MS2Run; -import org.labkey.ms2.RunListCache; -import org.labkey.ms2.RunListException; -import org.labkey.ms2.compare.CompareDataRegion; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * User: jeckels - * Date: Jun 21, 2007 - */ -public abstract class AbstractRunCompareView extends QueryView -{ - protected List _runs; - protected boolean _forExport; - private final SimpleFilter _runFilter = new SimpleFilter(); - private List _columns; - - public AbstractRunCompareView(ViewContext context, int runListIndex, boolean forExport, String tableName) - { - super(new MS2Schema(context.getUser(), context.getContainer())); - setSettings(createSettings(context, tableName)); - - _viewContext.setActionURL(context.getActionURL()); - - try - { - _runs = RunListCache.getCachedRuns(runListIndex, false, context); - } - catch (RunListException e) - { - _runs = null; - } - - if (_runs != null) - { - for (MS2Run run : _runs) - { - Container c = run.getContainer(); - if (c == null || !c.hasPermission(getUser(), ReadPermission.class)) - { - throw new UnauthorizedException(); - } - } - - getSchema().setRuns(_runs); - - _forExport = forExport; - - setButtonBarPosition(DataRegion.ButtonBarPosition.TOP); - } - // ExcelWebQueries won't be part of the same HTTP session so we won't have access to the run list anymore - setAllowExportExternalQuery(false); - } - - public List getRuns() - { - return _runs; - } - - private QuerySettings createSettings(ViewContext context, String tableName) - { - return getSchema().getSettings(context, "Compare", tableName); - } - - @Override - public MS2Schema getSchema() - { - return (MS2Schema)super.getSchema(); - } - - @Override - public DataView createDataView() - { - DataView result = super.createDataView(); - Sort sort = result.getRenderContext().getBaseSort(); - if (sort == null) - { - sort = new Sort(); - } - sort.insertSortColumn("-RunCount", false, sort.getSortList().size()); - sort.insertSortColumn("-Pattern", false, sort.getSortList().size()); - result.getRenderContext().setBaseSort(sort); - result.getRenderContext().setViewContext(getViewContext()); - SimpleFilter filter = new SimpleFilter(result.getRenderContext().getBaseFilter()); - - for (SimpleFilter.FilterClause clause : new ArrayList<>(filter.getClauses())) - { - for (FieldKey fieldKey : clause.getFieldKeys()) - { - if (fieldKey.toString().startsWith("Run/")) - { - SimpleFilter filterToRemove = new SimpleFilter(); - filterToRemove.addClause(clause); - String urlParam = filterToRemove.toQueryString(getSettings().getDataRegionName()); - if (urlParam != null && urlParam.indexOf('=') != -1) - { - filter.deleteConditions(fieldKey); - - SimpleFilter.OrClause orClause = new SimpleFilter.OrClause(); - for (MS2Run run : _runs) - { - String newParam = urlParam.replace("Run%2F", "Run" + run.getRun() + "%2F"); - ActionURL newURL = result.getRenderContext().getViewContext().cloneActionURL(); - newURL.deleteParameters(); - newURL = new ActionURL(newURL + newParam); - SimpleFilter newFilter = new SimpleFilter(newURL, getSettings().getDataRegionName()); - for (SimpleFilter.FilterClause newClause : newFilter.getClauses()) - { - orClause.addClause(newClause); - } - } - _runFilter.addClause(orClause); - } - } - } - } - - filter.addAllClauses(_runFilter); - - result.getRenderContext().setBaseFilter(filter); - return result; - } - - protected abstract String getGroupHeader(); - - public void setColumns(List columns) - { - _columns = columns; - } - - @Override - protected DataRegion createDataRegion() - { - CompareDataRegion rgn = new CompareDataRegion(null, getGroupHeader()); - configureDataRegion(rgn); - List displayColumns = getDisplayColumns(); - int offset = 0; - for (DisplayColumn col : displayColumns) - { - if (col.getColumnInfo() == null || (!col.getColumnInfo().getName().toLowerCase().startsWith("run") || col.getColumnInfo().getName().indexOf('/') == -1)) - { - offset++; - } - } - rgn.setOffset(offset); - List headings = new ArrayList<>(); - for (MS2Run run : _runs) - { - ActionURL url = MS2Controller.getShowRunURL(getUser(), run.getContainer(), run.getRun()); - headings.add("" + PageFlowUtil.filter(run.getDescription()) + ""); - } - rgn.setMultiColumnCaptions(headings); - rgn.setColSpan((displayColumns.size() - offset) / _runs.size()); - return rgn; - } - - @Override - public List getDisplayColumns() - { - List ret = new ArrayList<>(); - TableInfo table = getTable(); - if (table == null) - return Collections.emptyList(); - - CustomView view = getCustomView(); - List cols; - - if (_columns != null) - { - cols = _columns; - } - else if (view != null) - { - cols = view.getColumns(); - } - else - { - cols = table.getDefaultVisibleColumns(); - } - - List nonRunCols = new ArrayList<>(); - List runCols = new ArrayList<>(); - int runColCount = 0; - for (FieldKey col : cols) - { - if ("Run".equalsIgnoreCase(col.getParts().get(0))) - { - List parts = new ArrayList<>(col.getParts()); - int runOffset = 0; - for (MS2Run run : _runs) - { - parts.set(0, "Run" + run.getRun()); - runCols.add((runColCount + 1) * runOffset + runColCount, FieldKey.fromParts(parts)); - runOffset++; - } - runColCount++; - } - else - { - nonRunCols.add(col); - } - } - - List newCols = new ArrayList<>(nonRunCols); - newCols.addAll(runCols); - if (view != null) - { - view.setColumns(newCols); - ret.addAll(getQueryDef().getDisplayColumns(view, table)); - } - else - { - for (ColumnInfo col : QueryService.get().getColumns(table, newCols).values()) - { - DisplayColumn renderer = col.getRenderer(); - ret.add(renderer); - } - } - - return ret; - } -} From 160e9ca8ffc65fbb45909a1cd37062a196a378d7 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Mon, 17 Mar 2025 11:41:29 -0700 Subject: [PATCH 10/10] Clean up a few unnecessary wrappings --- flow/src/org/labkey/flow/view/GraphColumn.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/flow/src/org/labkey/flow/view/GraphColumn.java b/flow/src/org/labkey/flow/view/GraphColumn.java index 47b2c7a85b..6739d690d6 100644 --- a/flow/src/org/labkey/flow/view/GraphColumn.java +++ b/flow/src/org/labkey/flow/view/GraphColumn.java @@ -39,8 +39,6 @@ import org.labkey.flow.controllers.well.WellController; import org.labkey.flow.query.FlowQuerySettings; -import java.io.Writer; - import static org.labkey.api.util.DOM.Attribute.alt; import static org.labkey.api.util.DOM.Attribute.height; import static org.labkey.api.util.DOM.Attribute.src; @@ -125,9 +123,9 @@ protected FlowQuerySettings.ShowGraphs showGraphs(RenderContext ctx) } @Override - public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) + public void renderGridCellContents(RenderContext ctx, HtmlWriter out) { - renderGraph(ctx, HtmlWriter.of(oldWriter)); + renderGraph(ctx, out); } public void renderGraph(RenderContext ctx, HtmlWriter out)