Skip to content

Commit e207c18

Browse files
committed
Fix race condition by hiding Build Now button until JS is ready
1 parent 6f6a997 commit e207c18

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

core/src/main/resources/lib/hudson/project/configurable.jelly

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ THE SOFTWARE.
3232
<st:adjunct includes="lib.hudson.project.configurable.configurable"/>
3333
<j:set var="buildUrl" value="${url}/build?delay=0sec"/>
3434
<j:set var="taskHref" value="${it.parameterized ? buildUrl : '#'}"/>
35-
<l:task href="${taskHref}" data-task-href="${buildUrl}" icon="icon-clock icon-md" permission="${it.BUILD}" post="${!it.parameterized}" data-callback="lib_hudson_project_configurable_build_now_callback" data-task-failure="${%buildFailed}" data-task-success="${%Build scheduled}" data-parameterized="${it.parameterized}" title="${it.buildNowText}"/>
35+
<div id="build-now-container" style="display: none;">
36+
<l:task href="${taskHref}" data-task-href="${buildUrl}" icon="icon-clock icon-md" permission="${it.BUILD}" post="${!it.parameterized}" data-callback="lib_hudson_project_configurable_build_now_callback" data-task-failure="${%buildFailed}" data-task-success="${%Build scheduled}" data-parameterized="${it.parameterized}" title="${it.buildNowText}"/>
37+
</div>
3638
</j:if>
3739
<j:choose>
3840
<j:when test="${h.hasPermission(it,it.CONFIGURE)}">

core/src/main/resources/lib/hudson/project/configurable/configurable.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,25 @@
2424
}
2525
}
2626
window.lib_hudson_project_configurable_build_now_callback = foo;
27+
28+
function show() {
29+
var c = document.getElementById("build-now-container");
30+
if (c) {
31+
c.style.display = "block";
32+
return true;
33+
}
34+
return false;
35+
}
36+
37+
// Run immediately in case the element is already there
38+
show();
39+
40+
// Always observe the document for changes (e.g. AJAX updates replacing the sidepanel)
41+
var observer = new MutationObserver(show);
42+
observer.observe(document, { childList: true, subtree: true });
43+
44+
// Also listen for DOMContentLoaded as a fallback
45+
if (document.readyState === "loading") {
46+
document.addEventListener("DOMContentLoaded", show);
47+
}
2748
})();

0 commit comments

Comments
 (0)