Workspace - Source Excerpt 09
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/assets/js/workspace.js so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/assets/js/workspace.js
resultField.appendChild(list);
}
}, {
context: "admin-prompt-tests",
fallback: t("promptTestsFailed", "Prompt tests failed."),
onError: (error, message) => {
resultField.textContent = message;
},
onFinally: () => setDisabled(button, false),
});
});
};
const initAdminGovernanceMaintenance = () => {
const button = document.querySelector("[data-workspace-admin-run-governance-maintenance]");
const limitField = document.querySelector("[data-workspace-admin-governance-limit]");
const resultField = document.querySelector("[data-workspace-admin-governance-result]");
const scheduledField = document.querySelector("[data-workspace-admin-governance-scheduled]");
const nextField = document.querySelector("[data-workspace-admin-governance-next]");
const lastField = document.querySelector("[data-workspace-admin-governance-last]");
if (!button || !resultField) {
return;
}
const renderStatus = (status) => {
const lastRun = status.last_run || {};
const queueCounts = lastRun.queue_counts || {};
if (scheduledField) {
scheduledField.textContent = status.scheduled ? t("yesLabel", "Yes") : t("noLabel", "No");
}
if (nextField) {
nextField.textContent = status.next_run_utc || t("governanceNotScheduled", "Not scheduled");
}
if (lastField) {
lastField.textContent = lastRun.ran_utc || t("governanceNoRunRecorded", "No run recorded");
}
if (!lastRun.ran_utc) {
resultField.textContent = t("governanceNoMaintenanceRun", "No governance maintenance run has been recorded yet.");
return;
}
resultField.textContent = formatText(
"governanceLastRunSummary",
"Last run refreshed {refreshed} of {considered} participants. Queue: {provisional} provisional, {peerReviewed} peer reviewed, {restricted} restricted, {reverted} reverted, {archived} archived, {openAppeals} open appeals, {staleReviews} stale review items, {urgentReviews} urgent review items, {staleAppeals} stale open appeals, {fallbackActions} automatic fallback actions.",
{
refreshed: lastRun.participants_refreshed || 0,
considered: lastRun.participants_considered || 0,
provisional: queueCounts.provisional_public || 0,
peerReviewed: queueCounts.peer_reviewed || 0,
restricted: queueCounts.restricted_review || 0,
reverted: queueCounts.reverted || 0,
archived: queueCounts.archived || 0,
openAppeals: queueCounts.open_appeals || 0,
staleReviews: queueCounts.stale_review_items || 0,
urgentReviews: queueCounts.urgent_review_items || 0,
staleAppeals: queueCounts.stale_open_appeals || 0,
fallbackActions: queueCounts.automatic_fallback_actions || 0,
}
);
};
const loadStatus = () => {
runAction(async () => {
renderStatus(await apiFetch("admin/governance-maintenance"));
}, {
context: "admin-governance-status",
fallback: t("governanceLoadFailed", "Could not load governance maintenance status."),
onError: (error, message) => {
resultField.textContent = message;
},
});
};
button.addEventListener("click", () => {
const limit = Math.max(25, Math.min(500, parseInt(limitField?.value || "250", 10) || 250));
resultField.textContent = t("governanceRunning", "Running governance maintenance...");
button.disabled = true;
runAction(async () => {
const response = await apiFetch("admin/governance-maintenance", {
method: "POST",
body: JSON.stringify({ limit }),
});
renderStatus({
scheduled: !!response.scheduled,
next_run_utc: response.next_run_utc || "",
last_run: response.result || {},
});
}, {
context: "admin-governance-run",
fallback: t("governanceFailed", "Governance maintenance failed."),
onError: (error, message) => {
resultField.textContent = message;
},
onFinally: () => setDisabled(button, false),
});
});
loadStatus();
};
const setPromptExchangeResult = (panel, message, ok = true) => {
const target = panel.querySelector("[data-prompt-exchange-result]");
if (!target) {
return;
}
target.textContent = message;
target.style.color = ok ? "" : "#f0a5a5";
};
const promptExchangeActionText = (panel, format, fallbackText) => {
const output = panel.querySelector("[data-prompt-exchange-output]");
const currentFormat = output ? output.getAttribute("data-prompt-exchange-output-format") || "" : "";
if (output && !output.hidden && currentFormat === format) {
const visibleText = toCleanPromptText(output.textContent || "");
if (visibleText) {
return visibleText;
}
}
return fallbackText;
};
const initPromptExchangeActions = () => {
document.addEventListener("click", (event) => {
const button = closestTarget(
event.target,
"[data-prompt-exchange-view], [data-prompt-exchange-download], [data-prompt-exchange-copy]"
);
if (!button) {
return;
}
const panel = button.closest("[data-prompt-exchange]");
if (!panel) {
return;
}
event.preventDefault();
runAction(async () => {
const payload = getPromptExchangePayload(panel);
const json = promptExchangeJson(payload);
const markdown = promptExchangeMarkdown(payload);
const slug = filenameSlug(payload.slug || payload.title, "prompt-flavor");
if (button.hasAttribute("data-prompt-exchange-view")) {
const output = panel.querySelector("[data-prompt-exchange-output]");
if (!output) {
return;
}
const format = button.getAttribute("data-prompt-exchange-view") || "json";
const selectedText = format === "markdown" ? markdown : json;
const currentFormat = output.getAttribute("data-prompt-exchange-output-format") || "";
const shouldShow = output.hidden || currentFormat !== format;
output.textContent = shouldShow ? selectedText : "";
output.setAttribute("data-prompt-exchange-output-format", shouldShow ? format : "");
output.hidden = !shouldShow;
setEditablePromptStatus(
panel,
shouldShow
? t("promptExchangeEditableHint", "Preview is editable. Matching Copy, Download, and Save use this visible text.")
: ""
);
panel.querySelectorAll("[data-prompt-exchange-view]").forEach((item) => {
const itemFormat = item.getAttribute("data-prompt-exchange-view") || "json";
const label = itemFormat === "markdown" ? t("markdownLabel", "Markdown") : t("jsonLabel", "JSON");
item.textContent = shouldShow && itemFormat === format
? formatText("promptExchangeHide", "Hide {format}", { format: label })
: formatText("promptExchangeView", "View {format}", { format: label });
});
setPromptExchangeResult(
panel,
shouldShow
? formatText("promptExchangeOpened", "Exchange {format} opened.", { format: format === "markdown" ? t("markdownLabel", "Markdown") : t("jsonLabel", "JSON") })
: t("promptExchangePreviewHidden", "Exchange preview hidden.")
);
return;
}