Commit Graph

  • d87ad36278 feat(PersonMentionEditor): rewrite as Tiptap editor with AC-1 typed-text displayName Marcel 2026-04-29 15:53:21 +02:00
  • 39ddf90725 refactor(MentionDropdown): receive reactive state via single 'model' prop Marcel 2026-04-29 15:52:45 +02:00
  • e5634c301e feat(frontend): add MentionDropdown — Tiptap suggestion-compatible person dropdown Marcel 2026-04-29 15:08:44 +02:00
  • 68cb6e9b76 feat(frontend): add mentionSerializer — pure serialize/deserialize for Tiptap ↔ block storage Marcel 2026-04-29 15:03:58 +02:00
  • 5591f95871 chore(deps): install Tiptap 3.22.5 (core, starter-kit, extension-mention) Marcel 2026-04-29 15:01:19 +02:00
  • 41a57c0dc8 feat(frontend): add Tiptap renovate group, i18n keys, fix geb. literal, remove rename-conflict Marcel 2026-04-29 15:00:13 +02:00
  • 2d19ca7244 refactor(backend): delete rename-propagation listener and its infrastructure Marcel 2026-04-29 14:58:18 +02:00
  • bc58d77f2c test(e2e): uniquify person-mention doc title and tighten B21 card-suppression assertion Marcel 2026-04-29 09:04:59 +02:00
  • 515fa03088 test(person-mention): replace setTimeout waits with vi.waitFor Marcel 2026-04-29 09:04:02 +02:00
  • 060a1149e0 fix(person-mention): bump underline contrast so the link is visible at rest Marcel 2026-04-29 09:02:38 +02:00
  • 558e1e6b22 fix(person-mention): truncate notes excerpt at last word boundary Marcel 2026-04-29 09:01:39 +02:00
  • 6dd60571e3 fix(person-mention): name the hover-card region and announce its busy state Marcel 2026-04-29 09:00:15 +02:00
  • 3365f5845e fix(person-mention): hover card mounts on focusin for keyboard users (WCAG 2.1.1) Marcel 2026-04-29 08:57:48 +02:00
  • 3faac13533 fix(person-mention): respect modified-click and middle-click for new-tab nav Marcel 2026-04-29 08:56:23 +02:00
  • 5890bb3abd refactor(person-mention): split fetchHoverData into pure load + cache wrapper Marcel 2026-04-29 08:54:35 +02:00
  • 060db69108 refactor(person-mention): extract computeHoverCardPosition into testable util Marcel 2026-04-29 08:53:29 +02:00
  • 1842e23c81 refactor(person-mention): centralise PERSON_MENTION_SELECTOR constant Marcel 2026-04-29 08:51:25 +02:00
  • 26519d029a feat(person-mention): reject non-UUID personIds at the renderer boundary Marcel 2026-04-29 08:50:28 +02:00
  • 488d4384a1 refactor(person-mention): brand renderer return types as SafeHtml Marcel 2026-04-29 08:48:26 +02:00
  • 6a6967d841 refactor(person-mention): hoist LoadState + HoverData into shared types module Marcel 2026-04-29 08:46:42 +02:00
  • ae868f4110 test(e2e): person-mention read mode hover (B20) and tap (B21) Marcel 2026-04-29 08:23:47 +02:00
  • 1fd38830fe feat(person-mention): TranscriptionReadView wires hover card and click nav Marcel 2026-04-29 08:21:35 +02:00
  • c9c395eb59 feat(person-mention): PersonHoverCard with skeleton/error/loaded states Marcel 2026-04-29 08:16:51 +02:00
  • c247e1e971 feat(person-mention): .person-mention global CSS for read-mode anchors Marcel 2026-04-29 08:13:32 +02:00
  • eb6e21f032 feat(person-mention): renderTranscriptionBody for safe read-mode HTML Marcel 2026-04-29 08:12:52 +02:00
  • b4b46a0a79 test(person-mention): boundary cases for whitespace + newline triggers Marcel 2026-04-29 01:21:38 +02:00
  • ba73387d50 refactor(transcription): extract saveBlockWithConflictRetry into a util Marcel 2026-04-29 01:20:49 +02:00
  • d9c7abf2ab test(autosave): observe saving→saved transition in B12 retry path Marcel 2026-04-29 01:18:43 +02:00
  • 7fc56022ae test(person-mention): assert popup degrades to empty state on fetch reject Marcel 2026-04-29 01:17:45 +02:00
  • e8ba840560 test(person-mention): drive editor specs via fake timers Marcel 2026-04-29 01:16:55 +02:00
  • 09f71a2dce feat(person-mention): empty-state link to create the missing person Marcel 2026-04-29 01:15:41 +02:00
  • 86ad5ca9b3 fix(person-mention): show loading state during debounce + fetch Marcel 2026-04-29 01:14:37 +02:00
  • 780c682136 fix(person-mention): distinguish keyboard-highlighted row from hover Marcel 2026-04-29 01:13:27 +02:00
  • a8a3b7f574 fix(person-mention): textarea focus ring + 44px tap target Marcel 2026-04-29 01:12:37 +02:00
  • f0bb1c3163 fix(person-mention): close popup on textarea blur Marcel 2026-04-29 01:11:33 +02:00
  • cacbd57752 docs(person-mention): document implicit auth assumption on typeahead fetch Marcel 2026-04-29 01:10:30 +02:00
  • 43aacd9f60 fix(transcription): UUID-guard saveBlock path interpolation Marcel 2026-04-29 01:09:52 +02:00
  • 362a84dde9 fix(escapeHtml): cover apostrophe to harden single-quoted attribute use Marcel 2026-04-29 01:09:13 +02:00
  • 49db82e1bd refactor(person-mention): move autoresize into PersonMentionEditor Marcel 2026-04-29 01:08:12 +02:00
  • fd3a44d10c refactor(transcription): typed BlockConflictResolvedError instead of prose throw Marcel 2026-04-29 01:05:47 +02:00
  • cb51e8e432 refactor(autosave): drop unused handleMentionsChange + getPendingMentions exports Marcel 2026-04-29 01:04:25 +02:00
  • bbde9e8497 refactor(person-mention): rename shadowed m param in TranscriptionBlock bind setter Marcel 2026-04-29 01:02:13 +02:00
  • 793496440c refactor(person-mention): rename shadowed Paraglide m variable in dedup check Marcel 2026-04-29 00:50:35 +02:00
  • e3175f493c test(transcription): backfill mentionedPersons on missed read-view fixture Marcel 2026-04-29 00:39:45 +02:00
  • 64a61f705c feat(transcription): handle 409 rename-mid-edit conflict on block save (B12b) Marcel 2026-04-29 00:35:27 +02:00
  • e50aab2578 test(autosave): preserve text + mentionedPersons across save failure (B12) Marcel 2026-04-29 00:33:35 +02:00
  • 02d3e2ab61 feat(transcription): swap plain textarea for PersonMentionEditor and thread mentionedPersons through autosave Marcel 2026-04-29 00:32:09 +02:00
  • c4ee2c666b feat(transcription): add PersonMentionEditor with typeahead + keyboard nav Marcel 2026-04-29 00:22:30 +02:00
  • bf8fb00dd2 i18n(person-mention): add 5 locale keys for editor + read-mode Marcel 2026-04-29 00:05:51 +02:00
  • b3ce15f0dd feat(mention): add detectPersonMention with multi-word query support Marcel 2026-04-29 00:03:20 +02:00
  • c7013f4902 refactor(mention): extract shared escapeHtml helper Marcel 2026-04-29 00:02:03 +02:00
  • 091f6c7592 migration(transcription): add unique constraint on (block_id, person_id) sidecar Marcel 2026-04-28 23:42:05 +02:00
  • 3a6f90441e test(transcription): add null-text edge case for rewriteBlockText guard Marcel 2026-04-28 23:40:52 +02:00
  • 13e0801b30 refactor(transcription): extract rewriteBlockText from propagation loop Marcel 2026-04-28 23:04:26 +02:00
  • 4c3aa159c5 test(transcription): add updateBlock 400 test for null personId in mention Marcel 2026-04-28 23:03:00 +02:00
  • eb51155b4e test(transcription): rename latency floor test to reflect 5s assertion Marcel 2026-04-28 23:02:00 +02:00
  • 43f474fc5b refactor(repository): remove dead findByMentionedPersons_PersonId derived query Marcel 2026-04-28 23:00:56 +02:00
  • 8ca3f37817 fix(test): update optimistic-lock mock to use JOIN FETCH query method Marcel 2026-04-28 22:22:01 +02:00
  • 1dc812bd47 test(transcription): raise latency floor to 5s to prevent false CI failures Marcel 2026-04-28 22:19:09 +02:00
  • 7a647b5633 refactor(test): rename test to reflect actual invariant (displayName fields unchanged) Marcel 2026-04-28 22:17:52 +02:00
  • 5f76d4a1ac test(person): controller returns 409 PERSON_RENAME_CONFLICT on optimistic-lock Marcel 2026-04-28 22:16:53 +02:00
  • c7958681f5 fix(transcription): eliminate N+1 lazy load in propagation listener Marcel 2026-04-28 22:15:38 +02:00
  • 1f3f879f9c test(transcription): JOIN FETCH query loads all block mentions for propagation Marcel 2026-04-28 22:14:07 +02:00
  • 7906373053 docs(adr): ADR-006 synchronous domain events inside the publisher's transaction Marcel 2026-04-28 21:42:03 +02:00
  • 2d48821f95 refactor(test): TranscriptionServiceTest uses DTO @Builder instead of @AllArgsConstructor Marcel 2026-04-28 21:40:29 +02:00
  • 0def9e9b9d test(transcription): mirror displayName length-cap regression on PUT endpoint Marcel 2026-04-28 21:39:13 +02:00
  • acffcc8516 refactor(transcription): listener @Component → @Service Marcel 2026-04-28 21:38:06 +02:00
  • 48492330a7 test(person): optimistic-lock test exercises real listener saveAllAndFlush path Marcel 2026-04-28 21:36:54 +02:00
  • d924d9059c refactor(transcription): drop dead existsById orphan guard from listener Marcel 2026-04-28 21:35:15 +02:00
  • 99aee777de fix(transcription): word-boundary regex prevents single-word displayName corruption Marcel 2026-04-28 21:33:15 +02:00
  • 8b498665df chore(frontend): regenerate api.ts for PersonMention sidecar + PERSON_RENAME_CONFLICT Marcel 2026-04-28 21:10:54 +02:00
  • 5ebe1f1a5a feat(person): require READ_ALL permission on GET /api/persons and /api/persons/{id} Marcel 2026-04-28 21:02:29 +02:00
  • 221a6af838 test(transcription): rename propagation across 200 blocks must stay under 2 seconds Marcel 2026-04-28 20:58:55 +02:00
  • 404d874b4e feat(person): translate optimistic-lock conflicts on rename to PERSON_RENAME_CONFLICT 409 Marcel 2026-04-28 20:57:16 +02:00
  • 4bc4267e5a feat(person): ErrorCode.PERSON_RENAME_CONFLICT for optimistic-lock conflicts Marcel 2026-04-28 20:33:06 +02:00
  • bd17532118 test(transcription): orphaned-sidecar guard — no-op when personId is gone Marcel 2026-04-28 20:31:09 +02:00
  • e021261300 test(transcription): all in-block mention occurrences rewrite on rename Marcel 2026-04-28 20:29:45 +02:00
  • e94ffde075 test(transcription): partial-name collision does not corrupt unrenamed mention Marcel 2026-04-28 20:28:25 +02:00
  • 29a1df5d9c test(transcription): listener no-op when no block references the renamed person Marcel 2026-04-28 20:27:07 +02:00
  • 4d288589fa feat(transcription): PersonMentionPropagationListener rewrites blocks on rename Marcel 2026-04-28 20:25:16 +02:00
  • a2c633c5de feat(transcription): findByMentionedPersons_PersonId derived query Marcel 2026-04-28 20:21:23 +02:00
  • 28112e1d7b test(person): alias-only and notes-only updates do not publish display-name event Marcel 2026-04-28 20:18:35 +02:00
  • 08e7987033 feat(person): updatePerson publishes PersonDisplayNameChangedEvent on display-name change Marcel 2026-04-28 20:17:17 +02:00
  • 1db0f38f62 test(transcription): 400 + VALIDATION_ERROR when mention personId is null Marcel 2026-04-28 20:14:14 +02:00
  • 4e8df66a79 test(transcription): 400 + VALIDATION_ERROR when mention displayName exceeds 200 chars Marcel 2026-04-28 20:12:53 +02:00
  • 80ddfb47ac feat(transcription): DTOs accept mentionedPersons sidecar with @Valid cascade Marcel 2026-04-28 20:11:01 +02:00
  • 7805da52e6 test(transcription): round-trip TranscriptionBlock.mentionedPersons Marcel 2026-04-28 20:07:56 +02:00
  • 0f3e000379 feat(transcription): TranscriptionBlock.mentionedPersons sidecar field Marcel 2026-04-28 20:06:58 +02:00
  • b435fd69f7 feat(person): PersonDisplayNameChangedEvent record Marcel 2026-04-28 20:05:39 +02:00
  • a6c8db226d feat(transcription): PersonMention @Embeddable for sidecar entries Marcel 2026-04-28 20:04:41 +02:00
  • e833d1f71a feat(transcription): V56 migration adds transcription_block_mentioned_persons sidecar Marcel 2026-04-28 20:03:36 +02:00
  • 5d82a3e471 refactor(relationship): use typed RelationType enum in CreateRelationshipRequest Marcel 2026-04-28 19:56:55 +02:00
  • cb93f55396 refactor(stammbaum): StammbaumSidePanel composes AddRelationshipForm — removes inline form duplication Marcel 2026-04-28 19:25:02 +02:00
  • 3cfaae06da feat(stammbaum): AddRelationshipForm accepts onSubmit callback prop for fetch-based submission Marcel 2026-04-28 19:22:10 +02:00
  • a81323a7a1 fix(stammbaum): handle HttpMessageNotReadableException → 400 for invalid enum values Marcel 2026-04-28 18:27:25 +02:00
  • 10b1bab57b fix(stammbaum): state-aware aria-label on family-member toggle — WCAG accessible name Marcel 2026-04-28 18:21:55 +02:00
  • 000333d540 fix(stammbaum): WCAG text-[10px] → text-xs in PersonRelationshipsCard chip labels Marcel 2026-04-28 18:19:20 +02:00
  • 5817a79151 test(stammbaum): year-range validation test for AddRelationshipForm — toYear before fromYear shows alert Marcel 2026-04-28 18:17:27 +02:00
  • 3b430828b7 test(stammbaum): component tests for StammbaumCard — heading, empty state, toggle, error display Marcel 2026-04-28 17:37:21 +02:00
  • f8aa8c6574 test(stammbaum): component tests for StammbaumSidePanel — displayName, empty state, loading indicator Marcel 2026-04-28 17:36:01 +02:00