Added the Refresh All button to invalidate caches and force requests to be sent again
This commit is contained in:
@@ -1,24 +1,36 @@
|
||||
function createOpportunityWorkloadActions({ authSessionState, allowsCrmActivities, requestConsumerTokenServiceOnce, sendRuntimeMessage,
|
||||
appendBackgroundRequestLog, queueProductsTableRender, productsContentState, messageTypes, environment }) {
|
||||
appendBackgroundRequestLog, queueProductsTableRender, productsContentState, messageTypes, reportProgress, activityCache, environment }) {
|
||||
let session = newSession();
|
||||
function newSession() { return { enabled: true, records: new Map(), queue: [], running: 0 }; }
|
||||
function newSession() { return { enabled: true, records: new Map(), queue: [], running: 0, progress: new Set() }; }
|
||||
function updateProgress(current) {
|
||||
if (current !== session || !current.enabled || !current.progress.size) return;
|
||||
const records = [...current.progress];
|
||||
const completed = records.filter(record => record.status !== "loading").length;
|
||||
const failed = records.filter(record => record.status === "error").length;
|
||||
reportProgress(completed < records.length ? "running" : failed ? "complete-with-errors" : "complete", completed, records.length);
|
||||
}
|
||||
function reset(enabled = true) {
|
||||
session.enabled = false;
|
||||
session.queue.length = 0;
|
||||
session = newSession();
|
||||
session.enabled = enabled;
|
||||
reportProgress("idle");
|
||||
}
|
||||
function idsFor(products) {
|
||||
return [...new Set((products?.items || []).map(item => String(item?.RevnId ?? "").trim()).filter(Boolean))];
|
||||
}
|
||||
function loadProducts(products, refresh = false) {
|
||||
function loadProducts(products, refresh = false, cacheOptions = null) {
|
||||
if (!session.enabled || !allowsCrmActivities()) return;
|
||||
if ([...session.progress].every(record => record.status !== "loading")) session.progress.clear();
|
||||
for (const revnId of idsFor(products)) {
|
||||
if (!refresh && session.records.has(revnId)) continue;
|
||||
session.progress.delete(session.records.get(revnId));
|
||||
const record = { status: "loading", actions: [], hasNext: false };
|
||||
session.records.set(revnId, record);
|
||||
session.queue.push({ revnId, record });
|
||||
if (!cacheOptions) session.progress.add(record);
|
||||
session.queue.push({ revnId, record, cacheOptions });
|
||||
}
|
||||
updateProgress(session);
|
||||
pump(session);
|
||||
}
|
||||
function reopen() {
|
||||
@@ -33,23 +45,35 @@ function createOpportunityWorkloadActions({ authSessionState, allowsCrmActivitie
|
||||
run(current, job).finally(() => { current.running -= 1; pump(current); });
|
||||
}
|
||||
}
|
||||
async function run(current, { revnId, record }) {
|
||||
async function run(current, { revnId, record, cacheOptions }) {
|
||||
try {
|
||||
const cached = cacheOptions ? await activityCache.read("actions", revnId, cacheOptions.cachedAt) : null;
|
||||
if (!current.enabled || current !== session || current.records.get(revnId) !== record || !allowsCrmActivities()) return;
|
||||
if (cached) {
|
||||
record.actions = cached.items;
|
||||
record.hasNext = cached.hasNext;
|
||||
record.status = "ready";
|
||||
return;
|
||||
}
|
||||
if (cacheOptions?.cacheOnly) { record.status = "error"; record.error = "No matching activity cache for this product update."; return; }
|
||||
current.progress.add(record);
|
||||
updateProgress(current);
|
||||
const authorizations = await requestConsumerTokenServiceOnce();
|
||||
if (!current.enabled || current !== session || current.records.get(revnId) !== record || !allowsCrmActivities()) return;
|
||||
const result = await sendRuntimeMessage({ type: messageTypes.requestWlActions, revnId, authorization: authorizations?.workloadActions });
|
||||
if (!current.enabled || current !== session || !allowsCrmActivities()) return;
|
||||
if (!current.enabled || current !== session || current.records.get(revnId) !== record || !allowsCrmActivities()) return;
|
||||
appendBackgroundRequestLog(result?.debugRequests);
|
||||
if (!result?.ok) throw new Error(result?.error || "Unable to load workload actions.");
|
||||
record.actions = result.actions;
|
||||
record.hasNext = result.hasNext;
|
||||
record.status = "ready";
|
||||
if (cacheOptions) await activityCache.write("actions", revnId, cacheOptions.cachedAt, result.actions, result.hasNext);
|
||||
} catch (error) {
|
||||
if (!current.enabled || current !== session) return;
|
||||
record.status = "error";
|
||||
record.error = error.message || "Unable to load workload actions.";
|
||||
} finally {
|
||||
if (current.enabled && current === session) queueProductsTableRender();
|
||||
if (current.enabled && current === session) { updateProgress(current); queueProductsTableRender(); }
|
||||
}
|
||||
}
|
||||
function createBadge(optyNumber) {
|
||||
|
||||
Reference in New Issue
Block a user