Compare commits
2 commits
e0e8bb35b6
...
1cb0da05e2
| Author | SHA1 | Date | |
|---|---|---|---|
| 1cb0da05e2 | |||
| 01fa3a9efe |
2 changed files with 26 additions and 9 deletions
|
|
@ -272,6 +272,7 @@
|
||||||
<div id="queueRow" class="card" hidden>
|
<div id="queueRow" class="card" hidden>
|
||||||
<span id="queueInfo" class="muted"></span>
|
<span id="queueInfo" class="muted"></span>
|
||||||
<span class="queue-actions">
|
<span class="queue-actions">
|
||||||
|
<button id="queueRetry" type="button" class="btn secondary" hidden>Tout réessayer</button>
|
||||||
<button id="queuePause" type="button" class="btn secondary">Tout mettre en pause</button>
|
<button id="queuePause" type="button" class="btn secondary">Tout mettre en pause</button>
|
||||||
<button id="queueCancel" type="button" class="btn secondary">Tout annuler</button>
|
<button id="queueCancel" type="button" class="btn secondary">Tout annuler</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
@ -287,6 +288,7 @@
|
||||||
const queueInfo = document.getElementById('queueInfo');
|
const queueInfo = document.getElementById('queueInfo');
|
||||||
const queueCancel = document.getElementById('queueCancel');
|
const queueCancel = document.getElementById('queueCancel');
|
||||||
const queuePause = document.getElementById('queuePause');
|
const queuePause = document.getElementById('queuePause');
|
||||||
|
const queueRetry = document.getElementById('queueRetry');
|
||||||
const list = document.getElementById('list');
|
const list = document.getElementById('list');
|
||||||
|
|
||||||
const MAX_PARALLEL = 3; // dépôts directs (petits fichiers) simultanés
|
const MAX_PARALLEL = 3; // dépôts directs (petits fichiers) simultanés
|
||||||
|
|
@ -376,6 +378,8 @@
|
||||||
job.state = state;
|
job.state = state;
|
||||||
if (state === 'done' || state === 'failed' || state === 'cancelled') jobs.delete(job);
|
if (state === 'done' || state === 'failed' || state === 'cancelled') jobs.delete(job);
|
||||||
else jobs.add(job);
|
else jobs.add(job);
|
||||||
|
if (state === 'failed') failedJobs.add(job);
|
||||||
|
else failedJobs.delete(job);
|
||||||
updateQueueRow();
|
updateQueueRow();
|
||||||
const { pauseBtn, retryBtn, cancelBtn } = job.ui;
|
const { pauseBtn, retryBtn, cancelBtn } = job.ui;
|
||||||
pauseBtn.hidden = state !== 'running' && state !== 'paused';
|
pauseBtn.hidden = state !== 'running' && state !== 'paused';
|
||||||
|
|
@ -393,6 +397,7 @@
|
||||||
const active = new Set();
|
const active = new Set();
|
||||||
|
|
||||||
const jobs = new Set(); // jobs non terminés (en attente, en cours ou en pause)
|
const jobs = new Set(); // jobs non terminés (en attente, en cours ou en pause)
|
||||||
|
const failedJobs = new Set(); // jobs en échec, relançables (« Réessayer » / « Tout réessayer »)
|
||||||
let allPaused = false; // « Tout mettre en pause » actif : la file ne démarre plus rien
|
let allPaused = false; // « Tout mettre en pause » actif : la file ne démarre plus rien
|
||||||
|
|
||||||
function updateQueueRow() {
|
function updateQueueRow() {
|
||||||
|
|
@ -404,18 +409,24 @@
|
||||||
else if (job.state === 'paused') paused += 1;
|
else if (job.state === 'paused') paused += 1;
|
||||||
else waiting += 1;
|
else waiting += 1;
|
||||||
}
|
}
|
||||||
if (jobs.size === 0) {
|
const failed = failedJobs.size;
|
||||||
queueRow.hidden = true;
|
const hasJobs = jobs.size > 0;
|
||||||
|
if (!hasJobs) {
|
||||||
allPaused = false;
|
allPaused = false;
|
||||||
queuePause.textContent = 'Tout mettre en pause';
|
queuePause.textContent = 'Tout mettre en pause';
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
queueRow.hidden = false;
|
queueRow.hidden = !hasJobs && failed === 0;
|
||||||
queueInfo.textContent =
|
queuePause.hidden = !hasJobs;
|
||||||
running +
|
queueCancel.hidden = !hasJobs;
|
||||||
' en cours' +
|
queueRetry.hidden = failed === 0;
|
||||||
(paused ? ' · ' + paused + ' en pause' : '') +
|
queueInfo.textContent = [
|
||||||
(waiting ? ' · ' + waiting + ' en attente' : '');
|
hasJobs ? running + ' en cours' : '',
|
||||||
|
paused ? paused + ' en pause' : '',
|
||||||
|
waiting ? waiting + ' en attente' : '',
|
||||||
|
failed ? failed + ' en échec' : '',
|
||||||
|
]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(' · ');
|
||||||
}
|
}
|
||||||
|
|
||||||
function pump() {
|
function pump() {
|
||||||
|
|
@ -908,7 +919,12 @@
|
||||||
pump();
|
pump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function retryAll() {
|
||||||
|
for (const job of Array.from(failedJobs)) retryJob(job);
|
||||||
|
}
|
||||||
|
|
||||||
queuePause.addEventListener('click', toggleAllPaused);
|
queuePause.addEventListener('click', toggleAllPaused);
|
||||||
|
queueRetry.addEventListener('click', retryAll);
|
||||||
queueCancel.addEventListener('click', cancelAll);
|
queueCancel.addEventListener('click', cancelAll);
|
||||||
|
|
||||||
// items : tableau de { file, path } — path '' = fichier simple, sinon dépôt de dossier.
|
// items : tableau de { file, path } — path '' = fichier simple, sinon dépôt de dossier.
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ describe('GET /', () => {
|
||||||
});
|
});
|
||||||
expect(res.body).toContain('id="zones"');
|
expect(res.body).toContain('id="zones"');
|
||||||
expect(res.body).toContain('id="queuePause"');
|
expect(res.body).toContain('id="queuePause"');
|
||||||
|
expect(res.body).toContain('id="queueRetry"');
|
||||||
expect(res.body).not.toContain('targetSelect');
|
expect(res.body).not.toContain('targetSelect');
|
||||||
expect(res.body).not.toContain('dirPicker');
|
expect(res.body).not.toContain('dirPicker');
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue