diff --git a/.editorconfig b/.editorconfig index af8f0cf310a8..049d90619a70 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,6 @@ root = true -[*.{js, scss, css, hbs}] +[*.{js, scss, css, hbs, svg}] indent_style = space indent_size = 2 trim_trailing_whitespace = true diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index.jelly b/core/src/main/resources/hudson/model/AbstractBuild/index.jelly index 8444984d49cd..aba425c3420b 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index.jelly +++ b/core/src/main/resources/hudson/model/AbstractBuild/index.jelly @@ -76,7 +76,7 @@ THE SOFTWARE. - ${dep.from.displayName} + ${dep.from.displayName} ? @@ -86,7 +86,7 @@ THE SOFTWARE. → - ${dep.to.displayName} + ${dep.to.displayName} (${%detail}) diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly b/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly index 4021ab4109a4..56201d48dab8 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly @@ -31,6 +31,14 @@ THE SOFTWARE. +

${%Build Time Trend}

[${%Build time graph}] diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_resources.js b/core/src/main/resources/hudson/model/Job/buildTimeTrend_resources.js index 105cdbc06ed2..eadcb5970622 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend_resources.js +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_resources.js @@ -67,76 +67,11 @@ window.buildTimeTrend_displayBuilds = function (data) { /** * Generate SVG Icon */ -function generateSVGIcon(iconName, iconSizeClass) { - const imagesURL = document.head.getAttribute("data-imagesurl"); - - const isInProgress = iconName.endsWith("anime"); - let buildStatus = "never-built"; - switch (iconName) { - case "red": - case "red-anime": - buildStatus = "last-failed"; - break; - case "yellow": - case "yellow-anime": - buildStatus = "last-unstable"; - break; - case "blue": - case "blue-anime": - buildStatus = "last-successful"; - break; - case "grey": - case "grey-anime": - case "disabled": - case "disabled-anime": - buildStatus = "last-disabled"; - break; - case "aborted": - case "aborted-anime": - buildStatus = "last-aborted"; - break; - case "nobuilt": - case "nobuilt-anime": - buildStatus = "never-built"; - break; - } +function generateSVGIcon(iconName) { + const icons = document.querySelector("#jenkins-build-status-icons"); + iconName = iconName.replace("-anime", ""); - const svg1 = document.createElementNS("http://www.w3.org/2000/svg", "svg"); - svg1.setAttribute("class", "svg-icon"); - svg1.setAttribute("viewBox", "0 0 24 24"); - const use1 = document.createElementNS("http://www.w3.org/2000/svg", "use"); - use1.setAttribute( - "href", - imagesURL + - "/build-status/build-status-sprite.svg#build-status-" + - (isInProgress ? "in-progress" : "static"), - ); - svg1.appendChild(use1); - - const svg2 = document.createElementNS("http://www.w3.org/2000/svg", "svg"); - svg2.setAttribute( - "class", - "svg-icon icon-" + iconName + " " + (iconSizeClass || "icon-sm"), - ); - svg2.setAttribute("viewBox", "0 0 24 24"); - const use2 = document.createElementNS("http://www.w3.org/2000/svg", "use"); - use2.setAttribute( - "href", - imagesURL + "/build-status/build-status-sprite.svg#" + buildStatus, - ); - svg2.appendChild(use2); - - const span = document.createElement("span"); - span.classList.add("build-status-icon__wrapper", "icon-" + iconName); - - let span2 = document.createElement("span"); - span2.classList.add("build-status-icon__outer"); - span2.appendChild(svg1); - - span.appendChild(span2); - span.appendChild(svg2); - - return span; + return icons.content.querySelector(`#${iconName}`).cloneNode(true); } /** @@ -155,7 +90,7 @@ window.displayBuilds = function (data) { td1.classList.add("jenkins-table__cell--tight", "jenkins-table__icon"); var div1 = document.createElement("div"); div1.classList.add("jenkins-table__cell__button-wrapper"); - var svg = generateSVGIcon(e.iconName, p.dataset.iconSizeClass); + var svg = generateSVGIcon(e.iconName); div1.appendChild(svg); td1.appendChild(div1); tr.appendChild(td1); diff --git a/core/src/main/resources/hudson/model/Job/index.jelly b/core/src/main/resources/hudson/model/Job/index.jelly index 23a454b4d52e..0fb537e267d7 100644 --- a/core/src/main/resources/hudson/model/Job/index.jelly +++ b/core/src/main/resources/hudson/model/Job/index.jelly @@ -33,7 +33,7 @@ THE SOFTWARE. - +

diff --git a/core/src/main/resources/hudson/model/Run/statusIcon.jelly b/core/src/main/resources/hudson/model/Run/statusIcon.jelly index 6ef664c98efe..650605c7e025 100644 --- a/core/src/main/resources/hudson/model/Run/statusIcon.jelly +++ b/core/src/main/resources/hudson/model/Run/statusIcon.jelly @@ -31,6 +31,6 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/views/StatusColumn/column.jelly b/core/src/main/resources/hudson/views/StatusColumn/column.jelly index 5297d99809a3..5ac989e40521 100644 --- a/core/src/main/resources/hudson/views/StatusColumn/column.jelly +++ b/core/src/main/resources/hudson/views/StatusColumn/column.jelly @@ -23,6 +23,18 @@ THE SOFTWARE. --> - - - \ No newline at end of file + + +
+ + + + + + + + + +
+ +
diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly index 366071ebf7fa..d203b8a98344 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly @@ -39,7 +39,7 @@ THE SOFTWARE.
${build.displayName} diff --git a/core/src/main/resources/jenkins/model/Jenkins/_legend.jelly b/core/src/main/resources/jenkins/model/Jenkins/_legend.jelly index 9ae7a079e739..90d8e8b89a13 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_legend.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/_legend.jelly @@ -29,87 +29,87 @@ THE SOFTWARE.
- +
${%blue}
- +
${%blue_anime}
- +
${%yellow}
- +
${%yellow_anime}
- +
${%red}
- +
${%red_anime}
- +
${%lightgrey}
- +
${%lightgrey_anime}
- +
- ${%grey} + ${%darkgrey}
- +
- ${%grey_anime} + ${%darkgrey_anime}
- +
- ${%darkgrey} + ${%grey}
- +
- ${%darkgrey_anime} + ${%grey_anime}
diff --git a/core/src/main/resources/lib/hudson/buildCaption.jelly b/core/src/main/resources/lib/hudson/buildCaption.jelly index b8fab1554e31..2f29e2808f4b 100644 --- a/core/src/main/resources/lib/hudson/buildCaption.jelly +++ b/core/src/main/resources/lib/hudson/buildCaption.jelly @@ -29,7 +29,7 @@ THE SOFTWARE.
-

diff --git a/core/src/main/resources/lib/hudson/buildLink.jelly b/core/src/main/resources/lib/hudson/buildLink.jelly index 18ccfc1ec675..ad23bfbbd763 100644 --- a/core/src/main/resources/lib/hudson/buildLink.jelly +++ b/core/src/main/resources/lib/hudson/buildLink.jelly @@ -52,7 +52,7 @@ THE SOFTWARE. - ${jobName_}#${number} + ${jobName_}#${number} diff --git a/core/src/main/resources/lib/hudson/buildListTable.jelly b/core/src/main/resources/lib/hudson/buildListTable.jelly index cd617715838e..608af80d421b 100644 --- a/core/src/main/resources/lib/hudson/buildListTable.jelly +++ b/core/src/main/resources/lib/hudson/buildListTable.jelly @@ -30,6 +30,15 @@ THE SOFTWARE. A collection of builds to be displayed. + diff --git a/core/src/main/resources/lib/hudson/jobLink.jelly b/core/src/main/resources/lib/hudson/jobLink.jelly index 0aaa0dcc7d5a..af40d22b37ae 100644 --- a/core/src/main/resources/lib/hudson/jobLink.jelly +++ b/core/src/main/resources/lib/hudson/jobLink.jelly @@ -31,7 +31,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/hudson/projectView.jelly b/core/src/main/resources/lib/hudson/projectView.jelly index e2bae523dfcf..27d5cf967c6d 100644 --- a/core/src/main/resources/lib/hudson/projectView.jelly +++ b/core/src/main/resources/lib/hudson/projectView.jelly @@ -93,7 +93,15 @@ THE SOFTWARE.
- + + + + + + + + +

${job.displayName}

diff --git a/war/src/main/resources/images/symbols/status-aborted-anime.svg b/war/src/main/resources/images/symbols/status-aborted-anime.svg new file mode 100644 index 000000000000..308e6d7578c7 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-aborted-anime.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/war/src/main/resources/images/symbols/status-aborted.svg b/war/src/main/resources/images/symbols/status-aborted.svg new file mode 100644 index 000000000000..fee388a4f27b --- /dev/null +++ b/war/src/main/resources/images/symbols/status-aborted.svg @@ -0,0 +1,4 @@ + + + + diff --git a/war/src/main/resources/images/symbols/status-blue-anime.svg b/war/src/main/resources/images/symbols/status-blue-anime.svg new file mode 100644 index 000000000000..b11da163e9f7 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-blue-anime.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/war/src/main/resources/images/symbols/status-blue.svg b/war/src/main/resources/images/symbols/status-blue.svg new file mode 100644 index 000000000000..2427dd5286dc --- /dev/null +++ b/war/src/main/resources/images/symbols/status-blue.svg @@ -0,0 +1,4 @@ + + + + diff --git a/war/src/main/resources/images/symbols/status-disabled-anime.svg b/war/src/main/resources/images/symbols/status-disabled-anime.svg new file mode 100644 index 000000000000..138edc7a9ec3 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-disabled-anime.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/war/src/main/resources/images/symbols/status-disabled.svg b/war/src/main/resources/images/symbols/status-disabled.svg new file mode 100644 index 000000000000..32aa7eaef687 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-disabled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/war/src/main/resources/images/symbols/status-nobuilt-anime.svg b/war/src/main/resources/images/symbols/status-nobuilt-anime.svg new file mode 100644 index 000000000000..9a534d34d237 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-nobuilt-anime.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/war/src/main/resources/images/symbols/status-nobuilt.svg b/war/src/main/resources/images/symbols/status-nobuilt.svg new file mode 100644 index 000000000000..a2ba0f13edbc --- /dev/null +++ b/war/src/main/resources/images/symbols/status-nobuilt.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/war/src/main/resources/images/symbols/status-red-anime.svg b/war/src/main/resources/images/symbols/status-red-anime.svg new file mode 100644 index 000000000000..76b3bca95af1 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-red-anime.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/war/src/main/resources/images/symbols/status-red.svg b/war/src/main/resources/images/symbols/status-red.svg new file mode 100644 index 000000000000..547dc4a13f2d --- /dev/null +++ b/war/src/main/resources/images/symbols/status-red.svg @@ -0,0 +1,4 @@ + + + + diff --git a/war/src/main/resources/images/symbols/status-yellow-anime.svg b/war/src/main/resources/images/symbols/status-yellow-anime.svg new file mode 100644 index 000000000000..c241c3c88024 --- /dev/null +++ b/war/src/main/resources/images/symbols/status-yellow-anime.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/war/src/main/resources/images/symbols/status-yellow.svg b/war/src/main/resources/images/symbols/status-yellow.svg new file mode 100644 index 000000000000..57aab84b73de --- /dev/null +++ b/war/src/main/resources/images/symbols/status-yellow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/war/src/main/scss/base/_style.scss b/war/src/main/scss/base/_style.scss index ecda3df84a4e..2abd6d4ef10a 100644 --- a/war/src/main/scss/base/_style.scss +++ b/war/src/main/scss/base/_style.scss @@ -866,13 +866,22 @@ table.progress-bar.red td.progress-bar-done { /* Unknown */ +[data-symbol-animation] { + animation: spin 1s linear infinite; + transform-origin: center; + + @media (prefers-reduced-motion) { + animation-duration: 3s; + } +} + @keyframes spin { from { - transform: rotate(0deg) translateZ(0); + transform: rotate(0deg); } to { - transform: rotate(360deg) translateZ(0); + transform: rotate(360deg); } } diff --git a/war/src/main/scss/components/_app-bar.scss b/war/src/main/scss/components/_app-bar.scss index 1e5af8727f88..0cff962e7967 100644 --- a/war/src/main/scss/components/_app-bar.scss +++ b/war/src/main/scss/components/_app-bar.scss @@ -81,8 +81,7 @@ overflow: hidden; text-overflow: ellipsis; - .build-status-icon__wrapper, - .build-status-icon__wrapper svg { + svg { width: 2rem !important; height: 2rem !important; } diff --git a/war/src/main/scss/components/_side-panel-widgets.scss b/war/src/main/scss/components/_side-panel-widgets.scss index 9d6933953efb..037674f61b88 100644 --- a/war/src/main/scss/components/_side-panel-widgets.scss +++ b/war/src/main/scss/components/_side-panel-widgets.scss @@ -156,6 +156,7 @@ .build-row-cell .pane.build-name .build-icon { position: absolute; + margin-top: 2px; z-index: 1; } diff --git a/war/src/main/scss/pages/_dashboard.scss b/war/src/main/scss/pages/_dashboard.scss index 732b7db61001..cb029a9861a9 100644 --- a/war/src/main/scss/pages/_dashboard.scss +++ b/war/src/main/scss/pages/_dashboard.scss @@ -169,3 +169,14 @@ $min-button-size: 36px; } } } + +.build-status-link { + display: inline-flex; + align-items: center; + justify-content: center; + + svg { + width: 1rem; + height: 1rem; + } +}