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,382 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useId, useMemo, useRef, useState } from 'react';
4
+ import { clinicalArtifactEditorClaimsFromFhirR4, clinicalArtifactFhirR4ToFlat, clinicalArtifactCodedOptionsForClaim, composeFhirDateTimeFromLocalParts, splitFhirDateTimeForInput, } from 'fhir-data-utils-ts';
5
+ import { buildMultichannelOperationBundle, MultichannelOperationMode, readMultichannelOperationFromBundle, selectMultichannelOperationClaimValues, } from 'sos-data-utils-ts/multichannel-operation-schemas';
6
+ import { ClinicalEditorLayer } from './ClinicalEditorLayer.js';
7
+ import { ClinicalSpeechInputButton } from './ClinicalSpeechInput.js';
8
+ /**
9
+ * Shared human/animal clinical editor. The host owns authorization, transport,
10
+ * persistence and terminology service access. A successful form submission is
11
+ * published only after the host returns a fresh provider readback Bundle.
12
+ */
13
+ /** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
14
+ export function ClinicalArtifactEditor({ request, schema, operationSchema, authoringContext, copy, locale = 'en', timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone, taxonomyId, fieldLabel, resourceTypeLabel, searchTerminology, loadTerminologySources, saveArtifact, onCancel, onReadback, }) {
15
+ const titleId = useId();
16
+ const descriptionId = useId();
17
+ const acceptedClaims = useMemo(() => operationSchema
18
+ ? Object.keys(operationSchema.properties.claims?.properties ?? {})
19
+ : [...schema.requiredClaims, ...schema.optionalClaims], [operationSchema, schema.optionalClaims, schema.requiredClaims]);
20
+ const fields = useMemo(() => acceptedClaims
21
+ .filter((claim) => !claim.endsWith('.section') && !claim.endsWith('.user-selected'))
22
+ .filter((claim) => !isHiddenCodingCompanion(request.resourceType, claim, acceptedClaims)), [acceptedClaims, request.resourceType]);
23
+ const requiredClaims = useMemo(() => new Set(operationSchema?.properties.claims?.required ?? schema.requiredClaims), [operationSchema, schema.requiredClaims]);
24
+ const [claims, setClaims] = useState(() => {
25
+ const operationId = operationSchema?.['x-operation-id'];
26
+ const initialBundleClaims = request.initialBundle && operationId
27
+ ? readMultichannelOperationFromBundle(operationId, request.initialBundle, {
28
+ operation: request.mode === 'update' ? MultichannelOperationMode.Update : MultichannelOperationMode.Create,
29
+ ...(request.artifactId === undefined ? {} : { resourceId: request.artifactId }),
30
+ ...(request.ifMatch === undefined ? {} : { ifMatch: request.ifMatch }),
31
+ }).claims
32
+ : {};
33
+ const initialResourceClaims = request.initialResource
34
+ ? operationId
35
+ ? selectMultichannelOperationClaimValues(operationId, clinicalArtifactFhirR4ToFlat(request.initialResource))
36
+ : clinicalArtifactEditorClaimsFromFhirR4(request.initialResource, {
37
+ resourceType: request.resourceType,
38
+ sectionCode: schema.sectionCode ?? request.sectionCode,
39
+ requiredClaims: schema.requiredClaims,
40
+ optionalClaims: schema.optionalClaims,
41
+ terminologyTextClaims: schema.terminologyTextClaims ?? [],
42
+ initialClaims: schema.initialClaims ?? defaultClaims(request.resourceType),
43
+ })
44
+ : {};
45
+ return {
46
+ ...(operationSchema ? jsonSchemaDefaultClaims(operationSchema) : defaultClaims(request.resourceType)),
47
+ ...schema.initialClaims,
48
+ ...stringClaims(initialBundleClaims),
49
+ ...stringClaims(initialResourceClaims),
50
+ ...Object.fromEntries(Object.entries(request.initialClaims ?? {}).map(([claim, value]) => [claim, String(value ?? '')])),
51
+ };
52
+ });
53
+ const [activeTerminologyClaim, setActiveTerminologyClaim] = useState();
54
+ const [candidates, setCandidates] = useState([]);
55
+ const [terminologyBusy, setTerminologyBusy] = useState(false);
56
+ const [terminologyError, setTerminologyError] = useState(false);
57
+ const [terminologySources, setTerminologySources] = useState([]);
58
+ const [selectedTerminologySources, setSelectedTerminologySources] = useState([]);
59
+ const [terminologySourcesClaim, setTerminologySourcesClaim] = useState('');
60
+ const [saving, setSaving] = useState(false);
61
+ const [attachments, setAttachments] = useState(request.initialAttachments ?? []);
62
+ const [error, setError] = useState('');
63
+ const [pending, setPending] = useState('');
64
+ const draftId = useRef(request.artifactId ?? crypto.randomUUID());
65
+ useEffect(() => {
66
+ if (!activeTerminologyClaim || !loadTerminologySources)
67
+ return;
68
+ const codeClaim = terminologyCodeClaim(request.resourceType, activeTerminologyClaim);
69
+ let current = true;
70
+ setTerminologySourcesClaim('');
71
+ void loadTerminologySources({ resourceType: request.resourceType, claim: codeClaim, language: locale, ...(taxonomyId === undefined ? {} : { taxonomyId }) }).then((sources) => {
72
+ if (!current)
73
+ return;
74
+ setTerminologySources(sources);
75
+ const defaults = sources.filter(source => source.default).map(source => source.id);
76
+ setSelectedTerminologySources(defaults.length ? defaults : sources[0] ? [sources[0].id] : []);
77
+ setTerminologySourcesClaim(activeTerminologyClaim);
78
+ }).catch(() => {
79
+ if (current) {
80
+ setTerminologySources([]);
81
+ setSelectedTerminologySources([]);
82
+ setTerminologySourcesClaim(activeTerminologyClaim);
83
+ }
84
+ });
85
+ return () => { current = false; };
86
+ }, [activeTerminologyClaim, loadTerminologySources, locale, request.resourceType, taxonomyId]);
87
+ useEffect(() => {
88
+ if (!activeTerminologyClaim || !searchTerminology)
89
+ return;
90
+ if (loadTerminologySources && terminologySourcesClaim !== activeTerminologyClaim)
91
+ return;
92
+ const sourceText = claims[activeTerminologyClaim]?.trim() ?? '';
93
+ if (sourceText.length < 2) {
94
+ setCandidates([]);
95
+ return;
96
+ }
97
+ const codeClaim = terminologyCodeClaim(request.resourceType, activeTerminologyClaim);
98
+ let current = true;
99
+ setTerminologyBusy(true);
100
+ setTerminologyError(false);
101
+ const timer = window.setTimeout(() => {
102
+ void searchTerminology({
103
+ resourceType: request.resourceType,
104
+ claim: codeClaim,
105
+ language: locale,
106
+ text: sourceText,
107
+ ...(taxonomyId === undefined ? {} : { taxonomyId }),
108
+ limit: 20,
109
+ ...(selectedTerminologySources.length ? { sources: selectedTerminologySources } : {}),
110
+ }).then((nextCandidates) => {
111
+ if (current)
112
+ setCandidates(nextCandidates);
113
+ }).catch(() => {
114
+ if (current) {
115
+ setCandidates([]);
116
+ setTerminologyError(true);
117
+ }
118
+ }).finally(() => {
119
+ if (current)
120
+ setTerminologyBusy(false);
121
+ });
122
+ }, 250);
123
+ return () => { current = false; window.clearTimeout(timer); };
124
+ }, [activeTerminologyClaim, claims, loadTerminologySources, locale, request.resourceType, searchTerminology, selectedTerminologySources, taxonomyId, terminologySourcesClaim]);
125
+ async function submit() {
126
+ setSaving(true);
127
+ setError('');
128
+ try {
129
+ const result = await saveArtifact({
130
+ resourceType: request.resourceType,
131
+ id: draftId.current,
132
+ sectionCode: request.sectionCode,
133
+ mode: request.mode,
134
+ claims,
135
+ attachments,
136
+ ...(operationSchema ? buildOperationDraft(operationSchema, authoringContext, request, draftId.current, claims) : {}),
137
+ });
138
+ if (!result)
139
+ throw new Error(copy.readbackMissing);
140
+ if (isSaveOutcome(result)) {
141
+ if (result.state === 'confirmed') {
142
+ setPending('');
143
+ onReadback(result.bundle);
144
+ return;
145
+ }
146
+ if (result.state === 'rejected')
147
+ throw new Error(result.message);
148
+ setPending(result.message || copy.pending || copy.readbackMissing);
149
+ return;
150
+ }
151
+ setPending('');
152
+ onReadback(result);
153
+ }
154
+ catch (reason) {
155
+ setError(reason instanceof Error ? reason.message : String(reason));
156
+ }
157
+ finally {
158
+ setSaving(false);
159
+ }
160
+ }
161
+ function toggleTerminologySource(sourceId, selected) {
162
+ setSelectedTerminologySources(current => {
163
+ const next = selected ? [...new Set([...current, sourceId])] : current.filter(candidate => candidate !== sourceId);
164
+ return next.length ? next : current;
165
+ });
166
+ }
167
+ return _jsx(ClinicalEditorLayer, { onDismiss: onCancel, children: _jsxs("section", { className: "uhcp-clinical-editor", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": descriptionId, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { id: titleId, children: copy.title }), _jsxs("p", { className: "uhcp-clinical-editor-resource-type", children: [copy.resourceType || 'FHIR resource', ": ", resourceTypeLabel || request.resourceType] }), _jsx("p", { id: descriptionId, children: copy.description })] }), _jsx("button", { type: "button", onClick: onCancel, "aria-label": copy.close, children: "\u00D7" })] }), _jsxs("form", { onSubmit: (event) => { event.preventDefault(); void submit(); }, children: [fields.map((claim) => {
168
+ const parameter = claim.slice(request.resourceType.length + 1);
169
+ const label = fieldLabel(claim);
170
+ const terminologyEnabled = Boolean(searchTerminology && terminologyCodeClaim(request.resourceType, claim));
171
+ const inputId = `${titleId}-${claim}`;
172
+ const value = claims[claim] ?? '';
173
+ const codedOptions = clinicalArtifactCodedOptionsForClaim(claim, locale);
174
+ const schemaNode = operationSchema?.properties.claims?.properties?.[claim];
175
+ const update = (event) => {
176
+ setClaims((current) => ({ ...current, [claim]: event.target.value }));
177
+ if (terminologyEnabled)
178
+ setActiveTerminologyClaim(claim);
179
+ };
180
+ if (isDateTimeSchemaNode(schemaNode))
181
+ return _jsx(ClinicalDateTimeClaimField, { label: label, required: requiredClaims.has(claim), value: value, timeZone: timeZone, labels: copy.dateTime ?? DEFAULT_DATE_TIME_LABELS, onChange: (nextValue) => setClaims((current) => ({ ...current, [claim]: nextValue })) }, claim);
182
+ const fieldClassName = `uhcp-clinical-editor-field${isMultiline(parameter) ? ' uhcp-clinical-editor-wide' : ''}`;
183
+ const appendTranscript = (transcript) => {
184
+ setClaims((current) => ({
185
+ ...current,
186
+ [claim]: [current[claim]?.trim(), transcript].filter(Boolean).join(' '),
187
+ }));
188
+ if (terminologyEnabled)
189
+ setActiveTerminologyClaim(claim);
190
+ };
191
+ return _jsxs("div", { className: fieldClassName, children: [_jsxs("span", { className: "uhcp-clinical-editor-field-heading", children: [_jsxs("label", { htmlFor: inputId, children: [label, requiredClaims.has(claim) ? ' *' : ''] }), isSpeechCompatibleField(parameter, schemaNode, codedOptions.length > 0) ? _jsx(ClinicalSpeechInputButton, { resourceType: request.resourceType, claim: claim, locale: locale, fieldLabel: label, onTranscript: appendTranscript }) : null] }), codedOptions.length ? _jsxs("select", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), onChange: update, children: [!requiredClaims.has(claim) ? _jsx("option", { value: "" }) : null, codedOptions.map((option) => _jsx("option", { value: option.code, children: option.label }, option.code))] }) : isMultiline(parameter) ? _jsx("textarea", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), rows: 3, onChange: update })
192
+ : _jsx("input", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), type: fieldInputType(parameter, operationSchema?.properties.claims?.properties?.[claim]), onChange: update }), terminologyEnabled && activeTerminologyClaim === claim ? _jsxs("div", { className: "uhcp-terminology-results", children: [terminologySources.length ? _jsxs("details", { className: "uhcp-terminology-source-picker", children: [_jsxs("summary", { children: [copy.terminologySources || 'Coding systems', ": ", terminologySources.filter(source => selectedTerminologySources.includes(source.id)).map(source => source.label || source.id).join(', ')] }), _jsxs("fieldset", { "aria-label": copy.terminologySources || 'Coding systems', children: [_jsx("legend", { className: "uhcp-sr-only", children: copy.terminologySources || 'Coding systems' }), terminologySources.map(source => _jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: selectedTerminologySources.includes(source.id), onChange: event => toggleTerminologySource(source.id, event.currentTarget.checked) }), _jsx("span", { children: source.label || source.id })] }, source.id))] })] }) : null, terminologyBusy ? _jsx("small", { role: "status", children: copy.terminologyLoading }) : null, terminologyError ? _jsx("small", { role: "alert", children: copy.terminologyUnavailable }) : null, candidates.length ? _jsx("ul", { children: candidates.map((candidate) => _jsx("li", { children: _jsxs("button", { type: "button", onClick: () => {
193
+ setClaims((current) => selectedCodingClaims(request.resourceType, claim, candidate, acceptedClaims, current));
194
+ setCandidates([]);
195
+ setActiveTerminologyClaim(undefined);
196
+ }, children: [candidate.display, _jsxs("small", { children: [candidate.system, " \u00B7 ", candidate.code] })] }) }, `${candidate.system}|${candidate.code}`)) }) : null] }) : null] }, claim);
197
+ }), _jsxs("fieldset", { className: "uhcp-clinical-editor-attachments", children: [_jsx("legend", { children: copy.attachments || 'Documents' }), _jsxs("label", { children: [_jsx("span", { children: copy.addAttachments || 'Add PDF or image' }), _jsx("input", { type: "file", multiple: true, accept: "application/pdf,image/png,image/jpeg,.pdf,.png,.jpg,.jpeg", "aria-label": copy.addAttachments || 'Add PDF or image', onChange: (event) => {
198
+ const files = [...(event.currentTarget.files ?? [])];
199
+ event.currentTarget.value = '';
200
+ void Promise.all(files.map(readClinicalAttachment)).then((next) => {
201
+ setAttachments((current) => [...current, ...next]);
202
+ }).catch((reason) => setError(reason instanceof Error ? reason.message : String(reason)));
203
+ } })] }), attachments.length ? _jsx("ul", { children: attachments.map((attachment) => _jsxs("li", { children: [_jsx("span", { children: attachment.name }), _jsx("button", { type: "button", "aria-label": `${copy.removeAttachment || 'Remove document'} ${attachment.name}`, onClick: () => setAttachments(current => current.filter(candidate => candidate.id !== attachment.id)), children: "\u00D7" })] }, attachment.id)) }) : null] }), error ? _jsx("p", { className: "uhcp-clinical-editor-error", role: "alert", children: error }) : null, pending ? _jsx("p", { className: "uhcp-clinical-editor-pending", role: "status", children: copy.pending || pending }) : null, _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: onCancel, children: copy.cancel }), _jsx("button", { type: "submit", disabled: saving, children: saving ? copy.saving : pending ? (copy.retry || copy.save) : copy.save })] })] })] }) });
204
+ }
205
+ export async function readClinicalAttachment(file) {
206
+ const contentType = normalizeClinicalAttachmentType(file);
207
+ const bytes = new Uint8Array(await readFileBytes(file));
208
+ const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));
209
+ return Object.freeze({
210
+ id: crypto.randomUUID(),
211
+ name: file.name,
212
+ contentType,
213
+ contentHash: `sha256:${hex(digest)}`,
214
+ dataBase64: bytesToBase64(bytes),
215
+ });
216
+ }
217
+ function normalizeClinicalAttachmentType(file) {
218
+ if (file.type === 'application/pdf' || file.type === 'image/png' || file.type === 'image/jpeg')
219
+ return file.type;
220
+ const extension = file.name.toLowerCase().split('.').pop();
221
+ if (extension === 'pdf')
222
+ return 'application/pdf';
223
+ if (extension === 'png')
224
+ return 'image/png';
225
+ if (extension === 'jpg' || extension === 'jpeg')
226
+ return 'image/jpeg';
227
+ throw new TypeError('clinical_attachment_type_unsupported');
228
+ }
229
+ function readFileBytes(file) {
230
+ return new Promise((resolve, reject) => {
231
+ const reader = new FileReader();
232
+ reader.onerror = () => reject(reader.error ?? new Error('clinical_attachment_read_failed'));
233
+ reader.onload = () => reader.result instanceof ArrayBuffer ? resolve(reader.result) : reject(new Error('clinical_attachment_read_failed'));
234
+ reader.readAsArrayBuffer(file);
235
+ });
236
+ }
237
+ function bytesToBase64(bytes) {
238
+ let binary = '';
239
+ for (let index = 0; index < bytes.length; index += 1)
240
+ binary += String.fromCharCode(bytes[index] ?? 0);
241
+ return btoa(binary);
242
+ }
243
+ function hex(bytes) {
244
+ return [...bytes].map(value => value.toString(16).padStart(2, '0')).join('');
245
+ }
246
+ const DEFAULT_DATE_TIME_LABELS = Object.freeze({
247
+ date: 'Date',
248
+ time: 'Time',
249
+ useToday: 'Use today',
250
+ useCurrentTime: 'Use current time',
251
+ });
252
+ function ClinicalDateTimeClaimField({ label, required, value, timeZone, labels, onChange }) {
253
+ const [parts, setParts] = useState(() => splitTemporalClaim(value, timeZone));
254
+ const current = splitFhirDateTimeForInput(new Date(), timeZone);
255
+ const update = (next) => {
256
+ setParts(next);
257
+ onChange(composeTemporalClaim(next, timeZone));
258
+ };
259
+ return _jsxs("fieldset", { className: "uhcp-clinical-editor-date-time", children: [_jsxs("legend", { children: [label, required ? ' *' : ''] }), _jsxs("label", { children: [_jsx("span", { children: labels.date }), _jsx("input", { "aria-label": `${label}: ${labels.date}`, required: required, type: "date", value: parts.date, onChange: (event) => update({ ...parts, date: event.target.value }) })] }), _jsx("button", { type: "button", title: labels.useToday, "aria-label": `${labels.useToday}: ${label}`, onClick: () => update({ ...parts, date: current.date }), children: "\u25C9" }), _jsxs("label", { children: [_jsx("span", { children: labels.time }), _jsx("input", { "aria-label": `${label}: ${labels.time}`, type: "time", step: "1", value: parts.time, onChange: (event) => update({ ...parts, time: event.target.value }) })] }), _jsx("button", { type: "button", title: labels.useCurrentTime, "aria-label": `${labels.useCurrentTime}: ${label}`, onClick: () => update({ ...parts, time: current.time }), children: "\u25F7" })] });
260
+ }
261
+ function splitTemporalClaim(value, timeZone) {
262
+ if (!value)
263
+ return { date: '', time: '' };
264
+ if (/^\d{4}-\d{2}-\d{2}$/.test(value))
265
+ return { date: value, time: '' };
266
+ try {
267
+ return splitFhirDateTimeForInput(value, timeZone);
268
+ }
269
+ catch {
270
+ return { date: '', time: '' };
271
+ }
272
+ }
273
+ function composeTemporalClaim(parts, timeZone) {
274
+ if (!parts.date)
275
+ return '';
276
+ if (!parts.time)
277
+ return parts.date;
278
+ return composeFhirDateTimeFromLocalParts({ ...parts, timeZone });
279
+ }
280
+ function isDateTimeSchemaNode(schemaNode) {
281
+ return schemaNode?.format === 'date-time' || schemaNode?.format === 'fhir-date-time';
282
+ }
283
+ function isSpeechCompatibleField(parameter, schemaNode, hasCodedOptions = false) {
284
+ if (hasCodedOptions)
285
+ return false;
286
+ if (schemaNode?.type === 'number' || schemaNode?.type === 'integer' || schemaNode?.type === 'boolean')
287
+ return false;
288
+ return fieldInputType(parameter, schemaNode) === 'text';
289
+ }
290
+ function isSaveOutcome(value) {
291
+ return typeof value === 'object' && value !== null && 'state' in value;
292
+ }
293
+ function buildOperationDraft(operationSchema, authoringContext, request, resourceId, claims) {
294
+ if (!authoringContext)
295
+ throw new TypeError('clinical_artifact_authoring_context_required');
296
+ const operationId = operationSchema['x-operation-id'];
297
+ const operation = request.mode === 'update' ? MultichannelOperationMode.Update : MultichannelOperationMode.Create;
298
+ const operationValues = {
299
+ operation,
300
+ resourceId,
301
+ ...authoringContext,
302
+ ...(request.ifMatch ? { ifMatch: request.ifMatch } : {}),
303
+ claims: coerceClaimsFromJsonSchema(operationSchema, claims),
304
+ };
305
+ return Object.freeze({
306
+ operationValues,
307
+ changesBundle: buildMultichannelOperationBundle(operationId, operationValues),
308
+ });
309
+ }
310
+ function coerceClaimsFromJsonSchema(schema, claims) {
311
+ const properties = schema.properties.claims?.properties ?? {};
312
+ return Object.freeze(Object.fromEntries(Object.entries(claims)
313
+ .filter(([claim, value]) => properties[claim] && value !== '')
314
+ .map(([claim, value]) => [claim, properties[claim]?.type === 'number' ? Number(value) : value])));
315
+ }
316
+ function stringClaims(claims) {
317
+ return Object.fromEntries(Object.entries(claims).map(([claim, value]) => [claim, String(value ?? '')]));
318
+ }
319
+ function jsonSchemaDefaultClaims(schema) {
320
+ return Object.fromEntries(Object.entries(schema.properties.claims?.properties ?? {})
321
+ .filter(([, node]) => node.default !== undefined)
322
+ .map(([claim, node]) => [claim, String(node.default)]));
323
+ }
324
+ function defaultClaims(resourceType) {
325
+ if (resourceType === 'Immunization')
326
+ return { 'Immunization.status': 'completed' };
327
+ if (resourceType === 'Observation' || resourceType === 'DiagnosticReport')
328
+ return { [`${resourceType}.status`]: 'final' };
329
+ if (resourceType === 'Procedure')
330
+ return { [`${resourceType}.status`]: 'completed' };
331
+ if (resourceType === 'Condition' || resourceType === 'AllergyIntolerance')
332
+ return { [`${resourceType}.clinical-status`]: 'active' };
333
+ return {};
334
+ }
335
+ function terminologyCodeClaim(resourceType, inputClaim) {
336
+ const parameter = inputClaim.slice(resourceType.length + 1);
337
+ // `code-text` is the generic primary-concept alias. Immunization deliberately
338
+ // uses `vaccine-code-text` so vaccine product and target disease remain two
339
+ // independent coded concepts throughout editing and FHIR projection.
340
+ if (parameter === 'code-text')
341
+ return `${resourceType}.code`;
342
+ if (parameter.endsWith('-code-text'))
343
+ return `${resourceType}.${parameter.slice(0, -5)}`;
344
+ if (resourceType === 'MedicationStatement' && parameter === 'medication-text')
345
+ return 'MedicationStatement.code';
346
+ if (parameter === 'target-disease' || parameter.endsWith('-code') || parameter === 'code')
347
+ return inputClaim;
348
+ return '';
349
+ }
350
+ function isHiddenCodingCompanion(resourceType, claim, acceptedClaims) {
351
+ if (claim.endsWith('-display') && acceptedClaims.includes(`${claim.slice(0, -8)}-text`))
352
+ return true;
353
+ if (acceptedClaims.includes(`${claim}-text`))
354
+ return true;
355
+ const canonicalCodingClaim = claim.replace(/-(?:system|value)$/, '');
356
+ if (canonicalCodingClaim !== claim && acceptedClaims.includes(canonicalCodingClaim) && acceptedClaims.includes(`${canonicalCodingClaim}-text`))
357
+ return true;
358
+ return resourceType === 'MedicationStatement' && claim === 'MedicationStatement.code'
359
+ && acceptedClaims.includes('MedicationStatement.medication-text');
360
+ }
361
+ function selectedCodingClaims(resourceType, inputClaim, candidate, acceptedClaims, current) {
362
+ const codeClaim = terminologyCodeClaim(resourceType, inputClaim);
363
+ const next = { ...current, [inputClaim]: current[inputClaim] || candidate.text || candidate.display };
364
+ if (acceptedClaims.includes(codeClaim))
365
+ next[codeClaim] = `${candidate.system}|${candidate.code}`;
366
+ const displayClaim = `${codeClaim}-display`;
367
+ if (acceptedClaims.includes(displayClaim))
368
+ next[displayClaim] = candidate.display;
369
+ return next;
370
+ }
371
+ function isMultiline(parameter) { return /note|description|summary|instruction|outcome|reference-range-text/.test(parameter); }
372
+ function humanize(value) { return value ? value.charAt(0).toUpperCase() + value.slice(1).replaceAll('_', ' ') : value; }
373
+ function fieldInputType(parameter, schemaNode) {
374
+ if (schemaNode)
375
+ return schemaNode.type === 'number' || schemaNode.type === 'integer' ? 'number' : 'text';
376
+ if (/(?:^|-)number$|frequency$|dose-sequence$/.test(parameter))
377
+ return 'number';
378
+ // FHIR date/search fields may carry a partial date or a complete dateTime
379
+ // with timezone. HTML date inputs silently truncate or reject those values.
380
+ return 'text';
381
+ }
382
+ //# sourceMappingURL=ClinicalArtifactEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClinicalArtifactEditor.js","sourceRoot":"","sources":["../../src/clinical/ClinicalArtifactEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { ClinicalResourceBundleLike } from 'fhir-data-utils-ts/clinical-resource-view';
2
+ import { type ClinicalPropertyOptionV2 } from './ClinicalArtifactPropertiesV2.js';
3
+ import type { ClinicalArtifactAuthoringContext, ClinicalArtifactDraft, ClinicalArtifactEditorRequest, ClinicalArtifactSaveOutcome, ClinicalTerminologyCandidate, ClinicalTerminologySearch, ClinicalTerminologySourceSearch } from './ClinicalArtifactEditor.js';
4
+ export type ClinicalArtifactRelatedEntryV2 = Readonly<{
5
+ entryId: string;
6
+ resourceType: string;
7
+ claims: Readonly<Record<string, string>>;
8
+ sectionCode?: string;
9
+ }>;
10
+ export type ClinicalArtifactDraftV2 = ClinicalArtifactDraft & Readonly<{
11
+ relatedEntries?: readonly ClinicalArtifactRelatedEntryV2[];
12
+ }>;
13
+ export type ClinicalArtifactFieldV2 = Readonly<{
14
+ claim: string;
15
+ kind: 'text' | 'date' | 'date-time' | 'positive-integer' | 'coded-select' | 'coded-concept' | 'documents';
16
+ required?: boolean;
17
+ transient?: boolean;
18
+ options?: readonly ClinicalPropertyOptionV2[];
19
+ textClaim?: string;
20
+ codeClaim?: string;
21
+ displayClaim?: string;
22
+ }>;
23
+ export type ClinicalArtifactEditorCopyV2 = Readonly<{
24
+ title: string;
25
+ description: string;
26
+ resourceType?: string;
27
+ save: string;
28
+ saving: string;
29
+ cancel: string;
30
+ close: string;
31
+ terminologyLoading: string;
32
+ terminologyUnavailable: string;
33
+ terminologyEmpty?: string;
34
+ terminologySources: string;
35
+ readbackMissing: string;
36
+ addField: string;
37
+ chooseField: string;
38
+ addSelectedField: string;
39
+ removeField: string;
40
+ searchTerminology: string;
41
+ clearCoding: string;
42
+ selectCandidate: string;
43
+ canonicalCode: string;
44
+ canonicalDisplay: string;
45
+ codingRequired: string;
46
+ documents: string;
47
+ addDocuments: string;
48
+ removeDocument: string;
49
+ date: string;
50
+ time: string;
51
+ useToday: string;
52
+ useCurrentTime: string;
53
+ }>;
54
+ export type ClinicalArtifactEditorV2Props = Readonly<{
55
+ request: ClinicalArtifactEditorRequest;
56
+ authoringContext: ClinicalArtifactAuthoringContext;
57
+ copy: ClinicalArtifactEditorCopyV2;
58
+ fields: readonly ClinicalArtifactFieldV2[];
59
+ initialVisibleClaims: readonly string[];
60
+ initialClaims?: Readonly<Record<string, string>>;
61
+ locale?: string;
62
+ timeZone?: string;
63
+ taxonomyId?: string;
64
+ fieldLabel: (claim: string) => string;
65
+ resourceTypeLabel?: string;
66
+ searchTerminology?: (input: ClinicalTerminologySearch) => Promise<readonly ClinicalTerminologyCandidate[]>;
67
+ loadTerminologySources?: ClinicalTerminologySourceSearch;
68
+ validate?: (claims: Readonly<Record<string, string>>) => void;
69
+ buildRelatedEntries?: (claims: Readonly<Record<string, string>>, draftId: string) => readonly ClinicalArtifactRelatedEntryV2[];
70
+ saveArtifact: (draft: ClinicalArtifactDraftV2) => Promise<ClinicalResourceBundleLike | ClinicalArtifactSaveOutcome | undefined>;
71
+ onCancel: () => void;
72
+ onReadback: (bundle: ClinicalResourceBundleLike) => void;
73
+ }>;
74
+ /** Progressive reusable V2 shell. Resource rules are supplied by a specialized editor. */
75
+ /** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
76
+ export declare function ClinicalArtifactEditorV2({ request, authoringContext, copy, fields, initialVisibleClaims, initialClaims, locale, timeZone, taxonomyId, fieldLabel, resourceTypeLabel, searchTerminology, loadTerminologySources, validate, buildRelatedEntries, saveArtifact, onCancel, onReadback }: ClinicalArtifactEditorV2Props): import("react").JSX.Element;
77
+ //# sourceMappingURL=ClinicalArtifactEditorV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClinicalArtifactEditorV2.d.ts","sourceRoot":"","sources":["../../src/clinical/ClinicalArtifactEditorV2.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAA;AAG3F,OAAO,EAOL,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAEV,gCAAgC,EAChC,qBAAqB,EACrB,6BAA6B,EAC7B,2BAA2B,EAC3B,4BAA4B,EAC5B,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,6BAA6B,CAAA;AAGpC,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CAAC;IACpD,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAC,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,QAAQ,CAAC;IACrE,cAAc,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAA;CAC3D,CAAC,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,CAAA;IACzG,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAA;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;IACtH,kBAAkB,EAAE,MAAM,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;IAC1I,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;IACpF,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;IACxH,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;IAC/D,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CACrE,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,OAAO,EAAE,6BAA6B,CAAA;IACtC,gBAAgB,EAAE,gCAAgC,CAAA;IAClD,IAAI,EAAE,4BAA4B,CAAA;IAClC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAA;IAC1C,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC,CAAA;IAC1G,sBAAsB,CAAC,EAAE,+BAA+B,CAAA;IACxD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAA;IAC7D,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,8BAA8B,EAAE,CAAA;IAC9H,YAAY,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,0BAA0B,GAAG,2BAA2B,GAAG,SAAS,CAAC,CAAA;IAC/H,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;AAEF,0FAA0F;AAC1F,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,aAAkB,EAAE,MAAa,EAAE,QAA2D,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,6BAA6B,+BA4DjY"}
@@ -0,0 +1,89 @@
1
+ 'use client';
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useId, useRef, useState } from 'react';
4
+ import { ClinicalEditorLayer } from './ClinicalEditorLayer.js';
5
+ import { readClinicalAttachment } from './ClinicalArtifactEditor.js';
6
+ import { CodedConceptPropertyV2, CodedSelectPropertyV2, DateTimePropertyV2, DocumentReferencesPropertyV2, OptionalFieldsV2, PositiveIntegerPropertyV2, } from './ClinicalArtifactPropertiesV2.js';
7
+ import { clinicalArtifactSubjectClaims } from 'fhir-data-utils-ts';
8
+ /** Progressive reusable V2 shell. Resource rules are supplied by a specialized editor. */
9
+ /** @deprecated Use ClinicalBundleDraftEditorV2 for every new clinical authoring flow. */
10
+ export function ClinicalArtifactEditorV2({ request, authoringContext, copy, fields, initialVisibleClaims, initialClaims = {}, locale = 'en', timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone, taxonomyId, fieldLabel, resourceTypeLabel, searchTerminology, loadTerminologySources, validate, buildRelatedEntries, saveArtifact, onCancel, onReadback }) {
11
+ const titleId = useId();
12
+ const [claims, setClaims] = useState({ ...initialClaims, ...stringClaims(request.initialClaims) });
13
+ const [visibleClaims, setVisibleClaims] = useState(() => [...new Set([...initialVisibleClaims, ...Object.keys(request.initialClaims ?? {}).filter(claim => fields.some(field => field.claim === claim))])]);
14
+ const [selectedOptional, setSelectedOptional] = useState('');
15
+ const [saving, setSaving] = useState(false);
16
+ const [attachments, setAttachments] = useState(request.initialAttachments ?? []);
17
+ const [error, setError] = useState('');
18
+ const draftId = useRef(request.artifactId ?? crypto.randomUUID());
19
+ const optional = fields.filter(field => !field.required && !visibleClaims.includes(field.claim)).map(field => ({ value: field.claim, label: fieldLabel(field.claim) }));
20
+ const update = (claim, value) => setClaims(current => ({ ...current, [claim]: value }));
21
+ async function submit() {
22
+ setError('');
23
+ try {
24
+ for (const field of fields) {
25
+ if (field.required && field.kind === 'coded-concept' && field.codeClaim && !claims[field.codeClaim]) {
26
+ throw new TypeError(copy.codingRequired);
27
+ }
28
+ }
29
+ validate?.(claims);
30
+ setSaving(true);
31
+ const draft = {
32
+ resourceType: request.resourceType,
33
+ id: draftId.current,
34
+ sectionCode: request.sectionCode,
35
+ mode: request.mode,
36
+ claims: {
37
+ ...clinicalArtifactSubjectClaims(request.resourceType, authoringContext.subjectReference),
38
+ ...cleanClaims(claims, fields),
39
+ },
40
+ attachments,
41
+ relatedEntries: buildRelatedEntries?.(claims, draftId.current) ?? [],
42
+ };
43
+ const result = await saveArtifact(draft);
44
+ if (!result)
45
+ throw new Error(copy.readbackMissing);
46
+ if ('state' in result) {
47
+ if (result.state === 'confirmed')
48
+ onReadback(result.bundle);
49
+ else if (result.state === 'rejected')
50
+ throw new Error(result.message);
51
+ return;
52
+ }
53
+ onReadback(result);
54
+ }
55
+ catch (reason) {
56
+ setError(reason instanceof Error ? reason.message : String(reason));
57
+ }
58
+ finally {
59
+ setSaving(false);
60
+ }
61
+ }
62
+ return _jsx(ClinicalEditorLayer, { onDismiss: onCancel, children: _jsxs("section", { className: "uhcp-clinical-editor uhcp-clinical-editor-v2", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsxs("h2", { id: titleId, children: [copy.title, " ", resourceTypeLabel || request.resourceType] }), _jsx("p", { children: copy.description })] }), _jsx("button", { type: "button", "aria-label": copy.close, onClick: onCancel, children: "\u00D7" })] }), _jsxs("form", { onSubmit: event => { event.preventDefault(); void submit(); }, children: [fields.filter(field => visibleClaims.includes(field.claim)).map(field => _jsxs("div", { className: "uhcp-progressive-field-v2", children: [!field.required ? _jsx("button", { type: "button", className: "uhcp-remove-field-v2", "aria-label": `${copy.removeField}: ${fieldLabel(field.claim)}`, onClick: () => { setVisibleClaims(current => current.filter(claim => claim !== field.claim)); if (field.kind === 'documents')
63
+ setAttachments([]); setClaims(current => { const next = { ...current }; delete next[field.claim]; if (field.codeClaim)
64
+ delete next[field.codeClaim]; if (field.displayClaim)
65
+ delete next[field.displayClaim]; return next; }); }, children: "\u00D7" }) : null, field.kind === 'documents' ? _jsx(DocumentReferencesPropertyV2, { copy: copy, attachments: attachments, onFiles: files => { void Promise.all(files.map(readClinicalAttachment)).then(next => setAttachments(current => [...current, ...next])).catch(reason => setError(reason instanceof Error ? reason.message : String(reason))); }, onRemove: id => setAttachments(current => current.filter(attachment => attachment.id !== id)) })
66
+ : _jsx(ClinicalProperty, { field: field, label: fieldLabel(field.claim), resourceType: request.resourceType, value: claims[field.claim] ?? '', claims: claims, locale: locale, timeZone: timeZone, ...(taxonomyId === undefined ? {} : { taxonomyId }), copy: copy, update: update, ...(searchTerminology === undefined ? {} : { searchTerminology }), ...(loadTerminologySources === undefined ? {} : { loadTerminologySources }) })] }, field.claim)), _jsx(OptionalFieldsV2, { label: copy.addField, choose: copy.chooseField, add: copy.addSelectedField, options: optional, value: selectedOptional, onValueChange: setSelectedOptional, onAdd: () => { if (!selectedOptional)
67
+ return; setVisibleClaims(current => [...current, selectedOptional]); setSelectedOptional(''); } }), error ? _jsx("p", { className: "uhcp-clinical-editor-error", role: "alert", children: error }) : null, _jsxs("footer", { children: [_jsx("button", { className: "uhcp-clinical-editor-submit", type: "submit", disabled: saving, children: saving ? copy.saving : copy.save }), _jsx("button", { className: "uhcp-clinical-editor-cancel", type: "button", onClick: onCancel, children: copy.cancel })] })] })] }) });
68
+ }
69
+ function ClinicalProperty({ field, label, resourceType, value, claims, locale, timeZone, taxonomyId, copy, update, searchTerminology, loadTerminologySources }) {
70
+ if (field.kind === 'date-time')
71
+ return _jsx(DateTimePropertyV2, { label: label, value: value, required: Boolean(field.required), locale: locale, timeZone: timeZone, copy: copy, onChange: next => update(field.claim, next) });
72
+ if (field.kind === 'date')
73
+ return _jsxs("label", { className: "uhcp-clinical-property-v2", children: [label, field.required ? ' *' : '', _jsx("input", { "aria-label": label, type: "date", required: Boolean(field.required), value: value, onChange: event => update(field.claim, event.currentTarget.value) })] });
74
+ if (field.kind === 'positive-integer')
75
+ return _jsx(PositiveIntegerPropertyV2, { label: label, value: value, required: Boolean(field.required), onChange: next => update(field.claim, next) });
76
+ if (field.kind === 'coded-select')
77
+ return _jsx(CodedSelectPropertyV2, { label: label, value: value, required: Boolean(field.required), options: field.options ?? [], onChange: next => update(field.claim, next) });
78
+ if (field.kind === 'coded-concept' && field.codeClaim)
79
+ return _jsx(CodedConceptPropertyV2, { resourceType: resourceType, ...(field.textClaim === undefined ? {} : { textClaim: field.textClaim }), codeClaim: field.codeClaim, ...(field.displayClaim === undefined ? {} : { displayClaim: field.displayClaim }), label: label, locale: locale, ...(taxonomyId === undefined ? {} : { taxonomyId }), text: field.textClaim ? claims[field.textClaim] ?? '' : '', code: claims[field.codeClaim] ?? '', display: field.displayClaim ? claims[field.displayClaim] ?? '' : '', required: Boolean(field.required), copy: copy, ...(searchTerminology === undefined ? {} : { searchTerminology }), ...(loadTerminologySources === undefined ? {} : { loadTerminologySources }), onChange: next => { if (field.textClaim)
80
+ update(field.textClaim, next.text); update(field.codeClaim, next.code); if (field.displayClaim)
81
+ update(field.displayClaim, next.display); } });
82
+ return _jsxs("label", { className: "uhcp-clinical-property-v2", children: [label, field.required ? ' *' : '', _jsx("input", { "aria-label": label, required: Boolean(field.required), value: value, onChange: event => update(field.claim, event.currentTarget.value) })] });
83
+ }
84
+ function stringClaims(value) { return Object.fromEntries(Object.entries(value ?? {}).map(([claim, item]) => [claim, String(item ?? '')])); }
85
+ function cleanClaims(value, fields) {
86
+ const transient = new Set(fields.filter(field => field.transient).map(field => field.claim));
87
+ return Object.fromEntries(Object.entries(value).filter(([claim, item]) => item !== '' && !transient.has(claim)));
88
+ }
89
+ //# sourceMappingURL=ClinicalArtifactEditorV2.js.map