@eka-care/medical-records-ui 1.0.37 → 1.0.39
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-YQ2LGVFU.js → OriginalRecordPanel-PVNAZ5CR.js} +11 -6
- package/dist/OriginalRecordPanel-PVNAZ5CR.js.map +1 -0
- package/dist/{OriginalRecordPanel-3TXU4RSU.mjs → OriginalRecordPanel-W6FNO7U2.mjs} +11 -6
- package/dist/{OriginalRecordPanel-3TXU4RSU.mjs.map → OriginalRecordPanel-W6FNO7U2.mjs.map} +1 -1
- package/dist/index.css +3 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +3 -0
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
- package/dist/OriginalRecordPanel-YQ2LGVFU.js.map +0 -1
|
@@ -575,10 +575,15 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
575
575
|
const readings = _react.useMemo.call(void 0, () => {
|
|
576
576
|
const trend = trendData;
|
|
577
577
|
if (!_optionalChain([trend, 'optionalAccess', _21 => _21.vitals_info, 'optionalAccess', _22 => _22.length])) return [];
|
|
578
|
-
return [...trend.vitals_info].sort((a, b) => (_nullishCoalesce(b.date, () => ( 0))) - (_nullishCoalesce(a.date, () => ( 0)))).slice(0, 3).map((info) =>
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
578
|
+
return [...trend.vitals_info].sort((a, b) => (_nullishCoalesce(b.date, () => ( 0))) - (_nullishCoalesce(a.date, () => ( 0)))).slice(0, 3).map((info) => {
|
|
579
|
+
const dr = (_nullishCoalesce(info.display_result, () => ( ""))).toLowerCase();
|
|
580
|
+
const isOor = dr.includes("high") || dr.includes("above") || dr.includes("abnormal_high") || dr.includes("low") || dr.includes("below") || dr.includes("abnormal_low");
|
|
581
|
+
return {
|
|
582
|
+
value: info.val != null ? String(info.val) : _nullishCoalesce(info.val_string, () => ( "\u2014")),
|
|
583
|
+
date: _chunk57BG7LVPjs.epochToDisplay.call(void 0, _nullishCoalesce(_optionalChain([recordsById, 'access', _23 => _23[info.document_id], 'optionalAccess', _24 => _24.createdAtEpoch]), () => ( 0))),
|
|
584
|
+
isOor
|
|
585
|
+
};
|
|
586
|
+
});
|
|
582
587
|
}, [trendData, recordsById]);
|
|
583
588
|
if (status === "loading") {
|
|
584
589
|
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 }) });
|
|
@@ -592,7 +597,7 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
592
597
|
vitalName.toUpperCase()
|
|
593
598
|
] }),
|
|
594
599
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mr-orig__vital-readings-grid", children: readings.map((r, i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mr-orig__vital-reading-item", children: [
|
|
595
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__vital-reading-value"
|
|
600
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: `mr-orig__vital-reading-value${r.isOor ? " mr-orig__vital-reading-value--oor" : ""}`, children: r.value }),
|
|
596
601
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "mr-orig__vital-reading-date", children: r.date })
|
|
597
602
|
] }, i)) })
|
|
598
603
|
] });
|
|
@@ -600,4 +605,4 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
600
605
|
|
|
601
606
|
|
|
602
607
|
exports.OriginalRecordPanel = OriginalRecordPanel;
|
|
603
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
608
|
+
//# sourceMappingURL=OriginalRecordPanel-PVNAZ5CR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/medical-records-ui/medical-records-ui/dist/OriginalRecordPanel-PVNAZ5CR.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-PVNAZ5CR.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 } 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 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: epochToDisplay(recordsById[info.document_id]?.createdAtEpoch ?? 0),\n isOor,\n };\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.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"]}
|
|
@@ -575,10 +575,15 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
575
575
|
const readings = useMemo(() => {
|
|
576
576
|
const trend = trendData;
|
|
577
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
|
-
|
|
580
|
-
|
|
581
|
-
|
|
578
|
+
return [...trend.vitals_info].sort((a, b) => (b.date ?? 0) - (a.date ?? 0)).slice(0, 3).map((info) => {
|
|
579
|
+
const dr = (info.display_result ?? "").toLowerCase();
|
|
580
|
+
const isOor = dr.includes("high") || dr.includes("above") || dr.includes("abnormal_high") || dr.includes("low") || dr.includes("below") || dr.includes("abnormal_low");
|
|
581
|
+
return {
|
|
582
|
+
value: info.val != null ? String(info.val) : info.val_string ?? "\u2014",
|
|
583
|
+
date: epochToDisplay(recordsById[info.document_id]?.createdAtEpoch ?? 0),
|
|
584
|
+
isOor
|
|
585
|
+
};
|
|
586
|
+
});
|
|
582
587
|
}, [trendData, recordsById]);
|
|
583
588
|
if (status === "loading") {
|
|
584
589
|
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 }) });
|
|
@@ -592,7 +597,7 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
592
597
|
vitalName.toUpperCase()
|
|
593
598
|
] }),
|
|
594
599
|
/* @__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"
|
|
600
|
+
/* @__PURE__ */ jsx("span", { className: `mr-orig__vital-reading-value${r.isOor ? " mr-orig__vital-reading-value--oor" : ""}`, children: r.value }),
|
|
596
601
|
/* @__PURE__ */ jsx("span", { className: "mr-orig__vital-reading-date", children: r.date })
|
|
597
602
|
] }, i)) })
|
|
598
603
|
] });
|
|
@@ -600,4 +605,4 @@ function VitalReadingsExpanded({ vitalName, ekaId }) {
|
|
|
600
605
|
export {
|
|
601
606
|
OriginalRecordPanel
|
|
602
607
|
};
|
|
603
|
-
//# sourceMappingURL=OriginalRecordPanel-
|
|
608
|
+
//# sourceMappingURL=OriginalRecordPanel-W6FNO7U2.mjs.map
|
|
@@ -1 +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":[]}
|
|
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 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: epochToDisplay(recordsById[info.document_id]?.createdAtEpoch ?? 0),\n isOor,\n };\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.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"],"mappings":"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","names":[]}
|
package/dist/index.css
CHANGED
|
@@ -5010,6 +5010,9 @@ input.mr-sidebar-pagination__page-box:focus {
|
|
|
5010
5010
|
color: var(--mr-foreground);
|
|
5011
5011
|
font-family: var(--mr-font-sans);
|
|
5012
5012
|
}
|
|
5013
|
+
.mr-orig__vital-reading-value--oor {
|
|
5014
|
+
color: #e26506;
|
|
5015
|
+
}
|
|
5013
5016
|
.mr-orig__vital-reading-date {
|
|
5014
5017
|
font-size: var(--mr-text-xs);
|
|
5015
5018
|
color: var(--mr-muted-foreground);
|