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.
Files changed (169) hide show
  1. package/CHANGELOG.md +180 -145
  2. package/README.md +255 -233
  3. package/dist/PortalCurrentSubject.d.ts +29 -0
  4. package/dist/PortalCurrentSubject.d.ts.map +1 -0
  5. package/dist/PortalCurrentSubject.js +62 -0
  6. package/dist/PortalCurrentSubject.js.map +1 -0
  7. package/dist/PortalHeader.d.ts +10 -0
  8. package/dist/PortalHeader.d.ts.map +1 -0
  9. package/dist/PortalHeader.js +11 -0
  10. package/dist/PortalHeader.js.map +1 -0
  11. package/dist/PortalSettingsPanel.d.ts +8 -0
  12. package/dist/PortalSettingsPanel.d.ts.map +1 -0
  13. package/dist/PortalSettingsPanel.js +10 -0
  14. package/dist/PortalSettingsPanel.js.map +1 -0
  15. package/dist/care/AnimalCardArtifact.d.ts +42 -0
  16. package/dist/care/AnimalCardArtifact.d.ts.map +1 -0
  17. package/dist/care/AnimalCardArtifact.js +32 -0
  18. package/dist/care/AnimalCardArtifact.js.map +1 -0
  19. package/dist/care/BrowserRealtimeCallPanel.d.ts +39 -0
  20. package/dist/care/BrowserRealtimeCallPanel.d.ts.map +1 -0
  21. package/dist/care/BrowserRealtimeCallPanel.js +43 -0
  22. package/dist/care/BrowserRealtimeCallPanel.js.map +1 -0
  23. package/dist/care/CardPreview.d.ts +6 -0
  24. package/dist/care/CardPreview.d.ts.map +1 -0
  25. package/dist/care/CardPreview.js +6 -0
  26. package/dist/care/CardPreview.js.map +1 -0
  27. package/dist/care/CommunicationsWorkspace.d.ts +18 -0
  28. package/dist/care/CommunicationsWorkspace.d.ts.map +1 -0
  29. package/dist/care/CommunicationsWorkspace.js +13 -0
  30. package/dist/care/CommunicationsWorkspace.js.map +1 -0
  31. package/dist/care/EmergencyTaskHub.d.ts +27 -0
  32. package/dist/care/EmergencyTaskHub.d.ts.map +1 -0
  33. package/dist/care/EmergencyTaskHub.js +25 -0
  34. package/dist/care/EmergencyTaskHub.js.map +1 -0
  35. package/dist/care/LegalMarkdownDocument.d.ts +6 -0
  36. package/dist/care/LegalMarkdownDocument.d.ts.map +1 -0
  37. package/dist/care/LegalMarkdownDocument.js +57 -0
  38. package/dist/care/LegalMarkdownDocument.js.map +1 -0
  39. package/dist/care/NotificationComposer.d.ts +49 -0
  40. package/dist/care/NotificationComposer.d.ts.map +1 -0
  41. package/dist/care/NotificationComposer.js +83 -0
  42. package/dist/care/NotificationComposer.js.map +1 -0
  43. package/dist/care/ProtectedIndexEmergencyData.d.ts +32 -0
  44. package/dist/care/ProtectedIndexEmergencyData.d.ts.map +1 -0
  45. package/dist/care/ProtectedIndexEmergencyData.js +13 -0
  46. package/dist/care/ProtectedIndexEmergencyData.js.map +1 -0
  47. package/dist/care/SelectedSubjectWorkspace.d.ts +32 -0
  48. package/dist/care/SelectedSubjectWorkspace.d.ts.map +1 -0
  49. package/dist/care/SelectedSubjectWorkspace.js +32 -0
  50. package/dist/care/SelectedSubjectWorkspace.js.map +1 -0
  51. package/dist/care/SoschainWorkspace.d.ts +119 -0
  52. package/dist/care/SoschainWorkspace.d.ts.map +1 -0
  53. package/dist/care/SoschainWorkspace.js +61 -0
  54. package/dist/care/SoschainWorkspace.js.map +1 -0
  55. package/dist/care/SubjectCommunicationCenter.d.ts +45 -0
  56. package/dist/care/SubjectCommunicationCenter.d.ts.map +1 -0
  57. package/dist/care/SubjectCommunicationCenter.js +40 -0
  58. package/dist/care/SubjectCommunicationCenter.js.map +1 -0
  59. package/dist/care/SubjectDemographicsFields.d.ts +42 -0
  60. package/dist/care/SubjectDemographicsFields.d.ts.map +1 -0
  61. package/dist/care/SubjectDemographicsFields.js +71 -0
  62. package/dist/care/SubjectDemographicsFields.js.map +1 -0
  63. package/dist/care/SubjectSectionIndex.d.ts +22 -0
  64. package/dist/care/SubjectSectionIndex.d.ts.map +1 -0
  65. package/dist/care/SubjectSectionIndex.js +34 -0
  66. package/dist/care/SubjectSectionIndex.js.map +1 -0
  67. package/dist/care/SubjectWorkspace.d.ts +29 -0
  68. package/dist/care/SubjectWorkspace.d.ts.map +1 -0
  69. package/dist/care/SubjectWorkspace.js +59 -0
  70. package/dist/care/SubjectWorkspace.js.map +1 -0
  71. package/dist/care/care.css +215 -0
  72. package/dist/care/index.d.ts +16 -0
  73. package/dist/care/index.d.ts.map +1 -0
  74. package/dist/care/index.js +16 -0
  75. package/dist/care/index.js.map +1 -0
  76. package/dist/care/notification-bff-client.d.ts +44 -0
  77. package/dist/care/notification-bff-client.d.ts.map +1 -0
  78. package/dist/care/notification-bff-client.js +89 -0
  79. package/dist/care/notification-bff-client.js.map +1 -0
  80. package/dist/clinical/BrowserClinicalSpeechInput.d.ts +25 -0
  81. package/dist/clinical/BrowserClinicalSpeechInput.d.ts.map +1 -0
  82. package/dist/clinical/BrowserClinicalSpeechInput.js +32 -0
  83. package/dist/clinical/BrowserClinicalSpeechInput.js.map +1 -0
  84. package/dist/clinical/ClinicalActionButton.d.ts +9 -0
  85. package/dist/clinical/ClinicalActionButton.d.ts.map +1 -0
  86. package/dist/clinical/ClinicalActionButton.js +13 -0
  87. package/dist/clinical/ClinicalActionButton.js.map +1 -0
  88. package/dist/clinical/ClinicalArtifactEditor.d.ts +147 -0
  89. package/dist/clinical/ClinicalArtifactEditor.d.ts.map +1 -0
  90. package/dist/clinical/ClinicalArtifactEditor.js +382 -0
  91. package/dist/clinical/ClinicalArtifactEditor.js.map +1 -0
  92. package/dist/clinical/ClinicalArtifactEditorV2.d.ts +77 -0
  93. package/dist/clinical/ClinicalArtifactEditorV2.d.ts.map +1 -0
  94. package/dist/clinical/ClinicalArtifactEditorV2.js +89 -0
  95. package/dist/clinical/ClinicalArtifactEditorV2.js.map +1 -0
  96. package/dist/clinical/ClinicalArtifactPropertiesV2.d.ts +83 -0
  97. package/dist/clinical/ClinicalArtifactPropertiesV2.d.ts.map +1 -0
  98. package/dist/clinical/ClinicalArtifactPropertiesV2.js +46 -0
  99. package/dist/clinical/ClinicalArtifactPropertiesV2.js.map +1 -0
  100. package/dist/clinical/ClinicalBundleDraftEditor.d.ts +99 -0
  101. package/dist/clinical/ClinicalBundleDraftEditor.d.ts.map +1 -0
  102. package/dist/clinical/ClinicalBundleDraftEditor.js +225 -0
  103. package/dist/clinical/ClinicalBundleDraftEditor.js.map +1 -0
  104. package/dist/clinical/ClinicalEditorLayer.d.ts +8 -0
  105. package/dist/clinical/ClinicalEditorLayer.d.ts.map +1 -0
  106. package/dist/clinical/ClinicalEditorLayer.js +12 -0
  107. package/dist/clinical/ClinicalEditorLayer.js.map +1 -0
  108. package/dist/clinical/ClinicalSectionSummary.d.ts +36 -0
  109. package/dist/clinical/ClinicalSectionSummary.d.ts.map +1 -0
  110. package/dist/clinical/ClinicalSectionSummary.js +24 -0
  111. package/dist/clinical/ClinicalSectionSummary.js.map +1 -0
  112. package/dist/clinical/ClinicalSpeechInput.d.ts +58 -0
  113. package/dist/clinical/ClinicalSpeechInput.d.ts.map +1 -0
  114. package/dist/clinical/ClinicalSpeechInput.js +84 -0
  115. package/dist/clinical/ClinicalSpeechInput.js.map +1 -0
  116. package/dist/clinical/ClinicalTimeline.d.ts +52 -0
  117. package/dist/clinical/ClinicalTimeline.d.ts.map +1 -0
  118. package/dist/clinical/ClinicalTimeline.js +48 -0
  119. package/dist/clinical/ClinicalTimeline.js.map +1 -0
  120. package/dist/clinical/ImmunizationArtifactEditorV2.d.ts +15 -0
  121. package/dist/clinical/ImmunizationArtifactEditorV2.d.ts.map +1 -0
  122. package/dist/clinical/ImmunizationArtifactEditorV2.js +62 -0
  123. package/dist/clinical/ImmunizationArtifactEditorV2.js.map +1 -0
  124. package/dist/clinical/IpsBundleSummary.d.ts +34 -0
  125. package/dist/clinical/IpsBundleSummary.d.ts.map +1 -0
  126. package/dist/clinical/IpsBundleSummary.js +75 -0
  127. package/dist/clinical/IpsBundleSummary.js.map +1 -0
  128. package/dist/clinical/SchemaClinicalArtifactEditorV2.d.ts +11 -0
  129. package/dist/clinical/SchemaClinicalArtifactEditorV2.d.ts.map +1 -0
  130. package/dist/clinical/SchemaClinicalArtifactEditorV2.js +62 -0
  131. package/dist/clinical/SchemaClinicalArtifactEditorV2.js.map +1 -0
  132. package/dist/clinical/clinical.css +148 -0
  133. package/dist/clinical/index.d.ts +14 -0
  134. package/dist/clinical/index.d.ts.map +1 -0
  135. package/dist/clinical/index.js +14 -0
  136. package/dist/clinical/index.js.map +1 -0
  137. package/dist/encounter-journey.css +91 -91
  138. package/dist/identity/AnimalIdentityDetailsV2.d.ts +43 -0
  139. package/dist/identity/AnimalIdentityDetailsV2.d.ts.map +1 -0
  140. package/dist/identity/AnimalIdentityDetailsV2.js +9 -0
  141. package/dist/identity/AnimalIdentityDetailsV2.js.map +1 -0
  142. package/dist/identity/AnimalIdentityOnboarding.d.ts +91 -0
  143. package/dist/identity/AnimalIdentityOnboarding.d.ts.map +1 -0
  144. package/dist/identity/AnimalIdentityOnboarding.js +73 -0
  145. package/dist/identity/AnimalIdentityOnboarding.js.map +1 -0
  146. package/dist/identity/AnimalIdentityOnboardingV2.d.ts +56 -0
  147. package/dist/identity/AnimalIdentityOnboardingV2.d.ts.map +1 -0
  148. package/dist/identity/AnimalIdentityOnboardingV2.js +174 -0
  149. package/dist/identity/AnimalIdentityOnboardingV2.js.map +1 -0
  150. package/dist/identity/current-subject.css +11 -0
  151. package/dist/identity/identity.css +64 -0
  152. package/dist/identity/index.d.ts +9 -0
  153. package/dist/identity/index.d.ts.map +1 -0
  154. package/dist/identity/index.js +10 -0
  155. package/dist/identity/index.js.map +1 -0
  156. package/dist/index.d.ts +8 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +8 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/preferences.d.ts +12 -0
  161. package/dist/preferences.d.ts.map +1 -0
  162. package/dist/preferences.js +57 -0
  163. package/dist/preferences.js.map +1 -0
  164. package/dist/styles.css +24 -0
  165. package/dist/usePortalUiPreferences.d.ts +9 -0
  166. package/dist/usePortalUiPreferences.d.ts.map +1 -0
  167. package/dist/usePortalUiPreferences.js +39 -0
  168. package/dist/usePortalUiPreferences.js.map +1 -0
  169. 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"}