From 389f98e349b6ec01a2ac25fb0bb1b3f969f67cec Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 28 Jul 2026 21:32:20 +0200 Subject: [PATCH] Keep normalized View roots acyclic --- webui/src/platform/views.ts | 5 ++++- webui/tests/module-capabilities.test.ts | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/webui/src/platform/views.ts b/webui/src/platform/views.ts index bdf69b1..5f4a006 100644 --- a/webui/src/platform/views.ts +++ b/webui/src/platform/views.ts @@ -58,7 +58,10 @@ export function viewSurfaceCatalogueForModules( for (const surface of module.viewSurfaces ?? []) { addSurface(surfaces, { ...surface, - parentId: surface.parentId ?? rootId + parentId: + surface.id === rootId + ? null + : surface.parentId ?? rootId }); } } diff --git a/webui/tests/module-capabilities.test.ts b/webui/tests/module-capabilities.test.ts index ddb533a..98f1133 100644 --- a/webui/tests/module-capabilities.test.ts +++ b/webui/tests/module-capabilities.test.ts @@ -128,6 +128,27 @@ assert( "view catalogue should derive route surfaces" ); +const serverNormalizedCatalogue = viewSurfaceCatalogueForModules([ + { + ...viewAwareFiles, + viewSurfaces: [ + { + id: "files.module", + moduleId: "files", + kind: "module", + label: "Files", + parentId: null + }, + ...(viewAwareFiles.viewSurfaces ?? []) + ] + } +]); +assert( + serverNormalizedCatalogue.find((surface) => surface.id === "files.module") + ?.parentId == null, + "server-normalized module roots must not become their own parent" +); + const filesView = { activeViewId: "view-files", activeRevisionId: "revision-files",