/** * Intent Labels & Status Styles * * Shared Dutch labels and styling for Cortex V2 UI components. * Used by ActionChainCard, ActionItem, and ClarificationCard. * * Epic: E3 (UI Components) */ import type { CortexIntent, IntentActionStatus, NudgePriority, ExtractedEntities } from './types'; /** * Dutch labels for intent types */ export const INTENT_LABELS: Record = { dagnotitie: 'Dagnotitie', zoeken: 'Patiënt zoeken', overdracht: 'Overdracht', agenda_query: 'Agenda bekijken', create_appointment: 'Afspraak maken', cancel_appointment: 'Afspraak annuleren', reschedule_appointment: 'Afspraak verzetten', // Intake intents (MVP) intake_status: 'Intake status', intake_navigeer: 'Naar intake sectie', risico_query: 'Risicotaxatie', diagnose_query: 'Diagnoses', // No Show casus register_no_show: 'No Show registratie', unknown: 'Onbekend', }; /** * Status styling for IntentAction items */ export const STATUS_STYLES: Record< IntentActionStatus, { bg: string; border: string; text: string; icon: string } > = { pending: { bg: 'bg-slate-50', border: 'border-slate-200', text: 'text-slate-700', icon: 'text-slate-300', }, confirming: { bg: 'bg-amber-50', border: 'border-amber-200', text: 'text-amber-700', icon: 'text-amber-500', }, executing: { bg: 'bg-blue-50', border: 'border-blue-200', text: 'text-blue-700', icon: 'text-blue-500', }, success: { bg: 'bg-green-50', border: 'border-green-200', text: 'text-green-700', icon: 'text-green-500', }, failed: { bg: 'bg-red-50', border: 'border-red-200', text: 'text-red-700', icon: 'text-red-500', }, skipped: { bg: 'bg-slate-50', border: 'border-slate-200', text: 'text-slate-400', icon: 'text-slate-400', }, }; /** * Get confidence badge styling based on confidence score * >= 0.9: green (high confidence) * >= 0.7: amber (medium confidence) * < 0.7: red (low confidence) */ export function getConfidenceStyle(confidence: number): { bg: string; text: string; label: string; } { if (confidence >= 0.9) { return { bg: 'bg-green-50', text: 'text-green-700', label: 'Hoog', }; } if (confidence >= 0.7) { return { bg: 'bg-amber-50', text: 'text-amber-700', label: 'Gemiddeld', }; } return { bg: 'bg-red-50', text: 'text-red-700', label: 'Laag', }; } /** * Priority styling for NudgeSuggestion toasts */ export const PRIORITY_STYLES: Record< NudgePriority, { bg: string; border: string; text: string } > = { low: { bg: 'bg-blue-50', border: 'border-blue-200', text: 'text-blue-700', }, medium: { bg: 'bg-amber-50', border: 'border-amber-200', text: 'text-amber-700', }, high: { bg: 'bg-red-50', border: 'border-red-200', text: 'text-red-700', }, }; /** * Format entity summary for display in ActionItem */ export function formatEntitySummary( intent: CortexIntent, entities: ExtractedEntities ): string { const parts: string[] = []; // Patient name if (entities.patientName) { parts.push(`Patiënt: ${entities.patientName}`); } // Content/query if (entities.content && typeof entities.content === 'string') { const truncated = entities.content.length > 50 ? `${entities.content.slice(0, 50)}...` : entities.content; parts.push(truncated); } if (entities.query && typeof entities.query === 'string') { parts.push(`Zoekterm: "${entities.query}"`); } // Date/time if (entities.datetime) { const dt = entities.datetime; // datetime.date is a Date object, format it const dateStr = dt.date ? dt.date.toLocaleDateString('nl-NL') : null; if (dateStr && dt.time) { parts.push(`${dateStr} om ${dt.time}`); } else if (dateStr) { parts.push(dateStr); } else if (dt.time) { parts.push(`om ${dt.time}`); } } // Category for dagnotitie if (intent === 'dagnotitie' && entities.category) { const categoryLabels: Record = { medicatie: 'Medicatie', adl: 'ADL', gedrag: 'Gedrag', incident: 'Incident', observatie: 'Observatie', }; const label = categoryLabels[entities.category as string] || entities.category; parts.push(`Categorie: ${label}`); } return parts.join(' • ') || 'Geen details'; }