diff --git a/web/workspace/src/lib/workspace/api/http.test.ts b/web/workspace/src/lib/workspace/api/http.test.ts index 93521aa6..eefa309f 100644 --- a/web/workspace/src/lib/workspace/api/http.test.ts +++ b/web/workspace/src/lib/workspace/api/http.test.ts @@ -43,17 +43,21 @@ Deno.test("root layout leaves Workspace selection explicit", async () => { new URL("./../../../routes/+layout.ts", import.meta.url), ); assert( - !layout.includes("/api/workspace") && + !layout.includes('"/api/workspace"') && !layout.includes("redirect(") && - layout.includes("Workspace selection is explicit"), - "root layout must not infer or redirect to a singleton Workspace", + layout.includes("listWorkspaces(fetch)") && + layout.includes("accessibleWorkspaces"), + "root layout may list accessible Workspaces but must not infer or redirect to a singleton Workspace", ); }); Deno.test("Workspace route changes dispose old multiplexed subscription state", async () => { const [layout, multiplexer] = await Promise.all([ Deno.readTextFile( - new URL("./../../../routes/w/[workspaceId]/+layout.svelte", import.meta.url), + new URL( + "./../../../routes/w/[workspaceId]/+layout.svelte", + import.meta.url, + ), ), Deno.readTextFile(new URL("./../multiplexer.ts", import.meta.url)), ]); diff --git a/web/workspace/src/lib/workspace/console/worker-console.ui.test.ts b/web/workspace/src/lib/workspace/console/worker-console.ui.test.ts index 497361fd..dbe67448 100644 --- a/web/workspace/src/lib/workspace/console/worker-console.ui.test.ts +++ b/web/workspace/src/lib/workspace/console/worker-console.ui.test.ts @@ -358,9 +358,10 @@ Deno.test("root layout keeps Workspace selection explicit", async () => { assert( layoutLoad.includes("export const load") && - layoutLoad.includes("() => ({})") && + layoutLoad.includes("listWorkspaces(fetch)") && + layoutLoad.includes("accessibleWorkspaces") && !layoutLoad.includes("scopedCompatibilityRoute") && - !layoutLoad.includes("/api/workspace") && + !layoutLoad.includes('"/api/workspace"') && !layoutLoad.includes("workspaceRoute") && !layoutLoad.includes("redirect("), "root layout should not infer, bootstrap, or redirect through a singleton Workspace", @@ -815,9 +816,6 @@ Deno.test("Account UI owns browser passkey session state without workspace autho const globalNavSections = await Deno.readTextFile( new URL("../sidebar/GlobalNavSections.svelte", import.meta.url), ); - const workspaceCatalogPage = await Deno.readTextFile( - new URL("./../../../routes/+page.svelte", import.meta.url), - ); const sidebarFrame = await Deno.readTextFile( new URL("../sidebar/SidebarFrame.svelte", import.meta.url), ); @@ -891,13 +889,12 @@ Deno.test("Account UI owns browser passkey session state without workspace autho globalNavSections.includes("workspaces") && globalNavSections.includes("workspace.display_name") && globalNavSections.includes("workspaceHref(workspace.workspace_id)") && - workspaceCatalogPage.includes("SidebarOverride") && - workspaceCatalogPage.includes("sidebar={homeSidebar}") && - workspaceCatalogPage.includes("GlobalNavSections") && - workspaceCatalogPage.includes("{workspaces}") && + rootLayout.includes("workspaces={data.accessibleWorkspaces}") && + rootLayout.includes("workspaceError={data.workspaceCatalogError}") && + rootLayoutLoad.includes("listWorkspaces(fetch)") && !globalNavSections.includes("Tickets") && !globalNavSections.includes("Repositories"), - "Root page sidebar should replace the Workspaces button with a categorized accessible Workspace list below the remaining global navigation", + "Top-level sidebar should replace the Workspaces button with a categorized accessible Workspace list below the remaining global navigation", ); assert( workspaceLayout.includes("{#snippet workspaceSidebar()}") && @@ -935,7 +932,8 @@ Deno.test("Account UI owns browser passkey session state without workspace autho ); assert( rootLayoutLoad.includes("export const load") && - rootLayoutLoad.includes("() => ({})") && + rootLayoutLoad.includes("listWorkspaces(fetch)") && + rootLayoutLoad.includes("accessibleWorkspaces") && !rootLayoutLoad.includes("workspaceRoute") && !rootLayoutLoad.includes("redirect("), "Root layout should leave account and device-login routes public by avoiding Workspace redirects entirely", diff --git a/web/workspace/src/lib/workspace/sidebar/GlobalSidebar.svelte b/web/workspace/src/lib/workspace/sidebar/GlobalSidebar.svelte index 08430a63..fcf7fc02 100644 --- a/web/workspace/src/lib/workspace/sidebar/GlobalSidebar.svelte +++ b/web/workspace/src/lib/workspace/sidebar/GlobalSidebar.svelte @@ -1,4 +1,5 @@ {#if content} @@ -16,7 +24,7 @@ {:else}
{/if} diff --git a/web/workspace/src/routes/+layout.svelte b/web/workspace/src/routes/+layout.svelte index 01499dea..bdd548d5 100644 --- a/web/workspace/src/routes/+layout.svelte +++ b/web/workspace/src/routes/+layout.svelte @@ -10,7 +10,7 @@ import '../app.css'; import type { LayoutProps } from './$types'; - let { children }: LayoutProps = $props(); + let { children, data }: LayoutProps = $props(); let sidebar = $state