@eka-care/medical-records-ui 1.0.34 → 1.0.37
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-AK5IPYPP.mjs → OriginalRecordPanel-3TXU4RSU.mjs} +172 -71
- package/dist/OriginalRecordPanel-3TXU4RSU.mjs.map +1 -0
- package/dist/{OriginalRecordPanel-2PBQASS3.js → OriginalRecordPanel-YQ2LGVFU.js} +189 -88
- package/dist/OriginalRecordPanel-YQ2LGVFU.js.map +1 -0
- package/dist/SmartUploadModal-DOEIOLQU.js +9 -0
- package/dist/{SmartUploadModal-M3WQRFO4.js.map → SmartUploadModal-DOEIOLQU.js.map} +1 -1
- package/dist/SmartUploadModal-SMDIOE3L.mjs +9 -0
- package/dist/VitalHistoryPanel-WI44AXJU.mjs +10 -0
- package/dist/VitalHistoryPanel-WKBIR2RD.js +10 -0
- package/dist/{VitalHistoryPanel-22QMSV5Q.js.map → VitalHistoryPanel-WKBIR2RD.js.map} +1 -1
- package/dist/{chunk-LH2G6KKA.mjs → chunk-3P36QOHC.mjs} +2 -2
- package/dist/{chunk-U3WP4DEG.mjs → chunk-4MEMDAB5.mjs} +2 -2
- package/dist/chunk-4MEMDAB5.mjs.map +1 -0
- package/dist/{chunk-UQNOD5EC.js → chunk-57BG7LVP.js} +2 -2
- package/dist/{chunk-UQNOD5EC.js.map → chunk-57BG7LVP.js.map} +1 -1
- package/dist/{chunk-AQHSSUEC.mjs → chunk-5TQ6OPAQ.mjs} +39 -74
- package/dist/chunk-5TQ6OPAQ.mjs.map +1 -0
- package/dist/{chunk-YQFYORNE.js → chunk-ESURVA6B.js} +21 -21
- package/dist/{chunk-YQFYORNE.js.map → chunk-ESURVA6B.js.map} +1 -1
- package/dist/{chunk-YHPGVJ7P.js → chunk-GKREOUK2.js} +7 -7
- package/dist/{chunk-YHPGVJ7P.js.map → chunk-GKREOUK2.js.map} +1 -1
- package/dist/{chunk-V2S4XGEO.mjs → chunk-LUH7D3K7.mjs} +34 -5
- package/dist/chunk-LUH7D3K7.mjs.map +1 -0
- package/dist/{chunk-BIN5FHTM.mjs → chunk-MRQMRFWX.mjs} +3 -3
- package/dist/{chunk-3NAIW2AJ.js → chunk-VBMKRSTX.js} +48 -83
- package/dist/chunk-VBMKRSTX.js.map +1 -0
- package/dist/{chunk-2ZBMMIHZ.js → chunk-YT6OD4YU.js} +34 -5
- package/dist/chunk-YT6OD4YU.js.map +1 -0
- package/dist/index.css +147 -17
- package/dist/index.css.map +1 -1
- package/dist/index.js +153 -118
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -43
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +147 -17
- package/dist/styles.css.map +1 -1
- package/dist/widgets-DYR6LERQ.js +43 -0
- package/dist/{widgets-RRTL4XCO.js.map → widgets-DYR6LERQ.js.map} +1 -1
- package/dist/{widgets-2WXR34ER.mjs → widgets-KNUDQAKD.mjs} +2 -2
- package/package.json +1 -1
- package/dist/OriginalRecordPanel-2PBQASS3.js.map +0 -1
- package/dist/OriginalRecordPanel-AK5IPYPP.mjs.map +0 -1
- package/dist/SmartUploadModal-LZT55L2J.mjs +0 -9
- package/dist/SmartUploadModal-M3WQRFO4.js +0 -9
- package/dist/VitalHistoryPanel-22QMSV5Q.js +0 -10
- package/dist/VitalHistoryPanel-J2TPULMP.mjs +0 -10
- package/dist/chunk-2ZBMMIHZ.js.map +0 -1
- package/dist/chunk-3NAIW2AJ.js.map +0 -1
- package/dist/chunk-AQHSSUEC.mjs.map +0 -1
- package/dist/chunk-U3WP4DEG.mjs.map +0 -1
- package/dist/chunk-V2S4XGEO.mjs.map +0 -1
- package/dist/widgets-RRTL4XCO.js +0 -43
- /package/dist/{SmartUploadModal-LZT55L2J.mjs.map → SmartUploadModal-SMDIOE3L.mjs.map} +0 -0
- /package/dist/{VitalHistoryPanel-J2TPULMP.mjs.map → VitalHistoryPanel-WI44AXJU.mjs.map} +0 -0
- /package/dist/{chunk-LH2G6KKA.mjs.map → chunk-3P36QOHC.mjs.map} +0 -0
- /package/dist/{chunk-BIN5FHTM.mjs.map → chunk-MRQMRFWX.mjs.map} +0 -0
- /package/dist/{widgets-2WXR34ER.mjs.map → widgets-KNUDQAKD.mjs.map} +0 -0
|
@@ -2,21 +2,23 @@
|
|
|
2
2
|
import {
|
|
3
3
|
SmartSparkles_default,
|
|
4
4
|
useRecordPanelTable
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-MRQMRFWX.mjs";
|
|
6
6
|
import {
|
|
7
|
+
useParameterTrend,
|
|
7
8
|
useRecordPreview,
|
|
8
9
|
useSmartRecordsActions
|
|
9
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-LUH7D3K7.mjs";
|
|
10
11
|
import {
|
|
11
12
|
IconButton,
|
|
13
|
+
SearchInput_default,
|
|
12
14
|
Typography,
|
|
13
15
|
epochToDisplay,
|
|
14
16
|
useSdk
|
|
15
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-4MEMDAB5.mjs";
|
|
16
18
|
|
|
17
19
|
// src/views/components/shared/OriginalRecordPanel.tsx
|
|
18
20
|
import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
19
|
-
import { ChevronLeft, ChevronRight, ExternalLink, Check, File, LoaderCircle
|
|
21
|
+
import { ChevronLeft, ChevronRight, ChevronDown, ExternalLink, Check, File, LoaderCircle } from "lucide-react";
|
|
20
22
|
import { useStore } from "zustand";
|
|
21
23
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
22
24
|
var DocumentViewer = lazy(
|
|
@@ -40,13 +42,17 @@ function OriginalRecordPanel({
|
|
|
40
42
|
const record = useStore(store, (s) => s.records.byId[recordId]);
|
|
41
43
|
const recordsById = useStore(store, (s) => s.records.byId);
|
|
42
44
|
const preview = useRecordPreview(recordId);
|
|
43
|
-
const {
|
|
45
|
+
const { replaceOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } = useSmartRecordsActions();
|
|
44
46
|
const { status: vitalsStatus, table } = useRecordPanelTable(
|
|
45
47
|
record?.isSmart ? recordId : null
|
|
46
48
|
);
|
|
47
49
|
const [smartPanelOpen, setSmartPanelOpen] = useState(true);
|
|
48
50
|
const [srSearch, setSrSearch] = useState("");
|
|
49
51
|
const [srTab, setSrTab] = useState("all");
|
|
52
|
+
const [expandedVital, setExpandedVital] = useState(null);
|
|
53
|
+
const toggleExpand = useCallback((key) => {
|
|
54
|
+
setExpandedVital((prev) => prev === key ? null : key);
|
|
55
|
+
}, []);
|
|
50
56
|
const [srSelected, setSrSelected] = useState(/* @__PURE__ */ new Set());
|
|
51
57
|
const srCopyBtnRef = useRef(null);
|
|
52
58
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
@@ -70,10 +76,16 @@ function OriginalRecordPanel({
|
|
|
70
76
|
const goTo = useCallback(
|
|
71
77
|
(r) => {
|
|
72
78
|
setDropdownOpen(false);
|
|
73
|
-
|
|
79
|
+
replaceOriginal(r.id, caseId);
|
|
74
80
|
},
|
|
75
|
-
[
|
|
81
|
+
[replaceOriginal, caseId]
|
|
76
82
|
);
|
|
83
|
+
const goPrev = useCallback(() => {
|
|
84
|
+
if (currentIndex > 0) goTo(caseRecords[currentIndex - 1]);
|
|
85
|
+
}, [currentIndex, caseRecords, goTo]);
|
|
86
|
+
const goNext = useCallback(() => {
|
|
87
|
+
if (currentIndex < total - 1) goTo(caseRecords[currentIndex + 1]);
|
|
88
|
+
}, [currentIndex, total, caseRecords, goTo]);
|
|
77
89
|
const showNavPicker = caseId && total > 0;
|
|
78
90
|
const allRows = table.rows;
|
|
79
91
|
const oorRows = useMemo(
|
|
@@ -102,6 +114,10 @@ function OriginalRecordPanel({
|
|
|
102
114
|
useEffect(() => {
|
|
103
115
|
setSrSelected(/* @__PURE__ */ new Set());
|
|
104
116
|
}, [srTab, srSearch]);
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (srTab === "oor" && oorRows.length === 0) setSrTab("all");
|
|
119
|
+
if (srTab === "none" && noInterpRows.length === 0) setSrTab("all");
|
|
120
|
+
}, [srTab, oorRows.length, noInterpRows.length]);
|
|
105
121
|
const srAllSelected = filteredRows.length > 0 && filteredRows.every((r) => srSelected.has(r.key));
|
|
106
122
|
const srSomeSelected = srSelected.size > 0;
|
|
107
123
|
const toggleSrRow = useCallback((key) => {
|
|
@@ -130,6 +146,31 @@ function OriginalRecordPanel({
|
|
|
130
146
|
);
|
|
131
147
|
}
|
|
132
148
|
}, [filteredRows, srSelected, onCopyVitalsToNote, onCopyToNote]);
|
|
149
|
+
const htmlCopyBtnRef = useRef(null);
|
|
150
|
+
const [isHtmlCopying, setIsHtmlCopying] = useState(false);
|
|
151
|
+
const handleHtmlCopyToNote = useCallback(async () => {
|
|
152
|
+
const url = preview.files[0]?.url;
|
|
153
|
+
if (!url) return;
|
|
154
|
+
setIsHtmlCopying(true);
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(url);
|
|
157
|
+
const html = await res.text();
|
|
158
|
+
const doc = new DOMParser().parseFromString(html, "text/html");
|
|
159
|
+
const text = doc.body.textContent?.trim() ?? "";
|
|
160
|
+
if (!text) return;
|
|
161
|
+
if (onCopyVitalsToNote) {
|
|
162
|
+
void onCopyVitalsToNote(text);
|
|
163
|
+
} else if (onCopyToNote) {
|
|
164
|
+
const rect = htmlCopyBtnRef.current?.getBoundingClientRect();
|
|
165
|
+
void onCopyToNote(
|
|
166
|
+
text,
|
|
167
|
+
rect ? { x: rect.left, y: rect.bottom } : void 0
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
} finally {
|
|
171
|
+
setIsHtmlCopying(false);
|
|
172
|
+
}
|
|
173
|
+
}, [preview.files, onCopyVitalsToNote, onCopyToNote]);
|
|
133
174
|
const isSmart = record?.isSmart ?? false;
|
|
134
175
|
const hasPreview = preview.status === "loaded" && preview.files.length > 0;
|
|
135
176
|
return /* @__PURE__ */ jsxs("div", { className: "mr-sv__panel", children: [
|
|
@@ -166,9 +207,10 @@ function OriginalRecordPanel({
|
|
|
166
207
|
className: "mr-orig__nav-chevron",
|
|
167
208
|
onClick: (e) => {
|
|
168
209
|
e.stopPropagation();
|
|
169
|
-
|
|
210
|
+
goPrev();
|
|
170
211
|
},
|
|
171
|
-
"aria-label": "
|
|
212
|
+
"aria-label": "Previous record",
|
|
213
|
+
disabled: currentIndex <= 0,
|
|
172
214
|
children: /* @__PURE__ */ jsx(ChevronLeft, { size: 14, "aria-hidden": true })
|
|
173
215
|
}
|
|
174
216
|
),
|
|
@@ -187,9 +229,10 @@ function OriginalRecordPanel({
|
|
|
187
229
|
className: "mr-orig__nav-chevron",
|
|
188
230
|
onClick: (e) => {
|
|
189
231
|
e.stopPropagation();
|
|
190
|
-
|
|
232
|
+
goNext();
|
|
191
233
|
},
|
|
192
|
-
"aria-label": "
|
|
234
|
+
"aria-label": "Next record",
|
|
235
|
+
disabled: currentIndex >= total - 1,
|
|
193
236
|
children: /* @__PURE__ */ jsx(ChevronRight, { size: 14, "aria-hidden": true })
|
|
194
237
|
}
|
|
195
238
|
)
|
|
@@ -279,6 +322,20 @@ function OriginalRecordPanel({
|
|
|
279
322
|
]
|
|
280
323
|
}
|
|
281
324
|
),
|
|
325
|
+
preview.isHtml && hasCopyToNote && /* @__PURE__ */ jsxs(
|
|
326
|
+
"button",
|
|
327
|
+
{
|
|
328
|
+
ref: htmlCopyBtnRef,
|
|
329
|
+
type: "button",
|
|
330
|
+
className: "mr-orig__html-copy-btn",
|
|
331
|
+
onClick: handleHtmlCopyToNote,
|
|
332
|
+
disabled: isHtmlCopying,
|
|
333
|
+
children: [
|
|
334
|
+
isHtmlCopying && /* @__PURE__ */ jsx(LoaderCircle, { size: 12, className: "mr-sv__loading-spinner", "aria-hidden": true }),
|
|
335
|
+
"Copy to note"
|
|
336
|
+
]
|
|
337
|
+
}
|
|
338
|
+
),
|
|
282
339
|
hasPreview && /* @__PURE__ */ jsx(
|
|
283
340
|
IconButton,
|
|
284
341
|
{
|
|
@@ -349,20 +406,19 @@ function OriginalRecordPanel({
|
|
|
349
406
|
}
|
|
350
407
|
)
|
|
351
408
|
] }),
|
|
352
|
-
/* @__PURE__ */
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
"
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
/* @__PURE__ */ jsx("div", { className: "mr-orig__smart-tabs-wrap", children: /* @__PURE__ */ jsx("div", { className: "mr-orig__smart-tabs", children: ["all", "oor", "none"].map((tab) => {
|
|
409
|
+
/* @__PURE__ */ jsx(
|
|
410
|
+
SearchInput_default,
|
|
411
|
+
{
|
|
412
|
+
className: "mr-orig__smart-search",
|
|
413
|
+
iconSize: 16,
|
|
414
|
+
placeholder: "Search vitals",
|
|
415
|
+
value: srSearch,
|
|
416
|
+
onChange: setSrSearch
|
|
417
|
+
}
|
|
418
|
+
),
|
|
419
|
+
(oorRows.length > 0 || noInterpRows.length > 0) && /* @__PURE__ */ jsx("div", { className: "mr-orig__smart-tabs-wrap", children: /* @__PURE__ */ jsx("div", { className: "mr-orig__smart-tabs", children: ["all", "oor", "none"].map((tab) => {
|
|
420
|
+
if (tab === "oor" && oorRows.length === 0) return null;
|
|
421
|
+
if (tab === "none" && noInterpRows.length === 0) return null;
|
|
366
422
|
const count = tab === "all" ? tabCounts.all : tab === "oor" ? tabCounts.oor : tabCounts.none;
|
|
367
423
|
const label = tab === "all" ? "All" : tab === "oor" ? "Out of range" : "No interpretation";
|
|
368
424
|
return /* @__PURE__ */ jsxs(
|
|
@@ -396,63 +452,79 @@ function OriginalRecordPanel({
|
|
|
396
452
|
const isOor = row.latestStatus === "high" || row.latestStatus === "low";
|
|
397
453
|
const isSelected = srSelected.has(row.key);
|
|
398
454
|
const isLast = idx === filteredRows.length - 1;
|
|
399
|
-
return /* @__PURE__ */
|
|
455
|
+
return /* @__PURE__ */ jsxs(
|
|
400
456
|
"div",
|
|
401
457
|
{
|
|
402
458
|
className: `mr-orig__vital-item${isLast ? " mr-orig__vital-item--last" : ""}`,
|
|
403
|
-
children:
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
"span",
|
|
411
|
-
{
|
|
412
|
-
className: `mr-sv__checkbox mr-cc-table__row-check${isSelected ? " mr-sv__checkbox--checked" : ""}`,
|
|
413
|
-
role: "checkbox",
|
|
414
|
-
"aria-checked": isSelected,
|
|
415
|
-
tabIndex: 0,
|
|
416
|
-
onClick: (e) => {
|
|
417
|
-
e.stopPropagation();
|
|
418
|
-
toggleSrRow(row.key);
|
|
419
|
-
},
|
|
420
|
-
onKeyDown: (e) => {
|
|
421
|
-
if (e.key === " " || e.key === "Enter") {
|
|
422
|
-
e.preventDefault();
|
|
423
|
-
e.stopPropagation();
|
|
424
|
-
toggleSrRow(row.key);
|
|
425
|
-
}
|
|
426
|
-
},
|
|
427
|
-
children: isSelected && /* @__PURE__ */ jsx(Check, { size: 10, strokeWidth: 3 })
|
|
428
|
-
}
|
|
429
|
-
),
|
|
430
|
-
/* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-info", children: [
|
|
431
|
-
/* @__PURE__ */ jsx("span", { className: "mr-orig__vital-name", children: row.name }),
|
|
432
|
-
row.refRange && /* @__PURE__ */ jsxs("span", { className: "mr-orig__vital-ref", children: [
|
|
433
|
-
"Ref ",
|
|
434
|
-
row.refRange
|
|
435
|
-
] })
|
|
436
|
-
] }),
|
|
437
|
-
cell && /* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-value", children: [
|
|
459
|
+
children: [
|
|
460
|
+
/* @__PURE__ */ jsxs(
|
|
461
|
+
"div",
|
|
462
|
+
{
|
|
463
|
+
className: `mr-orig__vital-row mr-orig__vital-row--selectable${isSelected ? " mr-orig__vital-row--selected" : ""}`,
|
|
464
|
+
onClick: () => toggleSrRow(row.key),
|
|
465
|
+
children: [
|
|
438
466
|
/* @__PURE__ */ jsx(
|
|
439
467
|
"span",
|
|
440
468
|
{
|
|
441
|
-
className: `mr-
|
|
442
|
-
|
|
469
|
+
className: `mr-sv__checkbox mr-cc-table__row-check${isSelected ? " mr-sv__checkbox--checked" : ""}`,
|
|
470
|
+
role: "checkbox",
|
|
471
|
+
"aria-checked": isSelected,
|
|
472
|
+
tabIndex: 0,
|
|
473
|
+
onClick: (e) => {
|
|
474
|
+
e.stopPropagation();
|
|
475
|
+
toggleSrRow(row.key);
|
|
476
|
+
},
|
|
477
|
+
onKeyDown: (e) => {
|
|
478
|
+
if (e.key === " " || e.key === "Enter") {
|
|
479
|
+
e.preventDefault();
|
|
480
|
+
e.stopPropagation();
|
|
481
|
+
toggleSrRow(row.key);
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
children: isSelected && /* @__PURE__ */ jsx(Check, { size: 10, strokeWidth: 3 })
|
|
443
485
|
}
|
|
444
486
|
),
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
487
|
+
/* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-info", children: [
|
|
488
|
+
/* @__PURE__ */ jsx("span", { className: "mr-orig__vital-name", children: row.name }),
|
|
489
|
+
row.refRange && /* @__PURE__ */ jsxs("span", { className: "mr-orig__vital-ref", children: [
|
|
490
|
+
"Ref ",
|
|
491
|
+
row.refRange
|
|
492
|
+
] })
|
|
493
|
+
] }),
|
|
494
|
+
cell && /* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-value", children: [
|
|
495
|
+
/* @__PURE__ */ jsx(
|
|
496
|
+
"span",
|
|
497
|
+
{
|
|
498
|
+
className: `mr-orig__vital-val${isOor ? " mr-orig__vital-val--oor" : ""}`,
|
|
499
|
+
children: cell.value
|
|
500
|
+
}
|
|
501
|
+
),
|
|
502
|
+
cell.unit && /* @__PURE__ */ jsx("span", { className: "mr-orig__vital-unit", children: cell.unit })
|
|
503
|
+
] }),
|
|
504
|
+
row.ekaId && /* @__PURE__ */ jsx(
|
|
505
|
+
"button",
|
|
506
|
+
{
|
|
507
|
+
type: "button",
|
|
508
|
+
className: `mr-orig__vital-expand-btn${expandedVital === row.key ? " mr-orig__vital-expand-btn--open" : ""}`,
|
|
509
|
+
onClick: (e) => {
|
|
510
|
+
e.stopPropagation();
|
|
511
|
+
toggleExpand(row.key);
|
|
512
|
+
},
|
|
513
|
+
"aria-label": expandedVital === row.key ? "Collapse readings" : "Show latest readings",
|
|
514
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { size: 13, "aria-hidden": true })
|
|
515
|
+
}
|
|
516
|
+
)
|
|
517
|
+
]
|
|
518
|
+
}
|
|
519
|
+
),
|
|
520
|
+
expandedVital === row.key && row.ekaId && /* @__PURE__ */ jsx(VitalReadingsExpanded, { vitalName: row.name, ekaId: row.ekaId })
|
|
521
|
+
]
|
|
450
522
|
},
|
|
451
523
|
row.key
|
|
452
524
|
);
|
|
453
525
|
})
|
|
454
526
|
] }),
|
|
455
|
-
|
|
527
|
+
/* @__PURE__ */ jsxs("div", { className: "mr-cc-table__footer", children: [
|
|
456
528
|
/* @__PURE__ */ jsx(
|
|
457
529
|
"span",
|
|
458
530
|
{
|
|
@@ -483,7 +555,7 @@ function OriginalRecordPanel({
|
|
|
483
555
|
ref: srCopyBtnRef,
|
|
484
556
|
type: "button",
|
|
485
557
|
className: "mr-cc-table__copy-note-btn",
|
|
486
|
-
disabled: !hasCopyToNote,
|
|
558
|
+
disabled: !srSomeSelected || !hasCopyToNote,
|
|
487
559
|
onClick: handleSrCopyToNote,
|
|
488
560
|
children: "Copy to note"
|
|
489
561
|
}
|
|
@@ -496,7 +568,36 @@ function OriginalRecordPanel({
|
|
|
496
568
|
)
|
|
497
569
|
] });
|
|
498
570
|
}
|
|
571
|
+
function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
572
|
+
const { store } = useSdk();
|
|
573
|
+
const recordsById = useStore(store, (s) => s.records.byId);
|
|
574
|
+
const { data: trendData, status } = useParameterTrend(ekaId);
|
|
575
|
+
const readings = useMemo(() => {
|
|
576
|
+
const trend = trendData;
|
|
577
|
+
if (!trend?.vitals_info?.length) return [];
|
|
578
|
+
return [...trend.vitals_info].sort((a, b) => (b.date ?? 0) - (a.date ?? 0)).slice(0, 3).map((info) => ({
|
|
579
|
+
value: info.val != null ? String(info.val) : info.val_string ?? "\u2014",
|
|
580
|
+
date: epochToDisplay(recordsById[info.document_id]?.createdAtEpoch ?? 0)
|
|
581
|
+
}));
|
|
582
|
+
}, [trendData, recordsById]);
|
|
583
|
+
if (status === "loading") {
|
|
584
|
+
return /* @__PURE__ */ jsx("div", { className: "mr-orig__vital-readings mr-orig__vital-readings--loading", children: /* @__PURE__ */ jsx(LoaderCircle, { size: 16, className: "mr-sv__loading-spinner", "aria-hidden": true }) });
|
|
585
|
+
}
|
|
586
|
+
if (status === "error" || !readings.length) {
|
|
587
|
+
return /* @__PURE__ */ jsx("div", { className: "mr-orig__vital-readings", children: /* @__PURE__ */ jsx(Typography, { variant: "muted", className: "mr-orig__vital-readings-empty", children: "No readings available" }) });
|
|
588
|
+
}
|
|
589
|
+
return /* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-readings", children: [
|
|
590
|
+
/* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-readings-title", children: [
|
|
591
|
+
"LATEST READINGS FOR ",
|
|
592
|
+
vitalName.toUpperCase()
|
|
593
|
+
] }),
|
|
594
|
+
/* @__PURE__ */ jsx("div", { className: "mr-orig__vital-readings-grid", children: readings.map((r, i) => /* @__PURE__ */ jsxs("div", { className: "mr-orig__vital-reading-item", children: [
|
|
595
|
+
/* @__PURE__ */ jsx("span", { className: "mr-orig__vital-reading-value", children: r.value }),
|
|
596
|
+
/* @__PURE__ */ jsx("span", { className: "mr-orig__vital-reading-date", children: r.date })
|
|
597
|
+
] }, i)) })
|
|
598
|
+
] });
|
|
599
|
+
}
|
|
499
600
|
export {
|
|
500
601
|
OriginalRecordPanel
|
|
501
602
|
};
|
|
502
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
603
|
+
//# sourceMappingURL=OriginalRecordPanel-3TXU4RSU.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, ChevronDown, ExternalLink, Check, File, LoaderCircle } 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 { useParameterTrend } from \"../../hooks/care-panel/useParameterTrend\";\nimport { epochToDisplay } from \"../../../helpers/formatters\";\nimport type { ParameterTrendResponse } from \"@eka-care/medical-records-ts-sdk\";\nimport { useSmartRecordsActions } from \"../../context/SmartRecordsActionsContext\";\nimport { IconButton, Typography, SearchInput } 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 { replaceOriginal, 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 [expandedVital, setExpandedVital] = useState<string | null>(null);\n const toggleExpand = useCallback((key: string) => {\n setExpandedVital((prev) => (prev === key ? null : key));\n }, []);\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 replaceOriginal(r.id, caseId);\n },\n [replaceOriginal, caseId],\n );\n\n const goPrev = useCallback(() => {\n if (currentIndex > 0) goTo(caseRecords[currentIndex - 1]);\n }, [currentIndex, caseRecords, goTo]);\n\n const goNext = useCallback(() => {\n if (currentIndex < total - 1) goTo(caseRecords[currentIndex + 1]);\n }, [currentIndex, total, caseRecords, goTo]);\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 useEffect(() => {\n if (srTab === \"oor\" && oorRows.length === 0) setSrTab(\"all\");\n if (srTab === \"none\" && noInterpRows.length === 0) setSrTab(\"all\");\n }, [srTab, oorRows.length, noInterpRows.length]);\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 htmlCopyBtnRef = useRef<HTMLButtonElement>(null);\n const [isHtmlCopying, setIsHtmlCopying] = useState(false);\n\n const handleHtmlCopyToNote = useCallback(async () => {\n const url = preview.files[0]?.url;\n if (!url) return;\n setIsHtmlCopying(true);\n try {\n const res = await fetch(url);\n const html = await res.text();\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n const text = doc.body.textContent?.trim() ?? \"\";\n if (!text) return;\n if (onCopyVitalsToNote) {\n void onCopyVitalsToNote(text);\n } else if (onCopyToNote) {\n const rect = htmlCopyBtnRef.current?.getBoundingClientRect();\n void onCopyToNote(\n text,\n rect ? { x: rect.left, y: rect.bottom } : undefined,\n );\n }\n } finally {\n setIsHtmlCopying(false);\n }\n }, [preview.files, 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) => { e.stopPropagation(); goPrev(); }}\n aria-label=\"Previous record\"\n disabled={currentIndex <= 0}\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) => { e.stopPropagation(); goNext(); }}\n aria-label=\"Next record\"\n disabled={currentIndex >= total - 1}\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 {preview.isHtml && hasCopyToNote && (\n <button\n ref={htmlCopyBtnRef}\n type=\"button\"\n className=\"mr-orig__html-copy-btn\"\n onClick={handleHtmlCopyToNote}\n disabled={isHtmlCopying}\n >\n {isHtmlCopying && <LoaderCircle size={12} className=\"mr-sv__loading-spinner\" aria-hidden />}\n Copy to note\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 <SearchInput\n className=\"mr-orig__smart-search\"\n iconSize={16}\n placeholder=\"Search vitals\"\n value={srSearch}\n onChange={setSrSearch}\n />\n\n {/* Filter tabs — only when at least one sub-category has data */}\n {(oorRows.length > 0 || noInterpRows.length > 0) && (\n <div className=\"mr-orig__smart-tabs-wrap\">\n <div className=\"mr-orig__smart-tabs\">\n {([\"all\", \"oor\", \"none\"] as SrTab[]).map((tab) => {\n if (tab === \"oor\" && oorRows.length === 0) return null;\n if (tab === \"none\" && noInterpRows.length === 0) return null;\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\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 mr-orig__vital-row--selectable${isSelected ? \" mr-orig__vital-row--selected\" : \"\"}`}\n onClick={() => toggleSrRow(row.key)}\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 {row.ekaId && (\n <button\n type=\"button\"\n className={`mr-orig__vital-expand-btn${expandedVital === row.key ? \" mr-orig__vital-expand-btn--open\" : \"\"}`}\n onClick={(e) => { e.stopPropagation(); toggleExpand(row.key); }}\n aria-label={expandedVital === row.key ? \"Collapse readings\" : \"Show latest readings\"}\n >\n <ChevronDown size={13} aria-hidden />\n </button>\n )}\n </div>\n {expandedVital === row.key && row.ekaId && (\n <VitalReadingsExpanded vitalName={row.name} ekaId={row.ekaId} />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\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={!srSomeSelected || !hasCopyToNote}\n onClick={handleSrCopyToNote}\n >\n Copy to note\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction VitalReadingsExpanded({ vitalName, ekaId }: { vitalName: string; ekaId: string }) {\n const { store } = useSdk();\n const recordsById = useStore(store, (s) => s.records.byId);\n const { data: trendData, status } = useParameterTrend(ekaId);\n\n const readings = useMemo(() => {\n const trend = trendData as ParameterTrendResponse | null;\n if (!trend?.vitals_info?.length) return [];\n return [...trend.vitals_info]\n .sort((a, b) => (b.date ?? 0) - (a.date ?? 0))\n .slice(0, 3)\n .map((info) => ({\n value: info.val != null ? String(info.val) : ((info as any).val_string ?? \"—\"),\n date: epochToDisplay(recordsById[info.document_id]?.createdAtEpoch ?? 0),\n }));\n }, [trendData, recordsById]);\n\n if (status === \"loading\") {\n return (\n <div className=\"mr-orig__vital-readings mr-orig__vital-readings--loading\">\n <LoaderCircle size={16} className=\"mr-sv__loading-spinner\" aria-hidden />\n </div>\n );\n }\n\n if (status === \"error\" || !readings.length) {\n return (\n <div className=\"mr-orig__vital-readings\">\n <Typography variant=\"muted\" className=\"mr-orig__vital-readings-empty\">\n No readings available\n </Typography>\n </div>\n );\n }\n\n return (\n <div className=\"mr-orig__vital-readings\">\n <div className=\"mr-orig__vital-readings-title\">\n LATEST READINGS FOR {vitalName.toUpperCase()}\n </div>\n <div className=\"mr-orig__vital-readings-grid\">\n {readings.map((r, i) => (\n <div key={i} className=\"mr-orig__vital-reading-item\">\n <span className=\"mr-orig__vital-reading-value\">{r.value}</span>\n <span className=\"mr-orig__vital-reading-date\">{r.date}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|