Skip to content

Commit 67bf1ac

Browse files
authored
Fix excessive /stages/pauseState polling (#1357)
1 parent 1cf0f01 commit 67bf1ac

3 files changed

Lines changed: 48 additions & 21 deletions

File tree

eslint.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export default [
6161
languageOptions: {
6262
globals: {
6363
dialog: "readonly",
64+
MutationObserver: "readonly",
6465
notificationBar: "readonly",
6566
},
6667
},

src/main/resources/components/temporary-wrapper.jelly

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<st:bind value="${it}" var="pauseAction${pauseProxyId}"/>
2929
<j:set var="resumeProxyId" value="${h.generateId()}" />
3030
<st:bind value="${it}" var="resumeAction${resumeProxyId}"/>
31-
<div class="jenkins-split-button">
31+
<div id="pgv-cancel-split-button" class="jenkins-split-button">
3232
<button id="pgv-cancel" data-confirm="${%Confirm(it.buildFullDisplayName)}"
3333
data-success-message="${%Build cancelled}"
3434
data-proxy-name="cancelAction${cancelProxyId}"
@@ -76,7 +76,7 @@
7676
<l:hasPermission permission="${it.permission}">
7777
<j:set var="rerunProxyId" value="${h.generateId()}" />
7878
<st:bind value="${it}" var="rerunAction${rerunProxyId}"/>
79-
<div class="jenkins-split-button">
79+
<div id="pgv-rerun-split-button" class="jenkins-split-button">
8080
<button id="pgv-rerun"
8181
data-proxy-name="rerunAction${rerunProxyId}"
8282
class="jenkins-button jenkins-!-build-color">

src/main/webapp/js/build.js

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ document.addEventListener("click", function (event) {
139139
const result = response.responseJSON;
140140
if (result.status === "ok") {
141141
notificationBar.show(target.dataset.successMessage);
142-
// Hide pause, show resume
143-
const pauseItem = document.getElementById("pgv-pause");
144-
const resumeItem = document.getElementById("pgv-resume");
145-
if (pauseItem) pauseItem.style.display = "none";
146-
if (resumeItem) resumeItem.style.display = "";
147142
} else {
148143
notificationBar.show(result.message, notificationBar.WARNING);
149144
}
@@ -158,19 +153,14 @@ document.addEventListener("click", function (event) {
158153
const result = response.responseJSON;
159154
if (result.status === "ok") {
160155
notificationBar.show(target.dataset.successMessage);
161-
// Hide resume, show pause
162-
const pauseItem = document.getElementById("pgv-pause");
163-
const resumeItem = document.getElementById("pgv-resume");
164-
if (resumeItem) resumeItem.style.display = "none";
165-
if (pauseItem) pauseItem.style.display = "";
166156
} else {
167157
notificationBar.show(result.message, notificationBar.WARNING);
168158
}
169159
});
170160
}
171161
});
172162

173-
function updatePauseElements() {
163+
function updatePauseElements(enablePolling = false) {
174164
const pausedBanner = document.getElementById("pgv-paused-banner");
175165
const pauseMenuItem = document.getElementById("pgv-pause");
176166
const resumeMenuItem = document.getElementById("pgv-resume");
@@ -208,16 +198,17 @@ function updatePauseElements() {
208198
}
209199
}
210200

211-
let updateInterval = 5000;
212-
// update more frequently when the pause/resume menu items are visible
213-
if (pauseMenuItem || resumeMenuItem) {
214-
updateInterval = 1000;
201+
if (enablePolling) {
202+
setTimeout(() => updatePauseElements(true), 1000);
215203
}
216-
setTimeout(updatePauseElements(), updateInterval);
217204
} else {
218205
pausedBanner.style.display = "none";
219-
pauseMenuItem.style.display = "none";
220-
resumeMenuItem.style.display = "none";
206+
if (pauseMenuItem) {
207+
pauseMenuItem.style.display = "none";
208+
}
209+
if (resumeMenuItem) {
210+
resumeMenuItem.style.display = "none";
211+
}
221212
}
222213
}
223214
return null;
@@ -227,4 +218,39 @@ function updatePauseElements() {
227218
});
228219
}
229220

230-
updatePauseElements();
221+
const cancelSplitButton = document.getElementById("pgv-cancel-split-button");
222+
if (cancelSplitButton) {
223+
let isPauseResumeMenuOpen = false;
224+
225+
const pauseResumeMenuOpenObserver = new MutationObserver(() => {
226+
const pauseMenuItem = document.getElementById("pgv-pause");
227+
const resumeMenuItem = document.getElementById("pgv-resume");
228+
const menuItemsExist = pauseMenuItem || resumeMenuItem;
229+
230+
if (menuItemsExist && !isPauseResumeMenuOpen) {
231+
isPauseResumeMenuOpen = true;
232+
setTimeout(() => updatePauseElements(false), 0);
233+
} else if (!menuItemsExist && isPauseResumeMenuOpen) {
234+
isPauseResumeMenuOpen = false;
235+
}
236+
});
237+
238+
pauseResumeMenuOpenObserver.observe(cancelSplitButton, {
239+
childList: true,
240+
subtree: true,
241+
});
242+
243+
const cancelButtonHiddenObserver = new MutationObserver(() => {
244+
if (!cancelSplitButton || cancelSplitButton.style.display === "none") {
245+
pauseResumeMenuOpenObserver.disconnect();
246+
cancelButtonHiddenObserver.disconnect();
247+
}
248+
});
249+
250+
cancelButtonHiddenObserver.observe(cancelSplitButton, {
251+
attributes: true,
252+
attributeFilter: ["style"],
253+
});
254+
}
255+
256+
setTimeout(() => updatePauseElements(true), 0);

0 commit comments

Comments
 (0)