-
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