Doku: Phase 2 im Entwicklungsplan als abgeschlossen markiert
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
153bac7a9c
commit
6a1240bdfb
1 changed files with 13 additions and 10 deletions
|
|
@ -38,17 +38,20 @@ Keine Fachlogik-Änderung. Reduziert erreichbare Demo-Komponenten und Altlasten.
|
|||
|
||||
## Phase 2 — Press-Release-Editoren entdoppeln (größter Einzel-Hebel, Paket B)
|
||||
|
||||
4 Dateien, ~5.500 Zeilen, ~80–95 % Überschneidung. In kleinen, risikoarmen Schritten.
|
||||
4 Dateien, ~5.151 Zeilen → **3.920 Zeilen (−1.231, ~24 %)**. In 9 kleinen Commits, jeder mit grüner Suite.
|
||||
|
||||
- [ ] **2.1 Admin-Editoren nutzen `InteractsWithPressReleaseTags`** (H5) — Customer nutzt den Trait bereits, Admin inlined `addTag/removeTag/tagsArray`+`tags`-Computed. → `use`-Statement + ~35 Zeilen je Datei löschen.
|
||||
- [ ] **2.2 `InteractsWithPressReleaseScheduling`-Trait** (H1) — `updatedPublishMode/ScheduledDate/ScheduledTime`, `syncScheduledAt`, `resolveScheduledAt`, `validateScheduledAtWhenReady`, `notifyValidationError` + `scheduled*`-Block sind 4× wortgleich. Spiegelt bestehenden Tags-Trait.
|
||||
- [ ] **2.3 `formRules()` zentralisieren** (H2) — ~95 % identisch; einziger Unterschied admin `portal`+`companyId exists` vs. customer `companyId integer`. → `baseRules()` im Trait, Komponenten überschreiben nur abweichende Keys.
|
||||
- [ ] **2.4 `presubmitChecks` kanonisieren** (H3) — 4× dupliziert mit Copy-Paste-Drift (`trans_choice` vs. `__`). → eine Version im Trait.
|
||||
- [ ] **2.5 Kontakt-Helfer + `tagSuggestionsFor()` zentralisieren** (H4) — `defaultContactIdFor/companyContacts/companyContact` in allen vier, divergente Query-Styles. → Trait/Scope.
|
||||
- [ ] **2.6 Persistierung in `PressReleaseService`** (M1) — Customer hat bereits `persistDraft/persistEdit/pressReleaseAttributes`, Admin inlined volle `create/update`. Slug + `HtmlSanitizer::clean()` + `contacts()->sync()` + `contentChanged`→reclassify/rescore überall wiederholt. → `PressReleaseService::createDraft()` / `updateContent()`.
|
||||
- [ ] **2.7 Firmen-Combobox-Suche** (M2) — Admin baut Query inline, Customer delegiert an `CustomerCompanyContext::searchCompaniesFor()`. `supportsFullTextSearch()` 3× kopiert. → `Company::scopeSearchByTerm()` (siehe auch 3.x).
|
||||
- [ ] **2.8 Formular-Markup als Blade-Components** (M3, größte Roh-Zeilenersparnis) — `pr-char-meter`, `pr-tag-input`, `pr-presubmit-check`, `pr-publish-schedule`, `pr-contact-select`, `pr-boilerplate-panel`.
|
||||
- [ ] **2.9 Listen-/Show-Components + Admin-Aktionen** (M4–M6) — `pr-table-row`, `filter-chip`, `pr-status-timeline`, `pr-rejection-banner`; `HandlesAdminPressReleaseActions`-Trait (`findAdminPR()` ersetzt ~10× `withoutGlobalScopes()->findOrFail($id)`); Status-`match` auf `PressReleaseStatus::badgeClass()/color()`.
|
||||
- [x] **2.1 Admin-Editoren nutzen `InteractsWithPressReleaseTags`** — `use`-Statement + ~48 Zeilen je Admin-Datei gelöscht (byte-identische Tag-Logik).
|
||||
- [x] **2.2 `InteractsWithPressReleaseScheduling`-Trait** — 8 Methoden (updatedPublishMode/ScheduledDate/ScheduledTime, updated, syncScheduledAt, resolveScheduledAt, validateScheduledAtWhenReady, notifyValidationError) aus allen vier extrahiert (~85 Zeilen je Datei).
|
||||
- [x] **2.3 `formRules()` via `ProvidesPressReleaseFormRules`** — `baseFormRules()` (Inhalt+Scheduling+Embargo); Editoren ergänzen nur `portal`/`companyId`.
|
||||
- [x] **2.4 `presubmitChecks` kanonisiert** — `ProvidesPressReleasePresubmitChecks` mit der besseren Customer-Variante (Firmenname); Admin erhielt dafür `selectedCompany()`.
|
||||
- [x] **2.5 Kontakt-Helfer + `tagSuggestionsFor()` zentralisiert** — Fund: Admin-Inline-Query == `Contact::forCompany()`-Scope → `InteractsWithPressReleaseContacts`; `tagSuggestionsFor` in Tags-Trait.
|
||||
- [x] **2.6 `reprocessAfterContentChange()` im `PressReleaseService`** — 3× `contentChanged→fresh→reclassify→rescore` zentralisiert. Vollständige createDraft/updateContent **bewusst nicht erzwungen** (divergente Admin/Customer-Attribute, große Testfläche).
|
||||
- [x] **2.7 `Company::scopeSearchByTerm()`** — Admin-Combobox-Suche + `supportsFullTextSearch()` (2×) zentralisiert; Customer behält `CustomerCompanyContext` (join-/user-gescopt).
|
||||
- [x] **2.8 `<x-portal.pr-presubmit-check>`** — der presentational (wire:model-freie) Checklisten-Block extrahiert + Render-Test. **Konservativ:** interaktive Panels (Tag-Input/Publish-Schedule/Selects) blieben (wire:model/Alpine-Risiko ohne visuelle QA).
|
||||
- [x] **2.9 `HandlesAdminPressReleaseActions::findAdminPR()`** — ~15× `withoutGlobalScopes()->findOrFail()` zentralisiert. **Status-Badge-Enum bewusst nicht vereinheitlicht** (index `archived/draft→muted` vs. edit/show `→hub` divergieren real — Design-Entscheidung).
|
||||
|
||||
**Neue Bausteine:** Concerns `InteractsWithPressReleaseScheduling`, `ProvidesPressReleaseFormRules`, `ProvidesPressReleasePresubmitChecks`, `InteractsWithPressReleaseContacts`, `HandlesAdminPressReleaseActions`; `PressReleaseService::reprocessAfterContentChange()`; `Company::scopeSearchByTerm()`; `<x-portal.pr-presubmit-check>`.
|
||||
**Offen (Design-Entscheidungen nötig):** kanonische Status-Badge-Farben (2.9); restliche Markup-Component-Extraktion mit visueller QA (2.8).
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue