feat(agenten): Runde 4 — «Meine Agenten» mit fünf digitalen Mitarbeitenden
Setzt das Umsetzungsbriefing Runde 4 im bestehenden Frontend um. Informationsarchitektur - «Teamübersicht» heisst «Meine Agenten»; ihr bisheriger Inhalt (Kreisgrafik, Auswertung, Verbindungszusammenfassung) ist entfallen. - Personalverwaltung, Bearbeitungsverlauf und Kanäle & Systeme sind jetzt Reiter derselben Seite (?section=), gestaltet wie die Auswahl im Bearbeitungsverlauf. Es wird nur der gewählte Bereich gerendert. - Die alten Unterseitenpfade leiten um, damit Lesezeichen nicht brechen. Agentenbestand - Reto und Lea vollständig entfernt — aus Navigation, Dossiers, Protokoll, Verbindungen, Vorgängen und Porträtbestand. - Retos Aufgaben liegen bei Bruno: Nachbereitung, WhatsApp-Anruf, Protokoll und Kundennotiz, Ablage im CRM. - Livia ist «Exposé Master»: Lageberichte, Inserate, Angebotsbroschüren. - Sidebar führt Ferdi, Bruno, Livia, Nora, Sina mit Porträt und Funktion. Agentenseiten - Ein gemeinsamer AgentWorkspaceHero auf allen fünf Seiten. - Ferdi: Auswertungskarten, Priorität und Typfarben entfallen; Fälligkeit nur bei fünf Tagen oder weniger rot; Objektlinks nach «Meine Objekte»; neu die Terminplanung im verbundenen Kalender mit typgerechtem PDF-Ausschnitt. - Sina: reduzierte, filter- und sortierbare Objektübersicht; Detailansicht direkt editierbar, leere Pflichtfelder rot umrandet. - Nora: Signale ohne Prozentsätze und Konfidenzstufen, nur belegbare Angaben; Mehrfachauswahl leitet Objekte an Livia weiter. - Livia: aktive und archivierte Leads, Arbeitsbereich gleitet an den oberen Rand; dreistufiger Exposé-Prozess Hochladen → Exposé → Export. - Bruno: neue Seite mit Auftragsliste und Vor-/Nachbereitungs-Drawer; Glocke warnt bei Besichtigung unter 24 Stunden ohne Bericht. Datenschicht - Neu: Kalender, Exposé-Leads, Exposé-Entwürfe, Besichtigungsaufträge — je Domain, Provider, Service und Hook. - IAIService um generateExposeText erweitert; der Entwurf nutzt ausschliesslich erfasste Objektdaten und meldet Lücken, statt sie zu füllen. - Alle Objektverweise zeigen auf reale Einträge aus «Meine Objekte»; neue Detailroute /supply/properties/:propertyId. Offen: Chat, Kalender, CRM und DMS sind Frontend-Simulation ohne Anbindung. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
cc5582b7fd
commit
d200d4e930
352 files changed
+8069
-8512
No files matched your search
+34
-20
@@ -5,6 +5,7 @@ import { AppShell } from './components/layout'
|
||||
import { ProtectedRoute } from './components/auth'
|
||||
import { WorkspaceType } from './domain/enums'
|
||||
import { useSessionStore } from './stores/sessionStore'
|
||||
import { AGENT_SECTIONS, AGENT_SECTION_PARAM, ROUTES } from './lib/constants'
|
||||
|
||||
// Die Flächensuche ist entfernt — es bleibt ein einziger erreichbarer Einstieg.
|
||||
const WORKSPACE_HOME: Record<string, string> = {
|
||||
@@ -28,12 +29,15 @@ const ReminderManager = lazy(() => import('./pages/supply/ReminderManager'))
|
||||
const MarketIntelligence = lazy(() => import('./pages/supply/MarketIntelligence'))
|
||||
const NewListing = lazy(() => import('./pages/supply/NewListing'))
|
||||
const MyListings = lazy(() => import('./pages/supply/MyListings'))
|
||||
const Besichtigungen = lazy(() => import('./pages/supply/Besichtigungen'))
|
||||
|
||||
// Property On — «Teamübersicht»
|
||||
const Teamuebersicht = lazy(() => import('./pages/supply/Teamuebersicht'))
|
||||
const Personalverwaltung = lazy(() => import('./pages/supply/Personalverwaltung'))
|
||||
const Bearbeitungsverlauf = lazy(() => import('./pages/supply/Bearbeitungsverlauf'))
|
||||
const KanaeleSysteme = lazy(() => import('./pages/supply/KanaeleSysteme'))
|
||||
// Property On — «Meine Agenten»
|
||||
const MeineAgenten = lazy(() => import('./pages/supply/MeineAgenten'))
|
||||
|
||||
/** Alter Unterseitenpfad → Reiter der Hauptseite. Hält Lesezeichen am Leben. */
|
||||
function TeamSectionRedirect({ section }: { section: string }) {
|
||||
return <Navigate to={`${ROUTES.SUPPLY.TEAM}?${AGENT_SECTION_PARAM}=${section}`} replace />
|
||||
}
|
||||
|
||||
function App() {
|
||||
return (
|
||||
@@ -52,25 +56,35 @@ function App() {
|
||||
<Route element={<ProtectedRoute workspace={WorkspaceType.SUPPLY} />}>
|
||||
<Route path="/supply/dashboard" element={<SupplyDashboard />} />
|
||||
<Route path="/supply/properties" element={<Properties />} />
|
||||
{/* Objekt-Detailroute — Ziel aller Objektlinks der Agentenseiten. */}
|
||||
<Route path="/supply/properties/:propertyId" element={<Properties />} />
|
||||
<Route path="/supply/match-center" element={<MatchCenter />} />
|
||||
<Route path="/supply/future-availability" element={<FutureAvailability />} />
|
||||
<Route path="/supply/data-quality" element={<DataQuality />} />
|
||||
<Route path="/supply/reminder-manager" element={<ReminderManager />} />
|
||||
<Route path="/supply/market-intelligence" element={<MarketIntelligence />} />
|
||||
<Route path="/supply/new-listing" element={<NewListing />} />
|
||||
<Route path="/supply/my-listings" element={<MyListings />} />
|
||||
|
||||
{/* Property On — Hierarchie und Deep-Links bleiben erhalten (§3.4).
|
||||
Bewusst flache Geschwisterrouten statt <Outlet/>: die App kennt
|
||||
keine einzige Feature-Route mit eigenem Outlet, ein Novum hier
|
||||
würde Sidebar, Seitentitel und Guards gleichzeitig betreffen. */}
|
||||
<Route path="/supply/team" element={<Teamuebersicht />} />
|
||||
<Route path="/supply/team/personalverwaltung" element={<Personalverwaltung />} />
|
||||
<Route path="/supply/team/personalverwaltung/:agentId" element={<Personalverwaltung />} />
|
||||
<Route path="/supply/team/personalverwaltung/:agentId/:tab" element={<Personalverwaltung />} />
|
||||
<Route path="/supply/team/bearbeitungsverlauf" element={<Bearbeitungsverlauf />} />
|
||||
<Route path="/supply/team/bearbeitungsverlauf/:tab" element={<Bearbeitungsverlauf />} />
|
||||
<Route path="/supply/team/kanaele-systeme" element={<KanaeleSysteme />} />
|
||||
{/* Die fünf Agentenseiten. Vier behalten den Pfad ihres Vorgängers. */}
|
||||
<Route path="/supply/reminder-manager" element={<ReminderManager />} />
|
||||
<Route path="/supply/besichtigungen" element={<Besichtigungen />} />
|
||||
<Route path="/supply/my-listings" element={<MyListings />} />
|
||||
<Route path="/supply/market-intelligence" element={<MarketIntelligence />} />
|
||||
<Route path="/supply/data-quality" element={<DataQuality />} />
|
||||
|
||||
{/* Property On — «Meine Agenten». Die drei Verwaltungsbereiche sind
|
||||
seit Runde 4 Reiter derselben Seite; die alten Unterseitenpfade
|
||||
leiten dorthin um, damit bestehende Lesezeichen nicht brechen. */}
|
||||
<Route path="/supply/team" element={<MeineAgenten />} />
|
||||
<Route
|
||||
path="/supply/team/personalverwaltung/*"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.PERSONNEL} />}
|
||||
/>
|
||||
<Route
|
||||
path="/supply/team/bearbeitungsverlauf/*"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.HISTORY} />}
|
||||
/>
|
||||
<Route
|
||||
path="/supply/team/kanaele-systeme"
|
||||
element={<TeamSectionRedirect section={AGENT_SECTIONS.CHANNELS} />}
|
||||
/>
|
||||
</Route>
|
||||
</Route>
|
||||
</Route>
|
||||
|
||||
Reference in new issue
Block a user