feat(ui): separate live data and lab surfaces

This commit is contained in:
DCCONSTRUCTIONS
2026-07-26 12:50:10 +03:00
parent 677dbdb776
commit 05413e3f5c
19 changed files with 1430 additions and 402 deletions
@@ -610,6 +610,6 @@ test("LiDAR fetchers use read-only endpoints and workspace is registered", async
method: "GET",
},
]);
assert.equal(workspaceById("lidar-quality").root, "fleet");
assert.equal(workspaceById("lidar-quality").kind, "lidar-quality");
assert.equal(workspaceById("lab-archive").root, "polygon");
assert.equal(workspaceById("lab-archive").kind, "lab-archive");
});
@@ -319,17 +319,19 @@ test("Polygon exposes one dataset surface and keeps legacy links compatible", ()
workspacesForRoot("polygon").some(({ id }) => id === "polygon-run"),
false,
);
assert.equal(workspaceById("polygon-datasets").root, "polygon");
assert.equal(workspaceById("polygon-datasets").kind, "polygon-datasets");
assert.equal(workspaceById("polygon-datasets"), null);
assert.equal(workspaceById("datasets").root, "data");
assert.equal(workspaceById("datasets").kind, "datasets");
assert.deepEqual(
workspacesForRoot("polygon").map(({ id }) => id),
["polygon-datasets"],
["lab-archive"],
);
assert.equal(
workspacesForRoot("system").some(({ id }) => id === "polygon-run"),
false,
);
assert.equal(roots.some(({ id }) => id === "polygon"), true);
assert.equal(roots.at(-1)?.id, "polygon");
});
test("Polygon contracts decode path-free evidence and preserve the safety boundary", () => {
@@ -87,7 +87,7 @@ test("saved-session and manual source controls share the acquisition guard", asy
"utf8",
);
assert.match(appSource, /blockedReason=\{sourceSwitchBlockedReason\}/);
assert.match(appSource, /blockedReason: sourceSwitchBlockedReason/);
assert.match(appSource, /disabled=\{sourceSwitchBlocked \|\| !sourceDraft\.trim\(\)\}/);
assert.match(appSource, /if \(sourceSwitchBlockedRef\.current\) return;/);
assert.match(sessionSelectSource, /replayEnabled: blockedReason === null/);
@@ -262,12 +262,12 @@ test("scene tool windows are route-scoped and toolbar actions are not duplicated
const utilityEnd = appSource.indexOf("const header", utilityStart);
const utilitySource = appSource.slice(utilityStart, utilityEnd);
assert.match(appSource, /open=\{spatialWorkspaceActive && sourceWindowOpen\}/);
assert.match(appSource, /open=\{spatialWorkspaceActive && displayWindowOpen\}/);
assert.match(appSource, /open=\{spatialWorkspaceActive && layerInspectorOpen\}/);
assert.match(appSource, /open=\{sceneWorkspaceActive && sourceWindowOpen\}/);
assert.match(appSource, /open=\{sceneWorkspaceActive && displayWindowOpen\}/);
assert.match(appSource, /open=\{sceneWorkspaceActive && layerInspectorOpen\}/);
assert.match(
appSource,
/if \(spatialWorkspaceActive\) return;[\s\S]*setSceneWindowOrder\(\[\]\)/,
/if \(sceneWorkspaceActive\) return;[\s\S]*setSceneWindowOrder\(\[\]\)/,
);
assert.doesNotMatch(utilitySource, /Настроить визуальный движок/);
assert.doesNotMatch(utilitySource, /Настроить отображение/);