T07b: frontend feature pages — companies + contacts + settings + audit + dashboard + search

- 11 new feature pages (CompaniesList/Detail/Form, ContactsList/Detail/Form,
  SettingsProfile/Roles/Users, AuditLog, GlobalSearchResults)
- 3 page updates (Dashboard with StatCard+ActivityFeed, Settings with tree nav+Outlet,
  TopBar with SearchDropdown)
- 13 new routes in routes/index.tsx
- i18n updates (de.json + en.json) with companies/contacts/settings/audit/search keys
- 12 new test files + 2 existing test fixes (TopBar, AppShell)
- 7 shared components (DataGrid, Tabs, SearchDropdown, CsvImportDialog, StatCard,
  ActivityFeed, UnsavedChangesGuard)
- 16 new API hooks in hooks.ts
- Verification: 141 tests pass, build succeeds, tsc --noEmit clean
This commit is contained in:
leocrm-bot
2026-06-29 11:01:39 +02:00
parent 22976abe92
commit 700b7a71ad
47 changed files with 4089 additions and 157 deletions
+140 -3
View File
@@ -59,7 +59,87 @@
"warning": "Warnung",
"info": "Information",
"required": "Pflichtfeld",
"optional": "Optional"
"optional": "Optional",
"back": "Zurück",
"filter": "Filtern",
"reset": "Zurücksetzen",
"export": "Exportieren",
"import": "Importieren",
"name": "Name",
"email": "E-Mail",
"phone": "Telefon",
"status": "Status",
"role": "Rolle",
"active": "Aktiv",
"inactive": "Inaktiv"
},
"dashboard": {
"welcome": "Willkommen zurück",
"recentActivity": "Letzte Aktivitäten",
"statCompanies": "Firmen",
"statContacts": "Kontakte",
"statTasks": "Offene Aufgaben",
"statEmails": "E-Mails heute"
},
"companies": {
"title": "Firmen",
"create": "Firma erstellen",
"edit": "Firma bearbeiten",
"name": "Firmenname",
"accountNumber": "Kontonummer",
"industry": "Branche",
"phone": "Telefon",
"email": "E-Mail",
"website": "Website",
"description": "Beschreibung",
"contacts": "Kontakte",
"files": "Dateien",
"activity": "Aktivität",
"overview": "Übersicht",
"export": "CSV exportieren",
"import": "CSV importieren",
"deleteConfirm": "Möchten Sie diese Firma wirklich löschen?",
"deleteConfirmTitle": "Firma löschen",
"emptyTitle": "Keine Firmen vorhanden",
"emptyDescription": "Erstellen Sie Ihre erste Firma, um loszulegen.",
"created": "Firma erfolgreich erstellt.",
"updated": "Firma erfolgreich aktualisiert.",
"deleted": "Firma erfolgreich gelöscht.",
"createFailed": "Firma konnte nicht erstellt werden.",
"updateFailed": "Firma konnte nicht aktualisiert werden.",
"notFound": "Firma nicht gefunden.",
"noContacts": "Diese Firma hat noch keine Kontakte.",
"noFiles": "Keine Dateien vorhanden.",
"noActivity": "Keine Aktivität vorhanden."
},
"contacts": {
"title": "Kontakte",
"create": "Kontakt erstellen",
"edit": "Kontakt bearbeiten",
"firstName": "Vorname",
"lastName": "Nachname",
"email": "E-Mail",
"phone": "Telefon",
"position": "Position",
"companies": "Firmen",
"files": "Dateien",
"activity": "Aktivität",
"overview": "Übersicht",
"deleteConfirm": "Möchten Sie diesen Kontakt wirklich löschen?",
"deleteConfirmTitle": "Kontakt löschen",
"emptyTitle": "Keine Kontakte vorhanden",
"emptyDescription": "Erstellen Sie Ihren ersten Kontakt, um loszulegen.",
"created": "Kontakt erfolgreich erstellt.",
"updated": "Kontakt erfolgreich aktualisiert.",
"deleted": "Kontakt erfolgreich gelöscht.",
"createFailed": "Kontakt konnte nicht erstellt werden.",
"updateFailed": "Kontakt konnte nicht aktualisiert werden.",
"notFound": "Kontakt nicht gefunden.",
"assignCompanies": "Firmen zuweisen",
"noCompanies": "Dieser Kontakt ist keiner Firma zugeordnet.",
"noFiles": "Keine Dateien vorhanden.",
"noActivity": "Keine Aktivität vorhanden.",
"fullName": "Name"
},
"settings": {
"title": "Einstellungen",
@@ -70,7 +150,63 @@
"system": "System",
"profile": "Profil",
"notifications": "Benachrichtigungen",
"security": "Sicherheit"
"security": "Sicherheit",
"roles": "Rollen",
"users": "Benutzer",
"system": "System",
"name": "Name",
"firstName": "Vorname",
"lastName": "Nachname",
"email": "E-Mail",
"avatar": "Profilbild",
"currentPassword": "Aktuelles Passwort",
"newPassword": "Neues Passwort",
"confirmPassword": "Passwort bestätigen",
"changePassword": "Passwort ändern",
"profileSaved": "Profil erfolgreich gespeichert.",
"passwordChanged": "Passwort erfolgreich geändert.",
"roleName": "Rollenname",
"permissions": "Berechtigungen",
"createRole": "Rolle erstellen",
"roleCreated": "Rolle erfolgreich erstellt.",
"roleUpdated": "Rolle erfolgreich aktualisiert.",
"noRoles": "Keine Rollen vorhanden.",
"inviteUser": "Benutzer einladen",
"deactivate": "Deaktivieren",
"activate": "Aktivieren",
"userInvited": "Benutzer erfolgreich eingeladen.",
"userDeactivated": "Benutzer deaktiviert.",
"userActivated": "Benutzer aktiviert.",
"noUsers": "Keine Benutzer vorhanden.",
"assignRole": "Rolle zuweisen",
"inviteEmail": "E-Mail-Adresse",
"inviteRole": "Rolle"
},
"auditLog": {
"title": "Audit-Log",
"user": "Benutzer",
"action": "Aktion",
"entity": "Entität",
"dateFrom": "Datum von",
"dateTo": "Datum bis",
"details": "Details",
"timestamp": "Zeitpunkt",
"empty": "Keine Audit-Log-Einträge vorhanden.",
"notAvailable": "Audit-Log ist aktuell nicht verfügbar.",
"entityId": "Entität-ID"
},
"search": {
"title": "Suchergebnisse",
"filters": "Filter",
"entityType": "Entitätstyp",
"allTypes": "Alle Typen",
"companies": "Firmen",
"contacts": "Kontakte",
"noResults": "Keine Ergebnisse für \"{{query}}\" gefunden.",
"resultsFor": "Ergebnisse für \"{{query}}\"",
"dateFrom": "Datum von",
"dateTo": "Datum bis",
"enterQuery": "Geben Sie einen Suchbegriff ein."
},
"topbar": {
"tenant": "Mandant",
@@ -120,6 +256,7 @@
"required": "Dieses Feld ist erforderlich.",
"email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
"minLength": "Mindestens {{count}} Zeichen erforderlich.",
"maxLength": "Maximal {{count}} Zeichen erlaubt."
"maxLength": "Maximal {{count}} Zeichen erlaubt.",
"passwordMismatch": "Passwörter stimmen nicht überein."
}
}