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;