feat(taiga): Ticket-Stand im Knoten-Fenster — gelesen, nie geschrieben (D91-Nachtrag 6, SPEC §9)

Wo eine Ref steht und ein `&taiga.<slug>` gilt, zeigt das Knoten-Fenster
Betreff, Status und Zuständigen des Tickets; Taigas Statusname steht neben
der Statusbox der Notation (`In progress → [~]`).

- Proxy: zwei benannte Lese-Endpunkte (`GET /taiga/userstories/{ref}` und
  `…/tasks/{ref}`, je `?slug=`) — das Präfix der Ref trägt den Typ, Taiga
  hat getrennte `by_ref`-Endpunkte. Erst `/projects/by_slug`, dann `by_ref`
  (eine Ref ist nur je Projekt eindeutig); der Slug wird kodiert angehängt.
- Die Abbildung Status → Statusbox liegt im Editor (`mapTaigaStatus`,
  headless): Statuscodes sind Notation, das Backend parst sie nicht (D14).
  Unbekannte Namen bleiben unabgebildet — Raten hieße, dem Knoten eine
  Aussage zu geben, die niemand gemacht hat.
- Geholt wird erst nach 400 ms Verweilen und je Ticket einmal je Sitzung
  (↻ holt neu); ohne Anmeldung gar nicht — der Knopf meldet erst an.
- Nichts wird geschrieben: kein Text, keine Statusbox (das bleibt
  `#trk.write`).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-27 20:41:21 +02:00
co-authored by Claude Fable 5
parent e58f71bf90
commit 842e89795a
15 changed files with 776 additions and 33 deletions
+14
View File
@@ -667,6 +667,20 @@ verworfene Elemente. Quelle sind ES-Module unter `src/`; `index.html` ist der
`werkbaum-taiga` im localStorage (nur Token, nie ein Passwort); ein 401
löscht es und fragt neu. Fehler erscheinen IM Dialog, nicht als
`window.alert` (in manchen Kontexten unterdrückt, D22-Lehre).
- **Ticket-Stand lesen (D91-Nachtrag 6):** `ticketApiPath()` baut den
Proxy-Pfad (getrennte by_ref-Endpunkte je Typ, Slug kodiert),
`mapTaigaStatus()` bildet Taigas Statusnamen auf `STATUS_BY_CODE` ab —
beides headless in `taiga.js`, denn die Statuscodes sind Notation und das
Backend parst sie nicht (D14); ein unbekannter Name bleibt **null**.
In app.js: `ticketBox()`/`paintTicket()`/`loadTicket()` samt Cache
`taigaTickets` (je Ticket EIN Abruf je Sitzung, ↻ holt neu) und
`TICKET_DELAY` (400 ms Verweilen, bevor überhaupt gefragt wird — das
Fenster öffnet beim Überfahren und beim Tabben). **Ohne Sitzung wird nichts
automatisch geholt**, der Knopf meldet erst an. `tipTicket`/`ticketTimer`
stehen oben bei `tipNode`, weil `closeNodeTip()` sie mit wegräumt (das
läuft schon beim Aufbau — sonst temporale Todeszone). Der
`pointerdown`-Wächter lässt `.tabmodal-overlay` durch: Der Anmelde-Dialog
gehört zu einer Aktion AUS dem Fenster und darf es nicht zumachen.
- **Nie `src.value = …` während des Bearbeitens (D53).** Es löscht die
Undo-Historie des Textfelds **komplett** — nicht nur den eigenen Schritt,
sondern alles davor Getippte. Gemessen: nach so einem Schreiben ändert das