Skip to content
Merged
Show file tree
Hide file tree
Changes from 55 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
db697ec
Init
janfaracik Oct 15, 2025
c09f227
Init
janfaracik Oct 15, 2025
370220d
Init
janfaracik Oct 17, 2025
3f7c0f2
Merge branch 'defer-loading' into experimental-manage-jenkins-layout
janfaracik Oct 17, 2025
f840a00
Push
janfaracik Oct 17, 2025
526a265
Refine
janfaracik Oct 18, 2025
a5668c0
Refine
janfaracik Oct 18, 2025
2599618
Revert "Init"
janfaracik Oct 18, 2025
c6a4928
Push
janfaracik Oct 18, 2025
2e09190
Update scriptConsole.jelly
janfaracik Oct 18, 2025
4386589
Push
janfaracik Oct 18, 2025
ee7a0d6
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Oct 20, 2025
032421a
Tidy
janfaracik Oct 20, 2025
9036b62
Refine
janfaracik Oct 20, 2025
2c8d440
Refine
janfaracik Oct 20, 2025
dfaab77
Update manage.jelly
janfaracik Oct 20, 2025
cdb2171
Update configure.jelly
janfaracik Oct 20, 2025
d08a3ac
Refine UI
janfaracik Oct 20, 2025
e99c553
Refine
janfaracik Oct 20, 2025
c26408f
Update _build.scss
janfaracik Oct 20, 2025
ce732f3
Refine
janfaracik Oct 20, 2025
4046867
Refine
janfaracik Oct 20, 2025
1ebbc55
Update _layout.scss
janfaracik Oct 21, 2025
caadf7f
Push
janfaracik Oct 21, 2025
16fec47
Fix permissions
janfaracik Oct 21, 2025
4405c28
Tidy
janfaracik Oct 21, 2025
9a13f53
Update index.jelly
janfaracik Oct 21, 2025
3c12f08
Format
janfaracik Oct 21, 2025
6affa42
Update ManageJenkinsAction.java
janfaracik Oct 21, 2025
15c3e83
Push
janfaracik Oct 21, 2025
95feadb
Add experimental section jumper
janfaracik Oct 21, 2025
3068db1
Lint
janfaracik Oct 21, 2025
a95e9b5
Refine
janfaracik Oct 24, 2025
5a667bb
Fix headers
janfaracik Oct 24, 2025
5fd67a6
Remove inline styling, fix bottom app bar
janfaracik Oct 24, 2025
8d54020
Update core/pom.xml
timja Oct 24, 2025
7caac7c
Update index.jelly
janfaracik Oct 24, 2025
e6dfbfc
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Oct 24, 2025
0d936fd
Rename vars, remove experimental switcher
janfaracik Oct 25, 2025
03d9948
Update settings-subpage.jelly
janfaracik Oct 25, 2025
46368a5
Update _page-header.scss
janfaracik Oct 25, 2025
0c99d1e
Update index.jelly
janfaracik Oct 25, 2025
c2f5670
Update index.jelly
janfaracik Oct 26, 2025
b2d1a2f
Update _build.scss
janfaracik Oct 26, 2025
ea7667d
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Oct 27, 2025
7eb82d0
Remove javax exception handling...
janfaracik Oct 28, 2025
03aa268
Fix inpage jumplist
janfaracik Oct 28, 2025
33f55a0
Update defer.jelly
janfaracik Oct 28, 2025
b1889be
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Oct 30, 2025
b8bf879
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Nov 5, 2025
b9c06a1
Update pom.xml
janfaracik Nov 10, 2025
c33da8f
Update index.js
janfaracik Nov 10, 2025
ee59723
Merge branch 'master' into experimental-manage-jenkins-layout
timja Nov 10, 2025
119f957
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Nov 11, 2025
38de90c
Merge branch 'master' into experimental-manage-jenkins-layout
janfaracik Nov 11, 2025
366b31b
Fix Manage Jenkins search
janfaracik Nov 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/src/main/java/hudson/diagnosis/OldDataMonitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ public String getIconFileName() {

@Override
public String getUrlName() {
return "administrativeMonitor/OldData/";
return "administrativeMonitor/OldData/manage";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we know why manage.jelly isn't just index.jelly? Seems unnecessary.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree - happy to experiment with renaming it to index.jelly in a follow up.

manage.jelly was added in 07f0405#diff-83d7a9405bfbe87e69167b2e0bc36db7070c3de282390b72f90eac9db2adc0f8R19-R238 not clear why they didn't just use index.

}

@Override
Expand Down
18 changes: 18 additions & 0 deletions core/src/main/java/hudson/model/ManageJenkinsAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,19 @@
import hudson.Util;
import hudson.util.HudsonIsLoading;
import hudson.util.HudsonIsRestarting;
import jakarta.servlet.ServletException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.management.Badge;
import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.experimentalflags.NewManageJenkinsUserExperimentalFlag;
import org.apache.commons.jelly.JellyException;
import org.jenkinsci.Symbol;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerFallback;
import org.kohsuke.stapler.StaplerRequest2;
Expand Down Expand Up @@ -76,6 +79,21 @@
return true;
}

