formanitor 0.2.8 → 0.2.10

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.
@@ -1,4 +1,4 @@
1
- import { useAISuggestions, AddMedicationField } from './chunk-4422KT6O.mjs';
1
+ import { useAISuggestions, AddMedicationField } from './chunk-Q5AHXZOG.mjs';
2
2
  import './chunk-GZPCYSJK.mjs';
3
3
  import './chunk-VNFBUAZD.mjs';
4
4
  import { useField, useFieldHandlers, useFrequentItems, useMedicationPackages } from './chunk-HKEUAERY.mjs';
@@ -28,5 +28,5 @@ var AddMedicationWidget = ({ fieldId }) => {
28
28
  };
29
29
 
30
30
  export { AddMedicationWidget };
31
- //# sourceMappingURL=AddMedicationWidget-OEULICY3.mjs.map
32
- //# sourceMappingURL=AddMedicationWidget-OEULICY3.mjs.map
31
+ //# sourceMappingURL=AddMedicationWidget-4LUTXYJX.mjs.map
32
+ //# sourceMappingURL=AddMedicationWidget-4LUTXYJX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/AddMedicationWidget.tsx"],"names":[],"mappings":";;;;;;;;AAOO,IAAM,mBAAA,GAAqD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,oBAAA,EAAqB,GAAI,gBAAA,EAAiB;AAC/D,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAI,gBAAA,EAAiB;AAC9D,EAAA,MAAM,WAAW,qBAAA,EAAsB;AAEvC,EAAA,MAAM,YAA0B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAyB,EAAC;AAElF,EAAA,uBACE,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,aAAA,EAAe,mBAAA;AAAA,MACf,oBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"AddMedicationWidget-OEULICY3.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, useMedicationPackages } from '../../react/FormProvider';\nimport { useAISuggestions } from '../../react/AISuggestionsContext';\nimport { AddMedicationField } from './AddMedicationField';\nimport type { Medication, MedicationSearchResult } from './AddMedicationField';\n\nexport const AddMedicationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { medications: suggestedMedications } = useAISuggestions();\n const { medications: frequentMedications } = useFrequentItems();\n const packages = useMedicationPackages();\n\n const safeValue: Medication[] = Array.isArray(value) ? (value as Medication[]) : [];\n\n return (\n <AddMedicationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<MedicationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as MedicationSearchResult[] | undefined}\n frequentItems={frequentMedications}\n suggestedMedications={suggestedMedications}\n packages={packages}\n />\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/AddMedicationWidget.tsx"],"names":[],"mappings":";;;;;;;;AAOO,IAAM,mBAAA,GAAqD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,oBAAA,EAAqB,GAAI,gBAAA,EAAiB;AAC/D,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAI,gBAAA,EAAiB;AAC9D,EAAA,MAAM,WAAW,qBAAA,EAAsB;AAEvC,EAAA,MAAM,YAA0B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAyB,EAAC;AAElF,EAAA,uBACE,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,aAAA,EAAe,mBAAA;AAAA,MACf,oBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"AddMedicationWidget-4LUTXYJX.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, useMedicationPackages } from '../../react/FormProvider';\nimport { useAISuggestions } from '../../react/AISuggestionsContext';\nimport { AddMedicationField } from './AddMedicationField';\nimport type { Medication, MedicationSearchResult } from './AddMedicationField';\n\nexport const AddMedicationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { medications: suggestedMedications } = useAISuggestions();\n const { medications: frequentMedications } = useFrequentItems();\n const packages = useMedicationPackages();\n\n const safeValue: Medication[] = Array.isArray(value) ? (value as Medication[]) : [];\n\n return (\n <AddMedicationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<MedicationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as MedicationSearchResult[] | undefined}\n frequentItems={frequentMedications}\n suggestedMedications={suggestedMedications}\n packages={packages}\n />\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkA2A5EB5R_cjs = require('./chunk-A2A5EB5R.cjs');
3
+ var chunkBKBPNWSD_cjs = require('./chunk-BKBPNWSD.cjs');
4
4
  require('./chunk-E7WUDHSA.cjs');
5
5
  require('./chunk-TJHG5WHX.cjs');
6
6
  var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
