From 6988935df37463a2c19475802ccfe9ef1e67f6de Mon Sep 17 00:00:00 2001 From: Mark Waite Date: Thu, 25 May 2023 16:11:24 -0600 Subject: [PATCH] [JENKINS-71345] Revert "Add updates count badge to Updates sidebar item (#7084)" The "Manage Jenkins" / "System" drop down menu includes the extra text "undefined" at the end of each entry. This removes that change and removes the updates count badge from the updates sidebar. This reverts commit 291f5edcc5942c4efc65cc96121f7624f45bf3c3. --- .../hudson/model/ManageJenkinsAction.java | 7 +-- .../main/java/hudson/model/UpdateCenter.java | 47 --------------- .../main/java/jenkins/management/Badge.java | 5 -- .../java/jenkins/management/PluginsLink.java | 44 +++++++++++++- .../model/ModelObjectWithContextMenu.java | 25 -------- .../hudson/PluginManager/sidepanel.jelly | 2 +- .../model/ManageJenkinsAction/index.jelly | 2 +- .../main/resources/lib/layout/breadcrumbs.js | 60 +++---------------- core/src/main/resources/lib/layout/task.jelly | 18 ------ war/src/main/less/base/yui-compatibility.less | 15 ----- .../main/less/modules/side-panel-tasks.less | 4 ++ 11 files changed, 59 insertions(+), 170 deletions(-) diff --git a/core/src/main/java/hudson/model/ManageJenkinsAction.java b/core/src/main/java/hudson/model/ManageJenkinsAction.java index a0eda48159db..186406fcd02a 100644 --- a/core/src/main/java/hudson/model/ManageJenkinsAction.java +++ b/core/src/main/java/hudson/model/ManageJenkinsAction.java @@ -27,7 +27,6 @@ import hudson.Extension; import hudson.Util; import java.io.IOException; -import jenkins.management.Badge; import jenkins.model.Jenkins; import jenkins.model.ModelObjectWithContextMenu; import org.apache.commons.jelly.JellyException; @@ -79,13 +78,13 @@ public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse respons * menu. */ @Restricted(NoExternalUse.class) - public void addContextMenuItem(ContextMenu menu, String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation, Badge badge) { + public void addContextMenuItem(ContextMenu menu, String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation) { if (Stapler.getCurrentRequest().findAncestorObject(this.getClass()) != null || !Util.isSafeToRedirectTo(url)) { // Default behavior if the URL is absolute or scheme-relative, or the current object is an ancestor (i.e. would resolve correctly) - menu.add(url, icon, iconXml, text, post, requiresConfirmation, badge); + menu.add(url, icon, iconXml, text, post, requiresConfirmation); return; } // If neither is the case, rewrite the relative URL to point to inside the /manage/ URL space - menu.add("manage/" + url, icon, iconXml, text, post, requiresConfirmation, badge); + menu.add("manage/" + url, icon, iconXml, text, post, requiresConfirmation); } } diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index b9ca1d2001b8..d666e3690f57 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -106,7 +106,6 @@ import jenkins.MissingDependencyException; import jenkins.RestartRequiredException; import jenkins.install.InstallUtil; -import jenkins.management.Badge; import jenkins.model.Jenkins; import jenkins.security.stapler.StaplerDispatchable; import jenkins.util.SystemProperties; @@ -378,52 +377,6 @@ public InstallationJob getJob(Plugin plugin) { return null; } - @Restricted(NoExternalUse.class) - public Badge getBadge() { - if (!isSiteDataReady()) { - // Do not display message during this page load, but possibly later. - return null; - } - List plugins = getUpdates(); - int size = plugins.size(); - if (size > 0) { - StringBuilder tooltip = new StringBuilder(); - Badge.Severity severity = Badge.Severity.WARNING; - int securityFixSize = (int) plugins.stream().filter(plugin -> plugin.fixesSecurityVulnerabilities()).count(); - int incompatibleSize = (int) plugins.stream().filter(plugin -> !plugin.isCompatibleWithInstalledVersion()).count(); - if (size > 1) { - tooltip.append(jenkins.management.Messages.PluginsLink_updatesAvailable(size)); - } else { - tooltip.append(jenkins.management.Messages.PluginsLink_updateAvailable()); - } - switch (incompatibleSize) { - case 0: - break; - case 1: - tooltip.append("\n").append(jenkins.management.Messages.PluginsLink_incompatibleUpdateAvailable()); - break; - default: - tooltip.append("\n").append(jenkins.management.Messages.PluginsLink_incompatibleUpdatesAvailable(incompatibleSize)); - break; - } - switch (securityFixSize) { - case 0: - break; - case 1: - tooltip.append("\n").append(jenkins.management.Messages.PluginsLink_securityUpdateAvailable()); - severity = Badge.Severity.DANGER; - break; - default: - tooltip.append("\n").append(jenkins.management.Messages.PluginsLink_securityUpdatesAvailable(securityFixSize)); - severity = Badge.Severity.DANGER; - break; - } - return new Badge(Integer.toString(size), tooltip.toString(), severity); - } - return null; - - } - /** * Get the current connection status. *

diff --git a/core/src/main/java/jenkins/management/Badge.java b/core/src/main/java/jenkins/management/Badge.java index 67528ad56b32..3727ed391573 100644 --- a/core/src/main/java/jenkins/management/Badge.java +++ b/core/src/main/java/jenkins/management/Badge.java @@ -29,8 +29,6 @@ import hudson.model.AdministrativeMonitor; import hudson.model.ManagementLink; import java.util.Locale; -import org.kohsuke.stapler.export.Exported; -import org.kohsuke.stapler.export.ExportedBean; /** * Definition of a badge that can be returned by a {@link ManagementLink} implementation. @@ -50,7 +48,6 @@ * * @since 2.385 */ -@ExportedBean public class Badge { private final String text; @@ -78,7 +75,6 @@ public Badge(@NonNull String text, @NonNull String tooltip, @NonNull Severity se * * @return badge text */ - @Exported(visibility = 999) public String getText() { return text; } @@ -88,7 +84,6 @@ public String getText() { * * @return tooltip */ - @Exported(visibility = 999) public String getTooltip() { return tooltip; } diff --git a/core/src/main/java/jenkins/management/PluginsLink.java b/core/src/main/java/jenkins/management/PluginsLink.java index 0db05bfc8d43..f93579275202 100644 --- a/core/src/main/java/jenkins/management/PluginsLink.java +++ b/core/src/main/java/jenkins/management/PluginsLink.java @@ -28,7 +28,9 @@ import hudson.Extension; import hudson.model.ManagementLink; import hudson.model.UpdateCenter; +import hudson.model.UpdateSite.Plugin; import hudson.security.Permission; +import java.util.List; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; @@ -73,6 +75,46 @@ public Category getCategory() { @Override public Badge getBadge() { final UpdateCenter updateCenter = Jenkins.get().getUpdateCenter(); - return updateCenter.getBadge(); + if (!updateCenter.isSiteDataReady()) { + // Do not display message during this page load, but possibly later. + return null; + } + List plugins = updateCenter.getUpdates(); + int size = plugins.size(); + if (size > 0) { + StringBuilder tooltip = new StringBuilder(); + Badge.Severity severity = Badge.Severity.WARNING; + int securityFixSize = (int) plugins.stream().filter(plugin -> plugin.fixesSecurityVulnerabilities()).count(); + int incompatibleSize = (int) plugins.stream().filter(plugin -> !plugin.isCompatibleWithInstalledVersion()).count(); + if (size > 1) { + tooltip.append(Messages.PluginsLink_updatesAvailable(size)); + } else { + tooltip.append(Messages.PluginsLink_updateAvailable()); + } + switch (incompatibleSize) { + case 0: + break; + case 1: + tooltip.append("\n").append(Messages.PluginsLink_incompatibleUpdateAvailable()); + break; + default: + tooltip.append("\n").append(Messages.PluginsLink_incompatibleUpdatesAvailable(incompatibleSize)); + break; + } + switch (securityFixSize) { + case 0: + break; + case 1: + tooltip.append("\n").append(Messages.PluginsLink_securityUpdateAvailable()); + severity = Badge.Severity.DANGER; + break; + default: + tooltip.append("\n").append(Messages.PluginsLink_securityUpdatesAvailable(securityFixSize)); + severity = Badge.Severity.DANGER; + break; + } + return new Badge(Integer.toString(size), tooltip.toString(), severity); + } + return null; } } diff --git a/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java b/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java index 52b49131ad79..bc45b1a3cb51 100644 --- a/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java +++ b/core/src/main/java/jenkins/model/ModelObjectWithContextMenu.java @@ -17,7 +17,6 @@ import java.util.Collection; import java.util.List; import javax.servlet.ServletException; -import jenkins.management.Badge; import org.apache.commons.jelly.JellyContext; import org.apache.commons.jelly.JellyException; import org.apache.commons.jelly.JellyTagException; @@ -150,19 +149,6 @@ public ContextMenu add(String url, String icon, String iconXml, String text, boo return this; } - /** @since TODO */ - public ContextMenu add(String url, String icon, String iconXml, String text, boolean post, boolean requiresConfirmation, Badge badge) { - if (text != null && icon != null && url != null) { - MenuItem item = new MenuItem(url, icon, text); - item.iconXml = iconXml; - item.post = post; - item.requiresConfirmation = requiresConfirmation; - item.badge = badge; - items.add(item); - } - return this; - } - /** * Add a header row (no icon, no URL, rendered in header style). * @@ -331,8 +317,6 @@ class MenuItem { public boolean requiresConfirmation; - private Badge badge; - /** * The type of menu item * @since 2.340 @@ -353,15 +337,6 @@ public String getIconXml() { return iconXml; } - /** - * The badge to display for the context menu item - * @since TODO - */ - @Exported - public Badge getBadge() { - return badge; - } - public MenuItem(String url, String icon, String displayName) { withUrl(url).withIcon(icon).withDisplayName(displayName); } diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel.jelly b/core/src/main/resources/hudson/PluginManager/sidepanel.jelly index 6c45382c9e03..253cdb28f595 100644 --- a/core/src/main/resources/hudson/PluginManager/sidepanel.jelly +++ b/core/src/main/resources/hudson/PluginManager/sidepanel.jelly @@ -29,7 +29,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly b/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly index 79cadc127ca9..f386193a3a40 100644 --- a/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly +++ b/core/src/main/resources/hudson/model/ManageJenkinsAction/index.jelly @@ -60,7 +60,7 @@ THE SOFTWARE. - ${taskTags!=null and attrs.contextMenu!='false' ? it.addContextMenuItem(taskTags, m.urlName, iconSrc, iconXml, m.displayName, m.requiresPOST, m.requiresConfirmation, m.badge) : null} + ${taskTags!=null and attrs.contextMenu!='false' ? it.addContextMenuItem(taskTags, m.urlName, iconSrc, iconXml, m.displayName, m.requiresPOST, m.requiresConfirmation) : null} diff --git a/core/src/main/resources/lib/layout/breadcrumbs.js b/core/src/main/resources/lib/layout/breadcrumbs.js index 82ba369531cb..9bec866957f1 100644 --- a/core/src/main/resources/lib/layout/breadcrumbs.js +++ b/core/src/main/resources/lib/layout/breadcrumbs.js @@ -22,51 +22,15 @@ window.breadcrumbs = (function () { var logger = function () {}; // logger = function() { console.log.apply(console,arguments) }; // uncomment this line to enable logging - // TODO - Use util/security.js xmlEscape in #7474 - function xmlEscape(str) { - if (!str) { - return; - } - - return str.replace(/[<>&'"]/g, (match) => { - switch (match) { - case "<": - return "<"; - case ">": - return ">"; - case "&": - return "&"; - case "'": - return "'"; - case '"': - return """; - } - }); - } - - function makeMenuHtml(icon, iconXml, displayName, badge) { + function makeMenuHtml(icon, iconXml, displayName) { var displaynameSpan = "" + displayName + ""; - let badgeText; - let badgeTooltip; - if (badge) { - badgeText = xmlEscape(badge.text); - badgeTooltip = xmlEscape(badge.tooltip); - } - const badgeSpan = - badge === null - ? "" - : `${badgeText}`; if (iconXml != null) { - return iconXml + displaynameSpan + badgeSpan; + return iconXml + displaynameSpan; } if (icon === null) { - return ( - "" + - displaynameSpan + - badgeSpan - ); + return "" + displaynameSpan; } // TODO: move this to the API response in a clean way @@ -77,13 +41,11 @@ window.breadcrumbs = (function () { icon + "' />" + "" + - displaynameSpan + - badgeSpan + displaynameSpan : "" + - displaynameSpan + - badgeSpan; + displaynameSpan; } Event.observe(window, "load", function () { @@ -194,8 +156,6 @@ window.breadcrumbs = (function () { menu.addItems(items); menu.render("breadcrumb-menu-target"); menu.show(); - - Behaviour.applySubtree(menu.body); } // ignore the currently pending call @@ -220,20 +180,14 @@ window.breadcrumbs = (function () { e.text = makeMenuHtml( e.icon, e.iconXml, - "" + e.displayName + "", - e.badge + "" + e.displayName + "" ); e.disabled = true; } else if (e.type === "SEPARATOR") { e.text = "--"; e.disabled = true; } else { - e.text = makeMenuHtml( - e.icon, - e.iconXml, - e.displayName, - e.badge - ); + e.text = makeMenuHtml(e.icon, e.iconXml, e.displayName); } if (e.subMenu != null) { e.subMenu = { diff --git a/core/src/main/resources/lib/layout/task.jelly b/core/src/main/resources/lib/layout/task.jelly index 838602c0c7a8..a9f7abc9291f 100644 --- a/core/src/main/resources/lib/layout/task.jelly +++ b/core/src/main/resources/lib/layout/task.jelly @@ -75,9 +75,6 @@ THE SOFTWARE. Generally used with post="true". (onclick supersedes this except in the context menu.) - - If set, displays the value as a small badge on the right side of the sidepanel item. - Message to use for confirmation, if requested; defaults to title. @@ -136,11 +133,6 @@ THE SOFTWARE. ${title} - - - ${attrs.badge.text} - - @@ -172,11 +164,6 @@ THE SOFTWARE. ${title} - - - ${attrs.badge.text} - - @@ -186,11 +173,6 @@ THE SOFTWARE. ${title} - - - ${attrs.badge.text} - - diff --git a/war/src/main/less/base/yui-compatibility.less b/war/src/main/less/base/yui-compatibility.less index 25d30e2f0202..8c568790ac06 100644 --- a/war/src/main/less/base/yui-compatibility.less +++ b/war/src/main/less/base/yui-compatibility.less @@ -230,18 +230,3 @@ div.yahooTree td { .yui-panel .bd { background-color: var(--background) !important; } - -.yui-menu-badge { - position: relative; - margin-left: auto; - font-weight: 600; - - &::before { - content: ""; - position: absolute; - inset: 0 -0.375rem; - background: var(--text-color-secondary); - opacity: 0.1; - border-radius: 100vmax; - } -} diff --git a/war/src/main/less/modules/side-panel-tasks.less b/war/src/main/less/modules/side-panel-tasks.less index 08bbb8e7427c..28f80e65395c 100644 --- a/war/src/main/less/modules/side-panel-tasks.less +++ b/war/src/main/less/modules/side-panel-tasks.less @@ -106,6 +106,10 @@ } } + .task-link-text { + display: contents; + } + .task-link-text { display: contents; word-break: break-word;