@eka-care/medical-records-ui 1.0.39 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{OriginalRecordPanel-PVNAZ5CR.js → OriginalRecordPanel-UHNIWIT3.js} +63 -61
- package/dist/OriginalRecordPanel-UHNIWIT3.js.map +1 -0
- package/dist/{OriginalRecordPanel-W6FNO7U2.mjs → OriginalRecordPanel-XU6ZYBPB.mjs} +45 -43
- package/dist/OriginalRecordPanel-XU6ZYBPB.mjs.map +1 -0
- package/dist/SmartUploadModal-4NFBULTI.js +9 -0
- package/dist/{SmartUploadModal-DOEIOLQU.js.map → SmartUploadModal-4NFBULTI.js.map} +1 -1
- package/dist/SmartUploadModal-II4GAIZO.mjs +9 -0
- package/dist/VitalHistoryPanel-2ZH4QOAP.mjs +10 -0
- package/dist/VitalHistoryPanel-VNSNMPBP.js +10 -0
- package/dist/{VitalHistoryPanel-WKBIR2RD.js.map → VitalHistoryPanel-VNSNMPBP.js.map} +1 -1
- package/dist/{chunk-LUH7D3K7.mjs → chunk-2QLZBSDH.mjs} +123 -11
- package/dist/chunk-2QLZBSDH.mjs.map +1 -0
- package/dist/chunk-A6OYP7CY.mjs +40 -0
- package/dist/chunk-A6OYP7CY.mjs.map +1 -0
- package/dist/{chunk-VBMKRSTX.js → chunk-APAMRQEM.js} +57 -83
- package/dist/chunk-APAMRQEM.js.map +1 -0
- package/dist/{chunk-ESURVA6B.js → chunk-BUBHVTFB.js} +21 -21
- package/dist/{chunk-ESURVA6B.js.map → chunk-BUBHVTFB.js.map} +1 -1
- package/dist/{chunk-5TQ6OPAQ.mjs → chunk-GDGLQD4W.mjs} +47 -73
- package/dist/chunk-GDGLQD4W.mjs.map +1 -0
- package/dist/{chunk-4MEMDAB5.mjs → chunk-KFSHL25P.mjs} +7 -3
- package/dist/chunk-KFSHL25P.mjs.map +1 -0
- package/dist/chunk-LV7EI4MZ.js +40 -0
- package/dist/chunk-LV7EI4MZ.js.map +1 -0
- package/dist/{chunk-YT6OD4YU.js → chunk-OIN3TV63.js} +128 -16
- package/dist/chunk-OIN3TV63.js.map +1 -0
- package/dist/{chunk-57BG7LVP.js → chunk-P7LLGYUQ.js} +7 -3
- package/dist/chunk-P7LLGYUQ.js.map +1 -0
- package/dist/{chunk-3P36QOHC.mjs → chunk-RXQLS6QF.mjs} +2 -2
- package/dist/index.css +94 -41
- package/dist/index.css.map +1 -1
- package/dist/index.js +178 -172
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +86 -80
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +94 -41
- package/dist/styles.css.map +1 -1
- package/dist/{widgets-KNUDQAKD.mjs → widgets-4KYAUU6R.mjs} +2 -2
- package/dist/widgets-WAYNWNMG.js +43 -0
- package/dist/{widgets-DYR6LERQ.js.map → widgets-WAYNWNMG.js.map} +1 -1
- package/package.json +4 -1
- package/dist/OriginalRecordPanel-PVNAZ5CR.js.map +0 -1
- package/dist/OriginalRecordPanel-W6FNO7U2.mjs.map +0 -1
- package/dist/SmartUploadModal-DOEIOLQU.js +0 -9
- package/dist/SmartUploadModal-SMDIOE3L.mjs +0 -9
- package/dist/VitalHistoryPanel-WI44AXJU.mjs +0 -10
- package/dist/VitalHistoryPanel-WKBIR2RD.js +0 -10
- package/dist/chunk-4MEMDAB5.mjs.map +0 -1
- package/dist/chunk-57BG7LVP.js.map +0 -1
- package/dist/chunk-5TQ6OPAQ.mjs.map +0 -1
- package/dist/chunk-GKREOUK2.js +0 -158
- package/dist/chunk-GKREOUK2.js.map +0 -1
- package/dist/chunk-LUH7D3K7.mjs.map +0 -1
- package/dist/chunk-MRQMRFWX.mjs +0 -158
- package/dist/chunk-MRQMRFWX.mjs.map +0 -1
- package/dist/chunk-VBMKRSTX.js.map +0 -1
- package/dist/chunk-YT6OD4YU.js.map +0 -1
- package/dist/widgets-DYR6LERQ.js +0 -43
- /package/dist/{SmartUploadModal-SMDIOE3L.mjs.map → SmartUploadModal-II4GAIZO.mjs.map} +0 -0
- /package/dist/{VitalHistoryPanel-WI44AXJU.mjs.map → VitalHistoryPanel-2ZH4QOAP.mjs.map} +0 -0
- /package/dist/{chunk-3P36QOHC.mjs.map → chunk-RXQLS6QF.mjs.map} +0 -0
- /package/dist/{widgets-KNUDQAKD.mjs.map → widgets-4KYAUU6R.mjs.map} +0 -0
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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; }"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
var _chunkLV7EI4MZjs = require('./chunk-LV7EI4MZ.js');
|
|
4
5
|
|
|
5
|
-
var _chunkGKREOUK2js = require('./chunk-GKREOUK2.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkOIN3TV63js = require('./chunk-OIN3TV63.js');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
|
|
18
|
+
var _chunkP7LLGYUQjs = require('./chunk-P7LLGYUQ.js');
|
|
18
19
|
|
|
19
20
|
// src/views/components/shared/OriginalRecordPanel.tsx
|
|
20
21
|
var _react = require('react');
|
|
@@ -38,12 +39,12 @@ function OriginalRecordPanel({
|
|
|
38
39
|
caseId,
|
|
39
40
|
onBack
|
|
40
41
|
}) {
|
|
41
|
-
const { store } =
|
|
42
|
+
const { store } = _chunkP7LLGYUQjs.useSdk.call(void 0, );
|
|
42
43
|
const record = _zustand.useStore.call(void 0, store, (s) => s.records.byId[recordId]);
|
|
43
44
|
const recordsById = _zustand.useStore.call(void 0, store, (s) => s.records.byId);
|
|
44
|
-
const preview =
|
|
45
|
-
const { replaceOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } =
|
|
46
|
-
const { status: vitalsStatus, table } =
|
|
45
|
+
const preview = _chunkOIN3TV63js.useRecordPreview.call(void 0, recordId);
|
|
46
|
+
const { replaceOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote, onToast } = _chunkOIN3TV63js.useSmartRecordsActions.call(void 0, );
|
|
47
|
+
const { status: vitalsStatus, table } = _chunkOIN3TV63js.useRecordPanelTable.call(void 0,
|
|
47
48
|
_optionalChain([record, 'optionalAccess', _3 => _3.isSmart]) ? recordId : null
|
|
48
49
|
);
|
|
49
50
|
const [smartPanelOpen, setSmartPanelOpen] = _react.useState.call(void 0, true);
|
|
@@ -69,10 +70,13 @@ function OriginalRecordPanel({
|
|
|
69
70
|
}, [dropdownOpen]);
|
|
70
71
|
const caseRecords = _react.useMemo.call(void 0, () => {
|
|
71
72
|
if (!caseId) return [];
|
|
72
|
-
return Object.values(recordsById).filter(
|
|
73
|
+
return Object.values(recordsById).filter(
|
|
74
|
+
(r) => r != null && (caseId === "__ungrouped__" ? r.cases.length === 0 : r.cases.includes(caseId))
|
|
75
|
+
).sort((a, b) => b.createdAtEpoch - a.createdAtEpoch);
|
|
73
76
|
}, [recordsById, caseId]);
|
|
74
77
|
const currentIndex = caseRecords.findIndex((r) => r.id === recordId);
|
|
75
78
|
const total = caseRecords.length;
|
|
79
|
+
const isUngrouped = caseId === "__ungrouped__";
|
|
76
80
|
const goTo = _react.useCallback.call(void 0,
|
|
77
81
|
(r) => {
|
|
78
82
|
setDropdownOpen(false);
|
|
@@ -167,24 +171,20 @@ function OriginalRecordPanel({
|
|
|
167
171
|
rect ? { x: rect.left, y: rect.bottom } : void 0
|
|
168
172
|
);
|
|
169
173
|
}
|
|
174
|
+
} catch (e2) {
|
|
175
|
+
_optionalChain([onToast, 'optionalCall', _17 => _17("Failed to copy document text", "error")]);
|
|
170
176
|
} finally {
|
|
171
177
|
setIsHtmlCopying(false);
|
|
172
178
|
}
|
|
173
|
-
}, [preview.files, onCopyVitalsToNote, onCopyToNote]);
|
|
174
|
-
const isSmart = _nullishCoalesce(_optionalChain([record, 'optionalAccess',
|
|
179
|
+
}, [preview.files, onCopyVitalsToNote, onCopyToNote, onToast]);
|
|
180
|
+
const isSmart = _nullishCoalesce(_optionalChain([record, 'optionalAccess', _18 => _18.isSmart]), () => ( false));
|
|
175
181
|
const hasPreview = preview.status === "loaded" && preview.files.length > 0;
|
|
176
182
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel", children: [
|
|
177
183
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel-header", children: [
|
|
178
|
-
/* @__PURE__ */ _jsxruntime.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
label: "Back",
|
|
183
|
-
variant: "ghost",
|
|
184
|
-
size: "sm",
|
|
185
|
-
onClick: onBack
|
|
186
|
-
}
|
|
187
|
-
),
|
|
184
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "button", { type: "button", className: "mr-sv__back-btn", onClick: onBack, children: [
|
|
185
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft, { size: 16, "aria-hidden": true }),
|
|
186
|
+
"Back"
|
|
187
|
+
] }),
|
|
188
188
|
showNavPicker ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__nav-wrap", ref: dropdownRef, children: [
|
|
189
189
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
190
190
|
"div",
|
|
@@ -215,7 +215,7 @@ function OriginalRecordPanel({
|
|
|
215
215
|
}
|
|
216
216
|
),
|
|
217
217
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__nav-text", children: [
|
|
218
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__nav-title", children: _nullishCoalesce(_optionalChain([record, 'optionalAccess',
|
|
218
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__nav-title", children: _nullishCoalesce(_optionalChain([record, 'optionalAccess', _19 => _19.title]), () => ( "Record")) }),
|
|
219
219
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-orig__nav-counter", children: [
|
|
220
220
|
currentIndex + 1,
|
|
221
221
|
" of ",
|
|
@@ -244,7 +244,8 @@ function OriginalRecordPanel({
|
|
|
244
244
|
total,
|
|
245
245
|
" RECORD",
|
|
246
246
|
total !== 1 ? "S" : "",
|
|
247
|
-
"
|
|
247
|
+
" ",
|
|
248
|
+
isUngrouped ? "WITH NO CARE CONTEXT" : "FOUND IN THIS ENCOUNTER"
|
|
248
249
|
] }),
|
|
249
250
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__dropdown-list", children: caseRecords.map((r) => {
|
|
250
251
|
const isActive = r.id === recordId;
|
|
@@ -258,7 +259,7 @@ function OriginalRecordPanel({
|
|
|
258
259
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-icon", children: [
|
|
259
260
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.File, { size: 16, "aria-hidden": true }),
|
|
260
261
|
r.isSmart && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
261
|
-
|
|
262
|
+
_chunkLV7EI4MZjs.SmartSparkles_default,
|
|
262
263
|
{
|
|
263
264
|
className: "mr-orig__dropdown-smart-dot",
|
|
264
265
|
"aria-label": "Smart report"
|
|
@@ -269,12 +270,13 @@ function OriginalRecordPanel({
|
|
|
269
270
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-title-row", children: [
|
|
270
271
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__dropdown-title", children: r.title }),
|
|
271
272
|
r.isSmart && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-orig__dropdown-smart-badge", children: [
|
|
272
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
273
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLV7EI4MZjs.SmartSparkles_default, { "aria-hidden": true }),
|
|
273
274
|
"Smart Report"
|
|
274
|
-
] })
|
|
275
|
+
] }),
|
|
276
|
+
_optionalChain([r, 'access', _20 => _20.fileType, 'optionalAccess', _21 => _21.toUpperCase, 'call', _22 => _22()]) === "HTML" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-tag-chip mr-tag-chip--html", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-tag-chip__label", children: "HTML" }) })
|
|
275
277
|
] }),
|
|
276
278
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__dropdown-meta", children: [
|
|
277
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children:
|
|
279
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkP7LLGYUQjs.epochToDisplay.call(void 0, r.createdAtEpoch) }),
|
|
278
280
|
r.isSmart && r.totalVitals > 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
279
281
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__dropdown-dot", children: "\xB7" }),
|
|
280
282
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
|
|
@@ -306,22 +308,10 @@ function OriginalRecordPanel({
|
|
|
306
308
|
}) })
|
|
307
309
|
] })
|
|
308
310
|
] }) : record ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-sv__panel-info", children: [
|
|
309
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
310
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
311
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "label", as: "span", className: "mr-sv__panel-name", children: record.title }),
|
|
312
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "hint", as: "span", className: "mr-sv__panel-meta-text", children: _chunkP7LLGYUQjs.epochToDisplay.call(void 0, record.createdAtEpoch) })
|
|
311
313
|
] }) : null,
|
|
312
314
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__header-actions", children: [
|
|
313
|
-
isSmart && !smartPanelOpen && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
314
|
-
"button",
|
|
315
|
-
{
|
|
316
|
-
type: "button",
|
|
317
|
-
className: "mr-orig__show-smart-btn",
|
|
318
|
-
onClick: () => setSmartPanelOpen(true),
|
|
319
|
-
children: [
|
|
320
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGKREOUK2js.SmartSparkles_default, { "aria-hidden": true }),
|
|
321
|
-
"Smart Report"
|
|
322
|
-
]
|
|
323
|
-
}
|
|
324
|
-
),
|
|
325
315
|
preview.isHtml && hasCopyToNote && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
326
316
|
"button",
|
|
327
317
|
{
|
|
@@ -337,7 +327,7 @@ function OriginalRecordPanel({
|
|
|
337
327
|
}
|
|
338
328
|
),
|
|
339
329
|
hasPreview && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
340
|
-
|
|
330
|
+
_chunkP7LLGYUQjs.IconButton,
|
|
341
331
|
{
|
|
342
332
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ExternalLink, { size: 16, "aria-hidden": true }),
|
|
343
333
|
label: "Open in new tab",
|
|
@@ -366,8 +356,8 @@ function OriginalRecordPanel({
|
|
|
366
356
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { size: 44, className: "mr-sv__loading-spinner", "aria-hidden": true })
|
|
367
357
|
}
|
|
368
358
|
),
|
|
369
|
-
preview.status === "error" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
370
|
-
preview.status === "loaded" && preview.files.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
359
|
+
preview.status === "error" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "muted", className: "mr-sv__panel-empty", children: "Failed to load document preview." }),
|
|
360
|
+
preview.status === "loaded" && preview.files.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "muted", className: "mr-sv__panel-empty", children: "No preview available for this record." }),
|
|
371
361
|
hasPreview && !isSmart && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
372
362
|
"div",
|
|
373
363
|
{
|
|
@@ -377,7 +367,7 @@ function OriginalRecordPanel({
|
|
|
377
367
|
DocumentViewer,
|
|
378
368
|
{
|
|
379
369
|
files: preview.files,
|
|
380
|
-
title: _nullishCoalesce(_optionalChain([record, 'optionalAccess',
|
|
370
|
+
title: _nullishCoalesce(_optionalChain([record, 'optionalAccess', _23 => _23.title]), () => ( "")),
|
|
381
371
|
isHtml: preview.isHtml
|
|
382
372
|
}
|
|
383
373
|
) })
|
|
@@ -388,26 +378,30 @@ function OriginalRecordPanel({
|
|
|
388
378
|
DocumentViewer,
|
|
389
379
|
{
|
|
390
380
|
files: preview.files,
|
|
391
|
-
title: _nullishCoalesce(_optionalChain([record, 'optionalAccess',
|
|
381
|
+
title: _nullishCoalesce(_optionalChain([record, 'optionalAccess', _24 => _24.title]), () => ( "")),
|
|
392
382
|
isHtml: preview.isHtml
|
|
393
383
|
}
|
|
394
384
|
) }) }),
|
|
395
|
-
smartPanelOpen
|
|
385
|
+
smartPanelOpen ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__smart-side", children: [
|
|
396
386
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__smart-hdr", children: [
|
|
397
|
-
/* @__PURE__ */ _jsxruntime.
|
|
387
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-orig__smart-title-row", children: [
|
|
388
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__smart-title", children: "Smart Report" }),
|
|
389
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLV7EI4MZjs.SmartSparkles_default, { className: "mr-orig__smart-title-icon", "aria-hidden": true })
|
|
390
|
+
] }),
|
|
398
391
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
399
392
|
"button",
|
|
400
393
|
{
|
|
401
394
|
type: "button",
|
|
402
|
-
className: "mr-
|
|
395
|
+
className: "mr-sv__sidebar-collapse-btn mr-orig__smart-expanded-btn",
|
|
403
396
|
"aria-label": "Collapse smart report panel",
|
|
397
|
+
"aria-expanded": true,
|
|
404
398
|
onClick: () => setSmartPanelOpen(false),
|
|
405
|
-
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { size:
|
|
399
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { size: 14, "aria-hidden": true })
|
|
406
400
|
}
|
|
407
401
|
)
|
|
408
402
|
] }),
|
|
409
403
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
410
|
-
|
|
404
|
+
_chunkP7LLGYUQjs.SearchInput_default,
|
|
411
405
|
{
|
|
412
406
|
className: "mr-orig__smart-search",
|
|
413
407
|
iconSize: 16,
|
|
@@ -446,7 +440,7 @@ function OriginalRecordPanel({
|
|
|
446
440
|
"aria-hidden": true
|
|
447
441
|
}
|
|
448
442
|
) }),
|
|
449
|
-
vitalsStatus === "loaded" && filteredRows.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
443
|
+
vitalsStatus === "loaded" && filteredRows.length === 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "muted", className: "mr-orig__smart-empty", children: "No vitals match." }),
|
|
450
444
|
vitalsStatus === "loaded" && filteredRows.map((row, idx) => {
|
|
451
445
|
const cell = row.cells[0];
|
|
452
446
|
const isOor = row.latestStatus === "high" || row.latestStatus === "low";
|
|
@@ -542,7 +536,7 @@ function OriginalRecordPanel({
|
|
|
542
536
|
children: srAllSelected && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Check, { size: 10, strokeWidth: 3 })
|
|
543
537
|
}
|
|
544
538
|
),
|
|
545
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-cc-table__footer-label", children: "Select all" }),
|
|
539
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-cc-table__footer-label", onClick: toggleSrAll, children: "Select all" }),
|
|
546
540
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "mr-cc-table__footer-count", children: [
|
|
547
541
|
srSelected.size,
|
|
548
542
|
" of ",
|
|
@@ -561,7 +555,17 @@ function OriginalRecordPanel({
|
|
|
561
555
|
}
|
|
562
556
|
)
|
|
563
557
|
] })
|
|
564
|
-
] })
|
|
558
|
+
] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__smart-side mr-orig__smart-side--collapsed", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Tooltip, { content: "Show smart report", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
559
|
+
"button",
|
|
560
|
+
{
|
|
561
|
+
type: "button",
|
|
562
|
+
className: "mr-sv__sidebar-collapse-btn mr-orig__smart-collapsed-btn",
|
|
563
|
+
"aria-label": "Expand smart report panel",
|
|
564
|
+
"aria-expanded": false,
|
|
565
|
+
onClick: () => setSmartPanelOpen(true),
|
|
566
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__smart-collapsed-icon-wrap", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLV7EI4MZjs.SmartSparkles_default, { className: "mr-orig__smart-collapsed-icon", "aria-hidden": true }) })
|
|
567
|
+
}
|
|
568
|
+
) }) })
|
|
565
569
|
] })
|
|
566
570
|
]
|
|
567
571
|
}
|
|
@@ -569,27 +573,25 @@ function OriginalRecordPanel({
|
|
|
569
573
|
] });
|
|
570
574
|
}
|
|
571
575
|
function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
572
|
-
const {
|
|
573
|
-
const recordsById = _zustand.useStore.call(void 0, store, (s) => s.records.byId);
|
|
574
|
-
const { data: trendData, status } = _chunkYT6OD4YUjs.useParameterTrend.call(void 0, ekaId);
|
|
576
|
+
const { data: trendData, status } = _chunkOIN3TV63js.useParameterTrend.call(void 0, ekaId);
|
|
575
577
|
const readings = _react.useMemo.call(void 0, () => {
|
|
576
578
|
const trend = trendData;
|
|
577
|
-
if (!_optionalChain([trend, 'optionalAccess',
|
|
579
|
+
if (!_optionalChain([trend, 'optionalAccess', _25 => _25.vitals_info, 'optionalAccess', _26 => _26.length])) return [];
|
|
578
580
|
return [...trend.vitals_info].sort((a, b) => (_nullishCoalesce(b.date, () => ( 0))) - (_nullishCoalesce(a.date, () => ( 0)))).slice(0, 3).map((info) => {
|
|
579
581
|
const dr = (_nullishCoalesce(info.display_result, () => ( ""))).toLowerCase();
|
|
580
582
|
const isOor = dr.includes("high") || dr.includes("above") || dr.includes("abnormal_high") || dr.includes("low") || dr.includes("below") || dr.includes("abnormal_low");
|
|
581
583
|
return {
|
|
582
584
|
value: info.val != null ? String(info.val) : _nullishCoalesce(info.val_string, () => ( "\u2014")),
|
|
583
|
-
date:
|
|
585
|
+
date: info.display_time || "",
|
|
584
586
|
isOor
|
|
585
587
|
};
|
|
586
588
|
});
|
|
587
|
-
}, [trendData
|
|
589
|
+
}, [trendData]);
|
|
588
590
|
if (status === "loading") {
|
|
589
591
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__vital-readings mr-orig__vital-readings--loading", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.LoaderCircle, { size: 16, className: "mr-sv__loading-spinner", "aria-hidden": true }) });
|
|
590
592
|
}
|
|
591
593
|
if (status === "error" || !readings.length) {
|
|
592
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__vital-readings", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
594
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__vital-readings", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP7LLGYUQjs.Typography, { variant: "muted", className: "mr-orig__vital-readings-empty", children: "No readings available" }) });
|
|
593
595
|
}
|
|
594
596
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__vital-readings", children: [
|
|
595
597
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__vital-readings-title", children: [
|
|
@@ -605,4 +607,4 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
605
607
|
|
|
606
608
|
|
|
607
609
|
exports.OriginalRecordPanel = OriginalRecordPanel;
|
|
608
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
610
|
+
//# sourceMappingURL=OriginalRecordPanel-UHNIWIT3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/OriginalRecordPanel-UHNIWIT3.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-UHNIWIT3.js","sourcesContent":[null,"\"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, Tooltip } 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, onToast } =\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(\n (r): r is RecordItem =>\n r != null &&\n (caseId === \"__ungrouped__\" ? r.cases.length === 0 : r.cases.includes(caseId)),\n )\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 const isUngrouped = caseId === \"__ungrouped__\";\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 } catch {\n onToast?.(\"Failed to copy document text\", \"error\");\n } finally {\n setIsHtmlCopying(false);\n }\n }, [preview.files, onCopyVitalsToNote, onCopyToNote, onToast]);\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 <button type=\"button\" className=\"mr-sv__back-btn\" onClick={onBack}>\n <ChevronLeft size={16} aria-hidden />\n Back\n </button>\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\" : \"\"}{\" \"}\n {isUngrouped ? \"WITH NO CARE CONTEXT\" : \"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 {r.fileType?.toUpperCase() === \"HTML\" && (\n <span className=\"mr-tag-chip mr-tag-chip--html\">\n <span className=\"mr-tag-chip__label\">HTML</span>\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 {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-row\">\n <span className=\"mr-orig__smart-title\">Smart Report</span>\n <SmartSparkles className=\"mr-orig__smart-title-icon\" aria-hidden />\n </span>\n <button\n type=\"button\"\n className=\"mr-sv__sidebar-collapse-btn mr-orig__smart-expanded-btn\"\n aria-label=\"Collapse smart report panel\"\n aria-expanded={true}\n onClick={() => setSmartPanelOpen(false)}\n >\n <ChevronRight size={14} 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\" onClick={toggleSrAll}>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 className=\"mr-orig__smart-side mr-orig__smart-side--collapsed\">\n <Tooltip content=\"Show smart report\">\n <button\n type=\"button\"\n className=\"mr-sv__sidebar-collapse-btn mr-orig__smart-collapsed-btn\"\n aria-label=\"Expand smart report panel\"\n aria-expanded={false}\n onClick={() => setSmartPanelOpen(true)}\n >\n <span className=\"mr-orig__smart-collapsed-icon-wrap\">\n <SmartSparkles className=\"mr-orig__smart-collapsed-icon\" aria-hidden />\n </span>\n </button>\n </Tooltip>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction VitalReadingsExpanded({ vitalName, ekaId }: { vitalName: string; ekaId: string }) {\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 const dr = (info.display_result ?? \"\").toLowerCase();\n const isOor = dr.includes(\"high\") || dr.includes(\"above\") || dr.includes(\"abnormal_high\") ||\n dr.includes(\"low\") || dr.includes(\"below\") || dr.includes(\"abnormal_low\");\n return {\n value: info.val != null ? String(info.val) : ((info as any).val_string ?? \"—\"),\n date: info.display_time || \"\",\n isOor,\n };\n });\n }, [trendData]);\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.isOor ? \" mr-orig__vital-reading-value--oor\" : \"\"}`}>{r.value}</span>\n <span className=\"mr-orig__vital-reading-date\">{r.date}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
-
SmartSparkles_default
|
|
4
|
-
|
|
5
|
-
} from "./chunk-MRQMRFWX.mjs";
|
|
3
|
+
SmartSparkles_default
|
|
4
|
+
} from "./chunk-A6OYP7CY.mjs";
|
|
6
5
|
import {
|
|
7
6
|
useParameterTrend,
|
|
7
|
+
useRecordPanelTable,
|
|
8
8
|
useRecordPreview,
|
|
9
9
|
useSmartRecordsActions
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2QLZBSDH.mjs";
|
|
11
11
|
import {
|
|
12
12
|
IconButton,
|
|
13
13
|
SearchInput_default,
|
|
14
|
+
Tooltip,
|
|
14
15
|
Typography,
|
|
15
16
|
epochToDisplay,
|
|
16
17
|
useSdk
|
|
17
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-KFSHL25P.mjs";
|
|
18
19
|
|
|
19
20
|
// src/views/components/shared/OriginalRecordPanel.tsx
|
|
20
21
|
import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -42,7 +43,7 @@ function OriginalRecordPanel({
|
|
|
42
43
|
const record = useStore(store, (s) => s.records.byId[recordId]);
|
|
43
44
|
const recordsById = useStore(store, (s) => s.records.byId);
|
|
44
45
|
const preview = useRecordPreview(recordId);
|
|
45
|
-
const { replaceOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote } = useSmartRecordsActions();
|
|
46
|
+
const { replaceOriginal, onCopyToNote, onCopyVitalsToNote, hasCopyToNote, onToast } = useSmartRecordsActions();
|
|
46
47
|
const { status: vitalsStatus, table } = useRecordPanelTable(
|
|
47
48
|
record?.isSmart ? recordId : null
|
|
48
49
|
);
|
|
@@ -69,10 +70,13 @@ function OriginalRecordPanel({
|
|
|
69
70
|
}, [dropdownOpen]);
|
|
70
71
|
const caseRecords = useMemo(() => {
|
|
71
72
|
if (!caseId) return [];
|
|
72
|
-
return Object.values(recordsById).filter(
|
|
73
|
+
return Object.values(recordsById).filter(
|
|
74
|
+
(r) => r != null && (caseId === "__ungrouped__" ? r.cases.length === 0 : r.cases.includes(caseId))
|
|
75
|
+
).sort((a, b) => b.createdAtEpoch - a.createdAtEpoch);
|
|
73
76
|
}, [recordsById, caseId]);
|
|
74
77
|
const currentIndex = caseRecords.findIndex((r) => r.id === recordId);
|
|
75
78
|
const total = caseRecords.length;
|
|
79
|
+
const isUngrouped = caseId === "__ungrouped__";
|
|
76
80
|
const goTo = useCallback(
|
|
77
81
|
(r) => {
|
|
78
82
|
setDropdownOpen(false);
|
|
@@ -167,24 +171,20 @@ function OriginalRecordPanel({
|
|
|
167
171
|
rect ? { x: rect.left, y: rect.bottom } : void 0
|
|
168
172
|
);
|
|
169
173
|
}
|
|
174
|
+
} catch {
|
|
175
|
+
onToast?.("Failed to copy document text", "error");
|
|
170
176
|
} finally {
|
|
171
177
|
setIsHtmlCopying(false);
|
|
172
178
|
}
|
|
173
|
-
}, [preview.files, onCopyVitalsToNote, onCopyToNote]);
|
|
179
|
+
}, [preview.files, onCopyVitalsToNote, onCopyToNote, onToast]);
|
|
174
180
|
const isSmart = record?.isSmart ?? false;
|
|
175
181
|
const hasPreview = preview.status === "loaded" && preview.files.length > 0;
|
|
176
182
|
return /* @__PURE__ */ jsxs("div", { className: "mr-sv__panel", children: [
|
|
177
183
|
/* @__PURE__ */ jsxs("div", { className: "mr-sv__panel-header", children: [
|
|
178
|
-
/* @__PURE__ */
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
label: "Back",
|
|
183
|
-
variant: "ghost",
|
|
184
|
-
size: "sm",
|
|
185
|
-
onClick: onBack
|
|
186
|
-
}
|
|
187
|
-
),
|
|
184
|
+
/* @__PURE__ */ jsxs("button", { type: "button", className: "mr-sv__back-btn", onClick: onBack, children: [
|
|
185
|
+
/* @__PURE__ */ jsx(ChevronLeft, { size: 16, "aria-hidden": true }),
|
|
186
|
+
"Back"
|
|
187
|
+
] }),
|
|
188
188
|
showNavPicker ? /* @__PURE__ */ jsxs("div", { className: "mr-orig__nav-wrap", ref: dropdownRef, children: [
|
|
189
189
|
/* @__PURE__ */ jsxs(
|
|
190
190
|
"div",
|
|
@@ -244,7 +244,8 @@ function OriginalRecordPanel({
|
|
|
244
244
|
total,
|
|
245
245
|
" RECORD",
|
|
246
246
|
total !== 1 ? "S" : "",
|
|
247
|
-
"
|
|
247
|
+
" ",
|
|
248
|
+
isUngrouped ? "WITH NO CARE CONTEXT" : "FOUND IN THIS ENCOUNTER"
|
|
248
249
|
] }),
|
|
249
250
|
/* @__PURE__ */ jsx("div", { className: "mr-orig__dropdown-list", children: caseRecords.map((r) => {
|
|
250
251
|
const isActive = r.id === recordId;
|
|
@@ -271,7 +272,8 @@ function OriginalRecordPanel({
|
|
|
271
272
|
r.isSmart && /* @__PURE__ */ jsxs("span", { className: "mr-orig__dropdown-smart-badge", children: [
|
|
272
273
|
/* @__PURE__ */ jsx(SmartSparkles_default, { "aria-hidden": true }),
|
|
273
274
|
"Smart Report"
|
|
274
|
-
] })
|
|
275
|
+
] }),
|
|
276
|
+
r.fileType?.toUpperCase() === "HTML" && /* @__PURE__ */ jsx("span", { className: "mr-tag-chip mr-tag-chip--html", children: /* @__PURE__ */ jsx("span", { className: "mr-tag-chip__label", children: "HTML" }) })
|
|
275
277
|
] }),
|
|
276
278
|
/* @__PURE__ */ jsxs("div", { className: "mr-orig__dropdown-meta", children: [
|
|
277
279
|
/* @__PURE__ */ jsx("span", { children: epochToDisplay(r.createdAtEpoch) }),
|
|
@@ -310,18 +312,6 @@ function OriginalRecordPanel({
|
|
|
310
312
|
/* @__PURE__ */ jsx(Typography, { variant: "hint", as: "span", className: "mr-sv__panel-meta-text", children: epochToDisplay(record.createdAtEpoch) })
|
|
311
313
|
] }) : null,
|
|
312
314
|
/* @__PURE__ */ jsxs("div", { className: "mr-orig__header-actions", children: [
|
|
313
|
-
isSmart && !smartPanelOpen && /* @__PURE__ */ jsxs(
|
|
314
|
-
"button",
|
|
315
|
-
{
|
|
316
|
-
type: "button",
|
|
317
|
-
className: "mr-orig__show-smart-btn",
|
|
318
|
-
onClick: () => setSmartPanelOpen(true),
|
|
319
|
-
children: [
|
|
320
|
-
/* @__PURE__ */ jsx(SmartSparkles_default, { "aria-hidden": true }),
|
|
321
|
-
"Smart Report"
|
|
322
|
-
]
|
|
323
|
-
}
|
|
324
|
-
),
|
|
325
315
|
preview.isHtml && hasCopyToNote && /* @__PURE__ */ jsxs(
|
|
326
316
|
"button",
|
|
327
317
|
{
|
|
@@ -392,17 +382,21 @@ function OriginalRecordPanel({
|
|
|
392
382
|
isHtml: preview.isHtml
|
|
393
383
|
}
|
|
394
384
|
) }) }),
|
|
395
|
-
smartPanelOpen
|
|
385
|
+
smartPanelOpen ? /* @__PURE__ */ jsxs("div", { className: "mr-orig__smart-side", children: [
|
|
396
386
|
/* @__PURE__ */ jsxs("div", { className: "mr-orig__smart-hdr", children: [
|
|
397
|
-
/* @__PURE__ */
|
|
387
|
+
/* @__PURE__ */ jsxs("span", { className: "mr-orig__smart-title-row", children: [
|
|
388
|
+
/* @__PURE__ */ jsx("span", { className: "mr-orig__smart-title", children: "Smart Report" }),
|
|
389
|
+
/* @__PURE__ */ jsx(SmartSparkles_default, { className: "mr-orig__smart-title-icon", "aria-hidden": true })
|
|
390
|
+
] }),
|
|
398
391
|
/* @__PURE__ */ jsx(
|
|
399
392
|
"button",
|
|
400
393
|
{
|
|
401
394
|
type: "button",
|
|
402
|
-
className: "mr-
|
|
395
|
+
className: "mr-sv__sidebar-collapse-btn mr-orig__smart-expanded-btn",
|
|
403
396
|
"aria-label": "Collapse smart report panel",
|
|
397
|
+
"aria-expanded": true,
|
|
404
398
|
onClick: () => setSmartPanelOpen(false),
|
|
405
|
-
children: /* @__PURE__ */ jsx(ChevronRight, { size:
|
|
399
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { size: 14, "aria-hidden": true })
|
|
406
400
|
}
|
|
407
401
|
)
|
|
408
402
|
] }),
|
|
@@ -542,7 +536,7 @@ function OriginalRecordPanel({
|
|
|
542
536
|
children: srAllSelected && /* @__PURE__ */ jsx(Check, { size: 10, strokeWidth: 3 })
|
|
543
537
|
}
|
|
544
538
|
),
|
|
545
|
-
/* @__PURE__ */ jsx("span", { className: "mr-cc-table__footer-label", children: "Select all" }),
|
|
539
|
+
/* @__PURE__ */ jsx("span", { className: "mr-cc-table__footer-label", onClick: toggleSrAll, children: "Select all" }),
|
|
546
540
|
/* @__PURE__ */ jsxs("span", { className: "mr-cc-table__footer-count", children: [
|
|
547
541
|
srSelected.size,
|
|
548
542
|
" of ",
|
|
@@ -561,7 +555,17 @@ function OriginalRecordPanel({
|
|
|
561
555
|
}
|
|
562
556
|
)
|
|
563
557
|
] })
|
|
564
|
-
] })
|
|
558
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "mr-orig__smart-side mr-orig__smart-side--collapsed", children: /* @__PURE__ */ jsx(Tooltip, { content: "Show smart report", children: /* @__PURE__ */ jsx(
|
|
559
|
+
"button",
|
|
560
|
+
{
|
|
561
|
+
type: "button",
|
|
562
|
+
className: "mr-sv__sidebar-collapse-btn mr-orig__smart-collapsed-btn",
|
|
563
|
+
"aria-label": "Expand smart report panel",
|
|
564
|
+
"aria-expanded": false,
|
|
565
|
+
onClick: () => setSmartPanelOpen(true),
|
|
566
|
+
children: /* @__PURE__ */ jsx("span", { className: "mr-orig__smart-collapsed-icon-wrap", children: /* @__PURE__ */ jsx(SmartSparkles_default, { className: "mr-orig__smart-collapsed-icon", "aria-hidden": true }) })
|
|
567
|
+
}
|
|
568
|
+
) }) })
|
|
565
569
|
] })
|
|
566
570
|
]
|
|
567
571
|
}
|
|
@@ -569,8 +573,6 @@ function OriginalRecordPanel({
|
|
|
569
573
|
] });
|
|
570
574
|
}
|
|
571
575
|
function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
572
|
-
const { store } = useSdk();
|
|
573
|
-
const recordsById = useStore(store, (s) => s.records.byId);
|
|
574
576
|
const { data: trendData, status } = useParameterTrend(ekaId);
|
|
575
577
|
const readings = useMemo(() => {
|
|
576
578
|
const trend = trendData;
|
|
@@ -580,11 +582,11 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
580
582
|
const isOor = dr.includes("high") || dr.includes("above") || dr.includes("abnormal_high") || dr.includes("low") || dr.includes("below") || dr.includes("abnormal_low");
|
|
581
583
|
return {
|
|
582
584
|
value: info.val != null ? String(info.val) : info.val_string ?? "\u2014",
|
|
583
|
-
date:
|
|
585
|
+
date: info.display_time || "",
|
|
584
586
|
isOor
|
|
585
587
|
};
|
|
586
588
|
});
|
|
587
|
-
}, [trendData
|
|
589
|
+
}, [trendData]);
|
|
588
590
|
if (status === "loading") {
|
|
589
591
|
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 }) });
|
|
590
592
|
}
|
|
@@ -605,4 +607,4 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
605
607
|
export {
|
|
606
608
|
OriginalRecordPanel
|
|
607
609
|
};
|
|
608
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
610
|
+
//# sourceMappingURL=OriginalRecordPanel-XU6ZYBPB.mjs.map
|