diff --git a/announcements/src/org/labkey/announcements/query/ToursTable.java b/announcements/src/org/labkey/announcements/query/ToursTable.java
index 018645a1f01..bb97b2f42d7 100644
--- a/announcements/src/org/labkey/announcements/query/ToursTable.java
+++ b/announcements/src/org/labkey/announcements/query/ToursTable.java
@@ -26,7 +26,6 @@
import org.labkey.api.data.ColumnInfo;
import org.labkey.api.data.Container;
import org.labkey.api.data.ContainerFilter;
-import org.labkey.api.data.ContainerForeignKey;
import org.labkey.api.data.ContainerManager;
import org.labkey.api.data.DataColumn;
import org.labkey.api.data.DisplayColumn;
@@ -36,12 +35,12 @@
import org.labkey.api.query.DetailsURL;
import org.labkey.api.query.FilteredTable;
import org.labkey.api.query.QueryUpdateService;
-import org.labkey.api.query.UserIdQueryForeignKey;
import org.labkey.api.security.User;
import org.labkey.api.security.UserPrincipal;
import org.labkey.api.security.permissions.Permission;
import org.labkey.api.security.permissions.PlatformDeveloperPermission;
import org.labkey.api.security.permissions.ReadPermission;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -118,14 +117,14 @@ public DisplayColumn createRenderer(final ColumnInfo colInfo)
DataColumn dc = new DataColumn(colInfo)
{
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
Object value = getValue(ctx);
Modes m = Modes.fromValue((Integer)value);
if(null != m)
- out.write(m.toString());
+ oldWriter.write(m.toString());
else
- out.write(value.toString());
+ oldWriter.write(value.toString());
}
};
diff --git a/api/src/org/labkey/api/assay/AssayDataCollectorDisplayColumn.java b/api/src/org/labkey/api/assay/AssayDataCollectorDisplayColumn.java
index 8fba1568077..1156a6b5236 100644
--- a/api/src/org/labkey/api/assay/AssayDataCollectorDisplayColumn.java
+++ b/api/src/org/labkey/api/assay/AssayDataCollectorDisplayColumn.java
@@ -16,21 +16,18 @@
package org.labkey.api.assay;
+import org.jetbrains.annotations.NotNull;
import org.labkey.api.assay.actions.AssayRunUploadForm;
import org.labkey.api.data.BaseColumnInfo;
import org.labkey.api.data.ColumnInfo;
import org.labkey.api.data.RenderContext;
import org.labkey.api.data.SimpleDisplayColumn;
+import org.labkey.api.util.HtmlString;
+import org.labkey.api.util.HtmlStringBuilder;
import org.labkey.api.view.HttpView;
import org.labkey.api.view.JspView;
+import org.labkey.api.writer.HtmlWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * User: jeckels
- * Date: Aug 3, 2007
- */
public class AssayDataCollectorDisplayColumn extends SimpleDisplayColumn
{
private final AssayRunUploadForm _form;
@@ -40,16 +37,15 @@ public AssayDataCollectorDisplayColumn(AssayRunUploadForm form)
{
_form = form;
setCaption("Run Data");
- var col = new BaseColumnInfo("Run Data");
+ var col = new BaseColumnInfo("Run Data");
col.setInputType("file");
_col = col;
}
@Override
- public void renderTitle(RenderContext ctx, Writer out) throws IOException
+ public @NotNull HtmlString getTitle(RenderContext ctx)
{
- super.renderTitle(ctx, out);
- out.write(" *");
+ return HtmlStringBuilder.of(super.getTitle(ctx)).append(" *").getHtmlString();
}
@Override
@@ -65,7 +61,7 @@ public ColumnInfo getColumnInfo()
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
HttpView descriptionView = _form.getProvider().getDataDescriptionView(_form);
JspView view = new JspView<>("/org/labkey/assay/view/dataUpload.jsp", _form);
@@ -79,7 +75,7 @@ public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws
}
catch (Exception e)
{
- throw (IOException)new IOException().initCause(e);
+ throw new RuntimeException(e);
}
}
}
diff --git a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java
index 12488b577fc..d4f39807530 100644
--- a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java
+++ b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java
@@ -36,6 +36,7 @@
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.view.template.ClientDependency;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -87,7 +88,7 @@ public Set getClientDependencies()
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
String strValue = (String)getValue(ctx);
if (isNotBlank(strValue))
@@ -100,11 +101,11 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
// users with update perm will be able to change enabled state and edit comment, others will only be able to read flag details
Link.LinkBuilder linkBuilder = new Link.LinkBuilder(getCollapsedQCFlagOutput(values, enabled))
.onClick("showQCFlagToggleWindow(" + jsString(_schemaName) + ", " + runId + "," + _editable + "); return false;");
- out.write(linkBuilder.toString());
+ oldWriter.write(linkBuilder.toString());
}
else
{
- out.write(" ");
+ oldWriter.write(" ");
}
}
diff --git a/api/src/org/labkey/api/assay/actions/BulkPropertiesDisplayColumn.java b/api/src/org/labkey/api/assay/actions/BulkPropertiesDisplayColumn.java
index ce7a7127de3..811bd79718a 100644
--- a/api/src/org/labkey/api/assay/actions/BulkPropertiesDisplayColumn.java
+++ b/api/src/org/labkey/api/assay/actions/BulkPropertiesDisplayColumn.java
@@ -20,21 +20,16 @@
import org.labkey.api.data.RenderContext;
import org.labkey.api.data.SimpleDisplayColumn;
import org.labkey.api.view.JspView;
+import org.labkey.api.writer.HtmlWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * User: jeckels
- * Date: Jan 30, 2009
- */
public class BulkPropertiesDisplayColumn extends SimpleDisplayColumn
{
- private BulkPropertiesUploadForm _form;
- private ColumnInfo _col;
public static final String PROPERTIES_FIELD_NAME = "__bulkProperties";
public static final String ENABLED_FIELD_NAME = "__enableBulkProperties";
+ private BulkPropertiesUploadForm _form;
+ private final ColumnInfo _col;
+
public BulkPropertiesDisplayColumn(BulkPropertiesUploadForm form)
{
_form = form;
@@ -58,7 +53,7 @@ public ColumnInfo getColumnInfo()
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
JspView view = new JspView<>("/org/labkey/api/assay/bulkPropertiesInput.jsp", _form);
try
@@ -67,7 +62,7 @@ public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws
}
catch (Exception e)
{
- throw (IOException)new IOException().initCause(e);
+ throw new RuntimeException(e);
}
}
}
\ No newline at end of file
diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java
index 796a066545f..f96c9ed1268 100644
--- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java
+++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java
@@ -75,10 +75,12 @@
import org.labkey.api.study.publish.StudyPublishService;
import org.labkey.api.util.HtmlString;
import org.labkey.api.util.HtmlStringBuilder;
+import org.labkey.api.util.JavaScriptFragment;
import org.labkey.api.util.Link;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.util.URLHelper;
+import org.labkey.api.util.element.Input;
import org.labkey.api.view.ActionURL;
import org.labkey.api.view.HtmlView;
import org.labkey.api.view.HttpView;
@@ -92,6 +94,7 @@
import org.labkey.api.view.ViewServlet;
import org.labkey.api.view.template.ClientDependency;
import org.labkey.api.writer.ContainerUser;
+import org.labkey.api.writer.HtmlWriter;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
@@ -99,8 +102,6 @@
import org.springframework.validation.ObjectError;
import org.springframework.web.servlet.ModelAndView;
-import java.io.IOException;
-import java.io.Writer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
@@ -115,6 +116,7 @@
import static org.labkey.api.util.DOM.BR;
import static org.labkey.api.util.DOM.DIV;
import static org.labkey.api.util.DOM.FONT;
+import static org.labkey.api.util.DOM.SCRIPT;
import static org.labkey.api.util.DOM.cl;
import static org.labkey.api.util.DOM.createHtml;
@@ -898,9 +900,9 @@ public boolean isEditable()
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
- out.write("");
+ out.write(new Input.InputBuilder<>().type("text").name(_inputName).value(value == null ? null : value.toString()));
}
@Override
@@ -1128,31 +1130,33 @@ public UploadWizardInsertView(DataRegion dataRegion, ViewContext context, BindEx
}
@Override
- protected void _renderDataRegion(RenderContext ctx, Writer out) throws IOException
+ protected void _renderDataRegion(RenderContext ctx, HtmlWriter out)
{
// may want to just put this in a js file and include it in all the wizard pages
- out.write("\n");
+ String script ="""
+ function uploadWizard_showPopup(elem, txtTitle, txtMsg)
+ {
+ var win = new Ext.Window({
+ title: txtTitle,
+ border: false,
+ constrain: true,
+ html: txtMsg,
+ closeAction:'close',
+ autoScroll: true,
+ modal: true,
+ buttons: [{
+ text: 'Close',
+ id: 'btn_cancel',
+ handler: function(){win.close();}
+ }]
+ });
+ win.show(elem);
+ }
+ """;
+
+ SCRIPT(
+ JavaScriptFragment.unsafe(script)
+ ).appendTo(out);
super._renderDataRegion(ctx, out);
}
@@ -1178,7 +1182,7 @@ public HtmlString getErrors(String paramName)
list = errors.getGlobalErrors();
else
list = errors.getFieldErrors(paramName);
- if (list == null || list.size() == 0)
+ if (list == null || list.isEmpty())
return HtmlString.EMPTY_STRING;
Set uniqueErrorStrs = new TreeSet<>();
@@ -1217,12 +1221,16 @@ public HtmlString getErrors(String paramName)
else if (errors != null && "main".equals(paramName) && errors.getFieldError("transform") != null)
{
return createHtml(
- DIV(
- FONT(cl("labkey-error"),
- DIV("Transform Script Error"),
- BR(),
- DIV(HtmlString.unsafe(errors.getFieldError("transform").getDefaultMessage()))),
- BR()));
+ DIV(
+ FONT(
+ cl("labkey-error"),
+ DIV("Transform Script Error"),
+ BR(),
+ DIV(HtmlString.unsafe(errors.getFieldError("transform").getDefaultMessage()))
+ ),
+ BR()
+ )
+ );
}
else
diff --git a/api/src/org/labkey/api/audit/data/ExperimentAuditColumn.java b/api/src/org/labkey/api/audit/data/ExperimentAuditColumn.java
index 604b14ceb9c..7af2ca18b95 100644
--- a/api/src/org/labkey/api/audit/data/ExperimentAuditColumn.java
+++ b/api/src/org/labkey/api/audit/data/ExperimentAuditColumn.java
@@ -25,6 +25,7 @@
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.Pair;
import org.labkey.api.view.ActionURL;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -103,22 +104,22 @@ public boolean isFilterable()
protected abstract String extractFromKey3(RenderContext ctx);
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
Pair value = getExpValue(ctx);
if (value != null && value.second != null)
{
- out.write("" + PageFlowUtil.filter(value.first.getName()) + "");
+ oldWriter.write("" + PageFlowUtil.filter(value.first.getName()) + "");
return;
}
if (_defaultName != null)
{
String extracted = extractFromKey3(ctx);
- out.write(extracted != null ? PageFlowUtil.filter(extracted) : " ");
+ oldWriter.write(extracted != null ? PageFlowUtil.filter(extracted) : " ");
}
else
- out.write(" ");
+ oldWriter.write(" ");
}
}
diff --git a/api/src/org/labkey/api/audit/provider/GroupAuditProvider.java b/api/src/org/labkey/api/audit/provider/GroupAuditProvider.java
index b90e197946c..9e33fff8ad4 100644
--- a/api/src/org/labkey/api/audit/provider/GroupAuditProvider.java
+++ b/api/src/org/labkey/api/audit/provider/GroupAuditProvider.java
@@ -51,6 +51,7 @@
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.view.ActionURL;
import org.labkey.api.view.ViewContext;
+import org.labkey.api.writer.HtmlWriter;
import org.springframework.validation.BindException;
import java.io.IOException;
@@ -336,7 +337,7 @@ public String getName()
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
Integer id = (Integer)getBoundColumn().getValue(ctx);
if (id != null)
@@ -358,15 +359,15 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
String groupName = g.isProjectGroup() && groupContainer != null ? groupContainer.getPath() + "/" + g.getName() : g.getName();
ActionURL url = PageFlowUtil.urlProvider(SecurityUrls.class).getManageGroupURL(groupContainer, groupName);
- out.write("");
- out.write(displayText);
- out.write("");
+ oldWriter.write("");
+ oldWriter.write(displayText);
+ oldWriter.write("");
}
else
{
- out.write(displayText);
+ oldWriter.write(displayText);
}
return;
}
@@ -384,23 +385,23 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
ActionURL url = UserManager.getUserDetailsURL(ctx.getContainer(), loggedInUser, id);
if (url != null)
{
- out.write("");
- out.write(displayText);
- out.write("");
+ oldWriter.write("");
+ oldWriter.write(displayText);
+ oldWriter.write("");
}
else
- out.write(displayText);
+ oldWriter.write(displayText);
}
else
{
- out.write(p.getName());
+ oldWriter.write(p.getName());
}
}
}
}
- out.write(" ");
+ oldWriter.write(" ");
}
@Override
diff --git a/api/src/org/labkey/api/data/AJAXDetailsDisplayColumn.java b/api/src/org/labkey/api/data/AJAXDetailsDisplayColumn.java
index acd6b71fc80..c750658316f 100644
--- a/api/src/org/labkey/api/data/AJAXDetailsDisplayColumn.java
+++ b/api/src/org/labkey/api/data/AJAXDetailsDisplayColumn.java
@@ -21,27 +21,26 @@
import org.labkey.api.query.DetailsURL;
import org.labkey.api.query.FieldKey;
import org.labkey.api.util.ContainerContext;
+import org.labkey.api.util.DOM;
import org.labkey.api.util.GUID;
import org.labkey.api.util.JavaScriptFragment;
import org.labkey.api.util.StringExpression;
import org.labkey.api.view.ActionURL;
import org.labkey.api.view.HttpView;
import org.labkey.api.view.template.ClientDependency;
-import org.labkey.api.view.template.PageConfig;
+import org.labkey.api.writer.HtmlWriter;
-import java.io.IOException;
-import java.io.Writer;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
+import static org.labkey.api.util.DOM.SPAN;
+import static org.labkey.api.util.DOM.id;
+
/**
* Uses LABKEY.Ext.CalloutTip to provide additional details, summoned via AJAX
- *
- * User: jeckels
- * Date: May 14, 2012
*/
public class AJAXDetailsDisplayColumn extends DataColumn
{
@@ -79,7 +78,7 @@ public AJAXDetailsDisplayColumn(@NotNull ColumnInfo col, @Nullable ActionURL url
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
String evaluatedURL = null;
if (_detailsURL != null)
@@ -106,9 +105,13 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
props.put("autoLoad", autoLoadProp);
props.put("target", divId);
- out.write("");
- super.renderGridCellContents(ctx, out);
- out.write("");
+ SPAN(
+ id(divId),
+ (DOM.Renderable) ret -> {
+ super.renderGridCellContents(ctx, out);
+ return ret;
+ }
+ ).appendTo(out);
HttpView.currentPageConfig().addDocumentLoadHandler(JavaScriptFragment.unsafe(
" Ext.onReady(function () { \n" +
" var config = " + props.toString(0) + ";\n" +
diff --git a/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java b/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java
index 4fd3d7036ec..55ec297375b 100644
--- a/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java
+++ b/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java
@@ -23,8 +23,9 @@
import org.labkey.api.util.MimeMap;
import org.labkey.api.util.PageFlowUtil;
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.HttpView;
+import org.labkey.api.writer.HtmlWriter;
import java.io.File;
import java.io.FileNotFoundException;
@@ -48,13 +49,13 @@ public AbstractFileDisplayColumn(ColumnInfo col)
}
@Override
- public void renderDetailsCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out)
{
renderIconAndFilename(ctx, out, (String)getValue(ctx), true, true);
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
renderIconAndFilename(ctx, out, (String)getValue(ctx), true, true);
}
@@ -69,7 +70,7 @@ protected String getFileName(RenderContext ctx, Object value, boolean isDisplay)
protected abstract InputStream getFileContents(RenderContext ctx, Object value) throws FileNotFoundException;
- protected void renderIconAndFilename(RenderContext ctx, Writer out, String filename, boolean link, boolean thumbnail) throws IOException
+ protected void renderIconAndFilename(RenderContext ctx, HtmlWriter out, String filename, boolean link, boolean thumbnail)
{
renderIconAndFilename(ctx, out, filename, null, null, link, thumbnail);
}
@@ -82,67 +83,75 @@ protected boolean isImage(String filename)
|| filename.toLowerCase().endsWith(".gif");
}
- protected void renderIconAndFilename(RenderContext ctx, Writer out, String filename, @Nullable String fileIconUrl, @Nullable String popupIconUrl, boolean link, boolean thumbnail) throws IOException
+ protected void renderIconAndFilename(RenderContext ctx, HtmlWriter out, String filename, @Nullable String fileIconUrl, @Nullable String popupIconUrl, boolean link, boolean thumbnail)
{
- if (null != filename && !StringUtils.isEmpty(filename))
+ Writer oldWriter = out.unwrap();
+ try
{
- // equivalent of DisplayColumn.renderURL.
- // Don't want to call renderUrl (DataColumn.renderUrl) to skip unnecessary displayValue check
- StringExpression s = compileExpression(ctx.getViewContext());
- String url = null == s ? null : s.eval(ctx);
-
- if (link)
+ if (null != filename && !StringUtils.isEmpty(filename))
{
- if (null != url)
+ // equivalent of DisplayColumn.renderURL.
+ // Don't want to call renderUrl (DataColumn.renderUrl) to skip unnecessary displayValue check
+ StringExpression s = compileExpression(ctx.getViewContext());
+ String url = null == s ? null : s.eval(ctx);
+
+ if (link)
{
- out.write("");
}
- out.write(" href=\"");
- out.write(PageFlowUtil.filter(url));
- out.write("\">");
}
- }
- String displayName = getFileName(ctx, filename, true);
- boolean isImage = isImage(filename);
+ String displayName = getFileName(ctx, filename, true);
+ boolean isImage = isImage(filename);
- FileImageRenderHelper renderHelper = createRenderHelper(ctx, url, filename, displayName, fileIconUrl, popupIconUrl, thumbnail, isImage);
+ FileImageRenderHelper renderHelper = createRenderHelper(ctx, url, filename, displayName, fileIconUrl, popupIconUrl, thumbnail, isImage);
- if ((url != null || fileIconUrl != null) && thumbnail && isImage)
- {
- // controls whether to render a popup image on hover, otherwise just render an image with a click handler
- // to navigate to the url
- if (renderHelper.renderPopupImage())
- PageFlowUtil.popupHelp(HtmlString.unsafe(renderHelper.createPopupImage()), displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(out);
- else
- PageFlowUtil.popupHelp(displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(out);
- }
- else
- {
- if (url != null && thumbnail && MimeMap.DEFAULT.isInlineImageFor(new File(filename)) )
+ if ((url != null || fileIconUrl != null) && thumbnail && isImage)
{
+ // controls whether to render a popup image on hover, otherwise just render an image with a click handler
+ // to navigate to the url
if (renderHelper.renderPopupImage())
- PageFlowUtil.popupHelp(HtmlString.unsafe(renderHelper.createPopupImage()), displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(out);
+ PageFlowUtil.popupHelp(HtmlString.unsafe(renderHelper.createPopupImage()), displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(oldWriter);
else
- PageFlowUtil.popupHelp(displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(out);
+ PageFlowUtil.popupHelp(displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(oldWriter);
}
else
- out.write(renderHelper.createThumbnailImage());
- }
+ {
+ if (url != null && thumbnail && MimeMap.DEFAULT.isInlineImageFor(new File(filename)) )
+ {
+ if (renderHelper.renderPopupImage())
+ PageFlowUtil.popupHelp(HtmlString.unsafe(renderHelper.createPopupImage()), displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(oldWriter);
+ else
+ PageFlowUtil.popupHelp(displayName).link(HtmlString.unsafe(renderHelper.createThumbnailImage())).width(310).script(renderHelper.createClickScript()).appendTo(oldWriter);
+ }
+ else
+ oldWriter.write(renderHelper.createThumbnailImage());
+ }
- if (link && null != url)
+ if (link && null != url)
+ {
+ oldWriter.write("");
+ }
+ }
+ else
{
- out.write("");
+ oldWriter.write(" ");
}
}
- else
+ catch (IOException e)
{
- out.write(" ");
+ throw new RuntimeException(e);
}
}
@@ -257,14 +266,14 @@ protected boolean hasFileInputHtml()
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
if (hasFileInputHtml())
{
String filename = getFileName(ctx, value);
String formFieldName = ctx.getForm().getFormFieldName(getBoundColumn());
- Input.InputBuilder input = new Input.InputBuilder()
+ InputBuilder> input = new InputBuilder<>()
.type("file")
.name(formFieldName)
.disabled(isDisabledInput(ctx))
@@ -294,15 +303,24 @@ protected String getRemovalWarningText(String filename)
return "Previous file " + filename + " will be removed.";
}
- private void renderThumbnailAndRemoveLink(Writer out, RenderContext ctx, String filename, String filePicker) throws IOException
+ // TODO: filePicker should be a builder or HtmlString or something sensible like that
+ private void renderThumbnailAndRemoveLink(HtmlWriter out, RenderContext ctx, String filename, String filePicker)
{
String divId = GUID.makeGUID();
String linkId = "remove" + divId;
- out.write("");
- renderIconAndFilename(ctx, out, filename, false, false);
- out.write(" [
remove]");
- out.write("
\n");
+ Writer oldWriter = out.unwrap();
+ try
+ {
+ oldWriter.write("");
+ renderIconAndFilename(ctx, out, filename, false, false);
+ oldWriter.write(" [
remove]");
+ oldWriter.write("
\n");
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
String innerHtml = filePicker + "" + getRemovalWarningText(filename) + "";
HttpView.currentPageConfig().addHandler(linkId, "click", "document.getElementById(" + jsString(divId) + ").innerHTML = " + jsString(innerHtml));
}
diff --git a/api/src/org/labkey/api/data/AbstractValueTransformingDisplayColumn.java b/api/src/org/labkey/api/data/AbstractValueTransformingDisplayColumn.java
index 6c314cfae4f..adef6a588e3 100644
--- a/api/src/org/labkey/api/data/AbstractValueTransformingDisplayColumn.java
+++ b/api/src/org/labkey/api/data/AbstractValueTransformingDisplayColumn.java
@@ -17,13 +17,11 @@
import org.jetbrains.annotations.NotNull;
import org.labkey.api.util.HtmlString;
-import org.labkey.api.util.PageFlowUtil;
/**
* Base class for transforming a raw DB column into a completely transformed value. An example is wrapping a RowId
* column in the real table and showing a value that's calculated in Java code instead based on looking up other
* data. Provides one simple method to implement to handle returning that value in HTML, exports, client API requests, etc.
- * Created by Josh on 5/17/2017.
*/
public abstract class AbstractValueTransformingDisplayColumn extends DataColumn
{
diff --git a/api/src/org/labkey/api/data/ArrayExcelWriter.java b/api/src/org/labkey/api/data/ArrayExcelWriter.java
index 3be33610144..d308c717ac4 100644
--- a/api/src/org/labkey/api/data/ArrayExcelWriter.java
+++ b/api/src/org/labkey/api/data/ArrayExcelWriter.java
@@ -2,7 +2,9 @@
import org.apache.poi.ss.usermodel.Sheet;
import org.labkey.api.reader.ColumnDescriptor;
+import org.labkey.api.util.HtmlString;
import org.labkey.api.view.ActionURL;
+import org.labkey.api.writer.HtmlWriter;
import java.io.Writer;
import java.util.ArrayList;
@@ -45,15 +47,15 @@ public void renderGrid(RenderContext ctx, Sheet sheet, List visible
public class ArrayDisplayColumn extends DisplayColumn
{
- Class valueClass;
+ Class> valueClass;
int position;
- public ArrayDisplayColumn(String name, Class valueClass, int position)
+ public ArrayDisplayColumn(String name, Class> valueClass, int position)
{
this(name, name, valueClass, position);
}
- public ArrayDisplayColumn(String name, String caption, Class valueClass, int position)
+ public ArrayDisplayColumn(String name, String caption, Class> valueClass, int position)
{
setName(name);
setCaption(caption);
@@ -68,27 +70,26 @@ public Object getValue(RenderContext ctx)
}
@Override
- public Class getValueClass()
+ public Class> getValueClass()
{
return valueClass;
}
-
//NOTE: Methods beyond here are unimplemented, just abstract in base class
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out)
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out)
{
throw new UnsupportedOperationException("This is for excel only.");
}
@Override
- public void renderDetailsCellContents(RenderContext ctx, Writer out)
+ public void renderDetailsCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out)
{
throw new UnsupportedOperationException("This is for excel only.");
}
@Override
- public void renderTitle(RenderContext ctx, Writer out)
+ public HtmlString getTitle(RenderContext ctx)
{
throw new UnsupportedOperationException("This is for excel only.");
}
@@ -112,13 +113,13 @@ public boolean isEditable()
}
@Override
- public void renderFilterOnClick(RenderContext ctx, Writer out)
+ public String getFilterOnClick(RenderContext ctx)
{
throw new UnsupportedOperationException("This is for excel only.");
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value)
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
throw new UnsupportedOperationException("This is for excel only.");
}
@@ -160,7 +161,7 @@ public ColumnInfo getColumnInfo()
}
@Override
- public void render(RenderContext ctx, Writer out)
+ public void render(RenderContext ctx, HtmlWriter out)
{
throw new UnsupportedOperationException("This is for excel only.");
}
diff --git a/api/src/org/labkey/api/data/AttachmentDisplayColumn.java b/api/src/org/labkey/api/data/AttachmentDisplayColumn.java
index 7cc97bf6224..a27a6c60f78 100644
--- a/api/src/org/labkey/api/data/AttachmentDisplayColumn.java
+++ b/api/src/org/labkey/api/data/AttachmentDisplayColumn.java
@@ -27,9 +27,6 @@
import java.util.Set;
/**
- * User: adam
- * Date: Feb 12, 2008
- *
* Renders attachment popup and download link using the underlying ColumnInfo's URL.
*/
public class AttachmentDisplayColumn extends AbstractFileDisplayColumn
@@ -59,7 +56,7 @@ else if (value instanceof String)
}
@Override
- public Class getDisplayValueClass()
+ public Class> getDisplayValueClass()
{
ColumnInfo displayColumn = getDisplayColumn();
if (displayColumn.getPropertyType() != null)
diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java
index 81a35776899..53f6c1e0176 100644
--- a/api/src/org/labkey/api/data/BaseColumnInfo.java
+++ b/api/src/org/labkey/api/data/BaseColumnInfo.java
@@ -51,6 +51,7 @@
import org.labkey.api.util.StringExpressionFactory;
import org.labkey.api.util.StringExpressionFactory.FieldKeyStringExpression;
import org.labkey.api.util.logging.LogHelper;
+import org.labkey.api.writer.HtmlWriter;
import org.labkey.data.xml.ColumnType;
import org.labkey.data.xml.DbSequenceType;
import org.labkey.data.xml.PropertiesType;
@@ -1301,9 +1302,9 @@ else if (xmlCol.isSetKeyVariable())
return new SimpleDisplayColumn()
{
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
- out.write(PageFlowUtil.filter("Error: " + message));
+ oldWriter.write(PageFlowUtil.filter("Error: " + message));
}
};
};
diff --git a/api/src/org/labkey/api/data/CrosstabDataRegion.java b/api/src/org/labkey/api/data/CrosstabDataRegion.java
index 16dc0bd5950..c8fda5034d4 100644
--- a/api/src/org/labkey/api/data/CrosstabDataRegion.java
+++ b/api/src/org/labkey/api/data/CrosstabDataRegion.java
@@ -17,16 +17,22 @@
import org.apache.commons.lang3.StringUtils;
import org.labkey.api.query.CrosstabView;
-import org.labkey.api.util.PageFlowUtil;
+import org.labkey.api.util.DOM.Renderable;
+import org.labkey.api.util.HtmlString;
+import org.labkey.api.util.Link;
import org.labkey.api.util.Pair;
-import org.labkey.api.util.UnexpectedException;
+import org.labkey.api.util.SafeToRender;
import org.labkey.api.writer.HtmlWriter;
-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.TH;
+import static org.labkey.api.util.DOM.THEAD;
+import static org.labkey.api.util.DOM.TR;
+import static org.labkey.api.util.DOM.at;
+
/**
* Used in conjunction with the CrosstabView class to override rendering of the column headers.
*/
@@ -51,70 +57,71 @@ protected void renderGridHeaderColumns(RenderContext ctx, HtmlWriter out, boolea
{
if (_numMemberMeasures > 0)
{
- Writer oldWriter = out.unwrap();
-
- try
- {
//add a row for the column axis label if there is one
- oldWriter.write("");
- renderColumnGroupHeader(_numRowAxisCols + (showRecordSelectors ? 1 : 0), _settings.getRowAxis().getCaption(), oldWriter, false);
- renderColumnGroupHeader(renderers.size() - _numRowAxisCols, _settings.getColumnAxis().getCaption(), oldWriter, false);
- oldWriter.write("
");
+ THEAD(
+ TR(
+ (Renderable) ret -> {
+ renderColumnGroupHeader(_numRowAxisCols + (showRecordSelectors ? 1 : 0), HtmlString.of(_settings.getRowAxis().getCaption()), out, false);
+ renderColumnGroupHeader(renderers.size() - _numRowAxisCols, HtmlString.of(_settings.getColumnAxis().getCaption()), out, false);
- //add an extra row for the column dimension members
- oldWriter.write("");
- renderColumnGroupHeader(_numRowAxisCols + (showRecordSelectors ? 1 : 0), _settings.getRowAxis().getCaption(), oldWriter, false);
-
- List>> groupedByMember = CrosstabView.columnsByMember(renderers);
-
- // Output a group header for each column's crosstab member.
- CrosstabDimension colDim = _settings.getColumnAxis().getDimensions().get(0);
- boolean alternate = true;
- for (Pair> group : groupedByMember)
- {
- CrosstabMember currentMember = group.first;
- List memberColumns = group.second;
- if (memberColumns.isEmpty())
- continue;
-
- alternate = !alternate;
-
- if (currentMember != null)
- {
- if (_numMeasures != _numMemberMeasures || colDim.getMemberUrl(currentMember) != null)
- {
- renderColumnGroupHeader(memberColumns.size(), getMemberCaptionWithUrl(colDim, currentMember), oldWriter, alternate);
+ return ret;
}
- }
-
- for (DisplayColumn renderer : memberColumns)
- {
- if (alternate)
- renderer.addDisplayClass("labkey-alternate-col");
- if (currentMember != null && _numMeasures != _numMemberMeasures)
- {
- String memberCaption = currentMember.getCaption();
- String innerCaption = renderer.getCaption(ctx);
- if (StringUtils.startsWith(innerCaption, memberCaption))
- renderer.setCaption(StringUtils.trim(innerCaption.substring(memberCaption.length())));
+ )
+ ).appendTo(out);
+
+ //add an extra row for the column dimension members
+ THEAD(
+ TR(
+ (Renderable) ret -> {
+ renderColumnGroupHeader(_numRowAxisCols + (showRecordSelectors ? 1 : 0), HtmlString.of(_settings.getRowAxis().getCaption()), out, false);
+
+ List>> groupedByMember = CrosstabView.columnsByMember(renderers);
+
+ // Output a group header for each column's crosstab member.
+ CrosstabDimension colDim = _settings.getColumnAxis().getDimensions().get(0);
+ boolean alternate = true;
+ for (Pair> group : groupedByMember)
+ {
+ CrosstabMember currentMember = group.first;
+ List memberColumns = group.second;
+ if (memberColumns.isEmpty())
+ continue;
+
+ alternate = !alternate;
+
+ if (currentMember != null)
+ {
+ if (_numMeasures != _numMemberMeasures || colDim.getMemberUrl(currentMember) != null)
+ {
+ renderColumnGroupHeader(memberColumns.size(), getMemberCaptionWithUrl(colDim, currentMember), out, alternate);
+ }
+ }
+
+ for (DisplayColumn renderer : memberColumns)
+ {
+ if (alternate)
+ renderer.addDisplayClass("labkey-alternate-col");
+ if (currentMember != null && _numMeasures != _numMemberMeasures)
+ {
+ String memberCaption = currentMember.getCaption();
+ String innerCaption = renderer.getCaption(ctx);
+ if (StringUtils.startsWith(innerCaption, memberCaption))
+ renderer.setCaption(StringUtils.trim(innerCaption.substring(memberCaption.length())));
+ }
+ }
+ }
+
+ return ret;
}
- }
- }
-
- //end the col dimension member header row
- oldWriter.write("
");
- }
- catch (IOException e)
- {
- throw UnexpectedException.wrap(e);
- }
+ )
+ ).appendTo(out);
}
//call the base class to finish rendering the headers
super.renderGridHeaderColumns(ctx, out, showRecordSelectors, renderers);
}
- protected String getMemberCaptionWithUrl(CrosstabDimension dimension, CrosstabMember member)
+ protected SafeToRender getMemberCaptionWithUrl(CrosstabDimension dimension, CrosstabMember member)
{
String url = null;
if (null != dimension.getUrl())
@@ -123,37 +130,27 @@ protected String getMemberCaptionWithUrl(CrosstabDimension dimension, CrosstabMe
return getMemberCaptionWithUrl(member.getCaption(), url);
}
- protected String getMemberCaptionWithUrl(String caption, String url)
+ protected SafeToRender getMemberCaptionWithUrl(String caption, String url)
{
if (url != null)
{
- StringBuilder ret = new StringBuilder();
- ret.append("");
- ret.append(PageFlowUtil.filter(caption));
- ret.append("");
- return ret.toString();
+ return new Link.LinkBuilder(caption).href(url);
}
- return PageFlowUtil.filter(caption);
+ return HtmlString.of(caption);
}
- protected void renderColumnGroupHeader(int groupWidth, String caption, Writer out, boolean alternate) throws IOException
+ protected void renderColumnGroupHeader(int groupWidth, SafeToRender caption, HtmlWriter out, boolean alternate)
{
if (groupWidth <= 0)
return;
- out.write("\n");
- out.write(caption == null ? "" : caption);
- out.write(" | \n");
+ TH(
+ at(colspan, groupWidth).
+ cl("labkey-data-region labkey-pivot labkey-group-column-header").
+ cl(alternate,"labkey-alternate-col").
+ cl(isShowBorders(), "labkey-show-borders"),
+ caption
+ ).appendTo(out);
}
}
diff --git a/api/src/org/labkey/api/data/DataColumn.java b/api/src/org/labkey/api/data/DataColumn.java
index 5d4bd22ecac..1c4cf1d1ca9 100644
--- a/api/src/org/labkey/api/data/DataColumn.java
+++ b/api/src/org/labkey/api/data/DataColumn.java
@@ -52,6 +52,7 @@
import org.labkey.api.view.HttpView;
import org.labkey.api.view.TypeAheadSelectDisplayColumn;
import org.labkey.api.view.template.ClientDependency;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -324,7 +325,7 @@ public Class getDisplayValueClass()
}
@Override
- public void renderDetailsCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderDetailsCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
// By default, use the same rendering for both the details and grid views
renderGridCellContents(ctx, out);
@@ -341,14 +342,15 @@ public FieldKey getFilterKey()
}
@Override
- public void renderFilterOnClick(RenderContext ctx, Writer out) throws IOException
+ public String getFilterOnClick(RenderContext ctx)
{
if (_filterColumn == null)
- return;
+ return "";
String regionName = ctx.getCurrentRegion().getName();
String columnName = PageFlowUtil.jsString(_boundColumn.getFieldKey().toString());
- out.write(DataRegion.getJavaScriptObjectReference(regionName) + "._openFilter(" + columnName + ");");
+
+ return DataRegion.getJavaScriptObjectReference(regionName) + "._openFilter(" + columnName + ");";
}
@Override
@@ -371,7 +373,7 @@ public String getClearSortScript(RenderContext ctx)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
Object o = getValue(ctx);
@@ -415,15 +417,15 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
link.style(css);
}
- link.build().appendTo(out);
+ link.build().appendTo(oldWriter);
}
else
{
- formattedValue.appendTo(out);
+ formattedValue.appendTo(oldWriter);
}
}
else
- out.write(" ");
+ oldWriter.write(" ");
}
protected String renderURLorValueURL(RenderContext ctx)
@@ -631,7 +633,7 @@ protected String getStringValue(Object value, boolean disabledInput)
}
@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
{
if (_boundColumn.isVersionColumn() || _inputType.equalsIgnoreCase("none"))
return;
@@ -642,15 +644,15 @@ public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws
if (_boundColumn.isAutoIncrement())
{
- renderHiddenFormInput(ctx, out, formFieldName, value);
+ renderHiddenFormInput(out, formFieldName, value);
if (null != value)
{
- out.write(PageFlowUtil.filter(strVal));
+ oldWriter.write(PageFlowUtil.filter(strVal));
}
}
else if (_inputType.toLowerCase().startsWith("disabled"))
{
- renderTextFormInput(ctx, out, formFieldName, value, strVal, true);
+ renderTextFormInput(oldWriter, formFieldName, value, strVal, true);
}
else if (_inputType.toLowerCase().startsWith("select"))
{
@@ -660,42 +662,42 @@ else if (_inputType.toLowerCase().startsWith("select"))
displayColumn.renderInputHtml(ctx, out, value);
}
else
- renderSelectFormInputFromFk(ctx, out, formFieldName, value, strVal, disabledInput);
+ renderSelectFormInputFromFk(ctx, oldWriter, formFieldName, value, strVal, disabledInput);
}
else if (_inputType.equalsIgnoreCase("textarea"))
{
- renderTextAreaFormInput(ctx, out, formFieldName, value, strVal, disabledInput);
+ renderTextAreaFormInput(oldWriter, formFieldName, value, strVal, disabledInput);
}
else if (_inputType.equalsIgnoreCase("file"))
{
- renderFileFormInput(ctx, out, formFieldName, value, strVal, disabledInput);
+ renderFileFormInput(oldWriter, formFieldName, value, strVal, disabledInput);
}
else if (_inputType.equalsIgnoreCase("checkbox"))
{
- renderCheckboxFormInput(ctx, out, formFieldName, value, strVal, disabledInput);
+ renderCheckboxFormInput(oldWriter, formFieldName, value, strVal, disabledInput);
}
else
{
if (getAutoCompleteURLPrefix() != null)
{
- renderAutoCompleteFormInput(ctx, out, formFieldName, value, strVal, disabledInput, getAutoCompleteURLPrefix());
+ renderAutoCompleteFormInput(ctx, oldWriter, formFieldName, value, strVal, disabledInput, getAutoCompleteURLPrefix());
}
else
{
IPropertyValidator textChoiceValidator = PropertyService.get().getValidatorForColumn(_boundColumn, PropertyValidatorType.TextChoice);
if (textChoiceValidator != null)
- renderTextChoiceFormInput(ctx, out, formFieldName, value, strVal, disabledInput, textChoiceValidator);
+ renderTextChoiceFormInput(oldWriter, formFieldName, value, strVal, disabledInput, textChoiceValidator);
else
- renderTextFormInput(ctx, out, formFieldName, value, strVal, disabledInput);
+ renderTextFormInput(oldWriter, formFieldName, value, strVal, disabledInput);
}
}
HtmlString errors = getErrors(ctx);
if (!StringUtils.isEmpty(errors.toString()))
{
- out.write("");
- out.write(errors.toString());
- out.write("");
+ oldWriter.write("");
+ oldWriter.write(errors.toString());
+ oldWriter.write("");
}
}
@@ -709,7 +711,7 @@ else if (_inputType.equalsIgnoreCase("checkbox"))
}
private void renderSelectFormInput(
- RenderContext ctx, Writer out, String formFieldName, Object value, String strVal,
+ Writer out, String formFieldName, Object value, String strVal,
boolean disabledInput, NamedObjectList entryList
) throws IOException
{
@@ -727,8 +729,8 @@ private void renderSelectFormInput(
{
String entryName = entry.getName();
OptionBuilder option = new OptionBuilder()
- .selected(isSelectInputSelected(entryName, value, strVal))
- .value(entryName);
+ .selected(isSelectInputSelected(entryName, value, strVal))
+ .value(entryName);
if (null != entry.getObject())
option.label(getSelectInputDisplayValue(entry));
@@ -740,10 +742,10 @@ private void renderSelectFormInput(
// disabled inputs are not posted with the form, so we output a hidden form element:
if (disabledInput)
- renderHiddenFormInput(ctx, out, formFieldName, value);
+ renderHiddenFormInput(HtmlWriter.of(out), formFieldName, value);
}
- private void renderTextChoiceFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput, IPropertyValidator textChoiceValidator)
+ private void renderTextChoiceFormInput(Writer out, String formFieldName, Object value, String strVal, boolean disabledInput, IPropertyValidator textChoiceValidator)
throws IOException
{
NamedObjectList options = new NamedObjectList();
@@ -759,7 +761,7 @@ private void renderTextChoiceFormInput(RenderContext ctx, Writer out, String for
for (String choice : choices)
options.put(new SimpleNamedObject(choice, choice));
- renderSelectFormInput(ctx, out, formFieldName, value, strVal, disabledInput, options);
+ renderSelectFormInput(out, formFieldName, value, strVal, disabledInput, options);
}
protected void renderSelectFormInputFromFk(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
@@ -781,15 +783,15 @@ protected void renderSelectFormInputFromFk(RenderContext ctx, Writer out, String
displayValue = getDisplayValue(ctx);
String textInputValue = Objects.toString(displayValue, strVal);
- renderTextFormInput(ctx, out, formFieldName, value, textInputValue, disabledInput);
+ renderTextFormInput(out, formFieldName, value, textInputValue, disabledInput);
}
else
{
- renderSelectFormInput(ctx, out, formFieldName, value, strVal, disabledInput, entryList);
+ renderSelectFormInput(out, formFieldName, value, strVal, disabledInput, entryList);
}
}
- protected void renderFileFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
+ protected void renderFileFormInput(Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
throws IOException
{
var input = new Input.InputBuilder<>()
@@ -801,7 +803,7 @@ protected void renderFileFormInput(RenderContext ctx, Writer out, String formFie
out.write(input.build().toString());
}
- protected void renderCheckboxFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
+ protected void renderCheckboxFormInput(Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
throws IOException
{
boolean checked = ColumnInfo.booleanFromObj(ConvertUtils.convert(value));
@@ -830,10 +832,10 @@ protected void renderCheckboxFormInput(RenderContext ctx, Writer out, String for
out.write("\" value=\"1\">");
// disabled inputs are not posted with the form, so we output a hidden form element:
if (disabledInput)
- renderHiddenFormInput(ctx, out, formFieldName, checked ? "1" : "");
+ renderHiddenFormInput(HtmlWriter.of(out), formFieldName, checked ? "1" : "");
}
- protected void renderTextAreaFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
+ protected void renderTextAreaFormInput(Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
throws IOException
{
TextArea.TextAreaBuilder input = new TextArea.TextAreaBuilder()
@@ -847,10 +849,10 @@ protected void renderTextAreaFormInput(RenderContext ctx, Writer out, String for
// disabled inputs are not posted with the form, so we output a hidden form element:
if (disabledInput)
- renderHiddenFormInput(ctx, out, formFieldName, value);
+ renderHiddenFormInput(HtmlWriter.of(out), formFieldName, value);
}
- protected void renderTextFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
+ protected void renderTextFormInput(Writer out, String formFieldName, Object value, String strVal, boolean disabledInput)
throws IOException
{
var input = new Input.InputBuilder<>()
@@ -864,7 +866,7 @@ protected void renderTextFormInput(RenderContext ctx, Writer out, String formFie
// disabled inputs are not posted with the form, so we output a hidden form element:
if (disabledInput)
- renderHiddenFormInput(ctx, out, formFieldName, value);
+ renderHiddenFormInput(HtmlWriter.of(out), formFieldName, value);
}
protected void renderAutoCompleteFormInput(RenderContext ctx, Writer out, String formFieldName, Object value, String strVal, boolean disabledInput, @NotNull ActionURL autoCompleteURLPrefix)
@@ -924,71 +926,72 @@ public String getSortHandler(RenderContext ctx, Sort.SortDirection sort)
}
@Override
- public void renderTitle(RenderContext ctx, Writer out) throws IOException
- {
- String title = PageFlowUtil.filter(getTitle(ctx));
- if (title.isEmpty())
- {
- title = " ";
- }
- out.write(title);
- }
-
- @Override
- public String getTitle(RenderContext ctx)
+ public @Nullable HtmlString getTitle(RenderContext ctx)
{
+ // TODO: Treat null and empty the same instead?
if (_caption == null)
return null;
- return _caption.eval(ctx);
+ String title = _caption.eval(ctx);
+ return title.isEmpty() ? HtmlString.NBSP : HtmlString.of(title);
}
@Override
- public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException
+ public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls)
{
if (null == _caption)
return;
- out.write("");
-
- renderTitle(ctx, out);
- if (ctx.getMode() == DataRegion.MODE_DETAILS)
- out.write(":");
- int mode = ctx.getMode();
- if ((mode == DataRegion.MODE_INSERT || mode == DataRegion.MODE_UPDATE) && isEditable())
+ Writer oldWriter = out.unwrap();
+ try
{
- if (_boundColumn != null)
+ oldWriter.write(" | ");
+
+ HtmlString title = getTitle(ctx);
+ if (title != null)
+ oldWriter.write(title.toString());
+ if (ctx.getMode() == DataRegion.MODE_DETAILS)
+ oldWriter.write(":");
+ int mode = ctx.getMode();
+ if ((mode == DataRegion.MODE_INSERT || mode == DataRegion.MODE_UPDATE) && isEditable())
{
- List helpLines = new LinkedList<>()
+ if (_boundColumn != null)
{
- @Override
- public boolean add(String s)
+ List helpLines = new LinkedList<>()
{
- return super.add(PageFlowUtil.filter(s));
+ @Override
+ public boolean add(String s)
+ {
+ return super.add(PageFlowUtil.filter(s));
+ }
+ };
+ if (_boundColumn.getFriendlyTypeName() != null && !_inputType.toLowerCase().startsWith("select"))
+ {
+ helpLines.add("Type: " + _boundColumn.getFriendlyTypeName());
+ }
+ if (_boundColumn.getDescription() != null)
+ {
+ helpLines.add("Description: " + _boundColumn.getDescription());
+ }
+ for (IPropertyValidator validator : _boundColumn.getValidators())
+ helpLines.add("Validator: " + validator);
+ if (renderRequiredIndicators() && _boundColumn.isRequired() && !_boundColumn.isBooleanType())
+ {
+ oldWriter.write(" *");
+ helpLines.add("This field is required.");
+ }
+ if (!helpLines.isEmpty())
+ {
+ HtmlString helpHtml = HtmlString.unsafe(StringUtils.join(helpLines, " "));
+ PageFlowUtil.popupHelp(helpHtml, _boundColumn.getLabel()).appendTo(oldWriter);
}
- };
- if (_boundColumn.getFriendlyTypeName() != null && !_inputType.toLowerCase().startsWith("select"))
- {
- helpLines.add("Type: " + _boundColumn.getFriendlyTypeName());
- }
- if (_boundColumn.getDescription() != null)
- {
- helpLines.add("Description: " + _boundColumn.getDescription());
- }
- for (IPropertyValidator validator : _boundColumn.getValidators())
- helpLines.add("Validator: " + validator);
- if (renderRequiredIndicators() && _boundColumn.isRequired() && !_boundColumn.isBooleanType())
- {
- out.write(" *");
- helpLines.add("This field is required.");
- }
- if (!helpLines.isEmpty())
- {
- HtmlString helpHtml = HtmlString.unsafe(StringUtils.join(helpLines, " "));
- PageFlowUtil.popupHelp(helpHtml, _boundColumn.getLabel()).appendTo(out);
}
}
+ oldWriter.write(" | \n");
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
}
- out.write("\n");
}
protected boolean renderRequiredIndicators()
@@ -1008,7 +1011,7 @@ public void setEditable(boolean b)
}
@Override
- public void render(RenderContext ctx, Writer out) throws IOException
+ public void render(RenderContext ctx, HtmlWriter out)
{
if (ctx.getMode() == DataRegion.MODE_INSERT || ctx.getMode() == DataRegion.MODE_UPDATE)
renderInputHtml(ctx, out, getInputValue(ctx));
diff --git a/api/src/org/labkey/api/data/DataRegion.java b/api/src/org/labkey/api/data/DataRegion.java
index 092cc93f9a8..4c418c3259a 100644
--- a/api/src/org/labkey/api/data/DataRegion.java
+++ b/api/src/org/labkey/api/data/DataRegion.java
@@ -53,7 +53,6 @@
import org.labkey.api.util.DOM;
import org.labkey.api.util.DOM.Renderable;
import org.labkey.api.util.HtmlString;
-import org.labkey.api.util.HtmlStringBuilder;
import org.labkey.api.util.JavaScriptFragment;
import org.labkey.api.util.JunitUtil;
import org.labkey.api.util.PageFlowUtil;
@@ -961,12 +960,9 @@ protected void renderHeaderScript(RenderContext ctx, HtmlWriter out, Map\n");
-
- out.write(builder);
+ SCRIPT(
+ JavaScriptFragment.unsafe("LABKEY.DataRegion.create(" + dataRegionJSON.toString(2) + ");\n")
+ ).appendTo(out);
}
protected void renderTable(RenderContext ctx, HtmlWriter out) throws SQLException
@@ -1805,19 +1801,19 @@ protected void renderFormBegin(RenderContext ctx, HtmlWriter out, int mode)
protected void renderHiddenFormFields(RenderContext ctx, HtmlWriter out, int mode)
{
if (mode == MODE_GRID)
- out.write(new InputBuilder().type("hidden").name(DataRegionSelection.DATA_REGION_SELECTION_KEY).value(getSelectionKey()));
+ out.write(new InputBuilder<>().type("hidden").name(DataRegionSelection.DATA_REGION_SELECTION_KEY).value(getSelectionKey()));
out.write(new CsrfInput(ctx.getViewContext()));
for (FormField field : _hiddenFormFields)
{
- out.write(new InputBuilder().type("hidden").name(field.name()).value(field.value()));
+ out.write(new InputBuilder<>().type("hidden").name(field.name()).value(field.value()));
}
if (mode == MODE_UPDATE_MULTIPLE)
{
- out.write(new InputBuilder().type("hidden").name(TableViewForm.DATA_SUBMIT_NAME).value("true"));
- out.write(new InputBuilder().type("hidden").name(TableViewForm.BULK_UPDATE_NAME).value("true"));
+ out.write(new InputBuilder<>().type("hidden").name(TableViewForm.DATA_SUBMIT_NAME).value("true"));
+ out.write(new InputBuilder<>().type("hidden").name(TableViewForm.BULK_UPDATE_NAME).value("true"));
}
}
@@ -1842,7 +1838,7 @@ private void renderRecordSelector(RenderContext ctx, HtmlWriter out)
boolean enabled = isRecordSelectorEnabled(ctx);
boolean checked = isRecordSelectorChecked(ctx, checkboxValue);
- new InputBuilder()
+ new InputBuilder<>()
.type("checkbox")
.title("Select/unselect row")
.name(getRecordSelectorName(ctx))
@@ -1991,9 +1987,7 @@ private void renderDetails(RenderContext ctx, HtmlWriter out) throws SQLExceptio
TR(
(Renderable) rend -> {
renderer.renderDetailsCaptionCell(ctx, out, null);
- renderer.renderInputWrapperBegin(out);
- renderer.renderDetailsData(ctx, out);
- renderer.renderInputWrapperEnd(out);
+ renderer.renderDetailsCell(ctx, out);
return rend;
}
).appendTo(out);
@@ -2196,9 +2190,7 @@ private void renderFormField(RenderContext ctx, HtmlWriter out, DisplayColumn re
}
else
{
- renderer.renderInputWrapperBegin(out);
- renderer.renderDetailsData(ctx, out);
- renderer.renderInputWrapperEnd(out);
+ renderer.renderDetailsCell(ctx, out);
}
return ret;
}
@@ -2316,7 +2308,7 @@ private void renderForm(RenderContext ctx, HtmlWriter out)
if (null != pkVal)
{
out.write(
- new InputBuilder()
+ new InputBuilder<>()
.type("hidden")
.name(viewForm != null ? viewForm.getFormFieldName(pkCol) : pkColName)
.value(pkVal.toString())
@@ -2462,8 +2454,6 @@ private void renderForm(RenderContext ctx, HtmlWriter out)
}
}
- out.write(HtmlStringBuilder.of(HttpView.currentPageConfig().getScriptTagStart()));
-
StringWriter sw = new StringWriter();
for (DisplayColumnGroup group : groups)
{
@@ -2477,8 +2467,9 @@ private void renderForm(RenderContext ctx, HtmlWriter out)
}
}
- out.write(JavaScriptFragment.unsafe(sw.toString()));
- out.writeElementEnd(DOM.Element.script);
+ SCRIPT(
+ JavaScriptFragment.unsafe(sw.toString())
+ ).appendTo(out);
}
return app;
@@ -2503,7 +2494,7 @@ private HtmlWriter writeSameHeader(RenderContext ctx, HtmlWriter out, List()
.type("checkbox")
.id(madeId)
.name("~~SELECTALL~~")
@@ -2835,8 +2826,8 @@ private ContextAction createFilterAction(RenderContext ctx, List _clientDependencies = new LinkedHashSet<>();
// for URL generation
private String _url;
private StringExpression _urlExpression;
private StringExpression _urlCompiled;
+ private StringExpression _textExpression = null;
+ private StringExpression _textExpressionCompiled = null;
private StringExpression _urlTitle = null;
private StringExpression _urlTitleCompiled = null;
+ private RowSpanner _rowSpanner = DEFAULT_ROW_SPANNER;
+ private String _description = null;
+ private String _displayClass;
- protected Set _clientDependencies = new LinkedHashSet<>();
private final List _analyticsProviders = new ArrayList<>();
/** Handles spanning multiple rows in a grid. A separate interface to allow for easier mixing and matching with DisplayColumn implementations. */
@@ -128,16 +141,73 @@ public boolean shouldRenderInCurrentRow(RenderContext ctx)
}
};
- private RowSpanner _rowSpanner = DEFAULT_ROW_SPANNER;
+ /*
+ Note: DataRegion plus its subclasses and the vast majority of DisplayColumn (and subclasses) have been rewritten
+ to use HtmlWriter, DOM, and builders instead of String-based HTML generation. They also no longer throw
+ IOException. The three deprecated methods below that take both Writer and HtmlWriter are temporary, present only
+ until their overrides are migrated to use HtmlWriter, DOM, and builders, and adjusted to override the
+ corresponding non-Writer variant. Once migrated, the deprecated methods will be removed and the non-deprecated
+ variants will be made abstract.
+ */
- public abstract void renderGridCellContents(RenderContext ctx, Writer out) throws IOException;
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
+ {
+ try
+ {
+ renderGridCellContents(ctx, out.unwrap(), out);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
- public abstract void renderDetailsCellContents(RenderContext ctx, Writer out) throws IOException;
+ // No callers (other than just above)
+ @Deprecated
+ protected void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
+ {
+ throw new IllegalStateException("Must override renderGridCellContents()");
+ }
+ public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out)
+ {
+ try
+ {
+ renderDetailsCellContents(ctx, out.unwrap(), out);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // No callers (other than just above)
@Deprecated
- public abstract void renderTitle(RenderContext ctx, Writer out) throws IOException;
+ protected void renderDetailsCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
+ {
+ throw new IllegalStateException("Must override renderDetailsCellContents()");
+ }
- public String getTitle(RenderContext ctx)
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
+ {
+ try
+ {
+ renderInputHtml(ctx, out.unwrap(), out, value);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // No callers (other than just above)
+ @Deprecated
+ protected void renderInputHtml(RenderContext ctx, Writer oldWriter, HtmlWriter out, Object value) throws IOException
+ {
+ throw new IllegalStateException("Must override renderInputHtml()");
+ }
+
+ public @Nullable HtmlString getTitle(RenderContext ctx)
{
return null;
}
@@ -150,15 +220,6 @@ public String getTitle(RenderContext ctx)
public abstract boolean isEditable();
- public abstract void renderFilterOnClick(RenderContext ctx, Writer out) throws IOException;
-
- public abstract void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException;
-
- // Do nothing by default
- public void renderGridEnd(RenderContext ctx, Writer out) throws IOException
- {
- }
-
public String renderURL(RenderContext ctx)
{
StringExpression s = compileExpression(ctx.getViewContext());
@@ -193,7 +254,6 @@ public void setURLExpression(StringExpression se)
_urlCompiled = null;
}
-
public StringExpression getURLExpression()
{
return _urlExpression;
@@ -263,7 +323,6 @@ protected void addAnalyticsProvider(@NotNull ColumnAnalyticsProvider analyticsP
public abstract boolean isQueryColumn();
-
/** return a set of FieldKeys that this DisplayColumn depends on */
public void addQueryFieldKeys(Set keys)
{
@@ -318,7 +377,7 @@ public ColumnInfo getDisplayColumnInfo()
public abstract Object getValue(RenderContext ctx);
- public abstract Class getValueClass();
+ public abstract Class> getValueClass();
public Object getJsonValue(RenderContext ctx)
{
@@ -629,7 +688,7 @@ public Object getDisplayValue(RenderContext ctx)
return getValue(ctx);
}
- public Class getDisplayValueClass()
+ public Class> getDisplayValueClass()
{
return getValueClass();
}
@@ -671,18 +730,6 @@ public String getDefaultHeaderStyle()
return "";
}
- public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out)
- {
- try
- {
- renderGridHeaderCell(ctx, out.unwrap(), null);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
public boolean hasFilterKey(FieldKey fieldKey)
{
FieldKey fk = getFilterKey();
@@ -711,7 +758,12 @@ private Sort.SortField getSortColumn(Sort sort)
return null;
}
- public void renderGridHeaderCell(RenderContext ctx, Writer out, String headerClass) throws IOException
+ public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out)
+ {
+ renderGridHeaderCell(ctx, out, null);
+ }
+
+ public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out, String headerClass)
{
Sort sort = getSort(ctx);
Sort.SortField sortField = getSortColumn(sort);
@@ -723,33 +775,6 @@ public void renderGridHeaderCell(RenderContext ctx, Writer out, String headerCla
NavTree navTree = getPopupNavTree(ctx, baseId, sort, filtered);
boolean hasMenu = navTree != null;
- out.write("");
-
String style = getDefaultHeaderStyle();
if (style == null)
style = "";
// 34871: Support for column display width
if (!isBlank(getWidth()))
- style += ";width:" + getWidth() + "px;";
-
- out.write("");
-
- renderTitle(ctx, out);
-
- out.write(" ");
- out.write(" ");
- out.write(" ");
-
- if (hasMenu)
- {
- out.write(" ");
-
- // 31304: click target should fill the entire cell
- out.write(" ");
- out.write("");
- }
-
- out.write(" ");
- out.write(" | ");
+ style += "; width:" + getWidth() + "px;";
+
+ TH(
+ cl("labkey-column-header " + getGridHeaderClass()).
+ cl(hasMenu, "dropdown dropdown-rollup").
+ cl(sortField != null, () -> "labkey-sort-" + (sortField.getSortDirection() == Sort.SortDirection.ASC ? "asc" : "desc")).
+ cl(filtered, "labkey-filtered").
+ cl(headerClass).
+ cl(_displayClass).
+ cl(isPhiProtected(), "labkey-phi-protected").
+ at(!tooltip.isEmpty(), title, tooltip).
+ data("column-name", ctx.getCurrentRegion().getName() + ":" + columnName),
+
+ DIV(
+ at(!style.isEmpty(), DOM.Attribute.style, style),
+ getTitle(ctx),
+ SPAN(cl("fa fa-filter")),
+ SPAN(cl("fa fa-up")),
+ SPAN(cl("fa fa-down")),
+ (DOM.Renderable) ret -> {
+ if (hasMenu)
+ {
+ SPAN(
+ cl("fa fa-chevron-circle-down")
+ ).appendTo(out);
+ DIV(
+ cl("dropdown-toggle").data("toggle", "dropdown")
+ ).appendTo(out);
+ UL(
+ cl("dropdown-menu").at(!tooltip.isEmpty(), title, ""),
+ (DOM.Renderable) rend -> PopupMenuView.renderTree(navTree, out)
+ ).appendTo(out);
+ }
+ return ret;
+ }
+ )
+ ).appendTo(out);
}
private Sort getSort(RenderContext ctx)
@@ -889,9 +907,9 @@ private boolean isFiltered(RenderContext ctx)
}
return (null != this.getColumnInfo() &&
- (filteredColSet.contains(this.getColumnInfo().getFieldKey())) ||
- (this.getColumnInfo().getDisplayField() != null &&
- filteredColSet.contains(this.getColumnInfo().getDisplayField().getFieldKey())));
+ (filteredColSet.contains(this.getColumnInfo().getFieldKey())) ||
+ (this.getColumnInfo().getDisplayField() != null &&
+ filteredColSet.contains(this.getColumnInfo().getDisplayField().getFieldKey())));
}
return false;
}
@@ -1029,78 +1047,40 @@ public boolean isUserSort(RenderContext ctx)
return null != getSortColumn(userSort);
}
- public String getGridDataCell(RenderContext ctx)
- {
- StringWriter writer = new StringWriter();
- try
- {
- renderGridDataCell(ctx, writer);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
- }
-
- boolean foundHoverContent = false;
+ private boolean foundHoverContent = false;
public void renderGridDataCell(RenderContext ctx, HtmlWriter out)
- {
- try
- {
- renderGridDataCell(ctx, out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void renderGridDataCell(RenderContext ctx, Writer out) throws IOException
{
if (!_rowSpanner.shouldRenderInCurrentRow(ctx))
{
// An earlier row has covered this cell with a rowspan so no need to render any HTML
return;
}
- out.write(" 1)
- {
- out.write(" rowspan=\"" + rowSpan + "\"");
- }
- if (hoverContent != null)
- {
- out.write(" data-columntiptitle=\"" + PageFlowUtil.filter(getHoverTitle(ctx)) + "\"");
- out.write(" data-columntipcontent=\"" + PageFlowUtil.filter(hoverContent) + "\"");
- if (!foundHoverContent)
- {
- foundHoverContent=true;
- HttpView.currentPageConfig().addHandlerForQuerySelector("TD.lk-column-tt", "mouseover",
- "showHelpDivDelay(this, this.dataset['columntiptitle'], this.dataset['columntipcontent'], null, 1000);");
- HttpView.currentPageConfig().addHandlerForQuerySelector("TD.lk-column-tt", "mouseout", "return hideHelpDivDelay();");
+
+ TD(
+ cl(!isBlank(displayClass) || !isBlank(hoverContent), trimToEmpty(displayClass) + (!isBlank(hoverContent) ? " lk-column-tt" : "")).
+ at(align, _textAlign).at(!style.isEmpty(), DOM.Attribute.style, style).at(rowSpan > 1, rowspan, rowSpan).
+ data(hoverContent != null, "columntiptitle", getHoverTitle(ctx)).
+ data(hoverContent != null, "columntipcontent", hoverContent),
+ (DOM.Renderable) ret -> {
+ renderGridCellContents(ctx, out);
+ return ret;
}
+ ).appendTo(out);
+
+ if (hoverContent != null && !foundHoverContent)
+ {
+ PageConfig pageConfig = HttpView.currentPageConfig();
+ pageConfig.addHandlerForQuerySelector("TD.lk-column-tt", "mouseover",
+ "showHelpDivDelay(this, this.dataset['columntiptitle'], this.dataset['columntipcontent'], null, 1000);");
+ pageConfig.addHandlerForQuerySelector("TD.lk-column-tt", "mouseout", "return hideHelpDivDelay();");
+ foundHoverContent = true;
}
- out.write(">");
- renderGridCellContents(ctx, out);
- out.write(" | ");
}
protected String getHoverContent(RenderContext ctx)
@@ -1153,7 +1133,9 @@ public String getCaption(RenderContext ctx, boolean htmlEncode)
StringWriter writer = new StringWriter();
try
{
- renderTitle(ctx, writer);
+ HtmlString title = getTitle(ctx);
+ if (title != null)
+ writer.write(title.toString());
}
catch (Exception e)
{
@@ -1171,86 +1153,15 @@ public String getCaption(RenderContext ctx, boolean htmlEncode)
return _caption.getSource();
}
-
- public String getDetailsCaptionCell(RenderContext ctx)
- {
- StringWriter writer = new StringWriter();
- try
- {
- renderDetailsCaptionCell(ctx, writer, null);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
- }
-
public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls)
- {
- try
- {
- renderDetailsCaptionCell(ctx, out.unwrap(), cls);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException
{
if (null == _caption)
return;
- out.write("");
- renderTitle(ctx, out);
- out.write(" | ");
- }
-
- public String getDetailsData(RenderContext ctx)
- {
- StringWriter writer = new StringWriter();
- try
- {
- renderDetailsData(ctx, writer);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
- }
-
- public void renderDetailsData(RenderContext ctx, HtmlWriter out)
- {
- try
- {
- renderDetailsData(ctx, out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void renderDetailsData(RenderContext ctx, Writer out) throws IOException
- {
- renderDetailsCellContents(ctx, out);
- }
-
- public String getInputCell(RenderContext ctx)
- {
- StringWriter writer = new StringWriter();
- try
- {
- renderInputCell(ctx, writer);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
+ TD(
+ cl("lk-form-label"),
+ getTitle(ctx)
+ ).appendTo(out);
}
/** Get typed value or string value if form type conversion failed. */
@@ -1284,85 +1195,39 @@ public String getFormFieldName(RenderContext ctx)
return getName();
}
- protected void outputName(RenderContext ctx, Writer out, String formFieldName) throws IOException
- {
- out.write(" name=\"");
- out.write(PageFlowUtil.filter(formFieldName));
- out.write("\"");
-
- String setFocusId = (String)ctx.get("setFocusId");
- if (null != setFocusId)
- {
- out.write(" id=\"" + PageFlowUtil.filter(setFocusId) + "\"");
- ctx.remove("setFocusId");
- }
- }
-
- public void renderHiddenFormInput(RenderContext ctx, Writer out) throws IOException
+ protected void renderHiddenFormInput(HtmlWriter out, String formFieldName, Object value)
{
- renderHiddenFormInput(ctx, out, getFormFieldName(ctx), getInputValue(ctx));
- }
-
- protected void renderHiddenFormInput(RenderContext ctx, Writer out, String formFieldName, Object value) throws IOException
- {
- out.write(new Input.InputBuilder()
+ out.write(new InputBuilder<>()
.name(formFieldName)
.type("hidden")
- .value(null != value ? value.toString() : null)
- .toString());
- }
-
- public void renderInputWrapperBegin(HtmlWriter out)
- {
- try
- {
- renderInputWrapperBegin(out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void renderInputWrapperBegin(Writer out) throws IOException
- {
- out.write("");
- }
-
- public void renderInputWrapperEnd(HtmlWriter out)
- {
- try
- {
- renderInputWrapperEnd(out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
+ .value(null != value ? value.toString() : null));
}
- public void renderInputWrapperEnd(Writer out) throws IOException
+ public DOM._Attributes getInputAttributes()
{
- out.write(" | ");
+ return at();
}
public void renderInputCell(RenderContext ctx, HtmlWriter out)
{
- try
- {
- renderInputCell(ctx, out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
+ TD(
+ getInputAttributes(),
+ (DOM.Renderable) ret -> {
+ renderInputHtml(ctx, out, getInputValue(ctx));
+ return ret;
+ }
+ ).appendTo(out);
}
- public void renderInputCell(RenderContext ctx, Writer out) throws IOException
+ public void renderDetailsCell(RenderContext ctx, HtmlWriter out)
{
- renderInputWrapperBegin(out);
- renderInputHtml(ctx, out, getInputValue(ctx));
- renderInputWrapperEnd(out);
+ TD(
+ getInputAttributes(),
+ (DOM.Renderable) ret -> {
+ renderDetailsCellContents(ctx, out);
+ return ret;
+ }
+ ).appendTo(out);
}
public String getSortHandler(RenderContext ctx, Sort.SortDirection sort)
@@ -1370,19 +1235,7 @@ public String getSortHandler(RenderContext ctx, Sort.SortDirection sort)
return "";
}
- public String getFilterOnClick(RenderContext ctx)
- {
- StringWriter writer = new StringWriter();
- try
- {
- renderFilterOnClick(ctx, writer);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
- }
+ public abstract String getFilterOnClick(RenderContext ctx);
public String getClearFilter(RenderContext ctx)
{
@@ -1394,21 +1247,6 @@ public String getClearSortScript(RenderContext ctx)
return "";
}
- public String getInputHtml(RenderContext ctx)
- {
- Object value = getInputValue(ctx);
- StringWriter writer = new StringWriter();
- try
- {
- renderInputHtml(ctx, writer, value);
- }
- catch (Exception e)
- {
- writer.write(e.getMessage());
- }
- return writer.toString();
- }
-
public boolean getRequiresHtmlFiltering()
{
return _requiresHtmlFiltering;
diff --git a/api/src/org/labkey/api/data/DisplayColumnDecorator.java b/api/src/org/labkey/api/data/DisplayColumnDecorator.java
index 5719934c467..a72477f17e6 100644
--- a/api/src/org/labkey/api/data/DisplayColumnDecorator.java
+++ b/api/src/org/labkey/api/data/DisplayColumnDecorator.java
@@ -16,6 +16,8 @@
package org.labkey.api.data;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.labkey.api.query.FieldKey;
@@ -25,9 +27,6 @@
import org.labkey.api.util.StringExpression;
import org.labkey.api.view.ActionURL;
import org.labkey.api.view.ViewContext;
-
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
@@ -36,10 +35,6 @@
import java.util.Map;
import java.util.Set;
-/**
- * User: kevink
- * Date: Nov 20, 2008 4:25:54 PM
- */
public class DisplayColumnDecorator extends DisplayColumn
{
protected DisplayColumn _column;
@@ -50,35 +45,23 @@ public DisplayColumnDecorator(DisplayColumn column)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
_column.renderGridCellContents(ctx, out);
}
@Override
- public void renderDetailsCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out)
{
_column.renderDetailsCellContents(ctx, out);
}
@Override
- public void renderTitle(RenderContext ctx, Writer out) throws IOException
- {
- _column.renderTitle(ctx, out);
- }
-
- @Override
- public String getTitle(RenderContext ctx)
+ public HtmlString getTitle(RenderContext ctx)
{
return _column.getTitle(ctx);
}
- @Override
- public void renderGridEnd(RenderContext ctx, Writer out) throws IOException
- {
- _column.renderGridEnd(ctx, out);
- }
-
@Override
public boolean isSortable()
{
@@ -98,13 +81,7 @@ public boolean isEditable()
}
@Override
- public void renderFilterOnClick(RenderContext ctx, Writer out) throws IOException
- {
- _column.renderFilterOnClick(ctx, out);
- }
-
- @Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
_column.renderInputHtml(ctx, out, value);
}
@@ -319,7 +296,7 @@ public Object getDisplayValue(RenderContext ctx)
}
@Override
- public Class getDisplayValueClass()
+ public Class> getDisplayValueClass()
{
return _column.getDisplayValueClass();
}
@@ -379,7 +356,7 @@ public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out)
}
@Override
- public void renderGridHeaderCell(RenderContext ctx, Writer out, String headerClass) throws IOException
+ public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out, String headerClass)
{
_column.renderGridHeaderCell(ctx, out, headerClass);
}
@@ -390,12 +367,6 @@ public boolean isUserSort(RenderContext ctx)
return _column.isUserSort(ctx);
}
- @Override
- public String getGridDataCell(RenderContext ctx)
- {
- return _column.getGridDataCell(ctx);
- }
-
@NotNull
@Override
public String getCssStyle(RenderContext ctx)
@@ -422,35 +393,11 @@ public String getCaption(RenderContext ctx, boolean htmlEncode)
}
@Override
- public String getDetailsCaptionCell(RenderContext ctx)
- {
- return _column.getDetailsCaptionCell(ctx);
- }
-
- @Override
- public void renderDetailsCaptionCell(RenderContext ctx, Writer out, @Nullable String cls) throws IOException
+ public void renderDetailsCaptionCell(RenderContext ctx, HtmlWriter out, @Nullable String cls)
{
_column.renderDetailsCaptionCell(ctx, out, cls);
}
- @Override
- public String getDetailsData(RenderContext ctx)
- {
- return _column.getDetailsData(ctx);
- }
-
- @Override
- public void renderDetailsData(RenderContext ctx, Writer out) throws IOException
- {
- _column.renderDetailsData(ctx, out);
- }
-
- @Override
- public String getInputCell(RenderContext ctx)
- {
- return _column.getInputCell(ctx);
- }
-
@Override
protected Object getInputValue(RenderContext ctx)
{
@@ -464,27 +411,21 @@ public String getFormFieldName(RenderContext ctx)
}
@Override
- protected void outputName(RenderContext ctx, Writer out, String formFieldName) throws IOException
- {
- _column.outputName(ctx, out, formFieldName);
- }
-
- @Override
- public void renderHiddenFormInput(RenderContext ctx, Writer out) throws IOException
+ protected void renderHiddenFormInput(HtmlWriter out, String formFieldName, Object value)
{
- _column.renderHiddenFormInput(ctx, out);
+ _column.renderHiddenFormInput(out, formFieldName, value);
}
@Override
- protected void renderHiddenFormInput(RenderContext ctx, Writer out, String formFieldName, Object value) throws IOException
+ public void renderInputCell(RenderContext ctx, HtmlWriter out)
{
- _column.renderHiddenFormInput(ctx, out, formFieldName, value);
+ _column.renderInputCell(ctx, out);
}
@Override
- public void renderInputCell(RenderContext ctx, Writer out) throws IOException
+ public void renderDetailsCell(RenderContext ctx, HtmlWriter out)
{
- _column.renderInputCell(ctx, out);
+ _column.renderDetailsCell(ctx, out);
}
@Override
@@ -511,12 +452,6 @@ public String getClearSortScript(RenderContext ctx)
return _column.getClearSortScript(ctx);
}
- @Override
- public String getInputHtml(RenderContext ctx)
- {
- return _column.getInputHtml(ctx);
- }
-
@Override
public boolean getRequiresHtmlFiltering()
{
diff --git a/api/src/org/labkey/api/data/DisplayColumnGroup.java b/api/src/org/labkey/api/data/DisplayColumnGroup.java
index 796b72fe7fb..251f8be7f03 100644
--- a/api/src/org/labkey/api/data/DisplayColumnGroup.java
+++ b/api/src/org/labkey/api/data/DisplayColumnGroup.java
@@ -16,6 +16,8 @@
package org.labkey.api.data;
+import org.labkey.api.util.DOM;
+import org.labkey.api.util.element.Input.InputBuilder;
import org.labkey.api.view.HttpView;
import org.labkey.api.writer.HtmlWriter;
@@ -23,6 +25,8 @@
import java.io.Writer;
import java.util.List;
+import static org.labkey.api.util.DOM.TD;
+
public class DisplayColumnGroup
{
private final List _columns;
@@ -53,41 +57,33 @@ public boolean isCopyable()
public void writeSameCheckboxCell(RenderContext ctx, HtmlWriter out)
{
- try
- {
- writeSameCheckboxCell(ctx, out.unwrap());
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
+ TD(
+ isCopyable() ? (DOM.Renderable) ret -> {
- public void writeSameCheckboxCell(RenderContext ctx, Writer out) throws IOException
- {
- out.write("");
- if (isCopyable())
- {
- String id = getGroupFormFieldName(ctx) + "CheckBox";
- out.write("");
- StringBuilder onChange = new StringBuilder("b = this.checked;");
- for (int i = 1; i < getColumns().size(); i++)
- {
- DisplayColumn col = getColumns().get(i);
- ColumnInfo colInfo = col.getColumnInfo();
- if (colInfo != null)
- {
- onChange.append("document.getElementsByName('")
- .append(col.getFormFieldName(ctx))
- .append("')[0].style.display = b ? 'none' : 'block';\n");
- }
- }
- onChange.append(" if (b) { ")
- .append(getGroupFormFieldName(ctx))
- .append("Updated(); }");
- HttpView.currentPageConfig().addHandler(id, "change", onChange.toString());
- }
- out.write(" | ");
+ String id = getGroupFormFieldName(ctx) + "CheckBox";
+ new InputBuilder<>().type("checkbox").name(id).id(id).appendTo(out);
+ StringBuilder onChange = new StringBuilder("b = this.checked;");
+
+ getColumns().forEach(col -> {
+ ColumnInfo colInfo = col.getColumnInfo();
+ if (colInfo != null)
+ {
+ onChange.append("document.getElementsByName('")
+ .append(col.getFormFieldName(ctx))
+ .append("')[0].style.display = b ? 'none' : 'block';\n");
+ }
+ });
+
+ onChange.append(" if (b) { ")
+ .append(getGroupFormFieldName(ctx))
+ .append("Updated(); }");
+
+ HttpView.currentPageConfig().addHandler(id, "change", onChange.toString());
+
+ return ret;
+ } :
+ null
+ ).appendTo(out);
}
private String getGroupFormFieldName(RenderContext ctx)
diff --git a/api/src/org/labkey/api/data/HighlightingDisplayColumn.java b/api/src/org/labkey/api/data/HighlightingDisplayColumn.java
index 21d65614eec..880c621db81 100644
--- a/api/src/org/labkey/api/data/HighlightingDisplayColumn.java
+++ b/api/src/org/labkey/api/data/HighlightingDisplayColumn.java
@@ -17,6 +17,7 @@
package org.labkey.api.data;
import org.labkey.api.query.FieldKey;
+import org.labkey.api.util.DOM;
import org.labkey.api.util.UniqueID;
import org.labkey.api.view.HttpView;
import org.labkey.api.view.template.PageConfig;
@@ -28,11 +29,9 @@
import java.util.LinkedHashMap;
import java.util.List;
-/*
-* User: adam
-* Date: Dec 19, 2010
-* Time: 8:38:17 PM
-*/
+import static org.labkey.api.util.DOM.SPAN;
+import static org.labkey.api.util.DOM.cl;
+
public class HighlightingDisplayColumn extends DisplayColumnDecorator
{
private final LinkedHashMap, String> _distinctValuesToClass = new LinkedHashMap<>();
@@ -115,7 +114,7 @@ public void renderGridHeaderCell(RenderContext ctx, HtmlWriter out)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
if (!handlersAdded)
{
@@ -131,16 +130,19 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
}
String styleClass = getStyleClass(ctx);
- out.write("");
- super.renderGridCellContents(ctx, out);
- out.write("");
+ SPAN(
+ cl(styleClass, _cssEventSelector),
+ (DOM.Renderable) ret -> {
+ super.renderGridCellContents(ctx, out);
+ return ret;
+ }
+ ).appendTo(out);
}
- @Override
+ // Note: Nobody calls this method! It must have been orphaned in DisplayColumn / DataColumn a while back.
+ // I'm leaving the code in place in case we want to restore it...
public void renderGridEnd(RenderContext ctx, Writer out) throws IOException
{
- super.renderGridEnd(ctx, out);
-
String styleMapName = "styleMap" + _uid;
String lockedStylesName = "lockedStyles" + _uid;
diff --git a/api/src/org/labkey/api/data/IconDisplayColumn.java b/api/src/org/labkey/api/data/IconDisplayColumn.java
index 7f784edf6d1..5c6eef07992 100644
--- a/api/src/org/labkey/api/data/IconDisplayColumn.java
+++ b/api/src/org/labkey/api/data/IconDisplayColumn.java
@@ -19,6 +19,7 @@
import org.jetbrains.annotations.NotNull;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.view.ActionURL;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -70,14 +71,14 @@ public boolean isSortable()
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
ActionURL linkURL = _linkURL.clone();
Object value = ctx.getRow().get(getColumnInfo().getAlias());
if (value != null)
{
linkURL.addParameter(_parameterName, value.toString());
- out.write("
");
+ oldWriter.write("
");
}
}
}
diff --git a/api/src/org/labkey/api/data/InputColumn.java b/api/src/org/labkey/api/data/InputColumn.java
index 7718a99a0ce..2e9cad2f146 100644
--- a/api/src/org/labkey/api/data/InputColumn.java
+++ b/api/src/org/labkey/api/data/InputColumn.java
@@ -15,14 +15,13 @@
*/
package org.labkey.api.data;
+import org.labkey.api.writer.HtmlWriter;
+
import java.io.IOException;
import java.io.Writer;
/**
* Renders a bound ColumnInfo as an HTML form input in a grid view.
- *
- * User: kevink
- * Date: 10/21/12
*/
public class InputColumn extends DataColumn
{
@@ -32,13 +31,13 @@ public InputColumn(ColumnInfo col)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
renderInputHtml(ctx, out, getInputValue(ctx));
}
@Override
- public void render(RenderContext ctx, Writer out) throws IOException
+ public void render(RenderContext ctx, HtmlWriter out)
{
renderInputHtml(ctx, out, getInputValue(ctx));
}
diff --git a/api/src/org/labkey/api/data/JavaScriptDisplayColumn.java b/api/src/org/labkey/api/data/JavaScriptDisplayColumn.java
index 420a5c2bdb6..6df2c612cc7 100644
--- a/api/src/org/labkey/api/data/JavaScriptDisplayColumn.java
+++ b/api/src/org/labkey/api/data/JavaScriptDisplayColumn.java
@@ -23,6 +23,7 @@
import org.labkey.api.util.Link.LinkBuilder;
import org.labkey.api.util.StringExpressionFactory;
import org.labkey.api.view.template.ClientDependency;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
@@ -63,7 +64,7 @@ public JavaScriptDisplayColumn(ColumnInfo col, @Nullable Collection depe
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException
{
Object o = getValue(ctx);
@@ -74,10 +75,10 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
if (_onClickExpression != null)
onClick = StringUtils.trim(_onClickExpression.eval(ctx));
- renderLink(out, getFormattedHtml(ctx), onClick, _linkClassName);
+ renderLink(oldWriter, getFormattedHtml(ctx), onClick, _linkClassName);
}
else
- out.write(" ");
+ oldWriter.write(" ");
}
protected void renderLink(Writer out, HtmlString html, @Nullable String onClick, @Nullable String linkClassName)
diff --git a/api/src/org/labkey/api/data/MVDisplayColumn.java b/api/src/org/labkey/api/data/MVDisplayColumn.java
index 66c744df087..19d0aa512bc 100644
--- a/api/src/org/labkey/api/data/MVDisplayColumn.java
+++ b/api/src/org/labkey/api/data/MVDisplayColumn.java
@@ -20,11 +20,18 @@
import org.labkey.api.util.HtmlString;
import org.labkey.api.util.HtmlStringBuilder;
import org.labkey.api.util.PageFlowUtil;
+import org.labkey.api.writer.HtmlWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Set;
+import static org.labkey.api.util.DOM.Attribute.style;
+import static org.labkey.api.util.DOM.DIV;
+import static org.labkey.api.util.DOM.FONT;
+import static org.labkey.api.util.DOM.at;
+import static org.labkey.api.util.DOM.cl;
+
/**
* Column type that renders an indicator if there is an associated missing value indicator to accompany the normal
* value. There is a discrete, configured list of allowable indicators, on a per-container basis. See {@link MvUtil}.
@@ -64,7 +71,7 @@ public Object getRawValue(RenderContext ctx)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
String mvIndicator = getMvIndicator(ctx);
if (mvIndicator != null)
@@ -78,9 +85,10 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
.append(value)
.unsafeAppend("'.
");
- out.write("");
- PageFlowUtil.popupHelp(popupText, "Missing Value Indicator: " + mvIndicator).link(HtmlString.of(mvIndicator)).appendTo(out);
- out.write("");
+ FONT(
+ cl("labkey-mv"),
+ PageFlowUtil.popupHelp(popupText, "Missing Value Indicator: " + mvIndicator).link(HtmlString.of(mvIndicator))
+ ).appendTo(out);
}
else
{
@@ -114,8 +122,8 @@ public Object getValue(RenderContext ctx)
@Override
public Object getDisplayValue(RenderContext ctx)
{
- // For non-mv-aware clients, we need to return null
- // if we have an mv indicator
+ // For non-MV-aware clients, we need to return null
+ // if we have an MV indicator
if (getMvIndicator(ctx) != null)
{
return null;
@@ -168,39 +176,61 @@ else if (ctx.getRow() != null)
}
@Override
- public void renderInputHtml(RenderContext ctx, Writer out, Object value) throws IOException
+ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value)
{
- out.write("");
+ DIV(at(style,"margin-top:5px")).appendTo(out);
super.renderInputHtml(ctx, out, value);
- renderMVPicker(ctx, out);
+ try
+ {
+ renderMVPicker(ctx, out);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
}
- private void renderMVPicker(RenderContext ctx, Writer out) throws IOException
+ private void renderMVPicker(RenderContext ctx, HtmlWriter out) throws IOException
{
+ Writer oldWriter = out.unwrap();
String formFieldName = ctx.getForm().getFormFieldName(mvIndicatorColumn);
String selectedMvIndicator = getMvIndicator(ctx);
Set mvIndicators = MvUtil.getMvIndicators(ctx.getContainer());
- out.write("Missing Value Indicator: ");
- out.write("");
+ oldWriter.write("");
// disabled inputs are not posted with the form, so we output a hidden form element:
//if (isDisabledInput())
// renderHiddenFormInput(ctx, out, formFieldName, value);
}
+
+ private void outputName(RenderContext ctx, Writer out, String formFieldName) throws IOException
+ {
+ out.write(" name=\"");
+ out.write(PageFlowUtil.filter(formFieldName));
+ out.write("\"");
+
+ String setFocusId = (String)ctx.get("setFocusId");
+ if (null != setFocusId)
+ {
+ out.write(" id=\"" + PageFlowUtil.filter(setFocusId) + "\"");
+ ctx.remove("setFocusId");
+ }
+ }
}
diff --git a/api/src/org/labkey/api/data/MultiValuedDisplayColumn.java b/api/src/org/labkey/api/data/MultiValuedDisplayColumn.java
index 5051786a67f..e6a79a4d1e9 100644
--- a/api/src/org/labkey/api/data/MultiValuedDisplayColumn.java
+++ b/api/src/org/labkey/api/data/MultiValuedDisplayColumn.java
@@ -18,9 +18,8 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.labkey.api.query.FieldKey;
+import org.labkey.api.writer.HtmlWriter;
-import java.io.IOException;
-import java.io.Writer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -32,9 +31,6 @@
/**
* Wraps any DisplayColumn and causes it to render each value separately. Often used in conjunction with
* MultiValuedLookupColumn
- *
- * User: adam
- * Date: Sep 14, 2010
*/
public class MultiValuedDisplayColumn extends DisplayColumnDecorator implements IMultiValuedDisplayColumn
{
@@ -125,7 +121,7 @@ public List renderURLs(RenderContext ctx)
}
@Override
- public void renderGridCellContents(RenderContext ctx, Writer out) throws IOException
+ public void renderGridCellContents(RenderContext ctx, HtmlWriter out)
{
try
{
@@ -139,7 +135,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
Object o = getValue(mvCtx);
if (o != null)
{
- out.append(sep);
+ out.write(sep);
super.renderGridCellContents(mvCtx, out);
sep = ", ";
}
@@ -155,13 +151,7 @@ public void renderGridCellContents(RenderContext ctx, Writer out) throws IOExcep
}
@Override
- public void renderDetailsData(RenderContext ctx, Writer out) throws IOException
- {
- renderGridCellContents(ctx, out);
- }
-
- @Override
- public Class getDisplayValueClass()
+ public Class getDisplayValueClass()
{
return String.class;
}
@@ -208,14 +198,6 @@ public List