From b48b28228511c2ff538ba0f4a6c43b51ace388e6 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Fri, 11 Apr 2025 16:27:36 -0700 Subject: [PATCH 1/3] Improve display element builders --- .../AnnouncementsController.java | 4 +- .../announcements/announcementThread.jsp | 2 +- .../api/action/LabKeyErrorWithLink.java | 2 +- .../labkey/api/assay/AssayQCFlagColumn.java | 4 +- .../api/assay/actions/UploadWizardAction.java | 8 +- .../api/data/AbstractFileDisplayColumn.java | 11 +- api/src/org/labkey/api/data/ActionButton.java | 4 +- .../labkey/api/data/CrosstabDataRegion.java | 4 +- api/src/org/labkey/api/data/DataColumn.java | 30 +- api/src/org/labkey/api/data/DataRegion.java | 23 +- .../org/labkey/api/data/DisplayColumn.java | 5 +- .../labkey/api/data/DisplayColumnGroup.java | 4 +- .../api/data/JavaScriptDisplayColumn.java | 2 +- .../org/labkey/api/data/MVDisplayColumn.java | 2 +- .../AbstractClrInstallationManager.java | 7 +- .../api/data/queryprofiler/QueryProfiler.java | 10 +- api/src/org/labkey/api/jsp/JspBase.java | 14 +- .../org/labkey/api/jsp/taglib/ButtonTag.java | 4 +- .../labkey/api/jsp/taglib/CheckboxTag.java | 8 +- .../labkey/api/jsp/taglib/CsrfInputTag.java | 2 +- .../org/labkey/api/jsp/taglib/FormTag.java | 6 +- .../org/labkey/api/jsp/taglib/InputTag.java | 18 +- .../org/labkey/api/jsp/taglib/OptionsTag.java | 2 +- .../labkey/api/query/UserSchemaAction.java | 4 +- .../api/security/AuthenticationManager.java | 2 +- .../labkey/api/security/SecurityManager.java | 2 +- .../api/security/StrongPasswordValidator.java | 2 +- .../org/labkey/api/security/UserManager.java | 4 +- .../LookAndFeelPropertiesManager.java | 2 +- .../api/settings/TemplateProperties.java | 5 +- .../api/study/actions/StudyPickerColumn.java | 8 +- .../api/study/publish/publishChooseStudy.jsp | 10 +- api/src/org/labkey/api/util/Button.java | 319 ----- .../org/labkey/api/util/ButtonBuilder.java | 299 +++++ .../api/util/{element => }/CsrfInput.java | 9 +- api/src/org/labkey/api/util/DOM.java | 1 - .../labkey/api/util/DisplayFieldBuilder.java | 58 + api/src/org/labkey/api/util/DomTestCase.java | 4 +- api/src/org/labkey/api/util/HelpTopic.java | 1 - api/src/org/labkey/api/util/InputBuilder.java | 1119 +++++++++++++++++ api/src/org/labkey/api/util/Link.java | 150 --- api/src/org/labkey/api/util/LinkBuilder.java | 146 +++ .../org/labkey/api/util/OptionBuilder.java | 143 +++ api/src/org/labkey/api/util/PageFlowUtil.java | 2 - .../org/labkey/api/util/SelectBuilder.java | 209 +++ .../org/labkey/api/util/TextAreaBuilder.java | 83 ++ .../labkey/api/util/element/DisplayField.java | 74 -- .../org/labkey/api/util/element/Input.java | 1114 ---------------- .../org/labkey/api/util/element/Option.java | 163 --- .../org/labkey/api/util/element/Select.java | 220 ---- .../org/labkey/api/util/element/TextArea.java | 99 -- .../labkey/api/view/HttpPostRedirectView.java | 2 +- api/src/org/labkey/api/view/NavTree.java | 2 +- api/src/org/labkey/api/view/PopupMenu.java | 4 +- .../org/labkey/api/view/PopupMenuView.java | 7 +- api/src/org/labkey/api/view/Portal.java | 6 +- .../plate/PlateSampleFilePropertyHelper.java | 14 +- .../org/labkey/assay/plate/view/plateList.jsp | 18 +- .../org/labkey/assay/view/updateQCState.jsp | 10 +- .../labkey/core/admin/AdminController.java | 6 +- .../org/labkey/core/admin/customizeMenu.jsp | 2 +- .../org/labkey/core/admin/rConfiguration.jsp | 2 +- .../core/admin/sql/SqlScriptController.java | 2 +- .../src/org/labkey/core/project/folderNav.jsp | 2 +- .../core/query/PostgresStatActivityTable.java | 4 +- .../src/org/labkey/core/security/addUsers.jsp | 2 +- core/src/org/labkey/core/view/styleGuide.jsp | 26 +- .../bootstrap/CoreWarningProvider.java | 8 +- .../template/bootstrap/ViewServiceImpl.java | 4 +- .../org/labkey/devtools/ActionListView.java | 2 +- .../org/labkey/devtools/TestController.java | 10 +- .../org/labkey/devtools/ToolsController.java | 4 +- .../labkey/devtools/test/JspTestCaseTest.jsp | 9 +- .../src/org/labkey/devtools/view/buttons.jsp | 4 +- .../ExperimentRunDisplayColumn.java | 2 +- .../experiment/LineageGraphDisplayColumn.java | 2 +- .../ProtocolApplicationDisplayColumn.java | 2 +- .../experiment/ProtocolDisplayColumn.java | 2 +- .../experiment/SampleTypeDisplayColumn.java | 2 +- .../labkey/experiment/api/ExpDataImpl.java | 6 +- .../experiment/api/ExpFilesTableImpl.java | 4 +- .../controllers/exp/ExperimentController.java | 6 +- .../org/labkey/issue/IssuesController.java | 8 +- .../src/org/labkey/issue/model/IssuePage.java | 8 +- .../issue/query/IssuesListDefTable.java | 8 +- .../org/labkey/issue/query/IssuesTable.java | 4 +- .../labkey/list/model/ListManagerSchema.java | 11 +- .../labkey/list/view/deleteListDefinition.jsp | 2 +- .../mothership/AssignedToDisplayColumn.java | 4 +- .../mothership/MothershipController.java | 4 +- .../pipeline/analysis/protocolDetail.jsp | 6 +- .../src/org/labkey/pipeline/permission.jsp | 4 +- .../pipeline/status/StatusDataRegion.java | 4 +- .../query/controllers/QueryController.java | 13 +- query/src/org/labkey/query/view/newQuery.jsp | 2 +- .../SpecimenCommentAuditProvider.java | 4 +- .../specimen/actions/ManageRequestBean.java | 4 +- .../specimen/actions/SpecimenController.java | 14 +- .../report/SpecimenVisitReportParameters.java | 10 +- .../ParticipantTypeReportFactory.java | 22 +- .../request/BaseRequestReportFactory.java | 10 +- .../request/RequestLocationReportFactory.java | 10 +- .../specimentype/TypeCohortReportFactory.java | 13 +- .../specimentype/TypeReportFactory.java | 8 +- ...cimenRequestNotificationEmailTemplate.java | 2 +- .../labkey/specimen/view/chooseImporter.jsp | 8 +- .../labkey/specimen/view/requestSpecimens.jsp | 2 +- .../labkey/api/study/InsertUpdateAction.java | 2 +- study/src/org/labkey/study/StudyModule.java | 10 - .../study/controllers/StudyController.java | 2 +- .../labkey/study/query/CohortQueryView.java | 2 +- .../study/query/PublishedRecordQueryView.java | 5 +- .../org/labkey/study/security/datasets.jsp | 2 +- .../labkey/study/security/studySecurity.jsp | 2 +- .../labkey/study/view/crosstabDesigner.jsp | 6 +- .../view/customizeParticipantWebPart.jsp | 2 +- .../org/labkey/study/view/datasetDetails.jsp | 6 +- .../labkey/study/view/datasetVisibility.jsp | 6 +- .../labkey/study/view/importDatasetSchema.jsp | 2 +- .../study/view/manageMasterPatientConfig.jsp | 12 +- .../study/view/masterPatientProvider.jsp | 12 +- study/src/org/labkey/study/view/overview.jsp | 4 +- .../labkey/wiki/query/PathDisplayColumn.java | 4 +- .../org/labkey/wiki/view/customizeWiki.jsp | 2 +- wiki/src/org/labkey/wiki/view/wikiEdit.jsp | 4 +- wiki/src/org/labkey/wiki/view/wikiManage.jsp | 4 +- 126 files changed, 2381 insertions(+), 2497 deletions(-) delete mode 100644 api/src/org/labkey/api/util/Button.java create mode 100644 api/src/org/labkey/api/util/ButtonBuilder.java rename api/src/org/labkey/api/util/{element => }/CsrfInput.java (61%) create mode 100644 api/src/org/labkey/api/util/DisplayFieldBuilder.java create mode 100644 api/src/org/labkey/api/util/InputBuilder.java delete mode 100644 api/src/org/labkey/api/util/Link.java create mode 100644 api/src/org/labkey/api/util/LinkBuilder.java create mode 100644 api/src/org/labkey/api/util/OptionBuilder.java create mode 100644 api/src/org/labkey/api/util/SelectBuilder.java create mode 100644 api/src/org/labkey/api/util/TextAreaBuilder.java delete mode 100644 api/src/org/labkey/api/util/element/DisplayField.java delete mode 100644 api/src/org/labkey/api/util/element/Input.java delete mode 100644 api/src/org/labkey/api/util/element/Option.java delete mode 100644 api/src/org/labkey/api/util/element/Select.java delete mode 100644 api/src/org/labkey/api/util/element/TextArea.java diff --git a/announcements/src/org/labkey/announcements/AnnouncementsController.java b/announcements/src/org/labkey/announcements/AnnouncementsController.java index 661fd56952c..a720e61e4ab 100644 --- a/announcements/src/org/labkey/announcements/AnnouncementsController.java +++ b/announcements/src/org/labkey/announcements/AnnouncementsController.java @@ -109,8 +109,8 @@ import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.util.URLHelper; -import org.labkey.api.util.element.Option.OptionBuilder; -import org.labkey.api.util.element.Select.SelectBuilder; +import org.labkey.api.util.OptionBuilder; +import org.labkey.api.util.SelectBuilder; import org.labkey.api.view.ActionURL; import org.labkey.api.view.AjaxCompletion; import org.labkey.api.view.AlwaysAvailableWebPartFactory; diff --git a/announcements/src/org/labkey/announcements/announcementThread.jsp b/announcements/src/org/labkey/announcements/announcementThread.jsp index 5ac9e302ffe..78ddd926c94 100644 --- a/announcements/src/org/labkey/announcements/announcementThread.jsp +++ b/announcements/src/org/labkey/announcements/announcementThread.jsp @@ -74,7 +74,7 @@ if (announcementModel.isSpam()) } else if (null == announcementModel.getApproved() && c.hasPermission(user, AdminPermission.class)) { - %>

"> This <%=h(settings.getConversationName().toLowerCase())%> requires <%=link("moderator review", new ActionURL(AnnouncementsController.ModeratorReviewAction.class, c)).clearClasses()%>.<% + %>

"> This <%=h(settings.getConversationName().toLowerCase())%> requires <%=simpleLink("moderator review", new ActionURL(AnnouncementsController.ModeratorReviewAction.class, c))%>.<% } %> diff --git a/api/src/org/labkey/api/action/LabKeyErrorWithLink.java b/api/src/org/labkey/api/action/LabKeyErrorWithLink.java index 086a99ebe5a..98d18f53bf8 100644 --- a/api/src/org/labkey/api/action/LabKeyErrorWithLink.java +++ b/api/src/org/labkey/api/action/LabKeyErrorWithLink.java @@ -3,7 +3,7 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.util.HtmlString; import org.labkey.api.util.HtmlStringBuilder; -import org.labkey.api.util.Link.LinkBuilder; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.view.ViewContext; public class LabKeyErrorWithLink extends LabKeyError diff --git a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java index d4f39807530..09b3dac4581 100644 --- a/api/src/org/labkey/api/assay/AssayQCFlagColumn.java +++ b/api/src/org/labkey/api/assay/AssayQCFlagColumn.java @@ -32,7 +32,7 @@ import org.labkey.api.query.ExprColumn; import org.labkey.api.query.FieldKey; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.Link; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; import org.labkey.api.view.template.ClientDependency; @@ -99,7 +99,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit // 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 - Link.LinkBuilder linkBuilder = new Link.LinkBuilder(getCollapsedQCFlagOutput(values, enabled)) + LinkBuilder linkBuilder = new LinkBuilder(getCollapsedQCFlagOutput(values, enabled)) .onClick("showQCFlagToggleWindow(" + jsString(_schemaName) + ", " + runId + "," + _editable + "); return false;"); oldWriter.write(linkBuilder.toString()); } diff --git a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java index f96c9ed1268..ca03044d0a0 100644 --- a/api/src/org/labkey/api/assay/actions/UploadWizardAction.java +++ b/api/src/org/labkey/api/assay/actions/UploadWizardAction.java @@ -76,11 +76,11 @@ 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.LinkBuilder; 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.util.InputBuilder; import org.labkey.api.view.ActionURL; import org.labkey.api.view.HtmlView; import org.labkey.api.view.HttpView; @@ -902,7 +902,7 @@ public boolean isEditable() @Override public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value) { - out.write(new Input.InputBuilder<>().type("text").name(_inputName).value(value == null ? null : value.toString())); + out.write(InputBuilder.text().name(_inputName).value(value == null ? null : value.toString())); } @Override @@ -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 Link.LinkBuilder("Too many errors to display (click to show all).").id("extraErrors").onClick(script).getHtmlString()); + sb.append(new LinkBuilder("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/data/AbstractFileDisplayColumn.java b/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java index 55ec297375b..088b506bef7 100644 --- a/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java +++ b/api/src/org/labkey/api/data/AbstractFileDisplayColumn.java @@ -23,7 +23,7 @@ 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.InputBuilder; +import org.labkey.api.util.InputBuilder; import org.labkey.api.view.HttpView; import org.labkey.api.writer.HtmlWriter; @@ -273,11 +273,10 @@ public void renderInputHtml(RenderContext ctx, HtmlWriter out, Object value) String filename = getFileName(ctx, value); String formFieldName = ctx.getForm().getFormFieldName(getBoundColumn()); - InputBuilder input = new InputBuilder<>() - .type("file") - .name(formFieldName) - .disabled(isDisabledInput(ctx)) - .needsWrapping(false); + InputBuilder input = InputBuilder.file() + .name(formFieldName) + .disabled(isDisabledInput(ctx)) + .needsWrapping(false); if (null != filename) { diff --git a/api/src/org/labkey/api/data/ActionButton.java b/api/src/org/labkey/api/data/ActionButton.java index 9ece1a85375..d39839d6c57 100644 --- a/api/src/org/labkey/api/data/ActionButton.java +++ b/api/src/org/labkey/api/data/ActionButton.java @@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.query.DetailsURL; -import org.labkey.api.util.Button; +import org.labkey.api.util.ButtonBuilder; import org.labkey.api.util.JavaScriptFragment; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.StringExpression; @@ -377,7 +377,7 @@ public void render(RenderContext ctx, Writer out) throws IOException lock(); - Button.ButtonBuilder button = PageFlowUtil.button(getCaption(ctx)) + ButtonBuilder button = PageFlowUtil.button(getCaption(ctx)) .disableOnClick(_disableOnClick) .iconCls(getIconCls()) .tooltip(getTooltip()) diff --git a/api/src/org/labkey/api/data/CrosstabDataRegion.java b/api/src/org/labkey/api/data/CrosstabDataRegion.java index c8fda5034d4..0a1346fa687 100644 --- a/api/src/org/labkey/api/data/CrosstabDataRegion.java +++ b/api/src/org/labkey/api/data/CrosstabDataRegion.java @@ -19,7 +19,7 @@ import org.labkey.api.query.CrosstabView; import org.labkey.api.util.DOM.Renderable; import org.labkey.api.util.HtmlString; -import org.labkey.api.util.Link; +import org.labkey.api.util.LinkBuilder; import org.labkey.api.util.Pair; import org.labkey.api.util.SafeToRender; import org.labkey.api.writer.HtmlWriter; @@ -134,7 +134,7 @@ protected SafeToRender getMemberCaptionWithUrl(String caption, String url) { if (url != null) { - return new Link.LinkBuilder(caption).href(url); + return new LinkBuilder(caption).href(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 4adbefe90dc..0a67b311026 100644 --- a/api/src/org/labkey/api/data/DataColumn.java +++ b/api/src/org/labkey/api/data/DataColumn.java @@ -38,18 +38,17 @@ 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.LinkBuilder; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.SimpleNamedObject; import org.labkey.api.util.StringExpression; import org.labkey.api.util.StringExpressionFactory; import org.labkey.api.util.StringUtilsLabKey; import org.labkey.api.util.UniqueID; -import org.labkey.api.util.element.Input; -import org.labkey.api.util.element.Option; -import org.labkey.api.util.element.Option.OptionBuilder; -import org.labkey.api.util.element.Select; -import org.labkey.api.util.element.TextArea; +import org.labkey.api.util.InputBuilder; +import org.labkey.api.util.OptionBuilder; +import org.labkey.api.util.SelectBuilder; +import org.labkey.api.util.TextAreaBuilder; import org.labkey.api.view.ActionURL; import org.labkey.api.view.HttpView; import org.labkey.api.view.TypeAheadSelectDisplayColumn; @@ -393,7 +392,7 @@ public void renderGridCellContents(RenderContext ctx, Writer oldWriter, HtmlWrit if (StringUtils.isNotBlank(url)) { - Link.LinkBuilder link = new Link.LinkBuilder(formattedValue).href(url).clearClasses(); + LinkBuilder link = new LinkBuilder(formattedValue).href(url).clearClasses(); String linkTitle = renderURLTitle(ctx); if (null != linkTitle) @@ -721,12 +720,12 @@ else if (_inputType.equalsIgnoreCase("checkbox")) private void renderSelectFormInput(HtmlWriter out, String formFieldName, Object value, String strVal, boolean disabledInput, NamedObjectList entryList) { - Select.SelectBuilder select = new Select.SelectBuilder() + SelectBuilder select = new SelectBuilder() .disabled(disabledInput) .multiple("select.multiple".equalsIgnoreCase(_inputType)) .name(formFieldName); - List