feat: add reusable app-file-upload component with drag-and-drop and preview

Replace bare <input type="file"> across all upload locations with a
card-based dropzone component via shared partial. Three visual states:
current server file (thumbnail + Replace/Delete), empty dropzone, and
pending file preview (local FileReader thumbnail + metadata). Delete
actions use data-confirm-message for confirmation dialog.

Centralized as templates/partials/app-file-upload.phtml to prevent
markup drift — documented as deliberate exception to plain-HTML inputs
convention in CLAUDE.md and developer checklist.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 11:58:14 +02:00
parent ea786f5341
commit 9a4d59eb4c
14 changed files with 695 additions and 100 deletions

View File

@@ -1430,5 +1430,10 @@
"Username or password not valid": "Benutzername oder Passwort ungültig",
"Write-only. Leave empty to keep current value.": "Nur Schreibzugriff. Leer lassen, um den aktuellen Wert beizubehalten.",
"Your account is deactivated.": "Ihr Konto ist deaktiviert.",
"LDAP": "LDAP"
"LDAP": "LDAP",
"Drop file here or click to select": "Datei hierher ziehen oder klicken",
"Remove selected file": "Ausgewaehlte Datei entfernen",
"Replace": "Ersetzen",
"Delete this image?": "Dieses Bild löschen?",
"Current image": "Aktuelles Bild"
}

View File

@@ -1430,5 +1430,10 @@
"Username or password not valid": "Username or password not valid",
"Write-only. Leave empty to keep current value.": "Write-only. Leave empty to keep current value.",
"Your account is deactivated.": "Your account is deactivated.",
"LDAP": "LDAP"
"LDAP": "LDAP",
"Drop file here or click to select": "Drop file here or click to select",
"Remove selected file": "Remove selected file",
"Replace": "Replace",
"Delete this image?": "Delete this image?",
"Current image": "Current image"
}