- Workflows UI: full page with definitions/instances tabs, step editor, instance detail with approve/reject - Dedup/Merge UI: duplicate detection, side-by-side comparison, field-level merge dialog, merge history - Import/Export UI: import wizard (dry-run preview), export panel (CSV/XLSX), backend export route added - Print/PDF: PrintButton component, print.css, integrated in Contacts/Calendar/Reports/ContactDetail - Backend: GET /api/v1/export endpoint, export_companies_csv() service function - Routes: /workflows, /contacts/dedup, /import-export registered - Menu items: Workflows, Import/Export, Duplikate added to automation plugin manifest - IMPLEMENTATION_PLAN.md: audit-corrected plan for all 14 remaining features
21 KiB
LeoCRM — Implementationsplan: Fehlende Frontend-Features
Stand: 26.07.2026 (Audit-korrigiert) | Backend: 352 Endpunkte | Frontend: 47 Pages, 38 API-Clients Repo:
/a0/usr/workdir/leocrm-fix| Branch:main| Deploy: Coolify Appstvabl4vaqru7jclx4ittzr3
⚠️ Audit-Korrekturen (26.07.2026 02:17)
Korrektur 1: Permissions Management UI — ENTHALTEN IN SettingsRoles.tsx
Vorher: Plan sagte "keine Verwaltungs-Seite um Permissions pro Rolle zu konfigurieren"
Tatsächlich: SettingsRoles.tsx (531 Zeilen) hat VOLLSTÄNDIGE Permission-Verwaltung:
- ✅ Grant permissions (Checkboxen gruppiert nach system/plugin)
- ✅ Denied permissions (explizite Verweigern-Liste)
- ✅ Field-level permissions (pro Modul/Feld Sensitivität)
- ✅ Rollen erstellen/bearbeiten mit Permission-Zuweisung
- ✅ DMS
ShareDialog.tsxnutzt bereits File-Permissions API (grant/revoke/share-link) Folge: Feature 8 entfällt. Keine neue Permission-UI nötig.
Korrektur 2: Import/Export — Export-Route fehlt DEFINITIV
Vorher: Plan sagte "falls Export fehlt"
Tatsächlich: export_contacts_csv() Service-Funktion existiert, aber KEINE Route in import_export.py. Nur /import und /import/preview sind registriert. Export muss als Route hinzugefügt werden.
Korrektur 3: Activity Timeline — ActivityFeed existiert bereits
Vorher: Plan sagte "Dashboard hat ActivityFeed aber nur statisch"
Tatsächlich: Dashboard nutzt ActivityFeed mit Daten aus Audit-API. Komponente ist wiederverwendbar. Es fehlt nur eine eigenständige Seite mit Filterung/Pagination.
Korrektur 4: DMS ShareDialog — File Permissions bereits integriert
Vorher: Plan sah FilePermissionDialog als neue Komponente vor
Tatsächlich: ShareDialog.tsx (11KB) existiert bereits und nutzt fetchFilePermissions, grantPermission, revokePermission, createShareLink, revokeShareLink aus permissions.ts.
Übersicht: 14 verbleibende Features in 4 Phasen
| Phase | Features | Priorität | Geschätzter Aufwand |
|---|---|---|---|
| 1 — Kritisch | Workflows UI, Dedup/Merge UI, Import/Export UI, Print/PDF | CRM-Kern | ~4-5 Tage |
| 2 — Wichtig | Tags UI, Custom Fields UI, Notifications Dropdown | Tagesgeschäft | ~2.5-3 Tage |
| 3 — Nice-to-have | Saved Filters UI, Entity History UI, Activity Timeline, API Docs Link | Produktivität | ~1.5-2 Tage |
| 4 — Backend+Frontend | Webhooks, Backup/Restore UI, Onboarding/Tutorial | Erweiterungen | ~3-4 Tage |
Gesamtaufwand: ~11-14 Entwicklungstage (1 Feature entfallen)
Architektur-Grundsätze (für alle Features)
Frontend-Konventionen
- Routing: Lazy-loaded in
frontend/src/routes/index.tsx, explizite Routes (nicht PluginRouteRenderer) - API-Clients: In
frontend/src/api/<name>.ts, verwendenapiGet/apiPost/apiPatch/apiDeleteausclient.ts - Hooks: React Query (
useQuery/useMutation) mit Query-Key-Invalidierung - UI: Tailwind CSS,
clsxfür Klassen,lucide-reactfür Icons - i18n:
useTranslation()mitt('key'), Keys infrontend/src/i18n/ - Sidebar: Plugin-Manifeste liefern Menu-Items via
usePluginStore— neue Pages brauchen Plugin-Manifest-Einträge - Settings: Hardcoded nav items in
Settings.tsx+ plugin settings_pages - Error Handling:
ErrorBoundarywrappt alle Routes
Backend-Konventionen
- Routes:
app/routes/<name>.py, registriert inapp/main.py - Services:
app/services/<name>_service.py - Models:
app/models/<name>.py, Migrationen inalembic/versions/ - Schemas:
app/schemas/<name>.py(Pydantic) - Permissions:
require_permission('plugin:action')Dependency - Events:
event_bus.publish()für System-Events
Phase 1 — Kritisch für CRM-Betrieb
1.1 Workflows UI
Audit-Status: ✅ Backend vollständig (routes, model, service, execution engine). ✅ API-Client vollständig (workflows.ts). ❌ Keine Frontend-Seite. ❌ Kein menu_items-Eintrag im Automation-Plugin.
Neue Dateien:
frontend/src/pages/Workflows.tsx— Hauptseite mit Tabs: Definitionen | Instanzenfrontend/src/components/workflows/WorkflowEditor.tsx— Visueller Step-Editorfrontend/src/components/workflows/WorkflowInstanceList.tsx— Liste laufender/abgeschlossener Instanzenfrontend/src/components/workflows/WorkflowInstanceDetail.tsx— Detail mit Step-History, Approve/Rejectfrontend/src/components/workflows/StepConfigPanel.tsx— Konfiguration pro Step-Typ
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/workflows+/workflows/instances/:idapp/plugins/builtins/automation/plugin.py— menu_items Eintrag für Workflows (aktuellmenu_items=[])frontend/src/i18n/de.json— Workflow-Übersetzungen
Step-Editor:
- Step-Typen:
action,approval,notification,condition - Drag-and-Drop Reihenfolge (oder Button-basiert nach oben/unten)
- Pro Step: Name, Typ, Config-Form
- Trigger-Event Dropdown (aus Event-Bus-Events)
- Aktiv/Inaktiv Toggle
Instanzen-View:
- Status-Filter: pending, in_progress, completed, rejected, cancelled
- Pro Instanz: Workflow-Name, Status, Current Step, Timeout
- Detail: Step-History Timeline, Approve/Reject Buttons
Aufwand: ~1.5 Tage
1.2 Dedup/Merge UI
Audit-Status: ✅ Backend vollständig (dedup_service.py, routes in contacts.py: /duplicates, /merge, /merge-history). ✅ API-Client vollständig (dedup.ts). ❌ Keine Frontend-Seite.
Neue Dateien:
frontend/src/pages/DedupMerge.tsx— Hauptseite mit drei Bereichenfrontend/src/components/dedup/DuplicatePairCard.tsx— Side-by-side Vergleichfrontend/src/components/dedup/MergeDialog.tsx— Merge-Dialog mit Feld-Auswahlfrontend/src/components/dedup/MergeHistory.tsx— Verlauf der durchgeführten Merges
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/contacts/dedupfrontend/src/pages/ContactsList.tsx— Button "Duplikate prüfen" im Headerfrontend/src/i18n/de.json— Dedup-Übersetzungen
Merge-Dialog:
- Side-by-side Feld-Vergleich
- Pro Feld Radio: Quelle | Ziel | Manuell eingeben
- Vorschau des merged Kontakts
- Optionale Notiz
- Bestätigungs-Button mit Warnung
Aufwand: ~1 Tag
1.3 Import/Export UI
Audit-Status: ✅ Backend hat /api/v1/import + /api/v1/import/preview (Routes). ✅ Service hat import_csv(), export_contacts_csv(). ❌ Export-Route fehlt — Service-Funktion existiert aber ist nicht als Endpoint registriert. ❌ Kein Frontend, kein API-Client.
Backend-Ergänzung (bestätigt nötig):
app/routes/import_export.py—GET /api/v1/export?entity_type=contacts&format=csvhinzufügen- Ruft
export_contacts_csv()auf, gibtStreamingResponsemit CSV zurück - Erweiterung:
entity_type=companies(Filter aufContact.type == 'company') - Optional: XLSX-Format via
openpyxl
- Ruft
Neue Frontend-Dateien:
frontend/src/pages/ImportExport.tsx— Hauptseite mit Tabs: Import | Exportfrontend/src/components/import-export/ImportWizard.tsx— Mehrstufiger Import-Wizardfrontend/src/components/import-export/ExportPanel.tsx— Export-Auswahlfrontend/src/api/importExport.ts— API-Client (neu)
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/import-export- Plugin-Manifest — menu_items Eintrag
frontend/src/i18n/de.json— Übersetzungen
Import-Wizard:
Step 1: Datei hochladen + Entity-Typ (Companies/Contacts)
Step 2: Dry-Run Preview — zeigt erkannte Spalten, Mapping, Fehler
Step 3: Bestätigung — Anzahl neu/aktualisiert/fehlerhaft
Step 4: Import ausführen — Progress + Ergebnis
Export-Panel:
- Entity: Kontakte / Firmen
- Format: CSV (XLSX optional)
- Download-Button → File-Download
Aufwand: ~1.5 Tage (inkl. Backend Export-Route)
1.4 Print/PDF
Audit-Status: ❌ Komplett fehlend. Keine Print-Utils, keine Print-Buttons, kein @media print CSS.
Neue Dateien:
frontend/src/utils/print.ts— Print-Utilityfrontend/src/components/common/PrintButton.tsx— Wiederverwendbarer Print/Export-Buttonfrontend/src/styles/print.css— Print-spezifische CSS
Modifizierte Dateien:
frontend/src/pages/ContactsList.tsx— Print-Button in Toolbarfrontend/src/pages/ContactDetailPage.tsx— Print-Buttonfrontend/src/pages/Calendar.tsx— Print-Buttonfrontend/src/pages/Reports.tsx— Print-Buttonfrontend/index.html— Print-CSS einbinden
Implementierung:
- Option A:
window.print()mit@media printCSS (empfohlen für Listen/Details) - Option B:
jspdf+html2canvasfür echte PDF-Generierung (für Reports) - Print-Button Dropdown: "Drucken" | "Als PDF"
Aufwand: ~0.5 Tage
Phase 2 — Wichtig für Tagesgeschäft
2.1 Tags UI
Audit-Status: ✅ Backend-Plugin vollständig (app/plugins/builtins/tags/: models, routes, schemas). ✅ API-Client vollständig (tags.ts). ❌ Keine Frontend-Seite.
Neue Dateien:
frontend/src/pages/Tags.tsx— Tag-Verwaltung (CRUD, Farb-Auswahl, Usage-Count)frontend/src/components/tags/TagBadge.tsx— Wiederverwendbares Tag-Badgefrontend/src/components/tags/TagSelector.tsx— Multi-Select Tag-Picker
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/tagsfrontend/src/pages/ContactsList.tsx— Tag-Spalte + Tag-Filterfrontend/src/pages/ContactDetailPage.tsx— Tag-Badges + Tag-Selectorfrontend/src/pages/Calendar.tsx— Tag-Badges für Terminefrontend/src/pages/Dms.tsx— Tag-Badges für Dateien- Plugin-Manifest — menu_items
frontend/src/i18n/de.json
Aufwand: ~1 Tag
2.2 Custom Fields UI
Audit-Status: ✅ Backend hat Custom-Fields-Route (plugin-manifest-gesteuert, Werte in contacts.custom JSONB). ❌ Keine User-definierten Feld-Definitionen (nur Plugin-Definitionen). ❌ Keine Frontend-Seite.
Backend-Ergänzung nötig:
app/models/custom_field_definition.py— Model für User-definierte Felderapp/schemas/custom_field_definition.py— Pydantic Schemasapp/services/custom_field_service.py— CRUD-Serviceapp/routes/custom_fields.py—GET/POST/PATCH/DELETE /api/v1/custom-fields/definitions- Migration für
custom_field_definitionsTabelle - Bestehende
_collect_custom_field_definitions()erweitern um DB-Definitionen
Neue Frontend-Dateien:
frontend/src/pages/CustomFields.tsx— Definitionen verwaltenfrontend/src/components/custom-fields/FieldDefinitionForm.tsx— Form für neue Felderfrontend/src/components/custom-fields/CustomFieldRenderer.tsx— Dynamisches Feld-Renderingfrontend/src/api/customFieldDefinitions.ts— API-Client für Definitionen
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/settings/custom-fieldsfrontend/src/pages/Settings.tsx— Nav-Eintrag "Custom Fields"frontend/src/pages/ContactDetailPage.tsx— Custom Fields Sectionfrontend/src/i18n/de.json
Feld-Typen: text, number, date, select, multiselect, boolean
Aufwand: ~1.5 Tage (inkl. Backend CRUD + Migration)
2.3 Notifications Dropdown (Bell Icon in TopBar)
Audit-Status: ✅ API-Client vollständig (notifications.ts). ✅ Backend vollständig. ❌ TopBar hat kein Bell-Icon (confirmed: grep findet nichts). Notifications nur in AISidebar.
Neue Dateien:
frontend/src/components/layout/NotificationBell.tsx— Bell-Icon mit Badge + Dropdownfrontend/src/components/notifications/NotificationDropdown.tsx— Dropdown-Listefrontend/src/components/notifications/NotificationItem.tsx— Einzelne Notification
Modifizierte Dateien:
frontend/src/components/layout/TopBar.tsx—<NotificationBell />vor User-Menu einfügenfrontend/src/i18n/de.json
Features:
- Unread-Count Badge (rot)
- Polling alle 30s (refetchInterval in useQuery)
- Click: Notification als gelesen markieren
- "Alle als gelesen" Button
- Type-Icon pro Notification
- Zeitstempel (relativ: "vor 5 Min")
Aufwand: ~0.5 Tage
Phase 3 — Nice-to-have / Produktivität
3.1 Saved Filters UI
Audit-Status: ✅ Backend vollständig (saved_filters.py: CRUD, entity_types: contacts/mail/calendar/dms). ✅ API-Client vorhanden (savedFilters.ts). ❌ Keine UI.
Neue Dateien:
frontend/src/components/common/SavedFilterBar.tsx— Filter-Leiste mit Save/Loadfrontend/src/components/common/SaveFilterDialog.tsx— Dialog zum Speichern
Modifizierte Dateien:
frontend/src/pages/ContactsList.tsx— SavedFilterBarfrontend/src/pages/Calendar.tsx— SavedFilterBarfrontend/src/pages/Dms.tsx— SavedFilterBarfrontend/src/pages/Tasks.tsx— SavedFilterBarfrontend/src/i18n/de.json
Aufwand: ~0.5 Tage
3.2 Entity History UI
Audit-Status: ✅ Backend vollständig (entity_history.py: get/restore/undo). ✅ API-Client vorhanden (entityHistory.ts). ❌ Keine UI-Komponente.
Neue Dateien:
frontend/src/components/common/EntityHistoryPanel.tsx— Timeline-Komponentefrontend/src/components/common/HistoryDiff.tsx— Visualisierung von Feld-Änderungen
Modifizierte Dateien:
frontend/src/pages/ContactDetailPage.tsx— History-Tab/Panelfrontend/src/pages/Dms.tsx— History für Dateienfrontend/src/pages/Calendar.tsx— History für Terminefrontend/src/i18n/de.json
Features:
- Timeline mit create/update/delete Events
- Diff-Anzeige: alt → neu pro Feld
- Restore-Button pro Eintrag
- Undo-Button (letzte Aktion rückgängig)
Aufwand: ~0.5 Tage
3.3 Activity Timeline
Audit-Status: ✅ ActivityFeed Komponente existiert (wiederverwendbar). ✅ Dashboard nutzt sie mit Audit-Daten. ❌ Keine eigenständige Seite mit Filterung/Pagination.
Neue Dateien:
frontend/src/pages/ActivityTimeline.tsx— Globale Activity-Feed Seitefrontend/src/components/activity/ActivityFilter.tsx— Filter (User, Entity, Action, Zeitraum)
Modifizierte Dateien:
frontend/src/routes/index.tsx— Route/activityfrontend/src/api/audit.ts— Erweitern um Timeline-Query (alle Entities, Pagination)frontend/src/pages/Dashboard.tsx— Link "Alle Aktivitäten anzeigen"frontend/src/i18n/de.json
Features:
- Wiederverwendung von
ActivityFeedKomponente - Gruppierung nach Tag
- Filter: User, Entity-Typ, Aktion, Zeitraum
- Pagination / Infinite-Scroll
- Link zu Entity-Detail bei Click
Aufwand: ~0.5 Tage
3.4 API Documentation Link
Audit-Status: ✅ FastAPI generiert automatisch /docs (Swagger) und /redoc. ❌ Kein Link im UI.
Modifizierte Dateien:
frontend/src/components/layout/TopBar.tsx— "API Docs" Link im User-Menufrontend/src/pages/SettingsSystem.tsx— "API Dokumentation" Sektionfrontend/src/i18n/de.json
Implementierung:
- Link zu Swagger UI:
/docs(FastAPI auto-docs) - Link zu ReDoc:
/redoc - In Settings/System: Sektion "Entwickler"
Aufwand: ~0.25 Tage
Phase 4 — Backend + Frontend (komplett neu)
4.1 Webhooks
Audit-Status: ❌ Komplett fehlend. Kein Backend, kein Frontend, keine Modelle.
Neue Backend-Dateien:
app/models/webhook.py— Webhook-Modell (url, events, secret, is_active, retry_count)app/schemas/webhook.py— Pydantic Schemasapp/services/webhook_service.py— Webhook-Service (send, retry, verify HMAC)app/routes/webhooks.py— CRUD-Routes/api/v1/webhooksapp/core/webhook_dispatcher.py— Event-Bus-Subscriberalembic/versions/0036_webhooks.py— Migration
Neue Frontend-Dateien:
frontend/src/pages/SettingsWebhooks.tsx— Webhook-Verwaltungfrontend/src/components/webhooks/WebhookForm.tsx— Create/Edit Formfrontend/src/components/webhooks/WebhookDeliveryLog.tsx— Delivery-Logfrontend/src/api/webhooks.ts— API-Client
Modifizierte Dateien:
app/main.py— Router registrierenapp/core/event_bus.py— Webhook-Dispatcher subscribenfrontend/src/routes/index.tsx— Route/settings/webhooksfrontend/src/pages/Settings.tsx— Nav-Eintrag "Webhooks"frontend/src/i18n/de.json
Features:
- URL + Secret (HMAC-Signatur)
- Event-Auswahl (Multi-Select aus Event-Bus-Events)
- Aktiv/Pause Toggle
- Delivery-Log mit Status, Response-Code, Latenz
- Retry-Konfiguration
- Test-Button
Aufwand: ~1.5 Tage
4.2 Backup/Restore UI
Audit-Status: ✅ backup_check Cron-Job existiert (prüft last_backup_at, published Events). ❌ Keine Backup-Routes, keine Restore-Funktionalität, keine UI.
Backend-Ergänzung:
app/routes/backups.py—/api/v1/backups(list, create, restore, delete)app/services/backup_service.py— Backup erstellen (pg_dump), Restore (pg_restore)app/models/backup.py— Backup-Modellalembic/versions/0037_backups.py— Migration
Neue Frontend-Dateien:
frontend/src/pages/SettingsBackup.tsx— Backup-Verwaltungfrontend/src/components/backup/BackupList.tsx— Liste der Backupsfrontend/src/components/backup/RestoreDialog.tsx— Restore-Bestätigungfrontend/src/api/backups.ts— API-Client
Modifizierte Dateien:
app/main.py— Router registrierenfrontend/src/routes/index.tsx— Route/settings/backupfrontend/src/pages/Settings.tsx— Nav-Eintrag "Backup & Restore"frontend/src/i18n/de.json
Aufwand: ~1 Tag
4.3 Onboarding/Tutorial
Audit-Status: ❌ Komplett fehlend.
Neue Dateien:
frontend/src/components/onboarding/OnboardingTour.tsx— Guided Tourfrontend/src/components/onboarding/WelcomeDialog.tsx— Willkommens-Dialogfrontend/src/store/onboardingStore.ts— Zustand-Store
Modifizierte Dateien:
frontend/src/components/layout/AppShell.tsx— OnboardingTour einbindenfrontend/src/api/userPreferences.ts— onboarding_completed flagfrontend/src/i18n/de.json
Tour-Schritte (8):
- Willkommen
- Sidebar-Navigation
- Globale Suche
- Kontakte erstellen
- Kalender/Termine
- KI Assistent
- Einstellungen
- Fertig
Bibliothek: react-joyride oder Custom Implementation
Aufwand: ~1 Tag
Implementations-Reihenfolge
Phase 1 (Kritisch)
1.1 Workflows UI ████████████████░░░ 1.5 Tage
1.2 Dedup/Merge UI ███████████░░░░░░░░ 1.0 Tag
1.3 Import/Export UI ████████████████░░░ 1.5 Tage (inkl. Backend Export-Route)
1.4 Print/PDF █████░░░░░░░░░░░░░░ 0.5 Tage
Phase 2 (Wichtig)
2.1 Tags UI ███████████░░░░░░░░ 1.0 Tag
2.2 Custom Fields UI ████████████████░░░ 1.5 Tage (inkl. Backend CRUD)
2.3 Notifications Bell █████░░░░░░░░░░░░░░ 0.5 Tage
Phase 3 (Nice-to-have)
3.1 Saved Filters UI █████░░░░░░░░░░░░░░ 0.5 Tage
3.2 Entity History UI █████░░░░░░░░░░░░░░ 0.5 Tage
3.3 Activity Timeline █████░░░░░░░░░░░░░░ 0.5 Tage
3.4 API Docs Link ██░░░░░░░░░░░░░░░░░ 0.25 Tage
Phase 4 (Backend + Frontend)
4.1 Webhooks ████████████████░░░ 1.5 Tage
4.2 Backup/Restore UI ███████████░░░░░░░░ 1.0 Tag
4.3 Onboarding/Tutorial ███████████░░░░░░░░ 1.0 Tag
Deployment-Strategie
Nach jeder Phase:
- Frontend Build:
cd frontend && npm run build - Git commit + push
- Coolify Auto-Deploy
- Verifikation im Browser
Abhängigkeiten
1.1 Workflows UI ← keine (API ready)
1.2 Dedup/Merge UI ← keine (API ready)
1.3 Import/Export UI ← Backend Export-Route hinzufügen (Service existiert)
1.4 Print/PDF ← keine
2.1 Tags UI ← keine (API ready)
2.2 Custom Fields UI ← Backend CRUD + Migration (neu)
2.3 Notifications Bell ← keine (API ready)
3.1 Saved Filters ← keine (API ready)
3.2 Entity History ← keine (API ready)
3.3 Activity Timeline ← Audit-API ggf. erweitern (Pagination)
3.4 API Docs Link ← keine
4.1 Webhooks ← Backend komplett neu + Migration
4.2 Backup/Restore ← Backend komplett neu + Migration
4.3 Onboarding ← User-Preferences API ggf. erweitern
Risiko-Bewertung
| Feature | Risiko | Grund |
|---|---|---|
| Workflows UI | Mittel | Komplexe Step-Editor UI |
| Custom Fields UI | Hoch | Backend-Ergänzung + dynamisches Rendering |
| Webhooks | Hoch | Backend komplett neu, Security (HMAC, Retry) |
| Backup/Restore | Hoch | Datenverlust-Risiko bei Fehlern |
| Import/Export | Mittel | Backend Export-Route fehlt, Datei-Handling |
| Alle anderen | Niedrig | API existiert, nur UI |
Entfallenes Feature
Permissions Management UI — BEREITS VORHANDEN
SettingsRoles.tsx(531 Zeilen) hat vollständige Permission-VerwaltungShareDialog.tsx(11KB) nutzt File-Permissions APIroles.tsAPI-Client hatusePermissions(),useRoles(),useCreateRole(),useUpdateRole(),useDeleteRole()- Backend
/roles/permissionsliefert alle System+Plugin-Permissions - Backend Roles-CRUD erlaubt Permission-Zuweisung (grant/deny/field-level)
Plan erstellt am 26.07.2026, audit-korrigiert um 02:17 — bereit zur Umsetzung.