diff --git a/announcements/src/org/labkey/announcements/announcementWebPartWithExpandos.jsp b/announcements/src/org/labkey/announcements/announcementWebPartWithExpandos.jsp index a86c9008d02..4322dc4b7ed 100644 --- a/announcements/src/org/labkey/announcements/announcementWebPartWithExpandos.jsp +++ b/announcements/src/org/labkey/announcements/announcementWebPartWithExpandos.jsp @@ -223,7 +223,7 @@ for (AnnouncementModel a : bean.announcementModels) } if (!bean.isPrint) { - %><%=link("view " + bean.settings.getConversationName().toLowerCase() + (null != bean.insertURL ? " or respond" : "")).href(a.getThreadURL(c).addParameter("rowId", a.getRowId()))%><% + %><%=link("view " + bean.settings.getConversationName().toLowerCase() + (null != bean.insertURL ? " or respond" : ""), a.getThreadURL(c).addParameter("rowId", a.getRowId()))%><% } } %> diff --git a/api/src/org/labkey/api/action/LabKeyErrorWithLink.java b/api/src/org/labkey/api/action/LabKeyErrorWithLink.java index 98d18f53bf8..a7b0b846d8a 100644 --- a/api/src/org/labkey/api/action/LabKeyErrorWithLink.java +++ b/api/src/org/labkey/api/action/LabKeyErrorWithLink.java @@ -28,7 +28,7 @@ public HtmlString renderToHTML(ViewContext context) if (adviceHref != null) { builder.append(" "); - builder.append(new LinkBuilder(getAdviceText()).href(getAdviceHref()).clearClasses()); + builder.append(LinkBuilder.simpleLink(getAdviceText(), getAdviceHref())); } return builder.getHtmlString(); diff --git a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java index 09b3dac4581..220693657b4 100644 --- a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java +++ b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java @@ -19,9 +19,7 @@ import org.jetbrains.annotations.NotNull; import org.junit.Assert; import org.junit.Test; -import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.DataColumn; -import org.labkey.api.data.DisplayColumn; import org.labkey.api.data.DisplayColumnFactory; import org.labkey.api.data.JdbcType; import org.labkey.api.data.RenderContext; @@ -48,16 +46,12 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.labkey.api.util.PageFlowUtil.jsString; -/** - * User: jeckels - * Date: Dec 12, 2011 - */ public class AssayQCFlagColumn extends ExprColumn { public static final String NAME = "QCFlags"; - private String _schemaName; - private boolean _editable; + private final String _schemaName; + private final boolean _editable; public AssayQCFlagColumn(ExpRunTable parent, String schemaName, boolean editable) { @@ -70,62 +64,55 @@ public AssayQCFlagColumn(ExpRunTable parent, String schemaName, boolean editable @Override public DisplayColumnFactory getDisplayColumnFactory() { - return new DisplayColumnFactory() + return colInfo -> new DataColumn(colInfo) { + @NotNull + @Override + public Set getClientDependencies() + { + return new LinkedHashSet<>(Arrays.asList( + ClientDependency.fromPath("clientapi/ext3"), + ClientDependency.fromPath("experiment/QCFlagToggleWindow.js") + )); + } + @Override - public DisplayColumn createRenderer(ColumnInfo colInfo) + public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException { - return new DataColumn(colInfo) + String strValue = (String)getValue(ctx); + if (isNotBlank(strValue)) { - @NotNull - @Override - public Set getClientDependencies() - { - return new LinkedHashSet<>(Arrays.asList( - ClientDependency.fromPath("clientapi/ext3"), - ClientDependency.fromPath("experiment/QCFlagToggleWindow.js") - )); - } - - @Override - public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) throws IOException - { - String strValue = (String)getValue(ctx); - if (isNotBlank(strValue)) - { - String[] values = strValue.split(","); - Boolean[] enabled = parseBooleans(values, ctx.get(getEnabledFieldKey(), String.class)); - Integer runId = ctx.get(getRunRowIdFieldKey(), Integer.class); - - // add onclick handler to call the QCFlag toggle window creation function - // users with update perm will be able to change enabled state and edit comment, others will only be able to read flag details - LinkBuilder linkBuilder = new LinkBuilder(getCollapsedQCFlagOutput(values, enabled)) - .onClick("showQCFlagToggleWindow(" + jsString(_schemaName) + ", " + runId + "," + _editable + "); return false;"); - oldWriter.write(linkBuilder.toString()); - } - else - { - oldWriter.write(" "); - } - } - - @Override - public void addQueryFieldKeys(Set keys) - { - keys.add(getEnabledFieldKey()); - keys.add(getRunRowIdFieldKey()); - } - - private FieldKey getEnabledFieldKey() - { - return new FieldKey(getBoundColumn().getFieldKey().getParent(), "QCFlagsEnabled"); - } - - private FieldKey getRunRowIdFieldKey() - { - return new FieldKey(getBoundColumn().getFieldKey().getParent(), "RowId"); - } - }; + String[] values = strValue.split(","); + Boolean[] enabled = parseBooleans(values, ctx.get(getEnabledFieldKey(), String.class)); + Integer runId = ctx.get(getRunRowIdFieldKey(), Integer.class); + + // add onclick handler to call the QCFlag toggle window creation function + // users with update perm will be able to change enabled state and edit comment, others will only be able to read flag details + LinkBuilder linkBuilder = new LinkBuilder(getCollapsedQCFlagOutput(values, enabled)) + .onClick("showQCFlagToggleWindow(" + jsString(_schemaName) + ", " + runId + "," + _editable + "); return false;"); + oldWriter.write(linkBuilder.toString()); + } + else + { + oldWriter.write(" "); + } + } + + @Override + public void addQueryFieldKeys(Set keys) + { + keys.add(getEnabledFieldKey()); + keys.add(getRunRowIdFieldKey()); + } + + private FieldKey getEnabledFieldKey() + { + return new FieldKey(getBoundColumn().getFieldKey().getParent(), "QCFlagsEnabled"); + } + + private FieldKey getRunRowIdFieldKey() + { + return new FieldKey(getBoundColumn().getFieldKey().getParent(), "RowId"); } }; } diff --git a/api/src/org/labkey/api/assay/AssayView.java b/api/src/org/labkey/api/assay/AssayView.java index c3e693ce0a4..548a60a1ee9 100644 --- a/api/src/org/labkey/api/assay/AssayView.java +++ b/api/src/org/labkey/api/assay/AssayView.java @@ -25,6 +25,7 @@ import org.labkey.api.query.QueryView; import org.labkey.api.security.permissions.AdminPermission; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; import org.labkey.api.view.HtmlView; @@ -61,7 +62,7 @@ public void setupViews(QueryView queryView, boolean minimizeLinks, AssayProvider if (container.hasPermission(getViewContext().getUser(), AdminPermission.class)) { ActionURL url = PageFlowUtil.urlProvider(PipelineUrls.class).urlSetup(container); - html.append(PageFlowUtil.link("setup pipeline", url)); + html.append(LinkBuilder.labkeyLink("setup pipeline", url)); } else html.append(" Please ask an administrator for assistance."); diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index ca03044d0a0..c0dd7eb050d 100644 --- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java +++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java @@ -1213,7 +1213,7 @@ public HtmlString getErrors(String paramName) { sb.append("
"); String script = "uploadWizard_showPopup('extraErrors', 'All Errors', " + PageFlowUtil.jsString(msgBox.toString()) + "); return false;"; - sb.append(new LinkBuilder("Too many errors to display (click to show all).").id("extraErrors").onClick(script).getHtmlString()); + sb.append(LinkBuilder.labkeyLink("Too many errors to display (click to show all).").id("extraErrors").onClick(script).getHtmlString()); sb.append("
"); } return sb.getHtmlString(); diff --git a/api/src/org/labkey/api/assay/actions/assayHeader.jsp b/api/src/org/labkey/api/assay/actions/assayHeader.jsp index f02a3ee4212..70311039e84 100644 --- a/api/src/org/labkey/api/assay/actions/assayHeader.jsp +++ b/api/src/org/labkey/api/assay/actions/assayHeader.jsp @@ -46,7 +46,7 @@ String url = link.getHref(); boolean active = current.getLocalURIString().equals(url); %> - <%= unsafe(active ? "" : "") %><%= link(link.getText()).href(url) %><%= unsafe(active ? "" : "") %> + <%= unsafe(active ? "" : "") %><%= link(link.getText(), url) %><%= unsafe(active ? "" : "") %> <% } else diff --git a/api/src/org/labkey/api/data/CrosstabDataRegion.java b/api/src/org/labkey/api/data/CrosstabDataRegion.java index 0a1346fa687..624444804f8 100644 --- a/api/src/org/labkey/api/data/CrosstabDataRegion.java +++ b/api/src/org/labkey/api/data/CrosstabDataRegion.java @@ -134,7 +134,7 @@ protected SafeToRender getMemberCaptionWithUrl(String caption, String url) { if (url != null) { - return new LinkBuilder(caption).href(url); + return LinkBuilder.simpleLink(caption, url); } return HtmlString.of(caption); diff --git a/api/src/org/labkey/api/data/DataColumn.java b/api/src/org/labkey/api/data/DataColumn.java index 0a67b311026..afa138aca2a 100644 --- a/api/src/org/labkey/api/data/DataColumn.java +++ b/api/src/org/labkey/api/data/DataColumn.java @@ -392,7 +392,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit if (StringUtils.isNotBlank(url)) { - LinkBuilder link = new LinkBuilder(formattedValue).href(url).clearClasses(); + LinkBuilder link = LinkBuilder.simpleLink(formattedValue).href(url); String linkTitle = renderURLTitle(ctx); if (null != linkTitle) diff --git a/api/src/org/labkey/api/data/UrlColumn.java b/api/src/org/labkey/api/data/UrlColumn.java index e25fa8d6181..2d8f1b06627 100644 --- a/api/src/org/labkey/api/data/UrlColumn.java +++ b/api/src/org/labkey/api/data/UrlColumn.java @@ -16,6 +16,7 @@ package org.labkey.api.data; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.StringExpression; import org.labkey.api.view.ActionURL; @@ -46,6 +47,6 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit String url = renderURL(ctx); if (value != null && url != null) - oldWriter.write(PageFlowUtil.link(value.toString()).href(url).target(_linkTarget).toString()); + oldWriter.write(LinkBuilder.labkeyLink(value.toString(), url).target(_linkTarget).toString()); } } diff --git a/api/src/org/labkey/api/data/queryprofiler/QueryProfiler.java b/api/src/org/labkey/api/data/queryprofiler/QueryProfiler.java index 860218f16a9..d7384150846 100644 --- a/api/src/org/labkey/api/data/queryprofiler/QueryProfiler.java +++ b/api/src/org/labkey/api/data/queryprofiler/QueryProfiler.java @@ -410,10 +410,10 @@ public HttpView getStackTraceView(final String sqlHash, final ActionURLFactor Arrays.stream(ExecutionPlanType.values()). filter(tracker::canShowExecutionPlan). map(type -> DOM.DIV( - new LinkBuilder("Show " + type.getDescription()). - href(executeFactory.getActionURL(tracker.getHash()).addParameter("type", type.name())).build(), - ExecutionPlanType.Actual == type ? DOM.DIV(new LinkBuilder("Log " + type.getDescription() + " to primary site log"). - href(executeFactory.getActionURL(tracker.getHash()).addParameter("type", type.name()).addParameter("log", true)).build()) : null + LinkBuilder.labkeyLink("Show " + type.getDescription(), + executeFactory.getActionURL(tracker.getHash()).addParameter("type", type.name())).build(), + ExecutionPlanType.Actual == type ? DOM.DIV(LinkBuilder.labkeyLink("Log " + type.getDescription() + " to primary site log", + executeFactory.getActionURL(tracker.getHash()).addParameter("type", type.name()).addParameter("log", true)).build()) : null )), DOM.BR(), tracker.renderStackTraces() @@ -425,7 +425,7 @@ public HttpView getStackTraceView(final String sqlHash, final ActionURLFactor private LinkBuilder.Link copyToClipboardLink(String linkId, String targetId) { - return new LinkBuilder("copy to clipboard"). + return LinkBuilder.labkeyLink("copy to clipboard"). onClick("return false;"). id(linkId). attributes(Collections.singletonMap("data-clipboard-target", "#" + targetId)). diff --git a/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java b/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java index 16e172d26f9..c6d6adbdc0c 100644 --- a/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java +++ b/api/src/org/labkey/api/defaults/SetDefaultValuesAction.java @@ -39,6 +39,7 @@ import org.labkey.api.util.DOM.Renderable; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.URLHelper; import org.labkey.api.view.ActionURL; @@ -321,7 +322,7 @@ public HttpView getView(FormType domainIdForm, boolean reshow, BindException err if (!domain.getContainer().equals(getContainer()) && domain.getContainer().hasPermission(getUser(), AdminPermission.class)) { ActionURL url = buildSetInheritedDefaultsURL(domain, domainIdForm); - headerHtml.append(PageFlowUtil.link("edit default values for this table in " + PageFlowUtil.filter(domain.getContainer().getPath()), url)); + headerHtml.append(LinkBuilder.labkeyLink("edit default values for this table in " + PageFlowUtil.filter(domain.getContainer().getPath()), url)); } headerHtml.unsafeAppend("

Default values set here will be inherited by all sub-folders that use this table and do not specify their own defaults.

"); diff --git a/api/src/org/labkey/api/jsp/JspBase.java b/api/src/org/labkey/api/jsp/JspBase.java index 922b833e0c0..22c7298d790 100644 --- a/api/src/org/labkey/api/jsp/JspBase.java +++ b/api/src/org/labkey/api/jsp/JspBase.java @@ -443,7 +443,7 @@ public LinkBuilder iconLink(String iconCls, String tooltip, URLHelper url) public LinkBuilder link(String text) { - return new LinkBuilder(text); + return LinkBuilder.labkeyLink(text); } public LinkBuilder link(Renderable html) @@ -460,12 +460,12 @@ public LinkBuilder link(String text, @NotNull Class action // Link to a URLHelper public LinkBuilder link(String text, @NotNull URLHelper url) { - return link(text).href(url); + return LinkBuilder.labkeyLink(text, url); } public LinkBuilder link(String text, @NotNull String url) { - return link(text).href(url); + return LinkBuilder.labkeyLink(text, url); } public LinkBuilder link(Renderable html, @NotNull URLHelper url) @@ -473,12 +473,36 @@ public LinkBuilder link(Renderable html, @NotNull URLHelper url) return new LinkBuilder(html).href(url); } + // Simple, unstyled link + public LinkBuilder simpleLink(String text) + { + return LinkBuilder.simpleLink(text); + } + // Simple, unstyled link public LinkBuilder simpleLink(String text, @NotNull URLHelper url) { return LinkBuilder.simpleLink(text, url); } + // Simple, unstyled link + public LinkBuilder simpleLink(String text, @NotNull String url) + { + return LinkBuilder.simpleLink(text, url); + } + + // Simple, unstyled link + public LinkBuilder simpleLink(Renderable html) + { + return LinkBuilder.simpleLink(html); + } + + // Simple, unstyled link + public LinkBuilder simpleLink(Renderable html, @NotNull URLHelper url) + { + return LinkBuilder.simpleLink(html, url); + } + public InputBuilder input() { return new InputBuilder<>(); diff --git a/api/src/org/labkey/api/query/QueryView.java b/api/src/org/labkey/api/query/QueryView.java index a639c322647..0df9e4ebc03 100644 --- a/api/src/org/labkey/api/query/QueryView.java +++ b/api/src/org/labkey/api/query/QueryView.java @@ -84,6 +84,7 @@ import org.labkey.api.util.ExceptionUtil; import org.labkey.api.util.FileUtil; import org.labkey.api.util.GUID; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.ResponseHelper; @@ -393,7 +394,7 @@ protected void renderErrors(PrintWriter out, String message, List"); diff --git a/api/src/org/labkey/api/reports/report/view/redirectReportWebPart.jsp b/api/src/org/labkey/api/reports/report/view/redirectReportWebPart.jsp index 56cdd186d22..252b56138db 100644 --- a/api/src/org/labkey/api/reports/report/view/redirectReportWebPart.jsp +++ b/api/src/org/labkey/api/reports/report/view/redirectReportWebPart.jsp @@ -60,7 +60,7 @@ <% if (type != null) { %> Type:<%=h(type)%> <% } %> <% if (description != null) { %> Description:<%=h(description)%> <% } %> - <%=link("view report").href(url).target(report.getRunReportTarget())%> + <%=link("view report", url).target(report.getRunReportTarget())%>
diff --git a/api/src/org/labkey/api/security/AuthenticationManager.java b/api/src/org/labkey/api/security/AuthenticationManager.java index df3e413805f..75bbae0cc80 100644 --- a/api/src/org/labkey/api/security/AuthenticationManager.java +++ b/api/src/org/labkey/api/security/AuthenticationManager.java @@ -1636,7 +1636,7 @@ public LinkFactory(SSOAuthenticationConfiguration <% addHandler("textTypeId", "click", "document.getElementById('SQVPicker').style.display='none'; document.getElementById('ThawListDiv-TextArea').style.display='block'; toggleDisableResetDefault(true);"); %> value="<%= unsafe(ThawListResolverType.TEXT_NAMESPACE_SUFFIX) %>"> - Paste a sample list as a TSV (tab-separated values)<%= helpPopup("Sample Lookup", HtmlString.unsafe("A lookup lets you assign a mapping from your own specimen numbers to participants and visits. The format is a tab-separated values (TSV), requiring the columns 'Index' and using the values of the columns 'SpecimenID', 'ParticipantID', and 'VisitID', and 'Date'. All columns headers are required, even if the fields are not populated.

To use the template, fill in the values, select the entire spreadsheet (Ctrl-A), copy it to the clipboard, and paste it into the text area below.")) %> <%=link("download template").href(request.getContextPath()+"/study/assay/SampleLookupTemplate.xls")%> + Paste a sample list as a TSV (tab-separated values)<%= helpPopup("Sample Lookup", HtmlString.unsafe("A lookup lets you assign a mapping from your own specimen numbers to participants and visits. The format is a tab-separated values (TSV), requiring the columns 'Index' and using the values of the columns 'SpecimenID', 'ParticipantID', and 'VisitID', and 'Date'. All columns headers are required, even if the fields are not populated.

To use the template, fill in the values, select the entire spreadsheet (Ctrl-A), copy it to the clipboard, and paste it into the text area below.")) %> <%=link("download template", request.getContextPath()+"/study/assay/SampleLookupTemplate.xls")%> diff --git a/api/src/org/labkey/api/study/query/SourceDataLinkDisplayColumn.java b/api/src/org/labkey/api/study/query/SourceDataLinkDisplayColumn.java index 59d2beac785..e375b312caa 100644 --- a/api/src/org/labkey/api/study/query/SourceDataLinkDisplayColumn.java +++ b/api/src/org/labkey/api/study/query/SourceDataLinkDisplayColumn.java @@ -22,6 +22,7 @@ import org.labkey.api.exp.api.ExpObject; import org.labkey.api.exp.api.ExpSampleType; import org.labkey.api.study.Dataset; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; import org.labkey.api.writer.HtmlWriter; @@ -67,7 +68,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) case Assay -> { ActionURL runURL = new ActionURL(AssayDetailRedirectAction.class, ctx.getContainer()); runURL.addParameter("runId", sourceId); - out.write(PageFlowUtil.link("View Run").href(runURL)); + out.write(LinkBuilder.labkeyLink("View Run", runURL)); } case SampleType -> { ExpObject expObject = _publishSource.resolvePublishSource(sourceId); @@ -77,7 +78,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) // by default the container is where the sample definition lives, use the current container instead so // the user is returned to the original folder that the link was attempted from. url.setContainer(ctx.getContainer()); - out.write(PageFlowUtil.link("View Sample Type").href(url)); + out.write(LinkBuilder.labkeyLink("View Sample Type", url)); } } } diff --git a/api/src/org/labkey/api/util/ErrorRenderer.java b/api/src/org/labkey/api/util/ErrorRenderer.java index c2c02a50bfe..8cc9a2c247b 100644 --- a/api/src/org/labkey/api/util/ErrorRenderer.java +++ b/api/src/org/labkey/api/util/ErrorRenderer.java @@ -141,7 +141,7 @@ public void renderContent(PrintWriter out, HttpServletRequest request, @Nullable if (!showDetails) { - out.println("

" + PageFlowUtil.link("Show more details").href("#details") + "
\n" + + out.println("

" + LinkBuilder.labkeyLink("Show more details", "#details") + "
\n" + "
"); HttpView.currentPageConfig().addHandler("togglePanel", "click", "document.getElementById('contentPanel').style.display='block'; document.getElementById('togglePanel').style.display='none';"); } diff --git a/api/src/org/labkey/api/util/HelpTopic.java b/api/src/org/labkey/api/util/HelpTopic.java index 43c6497c14f..5ff4032debb 100644 --- a/api/src/org/labkey/api/util/HelpTopic.java +++ b/api/src/org/labkey/api/util/HelpTopic.java @@ -117,7 +117,7 @@ public HtmlString getLinkHtml(String displayText) private LinkBuilder getLink(String displayText) { - return PageFlowUtil.link(displayText).href(getHelpTopicHref()).target(TARGET_NAME).rel("noopener noreferrer"); + return LinkBuilder.labkeyLink(displayText, getHelpTopicHref()).target(TARGET_NAME).rel("noopener noreferrer"); } // Create a NavTree for a menu item that links to the help topic, displaying the provided text, using the standard target, etc. diff --git a/api/src/org/labkey/api/util/LinkBuilder.java b/api/src/org/labkey/api/util/LinkBuilder.java index 6cd3e1a06d7..a3dac18da84 100644 --- a/api/src/org/labkey/api/util/LinkBuilder.java +++ b/api/src/org/labkey/api/util/LinkBuilder.java @@ -19,15 +19,51 @@ public class LinkBuilder extends DisplayElementBuilder { // Simple unstyled link -- replacement for hand-coded tags - public static LinkBuilder simpleLink(String text, @NotNull URLHelper url) + public static LinkBuilder simpleLink(@NotNull String text) { - return new LinkBuilder(text).href(url).clearClasses(); + return new LinkBuilder(text).clearClasses(); + } + + // Simple unstyled link -- replacement for hand-coded tags + public static LinkBuilder simpleLink(@NotNull String text, @NotNull URLHelper url) + { + return simpleLink(text).href(url); + } + + // Simple unstyled link -- replacement for hand-coded tags + public static LinkBuilder simpleLink(@NotNull String text, @NotNull String url) + { + return simpleLink(text).href(url); + } + + // Simple unstyled link -- replacement for hand-coded tags + public static LinkBuilder simpleLink(@NotNull DOM.Renderable html) + { + return new LinkBuilder(html).clearClasses(); + } + + // Simple unstyled link -- replacement for hand-coded tags + public static LinkBuilder simpleLink(@NotNull DOM.Renderable html, @NotNull URLHelper url) + { + return simpleLink(html).href(url); + } + + // Standard LabKey-styled text link + public static LinkBuilder labkeyLink(@NotNull String text) + { + return new LinkBuilder(text); + } + + // Standard LabKey-styled text link + public static LinkBuilder labkeyLink(@NotNull String text, @NotNull URLHelper url) + { + return labkeyLink(text).href(url); } // Standard LabKey-styled text link - public static LinkBuilder labkeyLink(String text, @NotNull URLHelper url) + public static LinkBuilder labkeyLink(@NotNull String text, @NotNull String url) { - return new LinkBuilder(text).href(url); + return labkeyLink(text).href(url); } public LinkBuilder() @@ -35,6 +71,7 @@ public LinkBuilder() cssClass = "labkey-text-link"; } + // Use factory methods above TODO: Make private public LinkBuilder(@NotNull String text) { this(HtmlString.of(text)); diff --git a/api/src/org/labkey/api/util/PageFlowUtil.java b/api/src/org/labkey/api/util/PageFlowUtil.java index dc4020d6a0d..8daa412dc9d 100644 --- a/api/src/org/labkey/api/util/PageFlowUtil.java +++ b/api/src/org/labkey/api/util/PageFlowUtil.java @@ -1343,14 +1343,16 @@ public static ButtonBuilder button(String text) return new ButtonBuilder(text); } + @Deprecated(forRemoval = true) // Use LinkBuilder.simpleLink() or LinkBuilder.labkeyLink() instead public static LinkBuilder link(String text) { - return new LinkBuilder(text); + return LinkBuilder.labkeyLink(text); } + @Deprecated(forRemoval = true) // Use LinkBuilder.simpleLink() or LinkBuilder.labkeyLink() instead public static LinkBuilder link(String text, URLHelper url) { - return new LinkBuilder(text).href(url); + return LinkBuilder.labkeyLink(text, url); } public static LinkBuilder iconLink(String iconCls, @Nullable String tooltip) diff --git a/api/src/org/labkey/api/view/DataView.java b/api/src/org/labkey/api/view/DataView.java index e5dcf16cb7b..e1e1e1503c7 100644 --- a/api/src/org/labkey/api/view/DataView.java +++ b/api/src/org/labkey/api/view/DataView.java @@ -34,6 +34,7 @@ import org.labkey.api.query.QueryParseException; import org.labkey.api.security.User; import org.labkey.api.util.ExceptionUtil; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.template.ClientDependency; import org.labkey.api.writer.HtmlWriter; @@ -257,7 +258,7 @@ private void renderErrors(PrintWriter writer, String message, List"); diff --git a/api/src/org/labkey/api/view/NavTree.java b/api/src/org/labkey/api/view/NavTree.java index e4fe89ccc63..00f6bf20244 100644 --- a/api/src/org/labkey/api/view/NavTree.java +++ b/api/src/org/labkey/api/view/NavTree.java @@ -679,7 +679,7 @@ public static StringBuilder toJS(Collection list, @Nullable StringBuild public LinkBuilder toSimpleLinkBuilder() { // Copy key properties. We could copy others, if needed by future code paths. - LinkBuilder lb = new LinkBuilder(_text).href(_href).onClick(_script); + LinkBuilder lb = LinkBuilder.simpleLink(_text, _href).onClick(_script); if (_usePost) lb.usePost(_confirmMessage); @@ -755,13 +755,12 @@ public LinkBuilder toLinkBuilder(@Nullable String cls) } } - LinkBuilder builder = new LinkBuilder(html) + LinkBuilder builder = LinkBuilder.simpleLink(html) .id(config.makeId("popupMenuView")) .target(getTarget()) .title(getDescription()) .tabindex(0) .enabled(!isDisabled()) - .clearClasses() .href(null != href && !isPost() ? href : "#") .onClick(getScript()); diff --git a/api/src/org/labkey/api/view/Overview.java b/api/src/org/labkey/api/view/Overview.java index 9699102edfb..2049b2993c9 100644 --- a/api/src/org/labkey/api/view/Overview.java +++ b/api/src/org/labkey/api/view/Overview.java @@ -23,6 +23,7 @@ import org.labkey.api.util.HasHtmlString; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import java.util.ArrayList; @@ -293,7 +294,7 @@ public HtmlString getHtmlString() ret.unsafeAppend(""); if (_url != null) { - ret.append(PageFlowUtil.link(_label).href(_url)); + ret.append(LinkBuilder.labkeyLink(_label, _url)); } else { diff --git a/api/src/org/labkey/api/view/PopupMenu.java b/api/src/org/labkey/api/view/PopupMenu.java index b7d290af31d..3b002f35975 100644 --- a/api/src/org/labkey/api/view/PopupMenu.java +++ b/api/src/org/labkey/api/view/PopupMenu.java @@ -21,6 +21,7 @@ import org.labkey.api.data.RenderContext; import org.labkey.api.util.ButtonBuilder; import org.labkey.api.util.DOM; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.UniqueID; import org.labkey.api.writer.HtmlWriter; @@ -142,7 +143,7 @@ public void renderMenuButton(@Nullable RenderContext ctx, HtmlWriter out, boolea if (_buttonStyle == ButtonStyle.TEXTBUTTON) { assert !requiresSelection : "Only button-style popups can require selection."; - out.write(PageFlowUtil.link(_navTree.getText()).onClick(onClickScript).attributes(attributes).addClass("dropdown-toggle")); + out.write(LinkBuilder.labkeyLink(_navTree.getText()).onClick(onClickScript).attributes(attributes).addClass("dropdown-toggle")); } else if (_buttonStyle == ButtonStyle.MENUBUTTON) { diff --git a/api/src/org/labkey/api/view/PopupMenuView.java b/api/src/org/labkey/api/view/PopupMenuView.java index 4d0323aad91..4779730d642 100644 --- a/api/src/org/labkey/api/view/PopupMenuView.java +++ b/api/src/org/labkey/api/view/PopupMenuView.java @@ -136,16 +136,14 @@ public static HtmlWriter renderTree(NavTree tree, HtmlWriter out) LI( cl("dropdown-submenu"), - new LinkBuilder(HtmlStringBuilder.of(child.getText()).append(DOM.createHtmlFragment(I(cl("fa fa-chevron-right"))))) - .clearClasses() + LinkBuilder.simpleLink(HtmlStringBuilder.of(child.getText()).append(DOM.createHtmlFragment(I(cl("fa fa-chevron-right"))))) .addClass("subexpand") .addClass("subexpand-icon") .tabindex(0), UL( cl("dropdown-layer-menu"), LI( - new LinkBuilder(HtmlStringBuilder.of(DOM.createHtmlFragment(I(cl("fa fa-chevron-left")))).append(child.getText())) - .clearClasses() + LinkBuilder.simpleLink(HtmlStringBuilder.of(DOM.createHtmlFragment(I(cl("fa fa-chevron-left")))).append(child.getText())) .addClass("subcollapse") .tabindex(0) ), diff --git a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java index 86620eef229..12040e7ae65 100644 --- a/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java +++ b/assay/api-src/org/labkey/api/assay/plate/PlateSampleFilePropertyHelper.java @@ -40,6 +40,7 @@ import org.labkey.api.study.assay.SampleMetadataInputFormat; import org.labkey.api.util.HtmlString; import org.labkey.api.util.JavaScriptFragment; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.InputBuilder; import org.labkey.api.view.HttpView; @@ -357,7 +358,7 @@ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value) String nounV2 = includesViruses ? "Sample and virus" : "Sample"; out.write(nounV2 + " metadata should be uploaded in a TSV, CSV or Excel file with one row per " + nounV1.toLowerCase() + ". "); - out.write(PageFlowUtil.link("Download template", PageFlowUtil.urlProvider(NabUrls.class).getSampleXLSTemplateURL(_container, _protocol))); + out.write(LinkBuilder.labkeyLink("Download template", PageFlowUtil.urlProvider(NabUrls.class).getSampleXLSTemplateURL(_container, _protocol))); out.write(HtmlString.BR); if (reshowFile != null) diff --git a/assay/src/org/labkey/assay/plate/view/plateList.jsp b/assay/src/org/labkey/assay/plate/view/plateList.jsp index e8cbce9e12d..507ed74a8e2 100644 --- a/assay/src/org/labkey/assay/plate/view/plateList.jsp +++ b/assay/src/org/labkey/assay/plate/view/plateList.jsp @@ -154,12 +154,12 @@ { Integer runCount = plateRunCount.get(plate); - LinkBuilder editLink = new LinkBuilder("edit"); + LinkBuilder editLink = LinkBuilder.labkeyLink("edit"); if (runCount > 0) { editLink.tooltip("Plate template is used by " + runCount + " runs and can't be edited") - .clearClasses() - .addClass("labkey-disabled-text-link"); + .clearClasses() + .addClass("labkey-disabled-text-link"); } else { @@ -198,12 +198,12 @@ { if (plates.size() > 1) { - LinkBuilder deleteLink = new LinkBuilder("delete"); + LinkBuilder deleteLink = LinkBuilder.labkeyLink("delete"); if (runCount > 0) { deleteLink.tooltip("Plate template is used by " + runCount + " runs and can't be deleted") - .clearClasses() - .addClass("labkey-disabled-text-link"); + .clearClasses() + .addClass("labkey-disabled-text-link"); } else { diff --git a/assay/src/org/labkey/assay/query/TypeDisplayColumn.java b/assay/src/org/labkey/assay/query/TypeDisplayColumn.java index 47060d376cf..4a208c4d1b1 100644 --- a/assay/src/org/labkey/assay/query/TypeDisplayColumn.java +++ b/assay/src/org/labkey/assay/query/TypeDisplayColumn.java @@ -30,6 +30,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.query.FieldKey; import org.labkey.api.security.permissions.DeletePermission; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.writer.HtmlWriter; @@ -89,7 +90,7 @@ else if (protocol != null) if (protocol.getContainer().hasPermissions(ctx.getViewContext().getUser(), Set.of(DesignAssayPermission.class, DeletePermission.class))) { out.write(" "); - out.write(PageFlowUtil.link("Delete Assay Design", PageFlowUtil.urlProvider(ExperimentUrls.class).getDeleteProtocolURL(protocol, PageFlowUtil.urlProvider(AssayUrls.class).getAssayListURL(ctx.getContainer())))); + out.write(LinkBuilder.labkeyLink("Delete Assay Design", PageFlowUtil.urlProvider(ExperimentUrls.class).getDeleteProtocolURL(protocol, PageFlowUtil.urlProvider(AssayUrls.class).getAssayListURL(ctx.getContainer())))); } return; } diff --git a/core/src/org/labkey/core/admin/AdminController.java b/core/src/org/labkey/core/admin/AdminController.java index 95586b603b0..d5431443a0d 100644 --- a/core/src/org/labkey/core/admin/AdminController.java +++ b/core/src/org/labkey/core/admin/AdminController.java @@ -3190,8 +3190,8 @@ public ModelAndView getView(MemForm form, BindException errors) HtmlStringBuilder html = HtmlStringBuilder.of(); - html.append(PageFlowUtil.link("Clear Caches and Refresh", getCachesURL(true, false))); - html.append(PageFlowUtil.link("Refresh", getCachesURL(false, false))); + html.append(LinkBuilder.labkeyLink("Clear Caches and Refresh", getCachesURL(true, false))); + html.append(LinkBuilder.labkeyLink("Refresh", getCachesURL(false, false))); html.unsafeAppend("

\n"); appendStats(html, "Caches", cacheStats, false); @@ -3262,7 +3262,7 @@ private void appendStats(HtmlStringBuilder html, String title, List appendLongs(html, limit, maxSize, stat.getSize(), stat.getGets(), stat.getMisses(), stat.getPuts(), stat.getExpirations(), stat.getEvictions(), stat.getRemoves(), stat.getClears()); appendDoubles(html, stat.getMissRatio()); - html.unsafeAppend("").append(PageFlowUtil.link("Clear", getCacheURL(stat.getDescription()))).unsafeAppend("\n"); + html.unsafeAppend("").append(LinkBuilder.labkeyLink("Clear", getCacheURL(stat.getDescription()))).unsafeAppend("\n"); if (null != limit && maxSize >= limit) html.unsafeAppend("This cache has been limited"); @@ -8998,7 +8998,7 @@ public ModelAndView getView(ModulesForm form, BindException errors) ActionURL url = new ActionURL(ModulesAction.class, ContainerManager.getRoot()); url.addParameter("ignore", "0.00," + lowestSchemaVersion); url.addParameter("managedOnly", true); - managedLink = PageFlowUtil.link("Click here to ignore null, " + lowestSchemaVersion + " and unmanaged modules").href(url).getHtmlString(); + managedLink = LinkBuilder.labkeyLink("Click here to ignore null, " + lowestSchemaVersion + " and unmanaged modules", url).getHtmlString(); } else { @@ -9017,7 +9017,7 @@ public ModelAndView getView(ModulesForm form, BindException errors) { ActionURL url = new ActionURL(ModulesAction.class, ContainerManager.getRoot()); url.addParameter("unmanagedOnly", true); - unmanagedLink = PageFlowUtil.link("Click here to show unmanaged modules only").href(url).getHtmlString(); + unmanagedLink = LinkBuilder.labkeyLink("Click here to show unmanaged modules only", url).getHtmlString(); } else { @@ -9034,7 +9034,7 @@ public ModelAndView getView(ModulesForm form, BindException errors) "To delete a module that does not have a delete link, first delete its .module file and exploded module directory from your Labkey deployment directory, and restart the server. " + "Module files are typically deployed in /modules and /externalModules.") .unsafeAppend("

").append( - PageFlowUtil.link("Create new empty module").href(getCreateURL())); + LinkBuilder.labkeyLink("Create new empty module", getCreateURL())); } HtmlStringBuilder docLink = HtmlStringBuilder.of(); @@ -9154,9 +9154,9 @@ protected void renderView(Object model, PrintWriter out) TD(SPAN(at(title,className), className.substring(className.lastIndexOf(".")+1))), TD(SPAN(at(title,fullPathToModule),shortPathToModule)), TD(schemas.stream().map(s -> createHtmlFragment(s, BR()))), - !AppProps.getInstance().isDevMode() ? null : TD((null == moduleEditorUrl) ? NBSP : PageFlowUtil.link("Edit module").href(moduleEditorUrl)), - null == externalModulesDir ? null : TD(!replaceableModule ? NBSP : PageFlowUtil.link("Upload Module").href(getUpdateURL(moduleContext.getName()))), - !hasAdminOpsPerm ? null : TD(!deleteableModule ? NBSP : PageFlowUtil.link("Delete Module" + (schemas.isEmpty() ? "" : (" and Schema" + (schemas.size() > 1 ? "s" : "")))).href(getDeleteURL(moduleContext.getName()))) + !AppProps.getInstance().isDevMode() ? null : TD((null == moduleEditorUrl) ? NBSP : LinkBuilder.labkeyLink("Edit module", moduleEditorUrl)), + null == externalModulesDir ? null : TD(!replaceableModule ? NBSP : LinkBuilder.labkeyLink("Upload Module", getUpdateURL(moduleContext.getName()))), + !hasAdminOpsPerm ? null : TD(!deleteableModule ? NBSP : LinkBuilder.labkeyLink("Delete Module" + (schemas.isEmpty() ? "" : (" and Schema" + (schemas.size() > 1 ? "s" : ""))), getDeleteURL(moduleContext.getName()))) ); }) ) diff --git a/core/src/org/labkey/core/admin/addNewExternalSource.jsp b/core/src/org/labkey/core/admin/addNewExternalSource.jsp index bfb4c705c7c..4f779b04bdd 100644 --- a/core/src/org/labkey/core/admin/addNewExternalSource.jsp +++ b/core/src/org/labkey/core/admin/addNewExternalSource.jsp @@ -85,7 +85,7 @@

For more information on the security concern, refer to the - <%=link("OWASP cheat sheet", "https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#cross-origin-resource-sharing").target("_owasp").clearClasses()%>. + <%=simpleLink("OWASP cheat sheet", "https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#cross-origin-resource-sharing").target("_owasp")%>.

<% diff --git a/core/src/org/labkey/core/admin/admin.jsp b/core/src/org/labkey/core/admin/admin.jsp index 618914dc7da..2c7c8efff01 100644 --- a/core/src/org/labkey/core/admin/admin.jsp +++ b/core/src/org/labkey/core/admin/admin.jsp @@ -213,7 +213,7 @@ <%=h(entry.getKey())%> <% if (url != null) { %> - <%=link(entry.getValue()).href(url)%> + <%=link(entry.getValue(), url)%> <% } else { %> <%=h(entry.getValue())%> <% } %> diff --git a/core/src/org/labkey/core/admin/sql/SqlScriptController.java b/core/src/org/labkey/core/admin/sql/SqlScriptController.java index 66ad0761073..ec9122e4661 100644 --- a/core/src/org/labkey/core/admin/sql/SqlScriptController.java +++ b/core/src/org/labkey/core/admin/sql/SqlScriptController.java @@ -57,6 +57,7 @@ import org.labkey.api.settings.AppProps; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.TestContext; @@ -226,18 +227,18 @@ public ModelAndView getView(ScriptsForm form, BindException errors) throws Excep if (AppProps.getInstance().isDevMode()) { if (form.isManagedOnly()) - html.append(PageFlowUtil.link("show all modules").href(new ActionURL(ScriptsAction.class, ContainerManager.getRoot()))); + html.append(LinkBuilder.labkeyLink("show all modules", new ActionURL(ScriptsAction.class, ContainerManager.getRoot()))); else - html.append(PageFlowUtil.link("show only managed modules").href(new ActionURL(ScriptsAction.class, ContainerManager.getRoot()).addParameter("managedOnly", true))); + html.append(LinkBuilder.labkeyLink("show only managed modules", new ActionURL(ScriptsAction.class, ContainerManager.getRoot()).addParameter("managedOnly", true))); - html.append(PageFlowUtil.link("consolidate scripts").href(new ActionURL(ConsolidateScriptsAction.class, ContainerManager.getRoot()))); - html.append(PageFlowUtil.link("orphaned scripts").href(new ActionURL(OrphanedScriptsAction.class, ContainerManager.getRoot()))); - html.append(PageFlowUtil.link("scripts with errors").href(new ActionURL(ScriptsWithErrorsAction.class, ContainerManager.getRoot()))); + html.append(LinkBuilder.labkeyLink("consolidate scripts", new ActionURL(ConsolidateScriptsAction.class, ContainerManager.getRoot()))); + html.append(LinkBuilder.labkeyLink("orphaned scripts", new ActionURL(OrphanedScriptsAction.class, ContainerManager.getRoot()))); + html.append(LinkBuilder.labkeyLink("scripts with errors", new ActionURL(ScriptsWithErrorsAction.class, ContainerManager.getRoot()))); // html.append(PageFlowUtil.textLink("reorder all scripts", new ActionURL(ReorderAllScriptsAction.class, ContainerManager.getRoot()))); } // Make this link available on production deployments - html.append(PageFlowUtil.link("upgrade code").href(new ActionURL(UpgradeCodeAction.class, ContainerManager.getRoot()))); + html.append(LinkBuilder.labkeyLink("upgrade code", new ActionURL(UpgradeCodeAction.class, ContainerManager.getRoot()))); html.unsafeAppend(""); html.unsafeAppend(" "); diff --git a/core/src/org/labkey/core/query/PostgresStatActivityTable.java b/core/src/org/labkey/core/query/PostgresStatActivityTable.java index 144548248d8..f82644d6783 100644 --- a/core/src/org/labkey/core/query/PostgresStatActivityTable.java +++ b/core/src/org/labkey/core/query/PostgresStatActivityTable.java @@ -239,7 +239,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit oldWriter.write(separator); ActionURL url = new ActionURL(AdminController.ShowThreadsAction.class, ContainerManager.getRoot()); url.setFragment(thread.getName()); - oldWriter.write(new LinkBuilder(thread.getName()).href(url).target("_blank").renderToString()); + oldWriter.write(LinkBuilder.labkeyLink(thread.getName(), url).target("_blank").renderToString()); separator = "\n
"; // Check for HTTP threads and their async counterparts to tie queries to the request that spawned them diff --git a/core/src/org/labkey/core/view/template/bootstrap/ViewServiceImpl.java b/core/src/org/labkey/core/view/template/bootstrap/ViewServiceImpl.java index 8b0aa71dab1..5b83f6af875 100644 --- a/core/src/org/labkey/core/view/template/bootstrap/ViewServiceImpl.java +++ b/core/src/org/labkey/core/view/template/bootstrap/ViewServiceImpl.java @@ -543,7 +543,6 @@ else if (!config._isWebpart) { // Display this NavTree as a simple link. Delegate to LinkBuilder to avoid replicating all its rendering code. final LinkBuilder lb = link.toSimpleLinkBuilder(); - lb.clearClasses(); out.println(lb); } diff --git a/core/src/org/labkey/core/view/template/bootstrap/header.jsp b/core/src/org/labkey/core/view/template/bootstrap/header.jsp index 341ac53ced9..93e93999ca5 100644 --- a/core/src/org/labkey/core/view/template/bootstrap/header.jsp +++ b/core/src/org/labkey/core/view/template/bootstrap/header.jsp @@ -111,7 +111,7 @@ { String displayedShortName = "LabKey Server".equals(siteShortName) ? "" : siteShortName; %> - + <% } %> diff --git a/core/src/org/labkey/core/view/template/bootstrap/navigation.jsp b/core/src/org/labkey/core/view/template/bootstrap/navigation.jsp index e7635b30be3..da033714512 100644 --- a/core/src/org/labkey/core/view/template/bootstrap/navigation.jsp +++ b/core/src/org/labkey/core/view/template/bootstrap/navigation.jsp @@ -142,7 +142,7 @@ HtmlString plus = HtmlString.unsafe(""); %>
  • - <%=link(plus).id("addTab").title("Add New Tab").onClick("LABKEY.Portal.addTab();").clearClasses()%> + <%=simpleLink(plus).id("addTab").title("Add New Tab").onClick("LABKEY.Portal.addTab();")%>
  • <% } diff --git a/experiment/src/org/labkey/experiment/api/ExpDataTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpDataTableImpl.java index e89d9cdc2b7..02694a19b30 100644 --- a/experiment/src/org/labkey/experiment/api/ExpDataTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpDataTableImpl.java @@ -77,6 +77,7 @@ import org.labkey.api.security.permissions.UpdatePermission; import org.labkey.api.util.ConfigurationException; import org.labkey.api.util.FileUtil; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.TestContext; import org.labkey.api.view.ActionURL; @@ -756,9 +757,9 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit { if (data.isFileOnDisk()) { - PageFlowUtil.link("View File").href(ExperimentController.ExperimentUrlsImpl.get().getShowFileURL(data, true)).appendTo(oldWriter); + LinkBuilder.labkeyLink("View File", ExperimentController.ExperimentUrlsImpl.get().getShowFileURL(data, true)).appendTo(oldWriter); oldWriter.write("
    "); - PageFlowUtil.link("Download").href(ExperimentController.ExperimentUrlsImpl.get().getShowFileURL(data, false)).appendTo(oldWriter); + LinkBuilder.labkeyLink("Download", ExperimentController.ExperimentUrlsImpl.get().getShowFileURL(data, false)).appendTo(oldWriter); } else { diff --git a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java index 5460bd8d2cb..1baee1cbbbd 100644 --- a/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java +++ b/experiment/src/org/labkey/experiment/controllers/exp/ExperimentController.java @@ -1237,7 +1237,7 @@ public VBox getView(ExpObjectForm form, BindException errors) throws Exception // container context on the generated expr. ((DetailsURL) expr).setContainerContext(st.getContainer()); String url = expr.eval(Collections.singletonMap(new FieldKey(null, "RowId"), _material.getRowId())); - updateLinks.append(PageFlowUtil.link("edit").href(url)).append(" "); + updateLinks.append(LinkBuilder.labkeyLink("edit", url)).append(" "); } } @@ -1248,7 +1248,7 @@ public VBox getView(ExpObjectForm form, BindException errors) throws Exception if (st != null) deriveURL.addParameter("targetSampleTypeId", st.getRowId()); - updateLinks.append(PageFlowUtil.link("derive samples from this sample").href(deriveURL)).append(" "); + updateLinks.append(LinkBuilder.labkeyLink("derive samples from this sample", deriveURL)).append(" "); } vbox.addView(new HtmlView(updateLinks)); @@ -1928,8 +1928,7 @@ public ModelAndView getView(ExperimentRunForm form, BindException errors) { if (editor.isProtocolEditor(form.lookupRun().getProtocol())) { - updateLinks.append(PageFlowUtil.link("edit " + editor.getDisplayName() + " run") - .href(editor.getEditUrl(getContainer()).addParameter("rowId", form.getRowId()))); + updateLinks.append(LinkBuilder.labkeyLink("edit " + editor.getDisplayName() + " run", editor.getEditUrl(getContainer()).addParameter("rowId", form.getRowId()))); } } diff --git a/issues/src/org/labkey/issue/model/IssuePage.java b/issues/src/org/labkey/issue/model/IssuePage.java index f34502fb431..a398e515a30 100644 --- a/issues/src/org/labkey/issue/model/IssuePage.java +++ b/issues/src/org/labkey/issue/model/IssuePage.java @@ -659,7 +659,7 @@ public HtmlString renderAttachments(ViewContext context, CommentObject comment) .unsafeAppend("\"> ") .append(a.getName()); - builder.append(new LinkBuilder(icon.getHtmlString()).href(download).target("_blank").clearClasses()); + builder.append(LinkBuilder.simpleLink(icon.getHtmlString(), download).target("_blank")); builder.endTag("td").endTag("tr"); } builder.endTag("table"); diff --git a/issues/src/org/labkey/issue/query/IssuesTable.java b/issues/src/org/labkey/issue/query/IssuesTable.java index 78f5be7cb6c..652b9a78b9a 100644 --- a/issues/src/org/labkey/issue/query/IssuesTable.java +++ b/issues/src/org/labkey/issue/query/IssuesTable.java @@ -928,12 +928,10 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit } } - LinkBuilder link = new LinkBuilder(linkText) - .href(url) - .title(title) - .clearClasses() - .target("_blank") - .rel("noopener noreferrer"); + LinkBuilder link = LinkBuilder.simpleLink(linkText, url) + .title(title) + .target("_blank") + .rel("noopener noreferrer"); link.build().appendTo(oldWriter); } else diff --git a/list/src/org/labkey/list/controllers/ListController.java b/list/src/org/labkey/list/controllers/ListController.java index c65bee814fd..a1b98244969 100644 --- a/list/src/org/labkey/list/controllers/ListController.java +++ b/list/src/org/labkey/list/controllers/ListController.java @@ -94,6 +94,7 @@ import org.labkey.api.util.FileStream; import org.labkey.api.util.FileUtil; import org.labkey.api.util.GUID; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.URLHelper; @@ -596,7 +597,7 @@ public ModelAndView getView(ListDefinitionForm form, BindException errors) if (form.isShowHistory()) { - WebPartView linkView = new HtmlView(PageFlowUtil.link("hide item history").href(getViewContext().cloneActionURL().deleteParameter("showHistory")).build()); + WebPartView linkView = new HtmlView(LinkBuilder.labkeyLink("hide item history", getViewContext().cloneActionURL().deleteParameter("showHistory")).build()); linkView.setFrame(WebPartView.FrameType.NONE); view.addView(linkView); @@ -619,7 +620,7 @@ public ModelAndView getView(ListDefinitionForm form, BindException errors) } else { - view.addView(new HtmlView(PageFlowUtil.link("show item history").href(getViewContext().cloneActionURL().addParameter("showHistory", "1")).build())); + view.addView(new HtmlView(LinkBuilder.labkeyLink("show item history", getViewContext().cloneActionURL().addParameter("showHistory", "1")).build())); } if ( diff --git a/list/src/org/labkey/list/model/ListManagerSchema.java b/list/src/org/labkey/list/model/ListManagerSchema.java index b7022c2b009..cacf6133fd3 100644 --- a/list/src/org/labkey/list/model/ListManagerSchema.java +++ b/list/src/org/labkey/list/model/ListManagerSchema.java @@ -39,6 +39,7 @@ import org.labkey.api.query.UserSchema; import org.labkey.api.security.User; import org.labkey.api.util.ButtonBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; import org.labkey.api.view.DataView; @@ -195,7 +196,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) Container c = ContainerManager.getForId(ctx.get(FieldKey.fromParts("container")).toString()); ActionURL designUrl = new ActionURL(ListController.EditListDefinitionAction.class, c); designUrl.addParameter("listId", ctx.get(FieldKey.fromParts("listId")).toString()); - out.write(PageFlowUtil.link("Design").href(designUrl)); + out.write(LinkBuilder.labkeyLink("Design", designUrl)); } }); } @@ -210,7 +211,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) Container c = ContainerManager.getForId(ctx.get(FieldKey.fromParts("container")).toString()); ActionURL historyUrl = new ActionURL(ListController.HistoryAction.class, c); historyUrl.addParameter("listId", ctx.get(FieldKey.fromParts("listId")).toString()); - out.write(PageFlowUtil.link("View History").href(historyUrl)); + out.write(LinkBuilder.labkeyLink("View History", historyUrl)); } }); } diff --git a/list/src/org/labkey/list/view/ListsWebPart.java b/list/src/org/labkey/list/view/ListsWebPart.java index 1d3b26eea6b..3e838d3f9f7 100644 --- a/list/src/org/labkey/list/view/ListsWebPart.java +++ b/list/src/org/labkey/list/view/ListsWebPart.java @@ -21,6 +21,7 @@ import org.labkey.api.exp.list.ListService; import org.labkey.api.exp.list.ListUrls; import org.labkey.api.lists.permissions.DesignListPermission; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.AlwaysAvailableWebPartFactory; import org.labkey.api.view.BaseWebPartFactory; @@ -99,6 +100,6 @@ private void renderNarrowView(ViewContext model, PrintWriter out) } out.write(""); if (model.getContainer().hasPermission(model.getUser(), DesignListPermission.class)) - out.write(PageFlowUtil.link("manage lists").href(PageFlowUtil.urlProvider(ListUrls.class).getManageListsURL(model.getContainer())).toString()); + out.write(LinkBuilder.labkeyLink("manage lists", PageFlowUtil.urlProvider(ListUrls.class).getManageListsURL(model.getContainer())).toString()); } } diff --git a/pipeline/src/org/labkey/pipeline/PipelineController.java b/pipeline/src/org/labkey/pipeline/PipelineController.java index ca831ff9b91..9f87ebe70f2 100644 --- a/pipeline/src/org/labkey/pipeline/PipelineController.java +++ b/pipeline/src/org/labkey/pipeline/PipelineController.java @@ -90,6 +90,7 @@ import org.labkey.api.util.DateUtil; import org.labkey.api.util.FileUtil; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.NetworkDrive; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Path; @@ -313,9 +314,9 @@ public ModelAndView getView(FORM form, boolean reshow, BindException errors) html.unsafeAppend("

    This folder inherits its pipeline root settings from the folder '"); html.append(root.getContainer().getPath()); html.unsafeAppend("'.
    You can either "); - html.append(PageFlowUtil.link("override", urlOverride)); + html.append(LinkBuilder.labkeyLink("override", urlOverride)); html.unsafeAppend(" the inherited settings in this folder,
    or "); - html.append(PageFlowUtil.link("modify the setting for all folders", urlEditParent)); + html.append(LinkBuilder.labkeyLink("modify the setting for all folders", urlEditParent)); html.unsafeAppend(" by setting the value in the folder '"); html.append(root.getContainer().getPath()); html.unsafeAppend("'.

    "); diff --git a/pipeline/src/org/labkey/pipeline/status/FileDisplayColumn.java b/pipeline/src/org/labkey/pipeline/status/FileDisplayColumn.java index 2a4269e7ae0..2734ef28180 100644 --- a/pipeline/src/org/labkey/pipeline/status/FileDisplayColumn.java +++ b/pipeline/src/org/labkey/pipeline/status/FileDisplayColumn.java @@ -24,6 +24,7 @@ import org.labkey.api.pipeline.PipelineService; import org.labkey.api.util.FileUtil; import org.labkey.api.util.HtmlString; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.NetworkDrive; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.writer.HtmlWriter; @@ -77,11 +78,11 @@ public void renderDetailsCellContents(RenderContext ctx, HtmlWriter out) if (Files.isReadable(file)) { - out.write(PageFlowUtil.link(fileName).href(StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, false))); + out.write(LinkBuilder.labkeyLink(fileName, StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, false))); out.write(HtmlString.NBSP); out.write(HtmlString.NBSP); - out.write(PageFlowUtil.link("view").href(StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, false))); - out.write(PageFlowUtil.link("download").href(StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, true))); + out.write(LinkBuilder.labkeyLink("view", StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, false))); + out.write(LinkBuilder.labkeyLink("download", StatusController.urlShowFile(ctx.getContainer(), rowIdI.intValue(), fileName, true))); } else { diff --git a/pipeline/src/org/labkey/pipeline/status/details.jsp b/pipeline/src/org/labkey/pipeline/status/details.jsp index e0ce5b92741..39e538b4258 100644 --- a/pipeline/src/org/labkey/pipeline/status/details.jsp +++ b/pipeline/src/org/labkey/pipeline/status/details.jsp @@ -232,7 +232,7 @@ if (url != null) { %> - <%=link("Show raw log file").id("show-raw-log").attributes(Map.of("data-details", "false")).href(url).target("_blank")%> + <%=link("Show raw log file", url).id("show-raw-log").attributes(Map.of("data-details", "false")).target("_blank")%> <% } %> diff --git a/query/src/org/labkey/query/view/manageRemoteConnections.jsp b/query/src/org/labkey/query/view/manageRemoteConnections.jsp index 8305b1cc2ac..5a041cb08fe 100644 --- a/query/src/org/labkey/query/view/manageRemoteConnections.jsp +++ b/query/src/org/labkey/query/view/manageRemoteConnections.jsp @@ -46,9 +46,9 @@ { for (String field : connectionMap.keySet()) { - %><%=link("edit").href(RemoteQueryConnectionUrls.urlEditRemoteConnection(c, connectionMap.get(field)))%><% - %><%=link("delete").href(RemoteQueryConnectionUrls.urlDeleteRemoteConnection(c, connectionMap.get(field)))%><% - %><%=link("test").href(RemoteQueryConnectionUrls.urlTestRemoteConnection(c, connectionMap.get(field)))%><% + %><%=link("edit", RemoteQueryConnectionUrls.urlEditRemoteConnection(c, connectionMap.get(field)))%><% + %><%=link("delete", RemoteQueryConnectionUrls.urlDeleteRemoteConnection(c, connectionMap.get(field)))%><% + %><%=link("test", RemoteQueryConnectionUrls.urlTestRemoteConnection(c, connectionMap.get(field)))%><% %><%=h(connectionMap.get(field))%>
    <% } @@ -56,7 +56,7 @@ <% if (hasAdminOpsPerm) { - %><%=link("create new connection").href(RemoteQueryConnectionUrls.urlCreateRemoteConnection(c))%><% + %><%=link("create new connection", RemoteQueryConnectionUrls.urlCreateRemoteConnection(c))%><% } } %> diff --git a/query/src/org/labkey/query/view/manageViews.jsp b/query/src/org/labkey/query/view/manageViews.jsp index 6d55012f419..39cdd3ba138 100644 --- a/query/src/org/labkey/query/view/manageViews.jsp +++ b/query/src/org/labkey/query/view/manageViews.jsp @@ -149,10 +149,10 @@ <%=h(userIdToString(view.getModifiedBy(), user))%> <% ActionURL urlDelete = new ActionURL(InternalDeleteView.class, c); urlDelete.addParameter("customViewId", Integer.toString(view.getCustomViewId())); %> - <%=link("delete").href(urlDelete)%> + <%=link("delete", urlDelete)%> <% ActionURL urlSource = new ActionURL(InternalSourceViewAction.class, c); urlSource.addParameter("customViewId", Integer.toString(view.getCustomViewId())); %> - <%=link("edit").href(urlSource)%> + <%=link("edit", urlSource)%> <% diff --git a/query/src/org/labkey/query/view/testRemoteConnectionsFailure.jsp b/query/src/org/labkey/query/view/testRemoteConnectionsFailure.jsp index 2f4c5953d55..d40c50d2f8f 100644 --- a/query/src/org/labkey/query/view/testRemoteConnectionsFailure.jsp +++ b/query/src/org/labkey/query/view/testRemoteConnectionsFailure.jsp @@ -21,4 +21,4 @@

    The connection using the supplied credentials was not successful.

    -<%=link("manage remote connections").href(QueryController.RemoteQueryConnectionUrls.urlManageRemoteConnection(getContainer()))%> +<%=link("manage remote connections", QueryController.RemoteQueryConnectionUrls.urlManageRemoteConnection(getContainer()))%> diff --git a/query/src/org/labkey/query/view/testRemoteConnectionsSuccess.jsp b/query/src/org/labkey/query/view/testRemoteConnectionsSuccess.jsp index bdc69132c0d..52dac981c74 100644 --- a/query/src/org/labkey/query/view/testRemoteConnectionsSuccess.jsp +++ b/query/src/org/labkey/query/view/testRemoteConnectionsSuccess.jsp @@ -21,4 +21,4 @@

    The connection using the supplied credentials was successful.

    -<%=link("manage remote connections").href(QueryController.RemoteQueryConnectionUrls.urlManageRemoteConnection(getContainer()))%> +<%=link("manage remote connections", QueryController.RemoteQueryConnectionUrls.urlManageRemoteConnection(getContainer()))%> diff --git a/specimen/src/org/labkey/specimen/actions/ShowUploadSpecimensAction.java b/specimen/src/org/labkey/specimen/actions/ShowUploadSpecimensAction.java index 8cb118d7dc8..ea53ca904ea 100644 --- a/specimen/src/org/labkey/specimen/actions/ShowUploadSpecimensAction.java +++ b/specimen/src/org/labkey/specimen/actions/ShowUploadSpecimensAction.java @@ -31,6 +31,7 @@ import org.labkey.api.security.RequiresPermission; import org.labkey.api.security.User; import org.labkey.api.security.permissions.AdminPermission; +import org.labkey.api.util.LinkBuilder; import org.labkey.specimen.importer.SimpleSpecimenImporter; import org.labkey.specimen.settings.RepositorySettings; import org.labkey.api.study.Study; @@ -314,9 +315,9 @@ public ModelAndView getView(Object o, BindException errors) return new HtmlView( HtmlStringBuilder.of("Specimens uploaded successfully.") .append(HtmlString.BR).append(HtmlString.BR) - .append(PageFlowUtil.link("study home", homeLink)) + .append(LinkBuilder.labkeyLink("study home", homeLink)) .append(" ") - .append(PageFlowUtil.link("specimens", samplesLink) + .append(LinkBuilder.labkeyLink("specimens", samplesLink) ) ); } diff --git a/specimen/src/org/labkey/specimen/actions/SpecimenController.java b/specimen/src/org/labkey/specimen/actions/SpecimenController.java index 94674b80544..52650107fed 100644 --- a/specimen/src/org/labkey/specimen/actions/SpecimenController.java +++ b/specimen/src/org/labkey/specimen/actions/SpecimenController.java @@ -4099,8 +4099,8 @@ public ModelAndView getView(UpdateParticipantCommentsForm specimenCommentsForm, errors.reject(ERROR_MSG, e.getMessage()); } } - if (selectedVials == null || selectedVials.size() == 0) - return HtmlView.unsafe("No vials selected. " + PageFlowUtil.link("back").onClick("back()")); + if (selectedVials == null || selectedVials.isEmpty()) + return HtmlView.unsafe("No vials selected. " + LinkBuilder.labkeyLink("back").onClick("back()")); } return new JspView<>("/org/labkey/specimen/view/updateComments.jsp", @@ -4387,7 +4387,7 @@ public class RequestHistoryAction extends SimpleViewAction public ModelAndView getView(IdForm form, BindException errors) { _requestId = form.getId(); - HtmlView header = new HtmlView(new LinkBuilder("View Request").href(SpecimenController.getManageRequestURL(getContainer(), form.getId(), null))); + HtmlView header = new HtmlView(LinkBuilder.labkeyLink("View Request", SpecimenController.getManageRequestURL(getContainer(), form.getId(), null))); SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("RequestId"), form.getId()); GridView historyGrid = getRequestEventGridView(getViewContext().getRequest(), errors, filter); return new VBox(header, historyGrid); diff --git a/specimen/src/org/labkey/specimen/notifications/ActorNotificationRecipientSet.java b/specimen/src/org/labkey/specimen/notifications/ActorNotificationRecipientSet.java index c7086f2502b..ef1709d3294 100644 --- a/specimen/src/org/labkey/specimen/notifications/ActorNotificationRecipientSet.java +++ b/specimen/src/org/labkey/specimen/notifications/ActorNotificationRecipientSet.java @@ -22,6 +22,7 @@ import org.labkey.api.specimen.location.LocationManager; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.SafeToRender; import org.labkey.api.view.ActionURL; @@ -109,7 +110,7 @@ private HtmlString getConfigureEmailsLinkHTML(ActionURL currentUrl) getLocation() != null ? getLocation().getRowId() : null, currentUrl ); - return PageFlowUtil.link("Configure Addresses").href(url).getHtmlString(); + return LinkBuilder.labkeyLink("Configure Addresses", url).getHtmlString(); } public SafeToRender getHtmlDescriptionAndLink(boolean hasEmailAddresses, ActionURL currentUrl) diff --git a/specimen/src/org/labkey/specimen/view/labSpecimenLists.jsp b/specimen/src/org/labkey/specimen/view/labSpecimenLists.jsp index 2a082050cb6..ebee55b59e5 100644 --- a/specimen/src/org/labkey/specimen/view/labSpecimenLists.jsp +++ b/specimen/src/org/labkey/specimen/view/labSpecimenLists.jsp @@ -72,10 +72,10 @@ - + - +
    <%=link("Export to Excel").href(downloadURL.replaceParameter("export", "xls"))%><%=link("Export to Excel", downloadURL.replaceParameter("export", "xls"))%>
    <%=link("Export to text file").href(downloadURL.replaceParameter("export", "tsv")) %><%=link("Export to text file", downloadURL.replaceParameter("export", "tsv")) %>

    diff --git a/specimen/src/org/labkey/specimen/view/manageActors.jsp b/specimen/src/org/labkey/specimen/view/manageActors.jsp index e2843ab1e9e..da39822f563 100644 --- a/specimen/src/org/labkey/specimen/view/manageActors.jsp +++ b/specimen/src/org/labkey/specimen/view/manageActors.jsp @@ -104,7 +104,7 @@ } else { - %><%= link("Update Members").href(updateMembersLink) %><% + %><%= link("Update Members", updateMembersLink) %><% if (!inUseActorIds.contains(actor.getRowId())) { %><%=link("Delete").onClick("return LABKEY.Utils.confirmAndPost('Deleting this actor will delete all information about its membership. All member emails will need to be entered again if you recreate this actor.', '" + h(urlFor(DeleteActorAction.class).addParameter("id", actor.getRowId())) + "')") %><% diff --git a/specimen/src/org/labkey/specimen/view/manageRequirement.jsp b/specimen/src/org/labkey/specimen/view/manageRequirement.jsp index 4057fa688da..68109262af7 100644 --- a/specimen/src/org/labkey/specimen/view/manageRequirement.jsp +++ b/specimen/src/org/labkey/specimen/view/manageRequirement.jsp @@ -49,7 +49,7 @@ - + <% if (bean.isRequestManager() && bean.isFinalState()) diff --git a/specimen/src/org/labkey/specimen/view/manageStatuses.jsp b/specimen/src/org/labkey/specimen/view/manageStatuses.jsp index 05d88773dc9..7fc51da35dd 100644 --- a/specimen/src/org/labkey/specimen/view/manageStatuses.jsp +++ b/specimen/src/org/labkey/specimen/view/manageStatuses.jsp @@ -102,7 +102,7 @@ function showSystemRows(value) else { %> - + <% } %> diff --git a/specimen/src/org/labkey/specimen/view/specimen.jsp b/specimen/src/org/labkey/specimen/view/specimen.jsp index e2bf2e5a3ae..97327250312 100644 --- a/specimen/src/org/labkey/specimen/view/specimen.jsp +++ b/specimen/src/org/labkey/specimen/view/specimen.jsp @@ -97,10 +97,10 @@ if (comment != null) <% } } -if (bean.getReturnUrl() != null && bean.getReturnUrl().length() > 0) +if (bean.getReturnUrl() != null && !bean.getReturnUrl().isEmpty()) { %> -
    <%=link("return to vial view").href(bean.getReturnUrl() )%> +
    <%=link("return to vial view", bean.getReturnUrl() )%> <% } %> diff --git a/specimen/src/org/labkey/specimen/view/specimenHeader.jsp b/specimen/src/org/labkey/specimen/view/specimenHeader.jsp index e4bb9964c72..b0599197eab 100644 --- a/specimen/src/org/labkey/specimen/view/specimenHeader.jsp +++ b/specimen/src/org/labkey/specimen/view/specimenHeader.jsp @@ -71,7 +71,7 @@ } %> <%=link(vialLinkText, bean.getOtherViewURL())%>  -<%=link("Search").href(ShowSearchAction.getShowSearchURL(getContainer(), bean.isShowingVials()))%>  +<%=link("Search", ShowSearchAction.getShowSearchURL(getContainer(), bean.isShowingVials()))%>  <%=link("Reports", urlFor(SpecimenController.AutoReportListAction.class)) %> <% if (!bean.getFilteredPtidVisits().isEmpty()) diff --git a/study/src/org/labkey/study/controllers/StudyController.java b/study/src/org/labkey/study/controllers/StudyController.java index 242d561b5a3..1587413773b 100644 --- a/study/src/org/labkey/study/controllers/StudyController.java +++ b/study/src/org/labkey/study/controllers/StudyController.java @@ -199,6 +199,7 @@ import org.labkey.api.util.FileStream; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.StringExpression; @@ -2840,7 +2841,7 @@ public ModelAndView getView(IdForm form, BindException errors) public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) { ActionURL url = new ActionURL(DownloadTsvAction.class, ctx.getContainer()).addParameter("id", String.valueOf(ctx.get("RowId"))); - PageFlowUtil.link("Download Data File").href(url).appendTo(oldWriter); + LinkBuilder.labkeyLink("Download Data File", url).appendTo(oldWriter); } }; dr.addDisplayColumn(dc); @@ -3825,7 +3826,7 @@ public ModelAndView getView(UpdateQCStateForm updateQCForm, boolean reshow, Bind if (isPost()) lsids = DataRegionSelection.getSelected(getViewContext(), updateQCForm.getDataRegionSelectionKey(), false); if (lsids == null || lsids.isEmpty()) - return HtmlView.unsafe("No data rows selected. " + PageFlowUtil.link("back").onClick("back()")); + return HtmlView.unsafe("No data rows selected. " + LinkBuilder.labkeyLink("back").onClick("back()")); StudyQuerySchema querySchema = StudyQuerySchema.createSchema(study, getUser()); DatasetQuerySettings qs = new DatasetQuerySettings(getViewContext().getBindPropertyValues(), DatasetQueryView.DATAREGION); @@ -5955,13 +5956,13 @@ protected void renderInternal(Object model, PrintWriter out) out.print("
    <%= link("View Request").href(SpecimenController.getManageRequestURL(getContainer(), requirement.getRequestId(), null))%><%= link("View Request", SpecimenController.getManageRequestURL(getContainer(), requirement.getRequestId(), null))%>
    <%=link("delete").href(urlFor(DeleteStatusAction.class).addParameter("id", status.getRowId())).usePost()%><%=link("delete", urlFor(DeleteStatusAction.class).addParameter("id", status.getRowId())).usePost()%>
    - + <% if (timepoints.size() > 0) { %> diff --git a/study/src/org/labkey/study/view/overview.jsp b/study/src/org/labkey/study/view/overview.jsp index 3097fe0bf56..659246d7c59 100644 --- a/study/src/org/labkey/study/view/overview.jsp +++ b/study/src/org/labkey/study/view/overview.jsp @@ -130,8 +130,8 @@ hasHiddenData = !datasets.get(i).isShowByDefault(); if (hasHiddenData) { - LinkBuilder viewLink = bean.showAll ? link("Show Default Datasets").href(baseURL) : - link("Show All Datasets").href(baseURL.addParameter("showAll", "1")); + LinkBuilder viewLink = bean.showAll ? link("Show Default Datasets", baseURL) : + link("Show All Datasets", baseURL.addParameter("showAll", "1")); out.print(viewLink); } %> @@ -319,7 +319,7 @@ defaultReportURL = getQCStateFilteredURL(defaultReportURL, PRIVATE_STATES_LABEL, DatasetQueryView.DATAREGION, container); defaultReportURL.addParameter("skipDataVisibility", 1); - %><%=link(innerHtml, defaultReportURL).clearClasses()%><% + %><%=simpleLink(innerHtml, defaultReportURL)%><% } else { @@ -365,7 +365,7 @@ if (bean.qcStates != null && StringUtils.isNumeric(bean.qcStates.getFormValue())) datasetLink.replaceParameter(qcUrlFilterKey, QCStateManager.getInstance().getStateForRowId(container, Integer.parseInt(bean.qcStates.getFormValue())).getLabel()); - innerHtml = HtmlStringBuilder.of(link(innerHtml, datasetLink).clearClasses()); + innerHtml = HtmlStringBuilder.of(simpleLink(innerHtml, datasetLink)); } %> diff --git a/wiki/src/org/labkey/wiki/LinkBarView.java b/wiki/src/org/labkey/wiki/LinkBarView.java index e96921cc784..d3ea7f6e89b 100644 --- a/wiki/src/org/labkey/wiki/LinkBarView.java +++ b/wiki/src/org/labkey/wiki/LinkBarView.java @@ -16,6 +16,7 @@ package org.labkey.wiki; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.NavTree; import org.labkey.api.view.WebPartView; @@ -49,7 +50,7 @@ protected void renderView(Object model, PrintWriter out) out.write("
    "); if (_prevURL != null) { - PageFlowUtil.link("Previous " + subjectNoun).href(_prevURL).appendTo(out); + LinkBuilder.labkeyLink("Previous " + subjectNoun, _prevURL).appendTo(out); out.print(" "); } if (_nextURL != null) { - PageFlowUtil.link("Next " + subjectNoun).href(_nextURL).appendTo(out); + LinkBuilder.labkeyLink("Next " + subjectNoun, _nextURL).appendTo(out); out.print(" "); } @@ -5970,7 +5971,7 @@ protected void renderInternal(Object model, PrintWriter out) if (null != _currentParticipantId && null != ss) { ActionURL search = urlProvider(SearchUrls.class).getSearchURL(c, "+" + ss.escapeTerm(_currentParticipantId)); - PageFlowUtil.link("Search for '" + id(_currentParticipantId, c, user) + "'").href(search).appendTo(out); + LinkBuilder.labkeyLink("Search for '" + id(_currentParticipantId, c, user) + "'", search).appendTo(out); out.print(" "); } @@ -5984,7 +5985,7 @@ protected void renderInternal(Object model, PrintWriter out) customizeURL.addReturnUrl(getViewContext().getActionURL()); customizeURL.addParameter("participantId", _currentParticipantId); out.print(""); - PageFlowUtil.link("Customize View").href(customizeURL).appendTo(out); + LinkBuilder.labkeyLink("Customize View", customizeURL).appendTo(out); } if (_display != null) diff --git a/study/src/org/labkey/study/query/CohortQueryView.java b/study/src/org/labkey/study/query/CohortQueryView.java index ba06d86c943..27043f46662 100644 --- a/study/src/org/labkey/study/query/CohortQueryView.java +++ b/study/src/org/labkey/study/query/CohortQueryView.java @@ -137,7 +137,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit ActionURL actionURL = new ActionURL(CohortController.DeleteCohortAction.class, folder); actionURL.addParameter("rowId", rowId.toString()); - oldWriter.write(new LinkBuilder("delete").href(actionURL).usePost().toString()); + oldWriter.write(LinkBuilder.labkeyLink("delete", actionURL).usePost().toString()); } else { diff --git a/study/src/org/labkey/study/query/DatasetQueryView.java b/study/src/org/labkey/study/query/DatasetQueryView.java index 2e4274043dd..856063fc740 100644 --- a/study/src/org/labkey/study/query/DatasetQueryView.java +++ b/study/src/org/labkey/study/query/DatasetQueryView.java @@ -78,6 +78,7 @@ import org.labkey.api.study.TimepointType; import org.labkey.api.study.model.ParticipantGroup; import org.labkey.api.util.GUID; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.StringExpression; import org.labkey.api.view.ActionURL; @@ -345,7 +346,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit { ActionURL dataURL = new ActionURL(StudyController.DatasetItemDetailsAction.class, getContainer()); dataURL.addParameter("sourceLsid", lsid.toString()); - PageFlowUtil.link("assay").href(dataURL).appendTo(oldWriter); + LinkBuilder.labkeyLink("assay", dataURL).appendTo(oldWriter); return; } } diff --git a/study/src/org/labkey/study/query/StudyPropertiesQueryView.java b/study/src/org/labkey/study/query/StudyPropertiesQueryView.java index 3d314245cdc..6b01d6e8f02 100644 --- a/study/src/org/labkey/study/query/StudyPropertiesQueryView.java +++ b/study/src/org/labkey/study/query/StudyPropertiesQueryView.java @@ -20,6 +20,7 @@ import org.labkey.api.data.RenderContext; import org.labkey.api.data.SimpleDisplayColumn; import org.labkey.api.security.User; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.view.ActionURL; import org.labkey.api.view.DataView; @@ -83,7 +84,7 @@ public EditColumn(Container container) public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWriter out) { ActionURL actionURL = new ActionURL(StudyPropertiesController.UpdateAction.class, container); - PageFlowUtil.link("edit").href(actionURL).appendTo(oldWriter); + LinkBuilder.labkeyLink("edit", actionURL).appendTo(oldWriter); } } } diff --git a/study/src/org/labkey/study/view/manageTimepoints.jsp b/study/src/org/labkey/study/view/manageTimepoints.jsp index e440c35c5c5..76329d91525 100644 --- a/study/src/org/labkey/study/view/manageTimepoints.jsp +++ b/study/src/org/labkey/study/view/manageTimepoints.jsp @@ -54,7 +54,7 @@
    Assign data to the correct timepoint<%=link("Recompute Timepoints").href(urlFor(UpdateParticipantVisitsAction.class)).usePost()%><%=link("Recompute Timepoints", urlFor(UpdateParticipantVisitsAction.class)).usePost()%>
    <%=innerHtml%>
    "); if (_drawLine) diff --git a/wiki/src/org/labkey/wiki/WikiTOC.java b/wiki/src/org/labkey/wiki/WikiTOC.java index ad12c510d26..bb7b8f524dd 100644 --- a/wiki/src/org/labkey/wiki/WikiTOC.java +++ b/wiki/src/org/labkey/wiki/WikiTOC.java @@ -23,6 +23,7 @@ import org.labkey.api.security.User; import org.labkey.api.security.permissions.AdminPermission; import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.URLHelper; import org.labkey.api.view.ActionURL; @@ -275,19 +276,19 @@ protected void renderView(Object model, PrintWriter out) throws Exception if (prevURL != null) { - PageFlowUtil.link("previous").href(prevURL).appendTo(out); + LinkBuilder.labkeyLink("previous", prevURL).appendTo(out); } if (nextURL != null) { - PageFlowUtil.link("next").href(nextURL).appendTo(out); + LinkBuilder.labkeyLink("next", nextURL).appendTo(out); } if (showExpandOption) { out.println("\n\n
    "); for (NavTree link : _links) { - out.write(PageFlowUtil.link(link.getText()).href(link.getHref()) + " "); + out.write(LinkBuilder.labkeyLink(link.getText(), link.getHref()) + " "); } out.write("
     
    "); - PageFlowUtil.link("expand all").onClick("LABKEY.wiki.internal.Wiki.adjustAllTocEntries('NavTree-" + getId() + "', true, true)").appendTo(out); - PageFlowUtil.link("collapse all").onClick("LABKEY.wiki.internal.Wiki.adjustAllTocEntries('NavTree-" + getId() + "', true, false)").appendTo(out); + LinkBuilder.labkeyLink("expand all").onClick("LABKEY.wiki.internal.Wiki.adjustAllTocEntries('NavTree-" + getId() + "', true, true)").appendTo(out); + LinkBuilder.labkeyLink("collapse all").onClick("LABKEY.wiki.internal.Wiki.adjustAllTocEntries('NavTree-" + getId() + "', true, false)").appendTo(out); } out.println("
    "); diff --git a/wiki/src/org/labkey/wiki/query/PathDisplayColumn.java b/wiki/src/org/labkey/wiki/query/PathDisplayColumn.java index 3172ad7f75e..6f7cd5f4c9a 100644 --- a/wiki/src/org/labkey/wiki/query/PathDisplayColumn.java +++ b/wiki/src/org/labkey/wiki/query/PathDisplayColumn.java @@ -142,7 +142,7 @@ public void renderGridCellContents(RenderContext ctx, HtmlWriter out) String url = s.eval(newRow); if (url != null) { - out.write(new LinkBuilder(part).href(url).clearClasses()); + out.write(LinkBuilder.simpleLink(part, url)); } else { diff --git a/wiki/src/org/labkey/wiki/view/customizeWiki.jsp b/wiki/src/org/labkey/wiki/view/customizeWiki.jsp index 56219376289..5f8114bf3c9 100644 --- a/wiki/src/org/labkey/wiki/view/customizeWiki.jsp +++ b/wiki/src/org/labkey/wiki/view/customizeWiki.jsp @@ -181,7 +181,7 @@ function restoreDefaultPage() } return new OptionBuilder(c.getPath(), c.getId()).selected(selected); }))%> - You can also <%=link("restore to this folder's default page.").onClick("restoreDefaultPage();").clearClasses()%>
    + You can also <%=simpleLink("restore to this folder's default page.").onClick("restoreDefaultPage();")%>
    <% final Stream builders;