From e8437b79d1803cb3ef969c4a1a45789bf42d0021 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 11 Jun 2026 12:39:48 +0200 Subject: [PATCH] feat(geschichte): wire StoryDocumentPanel into the story editor sidebar (#795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GeschichteSidebar gains optional geschichteId/items props and renders the panel only when geschichteId is set. GeschichteEditor derives both from its existing GeschichteView prop — null on /geschichten/new, so the panel stays hidden there (create-then-edit, same as journeys). JourneyEditor's sidebar call site is untouched, so journeys never show the panel. Co-Authored-By: Claude Fable 5 --- .../lib/geschichte/GeschichteEditor.svelte | 7 +++- .../GeschichteEditor.svelte.spec.ts | 34 ++++++++++++++++ .../lib/geschichte/GeschichteSidebar.svelte | 19 ++++++++- .../GeschichteSidebar.svelte.spec.ts | 40 +++++++++++++++++++ .../new/StoryCreate.svelte.spec.ts | 16 ++++++++ 5 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts create mode 100644 frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts diff --git a/frontend/src/lib/geschichte/GeschichteEditor.svelte b/frontend/src/lib/geschichte/GeschichteEditor.svelte index 3a562427..e7bb7daf 100644 --- a/frontend/src/lib/geschichte/GeschichteEditor.svelte +++ b/frontend/src/lib/geschichte/GeschichteEditor.svelte @@ -234,7 +234,12 @@ function exec(action: () => void) { - + diff --git a/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts b/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts index 66775f72..d47490c8 100644 --- a/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts +++ b/frontend/src/lib/geschichte/GeschichteEditor.svelte.spec.ts @@ -1,6 +1,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; import { cleanup, render } from 'vitest-browser-svelte'; import { page, userEvent } from 'vitest/browser'; +import { m } from '$lib/paraglide/messages.js'; import GeschichteEditor from './GeschichteEditor.svelte'; const personFactory = (id: string, displayName: string) => ({ @@ -171,3 +172,36 @@ describe('GeschichteEditor — onSubmit payload', () => { expect(payload.personIds).toEqual(['p1']); }); }); + +describe('GeschichteEditor — story document panel (#795)', () => { + it('shows the document panel with the story items when editing an existing story', async () => { + render(GeschichteEditor, { + geschichte: draftFactory({ + items: [ + { + id: 'i1', + position: 10, + document: { + id: 'd1', + title: 'Brief von Eugenie', + datePrecision: 'DAY' as const, + receiverCount: 0 + } + } + ] + }), + onSubmit: vi.fn().mockResolvedValue(undefined) + }); + + await expect + .element(page.getByRole('heading', { name: m.geschichte_documents_heading() })) + .toBeInTheDocument(); + await expect.element(page.getByText('Brief von Eugenie')).toBeInTheDocument(); + }); + + it('hides the document panel when no geschichte is set (creation flow)', async () => { + render(GeschichteEditor, { onSubmit: vi.fn() }); + + expect(document.body.textContent).not.toContain(m.geschichte_documents_heading()); + }); +}); diff --git a/frontend/src/lib/geschichte/GeschichteSidebar.svelte b/frontend/src/lib/geschichte/GeschichteSidebar.svelte index a468ae76..53bf1020 100644 --- a/frontend/src/lib/geschichte/GeschichteSidebar.svelte +++ b/frontend/src/lib/geschichte/GeschichteSidebar.svelte @@ -1,14 +1,26 @@ @@ -62,4 +74,9 @@ const isDraft = $derived(status === 'DRAFT'); + + + {#if geschichteId} + + {/if} diff --git a/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts b/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts new file mode 100644 index 00000000..841a0da9 --- /dev/null +++ b/frontend/src/lib/geschichte/GeschichteSidebar.svelte.spec.ts @@ -0,0 +1,40 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import { m } from '$lib/paraglide/messages.js'; +import GeschichteSidebar from './GeschichteSidebar.svelte'; + +const item = { + id: 'i1', + position: 10, + document: { + id: 'd1', + title: 'Brief von Eugenie', + datePrecision: 'DAY' as const, + receiverCount: 0 + } +}; + +afterEach(() => cleanup()); + +describe('GeschichteSidebar — document panel contract (#795)', () => { + it('renders the document panel when geschichteId and items are provided', async () => { + render(GeschichteSidebar, { + status: 'DRAFT', + selectedPersons: [], + geschichteId: 'g1', + items: [item] + }); + + await expect + .element(page.getByRole('heading', { name: m.geschichte_documents_heading() })) + .toBeInTheDocument(); + await expect.element(page.getByText('Brief von Eugenie')).toBeInTheDocument(); + }); + + it('does not render the document panel without geschichteId', async () => { + render(GeschichteSidebar, { status: 'DRAFT', selectedPersons: [] }); + + expect(document.body.textContent).not.toContain(m.geschichte_documents_heading()); + }); +}); diff --git a/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts b/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts new file mode 100644 index 00000000..9c387cb6 --- /dev/null +++ b/frontend/src/routes/geschichten/new/StoryCreate.svelte.spec.ts @@ -0,0 +1,16 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { m } from '$lib/paraglide/messages.js'; + +vi.mock('$app/navigation', () => ({ beforeNavigate: vi.fn(), goto: vi.fn() })); +import StoryCreate from './StoryCreate.svelte'; + +afterEach(() => cleanup()); + +describe('StoryCreate — document panel guard (#795)', () => { + it('renders without the document panel — documents attach after the first save', async () => { + render(StoryCreate, { initialPersons: [] }); + + expect(document.body.textContent).not.toContain(m.geschichte_documents_heading()); + }); +});