Skip to content
wiki.fftac.org

Workspace - Source Excerpt 09

Back to Workspace

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;
                }