feat(tickets): Volltextsuche + Kategorien, 👍/👎-Rückmeldung & ähnliche gelöste Tickets

- Suche: Volltext über Nachricht/Frage/Antwort/Changelog/Name/Kategorie, plus
  Kategorie-Filter (KI-gesetzte Kategorie als Chip + Auswahlmenü), je innerhalb der
  aktiven Ansicht.
- 👍/👎 auf gelösten Tickets: 👍 speichert die Rückmeldung, 👎 öffnet das Ticket
  wieder (zurück in die Rückfragen) und bittet um die fehlende Info.
- Melde-Fenster: schlägt beim Tippen ähnliche bereits gelöste Tickets vor
  (Wort-Überlappung + Bonus bei gleichem Tier/Wurf/Kontakt) — Self-Service.

Backend: Feedback.Category + Feedback.Helpful (+ PUT-Handling), Migration
FeedbackCategoryAndHelpful (beide nullable). Tests: 260 Backend grün, e2e Tickets
Desktop +4 (Suche/Kategorie/👍/👎), vitest 149.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 11:14:07 +02:00
parent c0a7b1a5ee
commit 48b138bbfd
15 changed files with 2217 additions and 10 deletions

View File

@@ -433,6 +433,8 @@ export async function installMockApi(page: Page): Promise<MockDb> {
thread: [],
reopenedAt: null,
deletedAt: null,
category: null,
helpful: null,
}
db.feedback.push(created)
return json(route, 201, created)
@@ -468,6 +470,8 @@ export async function installMockApi(page: Page): Promise<MockDb> {
answer?: string
fixNote?: string
agentContext?: string
category?: string
helpful?: boolean
}
const row = db.feedback[idx]
// Zustand vor den Mutationen (für die Wiederöffnen-Erkennung).
@@ -536,6 +540,11 @@ export async function installMockApi(page: Page): Promise<MockDb> {
const c = body.agentContext.trim()
row.agentContext = c.length === 0 ? null : c
}
if (typeof body.category === 'string') {
const cat = body.category.trim()
row.category = cat.length === 0 ? null : cat
}
if (typeof body.helpful === 'boolean') row.helpful = body.helpful
return json(route, 200, row)
}
if (method === 'DELETE') {