sos-portal-components-react 0.3.4 → 0.5.0
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 +180 -145
- package/README.md +255 -233
- package/dist/PortalCurrentSubject.d.ts +29 -0
- package/dist/PortalCurrentSubject.d.ts.map +1 -0
- package/dist/PortalCurrentSubject.js +62 -0
- package/dist/PortalCurrentSubject.js.map +1 -0
- package/dist/PortalHeader.d.ts +10 -0
- package/dist/PortalHeader.d.ts.map +1 -0
- package/dist/PortalHeader.js +11 -0
- package/dist/PortalHeader.js.map +1 -0
- package/dist/PortalSettingsPanel.d.ts +8 -0
- package/dist/PortalSettingsPanel.d.ts.map +1 -0
- package/dist/PortalSettingsPanel.js +10 -0
- package/dist/PortalSettingsPanel.js.map +1 -0
- package/dist/care/AnimalCardArtifact.d.ts +42 -0
- package/dist/care/AnimalCardArtifact.d.ts.map +1 -0
- package/dist/care/AnimalCardArtifact.js +32 -0
- package/dist/care/AnimalCardArtifact.js.map +1 -0
- package/dist/care/BrowserRealtimeCallPanel.d.ts +39 -0
- package/dist/care/BrowserRealtimeCallPanel.d.ts.map +1 -0
- package/dist/care/BrowserRealtimeCallPanel.js +43 -0
- package/dist/care/BrowserRealtimeCallPanel.js.map +1 -0
- package/dist/care/CardPreview.d.ts +6 -0
- package/dist/care/CardPreview.d.ts.map +1 -0
- package/dist/care/CardPreview.js +6 -0
- package/dist/care/CardPreview.js.map +1 -0
- package/dist/care/CommunicationsWorkspace.d.ts +18 -0
- package/dist/care/CommunicationsWorkspace.d.ts.map +1 -0
- package/dist/care/CommunicationsWorkspace.js +13 -0
- package/dist/care/CommunicationsWorkspace.js.map +1 -0
- package/dist/care/EmergencyTaskHub.d.ts +27 -0
- package/dist/care/EmergencyTaskHub.d.ts.map +1 -0
- package/dist/care/EmergencyTaskHub.js +25 -0
- package/dist/care/EmergencyTaskHub.js.map +1 -0
- package/dist/care/LegalMarkdownDocument.d.ts +6 -0
- package/dist/care/LegalMarkdownDocument.d.ts.map +1 -0
- package/dist/care/LegalMarkdownDocument.js +57 -0
- package/dist/care/LegalMarkdownDocument.js.map +1 -0
- package/dist/care/NotificationComposer.d.ts +49 -0
- package/dist/care/NotificationComposer.d.ts.map +1 -0
- package/dist/care/NotificationComposer.js +83 -0
- package/dist/care/NotificationComposer.js.map +1 -0
- package/dist/care/ProtectedIndexEmergencyData.d.ts +32 -0
- package/dist/care/ProtectedIndexEmergencyData.d.ts.map +1 -0
- package/dist/care/ProtectedIndexEmergencyData.js +13 -0
- package/dist/care/ProtectedIndexEmergencyData.js.map +1 -0
- package/dist/care/SelectedSubjectWorkspace.d.ts +32 -0
- package/dist/care/SelectedSubjectWorkspace.d.ts.map +1 -0
- package/dist/care/SelectedSubjectWorkspace.js +32 -0
- package/dist/care/SelectedSubjectWorkspace.js.map +1 -0
- package/dist/care/SoschainWorkspace.d.ts +119 -0
- package/dist/care/SoschainWorkspace.d.ts.map +1 -0
- package/dist/care/SoschainWorkspace.js +61 -0
- package/dist/care/SoschainWorkspace.js.map +1 -0
- package/dist/care/SubjectCommunicationCenter.d.ts +45 -0
- package/dist/care/SubjectCommunicationCenter.d.ts.map +1 -0
- package/dist/care/SubjectCommunicationCenter.js +40 -0
- package/dist/care/SubjectCommunicationCenter.js.map +1 -0
- package/dist/care/SubjectDemographicsFields.d.ts +42 -0
- package/dist/care/SubjectDemographicsFields.d.ts.map +1 -0
- package/dist/care/SubjectDemographicsFields.js +71 -0
- package/dist/care/SubjectDemographicsFields.js.map +1 -0
- package/dist/care/SubjectSectionIndex.d.ts +22 -0
- package/dist/care/SubjectSectionIndex.d.ts.map +1 -0
- package/dist/care/SubjectSectionIndex.js +34 -0
- package/dist/care/SubjectSectionIndex.js.map +1 -0
- package/dist/care/SubjectWorkspace.d.ts +29 -0
- package/dist/care/SubjectWorkspace.d.ts.map +1 -0
- package/dist/care/SubjectWorkspace.js +59 -0
- package/dist/care/SubjectWorkspace.js.map +1 -0
- package/dist/care/care.css +215 -0
- package/dist/care/index.d.ts +16 -0
- package/dist/care/index.d.ts.map +1 -0
- package/dist/care/index.js +16 -0
- package/dist/care/index.js.map +1 -0
- package/dist/care/notification-bff-client.d.ts +44 -0
- package/dist/care/notification-bff-client.d.ts.map +1 -0
- package/dist/care/notification-bff-client.js +89 -0
- package/dist/care/notification-bff-client.js.map +1 -0
- package/dist/clinical/BrowserClinicalSpeechInput.d.ts +25 -0
- package/dist/clinical/BrowserClinicalSpeechInput.d.ts.map +1 -0
- package/dist/clinical/BrowserClinicalSpeechInput.js +32 -0
- package/dist/clinical/BrowserClinicalSpeechInput.js.map +1 -0
- package/dist/clinical/ClinicalActionButton.d.ts +9 -0
- package/dist/clinical/ClinicalActionButton.d.ts.map +1 -0
- package/dist/clinical/ClinicalActionButton.js +13 -0
- package/dist/clinical/ClinicalActionButton.js.map +1 -0
- package/dist/clinical/ClinicalArtifactEditor.d.ts +147 -0
- package/dist/clinical/ClinicalArtifactEditor.d.ts.map +1 -0
- package/dist/clinical/ClinicalArtifactEditor.js +382 -0
- package/dist/clinical/ClinicalArtifactEditor.js.map +1 -0
- package/dist/clinical/ClinicalArtifactEditorV2.d.ts +77 -0
- package/dist/clinical/ClinicalArtifactEditorV2.d.ts.map +1 -0
- package/dist/clinical/ClinicalArtifactEditorV2.js +89 -0
- package/dist/clinical/ClinicalArtifactEditorV2.js.map +1 -0
- package/dist/clinical/ClinicalArtifactPropertiesV2.d.ts +83 -0
- package/dist/clinical/ClinicalArtifactPropertiesV2.d.ts.map +1 -0
- package/dist/clinical/ClinicalArtifactPropertiesV2.js +46 -0
- package/dist/clinical/ClinicalArtifactPropertiesV2.js.map +1 -0
- package/dist/clinical/ClinicalBundleDraftEditor.d.ts +99 -0
- package/dist/clinical/ClinicalBundleDraftEditor.d.ts.map +1 -0
- package/dist/clinical/ClinicalBundleDraftEditor.js +225 -0
- package/dist/clinical/ClinicalBundleDraftEditor.js.map +1 -0
- package/dist/clinical/ClinicalEditorLayer.d.ts +8 -0
- package/dist/clinical/ClinicalEditorLayer.d.ts.map +1 -0
- package/dist/clinical/ClinicalEditorLayer.js +12 -0
- package/dist/clinical/ClinicalEditorLayer.js.map +1 -0
- package/dist/clinical/ClinicalSectionSummary.d.ts +36 -0
- package/dist/clinical/ClinicalSectionSummary.d.ts.map +1 -0
- package/dist/clinical/ClinicalSectionSummary.js +24 -0
- package/dist/clinical/ClinicalSectionSummary.js.map +1 -0
- package/dist/clinical/ClinicalSpeechInput.d.ts +58 -0
- package/dist/clinical/ClinicalSpeechInput.d.ts.map +1 -0
- package/dist/clinical/ClinicalSpeechInput.js +84 -0
- package/dist/clinical/ClinicalSpeechInput.js.map +1 -0
- package/dist/clinical/ClinicalTimeline.d.ts +52 -0
- package/dist/clinical/ClinicalTimeline.d.ts.map +1 -0
- package/dist/clinical/ClinicalTimeline.js +48 -0
- package/dist/clinical/ClinicalTimeline.js.map +1 -0
- package/dist/clinical/ImmunizationArtifactEditorV2.d.ts +15 -0
- package/dist/clinical/ImmunizationArtifactEditorV2.d.ts.map +1 -0
- package/dist/clinical/ImmunizationArtifactEditorV2.js +62 -0
- package/dist/clinical/ImmunizationArtifactEditorV2.js.map +1 -0
- package/dist/clinical/IpsBundleSummary.d.ts +34 -0
- package/dist/clinical/IpsBundleSummary.d.ts.map +1 -0
- package/dist/clinical/IpsBundleSummary.js +75 -0
- package/dist/clinical/IpsBundleSummary.js.map +1 -0
- package/dist/clinical/SchemaClinicalArtifactEditorV2.d.ts +11 -0
- package/dist/clinical/SchemaClinicalArtifactEditorV2.d.ts.map +1 -0
- package/dist/clinical/SchemaClinicalArtifactEditorV2.js +62 -0
- package/dist/clinical/SchemaClinicalArtifactEditorV2.js.map +1 -0
- package/dist/clinical/clinical.css +148 -0
- package/dist/clinical/index.d.ts +14 -0
- package/dist/clinical/index.d.ts.map +1 -0
- package/dist/clinical/index.js +14 -0
- package/dist/clinical/index.js.map +1 -0
- package/dist/encounter-journey.css +91 -91
- package/dist/identity/AnimalIdentityDetailsV2.d.ts +43 -0
- package/dist/identity/AnimalIdentityDetailsV2.d.ts.map +1 -0
- package/dist/identity/AnimalIdentityDetailsV2.js +9 -0
- package/dist/identity/AnimalIdentityDetailsV2.js.map +1 -0
- package/dist/identity/AnimalIdentityOnboarding.d.ts +91 -0
- package/dist/identity/AnimalIdentityOnboarding.d.ts.map +1 -0
- package/dist/identity/AnimalIdentityOnboarding.js +73 -0
- package/dist/identity/AnimalIdentityOnboarding.js.map +1 -0
- package/dist/identity/AnimalIdentityOnboardingV2.d.ts +56 -0
- package/dist/identity/AnimalIdentityOnboardingV2.d.ts.map +1 -0
- package/dist/identity/AnimalIdentityOnboardingV2.js +174 -0
- package/dist/identity/AnimalIdentityOnboardingV2.js.map +1 -0
- package/dist/identity/current-subject.css +11 -0
- package/dist/identity/identity.css +64 -0
- package/dist/identity/index.d.ts +9 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +10 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/preferences.d.ts +12 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +57 -0
- package/dist/preferences.js.map +1 -0
- package/dist/styles.css +24 -0
- package/dist/usePortalUiPreferences.d.ts +9 -0
- package/dist/usePortalUiPreferences.d.ts.map +1 -0
- package/dist/usePortalUiPreferences.js +39 -0
- package/dist/usePortalUiPreferences.js.map +1 -0
- package/package.json +127 -110
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type ClinicalSummaryCard = Readonly<{
|
|
3
|
+
key: string;
|
|
4
|
+
title: string;
|
|
5
|
+
resourceType: string;
|
|
6
|
+
date?: string;
|
|
7
|
+
details?: readonly Readonly<{
|
|
8
|
+
label: string;
|
|
9
|
+
value: string;
|
|
10
|
+
unit?: string;
|
|
11
|
+
}>[];
|
|
12
|
+
/** Actions belonging to this resource, rendered inside its card. */
|
|
13
|
+
actions?: ReactNode;
|
|
14
|
+
}>;
|
|
15
|
+
export type ClinicalSectionSummaryProps = Readonly<{
|
|
16
|
+
code: string;
|
|
17
|
+
title: string;
|
|
18
|
+
resources: readonly ClinicalSummaryCard[];
|
|
19
|
+
emptyLabel: string;
|
|
20
|
+
resourceTypeLabel?: (resourceType: string) => string;
|
|
21
|
+
actions?: ReactNode;
|
|
22
|
+
locale?: string;
|
|
23
|
+
timeZone?: string;
|
|
24
|
+
/** Hide only the heading when a host already owns the expandable section header. */
|
|
25
|
+
showHeader?: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Brand-neutral renderer for one already-resolved IPS section.
|
|
29
|
+
*
|
|
30
|
+
* Hosts must resolve clinical labels with the shared SDK reader before passing
|
|
31
|
+
* cards here. In particular, `title` is human text; `system|code` is a
|
|
32
|
+
* terminology identity/translation key and must never be supplied as a
|
|
33
|
+
* replacement for manually authored text.
|
|
34
|
+
*/
|
|
35
|
+
export declare function ClinicalSectionSummary({ code, title, resources, emptyLabel, resourceTypeLabel, actions, locale, timeZone, showHeader, }: ClinicalSectionSummaryProps): import("react").JSX.Element;
|
|
36
|
+
//# sourceMappingURL=ClinicalSectionSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalSectionSummary.d.ts","sourceRoot":"","sources":["../../src/clinical/ClinicalSectionSummary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,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;IAC9E,oEAAoE;IACpE,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB,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,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,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,MAAa,EACb,QAAQ,EACR,UAAiB,GAClB,EAAE,2BAA2B,+BAkC7B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { formatFhirTemporalForLocale } from 'fhir-data-utils-ts/fhir-temporal-presentation';
|
|
3
|
+
/**
|
|
4
|
+
* Brand-neutral renderer for one already-resolved IPS section.
|
|
5
|
+
*
|
|
6
|
+
* Hosts must resolve clinical labels with the shared SDK reader before passing
|
|
7
|
+
* cards here. In particular, `title` is human text; `system|code` is a
|
|
8
|
+
* terminology identity/translation key and must never be supplied as a
|
|
9
|
+
* replacement for manually authored text.
|
|
10
|
+
*/
|
|
11
|
+
export function ClinicalSectionSummary({ code, title, resources, emptyLabel, resourceTypeLabel = (resourceType) => resourceType, actions, locale = 'en', timeZone, showHeader = true, }) {
|
|
12
|
+
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
|
|
13
|
+
? _jsx("p", { className: "uhcp-clinical-empty", children: emptyLabel })
|
|
14
|
+
: (_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: _jsx("time", { dateTime: resource.date, children: localizedTemporal(resource.date, locale, timeZone) }) }), 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.actions ? _jsx("div", { className: "uhcp-clinical-card-actions", children: resource.actions }) : null] }, resource.key))) }))] }));
|
|
15
|
+
}
|
|
16
|
+
function localizedTemporal(value, locale, timeZone) {
|
|
17
|
+
try {
|
|
18
|
+
return formatFhirTemporalForLocale(value, locale, { ...(timeZone === undefined ? {} : { timeZone }), includeTime: value.includes('T') });
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ClinicalSectionSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalSectionSummary.js","sourceRoot":"","sources":["../../src/clinical/ClinicalSectionSummary.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAA;AAyB3F;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,IAAI,EACJ,KAAK,EACL,SAAS,EACT,UAAU,EACV,iBAAiB,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,EAClD,OAAO,EACP,MAAM,GAAG,IAAI,EACb,QAAQ,EACR,UAAU,GAAG,IAAI,GACW;IAC5B,OAAO,CACL,mBACE,SAAS,EAAC,uBAAuB,sBACf,IAAI,KAClB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,aAEzF,UAAU,IAAI,CACb,6BACE,cAAI,EAAE,EAAE,gBAAgB,IAAI,EAAE,aAAG,KAAK,OAAE,gCAAQ,SAAS,CAAC,MAAM,SAAS,IAAK,EAC7E,OAAO,IACD,CACV,EACA,SAAS,CAAC,MAAM,KAAK,CAAC;gBACrB,CAAC,CAAC,YAAG,SAAS,EAAC,qBAAqB,YAAE,UAAU,GAAK;gBACrD,CAAC,CAAC,CACA,cAAK,SAAS,EAAC,oBAAoB,YAChC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,mBAA4B,SAAS,EAAC,oBAAoB,wBAAqB,QAAQ,CAAC,YAAY,aAClG,YAAG,SAAS,EAAC,qBAAqB,EAAC,GAAG,EAAC,MAAM,YAAC,wBAAM,QAAQ,CAAC,KAAK,GAAO,GAAI,EAC7E,YAAG,SAAS,EAAC,oBAAoB,YAAE,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAK,EAC/E,QAAQ,CAAC,IAAI,IAAI,YAAG,SAAS,EAAC,oBAAoB,YAAC,eAAM,QAAQ,EAAE,QAAQ,CAAC,IAAI,YAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAQ,GAAI,EACjJ,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,uBAAuB,YAC9D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,0BAChC,uBAAK,MAAM,CAAC,KAAK,GAAM,EAAA,yBAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAM,KAD1C,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAE5F,CAAC,GACJ,CAAC,CAAC,CAAC,IAAI,EACX,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,4BAA4B,YAAE,QAAQ,CAAC,OAAO,GAAO,CAAC,CAAC,CAAC,IAAI,KATnF,QAAQ,CAAC,GAAG,CAUhB,CACX,CAAC,GACE,CACP,IACK,CACX,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,MAAc,EAAE,QAAiB;IACzE,IAAI,CAAC;QACH,OAAO,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC1I,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare const ClinicalSpeechInputPhases: Readonly<{
|
|
3
|
+
readonly Idle: "idle";
|
|
4
|
+
readonly Checking: "checking";
|
|
5
|
+
readonly Downloading: "downloading";
|
|
6
|
+
readonly Initializing: "initializing";
|
|
7
|
+
readonly Ready: "ready";
|
|
8
|
+
readonly Error: "error";
|
|
9
|
+
readonly Unavailable: "unavailable";
|
|
10
|
+
}>;
|
|
11
|
+
export type ClinicalSpeechInputPhase = typeof ClinicalSpeechInputPhases[keyof typeof ClinicalSpeechInputPhases];
|
|
12
|
+
export type ClinicalSpeechInputRequest = Readonly<{
|
|
13
|
+
resourceType: string;
|
|
14
|
+
claim: string;
|
|
15
|
+
locale: string;
|
|
16
|
+
}>;
|
|
17
|
+
export type ClinicalSpeechInputCapability = Readonly<{
|
|
18
|
+
phase: ClinicalSpeechInputPhase;
|
|
19
|
+
transcribe: (input: ClinicalSpeechInputRequest) => Promise<string>;
|
|
20
|
+
labels: Readonly<{
|
|
21
|
+
start: string;
|
|
22
|
+
unavailable: string;
|
|
23
|
+
busy: string;
|
|
24
|
+
failed?: string;
|
|
25
|
+
}>;
|
|
26
|
+
}>;
|
|
27
|
+
export type ClinicalSpeechInputRuntime = Pick<ClinicalSpeechInputCapability, 'phase' | 'transcribe'>;
|
|
28
|
+
export type ClinicalSpeechInputChannel = Readonly<{
|
|
29
|
+
getSnapshot: () => ClinicalSpeechInputRuntime;
|
|
30
|
+
publish: (runtime: ClinicalSpeechInputRuntime) => void;
|
|
31
|
+
subscribe: (listener: () => void) => () => void;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Creates one small external store through which a portal-owned model runtime
|
|
35
|
+
* can announce download, initialization and readiness changes to every nested
|
|
36
|
+
* clinical editor without importing the model into the shared UI package.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createClinicalSpeechInputChannel(initialRuntime?: ClinicalSpeechInputRuntime): ClinicalSpeechInputChannel;
|
|
39
|
+
/**
|
|
40
|
+
* Supplies one portal-owned speech-recognition capability to nested clinical
|
|
41
|
+
* editors. The portal owns model download, microphone permission and fallback;
|
|
42
|
+
* shared editors receive only an editable transcript.
|
|
43
|
+
*/
|
|
44
|
+
export declare function ClinicalSpeechInputProvider({ value, children }: Readonly<{
|
|
45
|
+
value: ClinicalSpeechInputCapability;
|
|
46
|
+
children: ReactNode;
|
|
47
|
+
}>): import("react").JSX.Element;
|
|
48
|
+
export declare function ClinicalSpeechInputChannelProvider({ channel, labels, children, }: Readonly<{
|
|
49
|
+
channel: ClinicalSpeechInputChannel;
|
|
50
|
+
labels: ClinicalSpeechInputCapability['labels'];
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}>): import("react").JSX.Element;
|
|
53
|
+
export declare function useClinicalSpeechInput(): ClinicalSpeechInputCapability | undefined;
|
|
54
|
+
export declare function ClinicalSpeechInputButton({ resourceType, claim, locale, fieldLabel, onTranscript, }: Readonly<ClinicalSpeechInputRequest & {
|
|
55
|
+
fieldLabel: string;
|
|
56
|
+
onTranscript: (transcript: string) => void;
|
|
57
|
+
}>): import("react").JSX.Element | null;
|
|
58
|
+
//# sourceMappingURL=ClinicalSpeechInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalSpeechInput.d.ts","sourceRoot":"","sources":["../../src/clinical/ClinicalSpeechInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjG,eAAO,MAAM,yBAAyB;;;;;;;;EAQ3B,CAAA;AAEX,MAAM,MAAM,wBAAwB,GAAG,OAAO,yBAAyB,CAAC,MAAM,OAAO,yBAAyB,CAAC,CAAA;AAE/G,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,KAAK,EAAE,wBAAwB,CAAA;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAClE,MAAM,EAAE,QAAQ,CAAC;QACf,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;CACH,CAAC,CAAA;AAEF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,6BAA6B,EAAE,OAAO,GAAG,YAAY,CAAC,CAAA;AAEpG,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,WAAW,EAAE,MAAM,0BAA0B,CAAA;IAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAA;IACtD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAChD,CAAC,CAAA;AAOF;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,cAAc,GAAE,0BAA+C,GAC9D,0BAA0B,CAc5B;AAID;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC;IACxE,KAAK,EAAE,6BAA6B,CAAA;IACpC,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAC,+BAED;AAED,wBAAgB,kCAAkC,CAAC,EACjD,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,OAAO,EAAE,0BAA0B,CAAA;IACnC,MAAM,EAAE,6BAA6B,CAAC,QAAQ,CAAC,CAAA;IAC/C,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAC,+BAGD;AAED,wBAAgB,sBAAsB,IAAI,6BAA6B,GAAG,SAAS,CAElF;AAED,wBAAgB,yBAAyB,CAAC,EACxC,YAAY,EACZ,KAAK,EACL,MAAM,EACN,UAAU,EACV,YAAY,GACb,EAAE,QAAQ,CAAC,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C,CAAC,sCA2CD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useState, useSyncExternalStore } from 'react';
|
|
4
|
+
export const ClinicalSpeechInputPhases = Object.freeze({
|
|
5
|
+
Idle: 'idle',
|
|
6
|
+
Checking: 'checking',
|
|
7
|
+
Downloading: 'downloading',
|
|
8
|
+
Initializing: 'initializing',
|
|
9
|
+
Ready: 'ready',
|
|
10
|
+
Error: 'error',
|
|
11
|
+
Unavailable: 'unavailable',
|
|
12
|
+
});
|
|
13
|
+
const unavailableRuntime = Object.freeze({
|
|
14
|
+
phase: ClinicalSpeechInputPhases.Unavailable,
|
|
15
|
+
transcribe: async () => { throw new Error('clinical_speech_input_unavailable'); },
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Creates one small external store through which a portal-owned model runtime
|
|
19
|
+
* can announce download, initialization and readiness changes to every nested
|
|
20
|
+
* clinical editor without importing the model into the shared UI package.
|
|
21
|
+
*/
|
|
22
|
+
export function createClinicalSpeechInputChannel(initialRuntime = unavailableRuntime) {
|
|
23
|
+
let snapshot = Object.freeze(initialRuntime);
|
|
24
|
+
const listeners = new Set();
|
|
25
|
+
return Object.freeze({
|
|
26
|
+
getSnapshot: () => snapshot,
|
|
27
|
+
publish(runtime) {
|
|
28
|
+
snapshot = Object.freeze(runtime);
|
|
29
|
+
listeners.forEach((listener) => listener());
|
|
30
|
+
},
|
|
31
|
+
subscribe(listener) {
|
|
32
|
+
listeners.add(listener);
|
|
33
|
+
return () => listeners.delete(listener);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const ClinicalSpeechInputContext = createContext(undefined);
|
|
38
|
+
/**
|
|
39
|
+
* Supplies one portal-owned speech-recognition capability to nested clinical
|
|
40
|
+
* editors. The portal owns model download, microphone permission and fallback;
|
|
41
|
+
* shared editors receive only an editable transcript.
|
|
42
|
+
*/
|
|
43
|
+
export function ClinicalSpeechInputProvider({ value, children }) {
|
|
44
|
+
return _jsx(ClinicalSpeechInputContext.Provider, { value: value, children: children });
|
|
45
|
+
}
|
|
46
|
+
export function ClinicalSpeechInputChannelProvider({ channel, labels, children, }) {
|
|
47
|
+
const runtime = useSyncExternalStore(channel.subscribe, channel.getSnapshot, channel.getSnapshot);
|
|
48
|
+
return _jsx(ClinicalSpeechInputProvider, { value: { ...runtime, labels }, children: children });
|
|
49
|
+
}
|
|
50
|
+
export function useClinicalSpeechInput() {
|
|
51
|
+
return useContext(ClinicalSpeechInputContext);
|
|
52
|
+
}
|
|
53
|
+
export function ClinicalSpeechInputButton({ resourceType, claim, locale, fieldLabel, onTranscript, }) {
|
|
54
|
+
const capability = useClinicalSpeechInput();
|
|
55
|
+
const [busy, setBusy] = useState(false);
|
|
56
|
+
const [failed, setFailed] = useState(false);
|
|
57
|
+
if (!capability)
|
|
58
|
+
return null;
|
|
59
|
+
const ready = capability.phase === ClinicalSpeechInputPhases.Ready;
|
|
60
|
+
const actionLabel = busy
|
|
61
|
+
? capability.labels.busy
|
|
62
|
+
: ready
|
|
63
|
+
? capability.labels.start
|
|
64
|
+
: capability.labels.unavailable;
|
|
65
|
+
const transcribe = async () => {
|
|
66
|
+
if (!ready || busy)
|
|
67
|
+
return;
|
|
68
|
+
setBusy(true);
|
|
69
|
+
setFailed(false);
|
|
70
|
+
try {
|
|
71
|
+
const transcript = (await capability.transcribe({ resourceType, claim, locale })).trim();
|
|
72
|
+
if (transcript)
|
|
73
|
+
onTranscript(transcript);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
setFailed(true);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
setBusy(false);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
return _jsxs("span", { className: "uhcp-clinical-speech-control", children: [_jsx("button", { type: "button", className: "uhcp-clinical-speech-button", "aria-label": actionLabel, title: `${actionLabel}: ${fieldLabel}`, disabled: !ready || busy, "aria-pressed": busy, onClick: () => { void transcribe(); }, children: _jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", focusable: "false", children: _jsx("path", { d: "M12 14a3 3 0 0 0 3-3V5a3 3 0 1 0-6 0v6a3 3 0 0 0 3 3Zm-5-3a1 1 0 1 0-2 0 7 7 0 0 0 6 6.92V21H8a1 1 0 1 0 0 2h8a1 1 0 1 0 0-2h-3v-3.08A7 7 0 0 0 19 11a1 1 0 1 0-2 0 5 5 0 0 1-10 0Z" }) }) }), failed ? _jsx("small", { role: "alert", children: capability.labels.failed ?? capability.labels.unavailable }) : null] });
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ClinicalSpeechInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalSpeechInput.js","sourceRoot":"","sources":["../../src/clinical/ClinicalSpeechInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type LocalDateTimeParts } from 'fhir-data-utils-ts/fhir-temporal-presentation';
|
|
3
|
+
export type ClinicalTimelineEntry = Readonly<{
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
dateTime: string;
|
|
7
|
+
facets?: Readonly<Record<string, readonly string[]>>;
|
|
8
|
+
content?: ReactNode;
|
|
9
|
+
}>;
|
|
10
|
+
export type ClinicalTimelineFacet = Readonly<{
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
options: readonly Readonly<{
|
|
14
|
+
id: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}>[];
|
|
17
|
+
}>;
|
|
18
|
+
export type ClinicalTimelineLabels = Readonly<{
|
|
19
|
+
from: string;
|
|
20
|
+
to: string;
|
|
21
|
+
date: string;
|
|
22
|
+
time: string;
|
|
23
|
+
useToday: string;
|
|
24
|
+
useCurrentTime: string;
|
|
25
|
+
previous: string;
|
|
26
|
+
next: string;
|
|
27
|
+
showAll: string;
|
|
28
|
+
empty: string;
|
|
29
|
+
}>;
|
|
30
|
+
export type ClinicalDateTimeFieldLabels = Readonly<{
|
|
31
|
+
date: string;
|
|
32
|
+
time: string;
|
|
33
|
+
useToday: string;
|
|
34
|
+
useCurrentTime: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function ClinicalDateTimeFields({ value, onChange, labels, timeZone, now, includeSeconds, }: Readonly<{
|
|
37
|
+
value: LocalDateTimeParts;
|
|
38
|
+
onChange: (value: LocalDateTimeParts) => void;
|
|
39
|
+
labels: ClinicalDateTimeFieldLabels;
|
|
40
|
+
timeZone: string;
|
|
41
|
+
now?: Date;
|
|
42
|
+
includeSeconds?: boolean;
|
|
43
|
+
}>): import("react").JSX.Element;
|
|
44
|
+
export declare function ClinicalTimeline({ entries, facets, locale, timeZone, labels, now }: Readonly<{
|
|
45
|
+
entries: readonly ClinicalTimelineEntry[];
|
|
46
|
+
facets?: readonly ClinicalTimelineFacet[];
|
|
47
|
+
locale: string;
|
|
48
|
+
timeZone: string;
|
|
49
|
+
labels: ClinicalTimelineLabels;
|
|
50
|
+
now?: Date;
|
|
51
|
+
}>): import("react").JSX.Element;
|
|
52
|
+
//# sourceMappingURL=ClinicalTimeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalTimeline.d.ts","sourceRoot":"","sources":["../../src/clinical/ClinicalTimeline.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACzD,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,+CAA+C,CAAA;AAEtD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB,CAAC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,SAAS,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;CAC5D,CAAC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;CACvB,CAAC,CAAA;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,GAAgB,EAChB,cAAqB,GACtB,EAAE,QAAQ,CAAC;IACV,KAAK,EAAE,kBAAkB,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC7C,MAAM,EAAE,2BAA2B,CAAA;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC,+BAWD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAgB,EAAE,EAAE,QAAQ,CAAC;IAC9G,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACzC,MAAM,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,sBAAsB,CAAA;IAC9B,GAAG,CAAC,EAAE,IAAI,CAAA;CACX,CAAC,+BAwDD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { composeFhirDateTimeFromLocalParts, formatFhirTemporalForLocale, isFhirTemporalWithinRange, splitFhirDateTimeForInput, } from 'fhir-data-utils-ts/fhir-temporal-presentation';
|
|
4
|
+
export function ClinicalDateTimeFields({ value, onChange, labels, timeZone, now = new Date(), includeSeconds = true, }) {
|
|
5
|
+
const current = splitFhirDateTimeForInput(now, timeZone);
|
|
6
|
+
const time = includeSeconds ? current.time : current.time.slice(0, 5);
|
|
7
|
+
return (_jsxs("div", { className: "uhcp-clinical-date-time-fields", children: [_jsxs("label", { children: [labels.date, _jsx("input", { type: "date", value: value.date, onChange: (event) => onChange({ ...value, date: event.target.value }) })] }), _jsx("button", { type: "button", title: labels.useToday, "aria-label": labels.useToday, onClick: () => onChange({ ...value, date: current.date }), children: "\u25C9" }), _jsxs("label", { children: [labels.time, _jsx("input", { type: "time", step: includeSeconds ? 1 : 60, value: value.time, onChange: (event) => onChange({ ...value, time: event.target.value }) })] }), _jsx("button", { type: "button", title: labels.useCurrentTime, "aria-label": labels.useCurrentTime, onClick: () => onChange({ ...value, time }), children: "\u25F7" })] }));
|
|
8
|
+
}
|
|
9
|
+
export function ClinicalTimeline({ entries, facets = [], locale, timeZone, labels, now = new Date() }) {
|
|
10
|
+
const [selectedFacets, setSelectedFacets] = useState({});
|
|
11
|
+
const [from, setFrom] = useState({ date: '', time: '' });
|
|
12
|
+
const [to, setTo] = useState({ date: '', time: '' });
|
|
13
|
+
const [requestedIndex, setRequestedIndex] = useState(0);
|
|
14
|
+
const [showAll, setShowAll] = useState(false);
|
|
15
|
+
const current = splitFhirDateTimeForInput(now, timeZone);
|
|
16
|
+
const filtered = useMemo(() => [...entries]
|
|
17
|
+
.filter((entry) => matchesEverySelectedFacet(entry, selectedFacets))
|
|
18
|
+
.filter((entry) => {
|
|
19
|
+
const start = composeOptionalBoundary(from, timeZone, 'from');
|
|
20
|
+
const end = composeOptionalBoundary(to, timeZone, 'to');
|
|
21
|
+
return isFhirTemporalWithinRange(entry.dateTime, { ...(start === undefined ? {} : { from: start }), ...(end === undefined ? {} : { to: end }) }, now);
|
|
22
|
+
})
|
|
23
|
+
.sort((left, right) => new Date(right.dateTime).getTime() - new Date(left.dateTime).getTime()), [entries, from, now, selectedFacets, timeZone, to]);
|
|
24
|
+
const index = Math.min(requestedIndex, Math.max(filtered.length - 1, 0));
|
|
25
|
+
const selected = filtered[index];
|
|
26
|
+
return (_jsxs("section", { className: "uhcp-clinical-timeline", children: [_jsxs("div", { className: "uhcp-clinical-filters", children: [_jsxs("div", { className: "uhcp-clinical-range", children: [_jsx(DateTimeBoundary, { label: labels.from, labels: labels, current: current, value: from, onChange: (value) => { setFrom(value); setRequestedIndex(0); } }), _jsx(DateTimeBoundary, { label: labels.to, labels: labels, current: current, value: to, onChange: (value) => { setTo(value); setRequestedIndex(0); } })] }), facets.map((facet) => _jsxs("fieldset", { children: [_jsx("legend", { children: facet.label }), facet.options.map((option) => _jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: selectedFacets[facet.id]?.includes(option.id) ?? false, onChange: () => {
|
|
27
|
+
setSelectedFacets((current) => toggleFacet(current, facet.id, option.id));
|
|
28
|
+
setRequestedIndex(0);
|
|
29
|
+
} }), option.label] }, option.id))] }, facet.id))] }), selected ? _jsxs(_Fragment, { children: [_jsxs("article", { className: "uhcp-clinical-timeline-card", children: [_jsx("h4", { children: selected.title }), _jsx("time", { dateTime: selected.dateTime, children: formatFhirTemporalForLocale(selected.dateTime, locale, { timeZone, includeTime: true }) }), selected.content] }), _jsxs("nav", { className: "uhcp-clinical-timeline-navigation", "aria-label": `${selected.title} history`, children: [_jsx("button", { type: "button", disabled: index === 0, onClick: () => setRequestedIndex((value) => Math.max(0, value - 1)), children: labels.previous }), _jsxs("output", { "aria-live": "polite", children: [index + 1, " / ", filtered.length] }), _jsx("button", { type: "button", disabled: index >= filtered.length - 1, onClick: () => setRequestedIndex((value) => value + 1), children: labels.next }), _jsx("button", { type: "button", "aria-expanded": showAll, onClick: () => setShowAll((value) => !value), children: labels.showAll })] }), showAll ? _jsx("ol", { className: "uhcp-clinical-timeline-list", children: filtered.map((entry) => _jsxs("li", { children: [_jsx("strong", { children: entry.title }), _jsx("time", { dateTime: entry.dateTime, children: formatFhirTemporalForLocale(entry.dateTime, locale, { timeZone, includeTime: true }) })] }, entry.id)) }) : null] }) : _jsx("p", { className: "uhcp-clinical-empty", children: labels.empty })] }));
|
|
30
|
+
}
|
|
31
|
+
function DateTimeBoundary({ label, labels, current, value, onChange }) {
|
|
32
|
+
return _jsxs("fieldset", { children: [_jsx("legend", { children: label }), _jsxs("label", { children: [labels.date, _jsx("input", { "aria-label": `${label} ${labels.date}`, type: "date", value: value.date, onChange: (event) => onChange({ ...value, date: event.target.value }) })] }), _jsx("button", { type: "button", title: `${labels.useToday} (${label})`, "aria-label": `${labels.useToday} (${label})`, onClick: () => onChange({ ...value, date: current.date }), children: "\u25C9" }), _jsxs("label", { children: [labels.time, _jsx("input", { "aria-label": `${label} ${labels.time}`, type: "time", step: "1", value: value.time, onChange: (event) => onChange({ ...value, time: event.target.value }) })] }), _jsx("button", { type: "button", title: `${labels.useCurrentTime} (${label})`, "aria-label": `${labels.useCurrentTime} (${label})`, onClick: () => onChange({ ...value, time: current.time }), children: "\u25F7" })] });
|
|
33
|
+
}
|
|
34
|
+
function composeOptionalBoundary(parts, timeZone, edge) {
|
|
35
|
+
if (!parts.date)
|
|
36
|
+
return undefined;
|
|
37
|
+
const defaultTime = edge === 'from' ? '00:00:00' : '23:59:59';
|
|
38
|
+
return composeFhirDateTimeFromLocalParts({ date: parts.date, time: parts.time || defaultTime, timeZone });
|
|
39
|
+
}
|
|
40
|
+
function matchesEverySelectedFacet(entry, selected) {
|
|
41
|
+
return Object.entries(selected).every(([facetId, selectedOptions]) => selectedOptions.length === 0 || selectedOptions.some((option) => entry.facets?.[facetId]?.includes(option)));
|
|
42
|
+
}
|
|
43
|
+
function toggleFacet(current, facetId, optionId) {
|
|
44
|
+
const existing = current[facetId] ?? [];
|
|
45
|
+
const next = existing.includes(optionId) ? existing.filter((id) => id !== optionId) : [...existing, optionId];
|
|
46
|
+
return { ...current, [facetId]: next };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ClinicalTimeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalTimeline.js","sourceRoot":"","sources":["../../src/clinical/ClinicalTimeline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ClinicalArtifactEditorCopyV2, type ClinicalArtifactEditorV2Props } from './ClinicalArtifactEditorV2.js';
|
|
2
|
+
export declare const ImmunizationArtifactEditorV2Claim: Readonly<{
|
|
3
|
+
readonly NextDoseDate: "Immunization.next-dose-date";
|
|
4
|
+
}>;
|
|
5
|
+
export type ImmunizationArtifactEditorCopyV2 = ClinicalArtifactEditorCopyV2 & Readonly<{
|
|
6
|
+
doseSequenceInvalid: string;
|
|
7
|
+
seriesDosesInvalid: string;
|
|
8
|
+
}>;
|
|
9
|
+
export type ImmunizationArtifactEditorV2Props = Omit<ClinicalArtifactEditorV2Props, 'fields' | 'initialVisibleClaims' | 'initialClaims' | 'validate' | 'buildRelatedEntries' | 'copy'> & Readonly<{
|
|
10
|
+
copy: ImmunizationArtifactEditorCopyV2;
|
|
11
|
+
}>;
|
|
12
|
+
/** Demo-first Immunization specialization over the reusable progressive V2 shell. */
|
|
13
|
+
/** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
|
|
14
|
+
export declare function ImmunizationArtifactEditorV2({ copy, locale, ...props }: ImmunizationArtifactEditorV2Props): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=ImmunizationArtifactEditorV2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImmunizationArtifactEditorV2.d.ts","sourceRoot":"","sources":["../../src/clinical/ImmunizationArtifactEditorV2.tsx"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAEnC,MAAM,+BAA+B,CAAA;AAEtC,eAAO,MAAM,iCAAiC;;EAEnC,CAAA;AAEX,MAAM,MAAM,gCAAgC,GAAG,4BAA4B,GAAG,QAAQ,CAAC;IACrF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAC,CAAA;AAEF,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAAC,6BAA6B,EAAE,QAAQ,GAAG,sBAAsB,GAAG,eAAe,GAAG,UAAU,GAAG,qBAAqB,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC;IAChM,IAAI,EAAE,gCAAgC,CAAA;CACvC,CAAC,CAAA;AAEF,qFAAqF;AACrF,yFAAyF;AACzF,wBAAgB,4BAA4B,CAAC,EAAE,IAAI,EAAE,MAAa,EAAE,GAAG,KAAK,EAAE,EAAE,iCAAiC,+BAsChH"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ImmunizationClaim, buildImmunizationRecommendationFlatEntry, clinicalArtifactCodedOptionsForClaim, validateImmunizationDoseSeries, } from 'fhir-data-utils-ts';
|
|
4
|
+
import { ClinicalArtifactEditorV2, } from './ClinicalArtifactEditorV2.js';
|
|
5
|
+
export const ImmunizationArtifactEditorV2Claim = Object.freeze({
|
|
6
|
+
NextDoseDate: 'Immunization.next-dose-date',
|
|
7
|
+
});
|
|
8
|
+
/** Demo-first Immunization specialization over the reusable progressive V2 shell. */
|
|
9
|
+
/** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
|
|
10
|
+
export function ImmunizationArtifactEditorV2({ copy, locale = 'en', ...props }) {
|
|
11
|
+
const fields = immunizationFields(locale);
|
|
12
|
+
return _jsx(ClinicalArtifactEditorV2, { ...props, locale: locale, copy: copy, fields: fields, initialVisibleClaims: [ImmunizationClaim.Status, ImmunizationClaim.VaccineCodeText, ImmunizationClaim.Date], initialClaims: {
|
|
13
|
+
[ImmunizationClaim.Status]: 'completed',
|
|
14
|
+
[ImmunizationClaim.Patient]: props.authoringContext.subjectReference,
|
|
15
|
+
[ImmunizationClaim.Performer]: props.authoringContext.dataAuthorReference,
|
|
16
|
+
}, validate: claims => {
|
|
17
|
+
try {
|
|
18
|
+
validateImmunizationDoseSeries(claims[ImmunizationClaim.DoseSequence], claims[ImmunizationClaim.SeriesDoses]);
|
|
19
|
+
}
|
|
20
|
+
catch (reason) {
|
|
21
|
+
if (reason instanceof Error && reason.message === 'immunization_dose_sequence_invalid')
|
|
22
|
+
throw new TypeError(copy.doseSequenceInvalid);
|
|
23
|
+
throw new TypeError(copy.seriesDosesInvalid);
|
|
24
|
+
}
|
|
25
|
+
}, buildRelatedEntries: (claims, draftId) => {
|
|
26
|
+
const nextDoseDate = claims[ImmunizationArtifactEditorV2Claim.NextDoseDate];
|
|
27
|
+
const vaccineToken = claims[ImmunizationClaim.VaccineCode];
|
|
28
|
+
if (!nextDoseDate || !vaccineToken)
|
|
29
|
+
return [];
|
|
30
|
+
const separator = vaccineToken.indexOf('|');
|
|
31
|
+
if (separator <= 0 || separator === vaccineToken.length - 1)
|
|
32
|
+
return [];
|
|
33
|
+
const display = claims[ImmunizationClaim.VaccineCodeDisplay];
|
|
34
|
+
const text = claims[ImmunizationClaim.VaccineCodeText];
|
|
35
|
+
const recommendation = buildImmunizationRecommendationFlatEntry({
|
|
36
|
+
entryId: `${draftId}-recommendation`, immunizationEntryId: draftId,
|
|
37
|
+
subjectReference: props.authoringContext.subjectReference,
|
|
38
|
+
recommendationDate: props.authoringContext.createdAt,
|
|
39
|
+
nextDoseDate,
|
|
40
|
+
vaccineCode: { system: vaccineToken.slice(0, separator), code: vaccineToken.slice(separator + 1), ...(display === undefined ? {} : { display }), ...(text === undefined ? {} : { text }) },
|
|
41
|
+
});
|
|
42
|
+
return [recommendation];
|
|
43
|
+
} });
|
|
44
|
+
}
|
|
45
|
+
function immunizationFields(locale) {
|
|
46
|
+
return Object.freeze([
|
|
47
|
+
{ claim: ImmunizationClaim.Status, kind: 'coded-select', required: true, options: clinicalArtifactCodedOptionsForClaim(ImmunizationClaim.Status, locale).map(option => ({ value: option.code, label: option.label })) },
|
|
48
|
+
{ claim: ImmunizationClaim.VaccineCodeText, textClaim: ImmunizationClaim.VaccineCodeText, codeClaim: ImmunizationClaim.VaccineCode, displayClaim: ImmunizationClaim.VaccineCodeDisplay, kind: 'coded-concept', required: true },
|
|
49
|
+
{ claim: ImmunizationClaim.Date, kind: 'date-time', required: true },
|
|
50
|
+
{ claim: ImmunizationClaim.TargetDiseaseText, textClaim: ImmunizationClaim.TargetDiseaseText, codeClaim: ImmunizationClaim.TargetDisease, displayClaim: ImmunizationClaim.TargetDiseaseDisplay, kind: 'coded-concept' },
|
|
51
|
+
{ claim: ImmunizationClaim.LotNumber, kind: 'text' },
|
|
52
|
+
{ claim: ImmunizationClaim.DoseSequence, kind: 'positive-integer' },
|
|
53
|
+
{ claim: ImmunizationClaim.SeriesDoses, kind: 'positive-integer' },
|
|
54
|
+
{ claim: ImmunizationClaim.Series, kind: 'text' },
|
|
55
|
+
{ claim: ImmunizationArtifactEditorV2Claim.NextDoseDate, kind: 'date', transient: true },
|
|
56
|
+
{ claim: ImmunizationClaim.Route, codeClaim: ImmunizationClaim.Route, displayClaim: ImmunizationClaim.RouteDisplay, kind: 'coded-concept' },
|
|
57
|
+
{ claim: ImmunizationClaim.Site, codeClaim: ImmunizationClaim.Site, displayClaim: ImmunizationClaim.SiteDisplay, kind: 'coded-concept' },
|
|
58
|
+
{ claim: ImmunizationClaim.Note, kind: 'text' },
|
|
59
|
+
{ claim: '__documents', kind: 'documents', transient: true },
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ImmunizationArtifactEditorV2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImmunizationArtifactEditorV2.js","sourceRoot":"","sources":["../../src/clinical/ImmunizationArtifactEditorV2.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { type ClinicalResourceBundleLike, type ClinicalSectionView, type ClinicalTerminologyTranslationInput } from 'fhir-data-utils-ts/clinical-resource-view';
|
|
3
|
+
import { type ClinicalTimelineLabels } from './ClinicalTimeline.js';
|
|
4
|
+
export type IpsBundleSummaryProps = Readonly<{
|
|
5
|
+
bundle: ClinicalResourceBundleLike;
|
|
6
|
+
locale?: string;
|
|
7
|
+
timeZone?: string;
|
|
8
|
+
translateCode?: (input: ClinicalTerminologyTranslationInput) => string | undefined;
|
|
9
|
+
emptyLabel: string;
|
|
10
|
+
noSectionsLabel?: string;
|
|
11
|
+
/** Omits Composition sections that resolve to no resources. */
|
|
12
|
+
hideEmptySections?: boolean;
|
|
13
|
+
sectionTitle?: (section: ClinicalSectionView) => string;
|
|
14
|
+
resourceTypeLabel?: (resourceType: string) => string;
|
|
15
|
+
sectionActions?: (section: ClinicalSectionView) => ReactNode;
|
|
16
|
+
/** Resource-owned actions such as edit or delete, rendered inside that resource card. */
|
|
17
|
+
resourceActions?: (section: ClinicalSectionView, resource: ClinicalSectionView['resources'][number]) => ReactNode;
|
|
18
|
+
timeline?: Readonly<{
|
|
19
|
+
labels: ClinicalTimelineLabels;
|
|
20
|
+
sectionFacetLabel: string;
|
|
21
|
+
resourceTypeFacetLabel: string;
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Renders every section declared by an IPS Composition and the cards referenced
|
|
26
|
+
* by each section.
|
|
27
|
+
*
|
|
28
|
+
* The shared clinical reader owns Bundle traversal, section placement and card
|
|
29
|
+
* projection. `Composition.section.entry` is authoritative for placement;
|
|
30
|
+
* native FHIR fields or canonical `resource.meta.claims` provide card content.
|
|
31
|
+
* This component performs no ingestion, persistence or GW call.
|
|
32
|
+
*/
|
|
33
|
+
export declare function IpsBundleSummary({ bundle, locale, timeZone, translateCode, emptyLabel, noSectionsLabel, hideEmptySections, sectionTitle, resourceTypeLabel, sectionActions, resourceActions, timeline, }: IpsBundleSummaryProps): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=IpsBundleSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpsBundleSummary.d.ts","sourceRoot":"","sources":["../../src/clinical/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,2CAA2C,CAAA;AAElD,OAAO,EAAgD,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAEjH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,MAAM,EAAE,0BAA0B,CAAA;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mCAAmC,KAAK,MAAM,GAAG,SAAS,CAAA;IAClF,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,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;IAC5D,yFAAyF;IACzF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,SAAS,CAAA;IACjH,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAClB,MAAM,EAAE,sBAAsB,CAAA;QAC9B,iBAAiB,EAAE,MAAM,CAAA;QACzB,sBAAsB,EAAE,MAAM,CAAA;KAC/B,CAAC,CAAA;CACH,CAAC,CAAA;AAEF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,aAAa,EACb,UAAU,EACV,eAA4B,EAC5B,iBAAyB,EACzB,YAAyC,EACzC,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,QAAQ,GACT,EAAE,qBAAqB,+BAwEvB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { toClinicalSectionViews, } from 'fhir-data-utils-ts/clinical-resource-view';
|
|
3
|
+
import { ClinicalSectionSummary } from './ClinicalSectionSummary.js';
|
|
4
|
+
import { ClinicalTimeline } from './ClinicalTimeline.js';
|
|
5
|
+
/**
|
|
6
|
+
* Renders every section declared by an IPS Composition and the cards referenced
|
|
7
|
+
* by each section.
|
|
8
|
+
*
|
|
9
|
+
* The shared clinical reader owns Bundle traversal, section placement and card
|
|
10
|
+
* projection. `Composition.section.entry` is authoritative for placement;
|
|
11
|
+
* native FHIR fields or canonical `resource.meta.claims` provide card content.
|
|
12
|
+
* This component performs no ingestion, persistence or GW call.
|
|
13
|
+
*/
|
|
14
|
+
export function IpsBundleSummary({ bundle, locale, timeZone, translateCode, emptyLabel, noSectionsLabel = emptyLabel, hideEmptySections = false, sectionTitle = (section) => section.title, resourceTypeLabel, sectionActions, resourceActions, timeline, }) {
|
|
15
|
+
const sections = toClinicalSectionViews(bundle, { ...(locale === undefined ? {} : { locale }), ...(translateCode === undefined ? {} : { translateCode }) })
|
|
16
|
+
.filter(section => !hideEmptySections || section.resources.length > 0);
|
|
17
|
+
const nativeResources = new Map((bundle.entry ?? bundle.data ?? []).flatMap((entry) => entry.fullUrl && entry.resource ? [[entry.fullUrl, entry.resource]] : []));
|
|
18
|
+
if (sections.length === 0) {
|
|
19
|
+
return _jsx("p", { className: "uhcp-clinical-empty", "data-ips-summary-empty": true, children: noSectionsLabel });
|
|
20
|
+
}
|
|
21
|
+
const timelineEntries = sections.flatMap((section, sectionIndex) => section.resources.flatMap((resource, resourceIndex) => resource.date ? [{
|
|
22
|
+
id: resource.fullUrl ?? `${sectionIndex}:${resourceIndex}:${resource.resourceType}`,
|
|
23
|
+
title: resource.title,
|
|
24
|
+
dateTime: resource.date,
|
|
25
|
+
facets: {
|
|
26
|
+
section: [section.code ?? section.title],
|
|
27
|
+
resourceType: [resource.resourceType],
|
|
28
|
+
},
|
|
29
|
+
content: _jsx("small", { children: resourceTypeLabel?.(resource.resourceType) ?? resource.resourceType }),
|
|
30
|
+
}] : []));
|
|
31
|
+
const timelineFacets = timeline ? [
|
|
32
|
+
{
|
|
33
|
+
id: 'section',
|
|
34
|
+
label: timeline.sectionFacetLabel,
|
|
35
|
+
options: uniqueOptions(sections.map((section) => ({ id: section.code ?? section.title, label: sectionTitle(section) }))),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'resourceType',
|
|
39
|
+
label: timeline.resourceTypeFacetLabel,
|
|
40
|
+
options: uniqueOptions(sections.flatMap((section) => section.resources.map((resource) => ({
|
|
41
|
+
id: resource.resourceType,
|
|
42
|
+
label: resourceTypeLabel?.(resource.resourceType) ?? resource.resourceType,
|
|
43
|
+
})))),
|
|
44
|
+
},
|
|
45
|
+
] : [];
|
|
46
|
+
return (_jsxs("div", { className: "uhcp-clinical-summary", "data-ips-summary": true, children: [timeline && timeZone && timelineEntries.length ? _jsx(ClinicalTimeline, { entries: timelineEntries, facets: timelineFacets, locale: locale ?? 'en', timeZone: timeZone, labels: timeline.labels }) : null, sections.map((section, sectionIndex) => (_jsx(ClinicalSectionSummary, { code: section.code ?? '', title: sectionTitle(section), resources: section.resources.map((resource, resourceIndex) => {
|
|
47
|
+
const details = observationComponentDetails(nativeResources.get(resource.fullUrl ?? ''));
|
|
48
|
+
return {
|
|
49
|
+
key: resource.fullUrl ?? `${resource.resourceType}:${resourceIndex}:${resource.title}`,
|
|
50
|
+
title: resource.title,
|
|
51
|
+
resourceType: resource.resourceType,
|
|
52
|
+
...(resource.date === undefined ? {} : { date: resource.date }),
|
|
53
|
+
...(details === undefined ? {} : { details }),
|
|
54
|
+
actions: resourceActions?.(section, resource),
|
|
55
|
+
};
|
|
56
|
+
}), emptyLabel: emptyLabel, ...(resourceTypeLabel === undefined ? {} : { resourceTypeLabel }), actions: sectionActions?.(section), ...(locale === undefined ? {} : { locale }), ...(timeZone === undefined ? {} : { timeZone }) }, section.code ?? `${section.title}:${sectionIndex}`)))] }));
|
|
57
|
+
}
|
|
58
|
+
function uniqueOptions(options) {
|
|
59
|
+
return [...new Map(options.map((option) => [option.id, option])).values()];
|
|
60
|
+
}
|
|
61
|
+
function observationComponentDetails(resource) {
|
|
62
|
+
const candidate = resource;
|
|
63
|
+
if (candidate?.resourceType !== 'Observation' || !Array.isArray(candidate.component))
|
|
64
|
+
return undefined;
|
|
65
|
+
const details = candidate.component.flatMap((value) => {
|
|
66
|
+
const component = value;
|
|
67
|
+
const label = component.code?.text ?? component.code?.coding?.find((coding) => coding.display)?.display;
|
|
68
|
+
const quantity = component.valueQuantity;
|
|
69
|
+
if (!label || !Number.isFinite(quantity?.value))
|
|
70
|
+
return [];
|
|
71
|
+
return [{ label, value: String(quantity.value), ...(quantity?.unit ? { unit: quantity.unit } : {}) }];
|
|
72
|
+
});
|
|
73
|
+
return details.length ? details : undefined;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=IpsBundleSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IpsBundleSummary.js","sourceRoot":"","sources":["../../src/clinical/IpsBundleSummary.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ClinicalArtifactEditorV2Props, type ClinicalArtifactFieldV2 } from './ClinicalArtifactEditorV2.js';
|
|
2
|
+
import type { ClinicalArtifactSchema } from './ClinicalArtifactEditor.js';
|
|
3
|
+
export type SchemaClinicalArtifactEditorV2Props = Omit<ClinicalArtifactEditorV2Props, 'fields' | 'initialVisibleClaims' | 'initialClaims'> & Readonly<{
|
|
4
|
+
schema: ClinicalArtifactSchema;
|
|
5
|
+
}>;
|
|
6
|
+
/** Adapts every schema-backed IPS resource to the same progressive V2 editor. */
|
|
7
|
+
/** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
|
|
8
|
+
export declare function SchemaClinicalArtifactEditorV2({ schema, locale, ...props }: SchemaClinicalArtifactEditorV2Props): import("react").JSX.Element;
|
|
9
|
+
/** Keeps form control selection deterministic and owned by the canonical schema/catalog. */
|
|
10
|
+
export declare function clinicalArtifactFieldsV2FromSchema(schema: ClinicalArtifactSchema, locale?: string): readonly ClinicalArtifactFieldV2[];
|
|
11
|
+
//# sourceMappingURL=SchemaClinicalArtifactEditorV2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaClinicalArtifactEditorV2.d.ts","sourceRoot":"","sources":["../../src/clinical/SchemaClinicalArtifactEditorV2.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC7B,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEzE,MAAM,MAAM,mCAAmC,GAAG,IAAI,CAAC,6BAA6B,EAAE,QAAQ,GAAG,sBAAsB,GAAG,eAAe,CAAC,GAAG,QAAQ,CAAC;IACpJ,MAAM,EAAE,sBAAsB,CAAA;CAC/B,CAAC,CAAA;AAEF,iFAAiF;AACjF,yFAAyF;AACzF,wBAAgB,8BAA8B,CAAC,EAAE,MAAM,EAAE,MAAa,EAAE,GAAG,KAAK,EAAE,EAAE,mCAAmC,+BAQtH;AAED,4FAA4F;AAC5F,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,SAAO,GAAG,SAAS,uBAAuB,EAAE,CA8BpI"}
|