| 537 | } |
| 538 | |
| 539 | function applyProgressBar(job, ui, pct, { indeterminate = false, finalError = false, finalDone = false } = {}) { |
| 540 | if (!ui?.bar || !ui?.fill) return; |
| 541 | if (indeterminate) { |
| 542 | ui.bar.classList.add('indeterminate'); |
| 543 | ui.fill.style.width = '100%'; |
| 544 | ui.bar.setAttribute('aria-valuenow', '0'); |
| 545 | } else { |
| 546 | ui.bar.classList.remove('indeterminate'); |
| 547 | const clamped = clamp(Number.isFinite(pct) ? pct : 0, 0, 100); |
| 548 | ui.fill.style.width = `${clamped}%`; |
| 549 | ui.bar.setAttribute('aria-valuenow', String(clamped)); |
| 550 | job.renderedPct = clamped; |
| 551 | } |
| 552 | ui.fill.classList.toggle('is-error', !!finalError); |
| 553 | ui.fill.classList.toggle('is-done', !!finalDone); |
| 554 | } |
| 555 | |
| 556 | function renderJob(job) { |
| 557 | if (!job) return; |