public HttpRedirect doIndex(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException {
try {
var newUiEnabled = new NewManageJenkinsUserExperimentalFlag().getFlagValue();

if (newUiEnabled) {

Check warning on line 86 in core/src/main/java/hudson/model/ManageJenkinsAction.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Partially covered line

Line 86 is only partially covered, one branch is missing
return new HttpRedirect("configure");

Check warning on line 87 in core/src/main/java/hudson/model/ManageJenkinsAction.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered line

Line 87 is not covered by tests
}

req.getView(this, "index.jelly").forward(req, rsp);
} catch (ServletException e) {
throw new RuntimeException(e);
}
return null;
}

@Override
public Object getStaplerFallback() {
return Jenkins.get();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* The MIT License
*
* Copyright (c) 2025, Jan Faracik
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package jenkins.model.experimentalflags;

import edu.umd.cs.findbugs.annotations.Nullable;
import hudson.Extension;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;

@Extension
@Restricted(NoExternalUse.class)
public class NewManageJenkinsUserExperimentalFlag extends BooleanUserExperimentalFlag {
public NewManageJenkinsUserExperimentalFlag() {
super("new-manage-jenkins.flag");
}

@Override
public String getDisplayName() {
return "New Manage Jenkins UI";
}

@Nullable
@Override
public String getShortDescription() {
return "Enables a sidebar for the Manage Jenkins pages for easier navigation.";

Check warning on line 47 in core/src/main/java/jenkins/model/experimentalflags/NewManageJenkinsUserExperimentalFlag.java

View check run for this annotation

ci.jenkins.io / Code Coverage

Not covered lines

Lines 41-47 are not covered by tests
}
}
188 changes: 95 additions & 93 deletions core/src/main/resources/hudson/AboutJenkins/index.jelly
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,9 @@ THE SOFTWARE.
<!-- About Jenkins page -->
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:t="/lib/hudson">
<l:layout type="one-column" permissions="${app.MANAGE_AND_SYSTEM_READ}" title="${%about(app.VERSION)}">
<l:header>
<script src="${resURL}/jsbundles/section-to-tabs.js" type="text/javascript" defer="true" />
</l:header>

<l:main-panel>
<div class="app-about-branding">
<div class="app-about-branding__aurora"></div>
<img src="${imagesURL}/svgs/logo.svg" alt="${%logo}" />
</div>

<div class="jenkins-app-bar">
<j:set var="header">
<l:view>
<div class="jenkins-app-bar jenkins-!-margin-top-2 jenkins-!-margin-bottom-4">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not using l:app-bar?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't have a slot for the version number.

<div class="jenkins-app-bar__content">
<h1 class="app-about-heading">Jenkins</h1>
<p class="app-about-version">
Expand All @@ -50,93 +41,104 @@ THE SOFTWARE.
</a>
</div>
</div>
</l:view>
</j:set>

<p class="app-about-paragraph">${%blurb}</p>
<l:settings-subpage header="${header}"
placeholder="${null}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

passing a null placeholder seems wrong why is this needed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otherwise a default app bar appears whilst its loading, its a little jarring seeing it switch to a completely different one.

permissions="${app.MANAGE_AND_SYSTEM_READ}">
<script src="${resURL}/jsbundles/section-to-tabs.js" type="text/javascript" defer="true" />

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%maven.dependencies}</h2>
<j:set var="uri" value="${it.licensesURL}"/>
<j:choose>
<j:when test="${uri != null}">
<t:thirdPartyLicenses>
<j:include uri="${uri}"/>
</t:thirdPartyLicenses>
</j:when>
<j:otherwise>
<p>${%No information recorded}</p>
</j:otherwise>
</j:choose>
</div>
<div class="app-about-branding">
<div class="app-about-branding__aurora"></div>
<img src="${imagesURL}/svgs/logo.svg" alt="${%logo}" />
</div>

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%static.dependencies}</h2>
<table class="jenkins-table sortable">
<thead>
<tr>
<th>${%Name}</th>
<th>${%Author}</th>
<th>${%Licence}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a class="jenkins-table__link" href="https://github.com/jenkins-contrib-themes/jenkins-core-theme">
Jenkins Contrib Themes
</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/afonsof">Afonso Franca</a>
</td>
<td>
<a class="jenkins-table__link" href="https://opensource.org/licenses/MIT">MIT License</a>
</td>
</tr>
<p class="jenkins-page-description jenkins-!-text-color">${%blurb}</p>

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%maven.dependencies}</h2>
<j:set var="uri" value="${it.licensesURL}"/>
<j:choose>
<j:when test="${uri != null}">
<t:thirdPartyLicenses>
<j:include uri="${uri}"/>
</t:thirdPartyLicenses>
</j:when>
<j:otherwise>
<p>${%No information recorded}</p>
</j:otherwise>
</j:choose>
</div>

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%static.dependencies}</h2>
<table class="jenkins-table sortable">
<thead>
<tr>
<th>${%Name}</th>
<th>${%Author}</th>
<th>${%Licence}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a class="jenkins-table__link" href="https://github.com/jenkins-contrib-themes/jenkins-core-theme">
Jenkins Contrib Themes
</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/afonsof">Afonso Franca</a>
</td>
<td>
<a class="jenkins-table__link" href="https://opensource.org/licenses/MIT">MIT License</a>
</td>
</tr>
<tr>
<td>
<a class="jenkins-table__link" href="https://ionic.io/ionicons">Ionicons</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/ionic-team">Ionic</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/ionic-team/ionicons/blob/master/LICENSE">MIT
License
</a>
</td>
</tr>
</tbody>
</table>
</div>

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%plugin.dependencies}</h2>
<table class="jenkins-table sortable">
<thead>
<tr>
<th>${%Name}</th>
</tr>
</thead>
<tbody>
<j:forEach var="p" items="${app.pluginManager.plugins}">
<tr>
<td>
<a class="jenkins-table__link" href="https://ionic.io/ionicons">Ionicons</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/ionic-team">Ionic</a>
</td>
<td>
<a class="jenkins-table__link" href="https://github.com/ionic-team/ionicons/blob/master/LICENSE">MIT
License
<a class="jenkins-table__link" href="${rootURL}/plugin/${p.shortName}/wrapper/thirdPartyLicenses">
<j:choose>
<j:when test="${p.active}">
${p.displayName}
</j:when>
<j:otherwise>
<strike>${p.displayName}</strike>
</j:otherwise>
</j:choose>
</a>
</td>
</tr>
</tbody>
</table>
</div>

