From 43d36c898c1ce8177f8f31b7042b03df05fd130b Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 8 May 2026 17:13:00 +0200 Subject: [PATCH] feat(dashboard): wire ReaderHeaderBar, grid content row, delete ReaderStatsStrip (#483) Co-Authored-By: Claude Sonnet 4.6 --- .../shared/dashboard/ReaderStatsStrip.svelte | 43 ------------------- .../dashboard/ReaderStatsStrip.svelte.spec.ts | 37 ---------------- frontend/src/routes/+page.svelte | 26 +++++------ frontend/src/routes/page.svelte.spec.ts | 8 +++- 4 files changed, 18 insertions(+), 96 deletions(-) delete mode 100644 frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte delete mode 100644 frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte.spec.ts diff --git a/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte b/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte deleted file mode 100644 index 8129b03c..00000000 --- a/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte.spec.ts b/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte.spec.ts deleted file mode 100644 index b33ddfc7..00000000 --- a/frontend/src/lib/shared/dashboard/ReaderStatsStrip.svelte.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { describe, it, expect, afterEach } from 'vitest'; -import { cleanup, render } from 'vitest-browser-svelte'; -import { page } from 'vitest/browser'; - -import ReaderStatsStrip from './ReaderStatsStrip.svelte'; - -afterEach(() => { - cleanup(); -}); - -describe('ReaderStatsStrip', () => { - it('renders a link to /documents', async () => { - render(ReaderStatsStrip, { documents: 42, persons: 7, stories: 3 }); - const link = page.getByRole('link', { name: /42/ }); - await expect.element(link).toHaveAttribute('href', '/documents'); - }); - - it('renders a link to /persons', async () => { - render(ReaderStatsStrip, { documents: 42, persons: 7, stories: 3 }); - const link = page.getByRole('link', { name: /7/ }); - await expect.element(link).toHaveAttribute('href', '/persons'); - }); - - it('renders a link to /geschichten', async () => { - render(ReaderStatsStrip, { documents: 42, persons: 7, stories: 3 }); - const link = page.getByRole('link', { name: /3/ }); - await expect.element(link).toHaveAttribute('href', '/geschichten'); - }); - - it('shows "—" when documents count is null', async () => { - render(ReaderStatsStrip, { documents: null, persons: null, stories: null }); - const links = page.getByRole('link'); - await expect.element(links.first()).toBeInTheDocument(); - const text = ((await links.first().element()) as HTMLElement).textContent; - expect(text).toContain('—'); - }); -}); diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 20c05ebf..4b5069e0 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -5,7 +5,7 @@ import MissionControlStrip from '$lib/document/MissionControlStrip.svelte'; import DashboardFamilyPulse from '$lib/shared/dashboard/DashboardFamilyPulse.svelte'; import DashboardActivityFeed from '$lib/activity/DashboardActivityFeed.svelte'; import EnrichmentBlock from '$lib/document/EnrichmentBlock.svelte'; -import ReaderStatsStrip from '$lib/shared/dashboard/ReaderStatsStrip.svelte'; +import ReaderHeaderBar from '$lib/shared/dashboard/ReaderHeaderBar.svelte'; import ReaderPersonChips from '$lib/shared/dashboard/ReaderPersonChips.svelte'; import ReaderDraftsModule from '$lib/shared/dashboard/ReaderDraftsModule.svelte'; import ReaderRecentDocs from '$lib/shared/dashboard/ReaderRecentDocs.svelte'; @@ -30,15 +30,10 @@ const greetingText = $derived.by(() => {
- {#if data?.user} -
-

{greetingText}

-
- {/if} - {#if data.isReader}
- { -
-
- -
-
- -
+
+ +
{:else} + {#if data?.user} +
+

{greetingText}

+
+ {/if}
diff --git a/frontend/src/routes/page.svelte.spec.ts b/frontend/src/routes/page.svelte.spec.ts index e1d82648..a022cafa 100644 --- a/frontend/src/routes/page.svelte.spec.ts +++ b/frontend/src/routes/page.svelte.spec.ts @@ -102,13 +102,19 @@ describe('Home page – dashboard layout', () => { // ─── Reader dashboard layout ────────────────────────────────────────────────── describe('Home page – reader dashboard layout', () => { - it('renders ReaderStatsStrip totals when isReader is true', async () => { + it('renders reader header-bar totals when isReader is true', async () => { render(Page, { data: readerData }); await expect.element(page.getByText('34')).toBeInTheDocument(); await expect.element(page.getByText('12')).toBeInTheDocument(); await expect.element(page.getByText('5')).toBeInTheDocument(); }); + it('reader branch does not render h1 heading', async () => { + render(Page, { data: readerData }); + const h1 = page.getByRole('heading', { level: 1 }); + await expect.element(h1).not.toBeInTheDocument(); + }); + it('renders the recent-docs heading when isReader is true', async () => { render(Page, { data: readerData }); await expect.element(page.getByText('Zuletzt aktualisiert')).toBeInTheDocument();