feat(#359): W4a Phase 2 — zentraler Import/Export-Dialog (Frontend)

- ImportExportDialog.tsx (neu): Modal lg/xl nach bestehendem ui/Modal-Muster
- Export-Tab: Formatauswahl (csv/xlsx/json), Download, Fehler-Handling
- Import-Tab: 4 Schritte (Datei -> Mapping -> Dry-Run -> Ausführung+Report),
  Mapping-Vorschau mit Modul-Heuristik, Background-Job-Polling ab 1000 Zeilen
- i18n: 24 importexport.*-Keys in de.json + en.json (keine hardcoded Strings)
- Integration: ContactsList Toolbar-Button (contacts:read-Gate, Upload-Icon,
  entityType=contacts vorgewählt) über bestehendes pluginToolbarStore-Muster

Gates: Vitest 12/12 (routePermissions + importExportDialog), tsc exit 0,
Production-Build exit 0 (vor Commit). 6 Failures in contacts/shell Suiten
als Vorbestand bewiesen (Stash-Test: identisch auf clean HEAD f27f047).

fixes #359 (Phase 2)
This commit is contained in:
Agent Zero
2026-08-27 21:34:13 +02:00
parent cd8ef7500c
commit 38df597f11
5 changed files with 558 additions and 1 deletions
+26
View File
@@ -1440,5 +1440,31 @@
"targetRoom": "Ziel-Raum",
"targetRoomDescription": "Name des Raums in der Kommunikation, an den Status-Meldungen gesendet werden.",
"defaultRoomName": "Live KI"
},
"importexport": {
"dialogTitle": "Import / Export",
"export": "Export",
"import": "Import",
"download": "Herunterladen",
"exportHint": "Daten des Moduls {{entity}} exportieren — Format wählen:",
"chooseFile": "Datei wählen (CSV, JSON oder XLSX)",
"step1": "Datei",
"step2": "Zuordnung",
"step3": "Prüfung",
"step4": "Ergebnis",
"mappingHint": "{{total}} Zeilen erkannt — Dateispalten den Zielfeldern zuordnen:",
"fileColumn": "Dateispalte",
"targetField": "Zielfeld",
"skip": "überspringen",
"validate": "Prüfen",
"valid": "gültig",
"invalid": "ungültig",
"row": "Zeile",
"executeImport": "Import ausführen",
"total": "gesamt",
"imported": "importiert",
"failed": "fehlgeschlagen",
"importDone": "Import abgeschlossen",
"backgroundRunning": "Import läuft im Hintergrund …"
}
}
+26
View File
@@ -1440,5 +1440,31 @@
"targetRoom": "Target room",
"targetRoomDescription": "Name of the room in Communication that status messages are sent to.",
"defaultRoomName": "Live AI"
},
"importexport": {
"dialogTitle": "Import / Export",
"export": "Export",
"import": "Import",
"download": "Download",
"exportHint": "Export data of module {{entity}} — choose format:",
"chooseFile": "Choose file (CSV, JSON or XLSX)",
"step1": "File",
"step2": "Mapping",
"step3": "Check",
"step4": "Result",
"mappingHint": "{{total}} rows detected — map file columns to target fields:",
"fileColumn": "File column",
"targetField": "Target field",
"skip": "skip",
"validate": "Check",
"valid": "valid",
"invalid": "invalid",
"row": "Row",
"executeImport": "Run import",
"total": "total",
"imported": "imported",
"failed": "failed",
"importDone": "Import finished",
"backgroundRunning": "Import running in background …"
}
}