import { useState } from 'react' import { Box, FormControlLabel, Switch, Typography } from '@mui/material' import { AlertTriangle, Mail } from 'lucide-react' import type { TeamAgent } from '../../domain/teamAgent' import { AgentStatus } from '../../domain/teamAgent' import { AgentAvatar } from './AgentAvatar' import { AgentStatusBadge } from './AgentBadges' import { ConfirmDialog } from '../ui' import { useSetAgentActive } from '../../hooks/useTeamAgents' import { DS_BG, DS_BORDER, DS_SURFACE, DS_TEXT } from '../../lib/ds' import { formatTeamDateTime } from '../../lib/teamClock' interface Props { agent: TeamAgent } /** Mehr als vier Stichworte liest im Kopfbereich niemand mehr. */ const MAX_RESPONSIBILITIES = 4 const LABEL_MAX_CHARS = 42 /** * Verdichtet eine ausformulierte Zuständigkeit auf ein Stichwort. * Schneidet am ersten Komma, sonst an der Wortgrenze — der volle Wortlaut * bleibt als Titel am Element erhalten, es geht also keine Aussage verloren. */ function shortLabel(text: string): string { const head = text.split(',')[0].trim() if (head.length <= LABEL_MAX_CHARS) return head const cut = head.slice(0, LABEL_MAX_CHARS) return `${cut.slice(0, cut.lastIndexOf(' '))} …` } function MetaField({ label, value }: { label: string; value: string }) { return ( {label} {value} ) } /** * Kopfbereich des Personalblatts (§7.3). * * Das Pausieren läuft über einen Bestätigungsdialog mit Hinweis auf die * betroffenen Aufgaben — ein versehentlich pausierter Fristen-Wächter würde * echte Termine verpassen (§7.5, §17.3). */ export function AgentDossierHeader({ agent }: Props) { const [confirmPause, setConfirmPause] = useState(false) const setActive = useSetAgentActive() const isActive = agent.status === AgentStatus.ACTIVE const enabledTasks = agent.tasks.filter(t => t.enabled).length const handleToggle = (next: boolean) => { if (next) setActive.mutate({ id: agent.id, active: true }) else setConfirmPause(true) } return ( {agent.name} {agent.role} {agent.email} {/* Kurzer Beschrieb und Zuständigkeiten stehen jetzt oben statt tief im Dossier — das ist die Frage, die man beim Öffnen zuerst hat. */} {agent.shortDescription} {agent.responsibilities.length > 0 && ( Zuständig für: {agent.responsibilities.slice(0, MAX_RESPONSIBILITIES).map((r, i) => ( {i > 0 && ·} {shortLabel(r)} ))} )} handleToggle(e.target.checked)} slotProps={{ input: { 'aria-label': `${agent.name} aktiv` } }} /> } label="Agent aktiv" sx={{ mr: 0, '& .MuiFormControlLabel-label': { fontWeight: 600, fontSize: '0.875rem' } }} /> {/* Stammdaten */} {/* Warnung im Personalblatt, solange pausiert (§7.5) */} {!isActive && ( {agent.name} ist pausiert. Bis zur Reaktivierung werden keine Aufgaben ausgeführt und es entstehen keine neuen Vorgänge. )} { setActive.mutate({ id: agent.id, active: false }) setConfirmPause(false) }} onCancel={() => setConfirmPause(false)} /> ) }