From d6868c970a06a17633cf7d145beef28598730a0b Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Wed, 11 Dec 2024 21:11:41 +0000 Subject: [PATCH 01/12] Reword javadoc --- core/src/main/java/org/jenkins/ui/icon/IconSpec.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/jenkins/ui/icon/IconSpec.java b/core/src/main/java/org/jenkins/ui/icon/IconSpec.java index c44e577e1ce0..f1bf535b6ca6 100644 --- a/core/src/main/java/org/jenkins/ui/icon/IconSpec.java +++ b/core/src/main/java/org/jenkins/ui/icon/IconSpec.java @@ -27,8 +27,7 @@ /** * Icon Specification. *
- * Plugin extension points that implement/extend Action/ManagementLink should - * also implement this interface. + * If your class provides an icon spec you should implement this interface. * * @author tom.fennelly@gmail.com * @since 2.0 From 809d2e6120b36093c60ab88e2794d14fb3aaa5ea Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:37:47 +0000 Subject: [PATCH 02/12] Make iconXml private, rename to icon --- core/src/main/java/hudson/search/Search.java | 14 +++++++------- .../js/components/command-palette/datasources.js | 2 +- src/main/js/components/command-palette/models.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 1edbfdb5dc3f..97d15b65c2df 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -277,23 +277,23 @@ public static class Item { private final String type; - public final String iconXml; + private final String icon; public Item(String name) { this(name, null, null); } - public Item(String name, String url, String iconXml) { + public Item(String name, String url, String icon) { this.name = name; this.url = url; - this.iconXml = iconXml; + this.icon = icon; this.type = "symbol"; } - public Item(String name, String url, String iconXml, String type) { + public Item(String name, String url, String icon, String type) { this.name = name; this.url = url; - this.iconXml = iconXml; + this.icon = icon; this.type = type; } @@ -303,8 +303,8 @@ public String getUrl() { } @Exported - public String getIconXml() { - return iconXml; + public String getIcon() { + return icon; } @Exported diff --git a/src/main/js/components/command-palette/datasources.js b/src/main/js/components/command-palette/datasources.js index c1666101d410..58dd5389d540 100644 --- a/src/main/js/components/command-palette/datasources.js +++ b/src/main/js/components/command-palette/datasources.js @@ -17,7 +17,7 @@ export const JenkinsSearchSource = { rsp.json().then((data) => { return data["suggestions"].slice().map((e) => LinkResult({ - icon: e.iconXml, + icon: e.icon, type: e.type, label: e.name, url: correctAddress(e.url), diff --git a/src/main/js/components/command-palette/models.js b/src/main/js/components/command-palette/models.js index b3b06f22714c..0c6a733e0d0a 100644 --- a/src/main/js/components/command-palette/models.js +++ b/src/main/js/components/command-palette/models.js @@ -5,7 +5,7 @@ import { xmlEscape } from "@/util/security"; * @param {Object} params * @param {string} params.icon * @param {string} params.label - * @param {string} params.type + * @param {'symbol' | 'image'} params.type * @param {string} params.url * @param {boolean | undefined} params.isExternal */ From 6f88637ef098bd50b11069e7f87453041828c629 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:50:26 -1000 Subject: [PATCH 03/12] Update dependency org.jenkins-ci.plugins:cloudbees-folder to v6.971.v9a_984fd08864 (#10050) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 563f7eb4b7cf..9a4bb6566077 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -218,7 +218,7 @@ THE SOFTWARE. org.jenkins-ci.plugins cloudbees-folder - 6.969.v7d22c6eb_fde1 + 6.971.v9a_984fd08864 test From 5404f14af18155d62f819279a5debddcbff794c5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:52:44 -1000 Subject: [PATCH 04/12] Update dependency org.apache.maven.skins:maven-fluido-skin to v2.0.1 (#10051) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- core/src/site/site.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/site/site.xml b/core/src/site/site.xml index 52c9edf3a7f3..3e075fe497b9 100644 --- a/core/src/site/site.xml +++ b/core/src/site/site.xml @@ -41,7 +41,7 @@ org.apache.maven.skins maven-fluido-skin - 2.0.0 + 2.0.1 From d65f0cfd0f06d2a0f76ef75639048ac68425ac19 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:36:52 +0000 Subject: [PATCH 05/12] Update dependency org.springframework:spring-framework-bom to v6.2.1 (#10053) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bom/pom.xml b/bom/pom.xml index f94253ce6f70..dc442e708a6f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -62,7 +62,7 @@ THE SOFTWARE. org.springframework spring-framework-bom - 6.2.0 + 6.2.1 pom import From bd7d299894d944282efd1aa058e60e059b08af89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:37:02 +0000 Subject: [PATCH 06/12] Update mina-sshd-api.version to v2.14.0-136.v4d2b_0853615e (#10052) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 44e2f0166269..75f7f4e7c16c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -46,7 +46,7 @@ THE SOFTWARE. localhost 8080 - 2.14.0-133.vcc091215a_358 + 2.14.0-136.v4d2b_0853615e 3107.v665000b_51092 From 8c9caff51d7069649d7af9d6edb2b693a6bed7f0 Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:39:25 +0000 Subject: [PATCH 07/12] [JENKINS-73539] Disable YUI by default (#10045) --- .../RemoveYuiUserExperimentalFlag.java | 8 ++++++++ war/src/main/webapp/scripts/hudson-behavior.js | 10 ---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/jenkins/model/experimentalflags/RemoveYuiUserExperimentalFlag.java b/core/src/main/java/jenkins/model/experimentalflags/RemoveYuiUserExperimentalFlag.java index e8f8dcc31775..418f9c4b5406 100644 --- a/core/src/main/java/jenkins/model/experimentalflags/RemoveYuiUserExperimentalFlag.java +++ b/core/src/main/java/jenkins/model/experimentalflags/RemoveYuiUserExperimentalFlag.java @@ -24,8 +24,10 @@ package jenkins.model.experimentalflags; +import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; import hudson.Extension; +import jenkins.util.SystemProperties; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -46,4 +48,10 @@ public String getDisplayName() { public String getShortDescription() { return "Remove YUI from all Jenkins UI pages. This will break anything that depends on YUI"; } + + @NonNull + @Override + public Boolean getDefaultValue() { + return SystemProperties.getBoolean(RemoveYuiUserExperimentalFlag.class.getName() + ".defaultValue", true); + } } diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 9ae3d9298d37..043dc4677375 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -194,16 +194,6 @@ var resURL = "not-defined-yet"; // eslint-disable-line no-unused-vars } })(); -(function initializeYUIDebugLogReader() { - Behaviour.addLoadEvent(function () { - var logReaderElement = document.getElementById("yui-logreader"); - if (logReaderElement !== null) { - var logReader = new YAHOO.widget.LogReader("yui-logreader"); - logReader.collapse(); - } - }); -})(); - // Form check code //======================================================== var FormChecker = { From 65bbc5d549e3d3e61c6279d92b6d7c6aea945695 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Thu, 12 Dec 2024 21:39:52 +0000 Subject: [PATCH 08/12] Refine Command Palette UI (#10046) Refine command palette Co-authored-by: Tim Jacomb <21194782+timja@users.noreply.github.com> --- .../js/components/command-palette/index.js | 18 ++++- .../scss/components/_command-palette.scss | 73 +++++++++++++------ src/main/scss/components/_dialogs.scss | 6 ++ src/main/scss/form/_search-bar.scss | 2 +- 4 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index dfb3c6eb7efe..5ece1106aed0 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -94,18 +94,23 @@ function init() { } searchResultsContainer.style.height = searchResults.offsetHeight + "px"; + debouncedSpinner.cancel(); commandPaletteSearchBarContainer.classList.remove( "jenkins-search--loading", ); }); } + const debouncedSpinner = debounce(() => { + commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + }, 150); + const debouncedLoad = debounce(() => { renderResults(); }, 150); commandPaletteInput.addEventListener("input", () => { - commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + debouncedSpinner(); debouncedLoad(); }); @@ -119,7 +124,16 @@ function init() { } function hideCommandPalette() { - commandPalette.close(); + commandPalette.setAttribute("closing", ""); + + commandPalette.addEventListener( + "animationend", + () => { + commandPalette.removeAttribute("closing"); + commandPalette.close(); + }, + { once: true }, + ); } function itemMouseEnter(item) { diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 6c3b16517e3a..8aadde54608d 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -1,13 +1,5 @@ @use "../abstracts/mixins"; -.jenkins-command-palette__dialog { - &::backdrop { - background: var(--command-palette-backdrop-background); - backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); - animation: jenkins-modal-backdrop-animate-in 0.3s; - } -} - .jenkins-command-palette__dialog { background: none; border: none; @@ -17,6 +9,41 @@ max-width: 100vw !important; margin: 0 !important; padding: 0 !important; + user-select: none; + + &::backdrop { + background: var(--command-palette-backdrop-background); + backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); + animation: jenkins-dialog-backdrop-animate-in 0.1s linear; + } + + &[open] { + animation: command-palette-animate-in 0.1s cubic-bezier(0, 0.68, 0.5, 1.5); + } + + &[closing] { + animation: command-palette-animate-out 0.1s linear; + + &::backdrop { + animation: jenkins-dialog-backdrop-animate-out 0.1s linear; + } + } +} + +@keyframes command-palette-animate-in { + from { + translate: 0 4px; + scale: 98.5%; + opacity: 0; + transform: rotateX(30deg); + } +} + +@keyframes command-palette-animate-out { + to { + scale: 98.5%; + opacity: 0; + } } .jenkins-command-palette__wrapper { @@ -40,9 +67,7 @@ --search-bar-height: 3rem !important; background: transparent; - box-shadow: - 0 0 0 20px transparent, - var(--command-palette-inset-shadow); + box-shadow: var(--command-palette-inset-shadow); margin-bottom: 1.5rem; border-radius: 1rem; transition: var(--standard-transition); @@ -71,7 +96,8 @@ border-radius: 1rem; backdrop-filter: var(--command-palette-results-backdrop-filter); box-shadow: var(--command-palette-inset-shadow); - height: 0; + // If set to 0, Safari won't always show the backdrop-filter + height: 1px; transition: height var(--standard-transition); overflow: hidden; will-change: height; @@ -83,8 +109,8 @@ padding: 0.5rem; &__heading { - font-weight: 600; - font-size: 0.85rem; + font-weight: 500; + font-size: 0.875rem; margin: 0; padding: 0.75rem 0.75rem 0.625rem; color: var(--text-color-secondary); @@ -113,8 +139,7 @@ justify-content: flex-start; background: transparent; padding: 0.75rem; - border-radius: 0.66rem; - font-weight: 600; + border-radius: 0.5rem; cursor: pointer; color: var(--text-color) !important; transition: var(--standard-transition); @@ -132,17 +157,17 @@ display: flex; align-items: center; justify-content: center; - width: 1.4rem; - height: 1.4rem; - margin-right: 12.5px; + width: 1.375rem; + height: 1.375rem; + margin-right: 0.75rem; overflow: hidden; pointer-events: none; color: var(--text-color); svg, img { - width: 1.2rem; - height: 1.2rem; + width: 1.125rem; + height: 1.125rem; } } @@ -163,10 +188,10 @@ } &__info { - font-weight: 600; - font-size: 0.85rem; + font-size: 0.875rem; margin: 0; - padding: 12.5px 12.5px 10px; + padding: 0 14px; + line-height: 46px; color: var(--text-color); span { diff --git a/src/main/scss/components/_dialogs.scss b/src/main/scss/components/_dialogs.scss index 7040c70af0e2..fbefb7bbe275 100644 --- a/src/main/scss/components/_dialogs.scss +++ b/src/main/scss/components/_dialogs.scss @@ -87,6 +87,12 @@ $jenkins-dialog-padding: 1.3rem; } } +@keyframes jenkins-dialog-backdrop-animate-out { + to { + opacity: 0; + } +} + @keyframes jenkins-dialog-animate-in { from { scale: 85%; diff --git a/src/main/scss/form/_search-bar.scss b/src/main/scss/form/_search-bar.scss index ab4f6e9718cf..e520f9c7e69b 100644 --- a/src/main/scss/form/_search-bar.scss +++ b/src/main/scss/form/_search-bar.scss @@ -133,7 +133,7 @@ place-self: center center; opacity: 0; scale: 0; - filter: blur(5px); + filter: blur(2.5px); } &::after { From d773eb93a11261d758fd1ff84710afc665557921 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Dec 2024 16:40:12 -0500 Subject: [PATCH 09/12] Expose `User.reload` as beta API (#10039) --- core/src/main/java/hudson/model/User.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 685a80e540a9..72d2719bc1ec 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -77,6 +77,7 @@ import jenkins.util.SystemProperties; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.Beta; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest2; @@ -673,9 +674,9 @@ public void doSubmitDescription(StaplerRequest2 req, StaplerResponse2 rsp) throw } /** - * To be called from {@link Jenkins#reload} only. + * Called from {@link Jenkins#reload}. */ - @Restricted(NoExternalUse.class) + @Restricted(Beta.class) public static void reload() throws IOException { UserIdMapper.getInstance().reload(); AllUsers.reload(); From 4943f167de2b2a15171f7a655c58f56c6e7ca320 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 12 Dec 2024 16:40:26 -0500 Subject: [PATCH 10/12] Recover views after error in `Jenkins.load` (#10023) * Recover views after error in `Jenkins.load` * Prevent infinite recursion in `Jenkins/sidepanel.jelly` when `Jenkins.primaryView` is null --------- Co-authored-by: Tim Jacomb <21194782+timja@users.noreply.github.com> --- core/src/main/java/jenkins/model/Jenkins.java | 14 +++++++++++--- .../jenkins/model/Jenkins/sidepanel.jelly | 7 ++++++- .../src/test/java/jenkins/model/JenkinsTest.java | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index eee96b5bca05..e643e848dd9b 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3297,11 +3297,19 @@ public void load() throws IOException { if (cfg.exists()) { // reset some data that may not exist in the disk file // so that we can take a proper compensation action later. + String originalPrimaryView = primaryView; + List originalViews = new ArrayList<>(views); primaryView = null; views.clear(); - - // load from disk - cfg.unmarshal(Jenkins.this); + try { + // load from disk + cfg.unmarshal(Jenkins.this); + } catch (IOException | RuntimeException x) { + primaryView = originalPrimaryView; + views.clear(); + views.addAll(originalViews); + throw x; + } } // initialize views by inserting the default view if necessary // this is both for clean Jenkins and for backward compatibility. diff --git a/core/src/main/resources/jenkins/model/Jenkins/sidepanel.jelly b/core/src/main/resources/jenkins/model/Jenkins/sidepanel.jelly index 9ddff73647d6..e413712d6e7c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/sidepanel.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/sidepanel.jelly @@ -23,4 +23,9 @@ THE SOFTWARE. --> - \ No newline at end of file + + + + + + diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 8469c9b46c36..acef3b6a2300 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -30,9 +30,11 @@ import static org.awaitility.Awaitility.await; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.isA; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -46,6 +48,7 @@ import hudson.XmlFile; import hudson.init.InitMilestone; import hudson.init.Initializer; +import hudson.model.AllView; import hudson.model.Computer; import hudson.model.Failure; import hudson.model.FreeStyleProject; @@ -101,6 +104,7 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.reactor.ReactorException; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; @@ -755,4 +759,16 @@ public String getUrlName() { return null; } } + + @Test + public void reloadViews() throws Exception { + assertThat(j.jenkins.getPrimaryView(), isA(AllView.class)); + assertThat(j.jenkins.getViews(), contains(isA(AllView.class))); + Files.writeString(j.jenkins.getConfigFile().getFile().toPath(), " Date: Fri, 13 Dec 2024 08:00:27 +0000 Subject: [PATCH 11/12] Update dependency com.puppycrawl.tools:checkstyle to v10.21.0 (#10055) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3adc5e2a5a49..926fb78b6de1 100644 --- a/pom.xml +++ b/pom.xml @@ -281,7 +281,7 @@ THE SOFTWARE. com.puppycrawl.tools checkstyle - 10.20.2 + 10.21.0 From 7020e80af86d6406531e4bd0cdfcd03fbce9f87c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 08:01:01 +0000 Subject: [PATCH 12/12] Update dependency org.jenkins-ci.plugins:cloudbees-folder to v6.973.vc9b_85a_61e4fc (#10056) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 9a4bb6566077..ceab77c44894 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -218,7 +218,7 @@ THE SOFTWARE. org.jenkins-ci.plugins cloudbees-folder - 6.971.v9a_984fd08864 + 6.973.vc9b_85a_61e4fc test