136 lines
4.5 KiB
Markdown
136 lines
4.5 KiB
Markdown
# Phase 4I — Admin „Pressemitteilungen" Mockup-Patterns
|
||
|
||
> Folgepäckchen zu 4H. Überträgt die in der Customer-PM-Liste
|
||
> entwickelten Mockup-Patterns auf die Admin-Seite. Die
|
||
> CSS-Komponenten existieren bereits.
|
||
|
||
**Status**: ✅ abgeschlossen · **Aufwand**: ~½ Tag · **Risiko**: niedrig
|
||
|
||
---
|
||
|
||
## Anlass
|
||
|
||
Nach 4H matched `customer/press-releases/index.blade.php` das
|
||
Mockup zu ~90 %. Die gleichen Patterns gehören in die
|
||
Admin-Liste — das ist der zentrale Editorial-Workflow.
|
||
|
||
## Aktueller Stand
|
||
|
||
`admin/press-releases/index.blade.php` ist bei ~60 % Match:
|
||
|
||
- ✅ Page-Header (Hub-Stil)
|
||
- ✅ 4-KPI-Reihe (`<x-portal.stat-card>`)
|
||
- ✅ Filter-Panel (search/status/portal/language/category +
|
||
3 entity-comboboxes)
|
||
- ✅ Tabellen-Panel + Empty-State (Hub-styled)
|
||
- ✅ Modals (publish/reject/archive) — test-kritisch
|
||
- ❌ Saved-Views-Tabs
|
||
- ❌ Active-Chips für aktive Filter
|
||
- ❌ Portal-Pills (statt Text)
|
||
- ❌ Row-Tinting (review/rejected)
|
||
- ❌ Inline-Actions („Veröffentlichen →", „Ablehnen →" neben Status)
|
||
- ❌ Reichere Sub-Zeilen (PM-{id} + Datum + Status-Kontext)
|
||
|
||
## Scope
|
||
|
||
### 1. Saved-Views-Tabs
|
||
|
||
Tab-Leiste zwischen KPI-Reihe und Filter:
|
||
|
||
`Alle · Veröffentlicht · In Prüfung · Entwürfe · Abgelehnt · Archiv`
|
||
|
||
Counter-Pille pro Tab basierend auf erweiterten `stats`.
|
||
|
||
### 2. Active-Chips
|
||
|
||
Sichtbarkeit aller aktiven Filter (Status, Portal, Sprache,
|
||
Kategorie, User, Firma, Kontakt, Suche), jeweils mit `×`.
|
||
|
||
### 3. Portal-Pills
|
||
|
||
Statt „Presseecho"/„Businessportal24"/„Beide" als Text:
|
||
Portal-Pills mit farbigem Dot. Bei `Portal::Both` zwei
|
||
Pills nebeneinander.
|
||
|
||
### 4. Row-Tinting
|
||
|
||
`is-row-warn` für review, `is-row-err` für rejected.
|
||
|
||
### 5. Inline-Actions
|
||
|
||
**Zusätzlich** zu den bestehenden Action-Buttons + Modals:
|
||
|
||
| Status | Inline-Action |
|
||
|---|---|
|
||
| Review | `Freigeben →` + `Ablehnen →` (öffnet die Modals) |
|
||
| Published | `Archivieren →` (öffnet Modal) |
|
||
|
||
Die Inline-Actions sind **nur** Trigger für die bestehenden
|
||
Modals (keine direkte Wire-Methode), damit die existierenden
|
||
Test-Modal-Strings („Pressemitteilung veröffentlichen?")
|
||
weiter angezeigt werden. Action-Buttons in der `Aktionen`-
|
||
Spalte bleiben als Backup für Power-User.
|
||
|
||
### 6. Reichere Sub-Zeilen
|
||
|
||
In Titel-Zelle: `PM-{id}` als Sub. In Datum-Zelle: Hauptdatum
|
||
+ Status-Kontext (`erstellt · 11:02`, `veröffentlicht · 14:30`, …).
|
||
|
||
### 7. Counter-Strip ausgelassen
|
||
|
||
KPI-Reihe ist bereits 4-spaltig (Gesamt, Veröffentlicht, In
|
||
Prüfung, Entwürfe) und voll funktional. Counter-Strip wäre
|
||
redundant. Bleibt bei KPI-Cards.
|
||
|
||
## Was bleibt unangetastet
|
||
|
||
- **Volt-Methoden** (`publish`, `reject`, `archive`, `sort`,
|
||
`with`, `clearUserFilter`, …)
|
||
- **Bestehende Modals** mit Strings „Pressemitteilung
|
||
veröffentlichen?", „Pressemitteilung ablehnen?",
|
||
„Pressemitteilung archivieren?" (Test-kritisch)
|
||
- **Filter-Panel-Struktur** (Entity-Comboboxes erhalten,
|
||
kein Reduktionsexperiment)
|
||
- **`stats`-Cache-Methode** (`AdminPerformanceCache`)
|
||
|
||
## Erweiterung
|
||
|
||
- `pressReleaseStats()` erweitert um `rejected` und `archived`
|
||
Counter, damit alle 6 Saved-Views-Tabs ihre Counter haben
|
||
|
||
## Tests
|
||
|
||
- `AdminPressReleaseActionsTest` (3 Tests, prüft auf Modal-Strings)
|
||
- `PressReleaseWorkflowTest` (mehrere Tests, prüft auf
|
||
`publish`/`reject`-Methoden + Audit-Logs)
|
||
- Volle Suite muss weiter sauber laufen (modulo
|
||
pre-existing `ApiDocumentationTest`)
|
||
|
||
## Akzeptanzkriterien
|
||
|
||
- [x] Plan
|
||
- [x] Volt: `stats` um `rejected` + `archived` erweitert
|
||
- [x] Volt: `setView()` + `resetFilters()` ergänzt
|
||
- [x] Saved-Views-Tabs eingebaut (6 Stück inkl. Counter)
|
||
- [x] Active-Chips eingebaut (8 Filter-Typen)
|
||
- [x] Portal-Pills statt Text (incl. Both → 2 Pills)
|
||
- [x] Row-Tinting (review → warn, rejected → err)
|
||
- [x] Inline-Actions als Modal-Trigger
|
||
(Freigeben/Ablehnen/Archivieren) zusätzlich neben Badge
|
||
- [x] Sub-Zeilen: PM-ID + Firma + Sprache, Datum + Status-Kontext
|
||
- [x] Empty-State 2-stufig (mit/ohne Filter)
|
||
- [x] Build + Pint + Tests grün (16/16 PR + 230/231 voll)
|
||
- [x] PROGRESS.md + 03-WEITERE-PHASEN.md aktualisiert
|
||
|
||
## Lessons Learned
|
||
|
||
- `@php(...)` Inline-Form führte beim Compile zu einem
|
||
Syntax-Fehler im kompilierten View (führte zu
|
||
`<?php($var = ...)` ohne Whitespace), obwohl alle Klammern
|
||
balanced waren. Vermutung: Konflikt der Klammer-Zählung
|
||
mit Methoden-Calls. Lösung: alle drei `@php(...)`
|
||
Statements zu `@php ... @endphp` umgewandelt.
|
||
- Tabellen-Spalten reduziert (8 → 7), weil die rechte
|
||
„Aktionen"-Spalte mit den Status-Icons inhaltlich
|
||
redundant zur neuen Inline-Action in der Status-Spalte
|
||
war. Die linke „Aktionen"-Spalte (view/edit) blieb.
|