diff --git a/gerbil-manager-web/e2e/tickets.spec.ts b/gerbil-manager-web/e2e/tickets.spec.ts index 83526c3..f6bceb4 100644 --- a/gerbil-manager-web/e2e/tickets.spec.ts +++ b/gerbil-manager-web/e2e/tickets.spec.ts @@ -148,10 +148,14 @@ test.describe('Meine Tickets', () => { await card.locator('.ticket-card__answer-form textarea').fill('Korrekt ist der 2. Juni.') await card.getByRole('button', { name: tt.answerButton }).click() - // Antwort wird angezeigt + Badge wechselt auf „Beantwortet" (bleibt in der Dialog-Ansicht). + // Antwort wird angezeigt + Badge wechselt auf „Beantwortet". Das Ticket verlässt die + // Rückfragen-Liste und steht jetzt unter „Offen" (Ansicht wechselt automatisch dorthin, + // da die Rückfragen-Gruppe nun leer ist). await expect(card.getByText('Korrekt ist der 2. Juni.')).toBeVisible() await expect(card.locator('.ticket-badge--answered')).toBeVisible() await expect(card.getByText(tt.statusAnswered, { exact: true })).toBeVisible() + const openFilter = page.locator('.tickets-filter').filter({ hasText: tt.filters.open }) + await expect(openFilter).toHaveClass(/tickets-filter--active/) }) test('Ticket löschen', async ({ page }) => { diff --git a/gerbil-manager-web/src/pages/TicketsPage.tsx b/gerbil-manager-web/src/pages/TicketsPage.tsx index 17a868a..71c2c2e 100644 --- a/gerbil-manager-web/src/pages/TicketsPage.tsx +++ b/gerbil-manager-web/src/pages/TicketsPage.tsx @@ -6,8 +6,9 @@ * Pro Ticket: als gelöst markieren / wieder öffnen, Beschreibung bearbeiten (inline), * löschen (mit Bestätigung). Erfolg/Fehler über das bestehende Toast-System. * - * Drei gefilterte Verlinkungen (Filter-Chips, kein Pflicht-Tab): „Rückfragen" (im Dialog - * = NeedsInfo/Answered), „Offen" (Open), „Geschlossen" (Resolved, zeigt den Changelog/fixNote). + * Drei gefilterte Verlinkungen (Filter-Chips, kein Pflicht-Tab): „Rückfragen" (NeedsInfo — + * wartet auf die Züchterin), „Offen" (Open + Answered — von der KI zu erledigen, beantwortete + * Rückfragen kommen hierher zurück), „Geschlossen" (Resolved, zeigt den Changelog/fixNote). * Der Frage/Antwort-Verlauf (thread) wird angezeigt; das interne `agentContext` NIEMALS. */ import { createContext, Fragment, useContext, useEffect, useMemo, useState } from 'react' @@ -154,10 +155,17 @@ function formatDate(iso: string | null): string { /** Gefilterte Ansichten (Filter-Chips). */ type TicketView = 'dialog' | 'open' | 'closed' -/** Zuordnung Ticket-Status → gefilterte Ansicht. */ +/** + * Zuordnung Ticket-Status → gefilterte Ansicht. + * - „Rückfragen" (dialog): NUR NeedsInfo — wartet auf die Antwort der Züchterin. + * - „Offen" (open): Open + Answered — von der KI zu erledigen. Sobald die Züchterin + * geantwortet hat (Answered), ist SIE fertig → das Ticket wandert zurück nach „Offen" + * (mit „Beantwortet"-Badge), statt in ihrer Rückfragen-Liste zu verbleiben. + * - „Geschlossen" (closed): Resolved. + */ function viewOf(status: FeedbackTicket['status']): TicketView { if (status === 'Resolved') return 'closed' - if (status === 'NeedsInfo' || status === 'Answered') return 'dialog' + if (status === 'NeedsInfo') return 'dialog' return 'open' }