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": "Warning",
"info": "Information",
"required": "Required",
"optional": "Optional"
"optional": "Optional",
"back": "Back",
"filter": "Filter",
"reset": "Reset",
"export": "Export",
"import": "Import",
"name": "Name",
"email": "Email",
"phone": "Phone",
"status": "Status",
"role": "Role",
"active": "Active",
"inactive": "Inactive"
},
"dashboard": {
"welcome": "Welcome back",
"recentActivity": "Recent Activity",
"statCompanies": "Companies",
"statContacts": "Contacts",
"statTasks": "Open Tasks",
"statEmails": "Emails Today"
},
"companies": {
"title": "Companies",
"create": "Create Company",
"edit": "Edit Company",
"name": "Company Name",
"accountNumber": "Account Number",
"industry": "Industry",
"phone": "Phone",
"email": "Email",
"website": "Website",
"description": "Description",
"contacts": "Contacts",
"files": "Files",
"activity": "Activity",
"overview": "Overview",
"export": "Export CSV",
"import": "Import CSV",
"deleteConfirm": "Are you sure you want to delete this company?",
"deleteConfirmTitle": "Delete Company",
"emptyTitle": "No companies yet",
"emptyDescription": "Create your first company to get started.",
"created": "Company created successfully.",
"updated": "Company updated successfully.",
"deleted": "Company deleted successfully.",
"createFailed": "Failed to create company.",
"updateFailed": "Failed to update company.",
"notFound": "Company not found.",
"noContacts": "This company has no contacts yet.",
"noFiles": "No files available.",
"noActivity": "No activity available."
},
"contacts": {
"title": "Contacts",
"create": "Create Contact",
"edit": "Edit Contact",
"firstName": "First Name",
"lastName": "Last Name",
"email": "Email",
"phone": "Phone",
"position": "Position",
"companies": "Companies",
"files": "Files",
"activity": "Activity",
"overview": "Overview",
"deleteConfirm": "Are you sure you want to delete this contact?",
"deleteConfirmTitle": "Delete Contact",
"emptyTitle": "No contacts yet",
"emptyDescription": "Create your first contact to get started.",
"created": "Contact created successfully.",
"updated": "Contact updated successfully.",
"deleted": "Contact deleted successfully.",
"createFailed": "Failed to create contact.",
"updateFailed": "Failed to update contact.",
"notFound": "Contact not found.",
"assignCompanies": "Assign Companies",
"noCompanies": "This contact is not assigned to any company.",
"noFiles": "No files available.",
"noActivity": "No activity available.",
"fullName": "Name"
},
"settings": {
"title": "Settings",
@@ -70,7 +150,63 @@
"system": "System",
"profile": "Profile",
"notifications": "Notifications",
"security": "Security"
"security": "Security",
"roles": "Roles",
"users": "Users",
"system": "System",
"name": "Name",
"firstName": "First Name",
"lastName": "Last Name",
"email": "Email",
"avatar": "Avatar",
"currentPassword": "Current Password",
"newPassword": "New Password",
"confirmPassword": "Confirm Password",
"changePassword": "Change Password",
"profileSaved": "Profile saved successfully.",
"passwordChanged": "Password changed successfully.",
"roleName": "Role Name",
"permissions": "Permissions",
"createRole": "Create Role",
"roleCreated": "Role created successfully.",
"roleUpdated": "Role updated successfully.",
"noRoles": "No roles available.",
"inviteUser": "Invite User",
"deactivate": "Deactivate",
"activate": "Activate",
"userInvited": "User invited successfully.",
"userDeactivated": "User deactivated.",
"userActivated": "User activated.",
"noUsers": "No users available.",
"assignRole": "Assign Role",
"inviteEmail": "Email Address",
"inviteRole": "Role"
},
"auditLog": {
"title": "Audit Log",
"user": "User",
"action": "Action",
"entity": "Entity",
"dateFrom": "Date From",
"dateTo": "Date To",
"details": "Details",
"timestamp": "Timestamp",
"empty": "No audit log entries available.",
"notAvailable": "Audit log is currently not available.",
"entityId": "Entity ID"
},
"search": {
"title": "Search Results",
"filters": "Filters",
"entityType": "Entity Type",
"allTypes": "All Types",
"companies": "Companies",
"contacts": "Contacts",
"noResults": "No results found for \"{{query}}\".",
"resultsFor": "Results for \"{{query}}\"",
"dateFrom": "Date From",
"dateTo": "Date To",
"enterQuery": "Enter a search term."
},
"topbar": {
"tenant": "Tenant",
@@ -120,6 +256,7 @@
"required": "This field is required.",
"email": "Please enter a valid email address.",
"minLength": "At least {{count}} characters required.",
"maxLength": "At most {{count}} characters allowed."
"maxLength": "At most {{count}} characters allowed.",
"passwordMismatch": "Passwords do not match."
}
}