@mieweb/ui 0.11.0-dev.42 → 0.11.0-dev.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/agent/evals/selection.md +3 -3
  2. package/agent/skills/mieweb-ui-catalog/SKILL.md +8 -8
  3. package/agent/skills/mieweb-ui-catalog/selection-guidance.md +13 -13
  4. package/dist/{chunk-EWPNM6OO.js → chunk-3A4N5E6P.js} +19 -4
  5. package/dist/chunk-3A4N5E6P.js.map +1 -0
  6. package/dist/{chunk-IALTKN3Y.js → chunk-67X7L7JX.js} +3 -3
  7. package/dist/{chunk-IALTKN3Y.js.map → chunk-67X7L7JX.js.map} +1 -1
  8. package/dist/{chunk-S2CJ57BX.cjs → chunk-AHT2HRHC.cjs} +19 -3
  9. package/dist/chunk-AHT2HRHC.cjs.map +1 -0
  10. package/dist/{chunk-R4QWCP2T.cjs → chunk-AWJBJYLZ.cjs} +11 -11
  11. package/dist/{chunk-R4QWCP2T.cjs.map → chunk-AWJBJYLZ.cjs.map} +1 -1
  12. package/dist/{chunk-LLIG4X6M.cjs → chunk-BQSREBF2.cjs} +7 -7
  13. package/dist/chunk-BQSREBF2.cjs.map +1 -0
  14. package/dist/{chunk-AKC677ZF.js → chunk-DSGFWT4D.js} +5 -5
  15. package/dist/chunk-DSGFWT4D.js.map +1 -0
  16. package/dist/{chunk-6L7CTEX2.cjs → chunk-GGLISETW.cjs} +4 -4
  17. package/dist/{chunk-6L7CTEX2.cjs.map → chunk-GGLISETW.cjs.map} +1 -1
  18. package/dist/{chunk-2OTPQPJS.js → chunk-IYDPGQJA.js} +3 -3
  19. package/dist/{chunk-2OTPQPJS.js.map → chunk-IYDPGQJA.js.map} +1 -1
  20. package/dist/{chunk-RCTIPBLU.cjs → chunk-MM32RSX4.cjs} +5 -5
  21. package/dist/{chunk-RCTIPBLU.cjs.map → chunk-MM32RSX4.cjs.map} +1 -1
  22. package/dist/{chunk-LWLHCUDP.js → chunk-YWCHUUY3.js} +3 -3
  23. package/dist/{chunk-LWLHCUDP.js.map → chunk-YWCHUUY3.js.map} +1 -1
  24. package/dist/components/EmailEditor/index.cjs +13 -13
  25. package/dist/components/EmailEditor/index.js +4 -4
  26. package/dist/components/RichTextEditor/index.cjs +4 -4
  27. package/dist/components/RichTextEditor/index.d.cts +9 -0
  28. package/dist/components/RichTextEditor/index.d.ts +9 -0
  29. package/dist/components/RichTextEditor/index.js +1 -1
  30. package/dist/components/Textarea/index.cjs +6 -6
  31. package/dist/components/Textarea/index.js +3 -3
  32. package/dist/esheet.cjs +17 -17
  33. package/dist/esheet.js +4 -4
  34. package/dist/index.cjs +58 -58
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +9 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.js +9 -9
  39. package/dist/index.js.map +1 -1
  40. package/dist/kerebron.cjs +4 -4
  41. package/dist/kerebron.js +2 -2
  42. package/package.json +1 -1
  43. package/dist/chunk-AKC677ZF.js.map +0 -1
  44. package/dist/chunk-EWPNM6OO.js.map +0 -1
  45. package/dist/chunk-LLIG4X6M.cjs.map +0 -1
  46. package/dist/chunk-S2CJ57BX.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AllergyList/AllergyList.tsx","../src/components/CodeLookup/context.tsx","../src/components/AllergyList/AllergyManager.tsx","../src/components/Assessment/Assessment.tsx","../src/components/ConditionEditor/ConditionEditor.tsx","../src/components/MedicationList/MedicationList.tsx","../src/components/MedicationList/MedicationEditor.tsx","../src/components/MedicationList/MedicationReconciliation.tsx"],"names":["React","React2","jsx","React3","jsxs","ACTION_META","Fragment","React5","DEFAULT_ACTIONS","React6","m","newId","React7","React8"],"mappings":"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","file":"chunk-LWLHCUDP.js","sourcesContent":["'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport {\n PencilIcon,\n StickyNoteIcon,\n BanIcon,\n PlusIcon,\n AlertCircleIcon,\n GripVerticalIcon,\n} from '../Icons';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Allergy category (FHIR AllergyIntolerance.category). */\nexport type AllergyType = 'drug' | 'food' | 'environmental' | 'other';\n\n/**\n * Mechanism distinction (FHIR AllergyIntolerance.type): a true\n * immune-mediated allergy vs a non-immune intolerance (e.g. GI upset).\n * The distinction matters clinically — an intolerance mislabeled as an\n * allergy causes unnecessary avoidance of first-line drugs.\n */\nexport type AllergyKind = 'allergy' | 'intolerance';\n\n/** Reaction severity (FHIR reaction.severity). */\nexport type AllergySeverity = 'mild' | 'moderate' | 'severe';\n\n/** Coding-system reference for an allergen (RxNorm / FDB / SNOMED …). */\nexport interface AllergyCode {\n system: string;\n code: string;\n display?: string;\n}\n\n/**\n * A single allergy / intolerance.\n *\n * Loosely follows FHIR AllergyIntolerance: allergen (+ optional code),\n * category, reaction, severity, onset, and clinical status.\n */\nexport interface Allergy {\n /** Stable unique id */\n id: string;\n /** Allergen display name, e.g. \"penicillin\" */\n allergen: string;\n /** Category — groups the list */\n type?: AllergyType;\n /** Allergy vs intolerance (FHIR AllergyIntolerance.type; default 'allergy') */\n kind?: AllergyKind;\n /** Reaction description, e.g. \"hives\" */\n reaction?: string;\n /** Reaction severity — drives the badge color */\n severity?: AllergySeverity;\n /** Onset date (display string) */\n onsetDate?: string;\n /** Free-text note */\n note?: string;\n /** Inactive/resolved entries render struck through */\n inactive?: boolean;\n /** Code reference (RxNorm/FDB for drugs, SNOMED otherwise) */\n code?: AllergyCode;\n}\n\n/** Row actions revealed on hover. */\nexport type AllergyAction = 'correct' | 'note' | 'remove';\n\nexport interface AllergyListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Allergies to display (controlled) */\n allergies: Allergy[];\n /**\n * No-known-allergies flag (NKA/NKDA). An empty list is ambiguous —\n * \"not asked\" vs \"asked, none\" — so this is explicit tri-state:\n * undefined = not recorded, true = no known allergies.\n * Ignored when `allergies` is non-empty.\n */\n noKnownAllergies?: boolean;\n /** Called when the no-known-allergies affordance is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Row actions to show (default: all) */\n actions?: AllergyAction[];\n /** Called when a row action is clicked */\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n /**\n * Called with the full new id order after a drag/keyboard reorder.\n * Omit to disable reordering. Drops are restricted to the same\n * category group.\n */\n onReorder?: (allergyIds: string[]) => void;\n /** Custom add UI (e.g. an inline CodeLookup search) */\n addSearch?: React.ReactNode;\n /** Called when the \"Add allergy\" button is clicked (omit to hide) */\n onAdd?: () => void;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst TYPE_ORDER: AllergyType[] = ['drug', 'food', 'environmental', 'other'];\n\nexport const ALLERGY_TYPE_LABELS: Record<AllergyType, string> = {\n drug: 'Drug',\n food: 'Food',\n environmental: 'Environmental',\n other: 'Other',\n};\n\nconst SEVERITY_BADGE: Record<\n AllergySeverity,\n 'danger' | 'warning' | 'secondary'\n> = {\n severe: 'danger',\n moderate: 'warning',\n mild: 'secondary',\n};\n\nconst DEFAULT_ACTIONS: AllergyAction[] = ['correct', 'note', 'remove'];\n\nconst ACTION_META: Record<\n AllergyAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n correct: { label: 'Correct', icon: PencilIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction AllergyRow({\n allergy,\n actions,\n readOnly,\n drag,\n onMove,\n onAction,\n}: {\n allergy: Allergy;\n actions: AllergyAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (allergy: Allergy, dir: -1 | 1) => void;\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n}) {\n const m = useMessages();\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(allergy, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-allergy-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-allergy-id={allergy.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? m('{name}. Alt plus arrow keys to reorder.', {\n name: allergy.allergen,\n })\n : undefined\n }\n {...drag.rowProps(allergy.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, allergy.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span\n className={cn(\n 'text-foreground font-medium',\n allergy.inactive && 'text-muted-foreground line-through'\n )}\n >\n {allergy.allergen}\n </span>\n {allergy.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={allergy.code.display}\n >\n {allergy.code.system} {allergy.code.code}\n </span>\n )}\n {allergy.severity && (\n <Badge variant={SEVERITY_BADGE[allergy.severity]} size=\"sm\">\n {m(allergy.severity)}\n </Badge>\n )}\n {allergy.kind === 'intolerance' && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m('intolerance')}\n </Badge>\n )}\n {allergy.reaction && (\n <span className=\"text-muted-foreground text-sm\">\n — {allergy.reaction}\n </span>\n )}\n {allergy.onsetDate && (\n <span className=\"text-muted-foreground text-xs\">\n {m('since {date}', { date: allergy.onsetDate })}\n </span>\n )}\n {allergy.inactive && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m('inactive')}\n </Badge>\n )}\n {allergy.note && (\n <span className=\"flex w-full basis-full items-center gap-1.5 ps-4\">\n <StickyNoteIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"text-muted-foreground text-xs\">{allergy.note}</span>\n </span>\n )}\n\n {!readOnly && actions.length > 0 && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: allergy.allergen })}\n >\n {actions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(allergy, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// AllergyList\n// =============================================================================\n\n/**\n * Allergy / intolerance list — presentational layer.\n *\n * Controlled: allergies come in via props; every interaction is reported\n * through callbacks. Entries group by category (Drug → Food →\n * Environmental → Other); severity renders as a colored badge; hover (or\n * keyboard-focus) a row for Correct / Notes / Remove.\n *\n * The empty state is explicit tri-state via `noKnownAllergies` (NKA):\n * an empty list shows \"Allergy status not recorded\" until the No Known\n * Allergies affordance is confirmed — an empty list must never silently\n * read as \"no allergies\".\n *\n * Pair with `AllergyManager` for the batteries-included experience.\n */\nexport const AllergyList = React.forwardRef<HTMLDivElement, AllergyListProps>(\n (\n {\n allergies,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n actions = DEFAULT_ACTIONS,\n onAction,\n onReorder,\n addSearch,\n onAdd,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const groups = TYPE_ORDER.map((type) => ({\n type,\n label: ALLERGY_TYPE_LABELS[type],\n items: allergies.filter((a) => (a.type ?? 'other') === type),\n })).filter((g) => g.items.length > 0);\n\n const empty = allergies.length === 0;\n\n // Drag & drop reordering, restricted to the same category group.\n const typeOf = React.useCallback(\n (id: string) => allergies.find((a) => a.id === id)?.type ?? 'other',\n [allergies]\n );\n const drag = useDragReorder({\n ids: allergies.map((a) => a.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n setAnnouncement(m('Allergy list reordered'));\n onReorder(ids);\n },\n canDropOn: (dragged, target) => typeOf(dragged) === typeOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the category. */\n const moveAllergy = React.useCallback(\n (allergy: Allergy, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = allergies.map((a) => a.id);\n const from = ids.indexOf(allergy.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < allergies.length &&\n (allergies[to].type ?? 'other') !== (allergy.type ?? 'other')\n ) {\n to += dir;\n }\n if (to < 0 || to >= allergies.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: allergy.allergen,\n })\n );\n onReorder(ids);\n },\n [allergies, m, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground flex items-center gap-2 text-sm font-semibold tracking-wide uppercase\">\n <AlertCircleIcon\n size={16}\n className=\"text-red-600 dark:text-red-400\"\n />\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-5 px-4 py-4\">\n {empty ? (\n <div className=\"space-y-2\">\n {noKnownAllergies ? (\n <p className=\"text-foreground flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n {m('No known allergies (NKA)')}\n </p>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {m('Allergy status not recorded.')}\n </p>\n )}\n {!readOnly && onNoKnownAllergiesChange && (\n <Button\n variant={noKnownAllergies ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => onNoKnownAllergiesChange(!noKnownAllergies)}\n >\n {noKnownAllergies\n ? m('Clear no-known-allergies')\n : m('Confirm: no known allergies')}\n </Button>\n )}\n </div>\n ) : (\n groups.map(({ type, label, items }) => (\n <section key={type} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n <ul className=\"mt-1\">\n {items.map((allergy) => (\n <AllergyRow\n key={allergy.id}\n allergy={allergy}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveAllergy}\n onAction={onAction}\n />\n ))}\n </ul>\n </section>\n ))\n )}\n\n {!readOnly && (addSearch || onAdd) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add allergy')}\n </span>\n {addSearch}\n {onAdd && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </CardContent>\n\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nAllergyList.displayName = 'AllergyList';\n\nexport default AllergyList;\n","'use client';\n\n/**\n * CodeLookupProvider — supply an offline `CodeLookup` once so the clinical\n * components (allergies, medications, conditions, orders, assessment) default\n * to coded search without per-component wiring.\n *\n * `CodeLookup` ships a module Web Worker the library's tsup build can't bundle,\n * so it can't be imported here — the app injects the component (import it from\n * its own bundler, e.g. Vite/Next) and this context distributes it:\n *\n * ```tsx\n * import { CodeLookupProvider } from '@mieweb/ui';\n * import { CodeLookup } from '…/CodeLookup'; // app bundler resolves the worker\n *\n * <CodeLookupProvider component={CodeLookup} indexUrl=\"/codify\">\n * <App />\n * </CodeLookupProvider>\n * ```\n *\n * Components read the context as their default; an explicit `codeLookup` /\n * `renderCodeSearch` prop overrides it, and `codeLookup={false}` (or\n * `renderCodeSearch={false}`) opts a component out back to plain text.\n *\n * This module is intentionally worker-free (only a `import type` of\n * `CodeLookupProps`, which is erased at build) so it is safe to ship in the\n * main `@mieweb/ui` entry.\n */\n\nimport * as React from 'react';\nimport type { CodeLookupProps } from './CodeLookup';\nimport type { MemoryStorage } from './memoryBackend';\n\n/**\n * The CodeLookup component the provider distributes to consumers.\n *\n * Typed as a bare function component (not `ComponentType`) so it stays\n * structurally assignable into the narrower per-domain lookup configs\n * (`MedicationLookupProps`, `OrderLookupProps`, …) — a `ComponentType` union\n * drags in `ComponentClass.defaultProps`, whose contravariance breaks that\n * assignment. `CodeLookup` is a function component, so this is exact.\n */\nexport type CodeLookupComponent = (\n props: CodeLookupProps\n) => React.ReactElement | null;\n\n/**\n * App-wide defaults for the CodeLookup memory picklist. Naming a signed-in\n * `userId` here turns the picklist on for every lookup below the provider —\n * instances need no wiring, and `memory={false}` (here or per-instance) turns\n * it back off.\n */\nexport interface CodeLookupMemoryDefaults {\n /** Signed-in user the counts belong to. No id, no memory. */\n userId?: string;\n /** Default count-sync endpoint (per-instance prop wins). */\n serverUrl?: string;\n /**\n * Bucket the counts are scoped to. Defaults per instance to that lookup's\n * `domains`, which keeps a med picker and a problem picker apart; set this\n * to pool every lookup into one list instead.\n */\n context?: string;\n /**\n * Where picks are cached on this machine. `'local'` (IndexedDB) asserts a\n * per-user device secured by a browser login; the default `'session'` keeps\n * them in RAM for the tab, which is what a public kiosk wants.\n */\n storage?: MemoryStorage;\n}\n\n/** Resolved lookup wiring a component consumes (from prop or context). */\nexport interface CodeLookupProviderConfig {\n /** The injected CodeLookup component (worker-capable, from the app bundle). */\n component: CodeLookupComponent;\n /** Base URL the codify worker fetches `{locale}/manifest.json` + shards from. */\n indexUrl: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /**\n * Defaults for the memory picklist, or `false` to disable it everywhere\n * below this provider (a public kiosk build). Naming a `userId` here is all\n * an instance needs; `false` overrides a component's own `memory` config.\n */\n memory?: false | CodeLookupMemoryDefaults;\n}\n\n// Internal compositions use the context directly to retain their mounted draft\n// when a host adds or removes lookup wiring. It is not in the public entry.\nexport const CodeLookupContext =\n React.createContext<CodeLookupProviderConfig | null>(null);\n\nexport interface CodeLookupProviderProps {\n /** The CodeLookup component to distribute (import it in your app). */\n component: CodeLookupComponent;\n /** Where the codify index is served (default '/codify'). */\n indexUrl?: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /** Defaults for the memory picklist, or `false` to disable it everywhere. */\n memory?: false | CodeLookupMemoryDefaults;\n children: React.ReactNode;\n}\n\nexport function CodeLookupProvider({\n component,\n indexUrl = '/codify',\n locale = 'en',\n memory,\n children,\n}: CodeLookupProviderProps): React.ReactElement {\n const value = React.useMemo<CodeLookupProviderConfig>(\n () => ({ component, indexUrl, locale, memory }),\n [component, indexUrl, locale, memory]\n );\n return (\n <CodeLookupContext.Provider value={value}>\n {children}\n </CodeLookupContext.Provider>\n );\n}\n\n/**\n * The ambient CodeLookup config supplied by the nearest `CodeLookupProvider`,\n * or `null` when none is mounted (components then fall back to plain text).\n */\nexport function useCodeLookupConfig(): CodeLookupProviderConfig | null {\n return React.useContext(CodeLookupContext);\n}\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\n/**\n * AllergyManager — batteries-included allergy list.\n *\n * Wraps the presentational `AllergyList` with the interaction layer: the\n * allergy editor (Correct / Add with CodeLookup allergen coding), the note\n * dialog, removal, and the no-known-allergies (NKA) flow. Uncontrolled via\n * `defaultAllergies` / controlled via `allergies` + `onChange` — same\n * pattern as `MedicationReconciliation`.\n */\n\nimport * as React from 'react';\nimport {\n AllergyList,\n type Allergy,\n type AllergyAction,\n type AllergyKind,\n type AllergySeverity,\n type AllergyType,\n} from './AllergyList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { Select } from '../Select';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { CodeLookupConfig } from '../MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AllergyManagerProps {\n /** Controlled allergy list (use with `onChange`) */\n allergies?: Allergy[];\n /** Initial allergy list (uncontrolled) */\n defaultAllergies?: Allergy[];\n /** Called with the next list after every mutation */\n onChange?: (allergies: Allergy[]) => void;\n /** No-known-allergies flag (controlled; see AllergyList) */\n noKnownAllergies?: boolean;\n /** Called when NKA is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /**\n * CodeLookup wiring for allergen search (drug shard). Enables both the\n * inline add bar and coded allergens in the editor. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force plain text.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require coded new allergens; non-drug searches use SNOMED substance concepts. */\n requireCode?: boolean;\n /** Render an inline allergen search bar in the add section (requires codeLookup) */\n inlineAddSearch?: boolean;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `alg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Editor dialog\n// =============================================================================\n\nconst TYPE_OPTIONS = [\n { value: 'drug', label: 'Drug' },\n { value: 'food', label: 'Food' },\n { value: 'environmental', label: 'Environmental' },\n { value: 'other', label: 'Other' },\n];\n\nfunction AllergyEditor({\n allergy,\n codeLookup,\n requireCode = false,\n onClose,\n onSave,\n}: {\n allergy?: Allergy;\n codeLookup?: CodeLookupConfig;\n requireCode?: boolean;\n onClose: () => void;\n onSave: (allergy: Allergy) => void;\n}) {\n const m = useMessages();\n const [draft, setDraft] = React.useState<Allergy>(\n () => allergy ?? { id: newId(), allergen: '', type: 'drug' }\n );\n\n const patch = (p: Partial<Allergy>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n // Focus the allergen search / input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n bodyRef.current?.querySelector('input')?.focus();\n }, []);\n\n const hasCode = Boolean(draft.code?.system.trim() && draft.code.code.trim());\n // Only records that were uncoded on entry are exempt from requireCode —\n // an originally coded allergy must keep (or replace) its code.\n const unchangedLegacyAllergen =\n allergy &&\n !allergy.code &&\n draft.allergen === allergy.allergen &&\n (draft.type ?? 'drug') === (allergy.type ?? 'drug');\n const canSave =\n draft.allergen.trim().length > 0 &&\n (!requireCode || hasCode || Boolean(unchangedLegacyAllergen));\n\n // Required coding uses the host's SNOMED substance concepts for non-drug\n // allergens. The host must include those concepts in its condition shards.\n const isDrug = (draft.type ?? 'drug') === 'drug';\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>\n {allergy ? m('Correct Allergy') : m('Add Allergy')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div ref={bodyRef} className=\"contents\">\n <RadioGroup\n name=\"alg-kind\"\n label={m('Mechanism')}\n description={m(\n 'A true immune-mediated allergy, or a non-immune intolerance (e.g. GI upset)'\n )}\n value={draft.kind ?? 'allergy'}\n onValueChange={(v) => patch({ kind: v as AllergyKind })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"allergy\" label={m('Allergy')} />\n <Radio value=\"intolerance\" label={m('Intolerance')} />\n </RadioGroup>\n\n <Select\n label={m('Type')}\n options={TYPE_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={draft.type ?? 'drug'}\n onValueChange={(v) => {\n const type = v as AllergyType;\n // A drug code is wrong on a non-drug allergen.\n patch({\n type,\n ...(type !== (draft.type ?? 'drug') && { code: undefined }),\n });\n }}\n />\n\n {codeLookup && (isDrug || requireCode) ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-search\">{m('Allergen')}</Label>\n <codeLookup.component\n indexUrl={codeLookup.indexUrl}\n locale={codeLookup.locale}\n domains={isDrug ? ['med'] : ['condition']}\n searchCodetypes={isDrug ? undefined : ['SNOMED US']}\n bare\n clearOnSelect={false}\n placeholder={\n isDrug\n ? m('Search drug allergens — e.g. penicillin')\n : m('Search SNOMED allergen substances')\n }\n initialQuery={allergy?.allergen || undefined}\n initialSearch={allergy ? !allergy.code : undefined}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n patch({\n allergen: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n });\n }}\n onFreeText={\n requireCode\n ? undefined\n : (text) => patch({ allergen: text, code: undefined })\n }\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? m('Coded: {system} {code}', {\n system: draft.code.system,\n code: draft.code.code,\n })\n : draft.allergen\n ? m('Uncoded free text: \"{name}\"', {\n name: draft.allergen,\n })\n : requireCode\n ? m('Pick a catalog result to code the allergen')\n : m(\n 'Pick a result to code the allergen, or press Enter for free text'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-name\">{m('Allergen')}</Label>\n <Input\n id=\"alg-name\"\n value={draft.allergen}\n readOnly={requireCode}\n onChange={(e) =>\n patch({ allergen: e.target.value, code: undefined })\n }\n />\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-reaction\">{m('Reaction')}</Label>\n <Input\n id=\"alg-reaction\"\n value={draft.reaction ?? ''}\n onChange={(e) => patch({ reaction: e.target.value })}\n />\n </div>\n\n <RadioGroup\n name=\"alg-severity\"\n label={m('Severity')}\n value={draft.severity ?? ''}\n onValueChange={(v) =>\n patch({ severity: (v || undefined) as AllergySeverity })\n }\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"mild\" label={m('Mild')} />\n <Radio value=\"moderate\" label={m('Moderate')} />\n <Radio value=\"severe\" label={m('Severe')} />\n </RadioGroup>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-onset\">{m('Onset date')}</Label>\n <DateInput\n id=\"alg-onset\"\n value={draft.onsetDate ?? ''}\n onChange={(v) => patch({ onsetDate: v })}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note\">{m('Note')}</Label>\n <Textarea\n id=\"alg-note\"\n value={draft.note ?? ''}\n onChange={(e) => patch({ note: e.target.value })}\n rows={2}\n />\n </div>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n onSave({ ...draft, allergen: draft.allergen.trim() });\n onClose();\n }}\n disabled={!canSave}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// AllergyManager\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; allergy: Allergy }\n | { kind: 'note'; allergy: Allergy }\n | { kind: 'add' }\n | null;\n\n/**\n * @example Patient intake (uncontrolled, inline search, NKA)\n * ```tsx\n * <AllergyManager\n * defaultAllergies={[]}\n * inlineAddSearch\n * codeLookup={{ component: CodeLookup, indexUrl: '/codify' }}\n * noKnownAllergies={nka}\n * onNoKnownAllergiesChange={setNka}\n * onChange={save}\n * />\n * ```\n */\nexport function AllergyManager({\n allergies: controlled,\n defaultAllergies,\n onChange,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n codeLookup,\n requireCode = false,\n inlineAddSearch = false,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n}: AllergyManagerProps): React.JSX.Element {\n const m = useMessages();\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = React.useState<Allergy[]>(\n defaultAllergies ?? []\n );\n const allergies = isControlled ? controlled : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n const [noteDraft, setNoteDraft] = React.useState('');\n\n const commit = (next: Allergy[]) => {\n if (!isControlled) setInternal(next);\n // Any recorded allergy clears the NKA flag.\n if (next.length > 0 && noKnownAllergies) {\n onNoKnownAllergiesChange?.(false);\n }\n onChange?.(next);\n };\n\n const handleAction = (allergy: Allergy, action: AllergyAction) => {\n switch (action) {\n case 'remove':\n commit(allergies.filter((a) => a.id !== allergy.id));\n break;\n case 'correct':\n setDialog({ kind: 'correct', allergy });\n break;\n case 'note':\n setNoteDraft(allergy.note ?? '');\n setDialog({ kind: 'note', allergy });\n break;\n }\n };\n\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder={m(\n 'Search drug allergens to add — use Add for food/environmental'\n )}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n commit([\n ...allergies,\n {\n id: newId(),\n allergen: result.label,\n type: 'drug',\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n },\n ]);\n }}\n onFreeText={\n requireCode\n ? undefined\n : (text) =>\n // this search bar is explicitly for drug allergens — free-text\n // entries carry type 'drug' like the coded path\n commit([\n ...allergies,\n { id: newId(), allergen: text, type: 'drug' },\n ])\n }\n />\n ) : undefined;\n\n return (\n <>\n <AllergyList\n allergies={allergies}\n noKnownAllergies={noKnownAllergies}\n onNoKnownAllergiesChange={onNoKnownAllergiesChange}\n title={title}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...allergies].sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id))\n )\n }\n addSearch={addSearch}\n onAdd={\n requireCode && !effectiveCodeLookup\n ? undefined\n : () => setDialog({ kind: 'add' })\n }\n readOnly={readOnly}\n className={className}\n data-testid={dataTestId}\n />\n\n {dialog && (dialog.kind === 'correct' || dialog.kind === 'add') && (\n <AllergyEditor\n key={dialog.kind === 'correct' ? dialog.allergy.id : 'add'}\n allergy={dialog.kind === 'correct' ? dialog.allergy : undefined}\n codeLookup={effectiveCodeLookup}\n requireCode={requireCode}\n onClose={() => setDialog(null)}\n onSave={(saved) => {\n if (dialog.kind === 'correct') {\n commit(allergies.map((a) => (a.id === saved.id ? saved : a)));\n } else {\n commit([...allergies, saved]);\n }\n }}\n />\n )}\n\n {dialog?.kind === 'note' && (\n <Modal open onOpenChange={(o) => !o && setDialog(null)} size=\"md\">\n <ModalHeader>\n <ModalTitle>{m('Allergy Notes')}</ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.allergy.allergen}\n </p>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note-dlg\">{m('Note')}</Label>\n <Textarea\n id=\"alg-note-dlg\"\n value={noteDraft}\n onChange={(e) => setNoteDraft(e.target.value)}\n rows={4}\n />\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={() => setDialog(null)}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n commit(\n allergies.map((a) =>\n a.id === dialog.allergy.id\n ? { ...a, note: noteDraft.trim() || undefined }\n : a\n )\n );\n setDialog(null);\n }}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n )}\n </>\n );\n}\n\nexport default AllergyManager;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { Input } from '../Input';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n LinkIcon,\n PlusIcon,\n PillIcon,\n TestTubeIcon,\n ScanIcon,\n StethoscopeIcon,\n SendIcon,\n AlertCircleIcon,\n GripVerticalIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n MoreVerticalIcon,\n TrashIcon,\n} from '../Icons';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport {\n CodingChips,\n type ConditionAssertion,\n type ConditionConcern,\n} from '../ProblemList';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n reorderIds,\n} from '../../hooks/useDragReorder';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport {\n useCodeLookupConfig,\n type CodeLookupProviderConfig,\n} from '../CodeLookup/context';\nimport type { CodifyDomain } from '../CodeLookup/CodeLookup';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Order categories that can nest under an assessed problem. */\nexport type OrderType =\n | 'medication'\n | 'lab'\n | 'imaging'\n | 'procedure'\n | 'referral';\n\n/**\n * An order placed this visit. Links to a problem via concernId (durable\n * IndicationLink) — orders without a concernId collect in the unlinked bucket.\n */\nexport interface AssessmentOrder {\n orderId: string;\n type: OrderType;\n /** Display text, e.g. \"insulin glargine 10 units qhs\" */\n display: string;\n /** Durable link to the problem this order is for */\n concernId?: string;\n /** Secondary display text, e.g. status or sig */\n detail?: string;\n /** Coding from the code lookup, when the order was picked from it */\n code?: { fullid: string; codetype: string; fullcode: string };\n /** Urgency — routine when omitted */\n priority?: 'routine' | 'urgent' | 'stat';\n /** When to perform/collect, e.g. 'in 3 months', 'next visit' */\n timing?: string;\n /** Why the order is placed (diagnosis / reason) */\n indication?: string;\n /** Notes to the performing party (lab, radiology, consultant) */\n notes?: string;\n /** Imaging/procedure: body site, e.g. 'chest, PA and lateral', 'left knee' */\n bodySite?: string;\n /** Referral: target specialty or provider */\n referTo?: string;\n}\n\n/** A code picked from a lookup (structurally matches CodifyResult). */\nexport interface OrderCodePick {\n fullid: string;\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/** What the unified add row hands back: a coded pick or free text. */\nexport interface AssessmentAddPick {\n label: string;\n /** Absent for free-text entries */\n code?: { fullid: string; codetype: string; fullcode: string };\n}\n\n/**\n * Render-prop that draws the add-order / add-problem code search. `domains`\n * reflects the user's order-type filter ('auto' = undefined = search\n * everything) and `placeholder` is context-specific; call `onPick` with the\n * chosen code (or `onFreeText` when free text is supported).\n */\nexport type RenderOrderSearch = (args: {\n domains?: string[];\n /** Rank results from these domains first (auto mode: concerns before orders) */\n preferDomains?: string[];\n /** Boost these coding systems (assessments prefer ICD-10 over SNOMED) */\n preferCodetypes?: string[];\n /** Restrict condition results to billable (leaf) ICD-10 codes */\n billableOnly?: boolean;\n placeholder: string;\n onPick: (pick: OrderCodePick) => void;\n /** Present when free-text entry is supported in this context */\n onFreeText?: (text: string) => void;\n}) => React.ReactNode;\n\n/** Infer the order type from the picked code's coding system. */\nexport function orderTypeForCodetype(codetype: string): OrderType {\n const ct = codetype.toUpperCase();\n if (['RXNORM', 'FDB', 'FDB MEDNAME', 'NDC', 'CVX'].includes(ct)) {\n return 'medication';\n }\n if (ct.startsWith('LOINC') || ct.endsWith('ORDER')) return 'lab';\n return 'procedure'; // HCPCS, ICD10PCS, … (imaging is a manual choice)\n}\n\n/**\n * Default order/problem search built from an ambient `CodeLookupProvider`: a\n * bare lookup that forwards the caller's domain/preference hints to the\n * injected CodeLookup. Used when no explicit `renderOrderSearch` prop is given.\n */\nfunction contextOrderSearch(ctx: CodeLookupProviderConfig): RenderOrderSearch {\n const ContextOrderSearch: RenderOrderSearch = ({\n domains,\n preferDomains,\n preferCodetypes,\n billableOnly,\n placeholder,\n onPick,\n onFreeText,\n }) => {\n const Lookup = ctx.component;\n return (\n <Lookup\n indexUrl={ctx.indexUrl}\n locale={ctx.locale}\n domains={domains as CodifyDomain[] | undefined}\n preferDomains={preferDomains as CodifyDomain[] | undefined}\n preferCodetypes={preferCodetypes}\n billableOnly={billableOnly}\n bare\n clearOnSelect\n placeholder={placeholder}\n onSelect={(result) =>\n onPick({\n fullid: result.fullid,\n label: result.label,\n codetype: result.codetype,\n fullcode: result.fullcode,\n })\n }\n onFreeText={onFreeText}\n />\n );\n };\n return ContextOrderSearch;\n}\n\n/** Coding systems that represent a diagnosis/problem rather than an order.\n * Occupational surveillance programs (OSHA/FMCSA/NFPA/FAA) are concerns too —\n * a program joins the problem list and its required orders link under it. */\nexport function isConditionCodetype(codetype: string): boolean {\n const ct = codetype.toUpperCase();\n return (\n ct === 'ICD10' ||\n ct === 'ICD9' ||\n ct === 'SNOMED US' ||\n ct === 'OSHA' ||\n ct === 'FMCSA' ||\n ct === 'NFPA' ||\n ct === 'FAA'\n );\n}\n\n/** Code-lookup domains to search for an order-type filter. */\nexport const ORDER_TYPE_SEARCH_DOMAINS: Record<OrderType, string[]> = {\n medication: ['med', 'vaccine'],\n lab: ['lab'],\n imaging: ['procedure'],\n procedure: ['procedure'],\n referral: ['procedure'],\n};\n\n/** Context-specific search placeholder per order-type filter. */\nconst ORDER_TYPE_PLACEHOLDERS: Record<'auto' | OrderType, string> = {\n auto: 'Search medications, labs, imaging, procedures…',\n medication: 'Search medications… (try \"lasix\")',\n lab: 'Search labs… (try \"a1c\")',\n imaging: 'Search imaging… (try \"chest x\")',\n procedure: 'Search procedures…',\n referral: 'Search referrals & consults…',\n};\n\n/** One assessed problem this visit. */\nexport interface AssessmentItem {\n concernId: string;\n /** Today's assertion for the concern (even a no-change \"addressed today\" one) */\n assertionId: string;\n note?: string;\n}\n\n/** Actions available on an assessed problem. */\nexport type AssessmentAction = 'refine' | 'revise' | 'add-order';\nexport type AssessmentRowAction = AssessmentAction | 'remove' | 'move';\nexport type AssessmentOrderAction = 'edit' | 'remove' | 'move';\nexport type AssessmentAddMode = 'auto' | 'problem' | 'order';\n\nexport interface AssessmentProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Concerns addressed this visit (with their assertion history) */\n concerns: ConditionConcern[];\n /** Assessment entries — one per assessed concern (controlled) */\n items: AssessmentItem[];\n /** Orders placed this visit */\n orders?: AssessmentOrder[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Show the plan (orders nested under each problem). Default true. */\n showPlan?: boolean;\n /** Called when the plan toggle changes (omit to hide the toggle) */\n onShowPlanChange?: (show: boolean) => void;\n /** Called when a row action is clicked */\n onAction?: (item: AssessmentItem, action: AssessmentAction) => void;\n /** Actions available on assessment rows. */\n rowActions?: readonly AssessmentRowAction[];\n /** Actions available on existing order rows. */\n orderActions?: readonly AssessmentOrderAction[];\n /** Modes available in the global add row. */\n addModes?: readonly AssessmentAddMode[];\n /** Accessible label for the global capture form; distinguish multiple editors on one page. */\n addFormLabel?: string;\n /** Rendered at the start of the global add row (e.g. an assertion date input). */\n addFormStart?: React.ReactNode;\n /** Remove a problem from this visit's assessment, not its longitudinal record. */\n onRemoveAssessment?: (item: AssessmentItem) => void;\n /**\n * Called when a new order is created from the inline order form.\n * Enables the \"Add order\" affordances — `item` is null when the order is\n * added from the unlinked bucket. The new order should come back in via\n * `orders` (with `concernId` set to the item's concern when linked).\n */\n onAddOrder?: (\n item: AssessmentItem | null,\n order: { type: OrderType; display: string; code?: AssessmentOrder['code'] }\n ) => void;\n /**\n * Called when a diagnosis (coded or free text) is added as a new problem\n * via the unified add row. Enables it together with renderOrderSearch.\n */\n onAddAssessment?: (pick: AssessmentAddPick) => void;\n /**\n * Render a code-lookup search for the add-order / add-problem forms\n * (dependency-injected so the library build doesn't bundle the lookup's\n * worker — pass e.g. a CodeLookup wired to your index). Defaults to the\n * ambient `CodeLookupProvider`; pass `false` to fall back to free-text\n * order entry.\n */\n renderOrderSearch?: RenderOrderSearch | false;\n /** Called when an unlinked order is linked to a problem — also used when an\n * order is dragged onto another problem (re-link = move) */\n onLinkOrder?: (order: AssessmentOrder, concernId: string) => void;\n /**\n * Called when the user chooses Edit on an order, before the built-in\n * inline form opens. Return true to take over editing — e.g. open a\n * `MedicationEditor` for medication orders — and feed the change back in\n * via `orders`. Anything falsy falls through to the inline display/detail\n * form (when `onEditOrder` is set).\n */\n onEditOrderStart?: (order: AssessmentOrder) => boolean | void;\n /**\n * Called with the edited display/detail when an order's inline edit is\n * saved — enables the Edit action on every order row (any type).\n * Persist and feed the change back in via `orders`.\n */\n onEditOrder?: (\n order: AssessmentOrder,\n changes: { display: string; detail?: string }\n ) => void;\n /** Called when an order is removed — enables the Remove action on order rows */\n onRemoveOrder?: (order: AssessmentOrder) => void;\n /**\n * Called with the full new order-id sequence after an order is dragged to a\n * new position — enables drag & drop reordering of orders within a plan.\n * Orders render in `orders` array order per problem; persist and feed back.\n */\n onReorderOrders?: (orderIds: string[]) => void;\n /**\n * Called with the new concernId order after a problem block is dragged —\n * enables drag & drop reordering of the assessment. The list renders in\n * `items` order; persist and feed the order back in.\n */\n onReorderItems?: (concernIds: string[]) => void;\n /** Hide all controls (display only) */\n readOnly?: boolean;\n /**\n * Initial mode of the unified add row's \"What to add\" selector.\n * Default 'auto' (the pick's coding system decides concern vs order).\n */\n defaultAddMode?: AssessmentAddMode;\n /**\n * Restrict concern searches to billable (leaf) ICD-10 codes — category\n * roots (E11) and SNOMED synonyms are dropped. Forwarded to\n * renderOrderSearch as `billableOnly`.\n */\n billableOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const ORDER_TYPE_META: Record<\n OrderType,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n medication: { label: 'Medication', icon: PillIcon },\n lab: { label: 'Lab', icon: TestTubeIcon },\n imaging: { label: 'Imaging', icon: ScanIcon },\n procedure: { label: 'Procedure', icon: StethoscopeIcon },\n referral: { label: 'Referral', icon: SendIcon },\n};\n\ntype AssessmentToolbarAction = 'refine' | 'revise' | 'add-order';\n\nconst ACTION_META: Record<\n AssessmentToolbarAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n 'add-order': { label: 'Add order', icon: PlusIcon },\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction OrderContent({ order }: { order: AssessmentOrder }) {\n const m = useMessages();\n const meta = ORDER_TYPE_META[order.type];\n const Icon = meta.icon;\n return (\n <span className=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <Tooltip content={m(meta.label)}>\n <Icon size={14} />\n </Tooltip>\n {/* the tooltip is pointer-only — give non-pointer users the label */}\n <span className=\"sr-only\">{m(meta.label)}</span>\n <span className=\"text-foreground\">{order.display}</span>\n {order.priority && order.priority !== 'routine' && (\n <Badge\n variant={order.priority === 'stat' ? 'danger' : 'warning'}\n size=\"sm\"\n >\n {m(order.priority)}\n </Badge>\n )}\n {order.detail && <span className=\"text-xs\">{order.detail}</span>}\n {order.timing && <span className=\"text-xs\">{order.timing}</span>}\n </span>\n );\n}\n\n/** Drag state shared by the order rows and the problem-block drop targets. */\ninterface OrderDrag {\n draggingId: string | null;\n over:\n | { type: 'order'; id: string; after: boolean }\n | { type: 'concern'; concernId: string }\n | null;\n rowProps: (order: AssessmentOrder) => React.HTMLAttributes<HTMLElement>;\n enabled: boolean;\n}\n\n/** Keyboard + menu controls for an order row (the non-pointer path for DnD). */\ninterface OrderControls {\n /** Reorder within the current plan (Alt+↑/↓, menu) */\n moveWithin?: (order: AssessmentOrder, dir: -1 | 1) => void;\n /** Re-link to another problem (Alt+←/→, menu) */\n moveToProblem?: (order: AssessmentOrder, concernId: string) => void;\n /** Take over editing before the inline form opens (returns true = handled) */\n editStart?: (order: AssessmentOrder) => boolean | void;\n /** Save an inline edit of the order's display/detail (menu: Edit) */\n edit?: (\n order: AssessmentOrder,\n changes: { display: string; detail?: string }\n ) => void;\n /** Remove the order (menu: Remove) */\n remove?: (order: AssessmentOrder) => void;\n /** The problem before/after the order's current one, if any */\n adjacentProblem: (\n order: AssessmentOrder,\n dir: -1 | 1\n ) => { concernId: string; label: string } | null;\n /** All problems (for the Move to… menu) */\n targets: { concernId: string; label: string }[];\n}\n\nfunction OrderRow({\n order,\n drag,\n controls,\n}: {\n order: AssessmentOrder;\n drag: OrderDrag;\n controls?: OrderControls;\n}) {\n const m = useMessages();\n const interactive = Boolean(\n controls?.moveWithin ||\n controls?.moveToProblem ||\n controls?.edit ||\n controls?.editStart ||\n controls?.remove\n );\n const canEdit = Boolean(controls?.edit || controls?.editStart);\n const [editing, setEditing] = React.useState<{\n display: string;\n detail: string;\n } | null>(null);\n // Controlled so picking an item closes the menu (it otherwise only closes\n // on outside click/Escape — it would linger behind an editor modal).\n const [menuOpen, setMenuOpen] = React.useState(false);\n\n const pick = (fn: () => void) => () => {\n setMenuOpen(false);\n fn();\n };\n\n const beginEdit = () => {\n // A takeover handler (e.g. MedicationEditor for medication orders) wins;\n // otherwise fall back to the inline display/detail form.\n if (controls?.editStart?.(order)) return;\n if (controls?.edit) {\n setEditing({ display: order.display, detail: order.detail ?? '' });\n }\n };\n\n const saveEdit = () => {\n if (!editing) return;\n const display = editing.display.trim();\n if (display) {\n controls?.edit?.(order, {\n display,\n detail: editing.detail.trim() || undefined,\n });\n }\n setEditing(null);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget || !controls) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n controls.moveWithin?.(order, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.altKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n e.preventDefault();\n // Problem columns are laid out by the document flow, so ←/→ are\n // visual: invert under RTL.\n const back = isRtl(e.currentTarget) ? 'ArrowRight' : 'ArrowLeft';\n const adj = controls.adjacentProblem(order, e.key === back ? -1 : 1);\n if (adj) controls.moveToProblem?.(order, adj.concernId);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between order rows in the same plan\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-order-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Order rows are focus stops so the drag interactions have a full keyboard\n // equivalent: Alt+↑/↓ reorders, Alt+←/→ moves between problems (508).\n <li\n data-order-id={order.orderId}\n tabIndex={interactive && !editing ? 0 : undefined}\n onKeyDown={interactive && !editing ? handleKeyDown : undefined}\n aria-label={\n interactive && !editing\n ? m(\n '{name}. Alt plus up or down to reorder; Alt plus left or right to move to another problem.',\n { name: order.display }\n )\n : undefined\n }\n {...(editing ? {} : drag.rowProps(order))}\n className={cn(\n 'group/order relative flex items-center gap-1.5 py-1',\n 'focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && !editing && 'cursor-grab active:cursor-grabbing',\n drag.draggingId === order.orderId && 'opacity-40',\n drag.over?.type === 'order' &&\n drag.over.id === order.orderId &&\n (drag.over.after\n ? 'shadow-[inset_0_-2px_0_0_var(--color-primary-500,#3b82f6)]'\n : 'shadow-[inset_0_2px_0_0_var(--color-primary-500,#3b82f6)]')\n )}\n >\n {drag.enabled && !editing && (\n <GripVerticalIcon\n size={12}\n aria-hidden\n className=\"text-muted-foreground/40 shrink-0\"\n />\n )}\n {editing ? (\n <div\n role=\"form\"\n aria-label={m('Edit order {name}', { name: order.display })}\n className=\"flex flex-1 flex-wrap items-center gap-1.5\"\n >\n <div className=\"min-w-40 flex-1\">\n <Input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n size=\"sm\"\n value={editing.display}\n onChange={(e) =>\n setEditing((prev) =>\n prev ? { ...prev, display: e.target.value } : prev\n )\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n else if (e.key === 'Escape') setEditing(null);\n }}\n aria-label={m('Order description')}\n className=\"h-7\"\n />\n </div>\n <div className=\"w-40\">\n <Input\n size=\"sm\"\n value={editing.detail}\n onChange={(e) =>\n setEditing((prev) =>\n prev ? { ...prev, detail: e.target.value } : prev\n )\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n else if (e.key === 'Escape') setEditing(null);\n }}\n placeholder={m('detail (sig, timing…)')}\n aria-label={m('Order detail')}\n className=\"h-7 text-xs\"\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={saveEdit}\n disabled={!editing.display.trim()}\n className=\"h-7 text-xs\"\n >\n {m('Save')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setEditing(null)}\n className=\"h-7 text-xs\"\n >\n {m('Cancel')}\n </Button>\n </div>\n ) : (\n <>\n <OrderContent order={order} />\n {interactive && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: order.display })}\n group=\"order\"\n >\n {canEdit && (\n <RowIconButton\n label={m('Edit')}\n icon={PencilIcon}\n size=\"sm\"\n onClick={beginEdit}\n />\n )}\n {(controls?.moveWithin ||\n (controls?.moveToProblem &&\n controls.targets.some(\n (t) => t.concernId !== order.concernId\n ))) && (\n <Dropdown\n open={menuOpen}\n onOpenChange={setMenuOpen}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={m('Move {name}', { name: order.display })}\n className=\"h-7 w-7 shrink-0\"\n >\n <MoreVerticalIcon size={14} />\n </Button>\n }\n placement=\"bottom-end\"\n >\n {controls?.moveWithin && (\n <>\n <DropdownItem\n icon={<ChevronUpIcon size={14} />}\n onClick={pick(() => controls.moveWithin?.(order, -1))}\n >\n {m('Move up')}\n </DropdownItem>\n <DropdownItem\n icon={<ChevronDownIcon size={14} />}\n onClick={pick(() => controls.moveWithin?.(order, 1))}\n >\n {m('Move down')}\n </DropdownItem>\n </>\n )}\n {controls?.moveToProblem &&\n controls.targets.some(\n (t) => t.concernId !== order.concernId\n ) && (\n <>\n {controls.moveWithin && <DropdownSeparator />}\n {controls.targets\n .filter((t) => t.concernId !== order.concernId)\n .map((t) => (\n <DropdownItem\n key={t.concernId}\n icon={<LinkIcon size={14} />}\n onClick={pick(() =>\n controls.moveToProblem?.(order, t.concernId)\n )}\n >\n {m('Move to: {name}', { name: t.label })}\n </DropdownItem>\n ))}\n </>\n )}\n </Dropdown>\n )}\n {controls?.remove && (\n <RowIconButton\n label={m('Remove')}\n icon={TrashIcon}\n size=\"sm\"\n onClick={() => controls.remove?.(order)}\n />\n )}\n </RowActionToolbar>\n )}\n </>\n )}\n </li>\n );\n}\n\n/** Inline per-problem order entry: type filter + code lookup (or free text). */\nfunction AddOrderForm({\n id,\n problemText,\n onSubmit,\n onCancel,\n renderSearch,\n}: {\n id: string;\n problemText: string;\n onSubmit: (order: {\n type: OrderType;\n display: string;\n code?: AssessmentOrder['code'];\n }) => void;\n onCancel: () => void;\n renderSearch?: AssessmentProps['renderOrderSearch'];\n}) {\n const m = useMessages();\n const [type, setType] = React.useState<'auto' | OrderType>(\n renderSearch ? 'auto' : 'medication'\n );\n const [display, setDisplay] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const submit = () => {\n const text = display.trim();\n if (!text) return;\n onSubmit({ type: type === 'auto' ? 'procedure' : type, display: text });\n setDisplay('');\n inputRef.current?.focus();\n };\n\n const handlePick = (pick: OrderCodePick) => {\n onSubmit({\n type: type === 'auto' ? orderTypeForCodetype(pick.codetype) : type,\n display: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n };\n\n return (\n <div\n id={id}\n role=\"form\"\n aria-label={m('Add order for {name}', { name: problemText })}\n className=\"border-border bg-muted/40 ms-2.5 mt-1.5 flex flex-wrap items-center gap-1.5 rounded-md border border-dashed p-2\"\n >\n <select\n aria-label={m('Order type filter')}\n data-slot=\"select-trigger\"\n value={type}\n onChange={(e) => setType(e.target.value as 'auto' | OrderType)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onCancel();\n }}\n className={cn(\n 'border-border bg-background text-foreground rounded-md border px-1.5 text-sm',\n renderSearch ? 'h-10' : 'h-8',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n >\n {renderSearch && <option value=\"auto\">{m('Auto')}</option>}\n {(Object.keys(ORDER_TYPE_META) as OrderType[]).map((t) => (\n <option key={t} value={t}>\n {m(ORDER_TYPE_META[t].label)}\n </option>\n ))}\n </select>\n\n {renderSearch ? (\n <div className=\"min-w-64 flex-1\">\n {renderSearch({\n domains:\n type === 'auto' ? undefined : ORDER_TYPE_SEARCH_DOMAINS[type],\n placeholder: m(ORDER_TYPE_PLACEHOLDERS[type]),\n onPick: handlePick,\n onFreeText: (text) => {\n const t = text.trim();\n if (!t) return;\n onSubmit({\n type: type === 'auto' ? 'procedure' : type,\n display: t,\n });\n },\n })}\n </div>\n ) : (\n <>\n <div className=\"min-w-48 flex-1\">\n <Input\n ref={inputRef}\n size=\"sm\"\n value={display}\n onChange={(e) => setDisplay(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submit();\n else if (e.key === 'Escape') onCancel();\n }}\n placeholder={m('e.g. lisinopril 10 mg tablet — 1 po daily')}\n aria-label={m('Order description')}\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submit}\n disabled={!display.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCancel}\n className={renderSearch ? 'h-10' : 'h-8'}\n >\n {m('Done')}\n </Button>\n </div>\n );\n}\n\n// =============================================================================\n// Assessment\n// =============================================================================\n\n/**\n * Visit-specific Assessment (& Plan). One block per assessed problem showing\n * today's assertion; with the plan enabled, orders linked to the problem (via\n * concernId — the durable IndicationLink) render indented under it. Orders\n * without a problem link collect in an unlinked bucket with a one-click link\n * affordance.\n *\n * Controlled component: concerns, items and orders come in via props; every\n * user interaction is reported through callbacks.\n *\n * @example\n * ```tsx\n * <Assessment\n * concerns={touchedConcerns}\n * items={assessment}\n * orders={orders}\n * onAction={(item, action) => handleAction(item, action)}\n * onLinkOrder={(order, concernId) => linkOrder(order.orderId, concernId)}\n * />\n * ```\n */\nexport const Assessment = React.forwardRef<HTMLDivElement, AssessmentProps>(\n (\n {\n concerns,\n items,\n orders = [],\n title = 'Assessment & plan',\n showPlan = true,\n onShowPlanChange,\n onAction,\n rowActions = [\n ...Object.keys(ACTION_META),\n 'remove',\n 'move',\n ] as AssessmentRowAction[],\n orderActions = ['edit', 'remove', 'move'],\n addModes,\n addFormLabel = 'Add concern or order',\n addFormStart,\n onRemoveAssessment,\n onAddOrder,\n onAddAssessment,\n onLinkOrder,\n onEditOrderStart,\n onEditOrder,\n onRemoveOrder,\n onReorderItems,\n onReorderOrders,\n renderOrderSearch,\n readOnly = false,\n defaultAddMode = 'auto',\n billableOnly = false,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const instanceId = React.useId();\n const [addingFor, setAddingFor] = React.useState<string | null>(null);\n const requestedAddModes: readonly AssessmentAddMode[] = addModes ?? [\n 'auto',\n 'problem',\n 'order',\n ];\n const availableAddModes = requestedAddModes.filter((mode) => {\n if (mode === 'problem') return Boolean(onAddAssessment);\n if (mode === 'order') return Boolean(onAddOrder);\n return Boolean(onAddAssessment && onAddOrder);\n });\n const initialAddMode = availableAddModes.includes(defaultAddMode)\n ? defaultAddMode\n : (availableAddModes[0] ?? defaultAddMode);\n const [selectedAddMode, setSelectedAddMode] =\n React.useState<AssessmentAddMode>(initialAddMode);\n const addMode = availableAddModes.includes(selectedAddMode)\n ? selectedAddMode\n : (availableAddModes[0] ?? defaultAddMode);\n /** Free text typed in auto mode — we must ask what it is before adding */\n const [pendingFreeText, setPendingFreeText] = React.useState<string | null>(\n null\n );\n /** Draft in the no-search fallback input of the unified add row */\n const [freeDraft, setFreeDraft] = React.useState('');\n React.useEffect(() => {\n if (addMode !== 'auto') setPendingFreeText(null);\n }, [addMode]);\n /** Shared free-text routing for the search and the fallback input. */\n const handleAddFreeText = (text: string) => {\n if (addMode === 'problem') {\n onAddAssessment?.({ label: text });\n } else if (addMode === 'order') {\n onAddOrder?.(null, {\n type: 'procedure',\n display: text,\n });\n } else {\n setPendingFreeText(text); // auto: we have to ask\n }\n };\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n // Default the code search to the ambient provider; `false` forces free text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveRenderOrderSearch: RenderOrderSearch | undefined =\n renderOrderSearch === false\n ? undefined\n : (renderOrderSearch ??\n (ambientCodeLookup\n ? contextOrderSearch(ambientCodeLookup)\n : undefined));\n\n const concernById = React.useMemo(\n () => new Map(concerns.map((c) => [c.concernId, c])),\n [concerns]\n );\n\n const assertionOf = (\n item: AssessmentItem\n ): ConditionAssertion | undefined =>\n concernById\n .get(item.concernId)\n ?.assertions.find((a) => a.id === item.assertionId);\n\n const unlinkedOrders = orders.filter(\n (o) => !o.concernId || !items.some((i) => i.concernId === o.concernId)\n );\n\n const toolbarActions = rowActions.filter(\n (action): action is AssessmentToolbarAction =>\n action in ACTION_META &&\n (action === 'add-order'\n ? Boolean(onAddOrder || onAction)\n : Boolean(onAction))\n );\n const showConcernToolbar =\n toolbarActions.length > 0 ||\n (rowActions.includes('remove') && Boolean(onRemoveAssessment));\n\n const drag = useDragReorder({\n ids: items.map((i) => i.concernId),\n onReorder:\n readOnly || !rowActions.includes('move') || !onReorderItems\n ? undefined\n : (ids) => {\n setAnnouncement(m('Assessment concerns reordered'));\n onReorderItems(ids);\n },\n });\n\n // ---- Keyboard + menu equivalents for order drag & drop (508) ----\n const problemLabel = React.useCallback(\n (concernId: string) =>\n concernById\n .get(concernId)\n ?.assertions.find((a) =>\n items.some(\n (i) => i.concernId === concernId && i.assertionId === a.id\n )\n )?.text ?? concernId,\n [concernById, items]\n );\n\n const orderControls: OrderControls | undefined = readOnly\n ? undefined\n : {\n moveWithin:\n orderActions.includes('move') && onReorderOrders\n ? (order, dir) => {\n const planIds = orders\n .filter((o) => o.concernId === order.concernId)\n .map((o) => o.orderId);\n const i = planIds.indexOf(order.orderId);\n const target = planIds[i + dir];\n if (!target) return;\n onReorderOrders(\n reorderIds(\n orders.map((o) => o.orderId),\n order.orderId,\n target,\n dir === 1\n )\n );\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: order.display,\n })\n );\n }\n : undefined,\n moveToProblem:\n orderActions.includes('move') && onLinkOrder\n ? (order, concernId) => {\n onLinkOrder(order, concernId);\n setAnnouncement(\n m('{name} moved to {target}', {\n name: order.display,\n target: problemLabel(concernId),\n })\n );\n }\n : undefined,\n edit:\n orderActions.includes('edit') && onEditOrder\n ? (order, changes) => {\n onEditOrder(order, changes);\n setAnnouncement(\n m('{name} updated', { name: changes.display })\n );\n }\n : undefined,\n editStart: orderActions.includes('edit')\n ? onEditOrderStart\n : undefined,\n remove:\n orderActions.includes('remove') && onRemoveOrder\n ? (order) => {\n onRemoveOrder(order);\n setAnnouncement(m('{name} removed', { name: order.display }));\n }\n : undefined,\n adjacentProblem: (order, dir) => {\n const i = items.findIndex((it) => it.concernId === order.concernId);\n const adj = items[i + dir];\n return adj\n ? { concernId: adj.concernId, label: problemLabel(adj.concernId) }\n : null;\n },\n targets: items.map((it) => ({\n concernId: it.concernId,\n label: problemLabel(it.concernId),\n })),\n };\n\n // ---- Order-level drag & drop: reorder within a plan, or move to another\n // problem by dropping on its block (re-link) or between its orders. ----\n const orderDragEnabled =\n !readOnly &&\n orderActions.includes('move') &&\n Boolean(onReorderOrders || onLinkOrder);\n const [draggingOrderId, setDraggingOrderId] = React.useState<string | null>(\n null\n );\n // dragover/drop can fire before the dragstart state update is visible, so\n // the authoritative dragged id lives in a ref (set synchronously)\n const draggingOrderRef = React.useRef<string | null>(null);\n const [orderOver, setOrderOver] = React.useState<OrderDrag['over']>(null);\n\n const resetOrderDrag = () => {\n draggingOrderRef.current = null;\n setDraggingOrderId(null);\n setOrderOver(null);\n };\n\n /** Drop `dragged` relative to `target` (another order row). */\n const dropOnOrder = (\n dragged: AssessmentOrder,\n target: AssessmentOrder,\n after: boolean\n ) => {\n if (dragged.concernId !== target.concernId && target.concernId) {\n onLinkOrder?.(dragged, target.concernId); // move to the other problem\n setAnnouncement(\n m('{name} moved to {target}', {\n name: dragged.display,\n target: problemLabel(target.concernId),\n })\n );\n } else {\n setAnnouncement(m('{name} reordered', { name: dragged.display }));\n }\n onReorderOrders?.(\n reorderIds(\n orders.map((o) => o.orderId),\n dragged.orderId,\n target.orderId,\n after\n )\n );\n };\n\n const orderDrag: OrderDrag = {\n enabled: orderDragEnabled,\n draggingId: draggingOrderId,\n over: orderOver,\n rowProps: (order) =>\n orderDragEnabled\n ? {\n draggable: true,\n onDragStart: (e) => {\n e.stopPropagation(); // don't start a problem-block drag\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', order.orderId);\n draggingOrderRef.current = order.orderId;\n setDraggingOrderId(order.orderId);\n },\n onDragEnd: (e) => {\n e.stopPropagation();\n resetOrderDrag();\n },\n onDragOver: (e) => {\n const dragged = draggingOrderRef.current;\n if (!dragged || dragged === order.orderId) return;\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'move';\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n setOrderOver({ type: 'order', id: order.orderId, after });\n },\n onDrop: (e) => {\n const draggedId =\n draggingOrderRef.current ??\n e.dataTransfer.getData('text/plain');\n const dragged = orders.find((o) => o.orderId === draggedId);\n if (!dragged || dragged.orderId === order.orderId) return;\n e.preventDefault();\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n dropOnOrder(dragged, order, after);\n resetOrderDrag();\n },\n }\n : {},\n };\n\n /** Problem blocks double as drop targets for orders (move-to-problem). */\n const blockProps = (\n concernId: string\n ): React.HTMLAttributes<HTMLElement> => {\n const itemProps = drag.rowProps(concernId);\n if (!orderDragEnabled) return itemProps;\n return {\n ...itemProps,\n onDragOver: (e) => {\n const draggingOrder = draggingOrderRef.current;\n if (draggingOrder) {\n const dragged = orders.find((o) => o.orderId === draggingOrder);\n if (dragged?.concernId === concernId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setOrderOver({ type: 'concern', concernId });\n return;\n }\n itemProps.onDragOver?.(e);\n },\n onDragLeave: (e) => {\n if (draggingOrderRef.current) {\n setOrderOver((prev) =>\n prev?.type === 'concern' && prev.concernId === concernId\n ? null\n : prev\n );\n return;\n }\n itemProps.onDragLeave?.(e);\n },\n onDrop: (e) => {\n // An order drop on the block moves the order to this problem; any\n // other payload (a problem-block drag) falls through to item reorder.\n const payload =\n draggingOrderRef.current ?? e.dataTransfer.getData('text/plain');\n const dragged = orders.find((o) => o.orderId === payload);\n if (dragged) {\n e.preventDefault();\n if (dragged.concernId !== concernId) {\n onLinkOrder?.(dragged, concernId);\n setAnnouncement(\n m('{name} moved to {target}', {\n name: dragged.display,\n target: problemLabel(concernId),\n })\n );\n }\n resetOrderDrag();\n return;\n }\n itemProps.onDrop?.(e);\n },\n };\n };\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 flex flex-row items-center justify-between border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n {onShowPlanChange && (\n <Checkbox\n size=\"sm\"\n checked={showPlan}\n onChange={(e) => onShowPlanChange(e.target.checked)}\n label={m('Show plan')}\n />\n )}\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-4 px-4 py-4\">\n {items.length === 0 && (\n <p className=\"text-muted-foreground text-sm\">\n {m('No problems assessed this visit.')}\n </p>\n )}\n\n <ol className=\"space-y-3\">\n {items.map((item, index) => {\n const assertion = assertionOf(item);\n if (!assertion) return null;\n const linkedOrders = orders.filter(\n (o) => o.concernId === item.concernId\n );\n const bp = blockProps(item.concernId);\n const formOpen = addingFor === item.concernId;\n const addOrderFormId = `${instanceId}-add-order-${item.concernId}`;\n return (\n <li\n key={item.concernId}\n data-slot=\"assessment-problem\"\n data-concern-id={item.concernId}\n {...bp}\n // While the add-order form is open the block body must yield\n // to text selection/editing — the header row (below) stays a\n // drag handle so the block can still be moved.\n draggable={drag.enabled && !formOpen}\n className={cn(\n 'group border-border/60 relative rounded-md border px-3 py-2',\n drag.enabled &&\n !formOpen &&\n 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, item.concernId),\n orderOver?.type === 'concern' &&\n orderOver.concernId === item.concernId &&\n 'ring-primary-400 bg-primary-50/50 dark:bg-primary-950/50 ring-2'\n )}\n >\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1',\n drag.enabled &&\n formOpen &&\n 'cursor-grab active:cursor-grabbing'\n )}\n // Header row remains a drag source while the form is open\n draggable={drag.enabled && formOpen}\n onDragStart={formOpen ? bp.onDragStart : undefined}\n onDragEnd={formOpen ? bp.onDragEnd : undefined}\n >\n {drag.enabled && (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n )}\n <span className=\"text-muted-foreground text-sm font-semibold tabular-nums\">\n {index + 1}.\n </span>\n <span className=\"text-foreground font-medium\">\n {assertion.text}\n </span>\n {assertion.verificationStatus !== 'confirmed' && (\n <Badge variant=\"warning\" size=\"sm\">\n {m(assertion.verificationStatus)}\n </Badge>\n )}\n <CodingChips coding={assertion.coding} />\n\n {!readOnly && showConcernToolbar && (\n <RowActionToolbar\n label={m('Actions for {name}', {\n name: assertion.text,\n })}\n align=\"top\"\n className={cn(\n 'pointer-fine:group-has-[[data-order-id]:hover]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:hover]:opacity-0',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:opacity-0'\n )}\n >\n {toolbarActions.map((action) => {\n const meta = ACTION_META[action];\n return (\n <RowIconButton\n key={action}\n label={m(meta.label)}\n icon={meta.icon}\n size=\"sm\"\n expanded={\n action === 'add-order' && onAddOrder\n ? addingFor === item.concernId\n : undefined\n }\n controls={\n action === 'add-order' && onAddOrder\n ? addOrderFormId\n : undefined\n }\n onClick={() => {\n if (action === 'add-order' && onAddOrder) {\n setAddingFor((prev) =>\n prev === item.concernId\n ? null\n : item.concernId\n );\n } else {\n onAction?.(item, action);\n }\n }}\n />\n );\n })}\n {rowActions.includes('remove') &&\n onRemoveAssessment && (\n <RowIconButton\n label={m('Remove {name} from assessment', {\n name: assertion.text,\n })}\n icon={TrashIcon}\n size=\"sm\"\n onClick={() => {\n onRemoveAssessment(item);\n setAnnouncement(\n m('{name} removed from assessment', {\n name: assertion.text,\n })\n );\n }}\n />\n )}\n </RowActionToolbar>\n )}\n </div>\n\n {item.note && (\n <p className=\"text-muted-foreground mt-1 ps-6 text-sm\">\n {item.note}\n </p>\n )}\n\n {showPlan && linkedOrders.length > 0 && (\n <ul\n aria-label={m('Plan for {name}', {\n name: assertion.text,\n })}\n className=\"border-border ms-2.5 mt-1.5 border-s ps-4\"\n >\n {linkedOrders.map((order) => (\n <OrderRow\n key={order.orderId}\n order={order}\n drag={orderDrag}\n controls={orderControls}\n />\n ))}\n </ul>\n )}\n\n {!readOnly && onAddOrder && addingFor === item.concernId && (\n <AddOrderForm\n id={addOrderFormId}\n problemText={assertion.text}\n onSubmit={(order) => {\n onAddOrder(item, order);\n setAnnouncement(\n m('{name} added to {target}', {\n name: order.display,\n target: assertion.text,\n })\n );\n setAddingFor(null);\n }}\n onCancel={() => setAddingFor(null)}\n renderSearch={effectiveRenderOrderSearch}\n />\n )}\n </li>\n );\n })}\n </ol>\n\n {/* Unified add row: a dx/program pick adds a concern, anything else\n adds an (unlinked) order — auto-detected from the coding system,\n or forced via the mode dropdown. Free text asks (in auto mode).\n Without a code search, a plain free-text input keeps capture\n available (matching ProblemList's no-catalog fallback). */}\n {!readOnly &&\n availableAddModes.length > 0 &&\n (onAddAssessment || onAddOrder) && (\n <div\n role=\"form\"\n aria-label={m(addFormLabel)}\n className=\"border-border bg-muted/40 flex flex-col items-stretch gap-2 rounded-md border border-dashed p-2 sm:flex-row sm:flex-wrap sm:items-end\"\n >\n {addFormStart}\n <select\n aria-label={m('What to add')}\n data-slot=\"select-trigger\"\n value={addMode}\n onChange={(e) => {\n setSelectedAddMode(e.target.value as typeof addMode);\n setPendingFreeText(null);\n }}\n className={cn(\n 'border-border bg-background text-foreground h-10 rounded-md border px-1.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n >\n {availableAddModes.includes('auto') && (\n <option value=\"auto\">{m('Add (auto)')}</option>\n )}\n {availableAddModes.includes('problem') && onAddAssessment && (\n <option value=\"problem\">{m('Add concern')}</option>\n )}\n {availableAddModes.includes('order') && onAddOrder && (\n <option value=\"order\">{m('Add order')}</option>\n )}\n </select>\n <div className=\"min-w-64 flex-1\">\n {effectiveRenderOrderSearch ? (\n effectiveRenderOrderSearch({\n domains:\n addMode === 'problem'\n ? ['condition', 'occupational']\n : addMode === 'order'\n ? ['med', 'lab', 'procedure', 'vaccine']\n : undefined, // auto: everything — the pick decides\n // auto: concerns rank ahead of orders — surveillance\n // programs first (rare, high-value hits like \"dot\" or\n // \"hearing\"), then diagnoses, then meds/labs/procedures.\n // concern mode: programs still lead the diagnoses.\n preferDomains:\n addMode === 'auto'\n ? ['occupational', 'condition']\n : addMode === 'problem'\n ? ['occupational']\n : undefined,\n // assessments code in ICD-10: boost it over SNOMED\n preferCodetypes:\n addMode !== 'order' ? ['ICD10'] : undefined,\n billableOnly: addMode !== 'order' && billableOnly,\n placeholder: m(\n addMode === 'problem'\n ? 'Search diagnoses & programs… (try \"chf\" or \"hearing conservation\")'\n : addMode === 'order'\n ? 'Search medications, labs, imaging, procedures…'\n : 'Add concern or order… (a diagnosis or surveillance program becomes a concern; meds, labs & imaging become orders)'\n ),\n onPick: (pick) => {\n const asProblem =\n addMode === 'problem' ||\n (addMode === 'auto' &&\n isConditionCodetype(pick.codetype) &&\n Boolean(onAddAssessment));\n if (asProblem) {\n onAddAssessment?.({\n label: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n } else {\n onAddOrder?.(null, {\n type: orderTypeForCodetype(pick.codetype),\n display: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n }\n },\n onFreeText: handleAddFreeText,\n })\n ) : (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={freeDraft}\n onChange={(e) => setFreeDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && freeDraft.trim()) {\n handleAddFreeText(freeDraft.trim());\n setFreeDraft('');\n }\n }}\n placeholder={m('Type a name and press Enter…')}\n aria-label={m('Add as free text')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-10 w-full rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n handleAddFreeText(freeDraft.trim());\n setFreeDraft('');\n }}\n disabled={!freeDraft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-10\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n </div>\n\n {/* Free text in auto mode: ask what it is */}\n {addMode === 'auto' && pendingFreeText !== null && (\n <div\n role=\"group\"\n aria-label={m('Add \"{name}\" as', { name: pendingFreeText })}\n className=\"flex w-full flex-wrap items-center gap-1.5 ps-1\"\n >\n <span className=\"text-muted-foreground text-sm\">\n {m('Add')}{' '}\n <span className=\"text-foreground font-medium\">\n “{pendingFreeText}”\n </span>{' '}\n {m('as:')}\n </span>\n {onAddAssessment && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => {\n onAddAssessment({ label: pendingFreeText });\n setPendingFreeText(null);\n }}\n >\n {m('Concern')}\n </Button>\n )}\n {onAddOrder && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => {\n onAddOrder(null, {\n type: 'procedure',\n display: pendingFreeText,\n });\n setPendingFreeText(null);\n }}\n >\n {m('Order')}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => setPendingFreeText(null)}\n >\n {m('Cancel')}\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Unlinked orders bucket — only takes space once something is in it */}\n {showPlan && unlinkedOrders.length > 0 && (\n <section\n aria-label={m('Orders not linked to a concern')}\n className=\"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 dark:border-amber-700 dark:bg-amber-950\"\n >\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-amber-900 dark:text-amber-200\">\n <AlertCircleIcon size={14} />\n {m('Orders not linked to a concern')}\n </h4>\n <ul className=\"mt-1\">\n {unlinkedOrders.map((order) => (\n // Same row component as linked orders: focusable, Alt+arrow\n // keyboard moves, and the Move menu (508 parity with drag)\n <OrderRow\n key={order.orderId}\n order={order}\n drag={orderDrag}\n controls={orderControls}\n />\n ))}\n </ul>\n </section>\n )}\n </CardContent>\n\n {/* Move/reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nAssessment.displayName = 'Assessment';\n\nexport default Assessment;\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { useMessages } from '../../utils/messages';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { DateInput } from '../DateInput';\nimport { Input } from '../Input';\nimport { Radio, RadioGroup } from '../Radio';\nimport { Textarea } from '../Textarea';\nimport { Select } from '../Select';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport {\n PlusIcon,\n TrashIcon,\n AlertTriangleIcon,\n HelpCircleIcon,\n} from '../Icons';\nimport {\n currentAssertion,\n type ConcernRelationship,\n type ConditionAssertion,\n type ConditionCoding,\n type ConditionConcern,\n type FieldUncertainty,\n type Uncertainty,\n type UncertainConditionField,\n type VerificationStatus,\n} from '../ProblemList';\nimport {\n useCodeLookupConfig,\n type CodeLookupProviderConfig,\n} from '../CodeLookup/context';\nimport {\n dateToDisplayFormat,\n displayFormatToDateString,\n isValidDate,\n} from '../../utils/date';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** What the editor is doing. Determines the resulting changeType / operation. */\nexport type ConditionEditorMode =\n | 'add'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'relate';\n\n/** Draft assertion returned by onSave — id/date assignment is the caller's job. */\nexport type ConditionAssertionDraft = Omit<ConditionAssertion, 'id' | 'date'>;\n\n/** A code picked from an injected lookup (structurally matches CodifyResult). */\nexport interface ConditionCodePick {\n fullid: string;\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/**\n * Render-prop that draws the coding-section code search. Picking a result\n * calls `onPick` (appends a coding row, fills an empty name); free text calls\n * `onFreeText` (fills the name).\n */\nexport type RenderConditionCodeSearch = (args: {\n placeholder: string;\n onPick: (pick: ConditionCodePick) => void;\n onFreeText: (text: string) => void;\n}) => React.ReactNode;\n\nexport interface ConditionEditorProps {\n /** Editor operation */\n mode: ConditionEditorMode;\n /** Whether the dialog is open */\n open: boolean;\n /** Called when the dialog requests closing (cancel / overlay / Esc) */\n onOpenChange: (open: boolean) => void;\n /** The concern being refined / revised / related (omit for add) */\n concern?: ConditionConcern;\n /** Concerns available as relate targets (mode 'relate') */\n relatableConcerns?: ConditionConcern[];\n /** Called with the new assertion draft (modes add / refine / revise) */\n onSave?: (draft: ConditionAssertionDraft) => void;\n /** Called with the relationship (mode 'relate') */\n onRelate?: (relationship: ConcernRelationship) => void;\n /** Called with a quick progress note (mode 'observe', or the observation box in other modes) */\n onAddObservation?: (text: string) => void;\n /**\n * Render a code-lookup search for the coding section (dependency-injected\n * so the library build doesn't bundle the lookup's worker — pass e.g. a\n * `CodeLookup` wired to your index, the same pattern as Assessment's\n * `renderOrderSearch`). Picking a result appends a coding row and fills an\n * empty problem name; free text fills the problem name. Defaults to the\n * ambient `CodeLookupProvider` (condition shard, ICD-10 preferred); pass\n * `false` for manual code entry only.\n */\n renderCodeSearch?: RenderConditionCodeSearch | false;\n /** Additional CSS classes for the dialog content */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst MODE_META: Record<\n ConditionEditorMode,\n { title: string; changeType: ConditionAssertion['changeType'] }\n> = {\n add: { title: 'Add problem', changeType: undefined },\n observe: { title: 'Progress observation', changeType: undefined },\n refine: { title: 'Refine problem', changeType: 'refinement' },\n revise: { title: 'Revise problem', changeType: 'revision' },\n relate: { title: 'Relate problem', changeType: undefined },\n};\n\nconst CODING_SYSTEMS = ['SNOMED', 'ICD-10-CM', 'ICD-11'] as const;\n\nconst VERIFICATION_OPTIONS: { value: VerificationStatus; label: string }[] = [\n { value: 'unconfirmed', label: 'Unconfirmed' },\n { value: 'provisional', label: 'Provisional' },\n { value: 'differential', label: 'Differential' },\n { value: 'confirmed', label: 'Confirmed' },\n];\n\nconst RELATIONSHIP_OPTIONS: {\n value: ConcernRelationship['type'];\n label: string;\n}[] = [\n { value: 'caused-by', label: 'Caused by' },\n { value: 'evolved-from', label: 'Evolved from' },\n { value: 'differential-sibling', label: 'Differential sibling' },\n { value: 'complication-of', label: 'Complication of' },\n];\n\nconst SEVERITIES = ['mild', 'moderate', 'severe'] as const;\nconst CONFIDENCES = ['low', 'medium', 'high'] as const;\n\n/** Map an index codetype (e.g. 'ICD10') onto the ConditionCoding system. */\nexport function normalizeConditionCodingSystem(codetype: string): string {\n const ct = codetype.toUpperCase().replace(/[^A-Z0-9]/g, '');\n if (ct === 'ICD10' || ct === 'ICD10CM') return 'ICD-10-CM';\n if (ct === 'ICD11') return 'ICD-11';\n if (ct === 'SNOMED' || ct === 'SNOMEDCT' || ct === 'SNOMEDUS') {\n return 'SNOMED';\n }\n return codetype;\n}\n\nfunction withSinglePrimary(coding: ConditionCoding[]): ConditionCoding[] {\n if (coding.length === 0) return coding;\n const primaryIndex = coding.findIndex((entry) => entry.primary);\n const selectedIndex = primaryIndex >= 0 ? primaryIndex : 0;\n return coding.map((entry, index) => ({\n ...entry,\n primary: index === selectedIndex,\n }));\n}\n\n/**\n * Default code search built from an ambient `CodeLookupProvider`: a bare\n * condition-shard lookup (ICD-10 preferred) wired to the editor's onPick /\n * onFreeText. Used when no explicit `renderCodeSearch` prop is given.\n */\nfunction contextConditionCodeSearch(\n ctx: CodeLookupProviderConfig\n): RenderConditionCodeSearch {\n const ContextConditionCodeSearch: RenderConditionCodeSearch = ({\n placeholder,\n onPick,\n onFreeText,\n }) => {\n const Lookup = ctx.component;\n return (\n <Lookup\n indexUrl={ctx.indexUrl}\n locale={ctx.locale}\n domains={['condition']}\n preferCodetypes={['ICD10']}\n bare\n clearOnSelect={false}\n placeholder={placeholder}\n onSelect={(result) =>\n onPick({\n fullid: result.fullid,\n label: result.label,\n codetype: result.codetype,\n fullcode: result.fullcode,\n })\n }\n onFreeText={onFreeText}\n />\n );\n };\n return ContextConditionCodeSearch;\n}\n\n// =============================================================================\n// Field uncertainty affordance (§4.1 three-state rule)\n// =============================================================================\n\n/**\n * Per-field uncertainty control: an \"Unknown\" toggle (explicitly unknown —\n * distinct from untouched) and a low/med/high confidence toggle for values\n * that are present but soft.\n */\nfunction FieldFlag({\n label,\n value,\n onChange,\n hasValue,\n}: {\n label: string;\n value?: FieldUncertainty;\n onChange: (f: FieldUncertainty | undefined) => void;\n hasValue: boolean;\n}) {\n const m = useMessages();\n const unknown = value?.known === false;\n return (\n <span\n role=\"group\"\n aria-label={m('Certainty for {label}', { label })}\n className=\"flex items-center gap-1\"\n >\n <button\n type=\"button\"\n aria-pressed={unknown}\n onClick={() =>\n onChange(\n unknown ? undefined : { known: false, reason: 'asked-unknown' }\n )\n }\n className={cn(\n 'rounded-full border px-2 py-0.5 text-[11px] font-medium transition-colors',\n unknown\n ? 'border-warning/50 bg-warning/10 text-warning-800 dark:text-warning-200'\n : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {m('Unknown')}\n </button>\n {hasValue &&\n !unknown &&\n CONFIDENCES.map((c) => {\n const active = value?.known !== false && value?.confidence === c;\n return (\n <button\n key={c}\n type=\"button\"\n aria-pressed={active}\n aria-label={m('{label} confidence {confidence}', {\n label,\n confidence: m(c),\n })}\n onClick={() =>\n onChange(active ? undefined : { known: true, confidence: c })\n }\n className={cn(\n 'rounded-full border px-1.5 py-0.5 text-[11px] transition-colors',\n active\n ? 'border-primary-400 bg-primary-100 text-primary-900 dark:border-primary-600 dark:bg-primary-950 dark:text-primary-200'\n : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {m(c)}\n </button>\n );\n })}\n </span>\n );\n}\n\n// =============================================================================\n// Observation history — quick progress notes over time\n// =============================================================================\n\nfunction ObservationHistory({ concern }: { concern?: ConditionConcern }) {\n const m = useMessages();\n const observations = concern?.observations;\n if (!observations?.length) return null;\n return (\n <section aria-label={m('Past observations')} className=\"space-y-1\">\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h4>\n <ol className=\"border-border max-h-40 space-y-1.5 overflow-y-auto rounded-md border p-2\">\n {[...observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground flex-1\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\n// =============================================================================\n// ConditionEditor\n// =============================================================================\n\n/**\n * Dialog editor for condition assertions — the condition analog of the\n * planned MedicationEditor. Capture-first: only the problem name is required;\n * coding, severity, and onset are progressive enrichment. Every optional\n * field carries the §4.1 three-state affordance (confident / uncertain /\n * explicitly unknown), written to the assertion's uncertainty block.\n *\n * Modes:\n * - `add` — new concern, first assertion\n * - `observe` — quick progress note on the concern; shows the full observation\n * history over time\n * - `refine` — new assertion, changeType 'refinement' (or 'progression')\n * - `revise` — new assertion, changeType 'revision'; warns that the prior\n * assertion will be refuted\n * - `relate` — picks a relationship type + target concern\n */\nexport function ConditionEditor({\n mode,\n open,\n onOpenChange,\n concern,\n relatableConcerns = [],\n onSave,\n onRelate,\n onAddObservation,\n renderCodeSearch,\n className,\n 'data-testid': dataTestId,\n}: ConditionEditorProps) {\n const m = useMessages();\n const prior = concern ? currentAssertion(concern) : undefined;\n\n // Default the code search to the ambient provider; `false` forces manual\n // code entry only.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveRenderCodeSearch: RenderConditionCodeSearch | undefined =\n renderCodeSearch === false\n ? undefined\n : (renderCodeSearch ??\n (ambientCodeLookup\n ? contextConditionCodeSearch(ambientCodeLookup)\n : undefined));\n\n const [text, setText] = React.useState('');\n const [coding, setCoding] = React.useState<ConditionCoding[]>([]);\n const [verification, setVerification] =\n React.useState<VerificationStatus>('confirmed');\n const [severity, setSeverity] =\n React.useState<ConditionAssertion['severity']>();\n const [onsetDate, setOnsetDate] = React.useState('');\n const [onsetFuzzy, setOnsetFuzzy] = React.useState('');\n const [note, setNote] = React.useState('');\n const [progression, setProgression] = React.useState(false);\n const [fields, setFields] = React.useState<\n Partial<Record<UncertainConditionField, FieldUncertainty>>\n >({});\n const [relType, setRelType] =\n React.useState<ConcernRelationship['type']>('caused-by');\n const [relTarget, setRelTarget] = React.useState('');\n const [observation, setObservation] = React.useState('');\n\n // Seed from the prior assertion whenever the dialog opens (or the mode /\n // concern changes while open — stale values must not carry over)\n React.useEffect(() => {\n if (!open) return;\n setText(prior?.text ?? '');\n setCoding(withSinglePrimary(prior?.coding ?? []));\n setVerification(\n mode === 'add'\n ? 'unconfirmed'\n : (prior?.verificationStatus ?? 'confirmed')\n );\n setSeverity(prior?.severity);\n const priorOnsetDate = prior?.onset?.date;\n setOnsetDate(priorOnsetDate ? dateToDisplayFormat(priorOnsetDate) : '');\n setOnsetFuzzy(priorOnsetDate ? '' : (prior?.onset?.fuzzy ?? ''));\n setNote('');\n setProgression(false);\n setFields(prior?.uncertainty?.fields ?? {});\n setRelType('caused-by');\n setRelTarget('');\n setObservation('');\n }, [open, mode, prior]);\n\n const setField =\n (field: UncertainConditionField) => (f: FieldUncertainty | undefined) =>\n setFields((prev) => {\n const next = { ...prev };\n if (f) next[field] = f;\n else delete next[field];\n return next;\n });\n\n const updateCoding = (i: number, patch: Partial<ConditionCoding>) =>\n setCoding((prev) => prev.map((c, j) => (j === i ? { ...c, ...patch } : c)));\n\n // Coding explicitly marked unknown: handleSave() drops the codes, so the\n // coding inputs disable to keep the UI and the saved output consistent.\n const codingUnknown = fields.coding?.known === false;\n const hasInvalidOnsetDate =\n fields.onset?.known !== false &&\n Boolean(onsetDate) &&\n !isValidDate(onsetDate);\n\n /** A pick from the injected lookup — appends a coding row, fills an empty\n * name, and clears a contradictory \"coding unknown\" flag. */\n const handleCodePick = (pick: ConditionCodePick) => {\n const system = normalizeConditionCodingSystem(pick.codetype);\n setCoding((prev) =>\n prev.some((c) => c.system === system && c.code === pick.fullcode)\n ? prev\n : withSinglePrimary([\n ...prev,\n { system, code: pick.fullcode, display: pick.label },\n ])\n );\n setText((prev) => prev || pick.label);\n setFields((prev) => {\n if (prev.coding?.known !== false) return prev;\n const next = { ...prev };\n delete next.coding;\n return next;\n });\n };\n\n const handleSave = () => {\n if (mode === 'relate') {\n if (!relTarget) return;\n onRelate?.({ type: relType, concernId: relTarget });\n onOpenChange(false);\n return;\n }\n if (mode === 'observe') {\n if (!observation.trim()) return;\n onAddObservation?.(observation.trim());\n onOpenChange(false);\n return;\n }\n if (!text.trim() || hasInvalidOnsetDate) return;\n if (observation.trim()) onAddObservation?.(observation.trim());\n const uncertainty: Uncertainty | undefined =\n Object.keys(fields).length > 0 ? { fields } : undefined;\n onSave?.({\n text: text.trim(),\n // write the trimmed values back — whitespace in codes breaks equality\n // checks downstream. A field marked explicitly unknown must not carry a\n // value (e.g. one seeded from the prior assertion): value + \"unknown\"\n // would be contradictory, so unknown wins and the value is dropped.\n coding:\n fields.coding?.known === false\n ? []\n : withSinglePrimary(\n coding\n .filter((c) => c.code.trim())\n .map((c) => ({\n ...c,\n code: c.code.trim(),\n display: c.display?.trim() || undefined,\n mappedFrom: c.mappedFrom?.trim() || undefined,\n }))\n ),\n verificationStatus: verification,\n changeType:\n mode === 'refine'\n ? progression\n ? 'progression'\n : 'refinement'\n : MODE_META[mode].changeType,\n supersedes: prior?.id,\n severity: fields.severity?.known === false ? undefined : severity,\n onset:\n fields.onset?.known === false\n ? undefined\n : onsetDate || onsetFuzzy\n ? {\n date: onsetDate\n ? displayFormatToDateString(onsetDate)\n : undefined,\n fuzzy: onsetFuzzy || undefined,\n }\n : undefined,\n uncertainty,\n note: note.trim() || undefined,\n });\n onOpenChange(false);\n };\n\n const saveDisabled =\n mode === 'relate'\n ? !relTarget\n : mode === 'observe'\n ? !observation.trim()\n : !text.trim() || hasInvalidOnsetDate;\n\n return (\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n size=\"2xl\"\n className={className}\n >\n <ModalHeader>\n <ModalTitle>\n {m(MODE_META[mode].title)}\n {prior ? ` — ${prior.text}` : ''}\n </ModalTitle>\n </ModalHeader>\n <ModalBody data-testid={dataTestId} className=\"space-y-5\">\n <div className=\"space-y-5\">\n {mode === 'revise' && (\n <div\n role=\"alert\"\n className=\"border-warning/30 bg-warning/10 text-warning-800 dark:text-warning-200 flex items-start gap-2 rounded-md border px-3 py-2 text-sm\"\n >\n <AlertTriangleIcon size={16} />\n <span>\n {m(\n 'Revising marks the prior assertion refuted (it was never true) — history is preserved on the timeline. Use Refine instead if the prior was correct but less specific.'\n )}\n </span>\n </div>\n )}\n\n {mode === 'relate' ? (\n <>\n <Select\n label={m('Relationship')}\n options={RELATIONSHIP_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={relType}\n onValueChange={(v) =>\n setRelType(v as ConcernRelationship['type'])\n }\n />\n <Select\n label={m('Related problem')}\n placeholder={m('Select a problem…')}\n options={relatableConcerns\n .filter((c) => c.concernId !== concern?.concernId)\n .map((c) => ({\n value: c.concernId,\n label: currentAssertion(c)?.text ?? c.concernId,\n }))}\n value={relTarget}\n onValueChange={setRelTarget}\n />\n </>\n ) : mode === 'observe' ? (\n <>\n <ObservationHistory concern={concern} />\n <Textarea\n label={m('New observation')}\n value={observation}\n onChange={(e) => setObservation(e.target.value)}\n placeholder={m(\n 'e.g. BP improving on current regimen; patient reports better sleep'\n )}\n rows={3}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </>\n ) : (\n <>\n {/* Past progress observations — visible while editing an existing concern */}\n {(mode === 'refine' || mode === 'revise') && (\n <ObservationHistory concern={concern} />\n )}\n\n {/* Capture-first: name is the only required field. In add mode\n with an injected lookup, name + coding are ONE input — pick\n a code (sets both) or enter free text (name only). */}\n {mode === 'add' && effectiveRenderCodeSearch && !text.trim() ? (\n <div className=\"space-y-1\">\n <span className=\"text-foreground block text-sm font-medium\">\n {m('Problem name')}\n <span className=\"text-destructive ms-1\" aria-hidden=\"true\">\n *\n </span>\n </span>\n {effectiveRenderCodeSearch({\n placeholder: m(\n 'Search conditions — or type a name and press Enter…'\n ),\n onPick: handleCodePick,\n onFreeText: (t) => setText(t.trim()),\n })}\n <p className=\"text-muted-foreground text-xs\">\n {m(\n 'Picking a code fills the name and coding together; free text is fine — codes can be added any time.'\n )}\n </p>\n </div>\n ) : (\n <Input\n label={m('Problem name')}\n required\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={m(\n 'e.g. Type 1 diabetes mellitus with neuropathy'\n )}\n />\n )}\n\n {mode === 'refine' && (\n <Checkbox\n size=\"sm\"\n checked={progression}\n onChange={(e) => setProgression(e.target.checked)}\n label={m(\n 'Disease progressed (e.g. new complication) rather than a more specific diagnosis'\n )}\n />\n )}\n\n {/* Coding — progressive enrichment, never required */}\n <fieldset className=\"space-y-3\">\n <legend className=\"sr-only\">{m('Coding')}</legend>\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"flex flex-wrap items-center gap-2 text-sm font-medium\">\n {m('Coding')}\n <FieldFlag\n label={m('Coding')}\n value={fields.coding}\n onChange={setField('coding')}\n hasValue={coding.length > 0}\n />\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={codingUnknown}\n onClick={() =>\n setCoding((prev) => [\n ...prev,\n {\n system: 'SNOMED',\n code: '',\n primary: prev.length === 0,\n },\n ])\n }\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8 shrink-0 text-xs\"\n >\n {m('Add code')}\n </Button>\n </div>\n {effectiveRenderCodeSearch &&\n !(mode === 'add' && !text.trim()) && (\n <div>\n {effectiveRenderCodeSearch({\n placeholder: m('Search codes — ICD-10-CM / SNOMED…'),\n onPick: handleCodePick,\n onFreeText: (t) => setText((prev) => prev || t),\n })}\n </div>\n )}\n {coding.length === 0 && (\n <p className=\"text-muted-foreground text-xs\">\n {m(\n 'Optional — a name-only problem is valid. Codes can be added any time.'\n )}\n </p>\n )}\n {coding.length > 0 && (\n <div\n aria-hidden=\"true\"\n data-slot=\"condition-coding-header\"\n className=\"text-muted-foreground hidden grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem] items-center gap-2 px-1 text-xs font-medium sm:!grid\"\n >\n <span>{m('System')}</span>\n <span>{m('Code')}</span>\n <span>{m('Display')}</span>\n <span className=\"text-center\">{m('Primary code')}</span>\n <span className=\"sr-only\">{m('Actions')}</span>\n </div>\n )}\n {coding.length > 0 && (\n <RadioGroup\n name=\"primary-coding\"\n label={m('Primary display code')}\n value={String(\n Math.max(\n 0,\n coding.findIndex((entry) => entry.primary)\n )\n )}\n onValueChange={(value) => {\n const selectedIndex = Number(value);\n setCoding((prev) =>\n prev.map((entry, index) => ({\n ...entry,\n primary: index === selectedIndex,\n }))\n );\n }}\n size=\"sm\"\n className=\"gap-2 [&_[data-slot=radio-group-items]]:gap-2 sm:[&_[data-slot=radio-group-legend]]:sr-only\"\n >\n {coding.map((c, i) => (\n <div\n key={i}\n data-slot=\"condition-coding-row\"\n className=\"border-border/70 grid grid-cols-1 gap-2 rounded-md border p-2 sm:grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem] sm:items-center sm:border-0 sm:p-0\"\n >\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('System')}\n </span>\n <Select\n aria-label={m('Coding system {index}', {\n index: i + 1,\n })}\n options={CODING_SYSTEMS.map((s) => ({\n value: s,\n label: s,\n }))}\n value={c.system}\n onValueChange={(v) =>\n updateCoding(i, { system: v })\n }\n disabled={codingUnknown}\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('Code')}\n </span>\n <Input\n aria-label={m('Code {index}', { index: i + 1 })}\n value={c.code}\n onChange={(e) =>\n updateCoding(i, { code: e.target.value })\n }\n placeholder={m('Code')}\n disabled={codingUnknown}\n className=\"font-mono\"\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('Display')}\n </span>\n <Input\n aria-label={m('Display {index}', { index: i + 1 })}\n value={c.display ?? ''}\n onChange={(e) =>\n updateCoding(i, { display: e.target.value })\n }\n placeholder={m('Display')}\n disabled={codingUnknown}\n />\n </div>\n <div className=\"flex min-h-10 items-center gap-1.5 text-xs sm:justify-center\">\n <Radio\n value={String(i)}\n aria-label={m('Primary code: {system} {code}', {\n system: c.system,\n code:\n c.code || m('row {index}', { index: i + 1 }),\n })}\n disabled={codingUnknown}\n />\n <span className=\"sm:sr-only\">\n {m('Primary code')}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={m('Remove code {index}', {\n index: i + 1,\n })}\n disabled={codingUnknown}\n onClick={() =>\n setCoding((prev) =>\n withSinglePrimary(\n prev.filter((_, index) => index !== i)\n )\n )\n }\n className=\"h-10 w-10 justify-self-start sm:justify-self-center\"\n >\n <TrashIcon size={14} />\n </Button>\n </div>\n ))}\n </RadioGroup>\n )}\n </fieldset>\n\n <Select\n label={m('Verification status')}\n options={VERIFICATION_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={verification}\n onValueChange={(v) => setVerification(v as VerificationStatus)}\n />\n\n {/* Severity value and its three-state certainty affordance */}\n <div className=\"flex flex-wrap items-end gap-x-4 gap-y-2\">\n <div className=\"space-y-1\">\n <span className=\"block text-sm font-medium\">\n {m('Severity')}\n </span>\n <div\n role=\"group\"\n aria-label={m('Severity')}\n className=\"border-border inline-flex items-center overflow-hidden rounded-md border\"\n >\n {SEVERITIES.map((s) => {\n const active = severity === s;\n return (\n <button\n key={s}\n type=\"button\"\n aria-pressed={active}\n disabled={fields.severity?.known === false}\n onClick={() => setSeverity(active ? undefined : s)}\n className={cn(\n 'border-border border-s px-2.5 py-1 text-xs font-medium capitalize transition-colors first:border-s-0',\n 'disabled:opacity-40',\n active\n ? 'bg-primary-600 text-white'\n : 'bg-background text-muted-foreground hover:text-foreground'\n )}\n >\n {m(s)}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"space-y-1\">\n <span className=\"block text-sm font-medium\">\n {m('Certainty')}\n </span>\n <FieldFlag\n label={m('Severity')}\n value={fields.severity}\n onChange={setField('severity')}\n hasValue={Boolean(severity)}\n />\n </div>\n </div>\n\n {/* Fuzzy onset — exact date OR human string */}\n <div className=\"space-y-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {m('Onset')}\n <FieldFlag\n label={m('Onset')}\n value={fields.onset}\n onChange={setField('onset')}\n hasValue={Boolean(onsetDate || onsetFuzzy)}\n />\n </span>\n <div className=\"grid grid-cols-1 items-end gap-2 sm:grid-cols-[minmax(10rem,0.8fr)_auto_minmax(14rem,1.2fr)]\">\n <DateInput\n aria-label={m('Onset date (exact)')}\n value={onsetDate}\n onChange={(value) => {\n setOnsetDate(value);\n if (value) setOnsetFuzzy('');\n }}\n disabled={fields.onset?.known === false}\n validateOnBlur\n error={\n hasInvalidOnsetDate\n ? m('Please enter a valid date (MM/DD/YYYY)')\n : undefined\n }\n width=\"full\"\n />\n <span className=\"text-muted-foreground pb-3 text-center text-xs\">\n {m('or')}\n </span>\n <Input\n aria-label={m('Onset (fuzzy)')}\n value={onsetFuzzy}\n onChange={(e) => {\n setOnsetFuzzy(e.target.value);\n if (e.target.value) setOnsetDate('');\n }}\n disabled={fields.onset?.known === false}\n placeholder={m(\n 'Fuzzy — \"since her twenties\", \"~3 months ago\"'\n )}\n />\n </div>\n </div>\n\n <Textarea\n label={m('Note')}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={m(\n 'e.g. patient thinks it started after the fall, not sure'\n )}\n rows={2}\n />\n\n {Object.keys(fields).length > 0 && (\n <p className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <HelpCircleIcon size={12} />\n <span>\n {m('Uncertainty recorded:')}{' '}\n {Object.entries(fields)\n .map(([k, f]) =>\n f?.known === false\n ? m('{field} unknown', { field: m(k) })\n : m('{confidence} confidence in {field}', {\n confidence: m(f?.confidence ?? 'unspecified'),\n field: m(k),\n })\n )\n .join(', ')}\n </span>\n </p>\n )}\n </>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={() => onOpenChange(false)}>\n {m('Cancel')}\n </Button>\n <Button onClick={handleSave} disabled={saveDisabled}>\n {m(\n mode === 'relate'\n ? 'Relate'\n : mode === 'observe'\n ? 'Add observation'\n : 'Save'\n )}\n </Button>\n {mode !== 'relate' && mode !== 'observe' && !text.trim() && (\n <Badge variant=\"outline\" size=\"sm\" className=\"text-muted-foreground\">\n {m('name required')}\n </Badge>\n )}\n </ModalFooter>\n </Modal>\n );\n}\n\nConditionEditor.displayName = 'ConditionEditor';\n\nexport default ConditionEditor;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n ThumbsUpIcon,\n ThumbsDownIcon,\n HandMetalIcon,\n HelpCircleIcon,\n PencilIcon,\n RefreshIcon,\n CalendarCheckIcon,\n StickyNoteIcon,\n BanIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n ExternalLinkIcon,\n PlusIcon,\n GripVerticalIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Reconciliation status of a medication. */\nexport type MedicationStatus =\n | 'unreconciled'\n | 'taking'\n | 'taking-noncompliant'\n | 'not-taking'\n | 'unknown';\n\n/** Coding-system reference for a medication (RxNorm / FDB / NDC …). */\nexport interface MedicationCode {\n /** Coding system, e.g. 'RxNORM', 'FDB', 'NDC' */\n system: string;\n /** Code within the system */\n code: string;\n /** Human-readable label the code was selected under */\n display?: string;\n}\n\n/**\n * A single medication in the presenting-medications list.\n *\n * Prescription-detail fields follow the NCPDP SCRIPT NewRx\n * `MedicationPrescribed` composite — see the README for the field mapping.\n * All are optional: a bare `{ id, name, status }` renders fine.\n */\nexport interface Medication {\n /** Stable unique id */\n id: string;\n /** Display name, e.g. \"lisinopril 10 mg tablet\" (NCPDP DrugDescription) */\n name: string;\n /** Patient-friendly instructions (NCPDP Sig / Directions) */\n sig?: string;\n /** Current reconciliation status */\n status: MedicationStatus;\n /** Whether the medication's end date has passed */\n expired?: boolean;\n /** Discontinued date (display string) — shown as \"Discontinued on: date\" */\n discontinuedDate?: string;\n /** Free-text note attached to the medication */\n note?: string;\n /** Follow-up task attached to the medication */\n task?: string;\n\n // —— Coding (NCPDP DrugCoded) ——\n /** Code reference (RxNorm / FDB / NDC) */\n code?: MedicationCode;\n\n // —— NCPDP SCRIPT NewRx prescription fields ——\n /** Strength, e.g. \"10 mg\" (Strength + StrengthUnitOfMeasure) */\n strength?: string;\n /** Dose form, e.g. \"tablet\" (DrugCoded/FormCode) */\n doseForm?: string;\n /** Quantity dispensed (Quantity/Value) */\n quantity?: string;\n /** Quantity unit of measure (Quantity/QuantityUnitOfMeasure) */\n quantityUnit?: string;\n /** Days supply (DaysSupply) */\n daysSupply?: string;\n /** Route of administration, e.g. \"oral\" */\n route?: string;\n /** Administration frequency, e.g. \"Twice daily\" */\n frequency?: string;\n /** As-needed flag (PRN) */\n prn?: boolean;\n /** Number of refills (NumberOfRefills) */\n refills?: string;\n /** Substitution / DAW: '0' permitted, '1' dispense as written */\n substitution?: '0' | '1';\n /** Start / written date (ISO yyyy-mm-dd) */\n startDate?: string;\n /** End date (ISO yyyy-mm-dd) */\n endDate?: string;\n /** Indication / diagnosis the medication treats */\n indication?: string;\n /** Note to pharmacy (Note) */\n pharmacyNotes?: string;\n}\n\n/** Non-status row actions revealed on hover. */\nexport type MedicationAction =\n | 'open'\n | 'correct'\n | 'refill'\n | 'add-task'\n | 'note'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface MedicationListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Medications to display (controlled — grouping is derived from status) */\n medications: Medication[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a status button is clicked on a row */\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n /** Called when a non-status row action is clicked */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * Called with the full ordered list of medication ids after a drag —\n * enables drag & drop reordering within a status group. The list renders in\n * props order; persist the ids and feed them back in.\n */\n onReorder?: (medicationIds: string[]) => void;\n /** Which non-status actions to show on each row (default: all) */\n actions?: MedicationAction[];\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Called when a quick-add option is clicked */\n onQuickAdd?: (name: string) => void;\n /** Called when the \"Add\" editor pill is clicked in the quick-add list */\n onAddOther?: () => void;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /**\n * Custom add UI (e.g. an inline CodeLookup search) rendered in the\n * add-medication section, before any quick-add pills. Use for\n * patient-facing entry where suggested medications would be leading.\n */\n addSearch?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: MedicationStatus[] = [\n 'unreconciled',\n 'taking',\n 'taking-noncompliant',\n 'not-taking',\n 'unknown',\n];\n\nexport const MEDICATION_STATUS_LABELS: Record<MedicationStatus, string> = {\n unreconciled: 'Unreconciled',\n taking: 'Taking as Directed',\n 'taking-noncompliant': 'Not Taking as Directed',\n 'not-taking': 'Not Taking',\n unknown: 'Unknown',\n};\n\nconst DEFAULT_ACTIONS: MedicationAction[] = [\n 'open',\n 'correct',\n 'refill',\n 'add-task',\n 'note',\n 'remove',\n];\n\nconst ACTION_META: Record<\n MedicationAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n correct: { label: 'Correct', icon: PencilIcon },\n refill: { label: 'Refill', icon: RefreshIcon },\n 'add-task': { label: 'Add Task', icon: CalendarCheckIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n 'move-up': { label: 'Move Up', icon: ChevronUpIcon },\n 'move-down': { label: 'Move Down', icon: ChevronDownIcon },\n};\n\nconst STATUS_BUTTON_META: {\n status: MedicationStatus;\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n}[] = [\n { status: 'taking', label: 'Taking', icon: ThumbsUpIcon },\n {\n status: 'taking-noncompliant',\n label: 'Taking – Noncompliant',\n icon: HandMetalIcon,\n },\n { status: 'not-taking', label: 'Not Taking', icon: ThumbsDownIcon },\n { status: 'unknown', label: 'Unknown', icon: HelpCircleIcon },\n];\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction MedicationRow({\n medication,\n actions,\n readOnly,\n drag,\n onMove,\n onStatusChange,\n onAction,\n}: {\n medication: Medication;\n actions: MedicationAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (medication: Medication, dir: -1 | 1) => void;\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n onAction?: (medication: Medication, action: MedicationAction) => void;\n}) {\n const m = useMessages();\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(medication, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-medication-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-medication-id={medication.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? m('{name}. Alt plus arrow keys to reorder.', {\n name: medication.name,\n })\n : undefined\n }\n {...drag.rowProps(medication.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, medication.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span className=\"text-foreground font-medium\">{medication.name}</span>\n {medication.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={medication.code.display}\n >\n {medication.code.system} {medication.code.code}\n </span>\n )}\n {medication.sig && (\n <span className=\"text-muted-foreground text-sm\">{medication.sig}</span>\n )}\n {medication.expired && (\n <span className=\"text-sm font-bold text-red-600 dark:text-red-400\">\n {m('EXPIRED')}\n </span>\n )}\n {medication.discontinuedDate && (\n <span className=\"text-muted-foreground text-sm\">\n {m('Discontinued on:')} {medication.discontinuedDate}\n </span>\n )}\n {(medication.note || medication.task) && (\n <span className=\"flex w-full basis-full flex-col gap-0.5 ps-4\">\n {medication.note && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <StickyNoteIcon size={12} />\n {medication.note}\n </span>\n )}\n {medication.task && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <CalendarCheckIcon size={12} />\n {m('Task:')} {medication.task}\n </span>\n )}\n </span>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: medication.name })}\n >\n {actions.includes('open') && (\n <RowIconButton\n label={m(ACTION_META.open.label)}\n icon={ACTION_META.open.icon}\n onClick={() => onAction?.(medication, 'open')}\n />\n )}\n {STATUS_BUTTON_META.map(({ status, label, icon }) => (\n <RowIconButton\n key={status}\n label={m(label)}\n icon={icon}\n active={medication.status === status}\n onClick={() => onStatusChange?.(medication, status)}\n />\n ))}\n {actions\n .filter((a): a is Exclude<MedicationAction, 'open'> => a !== 'open')\n .map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(medication, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// MedicationList\n// =============================================================================\n\n/**\n * Presenting-medications list with medication reconciliation.\n *\n * Controlled component: medications (with their statuses) come in via props;\n * every user interaction is reported through callbacks. Rows are grouped by\n * reconciliation status; hovering (or keyboard-focusing) a row reveals the\n * status buttons and other row actions.\n *\n * @example\n * ```tsx\n * <MedicationList\n * medications={meds}\n * onStatusChange={(med, status) =>\n * setMeds((prev) =>\n * prev.map((m) => (m.id === med.id ? { ...m, status } : m))\n * )\n * }\n * onAction={(med, action) => handleAction(med, action)}\n * />\n * ```\n */\nexport const MedicationList = React.forwardRef<\n HTMLDivElement,\n MedicationListProps\n>(\n (\n {\n medications,\n title = 'Presenting medications',\n onStatusChange,\n onAction,\n onReorder,\n actions = DEFAULT_ACTIONS,\n quickAddOptions,\n onQuickAdd,\n onAddOther,\n readOnly = false,\n reconciledMessage = 'All medications reconciled.',\n emptyMessage = 'No medications recorded.',\n addSearch,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const handleStatusChange = React.useCallback(\n (medication: Medication, status: MedicationStatus) => {\n setAnnouncement(\n m('{name} marked {status}', {\n name: medication.name,\n status: m(MEDICATION_STATUS_LABELS[status]),\n })\n );\n onStatusChange?.(medication, status);\n },\n [m, onStatusChange, setAnnouncement]\n );\n\n const groups = GROUP_ORDER.map((status) => ({\n status,\n label: MEDICATION_STATUS_LABELS[status],\n items: medications.filter((m) => m.status === status),\n })).filter((g) => g.items.length > 0 || g.status === 'unreconciled');\n\n // Drag & drop reordering, restricted to the same status group (a cross-\n // group drop would silently imply a reconciliation change). Precomputed\n // map — dragover fires too frequently for a linear scan per event.\n const statusById = React.useMemo(\n () => new Map(medications.map((m) => [m.id, m.status] as const)),\n [medications]\n );\n const statusOf = React.useCallback(\n (id: string) => statusById.get(id),\n [statusById]\n );\n const drag = useDragReorder({\n ids: medications.map((m) => m.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Medication list reordered'));\n onReorder(ids);\n },\n canDropOn: (dragged, target) => statusOf(dragged) === statusOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the status group. */\n const moveMedication = React.useCallback(\n (medication: Medication, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = medications.map((m) => m.id);\n const from = ids.indexOf(medication.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < medications.length &&\n medications[to].status !== medication.status\n ) {\n to += dir;\n }\n if (to < 0 || to >= medications.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: medication.name,\n })\n );\n onReorder(ids);\n },\n [m, medications, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ status, label, items }) => (\n <section key={status} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((medication) => (\n <MedicationRow\n key={medication.id}\n medication={medication}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveMedication}\n onStatusChange={handleStatusChange}\n onAction={onAction}\n />\n ))}\n </ul>\n ) : medications.length === 0 ? (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n ) : (\n <p className=\"text-muted-foreground mt-2 flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n {m(reconciledMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly &&\n (addSearch || quickAddOptions?.length || onAddOther) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add medication')}\n </span>\n {addSearch}\n {(quickAddOptions?.length || onAddOther) && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {quickAddOptions?.map((name) => (\n <Button\n key={name}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onQuickAdd?.(name)}\n leftIcon={<PlusIcon size={12} />}\n className=\"border-border h-auto rounded-full border px-2.5 py-1 text-xs\"\n >\n {name}\n </Button>\n ))}\n {onAddOther && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAddOther}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Confirmation announcement for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nMedicationList.displayName = 'MedicationList';\n\nexport default MedicationList;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\nimport {\n dateToDisplayFormat,\n displayFormatToDateString,\n} from '../../utils/date';\n\n/**\n * MedicationEditor — prescription editor modal for a `Medication`.\n *\n * Captures the NCPDP SCRIPT NewRx `MedicationPrescribed` field set and codes\n * the drug via `CodeLookup` (RxNorm / FDB, offline). Used by\n * `MedicationReconciliation` for both **Correct** (edit) and **Add\n * Medication**, and usable directly:\n *\n * ```tsx\n * <MedicationEditor\n * open={editing !== null}\n * medication={editing ?? undefined}\n * codeLookup={{ indexUrl: '/codify' }}\n * onClose={() => setEditing(null)}\n * onSave={(med) => upsert(med)}\n * />\n * ```\n *\n * NCPDP mapping (NewRx / MedicationPrescribed):\n *\n * | Editor field | NCPDP element |\n * |----------------|----------------------------------------|\n * | Medication | DrugDescription |\n * | Code | DrugCoded (ProductCode / DrugDBCode) |\n * | Strength | Strength + StrengthUnitOfMeasure |\n * | Dose form | DrugCoded/FormCode |\n * | Quantity | Quantity/Value |\n * | Quantity unit | Quantity/QuantityUnitOfMeasure |\n * | Days supply | DaysSupply |\n * | Directions | Sig/SigText |\n * | Refills | NumberOfRefills |\n * | Substitution | Substitutions (0 permitted / 1 DAW) |\n * | Start date | WrittenDate / EffectiveDate |\n * | Indication | Diagnosis/Primary |\n * | Pharmacy notes | Note |\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { Medication } from './MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Minimal shape of a CodeLookup selection the editor consumes. */\nexport interface MedicationLookupResult {\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/**\n * Structural subset of `CodeLookupProps` the editor uses. `CodeLookup`\n * satisfies this — it is injected (not imported) because its Web Worker\n * keeps it out of the library build (see CodeLookup/index.ts).\n */\nexport interface MedicationLookupProps {\n indexUrl: string;\n locale?: string;\n domains?: ('med' | 'condition')[];\n searchCodetypes?: string[];\n bare?: boolean;\n clearOnSelect?: boolean;\n placeholder?: string;\n initialQuery?: string;\n initialSearch?: boolean;\n onSelect?: (result: MedicationLookupResult) => void;\n onFreeText?: (text: string) => void;\n}\n\n/** CodeLookup wiring for the editor (component injected by the consumer). */\nexport interface CodeLookupConfig {\n /** The CodeLookup component: `import { CodeLookup } from '…/CodeLookup'` */\n component: React.ComponentType<MedicationLookupProps>;\n /** Base URL of the codify index, e.g. '/codify' */\n indexUrl: string;\n /** Shard locale (default 'en') */\n locale?: string;\n}\n\nexport interface MedicationEditorProps {\n /** Whether the editor is open */\n open: boolean;\n /** Medication being edited — omit for \"add\" mode */\n medication?: Medication;\n /**\n * Codify shard location for RxNorm/FDB coding. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force a plain name input.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require a catalog selection for new or renamed medications; retain legacy entries. */\n requireCode?: boolean;\n /** Called when the editor is dismissed without saving */\n onClose: () => void;\n /** Called with the complete medication on save */\n onSave: (medication: Medication) => void;\n}\n\n// =============================================================================\n// Parsers — drug label → strength/form, sig → route/frequency/PRN\n// =============================================================================\n\nconst DOSE_FORMS = [\n 'tablet',\n 'capsule',\n 'solution',\n 'suspension',\n 'syrup',\n 'cream',\n 'ointment',\n 'gel',\n 'patch',\n 'suppository',\n 'spray',\n 'drops',\n 'inhaler',\n 'injection',\n 'lozenge',\n 'powder',\n 'film',\n];\n\n/** Quantity unit implied by each dose form (NCPDP QuantityUnitOfMeasure). */\nconst FORM_TO_UNIT: Record<string, string> = {\n tablet: 'tablet',\n capsule: 'capsule',\n solution: 'milliliter',\n suspension: 'milliliter',\n syrup: 'milliliter',\n cream: 'gram',\n ointment: 'gram',\n gel: 'gram',\n patch: 'patch',\n suppository: 'suppository',\n spray: 'spray',\n drops: 'milliliter',\n inhaler: 'each',\n injection: 'milliliter',\n lozenge: 'each',\n powder: 'gram',\n film: 'each',\n};\n\n/**\n * Quantity unit implied by a dose form (tablet → tablet, solution →\n * milliliter, …); unrecognized forms fall back to the form itself.\n */\nexport function doseFormToQuantityUnit(doseForm: string): string | undefined {\n const normalized = doseForm.toLowerCase().trim();\n return (FORM_TO_UNIT[normalized] ?? normalized) || undefined;\n}\n\n/**\n * Parse strength + dose form out of a coded drug label,\n * e.g. \"lisinopril 20 mg tablet\" → { strength: '20 mg', doseForm: 'tablet' }.\n */\nexport function parseMedicationLabel(label: string): {\n strength?: string;\n doseForm?: string;\n} {\n const lower = label.toLowerCase();\n // bounded quantifiers keep the match linear-time on adversarial inputs\n // (unbounded \\d+ groups backtrack polynomially on long digit runs)\n const strengthMatch = lower.match(\n /(\\d{1,7}(?:\\.\\d{1,4})?(?:\\s{0,4}\\/\\s{0,4}\\d{1,7}(?:\\.\\d{1,4})?)?)\\s{0,4}(mg\\/ml|mcg\\/ml|mg|mcg|g|ml|units?|%|meq)\\b/\n );\n const doseForm = DOSE_FORMS.find((f) => lower.includes(f));\n return {\n strength: strengthMatch\n ? `${strengthMatch[1].replace(/\\s+/g, '')} ${strengthMatch[2]}`\n : undefined,\n doseForm,\n };\n}\n\nconst SIG_ROUTES: [RegExp, string][] = [\n [/\\bby mouth\\b|\\boral(ly)?\\b|\\bpo\\b/, 'oral'],\n [/\\bsublingual(ly)?\\b|\\bunder the tongue\\b|\\bsl\\b/, 'sublingual'],\n [/\\bsubcutaneous(ly)?\\b|\\bsubq\\b|\\bsc\\b|\\bsq\\b/, 'subcutaneous'],\n [/\\bintramuscular(ly)?\\b|\\bim\\b/, 'intramuscular'],\n [/\\bintravenous(ly)?\\b|\\biv\\b/, 'intravenous'],\n [/\\binhal(e|ation|ed)\\b|\\bpuffs?\\b|\\bnebuliz/, 'inhalation'],\n [/\\beyes?\\b|\\bophthalmic\\b/, 'ophthalmic'],\n [/\\bears?\\b|\\botic\\b/, 'otic'],\n [/\\bnostrils?\\b|\\bnasal(ly)?\\b|\\bintranasal/, 'nasal'],\n [/\\brectal(ly)?\\b|\\bpr\\b/, 'rectal'],\n [/\\btransdermal\\b|\\bto (the )?skin\\b|\\bapply\\b|\\btopical(ly)?\\b/, 'topical'],\n];\n\n// Order matters: specific patterns must precede the bare-\"daily\" fallback\n// (\"twice daily\" must not match Once daily's \\bdaily\\b).\nconst SIG_FREQUENCIES: [RegExp, string][] = [\n [/\\bevery other day\\b|\\bqod\\b/, 'Every other day'],\n [/\\btwice (a |per )?day\\b|\\btwice daily\\b|\\bbid\\b/, 'Twice daily'],\n [\n /\\b(three times|3 times)( a| per)? day\\b|\\b(three times|3 times) daily\\b|\\btid\\b/,\n 'Three times daily',\n ],\n [\n /\\b(four times|4 times)( a| per)? day\\b|\\b(four times|4 times) daily\\b|\\bqid\\b/,\n 'Four times daily',\n ],\n [/\\bevery morning\\b|\\bqam\\b/, 'Every morning'],\n [/\\b(at )?bedtime\\b|\\bqhs\\b|\\bat night\\b/, 'Every bedtime'],\n [/\\bweekly\\b|\\bonce a week\\b|\\bevery week\\b/, 'Weekly'],\n [\n /\\bonce (a |per )?day\\b|\\bonce daily\\b|\\bdaily\\b|\\bevery day\\b|\\bqd\\b/,\n 'Once daily',\n ],\n];\n\n/**\n * Derive route / frequency / PRN from free-text sig,\n * e.g. \"1 tablet by mouth daily as needed\" →\n * { route: 'oral', frequency: 'Once daily', prn: true }.\n */\nexport function parseSig(sig: string): {\n route?: string;\n frequency?: string;\n prn: boolean;\n} {\n const lower = sig.toLowerCase();\n const route = SIG_ROUTES.find(([re]) => re.test(lower))?.[1];\n const frequency = SIG_FREQUENCIES.find(([re]) => re.test(lower))?.[1];\n const prn = /\\bas needed\\b|\\bprn\\b/.test(lower);\n return { route, frequency, prn };\n}\n\n/**\n * Derive the label-parsed Medication fields — strength, dose form, and the\n * form-implied quantity unit — from a drug display label,\n * e.g. \"lisinopril 10 mg tablet\" → { strength: '10 mg', doseForm: 'tablet',\n * quantityUnit: 'tablet' }.\n */\nexport function labelToMedicationFields(label: string): Partial<Medication> {\n const { strength, doseForm } = parseMedicationLabel(label);\n return {\n ...(strength && { strength }),\n ...(doseForm && {\n doseForm,\n quantityUnit: doseFormToQuantityUnit(doseForm),\n }),\n };\n}\n\n/**\n * Derive Medication fields from a CodeLookup pick: name, code reference,\n * and — parsed from the label — strength, dose form, and quantity unit.\n * Used by the editor and by inline add-search flows.\n */\nexport function lookupToMedicationFields(\n result: MedicationLookupResult\n): Partial<Medication> {\n return {\n name: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n ...labelToMedicationFields(result.label),\n };\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// Medication dates persist as ISO `yyyy-mm-dd`; the editor's date inputs edit\n// MM/DD/YYYY. Convert at the editor boundary, passing through unrecognized\n// values unchanged.\nfunction isoDateToDisplay(value?: string): string | undefined {\n return value && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n ? dateToDisplayFormat(value)\n : value;\n}\n\nfunction displayDateToIso(value?: string): string | undefined {\n return value ? displayFormatToDateString(value) : value;\n}\n\n// =============================================================================\n// MedicationEditor\n// =============================================================================\n\nexport function MedicationEditor({\n open,\n medication,\n codeLookup,\n requireCode = false,\n onClose,\n onSave,\n}: MedicationEditorProps): React.JSX.Element | null {\n const m = useMessages();\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [draft, setDraft] = React.useState<Medication>(() =>\n medication\n ? {\n ...medication,\n startDate: isoDateToDisplay(medication.startDate),\n endDate: isoDateToDisplay(medication.endDate),\n }\n : {\n id: newId(),\n name: '',\n status: 'unreconciled',\n }\n );\n\n // NOTE: draft state is seeded once per mount — give the editor a `key`\n // (e.g. the medication id) so a different target remounts it.\n\n // Focus the medication search / name input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const input = bodyRef.current?.querySelector('input');\n input?.focus();\n }, []);\n\n const patch = (p: Partial<Medication>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n const handleCodeSelect = (result: MedicationLookupResult) => {\n if (requireCode && (!result.codetype.trim() || !result.fullcode.trim()))\n return;\n // Populate strength / dose form / quantity unit from the coded label.\n patch(lookupToMedicationFields(result));\n };\n\n const handleSigChange = (sig: string) => {\n // Route / frequency / PRN are derived from the sig text.\n const { route, frequency, prn } = parseSig(sig);\n patch({ sig, route, frequency, prn: prn || undefined });\n };\n\n const hasCode = Boolean(draft.code?.system.trim() && draft.code.code.trim());\n // Only records that were uncoded on entry are exempt from requireCode —\n // an originally coded medication must keep (or replace) its code.\n const unchangedLegacyName =\n medication && !medication.code && draft.name === medication.name;\n const canSave =\n draft.name.trim().length > 0 &&\n (!requireCode || hasCode || Boolean(unchangedLegacyName));\n\n if (!open) return null;\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"lg\">\n <ModalHeader>\n <ModalTitle>\n {medication ? m('Correct Medication') : m('Add Medication')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-5\">\n <div ref={bodyRef} className=\"contents\">\n {/* ——— Medication + coding ——— */}\n <section className=\"space-y-3\" aria-label={m('Medication')}>\n {effectiveCodeLookup ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-search\">{m('Medication')}</Label>\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect={false}\n placeholder={m('Search RxNorm / FDB — e.g. lisinopril')}\n // Seed the search box with the medication name. Editing an\n // uncoded medication also runs the search immediately so the\n // closest coded matches are offered (a pick fills coding,\n // strength, and dose form); coded ones just show their name.\n initialQuery={medication?.name || undefined}\n initialSearch={medication ? !medication.code : undefined}\n onSelect={handleCodeSelect}\n onFreeText={\n requireCode\n ? undefined\n : (text) => patch({ name: text, code: undefined })\n }\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? m('Coded: {system} {code}', {\n system: draft.code.system,\n code: draft.code.code,\n })\n : draft.name\n ? m(\n 'Uncoded free text: \"{name}\" — pick a result to code it',\n { name: draft.name }\n )\n : requireCode\n ? m('Pick a catalog result to code the medication')\n : m(\n 'Pick a result to code the medication, or press Enter for free text'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-name\">{m('Medication')}</Label>\n <Input\n id=\"med-name\"\n value={draft.name}\n readOnly={requireCode}\n onChange={(e) =>\n patch({ name: e.target.value, code: undefined })\n }\n />\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-strength\">{m('Strength')}</Label>\n <Input\n id=\"med-strength\"\n value={draft.strength ?? ''}\n onChange={(e) => patch({ strength: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-form\">{m('Dose form')}</Label>\n <Input\n id=\"med-form\"\n value={draft.doseForm ?? ''}\n onChange={(e) => {\n const doseForm = e.target.value;\n // Quantity unit follows the dose form (tablet → tablet,\n // solution → milliliter, …)\n patch({\n doseForm,\n quantityUnit: doseFormToQuantityUnit(doseForm),\n });\n }}\n />\n </div>\n </div>\n </section>\n\n {/* ——— Dispensing ——— */}\n <section className=\"space-y-3\" aria-label={m('Dispensing')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Dispensing')}\n </h4>\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-qty\">\n {m('Quantity')}\n {draft.quantityUnit ? ` (${draft.quantityUnit}s)` : ''}\n </Label>\n <Input\n id=\"med-qty\"\n inputMode=\"decimal\"\n value={draft.quantity ?? ''}\n onChange={(e) => patch({ quantity: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-days\">{m('Days supply')}</Label>\n <Input\n id=\"med-days\"\n inputMode=\"numeric\"\n value={draft.daysSupply ?? ''}\n onChange={(e) => patch({ daysSupply: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-refills\">{m('Refills')}</Label>\n <Input\n id=\"med-refills\"\n inputMode=\"numeric\"\n value={draft.refills ?? ''}\n onChange={(e) => patch({ refills: e.target.value })}\n />\n </div>\n </div>\n <RadioGroup\n name=\"med-substitution\"\n label={m('Substitution')}\n value={draft.substitution ?? '0'}\n onValueChange={(v) => patch({ substitution: v as '0' | '1' })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"0\" label={m('Substitution permitted')} />\n <Radio value=\"1\" label={m('Dispense as written (DAW)')} />\n </RadioGroup>\n </section>\n\n {/* ——— Directions ——— */}\n <section className=\"space-y-3\" aria-label={m('Directions')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Directions')}\n </h4>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-sig\">{m('Sig (patient directions)')}</Label>\n <Textarea\n id=\"med-sig\"\n value={draft.sig ?? ''}\n onChange={(e) => handleSigChange(e.target.value)}\n rows={2}\n />\n <p className=\"text-muted-foreground text-xs\" aria-live=\"polite\">\n {draft.route || draft.frequency || draft.prn ? (\n <>\n {m('Derived:')}{' '}\n {[\n draft.route && m('route {route}', { route: draft.route }),\n draft.frequency && m(draft.frequency.toLowerCase()),\n draft.prn && m('PRN (as needed)'),\n ]\n .filter(Boolean)\n .join(' · ')}\n </>\n ) : (\n m('Route, frequency, and PRN are derived from the directions')\n )}\n </p>\n </div>\n </section>\n\n {/* ——— Dates & context ——— */}\n <section className=\"space-y-3\" aria-label={m('Dates and context')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Dates & context')}\n </h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-start\">{m('Start date')}</Label>\n <DateInput\n id=\"med-start\"\n value={draft.startDate ?? ''}\n onChange={(v) => patch({ startDate: v })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-end\">{m('End date')}</Label>\n <DateInput\n id=\"med-end\"\n value={draft.endDate ?? ''}\n onChange={(v) => patch({ endDate: v })}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-indication\">{m('Indication')}</Label>\n <Input\n id=\"med-indication\"\n value={draft.indication ?? ''}\n onChange={(e) => patch({ indication: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-pharmacy-notes\">{m('Pharmacy notes')}</Label>\n <Textarea\n id=\"med-pharmacy-notes\"\n value={draft.pharmacyNotes ?? ''}\n onChange={(e) => patch({ pharmacyNotes: e.target.value })}\n rows={2}\n />\n </div>\n </section>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n onSave({\n ...draft,\n name: draft.name.trim(),\n startDate: displayDateToIso(draft.startDate),\n endDate: displayDateToIso(draft.endDate),\n });\n onClose();\n }}\n disabled={!canSave}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\nexport default MedicationEditor;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\n/**\n * MedicationReconciliation — batteries-included medication reconciliation.\n *\n * Wraps the presentational `MedicationList` with the full interaction layer:\n * status changes, Correct / Notes / Add Task modal dialogs, reordering,\n * removal, and adding medications (quick-add pills + \"Add\" editor modal).\n *\n * Works standalone (uncontrolled with `defaultMedications`, or controlled\n * with `medications` + `onChange`) and is the engine behind the eSheet\n * `medicationList` question type.\n */\n\nimport * as React from 'react';\nimport {\n MedicationList,\n type Medication,\n type MedicationAction,\n} from './MedicationList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport {\n MedicationEditor,\n lookupToMedicationFields,\n type CodeLookupConfig,\n} from './MedicationEditor';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nconst MANAGED_ACTIONS: MedicationAction[] = [\n 'correct',\n 'add-task',\n 'note',\n 'remove',\n];\n\nexport interface MedicationReconciliationProps {\n /** Controlled medication list (use with `onChange`) */\n medications?: Medication[];\n /** Initial medication list (uncontrolled) */\n defaultMedications?: Medication[];\n /** Called with the next list after every mutation */\n onChange?: (medications: Medication[]) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Row actions to show (default: correct, add-task, note, remove) */\n actions?: MedicationAction[];\n /**\n * Called for host-specific actions this component does not manage\n * (e.g. 'open', 'refill' when included in `actions`).\n */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * CodeLookup wiring for the medication editor (Correct / Add Medication):\n * pass the CodeLookup component + shard location to enable RxNorm/FDB\n * coding. Defaults to the ambient `CodeLookupProvider` when one is mounted;\n * pass `false` to force a plain-text medication name input.\n *\n * ```tsx\n * import { CodeLookup } from '@mieweb/ui/…/CodeLookup';\n * <MedicationReconciliation codeLookup={{ component: CodeLookup, indexUrl: '/codify' }} … />\n * ```\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require a catalog selection for new medications; existing uncoded records remain editable. */\n requireCode?: boolean;\n /**\n * Render an inline CodeLookup search bar in the add-medication section\n * (requires `codeLookup`). Picks add immediately as Unreconciled — the\n * fastest entry path, and non-leading (no suggested medications), which\n * makes it the right choice for patient-facing intake.\n */\n inlineAddSearch?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Modal dialogs\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; medication: Medication }\n | { kind: 'note'; medication: Medication }\n | { kind: 'add-task'; medication: Medication }\n | { kind: 'add' }\n | null;\n\n/** Small note / task dialog. Correct + Add use the full MedicationEditor. */\nfunction MedicationDialog({\n dialog,\n onClose,\n onSave,\n}: {\n dialog: { kind: 'note' | 'add-task'; medication: Medication };\n onClose: () => void;\n onSave: (fields: Record<string, string>) => void;\n}) {\n const m = useMessages();\n const [form, setForm] = React.useState<Record<string, string>>(() =>\n dialog.kind === 'note'\n ? ({ note: dialog.medication.note ?? '' } as Record<string, string>)\n : ({ task: dialog.medication.task ?? '' } as Record<string, string>)\n );\n\n const set =\n (key: string) =>\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n setForm((prev) => ({ ...prev, [key]: e.target.value }));\n\n const handleSave = () => {\n onSave(form);\n onClose();\n };\n\n return (\n <Modal open onOpenChange={(open) => !open && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>\n {dialog.kind === 'note' ? m('Medication Notes') : m('Add Task')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.medication.name}\n </p>\n {dialog.kind === 'note' ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-note\">{m('Note')}</Label>\n <Textarea\n id=\"med-note\"\n value={form.note}\n onChange={set('note')}\n rows={4}\n />\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-task\">{m('Task')}</Label>\n <Textarea\n id=\"med-task\"\n value={form.task}\n onChange={set('task')}\n rows={3}\n placeholder={m('Follow-up task for this medication')}\n />\n </div>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button onClick={handleSave}>{m('Save')}</Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// MedicationReconciliation\n// =============================================================================\n\n/**\n * @example Standalone (uncontrolled)\n * ```tsx\n * <MedicationReconciliation\n * defaultMedications={presentingMeds}\n * quickAddOptions={['aspirin 81 mg tablet']}\n * onChange={(meds) => save(meds)}\n * />\n * ```\n *\n * @example Controlled\n * ```tsx\n * <MedicationReconciliation medications={meds} onChange={setMeds} />\n * ```\n */\nexport function MedicationReconciliation({\n medications: controlledMedications,\n defaultMedications,\n onChange,\n title = 'Presenting medications',\n quickAddOptions,\n actions = MANAGED_ACTIONS,\n onAction,\n codeLookup,\n requireCode = false,\n inlineAddSearch = false,\n readOnly = false,\n reconciledMessage,\n emptyMessage,\n className,\n 'data-testid': dataTestId,\n}: MedicationReconciliationProps): React.JSX.Element {\n const m = useMessages();\n const isControlled = controlledMedications !== undefined;\n const [internal, setInternal] = React.useState<Medication[]>(\n defaultMedications ?? []\n );\n const medications = isControlled ? controlledMedications : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n\n const commit = (next: Medication[]) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const patchMedication = (id: string, patch: Partial<Medication>) => {\n commit(medications.map((m) => (m.id === id ? { ...m, ...patch } : m)));\n };\n\n const moveMedication = (med: Medication, direction: -1 | 1) => {\n // Reorder within the same status group.\n const meds = [...medications];\n const group = meds.filter((m) => m.status === med.status);\n const groupIndex = group.findIndex((m) => m.id === med.id);\n const swapWith = group[groupIndex + direction];\n if (!swapWith) return;\n const i = meds.findIndex((m) => m.id === med.id);\n const j = meds.findIndex((m) => m.id === swapWith.id);\n [meds[i], meds[j]] = [meds[j], meds[i]];\n commit(meds);\n };\n\n const handleAction = (med: Medication, action: MedicationAction) => {\n switch (action) {\n case 'remove':\n commit(medications.filter((m) => m.id !== med.id));\n break;\n case 'move-up':\n moveMedication(med, -1);\n break;\n case 'move-down':\n moveMedication(med, 1);\n break;\n case 'correct':\n case 'note':\n case 'add-task':\n setDialog({ kind: action, medication: med });\n break;\n default:\n // Host-specific actions ('open', 'refill') are delegated.\n onAction?.(med, action);\n break;\n }\n };\n\n const addMedication = (name: string, sig?: string) => {\n commit([\n ...medications,\n { id: newId(), name, sig: sig || undefined, status: 'unreconciled' },\n ]);\n };\n\n const handleDialogSave = (form: Record<string, string>) => {\n if (!dialog) return;\n switch (dialog.kind) {\n case 'note':\n patchMedication(dialog.medication.id, {\n note: form.note.trim() || undefined,\n });\n break;\n case 'add-task':\n patchMedication(dialog.medication.id, {\n task: form.task.trim() || undefined,\n });\n break;\n }\n };\n\n /** Correct + Add flow through the full NCPDP MedicationEditor. */\n const editorOpen = dialog?.kind === 'correct' || dialog?.kind === 'add';\n const editorTarget =\n dialog?.kind === 'correct' ? dialog.medication : undefined;\n\n const handleEditorSave = (med: Medication) => {\n if (dialog?.kind === 'correct') {\n commit(medications.map((m) => (m.id === med.id ? med : m)));\n } else {\n commit([...medications, { ...med, status: 'unreconciled' }]);\n }\n };\n\n /** Inline CodeLookup add bar — picks/free text land in Unreconciled. */\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder={m('Search medications to add')}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n commit([\n ...medications,\n {\n id: newId(),\n name: result.label,\n status: 'unreconciled',\n ...lookupToMedicationFields(result),\n },\n ]);\n }}\n onFreeText={requireCode ? undefined : (text) => addMedication(text)}\n />\n ) : undefined;\n\n return (\n <>\n <MedicationList\n medications={medications}\n title={title}\n readOnly={readOnly}\n actions={actions}\n onStatusChange={(med, status) => patchMedication(med.id, { status })}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...medications].sort(\n (a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)\n )\n )\n }\n quickAddOptions={requireCode ? undefined : quickAddOptions}\n onQuickAdd={(name) => addMedication(name)}\n onAddOther={\n requireCode && !effectiveCodeLookup\n ? undefined\n : () => setDialog({ kind: 'add' })\n }\n addSearch={addSearch}\n reconciledMessage={reconciledMessage}\n emptyMessage={emptyMessage}\n className={className}\n data-testid={dataTestId}\n />\n {dialog && (dialog.kind === 'note' || dialog.kind === 'add-task') && (\n <MedicationDialog\n key={dialog.kind + dialog.medication.id}\n dialog={dialog}\n onClose={() => setDialog(null)}\n onSave={handleDialogSave}\n />\n )}\n {editorOpen && (\n <MedicationEditor\n key={editorTarget?.id ?? 'add'}\n open\n medication={editorTarget}\n codeLookup={codeLookup === false ? false : effectiveCodeLookup}\n requireCode={requireCode}\n onClose={() => setDialog(null)}\n onSave={handleEditorSave}\n />\n )}\n </>\n );\n}\n\nexport default MedicationReconciliation;\n"]}
1
+ {"version":3,"sources":["../src/components/AllergyList/AllergyList.tsx","../src/components/CodeLookup/context.tsx","../src/components/AllergyList/AllergyManager.tsx","../src/components/Assessment/Assessment.tsx","../src/components/ConditionEditor/ConditionEditor.tsx","../src/components/MedicationList/MedicationList.tsx","../src/components/MedicationList/MedicationEditor.tsx","../src/components/MedicationList/MedicationReconciliation.tsx"],"names":["React","React2","jsx","React3","jsxs","ACTION_META","Fragment","React5","DEFAULT_ACTIONS","React6","m","newId","React7","React8"],"mappings":"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","file":"chunk-YWCHUUY3.js","sourcesContent":["'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport {\n PencilIcon,\n StickyNoteIcon,\n BanIcon,\n PlusIcon,\n AlertCircleIcon,\n GripVerticalIcon,\n} from '../Icons';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Allergy category (FHIR AllergyIntolerance.category). */\nexport type AllergyType = 'drug' | 'food' | 'environmental' | 'other';\n\n/**\n * Mechanism distinction (FHIR AllergyIntolerance.type): a true\n * immune-mediated allergy vs a non-immune intolerance (e.g. GI upset).\n * The distinction matters clinically — an intolerance mislabeled as an\n * allergy causes unnecessary avoidance of first-line drugs.\n */\nexport type AllergyKind = 'allergy' | 'intolerance';\n\n/** Reaction severity (FHIR reaction.severity). */\nexport type AllergySeverity = 'mild' | 'moderate' | 'severe';\n\n/** Coding-system reference for an allergen (RxNorm / FDB / SNOMED …). */\nexport interface AllergyCode {\n system: string;\n code: string;\n display?: string;\n}\n\n/**\n * A single allergy / intolerance.\n *\n * Loosely follows FHIR AllergyIntolerance: allergen (+ optional code),\n * category, reaction, severity, onset, and clinical status.\n */\nexport interface Allergy {\n /** Stable unique id */\n id: string;\n /** Allergen display name, e.g. \"penicillin\" */\n allergen: string;\n /** Category — groups the list */\n type?: AllergyType;\n /** Allergy vs intolerance (FHIR AllergyIntolerance.type; default 'allergy') */\n kind?: AllergyKind;\n /** Reaction description, e.g. \"hives\" */\n reaction?: string;\n /** Reaction severity — drives the badge color */\n severity?: AllergySeverity;\n /** Onset date (display string) */\n onsetDate?: string;\n /** Free-text note */\n note?: string;\n /** Inactive/resolved entries render struck through */\n inactive?: boolean;\n /** Code reference (RxNorm/FDB for drugs, SNOMED otherwise) */\n code?: AllergyCode;\n}\n\n/** Row actions revealed on hover. */\nexport type AllergyAction = 'correct' | 'note' | 'remove';\n\nexport interface AllergyListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Allergies to display (controlled) */\n allergies: Allergy[];\n /**\n * No-known-allergies flag (NKA/NKDA). An empty list is ambiguous —\n * \"not asked\" vs \"asked, none\" — so this is explicit tri-state:\n * undefined = not recorded, true = no known allergies.\n * Ignored when `allergies` is non-empty.\n */\n noKnownAllergies?: boolean;\n /** Called when the no-known-allergies affordance is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Row actions to show (default: all) */\n actions?: AllergyAction[];\n /** Called when a row action is clicked */\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n /**\n * Called with the full new id order after a drag/keyboard reorder.\n * Omit to disable reordering. Drops are restricted to the same\n * category group.\n */\n onReorder?: (allergyIds: string[]) => void;\n /** Custom add UI (e.g. an inline CodeLookup search) */\n addSearch?: React.ReactNode;\n /** Called when the \"Add allergy\" button is clicked (omit to hide) */\n onAdd?: () => void;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst TYPE_ORDER: AllergyType[] = ['drug', 'food', 'environmental', 'other'];\n\nexport const ALLERGY_TYPE_LABELS: Record<AllergyType, string> = {\n drug: 'Drug',\n food: 'Food',\n environmental: 'Environmental',\n other: 'Other',\n};\n\nconst SEVERITY_BADGE: Record<\n AllergySeverity,\n 'danger' | 'warning' | 'secondary'\n> = {\n severe: 'danger',\n moderate: 'warning',\n mild: 'secondary',\n};\n\nconst DEFAULT_ACTIONS: AllergyAction[] = ['correct', 'note', 'remove'];\n\nconst ACTION_META: Record<\n AllergyAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n correct: { label: 'Correct', icon: PencilIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction AllergyRow({\n allergy,\n actions,\n readOnly,\n drag,\n onMove,\n onAction,\n}: {\n allergy: Allergy;\n actions: AllergyAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (allergy: Allergy, dir: -1 | 1) => void;\n onAction?: (allergy: Allergy, action: AllergyAction) => void;\n}) {\n const m = useMessages();\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(allergy, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-allergy-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-allergy-id={allergy.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? m('{name}. Alt plus arrow keys to reorder.', {\n name: allergy.allergen,\n })\n : undefined\n }\n {...drag.rowProps(allergy.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, allergy.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span\n className={cn(\n 'text-foreground font-medium',\n allergy.inactive && 'text-muted-foreground line-through'\n )}\n >\n {allergy.allergen}\n </span>\n {allergy.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={allergy.code.display}\n >\n {allergy.code.system} {allergy.code.code}\n </span>\n )}\n {allergy.severity && (\n <Badge variant={SEVERITY_BADGE[allergy.severity]} size=\"sm\">\n {m(allergy.severity)}\n </Badge>\n )}\n {allergy.kind === 'intolerance' && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m('intolerance')}\n </Badge>\n )}\n {allergy.reaction && (\n <span className=\"text-muted-foreground text-sm\">\n — {allergy.reaction}\n </span>\n )}\n {allergy.onsetDate && (\n <span className=\"text-muted-foreground text-xs\">\n {m('since {date}', { date: allergy.onsetDate })}\n </span>\n )}\n {allergy.inactive && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m('inactive')}\n </Badge>\n )}\n {allergy.note && (\n <span className=\"flex w-full basis-full items-center gap-1.5 ps-4\">\n <StickyNoteIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"text-muted-foreground text-xs\">{allergy.note}</span>\n </span>\n )}\n\n {!readOnly && actions.length > 0 && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: allergy.allergen })}\n >\n {actions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(allergy, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// AllergyList\n// =============================================================================\n\n/**\n * Allergy / intolerance list — presentational layer.\n *\n * Controlled: allergies come in via props; every interaction is reported\n * through callbacks. Entries group by category (Drug → Food →\n * Environmental → Other); severity renders as a colored badge; hover (or\n * keyboard-focus) a row for Correct / Notes / Remove.\n *\n * The empty state is explicit tri-state via `noKnownAllergies` (NKA):\n * an empty list shows \"Allergy status not recorded\" until the No Known\n * Allergies affordance is confirmed — an empty list must never silently\n * read as \"no allergies\".\n *\n * Pair with `AllergyManager` for the batteries-included experience.\n */\nexport const AllergyList = React.forwardRef<HTMLDivElement, AllergyListProps>(\n (\n {\n allergies,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n actions = DEFAULT_ACTIONS,\n onAction,\n onReorder,\n addSearch,\n onAdd,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const groups = TYPE_ORDER.map((type) => ({\n type,\n label: ALLERGY_TYPE_LABELS[type],\n items: allergies.filter((a) => (a.type ?? 'other') === type),\n })).filter((g) => g.items.length > 0);\n\n const empty = allergies.length === 0;\n\n // Drag & drop reordering, restricted to the same category group.\n const typeOf = React.useCallback(\n (id: string) => allergies.find((a) => a.id === id)?.type ?? 'other',\n [allergies]\n );\n const drag = useDragReorder({\n ids: allergies.map((a) => a.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n setAnnouncement(m('Allergy list reordered'));\n onReorder(ids);\n },\n canDropOn: (dragged, target) => typeOf(dragged) === typeOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the category. */\n const moveAllergy = React.useCallback(\n (allergy: Allergy, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = allergies.map((a) => a.id);\n const from = ids.indexOf(allergy.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < allergies.length &&\n (allergies[to].type ?? 'other') !== (allergy.type ?? 'other')\n ) {\n to += dir;\n }\n if (to < 0 || to >= allergies.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: allergy.allergen,\n })\n );\n onReorder(ids);\n },\n [allergies, m, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground flex items-center gap-2 text-sm font-semibold tracking-wide uppercase\">\n <AlertCircleIcon\n size={16}\n className=\"text-red-600 dark:text-red-400\"\n />\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-5 px-4 py-4\">\n {empty ? (\n <div className=\"space-y-2\">\n {noKnownAllergies ? (\n <p className=\"text-foreground flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n {m('No known allergies (NKA)')}\n </p>\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {m('Allergy status not recorded.')}\n </p>\n )}\n {!readOnly && onNoKnownAllergiesChange && (\n <Button\n variant={noKnownAllergies ? 'secondary' : 'outline'}\n size=\"sm\"\n onClick={() => onNoKnownAllergiesChange(!noKnownAllergies)}\n >\n {noKnownAllergies\n ? m('Clear no-known-allergies')\n : m('Confirm: no known allergies')}\n </Button>\n )}\n </div>\n ) : (\n groups.map(({ type, label, items }) => (\n <section key={type} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n <ul className=\"mt-1\">\n {items.map((allergy) => (\n <AllergyRow\n key={allergy.id}\n allergy={allergy}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveAllergy}\n onAction={onAction}\n />\n ))}\n </ul>\n </section>\n ))\n )}\n\n {!readOnly && (addSearch || onAdd) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add allergy')}\n </span>\n {addSearch}\n {onAdd && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAdd}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </CardContent>\n\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nAllergyList.displayName = 'AllergyList';\n\nexport default AllergyList;\n","'use client';\n\n/**\n * CodeLookupProvider — supply an offline `CodeLookup` once so the clinical\n * components (allergies, medications, conditions, orders, assessment) default\n * to coded search without per-component wiring.\n *\n * `CodeLookup` ships a module Web Worker the library's tsup build can't bundle,\n * so it can't be imported here — the app injects the component (import it from\n * its own bundler, e.g. Vite/Next) and this context distributes it:\n *\n * ```tsx\n * import { CodeLookupProvider } from '@mieweb/ui';\n * import { CodeLookup } from '…/CodeLookup'; // app bundler resolves the worker\n *\n * <CodeLookupProvider component={CodeLookup} indexUrl=\"/codify\">\n * <App />\n * </CodeLookupProvider>\n * ```\n *\n * Components read the context as their default; an explicit `codeLookup` /\n * `renderCodeSearch` prop overrides it, and `codeLookup={false}` (or\n * `renderCodeSearch={false}`) opts a component out back to plain text.\n *\n * This module is intentionally worker-free (only a `import type` of\n * `CodeLookupProps`, which is erased at build) so it is safe to ship in the\n * main `@mieweb/ui` entry.\n */\n\nimport * as React from 'react';\nimport type { CodeLookupProps } from './CodeLookup';\nimport type { MemoryStorage } from './memoryBackend';\n\n/**\n * The CodeLookup component the provider distributes to consumers.\n *\n * Typed as a bare function component (not `ComponentType`) so it stays\n * structurally assignable into the narrower per-domain lookup configs\n * (`MedicationLookupProps`, `OrderLookupProps`, …) — a `ComponentType` union\n * drags in `ComponentClass.defaultProps`, whose contravariance breaks that\n * assignment. `CodeLookup` is a function component, so this is exact.\n */\nexport type CodeLookupComponent = (\n props: CodeLookupProps\n) => React.ReactElement | null;\n\n/**\n * App-wide defaults for the CodeLookup memory picklist. Naming a signed-in\n * `userId` here turns the picklist on for every lookup below the provider —\n * instances need no wiring, and `memory={false}` (here or per-instance) turns\n * it back off.\n */\nexport interface CodeLookupMemoryDefaults {\n /** Signed-in user the counts belong to. No id, no memory. */\n userId?: string;\n /** Default count-sync endpoint (per-instance prop wins). */\n serverUrl?: string;\n /**\n * Bucket the counts are scoped to. Defaults per instance to that lookup's\n * `domains`, which keeps a med picker and a problem picker apart; set this\n * to pool every lookup into one list instead.\n */\n context?: string;\n /**\n * Where picks are cached on this machine. `'local'` (IndexedDB) asserts a\n * per-user device secured by a browser login; the default `'session'` keeps\n * them in RAM for the tab, which is what a public kiosk wants.\n */\n storage?: MemoryStorage;\n}\n\n/** Resolved lookup wiring a component consumes (from prop or context). */\nexport interface CodeLookupProviderConfig {\n /** The injected CodeLookup component (worker-capable, from the app bundle). */\n component: CodeLookupComponent;\n /** Base URL the codify worker fetches `{locale}/manifest.json` + shards from. */\n indexUrl: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /**\n * Defaults for the memory picklist, or `false` to disable it everywhere\n * below this provider (a public kiosk build). Naming a `userId` here is all\n * an instance needs; `false` overrides a component's own `memory` config.\n */\n memory?: false | CodeLookupMemoryDefaults;\n}\n\n// Internal compositions use the context directly to retain their mounted draft\n// when a host adds or removes lookup wiring. It is not in the public entry.\nexport const CodeLookupContext =\n React.createContext<CodeLookupProviderConfig | null>(null);\n\nexport interface CodeLookupProviderProps {\n /** The CodeLookup component to distribute (import it in your app). */\n component: CodeLookupComponent;\n /** Where the codify index is served (default '/codify'). */\n indexUrl?: string;\n /** Shard-set locale (default 'en'). */\n locale?: string;\n /** Defaults for the memory picklist, or `false` to disable it everywhere. */\n memory?: false | CodeLookupMemoryDefaults;\n children: React.ReactNode;\n}\n\nexport function CodeLookupProvider({\n component,\n indexUrl = '/codify',\n locale = 'en',\n memory,\n children,\n}: CodeLookupProviderProps): React.ReactElement {\n const value = React.useMemo<CodeLookupProviderConfig>(\n () => ({ component, indexUrl, locale, memory }),\n [component, indexUrl, locale, memory]\n );\n return (\n <CodeLookupContext.Provider value={value}>\n {children}\n </CodeLookupContext.Provider>\n );\n}\n\n/**\n * The ambient CodeLookup config supplied by the nearest `CodeLookupProvider`,\n * or `null` when none is mounted (components then fall back to plain text).\n */\nexport function useCodeLookupConfig(): CodeLookupProviderConfig | null {\n return React.useContext(CodeLookupContext);\n}\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\n/**\n * AllergyManager — batteries-included allergy list.\n *\n * Wraps the presentational `AllergyList` with the interaction layer: the\n * allergy editor (Correct / Add with CodeLookup allergen coding), the note\n * dialog, removal, and the no-known-allergies (NKA) flow. Uncontrolled via\n * `defaultAllergies` / controlled via `allergies` + `onChange` — same\n * pattern as `MedicationReconciliation`.\n */\n\nimport * as React from 'react';\nimport {\n AllergyList,\n type Allergy,\n type AllergyAction,\n type AllergyKind,\n type AllergySeverity,\n type AllergyType,\n} from './AllergyList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { Select } from '../Select';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { CodeLookupConfig } from '../MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AllergyManagerProps {\n /** Controlled allergy list (use with `onChange`) */\n allergies?: Allergy[];\n /** Initial allergy list (uncontrolled) */\n defaultAllergies?: Allergy[];\n /** Called with the next list after every mutation */\n onChange?: (allergies: Allergy[]) => void;\n /** No-known-allergies flag (controlled; see AllergyList) */\n noKnownAllergies?: boolean;\n /** Called when NKA is toggled */\n onNoKnownAllergiesChange?: (value: boolean) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /**\n * CodeLookup wiring for allergen search (drug shard). Enables both the\n * inline add bar and coded allergens in the editor. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force plain text.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require coded new allergens; non-drug searches use SNOMED substance concepts. */\n requireCode?: boolean;\n /** Render an inline allergen search bar in the add section (requires codeLookup) */\n inlineAddSearch?: boolean;\n /** Hide all action affordances (display only) */\n readOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `alg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Editor dialog\n// =============================================================================\n\nconst TYPE_OPTIONS = [\n { value: 'drug', label: 'Drug' },\n { value: 'food', label: 'Food' },\n { value: 'environmental', label: 'Environmental' },\n { value: 'other', label: 'Other' },\n];\n\nfunction AllergyEditor({\n allergy,\n codeLookup,\n requireCode = false,\n onClose,\n onSave,\n}: {\n allergy?: Allergy;\n codeLookup?: CodeLookupConfig;\n requireCode?: boolean;\n onClose: () => void;\n onSave: (allergy: Allergy) => void;\n}) {\n const m = useMessages();\n const [draft, setDraft] = React.useState<Allergy>(\n () => allergy ?? { id: newId(), allergen: '', type: 'drug' }\n );\n\n const patch = (p: Partial<Allergy>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n // Focus the allergen search / input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n bodyRef.current?.querySelector('input')?.focus();\n }, []);\n\n const hasCode = Boolean(draft.code?.system.trim() && draft.code.code.trim());\n // Only records that were uncoded on entry are exempt from requireCode —\n // an originally coded allergy must keep (or replace) its code.\n const unchangedLegacyAllergen =\n allergy &&\n !allergy.code &&\n draft.allergen === allergy.allergen &&\n (draft.type ?? 'drug') === (allergy.type ?? 'drug');\n const canSave =\n draft.allergen.trim().length > 0 &&\n (!requireCode || hasCode || Boolean(unchangedLegacyAllergen));\n\n // Required coding uses the host's SNOMED substance concepts for non-drug\n // allergens. The host must include those concepts in its condition shards.\n const isDrug = (draft.type ?? 'drug') === 'drug';\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>\n {allergy ? m('Correct Allergy') : m('Add Allergy')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <div ref={bodyRef} className=\"contents\">\n <RadioGroup\n name=\"alg-kind\"\n label={m('Mechanism')}\n description={m(\n 'A true immune-mediated allergy, or a non-immune intolerance (e.g. GI upset)'\n )}\n value={draft.kind ?? 'allergy'}\n onValueChange={(v) => patch({ kind: v as AllergyKind })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"allergy\" label={m('Allergy')} />\n <Radio value=\"intolerance\" label={m('Intolerance')} />\n </RadioGroup>\n\n <Select\n label={m('Type')}\n options={TYPE_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={draft.type ?? 'drug'}\n onValueChange={(v) => {\n const type = v as AllergyType;\n // A drug code is wrong on a non-drug allergen.\n patch({\n type,\n ...(type !== (draft.type ?? 'drug') && { code: undefined }),\n });\n }}\n />\n\n {codeLookup && (isDrug || requireCode) ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-search\">{m('Allergen')}</Label>\n <codeLookup.component\n indexUrl={codeLookup.indexUrl}\n locale={codeLookup.locale}\n domains={isDrug ? ['med'] : ['condition']}\n searchCodetypes={isDrug ? undefined : ['SNOMED US']}\n bare\n clearOnSelect={false}\n placeholder={\n isDrug\n ? m('Search drug allergens — e.g. penicillin')\n : m('Search SNOMED allergen substances')\n }\n initialQuery={allergy?.allergen || undefined}\n initialSearch={allergy ? !allergy.code : undefined}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n patch({\n allergen: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n });\n }}\n onFreeText={\n requireCode\n ? undefined\n : (text) => patch({ allergen: text, code: undefined })\n }\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? m('Coded: {system} {code}', {\n system: draft.code.system,\n code: draft.code.code,\n })\n : draft.allergen\n ? m('Uncoded free text: \"{name}\"', {\n name: draft.allergen,\n })\n : requireCode\n ? m('Pick a catalog result to code the allergen')\n : m(\n 'Pick a result to code the allergen, or press Enter for free text'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-name\">{m('Allergen')}</Label>\n <Input\n id=\"alg-name\"\n value={draft.allergen}\n readOnly={requireCode}\n onChange={(e) =>\n patch({ allergen: e.target.value, code: undefined })\n }\n />\n </div>\n )}\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-reaction\">{m('Reaction')}</Label>\n <Input\n id=\"alg-reaction\"\n value={draft.reaction ?? ''}\n onChange={(e) => patch({ reaction: e.target.value })}\n />\n </div>\n\n <RadioGroup\n name=\"alg-severity\"\n label={m('Severity')}\n value={draft.severity ?? ''}\n onValueChange={(v) =>\n patch({ severity: (v || undefined) as AllergySeverity })\n }\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"mild\" label={m('Mild')} />\n <Radio value=\"moderate\" label={m('Moderate')} />\n <Radio value=\"severe\" label={m('Severe')} />\n </RadioGroup>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-onset\">{m('Onset date')}</Label>\n <DateInput\n id=\"alg-onset\"\n value={draft.onsetDate ?? ''}\n onChange={(v) => patch({ onsetDate: v })}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note\">{m('Note')}</Label>\n <Textarea\n id=\"alg-note\"\n value={draft.note ?? ''}\n onChange={(e) => patch({ note: e.target.value })}\n rows={2}\n />\n </div>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n onSave({ ...draft, allergen: draft.allergen.trim() });\n onClose();\n }}\n disabled={!canSave}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// AllergyManager\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; allergy: Allergy }\n | { kind: 'note'; allergy: Allergy }\n | { kind: 'add' }\n | null;\n\n/**\n * @example Patient intake (uncontrolled, inline search, NKA)\n * ```tsx\n * <AllergyManager\n * defaultAllergies={[]}\n * inlineAddSearch\n * codeLookup={{ component: CodeLookup, indexUrl: '/codify' }}\n * noKnownAllergies={nka}\n * onNoKnownAllergiesChange={setNka}\n * onChange={save}\n * />\n * ```\n */\nexport function AllergyManager({\n allergies: controlled,\n defaultAllergies,\n onChange,\n noKnownAllergies,\n onNoKnownAllergiesChange,\n title = 'Allergies',\n codeLookup,\n requireCode = false,\n inlineAddSearch = false,\n readOnly = false,\n className,\n 'data-testid': dataTestId,\n}: AllergyManagerProps): React.JSX.Element {\n const m = useMessages();\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = React.useState<Allergy[]>(\n defaultAllergies ?? []\n );\n const allergies = isControlled ? controlled : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n const [noteDraft, setNoteDraft] = React.useState('');\n\n const commit = (next: Allergy[]) => {\n if (!isControlled) setInternal(next);\n // Any recorded allergy clears the NKA flag.\n if (next.length > 0 && noKnownAllergies) {\n onNoKnownAllergiesChange?.(false);\n }\n onChange?.(next);\n };\n\n const handleAction = (allergy: Allergy, action: AllergyAction) => {\n switch (action) {\n case 'remove':\n commit(allergies.filter((a) => a.id !== allergy.id));\n break;\n case 'correct':\n setDialog({ kind: 'correct', allergy });\n break;\n case 'note':\n setNoteDraft(allergy.note ?? '');\n setDialog({ kind: 'note', allergy });\n break;\n }\n };\n\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder={m(\n 'Search drug allergens to add — use Add for food/environmental'\n )}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n commit([\n ...allergies,\n {\n id: newId(),\n allergen: result.label,\n type: 'drug',\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n },\n ]);\n }}\n onFreeText={\n requireCode\n ? undefined\n : (text) =>\n // this search bar is explicitly for drug allergens — free-text\n // entries carry type 'drug' like the coded path\n commit([\n ...allergies,\n { id: newId(), allergen: text, type: 'drug' },\n ])\n }\n />\n ) : undefined;\n\n return (\n <>\n <AllergyList\n allergies={allergies}\n noKnownAllergies={noKnownAllergies}\n onNoKnownAllergiesChange={onNoKnownAllergiesChange}\n title={title}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...allergies].sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id))\n )\n }\n addSearch={addSearch}\n onAdd={\n requireCode && !effectiveCodeLookup\n ? undefined\n : () => setDialog({ kind: 'add' })\n }\n readOnly={readOnly}\n className={className}\n data-testid={dataTestId}\n />\n\n {dialog && (dialog.kind === 'correct' || dialog.kind === 'add') && (\n <AllergyEditor\n key={dialog.kind === 'correct' ? dialog.allergy.id : 'add'}\n allergy={dialog.kind === 'correct' ? dialog.allergy : undefined}\n codeLookup={effectiveCodeLookup}\n requireCode={requireCode}\n onClose={() => setDialog(null)}\n onSave={(saved) => {\n if (dialog.kind === 'correct') {\n commit(allergies.map((a) => (a.id === saved.id ? saved : a)));\n } else {\n commit([...allergies, saved]);\n }\n }}\n />\n )}\n\n {dialog?.kind === 'note' && (\n <Modal open onOpenChange={(o) => !o && setDialog(null)} size=\"md\">\n <ModalHeader>\n <ModalTitle>{m('Allergy Notes')}</ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.allergy.allergen}\n </p>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"alg-note-dlg\">{m('Note')}</Label>\n <Textarea\n id=\"alg-note-dlg\"\n value={noteDraft}\n onChange={(e) => setNoteDraft(e.target.value)}\n rows={4}\n />\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={() => setDialog(null)}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n commit(\n allergies.map((a) =>\n a.id === dialog.allergy.id\n ? { ...a, note: noteDraft.trim() || undefined }\n : a\n )\n );\n setDialog(null);\n }}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n )}\n </>\n );\n}\n\nexport default AllergyManager;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { Input } from '../Input';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n LinkIcon,\n PlusIcon,\n PillIcon,\n TestTubeIcon,\n ScanIcon,\n StethoscopeIcon,\n SendIcon,\n AlertCircleIcon,\n GripVerticalIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n MoreVerticalIcon,\n TrashIcon,\n} from '../Icons';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport {\n CodingChips,\n type ConditionAssertion,\n type ConditionConcern,\n} from '../ProblemList';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n reorderIds,\n} from '../../hooks/useDragReorder';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport {\n useCodeLookupConfig,\n type CodeLookupProviderConfig,\n} from '../CodeLookup/context';\nimport type { CodifyDomain } from '../CodeLookup/CodeLookup';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Order categories that can nest under an assessed problem. */\nexport type OrderType =\n | 'medication'\n | 'lab'\n | 'imaging'\n | 'procedure'\n | 'referral';\n\n/**\n * An order placed this visit. Links to a problem via concernId (durable\n * IndicationLink) — orders without a concernId collect in the unlinked bucket.\n */\nexport interface AssessmentOrder {\n orderId: string;\n type: OrderType;\n /** Display text, e.g. \"insulin glargine 10 units qhs\" */\n display: string;\n /** Durable link to the problem this order is for */\n concernId?: string;\n /** Secondary display text, e.g. status or sig */\n detail?: string;\n /** Coding from the code lookup, when the order was picked from it */\n code?: { fullid: string; codetype: string; fullcode: string };\n /** Urgency — routine when omitted */\n priority?: 'routine' | 'urgent' | 'stat';\n /** When to perform/collect, e.g. 'in 3 months', 'next visit' */\n timing?: string;\n /** Why the order is placed (diagnosis / reason) */\n indication?: string;\n /** Notes to the performing party (lab, radiology, consultant) */\n notes?: string;\n /** Imaging/procedure: body site, e.g. 'chest, PA and lateral', 'left knee' */\n bodySite?: string;\n /** Referral: target specialty or provider */\n referTo?: string;\n}\n\n/** A code picked from a lookup (structurally matches CodifyResult). */\nexport interface OrderCodePick {\n fullid: string;\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/** What the unified add row hands back: a coded pick or free text. */\nexport interface AssessmentAddPick {\n label: string;\n /** Absent for free-text entries */\n code?: { fullid: string; codetype: string; fullcode: string };\n}\n\n/**\n * Render-prop that draws the add-order / add-problem code search. `domains`\n * reflects the user's order-type filter ('auto' = undefined = search\n * everything) and `placeholder` is context-specific; call `onPick` with the\n * chosen code (or `onFreeText` when free text is supported).\n */\nexport type RenderOrderSearch = (args: {\n domains?: string[];\n /** Rank results from these domains first (auto mode: concerns before orders) */\n preferDomains?: string[];\n /** Boost these coding systems (assessments prefer ICD-10 over SNOMED) */\n preferCodetypes?: string[];\n /** Restrict condition results to billable (leaf) ICD-10 codes */\n billableOnly?: boolean;\n placeholder: string;\n onPick: (pick: OrderCodePick) => void;\n /** Present when free-text entry is supported in this context */\n onFreeText?: (text: string) => void;\n}) => React.ReactNode;\n\n/** Infer the order type from the picked code's coding system. */\nexport function orderTypeForCodetype(codetype: string): OrderType {\n const ct = codetype.toUpperCase();\n if (['RXNORM', 'FDB', 'FDB MEDNAME', 'NDC', 'CVX'].includes(ct)) {\n return 'medication';\n }\n if (ct.startsWith('LOINC') || ct.endsWith('ORDER')) return 'lab';\n return 'procedure'; // HCPCS, ICD10PCS, … (imaging is a manual choice)\n}\n\n/**\n * Default order/problem search built from an ambient `CodeLookupProvider`: a\n * bare lookup that forwards the caller's domain/preference hints to the\n * injected CodeLookup. Used when no explicit `renderOrderSearch` prop is given.\n */\nfunction contextOrderSearch(ctx: CodeLookupProviderConfig): RenderOrderSearch {\n const ContextOrderSearch: RenderOrderSearch = ({\n domains,\n preferDomains,\n preferCodetypes,\n billableOnly,\n placeholder,\n onPick,\n onFreeText,\n }) => {\n const Lookup = ctx.component;\n return (\n <Lookup\n indexUrl={ctx.indexUrl}\n locale={ctx.locale}\n domains={domains as CodifyDomain[] | undefined}\n preferDomains={preferDomains as CodifyDomain[] | undefined}\n preferCodetypes={preferCodetypes}\n billableOnly={billableOnly}\n bare\n clearOnSelect\n placeholder={placeholder}\n onSelect={(result) =>\n onPick({\n fullid: result.fullid,\n label: result.label,\n codetype: result.codetype,\n fullcode: result.fullcode,\n })\n }\n onFreeText={onFreeText}\n />\n );\n };\n return ContextOrderSearch;\n}\n\n/** Coding systems that represent a diagnosis/problem rather than an order.\n * Occupational surveillance programs (OSHA/FMCSA/NFPA/FAA) are concerns too —\n * a program joins the problem list and its required orders link under it. */\nexport function isConditionCodetype(codetype: string): boolean {\n const ct = codetype.toUpperCase();\n return (\n ct === 'ICD10' ||\n ct === 'ICD9' ||\n ct === 'SNOMED US' ||\n ct === 'OSHA' ||\n ct === 'FMCSA' ||\n ct === 'NFPA' ||\n ct === 'FAA'\n );\n}\n\n/** Code-lookup domains to search for an order-type filter. */\nexport const ORDER_TYPE_SEARCH_DOMAINS: Record<OrderType, string[]> = {\n medication: ['med', 'vaccine'],\n lab: ['lab'],\n imaging: ['procedure'],\n procedure: ['procedure'],\n referral: ['procedure'],\n};\n\n/** Context-specific search placeholder per order-type filter. */\nconst ORDER_TYPE_PLACEHOLDERS: Record<'auto' | OrderType, string> = {\n auto: 'Search medications, labs, imaging, procedures…',\n medication: 'Search medications… (try \"lasix\")',\n lab: 'Search labs… (try \"a1c\")',\n imaging: 'Search imaging… (try \"chest x\")',\n procedure: 'Search procedures…',\n referral: 'Search referrals & consults…',\n};\n\n/** One assessed problem this visit. */\nexport interface AssessmentItem {\n concernId: string;\n /** Today's assertion for the concern (even a no-change \"addressed today\" one) */\n assertionId: string;\n note?: string;\n}\n\n/** Actions available on an assessed problem. */\nexport type AssessmentAction = 'refine' | 'revise' | 'add-order';\nexport type AssessmentRowAction = AssessmentAction | 'remove' | 'move';\nexport type AssessmentOrderAction = 'edit' | 'remove' | 'move';\nexport type AssessmentAddMode = 'auto' | 'problem' | 'order';\n\nexport interface AssessmentProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Concerns addressed this visit (with their assertion history) */\n concerns: ConditionConcern[];\n /** Assessment entries — one per assessed concern (controlled) */\n items: AssessmentItem[];\n /** Orders placed this visit */\n orders?: AssessmentOrder[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Show the plan (orders nested under each problem). Default true. */\n showPlan?: boolean;\n /** Called when the plan toggle changes (omit to hide the toggle) */\n onShowPlanChange?: (show: boolean) => void;\n /** Called when a row action is clicked */\n onAction?: (item: AssessmentItem, action: AssessmentAction) => void;\n /** Actions available on assessment rows. */\n rowActions?: readonly AssessmentRowAction[];\n /** Actions available on existing order rows. */\n orderActions?: readonly AssessmentOrderAction[];\n /** Modes available in the global add row. */\n addModes?: readonly AssessmentAddMode[];\n /** Accessible label for the global capture form; distinguish multiple editors on one page. */\n addFormLabel?: string;\n /** Rendered at the start of the global add row (e.g. an assertion date input). */\n addFormStart?: React.ReactNode;\n /** Remove a problem from this visit's assessment, not its longitudinal record. */\n onRemoveAssessment?: (item: AssessmentItem) => void;\n /**\n * Called when a new order is created from the inline order form.\n * Enables the \"Add order\" affordances — `item` is null when the order is\n * added from the unlinked bucket. The new order should come back in via\n * `orders` (with `concernId` set to the item's concern when linked).\n */\n onAddOrder?: (\n item: AssessmentItem | null,\n order: { type: OrderType; display: string; code?: AssessmentOrder['code'] }\n ) => void;\n /**\n * Called when a diagnosis (coded or free text) is added as a new problem\n * via the unified add row. Enables it together with renderOrderSearch.\n */\n onAddAssessment?: (pick: AssessmentAddPick) => void;\n /**\n * Render a code-lookup search for the add-order / add-problem forms\n * (dependency-injected so the library build doesn't bundle the lookup's\n * worker — pass e.g. a CodeLookup wired to your index). Defaults to the\n * ambient `CodeLookupProvider`; pass `false` to fall back to free-text\n * order entry.\n */\n renderOrderSearch?: RenderOrderSearch | false;\n /** Called when an unlinked order is linked to a problem — also used when an\n * order is dragged onto another problem (re-link = move) */\n onLinkOrder?: (order: AssessmentOrder, concernId: string) => void;\n /**\n * Called when the user chooses Edit on an order, before the built-in\n * inline form opens. Return true to take over editing — e.g. open a\n * `MedicationEditor` for medication orders — and feed the change back in\n * via `orders`. Anything falsy falls through to the inline display/detail\n * form (when `onEditOrder` is set).\n */\n onEditOrderStart?: (order: AssessmentOrder) => boolean | void;\n /**\n * Called with the edited display/detail when an order's inline edit is\n * saved — enables the Edit action on every order row (any type).\n * Persist and feed the change back in via `orders`.\n */\n onEditOrder?: (\n order: AssessmentOrder,\n changes: { display: string; detail?: string }\n ) => void;\n /** Called when an order is removed — enables the Remove action on order rows */\n onRemoveOrder?: (order: AssessmentOrder) => void;\n /**\n * Called with the full new order-id sequence after an order is dragged to a\n * new position — enables drag & drop reordering of orders within a plan.\n * Orders render in `orders` array order per problem; persist and feed back.\n */\n onReorderOrders?: (orderIds: string[]) => void;\n /**\n * Called with the new concernId order after a problem block is dragged —\n * enables drag & drop reordering of the assessment. The list renders in\n * `items` order; persist and feed the order back in.\n */\n onReorderItems?: (concernIds: string[]) => void;\n /** Hide all controls (display only) */\n readOnly?: boolean;\n /**\n * Initial mode of the unified add row's \"What to add\" selector.\n * Default 'auto' (the pick's coding system decides concern vs order).\n */\n defaultAddMode?: AssessmentAddMode;\n /**\n * Restrict concern searches to billable (leaf) ICD-10 codes — category\n * roots (E11) and SNOMED synonyms are dropped. Forwarded to\n * renderOrderSearch as `billableOnly`.\n */\n billableOnly?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const ORDER_TYPE_META: Record<\n OrderType,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n medication: { label: 'Medication', icon: PillIcon },\n lab: { label: 'Lab', icon: TestTubeIcon },\n imaging: { label: 'Imaging', icon: ScanIcon },\n procedure: { label: 'Procedure', icon: StethoscopeIcon },\n referral: { label: 'Referral', icon: SendIcon },\n};\n\ntype AssessmentToolbarAction = 'refine' | 'revise' | 'add-order';\n\nconst ACTION_META: Record<\n AssessmentToolbarAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n 'add-order': { label: 'Add order', icon: PlusIcon },\n};\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction OrderContent({ order }: { order: AssessmentOrder }) {\n const m = useMessages();\n const meta = ORDER_TYPE_META[order.type];\n const Icon = meta.icon;\n return (\n <span className=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <Tooltip content={m(meta.label)}>\n <Icon size={14} />\n </Tooltip>\n {/* the tooltip is pointer-only — give non-pointer users the label */}\n <span className=\"sr-only\">{m(meta.label)}</span>\n <span className=\"text-foreground\">{order.display}</span>\n {order.priority && order.priority !== 'routine' && (\n <Badge\n variant={order.priority === 'stat' ? 'danger' : 'warning'}\n size=\"sm\"\n >\n {m(order.priority)}\n </Badge>\n )}\n {order.detail && <span className=\"text-xs\">{order.detail}</span>}\n {order.timing && <span className=\"text-xs\">{order.timing}</span>}\n </span>\n );\n}\n\n/** Drag state shared by the order rows and the problem-block drop targets. */\ninterface OrderDrag {\n draggingId: string | null;\n over:\n | { type: 'order'; id: string; after: boolean }\n | { type: 'concern'; concernId: string }\n | null;\n rowProps: (order: AssessmentOrder) => React.HTMLAttributes<HTMLElement>;\n enabled: boolean;\n}\n\n/** Keyboard + menu controls for an order row (the non-pointer path for DnD). */\ninterface OrderControls {\n /** Reorder within the current plan (Alt+↑/↓, menu) */\n moveWithin?: (order: AssessmentOrder, dir: -1 | 1) => void;\n /** Re-link to another problem (Alt+←/→, menu) */\n moveToProblem?: (order: AssessmentOrder, concernId: string) => void;\n /** Take over editing before the inline form opens (returns true = handled) */\n editStart?: (order: AssessmentOrder) => boolean | void;\n /** Save an inline edit of the order's display/detail (menu: Edit) */\n edit?: (\n order: AssessmentOrder,\n changes: { display: string; detail?: string }\n ) => void;\n /** Remove the order (menu: Remove) */\n remove?: (order: AssessmentOrder) => void;\n /** The problem before/after the order's current one, if any */\n adjacentProblem: (\n order: AssessmentOrder,\n dir: -1 | 1\n ) => { concernId: string; label: string } | null;\n /** All problems (for the Move to… menu) */\n targets: { concernId: string; label: string }[];\n}\n\nfunction OrderRow({\n order,\n drag,\n controls,\n}: {\n order: AssessmentOrder;\n drag: OrderDrag;\n controls?: OrderControls;\n}) {\n const m = useMessages();\n const interactive = Boolean(\n controls?.moveWithin ||\n controls?.moveToProblem ||\n controls?.edit ||\n controls?.editStart ||\n controls?.remove\n );\n const canEdit = Boolean(controls?.edit || controls?.editStart);\n const [editing, setEditing] = React.useState<{\n display: string;\n detail: string;\n } | null>(null);\n // Controlled so picking an item closes the menu (it otherwise only closes\n // on outside click/Escape — it would linger behind an editor modal).\n const [menuOpen, setMenuOpen] = React.useState(false);\n\n const pick = (fn: () => void) => () => {\n setMenuOpen(false);\n fn();\n };\n\n const beginEdit = () => {\n // A takeover handler (e.g. MedicationEditor for medication orders) wins;\n // otherwise fall back to the inline display/detail form.\n if (controls?.editStart?.(order)) return;\n if (controls?.edit) {\n setEditing({ display: order.display, detail: order.detail ?? '' });\n }\n };\n\n const saveEdit = () => {\n if (!editing) return;\n const display = editing.display.trim();\n if (display) {\n controls?.edit?.(order, {\n display,\n detail: editing.detail.trim() || undefined,\n });\n }\n setEditing(null);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget || !controls) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n controls.moveWithin?.(order, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.altKey && (e.key === 'ArrowLeft' || e.key === 'ArrowRight')) {\n e.preventDefault();\n // Problem columns are laid out by the document flow, so ←/→ are\n // visual: invert under RTL.\n const back = isRtl(e.currentTarget) ? 'ArrowRight' : 'ArrowLeft';\n const adj = controls.adjacentProblem(order, e.key === back ? -1 : 1);\n if (adj) controls.moveToProblem?.(order, adj.concernId);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between order rows in the same plan\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-order-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Order rows are focus stops so the drag interactions have a full keyboard\n // equivalent: Alt+↑/↓ reorders, Alt+←/→ moves between problems (508).\n <li\n data-order-id={order.orderId}\n tabIndex={interactive && !editing ? 0 : undefined}\n onKeyDown={interactive && !editing ? handleKeyDown : undefined}\n aria-label={\n interactive && !editing\n ? m(\n '{name}. Alt plus up or down to reorder; Alt plus left or right to move to another problem.',\n { name: order.display }\n )\n : undefined\n }\n {...(editing ? {} : drag.rowProps(order))}\n className={cn(\n 'group/order relative flex items-center gap-1.5 py-1',\n 'focus-visible:ring-ring rounded focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && !editing && 'cursor-grab active:cursor-grabbing',\n drag.draggingId === order.orderId && 'opacity-40',\n drag.over?.type === 'order' &&\n drag.over.id === order.orderId &&\n (drag.over.after\n ? 'shadow-[inset_0_-2px_0_0_var(--color-primary-500,#3b82f6)]'\n : 'shadow-[inset_0_2px_0_0_var(--color-primary-500,#3b82f6)]')\n )}\n >\n {drag.enabled && !editing && (\n <GripVerticalIcon\n size={12}\n aria-hidden\n className=\"text-muted-foreground/40 shrink-0\"\n />\n )}\n {editing ? (\n <div\n role=\"form\"\n aria-label={m('Edit order {name}', { name: order.display })}\n className=\"flex flex-1 flex-wrap items-center gap-1.5\"\n >\n <div className=\"min-w-40 flex-1\">\n <Input\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n size=\"sm\"\n value={editing.display}\n onChange={(e) =>\n setEditing((prev) =>\n prev ? { ...prev, display: e.target.value } : prev\n )\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n else if (e.key === 'Escape') setEditing(null);\n }}\n aria-label={m('Order description')}\n className=\"h-7\"\n />\n </div>\n <div className=\"w-40\">\n <Input\n size=\"sm\"\n value={editing.detail}\n onChange={(e) =>\n setEditing((prev) =>\n prev ? { ...prev, detail: e.target.value } : prev\n )\n }\n onKeyDown={(e) => {\n if (e.key === 'Enter') saveEdit();\n else if (e.key === 'Escape') setEditing(null);\n }}\n placeholder={m('detail (sig, timing…)')}\n aria-label={m('Order detail')}\n className=\"h-7 text-xs\"\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={saveEdit}\n disabled={!editing.display.trim()}\n className=\"h-7 text-xs\"\n >\n {m('Save')}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setEditing(null)}\n className=\"h-7 text-xs\"\n >\n {m('Cancel')}\n </Button>\n </div>\n ) : (\n <>\n <OrderContent order={order} />\n {interactive && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: order.display })}\n group=\"order\"\n >\n {canEdit && (\n <RowIconButton\n label={m('Edit')}\n icon={PencilIcon}\n size=\"sm\"\n onClick={beginEdit}\n />\n )}\n {(controls?.moveWithin ||\n (controls?.moveToProblem &&\n controls.targets.some(\n (t) => t.concernId !== order.concernId\n ))) && (\n <Dropdown\n open={menuOpen}\n onOpenChange={setMenuOpen}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={m('Move {name}', { name: order.display })}\n className=\"h-7 w-7 shrink-0\"\n >\n <MoreVerticalIcon size={14} />\n </Button>\n }\n placement=\"bottom-end\"\n >\n {controls?.moveWithin && (\n <>\n <DropdownItem\n icon={<ChevronUpIcon size={14} />}\n onClick={pick(() => controls.moveWithin?.(order, -1))}\n >\n {m('Move up')}\n </DropdownItem>\n <DropdownItem\n icon={<ChevronDownIcon size={14} />}\n onClick={pick(() => controls.moveWithin?.(order, 1))}\n >\n {m('Move down')}\n </DropdownItem>\n </>\n )}\n {controls?.moveToProblem &&\n controls.targets.some(\n (t) => t.concernId !== order.concernId\n ) && (\n <>\n {controls.moveWithin && <DropdownSeparator />}\n {controls.targets\n .filter((t) => t.concernId !== order.concernId)\n .map((t) => (\n <DropdownItem\n key={t.concernId}\n icon={<LinkIcon size={14} />}\n onClick={pick(() =>\n controls.moveToProblem?.(order, t.concernId)\n )}\n >\n {m('Move to: {name}', { name: t.label })}\n </DropdownItem>\n ))}\n </>\n )}\n </Dropdown>\n )}\n {controls?.remove && (\n <RowIconButton\n label={m('Remove')}\n icon={TrashIcon}\n size=\"sm\"\n onClick={() => controls.remove?.(order)}\n />\n )}\n </RowActionToolbar>\n )}\n </>\n )}\n </li>\n );\n}\n\n/** Inline per-problem order entry: type filter + code lookup (or free text). */\nfunction AddOrderForm({\n id,\n problemText,\n onSubmit,\n onCancel,\n renderSearch,\n}: {\n id: string;\n problemText: string;\n onSubmit: (order: {\n type: OrderType;\n display: string;\n code?: AssessmentOrder['code'];\n }) => void;\n onCancel: () => void;\n renderSearch?: AssessmentProps['renderOrderSearch'];\n}) {\n const m = useMessages();\n const [type, setType] = React.useState<'auto' | OrderType>(\n renderSearch ? 'auto' : 'medication'\n );\n const [display, setDisplay] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n const submit = () => {\n const text = display.trim();\n if (!text) return;\n onSubmit({ type: type === 'auto' ? 'procedure' : type, display: text });\n setDisplay('');\n inputRef.current?.focus();\n };\n\n const handlePick = (pick: OrderCodePick) => {\n onSubmit({\n type: type === 'auto' ? orderTypeForCodetype(pick.codetype) : type,\n display: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n };\n\n return (\n <div\n id={id}\n role=\"form\"\n aria-label={m('Add order for {name}', { name: problemText })}\n className=\"border-border bg-muted/40 ms-2.5 mt-1.5 flex flex-wrap items-center gap-1.5 rounded-md border border-dashed p-2\"\n >\n <select\n aria-label={m('Order type filter')}\n data-slot=\"select-trigger\"\n value={type}\n onChange={(e) => setType(e.target.value as 'auto' | OrderType)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') onCancel();\n }}\n className={cn(\n 'border-border bg-background text-foreground rounded-md border px-1.5 text-sm',\n renderSearch ? 'h-10' : 'h-8',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n >\n {renderSearch && <option value=\"auto\">{m('Auto')}</option>}\n {(Object.keys(ORDER_TYPE_META) as OrderType[]).map((t) => (\n <option key={t} value={t}>\n {m(ORDER_TYPE_META[t].label)}\n </option>\n ))}\n </select>\n\n {renderSearch ? (\n <div className=\"min-w-64 flex-1\">\n {renderSearch({\n domains:\n type === 'auto' ? undefined : ORDER_TYPE_SEARCH_DOMAINS[type],\n placeholder: m(ORDER_TYPE_PLACEHOLDERS[type]),\n onPick: handlePick,\n onFreeText: (text) => {\n const t = text.trim();\n if (!t) return;\n onSubmit({\n type: type === 'auto' ? 'procedure' : type,\n display: t,\n });\n },\n })}\n </div>\n ) : (\n <>\n <div className=\"min-w-48 flex-1\">\n <Input\n ref={inputRef}\n size=\"sm\"\n value={display}\n onChange={(e) => setDisplay(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submit();\n else if (e.key === 'Escape') onCancel();\n }}\n placeholder={m('e.g. lisinopril 10 mg tablet — 1 po daily')}\n aria-label={m('Order description')}\n />\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submit}\n disabled={!display.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCancel}\n className={renderSearch ? 'h-10' : 'h-8'}\n >\n {m('Done')}\n </Button>\n </div>\n );\n}\n\n// =============================================================================\n// Assessment\n// =============================================================================\n\n/**\n * Visit-specific Assessment (& Plan). One block per assessed problem showing\n * today's assertion; with the plan enabled, orders linked to the problem (via\n * concernId — the durable IndicationLink) render indented under it. Orders\n * without a problem link collect in an unlinked bucket with a one-click link\n * affordance.\n *\n * Controlled component: concerns, items and orders come in via props; every\n * user interaction is reported through callbacks.\n *\n * @example\n * ```tsx\n * <Assessment\n * concerns={touchedConcerns}\n * items={assessment}\n * orders={orders}\n * onAction={(item, action) => handleAction(item, action)}\n * onLinkOrder={(order, concernId) => linkOrder(order.orderId, concernId)}\n * />\n * ```\n */\nexport const Assessment = React.forwardRef<HTMLDivElement, AssessmentProps>(\n (\n {\n concerns,\n items,\n orders = [],\n title = 'Assessment & plan',\n showPlan = true,\n onShowPlanChange,\n onAction,\n rowActions = [\n ...Object.keys(ACTION_META),\n 'remove',\n 'move',\n ] as AssessmentRowAction[],\n orderActions = ['edit', 'remove', 'move'],\n addModes,\n addFormLabel = 'Add concern or order',\n addFormStart,\n onRemoveAssessment,\n onAddOrder,\n onAddAssessment,\n onLinkOrder,\n onEditOrderStart,\n onEditOrder,\n onRemoveOrder,\n onReorderItems,\n onReorderOrders,\n renderOrderSearch,\n readOnly = false,\n defaultAddMode = 'auto',\n billableOnly = false,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const instanceId = React.useId();\n const [addingFor, setAddingFor] = React.useState<string | null>(null);\n const requestedAddModes: readonly AssessmentAddMode[] = addModes ?? [\n 'auto',\n 'problem',\n 'order',\n ];\n const availableAddModes = requestedAddModes.filter((mode) => {\n if (mode === 'problem') return Boolean(onAddAssessment);\n if (mode === 'order') return Boolean(onAddOrder);\n return Boolean(onAddAssessment && onAddOrder);\n });\n const initialAddMode = availableAddModes.includes(defaultAddMode)\n ? defaultAddMode\n : (availableAddModes[0] ?? defaultAddMode);\n const [selectedAddMode, setSelectedAddMode] =\n React.useState<AssessmentAddMode>(initialAddMode);\n const addMode = availableAddModes.includes(selectedAddMode)\n ? selectedAddMode\n : (availableAddModes[0] ?? defaultAddMode);\n /** Free text typed in auto mode — we must ask what it is before adding */\n const [pendingFreeText, setPendingFreeText] = React.useState<string | null>(\n null\n );\n /** Draft in the no-search fallback input of the unified add row */\n const [freeDraft, setFreeDraft] = React.useState('');\n React.useEffect(() => {\n if (addMode !== 'auto') setPendingFreeText(null);\n }, [addMode]);\n /** Shared free-text routing for the search and the fallback input. */\n const handleAddFreeText = (text: string) => {\n if (addMode === 'problem') {\n onAddAssessment?.({ label: text });\n } else if (addMode === 'order') {\n onAddOrder?.(null, {\n type: 'procedure',\n display: text,\n });\n } else {\n setPendingFreeText(text); // auto: we have to ask\n }\n };\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n // Default the code search to the ambient provider; `false` forces free text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveRenderOrderSearch: RenderOrderSearch | undefined =\n renderOrderSearch === false\n ? undefined\n : (renderOrderSearch ??\n (ambientCodeLookup\n ? contextOrderSearch(ambientCodeLookup)\n : undefined));\n\n const concernById = React.useMemo(\n () => new Map(concerns.map((c) => [c.concernId, c])),\n [concerns]\n );\n\n const assertionOf = (\n item: AssessmentItem\n ): ConditionAssertion | undefined =>\n concernById\n .get(item.concernId)\n ?.assertions.find((a) => a.id === item.assertionId);\n\n const unlinkedOrders = orders.filter(\n (o) => !o.concernId || !items.some((i) => i.concernId === o.concernId)\n );\n\n const toolbarActions = rowActions.filter(\n (action): action is AssessmentToolbarAction =>\n action in ACTION_META &&\n (action === 'add-order'\n ? Boolean(onAddOrder || onAction)\n : Boolean(onAction))\n );\n const showConcernToolbar =\n toolbarActions.length > 0 ||\n (rowActions.includes('remove') && Boolean(onRemoveAssessment));\n\n const drag = useDragReorder({\n ids: items.map((i) => i.concernId),\n onReorder:\n readOnly || !rowActions.includes('move') || !onReorderItems\n ? undefined\n : (ids) => {\n setAnnouncement(m('Assessment concerns reordered'));\n onReorderItems(ids);\n },\n });\n\n // ---- Keyboard + menu equivalents for order drag & drop (508) ----\n const problemLabel = React.useCallback(\n (concernId: string) =>\n concernById\n .get(concernId)\n ?.assertions.find((a) =>\n items.some(\n (i) => i.concernId === concernId && i.assertionId === a.id\n )\n )?.text ?? concernId,\n [concernById, items]\n );\n\n const orderControls: OrderControls | undefined = readOnly\n ? undefined\n : {\n moveWithin:\n orderActions.includes('move') && onReorderOrders\n ? (order, dir) => {\n const planIds = orders\n .filter((o) => o.concernId === order.concernId)\n .map((o) => o.orderId);\n const i = planIds.indexOf(order.orderId);\n const target = planIds[i + dir];\n if (!target) return;\n onReorderOrders(\n reorderIds(\n orders.map((o) => o.orderId),\n order.orderId,\n target,\n dir === 1\n )\n );\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: order.display,\n })\n );\n }\n : undefined,\n moveToProblem:\n orderActions.includes('move') && onLinkOrder\n ? (order, concernId) => {\n onLinkOrder(order, concernId);\n setAnnouncement(\n m('{name} moved to {target}', {\n name: order.display,\n target: problemLabel(concernId),\n })\n );\n }\n : undefined,\n edit:\n orderActions.includes('edit') && onEditOrder\n ? (order, changes) => {\n onEditOrder(order, changes);\n setAnnouncement(\n m('{name} updated', { name: changes.display })\n );\n }\n : undefined,\n editStart: orderActions.includes('edit')\n ? onEditOrderStart\n : undefined,\n remove:\n orderActions.includes('remove') && onRemoveOrder\n ? (order) => {\n onRemoveOrder(order);\n setAnnouncement(m('{name} removed', { name: order.display }));\n }\n : undefined,\n adjacentProblem: (order, dir) => {\n const i = items.findIndex((it) => it.concernId === order.concernId);\n const adj = items[i + dir];\n return adj\n ? { concernId: adj.concernId, label: problemLabel(adj.concernId) }\n : null;\n },\n targets: items.map((it) => ({\n concernId: it.concernId,\n label: problemLabel(it.concernId),\n })),\n };\n\n // ---- Order-level drag & drop: reorder within a plan, or move to another\n // problem by dropping on its block (re-link) or between its orders. ----\n const orderDragEnabled =\n !readOnly &&\n orderActions.includes('move') &&\n Boolean(onReorderOrders || onLinkOrder);\n const [draggingOrderId, setDraggingOrderId] = React.useState<string | null>(\n null\n );\n // dragover/drop can fire before the dragstart state update is visible, so\n // the authoritative dragged id lives in a ref (set synchronously)\n const draggingOrderRef = React.useRef<string | null>(null);\n const [orderOver, setOrderOver] = React.useState<OrderDrag['over']>(null);\n\n const resetOrderDrag = () => {\n draggingOrderRef.current = null;\n setDraggingOrderId(null);\n setOrderOver(null);\n };\n\n /** Drop `dragged` relative to `target` (another order row). */\n const dropOnOrder = (\n dragged: AssessmentOrder,\n target: AssessmentOrder,\n after: boolean\n ) => {\n if (dragged.concernId !== target.concernId && target.concernId) {\n onLinkOrder?.(dragged, target.concernId); // move to the other problem\n setAnnouncement(\n m('{name} moved to {target}', {\n name: dragged.display,\n target: problemLabel(target.concernId),\n })\n );\n } else {\n setAnnouncement(m('{name} reordered', { name: dragged.display }));\n }\n onReorderOrders?.(\n reorderIds(\n orders.map((o) => o.orderId),\n dragged.orderId,\n target.orderId,\n after\n )\n );\n };\n\n const orderDrag: OrderDrag = {\n enabled: orderDragEnabled,\n draggingId: draggingOrderId,\n over: orderOver,\n rowProps: (order) =>\n orderDragEnabled\n ? {\n draggable: true,\n onDragStart: (e) => {\n e.stopPropagation(); // don't start a problem-block drag\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', order.orderId);\n draggingOrderRef.current = order.orderId;\n setDraggingOrderId(order.orderId);\n },\n onDragEnd: (e) => {\n e.stopPropagation();\n resetOrderDrag();\n },\n onDragOver: (e) => {\n const dragged = draggingOrderRef.current;\n if (!dragged || dragged === order.orderId) return;\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.dropEffect = 'move';\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n setOrderOver({ type: 'order', id: order.orderId, after });\n },\n onDrop: (e) => {\n const draggedId =\n draggingOrderRef.current ??\n e.dataTransfer.getData('text/plain');\n const dragged = orders.find((o) => o.orderId === draggedId);\n if (!dragged || dragged.orderId === order.orderId) return;\n e.preventDefault();\n e.stopPropagation();\n const r = e.currentTarget.getBoundingClientRect();\n const after = e.clientY > r.top + r.height / 2;\n dropOnOrder(dragged, order, after);\n resetOrderDrag();\n },\n }\n : {},\n };\n\n /** Problem blocks double as drop targets for orders (move-to-problem). */\n const blockProps = (\n concernId: string\n ): React.HTMLAttributes<HTMLElement> => {\n const itemProps = drag.rowProps(concernId);\n if (!orderDragEnabled) return itemProps;\n return {\n ...itemProps,\n onDragOver: (e) => {\n const draggingOrder = draggingOrderRef.current;\n if (draggingOrder) {\n const dragged = orders.find((o) => o.orderId === draggingOrder);\n if (dragged?.concernId === concernId) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setOrderOver({ type: 'concern', concernId });\n return;\n }\n itemProps.onDragOver?.(e);\n },\n onDragLeave: (e) => {\n if (draggingOrderRef.current) {\n setOrderOver((prev) =>\n prev?.type === 'concern' && prev.concernId === concernId\n ? null\n : prev\n );\n return;\n }\n itemProps.onDragLeave?.(e);\n },\n onDrop: (e) => {\n // An order drop on the block moves the order to this problem; any\n // other payload (a problem-block drag) falls through to item reorder.\n const payload =\n draggingOrderRef.current ?? e.dataTransfer.getData('text/plain');\n const dragged = orders.find((o) => o.orderId === payload);\n if (dragged) {\n e.preventDefault();\n if (dragged.concernId !== concernId) {\n onLinkOrder?.(dragged, concernId);\n setAnnouncement(\n m('{name} moved to {target}', {\n name: dragged.display,\n target: problemLabel(concernId),\n })\n );\n }\n resetOrderDrag();\n return;\n }\n itemProps.onDrop?.(e);\n },\n };\n };\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 flex flex-row items-center justify-between border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n {onShowPlanChange && (\n <Checkbox\n size=\"sm\"\n checked={showPlan}\n onChange={(e) => onShowPlanChange(e.target.checked)}\n label={m('Show plan')}\n />\n )}\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-4 px-4 py-4\">\n {items.length === 0 && (\n <p className=\"text-muted-foreground text-sm\">\n {m('No problems assessed this visit.')}\n </p>\n )}\n\n <ol className=\"space-y-3\">\n {items.map((item, index) => {\n const assertion = assertionOf(item);\n if (!assertion) return null;\n const linkedOrders = orders.filter(\n (o) => o.concernId === item.concernId\n );\n const bp = blockProps(item.concernId);\n const formOpen = addingFor === item.concernId;\n const addOrderFormId = `${instanceId}-add-order-${item.concernId}`;\n return (\n <li\n key={item.concernId}\n data-slot=\"assessment-problem\"\n data-concern-id={item.concernId}\n {...bp}\n // While the add-order form is open the block body must yield\n // to text selection/editing — the header row (below) stays a\n // drag handle so the block can still be moved.\n draggable={drag.enabled && !formOpen}\n className={cn(\n 'group border-border/60 relative rounded-md border px-3 py-2',\n drag.enabled &&\n !formOpen &&\n 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, item.concernId),\n orderOver?.type === 'concern' &&\n orderOver.concernId === item.concernId &&\n 'ring-primary-400 bg-primary-50/50 dark:bg-primary-950/50 ring-2'\n )}\n >\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1',\n drag.enabled &&\n formOpen &&\n 'cursor-grab active:cursor-grabbing'\n )}\n // Header row remains a drag source while the form is open\n draggable={drag.enabled && formOpen}\n onDragStart={formOpen ? bp.onDragStart : undefined}\n onDragEnd={formOpen ? bp.onDragEnd : undefined}\n >\n {drag.enabled && (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n )}\n <span className=\"text-muted-foreground text-sm font-semibold tabular-nums\">\n {index + 1}.\n </span>\n <span className=\"text-foreground font-medium\">\n {assertion.text}\n </span>\n {assertion.verificationStatus !== 'confirmed' && (\n <Badge variant=\"warning\" size=\"sm\">\n {m(assertion.verificationStatus)}\n </Badge>\n )}\n <CodingChips coding={assertion.coding} />\n\n {!readOnly && showConcernToolbar && (\n <RowActionToolbar\n label={m('Actions for {name}', {\n name: assertion.text,\n })}\n align=\"top\"\n className={cn(\n 'pointer-fine:group-has-[[data-order-id]:hover]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:hover]:opacity-0',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:opacity-0'\n )}\n >\n {toolbarActions.map((action) => {\n const meta = ACTION_META[action];\n return (\n <RowIconButton\n key={action}\n label={m(meta.label)}\n icon={meta.icon}\n size=\"sm\"\n expanded={\n action === 'add-order' && onAddOrder\n ? addingFor === item.concernId\n : undefined\n }\n controls={\n action === 'add-order' && onAddOrder\n ? addOrderFormId\n : undefined\n }\n onClick={() => {\n if (action === 'add-order' && onAddOrder) {\n setAddingFor((prev) =>\n prev === item.concernId\n ? null\n : item.concernId\n );\n } else {\n onAction?.(item, action);\n }\n }}\n />\n );\n })}\n {rowActions.includes('remove') &&\n onRemoveAssessment && (\n <RowIconButton\n label={m('Remove {name} from assessment', {\n name: assertion.text,\n })}\n icon={TrashIcon}\n size=\"sm\"\n onClick={() => {\n onRemoveAssessment(item);\n setAnnouncement(\n m('{name} removed from assessment', {\n name: assertion.text,\n })\n );\n }}\n />\n )}\n </RowActionToolbar>\n )}\n </div>\n\n {item.note && (\n <p className=\"text-muted-foreground mt-1 ps-6 text-sm\">\n {item.note}\n </p>\n )}\n\n {showPlan && linkedOrders.length > 0 && (\n <ul\n aria-label={m('Plan for {name}', {\n name: assertion.text,\n })}\n className=\"border-border ms-2.5 mt-1.5 border-s ps-4\"\n >\n {linkedOrders.map((order) => (\n <OrderRow\n key={order.orderId}\n order={order}\n drag={orderDrag}\n controls={orderControls}\n />\n ))}\n </ul>\n )}\n\n {!readOnly && onAddOrder && addingFor === item.concernId && (\n <AddOrderForm\n id={addOrderFormId}\n problemText={assertion.text}\n onSubmit={(order) => {\n onAddOrder(item, order);\n setAnnouncement(\n m('{name} added to {target}', {\n name: order.display,\n target: assertion.text,\n })\n );\n setAddingFor(null);\n }}\n onCancel={() => setAddingFor(null)}\n renderSearch={effectiveRenderOrderSearch}\n />\n )}\n </li>\n );\n })}\n </ol>\n\n {/* Unified add row: a dx/program pick adds a concern, anything else\n adds an (unlinked) order — auto-detected from the coding system,\n or forced via the mode dropdown. Free text asks (in auto mode).\n Without a code search, a plain free-text input keeps capture\n available (matching ProblemList's no-catalog fallback). */}\n {!readOnly &&\n availableAddModes.length > 0 &&\n (onAddAssessment || onAddOrder) && (\n <div\n role=\"form\"\n aria-label={m(addFormLabel)}\n className=\"border-border bg-muted/40 flex flex-col items-stretch gap-2 rounded-md border border-dashed p-2 sm:flex-row sm:flex-wrap sm:items-end\"\n >\n {addFormStart}\n <select\n aria-label={m('What to add')}\n data-slot=\"select-trigger\"\n value={addMode}\n onChange={(e) => {\n setSelectedAddMode(e.target.value as typeof addMode);\n setPendingFreeText(null);\n }}\n className={cn(\n 'border-border bg-background text-foreground h-10 rounded-md border px-1.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n >\n {availableAddModes.includes('auto') && (\n <option value=\"auto\">{m('Add (auto)')}</option>\n )}\n {availableAddModes.includes('problem') && onAddAssessment && (\n <option value=\"problem\">{m('Add concern')}</option>\n )}\n {availableAddModes.includes('order') && onAddOrder && (\n <option value=\"order\">{m('Add order')}</option>\n )}\n </select>\n <div className=\"min-w-64 flex-1\">\n {effectiveRenderOrderSearch ? (\n effectiveRenderOrderSearch({\n domains:\n addMode === 'problem'\n ? ['condition', 'occupational']\n : addMode === 'order'\n ? ['med', 'lab', 'procedure', 'vaccine']\n : undefined, // auto: everything — the pick decides\n // auto: concerns rank ahead of orders — surveillance\n // programs first (rare, high-value hits like \"dot\" or\n // \"hearing\"), then diagnoses, then meds/labs/procedures.\n // concern mode: programs still lead the diagnoses.\n preferDomains:\n addMode === 'auto'\n ? ['occupational', 'condition']\n : addMode === 'problem'\n ? ['occupational']\n : undefined,\n // assessments code in ICD-10: boost it over SNOMED\n preferCodetypes:\n addMode !== 'order' ? ['ICD10'] : undefined,\n billableOnly: addMode !== 'order' && billableOnly,\n placeholder: m(\n addMode === 'problem'\n ? 'Search diagnoses & programs… (try \"chf\" or \"hearing conservation\")'\n : addMode === 'order'\n ? 'Search medications, labs, imaging, procedures…'\n : 'Add concern or order… (a diagnosis or surveillance program becomes a concern; meds, labs & imaging become orders)'\n ),\n onPick: (pick) => {\n const asProblem =\n addMode === 'problem' ||\n (addMode === 'auto' &&\n isConditionCodetype(pick.codetype) &&\n Boolean(onAddAssessment));\n if (asProblem) {\n onAddAssessment?.({\n label: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n } else {\n onAddOrder?.(null, {\n type: orderTypeForCodetype(pick.codetype),\n display: pick.label,\n code: {\n fullid: pick.fullid,\n codetype: pick.codetype,\n fullcode: pick.fullcode,\n },\n });\n }\n },\n onFreeText: handleAddFreeText,\n })\n ) : (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={freeDraft}\n onChange={(e) => setFreeDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && freeDraft.trim()) {\n handleAddFreeText(freeDraft.trim());\n setFreeDraft('');\n }\n }}\n placeholder={m('Type a name and press Enter…')}\n aria-label={m('Add as free text')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-10 w-full rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n handleAddFreeText(freeDraft.trim());\n setFreeDraft('');\n }}\n disabled={!freeDraft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-10\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n </div>\n\n {/* Free text in auto mode: ask what it is */}\n {addMode === 'auto' && pendingFreeText !== null && (\n <div\n role=\"group\"\n aria-label={m('Add \"{name}\" as', { name: pendingFreeText })}\n className=\"flex w-full flex-wrap items-center gap-1.5 ps-1\"\n >\n <span className=\"text-muted-foreground text-sm\">\n {m('Add')}{' '}\n <span className=\"text-foreground font-medium\">\n “{pendingFreeText}”\n </span>{' '}\n {m('as:')}\n </span>\n {onAddAssessment && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => {\n onAddAssessment({ label: pendingFreeText });\n setPendingFreeText(null);\n }}\n >\n {m('Concern')}\n </Button>\n )}\n {onAddOrder && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => {\n onAddOrder(null, {\n type: 'procedure',\n display: pendingFreeText,\n });\n setPendingFreeText(null);\n }}\n >\n {m('Order')}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => setPendingFreeText(null)}\n >\n {m('Cancel')}\n </Button>\n </div>\n )}\n </div>\n )}\n\n {/* Unlinked orders bucket — only takes space once something is in it */}\n {showPlan && unlinkedOrders.length > 0 && (\n <section\n aria-label={m('Orders not linked to a concern')}\n className=\"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 dark:border-amber-700 dark:bg-amber-950\"\n >\n <h4 className=\"flex items-center gap-1.5 text-sm font-semibold text-amber-900 dark:text-amber-200\">\n <AlertCircleIcon size={14} />\n {m('Orders not linked to a concern')}\n </h4>\n <ul className=\"mt-1\">\n {unlinkedOrders.map((order) => (\n // Same row component as linked orders: focusable, Alt+arrow\n // keyboard moves, and the Move menu (508 parity with drag)\n <OrderRow\n key={order.orderId}\n order={order}\n drag={orderDrag}\n controls={orderControls}\n />\n ))}\n </ul>\n </section>\n )}\n </CardContent>\n\n {/* Move/reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nAssessment.displayName = 'Assessment';\n\nexport default Assessment;\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { useMessages } from '../../utils/messages';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Checkbox } from '../Checkbox';\nimport { DateInput } from '../DateInput';\nimport { Input } from '../Input';\nimport { Radio, RadioGroup } from '../Radio';\nimport { Textarea } from '../Textarea';\nimport { Select } from '../Select';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport {\n PlusIcon,\n TrashIcon,\n AlertTriangleIcon,\n HelpCircleIcon,\n} from '../Icons';\nimport {\n currentAssertion,\n type ConcernRelationship,\n type ConditionAssertion,\n type ConditionCoding,\n type ConditionConcern,\n type FieldUncertainty,\n type Uncertainty,\n type UncertainConditionField,\n type VerificationStatus,\n} from '../ProblemList';\nimport {\n useCodeLookupConfig,\n type CodeLookupProviderConfig,\n} from '../CodeLookup/context';\nimport {\n dateToDisplayFormat,\n displayFormatToDateString,\n isValidDate,\n} from '../../utils/date';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** What the editor is doing. Determines the resulting changeType / operation. */\nexport type ConditionEditorMode =\n | 'add'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'relate';\n\n/** Draft assertion returned by onSave — id/date assignment is the caller's job. */\nexport type ConditionAssertionDraft = Omit<ConditionAssertion, 'id' | 'date'>;\n\n/** A code picked from an injected lookup (structurally matches CodifyResult). */\nexport interface ConditionCodePick {\n fullid: string;\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/**\n * Render-prop that draws the coding-section code search. Picking a result\n * calls `onPick` (appends a coding row, fills an empty name); free text calls\n * `onFreeText` (fills the name).\n */\nexport type RenderConditionCodeSearch = (args: {\n placeholder: string;\n onPick: (pick: ConditionCodePick) => void;\n onFreeText: (text: string) => void;\n}) => React.ReactNode;\n\nexport interface ConditionEditorProps {\n /** Editor operation */\n mode: ConditionEditorMode;\n /** Whether the dialog is open */\n open: boolean;\n /** Called when the dialog requests closing (cancel / overlay / Esc) */\n onOpenChange: (open: boolean) => void;\n /** The concern being refined / revised / related (omit for add) */\n concern?: ConditionConcern;\n /** Concerns available as relate targets (mode 'relate') */\n relatableConcerns?: ConditionConcern[];\n /** Called with the new assertion draft (modes add / refine / revise) */\n onSave?: (draft: ConditionAssertionDraft) => void;\n /** Called with the relationship (mode 'relate') */\n onRelate?: (relationship: ConcernRelationship) => void;\n /** Called with a quick progress note (mode 'observe', or the observation box in other modes) */\n onAddObservation?: (text: string) => void;\n /**\n * Render a code-lookup search for the coding section (dependency-injected\n * so the library build doesn't bundle the lookup's worker — pass e.g. a\n * `CodeLookup` wired to your index, the same pattern as Assessment's\n * `renderOrderSearch`). Picking a result appends a coding row and fills an\n * empty problem name; free text fills the problem name. Defaults to the\n * ambient `CodeLookupProvider` (condition shard, ICD-10 preferred); pass\n * `false` for manual code entry only.\n */\n renderCodeSearch?: RenderConditionCodeSearch | false;\n /** Additional CSS classes for the dialog content */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst MODE_META: Record<\n ConditionEditorMode,\n { title: string; changeType: ConditionAssertion['changeType'] }\n> = {\n add: { title: 'Add problem', changeType: undefined },\n observe: { title: 'Progress observation', changeType: undefined },\n refine: { title: 'Refine problem', changeType: 'refinement' },\n revise: { title: 'Revise problem', changeType: 'revision' },\n relate: { title: 'Relate problem', changeType: undefined },\n};\n\nconst CODING_SYSTEMS = ['SNOMED', 'ICD-10-CM', 'ICD-11'] as const;\n\nconst VERIFICATION_OPTIONS: { value: VerificationStatus; label: string }[] = [\n { value: 'unconfirmed', label: 'Unconfirmed' },\n { value: 'provisional', label: 'Provisional' },\n { value: 'differential', label: 'Differential' },\n { value: 'confirmed', label: 'Confirmed' },\n];\n\nconst RELATIONSHIP_OPTIONS: {\n value: ConcernRelationship['type'];\n label: string;\n}[] = [\n { value: 'caused-by', label: 'Caused by' },\n { value: 'evolved-from', label: 'Evolved from' },\n { value: 'differential-sibling', label: 'Differential sibling' },\n { value: 'complication-of', label: 'Complication of' },\n];\n\nconst SEVERITIES = ['mild', 'moderate', 'severe'] as const;\nconst CONFIDENCES = ['low', 'medium', 'high'] as const;\n\n/** Map an index codetype (e.g. 'ICD10') onto the ConditionCoding system. */\nexport function normalizeConditionCodingSystem(codetype: string): string {\n const ct = codetype.toUpperCase().replace(/[^A-Z0-9]/g, '');\n if (ct === 'ICD10' || ct === 'ICD10CM') return 'ICD-10-CM';\n if (ct === 'ICD11') return 'ICD-11';\n if (ct === 'SNOMED' || ct === 'SNOMEDCT' || ct === 'SNOMEDUS') {\n return 'SNOMED';\n }\n return codetype;\n}\n\nfunction withSinglePrimary(coding: ConditionCoding[]): ConditionCoding[] {\n if (coding.length === 0) return coding;\n const primaryIndex = coding.findIndex((entry) => entry.primary);\n const selectedIndex = primaryIndex >= 0 ? primaryIndex : 0;\n return coding.map((entry, index) => ({\n ...entry,\n primary: index === selectedIndex,\n }));\n}\n\n/**\n * Default code search built from an ambient `CodeLookupProvider`: a bare\n * condition-shard lookup (ICD-10 preferred) wired to the editor's onPick /\n * onFreeText. Used when no explicit `renderCodeSearch` prop is given.\n */\nfunction contextConditionCodeSearch(\n ctx: CodeLookupProviderConfig\n): RenderConditionCodeSearch {\n const ContextConditionCodeSearch: RenderConditionCodeSearch = ({\n placeholder,\n onPick,\n onFreeText,\n }) => {\n const Lookup = ctx.component;\n return (\n <Lookup\n indexUrl={ctx.indexUrl}\n locale={ctx.locale}\n domains={['condition']}\n preferCodetypes={['ICD10']}\n bare\n clearOnSelect={false}\n placeholder={placeholder}\n onSelect={(result) =>\n onPick({\n fullid: result.fullid,\n label: result.label,\n codetype: result.codetype,\n fullcode: result.fullcode,\n })\n }\n onFreeText={onFreeText}\n />\n );\n };\n return ContextConditionCodeSearch;\n}\n\n// =============================================================================\n// Field uncertainty affordance (§4.1 three-state rule)\n// =============================================================================\n\n/**\n * Per-field uncertainty control: an \"Unknown\" toggle (explicitly unknown —\n * distinct from untouched) and a low/med/high confidence toggle for values\n * that are present but soft.\n */\nfunction FieldFlag({\n label,\n value,\n onChange,\n hasValue,\n}: {\n label: string;\n value?: FieldUncertainty;\n onChange: (f: FieldUncertainty | undefined) => void;\n hasValue: boolean;\n}) {\n const m = useMessages();\n const unknown = value?.known === false;\n return (\n <span\n role=\"group\"\n aria-label={m('Certainty for {label}', { label })}\n className=\"flex items-center gap-1\"\n >\n <button\n type=\"button\"\n aria-pressed={unknown}\n onClick={() =>\n onChange(\n unknown ? undefined : { known: false, reason: 'asked-unknown' }\n )\n }\n className={cn(\n 'rounded-full border px-2 py-0.5 text-[11px] font-medium transition-colors',\n unknown\n ? 'border-warning/50 bg-warning/10 text-warning-800 dark:text-warning-200'\n : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {m('Unknown')}\n </button>\n {hasValue &&\n !unknown &&\n CONFIDENCES.map((c) => {\n const active = value?.known !== false && value?.confidence === c;\n return (\n <button\n key={c}\n type=\"button\"\n aria-pressed={active}\n aria-label={m('{label} confidence {confidence}', {\n label,\n confidence: m(c),\n })}\n onClick={() =>\n onChange(active ? undefined : { known: true, confidence: c })\n }\n className={cn(\n 'rounded-full border px-1.5 py-0.5 text-[11px] transition-colors',\n active\n ? 'border-primary-400 bg-primary-100 text-primary-900 dark:border-primary-600 dark:bg-primary-950 dark:text-primary-200'\n : 'border-border text-muted-foreground hover:text-foreground'\n )}\n >\n {m(c)}\n </button>\n );\n })}\n </span>\n );\n}\n\n// =============================================================================\n// Observation history — quick progress notes over time\n// =============================================================================\n\nfunction ObservationHistory({ concern }: { concern?: ConditionConcern }) {\n const m = useMessages();\n const observations = concern?.observations;\n if (!observations?.length) return null;\n return (\n <section aria-label={m('Past observations')} className=\"space-y-1\">\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h4>\n <ol className=\"border-border max-h-40 space-y-1.5 overflow-y-auto rounded-md border p-2\">\n {[...observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground flex-1\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </section>\n );\n}\n\n// =============================================================================\n// ConditionEditor\n// =============================================================================\n\n/**\n * Dialog editor for condition assertions — the condition analog of the\n * planned MedicationEditor. Capture-first: only the problem name is required;\n * coding, severity, and onset are progressive enrichment. Every optional\n * field carries the §4.1 three-state affordance (confident / uncertain /\n * explicitly unknown), written to the assertion's uncertainty block.\n *\n * Modes:\n * - `add` — new concern, first assertion\n * - `observe` — quick progress note on the concern; shows the full observation\n * history over time\n * - `refine` — new assertion, changeType 'refinement' (or 'progression')\n * - `revise` — new assertion, changeType 'revision'; warns that the prior\n * assertion will be refuted\n * - `relate` — picks a relationship type + target concern\n */\nexport function ConditionEditor({\n mode,\n open,\n onOpenChange,\n concern,\n relatableConcerns = [],\n onSave,\n onRelate,\n onAddObservation,\n renderCodeSearch,\n className,\n 'data-testid': dataTestId,\n}: ConditionEditorProps) {\n const m = useMessages();\n const prior = concern ? currentAssertion(concern) : undefined;\n\n // Default the code search to the ambient provider; `false` forces manual\n // code entry only.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveRenderCodeSearch: RenderConditionCodeSearch | undefined =\n renderCodeSearch === false\n ? undefined\n : (renderCodeSearch ??\n (ambientCodeLookup\n ? contextConditionCodeSearch(ambientCodeLookup)\n : undefined));\n\n const [text, setText] = React.useState('');\n const [coding, setCoding] = React.useState<ConditionCoding[]>([]);\n const [verification, setVerification] =\n React.useState<VerificationStatus>('confirmed');\n const [severity, setSeverity] =\n React.useState<ConditionAssertion['severity']>();\n const [onsetDate, setOnsetDate] = React.useState('');\n const [onsetFuzzy, setOnsetFuzzy] = React.useState('');\n const [note, setNote] = React.useState('');\n const [progression, setProgression] = React.useState(false);\n const [fields, setFields] = React.useState<\n Partial<Record<UncertainConditionField, FieldUncertainty>>\n >({});\n const [relType, setRelType] =\n React.useState<ConcernRelationship['type']>('caused-by');\n const [relTarget, setRelTarget] = React.useState('');\n const [observation, setObservation] = React.useState('');\n\n // Seed from the prior assertion whenever the dialog opens (or the mode /\n // concern changes while open — stale values must not carry over)\n React.useEffect(() => {\n if (!open) return;\n setText(prior?.text ?? '');\n setCoding(withSinglePrimary(prior?.coding ?? []));\n setVerification(\n mode === 'add'\n ? 'unconfirmed'\n : (prior?.verificationStatus ?? 'confirmed')\n );\n setSeverity(prior?.severity);\n const priorOnsetDate = prior?.onset?.date;\n setOnsetDate(priorOnsetDate ? dateToDisplayFormat(priorOnsetDate) : '');\n setOnsetFuzzy(priorOnsetDate ? '' : (prior?.onset?.fuzzy ?? ''));\n setNote('');\n setProgression(false);\n setFields(prior?.uncertainty?.fields ?? {});\n setRelType('caused-by');\n setRelTarget('');\n setObservation('');\n }, [open, mode, prior]);\n\n const setField =\n (field: UncertainConditionField) => (f: FieldUncertainty | undefined) =>\n setFields((prev) => {\n const next = { ...prev };\n if (f) next[field] = f;\n else delete next[field];\n return next;\n });\n\n const updateCoding = (i: number, patch: Partial<ConditionCoding>) =>\n setCoding((prev) => prev.map((c, j) => (j === i ? { ...c, ...patch } : c)));\n\n // Coding explicitly marked unknown: handleSave() drops the codes, so the\n // coding inputs disable to keep the UI and the saved output consistent.\n const codingUnknown = fields.coding?.known === false;\n const hasInvalidOnsetDate =\n fields.onset?.known !== false &&\n Boolean(onsetDate) &&\n !isValidDate(onsetDate);\n\n /** A pick from the injected lookup — appends a coding row, fills an empty\n * name, and clears a contradictory \"coding unknown\" flag. */\n const handleCodePick = (pick: ConditionCodePick) => {\n const system = normalizeConditionCodingSystem(pick.codetype);\n setCoding((prev) =>\n prev.some((c) => c.system === system && c.code === pick.fullcode)\n ? prev\n : withSinglePrimary([\n ...prev,\n { system, code: pick.fullcode, display: pick.label },\n ])\n );\n setText((prev) => prev || pick.label);\n setFields((prev) => {\n if (prev.coding?.known !== false) return prev;\n const next = { ...prev };\n delete next.coding;\n return next;\n });\n };\n\n const handleSave = () => {\n if (mode === 'relate') {\n if (!relTarget) return;\n onRelate?.({ type: relType, concernId: relTarget });\n onOpenChange(false);\n return;\n }\n if (mode === 'observe') {\n if (!observation.trim()) return;\n onAddObservation?.(observation.trim());\n onOpenChange(false);\n return;\n }\n if (!text.trim() || hasInvalidOnsetDate) return;\n if (observation.trim()) onAddObservation?.(observation.trim());\n const uncertainty: Uncertainty | undefined =\n Object.keys(fields).length > 0 ? { fields } : undefined;\n onSave?.({\n text: text.trim(),\n // write the trimmed values back — whitespace in codes breaks equality\n // checks downstream. A field marked explicitly unknown must not carry a\n // value (e.g. one seeded from the prior assertion): value + \"unknown\"\n // would be contradictory, so unknown wins and the value is dropped.\n coding:\n fields.coding?.known === false\n ? []\n : withSinglePrimary(\n coding\n .filter((c) => c.code.trim())\n .map((c) => ({\n ...c,\n code: c.code.trim(),\n display: c.display?.trim() || undefined,\n mappedFrom: c.mappedFrom?.trim() || undefined,\n }))\n ),\n verificationStatus: verification,\n changeType:\n mode === 'refine'\n ? progression\n ? 'progression'\n : 'refinement'\n : MODE_META[mode].changeType,\n supersedes: prior?.id,\n severity: fields.severity?.known === false ? undefined : severity,\n onset:\n fields.onset?.known === false\n ? undefined\n : onsetDate || onsetFuzzy\n ? {\n date: onsetDate\n ? displayFormatToDateString(onsetDate)\n : undefined,\n fuzzy: onsetFuzzy || undefined,\n }\n : undefined,\n uncertainty,\n note: note.trim() || undefined,\n });\n onOpenChange(false);\n };\n\n const saveDisabled =\n mode === 'relate'\n ? !relTarget\n : mode === 'observe'\n ? !observation.trim()\n : !text.trim() || hasInvalidOnsetDate;\n\n return (\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n size=\"2xl\"\n className={className}\n >\n <ModalHeader>\n <ModalTitle>\n {m(MODE_META[mode].title)}\n {prior ? ` — ${prior.text}` : ''}\n </ModalTitle>\n </ModalHeader>\n <ModalBody data-testid={dataTestId} className=\"space-y-5\">\n <div className=\"space-y-5\">\n {mode === 'revise' && (\n <div\n role=\"alert\"\n className=\"border-warning/30 bg-warning/10 text-warning-800 dark:text-warning-200 flex items-start gap-2 rounded-md border px-3 py-2 text-sm\"\n >\n <AlertTriangleIcon size={16} />\n <span>\n {m(\n 'Revising marks the prior assertion refuted (it was never true) — history is preserved on the timeline. Use Refine instead if the prior was correct but less specific.'\n )}\n </span>\n </div>\n )}\n\n {mode === 'relate' ? (\n <>\n <Select\n label={m('Relationship')}\n options={RELATIONSHIP_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={relType}\n onValueChange={(v) =>\n setRelType(v as ConcernRelationship['type'])\n }\n />\n <Select\n label={m('Related problem')}\n placeholder={m('Select a problem…')}\n options={relatableConcerns\n .filter((c) => c.concernId !== concern?.concernId)\n .map((c) => ({\n value: c.concernId,\n label: currentAssertion(c)?.text ?? c.concernId,\n }))}\n value={relTarget}\n onValueChange={setRelTarget}\n />\n </>\n ) : mode === 'observe' ? (\n <>\n <ObservationHistory concern={concern} />\n <Textarea\n label={m('New observation')}\n value={observation}\n onChange={(e) => setObservation(e.target.value)}\n placeholder={m(\n 'e.g. BP improving on current regimen; patient reports better sleep'\n )}\n rows={3}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </>\n ) : (\n <>\n {/* Past progress observations — visible while editing an existing concern */}\n {(mode === 'refine' || mode === 'revise') && (\n <ObservationHistory concern={concern} />\n )}\n\n {/* Capture-first: name is the only required field. In add mode\n with an injected lookup, name + coding are ONE input — pick\n a code (sets both) or enter free text (name only). */}\n {mode === 'add' && effectiveRenderCodeSearch && !text.trim() ? (\n <div className=\"space-y-1\">\n <span className=\"text-foreground block text-sm font-medium\">\n {m('Problem name')}\n <span className=\"text-destructive ms-1\" aria-hidden=\"true\">\n *\n </span>\n </span>\n {effectiveRenderCodeSearch({\n placeholder: m(\n 'Search conditions — or type a name and press Enter…'\n ),\n onPick: handleCodePick,\n onFreeText: (t) => setText(t.trim()),\n })}\n <p className=\"text-muted-foreground text-xs\">\n {m(\n 'Picking a code fills the name and coding together; free text is fine — codes can be added any time.'\n )}\n </p>\n </div>\n ) : (\n <Input\n label={m('Problem name')}\n required\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={m(\n 'e.g. Type 1 diabetes mellitus with neuropathy'\n )}\n />\n )}\n\n {mode === 'refine' && (\n <Checkbox\n size=\"sm\"\n checked={progression}\n onChange={(e) => setProgression(e.target.checked)}\n label={m(\n 'Disease progressed (e.g. new complication) rather than a more specific diagnosis'\n )}\n />\n )}\n\n {/* Coding — progressive enrichment, never required */}\n <fieldset className=\"space-y-3\">\n <legend className=\"sr-only\">{m('Coding')}</legend>\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"flex flex-wrap items-center gap-2 text-sm font-medium\">\n {m('Coding')}\n <FieldFlag\n label={m('Coding')}\n value={fields.coding}\n onChange={setField('coding')}\n hasValue={coding.length > 0}\n />\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={codingUnknown}\n onClick={() =>\n setCoding((prev) => [\n ...prev,\n {\n system: 'SNOMED',\n code: '',\n primary: prev.length === 0,\n },\n ])\n }\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8 shrink-0 text-xs\"\n >\n {m('Add code')}\n </Button>\n </div>\n {effectiveRenderCodeSearch &&\n !(mode === 'add' && !text.trim()) && (\n <div>\n {effectiveRenderCodeSearch({\n placeholder: m('Search codes — ICD-10-CM / SNOMED…'),\n onPick: handleCodePick,\n onFreeText: (t) => setText((prev) => prev || t),\n })}\n </div>\n )}\n {coding.length === 0 && (\n <p className=\"text-muted-foreground text-xs\">\n {m(\n 'Optional — a name-only problem is valid. Codes can be added any time.'\n )}\n </p>\n )}\n {coding.length > 0 && (\n <div\n aria-hidden=\"true\"\n data-slot=\"condition-coding-header\"\n className=\"text-muted-foreground hidden grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem] items-center gap-2 px-1 text-xs font-medium sm:!grid\"\n >\n <span>{m('System')}</span>\n <span>{m('Code')}</span>\n <span>{m('Display')}</span>\n <span className=\"text-center\">{m('Primary code')}</span>\n <span className=\"sr-only\">{m('Actions')}</span>\n </div>\n )}\n {coding.length > 0 && (\n <RadioGroup\n name=\"primary-coding\"\n label={m('Primary display code')}\n value={String(\n Math.max(\n 0,\n coding.findIndex((entry) => entry.primary)\n )\n )}\n onValueChange={(value) => {\n const selectedIndex = Number(value);\n setCoding((prev) =>\n prev.map((entry, index) => ({\n ...entry,\n primary: index === selectedIndex,\n }))\n );\n }}\n size=\"sm\"\n className=\"gap-2 [&_[data-slot=radio-group-items]]:gap-2 sm:[&_[data-slot=radio-group-legend]]:sr-only\"\n >\n {coding.map((c, i) => (\n <div\n key={i}\n data-slot=\"condition-coding-row\"\n className=\"border-border/70 grid grid-cols-1 gap-2 rounded-md border p-2 sm:grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem] sm:items-center sm:border-0 sm:p-0\"\n >\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('System')}\n </span>\n <Select\n aria-label={m('Coding system {index}', {\n index: i + 1,\n })}\n options={CODING_SYSTEMS.map((s) => ({\n value: s,\n label: s,\n }))}\n value={c.system}\n onValueChange={(v) =>\n updateCoding(i, { system: v })\n }\n disabled={codingUnknown}\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('Code')}\n </span>\n <Input\n aria-label={m('Code {index}', { index: i + 1 })}\n value={c.code}\n onChange={(e) =>\n updateCoding(i, { code: e.target.value })\n }\n placeholder={m('Code')}\n disabled={codingUnknown}\n className=\"font-mono\"\n />\n </div>\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground text-xs sm:hidden\">\n {m('Display')}\n </span>\n <Input\n aria-label={m('Display {index}', { index: i + 1 })}\n value={c.display ?? ''}\n onChange={(e) =>\n updateCoding(i, { display: e.target.value })\n }\n placeholder={m('Display')}\n disabled={codingUnknown}\n />\n </div>\n <div className=\"flex min-h-10 items-center gap-1.5 text-xs sm:justify-center\">\n <Radio\n value={String(i)}\n aria-label={m('Primary code: {system} {code}', {\n system: c.system,\n code:\n c.code || m('row {index}', { index: i + 1 }),\n })}\n disabled={codingUnknown}\n />\n <span className=\"sm:sr-only\">\n {m('Primary code')}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={m('Remove code {index}', {\n index: i + 1,\n })}\n disabled={codingUnknown}\n onClick={() =>\n setCoding((prev) =>\n withSinglePrimary(\n prev.filter((_, index) => index !== i)\n )\n )\n }\n className=\"h-10 w-10 justify-self-start sm:justify-self-center\"\n >\n <TrashIcon size={14} />\n </Button>\n </div>\n ))}\n </RadioGroup>\n )}\n </fieldset>\n\n <Select\n label={m('Verification status')}\n options={VERIFICATION_OPTIONS.map((option) => ({\n ...option,\n label: m(option.label),\n }))}\n value={verification}\n onValueChange={(v) => setVerification(v as VerificationStatus)}\n />\n\n {/* Severity value and its three-state certainty affordance */}\n <div className=\"flex flex-wrap items-end gap-x-4 gap-y-2\">\n <div className=\"space-y-1\">\n <span className=\"block text-sm font-medium\">\n {m('Severity')}\n </span>\n <div\n role=\"group\"\n aria-label={m('Severity')}\n className=\"border-border inline-flex items-center overflow-hidden rounded-md border\"\n >\n {SEVERITIES.map((s) => {\n const active = severity === s;\n return (\n <button\n key={s}\n type=\"button\"\n aria-pressed={active}\n disabled={fields.severity?.known === false}\n onClick={() => setSeverity(active ? undefined : s)}\n className={cn(\n 'border-border border-s px-2.5 py-1 text-xs font-medium capitalize transition-colors first:border-s-0',\n 'disabled:opacity-40',\n active\n ? 'bg-primary-600 text-white'\n : 'bg-background text-muted-foreground hover:text-foreground'\n )}\n >\n {m(s)}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"space-y-1\">\n <span className=\"block text-sm font-medium\">\n {m('Certainty')}\n </span>\n <FieldFlag\n label={m('Severity')}\n value={fields.severity}\n onChange={setField('severity')}\n hasValue={Boolean(severity)}\n />\n </div>\n </div>\n\n {/* Fuzzy onset — exact date OR human string */}\n <div className=\"space-y-1\">\n <span className=\"flex items-center gap-2 text-sm font-medium\">\n {m('Onset')}\n <FieldFlag\n label={m('Onset')}\n value={fields.onset}\n onChange={setField('onset')}\n hasValue={Boolean(onsetDate || onsetFuzzy)}\n />\n </span>\n <div className=\"grid grid-cols-1 items-end gap-2 sm:grid-cols-[minmax(10rem,0.8fr)_auto_minmax(14rem,1.2fr)]\">\n <DateInput\n aria-label={m('Onset date (exact)')}\n value={onsetDate}\n onChange={(value) => {\n setOnsetDate(value);\n if (value) setOnsetFuzzy('');\n }}\n disabled={fields.onset?.known === false}\n validateOnBlur\n error={\n hasInvalidOnsetDate\n ? m('Please enter a valid date (MM/DD/YYYY)')\n : undefined\n }\n width=\"full\"\n />\n <span className=\"text-muted-foreground pb-3 text-center text-xs\">\n {m('or')}\n </span>\n <Input\n aria-label={m('Onset (fuzzy)')}\n value={onsetFuzzy}\n onChange={(e) => {\n setOnsetFuzzy(e.target.value);\n if (e.target.value) setOnsetDate('');\n }}\n disabled={fields.onset?.known === false}\n placeholder={m(\n 'Fuzzy — \"since her twenties\", \"~3 months ago\"'\n )}\n />\n </div>\n </div>\n\n <Textarea\n label={m('Note')}\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder={m(\n 'e.g. patient thinks it started after the fall, not sure'\n )}\n rows={2}\n />\n\n {Object.keys(fields).length > 0 && (\n <p className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <HelpCircleIcon size={12} />\n <span>\n {m('Uncertainty recorded:')}{' '}\n {Object.entries(fields)\n .map(([k, f]) =>\n f?.known === false\n ? m('{field} unknown', { field: m(k) })\n : m('{confidence} confidence in {field}', {\n confidence: m(f?.confidence ?? 'unspecified'),\n field: m(k),\n })\n )\n .join(', ')}\n </span>\n </p>\n )}\n </>\n )}\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={() => onOpenChange(false)}>\n {m('Cancel')}\n </Button>\n <Button onClick={handleSave} disabled={saveDisabled}>\n {m(\n mode === 'relate'\n ? 'Relate'\n : mode === 'observe'\n ? 'Add observation'\n : 'Save'\n )}\n </Button>\n {mode !== 'relate' && mode !== 'observe' && !text.trim() && (\n <Badge variant=\"outline\" size=\"sm\" className=\"text-muted-foreground\">\n {m('name required')}\n </Badge>\n )}\n </ModalFooter>\n </Modal>\n );\n}\n\nConditionEditor.displayName = 'ConditionEditor';\n\nexport default ConditionEditor;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n ThumbsUpIcon,\n ThumbsDownIcon,\n HandMetalIcon,\n HelpCircleIcon,\n PencilIcon,\n RefreshIcon,\n CalendarCheckIcon,\n StickyNoteIcon,\n BanIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n ExternalLinkIcon,\n PlusIcon,\n GripVerticalIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Reconciliation status of a medication. */\nexport type MedicationStatus =\n | 'unreconciled'\n | 'taking'\n | 'taking-noncompliant'\n | 'not-taking'\n | 'unknown';\n\n/** Coding-system reference for a medication (RxNorm / FDB / NDC …). */\nexport interface MedicationCode {\n /** Coding system, e.g. 'RxNORM', 'FDB', 'NDC' */\n system: string;\n /** Code within the system */\n code: string;\n /** Human-readable label the code was selected under */\n display?: string;\n}\n\n/**\n * A single medication in the presenting-medications list.\n *\n * Prescription-detail fields follow the NCPDP SCRIPT NewRx\n * `MedicationPrescribed` composite — see the README for the field mapping.\n * All are optional: a bare `{ id, name, status }` renders fine.\n */\nexport interface Medication {\n /** Stable unique id */\n id: string;\n /** Display name, e.g. \"lisinopril 10 mg tablet\" (NCPDP DrugDescription) */\n name: string;\n /** Patient-friendly instructions (NCPDP Sig / Directions) */\n sig?: string;\n /** Current reconciliation status */\n status: MedicationStatus;\n /** Whether the medication's end date has passed */\n expired?: boolean;\n /** Discontinued date (display string) — shown as \"Discontinued on: date\" */\n discontinuedDate?: string;\n /** Free-text note attached to the medication */\n note?: string;\n /** Follow-up task attached to the medication */\n task?: string;\n\n // —— Coding (NCPDP DrugCoded) ——\n /** Code reference (RxNorm / FDB / NDC) */\n code?: MedicationCode;\n\n // —— NCPDP SCRIPT NewRx prescription fields ——\n /** Strength, e.g. \"10 mg\" (Strength + StrengthUnitOfMeasure) */\n strength?: string;\n /** Dose form, e.g. \"tablet\" (DrugCoded/FormCode) */\n doseForm?: string;\n /** Quantity dispensed (Quantity/Value) */\n quantity?: string;\n /** Quantity unit of measure (Quantity/QuantityUnitOfMeasure) */\n quantityUnit?: string;\n /** Days supply (DaysSupply) */\n daysSupply?: string;\n /** Route of administration, e.g. \"oral\" */\n route?: string;\n /** Administration frequency, e.g. \"Twice daily\" */\n frequency?: string;\n /** As-needed flag (PRN) */\n prn?: boolean;\n /** Number of refills (NumberOfRefills) */\n refills?: string;\n /** Substitution / DAW: '0' permitted, '1' dispense as written */\n substitution?: '0' | '1';\n /** Start / written date (ISO yyyy-mm-dd) */\n startDate?: string;\n /** End date (ISO yyyy-mm-dd) */\n endDate?: string;\n /** Indication / diagnosis the medication treats */\n indication?: string;\n /** Note to pharmacy (Note) */\n pharmacyNotes?: string;\n}\n\n/** Non-status row actions revealed on hover. */\nexport type MedicationAction =\n | 'open'\n | 'correct'\n | 'refill'\n | 'add-task'\n | 'note'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface MedicationListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Medications to display (controlled — grouping is derived from status) */\n medications: Medication[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a status button is clicked on a row */\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n /** Called when a non-status row action is clicked */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * Called with the full ordered list of medication ids after a drag —\n * enables drag & drop reordering within a status group. The list renders in\n * props order; persist the ids and feed them back in.\n */\n onReorder?: (medicationIds: string[]) => void;\n /** Which non-status actions to show on each row (default: all) */\n actions?: MedicationAction[];\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Called when a quick-add option is clicked */\n onQuickAdd?: (name: string) => void;\n /** Called when the \"Add\" editor pill is clicked in the quick-add list */\n onAddOther?: () => void;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /**\n * Custom add UI (e.g. an inline CodeLookup search) rendered in the\n * add-medication section, before any quick-add pills. Use for\n * patient-facing entry where suggested medications would be leading.\n */\n addSearch?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: MedicationStatus[] = [\n 'unreconciled',\n 'taking',\n 'taking-noncompliant',\n 'not-taking',\n 'unknown',\n];\n\nexport const MEDICATION_STATUS_LABELS: Record<MedicationStatus, string> = {\n unreconciled: 'Unreconciled',\n taking: 'Taking as Directed',\n 'taking-noncompliant': 'Not Taking as Directed',\n 'not-taking': 'Not Taking',\n unknown: 'Unknown',\n};\n\nconst DEFAULT_ACTIONS: MedicationAction[] = [\n 'open',\n 'correct',\n 'refill',\n 'add-task',\n 'note',\n 'remove',\n];\n\nconst ACTION_META: Record<\n MedicationAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n correct: { label: 'Correct', icon: PencilIcon },\n refill: { label: 'Refill', icon: RefreshIcon },\n 'add-task': { label: 'Add Task', icon: CalendarCheckIcon },\n note: { label: 'Notes', icon: StickyNoteIcon },\n remove: { label: 'Remove', icon: BanIcon },\n 'move-up': { label: 'Move Up', icon: ChevronUpIcon },\n 'move-down': { label: 'Move Down', icon: ChevronDownIcon },\n};\n\nconst STATUS_BUTTON_META: {\n status: MedicationStatus;\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n}[] = [\n { status: 'taking', label: 'Taking', icon: ThumbsUpIcon },\n {\n status: 'taking-noncompliant',\n label: 'Taking – Noncompliant',\n icon: HandMetalIcon,\n },\n { status: 'not-taking', label: 'Not Taking', icon: ThumbsDownIcon },\n { status: 'unknown', label: 'Unknown', icon: HelpCircleIcon },\n];\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\nfunction MedicationRow({\n medication,\n actions,\n readOnly,\n drag,\n onMove,\n onStatusChange,\n onAction,\n}: {\n medication: Medication;\n actions: MedicationAction[];\n readOnly: boolean;\n drag: UseDragReorderReturn;\n /** Keyboard equivalent of drag reordering (Alt+↑/↓) */\n onMove?: (medication: Medication, dir: -1 | 1) => void;\n onStatusChange?: (medication: Medication, status: MedicationStatus) => void;\n onAction?: (medication: Medication, action: MedicationAction) => void;\n}) {\n const m = useMessages();\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n e.preventDefault();\n onMove?.(medication, e.key === 'ArrowUp' ? -1 : 1);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-medication-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n }\n };\n\n return (\n // Rows are focus stops when reordering is enabled so drag & drop has a\n // keyboard equivalent (Alt+↑/↓) — 508.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-medication-id={medication.id}\n tabIndex={drag.enabled ? 0 : undefined}\n onKeyDown={drag.enabled ? handleRowKeyDown : undefined}\n aria-label={\n drag.enabled\n ? m('{name}. Alt plus arrow keys to reorder.', {\n name: medication.name,\n })\n : undefined\n }\n {...drag.rowProps(medication.id)}\n className={cn(\n 'group border-border/60 relative flex min-h-11 flex-wrap items-center gap-x-2 gap-y-1 border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, medication.id)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n <span className=\"text-foreground font-medium\">{medication.name}</span>\n {medication.code && (\n <span\n className=\"text-muted-foreground/70 text-xs\"\n title={medication.code.display}\n >\n {medication.code.system} {medication.code.code}\n </span>\n )}\n {medication.sig && (\n <span className=\"text-muted-foreground text-sm\">{medication.sig}</span>\n )}\n {medication.expired && (\n <span className=\"text-sm font-bold text-red-600 dark:text-red-400\">\n {m('EXPIRED')}\n </span>\n )}\n {medication.discontinuedDate && (\n <span className=\"text-muted-foreground text-sm\">\n {m('Discontinued on:')} {medication.discontinuedDate}\n </span>\n )}\n {(medication.note || medication.task) && (\n <span className=\"flex w-full basis-full flex-col gap-0.5 ps-4\">\n {medication.note && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <StickyNoteIcon size={12} />\n {medication.note}\n </span>\n )}\n {medication.task && (\n <span className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n <CalendarCheckIcon size={12} />\n {m('Task:')} {medication.task}\n </span>\n )}\n </span>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: medication.name })}\n >\n {actions.includes('open') && (\n <RowIconButton\n label={m(ACTION_META.open.label)}\n icon={ACTION_META.open.icon}\n onClick={() => onAction?.(medication, 'open')}\n />\n )}\n {STATUS_BUTTON_META.map(({ status, label, icon }) => (\n <RowIconButton\n key={status}\n label={m(label)}\n icon={icon}\n active={medication.status === status}\n onClick={() => onStatusChange?.(medication, status)}\n />\n ))}\n {actions\n .filter((a): a is Exclude<MedicationAction, 'open'> => a !== 'open')\n .map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(medication, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// MedicationList\n// =============================================================================\n\n/**\n * Presenting-medications list with medication reconciliation.\n *\n * Controlled component: medications (with their statuses) come in via props;\n * every user interaction is reported through callbacks. Rows are grouped by\n * reconciliation status; hovering (or keyboard-focusing) a row reveals the\n * status buttons and other row actions.\n *\n * @example\n * ```tsx\n * <MedicationList\n * medications={meds}\n * onStatusChange={(med, status) =>\n * setMeds((prev) =>\n * prev.map((m) => (m.id === med.id ? { ...m, status } : m))\n * )\n * }\n * onAction={(med, action) => handleAction(med, action)}\n * />\n * ```\n */\nexport const MedicationList = React.forwardRef<\n HTMLDivElement,\n MedicationListProps\n>(\n (\n {\n medications,\n title = 'Presenting medications',\n onStatusChange,\n onAction,\n onReorder,\n actions = DEFAULT_ACTIONS,\n quickAddOptions,\n onQuickAdd,\n onAddOther,\n readOnly = false,\n reconciledMessage = 'All medications reconciled.',\n emptyMessage = 'No medications recorded.',\n addSearch,\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const handleStatusChange = React.useCallback(\n (medication: Medication, status: MedicationStatus) => {\n setAnnouncement(\n m('{name} marked {status}', {\n name: medication.name,\n status: m(MEDICATION_STATUS_LABELS[status]),\n })\n );\n onStatusChange?.(medication, status);\n },\n [m, onStatusChange, setAnnouncement]\n );\n\n const groups = GROUP_ORDER.map((status) => ({\n status,\n label: MEDICATION_STATUS_LABELS[status],\n items: medications.filter((m) => m.status === status),\n })).filter((g) => g.items.length > 0 || g.status === 'unreconciled');\n\n // Drag & drop reordering, restricted to the same status group (a cross-\n // group drop would silently imply a reconciliation change). Precomputed\n // map — dragover fires too frequently for a linear scan per event.\n const statusById = React.useMemo(\n () => new Map(medications.map((m) => [m.id, m.status] as const)),\n [medications]\n );\n const statusOf = React.useCallback(\n (id: string) => statusById.get(id),\n [statusById]\n );\n const drag = useDragReorder({\n ids: medications.map((m) => m.id),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (ids) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Medication list reordered'));\n onReorder(ids);\n },\n canDropOn: (dragged, target) => statusOf(dragged) === statusOf(target),\n });\n\n /** Keyboard equivalent of dragging a row: swap within the status group. */\n const moveMedication = React.useCallback(\n (medication: Medication, dir: -1 | 1) => {\n if (readOnly || !onReorder) return;\n const ids = medications.map((m) => m.id);\n const from = ids.indexOf(medication.id);\n let to = from + dir;\n while (\n to >= 0 &&\n to < medications.length &&\n medications[to].status !== medication.status\n ) {\n to += dir;\n }\n if (to < 0 || to >= medications.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: medication.name,\n })\n );\n onReorder(ids);\n },\n [m, medications, onReorder, readOnly, setAnnouncement]\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ status, label, items }) => (\n <section key={status} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((medication) => (\n <MedicationRow\n key={medication.id}\n medication={medication}\n actions={actions}\n readOnly={readOnly}\n drag={drag}\n onMove={moveMedication}\n onStatusChange={handleStatusChange}\n onAction={onAction}\n />\n ))}\n </ul>\n ) : medications.length === 0 ? (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n ) : (\n <p className=\"text-muted-foreground mt-2 flex items-center gap-1.5 text-sm\">\n <Badge variant=\"success\" size=\"sm\">\n ✓\n </Badge>\n {m(reconciledMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly &&\n (addSearch || quickAddOptions?.length || onAddOther) && (\n <div className=\"space-y-2\">\n <span className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Add medication')}\n </span>\n {addSearch}\n {(quickAddOptions?.length || onAddOther) && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {quickAddOptions?.map((name) => (\n <Button\n key={name}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onQuickAdd?.(name)}\n leftIcon={<PlusIcon size={12} />}\n className=\"border-border h-auto rounded-full border px-2.5 py-1 text-xs\"\n >\n {name}\n </Button>\n ))}\n {onAddOther && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onAddOther}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-auto rounded-full px-2.5 py-1 text-xs\"\n >\n {m('Add')}\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Confirmation announcement for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nMedicationList.displayName = 'MedicationList';\n\nexport default MedicationList;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\nimport {\n dateToDisplayFormat,\n displayFormatToDateString,\n} from '../../utils/date';\n\n/**\n * MedicationEditor — prescription editor modal for a `Medication`.\n *\n * Captures the NCPDP SCRIPT NewRx `MedicationPrescribed` field set and codes\n * the drug via `CodeLookup` (RxNorm / FDB, offline). Used by\n * `MedicationReconciliation` for both **Correct** (edit) and **Add\n * Medication**, and usable directly:\n *\n * ```tsx\n * <MedicationEditor\n * open={editing !== null}\n * medication={editing ?? undefined}\n * codeLookup={{ indexUrl: '/codify' }}\n * onClose={() => setEditing(null)}\n * onSave={(med) => upsert(med)}\n * />\n * ```\n *\n * NCPDP mapping (NewRx / MedicationPrescribed):\n *\n * | Editor field | NCPDP element |\n * |----------------|----------------------------------------|\n * | Medication | DrugDescription |\n * | Code | DrugCoded (ProductCode / DrugDBCode) |\n * | Strength | Strength + StrengthUnitOfMeasure |\n * | Dose form | DrugCoded/FormCode |\n * | Quantity | Quantity/Value |\n * | Quantity unit | Quantity/QuantityUnitOfMeasure |\n * | Days supply | DaysSupply |\n * | Directions | Sig/SigText |\n * | Refills | NumberOfRefills |\n * | Substitution | Substitutions (0 permitted / 1 DAW) |\n * | Start date | WrittenDate / EffectiveDate |\n * | Indication | Diagnosis/Primary |\n * | Pharmacy notes | Note |\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport { RadioGroup, Radio } from '../Radio';\nimport { DateInput } from '../DateInput';\nimport type { Medication } from './MedicationList';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Minimal shape of a CodeLookup selection the editor consumes. */\nexport interface MedicationLookupResult {\n label: string;\n codetype: string;\n fullcode: string;\n}\n\n/**\n * Structural subset of `CodeLookupProps` the editor uses. `CodeLookup`\n * satisfies this — it is injected (not imported) because its Web Worker\n * keeps it out of the library build (see CodeLookup/index.ts).\n */\nexport interface MedicationLookupProps {\n indexUrl: string;\n locale?: string;\n domains?: ('med' | 'condition')[];\n searchCodetypes?: string[];\n bare?: boolean;\n clearOnSelect?: boolean;\n placeholder?: string;\n initialQuery?: string;\n initialSearch?: boolean;\n onSelect?: (result: MedicationLookupResult) => void;\n onFreeText?: (text: string) => void;\n}\n\n/** CodeLookup wiring for the editor (component injected by the consumer). */\nexport interface CodeLookupConfig {\n /** The CodeLookup component: `import { CodeLookup } from '…/CodeLookup'` */\n component: React.ComponentType<MedicationLookupProps>;\n /** Base URL of the codify index, e.g. '/codify' */\n indexUrl: string;\n /** Shard locale (default 'en') */\n locale?: string;\n}\n\nexport interface MedicationEditorProps {\n /** Whether the editor is open */\n open: boolean;\n /** Medication being edited — omit for \"add\" mode */\n medication?: Medication;\n /**\n * Codify shard location for RxNorm/FDB coding. Defaults to the ambient\n * `CodeLookupProvider`; pass `false` to force a plain name input.\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require a catalog selection for new or renamed medications; retain legacy entries. */\n requireCode?: boolean;\n /** Called when the editor is dismissed without saving */\n onClose: () => void;\n /** Called with the complete medication on save */\n onSave: (medication: Medication) => void;\n}\n\n// =============================================================================\n// Parsers — drug label → strength/form, sig → route/frequency/PRN\n// =============================================================================\n\nconst DOSE_FORMS = [\n 'tablet',\n 'capsule',\n 'solution',\n 'suspension',\n 'syrup',\n 'cream',\n 'ointment',\n 'gel',\n 'patch',\n 'suppository',\n 'spray',\n 'drops',\n 'inhaler',\n 'injection',\n 'lozenge',\n 'powder',\n 'film',\n];\n\n/** Quantity unit implied by each dose form (NCPDP QuantityUnitOfMeasure). */\nconst FORM_TO_UNIT: Record<string, string> = {\n tablet: 'tablet',\n capsule: 'capsule',\n solution: 'milliliter',\n suspension: 'milliliter',\n syrup: 'milliliter',\n cream: 'gram',\n ointment: 'gram',\n gel: 'gram',\n patch: 'patch',\n suppository: 'suppository',\n spray: 'spray',\n drops: 'milliliter',\n inhaler: 'each',\n injection: 'milliliter',\n lozenge: 'each',\n powder: 'gram',\n film: 'each',\n};\n\n/**\n * Quantity unit implied by a dose form (tablet → tablet, solution →\n * milliliter, …); unrecognized forms fall back to the form itself.\n */\nexport function doseFormToQuantityUnit(doseForm: string): string | undefined {\n const normalized = doseForm.toLowerCase().trim();\n return (FORM_TO_UNIT[normalized] ?? normalized) || undefined;\n}\n\n/**\n * Parse strength + dose form out of a coded drug label,\n * e.g. \"lisinopril 20 mg tablet\" → { strength: '20 mg', doseForm: 'tablet' }.\n */\nexport function parseMedicationLabel(label: string): {\n strength?: string;\n doseForm?: string;\n} {\n const lower = label.toLowerCase();\n // bounded quantifiers keep the match linear-time on adversarial inputs\n // (unbounded \\d+ groups backtrack polynomially on long digit runs)\n const strengthMatch = lower.match(\n /(\\d{1,7}(?:\\.\\d{1,4})?(?:\\s{0,4}\\/\\s{0,4}\\d{1,7}(?:\\.\\d{1,4})?)?)\\s{0,4}(mg\\/ml|mcg\\/ml|mg|mcg|g|ml|units?|%|meq)\\b/\n );\n const doseForm = DOSE_FORMS.find((f) => lower.includes(f));\n return {\n strength: strengthMatch\n ? `${strengthMatch[1].replace(/\\s+/g, '')} ${strengthMatch[2]}`\n : undefined,\n doseForm,\n };\n}\n\nconst SIG_ROUTES: [RegExp, string][] = [\n [/\\bby mouth\\b|\\boral(ly)?\\b|\\bpo\\b/, 'oral'],\n [/\\bsublingual(ly)?\\b|\\bunder the tongue\\b|\\bsl\\b/, 'sublingual'],\n [/\\bsubcutaneous(ly)?\\b|\\bsubq\\b|\\bsc\\b|\\bsq\\b/, 'subcutaneous'],\n [/\\bintramuscular(ly)?\\b|\\bim\\b/, 'intramuscular'],\n [/\\bintravenous(ly)?\\b|\\biv\\b/, 'intravenous'],\n [/\\binhal(e|ation|ed)\\b|\\bpuffs?\\b|\\bnebuliz/, 'inhalation'],\n [/\\beyes?\\b|\\bophthalmic\\b/, 'ophthalmic'],\n [/\\bears?\\b|\\botic\\b/, 'otic'],\n [/\\bnostrils?\\b|\\bnasal(ly)?\\b|\\bintranasal/, 'nasal'],\n [/\\brectal(ly)?\\b|\\bpr\\b/, 'rectal'],\n [/\\btransdermal\\b|\\bto (the )?skin\\b|\\bapply\\b|\\btopical(ly)?\\b/, 'topical'],\n];\n\n// Order matters: specific patterns must precede the bare-\"daily\" fallback\n// (\"twice daily\" must not match Once daily's \\bdaily\\b).\nconst SIG_FREQUENCIES: [RegExp, string][] = [\n [/\\bevery other day\\b|\\bqod\\b/, 'Every other day'],\n [/\\btwice (a |per )?day\\b|\\btwice daily\\b|\\bbid\\b/, 'Twice daily'],\n [\n /\\b(three times|3 times)( a| per)? day\\b|\\b(three times|3 times) daily\\b|\\btid\\b/,\n 'Three times daily',\n ],\n [\n /\\b(four times|4 times)( a| per)? day\\b|\\b(four times|4 times) daily\\b|\\bqid\\b/,\n 'Four times daily',\n ],\n [/\\bevery morning\\b|\\bqam\\b/, 'Every morning'],\n [/\\b(at )?bedtime\\b|\\bqhs\\b|\\bat night\\b/, 'Every bedtime'],\n [/\\bweekly\\b|\\bonce a week\\b|\\bevery week\\b/, 'Weekly'],\n [\n /\\bonce (a |per )?day\\b|\\bonce daily\\b|\\bdaily\\b|\\bevery day\\b|\\bqd\\b/,\n 'Once daily',\n ],\n];\n\n/**\n * Derive route / frequency / PRN from free-text sig,\n * e.g. \"1 tablet by mouth daily as needed\" →\n * { route: 'oral', frequency: 'Once daily', prn: true }.\n */\nexport function parseSig(sig: string): {\n route?: string;\n frequency?: string;\n prn: boolean;\n} {\n const lower = sig.toLowerCase();\n const route = SIG_ROUTES.find(([re]) => re.test(lower))?.[1];\n const frequency = SIG_FREQUENCIES.find(([re]) => re.test(lower))?.[1];\n const prn = /\\bas needed\\b|\\bprn\\b/.test(lower);\n return { route, frequency, prn };\n}\n\n/**\n * Derive the label-parsed Medication fields — strength, dose form, and the\n * form-implied quantity unit — from a drug display label,\n * e.g. \"lisinopril 10 mg tablet\" → { strength: '10 mg', doseForm: 'tablet',\n * quantityUnit: 'tablet' }.\n */\nexport function labelToMedicationFields(label: string): Partial<Medication> {\n const { strength, doseForm } = parseMedicationLabel(label);\n return {\n ...(strength && { strength }),\n ...(doseForm && {\n doseForm,\n quantityUnit: doseFormToQuantityUnit(doseForm),\n }),\n };\n}\n\n/**\n * Derive Medication fields from a CodeLookup pick: name, code reference,\n * and — parsed from the label — strength, dose form, and quantity unit.\n * Used by the editor and by inline add-search flows.\n */\nexport function lookupToMedicationFields(\n result: MedicationLookupResult\n): Partial<Medication> {\n return {\n name: result.label,\n code: {\n system: result.codetype,\n code: result.fullcode,\n display: result.label,\n },\n ...labelToMedicationFields(result.label),\n };\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// Medication dates persist as ISO `yyyy-mm-dd`; the editor's date inputs edit\n// MM/DD/YYYY. Convert at the editor boundary, passing through unrecognized\n// values unchanged.\nfunction isoDateToDisplay(value?: string): string | undefined {\n return value && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n ? dateToDisplayFormat(value)\n : value;\n}\n\nfunction displayDateToIso(value?: string): string | undefined {\n return value ? displayFormatToDateString(value) : value;\n}\n\n// =============================================================================\n// MedicationEditor\n// =============================================================================\n\nexport function MedicationEditor({\n open,\n medication,\n codeLookup,\n requireCode = false,\n onClose,\n onSave,\n}: MedicationEditorProps): React.JSX.Element | null {\n const m = useMessages();\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [draft, setDraft] = React.useState<Medication>(() =>\n medication\n ? {\n ...medication,\n startDate: isoDateToDisplay(medication.startDate),\n endDate: isoDateToDisplay(medication.endDate),\n }\n : {\n id: newId(),\n name: '',\n status: 'unreconciled',\n }\n );\n\n // NOTE: draft state is seeded once per mount — give the editor a `key`\n // (e.g. the medication id) so a different target remounts it.\n\n // Focus the medication search / name input when the dialog opens.\n const bodyRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const input = bodyRef.current?.querySelector('input');\n input?.focus();\n }, []);\n\n const patch = (p: Partial<Medication>) =>\n setDraft((prev) => ({ ...prev, ...p }));\n\n const handleCodeSelect = (result: MedicationLookupResult) => {\n if (requireCode && (!result.codetype.trim() || !result.fullcode.trim()))\n return;\n // Populate strength / dose form / quantity unit from the coded label.\n patch(lookupToMedicationFields(result));\n };\n\n const handleSigChange = (sig: string) => {\n // Route / frequency / PRN are derived from the sig text.\n const { route, frequency, prn } = parseSig(sig);\n patch({ sig, route, frequency, prn: prn || undefined });\n };\n\n const hasCode = Boolean(draft.code?.system.trim() && draft.code.code.trim());\n // Only records that were uncoded on entry are exempt from requireCode —\n // an originally coded medication must keep (or replace) its code.\n const unchangedLegacyName =\n medication && !medication.code && draft.name === medication.name;\n const canSave =\n draft.name.trim().length > 0 &&\n (!requireCode || hasCode || Boolean(unchangedLegacyName));\n\n if (!open) return null;\n\n return (\n <Modal open onOpenChange={(o) => !o && onClose()} size=\"lg\">\n <ModalHeader>\n <ModalTitle>\n {medication ? m('Correct Medication') : m('Add Medication')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-5\">\n <div ref={bodyRef} className=\"contents\">\n {/* ——— Medication + coding ——— */}\n <section className=\"space-y-3\" aria-label={m('Medication')}>\n {effectiveCodeLookup ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-search\">{m('Medication')}</Label>\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect={false}\n placeholder={m('Search RxNorm / FDB — e.g. lisinopril')}\n // Seed the search box with the medication name. Editing an\n // uncoded medication also runs the search immediately so the\n // closest coded matches are offered (a pick fills coding,\n // strength, and dose form); coded ones just show their name.\n initialQuery={medication?.name || undefined}\n initialSearch={medication ? !medication.code : undefined}\n onSelect={handleCodeSelect}\n onFreeText={\n requireCode\n ? undefined\n : (text) => patch({ name: text, code: undefined })\n }\n />\n <p className=\"text-muted-foreground text-xs\">\n {draft.code\n ? m('Coded: {system} {code}', {\n system: draft.code.system,\n code: draft.code.code,\n })\n : draft.name\n ? m(\n 'Uncoded free text: \"{name}\" — pick a result to code it',\n { name: draft.name }\n )\n : requireCode\n ? m('Pick a catalog result to code the medication')\n : m(\n 'Pick a result to code the medication, or press Enter for free text'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-name\">{m('Medication')}</Label>\n <Input\n id=\"med-name\"\n value={draft.name}\n readOnly={requireCode}\n onChange={(e) =>\n patch({ name: e.target.value, code: undefined })\n }\n />\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-strength\">{m('Strength')}</Label>\n <Input\n id=\"med-strength\"\n value={draft.strength ?? ''}\n onChange={(e) => patch({ strength: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-form\">{m('Dose form')}</Label>\n <Input\n id=\"med-form\"\n value={draft.doseForm ?? ''}\n onChange={(e) => {\n const doseForm = e.target.value;\n // Quantity unit follows the dose form (tablet → tablet,\n // solution → milliliter, …)\n patch({\n doseForm,\n quantityUnit: doseFormToQuantityUnit(doseForm),\n });\n }}\n />\n </div>\n </div>\n </section>\n\n {/* ——— Dispensing ——— */}\n <section className=\"space-y-3\" aria-label={m('Dispensing')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Dispensing')}\n </h4>\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-qty\">\n {m('Quantity')}\n {draft.quantityUnit ? ` (${draft.quantityUnit}s)` : ''}\n </Label>\n <Input\n id=\"med-qty\"\n inputMode=\"decimal\"\n value={draft.quantity ?? ''}\n onChange={(e) => patch({ quantity: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-days\">{m('Days supply')}</Label>\n <Input\n id=\"med-days\"\n inputMode=\"numeric\"\n value={draft.daysSupply ?? ''}\n onChange={(e) => patch({ daysSupply: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-refills\">{m('Refills')}</Label>\n <Input\n id=\"med-refills\"\n inputMode=\"numeric\"\n value={draft.refills ?? ''}\n onChange={(e) => patch({ refills: e.target.value })}\n />\n </div>\n </div>\n <RadioGroup\n name=\"med-substitution\"\n label={m('Substitution')}\n value={draft.substitution ?? '0'}\n onValueChange={(v) => patch({ substitution: v as '0' | '1' })}\n orientation=\"horizontal\"\n size=\"sm\"\n >\n <Radio value=\"0\" label={m('Substitution permitted')} />\n <Radio value=\"1\" label={m('Dispense as written (DAW)')} />\n </RadioGroup>\n </section>\n\n {/* ——— Directions ——— */}\n <section className=\"space-y-3\" aria-label={m('Directions')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Directions')}\n </h4>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-sig\">{m('Sig (patient directions)')}</Label>\n <Textarea\n id=\"med-sig\"\n value={draft.sig ?? ''}\n onChange={(e) => handleSigChange(e.target.value)}\n rows={2}\n />\n <p className=\"text-muted-foreground text-xs\" aria-live=\"polite\">\n {draft.route || draft.frequency || draft.prn ? (\n <>\n {m('Derived:')}{' '}\n {[\n draft.route && m('route {route}', { route: draft.route }),\n draft.frequency && m(draft.frequency.toLowerCase()),\n draft.prn && m('PRN (as needed)'),\n ]\n .filter(Boolean)\n .join(' · ')}\n </>\n ) : (\n m('Route, frequency, and PRN are derived from the directions')\n )}\n </p>\n </div>\n </section>\n\n {/* ——— Dates & context ——— */}\n <section className=\"space-y-3\" aria-label={m('Dates and context')}>\n <h4 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Dates & context')}\n </h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-start\">{m('Start date')}</Label>\n <DateInput\n id=\"med-start\"\n value={draft.startDate ?? ''}\n onChange={(v) => patch({ startDate: v })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-end\">{m('End date')}</Label>\n <DateInput\n id=\"med-end\"\n value={draft.endDate ?? ''}\n onChange={(v) => patch({ endDate: v })}\n />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-indication\">{m('Indication')}</Label>\n <Input\n id=\"med-indication\"\n value={draft.indication ?? ''}\n onChange={(e) => patch({ indication: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-pharmacy-notes\">{m('Pharmacy notes')}</Label>\n <Textarea\n id=\"med-pharmacy-notes\"\n value={draft.pharmacyNotes ?? ''}\n onChange={(e) => patch({ pharmacyNotes: e.target.value })}\n rows={2}\n />\n </div>\n </section>\n </div>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button\n onClick={() => {\n onSave({\n ...draft,\n name: draft.name.trim(),\n startDate: displayDateToIso(draft.startDate),\n endDate: displayDateToIso(draft.endDate),\n });\n onClose();\n }}\n disabled={!canSave}\n >\n {m('Save')}\n </Button>\n </ModalFooter>\n </Modal>\n );\n}\n\nexport default MedicationEditor;\n","'use client';\n\nimport { useMessages } from '../../utils/messages';\n\n/**\n * MedicationReconciliation — batteries-included medication reconciliation.\n *\n * Wraps the presentational `MedicationList` with the full interaction layer:\n * status changes, Correct / Notes / Add Task modal dialogs, reordering,\n * removal, and adding medications (quick-add pills + \"Add\" editor modal).\n *\n * Works standalone (uncontrolled with `defaultMedications`, or controlled\n * with `medications` + `onChange`) and is the engine behind the eSheet\n * `medicationList` question type.\n */\n\nimport * as React from 'react';\nimport {\n MedicationList,\n type Medication,\n type MedicationAction,\n} from './MedicationList';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Textarea } from '../Textarea';\nimport { Label } from '../Label';\nimport {\n MedicationEditor,\n lookupToMedicationFields,\n type CodeLookupConfig,\n} from './MedicationEditor';\nimport { useCodeLookupConfig } from '../CodeLookup/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nconst MANAGED_ACTIONS: MedicationAction[] = [\n 'correct',\n 'add-task',\n 'note',\n 'remove',\n];\n\nexport interface MedicationReconciliationProps {\n /** Controlled medication list (use with `onChange`) */\n medications?: Medication[];\n /** Initial medication list (uncontrolled) */\n defaultMedications?: Medication[];\n /** Called with the next list after every mutation */\n onChange?: (medications: Medication[]) => void;\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Common medication names for the quick-add list (omit to hide) */\n quickAddOptions?: string[];\n /** Row actions to show (default: correct, add-task, note, remove) */\n actions?: MedicationAction[];\n /**\n * Called for host-specific actions this component does not manage\n * (e.g. 'open', 'refill' when included in `actions`).\n */\n onAction?: (medication: Medication, action: MedicationAction) => void;\n /**\n * CodeLookup wiring for the medication editor (Correct / Add Medication):\n * pass the CodeLookup component + shard location to enable RxNorm/FDB\n * coding. Defaults to the ambient `CodeLookupProvider` when one is mounted;\n * pass `false` to force a plain-text medication name input.\n *\n * ```tsx\n * import { CodeLookup } from '@mieweb/ui/…/CodeLookup';\n * <MedicationReconciliation codeLookup={{ component: CodeLookup, indexUrl: '/codify' }} … />\n * ```\n */\n codeLookup?: CodeLookupConfig | false;\n /** Require a catalog selection for new medications; existing uncoded records remain editable. */\n requireCode?: boolean;\n /**\n * Render an inline CodeLookup search bar in the add-medication section\n * (requires `codeLookup`). Picks add immediately as Unreconciled — the\n * fastest entry path, and non-leading (no suggested medications), which\n * makes it the right choice for patient-facing intake.\n */\n inlineAddSearch?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when the Unreconciled group is empty */\n reconciledMessage?: string;\n /** Message shown when the medication list has no entries at all */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\nfunction newId(): string {\n return `med-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// =============================================================================\n// Modal dialogs\n// =============================================================================\n\ntype DialogState =\n | { kind: 'correct'; medication: Medication }\n | { kind: 'note'; medication: Medication }\n | { kind: 'add-task'; medication: Medication }\n | { kind: 'add' }\n | null;\n\n/** Small note / task dialog. Correct + Add use the full MedicationEditor. */\nfunction MedicationDialog({\n dialog,\n onClose,\n onSave,\n}: {\n dialog: { kind: 'note' | 'add-task'; medication: Medication };\n onClose: () => void;\n onSave: (fields: Record<string, string>) => void;\n}) {\n const m = useMessages();\n const [form, setForm] = React.useState<Record<string, string>>(() =>\n dialog.kind === 'note'\n ? ({ note: dialog.medication.note ?? '' } as Record<string, string>)\n : ({ task: dialog.medication.task ?? '' } as Record<string, string>)\n );\n\n const set =\n (key: string) =>\n (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) =>\n setForm((prev) => ({ ...prev, [key]: e.target.value }));\n\n const handleSave = () => {\n onSave(form);\n onClose();\n };\n\n return (\n <Modal open onOpenChange={(open) => !open && onClose()} size=\"md\">\n <ModalHeader>\n <ModalTitle>\n {dialog.kind === 'note' ? m('Medication Notes') : m('Add Task')}\n </ModalTitle>\n <ModalClose aria-label={m('Close')} />\n </ModalHeader>\n <ModalBody className=\"space-y-4\">\n <p className=\"text-muted-foreground text-sm\">\n {dialog.medication.name}\n </p>\n {dialog.kind === 'note' ? (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-note\">{m('Note')}</Label>\n <Textarea\n id=\"med-note\"\n value={form.note}\n onChange={set('note')}\n rows={4}\n />\n </div>\n ) : (\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"med-task\">{m('Task')}</Label>\n <Textarea\n id=\"med-task\"\n value={form.task}\n onChange={set('task')}\n rows={3}\n placeholder={m('Follow-up task for this medication')}\n />\n </div>\n )}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={onClose}>\n {m('Cancel')}\n </Button>\n <Button onClick={handleSave}>{m('Save')}</Button>\n </ModalFooter>\n </Modal>\n );\n}\n\n// =============================================================================\n// MedicationReconciliation\n// =============================================================================\n\n/**\n * @example Standalone (uncontrolled)\n * ```tsx\n * <MedicationReconciliation\n * defaultMedications={presentingMeds}\n * quickAddOptions={['aspirin 81 mg tablet']}\n * onChange={(meds) => save(meds)}\n * />\n * ```\n *\n * @example Controlled\n * ```tsx\n * <MedicationReconciliation medications={meds} onChange={setMeds} />\n * ```\n */\nexport function MedicationReconciliation({\n medications: controlledMedications,\n defaultMedications,\n onChange,\n title = 'Presenting medications',\n quickAddOptions,\n actions = MANAGED_ACTIONS,\n onAction,\n codeLookup,\n requireCode = false,\n inlineAddSearch = false,\n readOnly = false,\n reconciledMessage,\n emptyMessage,\n className,\n 'data-testid': dataTestId,\n}: MedicationReconciliationProps): React.JSX.Element {\n const m = useMessages();\n const isControlled = controlledMedications !== undefined;\n const [internal, setInternal] = React.useState<Medication[]>(\n defaultMedications ?? []\n );\n const medications = isControlled ? controlledMedications : internal;\n\n // Default the lookup to the ambient provider; `false` forces plain text.\n const ambientCodeLookup = useCodeLookupConfig();\n const effectiveCodeLookup: CodeLookupConfig | undefined =\n codeLookup === false\n ? undefined\n : (codeLookup ?? ambientCodeLookup ?? undefined);\n\n const [dialog, setDialog] = React.useState<DialogState>(null);\n\n const commit = (next: Medication[]) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n };\n\n const patchMedication = (id: string, patch: Partial<Medication>) => {\n commit(medications.map((m) => (m.id === id ? { ...m, ...patch } : m)));\n };\n\n const moveMedication = (med: Medication, direction: -1 | 1) => {\n // Reorder within the same status group.\n const meds = [...medications];\n const group = meds.filter((m) => m.status === med.status);\n const groupIndex = group.findIndex((m) => m.id === med.id);\n const swapWith = group[groupIndex + direction];\n if (!swapWith) return;\n const i = meds.findIndex((m) => m.id === med.id);\n const j = meds.findIndex((m) => m.id === swapWith.id);\n [meds[i], meds[j]] = [meds[j], meds[i]];\n commit(meds);\n };\n\n const handleAction = (med: Medication, action: MedicationAction) => {\n switch (action) {\n case 'remove':\n commit(medications.filter((m) => m.id !== med.id));\n break;\n case 'move-up':\n moveMedication(med, -1);\n break;\n case 'move-down':\n moveMedication(med, 1);\n break;\n case 'correct':\n case 'note':\n case 'add-task':\n setDialog({ kind: action, medication: med });\n break;\n default:\n // Host-specific actions ('open', 'refill') are delegated.\n onAction?.(med, action);\n break;\n }\n };\n\n const addMedication = (name: string, sig?: string) => {\n commit([\n ...medications,\n { id: newId(), name, sig: sig || undefined, status: 'unreconciled' },\n ]);\n };\n\n const handleDialogSave = (form: Record<string, string>) => {\n if (!dialog) return;\n switch (dialog.kind) {\n case 'note':\n patchMedication(dialog.medication.id, {\n note: form.note.trim() || undefined,\n });\n break;\n case 'add-task':\n patchMedication(dialog.medication.id, {\n task: form.task.trim() || undefined,\n });\n break;\n }\n };\n\n /** Correct + Add flow through the full NCPDP MedicationEditor. */\n const editorOpen = dialog?.kind === 'correct' || dialog?.kind === 'add';\n const editorTarget =\n dialog?.kind === 'correct' ? dialog.medication : undefined;\n\n const handleEditorSave = (med: Medication) => {\n if (dialog?.kind === 'correct') {\n commit(medications.map((m) => (m.id === med.id ? med : m)));\n } else {\n commit([...medications, { ...med, status: 'unreconciled' }]);\n }\n };\n\n /** Inline CodeLookup add bar — picks/free text land in Unreconciled. */\n const addSearch =\n inlineAddSearch && effectiveCodeLookup && !readOnly ? (\n <effectiveCodeLookup.component\n indexUrl={effectiveCodeLookup.indexUrl}\n locale={effectiveCodeLookup.locale}\n domains={['med']}\n bare\n clearOnSelect\n placeholder={m('Search medications to add')}\n onSelect={(result) => {\n if (\n requireCode &&\n (!result.codetype.trim() || !result.fullcode.trim())\n )\n return;\n commit([\n ...medications,\n {\n id: newId(),\n name: result.label,\n status: 'unreconciled',\n ...lookupToMedicationFields(result),\n },\n ]);\n }}\n onFreeText={requireCode ? undefined : (text) => addMedication(text)}\n />\n ) : undefined;\n\n return (\n <>\n <MedicationList\n medications={medications}\n title={title}\n readOnly={readOnly}\n actions={actions}\n onStatusChange={(med, status) => patchMedication(med.id, { status })}\n onAction={handleAction}\n onReorder={(ids) =>\n commit(\n [...medications].sort(\n (a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)\n )\n )\n }\n quickAddOptions={requireCode ? undefined : quickAddOptions}\n onQuickAdd={(name) => addMedication(name)}\n onAddOther={\n requireCode && !effectiveCodeLookup\n ? undefined\n : () => setDialog({ kind: 'add' })\n }\n addSearch={addSearch}\n reconciledMessage={reconciledMessage}\n emptyMessage={emptyMessage}\n className={className}\n data-testid={dataTestId}\n />\n {dialog && (dialog.kind === 'note' || dialog.kind === 'add-task') && (\n <MedicationDialog\n key={dialog.kind + dialog.medication.id}\n dialog={dialog}\n onClose={() => setDialog(null)}\n onSave={handleDialogSave}\n />\n )}\n {editorOpen && (\n <MedicationEditor\n key={editorTarget?.id ?? 'add'}\n open\n medication={editorTarget}\n codeLookup={codeLookup === false ? false : effectiveCodeLookup}\n requireCode={requireCode}\n onClose={() => setDialog(null)}\n onSave={handleEditorSave}\n />\n )}\n </>\n );\n}\n\nexport default MedicationReconciliation;\n"]}