@eka-care/medical-records-ui 1.0.32 → 1.0.34
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/{OriginalRecordPanel-A22BG3QL.js → OriginalRecordPanel-2PBQASS3.js} +23 -25
- package/dist/OriginalRecordPanel-2PBQASS3.js.map +1 -0
- package/dist/{OriginalRecordPanel-LMKGQHTO.mjs → OriginalRecordPanel-AK5IPYPP.mjs} +8 -10
- package/dist/OriginalRecordPanel-AK5IPYPP.mjs.map +1 -0
- package/dist/SmartUploadModal-LZT55L2J.mjs +9 -0
- package/dist/SmartUploadModal-M3WQRFO4.js +9 -0
- package/dist/{SmartUploadModal-OD6BX2QW.js.map → SmartUploadModal-M3WQRFO4.js.map} +1 -1
- package/dist/VitalHistoryPanel-22QMSV5Q.js +10 -0
- package/dist/{VitalHistoryPanel-Z7ZB4W46.js.map → VitalHistoryPanel-22QMSV5Q.js.map} +1 -1
- package/dist/VitalHistoryPanel-J2TPULMP.mjs +10 -0
- package/dist/{chunk-4Y2ERGKG.js → chunk-2ZBMMIHZ.js} +4 -4
- package/dist/chunk-2ZBMMIHZ.js.map +1 -0
- package/dist/{chunk-INY7LTUM.js → chunk-3NAIW2AJ.js} +16 -16
- package/dist/{chunk-INY7LTUM.js.map → chunk-3NAIW2AJ.js.map} +1 -1
- package/dist/{chunk-AI54RJVT.mjs → chunk-AQHSSUEC.mjs} +3 -3
- package/dist/{chunk-DK66MUOK.mjs → chunk-BIN5FHTM.mjs} +3 -3
- package/dist/{chunk-4YPFI2TD.mjs → chunk-LH2G6KKA.mjs} +2 -2
- package/dist/{chunk-SXNVBIGI.mjs → chunk-U3WP4DEG.mjs} +4 -2
- package/dist/chunk-U3WP4DEG.mjs.map +1 -0
- package/dist/{chunk-JFLECNMK.js → chunk-UQNOD5EC.js} +4 -2
- package/dist/chunk-UQNOD5EC.js.map +1 -0
- package/dist/{chunk-TXH2CZMG.mjs → chunk-V2S4XGEO.mjs} +2 -2
- package/dist/chunk-V2S4XGEO.mjs.map +1 -0
- package/dist/{chunk-AJ3HP2ZE.js → chunk-YHPGVJ7P.js} +7 -7
- package/dist/{chunk-AJ3HP2ZE.js.map → chunk-YHPGVJ7P.js.map} +1 -1
- package/dist/{chunk-ZJUTZJMZ.js → chunk-YQFYORNE.js} +21 -21
- package/dist/{chunk-ZJUTZJMZ.js.map → chunk-YQFYORNE.js.map} +1 -1
- package/dist/index.css +7 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +2 -10
- package/dist/index.d.ts +2 -10
- package/dist/index.js +127 -142
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -59
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +7 -0
- package/dist/styles.css.map +1 -1
- package/dist/{widgets-AXVBGZWJ.mjs → widgets-2WXR34ER.mjs} +2 -2
- package/dist/widgets-RRTL4XCO.js +43 -0
- package/dist/{widgets-4ZOUXM33.js.map → widgets-RRTL4XCO.js.map} +1 -1
- package/package.json +2 -2
- package/dist/OriginalRecordPanel-A22BG3QL.js.map +0 -1
- package/dist/OriginalRecordPanel-LMKGQHTO.mjs.map +0 -1
- package/dist/SmartUploadModal-3RRNSNWK.mjs +0 -9
- package/dist/SmartUploadModal-OD6BX2QW.js +0 -9
- package/dist/VitalHistoryPanel-RR7PLR2G.mjs +0 -10
- package/dist/VitalHistoryPanel-Z7ZB4W46.js +0 -10
- package/dist/chunk-4Y2ERGKG.js.map +0 -1
- package/dist/chunk-JFLECNMK.js.map +0 -1
- package/dist/chunk-SXNVBIGI.mjs.map +0 -1
- package/dist/chunk-TXH2CZMG.mjs.map +0 -1
- package/dist/widgets-4ZOUXM33.js +0 -43
- /package/dist/{SmartUploadModal-3RRNSNWK.mjs.map → SmartUploadModal-LZT55L2J.mjs.map} +0 -0
- /package/dist/{VitalHistoryPanel-RR7PLR2G.mjs.map → VitalHistoryPanel-J2TPULMP.mjs.map} +0 -0
- /package/dist/{chunk-AI54RJVT.mjs.map → chunk-AQHSSUEC.mjs.map} +0 -0
- /package/dist/{chunk-DK66MUOK.mjs.map → chunk-BIN5FHTM.mjs.map} +0 -0
- /package/dist/{chunk-4YPFI2TD.mjs.map → chunk-LH2G6KKA.mjs.map} +0 -0
- /package/dist/{widgets-AXVBGZWJ.mjs.map → widgets-2WXR34ER.mjs.map} +0 -0
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkYHPGVJ7Pjs = require('./chunk-YHPGVJ7P.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunk2ZBMMIHZjs = require('./chunk-2ZBMMIHZ.js');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _chunkUQNOD5ECjs = require('./chunk-UQNOD5EC.js');
|
|
16
16
|
|
|
17
17
|
// src/views/components/shared/OriginalRecordPanel.tsx
|
|
18
18
|
var _react = require('react');
|
|
@@ -36,13 +36,12 @@ function OriginalRecordPanel({
|
|
|
36
36
|
caseId,
|
|
37
37
|
onBack
|
|
38
38
|
}) {
|
|
39
|
-
const { store } =
|
|
39
|
+
const { store } = _chunkUQNOD5ECjs.useSdk.call(void 0, );
|
|
40
40
|
const record = _zustand.useStore.call(void 0, store, (s) => s.records.byId[recordId]);
|
|
41
41
|
const recordsById = _zustand.useStore.call(void 0, store, (s) => s.records.byId);
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const {
|
|
45
|
-
const { status: vitalsStatus, table } = _chunkAJ3HP2ZEjs.useRecordPanelTable.call(void 0,
|
|
42
|
+
const preview = _chunk2ZBMMIHZjs.useRecordPreview.call(void 0, recordId);
|
|
43
|
+
const { openOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } = _chunk2ZBMMIHZjs.useSmartRecordsActions.call(void 0, );
|
|
44
|
+
const { status: vitalsStatus, table } = _chunkYHPGVJ7Pjs.useRecordPanelTable.call(void 0,
|
|
46
45
|
_optionalChain([record, 'optionalAccess', _3 => _3.isSmart]) ? recordId : null
|
|
47
46
|
);
|
|
48
47
|
const [smartPanelOpen, setSmartPanelOpen] = _react.useState.call(void 0, true);
|
|
@@ -136,7 +135,7 @@ function OriginalRecordPanel({
|
|
|
136
135
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel", children: [
|
|
137
136
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel-header", children: [
|
|
138
137
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
139
|
-
|
|
138
|
+
_chunkUQNOD5ECjs.IconButton,
|
|
140
139
|
{
|
|
141
140
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft, { size: 16, "aria-hidden": true }),
|
|
142
141
|
label: "Back",
|
|
@@ -205,7 +204,6 @@ function OriginalRecordPanel({
|
|
|
205
204
|
" FOUND IN THIS ENCOUNTER"
|
|
206
205
|
] }),
|
|
207
206
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__dropdown-list", children: caseRecords.map((r) => {
|
|
208
|
-
const meta = _nullishCoalesce(vitalsMetaById[r.id], () => ( null));
|
|
209
207
|
const isActive = r.id === recordId;
|
|
210
208
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
211
209
|
"button",
|
|
@@ -217,7 +215,7 @@ function OriginalRecordPanel({
|
|
|
217
215
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-icon", children: [
|
|
218
216
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.File, { size: 16, "aria-hidden": true }),
|
|
219
217
|
r.isSmart && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
220
|
-
|
|
218
|
+
_chunkYHPGVJ7Pjs.SmartSparkles_default,
|
|
221
219
|
{
|
|
222
220
|
className: "mr-orig__dropdown-smart-dot",
|
|
223
221
|
"aria-label": "Smart report"
|
|
@@ -228,23 +226,23 @@ function OriginalRecordPanel({
|
|
|
228
226
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-title-row", children: [
|
|
229
227
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__dropdown-title", children: r.title }),
|
|
230
228
|
r.isSmart && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-orig__dropdown-smart-badge", children: [
|
|
231
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
229
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYHPGVJ7Pjs.SmartSparkles_default, { "aria-hidden": true }),
|
|
232
230
|
"Smart Report"
|
|
233
231
|
] })
|
|
234
232
|
] }),
|
|
235
233
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-meta", children: [
|
|
236
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children:
|
|
237
|
-
|
|
234
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkUQNOD5ECjs.epochToDisplay.call(void 0, r.createdAtEpoch) }),
|
|
235
|
+
r.isSmart && r.totalVitals > 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
238
236
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__dropdown-dot", children: "\xB7" }),
|
|
239
237
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
|
|
240
|
-
|
|
238
|
+
r.totalVitals,
|
|
241
239
|
" vitals"
|
|
242
240
|
] })
|
|
243
241
|
] }),
|
|
244
|
-
|
|
242
|
+
r.isSmart && r.outOfRangeVitals > 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
245
243
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__dropdown-dot", children: "\xB7" }),
|
|
246
244
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-orig__dropdown-oor", children: [
|
|
247
|
-
|
|
245
|
+
r.outOfRangeVitals,
|
|
248
246
|
" out of range"
|
|
249
247
|
] })
|
|
250
248
|
] })
|
|
@@ -265,8 +263,8 @@ function OriginalRecordPanel({
|
|
|
265
263
|
}) })
|
|
266
264
|
] })
|
|
267
265
|
] }) : record ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel-info", children: [
|
|
268
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
269
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
266
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUQNOD5ECjs.Typography, { variant: "label", as: "span", className: "mr-sv__panel-name", children: record.title }),
|
|
267
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUQNOD5ECjs.Typography, { variant: "hint", as: "span", className: "mr-sv__panel-meta-text", children: _chunkUQNOD5ECjs.epochToDisplay.call(void 0, record.createdAtEpoch) })
|
|
270
268
|
] }) : null,
|
|
271
269
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__header-actions", children: [
|
|
272
270
|
isSmart && !smartPanelOpen && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
@@ -276,13 +274,13 @@ function OriginalRecordPanel({
|
|
|
276
274
|
className: "mr-orig__show-smart-btn",
|
|
277
275
|
onClick: () => setSmartPanelOpen(true),
|
|
278
276
|
children: [
|
|
279
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
277
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYHPGVJ7Pjs.SmartSparkles_default, { "aria-hidden": true }),
|
|
280
278
|
"Smart Report"
|
|
281
279
|
]
|
|
282
280
|
}
|
|
283
281
|
),
|
|
284
282
|
hasPreview && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
285
|
-
|
|
283
|
+
_chunkUQNOD5ECjs.IconButton,
|
|
286
284
|
{
|
|
287
285
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ExternalLink, { size: 16, "aria-hidden": true }),
|
|
288
286
|
label: "Open in new tab",
|
|
@@ -311,8 +309,8 @@ function OriginalRecordPanel({
|
|
|
311
309
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { size: 44, className: "mr-sv__loading-spinner", "aria-hidden": true })
|
|
312
310
|
}
|
|
313
311
|
),
|
|
314
|
-
preview.status === "error" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
315
|
-
preview.status === "loaded" && preview.files.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
312
|
+
preview.status === "error" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUQNOD5ECjs.Typography, { variant: "muted", className: "mr-sv__panel-empty", children: "Failed to load document preview." }),
|
|
313
|
+
preview.status === "loaded" && preview.files.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUQNOD5ECjs.Typography, { variant: "muted", className: "mr-sv__panel-empty", children: "No preview available for this record." }),
|
|
316
314
|
hasPreview && !isSmart && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
317
315
|
"div",
|
|
318
316
|
{
|
|
@@ -392,7 +390,7 @@ function OriginalRecordPanel({
|
|
|
392
390
|
"aria-hidden": true
|
|
393
391
|
}
|
|
394
392
|
) }),
|
|
395
|
-
vitalsStatus === "loaded" && filteredRows.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
393
|
+
vitalsStatus === "loaded" && filteredRows.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUQNOD5ECjs.Typography, { variant: "muted", className: "mr-orig__smart-empty", children: "No vitals match." }),
|
|
396
394
|
vitalsStatus === "loaded" && filteredRows.map((row, idx) => {
|
|
397
395
|
const cell = row.cells[0];
|
|
398
396
|
const isOor = row.latestStatus === "high" || row.latestStatus === "low";
|
|
@@ -501,4 +499,4 @@ function OriginalRecordPanel({
|
|
|
501
499
|
|
|
502
500
|
|
|
503
501
|
exports.OriginalRecordPanel = OriginalRecordPanel;
|
|
504
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
502
|
+
//# sourceMappingURL=OriginalRecordPanel-2PBQASS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/OriginalRecordPanel-2PBQASS3.js","../src/views/components/shared/OriginalRecordPanel.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/medical-records-ui/medical-records-ui/dist/OriginalRecordPanel-2PBQASS3.js","sourcesContent":[null,"\"use client\";\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, ExternalLink, Check, File, LoaderCircle, Search } from \"lucide-react\";\nimport { useStore } from \"zustand\";\nimport { useSdk } from \"../../../connection/useSdk\";\nimport { useRecordPreview } from \"../../../connection/useRecordPreview\";\nimport { useRecordPanelTable } from \"../../hooks/care-panel/useRecordPanelTable\";\nimport { epochToDisplay } from \"../../../helpers/formatters\";\nimport { useSmartRecordsActions } from \"../../context/SmartRecordsActionsContext\";\nimport { IconButton, Typography } from \"widgets\";\nimport type { RecordItem } from \"../../../helpers\";\nimport type { PanelRow } from \"../../../helpers/vitalsPanel\";\nimport SmartSparkles from \"icons/SmartSparkles\";\n\nconst DocumentViewer = lazy(() =>\n import(\"../../RecordPreview/DocumentViewer\").then((m) => ({\n default: m.DocumentViewer,\n })),\n);\n\ninterface OriginalRecordPanelProps {\n recordId: string;\n caseId?: string;\n onBack: () => void;\n}\n\ntype SrTab = \"all\" | \"oor\" | \"none\";\n\nfunction buildVitalsText(rows: PanelRow[]): string {\n return rows\n .map((r) => {\n const cell = r.cells[0];\n const ref = cell?.refRange ? ` (Ref: ${cell.refRange})` : \"\";\n return `${r.name}: ${cell?.value ?? \"—\"} ${r.unit}${ref}`;\n })\n .join(\"\\n\");\n}\n\nexport function OriginalRecordPanel({\n recordId,\n caseId,\n onBack,\n}: OriginalRecordPanelProps) {\n const { store } = useSdk();\n const record = useStore(store, (s) => s.records.byId[recordId]);\n const recordsById = useStore(store, (s) => s.records.byId);\n const preview = useRecordPreview(recordId);\n const { openOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } =\n useSmartRecordsActions();\n\n // Smart report vitals (only fetched when record.isSmart)\n const { status: vitalsStatus, table } = useRecordPanelTable(\n record?.isSmart ? recordId : null,\n );\n const [smartPanelOpen, setSmartPanelOpen] = useState(true);\n const [srSearch, setSrSearch] = useState(\"\");\n const [srTab, setSrTab] = useState<SrTab>(\"all\");\n const [srSelected, setSrSelected] = useState<Set<string>>(new Set());\n const srCopyBtnRef = useRef<HTMLButtonElement>(null);\n\n // Dropdown state\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n const handler = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [dropdownOpen]);\n\n const caseRecords = useMemo<RecordItem[]>(() => {\n if (!caseId) return [];\n return Object.values(recordsById)\n .filter((r): r is RecordItem => r != null && r.cases.includes(caseId))\n .sort((a, b) => b.createdAtEpoch - a.createdAtEpoch);\n }, [recordsById, caseId]);\n\n const currentIndex = caseRecords.findIndex((r) => r.id === recordId);\n const total = caseRecords.length;\n\n const goTo = useCallback(\n (r: RecordItem) => {\n setDropdownOpen(false);\n openOriginal(r.id, \"smart\", undefined, caseId);\n },\n [openOriginal, caseId],\n );\n\n const showNavPicker = caseId && total > 0;\n\n // Smart report vitals filtering\n const allRows = table.rows;\n const oorRows = useMemo(\n () => allRows.filter((r) => r.latestStatus === \"high\" || r.latestStatus === \"low\"),\n [allRows],\n );\n const noInterpRows = useMemo(\n () => allRows.filter((r) => r.latestStatus === \"unknown\"),\n [allRows],\n );\n\n const baseRows = srTab === \"oor\" ? oorRows : srTab === \"none\" ? noInterpRows : allRows;\n\n const filteredRows = useMemo(() => {\n if (!srSearch) return baseRows;\n const q = srSearch.toLowerCase();\n return baseRows.filter((r) => r.name.toLowerCase().includes(q));\n }, [baseRows, srSearch]);\n\n const tabCounts = useMemo(() => {\n if (!srSearch) return { all: allRows.length, oor: oorRows.length, none: noInterpRows.length };\n const q = srSearch.toLowerCase();\n return {\n all: allRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n oor: oorRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n none: noInterpRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n };\n }, [srSearch, allRows, oorRows, noInterpRows]);\n\n useEffect(() => {\n setSrSelected(new Set());\n }, [srTab, srSearch]);\n\n const srAllSelected =\n filteredRows.length > 0 && filteredRows.every((r) => srSelected.has(r.key));\n const srSomeSelected = srSelected.size > 0;\n\n const toggleSrRow = useCallback((key: string) => {\n setSrSelected((prev) => {\n const next = new Set(prev);\n next.has(key) ? next.delete(key) : next.add(key);\n return next;\n });\n }, []);\n\n const toggleSrAll = useCallback(() => {\n setSrSelected(\n srAllSelected ? new Set() : new Set(filteredRows.map((r) => r.key)),\n );\n }, [srAllSelected, filteredRows]);\n\n const handleSrCopyToNote = useCallback(() => {\n const selectedRows = filteredRows.filter((r) => srSelected.has(r.key));\n if (!selectedRows.length) return;\n const text = buildVitalsText(selectedRows);\n if (onCopyVitalsToNote) {\n void onCopyVitalsToNote(text);\n } else if (onCopyToNote) {\n const rect = srCopyBtnRef.current?.getBoundingClientRect();\n void onCopyToNote(\n text,\n rect ? { x: rect.left + rect.width / 2, y: rect.bottom } : undefined,\n );\n }\n }, [filteredRows, srSelected, onCopyVitalsToNote, onCopyToNote]);\n\n const isSmart = record?.isSmart ?? false;\n const hasPreview = preview.status === \"loaded\" && preview.files.length > 0;\n\n return (\n <div className=\"mr-sv__panel\">\n <div className=\"mr-sv__panel-header\">\n <IconButton\n icon={<ChevronLeft size={16} aria-hidden />}\n label=\"Back\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n />\n\n {showNavPicker ? (\n <div className=\"mr-orig__nav-wrap\" ref={dropdownRef}>\n <div\n className={`mr-orig__nav-pill${dropdownOpen ? \" mr-orig__nav-pill--open\" : \"\"}`}\n role=\"button\"\n tabIndex={0}\n onClick={() => setDropdownOpen((v) => !v)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setDropdownOpen((v) => !v);\n }\n }}\n >\n <button\n type=\"button\"\n className=\"mr-orig__nav-chevron\"\n onClick={(e) => {\n e.stopPropagation();\n setDropdownOpen((v) => !v);\n }}\n aria-label=\"Show records\"\n >\n <ChevronLeft size={14} aria-hidden />\n </button>\n <div className=\"mr-orig__nav-text\">\n <span className=\"mr-orig__nav-title\">{record?.title ?? \"Record\"}</span>\n <span className=\"mr-orig__nav-counter\">\n {currentIndex + 1} of {total}\n </span>\n </div>\n <button\n type=\"button\"\n className=\"mr-orig__nav-chevron\"\n onClick={(e) => {\n e.stopPropagation();\n setDropdownOpen((v) => !v);\n }}\n aria-label=\"Show records\"\n >\n <ChevronRight size={14} aria-hidden />\n </button>\n </div>\n\n {dropdownOpen && (\n <div className=\"mr-orig__dropdown\">\n <div className=\"mr-orig__dropdown-eyebrow\">\n {total} RECORD{total !== 1 ? \"S\" : \"\"} FOUND IN THIS ENCOUNTER\n </div>\n <div className=\"mr-orig__dropdown-list\">\n {caseRecords.map((r) => {\n const isActive = r.id === recordId;\n return (\n <button\n key={r.id}\n type=\"button\"\n className={`mr-orig__dropdown-item${isActive ? \" mr-orig__dropdown-item--active\" : \"\"}`}\n onClick={() => goTo(r)}\n >\n <div className=\"mr-orig__dropdown-icon\">\n <File size={16} aria-hidden />\n {r.isSmart && (\n <SmartSparkles\n className=\"mr-orig__dropdown-smart-dot\"\n aria-label=\"Smart report\"\n />\n )}\n </div>\n <div className=\"mr-orig__dropdown-info\">\n <div className=\"mr-orig__dropdown-title-row\">\n <span className=\"mr-orig__dropdown-title\">{r.title}</span>\n {r.isSmart && (\n <span className=\"mr-orig__dropdown-smart-badge\">\n <SmartSparkles aria-hidden />\n Smart Report\n </span>\n )}\n </div>\n <div className=\"mr-orig__dropdown-meta\">\n <span>{epochToDisplay(r.createdAtEpoch)}</span>\n {r.isSmart && r.totalVitals > 0 && (\n <>\n <span className=\"mr-orig__dropdown-dot\">·</span>\n <span>{r.totalVitals} vitals</span>\n </>\n )}\n {r.isSmart && r.outOfRangeVitals > 0 && (\n <>\n <span className=\"mr-orig__dropdown-dot\">·</span>\n <span className=\"mr-orig__dropdown-oor\">\n {r.outOfRangeVitals} out of range\n </span>\n </>\n )}\n </div>\n </div>\n {isActive && (\n <Check\n size={14}\n className=\"mr-orig__dropdown-check\"\n aria-hidden\n />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n ) : record ? (\n <div className=\"mr-sv__panel-info\">\n <Typography variant=\"label\" as=\"span\" className=\"mr-sv__panel-name\">\n {record.title}\n </Typography>\n <Typography variant=\"hint\" as=\"span\" className=\"mr-sv__panel-meta-text\">\n {epochToDisplay(record.createdAtEpoch)}\n </Typography>\n </div>\n ) : null}\n\n <div className=\"mr-orig__header-actions\">\n {isSmart && !smartPanelOpen && (\n <button\n type=\"button\"\n className=\"mr-orig__show-smart-btn\"\n onClick={() => setSmartPanelOpen(true)}\n >\n <SmartSparkles aria-hidden />\n Smart Report\n </button>\n )}\n {hasPreview && (\n <IconButton\n icon={<ExternalLink size={16} aria-hidden />}\n label=\"Open in new tab\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n window.open(preview.files[0].url, \"_blank\", \"noopener,noreferrer\")\n }\n />\n )}\n </div>\n </div>\n\n <div\n className=\"mr-sv__panel-body\"\n style={{ flex: 1, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}\n >\n {preview.status === \"loading\" && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n <LoaderCircle size={44} className=\"mr-sv__loading-spinner\" aria-hidden />\n </div>\n )}\n {preview.status === \"error\" && (\n <Typography variant=\"muted\" className=\"mr-sv__panel-empty\">\n Failed to load document preview.\n </Typography>\n )}\n {preview.status === \"loaded\" && preview.files.length === 0 && (\n <Typography variant=\"muted\" className=\"mr-sv__panel-empty\">\n No preview available for this record.\n </Typography>\n )}\n\n {/* Non-smart: full-width PDF */}\n {hasPreview && !isSmart && (\n <div\n className=\"mr-record-preview__body\"\n style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}\n >\n <Suspense fallback={null}>\n <DocumentViewer\n files={preview.files}\n title={record?.title ?? \"\"}\n isHtml={preview.isHtml}\n />\n </Suspense>\n </div>\n )}\n\n {/* Smart: split view — PDF left, smart report panel right */}\n {hasPreview && isSmart && (\n <div className=\"mr-orig__split\">\n <div className=\"mr-orig__pdf-side\">\n <Suspense fallback={null}>\n <DocumentViewer\n files={preview.files}\n title={record?.title ?? \"\"}\n isHtml={preview.isHtml}\n />\n </Suspense>\n </div>\n\n {smartPanelOpen && (\n <div className=\"mr-orig__smart-side\">\n {/* Header */}\n <div className=\"mr-orig__smart-hdr\">\n <span className=\"mr-orig__smart-title\">Smart Report</span>\n <button\n type=\"button\"\n className=\"mr-orig__smart-collapse-btn\"\n aria-label=\"Collapse smart report panel\"\n onClick={() => setSmartPanelOpen(false)}\n >\n <ChevronRight size={16} aria-hidden />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"mr-orig__smart-search\">\n <Search size={14} aria-hidden className=\"mr-orig__smart-search-icon\" />\n <input\n type=\"text\"\n className=\"mr-orig__smart-search-input\"\n placeholder=\"Search vitals\"\n value={srSearch}\n onChange={(e) => setSrSearch(e.target.value)}\n />\n </div>\n\n {/* Filter tabs */}\n <div className=\"mr-orig__smart-tabs-wrap\">\n <div className=\"mr-orig__smart-tabs\">\n {([\"all\", \"oor\", \"none\"] as SrTab[]).map((tab) => {\n const count =\n tab === \"all\"\n ? tabCounts.all\n : tab === \"oor\"\n ? tabCounts.oor\n : tabCounts.none;\n const label =\n tab === \"all\"\n ? \"All\"\n : tab === \"oor\"\n ? \"Out of range\"\n : \"No interpretation\";\n return (\n <button\n key={tab}\n type=\"button\"\n className={`mr-orig__smart-tab${srTab === tab ? \" mr-orig__smart-tab--active\" : \"\"}`}\n onClick={() => setSrTab(tab)}\n >\n {label} ({count})\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Vital list */}\n <div className=\"mr-orig__smart-list\">\n {vitalsStatus === \"loading\" && (\n <div className=\"mr-orig__smart-loading\">\n <LoaderCircle\n size={20}\n className=\"mr-sv__loading-spinner\"\n aria-hidden\n />\n </div>\n )}\n {vitalsStatus === \"loaded\" && filteredRows.length === 0 && (\n <Typography variant=\"muted\" className=\"mr-orig__smart-empty\">\n No vitals match.\n </Typography>\n )}\n {vitalsStatus === \"loaded\" &&\n filteredRows.map((row, idx) => {\n const cell = row.cells[0];\n const isOor =\n row.latestStatus === \"high\" || row.latestStatus === \"low\";\n const isSelected = srSelected.has(row.key);\n const isLast = idx === filteredRows.length - 1;\n return (\n <div\n key={row.key}\n className={`mr-orig__vital-item${isLast ? \" mr-orig__vital-item--last\" : \"\"}`}\n >\n <div\n className={`mr-orig__vital-row${srSomeSelected ? \" mr-orig__vital-row--selectable\" : \"\"}${isSelected ? \" mr-orig__vital-row--selected\" : \"\"}`}\n onClick={srSomeSelected ? () => toggleSrRow(row.key) : undefined}\n >\n <span\n className={`mr-sv__checkbox mr-cc-table__row-check${isSelected ? \" mr-sv__checkbox--checked\" : \"\"}`}\n role=\"checkbox\"\n aria-checked={isSelected}\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n toggleSrRow(row.key);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n toggleSrRow(row.key);\n }\n }}\n >\n {isSelected && <Check size={10} strokeWidth={3} />}\n </span>\n <div className=\"mr-orig__vital-info\">\n <span className=\"mr-orig__vital-name\">{row.name}</span>\n {row.refRange && (\n <span className=\"mr-orig__vital-ref\">\n Ref {row.refRange}\n </span>\n )}\n </div>\n {cell && (\n <div className=\"mr-orig__vital-value\">\n <span\n className={`mr-orig__vital-val${isOor ? \" mr-orig__vital-val--oor\" : \"\"}`}\n >\n {cell.value}\n </span>\n {cell.unit && (\n <span className=\"mr-orig__vital-unit\">{cell.unit}</span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\n {srSomeSelected && (\n <div className=\"mr-cc-table__footer\">\n <span\n className={`mr-sv__checkbox mr-cc-table__footer-check${srAllSelected ? \" mr-sv__checkbox--checked\" : \"\"}`}\n role=\"checkbox\"\n aria-checked={srAllSelected}\n tabIndex={0}\n onClick={toggleSrAll}\n onKeyDown={(e) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggleSrAll();\n }\n }}\n >\n {srAllSelected && <Check size={10} strokeWidth={3} />}\n </span>\n <span className=\"mr-cc-table__footer-label\">Select all</span>\n <span className=\"mr-cc-table__footer-count\">\n {srSelected.size} of {filteredRows.length} selected\n </span>\n <button\n ref={srCopyBtnRef}\n type=\"button\"\n className=\"mr-cc-table__copy-note-btn\"\n disabled={!hasCopyToNote}\n onClick={handleSrCopyToNote}\n >\n Copy to note\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import {
|
|
3
3
|
SmartSparkles_default,
|
|
4
4
|
useRecordPanelTable
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-BIN5FHTM.mjs";
|
|
6
6
|
import {
|
|
7
7
|
useRecordPreview,
|
|
8
8
|
useSmartRecordsActions
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-V2S4XGEO.mjs";
|
|
10
10
|
import {
|
|
11
11
|
IconButton,
|
|
12
12
|
Typography,
|
|
13
13
|
epochToDisplay,
|
|
14
14
|
useSdk
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-U3WP4DEG.mjs";
|
|
16
16
|
|
|
17
17
|
// src/views/components/shared/OriginalRecordPanel.tsx
|
|
18
18
|
import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -39,7 +39,6 @@ function OriginalRecordPanel({
|
|
|
39
39
|
const { store } = useSdk();
|
|
40
40
|
const record = useStore(store, (s) => s.records.byId[recordId]);
|
|
41
41
|
const recordsById = useStore(store, (s) => s.records.byId);
|
|
42
|
-
const vitalsMetaById = useStore(store, (s) => s.vitalsMeta.byId);
|
|
43
42
|
const preview = useRecordPreview(recordId);
|
|
44
43
|
const { openOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } = useSmartRecordsActions();
|
|
45
44
|
const { status: vitalsStatus, table } = useRecordPanelTable(
|
|
@@ -205,7 +204,6 @@ function OriginalRecordPanel({
|
|
|
205
204
|
" FOUND IN THIS ENCOUNTER"
|
|
206
205
|
] }),
|
|
207
206
|
/* @__PURE__ */ jsx("div", { className: "mr-orig__dropdown-list", children: caseRecords.map((r) => {
|
|
208
|
-
const meta = vitalsMetaById[r.id] ?? null;
|
|
209
207
|
const isActive = r.id === recordId;
|
|
210
208
|
return /* @__PURE__ */ jsxs(
|
|
211
209
|
"button",
|
|
@@ -234,17 +232,17 @@ function OriginalRecordPanel({
|
|
|
234
232
|
] }),
|
|
235
233
|
/* @__PURE__ */ jsxs("div", { className: "mr-orig__dropdown-meta", children: [
|
|
236
234
|
/* @__PURE__ */ jsx("span", { children: epochToDisplay(r.createdAtEpoch) }),
|
|
237
|
-
|
|
235
|
+
r.isSmart && r.totalVitals > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
238
236
|
/* @__PURE__ */ jsx("span", { className: "mr-orig__dropdown-dot", children: "\xB7" }),
|
|
239
237
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
240
|
-
|
|
238
|
+
r.totalVitals,
|
|
241
239
|
" vitals"
|
|
242
240
|
] })
|
|
243
241
|
] }),
|
|
244
|
-
|
|
242
|
+
r.isSmart && r.outOfRangeVitals > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
245
243
|
/* @__PURE__ */ jsx("span", { className: "mr-orig__dropdown-dot", children: "\xB7" }),
|
|
246
244
|
/* @__PURE__ */ jsxs("span", { className: "mr-orig__dropdown-oor", children: [
|
|
247
|
-
|
|
245
|
+
r.outOfRangeVitals,
|
|
248
246
|
" out of range"
|
|
249
247
|
] })
|
|
250
248
|
] })
|
|
@@ -501,4 +499,4 @@ function OriginalRecordPanel({
|
|
|
501
499
|
export {
|
|
502
500
|
OriginalRecordPanel
|
|
503
501
|
};
|
|
504
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
502
|
+
//# sourceMappingURL=OriginalRecordPanel-AK5IPYPP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/views/components/shared/OriginalRecordPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { ChevronLeft, ChevronRight, ExternalLink, Check, File, LoaderCircle, Search } from \"lucide-react\";\nimport { useStore } from \"zustand\";\nimport { useSdk } from \"../../../connection/useSdk\";\nimport { useRecordPreview } from \"../../../connection/useRecordPreview\";\nimport { useRecordPanelTable } from \"../../hooks/care-panel/useRecordPanelTable\";\nimport { epochToDisplay } from \"../../../helpers/formatters\";\nimport { useSmartRecordsActions } from \"../../context/SmartRecordsActionsContext\";\nimport { IconButton, Typography } from \"widgets\";\nimport type { RecordItem } from \"../../../helpers\";\nimport type { PanelRow } from \"../../../helpers/vitalsPanel\";\nimport SmartSparkles from \"icons/SmartSparkles\";\n\nconst DocumentViewer = lazy(() =>\n import(\"../../RecordPreview/DocumentViewer\").then((m) => ({\n default: m.DocumentViewer,\n })),\n);\n\ninterface OriginalRecordPanelProps {\n recordId: string;\n caseId?: string;\n onBack: () => void;\n}\n\ntype SrTab = \"all\" | \"oor\" | \"none\";\n\nfunction buildVitalsText(rows: PanelRow[]): string {\n return rows\n .map((r) => {\n const cell = r.cells[0];\n const ref = cell?.refRange ? ` (Ref: ${cell.refRange})` : \"\";\n return `${r.name}: ${cell?.value ?? \"—\"} ${r.unit}${ref}`;\n })\n .join(\"\\n\");\n}\n\nexport function OriginalRecordPanel({\n recordId,\n caseId,\n onBack,\n}: OriginalRecordPanelProps) {\n const { store } = useSdk();\n const record = useStore(store, (s) => s.records.byId[recordId]);\n const recordsById = useStore(store, (s) => s.records.byId);\n const preview = useRecordPreview(recordId);\n const { openOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } =\n useSmartRecordsActions();\n\n // Smart report vitals (only fetched when record.isSmart)\n const { status: vitalsStatus, table } = useRecordPanelTable(\n record?.isSmart ? recordId : null,\n );\n const [smartPanelOpen, setSmartPanelOpen] = useState(true);\n const [srSearch, setSrSearch] = useState(\"\");\n const [srTab, setSrTab] = useState<SrTab>(\"all\");\n const [srSelected, setSrSelected] = useState<Set<string>>(new Set());\n const srCopyBtnRef = useRef<HTMLButtonElement>(null);\n\n // Dropdown state\n const [dropdownOpen, setDropdownOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n const handler = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setDropdownOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [dropdownOpen]);\n\n const caseRecords = useMemo<RecordItem[]>(() => {\n if (!caseId) return [];\n return Object.values(recordsById)\n .filter((r): r is RecordItem => r != null && r.cases.includes(caseId))\n .sort((a, b) => b.createdAtEpoch - a.createdAtEpoch);\n }, [recordsById, caseId]);\n\n const currentIndex = caseRecords.findIndex((r) => r.id === recordId);\n const total = caseRecords.length;\n\n const goTo = useCallback(\n (r: RecordItem) => {\n setDropdownOpen(false);\n openOriginal(r.id, \"smart\", undefined, caseId);\n },\n [openOriginal, caseId],\n );\n\n const showNavPicker = caseId && total > 0;\n\n // Smart report vitals filtering\n const allRows = table.rows;\n const oorRows = useMemo(\n () => allRows.filter((r) => r.latestStatus === \"high\" || r.latestStatus === \"low\"),\n [allRows],\n );\n const noInterpRows = useMemo(\n () => allRows.filter((r) => r.latestStatus === \"unknown\"),\n [allRows],\n );\n\n const baseRows = srTab === \"oor\" ? oorRows : srTab === \"none\" ? noInterpRows : allRows;\n\n const filteredRows = useMemo(() => {\n if (!srSearch) return baseRows;\n const q = srSearch.toLowerCase();\n return baseRows.filter((r) => r.name.toLowerCase().includes(q));\n }, [baseRows, srSearch]);\n\n const tabCounts = useMemo(() => {\n if (!srSearch) return { all: allRows.length, oor: oorRows.length, none: noInterpRows.length };\n const q = srSearch.toLowerCase();\n return {\n all: allRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n oor: oorRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n none: noInterpRows.filter((r) => r.name.toLowerCase().includes(q)).length,\n };\n }, [srSearch, allRows, oorRows, noInterpRows]);\n\n useEffect(() => {\n setSrSelected(new Set());\n }, [srTab, srSearch]);\n\n const srAllSelected =\n filteredRows.length > 0 && filteredRows.every((r) => srSelected.has(r.key));\n const srSomeSelected = srSelected.size > 0;\n\n const toggleSrRow = useCallback((key: string) => {\n setSrSelected((prev) => {\n const next = new Set(prev);\n next.has(key) ? next.delete(key) : next.add(key);\n return next;\n });\n }, []);\n\n const toggleSrAll = useCallback(() => {\n setSrSelected(\n srAllSelected ? new Set() : new Set(filteredRows.map((r) => r.key)),\n );\n }, [srAllSelected, filteredRows]);\n\n const handleSrCopyToNote = useCallback(() => {\n const selectedRows = filteredRows.filter((r) => srSelected.has(r.key));\n if (!selectedRows.length) return;\n const text = buildVitalsText(selectedRows);\n if (onCopyVitalsToNote) {\n void onCopyVitalsToNote(text);\n } else if (onCopyToNote) {\n const rect = srCopyBtnRef.current?.getBoundingClientRect();\n void onCopyToNote(\n text,\n rect ? { x: rect.left + rect.width / 2, y: rect.bottom } : undefined,\n );\n }\n }, [filteredRows, srSelected, onCopyVitalsToNote, onCopyToNote]);\n\n const isSmart = record?.isSmart ?? false;\n const hasPreview = preview.status === \"loaded\" && preview.files.length > 0;\n\n return (\n <div className=\"mr-sv__panel\">\n <div className=\"mr-sv__panel-header\">\n <IconButton\n icon={<ChevronLeft size={16} aria-hidden />}\n label=\"Back\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onBack}\n />\n\n {showNavPicker ? (\n <div className=\"mr-orig__nav-wrap\" ref={dropdownRef}>\n <div\n className={`mr-orig__nav-pill${dropdownOpen ? \" mr-orig__nav-pill--open\" : \"\"}`}\n role=\"button\"\n tabIndex={0}\n onClick={() => setDropdownOpen((v) => !v)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setDropdownOpen((v) => !v);\n }\n }}\n >\n <button\n type=\"button\"\n className=\"mr-orig__nav-chevron\"\n onClick={(e) => {\n e.stopPropagation();\n setDropdownOpen((v) => !v);\n }}\n aria-label=\"Show records\"\n >\n <ChevronLeft size={14} aria-hidden />\n </button>\n <div className=\"mr-orig__nav-text\">\n <span className=\"mr-orig__nav-title\">{record?.title ?? \"Record\"}</span>\n <span className=\"mr-orig__nav-counter\">\n {currentIndex + 1} of {total}\n </span>\n </div>\n <button\n type=\"button\"\n className=\"mr-orig__nav-chevron\"\n onClick={(e) => {\n e.stopPropagation();\n setDropdownOpen((v) => !v);\n }}\n aria-label=\"Show records\"\n >\n <ChevronRight size={14} aria-hidden />\n </button>\n </div>\n\n {dropdownOpen && (\n <div className=\"mr-orig__dropdown\">\n <div className=\"mr-orig__dropdown-eyebrow\">\n {total} RECORD{total !== 1 ? \"S\" : \"\"} FOUND IN THIS ENCOUNTER\n </div>\n <div className=\"mr-orig__dropdown-list\">\n {caseRecords.map((r) => {\n const isActive = r.id === recordId;\n return (\n <button\n key={r.id}\n type=\"button\"\n className={`mr-orig__dropdown-item${isActive ? \" mr-orig__dropdown-item--active\" : \"\"}`}\n onClick={() => goTo(r)}\n >\n <div className=\"mr-orig__dropdown-icon\">\n <File size={16} aria-hidden />\n {r.isSmart && (\n <SmartSparkles\n className=\"mr-orig__dropdown-smart-dot\"\n aria-label=\"Smart report\"\n />\n )}\n </div>\n <div className=\"mr-orig__dropdown-info\">\n <div className=\"mr-orig__dropdown-title-row\">\n <span className=\"mr-orig__dropdown-title\">{r.title}</span>\n {r.isSmart && (\n <span className=\"mr-orig__dropdown-smart-badge\">\n <SmartSparkles aria-hidden />\n Smart Report\n </span>\n )}\n </div>\n <div className=\"mr-orig__dropdown-meta\">\n <span>{epochToDisplay(r.createdAtEpoch)}</span>\n {r.isSmart && r.totalVitals > 0 && (\n <>\n <span className=\"mr-orig__dropdown-dot\">·</span>\n <span>{r.totalVitals} vitals</span>\n </>\n )}\n {r.isSmart && r.outOfRangeVitals > 0 && (\n <>\n <span className=\"mr-orig__dropdown-dot\">·</span>\n <span className=\"mr-orig__dropdown-oor\">\n {r.outOfRangeVitals} out of range\n </span>\n </>\n )}\n </div>\n </div>\n {isActive && (\n <Check\n size={14}\n className=\"mr-orig__dropdown-check\"\n aria-hidden\n />\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n ) : record ? (\n <div className=\"mr-sv__panel-info\">\n <Typography variant=\"label\" as=\"span\" className=\"mr-sv__panel-name\">\n {record.title}\n </Typography>\n <Typography variant=\"hint\" as=\"span\" className=\"mr-sv__panel-meta-text\">\n {epochToDisplay(record.createdAtEpoch)}\n </Typography>\n </div>\n ) : null}\n\n <div className=\"mr-orig__header-actions\">\n {isSmart && !smartPanelOpen && (\n <button\n type=\"button\"\n className=\"mr-orig__show-smart-btn\"\n onClick={() => setSmartPanelOpen(true)}\n >\n <SmartSparkles aria-hidden />\n Smart Report\n </button>\n )}\n {hasPreview && (\n <IconButton\n icon={<ExternalLink size={16} aria-hidden />}\n label=\"Open in new tab\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n window.open(preview.files[0].url, \"_blank\", \"noopener,noreferrer\")\n }\n />\n )}\n </div>\n </div>\n\n <div\n className=\"mr-sv__panel-body\"\n style={{ flex: 1, display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}\n >\n {preview.status === \"loading\" && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n <LoaderCircle size={44} className=\"mr-sv__loading-spinner\" aria-hidden />\n </div>\n )}\n {preview.status === \"error\" && (\n <Typography variant=\"muted\" className=\"mr-sv__panel-empty\">\n Failed to load document preview.\n </Typography>\n )}\n {preview.status === \"loaded\" && preview.files.length === 0 && (\n <Typography variant=\"muted\" className=\"mr-sv__panel-empty\">\n No preview available for this record.\n </Typography>\n )}\n\n {/* Non-smart: full-width PDF */}\n {hasPreview && !isSmart && (\n <div\n className=\"mr-record-preview__body\"\n style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}\n >\n <Suspense fallback={null}>\n <DocumentViewer\n files={preview.files}\n title={record?.title ?? \"\"}\n isHtml={preview.isHtml}\n />\n </Suspense>\n </div>\n )}\n\n {/* Smart: split view — PDF left, smart report panel right */}\n {hasPreview && isSmart && (\n <div className=\"mr-orig__split\">\n <div className=\"mr-orig__pdf-side\">\n <Suspense fallback={null}>\n <DocumentViewer\n files={preview.files}\n title={record?.title ?? \"\"}\n isHtml={preview.isHtml}\n />\n </Suspense>\n </div>\n\n {smartPanelOpen && (\n <div className=\"mr-orig__smart-side\">\n {/* Header */}\n <div className=\"mr-orig__smart-hdr\">\n <span className=\"mr-orig__smart-title\">Smart Report</span>\n <button\n type=\"button\"\n className=\"mr-orig__smart-collapse-btn\"\n aria-label=\"Collapse smart report panel\"\n onClick={() => setSmartPanelOpen(false)}\n >\n <ChevronRight size={16} aria-hidden />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"mr-orig__smart-search\">\n <Search size={14} aria-hidden className=\"mr-orig__smart-search-icon\" />\n <input\n type=\"text\"\n className=\"mr-orig__smart-search-input\"\n placeholder=\"Search vitals\"\n value={srSearch}\n onChange={(e) => setSrSearch(e.target.value)}\n />\n </div>\n\n {/* Filter tabs */}\n <div className=\"mr-orig__smart-tabs-wrap\">\n <div className=\"mr-orig__smart-tabs\">\n {([\"all\", \"oor\", \"none\"] as SrTab[]).map((tab) => {\n const count =\n tab === \"all\"\n ? tabCounts.all\n : tab === \"oor\"\n ? tabCounts.oor\n : tabCounts.none;\n const label =\n tab === \"all\"\n ? \"All\"\n : tab === \"oor\"\n ? \"Out of range\"\n : \"No interpretation\";\n return (\n <button\n key={tab}\n type=\"button\"\n className={`mr-orig__smart-tab${srTab === tab ? \" mr-orig__smart-tab--active\" : \"\"}`}\n onClick={() => setSrTab(tab)}\n >\n {label} ({count})\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Vital list */}\n <div className=\"mr-orig__smart-list\">\n {vitalsStatus === \"loading\" && (\n <div className=\"mr-orig__smart-loading\">\n <LoaderCircle\n size={20}\n className=\"mr-sv__loading-spinner\"\n aria-hidden\n />\n </div>\n )}\n {vitalsStatus === \"loaded\" && filteredRows.length === 0 && (\n <Typography variant=\"muted\" className=\"mr-orig__smart-empty\">\n No vitals match.\n </Typography>\n )}\n {vitalsStatus === \"loaded\" &&\n filteredRows.map((row, idx) => {\n const cell = row.cells[0];\n const isOor =\n row.latestStatus === \"high\" || row.latestStatus === \"low\";\n const isSelected = srSelected.has(row.key);\n const isLast = idx === filteredRows.length - 1;\n return (\n <div\n key={row.key}\n className={`mr-orig__vital-item${isLast ? \" mr-orig__vital-item--last\" : \"\"}`}\n >\n <div\n className={`mr-orig__vital-row${srSomeSelected ? \" mr-orig__vital-row--selectable\" : \"\"}${isSelected ? \" mr-orig__vital-row--selected\" : \"\"}`}\n onClick={srSomeSelected ? () => toggleSrRow(row.key) : undefined}\n >\n <span\n className={`mr-sv__checkbox mr-cc-table__row-check${isSelected ? \" mr-sv__checkbox--checked\" : \"\"}`}\n role=\"checkbox\"\n aria-checked={isSelected}\n tabIndex={0}\n onClick={(e) => {\n e.stopPropagation();\n toggleSrRow(row.key);\n }}\n onKeyDown={(e) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n toggleSrRow(row.key);\n }\n }}\n >\n {isSelected && <Check size={10} strokeWidth={3} />}\n </span>\n <div className=\"mr-orig__vital-info\">\n <span className=\"mr-orig__vital-name\">{row.name}</span>\n {row.refRange && (\n <span className=\"mr-orig__vital-ref\">\n Ref {row.refRange}\n </span>\n )}\n </div>\n {cell && (\n <div className=\"mr-orig__vital-value\">\n <span\n className={`mr-orig__vital-val${isOor ? \" mr-orig__vital-val--oor\" : \"\"}`}\n >\n {cell.value}\n </span>\n {cell.unit && (\n <span className=\"mr-orig__vital-unit\">{cell.unit}</span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\n {srSomeSelected && (\n <div className=\"mr-cc-table__footer\">\n <span\n className={`mr-sv__checkbox mr-cc-table__footer-check${srAllSelected ? \" mr-sv__checkbox--checked\" : \"\"}`}\n role=\"checkbox\"\n aria-checked={srAllSelected}\n tabIndex={0}\n onClick={toggleSrAll}\n onKeyDown={(e) => {\n if (e.key === \" \" || e.key === \"Enter\") {\n e.preventDefault();\n toggleSrAll();\n }\n }}\n >\n {srAllSelected && <Check size={10} strokeWidth={3} />}\n </span>\n <span className=\"mr-cc-table__footer-label\">Select all</span>\n <span className=\"mr-cc-table__footer-count\">\n {srSelected.size} of {filteredRows.length} selected\n </span>\n <button\n ref={srCopyBtnRef}\n type=\"button\"\n className=\"mr-cc-table__copy-note-btn\"\n disabled={!hasCopyToNote}\n onClick={handleSrCopyToNote}\n >\n Copy to note\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkYQFYORNEjs = require('./chunk-YQFYORNE.js');
|
|
5
|
+
require('./chunk-UQNOD5EC.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
exports.SmartUploadModal = _chunkYQFYORNEjs.SmartUploadModal;
|
|
9
|
+
//# sourceMappingURL=SmartUploadModal-M3WQRFO4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/SmartUploadModal-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/SmartUploadModal-M3WQRFO4.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,6DAAC","file":"/home/runner/work/medical-records-ui/medical-records-ui/dist/SmartUploadModal-M3WQRFO4.js"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunk3NAIW2AJjs = require('./chunk-3NAIW2AJ.js');
|
|
5
|
+
require('./chunk-2ZBMMIHZ.js');
|
|
6
|
+
require('./chunk-UQNOD5EC.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.VitalHistoryPanel = _chunk3NAIW2AJjs.VitalHistoryPanel;
|
|
10
|
+
//# sourceMappingURL=VitalHistoryPanel-22QMSV5Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/VitalHistoryPanel-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/VitalHistoryPanel-22QMSV5Q.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,+DAAC","file":"/home/runner/work/medical-records-ui/medical-records-ui/dist/VitalHistoryPanel-22QMSV5Q.js"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkUQNOD5ECjs = require('./chunk-UQNOD5EC.js');
|
|
5
5
|
|
|
6
6
|
// src/views/context/SmartRecordsActionsContext.ts
|
|
7
7
|
var _react = require('react');
|
|
@@ -103,7 +103,7 @@ var EMPTY = {
|
|
|
103
103
|
isHtml: false
|
|
104
104
|
};
|
|
105
105
|
function useRecordPreview(documentId) {
|
|
106
|
-
const { bid, patientId } =
|
|
106
|
+
const { bid, patientId } = _chunkUQNOD5ECjs.useSdk.call(void 0, );
|
|
107
107
|
const [data, setData] = _react.useState.call(void 0, EMPTY);
|
|
108
108
|
const inflightRef = _react.useRef.call(void 0, null);
|
|
109
109
|
_react.useEffect.call(void 0, () => {
|
|
@@ -117,7 +117,7 @@ function useRecordPreview(documentId) {
|
|
|
117
117
|
setData(EMPTY);
|
|
118
118
|
(async () => {
|
|
119
119
|
try {
|
|
120
|
-
const res = await
|
|
120
|
+
const res = await _chunkUQNOD5ECjs.getCore.call(void 0, ).describeDocument({ documentId, bid, patientId, preferenceType: "HTML" });
|
|
121
121
|
if (cancelled) return;
|
|
122
122
|
const rawFiles = _nullishCoalesce(res.files, () => ( []));
|
|
123
123
|
const files = rawFiles.filter((f) => f.asset_url).map((f) => ({ url: f.asset_url, kind: classifyFile(f.file_type) }));
|
|
@@ -149,4 +149,4 @@ function useRecordPreview(documentId) {
|
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
exports.SmartRecordsActionsContext = SmartRecordsActionsContext; exports.useSmartRecordsActions = useSmartRecordsActions; exports.parseVitals = parseVitals; exports.isOutOfRange = isOutOfRange; exports.useRecordPreview = useRecordPreview;
|
|
152
|
-
//# sourceMappingURL=chunk-
|
|
152
|
+
//# sourceMappingURL=chunk-2ZBMMIHZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/chunk-2ZBMMIHZ.js","../src/views/context/SmartRecordsActionsContext.ts","../src/helpers/smartReport.ts","../src/connection/useRecordPreview.ts"],"names":[],"mappings":"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","file":"/home/runner/work/medical-records-ui/medical-records-ui/dist/chunk-2ZBMMIHZ.js","sourcesContent":[null,"import { createContext, useContext } from \"react\";\n\nexport interface SmartRecordsActions {\n onCopyToNote?: (\n text: string,\n anchor?: { x: number; y: number },\n ) => void | boolean | Promise<void | boolean>;\n hasCopyToNote: boolean;\n onCopyVitalsToNote?: (text: string) => void | Promise<void>;\n selectRecord: (id: string, isSmart?: boolean) => void;\n openCareContext: (caseId: string, showFiles?: boolean) => void;\n openHistory: (recordId: string, vitalId: string, returnTo?: \"smart\" | \"careContext\", caseId?: string) => void;\n openOriginal: (\n recordId: string,\n returnTo: \"smart\" | \"history\" | \"careContext\",\n returnVitalId?: string,\n returnCaseId?: string,\n ) => void;\n back: () => void;\n attachToContext?: (documentId: string, name: string) => void | Promise<void>;\n requestDelete: (id: string) => void;\n}\n\nexport const SmartRecordsActionsContext =\n createContext<SmartRecordsActions | null>(null);\n\nexport function useSmartRecordsActions(): SmartRecordsActions {\n const ctx = useContext(SmartRecordsActionsContext);\n if (!ctx)\n throw new Error(\n \"useSmartRecordsActions must be used inside SmartRecordsView\",\n );\n return ctx;\n}\n","export type VitalStatus = 'high' | 'low' | 'normal' | 'unknown';\n\nexport interface VitalHistoryPoint {\n value: string;\n label: string; \n}\nexport interface Vital {\n id: string;\n vitalId?: string;\n ekaId?: string;\n name: string;\n value: string;\n unit: string;\n refRange: string;\n status: VitalStatus;\n history: VitalHistoryPoint[];\n}\n\ntype RawField = Record<string, unknown>;\n\nconst str = (o: RawField, keys: string[]): string => {\n for (const k of keys) {\n const v = o[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n if (typeof v === 'number') return String(v);\n }\n return '';\n};\n\nconst normalizeStatus = (raw: string): VitalStatus => {\n const s = raw.toLowerCase();\n if (s.includes('high') || s === 'h' || s.includes('above') || s === 'abnormal_high') return 'high';\n if (s.includes('low') || s === 'l' || s.includes('below') || s === 'abnormal_low') return 'low';\n if (s.includes('normal') || s.includes('in range') || s === 'n' || s === 'ok') return 'normal';\n return 'unknown';\n};\n\n/**\n * Derive a status by comparing the numeric value against the reference range\n * when the report didn't give an explicit status. Handles \"min-max\",\n * \"min – max\", \"< x\" / \"<= x\", \"> x\" / \">= x\", and \"up to x\".\n */\nconst deriveStatusFromRange = (value: string, refRange: string): VitalStatus => {\n const num = parseFloat(value.replace(/,/g, ''));\n if (Number.isNaN(num) || !refRange) return 'unknown';\n const r = refRange.toLowerCase().replace(/,/g, '');\n\n // \"min - max\" (en-dash, hyphen, or \"to\")\n const between = r.match(/(-?\\d+\\.?\\d*)\\s*(?:-|–|to)\\s*(-?\\d+\\.?\\d*)/);\n if (between) {\n const lo = parseFloat(between[1]);\n const hi = parseFloat(between[2]);\n if (num < lo) return 'low';\n if (num > hi) return 'high';\n return 'normal';\n }\n // \"<= x\" / \"< x\" / \"up to x\" → only an upper bound\n const upper = r.match(/(?:<=?|up to|below)\\s*(-?\\d+\\.?\\d*)/);\n if (upper) return num > parseFloat(upper[1]) ? 'high' : 'normal';\n // \">= x\" / \"> x\" → only a lower bound\n const lower = r.match(/(?:>=?|above)\\s*(-?\\d+\\.?\\d*)/);\n if (lower) return num < parseFloat(lower[1]) ? 'low' : 'normal';\n\n return 'unknown';\n};\n\nfunction parseHistory(field: RawField): VitalHistoryPoint[] {\n const raw = field.history ?? field.previous ?? field.trend ?? field.historical;\n if (!Array.isArray(raw)) return [];\n return raw\n .map((p): VitalHistoryPoint | null => {\n if (p == null || typeof p !== 'object') return null;\n const o = p as RawField;\n const value = str(o, ['value', 'result', 'val', 'reading']);\n const label = str(o, ['date', 'label', 'when', 'at']);\n if (!value) return null;\n return { value, label: label || '' };\n })\n .filter((p): p is VitalHistoryPoint => p !== null);\n}\n\nexport function parseVitals(report: {\n verified?: RawField[];\n unverified?: RawField[];\n}): Vital[] {\n const fields = [...(report.verified ?? []), ...(report.unverified ?? [])];\n return fields\n .map((field, i): Vital | null => {\n const name = str(field, ['name', 'label', 'parameter', 'key', 'title', 'test']);\n const value = str(field, ['value', 'result', 'val', 'reading']);\n if (!name && !value) return null;\n const refRange = str(field, ['range', 'ref_range', 'reference', 'refRange', 'normal_range']);\n // Prefer an explicit status; otherwise compute it from value vs. range.\n let status = normalizeStatus(str(field, ['status', 'flag', 'interpretation', 'severity']));\n if (status === 'unknown') status = deriveStatusFromRange(value, refRange);\n const vitalId = str(field, ['vital_id', 'eka_id']) || undefined;\n const ekaId = str(field, ['eka_id']) || undefined;\n return {\n id: str(field, ['id', 'code']) || `${name || 'vital'}-${i}`,\n vitalId,\n ekaId,\n name: name || 'Unknown',\n value,\n unit: str(field, ['unit', 'units']),\n refRange,\n status,\n history: parseHistory(field),\n };\n })\n .filter((v): v is Vital => v !== null);\n}\n\nexport const isOutOfRange = (v: Vital): boolean => v.status === 'high' || v.status === 'low';\n\nexport function vitalsNoteHeading(opts?: { reportName?: string; date?: string }): string {\n return `**Vitals / Lab parameters — ${opts?.reportName ?? 'Report'}${\n opts?.date ? ` (${opts.date})` : ''\n }:**`;\n}\n\nexport function vitalsToNoteText(\n vitals: Vital[],\n opts?: { reportName?: string; date?: string },\n): string {\n const lines = vitals.map((v) => {\n const val = [v.value, v.unit].filter(Boolean).join(' ');\n return val ? `${v.name}: ${val}` : v.name;\n });\n return [vitalsNoteHeading(opts), ...lines].join('\\n');\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useSdk } from './useSdk';\nimport { getCore } from './sdkClient';\nimport { parseVitals, type Vital } from '../helpers/smartReport';\n\nexport type PreviewFileKind = 'pdf' | 'image' | 'text';\nexport interface PreviewFile {\n url: string;\n kind: PreviewFileKind;\n}\n\n/**\n * The SDK's `file_type` is inconsistent — sometimes the typed union ('PDF'|'IMG'\n * |'HTML'), sometimes a MIME string ('application/pdf', 'image/png') when served\n * from the blob cache. Normalise both into a viewer kind.\n */\nfunction classifyFile(rawType: string | undefined): PreviewFileKind {\n const t = (rawType ?? '').toLowerCase();\n if (t.includes('pdf')) return 'pdf';\n if (t.includes('image') || t === 'img' || /(png|jpe?g|gif|webp|heic)/.test(t)) return 'image';\n return 'text';\n}\n\nexport interface RecordPreviewData {\n status: 'loading' | 'loaded' | 'error';\n files: PreviewFile[];\n vitals: Vital[];\n hasSmartReport: boolean;\n isHtml: boolean;\n}\n\nconst EMPTY: RecordPreviewData = {\n status: 'loading',\n files: [],\n vitals: [],\n hasSmartReport: false,\n isHtml: false,\n};\n\n/**\n * Fetch the full detail of the open record — the file attachments (signed URLs)\n * for the document viewer and the smart report parsed into vitals. Runs only\n * for the single record being previewed (not every card).\n */\nexport function useRecordPreview(documentId: string | null): RecordPreviewData {\n const { bid, patientId } = useSdk();\n const [data, setData] = useState<RecordPreviewData>(EMPTY);\n const inflightRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!documentId) {\n setData(EMPTY);\n return;\n }\n\n if (inflightRef.current === documentId) return;\n inflightRef.current = documentId;\n\n let cancelled = false;\n setData(EMPTY);\n\n (async () => {\n try {\n const res = await getCore().describeDocument({ documentId, bid, patientId, preferenceType: 'HTML' });\n if (cancelled) return;\n const rawFiles = res.files ?? [];\n const files: PreviewFile[] = rawFiles\n .filter((f) => f.asset_url)\n .map((f) => ({ url: f.asset_url, kind: classifyFile(f.file_type) }));\n const isHtml = (rawFiles[0]?.file_type ?? '').toUpperCase() === 'HTML';\n const vitals = res.smart_report ? parseVitals(res.smart_report as unknown as Parameters<typeof parseVitals>[0]) : [];\n setData({\n status: 'loaded',\n files,\n vitals,\n hasSmartReport: res.smart_report != null,\n isHtml,\n });\n } catch {\n if (!cancelled) setData({ status: 'error', files: [], vitals: [], hasSmartReport: false, isHtml: false });\n }\n })();\n\n return () => {\n cancelled = true;\n inflightRef.current = null;\n };\n }, [documentId, bid, patientId]);\n\n return data;\n}\n"]}
|