feat(team): Oberfläche der Teamübersicht
Vier Seiten, eingebettet in die bestehende App-Shell — keine zweite Sidebar, keine zweite Kopfzeile, kein eigenes Property-On-Branding: - Teamübersicht: Auswertung (drei Kennzahlen, gemeinsam filterbar nach Zeitraum, Bereich und Mitarbeiter), Kernteam, Kanäle & Systeme — in dieser Reihenfolge - Bearbeitungsverlauf: zwei Reiter, neun Filterdimensionen, Detail-Drawer mit Ergebnis, Eingabedaten, Verarbeitungsschritten, Fundstellen, Nachrichtenverlauf und Aktionshistorie; Freigeben, Anpassen, Zurückweisen, Rückfrage beantworten - Personalverwaltung: dreigeteilt (Hauptnavigation, Agentenliste, Dossier) mit fünf Reitern — Aufgaben, Kanäle, Systeme, Einstellungen, Protokoll - Kanäle & Systeme: neun Verbindungen, mehrstufiger Assistent, ERP-Auswahl, deterministischer Verbindungstest Navigation: NavItem um `children` erweitert, "Teamübersicht" steht exakt zwischen "Meine Objekte" und "Reminder Manager", die drei Subreiter bleiben eingerückt sichtbar, solange man im Funktionsbereich ist. Subreiter sind echte Routen, keine lokalen Tabs. Die App kannte bisher keine Feature-Route mit eigenem Outlet und baut Tabs sonst über lokalen useState — hier trug das nicht: die Subreiter müssen in der Sidebar stehen und deep-linkbar sein. Die Routen sind flache Geschwister, kein Outlet-Baum. Freigabepflichtige Aktionen laufen über einen Bestätigungsdialog mit sichtbarer Konsequenz; die 1-Klick-Bestätigung ist die fachlich vorgesehene Ausnahme. Jeder Status trägt neben der Farbe immer einen Text. Null rohe Hex-Werte: check:tokens bleibt unverändert bei 2249. Der in der Spezifikation genannte dunkelblaue Banner "Heute geleistet …" existiert in dieser Codebasis nicht — er wird deshalb auch nicht erzeugt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
52dc7de25e
commit
78e2dab655
39 files changed
+5638
-2
No files matched your search
@@ -1,4 +1,5 @@
|
||||
import { WorkspaceType } from '../../domain/enums'
|
||||
import { ROUTES } from '../../lib/constants'
|
||||
import type { LucideIcon } from 'lucide-react'
|
||||
import {
|
||||
LayoutDashboard,
|
||||
@@ -13,16 +14,32 @@ import {
|
||||
Kanban,
|
||||
BellRing,
|
||||
Settings,
|
||||
Users,
|
||||
} from 'lucide-react'
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Types
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Eingerückter Subreiter unterhalb eines Hauptreiters. Bewusst ohne Icon: die
|
||||
* Einrückung und der schmalere Schriftgrad machen die Hierarchie deutlich,
|
||||
* ein zweites Icon-Raster würde die Sidebar unruhig machen.
|
||||
*/
|
||||
export interface NavSubItem {
|
||||
path: string
|
||||
label: string
|
||||
}
|
||||
|
||||
export interface NavItem {
|
||||
path: string
|
||||
label: string
|
||||
icon: LucideIcon
|
||||
/**
|
||||
* Subreiter, die sichtbar bleiben, solange sich der Nutzer innerhalb des
|
||||
* Funktionsbereichs befindet (Property On, §3.3).
|
||||
*/
|
||||
children?: NavSubItem[]
|
||||
}
|
||||
|
||||
export interface WorkspaceConfig {
|
||||
@@ -48,6 +65,16 @@ export const WORKSPACE_CONFIG: Record<WorkspaceType, WorkspaceConfig> = {
|
||||
navItems: [
|
||||
{ path: '/supply/dashboard', label: 'Übersicht', icon: LayoutDashboard },
|
||||
{ path: '/supply/properties', label: 'Meine Objekte', icon: Building2 },
|
||||
{
|
||||
path: ROUTES.SUPPLY.TEAM,
|
||||
label: 'Teamübersicht',
|
||||
icon: Users,
|
||||
children: [
|
||||
{ path: ROUTES.SUPPLY.TEAM_PERSONNEL, label: 'Personalverwaltung' },
|
||||
{ path: ROUTES.SUPPLY.TEAM_HISTORY, label: 'Bearbeitungsverlauf' },
|
||||
{ path: ROUTES.SUPPLY.TEAM_CONNECTIONS, label: 'Kanäle & Systeme' },
|
||||
],
|
||||
},
|
||||
{ path: '/supply/reminder-manager', label: 'Reminder Manager', icon: BellRing },
|
||||
{ path: '/supply/anfragen', label: 'Anfragencenter', icon: MessageSquare },
|
||||
{ path: '/supply/data-quality', label: 'Datenpflege', icon: CheckSquare },
|
||||
@@ -102,8 +129,16 @@ export function getPageNameFromPath(pathname: string): string {
|
||||
for (const ws of Object.values(WORKSPACE_CONFIG)) {
|
||||
for (const item of ws.navItems) {
|
||||
if (item.path === pathname) return item.label
|
||||
for (const child of item.children ?? []) {
|
||||
if (child.path === pathname) return child.label
|
||||
}
|
||||
}
|
||||
}
|
||||
// Property On: Deep-Links auf Personalblatt und Verlaufsreiter. Ohne diese Fälle
|
||||
// fiele der Titel in den Segment-Fallback und ergäbe «Personalverwaltung» statt
|
||||
// des Mitarbeiternamens bzw. «Erledigte auftraege».
|
||||
if (/^\/supply\/team\/personalverwaltung\/.+/.test(pathname)) return 'Personalblatt'
|
||||
if (/^\/supply\/team\/bearbeitungsverlauf\/.+/.test(pathname)) return 'Bearbeitungsverlauf'
|
||||
if (/^\/demand\/results\/.+/.test(pathname)) return 'Match Detail'
|
||||
if (/^\/demand\/property\//.test(pathname)) return 'Objekt Detail'
|
||||
if (/^\/supply\/properties\/.+/.test(pathname)) return 'Objekt Detail'
|
||||
|
||||
Reference in new issue
Block a user