39 lines
1.9 KiB
JavaScript
39 lines
1.9 KiB
JavaScript
function createActivityProgress({ MODAL_ID, environment }) {
|
|
const { document, setTimeout, clearTimeout, matchMedia } = environment;
|
|
const entries = new Map();
|
|
function update(key, state, completed = 0, total = null) {
|
|
const host = document?.querySelector?.(`#${MODAL_ID} .opportunities-extension-subtitle-row`);
|
|
if (!host) return;
|
|
let entry = entries.get(key);
|
|
if (!entry) {
|
|
const badge = document.createElement("span");
|
|
badge.className = "opportunities-extension-products-progress";
|
|
badge.setAttribute("role", "status");
|
|
badge.setAttribute("aria-live", "polite");
|
|
host.append(badge);
|
|
entry = { badge, timer: null, hideTimer: null, state: "idle" };
|
|
entries.set(key, entry);
|
|
}
|
|
if (state === "complete" && entry.state === "complete") return;
|
|
clearTimeout(entry.timer);
|
|
clearTimeout(entry.hideTimer);
|
|
entry.state = state;
|
|
const label = key === "sr" ? "Service Requests" : "Actions";
|
|
entry.badge.hidden = state === "idle";
|
|
entry.badge.setAttribute("data-state", state);
|
|
entry.badge.setAttribute("data-fading", "false");
|
|
entry.badge.setAttribute("aria-busy", String(state === "running"));
|
|
const count = total === null ? String(completed) : `${completed}/${total}`;
|
|
entry.badge.textContent = state === "error" ? `${label} unavailable`
|
|
: state === "complete-with-errors" ? `${label} ${count} (errors)`
|
|
: state === "complete" ? `${label} ready ${completed}` : `${label} ${count}`;
|
|
entry.badge.title = key === "sr" ? "CRM service request records loaded" : "Workload action requests completed";
|
|
if (state === "complete") entry.timer = setTimeout(() => {
|
|
entry.badge.setAttribute("data-fading", "true");
|
|
const reduced = typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
entry.hideTimer = setTimeout(() => { entry.badge.hidden = true; }, reduced ? 0 : 300);
|
|
}, 5000);
|
|
}
|
|
return { update };
|
|
}
|