// CIL[BEGIN chunk_id="badges_module_header_1784779659" type="module_header" identity="module_header" parent="none"] // CIL[DOC-MACRO purpose="Render status, priority, severity, work type, team, and blocked badges for work items"] // CIL[DOC-RESPONSIBILITY responsibility="Provide styled badge components and a boolean normalization helper for work item cards"] // CIL[DOC-CONTEXT module="workbench.components.work.badges" layer="frontend-component" related_files="[\"custom/apps/workbench/components/work/WorkItemCard.tsx\",\"custom/apps/workbench/components/work/WorkItemForm.tsx\"]"] // CIL[DOC-CONTRACT inputs="value strings / booleans" outputs="Badge React nodes" errors="none" side_effects="none"] // CIL[DOC-MICRO logic_summary="Maps work item field values to styled Shadcn Badge components and normalizes is_blocked values so formatted boolean strings do not show false positives" notable_decisions="[]"] // CIL[DOC-LEARNING topic="runtime-type:boolean-formatting" content="admin-data sanitizes boolean fields as display strings (e.g. true -> 'Yes'); isBlockedValue normalizes them before rendering the Blocked badge"] // CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"] // CIL[DOC-STABILITY stability="experimental"] // CIL[DOC-AUDIENCE audience="developer"] import { Badge } from '@core/components/ui/badge' import { cn } from '@core/lib/utils' const statusStyles: Record = { triage: 'bg-yellow-100 text-yellow-800 border-yellow-200', backlog: 'bg-slate-100 text-slate-700 border-slate-200', assigned: 'bg-blue-100 text-blue-800 border-blue-200', in_progress: 'bg-indigo-100 text-indigo-800 border-indigo-200', in_review: 'bg-purple-100 text-purple-800 border-purple-200', resolved: 'bg-green-100 text-green-800 border-green-200', closed: 'bg-gray-100 text-gray-600 border-gray-200', parking: 'bg-zinc-100 text-zinc-500 border-zinc-200', } const priorityStyles: Record = { p0: 'bg-red-100 text-red-800 border-red-200', p1: 'bg-orange-100 text-orange-800 border-orange-200', p2: 'bg-amber-100 text-amber-800 border-amber-200', p3: 'bg-slate-100 text-slate-700 border-slate-200', } const severityStyles: Record = { sev1: 'bg-red-100 text-red-800 border-red-200', sev2: 'bg-orange-100 text-orange-800 border-orange-200', sev3: 'bg-yellow-100 text-yellow-800 border-yellow-200', sev4: 'bg-slate-100 text-slate-700 border-slate-200', } const workTypeStyles: Record = { bug: 'bg-red-100 text-red-800 border-red-200', task: 'bg-blue-100 text-blue-800 border-blue-200', feature: 'bg-green-100 text-green-800 border-green-200', technical_debt: 'bg-purple-100 text-purple-800 border-purple-200', incident_followup: 'bg-rose-100 text-rose-800 border-rose-200', } const teamStyles: Record = { engineering: 'bg-cyan-100 text-cyan-800 border-cyan-200', implementation: 'bg-emerald-100 text-emerald-800 border-emerald-200', unassigned: 'bg-slate-100 text-slate-500 border-slate-200', '*': 'bg-violet-100 text-violet-800 border-violet-200', } function normalize(value?: string | null): string { return (value || '').toString().toLowerCase() } export function StatusBadge({ status, className }: { status?: string; className?: string }) { const key = normalize(status) const label = key ? key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) : 'Unknown' return {label} } export function PriorityBadge({ priority, className }: { priority?: string; className?: string }) { const key = normalize(priority) const label = key ? key.toUpperCase() : '—' return {label} } export function SeverityBadge({ severity, className }: { severity?: string; className?: string }) { const key = normalize(severity) const label = key ? key.toUpperCase() : '—' return {label} } export function WorkTypeBadge({ workType, className }: { workType?: string; className?: string }) { const key = normalize(workType) const label = key ? key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) : 'Unknown' return {label} } export function TeamBadge({ team, className }: { team?: string; className?: string }) { const key = normalize(team) || 'unassigned' const label = key === '*' ? 'All' : key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()) return {label} } export function isBlockedValue(value?: string | boolean | null): boolean { if (typeof value === 'boolean') return value if (value === null || value === undefined) return false return ['true', 'yes', '1', 'on'].includes(String(value).toLowerCase()) } export function BlockedBadge({ className }: { className?: string }) { return Blocked } // CIL[END chunk_id="badges_module_header_1784779659"]