@@ -11,12 +11,12 @@ var jsxRuntime = require('react/jsx-runtime');
11
11
  var AddMedicationWidget = ({ fieldId }) => {
12
12
  const { value, setValue } = chunkJVIU4OBK_cjs.useField(fieldId);
13
13
  const handlers = chunkJVIU4OBK_cjs.useFieldHandlers(fieldId);
14
- const { medications: suggestedMedications } = chunkA2A5EB5R_cjs.useAISuggestions();
14
+ const { medications: suggestedMedications } = chunkBKBPNWSD_cjs.useAISuggestions();
15
15
  const { medications: frequentMedications } = chunkJVIU4OBK_cjs.useFrequentItems();
16
16
  const packages = chunkJVIU4OBK_cjs.useMedicationPackages();
17
17
  const safeValue = Array.isArray(value) ? value : [];
18
18
  return /* @__PURE__ */ jsxRuntime.jsx(
19
- chunkA2A5EB5R_cjs.AddMedicationField,
19
+ chunkBKBPNWSD_cjs.AddMedicationField,
20
20
  {
21
21
  value: safeValue,
22
22
  onChange: setValue,
@@ -30,5 +30,5 @@ var AddMedicationWidget = ({ fieldId }) => {
30
30
  };
31
31
 
32
32
  exports.AddMedicationWidget = AddMedicationWidget;
33
- //# sourceMappingURL=AddMedicationWidget-UDVVDKHR.cjs.map
34
- //# sourceMappingURL=AddMedicationWidget-UDVVDKHR.cjs.map
33
+ //# sourceMappingURL=AddMedicationWidget-4XZN4KUP.cjs.map
34
+ //# sourceMappingURL=AddMedicationWidget-4XZN4KUP.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/AddMedicationWidget.tsx"],"names":["useField","useFieldHandlers","useAISuggestions","useFrequentItems","useMedicationPackages","jsx","AddMedicationField"],"mappings":";;;;;;;;;;AAOO,IAAM,mBAAA,GAAqD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIA,2BAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWC,mCAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,oBAAA,EAAqB,GAAIC,kCAAA,EAAiB;AAC/D,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAIC,kCAAA,EAAiB;AAC9D,EAAA,MAAM,WAAWC,uCAAA,EAAsB;AAEvC,EAAA,MAAM,YAA0B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAyB,EAAC;AAElF,EAAA,uBACEC,cAAA;AAAA,IAACC,oCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,aAAA,EAAe,mBAAA;AAAA,MACf,oBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"AddMedicationWidget-UDVVDKHR.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, useMedicationPackages } from '../../react/FormProvider';\nimport { useAISuggestions } from '../../react/AISuggestionsContext';\nimport { AddMedicationField } from './AddMedicationField';\nimport type { Medication, MedicationSearchResult } from './AddMedicationField';\n\nexport const AddMedicationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { medications: suggestedMedications } = useAISuggestions();\n const { medications: frequentMedications } = useFrequentItems();\n const packages = useMedicationPackages();\n\n const safeValue: Medication[] = Array.isArray(value) ? (value as Medication[]) : [];\n\n return (\n <AddMedicationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<MedicationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as MedicationSearchResult[] | undefined}\n frequentItems={frequentMedications}\n suggestedMedications={suggestedMedications}\n packages={packages}\n />\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/AddMedicationWidget.tsx"],"names":["useField","useFieldHandlers","useAISuggestions","useFrequentItems","useMedicationPackages","jsx","AddMedicationField"],"mappings":";;;;;;;;;;AAOO,IAAM,mBAAA,GAAqD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIA,2BAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWC,mCAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,oBAAA,EAAqB,GAAIC,kCAAA,EAAiB;AAC/D,EAAA,MAAM,EAAE,WAAA,EAAa,mBAAA,EAAoB,GAAIC,kCAAA,EAAiB;AAC9D,EAAA,MAAM,WAAWC,uCAAA,EAAsB;AAEvC,EAAA,MAAM,YAA0B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAAyB,EAAC;AAElF,EAAA,uBACEC,cAAA;AAAA,IAACC,oCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,QAAA;AAAA,MACV,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,aAAA,EAAe,mBAAA;AAAA,MACf,oBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"AddMedicationWidget-4XZN4KUP.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, useMedicationPackages } from '../../react/FormProvider';\nimport { useAISuggestions } from '../../react/AISuggestionsContext';\nimport { AddMedicationField } from './AddMedicationField';\nimport type { Medication, MedicationSearchResult } from './AddMedicationField';\n\nexport const AddMedicationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { medications: suggestedMedications } = useAISuggestions();\n const { medications: frequentMedications } = useFrequentItems();\n const packages = useMedicationPackages();\n\n const safeValue: Medication[] = Array.isArray(value) ? (value as Medication[]) : [];\n\n return (\n <AddMedicationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<MedicationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as MedicationSearchResult[] | undefined}\n frequentItems={frequentMedications}\n suggestedMedications={suggestedMedications}\n packages={packages}\n />\n );\n};\n"]}
@@ -58,6 +58,36 @@ function mapToMedication(result) {
58
58
  notes: ""
59
59
  };
60
60
  }
61
+ var DURATION_UNITS = /* @__PURE__ */ new Set(["days", "weeks", "months"]);
62
+ var FREQUENCY_OPTIONS = /* @__PURE__ */ new Set([
63
+ "custom",
64
+ "qid",
65
+ "alternate_day",
66
+ "once_weekly",
67
+ "once_monthly",
68
+ "as_needed",
69
+ "fort_night",
70
+ "at_bed_time",
71
+ "sos",
72
+ "biweekly",
73
+ "stat"
74
+ ]);
75
+ function mapPackageDrugToMedication(drug) {
76
+ const base = mapToMedication(drug);
77
+ const duration_unit = drug.duration_unit && DURATION_UNITS.has(drug.duration_unit) ? drug.duration_unit : base.duration_unit;
78
+ const frequency = drug.frequency && FREQUENCY_OPTIONS.has(drug.frequency) ? drug.frequency : base.frequency;
79
+ return {
80
+ ...base,
81
+ duration_value: drug.duration_value ?? base.duration_value,
82
+ duration_unit,
83
+ route: drug.route ?? base.route,
84
+ notes: drug.notes ?? base.notes,
85
+ frequency,
86
+ morning: drug.morning ?? base.morning,
87
+ afternoon: drug.afternoon ?? base.afternoon,
88
+ night: drug.night ?? base.night
89
+ };
90
+ }
61
91
  function mapAIMedicationToMedication(ai) {
62
92
  const id = ai.id != null ? String(ai.id) : "";
63
93
  return {
@@ -404,7 +434,10 @@ var AddMedicationField = ({
404
434
  });
405
435
  } else {
406
436
  const currentIds = new Set(valueRef.current.map((m) => String(m.id)));
407
- const newMeds = pkg.medications.filter((d) => !currentIds.has(String(d.id))).map((d) => mapToMedication(d));
437
+ const newMeds = pkg.medications.filter((d) => !currentIds.has(String(d.id))).map((d) => {
438
+ const mapped = mapPackageDrugToMedication(d);
439
+ return d.is_custom ? { ...mapped, id: String(customIdRef.current--) } : mapped;
440
+ });
408
441
  if (newMeds.length > 0) {
409
442
  onChange([...valueRef.current, ...newMeds]);
410
443
  }
@@ -602,5 +635,5 @@ var AddMedicationField = ({
602
635
  exports.AISuggestionsProvider = AISuggestionsProvider;
603
636
  exports.AddMedicationField = AddMedicationField;
604
637
  exports.useAISuggestions = useAISuggestions;
605
- //# sourceMappingURL=chunk-A2A5EB5R.cjs.map
606
- //# sourceMappingURL=chunk-A2A5EB5R.cjs.map
638
+ //# sourceMappingURL=chunk-BKBPNWSD.cjs.map
639
+ //# sourceMappingURL=chunk-BKBPNWSD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/AISuggestionsContext.tsx","../src/ui/widgets/AddMedicationField.tsx"],"names":["createContext","useContext","jsxs","jsx","ChevronUp","ChevronDown","useState","Trash2","cn","ChevronRight","Check","useRef","useEffect","Fragment","AddEntityDialog","Input","Plus"],"mappings":"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","file":"chunk-BKBPNWSD.cjs","sourcesContent":["import { createContext, useContext } from 'react';\n\n/** Shape of a medication as returned by AI analysis */\nexport type AIMedication = {\n id: string | number;\n brand_name: string;\n generic_name: string;\n form?: string;\n strength?: string;\n reason?: string;\n};\n\nexport type AISuggestions = {\n medications?: AIMedication[];\n};\n\nconst AISuggestionsContext = createContext<AISuggestions>({});\n\nexport function useAISuggestions(): AISuggestions {\n return useContext(AISuggestionsContext);\n}\n\nexport const AISuggestionsProvider = AISuggestionsContext.Provider;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Trash2, ChevronUp, ChevronDown, ChevronRight, Plus, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { AIMedication } from '../../react/AISuggestionsContext';\nimport type { MedicationFrequentItem, MedicationPackage, MedicationPackageDrug } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst BEFORE_AFTER_OPTIONS = [\n { label: 'Blank', value: '' },\n { label: 'AFTER FOOD', value: 'AFTER FOOD' },\n { label: 'BEFORE FOOD', value: 'BEFORE FOOD' },\n { label: 'WITH FOOD', value: 'WITH FOOD' },\n { label: 'SINGLE DOSE', value: 'SINGLE DOSE' },\n { label: 'BED TIME', value: 'BED TIME' },\n { label: 'EMPTY STOMACH', value: 'EMPTY STOMACH' },\n { label: 'LOCAL APPLICATION', value: 'LOCAL APPLICATION' },\n { label: 'STAT', value: 'STAT' },\n { label: 'INHALATION', value: 'INHALATION' },\n] as const;\n\ntype BeforeAfterOption = (typeof BEFORE_AFTER_OPTIONS)[number]['value'];\n\nconst BEFORE_AFTER_NORMALIZATION_MAP: Record<string, BeforeAfterOption> = {\n AF: 'AFTER FOOD',\n BF: 'BEFORE FOOD',\n};\n\nexport type MedicationSearchResult = {\n id: string;\n name: string;\n generic_name?: string;\n manufacturer?: string;\n score?: number;\n};\n\n\nconst ROUTE_OPTIONS = [\n { label: 'Select route', value: '' },\n { label: 'Per Os', value: 'Per Os' },\n { label: 'Intravenous', value: 'Intravenous' },\n { label: 'Intramuscular', value: 'Intramuscular' },\n { label: 'Subcutaneous', value: 'Subcutaneous' },\n { label: 'Sublingual', value: 'Sublingual' },\n { label: 'Intranasal', value: 'Intranasal' },\n { label: 'Topical', value: 'Topical' },\n { label: 'Per Rectum', value: 'Per Rectum' },\n { label: 'Inhalation', value: 'Inhalation' },\n { label: 'ID Intradermal', value: 'ID Intradermal' },\n] as const;\n\nexport type Medication = {\n id: string;\n brand_name: string;\n generic_name: string;\n frequency: string;\n is_custom: boolean;\n duration_value: string;\n duration_unit: 'days' | 'weeks' | 'months';\n before_after: BeforeAfterOption;\n route: string;\n morning: string;\n afternoon: string;\n night: string;\n notes: string;\n};\n\nexport type AddMedicationFieldProps = {\n label?: string;\n value: Medication[];\n onChange: (items: Medication[]) => void;\n onSearch: (query: string) => Promise<MedicationSearchResult[]>;\n recentlyUsed?: MedicationSearchResult[];\n /** Doctor-scoped frequently used medications (from FormProvider frequentItems) */\n frequentItems?: MedicationFrequentItem[];\n /** AI-suggested medications shown as badges; clicking adds to value */\n suggestedMedications?: AIMedication[];\n packages?: MedicationPackage[];\n};\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToMedication(result: MedicationSearchResult): Medication {\n return {\n id: result.id,\n brand_name: result.name,\n generic_name: result.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\nconst DURATION_UNITS = new Set<Medication['duration_unit']>(['days', 'weeks', 'months']);\n\nconst FREQUENCY_OPTIONS = new Set([\n 'custom', 'qid', 'alternate_day', 'once_weekly', 'once_monthly',\n 'as_needed', 'fort_night', 'at_bed_time', 'sos', 'biweekly', 'stat',\n]);\n\nfunction mapPackageDrugToMedication(drug: MedicationPackageDrug): Medication {\n const base = mapToMedication(drug);\n const duration_unit =\n drug.duration_unit && DURATION_UNITS.has(drug.duration_unit as Medication['duration_unit'])\n ? (drug.duration_unit as Medication['duration_unit'])\n : base.duration_unit;\n const frequency =\n drug.frequency && FREQUENCY_OPTIONS.has(drug.frequency) ? drug.frequency : base.frequency;\n return {\n ...base,\n duration_value: drug.duration_value ?? base.duration_value,\n duration_unit,\n route: drug.route ?? base.route,\n notes: drug.notes ?? base.notes,\n frequency,\n morning: drug.morning ?? base.morning,\n afternoon: drug.afternoon ?? base.afternoon,\n night: drug.night ?? base.night,\n };\n}\n\nfunction mapAIMedicationToMedication(ai: AIMedication): Medication {\n const id = ai.id != null ? String(ai.id) : '';\n return {\n id,\n brand_name: ai.brand_name ?? '',\n generic_name: ai.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '1',\n afternoon: '0',\n night: '1',\n notes: ai.reason ?? '',\n };\n}\n\nfunction createCustomMedication(name: string, customId: number): Medication {\n return {\n id: String(customId),\n brand_name: name.trim(),\n generic_name: '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\n/** Parse duration string like \"5 days\" or \"2 weeks\" into value + unit */\nfunction parseDuration(duration?: string): { value: string; unit: 'days' | 'weeks' | 'months' } {\n if (!duration || !duration.trim()) return { value: '3', unit: 'days' };\n const lower = duration.trim().toLowerCase();\n const match = lower.match(/^(\\d+)\\s*(day|days|week|weeks|month|months)?$/);\n if (!match) return { value: '3', unit: 'days' };\n const value = match[1] ?? '3';\n const unitWord = match[2] ?? 'days';\n const unit: 'days' | 'weeks' | 'months' =\n unitWord.startsWith('month') ? 'months' : unitWord.startsWith('week') ? 'weeks' : 'days';\n return { value, unit };\n}\n\nfunction mapFrequentItemToMedication(item: MedicationFrequentItem): Medication {\n const parsed = parseDuration(item.duration);\n const duration_value = item.duration_value ?? parsed.value;\n const duration_unit =\n (item.duration_unit as Medication['duration_unit'] | undefined) ?? parsed.unit;\n\n const before_after: Medication['before_after'] = normalizeBeforeAfter(item.before_after);\n\n const routeNote = item.route ? `Route: ${item.route}` : '';\n const baseNotes = item.notes?.trim() || '';\n const combinedNotes =\n [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(' — ');\n\n return {\n id: item.id,\n brand_name: item.brand_name ?? item.name,\n generic_name: item.short_name ?? '',\n frequency: item.frequency ?? 'custom',\n is_custom: false,\n duration_value,\n duration_unit,\n before_after,\n route: item.route ?? '',\n morning: item.morning ?? '0',\n afternoon: item.afternoon ?? '0',\n night: item.night ?? '0',\n notes: combinedNotes,\n };\n}\n\nfunction normalizeBeforeAfter(value?: string): BeforeAfterOption {\n if (value == null) return 'AFTER FOOD';\n const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];\n if (mapped) return mapped;\n const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);\n return validValues.includes(value as BeforeAfterOption) ? (value as BeforeAfterOption) : 'AFTER FOOD';\n}\n\nfunction Spinner({\n value,\n onChange,\n}: {\n value: string;\n onChange: (v: string) => void;\n}) {\n const num = parseInt(value, 10) || 0;\n return (\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(num + 1))}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <span className=\"text-sm w-4 text-center leading-none\">{num}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(Math.max(0, num - 1)))}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// ─── Medication card (added item) ─────────────────────────────────────────────\n\nfunction MedicationCard({\n med,\n onUpdate,\n onRemove,\n}: {\n med: Medication;\n onUpdate: (updated: Medication) => void;\n onRemove: () => void;\n}) {\n const [notesOpen, setNotesOpen] = useState(false);\n\n function set<K extends keyof Medication>(key: K, val: Medication[K]) {\n onUpdate({ ...med, [key]: val });\n }\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-3 space-y-2\">\n {/* Row 1: drug name, frequency dropdown, morning/afternoon/night labels, delete */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-semibold text-sm flex-1 min-w-0 truncate\">{med.brand_name}</span>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.frequency}\n onChange={(e) => set('frequency', e.target.value)}\n >\n <option value=\"custom\">select frequency</option>\n <option value=\"qid\">4 times a day (QID)</option>\n <option value=\"alternate_day\">Alternate day</option>\n <option value=\"once_weekly\">Once weekly</option>\n <option value=\"once_monthly\">Once monthly</option>\n <option value=\"as_needed\">As needed</option>\n <option value=\"fort_night\">Fort night</option>\n <option value=\"at_bed_time\">At Bed time</option>\n <option value=\"sos\">SOS only</option>\n <option value=\"biweekly\">Biweekly</option>\n <option value=\"stat\">STAT</option>\n </select>\n <div className=\"flex gap-4 items-center shrink-0\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <span\n key={slot}\n className=\"text-[10px] font-semibold uppercase text-muted-foreground tracking-wide\"\n >\n {slot === 'afternoon' ? 'AFTERNOON' : slot === 'morning' ? 'MORNING' : 'NIGHT'}\n </span>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-red-400 hover:text-red-600 shrink-0 p-1 cursor-pointer\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Row 2: duration (value + unit) on left; 3 dose spinners in middle; AF/BF on right */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <div className=\"flex items-center gap-1 shrink-0\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n className=\"w-11 text-sm border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_value}\n onChange={(e) => {\n const v = e.target.value.replace(/\\D/g, '');\n set('duration_value', v === '' ? '' : v);\n }}\n />\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_unit}\n onChange={(e) => set('duration_unit', e.target.value as Medication['duration_unit'])}\n >\n <option value=\"days\">days</option>\n <option value=\"weeks\">weeks</option>\n <option value=\"months\">months</option>\n </select>\n </div>\n <div className=\"flex gap-2 items-center flex-1 min-w-0 justify-end\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <div key={slot} className=\"flex flex-col items-center gap-0.5\">\n <Spinner value={med[slot]} onChange={(v) => set(slot, v)} />\n </div>\n ))}\n </div>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={normalizeBeforeAfter(med.before_after)}\n onChange={(e) => set('before_after', e.target.value as Medication['before_after'])}\n >\n {BEFORE_AFTER_OPTIONS.map((option) => (\n <option key={option.label} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.route ?? ''}\n onChange={(e) => set('route', e.target.value)}\n >\n {ROUTE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Row 3: medicine notes — full-width div as hit area (chevron + text), cursor-pointer */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setNotesOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setNotesOpen((o) => !o);\n }\n }}\n className={cn(\n 'flex items-center gap-2 w-full text-left text-xs text-muted-foreground hover:text-foreground',\n 'cursor-pointer py-2 px-2 rounded border border-transparent hover:bg-gray-100/80 transition-colors'\n )}\n >\n <ChevronRight\n className={cn('h-3 w-3 shrink-0 transition-transform', notesOpen && 'rotate-90')}\n />\n <span>Medicine Notes</span>\n </div>\n {notesOpen && (\n <div className=\"relative z-10 mt-0.5\">\n <textarea\n className=\"block w-full text-xs border border-border rounded px-2 py-1 resize-none bg-white min-h-0\"\n rows={2}\n placeholder=\"Add notes...\"\n value={med.notes}\n onChange={(e) => set('notes', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Search result card ────────────────────────────────────────────────────────\n\nconst ADD_FEEDBACK_MS = 320;\n\nfunction SearchResultCard({\n result,\n isAdding,\n onSelect,\n}: {\n result: MedicationSearchResult;\n isAdding: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'w-full text-left border rounded-lg px-3 py-2 transition-all duration-300 ease-out cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'border-green-400 bg-green-50 scale-[0.98]'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-sm font-semibold leading-tight truncate\">{result.name}</p>\n {result.generic_name && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n Generic: {result.generic_name}\n </p>\n )}\n </div>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddMedicationField: React.FC<AddMedicationFieldProps> = ({\n label = 'Medications',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n suggestedMedications = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<MedicationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingResultId, setAddingResultId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const customIdRef = useRef(-1);\n const valueRef = useRef<Medication[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which medication IDs were added by each package: packageId → medicationId[]\n const addedByPackage = useRef<Map<string, string[]>>(new Map());\n // drives re-renders for package chip selected state\n const [selectedPackageIds, setSelectedPackageIds] = useState<Set<string>>(new Set());\n\n const safeValue = Array.isArray(value) ? value : [];\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((m) => String(m.id)));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingResultId(null);\n }\n }, [open]);\n\n function handleQueryChange(q: string) {\n setQuery(q);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (!q.trim()) {\n setResults([]);\n return;\n }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const res = await onSearch(q);\n setResults(res);\n } finally {\n setLoading(false);\n }\n }, 500);\n }\n\n function handleRecentlyUsedToggle(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(result.id)));\n } else {\n onChange([...safeValue, mapToMedication(result)]);\n }\n }\n\n function handleFrequentItemToggle(item: MedicationFrequentItem) {\n if (addedIds.has(String(item.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(item.id)));\n } else {\n onChange([...safeValue, mapFrequentItemToMedication(item)]);\n }\n }\n\n function handlePackageToggle(pkg: MedicationPackage) {\n const alreadyAdded = addedByPackage.current.has(pkg.id);\n if (alreadyAdded) {\n const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);\n onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));\n addedByPackage.current.delete(pkg.id);\n setSelectedPackageIds((prev) => {\n const next = new Set(prev);\n next.delete(pkg.id);\n return next;\n });\n } else {\n const currentIds = new Set(valueRef.current.map((m) => String(m.id)));\n const newMeds = pkg.medications\n .filter((d) => !currentIds.has(String(d.id)))\n .map((d) => {\n const mapped = mapPackageDrugToMedication(d);\n return d.is_custom ? { ...mapped, id: String(customIdRef.current--) } : mapped;\n });\n if (newMeds.length > 0) {\n onChange([...valueRef.current, ...newMeds]);\n }\n addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n function handleResultClick(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) return;\n setAddingResultId(result.id);\n setTimeout(() => {\n onChange([...valueRef.current, mapToMedication(result)]);\n setAddingResultId(null);\n setQuery('');\n setResults([]);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function handleSave() {\n const trimmed = query.trim();\n if (!trimmed) return;\n const customId = customIdRef.current--;\n onChange([...safeValue, createCustomMedication(trimmed, customId)]);\n setQuery('');\n setResults([]);\n }\n\n function handleAddSuggestion(ai: AIMedication) {\n if (addedIds.has(String(ai.id))) return;\n onChange([...safeValue, mapAIMedicationToMedication(ai)]);\n }\n\n function updateMed(index: number, updated: Medication) {\n const next = [...safeValue];\n next[index] = updated;\n onChange(next);\n }\n\n function removeMed(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(String(r.id));\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleRecentlyUsedToggle(r)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {r.name}\n </button>\n );\n });\n\n const limitedFrequentItems = frequentItems.slice(0, 25);\n\n const frequentItemChips =\n limitedFrequentItems.length > 0\n ? limitedFrequentItems.map((item) => {\n const isAdded = addedIds.has(String(item.id));\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-[11px] px-2 py-0.5 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {item.brand_name ?? item.name}\n </button>\n );\n })\n : [];\n\n const packageChips = packages.map((pkg) => {\n const isAdded = selectedPackageIds.has(pkg.id);\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => handlePackageToggle(pkg)}\n className={cn(\n 'rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span>✓</span>}\n <span className=\"font-semibold\">{pkg.name}</span>\n <span className={cn(\n 'rounded-full px-1.5 py-0.5 text-[10px] font-medium',\n isAdded ? 'bg-green-100 text-green-600' : 'bg-purple-100 text-purple-600'\n )}>\n {pkg.medications.length}\n </span>\n </button>\n );\n });\n\n const chipSections = [];\n if (frequentItemChips.length > 0) {\n chipSections.push({ label: 'Frequently used', content: <>{frequentItemChips}</> });\n } else if (recentlyUsedChips.length > 0) {\n chipSections.push({ label: 'Recently Used', content: <>{recentlyUsedChips}</> });\n }\n if (packageChips.length > 0) {\n chipSections.push({ label: 'Packages', content: <>{packageChips}</> });\n }\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold\">{label}</span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"text-sm font-semibold text-purple-600 hover:text-purple-800 cursor-pointer\"\n >\n ADD\n </button>\n </div>\n\n {/* Added medications */}\n <div className=\"space-y-2\">\n {safeValue.map((med, i) => (\n <MedicationCard\n key={med.id}\n med={med}\n onUpdate={(u) => updateMed(i, u)}\n onRemove={() => removeMed(i)}\n />\n ))}\n </div>\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Medication\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={!query.trim()}\n onClick={handleSave}\n className={cn(\n 'rounded-md px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground hover:bg-primary/90 transition-opacity cursor-pointer',\n !query.trim() && 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Medicine\n </button>\n }\n >\n <div className=\"space-y-3\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search medicines...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* AI-suggested medications as clickable badges (inside dialog) */}\n {suggestedMedications.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 items-center\">\n <span className=\"text-xs text-muted-foreground mr-1\">Suggestions:</span>\n {suggestedMedications\n .filter((s) => !addedIds.has(String(s.id)))\n .slice(0, 25)\n .map((s) => (\n <button\n key={String(s.id)}\n type=\"button\"\n onClick={() => handleAddSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-dashed border-purple-300 bg-purple-50/80 text-purple-800 text-[11px] px-2 py-0.5 hover:bg-purple-100 transition-colors cursor-pointer\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.brand_name || s.generic_name || String(s.id)}\n </button>\n ))}\n </div>\n )}\n\n {/* Results grid */}\n {loading && (\n <p className=\"text-xs text-muted-foreground text-center py-2\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {results.map((r) => (\n <SearchResultCard\n key={r.id}\n result={r}\n isAdding={addingResultId === r.id}\n onSelect={() => handleResultClick(r)}\n />\n ))}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
@@ -56,6 +56,36 @@ function mapToMedication(result) {
56
56
  notes: ""
57
57
  };
58
58
  }
59
+ var DURATION_UNITS = /* @__PURE__ */ new Set(["days", "weeks", "months"]);
60
+ var FREQUENCY_OPTIONS = /* @__PURE__ */ new Set([
61
+ "custom",
62
+ "qid",
63
+ "alternate_day",
64
+ "once_weekly",
65
+ "once_monthly",
66
+ "as_needed",
67
+ "fort_night",
68
+ "at_bed_time",
69
+ "sos",
70
+ "biweekly",
71
+ "stat"
72
+ ]);
73
+ function mapPackageDrugToMedication(drug) {
74
+ const base = mapToMedication(drug);
75
+ const duration_unit = drug.duration_unit && DURATION_UNITS.has(drug.duration_unit) ? drug.duration_unit : base.duration_unit;
76
+ const frequency = drug.frequency && FREQUENCY_OPTIONS.has(drug.frequency) ? drug.frequency : base.frequency;
77
+ return {
78
+ ...base,
79
+ duration_value: drug.duration_value ?? base.duration_value,
80
+ duration_unit,
81
+ route: drug.route ?? base.route,
82
+ notes: drug.notes ?? base.notes,
83
+ frequency,
84
+ morning: drug.morning ?? base.morning,
85
+ afternoon: drug.afternoon ?? base.afternoon,
86
+ night: drug.night ?? base.night
87
+ };
88
+ }
59
89
  function mapAIMedicationToMedication(ai) {
60
90
  const id = ai.id != null ? String(ai.id) : "";
61
91
  return {
@@ -402,7 +432,10 @@ var AddMedicationField = ({
402
432
  });
403
433
  } else {
404
434
  const currentIds = new Set(valueRef.current.map((m) => String(m.id)));
405
- const newMeds = pkg.medications.filter((d) => !currentIds.has(String(d.id))).map((d) => mapToMedication(d));
435
+ const newMeds = pkg.medications.filter((d) => !currentIds.has(String(d.id))).map((d) => {
436
+ const mapped = mapPackageDrugToMedication(d);
437
+ return d.is_custom ? { ...mapped, id: String(customIdRef.current--) } : mapped;
438
+ });
406
439
  if (newMeds.length > 0) {
407
440
  onChange([...valueRef.current, ...newMeds]);
408
441
  }
@@ -598,5 +631,5 @@ var AddMedicationField = ({
598
631
  };
599
632
 
600
633
  export { AISuggestionsProvider, AddMedicationField, useAISuggestions };
601
- //# sourceMappingURL=chunk-4422KT6O.mjs.map
602
- //# sourceMappingURL=chunk-4422KT6O.mjs.map
634
+ //# sourceMappingURL=chunk-Q5AHXZOG.mjs.map
635
+ //# sourceMappingURL=chunk-Q5AHXZOG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/AISuggestionsContext.tsx","../src/ui/widgets/AddMedicationField.tsx"],"names":[],"mappings":"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","file":"chunk-Q5AHXZOG.mjs","sourcesContent":["import { createContext, useContext } from 'react';\n\n/** Shape of a medication as returned by AI analysis */\nexport type AIMedication = {\n id: string | number;\n brand_name: string;\n generic_name: string;\n form?: string;\n strength?: string;\n reason?: string;\n};\n\nexport type AISuggestions = {\n medications?: AIMedication[];\n};\n\nconst AISuggestionsContext = createContext<AISuggestions>({});\n\nexport function useAISuggestions(): AISuggestions {\n return useContext(AISuggestionsContext);\n}\n\nexport const AISuggestionsProvider = AISuggestionsContext.Provider;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Trash2, ChevronUp, ChevronDown, ChevronRight, Plus, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { AIMedication } from '../../react/AISuggestionsContext';\nimport type { MedicationFrequentItem, MedicationPackage, MedicationPackageDrug } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst BEFORE_AFTER_OPTIONS = [\n { label: 'Blank', value: '' },\n { label: 'AFTER FOOD', value: 'AFTER FOOD' },\n { label: 'BEFORE FOOD', value: 'BEFORE FOOD' },\n { label: 'WITH FOOD', value: 'WITH FOOD' },\n { label: 'SINGLE DOSE', value: 'SINGLE DOSE' },\n { label: 'BED TIME', value: 'BED TIME' },\n { label: 'EMPTY STOMACH', value: 'EMPTY STOMACH' },\n { label: 'LOCAL APPLICATION', value: 'LOCAL APPLICATION' },\n { label: 'STAT', value: 'STAT' },\n { label: 'INHALATION', value: 'INHALATION' },\n] as const;\n\ntype BeforeAfterOption = (typeof BEFORE_AFTER_OPTIONS)[number]['value'];\n\nconst BEFORE_AFTER_NORMALIZATION_MAP: Record<string, BeforeAfterOption> = {\n AF: 'AFTER FOOD',\n BF: 'BEFORE FOOD',\n};\n\nexport type MedicationSearchResult = {\n id: string;\n name: string;\n generic_name?: string;\n manufacturer?: string;\n score?: number;\n};\n\n\nconst ROUTE_OPTIONS = [\n { label: 'Select route', value: '' },\n { label: 'Per Os', value: 'Per Os' },\n { label: 'Intravenous', value: 'Intravenous' },\n { label: 'Intramuscular', value: 'Intramuscular' },\n { label: 'Subcutaneous', value: 'Subcutaneous' },\n { label: 'Sublingual', value: 'Sublingual' },\n { label: 'Intranasal', value: 'Intranasal' },\n { label: 'Topical', value: 'Topical' },\n { label: 'Per Rectum', value: 'Per Rectum' },\n { label: 'Inhalation', value: 'Inhalation' },\n { label: 'ID Intradermal', value: 'ID Intradermal' },\n] as const;\n\nexport type Medication = {\n id: string;\n brand_name: string;\n generic_name: string;\n frequency: string;\n is_custom: boolean;\n duration_value: string;\n duration_unit: 'days' | 'weeks' | 'months';\n before_after: BeforeAfterOption;\n route: string;\n morning: string;\n afternoon: string;\n night: string;\n notes: string;\n};\n\nexport type AddMedicationFieldProps = {\n label?: string;\n value: Medication[];\n onChange: (items: Medication[]) => void;\n onSearch: (query: string) => Promise<MedicationSearchResult[]>;\n recentlyUsed?: MedicationSearchResult[];\n /** Doctor-scoped frequently used medications (from FormProvider frequentItems) */\n frequentItems?: MedicationFrequentItem[];\n /** AI-suggested medications shown as badges; clicking adds to value */\n suggestedMedications?: AIMedication[];\n packages?: MedicationPackage[];\n};\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToMedication(result: MedicationSearchResult): Medication {\n return {\n id: result.id,\n brand_name: result.name,\n generic_name: result.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\nconst DURATION_UNITS = new Set<Medication['duration_unit']>(['days', 'weeks', 'months']);\n\nconst FREQUENCY_OPTIONS = new Set([\n 'custom', 'qid', 'alternate_day', 'once_weekly', 'once_monthly',\n 'as_needed', 'fort_night', 'at_bed_time', 'sos', 'biweekly', 'stat',\n]);\n\nfunction mapPackageDrugToMedication(drug: MedicationPackageDrug): Medication {\n const base = mapToMedication(drug);\n const duration_unit =\n drug.duration_unit && DURATION_UNITS.has(drug.duration_unit as Medication['duration_unit'])\n ? (drug.duration_unit as Medication['duration_unit'])\n : base.duration_unit;\n const frequency =\n drug.frequency && FREQUENCY_OPTIONS.has(drug.frequency) ? drug.frequency : base.frequency;\n return {\n ...base,\n duration_value: drug.duration_value ?? base.duration_value,\n duration_unit,\n route: drug.route ?? base.route,\n notes: drug.notes ?? base.notes,\n frequency,\n morning: drug.morning ?? base.morning,\n afternoon: drug.afternoon ?? base.afternoon,\n night: drug.night ?? base.night,\n };\n}\n\nfunction mapAIMedicationToMedication(ai: AIMedication): Medication {\n const id = ai.id != null ? String(ai.id) : '';\n return {\n id,\n brand_name: ai.brand_name ?? '',\n generic_name: ai.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '1',\n afternoon: '0',\n night: '1',\n notes: ai.reason ?? '',\n };\n}\n\nfunction createCustomMedication(name: string, customId: number): Medication {\n return {\n id: String(customId),\n brand_name: name.trim(),\n generic_name: '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\n/** Parse duration string like \"5 days\" or \"2 weeks\" into value + unit */\nfunction parseDuration(duration?: string): { value: string; unit: 'days' | 'weeks' | 'months' } {\n if (!duration || !duration.trim()) return { value: '3', unit: 'days' };\n const lower = duration.trim().toLowerCase();\n const match = lower.match(/^(\\d+)\\s*(day|days|week|weeks|month|months)?$/);\n if (!match) return { value: '3', unit: 'days' };\n const value = match[1] ?? '3';\n const unitWord = match[2] ?? 'days';\n const unit: 'days' | 'weeks' | 'months' =\n unitWord.startsWith('month') ? 'months' : unitWord.startsWith('week') ? 'weeks' : 'days';\n return { value, unit };\n}\n\nfunction mapFrequentItemToMedication(item: MedicationFrequentItem): Medication {\n const parsed = parseDuration(item.duration);\n const duration_value = item.duration_value ?? parsed.value;\n const duration_unit =\n (item.duration_unit as Medication['duration_unit'] | undefined) ?? parsed.unit;\n\n const before_after: Medication['before_after'] = normalizeBeforeAfter(item.before_after);\n\n const routeNote = item.route ? `Route: ${item.route}` : '';\n const baseNotes = item.notes?.trim() || '';\n const combinedNotes =\n [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(' — ');\n\n return {\n id: item.id,\n brand_name: item.brand_name ?? item.name,\n generic_name: item.short_name ?? '',\n frequency: item.frequency ?? 'custom',\n is_custom: false,\n duration_value,\n duration_unit,\n before_after,\n route: item.route ?? '',\n morning: item.morning ?? '0',\n afternoon: item.afternoon ?? '0',\n night: item.night ?? '0',\n notes: combinedNotes,\n };\n}\n\nfunction normalizeBeforeAfter(value?: string): BeforeAfterOption {\n if (value == null) return 'AFTER FOOD';\n const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];\n if (mapped) return mapped;\n const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);\n return validValues.includes(value as BeforeAfterOption) ? (value as BeforeAfterOption) : 'AFTER FOOD';\n}\n\nfunction Spinner({\n value,\n onChange,\n}: {\n value: string;\n onChange: (v: string) => void;\n}) {\n const num = parseInt(value, 10) || 0;\n return (\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(num + 1))}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <span className=\"text-sm w-4 text-center leading-none\">{num}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(Math.max(0, num - 1)))}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// ─── Medication card (added item) ─────────────────────────────────────────────\n\nfunction MedicationCard({\n med,\n onUpdate,\n onRemove,\n}: {\n med: Medication;\n onUpdate: (updated: Medication) => void;\n onRemove: () => void;\n}) {\n const [notesOpen, setNotesOpen] = useState(false);\n\n function set<K extends keyof Medication>(key: K, val: Medication[K]) {\n onUpdate({ ...med, [key]: val });\n }\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-3 space-y-2\">\n {/* Row 1: drug name, frequency dropdown, morning/afternoon/night labels, delete */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-semibold text-sm flex-1 min-w-0 truncate\">{med.brand_name}</span>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.frequency}\n onChange={(e) => set('frequency', e.target.value)}\n >\n <option value=\"custom\">select frequency</option>\n <option value=\"qid\">4 times a day (QID)</option>\n <option value=\"alternate_day\">Alternate day</option>\n <option value=\"once_weekly\">Once weekly</option>\n <option value=\"once_monthly\">Once monthly</option>\n <option value=\"as_needed\">As needed</option>\n <option value=\"fort_night\">Fort night</option>\n <option value=\"at_bed_time\">At Bed time</option>\n <option value=\"sos\">SOS only</option>\n <option value=\"biweekly\">Biweekly</option>\n <option value=\"stat\">STAT</option>\n </select>\n <div className=\"flex gap-4 items-center shrink-0\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <span\n key={slot}\n className=\"text-[10px] font-semibold uppercase text-muted-foreground tracking-wide\"\n >\n {slot === 'afternoon' ? 'AFTERNOON' : slot === 'morning' ? 'MORNING' : 'NIGHT'}\n </span>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-red-400 hover:text-red-600 shrink-0 p-1 cursor-pointer\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Row 2: duration (value + unit) on left; 3 dose spinners in middle; AF/BF on right */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <div className=\"flex items-center gap-1 shrink-0\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n className=\"w-11 text-sm border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_value}\n onChange={(e) => {\n const v = e.target.value.replace(/\\D/g, '');\n set('duration_value', v === '' ? '' : v);\n }}\n />\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_unit}\n onChange={(e) => set('duration_unit', e.target.value as Medication['duration_unit'])}\n >\n <option value=\"days\">days</option>\n <option value=\"weeks\">weeks</option>\n <option value=\"months\">months</option>\n </select>\n </div>\n <div className=\"flex gap-2 items-center flex-1 min-w-0 justify-end\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <div key={slot} className=\"flex flex-col items-center gap-0.5\">\n <Spinner value={med[slot]} onChange={(v) => set(slot, v)} />\n </div>\n ))}\n </div>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={normalizeBeforeAfter(med.before_after)}\n onChange={(e) => set('before_after', e.target.value as Medication['before_after'])}\n >\n {BEFORE_AFTER_OPTIONS.map((option) => (\n <option key={option.label} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.route ?? ''}\n onChange={(e) => set('route', e.target.value)}\n >\n {ROUTE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Row 3: medicine notes — full-width div as hit area (chevron + text), cursor-pointer */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setNotesOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setNotesOpen((o) => !o);\n }\n }}\n className={cn(\n 'flex items-center gap-2 w-full text-left text-xs text-muted-foreground hover:text-foreground',\n 'cursor-pointer py-2 px-2 rounded border border-transparent hover:bg-gray-100/80 transition-colors'\n )}\n >\n <ChevronRight\n className={cn('h-3 w-3 shrink-0 transition-transform', notesOpen && 'rotate-90')}\n />\n <span>Medicine Notes</span>\n </div>\n {notesOpen && (\n <div className=\"relative z-10 mt-0.5\">\n <textarea\n className=\"block w-full text-xs border border-border rounded px-2 py-1 resize-none bg-white min-h-0\"\n rows={2}\n placeholder=\"Add notes...\"\n value={med.notes}\n onChange={(e) => set('notes', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Search result card ────────────────────────────────────────────────────────\n\nconst ADD_FEEDBACK_MS = 320;\n\nfunction SearchResultCard({\n result,\n isAdding,\n onSelect,\n}: {\n result: MedicationSearchResult;\n isAdding: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'w-full text-left border rounded-lg px-3 py-2 transition-all duration-300 ease-out cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'border-green-400 bg-green-50 scale-[0.98]'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-sm font-semibold leading-tight truncate\">{result.name}</p>\n {result.generic_name && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n Generic: {result.generic_name}\n </p>\n )}\n </div>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddMedicationField: React.FC<AddMedicationFieldProps> = ({\n label = 'Medications',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n suggestedMedications = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<MedicationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingResultId, setAddingResultId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const customIdRef = useRef(-1);\n const valueRef = useRef<Medication[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which medication IDs were added by each package: packageId → medicationId[]\n const addedByPackage = useRef<Map<string, string[]>>(new Map());\n // drives re-renders for package chip selected state\n const [selectedPackageIds, setSelectedPackageIds] = useState<Set<string>>(new Set());\n\n const safeValue = Array.isArray(value) ? value : [];\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((m) => String(m.id)));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingResultId(null);\n }\n }, [open]);\n\n function handleQueryChange(q: string) {\n setQuery(q);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (!q.trim()) {\n setResults([]);\n return;\n }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const res = await onSearch(q);\n setResults(res);\n } finally {\n setLoading(false);\n }\n }, 500);\n }\n\n function handleRecentlyUsedToggle(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(result.id)));\n } else {\n onChange([...safeValue, mapToMedication(result)]);\n }\n }\n\n function handleFrequentItemToggle(item: MedicationFrequentItem) {\n if (addedIds.has(String(item.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(item.id)));\n } else {\n onChange([...safeValue, mapFrequentItemToMedication(item)]);\n }\n }\n\n function handlePackageToggle(pkg: MedicationPackage) {\n const alreadyAdded = addedByPackage.current.has(pkg.id);\n if (alreadyAdded) {\n const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);\n onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));\n addedByPackage.current.delete(pkg.id);\n setSelectedPackageIds((prev) => {\n const next = new Set(prev);\n next.delete(pkg.id);\n return next;\n });\n } else {\n const currentIds = new Set(valueRef.current.map((m) => String(m.id)));\n const newMeds = pkg.medications\n .filter((d) => !currentIds.has(String(d.id)))\n .map((d) => {\n const mapped = mapPackageDrugToMedication(d);\n return d.is_custom ? { ...mapped, id: String(customIdRef.current--) } : mapped;\n });\n if (newMeds.length > 0) {\n onChange([...valueRef.current, ...newMeds]);\n }\n addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n function handleResultClick(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) return;\n setAddingResultId(result.id);\n setTimeout(() => {\n onChange([...valueRef.current, mapToMedication(result)]);\n setAddingResultId(null);\n setQuery('');\n setResults([]);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function handleSave() {\n const trimmed = query.trim();\n if (!trimmed) return;\n const customId = customIdRef.current--;\n onChange([...safeValue, createCustomMedication(trimmed, customId)]);\n setQuery('');\n setResults([]);\n }\n\n function handleAddSuggestion(ai: AIMedication) {\n if (addedIds.has(String(ai.id))) return;\n onChange([...safeValue, mapAIMedicationToMedication(ai)]);\n }\n\n function updateMed(index: number, updated: Medication) {\n const next = [...safeValue];\n next[index] = updated;\n onChange(next);\n }\n\n function removeMed(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(String(r.id));\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleRecentlyUsedToggle(r)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {r.name}\n </button>\n );\n });\n\n const limitedFrequentItems = frequentItems.slice(0, 25);\n\n const frequentItemChips =\n limitedFrequentItems.length > 0\n ? limitedFrequentItems.map((item) => {\n const isAdded = addedIds.has(String(item.id));\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-[11px] px-2 py-0.5 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {item.brand_name ?? item.name}\n </button>\n );\n })\n : [];\n\n const packageChips = packages.map((pkg) => {\n const isAdded = selectedPackageIds.has(pkg.id);\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => handlePackageToggle(pkg)}\n className={cn(\n 'rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span>✓</span>}\n <span className=\"font-semibold\">{pkg.name}</span>\n <span className={cn(\n 'rounded-full px-1.5 py-0.5 text-[10px] font-medium',\n isAdded ? 'bg-green-100 text-green-600' : 'bg-purple-100 text-purple-600'\n )}>\n {pkg.medications.length}\n </span>\n </button>\n );\n });\n\n const chipSections = [];\n if (frequentItemChips.length > 0) {\n chipSections.push({ label: 'Frequently used', content: <>{frequentItemChips}</> });\n } else if (recentlyUsedChips.length > 0) {\n chipSections.push({ label: 'Recently Used', content: <>{recentlyUsedChips}</> });\n }\n if (packageChips.length > 0) {\n chipSections.push({ label: 'Packages', content: <>{packageChips}</> });\n }\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold\">{label}</span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"text-sm font-semibold text-purple-600 hover:text-purple-800 cursor-pointer\"\n >\n ADD\n </button>\n </div>\n\n {/* Added medications */}\n <div className=\"space-y-2\">\n {safeValue.map((med, i) => (\n <MedicationCard\n key={med.id}\n med={med}\n onUpdate={(u) => updateMed(i, u)}\n onRemove={() => removeMed(i)}\n />\n ))}\n </div>\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Medication\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={!query.trim()}\n onClick={handleSave}\n className={cn(\n 'rounded-md px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground hover:bg-primary/90 transition-opacity cursor-pointer',\n !query.trim() && 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Medicine\n </button>\n }\n >\n <div className=\"space-y-3\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search medicines...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* AI-suggested medications as clickable badges (inside dialog) */}\n {suggestedMedications.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 items-center\">\n <span className=\"text-xs text-muted-foreground mr-1\">Suggestions:</span>\n {suggestedMedications\n .filter((s) => !addedIds.has(String(s.id)))\n .slice(0, 25)\n .map((s) => (\n <button\n key={String(s.id)}\n type=\"button\"\n onClick={() => handleAddSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-dashed border-purple-300 bg-purple-50/80 text-purple-800 text-[11px] px-2 py-0.5 hover:bg-purple-100 transition-colors cursor-pointer\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.brand_name || s.generic_name || String(s.id)}\n </button>\n ))}\n </div>\n )}\n\n {/* Results grid */}\n {loading && (\n <p className=\"text-xs text-muted-foreground text-center py-2\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {results.map((r) => (\n <SearchResultCard\n key={r.id}\n result={r}\n isAdding={addingResultId === r.id}\n onSelect={() => handleResultClick(r)}\n />\n ))}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
package/dist/index.cjs CHANGED
@@ -8,7 +8,7 @@ var chunkKJA5BLGX_cjs = require('./chunk-KJA5BLGX.cjs');
8
8
  var chunkQKJ7BQSR_cjs = require('./chunk-QKJ7BQSR.cjs');
9
9
  var chunkPZBJYPWW_cjs = require('./chunk-PZBJYPWW.cjs');
10
10
  var chunkN4L76SHJ_cjs = require('./chunk-N4L76SHJ.cjs');
11
- var chunkA2A5EB5R_cjs = require('./chunk-A2A5EB5R.cjs');
11
+ var chunkBKBPNWSD_cjs = require('./chunk-BKBPNWSD.cjs');
12
12
  var chunkIZLKX7GI_cjs = require('./chunk-IZLKX7GI.cjs');
13
13
  require('./chunk-E7WUDHSA.cjs');
14
14
  var chunkS7EMPE2D_cjs = require('./chunk-S7EMPE2D.cjs');
@@ -2189,7 +2189,7 @@ var RichTextWidget = lazyNamed(() => import('./RichTextWidget-KKC3P5Z3.cjs'), "R
2189
2189
  var DateWidget = lazyNamed(() => import('./DateWidget-HIYZ3TY7.cjs'), "DateWidget");
2190
2190
  var DateTimeWidget = lazyNamed(() => import('./DateTimeWidget-3E6N4NOK.cjs'), "DateTimeWidget");
2191
2191
  var EditableTableWidget = lazyNamed(() => import('./EditableTable-OFVKAYRA.cjs'), "EditableTableWidget");
2192
- var AddMedicationWidget = lazyNamed(() => import('./AddMedicationWidget-UDVVDKHR.cjs'), "AddMedicationWidget");
2192
+ var AddMedicationWidget = lazyNamed(() => import('./AddMedicationWidget-4XZN4KUP.cjs'), "AddMedicationWidget");
2193
2193
  var DischargeMedicationOrdersWidget = lazyNamed(() => import('./DischargeMedicationOrdersWidget-X3ZVW3FP.cjs'), "DischargeMedicationOrdersWidget");
2194
2194
  var AddInvestigationWidget = lazyNamed(() => import('./AddInvestigationWidget-4AZ7HTJY.cjs'), "AddInvestigationWidget");
2195
2195
  var AddProcedureWidget = lazyNamed(() => import('./AddProcedureWidget-NQCN5FBQ.cjs'), "AddProcedureWidget");
@@ -2896,7 +2896,7 @@ var SmartForm = ({
2896
2896
  node.children.forEach((id) => fieldIds.push(id));
2897
2897
  }
2898
2898
  });
2899
- return /* @__PURE__ */ jsxRuntime.jsx(chunkA2A5EB5R_cjs.AISuggestionsProvider, { value: aiSuggestions, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-4 gap-2 w-full items-start", children: [
2899
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkBKBPNWSD_cjs.AISuggestionsProvider, { value: aiSuggestions, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-4 gap-2 w-full items-start", children: [
2900
2900
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-1 flex flex-col gap-2", children: fieldIds.map((fieldId) => {
2901
2901
  const fieldDef = store.getFieldDef(fieldId);
2902
2902
  if (!fieldDef) return null;
@@ -3971,7 +3971,7 @@ Object.defineProperty(exports, "toothLabel", {
3971
3971
  });
3972
3972
  Object.defineProperty(exports, "AddMedicationField", {
3973
3973
  enumerable: true,
3974
- get: function () { return chunkA2A5EB5R_cjs.AddMedicationField; }
3974
+ get: function () { return chunkBKBPNWSD_cjs.AddMedicationField; }
3975
3975
  });
3976
3976
  Object.defineProperty(exports, "AddInvestigationField", {
3977
3977
  enumerable: true,
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as FormValues, L as FormDef, N as FormState, F as FieldDef, aV as WorkflowTransition, ar as Rule, u as DoctorFrequentItems, r as DiagnosticPackage, a5 as MedicationPackage, B as BaseFieldDef, a4 as MedicationFrequentItem, Y as InvestigationFrequentItem, m as DentalChartData, aL as ToothCondition } from './types-27f9S27N.cjs';
2
- export { a as BiometryIolWorkupFieldDef, b as BiometryIolWorkupValue, c as BiometryMethod, d as BpeChartFieldDef, C as CampDateOption, e as CampDateSelection, f as CampDatesFieldDef, g as CampTimeSlotOption, h as CampTimeSlotsFieldDef, i as CheckboxFieldDef, j as ColumnLayout, k as Computation, l as Condition, D as DataSource, n as DentalChartFieldDef, o as DiagnosisGradeSelection, p as DiagnosisTextareaFieldDef, q as DiagnosisTextareaValue, s as DiagnosticPackageTest, t as DifferentialDiagnosisFieldDef, E as EditableTableColumnDef, v as EditableTableFieldDef, w as EventDefinition, x as ExtractedKeywordMatch, y as FieldPrefill, z as FieldState, A as FieldStyleClassNames, G as FieldStyleConfig, H as FieldType, I as FileUploadFieldDef, J as FollowupFieldDef, K as FollowupValue, M as FormErrors, P as FormulaComputation, Q as FormulaExpr, R as FunctionalImpairmentDimension, S as FunctionalImpairmentScoreFieldDef, T as FunctionalImpairmentScoreValue, U as GeneralSurgeryExaminationFieldDef, V as GeneralSurgeryGradingFieldDef, W as GeneralSurgerySmartHistoryFieldDef, X as ImageUploadFieldDef, Z as InvestigationsFieldDef, _ as LayoutNode, $ as LensAssessmentFieldDef, a0 as LensAssessmentValue, a1 as LocsGrades, a2 as MatchedCondition, a3 as MediaUploadFieldDef, a6 as MedicationPackageDrug, a7 as MedicationsFieldDef, a8 as MultiStepLayoutNode, a9 as MultiStepNode, aa as NumberFieldDef, ab as OBGExaminationFieldDef, ac as OBGPathwayFieldDef, ad as OtpInputFieldDef, ae as OtpVerifiedValue, af as PainScaleFlagsFieldDef, ag as Permission, ah as PhoneInputFieldDef, ai as PregnancyStatusFieldDef, aj as PregnancyStatusValue, ak as ProcedureFrequentItem, al as ProceduresFieldDef, am as RadioFieldDef, an as ReferralFieldDef, ao as ReferralItem, ap as RepeatableFieldDef, aq as RichTextFieldDef, as as RuleAction, at as ScoreComputation, au as ScoreRange, av as Section, aw as SectionChild, ax as SelectFieldDef, ay as SelectOption, az as SignatureFieldDef, aA as SliderFieldDef, aB as SmartTextareaFieldDef, aC as SmartTextareaValue, aD as SocialHistoryFieldDef, aE as StaticTextFieldDef, aF as SuggestionTextareaFieldDef, aG as SumComputation, aH as SurgicalRiskFlagsFieldDef, aI as SurgicalRiskFlagsValue, aJ as TextFieldDef, aK as ToggleFieldDef, aM as ToothEntry, aN as TreatmentPlanFieldDef, aO as UrologyExaminationFieldDef, aP as UrologyPathwayFieldDef, aQ as UrologySmartHistoryFieldDef, aR as ValidationRule, aS as VitalsFieldDef, aT as WebhookDef, aU as Workflow } from './types-27f9S27N.cjs';
1
+ import { O as FormValues, L as FormDef, N as FormState, F as FieldDef, aV as WorkflowTransition, ar as Rule, u as DoctorFrequentItems, r as DiagnosticPackage, a5 as MedicationPackage, B as BaseFieldDef, a4 as MedicationFrequentItem, Y as InvestigationFrequentItem, m as DentalChartData, aL as ToothCondition } from './types-DD9D4svf.cjs';
2
+ export { a as BiometryIolWorkupFieldDef, b as BiometryIolWorkupValue, c as BiometryMethod, d as BpeChartFieldDef, C as CampDateOption, e as CampDateSelection, f as CampDatesFieldDef, g as CampTimeSlotOption, h as CampTimeSlotsFieldDef, i as CheckboxFieldDef, j as ColumnLayout, k as Computation, l as Condition, D as DataSource, n as DentalChartFieldDef, o as DiagnosisGradeSelection, p as DiagnosisTextareaFieldDef, q as DiagnosisTextareaValue, s as DiagnosticPackageTest, t as DifferentialDiagnosisFieldDef, E as EditableTableColumnDef, v as EditableTableFieldDef, w as EventDefinition, x as ExtractedKeywordMatch, y as FieldPrefill, z as FieldState, A as FieldStyleClassNames, G as FieldStyleConfig, H as FieldType, I as FileUploadFieldDef, J as FollowupFieldDef, K as FollowupValue, M as FormErrors, P as FormulaComputation, Q as FormulaExpr, R as FunctionalImpairmentDimension, S as FunctionalImpairmentScoreFieldDef, T as FunctionalImpairmentScoreValue, U as GeneralSurgeryExaminationFieldDef, V as GeneralSurgeryGradingFieldDef, W as GeneralSurgerySmartHistoryFieldDef, X as ImageUploadFieldDef, Z as InvestigationsFieldDef, _ as LayoutNode, $ as LensAssessmentFieldDef, a0 as LensAssessmentValue, a1 as LocsGrades, a2 as MatchedCondition, a3 as MediaUploadFieldDef, a6 as MedicationPackageDrug, a7 as MedicationsFieldDef, a8 as MultiStepLayoutNode, a9 as MultiStepNode, aa as NumberFieldDef, ab as OBGExaminationFieldDef, ac as OBGPathwayFieldDef, ad as OtpInputFieldDef, ae as OtpVerifiedValue, af as PainScaleFlagsFieldDef, ag as Permission, ah as PhoneInputFieldDef, ai as PregnancyStatusFieldDef, aj as PregnancyStatusValue, ak as ProcedureFrequentItem, al as ProceduresFieldDef, am as RadioFieldDef, an as ReferralFieldDef, ao as ReferralItem, ap as RepeatableFieldDef, aq as RichTextFieldDef, as as RuleAction, at as ScoreComputation, au as ScoreRange, av as Section, aw as SectionChild, ax as SelectFieldDef, ay as SelectOption, az as SignatureFieldDef, aA as SliderFieldDef, aB as SmartTextareaFieldDef, aC as SmartTextareaValue, aD as SocialHistoryFieldDef, aE as StaticTextFieldDef, aF as SuggestionTextareaFieldDef, aG as SumComputation, aH as SurgicalRiskFlagsFieldDef, aI as SurgicalRiskFlagsValue, aJ as TextFieldDef, aK as ToggleFieldDef, aM as ToothEntry, aN as TreatmentPlanFieldDef, aO as UrologyExaminationFieldDef, aP as UrologyPathwayFieldDef, aQ as UrologySmartHistoryFieldDef, aR as ValidationRule, aS as VitalsFieldDef, aT as WebhookDef, aU as Workflow } from './types-DD9D4svf.cjs';
3
3
  import React from 'react';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  export { r as richTextHtmlClassName } from './richTextClassName--8wkuHkW.cjs';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { O as FormValues, L as FormDef, N as FormState, F as FieldDef, aV as WorkflowTransition, ar as Rule, u as DoctorFrequentItems, r as DiagnosticPackage, a5 as MedicationPackage, B as BaseFieldDef, a4 as MedicationFrequentItem, Y as InvestigationFrequentItem, m as DentalChartData, aL as ToothCondition } from './types-27f9S27N.js';
2
- export { a as BiometryIolWorkupFieldDef, b as BiometryIolWorkupValue, c as BiometryMethod, d as BpeChartFieldDef, C as CampDateOption, e as CampDateSelection, f as CampDatesFieldDef, g as CampTimeSlotOption, h as CampTimeSlotsFieldDef, i as CheckboxFieldDef, j as ColumnLayout, k as Computation, l as Condition, D as DataSource, n as DentalChartFieldDef, o as DiagnosisGradeSelection, p as DiagnosisTextareaFieldDef, q as DiagnosisTextareaValue, s as DiagnosticPackageTest, t as DifferentialDiagnosisFieldDef, E as EditableTableColumnDef, v as EditableTableFieldDef, w as EventDefinition, x as ExtractedKeywordMatch, y as FieldPrefill, z as FieldState, A as FieldStyleClassNames, G as FieldStyleConfig, H as FieldType, I as FileUploadFieldDef, J as FollowupFieldDef, K as FollowupValue, M as FormErrors, P as FormulaComputation, Q as FormulaExpr, R as FunctionalImpairmentDimension, S as FunctionalImpairmentScoreFieldDef, T as FunctionalImpairmentScoreValue, U as GeneralSurgeryExaminationFieldDef, V as GeneralSurgeryGradingFieldDef, W as GeneralSurgerySmartHistoryFieldDef, X as ImageUploadFieldDef, Z as InvestigationsFieldDef, _ as LayoutNode, $ as LensAssessmentFieldDef, a0 as LensAssessmentValue, a1 as LocsGrades, a2 as MatchedCondition, a3 as MediaUploadFieldDef, a6 as MedicationPackageDrug, a7 as MedicationsFieldDef, a8 as MultiStepLayoutNode, a9 as MultiStepNode, aa as NumberFieldDef, ab as OBGExaminationFieldDef, ac as OBGPathwayFieldDef, ad as OtpInputFieldDef, ae as OtpVerifiedValue, af as PainScaleFlagsFieldDef, ag as Permission, ah as PhoneInputFieldDef, ai as PregnancyStatusFieldDef, aj as PregnancyStatusValue, ak as ProcedureFrequentItem, al as ProceduresFieldDef, am as RadioFieldDef, an as ReferralFieldDef, ao as ReferralItem, ap as RepeatableFieldDef, aq as RichTextFieldDef, as as RuleAction, at as ScoreComputation, au as ScoreRange, av as Section, aw as SectionChild, ax as SelectFieldDef, ay as SelectOption, az as SignatureFieldDef, aA as SliderFieldDef, aB as SmartTextareaFieldDef, aC as SmartTextareaValue, aD as SocialHistoryFieldDef, aE as StaticTextFieldDef, aF as SuggestionTextareaFieldDef, aG as SumComputation, aH as SurgicalRiskFlagsFieldDef, aI as SurgicalRiskFlagsValue, aJ as TextFieldDef, aK as ToggleFieldDef, aM as ToothEntry, aN as TreatmentPlanFieldDef, aO as UrologyExaminationFieldDef, aP as UrologyPathwayFieldDef, aQ as UrologySmartHistoryFieldDef, aR as ValidationRule, aS as VitalsFieldDef, aT as WebhookDef, aU as Workflow } from './types-27f9S27N.js';
1
+ import { O as FormValues, L as FormDef, N as FormState, F as FieldDef, aV as WorkflowTransition, ar as Rule, u as DoctorFrequentItems, r as DiagnosticPackage, a5 as MedicationPackage, B as BaseFieldDef, a4 as MedicationFrequentItem, Y as InvestigationFrequentItem, m as DentalChartData, aL as ToothCondition } from './types-DD9D4svf.js';
2
+ export { a as BiometryIolWorkupFieldDef, b as BiometryIolWorkupValue, c as BiometryMethod, d as BpeChartFieldDef, C as CampDateOption, e as CampDateSelection, f as CampDatesFieldDef, g as CampTimeSlotOption, h as CampTimeSlotsFieldDef, i as CheckboxFieldDef, j as ColumnLayout, k as Computation, l as Condition, D as DataSource, n as DentalChartFieldDef, o as DiagnosisGradeSelection, p as DiagnosisTextareaFieldDef, q as DiagnosisTextareaValue, s as DiagnosticPackageTest, t as DifferentialDiagnosisFieldDef, E as EditableTableColumnDef, v as EditableTableFieldDef, w as EventDefinition, x as ExtractedKeywordMatch, y as FieldPrefill, z as FieldState, A as FieldStyleClassNames, G as FieldStyleConfig, H as FieldType, I as FileUploadFieldDef, J as FollowupFieldDef, K as FollowupValue, M as FormErrors, P as FormulaComputation, Q as FormulaExpr, R as FunctionalImpairmentDimension, S as FunctionalImpairmentScoreFieldDef, T as FunctionalImpairmentScoreValue, U as GeneralSurgeryExaminationFieldDef, V as GeneralSurgeryGradingFieldDef, W as GeneralSurgerySmartHistoryFieldDef, X as ImageUploadFieldDef, Z as InvestigationsFieldDef, _ as LayoutNode, $ as LensAssessmentFieldDef, a0 as LensAssessmentValue, a1 as LocsGrades, a2 as MatchedCondition, a3 as MediaUploadFieldDef, a6 as MedicationPackageDrug, a7 as MedicationsFieldDef, a8 as MultiStepLayoutNode, a9 as MultiStepNode, aa as NumberFieldDef, ab as OBGExaminationFieldDef, ac as OBGPathwayFieldDef, ad as OtpInputFieldDef, ae as OtpVerifiedValue, af as PainScaleFlagsFieldDef, ag as Permission, ah as PhoneInputFieldDef, ai as PregnancyStatusFieldDef, aj as PregnancyStatusValue, ak as ProcedureFrequentItem, al as ProceduresFieldDef, am as RadioFieldDef, an as ReferralFieldDef, ao as ReferralItem, ap as RepeatableFieldDef, aq as RichTextFieldDef, as as RuleAction, at as ScoreComputation, au as ScoreRange, av as Section, aw as SectionChild, ax as SelectFieldDef, ay as SelectOption, az as SignatureFieldDef, aA as SliderFieldDef, aB as SmartTextareaFieldDef, aC as SmartTextareaValue, aD as SocialHistoryFieldDef, aE as StaticTextFieldDef, aF as SuggestionTextareaFieldDef, aG as SumComputation, aH as SurgicalRiskFlagsFieldDef, aI as SurgicalRiskFlagsValue, aJ as TextFieldDef, aK as ToggleFieldDef, aM as ToothEntry, aN as TreatmentPlanFieldDef, aO as UrologyExaminationFieldDef, aP as UrologyPathwayFieldDef, aQ as UrologySmartHistoryFieldDef, aR as ValidationRule, aS as VitalsFieldDef, aT as WebhookDef, aU as Workflow } from './types-DD9D4svf.js';
3
3
  import React from 'react';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  export { r as richTextHtmlClassName } from './richTextClassName--8wkuHkW.js';
package/dist/index.mjs CHANGED
@@ -8,8 +8,8 @@ import { parseFunctionalImpairmentScore, functionalImpairmentTotal } from './chu
8
8
  import { normalizeObgPathway } from './chunk-IKAKE7TR.mjs';
9
9
  import { Checkbox } from './chunk-GNZWSVTB.mjs';
10
10
  import { Slider } from './chunk-SCMXLRX5.mjs';
11
- import { AISuggestionsProvider } from './chunk-4422KT6O.mjs';
12
- export { AddMedicationField } from './chunk-4422KT6O.mjs';
11
+ import { AISuggestionsProvider } from './chunk-Q5AHXZOG.mjs';
12
+ export { AddMedicationField } from './chunk-Q5AHXZOG.mjs';
13
13
  export { AddInvestigationField } from './chunk-MXY24ZHB.mjs';
14
14
  import './chunk-GZPCYSJK.mjs';
15
15
  export { DifferentialDiagnosis } from './chunk-BU4ZEAAP.mjs';
@@ -2174,7 +2174,7 @@ var RichTextWidget = lazyNamed(() => import('./RichTextWidget-JG4Y7X66.mjs'), "R
2174
2174
  var DateWidget = lazyNamed(() => import('./DateWidget-5LFXAWRK.mjs'), "DateWidget");
2175
2175
  var DateTimeWidget = lazyNamed(() => import('./DateTimeWidget-TAHCCYCX.mjs'), "DateTimeWidget");
2176
2176
  var EditableTableWidget = lazyNamed(() => import('./EditableTable-ECNOISL3.mjs'), "EditableTableWidget");
2177
- var AddMedicationWidget = lazyNamed(() => import('./AddMedicationWidget-OEULICY3.mjs'), "AddMedicationWidget");
2177
+ var AddMedicationWidget = lazyNamed(() => import('./AddMedicationWidget-4LUTXYJX.mjs'), "AddMedicationWidget");
2178
2178
  var DischargeMedicationOrdersWidget = lazyNamed(() => import('./DischargeMedicationOrdersWidget-JXLQWPCP.mjs'), "DischargeMedicationOrdersWidget");
2179
2179
  var AddInvestigationWidget = lazyNamed(() => import('./AddInvestigationWidget-MSW4FUHR.mjs'), "AddInvestigationWidget");
2180
2180
  var AddProcedureWidget = lazyNamed(() => import('./AddProcedureWidget-7IZ7SY7N.mjs'), "AddProcedureWidget");
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { B as BaseFieldDef } from './types-27f9S27N.cjs';
2
+ import { B as BaseFieldDef } from './types-DD9D4svf.cjs';
3
3
 
4
4
  interface ReadOnlyTableProps {
5
5
  fieldDef: BaseFieldDef;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { B as BaseFieldDef } from './types-27f9S27N.js';
2
+ import { B as BaseFieldDef } from './types-DD9D4svf.js';
3
3
 
4
4
  interface ReadOnlyTableProps {
5
5
  fieldDef: BaseFieldDef;
package/dist/smart.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { x as ExtractedKeywordMatch } from './types-27f9S27N.cjs';
1
+ import { x as ExtractedKeywordMatch } from './types-DD9D4svf.cjs';
2
2
  import React from 'react';
3
3
 
4
4
  interface SmartKeywordsResult {
package/dist/smart.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { x as ExtractedKeywordMatch } from './types-27f9S27N.js';
1
+ import { x as ExtractedKeywordMatch } from './types-DD9D4svf.js';
2
2
  import React from 'react';
3
3
 
4
4
  interface SmartKeywordsResult {
@@ -549,6 +549,26 @@ interface DiagnosticPackage {
549
549
  interface MedicationPackageDrug {
550
550
  id: string;
551
551
  name: string;
552
+ /** Optional structured duration components; falls back to Forminator's default (3 days) when omitted. */
553
+ duration_value?: string;
554
+ duration_unit?: "days" | "weeks" | "months" | string;
555
+ /** Optional route of administration; falls back to blank when omitted. */
556
+ route?: string;
557
+ /** Optional notes; falls back to blank when omitted. */
558
+ notes?: string;
559
+ /**
560
+ * True when `id` is not a real item-master id (e.g. not found in item master at
561
+ * package-authoring time). The `id` given here is ignored on add — a fresh synthetic
562
+ * id is generated the same way the manual "Save Medicine" custom-entry flow does, so
563
+ * the resulting medication is indistinguishable from a doctor-typed custom entry.
564
+ */
565
+ is_custom?: boolean;
566
+ /** Optional dose frequency (matches the Medications frequency dropdown, e.g. "once_weekly", "stat", "at_bed_time"); falls back to "custom" when omitted. */
567
+ frequency?: string;
568
+ /** Optional per-slot dose counts; used for quantity calculation whenever frequency doesn't resolve to a fixed schedule. */
569
+ morning?: string;
570
+ afternoon?: string;
571
+ night?: string;
552
572
  }
553
573
  interface MedicationPackage {
554
574
  id: string;
@@ -549,6 +549,26 @@ interface DiagnosticPackage {
549
549
  interface MedicationPackageDrug {
550
550
  id: string;
551
551
  name: string;
552
+ /** Optional structured duration components; falls back to Forminator's default (3 days) when omitted. */
553
+ duration_value?: string;
554
+ duration_unit?: "days" | "weeks" | "months" | string;
555
+ /** Optional route of administration; falls back to blank when omitted. */
556
+ route?: string;
557
+ /** Optional notes; falls back to blank when omitted. */
558
+ notes?: string;
559
+ /**
560
+ * True when `id` is not a real item-master id (e.g. not found in item master at
561
+ * package-authoring time). The `id` given here is ignored on add — a fresh synthetic
562
+ * id is generated the same way the manual "Save Medicine" custom-entry flow does, so
563
+ * the resulting medication is indistinguishable from a doctor-typed custom entry.
564
+ */
565
+ is_custom?: boolean;
566
+ /** Optional dose frequency (matches the Medications frequency dropdown, e.g. "once_weekly", "stat", "at_bed_time"); falls back to "custom" when omitted. */
567
+ frequency?: string;
568
+ /** Optional per-slot dose counts; used for quantity calculation whenever frequency doesn't resolve to a fixed schedule. */
569
+ morning?: string;
570
+ afternoon?: string;
571
+ night?: string;
552
572
  }
553
573
  interface MedicationPackage {
554
574
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "formanitor",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/AISuggestionsContext.tsx","../src/ui/widgets/AddMedicationField.tsx"],"names":[],"mappings":"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","file":"chunk-4422KT6O.mjs","sourcesContent":["import { createContext, useContext } from 'react';\n\n/** Shape of a medication as returned by AI analysis */\nexport type AIMedication = {\n id: string | number;\n brand_name: string;\n generic_name: string;\n form?: string;\n strength?: string;\n reason?: string;\n};\n\nexport type AISuggestions = {\n medications?: AIMedication[];\n};\n\nconst AISuggestionsContext = createContext<AISuggestions>({});\n\nexport function useAISuggestions(): AISuggestions {\n return useContext(AISuggestionsContext);\n}\n\nexport const AISuggestionsProvider = AISuggestionsContext.Provider;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Trash2, ChevronUp, ChevronDown, ChevronRight, Plus, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { AIMedication } from '../../react/AISuggestionsContext';\nimport type { MedicationFrequentItem, MedicationPackage } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst BEFORE_AFTER_OPTIONS = [\n { label: 'Blank', value: '' },\n { label: 'AFTER FOOD', value: 'AFTER FOOD' },\n { label: 'BEFORE FOOD', value: 'BEFORE FOOD' },\n { label: 'WITH FOOD', value: 'WITH FOOD' },\n { label: 'SINGLE DOSE', value: 'SINGLE DOSE' },\n { label: 'BED TIME', value: 'BED TIME' },\n { label: 'EMPTY STOMACH', value: 'EMPTY STOMACH' },\n { label: 'LOCAL APPLICATION', value: 'LOCAL APPLICATION' },\n { label: 'STAT', value: 'STAT' },\n { label: 'INHALATION', value: 'INHALATION' },\n] as const;\n\ntype BeforeAfterOption = (typeof BEFORE_AFTER_OPTIONS)[number]['value'];\n\nconst BEFORE_AFTER_NORMALIZATION_MAP: Record<string, BeforeAfterOption> = {\n AF: 'AFTER FOOD',\n BF: 'BEFORE FOOD',\n};\n\nexport type MedicationSearchResult = {\n id: string;\n name: string;\n generic_name?: string;\n manufacturer?: string;\n score?: number;\n};\n\n\nconst ROUTE_OPTIONS = [\n { label: 'Select route', value: '' },\n { label: 'Per Os', value: 'Per Os' },\n { label: 'Intravenous', value: 'Intravenous' },\n { label: 'Intramuscular', value: 'Intramuscular' },\n { label: 'Subcutaneous', value: 'Subcutaneous' },\n { label: 'Sublingual', value: 'Sublingual' },\n { label: 'Intranasal', value: 'Intranasal' },\n { label: 'Topical', value: 'Topical' },\n { label: 'Per Rectum', value: 'Per Rectum' },\n { label: 'Inhalation', value: 'Inhalation' },\n { label: 'ID Intradermal', value: 'ID Intradermal' },\n] as const;\n\nexport type Medication = {\n id: string;\n brand_name: string;\n generic_name: string;\n frequency: string;\n is_custom: boolean;\n duration_value: string;\n duration_unit: 'days' | 'weeks' | 'months';\n before_after: BeforeAfterOption;\n route: string;\n morning: string;\n afternoon: string;\n night: string;\n notes: string;\n};\n\nexport type AddMedicationFieldProps = {\n label?: string;\n value: Medication[];\n onChange: (items: Medication[]) => void;\n onSearch: (query: string) => Promise<MedicationSearchResult[]>;\n recentlyUsed?: MedicationSearchResult[];\n /** Doctor-scoped frequently used medications (from FormProvider frequentItems) */\n frequentItems?: MedicationFrequentItem[];\n /** AI-suggested medications shown as badges; clicking adds to value */\n suggestedMedications?: AIMedication[];\n packages?: MedicationPackage[];\n};\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToMedication(result: MedicationSearchResult): Medication {\n return {\n id: result.id,\n brand_name: result.name,\n generic_name: result.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\nfunction mapAIMedicationToMedication(ai: AIMedication): Medication {\n const id = ai.id != null ? String(ai.id) : '';\n return {\n id,\n brand_name: ai.brand_name ?? '',\n generic_name: ai.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '1',\n afternoon: '0',\n night: '1',\n notes: ai.reason ?? '',\n };\n}\n\nfunction createCustomMedication(name: string, customId: number): Medication {\n return {\n id: String(customId),\n brand_name: name.trim(),\n generic_name: '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\n/** Parse duration string like \"5 days\" or \"2 weeks\" into value + unit */\nfunction parseDuration(duration?: string): { value: string; unit: 'days' | 'weeks' | 'months' } {\n if (!duration || !duration.trim()) return { value: '3', unit: 'days' };\n const lower = duration.trim().toLowerCase();\n const match = lower.match(/^(\\d+)\\s*(day|days|week|weeks|month|months)?$/);\n if (!match) return { value: '3', unit: 'days' };\n const value = match[1] ?? '3';\n const unitWord = match[2] ?? 'days';\n const unit: 'days' | 'weeks' | 'months' =\n unitWord.startsWith('month') ? 'months' : unitWord.startsWith('week') ? 'weeks' : 'days';\n return { value, unit };\n}\n\nfunction mapFrequentItemToMedication(item: MedicationFrequentItem): Medication {\n const parsed = parseDuration(item.duration);\n const duration_value = item.duration_value ?? parsed.value;\n const duration_unit =\n (item.duration_unit as Medication['duration_unit'] | undefined) ?? parsed.unit;\n\n const before_after: Medication['before_after'] = normalizeBeforeAfter(item.before_after);\n\n const routeNote = item.route ? `Route: ${item.route}` : '';\n const baseNotes = item.notes?.trim() || '';\n const combinedNotes =\n [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(' — ');\n\n return {\n id: item.id,\n brand_name: item.brand_name ?? item.name,\n generic_name: item.short_name ?? '',\n frequency: item.frequency ?? 'custom',\n is_custom: false,\n duration_value,\n duration_unit,\n before_after,\n route: item.route ?? '',\n morning: item.morning ?? '0',\n afternoon: item.afternoon ?? '0',\n night: item.night ?? '0',\n notes: combinedNotes,\n };\n}\n\nfunction normalizeBeforeAfter(value?: string): BeforeAfterOption {\n if (value == null) return 'AFTER FOOD';\n const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];\n if (mapped) return mapped;\n const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);\n return validValues.includes(value as BeforeAfterOption) ? (value as BeforeAfterOption) : 'AFTER FOOD';\n}\n\nfunction Spinner({\n value,\n onChange,\n}: {\n value: string;\n onChange: (v: string) => void;\n}) {\n const num = parseInt(value, 10) || 0;\n return (\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(num + 1))}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <span className=\"text-sm w-4 text-center leading-none\">{num}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(Math.max(0, num - 1)))}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// ─── Medication card (added item) ─────────────────────────────────────────────\n\nfunction MedicationCard({\n med,\n onUpdate,\n onRemove,\n}: {\n med: Medication;\n onUpdate: (updated: Medication) => void;\n onRemove: () => void;\n}) {\n const [notesOpen, setNotesOpen] = useState(false);\n\n function set<K extends keyof Medication>(key: K, val: Medication[K]) {\n onUpdate({ ...med, [key]: val });\n }\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-3 space-y-2\">\n {/* Row 1: drug name, frequency dropdown, morning/afternoon/night labels, delete */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-semibold text-sm flex-1 min-w-0 truncate\">{med.brand_name}</span>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.frequency}\n onChange={(e) => set('frequency', e.target.value)}\n >\n <option value=\"custom\">select frequency</option>\n <option value=\"qid\">4 times a day (QID)</option>\n <option value=\"alternate_day\">Alternate day</option>\n <option value=\"once_weekly\">Once weekly</option>\n <option value=\"once_monthly\">Once monthly</option>\n <option value=\"as_needed\">As needed</option>\n <option value=\"fort_night\">Fort night</option>\n <option value=\"at_bed_time\">At Bed time</option>\n <option value=\"sos\">SOS only</option>\n <option value=\"biweekly\">Biweekly</option>\n <option value=\"stat\">STAT</option>\n </select>\n <div className=\"flex gap-4 items-center shrink-0\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <span\n key={slot}\n className=\"text-[10px] font-semibold uppercase text-muted-foreground tracking-wide\"\n >\n {slot === 'afternoon' ? 'AFTERNOON' : slot === 'morning' ? 'MORNING' : 'NIGHT'}\n </span>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-red-400 hover:text-red-600 shrink-0 p-1 cursor-pointer\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Row 2: duration (value + unit) on left; 3 dose spinners in middle; AF/BF on right */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <div className=\"flex items-center gap-1 shrink-0\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n className=\"w-11 text-sm border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_value}\n onChange={(e) => {\n const v = e.target.value.replace(/\\D/g, '');\n set('duration_value', v === '' ? '' : v);\n }}\n />\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_unit}\n onChange={(e) => set('duration_unit', e.target.value as Medication['duration_unit'])}\n >\n <option value=\"days\">days</option>\n <option value=\"weeks\">weeks</option>\n <option value=\"months\">months</option>\n </select>\n </div>\n <div className=\"flex gap-2 items-center flex-1 min-w-0 justify-end\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <div key={slot} className=\"flex flex-col items-center gap-0.5\">\n <Spinner value={med[slot]} onChange={(v) => set(slot, v)} />\n </div>\n ))}\n </div>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={normalizeBeforeAfter(med.before_after)}\n onChange={(e) => set('before_after', e.target.value as Medication['before_after'])}\n >\n {BEFORE_AFTER_OPTIONS.map((option) => (\n <option key={option.label} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.route ?? ''}\n onChange={(e) => set('route', e.target.value)}\n >\n {ROUTE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Row 3: medicine notes — full-width div as hit area (chevron + text), cursor-pointer */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setNotesOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setNotesOpen((o) => !o);\n }\n }}\n className={cn(\n 'flex items-center gap-2 w-full text-left text-xs text-muted-foreground hover:text-foreground',\n 'cursor-pointer py-2 px-2 rounded border border-transparent hover:bg-gray-100/80 transition-colors'\n )}\n >\n <ChevronRight\n className={cn('h-3 w-3 shrink-0 transition-transform', notesOpen && 'rotate-90')}\n />\n <span>Medicine Notes</span>\n </div>\n {notesOpen && (\n <div className=\"relative z-10 mt-0.5\">\n <textarea\n className=\"block w-full text-xs border border-border rounded px-2 py-1 resize-none bg-white min-h-0\"\n rows={2}\n placeholder=\"Add notes...\"\n value={med.notes}\n onChange={(e) => set('notes', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Search result card ────────────────────────────────────────────────────────\n\nconst ADD_FEEDBACK_MS = 320;\n\nfunction SearchResultCard({\n result,\n isAdding,\n onSelect,\n}: {\n result: MedicationSearchResult;\n isAdding: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'w-full text-left border rounded-lg px-3 py-2 transition-all duration-300 ease-out cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'border-green-400 bg-green-50 scale-[0.98]'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-sm font-semibold leading-tight truncate\">{result.name}</p>\n {result.generic_name && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n Generic: {result.generic_name}\n </p>\n )}\n </div>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddMedicationField: React.FC<AddMedicationFieldProps> = ({\n label = 'Medications',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n suggestedMedications = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<MedicationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingResultId, setAddingResultId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const customIdRef = useRef(-1);\n const valueRef = useRef<Medication[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which medication IDs were added by each package: packageId → medicationId[]\n const addedByPackage = useRef<Map<string, string[]>>(new Map());\n // drives re-renders for package chip selected state\n const [selectedPackageIds, setSelectedPackageIds] = useState<Set<string>>(new Set());\n\n const safeValue = Array.isArray(value) ? value : [];\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((m) => String(m.id)));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingResultId(null);\n }\n }, [open]);\n\n function handleQueryChange(q: string) {\n setQuery(q);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (!q.trim()) {\n setResults([]);\n return;\n }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const res = await onSearch(q);\n setResults(res);\n } finally {\n setLoading(false);\n }\n }, 500);\n }\n\n function handleRecentlyUsedToggle(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(result.id)));\n } else {\n onChange([...safeValue, mapToMedication(result)]);\n }\n }\n\n function handleFrequentItemToggle(item: MedicationFrequentItem) {\n if (addedIds.has(String(item.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(item.id)));\n } else {\n onChange([...safeValue, mapFrequentItemToMedication(item)]);\n }\n }\n\n function handlePackageToggle(pkg: MedicationPackage) {\n const alreadyAdded = addedByPackage.current.has(pkg.id);\n if (alreadyAdded) {\n const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);\n onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));\n addedByPackage.current.delete(pkg.id);\n setSelectedPackageIds((prev) => {\n const next = new Set(prev);\n next.delete(pkg.id);\n return next;\n });\n } else {\n const currentIds = new Set(valueRef.current.map((m) => String(m.id)));\n const newMeds = pkg.medications\n .filter((d) => !currentIds.has(String(d.id)))\n .map((d) => mapToMedication(d));\n if (newMeds.length > 0) {\n onChange([...valueRef.current, ...newMeds]);\n }\n addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n function handleResultClick(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) return;\n setAddingResultId(result.id);\n setTimeout(() => {\n onChange([...valueRef.current, mapToMedication(result)]);\n setAddingResultId(null);\n setQuery('');\n setResults([]);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function handleSave() {\n const trimmed = query.trim();\n if (!trimmed) return;\n const customId = customIdRef.current--;\n onChange([...safeValue, createCustomMedication(trimmed, customId)]);\n setQuery('');\n setResults([]);\n }\n\n function handleAddSuggestion(ai: AIMedication) {\n if (addedIds.has(String(ai.id))) return;\n onChange([...safeValue, mapAIMedicationToMedication(ai)]);\n }\n\n function updateMed(index: number, updated: Medication) {\n const next = [...safeValue];\n next[index] = updated;\n onChange(next);\n }\n\n function removeMed(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(String(r.id));\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleRecentlyUsedToggle(r)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {r.name}\n </button>\n );\n });\n\n const limitedFrequentItems = frequentItems.slice(0, 25);\n\n const frequentItemChips =\n limitedFrequentItems.length > 0\n ? limitedFrequentItems.map((item) => {\n const isAdded = addedIds.has(String(item.id));\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-[11px] px-2 py-0.5 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {item.brand_name ?? item.name}\n </button>\n );\n })\n : [];\n\n const packageChips = packages.map((pkg) => {\n const isAdded = selectedPackageIds.has(pkg.id);\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => handlePackageToggle(pkg)}\n className={cn(\n 'rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span>✓</span>}\n <span className=\"font-semibold\">{pkg.name}</span>\n <span className={cn(\n 'rounded-full px-1.5 py-0.5 text-[10px] font-medium',\n isAdded ? 'bg-green-100 text-green-600' : 'bg-purple-100 text-purple-600'\n )}>\n {pkg.medications.length}\n </span>\n </button>\n );\n });\n\n const chipSections = [];\n if (frequentItemChips.length > 0) {\n chipSections.push({ label: 'Frequently used', content: <>{frequentItemChips}</> });\n } else if (recentlyUsedChips.length > 0) {\n chipSections.push({ label: 'Recently Used', content: <>{recentlyUsedChips}</> });\n }\n if (packageChips.length > 0) {\n chipSections.push({ label: 'Packages', content: <>{packageChips}</> });\n }\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold\">{label}</span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"text-sm font-semibold text-purple-600 hover:text-purple-800 cursor-pointer\"\n >\n ADD\n </button>\n </div>\n\n {/* Added medications */}\n <div className=\"space-y-2\">\n {safeValue.map((med, i) => (\n <MedicationCard\n key={med.id}\n med={med}\n onUpdate={(u) => updateMed(i, u)}\n onRemove={() => removeMed(i)}\n />\n ))}\n </div>\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Medication\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={!query.trim()}\n onClick={handleSave}\n className={cn(\n 'rounded-md px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground hover:bg-primary/90 transition-opacity cursor-pointer',\n !query.trim() && 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Medicine\n </button>\n }\n >\n <div className=\"space-y-3\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search medicines...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* AI-suggested medications as clickable badges (inside dialog) */}\n {suggestedMedications.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 items-center\">\n <span className=\"text-xs text-muted-foreground mr-1\">Suggestions:</span>\n {suggestedMedications\n .filter((s) => !addedIds.has(String(s.id)))\n .slice(0, 25)\n .map((s) => (\n <button\n key={String(s.id)}\n type=\"button\"\n onClick={() => handleAddSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-dashed border-purple-300 bg-purple-50/80 text-purple-800 text-[11px] px-2 py-0.5 hover:bg-purple-100 transition-colors cursor-pointer\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.brand_name || s.generic_name || String(s.id)}\n </button>\n ))}\n </div>\n )}\n\n {/* Results grid */}\n {loading && (\n <p className=\"text-xs text-muted-foreground text-center py-2\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {results.map((r) => (\n <SearchResultCard\n key={r.id}\n result={r}\n isAdding={addingResultId === r.id}\n onSelect={() => handleResultClick(r)}\n />\n ))}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/react/AISuggestionsContext.tsx","../src/ui/widgets/AddMedicationField.tsx"],"names":["createContext","useContext","jsxs","jsx","ChevronUp","ChevronDown","useState","Trash2","cn","ChevronRight","Check","useRef","useEffect","Fragment","AddEntityDialog","Input","Plus"],"mappings":"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","file":"chunk-A2A5EB5R.cjs","sourcesContent":["import { createContext, useContext } from 'react';\n\n/** Shape of a medication as returned by AI analysis */\nexport type AIMedication = {\n id: string | number;\n brand_name: string;\n generic_name: string;\n form?: string;\n strength?: string;\n reason?: string;\n};\n\nexport type AISuggestions = {\n medications?: AIMedication[];\n};\n\nconst AISuggestionsContext = createContext<AISuggestions>({});\n\nexport function useAISuggestions(): AISuggestions {\n return useContext(AISuggestionsContext);\n}\n\nexport const AISuggestionsProvider = AISuggestionsContext.Provider;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Trash2, ChevronUp, ChevronDown, ChevronRight, Plus, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { AIMedication } from '../../react/AISuggestionsContext';\nimport type { MedicationFrequentItem, MedicationPackage } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst BEFORE_AFTER_OPTIONS = [\n { label: 'Blank', value: '' },\n { label: 'AFTER FOOD', value: 'AFTER FOOD' },\n { label: 'BEFORE FOOD', value: 'BEFORE FOOD' },\n { label: 'WITH FOOD', value: 'WITH FOOD' },\n { label: 'SINGLE DOSE', value: 'SINGLE DOSE' },\n { label: 'BED TIME', value: 'BED TIME' },\n { label: 'EMPTY STOMACH', value: 'EMPTY STOMACH' },\n { label: 'LOCAL APPLICATION', value: 'LOCAL APPLICATION' },\n { label: 'STAT', value: 'STAT' },\n { label: 'INHALATION', value: 'INHALATION' },\n] as const;\n\ntype BeforeAfterOption = (typeof BEFORE_AFTER_OPTIONS)[number]['value'];\n\nconst BEFORE_AFTER_NORMALIZATION_MAP: Record<string, BeforeAfterOption> = {\n AF: 'AFTER FOOD',\n BF: 'BEFORE FOOD',\n};\n\nexport type MedicationSearchResult = {\n id: string;\n name: string;\n generic_name?: string;\n manufacturer?: string;\n score?: number;\n};\n\n\nconst ROUTE_OPTIONS = [\n { label: 'Select route', value: '' },\n { label: 'Per Os', value: 'Per Os' },\n { label: 'Intravenous', value: 'Intravenous' },\n { label: 'Intramuscular', value: 'Intramuscular' },\n { label: 'Subcutaneous', value: 'Subcutaneous' },\n { label: 'Sublingual', value: 'Sublingual' },\n { label: 'Intranasal', value: 'Intranasal' },\n { label: 'Topical', value: 'Topical' },\n { label: 'Per Rectum', value: 'Per Rectum' },\n { label: 'Inhalation', value: 'Inhalation' },\n { label: 'ID Intradermal', value: 'ID Intradermal' },\n] as const;\n\nexport type Medication = {\n id: string;\n brand_name: string;\n generic_name: string;\n frequency: string;\n is_custom: boolean;\n duration_value: string;\n duration_unit: 'days' | 'weeks' | 'months';\n before_after: BeforeAfterOption;\n route: string;\n morning: string;\n afternoon: string;\n night: string;\n notes: string;\n};\n\nexport type AddMedicationFieldProps = {\n label?: string;\n value: Medication[];\n onChange: (items: Medication[]) => void;\n onSearch: (query: string) => Promise<MedicationSearchResult[]>;\n recentlyUsed?: MedicationSearchResult[];\n /** Doctor-scoped frequently used medications (from FormProvider frequentItems) */\n frequentItems?: MedicationFrequentItem[];\n /** AI-suggested medications shown as badges; clicking adds to value */\n suggestedMedications?: AIMedication[];\n packages?: MedicationPackage[];\n};\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToMedication(result: MedicationSearchResult): Medication {\n return {\n id: result.id,\n brand_name: result.name,\n generic_name: result.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\nfunction mapAIMedicationToMedication(ai: AIMedication): Medication {\n const id = ai.id != null ? String(ai.id) : '';\n return {\n id,\n brand_name: ai.brand_name ?? '',\n generic_name: ai.generic_name ?? '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '1',\n afternoon: '0',\n night: '1',\n notes: ai.reason ?? '',\n };\n}\n\nfunction createCustomMedication(name: string, customId: number): Medication {\n return {\n id: String(customId),\n brand_name: name.trim(),\n generic_name: '',\n frequency: 'custom',\n is_custom: false,\n duration_value: '3',\n duration_unit: 'days',\n before_after: 'AFTER FOOD',\n route: '',\n morning: '0',\n afternoon: '0',\n night: '0',\n notes: '',\n };\n}\n\n/** Parse duration string like \"5 days\" or \"2 weeks\" into value + unit */\nfunction parseDuration(duration?: string): { value: string; unit: 'days' | 'weeks' | 'months' } {\n if (!duration || !duration.trim()) return { value: '3', unit: 'days' };\n const lower = duration.trim().toLowerCase();\n const match = lower.match(/^(\\d+)\\s*(day|days|week|weeks|month|months)?$/);\n if (!match) return { value: '3', unit: 'days' };\n const value = match[1] ?? '3';\n const unitWord = match[2] ?? 'days';\n const unit: 'days' | 'weeks' | 'months' =\n unitWord.startsWith('month') ? 'months' : unitWord.startsWith('week') ? 'weeks' : 'days';\n return { value, unit };\n}\n\nfunction mapFrequentItemToMedication(item: MedicationFrequentItem): Medication {\n const parsed = parseDuration(item.duration);\n const duration_value = item.duration_value ?? parsed.value;\n const duration_unit =\n (item.duration_unit as Medication['duration_unit'] | undefined) ?? parsed.unit;\n\n const before_after: Medication['before_after'] = normalizeBeforeAfter(item.before_after);\n\n const routeNote = item.route ? `Route: ${item.route}` : '';\n const baseNotes = item.notes?.trim() || '';\n const combinedNotes =\n [baseNotes, routeNote.trim()].filter((part) => part.length > 0).join(' — ');\n\n return {\n id: item.id,\n brand_name: item.brand_name ?? item.name,\n generic_name: item.short_name ?? '',\n frequency: item.frequency ?? 'custom',\n is_custom: false,\n duration_value,\n duration_unit,\n before_after,\n route: item.route ?? '',\n morning: item.morning ?? '0',\n afternoon: item.afternoon ?? '0',\n night: item.night ?? '0',\n notes: combinedNotes,\n };\n}\n\nfunction normalizeBeforeAfter(value?: string): BeforeAfterOption {\n if (value == null) return 'AFTER FOOD';\n const mapped = BEFORE_AFTER_NORMALIZATION_MAP[value];\n if (mapped) return mapped;\n const validValues = BEFORE_AFTER_OPTIONS.map((option) => option.value);\n return validValues.includes(value as BeforeAfterOption) ? (value as BeforeAfterOption) : 'AFTER FOOD';\n}\n\nfunction Spinner({\n value,\n onChange,\n}: {\n value: string;\n onChange: (v: string) => void;\n}) {\n const num = parseInt(value, 10) || 0;\n return (\n <div className=\"flex flex-col items-center\">\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(num + 1))}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <span className=\"text-sm w-4 text-center leading-none\">{num}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground cursor-pointer\"\n onClick={() => onChange(String(Math.max(0, num - 1)))}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// ─── Medication card (added item) ─────────────────────────────────────────────\n\nfunction MedicationCard({\n med,\n onUpdate,\n onRemove,\n}: {\n med: Medication;\n onUpdate: (updated: Medication) => void;\n onRemove: () => void;\n}) {\n const [notesOpen, setNotesOpen] = useState(false);\n\n function set<K extends keyof Medication>(key: K, val: Medication[K]) {\n onUpdate({ ...med, [key]: val });\n }\n\n return (\n <div className=\"bg-gray-50 rounded-lg p-3 space-y-2\">\n {/* Row 1: drug name, frequency dropdown, morning/afternoon/night labels, delete */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-semibold text-sm flex-1 min-w-0 truncate\">{med.brand_name}</span>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.frequency}\n onChange={(e) => set('frequency', e.target.value)}\n >\n <option value=\"custom\">select frequency</option>\n <option value=\"qid\">4 times a day (QID)</option>\n <option value=\"alternate_day\">Alternate day</option>\n <option value=\"once_weekly\">Once weekly</option>\n <option value=\"once_monthly\">Once monthly</option>\n <option value=\"as_needed\">As needed</option>\n <option value=\"fort_night\">Fort night</option>\n <option value=\"at_bed_time\">At Bed time</option>\n <option value=\"sos\">SOS only</option>\n <option value=\"biweekly\">Biweekly</option>\n <option value=\"stat\">STAT</option>\n </select>\n <div className=\"flex gap-4 items-center shrink-0\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <span\n key={slot}\n className=\"text-[10px] font-semibold uppercase text-muted-foreground tracking-wide\"\n >\n {slot === 'afternoon' ? 'AFTERNOON' : slot === 'morning' ? 'MORNING' : 'NIGHT'}\n </span>\n ))}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-red-400 hover:text-red-600 shrink-0 p-1 cursor-pointer\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Row 2: duration (value + unit) on left; 3 dose spinners in middle; AF/BF on right */}\n <div className=\"flex items-center gap-3 flex-wrap\">\n <div className=\"flex items-center gap-1 shrink-0\">\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n className=\"w-11 text-sm border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_value}\n onChange={(e) => {\n const v = e.target.value.replace(/\\D/g, '');\n set('duration_value', v === '' ? '' : v);\n }}\n />\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white\"\n value={med.duration_unit}\n onChange={(e) => set('duration_unit', e.target.value as Medication['duration_unit'])}\n >\n <option value=\"days\">days</option>\n <option value=\"weeks\">weeks</option>\n <option value=\"months\">months</option>\n </select>\n </div>\n <div className=\"flex gap-2 items-center flex-1 min-w-0 justify-end\">\n {(['morning', 'afternoon', 'night'] as const).map((slot) => (\n <div key={slot} className=\"flex flex-col items-center gap-0.5\">\n <Spinner value={med[slot]} onChange={(v) => set(slot, v)} />\n </div>\n ))}\n </div>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={normalizeBeforeAfter(med.before_after)}\n onChange={(e) => set('before_after', e.target.value as Medication['before_after'])}\n >\n {BEFORE_AFTER_OPTIONS.map((option) => (\n <option key={option.label} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <select\n className=\"text-xs border border-border rounded px-2 py-1 bg-white shrink-0\"\n value={med.route ?? ''}\n onChange={(e) => set('route', e.target.value)}\n >\n {ROUTE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* Row 3: medicine notes — full-width div as hit area (chevron + text), cursor-pointer */}\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setNotesOpen((o) => !o)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setNotesOpen((o) => !o);\n }\n }}\n className={cn(\n 'flex items-center gap-2 w-full text-left text-xs text-muted-foreground hover:text-foreground',\n 'cursor-pointer py-2 px-2 rounded border border-transparent hover:bg-gray-100/80 transition-colors'\n )}\n >\n <ChevronRight\n className={cn('h-3 w-3 shrink-0 transition-transform', notesOpen && 'rotate-90')}\n />\n <span>Medicine Notes</span>\n </div>\n {notesOpen && (\n <div className=\"relative z-10 mt-0.5\">\n <textarea\n className=\"block w-full text-xs border border-border rounded px-2 py-1 resize-none bg-white min-h-0\"\n rows={2}\n placeholder=\"Add notes...\"\n value={med.notes}\n onChange={(e) => set('notes', e.target.value)}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Search result card ────────────────────────────────────────────────────────\n\nconst ADD_FEEDBACK_MS = 320;\n\nfunction SearchResultCard({\n result,\n isAdding,\n onSelect,\n}: {\n result: MedicationSearchResult;\n isAdding: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n 'w-full text-left border rounded-lg px-3 py-2 transition-all duration-300 ease-out cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'border-green-400 bg-green-50 scale-[0.98]'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"text-sm font-semibold leading-tight truncate\">{result.name}</p>\n {result.generic_name && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n Generic: {result.generic_name}\n </p>\n )}\n </div>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddMedicationField: React.FC<AddMedicationFieldProps> = ({\n label = 'Medications',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n suggestedMedications = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<MedicationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingResultId, setAddingResultId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const customIdRef = useRef(-1);\n const valueRef = useRef<Medication[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which medication IDs were added by each package: packageId → medicationId[]\n const addedByPackage = useRef<Map<string, string[]>>(new Map());\n // drives re-renders for package chip selected state\n const [selectedPackageIds, setSelectedPackageIds] = useState<Set<string>>(new Set());\n\n const safeValue = Array.isArray(value) ? value : [];\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((m) => String(m.id)));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingResultId(null);\n }\n }, [open]);\n\n function handleQueryChange(q: string) {\n setQuery(q);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n if (!q.trim()) {\n setResults([]);\n return;\n }\n debounceRef.current = setTimeout(async () => {\n setLoading(true);\n try {\n const res = await onSearch(q);\n setResults(res);\n } finally {\n setLoading(false);\n }\n }, 500);\n }\n\n function handleRecentlyUsedToggle(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(result.id)));\n } else {\n onChange([...safeValue, mapToMedication(result)]);\n }\n }\n\n function handleFrequentItemToggle(item: MedicationFrequentItem) {\n if (addedIds.has(String(item.id))) {\n onChange(safeValue.filter((m) => String(m.id) !== String(item.id)));\n } else {\n onChange([...safeValue, mapFrequentItemToMedication(item)]);\n }\n }\n\n function handlePackageToggle(pkg: MedicationPackage) {\n const alreadyAdded = addedByPackage.current.has(pkg.id);\n if (alreadyAdded) {\n const idsToRemove = new Set(addedByPackage.current.get(pkg.id) ?? []);\n onChange(valueRef.current.filter((m) => !idsToRemove.has(String(m.id))));\n addedByPackage.current.delete(pkg.id);\n setSelectedPackageIds((prev) => {\n const next = new Set(prev);\n next.delete(pkg.id);\n return next;\n });\n } else {\n const currentIds = new Set(valueRef.current.map((m) => String(m.id)));\n const newMeds = pkg.medications\n .filter((d) => !currentIds.has(String(d.id)))\n .map((d) => mapToMedication(d));\n if (newMeds.length > 0) {\n onChange([...valueRef.current, ...newMeds]);\n }\n addedByPackage.current.set(pkg.id, newMeds.map((m) => String(m.id)));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n function handleResultClick(result: MedicationSearchResult) {\n if (addedIds.has(String(result.id))) return;\n setAddingResultId(result.id);\n setTimeout(() => {\n onChange([...valueRef.current, mapToMedication(result)]);\n setAddingResultId(null);\n setQuery('');\n setResults([]);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function handleSave() {\n const trimmed = query.trim();\n if (!trimmed) return;\n const customId = customIdRef.current--;\n onChange([...safeValue, createCustomMedication(trimmed, customId)]);\n setQuery('');\n setResults([]);\n }\n\n function handleAddSuggestion(ai: AIMedication) {\n if (addedIds.has(String(ai.id))) return;\n onChange([...safeValue, mapAIMedicationToMedication(ai)]);\n }\n\n function updateMed(index: number, updated: Medication) {\n const next = [...safeValue];\n next[index] = updated;\n onChange(next);\n }\n\n function removeMed(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(String(r.id));\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleRecentlyUsedToggle(r)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {r.name}\n </button>\n );\n });\n\n const limitedFrequentItems = frequentItems.slice(0, 25);\n\n const frequentItemChips =\n limitedFrequentItems.length > 0\n ? limitedFrequentItems.map((item) => {\n const isAdded = addedIds.has(String(item.id));\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-[11px] px-2 py-0.5 transition-colors cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {item.brand_name ?? item.name}\n </button>\n );\n })\n : [];\n\n const packageChips = packages.map((pkg) => {\n const isAdded = selectedPackageIds.has(pkg.id);\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => handlePackageToggle(pkg)}\n className={cn(\n 'rounded-full border text-xs px-4 py-1.5 transition-colors flex items-center gap-2 cursor-pointer',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50'\n )}\n >\n {isAdded && <span>✓</span>}\n <span className=\"font-semibold\">{pkg.name}</span>\n <span className={cn(\n 'rounded-full px-1.5 py-0.5 text-[10px] font-medium',\n isAdded ? 'bg-green-100 text-green-600' : 'bg-purple-100 text-purple-600'\n )}>\n {pkg.medications.length}\n </span>\n </button>\n );\n });\n\n const chipSections = [];\n if (frequentItemChips.length > 0) {\n chipSections.push({ label: 'Frequently used', content: <>{frequentItemChips}</> });\n } else if (recentlyUsedChips.length > 0) {\n chipSections.push({ label: 'Recently Used', content: <>{recentlyUsedChips}</> });\n }\n if (packageChips.length > 0) {\n chipSections.push({ label: 'Packages', content: <>{packageChips}</> });\n }\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col border bg-white border-[#D0D0D0] space-y-3 p-3 h-fit\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold\">{label}</span>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"text-sm font-semibold text-purple-600 hover:text-purple-800 cursor-pointer\"\n >\n ADD\n </button>\n </div>\n\n {/* Added medications */}\n <div className=\"space-y-2\">\n {safeValue.map((med, i) => (\n <MedicationCard\n key={med.id}\n med={med}\n onUpdate={(u) => updateMed(i, u)}\n onRemove={() => removeMed(i)}\n />\n ))}\n </div>\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Medication\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={!query.trim()}\n onClick={handleSave}\n className={cn(\n 'rounded-md px-5 py-2 text-sm font-semibold bg-primary text-primary-foreground hover:bg-primary/90 transition-opacity cursor-pointer',\n !query.trim() && 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Medicine\n </button>\n }\n >\n <div className=\"space-y-3\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search medicines...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* AI-suggested medications as clickable badges (inside dialog) */}\n {suggestedMedications.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 items-center\">\n <span className=\"text-xs text-muted-foreground mr-1\">Suggestions:</span>\n {suggestedMedications\n .filter((s) => !addedIds.has(String(s.id)))\n .slice(0, 25)\n .map((s) => (\n <button\n key={String(s.id)}\n type=\"button\"\n onClick={() => handleAddSuggestion(s)}\n className=\"inline-flex items-center gap-1 rounded-full border border-dashed border-purple-300 bg-purple-50/80 text-purple-800 text-[11px] px-2 py-0.5 hover:bg-purple-100 transition-colors cursor-pointer\"\n >\n <Plus className=\"h-3 w-3\" />\n {s.brand_name || s.generic_name || String(s.id)}\n </button>\n ))}\n </div>\n )}\n\n {/* Results grid */}\n {loading && (\n <p className=\"text-xs text-muted-foreground text-center py-2\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2 max-h-64 overflow-y-auto\">\n {results.map((r) => (\n <SearchResultCard\n key={r.id}\n result={r}\n isAdding={addingResultId === r.id}\n onSelect={() => handleResultClick(r)}\n />\n ))}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}