7 lines
4.8 KiB
TypeScript
7 lines
4.8 KiB
TypeScript
import { createRobotSaveRequest, ROBOT_SAVE_FIXTURE, RobotSaveResponse } from "./robot-save-facade.js";
|
|
declare global { interface Window { __freecadRobotSaveState: { stage: string; requestId: string | null; response: RobotSaveResponse | null; workerMessages: number } } }
|
|
const root = document.querySelector<HTMLDivElement>("#app")!; root.innerHTML = `<main><header><b>FC</b><span>FreeCAD 1.2 Web</span><strong>Robot save/reopen</strong></header><section><aside><h2>Fixture</h2><p>Robot::RobotObject</p><p>Axis1 15 / Axis2 -10</p><p>/tmp/RobotAction04.FCStd</p></aside><main class="stage"><div class="mark">R</div><h1>Save and reopen</h1><div id="status">Starting worker</div></main><aside><h2>Result</h2><dl><div><dt>Type</dt><dd id="type">-</dd></div><div><dt>Axis</dt><dd id="axis">-</dd></div><div><dt>Bytes</dt><dd id="size">-</dd></div><div><dt>Request</dt><dd id="request">-</dd></div></dl><button id="run" disabled>Run</button><button id="error" disabled>Invalid</button><button id="reset" disabled>Reset</button></aside></section></main>`;
|
|
const style = document.createElement("style"); style.textContent = `:root{color-scheme:dark;font-family:system-ui;background:#10171d;color:#e7edf3}*{box-sizing:border-box}body{margin:0;min-width:320px}header{display:flex;gap:18px;padding:16px 22px;background:#18242d;border-bottom:1px solid #33434e}header b{background:#3f9aa8;color:#081217;padding:7px 9px;border-radius:5px}header strong{margin-left:auto}section{display:grid;grid-template-columns:270px 1fr 300px;min-height:calc(100vh - 58px)}aside{padding:22px;background:#18242d;border-right:1px solid #33434e}section>aside:last-child{border-left:1px solid #33434e;border-right:0}h2{font-size:12px;color:#a4bdc6;text-transform:uppercase}aside p{font-size:13px;color:#b4c5cc}.stage{display:flex;flex-direction:column;justify-content:center;align-items:center;background:#0e141a}.mark{width:128px;height:128px;display:grid;place-items:center;border:1px solid #67b4c3;color:#9ee3e7;font-size:42px;font-weight:700}#status{margin-top:22px;color:#a4bdc6}#status[data-level=error]{color:#ff9d9d}#status[data-level=ok]{color:#9ce0bd}dl{margin:0}dl div{display:flex;justify-content:space-between;border-bottom:1px solid #33434e;padding:11px 0}dd{margin:0;max-width:190px;overflow-wrap:anywhere}button{margin:18px 4px 0;padding:8px 12px;background:#22323d;border:1px solid #50616b;border-radius:4px;color:#e6edf3}@media(max-width:820px){section{grid-template-columns:1fr}section>aside:first-child{display:none}.stage{min-height:58vh}}`; document.head.append(style);
|
|
const status = document.querySelector<HTMLElement>("#status")!, type = document.querySelector<HTMLElement>("#type")!, axis = document.querySelector<HTMLElement>("#axis")!, size = document.querySelector<HTMLElement>("#size")!, request = document.querySelector<HTMLElement>("#request")!, run = document.querySelector<HTMLButtonElement>("#run")!, error = document.querySelector<HTMLButtonElement>("#error")!, reset = document.querySelector<HTMLButtonElement>("#reset")!, worker = new Worker(new URL("./robot-save.worker.ts", import.meta.url), { type: "module" }); let sequence = 0; window.__freecadRobotSaveState = { stage: "starting", requestId: null, response: null, workerMessages: 0 }; const setStatus = (value: string, level = "normal") => { status.textContent = value; status.dataset.level = level; };
|
|
worker.onmessage = (event: MessageEvent<RobotSaveResponse | { kind: "ready"; action: string } | { kind: "reset"; requestId: string }>) => { const state = window.__freecadRobotSaveState; state.workerMessages++; const message = event.data; if (message.kind === "ready") { state.stage = "ready"; run.disabled = false; error.disabled = false; reset.disabled = false; setStatus("Worker ready", "ok"); return; } if (message.kind === "reset") { state.stage = "reset"; state.requestId = message.requestId; state.response = null; setStatus("State reset", "ok"); return; } state.response = message; state.requestId = message.requestId; request.textContent = message.requestId; if (message.kind === "error") { state.stage = message.error.code === "invalid_path" ? "expected-error" : "error"; setStatus(message.error.code, state.stage === "expected-error" ? "ok" : "error"); return; } state.stage = "success"; type.textContent = message.result.objectType; axis.textContent = `${message.result.axis1} / ${message.result.axis2}`; size.textContent = String(message.result.size); setStatus("Robot FCStd round-trip complete", "ok"); }; worker.onerror = event => setStatus(`Worker error: ${event.message}`, "error"); run.onclick = () => worker.postMessage(createRobotSaveRequest(`robot-save-chrome-${++sequence}`)); error.onclick = () => worker.postMessage(createRobotSaveRequest(`robot-save-error-${++sequence}`, { ...ROBOT_SAVE_FIXTURE, path: "/tmp/Missing.invalid" })); reset.onclick = () => worker.postMessage({ kind: "reset", requestId: `robot-save-reset-${++sequence}` });
|