@-Mentions: Inline-Node, User-Suche, Autocomplete #150

Closed
opened 2026-07-20 00:15:48 +02:00 by fable-5 · 1 comment
Collaborator

Ziel

@Name markiert einen Nutzer als strukturierter Inline-Node. Erwähnbar sind ALLE Nutzer der Instanz (Autocomplete). Benachrichtigungen sind ein Folge-Issue.

Umsetzungsskizze

  • Inline-Atom mention (Blaupause wikilink, packages/shared/src/editor-schema/schema.ts:233-257), Attrs {userId, username}. userId = stabile Referenz; Anzeige rendert live den aktuellen displayName (Umbenennung wirkt sofort), Fallback @username; gelöschte/unauflösbare Nutzer = toter @username-Chip.
  • Markdown kanonisch @username (Rule/Token-Mapping/Serializer in markdown.ts analog wikilinkRule); der DB-lose Markdown-Import lässt userId leer (rein visuell, löst nichts aus).
  • html.ts (renderInline) + plain-text.ts (FTS) erweitern; neuer Extraktor packages/shared/src/editor-schema/mentions.ts (Vorbild wikilinks.ts).
  • TipTap-Node apps/web/src/editor/nodes/mention.tsx; MentionAutocomplete.tsx als Klon von WikilinkAutocomplete.tsx (Trigger @).
  • Neuer Endpoint GET /users/search?q= (authentifiziert, instanzweit — die teichgebundene Mitgliederliste reicht nicht): exponiert NUR id/username/displayName; min. 2 Zeichen, Limit 10, Throttle. Dokumentierte Konsequenz: eingeloggte Nutzer können Nutzernamen entdecken (Entscheidung Stefan).

Akzeptanzkriterien

  • @ öffnet die Suche über alle Nutzer; Auswahl erzeugt den Node mit userId.
  • Markdown-Roundtrip @username; HTML/FTS/Export zeigen die Mention.
  • Umbenannter Nutzer erscheint mit neuem displayName; gelöschter als toter Chip.
  • Endpoint verlangt Auth und liefert nur die drei Felder.

Bewusst nicht enthalten

Benachrichtigungen (Folge-Issue), userId-Auflösung beim Markdown-Import, Mentions in Kommentaren.

## Ziel `@Name` markiert einen Nutzer als strukturierter Inline-Node. Erwähnbar sind ALLE Nutzer der Instanz (Autocomplete). Benachrichtigungen sind ein Folge-Issue. ## Umsetzungsskizze - Inline-Atom `mention` (Blaupause wikilink, `packages/shared/src/editor-schema/schema.ts:233-257`), Attrs `{userId, username}`. userId = stabile Referenz; Anzeige rendert live den aktuellen displayName (Umbenennung wirkt sofort), Fallback `@username`; gelöschte/unauflösbare Nutzer = toter `@username`-Chip. - Markdown kanonisch `@username` (Rule/Token-Mapping/Serializer in `markdown.ts` analog wikilinkRule); der DB-lose Markdown-Import lässt userId leer (rein visuell, löst nichts aus). - `html.ts` (renderInline) + `plain-text.ts` (FTS) erweitern; neuer Extraktor `packages/shared/src/editor-schema/mentions.ts` (Vorbild `wikilinks.ts`). - TipTap-Node `apps/web/src/editor/nodes/mention.tsx`; `MentionAutocomplete.tsx` als Klon von `WikilinkAutocomplete.tsx` (Trigger `@`). - Neuer Endpoint `GET /users/search?q=` (authentifiziert, instanzweit — die teichgebundene Mitgliederliste reicht nicht): exponiert NUR id/username/displayName; min. 2 Zeichen, Limit 10, Throttle. Dokumentierte Konsequenz: eingeloggte Nutzer können Nutzernamen entdecken (Entscheidung Stefan). ## Akzeptanzkriterien - `@` öffnet die Suche über alle Nutzer; Auswahl erzeugt den Node mit userId. - Markdown-Roundtrip `@username`; HTML/FTS/Export zeigen die Mention. - Umbenannter Nutzer erscheint mit neuem displayName; gelöschter als toter Chip. - Endpoint verlangt Auth und liefert nur die drei Felder. ## Bewusst nicht enthalten Benachrichtigungen (Folge-Issue), userId-Auflösung beim Markdown-Import, Mentions in Kommentaren.
fable-5 added this to the M22 — Aufgaben milestone 2026-07-20 00:15:48 +02:00
Author
Collaborator

Umgesetzt in PR #158 (7471fc7): Inline-Atom mention {userId, username} — Markdown-Regel @username (E-Mail-sicher), Serializer, HTML-Chip, Plain-Text fuer die Suche, Extraktor extractMentionUserIds. Neue Endpoints GET /users/search (auth, min. 2 Zeichen, Limit 10, Rate-Limit 60/min) und GET /users/brief (Batch-Aufloesung). Editor: Autocomplete nach dem Wikilink-Muster, NodeView zeigt den LIVE-Anzeigenamen (Umbenennung wirkt sofort), geloeschte/unaufgeloeste Nutzer als toter Chip. 5 Unit-Tests; Loop live verifiziert.

Umgesetzt in PR #158 (7471fc7): Inline-Atom mention {userId, username} — Markdown-Regel @username (E-Mail-sicher), Serializer, HTML-Chip, Plain-Text fuer die Suche, Extraktor extractMentionUserIds. Neue Endpoints GET /users/search (auth, min. 2 Zeichen, Limit 10, Rate-Limit 60/min) und GET /users/brief (Batch-Aufloesung). Editor: Autocomplete nach dem Wikilink-Muster, NodeView zeigt den LIVE-Anzeigenamen (Umbenennung wirkt sofort), geloeschte/unaufgeloeste Nutzer als toter Chip. 5 Unit-Tests; Loop live verifiziert.
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: stwaidele/dorfteich#150
No description provided.