推进 INI 面板 control-page refresh workflow helper

This commit is contained in:
2026-06-15 04:39:08 +08:00
parent 213514f64c
commit ed5d03ea1b
13 changed files with 379 additions and 13 deletions

View File

@@ -1,3 +1,7 @@
import {
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
export function createMachineSessionControlPageController({
panelFrame,
statusNode,
@@ -34,19 +38,16 @@ export function createMachineSessionControlPageController({
}
function render() {
const view = getControlView();
if (!view) {
statusNode.textContent = "waiting for panel";
viewNode.textContent = "";
return null;
}
return refresh().renderResult;
}
statusNode.textContent = [
view.status.lastAction ?? "-",
view.status.runStatus ?? "-",
view.status.error ?? "-",
].join(" | ");
return renderControlView(viewNode, view);
function refresh() {
return refreshMachineSessionControlPage({
getControlView,
statusNode,
viewNode,
renderControlView,
});
}
function startPolling() {
@@ -72,6 +73,7 @@ export function createMachineSessionControlPageController({
getPanelApi,
getPanelWindow,
mount,
refresh,
render,
startPolling,
};

View File

@@ -0,0 +1,89 @@
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,
});
}
}

View File

@@ -21,5 +21,6 @@ controller.mount();
window.linuxCncIniPanelControlPageApi = {
getControlView: controller.getControlView,
getPanelApi: controller.getPanelApi,
refreshControlPage: controller.refresh,
renderControlPage: controller.render,
};

View File

@@ -9,6 +9,16 @@ import {
import {
renderMachineSessionControlView,
} from "./control-view-renderer.js";
import {
controlPageStatusText,
createControlPageRefreshState,
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
export {
controlPageStatusText,
createControlPageRefreshState,
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
export {
INI_PANEL_ENTRIES,
getIniPanelEntryByHref,
@@ -43,6 +53,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
launcherLinks: createIniPanelLauncherLinkViewModel(entries),
controlPage: {
createController: createMachineSessionControlPageController,
refresh: refreshMachineSessionControlPage,
renderView: renderMachineSessionControlView,
},
};