# Plan: ContactBundle Tailwind-Migration + Passwort-Reset ## Übersicht Das ContactBundle (Kundenbereich) wird von Bootstrap 5 auf Tailwind CSS umgestellt, analog zur SettingsBundle-Referenz. Das Passwort-Feld wird aus dem Edit-Formular entfernt (bleibt im Create-Formular) und durch eine separate "Passwort neu setzen"-Seite ersetzt. ## Aktueller Stand - **Bereits Tailwind**: `list/index.html.twig`, `edit/delete.html.twig` - **Noch Bootstrap**: `edit/edit.html.twig`, `edit/create.html.twig`, `edit/anonymisieren.html.twig`, `addressdetail/*`, `addressimport/*`, `upload/deleteAll.html.twig` - **Base Template**: `backend_tailwind_base.html.twig` (Tailwind) statt `backend_base.html.twig` (Bootstrap) - **Form Theme**: `tailwind_formtheme.html.twig` --- ## Phase 1: Passwort-Feld entfernen + Reset-Seite erstellen ### 1.1 Passwort-Feld nur aus Edit-Template entfernen - **Edit-Template**: `Resources/views/backend/edit/edit.html.twig` (Zeilen ~91-107) - Passwort-Block mit data-pw-wrap entfernen - **Create-Template**: Passwort-Feld BLEIBT erhalten (Neuanlage mit Passwort möglich) - **ContactType.php**: `->add('password', ...)` bleibt (wird von Create noch benötigt) ### 1.2 Passwort-Logik im EditController - Bestehende Logik bleibt: `if ($form->get('password')->getData() !== null) { ... }` (Zeilen ~347-349) - Wird nur noch beim Create aufgerufen, da Edit das Feld nicht mehr hat ### 1.3 Neue "Passwort neu setzen"-Seite erstellen #### Controller-Action in EditController hinzufügen **Datei**: `Controller/Backend/EditController.php` - Neue Action `resetPasswordAction(Request $request, Contact $contact, DocumentManager $dm)` - Route: `/backend/contact/edit/reset-password/{uuid}` - Name: `psc_shop_contact_backend_reset_password` - **GET**: Zeigt Formular mit Passwort-Eingabefeld (mit Show/Hide Toggle) - **POST**: Hasht das eingegebene Passwort mit `password_hash(PASSWORD_DEFAULT)` und speichert es - Zeigt nach erfolgreichem Speichern eine Bestätigung #### Neues Template erstellen **Datei**: `Resources/views/backend/edit/reset_password.html.twig` - Extends `backend_tailwind_base.html.twig` - Formular mit Passwort-Eingabefeld (mit Show/Hide Toggle) - Speichern-Button - Bestätigungsmeldung nach erfolgreichem Speichern - Zurück-Button zum Kunden - Styling analog zu `delete.html.twig` (Karte mit Kopfzeile) ### 1.4 "Passwort neu setzen"-Button in Edit-Formular **Datei**: `Resources/views/backend/edit/edit.html.twig` (nach Tailwind-Migration) - Statt Passwort-Feld: Button "Passwort neu setzen" der zur Reset-Seite führt - Styling: `inline-flex items-center gap-1.5 px-3 py-2 rounded-sm text-sm font-medium text-gray-700 bg-white border border-gray-300 hover:bg-gray-50 shadow-sm` --- ## Phase 2: edit.html.twig Tailwind-Migration (1746 Zeilen) ### 2.1 Base-Template wechseln - `{% extends 'backend_base.html.twig' %}` → `{% extends 'backend_tailwind_base.html.twig' %}` - Form-Theme: `{% form_theme form ... %}` auf `tailwind_formtheme.html.twig` setzen ### 2.2 Seitenstruktur ``` {% block header %} Titel + Aktionsbuttons (Speichern, Löschen, Anonymisieren) {% endblock %} {% block body %}
Tab-Navigation (sidebar links) + Tab-Inhalte (rechts)
{% endblock %} ``` ### 2.3 Tab-System (aus SettingsBundle übernehmen) - Tab-Sidebar: `tab-group flex-none md:flex w-full` - Tab-Links: `tab-link flex items-center text-sm px-4 py-2 relative` - Tab-Inhalte: `tab-content w-full text-stone-500 text-sm hidden/block` ### 2.4 Tabs die migriert werden müssen 1. **Allgemein** - Username, Email, Enable, Level, Shops, PriceFactor 2. **Adressdaten** - Adresstabelle (existierende Tailwind-Tabelle nutzen) 3. **Individualisierung** - Custom fields 4. **Kalkulationsvariablen** - Preisanpassungen 5. **Variablenfelder** - basketfield1/2, Freefields 6. **Zugriffsrechte** - Rollen, Berechtigungen 7. **Erweitert** - Zusätzliche Einstellungen 8. **Plugin-Tabs** - Dynamisch aus Plugin-System ### 2.5 Bootstrap → Tailwind Klassen-Mapping | Bootstrap | Tailwind | |-----------|----------| | `panel panel-default > header/body` | `rounded-md border bg-white px-7.5 py-6 shadow-lg` | | `row > col-md-*` | `flex flex-wrap > w-full lg:w-6/12 px-4` | | `form-control` | `border-1 px-3 py-3 bg-white rounded text-sm shadow` | | `form-control-label` | `block uppercase text-xs font-bold mb-2` | | `btn btn-primary` | `bg-psc-500 hover:bg-psc-600 text-white rounded-sm px-4 py-1` | | `btn btn-danger` | `bg-red-600 hover:bg-red-700 text-white rounded-sm px-4 py-2` | | `btn btn-info` | `bg-blue-600 hover:bg-blue-700 text-white rounded-sm px-4 py-2` | | `nav nav-pills > nav-item > nav-link` | `tab-link flex items-center text-sm px-4 py-2 relative` | | `table table-striped` | `min-w-full text-sm` mit `hover:bg-gray-50` | | `badge bg-success/danger` | `text-green-600` / `text-red-600` | | `collapse` | Alpine.js `x-show` oder `hidden` Klasse | ### 2.6 JavaScript anpassen - AJAX Username-Check: Muss weiter funktionieren - Tab-Switching: Bereits in `backend_tailwind_base.html.twig` implementiert - jQuery durch Vanilla JS/Alpine.js ersetzen wo nötig --- ## Phase 3: create.html.twig Tailwind-Migration (1617 Zeilen) - Fast identisch zu edit.html.twig - Keine Adresstabelle, kein Change-Log - Keine Plugin-Tabs - Preis-Tab (priceFactor) vorhanden - Gleiche Bootstrap → Tailwind Konvertierung --- ## Phase 4: Weitere Templates migrieren ### 4.1 anonymisieren.html.twig (38 Zeilen) - Analog zu `delete.html.twig` (bereits Tailwind) - Bestätigungsdialog mit Ja/Nein Buttons ### 4.2 addressdetail/edit.html.twig (320 Zeilen) - Formularfelder: type, UUID, homepage, sort, email, KundenNr, company, salutation, name, street, zip, phone, fax, mobile, ustid, steuerid, lid, zusatz1/2 - Change-Log Tabelle - 2-Spalten Layout mit `flex flex-wrap` ### 4.3 addressdetail/create.html.twig (296 Zeilen) - Wie edit aber ohne Change-Log ### 4.4 addressdetail/delete.html.twig (40 Zeilen) - Analog zu bestehender delete.html.twig ### 4.5 addressimport/step1-3.html.twig (39+86+41 Zeilen) - Step 1: Datei-Upload - Step 2: Spalten-Mapping - Step 3: Bestätigung ### 4.6 upload/deleteAll.html.twig (74 Zeilen) - Tabelle mit Uploads + Bestätigung --- ## Betroffene Dateien (Zusammenfassung) ### Zu bearbeiten: 1. `src/PSC/Shop/ContactBundle/Controller/Backend/EditController.php` - Reset-Action hinzufügen 2. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/edit.html.twig` - Tailwind + Passwort-Button statt Passwort-Feld 3. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/create.html.twig` - Tailwind (Passwort-Feld bleibt) 4. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/anonymisieren.html.twig` - Tailwind 5. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/edit.html.twig` - Tailwind 6. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/create.html.twig` - Tailwind 7. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressdetail/delete.html.twig` - Tailwind 8. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step1.html.twig` - Tailwind 9. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step2.html.twig` - Tailwind 10. `src/PSC/Shop/ContactBundle/Resources/views/backend/addressimport/step3.html.twig` - Tailwind 11. `src/PSC/Shop/ContactBundle/Resources/views/backend/upload/deleteAll.html.twig` - Tailwind ### Neu erstellen: 12. `src/PSC/Shop/ContactBundle/Resources/views/backend/edit/reset_password.html.twig` - Neue Reset-Seite ### NICHT bearbeiten: - `src/PSC/Shop/ContactBundle/Form/Backend/General/ContactType.php` - bleibt unverändert (Passwort-Feld für Create benötigt) --- ## Verifikation 1. **Kundenliste**: `/backend/contact/list/index` laden - funktioniert bereits 2. **Kunde bearbeiten**: `/backend/contact/edit/edit/{uuid}` - Tailwind-Layout prüfen 3. **Kunde anlegen**: `/backend/contact/edit/create` - Tailwind-Layout prüfen 4. **Passwort-Reset**: "Passwort neu setzen" Button klicken → Reset-Seite → Neues Passwort anzeigen 5. **Adresse bearbeiten**: `/backend/contact/address/detail/edit/{uuid}` - Tailwind prüfen 6. **Adresse anlegen**: `/backend/contact/address/detail/create/{uuid}` - Tailwind prüfen 7. **Löschen/Anonymisieren**: Bestätigungsdialoge prüfen 8. **Tabs**: Alle Tabs durchklicken, Inhalte sichtbar/versteckt korrekt 9. **Formulare speichern**: Alle Formulare testweise absenden