<div class="jenkins-tab-pane">
<h2 class="jenkins-tab-pane__title">${%plugin.dependencies}</h2>
<table class="jenkins-table sortable">
<thead>
<tr>
<th>${%Name}</th>
</tr>
</thead>
<tbody>
<j:forEach var="p" items="${app.pluginManager.plugins}">
<tr>
<td>
<a class="jenkins-table__link" href="${rootURL}/plugin/${p.shortName}/wrapper/thirdPartyLicenses">
<j:choose>
<j:when test="${p.active}">
${p.displayName}
</j:when>
<j:otherwise>
<strike>${p.displayName}</strike>
</j:otherwise>
</j:choose>
</a>
</td>
</tr>
</j:forEach>
</tbody>
</table>
</div>
</l:main-panel>
</l:layout>
</j:forEach>
</tbody>
</table>
</div>
</l:settings-subpage>
</j:jelly>
17 changes: 8 additions & 9 deletions core/src/main/resources/hudson/cli/CLIAction/index.jelly
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,20 @@ THE SOFTWARE.

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt">
<j:new var="managementLink" className="jenkins.management.CliLink" />

<l:layout title="${managementLink.displayName}" permission="${app.READ}" type="one-column">
<!-- no need for additional breadcrumb here as we're on an index page already including breadcrumb -->

<l:main-panel>
<l:app-bar title="${managementLink.displayName}">
<j:set var="header">
<l:view>
<l:app-bar title="${it.displayName}">
<t:help href="https://www.jenkins.io/redirect/cli" />
</l:app-bar>

<div class="jenkins-page-description">
${%description}
</div>
</l:view>
</j:set>

<l:settings-subpage header="${header}" permission="${app.READ}">
<!-- no need for additional breadcrumb here as we're on an index page already including breadcrumb -->
<f:section title="${%Getting started}">
<ol class="jenkins-instructions">
<li>
Expand Down Expand Up @@ -79,6 +79,5 @@ THE SOFTWARE.
</tbody>
</table>
</f:section>
</l:main-panel>
</l:layout>
</l:settings-subpage>
</j:jelly>
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ THE SOFTWARE.

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<l:layout title="${%Manage Old Data}" type="one-column">
<!-- no need for additional breadcrumb here as we're on an "index" page already including breadcrumb -->
<l:main-panel>
<h1>${%Manage Old Data}</h1>
<p>${%blurb.1}</p>
<j:set var="previousIt" value="${it}" />
<j:new var="it" className="hudson.diagnosis.OldDataMonitor$ManagementLinkImpl" />

<l:settings-subpage>
<j:set var="it" value="${previousIt}" />

<p class="jenkins-!-margin-top-0">${%blurb.1}</p>
<p>${%blurb.2}</p>

<!-- First set a flag to check if we'll have any valid data -->
Expand Down Expand Up @@ -132,6 +134,5 @@ THE SOFTWARE.
<f:submit value="${%Discard Unreadable Data}"/>
</form>
</j:if>
</l:main-panel>
</l:layout>
</l:settings-subpage>
</j:jelly>
Loading
Loading