Files
cnc_wams/wasm-port/runtime/ui/ini-panel/control-page-refresh-workflow.js

90 lines
2.0 KiB
JavaScript

export function controlPageStatusText(status = {}) {
return [
status.lastAction ?? "-",
status.runStatus ?? "-",
status.error ?? "-",
].join(" | ");
}
export function createControlPageRefreshState({
phase,
statusText,
view = null,
renderResult = null,
error = null,
} = {}) {
return {
phase,
statusText,
view,
renderResult,
error,
};
}
export function refreshMachineSessionControlPage({
getControlView,
statusNode,
viewNode,
renderControlView,
} = {}) {
if (typeof getControlView !== "function") {
throw new Error("A control view getter is required.");
}
if (!statusNode) {
throw new Error("A control page status node is required.");
}
if (!viewNode) {
throw new Error("A control page view node is required.");
}
if (typeof renderControlView !== "function") {
throw new Error("A control view renderer is required.");
}
let view = null;
try {
view = getControlView() ?? null;
} catch (error) {
const statusText = `refresh failed | - | ${error.message}`;
statusNode.textContent = statusText;
viewNode.textContent = "";
return createControlPageRefreshState({
phase: "error",
statusText,
error: error.message,
});
}
if (!view) {
const statusText = "waiting for panel";
statusNode.textContent = statusText;
viewNode.textContent = "";
return createControlPageRefreshState({
phase: "waiting",
statusText,
});
}
const statusText = controlPageStatusText(view.status);
statusNode.textContent = statusText;
try {
const renderResult = renderControlView(viewNode, view);
return createControlPageRefreshState({
phase: "rendered",
statusText,
view,
renderResult,
});
} catch (error) {
const errorStatusText = `refresh failed | - | ${error.message}`;
statusNode.textContent = errorStatusText;
viewNode.textContent = "";
return createControlPageRefreshState({
phase: "error",
statusText: errorStatusText,
view,
error: error.message,
});
}
}