推进 text12 接续和 control-page session readiness workflow

This commit is contained in:
2026-06-15 04:57:21 +08:00
parent ed5d03ea1b
commit 98d236250f
13 changed files with 621 additions and 0 deletions

View File

@@ -1,6 +1,9 @@
import {
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
import {
loadMachineSessionForControlPageWorkflow,
} from "./control-page-session-workflow.js";
export function createMachineSessionControlPageController({
panelFrame,
@@ -50,6 +53,14 @@ export function createMachineSessionControlPageController({
});
}
function loadSessionState() {
return loadMachineSessionForControlPageWorkflow({
getPanelWindow,
getPanelApi,
getControlView,
});
}
function startPolling() {
if (!refreshTimer) {
refreshTimer = setIntervalFn(render, pollMs);
@@ -72,6 +83,7 @@ export function createMachineSessionControlPageController({
getControlView,
getPanelApi,
getPanelWindow,
loadSessionState,
mount,
refresh,
render,

View File

@@ -0,0 +1,84 @@
export function createControlPageSessionLoadState({
phase,
panelReady = false,
apiReady = false,
controlViewReady = false,
stateBundle = null,
workflowStatus = null,
controlView = null,
error = null,
} = {}) {
return {
phase,
panelReady,
apiReady,
controlViewReady,
stateBundle,
workflowStatus,
controlView,
error,
};
}
export function loadMachineSessionForControlPageWorkflow({
getPanelWindow,
getPanelApi,
getControlView,
} = {}) {
if (typeof getPanelWindow !== "function") {
throw new Error("A panel window getter is required.");
}
if (typeof getPanelApi !== "function") {
throw new Error("A panel API getter is required.");
}
if (typeof getControlView !== "function") {
throw new Error("A control view getter is required.");
}
let panelWindow = null;
let panelApi = null;
let controlView = null;
try {
panelWindow = getPanelWindow();
panelApi = getPanelApi();
controlView = getControlView();
} catch (error) {
return createControlPageSessionLoadState({
phase: "error",
error: error.message,
});
}
if (!panelWindow) {
return createControlPageSessionLoadState({
phase: "waiting-panel",
});
}
if (!panelApi) {
return createControlPageSessionLoadState({
phase: "waiting-api",
panelReady: true,
});
}
if (!controlView) {
return createControlPageSessionLoadState({
phase: "waiting-session",
panelReady: true,
apiReady: true,
stateBundle: panelApi.getMachineSessionStateBundle?.() ?? null,
workflowStatus: panelApi.getMachineSessionWorkflowStatus?.() ?? null,
});
}
return createControlPageSessionLoadState({
phase: "ready",
panelReady: true,
apiReady: true,
controlViewReady: true,
stateBundle: panelApi.getMachineSessionStateBundle?.() ?? null,
workflowStatus: panelApi.getMachineSessionWorkflowStatus?.() ?? null,
controlView,
});
}

View File

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

View File

@@ -14,11 +14,19 @@ import {
createControlPageRefreshState,
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
import {
createControlPageSessionLoadState,
loadMachineSessionForControlPageWorkflow,
} from "./control-page-session-workflow.js";
export {
controlPageStatusText,
createControlPageRefreshState,
refreshMachineSessionControlPage,
} from "./control-page-refresh-workflow.js";
export {
createControlPageSessionLoadState,
loadMachineSessionForControlPageWorkflow,
} from "./control-page-session-workflow.js";
export {
INI_PANEL_ENTRIES,
getIniPanelEntryByHref,
@@ -53,6 +61,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
launcherLinks: createIniPanelLauncherLinkViewModel(entries),
controlPage: {
createController: createMachineSessionControlPageController,
loadSessionState: loadMachineSessionForControlPageWorkflow,
refresh: refreshMachineSessionControlPage,
renderView: renderMachineSessionControlView,
},