uhc-portal-components-react 0.1.22 → 0.1.25
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/CHANGELOG.md +14 -0
- package/dist/ClinicalSectionSummary.d.ts +5 -0
- package/dist/ClinicalSectionSummary.d.ts.map +1 -1
- package/dist/ClinicalSectionSummary.js +1 -1
- package/dist/IpsBundleSummary.d.ts.map +1 -1
- package/dist/IpsBundleSummary.js +16 -0
- package/dist/VitalSignArtifactEditor.d.ts +30 -0
- package/dist/VitalSignArtifactEditor.d.ts.map +1 -0
- package/dist/VitalSignArtifactEditor.js +54 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/styles.css +4 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.25
|
|
4
|
+
|
|
5
|
+
- Render every labelled quantity component of a composite FHIR `Observation` in the shared IPS card, including systolic and diastolic blood-pressure values and units.
|
|
6
|
+
|
|
7
|
+
## 0.1.24
|
|
8
|
+
|
|
9
|
+
- Reopen an existing vital-sign measurement with its typed values intact, including both systolic and diastolic blood-pressure components.
|
|
10
|
+
|
|
11
|
+
## 0.1.23
|
|
12
|
+
|
|
13
|
+
- Add a shared vital-sign editor with an explicit measurement-type selector.
|
|
14
|
+
- Capture systolic and diastolic blood pressure as two components of one typed measurement, ready for the canonical flat observation graph and one composite FHIR `Observation` at the projection boundary.
|
|
15
|
+
- Keep persistence, authorization and provider readback in the host portal.
|
|
16
|
+
|
|
3
17
|
## 0.1.22
|
|
4
18
|
|
|
5
19
|
- Preserve complete FHIR date and dateTime values in the shared clinical editor instead of silently truncating timezone-bearing values through an HTML calendar-date input.
|
|
@@ -4,6 +4,11 @@ export type ClinicalSummaryCard = Readonly<{
|
|
|
4
4
|
title: string;
|
|
5
5
|
resourceType: string;
|
|
6
6
|
date?: string;
|
|
7
|
+
details?: readonly Readonly<{
|
|
8
|
+
label: string;
|
|
9
|
+
value: string;
|
|
10
|
+
unit?: string;
|
|
11
|
+
}>[];
|
|
7
12
|
}>;
|
|
8
13
|
export type ClinicalSectionSummaryProps = Readonly<{
|
|
9
14
|
code: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClinicalSectionSummary.d.ts","sourceRoot":"","sources":["../src/ClinicalSectionSummary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"ClinicalSectionSummary.d.ts","sourceRoot":"","sources":["../src/ClinicalSectionSummary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,QAAQ,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;CAC/E,CAAC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACzC,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACpD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,oFAAoF;IACpF,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAC,CAAA;AAEF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,KAAK,EACL,SAAS,EACT,UAAU,EACV,iBAAkD,EAClD,OAAO,EACP,UAAiB,GAClB,EAAE,2BAA2B,+BAiC7B"}
|
|
@@ -10,5 +10,5 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
|
10
10
|
export function ClinicalSectionSummary({ code, title, resources, emptyLabel, resourceTypeLabel = (resourceType) => resourceType, actions, showHeader = true, }) {
|
|
11
11
|
return (_jsxs("section", { className: "uhcp-clinical-section", "data-ips-section": code, ...(showHeader ? { 'aria-labelledby': `uhcp-section-${code}` } : { 'aria-label': title }), children: [showHeader && (_jsxs("header", { children: [_jsxs("h3", { id: `uhcp-section-${code}`, children: [title, " ", _jsxs("span", { children: ["(", resources.length, ")"] })] }), actions] })), resources.length === 0
|
|
12
12
|
? _jsx("p", { className: "uhcp-clinical-empty", children: emptyLabel })
|
|
13
|
-
: (_jsx("div", { className: "uhcp-clinical-grid", children: resources.map((resource) => (_jsxs("article", { className: "uhcp-clinical-card", "data-resource-type": resource.resourceType, children: [_jsx("p", { className: "uhcp-clinical-title", dir: "auto", children: _jsx("bdi", { children: resource.title }) }), _jsx("p", { className: "uhcp-clinical-type", children: resourceTypeLabel(resource.resourceType) }), resource.date && _jsx("p", { className: "uhcp-clinical-date", children: resource.date })] }, resource.key))) }))] }));
|
|
13
|
+
: (_jsx("div", { className: "uhcp-clinical-grid", children: resources.map((resource) => (_jsxs("article", { className: "uhcp-clinical-card", "data-resource-type": resource.resourceType, children: [_jsx("p", { className: "uhcp-clinical-title", dir: "auto", children: _jsx("bdi", { children: resource.title }) }), _jsx("p", { className: "uhcp-clinical-type", children: resourceTypeLabel(resource.resourceType) }), resource.date && _jsx("p", { className: "uhcp-clinical-date", children: resource.date }), resource.details?.length ? _jsx("dl", { className: "uhcp-clinical-details", children: resource.details.map((detail) => _jsxs("div", { children: [_jsx("dt", { children: detail.label }), _jsxs("dd", { children: [detail.value, detail.unit ? ` ${detail.unit}` : ''] })] }, `${detail.label}:${detail.value}:${detail.unit ?? ''}`)) }) : null] }, resource.key))) }))] }));
|
|
14
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IpsBundleSummary.d.ts","sourceRoot":"","sources":["../src/IpsBundleSummary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,mCAAmC,EACzC,MAAM,kDAAkD,CAAA;AAGzD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,0BAA0B,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,MAAM,GAAG,SAAS,CAAA;IAClF,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAA;IACvD,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACpD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,CAAA;CAC7D,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,aAAa,EACb,UAAU,EACV,eAA4B,EAC5B,YAAyC,EACzC,iBAAiB,EACjB,cAAc,GACf,EAAE,qBAAqB,+
|
|
1
|
+
{"version":3,"file":"IpsBundleSummary.d.ts","sourceRoot":"","sources":["../src/IpsBundleSummary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,mCAAmC,EACzC,MAAM,kDAAkD,CAAA;AAGzD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,0BAA0B,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,MAAM,GAAG,SAAS,CAAA;IAClF,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAA;IACvD,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;IACpD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,CAAA;CAC7D,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,aAAa,EACb,UAAU,EACV,eAA4B,EAC5B,YAAyC,EACzC,iBAAiB,EACjB,cAAc,GACf,EAAE,qBAAqB,+BA+BvB"}
|
package/dist/IpsBundleSummary.js
CHANGED
|
@@ -12,6 +12,7 @@ import { ClinicalSectionSummary } from './ClinicalSectionSummary.js';
|
|
|
12
12
|
*/
|
|
13
13
|
export function IpsBundleSummary({ bundle, locale, translateCode, emptyLabel, noSectionsLabel = emptyLabel, sectionTitle = (section) => section.title, resourceTypeLabel, sectionActions, }) {
|
|
14
14
|
const sections = toClinicalSectionViews(bundle, { locale, translateCode });
|
|
15
|
+
const nativeResources = new Map((bundle.entry ?? bundle.data ?? []).flatMap((entry) => entry.fullUrl && entry.resource ? [[entry.fullUrl, entry.resource]] : []));
|
|
15
16
|
if (sections.length === 0) {
|
|
16
17
|
return _jsx("p", { className: "uhcp-clinical-empty", "data-ips-summary-empty": true, children: noSectionsLabel });
|
|
17
18
|
}
|
|
@@ -20,5 +21,20 @@ export function IpsBundleSummary({ bundle, locale, translateCode, emptyLabel, no
|
|
|
20
21
|
title: resource.title,
|
|
21
22
|
resourceType: resource.resourceType,
|
|
22
23
|
date: resource.date,
|
|
24
|
+
details: observationComponentDetails(nativeResources.get(resource.fullUrl ?? '')),
|
|
23
25
|
})), emptyLabel: emptyLabel, resourceTypeLabel: resourceTypeLabel, actions: sectionActions?.(section) }, section.code ?? `${section.title}:${sectionIndex}`))) }));
|
|
24
26
|
}
|
|
27
|
+
function observationComponentDetails(resource) {
|
|
28
|
+
const candidate = resource;
|
|
29
|
+
if (candidate?.resourceType !== 'Observation' || !Array.isArray(candidate.component))
|
|
30
|
+
return undefined;
|
|
31
|
+
const details = candidate.component.flatMap((value) => {
|
|
32
|
+
const component = value;
|
|
33
|
+
const label = component.code?.text ?? component.code?.coding?.find((coding) => coding.display)?.display;
|
|
34
|
+
const quantity = component.valueQuantity;
|
|
35
|
+
if (!label || !Number.isFinite(quantity?.value))
|
|
36
|
+
return [];
|
|
37
|
+
return [{ label, value: String(quantity.value), ...(quantity?.unit ? { unit: quantity.unit } : {}) }];
|
|
38
|
+
});
|
|
39
|
+
return details.length ? details : undefined;
|
|
40
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type VitalSignKind, type VitalSignMeasurement } from 'fhir-data-utils-ts';
|
|
2
|
+
import type { ClinicalResourceBundleLike } from 'gdc-common-utils-ts/utils/clinical-resource-view';
|
|
3
|
+
export type VitalSignArtifactEditorCopy = Readonly<{
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
kind: string;
|
|
7
|
+
measuredAt: string;
|
|
8
|
+
value: string;
|
|
9
|
+
systolic: string;
|
|
10
|
+
diastolic: string;
|
|
11
|
+
save: string;
|
|
12
|
+
saving: string;
|
|
13
|
+
cancel: string;
|
|
14
|
+
close: string;
|
|
15
|
+
readbackMissing: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type VitalSignKindLabels = Readonly<Record<VitalSignKind, string>>;
|
|
18
|
+
export type VitalSignArtifactEditorProps = Readonly<{
|
|
19
|
+
entryId: string;
|
|
20
|
+
subjectReference: string;
|
|
21
|
+
initialMeasurement?: VitalSignMeasurement;
|
|
22
|
+
copy: VitalSignArtifactEditorCopy;
|
|
23
|
+
kindLabels: VitalSignKindLabels;
|
|
24
|
+
saveMeasurement: (measurement: VitalSignMeasurement) => Promise<ClinicalResourceBundleLike | undefined>;
|
|
25
|
+
onCancel: () => void;
|
|
26
|
+
onReadback: (bundle: ClinicalResourceBundleLike) => void;
|
|
27
|
+
}>;
|
|
28
|
+
/** Shared vital-sign capture. Composite values remain one typed measurement. */
|
|
29
|
+
export declare function VitalSignArtifactEditor({ entryId, subjectReference, initialMeasurement, copy, kindLabels, saveMeasurement, onCancel, onReadback, }: VitalSignArtifactEditorProps): import("react").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=VitalSignArtifactEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VitalSignArtifactEditor.d.ts","sourceRoot":"","sources":["../src/VitalSignArtifactEditor.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;AAElG,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,MAAM,CAAA;CACxB,CAAC,CAAA;AAEF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAA;IACzC,IAAI,EAAE,2BAA2B,CAAA;IACjC,UAAU,EAAE,mBAAmB,CAAA;IAC/B,eAAe,EAAE,CAAC,WAAW,EAAE,oBAAoB,KAAK,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAA;IACvG,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;AAWF,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,gBAAgB,EAChB,kBAAkB,EAClB,IAAI,EACJ,UAAU,EACV,eAAe,EACf,QAAQ,EACR,UAAU,GACX,EAAE,4BAA4B,+BA+C9B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from 'react';
|
|
4
|
+
import { VitalSignUnit, } from 'fhir-data-utils-ts';
|
|
5
|
+
const VITAL_SIGN_KINDS = Object.freeze([
|
|
6
|
+
'blood-pressure',
|
|
7
|
+
'temperature',
|
|
8
|
+
'heart-rate',
|
|
9
|
+
'oxygen-saturation',
|
|
10
|
+
'respiratory-rate',
|
|
11
|
+
'body-weight',
|
|
12
|
+
]);
|
|
13
|
+
/** Shared vital-sign capture. Composite values remain one typed measurement. */
|
|
14
|
+
export function VitalSignArtifactEditor({ entryId, subjectReference, initialMeasurement, copy, kindLabels, saveMeasurement, onCancel, onReadback, }) {
|
|
15
|
+
const titleId = useId();
|
|
16
|
+
const descriptionId = useId();
|
|
17
|
+
const [kind, setKind] = useState(initialMeasurement?.kind ?? 'oxygen-saturation');
|
|
18
|
+
const [measuredAt, setMeasuredAt] = useState(initialMeasurement?.measuredAt ?? '');
|
|
19
|
+
const [value, setValue] = useState(initialMeasurement && initialMeasurement.kind !== 'blood-pressure' ? String(initialMeasurement.value) : '');
|
|
20
|
+
const [systolic, setSystolic] = useState(initialMeasurement?.kind === 'blood-pressure' ? String(initialMeasurement.systolic) : '');
|
|
21
|
+
const [diastolic, setDiastolic] = useState(initialMeasurement?.kind === 'blood-pressure' ? String(initialMeasurement.diastolic) : '');
|
|
22
|
+
const [saving, setSaving] = useState(false);
|
|
23
|
+
const [error, setError] = useState('');
|
|
24
|
+
async function submit() {
|
|
25
|
+
setSaving(true);
|
|
26
|
+
setError('');
|
|
27
|
+
try {
|
|
28
|
+
const common = { entryId, subjectReference, kind, measuredAt, status: 'final' };
|
|
29
|
+
const measurement = kind === 'blood-pressure'
|
|
30
|
+
? { ...common, kind, systolic: Number(systolic), diastolic: Number(diastolic) }
|
|
31
|
+
: { ...common, kind, value: Number(value), unit: unitFor(kind) };
|
|
32
|
+
const readback = await saveMeasurement(measurement);
|
|
33
|
+
if (!readback)
|
|
34
|
+
throw new Error(copy.readbackMissing);
|
|
35
|
+
onReadback(readback);
|
|
36
|
+
}
|
|
37
|
+
catch (reason) {
|
|
38
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
setSaving(false);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return _jsxs("section", { className: "uhcp-clinical-editor", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": descriptionId, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { id: titleId, children: copy.title }), _jsx("p", { id: descriptionId, children: copy.description })] }), _jsx("button", { type: "button", onClick: onCancel, "aria-label": copy.close, children: "\u00D7" })] }), _jsxs("form", { onSubmit: (event) => { event.preventDefault(); void submit(); }, children: [_jsxs("label", { children: [_jsxs("span", { children: [copy.kind, " *"] }), _jsx("select", { "aria-label": copy.kind, value: kind, onChange: (event) => setKind(event.target.value), children: VITAL_SIGN_KINDS.map((option) => _jsx("option", { value: option, children: kindLabels[option] }, option)) })] }), _jsxs("label", { children: [_jsxs("span", { children: [copy.measuredAt, " *"] }), _jsx("input", { "aria-label": copy.measuredAt, required: true, value: measuredAt, onChange: (event) => setMeasuredAt(event.target.value) })] }), kind === 'blood-pressure' ? _jsxs(_Fragment, { children: [_jsxs("label", { children: [_jsxs("span", { children: [copy.systolic, " *"] }), _jsx("input", { "aria-label": copy.systolic, required: true, type: "number", value: systolic, onChange: (event) => setSystolic(event.target.value) })] }), _jsxs("label", { children: [_jsxs("span", { children: [copy.diastolic, " *"] }), _jsx("input", { "aria-label": copy.diastolic, required: true, type: "number", value: diastolic, onChange: (event) => setDiastolic(event.target.value) })] })] }) : _jsxs("label", { children: [_jsxs("span", { children: [copy.value, " *"] }), _jsx("input", { "aria-label": copy.value, required: true, type: "number", value: value, onChange: (event) => setValue(event.target.value) })] }), error ? _jsx("p", { className: "uhcp-clinical-editor-error", role: "alert", children: error }) : null, _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: onCancel, children: copy.cancel }), _jsx("button", { type: "submit", disabled: saving, children: saving ? copy.saving : copy.save })] })] })] });
|
|
45
|
+
}
|
|
46
|
+
function unitFor(kind) {
|
|
47
|
+
switch (kind) {
|
|
48
|
+
case 'temperature': return VitalSignUnit.temperature;
|
|
49
|
+
case 'heart-rate': return VitalSignUnit.heartRate;
|
|
50
|
+
case 'oxygen-saturation': return VitalSignUnit.oxygenSaturation;
|
|
51
|
+
case 'respiratory-rate': return VitalSignUnit.respiratoryRate;
|
|
52
|
+
case 'body-weight': return VitalSignUnit.bodyWeight;
|
|
53
|
+
}
|
|
54
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export * from './PortalLoadingSkeleton.js';
|
|
|
9
9
|
export * from './ClinicalSectionSummary.js';
|
|
10
10
|
export * from './IpsBundleSummary.js';
|
|
11
11
|
export * from './ClinicalArtifactEditor.js';
|
|
12
|
+
export * from './VitalSignArtifactEditor.js';
|
|
12
13
|
export * from './InvitationAcceptancePanel.js';
|
|
13
14
|
export * from './SubjectAccessRequestPanel.js';
|
|
14
15
|
export * from './SoschainWorkspace.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ export * from './PortalLoadingSkeleton.js';
|
|
|
9
9
|
export * from './ClinicalSectionSummary.js';
|
|
10
10
|
export * from './IpsBundleSummary.js';
|
|
11
11
|
export * from './ClinicalArtifactEditor.js';
|
|
12
|
+
export * from './VitalSignArtifactEditor.js';
|
|
12
13
|
export * from './InvitationAcceptancePanel.js';
|
|
13
14
|
export * from './SubjectAccessRequestPanel.js';
|
|
14
15
|
export * from './SoschainWorkspace.js';
|
package/dist/styles.css
CHANGED
|
@@ -409,6 +409,10 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
|
|
|
409
409
|
.uhcp-clinical-title { font-weight: 800; margin: 0; }
|
|
410
410
|
.uhcp-clinical-type { color: var(--uhcp-muted); font-size: .72rem; font-weight: 800; letter-spacing: .06em; margin: .35rem 0 0; text-transform: uppercase; }
|
|
411
411
|
.uhcp-clinical-date, .uhcp-clinical-empty { color: var(--uhcp-muted); margin: .35rem 0 0; }
|
|
412
|
+
.uhcp-clinical-details { display: grid; gap: .3rem; margin: .6rem 0 0; }
|
|
413
|
+
.uhcp-clinical-details div { align-items: baseline; display: flex; gap: .75rem; justify-content: space-between; }
|
|
414
|
+
.uhcp-clinical-details dt { color: var(--uhcp-muted); font-size: .78rem; }
|
|
415
|
+
.uhcp-clinical-details dd { font-size: .9rem; font-weight: 800; margin: 0; }
|
|
412
416
|
.uhcp-access-panel { color: var(--uhcp-text); display: grid; gap: 1rem; }
|
|
413
417
|
.uhcp-access-panel h2, .uhcp-access-panel p { margin: 0; }
|
|
414
418
|
.uhcp-access-panel > p { color: var(--uhcp-muted); line-height: 1.5; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uhc-portal-components-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.25",
|
|
4
4
|
"description": "Brand-neutral React portal shell, account preferences and protected-profile UI for UHC and VetChain portals.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"react-dom": ">=18.3.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
+
"fhir-data-utils-ts": "0.6.7",
|
|
34
35
|
"gdc-common-utils-ts": "^2.3.12"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|