printshopcreator/.mimocode/plans/1783597417429-calm-comet.md
Thomas Peterson 77968d24fc
Some checks failed
Gitea Actions / Run-Tests-On-Amd64 (push) Failing after 17m53s
Gitea Actions / Merge (push) Failing after 1s
Gitea Actions / Run-Tests-On-Arm64 (push) Has been cancelled
auftragsdetails
2026-07-14 17:04:29 +02:00

8.2 KiB

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 %}
  <div class="w-full">
    Tab-Navigation (sidebar links) + Tab-Inhalte (rechts)
  </div>
{% 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:

  1. 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