formanitor 0.2.5 → 0.2.7
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.
- package/dist/{AddInvestigationWidget-FABXZDEZ.mjs → AddInvestigationWidget-A2JS2ETO.mjs} +3 -3
- package/dist/{AddInvestigationWidget-FABXZDEZ.mjs.map → AddInvestigationWidget-A2JS2ETO.mjs.map} +1 -1
- package/dist/{AddInvestigationWidget-7FLINCTT.cjs → AddInvestigationWidget-MSY4VSQZ.cjs} +4 -4
- package/dist/{AddInvestigationWidget-7FLINCTT.cjs.map → AddInvestigationWidget-MSY4VSQZ.cjs.map} +1 -1
- package/dist/{AddProcedureWidget-QHV5CQKX.cjs → AddProcedureWidget-QUNDIZGR.cjs} +9 -5
- package/dist/AddProcedureWidget-QUNDIZGR.cjs.map +1 -0
- package/dist/{AddProcedureWidget-VJZ6NO4Q.mjs → AddProcedureWidget-YW4EV66W.mjs} +9 -5
- package/dist/AddProcedureWidget-YW4EV66W.mjs.map +1 -0
- package/dist/{chunk-LBWB7MYU.cjs → chunk-IZLKX7GI.cjs} +9 -5
- package/dist/chunk-IZLKX7GI.cjs.map +1 -0
- package/dist/{chunk-B3GBIAHZ.mjs → chunk-MXY24ZHB.mjs} +9 -5
- package/dist/chunk-MXY24ZHB.mjs.map +1 -0
- package/dist/index.cjs +7 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.mjs +6 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/AddProcedureWidget-QHV5CQKX.cjs.map +0 -1
- package/dist/AddProcedureWidget-VJZ6NO4Q.mjs.map +0 -1
- package/dist/chunk-B3GBIAHZ.mjs.map +0 -1
- package/dist/chunk-LBWB7MYU.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AddInvestigationField } from './chunk-
|
|
1
|
+
import { AddInvestigationField } from './chunk-MXY24ZHB.mjs';
|
|
2
2
|
import './chunk-GZPCYSJK.mjs';
|
|
3
3
|
import './chunk-VNFBUAZD.mjs';
|
|
4
4
|
import { useField, useFieldHandlers, useFrequentItems, usePackages } from './chunk-2BGJZ44Q.mjs';
|
|
@@ -26,5 +26,5 @@ var AddInvestigationWidget = ({ fieldId }) => {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export { AddInvestigationWidget };
|
|
29
|
-
//# sourceMappingURL=AddInvestigationWidget-
|
|
30
|
-
//# sourceMappingURL=AddInvestigationWidget-
|
|
29
|
+
//# sourceMappingURL=AddInvestigationWidget-A2JS2ETO.mjs.map
|
|
30
|
+
//# sourceMappingURL=AddInvestigationWidget-A2JS2ETO.mjs.map
|
package/dist/{AddInvestigationWidget-FABXZDEZ.mjs.map → AddInvestigationWidget-A2JS2ETO.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/AddInvestigationWidget.tsx"],"names":[],"mappings":";;;;;;;;AAMO,IAAM,sBAAA,GAAwD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACpF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,cAAA,EAAgB,sBAAA,EAAuB,GAAI,gBAAA,EAAiB;AACpE,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,YAA6B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA4B,EAAC;AAExF,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;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,sBAAA;AAAA,MACf;AAAA;AAAA,GACF;AAEJ","file":"AddInvestigationWidget-
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddInvestigationWidget.tsx"],"names":[],"mappings":";;;;;;;;AAMO,IAAM,sBAAA,GAAwD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACpF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,SAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,iBAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,cAAA,EAAgB,sBAAA,EAAuB,GAAI,gBAAA,EAAiB;AACpE,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,YAA6B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA4B,EAAC;AAExF,EAAA,uBACE,GAAA;AAAA,IAAC,qBAAA;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,sBAAA;AAAA,MACf;AAAA;AAAA,GACF;AAEJ","file":"AddInvestigationWidget-A2JS2ETO.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, usePackages } from '../../react/FormProvider';\nimport { AddInvestigationField } from './AddInvestigationField';\nimport type { Investigation, InvestigationSearchResult } from './AddInvestigationField';\n\nexport const AddInvestigationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { investigations: frequentInvestigations } = useFrequentItems();\n const packages = usePackages();\n\n const safeValue: Investigation[] = Array.isArray(value) ? (value as Investigation[]) : [];\n\n return (\n <AddInvestigationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<InvestigationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as InvestigationSearchResult[] | undefined}\n frequentItems={frequentInvestigations}\n packages={packages}\n />\n );\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkIZLKX7GI_cjs = require('./chunk-IZLKX7GI.cjs');
|
|
4
4
|
require('./chunk-E7WUDHSA.cjs');
|
|
5
5
|
require('./chunk-TJHG5WHX.cjs');
|
|
6
6
|
var chunkTB33A4PD_cjs = require('./chunk-TB33A4PD.cjs');
|
|
@@ -15,7 +15,7 @@ var AddInvestigationWidget = ({ fieldId }) => {
|
|
|
15
15
|
const packages = chunkTB33A4PD_cjs.usePackages();
|
|
16
16
|
const safeValue = Array.isArray(value) ? value : [];
|
|
17
17
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
18
|
-
|
|
18
|
+
chunkIZLKX7GI_cjs.AddInvestigationField,
|
|
19
19
|
{
|
|
20
20
|
value: safeValue,
|
|
21
21
|
onChange: setValue,
|
|
@@ -28,5 +28,5 @@ var AddInvestigationWidget = ({ fieldId }) => {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
exports.AddInvestigationWidget = AddInvestigationWidget;
|
|
31
|
-
//# sourceMappingURL=AddInvestigationWidget-
|
|
32
|
-
//# sourceMappingURL=AddInvestigationWidget-
|
|
31
|
+
//# sourceMappingURL=AddInvestigationWidget-MSY4VSQZ.cjs.map
|
|
32
|
+
//# sourceMappingURL=AddInvestigationWidget-MSY4VSQZ.cjs.map
|
package/dist/{AddInvestigationWidget-7FLINCTT.cjs.map → AddInvestigationWidget-MSY4VSQZ.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/widgets/AddInvestigationWidget.tsx"],"names":["useField","useFieldHandlers","useFrequentItems","usePackages","jsx","AddInvestigationField"],"mappings":";;;;;;;;;;AAMO,IAAM,sBAAA,GAAwD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACpF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIA,2BAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWC,mCAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,cAAA,EAAgB,sBAAA,EAAuB,GAAIC,kCAAA,EAAiB;AACpE,EAAA,MAAM,WAAWC,6BAAA,EAAY;AAE7B,EAAA,MAAM,YAA6B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA4B,EAAC;AAExF,EAAA,uBACEC,cAAA;AAAA,IAACC,uCAAA;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,sBAAA;AAAA,MACf;AAAA;AAAA,GACF;AAEJ","file":"AddInvestigationWidget-
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddInvestigationWidget.tsx"],"names":["useField","useFieldHandlers","useFrequentItems","usePackages","jsx","AddInvestigationField"],"mappings":";;;;;;;;;;AAMO,IAAM,sBAAA,GAAwD,CAAC,EAAE,OAAA,EAAQ,KAAM;AACpF,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAIA,2BAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWC,mCAAiB,OAAO,CAAA;AACzC,EAAA,MAAM,EAAE,cAAA,EAAgB,sBAAA,EAAuB,GAAIC,kCAAA,EAAiB;AACpE,EAAA,MAAM,WAAWC,6BAAA,EAAY;AAE7B,EAAA,MAAM,YAA6B,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA4B,EAAC;AAExF,EAAA,uBACEC,cAAA;AAAA,IAACC,uCAAA;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,sBAAA;AAAA,MACf;AAAA;AAAA,GACF;AAEJ","file":"AddInvestigationWidget-MSY4VSQZ.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems, usePackages } from '../../react/FormProvider';\nimport { AddInvestigationField } from './AddInvestigationField';\nimport type { Investigation, InvestigationSearchResult } from './AddInvestigationField';\n\nexport const AddInvestigationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { investigations: frequentInvestigations } = useFrequentItems();\n const packages = usePackages();\n\n const safeValue: Investigation[] = Array.isArray(value) ? (value as Investigation[]) : [];\n\n return (\n <AddInvestigationField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<InvestigationSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as InvestigationSearchResult[] | undefined}\n frequentItems={frequentInvestigations}\n packages={packages}\n />\n );\n};\n"]}
|
|
@@ -20,6 +20,10 @@ function mapToProcedure(result) {
|
|
|
20
20
|
function createCustomProcedure(trimmedName) {
|
|
21
21
|
return { name: trimmedName.trim(), is_custom: true };
|
|
22
22
|
}
|
|
23
|
+
function findSearchResultByName(searchResults, name) {
|
|
24
|
+
const target = name.trim().toLowerCase();
|
|
25
|
+
return searchResults?.find((r) => r.name.trim().toLowerCase() === target);
|
|
26
|
+
}
|
|
23
27
|
var AddProcedureField = ({
|
|
24
28
|
label = "Procedures",
|
|
25
29
|
value,
|
|
@@ -116,9 +120,9 @@ var AddProcedureField = ({
|
|
|
116
120
|
setAddingFrequentId(id);
|
|
117
121
|
try {
|
|
118
122
|
const searchResults = await onSearch(item.name);
|
|
119
|
-
const
|
|
120
|
-
if (
|
|
121
|
-
onChange([...valueRef.current, mapToProcedure(
|
|
123
|
+
const match = findSearchResultByName(searchResults, item.name);
|
|
124
|
+
if (match && !valueRef.current.some((proc) => !proc.is_custom && proc.id === match.id)) {
|
|
125
|
+
onChange([...valueRef.current, mapToProcedure(match)]);
|
|
122
126
|
}
|
|
123
127
|
} finally {
|
|
124
128
|
setAddingFrequentId(null);
|
|
@@ -274,5 +278,5 @@ var AddProcedureWidget = ({ fieldId }) => {
|
|
|
274
278
|
};
|
|
275
279
|
|
|
276
280
|
exports.AddProcedureWidget = AddProcedureWidget;
|
|
277
|
-
//# sourceMappingURL=AddProcedureWidget-
|
|
278
|
-
//# sourceMappingURL=AddProcedureWidget-
|
|
281
|
+
//# sourceMappingURL=AddProcedureWidget-QUNDIZGR.cjs.map
|
|
282
|
+
//# sourceMappingURL=AddProcedureWidget-QUNDIZGR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddProcedureField.tsx","../src/ui/widgets/AddProcedureWidget.tsx"],"names":["useState","useRef","useEffect","jsxs","cn","jsx","X","AddEntityDialog","Input","Check","useField","useFieldHandlers","useFrequentItems"],"mappings":"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","file":"AddProcedureWidget-QUNDIZGR.cjs","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { ProcedureFrequentItem } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n// Matches search API response.results[] shape\n\nexport type ProcedureSearchResult = {\n id: string;\n name: string;\n code?: string;\n description?: string;\n specialization?: string;\n /** Catalog diagnostic service (service_type=SERVICES) merged into procedures search/save. */\n service_type?: string;\n /** Present on service items when reopening a saved prescription. */\n type?: string;\n score?: number;\n};\n\n/** Master row from search / frequent resolution — full metadata. */\nexport type MasterProcedure = ProcedureSearchResult & {\n label: string;\n is_custom: false;\n fromAI: boolean;\n};\n\n/** Custom free-text row — only `name` and `is_custom` (no extra keys). */\nexport type CustomProcedure = {\n name: string;\n is_custom: true;\n};\n\nexport type Procedure = MasterProcedure | CustomProcedure;\n\nexport type AddProcedureFieldProps = {\n label?: string;\n value: Procedure[];\n onChange: (items: Procedure[]) => void;\n onSearch: (query: string) => Promise<ProcedureSearchResult[]>;\n recentlyUsed?: ProcedureSearchResult[];\n /** Doctor-scoped frequently used procedures (from FormProvider frequentItems) */\n frequentItems?: ProcedureFrequentItem[];\n};\n\nconst ADD_FEEDBACK_MS = 320;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToProcedure(result: ProcedureSearchResult): MasterProcedure {\n return {\n ...result,\n label: result.name,\n is_custom: false,\n fromAI: false,\n };\n}\n\nfunction createCustomProcedure(trimmedName: string): CustomProcedure {\n return { name: trimmedName.trim(), is_custom: true };\n}\n\nfunction findSearchResultByName(\n searchResults: ProcedureSearchResult[] | undefined,\n name: string,\n): ProcedureSearchResult | undefined {\n const target = name.trim().toLowerCase();\n return searchResults?.find((r) => r.name.trim().toLowerCase() === target);\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddProcedureField: React.FC<AddProcedureFieldProps> = ({\n label = 'Procedures',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<ProcedureSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingId, setAddingId] = useState<string | null>(null);\n const [addingFrequentId, setAddingFrequentId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const valueRef = useRef<Procedure[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const safeValue: Procedure[] = Array.isArray(value) ? value : [];\n\n valueRef.current = safeValue;\n const addedIds = new Set(\n safeValue.filter((proc): proc is MasterProcedure => !proc.is_custom).map((proc) => proc.id),\n );\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingId(null);\n setAddingFrequentId(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 addProcedure(result: ProcedureSearchResult) {\n if (!addedIds.has(result.id)) {\n onChange([...valueRef.current, mapToProcedure(result)]);\n }\n setQuery('');\n setResults([]);\n }\n\n function handleResultClick(result: ProcedureSearchResult) {\n if (addedIds.has(result.id)) return;\n setAddingId(result.id);\n setTimeout(() => {\n addProcedure(result);\n setAddingId(null);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function removeAt(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n function removeBySearchId(id: string) {\n onChange(safeValue.filter((proc) => proc.is_custom || proc.id !== id));\n }\n\n function handleAddCustom() {\n const trimmed = query.trim();\n if (!trimmed) return;\n if (valueRef.current.some((p) => p.is_custom && p.name === trimmed)) return;\n onChange([...valueRef.current, createCustomProcedure(trimmed)]);\n setQuery('');\n setResults([]);\n }\n\n function handleRecentlyUsedToggle(result: ProcedureSearchResult) {\n if (addedIds.has(result.id)) {\n removeBySearchId(result.id);\n } else {\n addProcedure(result);\n }\n }\n\n async function handleFrequentItemToggle(item: ProcedureFrequentItem) {\n const id = String(item.id);\n const addedById = addedIds.has(id);\n const addedByName = safeValue.some((proc) => proc.name === item.name);\n if (addedById || addedByName) {\n if (addedById) removeBySearchId(id);\n else onChange(safeValue.filter((proc) => proc.name !== item.name));\n return;\n }\n setAddingFrequentId(id);\n try {\n const searchResults = await onSearch(item.name);\n const match = findSearchResultByName(searchResults, item.name);\n if (match && !valueRef.current.some((proc) => !proc.is_custom && proc.id === match.id)) {\n onChange([...valueRef.current, mapToProcedure(match)]);\n }\n } finally {\n setAddingFrequentId(null);\n }\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(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',\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 id = String(item.id);\n const isAdded =\n safeValue.some((proc) => !proc.is_custom && proc.id === id) ||\n safeValue.some((proc) => proc.name === item.name);\n const isAdding = addingFrequentId === id;\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={isAdding}\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50',\n isAdding && 'opacity-70 pointer-events-none'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {isAdding ? '…' : item.name}\n </button>\n );\n })\n : [];\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col bg-white border border-[#D0D0D0] space-y-3 p-3 h-fit\">\n <div className=\"flex items-center justify-between mb-3\">\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 procedures — one row each */}\n {safeValue.length > 0 && (\n <div className=\"divide-y divide-border rounded-lg border border-border overflow-hidden\">\n {safeValue.map((proc, index) => (\n <div\n key={proc.is_custom ? `custom-${index}` : proc.id}\n className=\"flex items-center justify-between px-3 py-2 bg-white hover:bg-gray-50\"\n >\n <span className=\"text-sm\">{proc.name}</span>\n <button\n type=\"button\"\n onClick={() => removeAt(index)}\n className=\"text-muted-foreground hover:text-red-500 transition-colors cursor-pointer\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Procedure\"\n recentlyUsedSlot={\n frequentItemChips.length > 0\n ? frequentItemChips\n : recentlyUsedChips.length > 0\n ? recentlyUsedChips\n : undefined\n }\n chipSectionLabel={frequentItemChips.length > 0 ? 'Frequently used' : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={\n !query.trim() ||\n valueRef.current.some((p) => p.is_custom && p.name === query.trim())\n }\n onClick={handleAddCustom}\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() ||\n valueRef.current.some((p) => p.is_custom && p.name === query.trim())) &&\n 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Procedure\n </button>\n }\n >\n <div className=\"space-y-2\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search for a procedure...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* Inline results — no absolute positioning to avoid overflow-clip */}\n {loading && (\n <p className=\"text-xs text-muted-foreground py-1\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"border border-border rounded-md overflow-hidden\">\n {results.map((r) => {\n const isAdding = addingId === r.id;\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleResultClick(r)}\n className={cn(\n 'w-full text-left px-3 py-2 text-sm transition-all duration-300 ease-out border-b border-border last:border-b-0 cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'bg-green-50 border-green-200'\n : 'hover:bg-gray-50'\n )}\n >\n <span className=\"truncate\">{r.name}</span>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems } from '../../react/FormProvider';\nimport { AddProcedureField } from './AddProcedureField';\nimport type { Procedure, ProcedureSearchResult } from './AddProcedureField';\n\nexport const AddProcedureWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { procedures: frequentProcedures } = useFrequentItems();\n\n const safeValue: Procedure[] = Array.isArray(value) ? (value as Procedure[]) : [];\n\n return (\n <AddProcedureField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<ProcedureSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as ProcedureSearchResult[] | undefined}\n frequentItems={frequentProcedures}\n />\n );\n};\n"]}
|
|
@@ -18,6 +18,10 @@ function mapToProcedure(result) {
|
|
|
18
18
|
function createCustomProcedure(trimmedName) {
|
|
19
19
|
return { name: trimmedName.trim(), is_custom: true };
|
|
20
20
|
}
|
|
21
|
+
function findSearchResultByName(searchResults, name) {
|
|
22
|
+
const target = name.trim().toLowerCase();
|
|
23
|
+
return searchResults?.find((r) => r.name.trim().toLowerCase() === target);
|
|
24
|
+
}
|
|
21
25
|
var AddProcedureField = ({
|
|
22
26
|
label = "Procedures",
|
|
23
27
|
value,
|
|
@@ -114,9 +118,9 @@ var AddProcedureField = ({
|
|
|
114
118
|
setAddingFrequentId(id);
|
|
115
119
|
try {
|
|
116
120
|
const searchResults = await onSearch(item.name);
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
119
|
-
onChange([...valueRef.current, mapToProcedure(
|
|
121
|
+
const match = findSearchResultByName(searchResults, item.name);
|
|
122
|
+
if (match && !valueRef.current.some((proc) => !proc.is_custom && proc.id === match.id)) {
|
|
123
|
+
onChange([...valueRef.current, mapToProcedure(match)]);
|
|
120
124
|
}
|
|
121
125
|
} finally {
|
|
122
126
|
setAddingFrequentId(null);
|
|
@@ -272,5 +276,5 @@ var AddProcedureWidget = ({ fieldId }) => {
|
|
|
272
276
|
};
|
|
273
277
|
|
|
274
278
|
export { AddProcedureWidget };
|
|
275
|
-
//# sourceMappingURL=AddProcedureWidget-
|
|
276
|
-
//# sourceMappingURL=AddProcedureWidget-
|
|
279
|
+
//# sourceMappingURL=AddProcedureWidget-YW4EV66W.mjs.map
|
|
280
|
+
//# sourceMappingURL=AddProcedureWidget-YW4EV66W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddProcedureField.tsx","../src/ui/widgets/AddProcedureWidget.tsx"],"names":["jsx"],"mappings":"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","file":"AddProcedureWidget-YW4EV66W.mjs","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { ProcedureFrequentItem } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n// Matches search API response.results[] shape\n\nexport type ProcedureSearchResult = {\n id: string;\n name: string;\n code?: string;\n description?: string;\n specialization?: string;\n /** Catalog diagnostic service (service_type=SERVICES) merged into procedures search/save. */\n service_type?: string;\n /** Present on service items when reopening a saved prescription. */\n type?: string;\n score?: number;\n};\n\n/** Master row from search / frequent resolution — full metadata. */\nexport type MasterProcedure = ProcedureSearchResult & {\n label: string;\n is_custom: false;\n fromAI: boolean;\n};\n\n/** Custom free-text row — only `name` and `is_custom` (no extra keys). */\nexport type CustomProcedure = {\n name: string;\n is_custom: true;\n};\n\nexport type Procedure = MasterProcedure | CustomProcedure;\n\nexport type AddProcedureFieldProps = {\n label?: string;\n value: Procedure[];\n onChange: (items: Procedure[]) => void;\n onSearch: (query: string) => Promise<ProcedureSearchResult[]>;\n recentlyUsed?: ProcedureSearchResult[];\n /** Doctor-scoped frequently used procedures (from FormProvider frequentItems) */\n frequentItems?: ProcedureFrequentItem[];\n};\n\nconst ADD_FEEDBACK_MS = 320;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToProcedure(result: ProcedureSearchResult): MasterProcedure {\n return {\n ...result,\n label: result.name,\n is_custom: false,\n fromAI: false,\n };\n}\n\nfunction createCustomProcedure(trimmedName: string): CustomProcedure {\n return { name: trimmedName.trim(), is_custom: true };\n}\n\nfunction findSearchResultByName(\n searchResults: ProcedureSearchResult[] | undefined,\n name: string,\n): ProcedureSearchResult | undefined {\n const target = name.trim().toLowerCase();\n return searchResults?.find((r) => r.name.trim().toLowerCase() === target);\n}\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddProcedureField: React.FC<AddProcedureFieldProps> = ({\n label = 'Procedures',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<ProcedureSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingId, setAddingId] = useState<string | null>(null);\n const [addingFrequentId, setAddingFrequentId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const valueRef = useRef<Procedure[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const safeValue: Procedure[] = Array.isArray(value) ? value : [];\n\n valueRef.current = safeValue;\n const addedIds = new Set(\n safeValue.filter((proc): proc is MasterProcedure => !proc.is_custom).map((proc) => proc.id),\n );\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingId(null);\n setAddingFrequentId(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 addProcedure(result: ProcedureSearchResult) {\n if (!addedIds.has(result.id)) {\n onChange([...valueRef.current, mapToProcedure(result)]);\n }\n setQuery('');\n setResults([]);\n }\n\n function handleResultClick(result: ProcedureSearchResult) {\n if (addedIds.has(result.id)) return;\n setAddingId(result.id);\n setTimeout(() => {\n addProcedure(result);\n setAddingId(null);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function removeAt(index: number) {\n onChange(safeValue.filter((_, i) => i !== index));\n }\n\n function removeBySearchId(id: string) {\n onChange(safeValue.filter((proc) => proc.is_custom || proc.id !== id));\n }\n\n function handleAddCustom() {\n const trimmed = query.trim();\n if (!trimmed) return;\n if (valueRef.current.some((p) => p.is_custom && p.name === trimmed)) return;\n onChange([...valueRef.current, createCustomProcedure(trimmed)]);\n setQuery('');\n setResults([]);\n }\n\n function handleRecentlyUsedToggle(result: ProcedureSearchResult) {\n if (addedIds.has(result.id)) {\n removeBySearchId(result.id);\n } else {\n addProcedure(result);\n }\n }\n\n async function handleFrequentItemToggle(item: ProcedureFrequentItem) {\n const id = String(item.id);\n const addedById = addedIds.has(id);\n const addedByName = safeValue.some((proc) => proc.name === item.name);\n if (addedById || addedByName) {\n if (addedById) removeBySearchId(id);\n else onChange(safeValue.filter((proc) => proc.name !== item.name));\n return;\n }\n setAddingFrequentId(id);\n try {\n const searchResults = await onSearch(item.name);\n const match = findSearchResultByName(searchResults, item.name);\n if (match && !valueRef.current.some((proc) => !proc.is_custom && proc.id === match.id)) {\n onChange([...valueRef.current, mapToProcedure(match)]);\n }\n } finally {\n setAddingFrequentId(null);\n }\n }\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(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',\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 id = String(item.id);\n const isAdded =\n safeValue.some((proc) => !proc.is_custom && proc.id === id) ||\n safeValue.some((proc) => proc.name === item.name);\n const isAdding = addingFrequentId === id;\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={isAdding}\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50',\n isAdding && 'opacity-70 pointer-events-none'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {isAdding ? '…' : item.name}\n </button>\n );\n })\n : [];\n\n return (\n <div className=\"rounded-md overflow-hidden flex flex-col bg-white border border-[#D0D0D0] space-y-3 p-3 h-fit\">\n <div className=\"flex items-center justify-between mb-3\">\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 procedures — one row each */}\n {safeValue.length > 0 && (\n <div className=\"divide-y divide-border rounded-lg border border-border overflow-hidden\">\n {safeValue.map((proc, index) => (\n <div\n key={proc.is_custom ? `custom-${index}` : proc.id}\n className=\"flex items-center justify-between px-3 py-2 bg-white hover:bg-gray-50\"\n >\n <span className=\"text-sm\">{proc.name}</span>\n <button\n type=\"button\"\n onClick={() => removeAt(index)}\n className=\"text-muted-foreground hover:text-red-500 transition-colors cursor-pointer\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Procedure\"\n recentlyUsedSlot={\n frequentItemChips.length > 0\n ? frequentItemChips\n : recentlyUsedChips.length > 0\n ? recentlyUsedChips\n : undefined\n }\n chipSectionLabel={frequentItemChips.length > 0 ? 'Frequently used' : undefined}\n actionSlot={\n <button\n type=\"button\"\n disabled={\n !query.trim() ||\n valueRef.current.some((p) => p.is_custom && p.name === query.trim())\n }\n onClick={handleAddCustom}\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() ||\n valueRef.current.some((p) => p.is_custom && p.name === query.trim())) &&\n 'opacity-40 cursor-not-allowed'\n )}\n >\n Save Procedure\n </button>\n }\n >\n <div className=\"space-y-2\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search for a procedure...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {/* Inline results — no absolute positioning to avoid overflow-clip */}\n {loading && (\n <p className=\"text-xs text-muted-foreground py-1\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"border border-border rounded-md overflow-hidden\">\n {results.map((r) => {\n const isAdding = addingId === r.id;\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleResultClick(r)}\n className={cn(\n 'w-full text-left px-3 py-2 text-sm transition-all duration-300 ease-out border-b border-border last:border-b-0 cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'bg-green-50 border-green-200'\n : 'hover:bg-gray-50'\n )}\n >\n <span className=\"truncate\">{r.name}</span>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n","import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers, useFrequentItems } from '../../react/FormProvider';\nimport { AddProcedureField } from './AddProcedureField';\nimport type { Procedure, ProcedureSearchResult } from './AddProcedureField';\n\nexport const AddProcedureWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const { procedures: frequentProcedures } = useFrequentItems();\n\n const safeValue: Procedure[] = Array.isArray(value) ? (value as Procedure[]) : [];\n\n return (\n <AddProcedureField\n value={safeValue}\n onChange={setValue}\n onSearch={handlers.onSearch as (query: string) => Promise<ProcedureSearchResult[]>}\n recentlyUsed={handlers.recentlyUsed as ProcedureSearchResult[] | undefined}\n frequentItems={frequentProcedures}\n />\n );\n};\n"]}
|
|
@@ -16,6 +16,10 @@ function mapToInvestigation(result) {
|
|
|
16
16
|
fromAI: false
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
+
function findSearchResultByName(searchResults, name) {
|
|
20
|
+
const target = name.trim().toLowerCase();
|
|
21
|
+
return searchResults?.find((r) => r.name.trim().toLowerCase() === target);
|
|
22
|
+
}
|
|
19
23
|
var AddInvestigationField = ({
|
|
20
24
|
label = "Investigations",
|
|
21
25
|
value,
|
|
@@ -102,9 +106,9 @@ var AddInvestigationField = ({
|
|
|
102
106
|
setAddingFrequentId(id);
|
|
103
107
|
try {
|
|
104
108
|
const searchResults = await onSearch(item.name);
|
|
105
|
-
const
|
|
106
|
-
if (
|
|
107
|
-
onChange([...valueRef.current, mapToInvestigation(
|
|
109
|
+
const match = findSearchResultByName(searchResults, item.name);
|
|
110
|
+
if (match && !valueRef.current.some((inv) => inv.id === match.id)) {
|
|
111
|
+
onChange([...valueRef.current, mapToInvestigation(match)]);
|
|
108
112
|
}
|
|
109
113
|
} finally {
|
|
110
114
|
setAddingFrequentId(null);
|
|
@@ -283,5 +287,5 @@ var AddInvestigationField = ({
|
|
|
283
287
|
};
|
|
284
288
|
|
|
285
289
|
exports.AddInvestigationField = AddInvestigationField;
|
|
286
|
-
//# sourceMappingURL=chunk-
|
|
287
|
-
//# sourceMappingURL=chunk-
|
|
290
|
+
//# sourceMappingURL=chunk-IZLKX7GI.cjs.map
|
|
291
|
+
//# sourceMappingURL=chunk-IZLKX7GI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddInvestigationField.tsx"],"names":["useState","useRef","useEffect","jsxs","cn","jsx","Fragment","X","AddEntityDialog","Input","Check"],"mappings":"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","file":"chunk-IZLKX7GI.cjs","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { InvestigationFrequentItem, DiagnosticPackage } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type InvestigationSearchResult = {\n id: string;\n name: string;\n code?: string;\n description?: string;\n categories?: string[];\n synonyms?: string[];\n sample_type?: string;\n method?: string;\n reference_range?: string;\n sample_unit?: string;\n sample_qty?: number;\n turnaround_time?: number;\n preparation?: string;\n service_type?: string;\n department?: string;\n is_vip_enabled?: boolean;\n is_pacs_enabled?: boolean;\n score?: number;\n};\n\nexport type Investigation = InvestigationSearchResult & {\n label: string;\n is_custom: boolean;\n fromAI: boolean;\n};\n\nexport type AddInvestigationFieldProps = {\n label?: string;\n value: Investigation[];\n onChange: (items: Investigation[]) => void;\n onSearch: (query: string) => Promise<InvestigationSearchResult[]>;\n recentlyUsed?: InvestigationSearchResult[];\n frequentItems?: InvestigationFrequentItem[];\n packages?: DiagnosticPackage[];\n};\n\nconst ADD_FEEDBACK_MS = 320;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToInvestigation(result: InvestigationSearchResult): Investigation {\n return {\n ...result,\n label: result.name,\n is_custom: false,\n fromAI: false,\n };\n}\n\nfunction findSearchResultByName(\n searchResults: InvestigationSearchResult[] | undefined,\n name: string,\n): InvestigationSearchResult | undefined {\n const target = name.trim().toLowerCase();\n return searchResults?.find((r) => r.name.trim().toLowerCase() === target);\n}\n\n// function mapFrequentItemToInvestigation(item: InvestigationFrequentItem): Investigation {\n// return {\n// id: String(item.id),\n// name: item.name,\n// code: item.code ?? undefined,\n// label: item.name,\n// is_custom: false,\n// fromAI: false,\n// };\n// }\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddInvestigationField: React.FC<AddInvestigationFieldProps> = ({\n label = 'Investigations',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<InvestigationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingId, setAddingId] = useState<string | null>(null);\n const [addingFrequentId, setAddingFrequentId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const valueRef = useRef<Investigation[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which test IDs were added by each package: packageId → testId[]\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: Investigation[] = Array.isArray(value) ? value : [];\n\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((inv) => inv.id));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingId(null);\n setAddingFrequentId(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 addInvestigation(result: InvestigationSearchResult) {\n if (!addedIds.has(result.id)) {\n onChange([...valueRef.current, mapToInvestigation(result)]);\n }\n setQuery('');\n setResults([]);\n }\n\n function handleResultClick(result: InvestigationSearchResult) {\n if (addedIds.has(result.id)) return;\n setAddingId(result.id);\n setTimeout(() => {\n addInvestigation(result);\n setAddingId(null);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function removeInvestigation(id: string) {\n onChange(safeValue.filter((inv) => inv.id !== id));\n }\n\n function handleRecentlyUsedToggle(result: InvestigationSearchResult) {\n if (addedIds.has(result.id)) {\n removeInvestigation(result.id);\n } else {\n addInvestigation(result);\n }\n }\n\n async function handleFrequentItemToggle(item: InvestigationFrequentItem) {\n const id = String(item.id);\n const addedById = addedIds.has(id);\n const addedByName = safeValue.some((inv) => inv.name === item.name);\n if (addedById || addedByName) {\n if (addedById) removeInvestigation(id);\n else onChange(safeValue.filter((inv) => inv.name !== item.name));\n return;\n }\n setAddingFrequentId(id);\n try {\n const searchResults = await onSearch(item.name);\n const match = findSearchResultByName(searchResults, item.name);\n if (match && !valueRef.current.some((inv) => inv.id === match.id)) {\n onChange([...valueRef.current, mapToInvestigation(match)]);\n }\n } finally {\n setAddingFrequentId(null);\n }\n }\n\n function handlePackageToggle(pkg: DiagnosticPackage) {\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((inv) => !idsToRemove.has(inv.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((inv) => inv.id));\n const newTests = pkg.tests\n .filter((t) => !currentIds.has(t.id))\n .map((t) => mapToInvestigation(t));\n if (newTests.length > 0) {\n onChange([...valueRef.current, ...newTests]);\n }\n addedByPackage.current.set(pkg.id, newTests.map((t) => t.id));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n // ─── Chip builders ────────────────────────────────────────────────────────\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(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',\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 id = String(item.id);\n const isAdded = safeValue.some((inv) => inv.id === id) || safeValue.some((inv) => inv.name === item.name);\n const isAdding = addingFrequentId === id;\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={isAdding}\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50',\n isAdding && 'opacity-70 pointer-events-none'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {isAdding ? '…' : 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',\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.tests.length}\n </span>\n </button>\n );\n });\n\n // ─── Build chip sections ──────────────────────────────────────────────────\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 bg-white border border-[#D0D0D0] space-y-3 p-3 h-fit\">\n <div className=\"flex items-center justify-between mb-3\">\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 investigations — one row each */}\n {safeValue.length > 0 && (\n <div className=\"divide-y divide-border rounded-lg border border-border overflow-hidden\">\n {safeValue.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between px-3 py-2 bg-white hover:bg-gray-50\"\n >\n <span className=\"text-sm\">{inv.name}</span>\n <button\n type=\"button\"\n onClick={() => removeInvestigation(inv.id)}\n className=\"text-muted-foreground hover:text-red-500 transition-colors cursor-pointer\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Investigation\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n >\n <div className=\"space-y-2\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search for an investigation...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {loading && (\n <p className=\"text-xs text-muted-foreground py-1\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"border border-border rounded-md overflow-hidden\">\n {results.map((r) => {\n const isAdding = addingId === r.id;\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleResultClick(r)}\n className={cn(\n 'w-full text-left px-3 py-2 text-sm transition-all duration-300 ease-out border-b border-border last:border-b-0 cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'bg-green-50 border-green-200'\n : 'hover:bg-gray-50'\n )}\n >\n <span className=\"truncate\">{r.name}</span>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
|
|
@@ -14,6 +14,10 @@ function mapToInvestigation(result) {
|
|
|
14
14
|
fromAI: false
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
+
function findSearchResultByName(searchResults, name) {
|
|
18
|
+
const target = name.trim().toLowerCase();
|
|
19
|
+
return searchResults?.find((r) => r.name.trim().toLowerCase() === target);
|
|
20
|
+
}
|
|
17
21
|
var AddInvestigationField = ({
|
|
18
22
|
label = "Investigations",
|
|
19
23
|
value,
|
|
@@ -100,9 +104,9 @@ var AddInvestigationField = ({
|
|
|
100
104
|
setAddingFrequentId(id);
|
|
101
105
|
try {
|
|
102
106
|
const searchResults = await onSearch(item.name);
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
105
|
-
onChange([...valueRef.current, mapToInvestigation(
|
|
107
|
+
const match = findSearchResultByName(searchResults, item.name);
|
|
108
|
+
if (match && !valueRef.current.some((inv) => inv.id === match.id)) {
|
|
109
|
+
onChange([...valueRef.current, mapToInvestigation(match)]);
|
|
106
110
|
}
|
|
107
111
|
} finally {
|
|
108
112
|
setAddingFrequentId(null);
|
|
@@ -281,5 +285,5 @@ var AddInvestigationField = ({
|
|
|
281
285
|
};
|
|
282
286
|
|
|
283
287
|
export { AddInvestigationField };
|
|
284
|
-
//# sourceMappingURL=chunk-
|
|
285
|
-
//# sourceMappingURL=chunk-
|
|
288
|
+
//# sourceMappingURL=chunk-MXY24ZHB.mjs.map
|
|
289
|
+
//# sourceMappingURL=chunk-MXY24ZHB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/AddInvestigationField.tsx"],"names":[],"mappings":"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","file":"chunk-MXY24ZHB.mjs","sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Input } from '../shadcn/input';\nimport { AddEntityDialog } from './AddEntityDialog';\nimport type { InvestigationFrequentItem, DiagnosticPackage } from '../../core/types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type InvestigationSearchResult = {\n id: string;\n name: string;\n code?: string;\n description?: string;\n categories?: string[];\n synonyms?: string[];\n sample_type?: string;\n method?: string;\n reference_range?: string;\n sample_unit?: string;\n sample_qty?: number;\n turnaround_time?: number;\n preparation?: string;\n service_type?: string;\n department?: string;\n is_vip_enabled?: boolean;\n is_pacs_enabled?: boolean;\n score?: number;\n};\n\nexport type Investigation = InvestigationSearchResult & {\n label: string;\n is_custom: boolean;\n fromAI: boolean;\n};\n\nexport type AddInvestigationFieldProps = {\n label?: string;\n value: Investigation[];\n onChange: (items: Investigation[]) => void;\n onSearch: (query: string) => Promise<InvestigationSearchResult[]>;\n recentlyUsed?: InvestigationSearchResult[];\n frequentItems?: InvestigationFrequentItem[];\n packages?: DiagnosticPackage[];\n};\n\nconst ADD_FEEDBACK_MS = 320;\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction mapToInvestigation(result: InvestigationSearchResult): Investigation {\n return {\n ...result,\n label: result.name,\n is_custom: false,\n fromAI: false,\n };\n}\n\nfunction findSearchResultByName(\n searchResults: InvestigationSearchResult[] | undefined,\n name: string,\n): InvestigationSearchResult | undefined {\n const target = name.trim().toLowerCase();\n return searchResults?.find((r) => r.name.trim().toLowerCase() === target);\n}\n\n// function mapFrequentItemToInvestigation(item: InvestigationFrequentItem): Investigation {\n// return {\n// id: String(item.id),\n// name: item.name,\n// code: item.code ?? undefined,\n// label: item.name,\n// is_custom: false,\n// fromAI: false,\n// };\n// }\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport const AddInvestigationField: React.FC<AddInvestigationFieldProps> = ({\n label = 'Investigations',\n value,\n onChange,\n onSearch,\n recentlyUsed = [],\n frequentItems = [],\n packages = [],\n}) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<InvestigationSearchResult[]>([]);\n const [loading, setLoading] = useState(false);\n const [addingId, setAddingId] = useState<string | null>(null);\n const [addingFrequentId, setAddingFrequentId] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const valueRef = useRef<Investigation[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n // tracks which test IDs were added by each package: packageId → testId[]\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: Investigation[] = Array.isArray(value) ? value : [];\n\n valueRef.current = safeValue;\n const addedIds = new Set(safeValue.map((inv) => inv.id));\n\n useEffect(() => {\n if (!open) {\n setQuery('');\n setResults([]);\n setAddingId(null);\n setAddingFrequentId(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 addInvestigation(result: InvestigationSearchResult) {\n if (!addedIds.has(result.id)) {\n onChange([...valueRef.current, mapToInvestigation(result)]);\n }\n setQuery('');\n setResults([]);\n }\n\n function handleResultClick(result: InvestigationSearchResult) {\n if (addedIds.has(result.id)) return;\n setAddingId(result.id);\n setTimeout(() => {\n addInvestigation(result);\n setAddingId(null);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n }, ADD_FEEDBACK_MS);\n }\n\n function removeInvestigation(id: string) {\n onChange(safeValue.filter((inv) => inv.id !== id));\n }\n\n function handleRecentlyUsedToggle(result: InvestigationSearchResult) {\n if (addedIds.has(result.id)) {\n removeInvestigation(result.id);\n } else {\n addInvestigation(result);\n }\n }\n\n async function handleFrequentItemToggle(item: InvestigationFrequentItem) {\n const id = String(item.id);\n const addedById = addedIds.has(id);\n const addedByName = safeValue.some((inv) => inv.name === item.name);\n if (addedById || addedByName) {\n if (addedById) removeInvestigation(id);\n else onChange(safeValue.filter((inv) => inv.name !== item.name));\n return;\n }\n setAddingFrequentId(id);\n try {\n const searchResults = await onSearch(item.name);\n const match = findSearchResultByName(searchResults, item.name);\n if (match && !valueRef.current.some((inv) => inv.id === match.id)) {\n onChange([...valueRef.current, mapToInvestigation(match)]);\n }\n } finally {\n setAddingFrequentId(null);\n }\n }\n\n function handlePackageToggle(pkg: DiagnosticPackage) {\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((inv) => !idsToRemove.has(inv.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((inv) => inv.id));\n const newTests = pkg.tests\n .filter((t) => !currentIds.has(t.id))\n .map((t) => mapToInvestigation(t));\n if (newTests.length > 0) {\n onChange([...valueRef.current, ...newTests]);\n }\n addedByPackage.current.set(pkg.id, newTests.map((t) => t.id));\n setSelectedPackageIds((prev) => new Set(prev).add(pkg.id));\n }\n }\n\n // ─── Chip builders ────────────────────────────────────────────────────────\n\n const recentlyUsedChips = recentlyUsed.map((r) => {\n const isAdded = addedIds.has(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',\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 id = String(item.id);\n const isAdded = safeValue.some((inv) => inv.id === id) || safeValue.some((inv) => inv.name === item.name);\n const isAdding = addingFrequentId === id;\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={isAdding}\n onClick={() => handleFrequentItemToggle(item)}\n className={cn(\n 'rounded-full border text-xs px-3 py-1 transition-colors',\n isAdded\n ? 'border-green-300 bg-green-50 text-green-700'\n : 'border-border bg-white hover:bg-gray-50',\n isAdding && 'opacity-70 pointer-events-none'\n )}\n >\n {isAdded && <span className=\"mr-1\">✓</span>}\n {isAdding ? '…' : 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',\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.tests.length}\n </span>\n </button>\n );\n });\n\n // ─── Build chip sections ──────────────────────────────────────────────────\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 bg-white border border-[#D0D0D0] space-y-3 p-3 h-fit\">\n <div className=\"flex items-center justify-between mb-3\">\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 investigations — one row each */}\n {safeValue.length > 0 && (\n <div className=\"divide-y divide-border rounded-lg border border-border overflow-hidden\">\n {safeValue.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center justify-between px-3 py-2 bg-white hover:bg-gray-50\"\n >\n <span className=\"text-sm\">{inv.name}</span>\n <button\n type=\"button\"\n onClick={() => removeInvestigation(inv.id)}\n className=\"text-muted-foreground hover:text-red-500 transition-colors cursor-pointer\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Dialog */}\n <AddEntityDialog\n open={open}\n onClose={() => setOpen(false)}\n title=\"Add Investigation\"\n chipSections={chipSections.length > 0 ? chipSections : undefined}\n >\n <div className=\"space-y-2\">\n <Input\n ref={searchInputRef}\n value={query}\n onChange={(e) => handleQueryChange(e.target.value)}\n placeholder=\"Search for an investigation...\"\n className=\"border border-border rounded-md focus-visible:ring-0\"\n />\n\n {loading && (\n <p className=\"text-xs text-muted-foreground py-1\">Searching…</p>\n )}\n {!loading && results.length > 0 && (\n <div className=\"border border-border rounded-md overflow-hidden\">\n {results.map((r) => {\n const isAdding = addingId === r.id;\n return (\n <button\n key={r.id}\n type=\"button\"\n onClick={() => handleResultClick(r)}\n className={cn(\n 'w-full text-left px-3 py-2 text-sm transition-all duration-300 ease-out border-b border-border last:border-b-0 cursor-pointer flex items-center justify-between gap-2',\n isAdding\n ? 'bg-green-50 border-green-200'\n : 'hover:bg-gray-50'\n )}\n >\n <span className=\"truncate\">{r.name}</span>\n {isAdding && <Check className=\"h-4 w-4 shrink-0 text-green-600\" />}\n </button>\n );\n })}\n </div>\n )}\n </div>\n </AddEntityDialog>\n </div>\n );\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -9,7 +9,7 @@ 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
11
|
var chunkAIZ3XYEZ_cjs = require('./chunk-AIZ3XYEZ.cjs');
|
|
12
|
-
var
|
|
12
|
+
var chunkIZLKX7GI_cjs = require('./chunk-IZLKX7GI.cjs');
|
|
13
13
|
require('./chunk-E7WUDHSA.cjs');
|
|
14
14
|
var chunkS7EMPE2D_cjs = require('./chunk-S7EMPE2D.cjs');
|
|
15
15
|
var chunkUGGUIXUS_cjs = require('./chunk-UGGUIXUS.cjs');
|
|
@@ -954,6 +954,7 @@ function Upload3({
|
|
|
954
954
|
onChange,
|
|
955
955
|
className,
|
|
956
956
|
formatsLabel,
|
|
957
|
+
label,
|
|
957
958
|
placeholder = "Upload File",
|
|
958
959
|
beforeUploadContent,
|
|
959
960
|
id: idProp,
|
|
@@ -1008,11 +1009,7 @@ function Upload3({
|
|
|
1008
1009
|
count === 1 ? "" : "s",
|
|
1009
1010
|
" selected"
|
|
1010
1011
|
] }) : beforeUploadContent ? beforeUploadContent : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center", children: [
|
|
1011
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1012
|
-
"Upload your surgery prescription",
|
|
1013
|
-
/* @__PURE__ */ jsxRuntime.jsx("br", {}),
|
|
1014
|
-
"and medical records"
|
|
1015
|
-
] }),
|
|
1012
|
+
label ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-black font-normal leading-[120%] tracking-[-0.28px] text-center whitespace-pre-line", children: label }) : null,
|
|
1016
1013
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Upload, { size: 20, className: "text-[#727272] mt-4" }),
|
|
1017
1014
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs mt-1 text-text-shades-2", children: placeholder }),
|
|
1018
1015
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 text-10px leading-[140%] text-[#989898]", children: [
|
|
@@ -1193,6 +1190,7 @@ var FormFileUploadWidget = ({
|
|
|
1193
1190
|
onChange: handleChange,
|
|
1194
1191
|
disabled: disabled || isUploading,
|
|
1195
1192
|
listLayout,
|
|
1193
|
+
label: fieldDef.label,
|
|
1196
1194
|
placeholder: isUploading ? "Uploading..." : def.uploadPlaceholder ?? "Upload File",
|
|
1197
1195
|
formatsLabel: def.uploadFormats,
|
|
1198
1196
|
className: chunk5E3APMY6_cjs.fieldControlClass(
|
|
@@ -2193,8 +2191,8 @@ var DateTimeWidget = lazyNamed(() => import('./DateTimeWidget-RJ7SATVA.cjs'), "D
|
|
|
2193
2191
|
var EditableTableWidget = lazyNamed(() => import('./EditableTable-OW5LC6OC.cjs'), "EditableTableWidget");
|
|
2194
2192
|
var AddMedicationWidget = lazyNamed(() => import('./AddMedicationWidget-45T4XVEL.cjs'), "AddMedicationWidget");
|
|
2195
2193
|
var DischargeMedicationOrdersWidget = lazyNamed(() => import('./DischargeMedicationOrdersWidget-WRJRYL6F.cjs'), "DischargeMedicationOrdersWidget");
|
|
2196
|
-
var AddInvestigationWidget = lazyNamed(() => import('./AddInvestigationWidget-
|
|
2197
|
-
var AddProcedureWidget = lazyNamed(() => import('./AddProcedureWidget-
|
|
2194
|
+
var AddInvestigationWidget = lazyNamed(() => import('./AddInvestigationWidget-MSY4VSQZ.cjs'), "AddInvestigationWidget");
|
|
2195
|
+
var AddProcedureWidget = lazyNamed(() => import('./AddProcedureWidget-QUNDIZGR.cjs'), "AddProcedureWidget");
|
|
2198
2196
|
var DifferentialDiagnosisWidget = lazyNamed(() => import('./DifferentialDiagnosisWidget-XESNHNQQ.cjs'), "DifferentialDiagnosisWidget");
|
|
2199
2197
|
var VitalsWidget = lazyNamed(() => import('./VitalsWidget-MS3OOZSW.cjs'), "VitalsWidget");
|
|
2200
2198
|
var HiddenVitalsWidget = lazyNamed(() => import('./HiddenVitalsWidget-5GFBDDPT.cjs'), "HiddenVitalsWidget");
|
|
@@ -3977,7 +3975,7 @@ Object.defineProperty(exports, "AddMedicationField", {
|
|
|
3977
3975
|
});
|
|
3978
3976
|
Object.defineProperty(exports, "AddInvestigationField", {
|
|
3979
3977
|
enumerable: true,
|
|
3980
|
-
get: function () { return
|
|
3978
|
+
get: function () { return chunkIZLKX7GI_cjs.AddInvestigationField; }
|
|
3981
3979
|
});
|
|
3982
3980
|
Object.defineProperty(exports, "DifferentialDiagnosis", {
|
|
3983
3981
|
enumerable: true,
|