feat(tickets): Markdown in Texten + Editier-Regeln für Rückfragen

- Ticket-Texte (Frage/Antwort/Nachricht/Changelog/Verlauf) rendern eine
  Markdown-Teilmenge: **fett**, `code`, Aufzählungen, Links, Tier-/Ticket-IDs
- Offene Rückfrage (NeedsInfo): nicht bearbeitbar — die Züchterin soll antworten
- Beantwortet (Answered): Antwort nachträglich änderbar, bevor die KI übernimmt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 22:51:00 +02:00
parent 23f028123d
commit 4ec0f787dd
5 changed files with 196 additions and 80 deletions

View File

@@ -433,7 +433,8 @@ export function seedDb(): MockDb {
createdAt: '2026-06-14T08:00:00Z',
status: 'NeedsInfo',
resolvedAt: null,
question: 'Welches Geburtsdatum ist korrekt — der 1. oder der 2. Juni?',
question:
'Welches Geburtsdatum ist korrekt — der **1.** oder der **2. Juni**?\n\nBitte wähle:\n- 1. Juni\n- 2. Juni',
answer: null,
answeredAt: null,
fixNote: null,

View File

@@ -158,6 +158,21 @@ test.describe('Meine Tickets', () => {
await expect(openFilter).toHaveClass(/tickets-filter--active/)
})
test('Rückfrage rendert Markdown und ist (offen) nicht bearbeitbar', async ({ page }) => {
await page.goto('/hilfe/tickets')
await selectView(page, tt.filters.dialog)
const card = page.locator('.ticket-card').filter({ hasText: 'Wurf B' })
await expect(card).toBeVisible()
// Markdown: **fett** → <strong>, „- "-Aufzählung → <li>.
await expect(card.locator('.ticket-card__question-text strong').first()).toBeVisible()
await expect(card.locator('.ticket-card__question-text li')).toHaveCount(2)
// Offene Rückfrage (NeedsInfo): kein „Bearbeiten"-Button, dafür ein Antwort-Feld.
await expect(card.getByRole('button', { name: tt.edit })).toHaveCount(0)
await expect(card.locator('.ticket-card__answer-form textarea')).toBeVisible()
})
test('Ticket löschen', async ({ page }) => {
await page.goto('/hilfe/tickets')
await selectView(page, tt.filters.closed)