# Modal-Konsolidierung ## Beschreibung und Kontext Aktuell gibt es 3 verschiedene Modal-Implementierungen im System. Das ist nicht wartbar und fuehrt zu inkonsistentem Verhalten (Backdrop, ESC-Handling, Focus-Trap, Accessibility). ## Ist-Zustand ### 3 Modal-Patterns | Pattern | Komponente | Nutzung | |---------|-----------|---------| | `useConfirm()` Hook | `ConfirmDialog` | 6 Seiten (Bestaetigungs-Dialoge) | | `usePrompt()` Hook | `PromptDialog` | 4 Seiten (Text-Eingabe-Dialoge) | | `` Komponente | `UiComponents/Modal` | 1 Seite (EnterpriseDialog) | | `div.modalOverlay` + CSS | Per Seite dupliziert | ~25 Seiten | ### modalOverlay mit FormGeneratorForm (~15 Seiten) Overlay-Container ist per CSS-Modul dupliziert (`Admin.module.css`, `TrusteeViews.module.css`, etc.), Inhalt ist `FormGeneratorForm` — halbwegs standardisiert. Betroffene Seiten: - Admin: AdminUsersPage, AdminUserMandatesPage, AdminMandatesPage, AdminMandateRolesPage, AdminInvitationsPage, AdminFeatureRolesPage, AdminFeatureInstanceUsersPage, AdminFeatureAccessPage - Trustee: TrusteeDataTab, TrusteeDocumentsView, TrusteePositionsView, TrusteePositionDocumentsView - Basedata: ConnectionsPage, FilesPage, PromptsPage - Feature: CommcoachSettingsView, RealEstateParcelsView, RealEstateProjectsView ### modalOverlay mit Custom-Inhalt (~10 Seiten) Diese Seiten haben Modale ohne FormGeneratorForm: | Seite | Inhalt | |-------|--------| | RunsTab | Run-Tracing Detail-Ansicht | | NeutralizationView | SharePoint Ordner-Browser | | InstanceDetailModal | Multi-Tab-Modal (UiComponents/Tabs) mit verschachtelten Sub-Modalen | | AdminMandateRolePermissionsPage | Duplikate-Cleanup mit Custom-Tabellen | | AdminFeatureAccessPage | Feature-Button-Grid zur Auswahl | | AdminInvitationsPage | URL-Anzeige mit Copy-Button | | AdminFeatureRolesPage | AccessRulesEditor (Berechtigungen) | | FeatureInstanceWizard | 3-Schritt-Wizard im Modal | | ComplianceAuditPage | Content-View (Input/Output) | | TeamsbotModulesView | Inline confirmDialog (nicht Hook) | | CommcoachModulesView | Inline confirmDialog (nicht Hook) | | Settings | ProfileEditModal (mit FormGeneratorForm) | ## Ziel - **Ein** Modal-Container fuer alle Anwendungsfaelle - Backdrop, ESC, Focus-Trap, ARIA (`role="dialog"`, `aria-modal`) konsistent - FormGeneratorForm-Modale: Zero-Boilerplate (kein manueller Overlay-Code auf der Seite) - Custom-Modale: Gleicher Container, freier Inhalt - `useConfirm` und `usePrompt` als spezialisierte Wrapper bleiben (sind bereits OK) ## Entscheidungen | Datum | Entscheidung | Begruendung | |-------|-------------|------------| | 2026-06-10 | Separater Plan, nicht Teil des Layout-Refactoring | Modale sind Overlays, keine Seitenregionen. Unabhaengig loesbar. | ## Vorgeschlagene Architektur ### Bestehende `` Komponente erweitern `UiComponents/Modal/Modal.tsx` existiert bereits, wird aber nur von `EnterpriseDialog.tsx` genutzt. Diese Komponente wird zum Standard. ### Stufen | Stufe | Aktion | |-------|--------| | 1 | `` Komponente pruefen: hat sie Backdrop, ESC, Focus-Trap, ARIA, Groessen-Varianten? Fehlende Features ergaenzen. | | 2 | `useFormModal()` Hook erstellen: Oeffnet `` mit `` — ersetzt 15 Seiten mit modalOverlay+FormGeneratorForm | | 3 | Custom-Modale auf `` migrieren (10 Seiten) | | 4 | `modalOverlay`-CSS aus allen CSS-Modulen entfernen | | 5 | `TeamsbotModulesView` und `CommcoachModulesView` auf `useConfirm()` Hook umstellen | ## Betroffene Module - `components/UiComponents/Modal/Modal.tsx` + `.module.css` — erweitern - Neuer Hook: `hooks/useFormModal.ts` - ~25 Seiten: modalOverlay entfernen, durch `` oder `useFormModal()` ersetzen - CSS-Module: `Admin.module.css`, `TrusteeViews.module.css`, etc. — modalOverlay-Klassen entfernen ## Akzeptanzkriterien | # | Kriterium | Prio | |---|-----------|------| | 1 | Alle Modale nutzen `` als Container | must | | 2 | ESC schliesst jeden Dialog | must | | 3 | Backdrop-Click schliesst (ausser bei unsaved changes) | must | | 4 | Focus-Trap aktiv bei offenem Modal | must | | 5 | `aria-modal="true"` + `role="dialog"` auf jedem Modal | must | | 6 | grep `modalOverlay` = 0 Treffer nach Abschluss | must | | 7 | `npx tsc --noEmit` = 0 Fehler | must | ## Abschluss - [ ] Modal-Komponente erweitert und dokumentiert - [ ] useFormModal Hook erstellt - [ ] Alle Seiten migriert - [ ] CSS-Cleanup (modalOverlay entfernt) - [ ] layout.md oder eigene modal.md Referenz aktualisiert - [ ] CHANGELOG-Eintraege - [ ] Dieses Dokument -> 4-done/ verschoben