From c07a33ee3e8b1609825d4620444555208d77d2c1 Mon Sep 17 00:00:00 2001 From: Edwin van den Houdt Date: Sun, 5 Jul 2026 11:47:51 +0200 Subject: [PATCH] =?UTF-8?q?feat(fp):=20WP-24=20=E2=80=94=20letter=20canvas?= =?UTF-8?q?=20(edit=20on=20the=20letter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One letter surface for every role: LetterCanvasComponent renders the org template's letterhead/signature/footer around the case-type sections, with editableRegions content|template|none. public/letter.css is the FE⇄BE rendering contract (WP-25 inlines it verbatim). letter-preview deleted — its read-only rendering absorbed into 'none' mode. brief.machine.ts byte-identical; orgTemplate parses at the adapter boundary and lives beside the machine in BriefStore. Also fixes passage-picker multi-select (checkboxes all shared id="undefined", so labels only toggled the first box) and keeps the ±page-break marks from drawing through canvas content. Co-Authored-By: Claude Fable 5 --- .storybook/preview-head.html | 2 + docs/backlog/README.md | 4 +- docs/backlog/WP-24-letter-canvas.md | 22 +- documentation.json | 4164 ++++++++++------- public/letter.css | 197 + src/app/brief/application/brief.store.spec.ts | 16 +- src/app/brief/application/brief.store.ts | 17 +- src/app/brief/domain/org-template.ts | 31 + .../infrastructure/brief.adapter.spec.ts | 40 +- src/app/brief/infrastructure/brief.adapter.ts | 50 +- src/app/brief/ui/brief.page.ts | 47 +- .../letter-canvas/letter-canvas.component.ts | 317 ++ .../ui/letter-canvas/letter-canvas.stories.ts | 154 + .../letter-composer.component.ts | 46 +- .../letter-composer.stories.ts | 21 +- .../letter-preview.component.ts | 175 - .../letter-preview/letter-preview.stories.ts | 88 - .../passage-picker.component.ts | 2 + src/index.html | 3 + 19 files changed, 3270 insertions(+), 2126 deletions(-) create mode 100644 public/letter.css create mode 100644 src/app/brief/domain/org-template.ts create mode 100644 src/app/brief/ui/letter-canvas/letter-canvas.component.ts create mode 100644 src/app/brief/ui/letter-canvas/letter-canvas.stories.ts delete mode 100644 src/app/brief/ui/letter-preview/letter-preview.component.ts delete mode 100644 src/app/brief/ui/letter-preview/letter-preview.stories.ts diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html index 28451c9..7ba250e 100644 --- a/.storybook/preview-head.html +++ b/.storybook/preview-head.html @@ -1,3 +1,5 @@ + + diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 824d29d..120d490 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -67,8 +67,8 @@ for its existing violations, so every WP ends green. | [WP-20](WP-20-second-locale.md) | Second locale proof | 5 · productie-volwassenheid | done | | [WP-21](WP-21-resilience-seams.md) | Resilience seams (correlation-id, idempotency, retry) | 5 · productie-volwassenheid | done | | [WP-22](WP-22-durable-persistence.md) | Durable persistence (optional tier) | 5 · productie-volwassenheid | done | -| [WP-23](WP-23-org-template-backend.md) | Org-template backend + admin role | 6 · Brief v2 | in-progress | -| [WP-24](WP-24-letter-canvas.md) | Letter canvas (edit on the letter) | 6 · Brief v2 | todo | +| [WP-23](WP-23-org-template-backend.md) | Org-template backend + admin role | 6 · Brief v2 | done | +| [WP-24](WP-24-letter-canvas.md) | Letter canvas (edit on the letter) | 6 · Brief v2 | done | | [WP-25](WP-25-letter-preview-html.md) | Server-rendered letter preview (HTML; PDF deferred) | 6 · Brief v2 | todo | | [WP-26](WP-26-org-template-editor.md) | Admin org-template editor | 6 · Brief v2 | todo | | [WP-27](WP-27-brief-ux-layer.md) | Brief UX layer (undo/redo, standaardbrief, diff) | 6 · Brief v2 | todo | diff --git a/docs/backlog/WP-24-letter-canvas.md b/docs/backlog/WP-24-letter-canvas.md index 71d0d6c..fec5b86 100644 --- a/docs/backlog/WP-24-letter-canvas.md +++ b/docs/backlog/WP-24-letter-canvas.md @@ -1,6 +1,6 @@ # WP-24 — Letter canvas (edit on the letter) -Status: todo +Status: done Phase: 6 — Brief v2 (edit-on-the-letter, org templates, server-rendered preview) ## Why @@ -63,13 +63,21 @@ domain model, `brief.machine.ts`, and every `BriefMsg` stay byte-identical. ## Acceptance criteria -- [ ] Drafter edits blocks in place on the letter surface; passage picker and +- [x] Drafter edits blocks in place on the letter surface; passage picker and diagnostics click-to-locate still work on the canvas. -- [ ] Approver sees the identical surface read-only with the action bar. -- [ ] Letterhead/footer/signature come from `orgTemplate` and are visibly non-editable. -- [ ] `git diff` shows zero changes in `brief.machine.ts` / `brief.ts` Msg surface. -- [ ] `letter-preview` is gone; no story regression (`test-storybook:ci` green). -- [ ] Full GREEN + e2e smoke. +- [x] Approver sees the identical surface read-only with the action bar. +- [x] Letterhead/footer/signature come from `orgTemplate` and are visibly non-editable. +- [x] `git diff` shows zero changes in `brief.machine.ts` / `brief.ts` Msg surface. +- [x] `letter-preview` is gone; no story regression (`test-storybook:ci` green). +- [x] Full GREEN + e2e smoke. + +Field notes (landed alongside): the CIBG huisstijl styles bare `
`/`