sos-portal-components-react 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 0.3.3 - 2026-11-11
6
+
7
+ - Add controlled, host-authorized Encounter journey and transfer components, including persisted response validation and read-only Personal presentation. Retain the UHC transfer console through a compatibility wrapper.
8
+ - Recover the shared person/animal clinical-section, permission and US Core STU6 contract; distinguish existing views from the pending complete example lifecycle.
9
+
3
10
  ## 0.3.2 - 2026-11-10
4
11
 
5
12
  - Add controlled `SubjectCardLocatorFields` for card-number or DID/QR entry.
package/README.md CHANGED
@@ -87,6 +87,8 @@ This is the current runtime inventory, not completion of the whole catalogue:
87
87
 
88
88
  | Export | Owner / responsibility |
89
89
  | --- | --- |
90
+ | `EncounterJourneyPanel` | Controlled create/status/transfer and read-only saved journey; BFF callbacks own authority and persistence. |
91
+ | `EncounterTransferConsole` | Shared transfer presentation; UHC retains a deprecated compatibility wrapper. |
90
92
  | `SubjectConversationChat` | SOS projection of authorized subject Communications into the neutral Antifraud conversation renderer. |
91
93
  | `createLiveKitRealtimeCallClient` | Host-configured RTC client adapter; the BFF retains authorization, credentials and Communication persistence. |
92
94
  | `useRealtimeCallSessionLifecycle` | Shared persisted-end observation and profile-owned session cleanup for Personal and Professional, including React Strict Mode replay. |
@@ -227,3 +229,5 @@ group adapter.
227
229
  genuinely reusable.
228
230
  6. Remove compatibility implementations only in a later breaking release.
229
231
 
232
+
233
+ See [clinical sections, permissions and US Core contract](docs/03-CLINICAL_SECTIONS_AND_US_CORE_CONTRACT.md) for the recovered person/animal mappings and pending full example lifecycle.
@@ -0,0 +1,34 @@
1
+ import { type PortalEncounterJourneyView, type PortalEncounterMutationResult, type PortalEncounterRequest } from 'sos-data-utils-ts/portal-encounter-journey';
2
+ import { type EncounterTransferConsoleCopy } from './EncounterTransferConsole.js';
3
+ export declare const ENCOUNTER_TRANSFER_COPY_EN: EncounterTransferConsoleCopy;
4
+ export type EncounterJourneyCopy = Readonly<{
5
+ title: string;
6
+ empty: string;
7
+ service: string;
8
+ create: string;
9
+ encounter: string;
10
+ destination: string;
11
+ transfer: string;
12
+ history: string;
13
+ refresh: string;
14
+ retry: string;
15
+ confirmed: string;
16
+ start: string;
17
+ resume: string;
18
+ hold: string;
19
+ complete: string;
20
+ discharge: string;
21
+ cancel: string;
22
+ discontinue: string;
23
+ transferCopy: EncounterTransferConsoleCopy;
24
+ }>;
25
+ export declare const ENCOUNTER_JOURNEY_COPY_EN: EncounterJourneyCopy;
26
+ /** One renderer and one intent contract. The host chooses the authorized provider and returns its actual readback. */
27
+ export declare function EncounterJourneyPanel({ subjectLabel, view, onCommand, onRefresh, copy }: Readonly<{
28
+ subjectLabel: string;
29
+ view: PortalEncounterJourneyView;
30
+ onCommand?: (command: PortalEncounterRequest) => Promise<PortalEncounterMutationResult>;
31
+ onRefresh?: () => Promise<void>;
32
+ copy?: EncounterJourneyCopy;
33
+ }>): import("react").JSX.Element;
34
+ //# sourceMappingURL=EncounterJourneyPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterJourneyPanel.d.ts","sourceRoot":"","sources":["../src/EncounterJourneyPanel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoD,KAAK,0BAA0B,EAAC,KAAK,6BAA6B,EAAC,KAAK,sBAAsB,EAAC,MAAM,4CAA4C,CAAA;AAE5M,OAAO,EAA0B,KAAK,4BAA4B,EAAyD,MAAM,+BAA+B,CAAA;AAEhK,eAAO,MAAM,0BAA0B,EAAC,4BASvC,CAAA;AACD,MAAM,MAAM,oBAAoB,GAAC,QAAQ,CAAC;IACxC,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,OAAO,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAA;IACtK,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,YAAY,EAAC,4BAA4B,CAAA;CACnJ,CAAC,CAAA;AACF,eAAO,MAAM,yBAAyB,EAAC,oBAA4kB,CAAA;AAEnnB,sHAAsH;AACtH,wBAAgB,qBAAqB,CAAC,EAAC,YAAY,EAAC,IAAI,EAAC,SAAS,EAAC,SAAS,EAAC,IAA8B,EAAC,EAAC,QAAQ,CAAC;IACpH,YAAY,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,0BAA0B,CAAC;IAAA,SAAS,CAAC,EAAC,CAAC,OAAO,EAAC,sBAAsB,KAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACvI,SAAS,CAAC,EAAC,MAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAA,IAAI,CAAC,EAAC,oBAAoB,CAAA;CACxD,CAAC,+BA4DD"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { EncounterStatusR5 as S, portalEncounterNextStatuses } from 'sos-data-utils-ts/portal-encounter-journey';
4
+ import { EncounterClaim as E, EncounterHistoryClaim as H } from 'fhir-data-utils-ts/claims';
5
+ import { EncounterTransferConsole } from './EncounterTransferConsole.js';
6
+ export const ENCOUNTER_TRANSFER_COPY_EN = {
7
+ patientSearchTitle: 'Find a patient', scanQr: 'Scan QR', patientId: 'Card identifier', search: 'Find card', journeyTitle: 'Service stages',
8
+ sourceTitle: 'Current service', destinationTitle: 'Destination service', returning: 'Patient will return', returningHint: 'Keep the current service on hold.',
9
+ notReturning: 'Patient will not return', notReturningHint: 'Complete the current service.', transferTo: 'Transfer to', reviewChanges: 'Review changes', applyTransfer: 'Confirm transfer',
10
+ emergencyActions: 'Emergency contacts', call: 'Call', videoCall: 'Video call', sendMessage: 'Send message', text: 'Text', audio: 'Audio', messageLabel: 'Message', attach: 'Attach', pdf: 'PDF', fhirBundle: 'FHIR Bundle', calendar: 'Calendar', send: 'Send',
11
+ resourceSummary: 'Transfer changes', sourceUpdate: 'Update source', sourceHistory: 'Record source history', destinationUpdate: 'Update destination', destinationHistory: 'Record destination history', indexProjection: 'Project continuity',
12
+ demoWarning: 'Synthetic Demo data', helpTitle: 'What happens to the previous service?', helpBody: 'A temporary move keeps it on hold. A definitive move completes it. The destination starts only after the transfer is confirmed.',
13
+ transferReady: 'Transfer confirmed', messageReady: 'Message prepared', callReady: 'Call prepared', videoReady: 'Video call prepared', patientReady: 'Card found', reviewReady: 'Review prepared', attachmentReady: 'Attachment selected', technicalDetails: 'Technical details',
14
+ encounterIdentifier: 'Encounter identifier', transferPending: 'Transfer is not confirmed. Retry the same change.', retryTransfer: 'Retry transfer', transferRejected: 'The transfer was rejected.',
15
+ };
16
+ export const ENCOUNTER_JOURNEY_COPY_EN = { title: 'Encounter journey', empty: 'No encounters have been recorded for this card.', service: 'Service', create: 'Create encounter', encounter: 'Encounter', destination: 'Destination service', transfer: 'Transfer to another service', history: 'Encounter history', refresh: 'Refresh journey', retry: 'Retry last change', confirmed: 'Change confirmed', start: 'Start encounter', resume: 'Resume encounter', hold: 'Pause encounter', complete: 'Complete encounter', discharge: 'Clinical discharge', cancel: 'Cancel encounter', discontinue: 'Discontinue encounter', transferCopy: ENCOUNTER_TRANSFER_COPY_EN };
17
+ /** One renderer and one intent contract. The host chooses the authorized provider and returns its actual readback. */
18
+ export function EncounterJourneyPanel({ subjectLabel, view, onCommand, onRefresh, copy = ENCOUNTER_JOURNEY_COPY_EN }) {
19
+ const [selectedReference, setSelectedReference] = useState(''), [serviceReference, setServiceReference] = useState('');
20
+ const [destinationReference, setDestinationReference] = useState(''), [transferOpen, setTransferOpen] = useState(false);
21
+ const [busy, setBusy] = useState(false), [error, setError] = useState(''), [notice, setNotice] = useState('');
22
+ const retry = useRef(null);
23
+ const selected = view.encounters.find(row => row.entry.reference === selectedReference)
24
+ ?? view.encounters.find(row => row.entry.claims[E.Status] === S.InProgress) ?? view.encounters[0];
25
+ const canManage = Boolean(view.canManage && onCommand), blocked = busy || Boolean(error && retry.current);
26
+ const service = view.services.find(item => item.reference === serviceReference) ?? view.services[0];
27
+ const destinations = view.services.filter(item => item.organizationReference === selected?.entry.claims[E.ServiceProvider] && item.reference !== selected.entry.claims[E.ServiceType]);
28
+ const destination = destinations.find(item => item.reference === destinationReference) ?? destinations[0];
29
+ const stages = view.encounters.map(row => ({ identifier: row.entry.reference,
30
+ serviceLabel: view.services.find(item => item.reference === row.entry.claims[E.ServiceType])?.label || row.entry.claims[E.ServiceType] || 'Encounter',
31
+ arrivedAt: row.entry.claims[E.ActualPeriodStart] || row.entry.claims[E.PeriodStart] || '', status: row.entry.claims[E.Status],
32
+ }));
33
+ const statuses = selected?.allowedStatuses ?? portalEncounterNextStatuses(selected?.entry.claims[E.Status] || '');
34
+ const statusLabel = (status) => status === S.InProgress ? (selected?.entry.claims[E.Status] === S.OnHold ? copy.resume : copy.start) : status === S.OnHold ? copy.hold : status === S.Completed ? copy.complete : status === S.Discharged ? copy.discharge : status === S.Cancelled ? copy.cancel : copy.discontinue;
35
+ async function execute(command) {
36
+ if (!canManage || !onCommand)
37
+ throw new Error('encounter_write_unavailable');
38
+ retry.current = command;
39
+ setBusy(true);
40
+ setError('');
41
+ setNotice('');
42
+ try {
43
+ const result = await onCommand(command);
44
+ if (result.journey.subjectIdentifier !== view.subjectIdentifier || !result.affectedEncounterReferences.length
45
+ || result.affectedEncounterReferences.some(reference => !result.journey.encounters.some(row => row.entry.reference === reference)))
46
+ throw new Error('encounter_readback_missing');
47
+ if (command.action === 'status' && !result.journey.encounters.some(row => row.entry.reference === command.encounterReference && row.entry.claims[E.Status] === command.status))
48
+ throw new Error('encounter_readback_mismatch');
49
+ if (command.action === 'transfer' && (!result.journey.encounters.some(row => row.entry.reference === command.encounterReference && row.entry.claims[E.Status] === command.sourceOutcome)
50
+ || !result.journey.encounters.some(row => row.entry.reference !== command.encounterReference && row.entry.claims[E.ServiceType] === command.destinationServiceReference && row.entry.claims[E.Status] === S.InProgress)))
51
+ throw new Error('encounter_readback_mismatch');
52
+ if (command.action === 'create' && !result.journey.encounters.some(row => result.affectedEncounterReferences.includes(row.entry.reference) && row.entry.claims[E.Status] === S.Planned))
53
+ throw new Error('encounter_readback_mismatch');
54
+ retry.current = null;
55
+ setTransferOpen(false);
56
+ setNotice(copy.confirmed);
57
+ }
58
+ catch (reason) {
59
+ setError(reason instanceof Error ? reason.message : 'Encounter change failed');
60
+ throw reason;
61
+ }
62
+ finally {
63
+ setBusy(false);
64
+ }
65
+ }
66
+ async function transfer(outcome) {
67
+ if (!selected || !destination)
68
+ return { state: 'rejected' };
69
+ const pending = retry.current;
70
+ const command = pending?.action === 'transfer' ? pending : { action: 'transfer', operationId: crypto.randomUUID(), encounterReference: selected.entry.reference, expectedRevision: selected.revision, destinationServiceReference: destination.reference, sourceOutcome: outcome };
71
+ try {
72
+ await execute(command);
73
+ return { state: 'confirmed' };
74
+ }
75
+ catch {
76
+ return { state: 'retryable' };
77
+ }
78
+ }
79
+ return _jsxs("section", { className: "sos-encounter-journey", role: "region", "aria-label": copy.title, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { children: copy.title }), _jsx("p", { children: subjectLabel })] }), onRefresh && _jsx("button", { type: "button", disabled: busy, onClick: () => void onRefresh().then(() => { retry.current = null; setError(''); setNotice(''); }).catch(reason => setError(String(reason))), children: copy.refresh })] }), canManage && service && _jsxs("form", { onSubmit: event => { event.preventDefault(); void execute({ action: 'create', operationId: crypto.randomUUID(), serviceReference: service.reference }).catch(() => { }); }, children: [_jsxs("label", { children: [copy.service, _jsx("select", { "aria-label": copy.service, value: service.reference, disabled: blocked, onChange: event => setServiceReference(event.target.value), children: view.services.map(item => _jsx("option", { value: item.reference, children: item.label }, item.reference)) })] }), _jsx("button", { type: "submit", disabled: blocked, children: copy.create })] }), !view.encounters.length ? _jsx("p", { children: copy.empty }) : _jsxs(_Fragment, { children: [canManage && selected && _jsxs("div", { className: "sos-encounter-actions", children: [_jsxs("label", { children: [copy.encounter, _jsx("select", { "aria-label": copy.encounter, value: selected.entry.reference, disabled: blocked, onChange: event => { setSelectedReference(event.target.value); setTransferOpen(false); }, children: stages.map(item => _jsxs("option", { value: item.identifier, children: [item.serviceLabel, " \u00B7 ", item.status] }, item.identifier)) })] }), statuses.map(status => _jsx("button", { type: "button", disabled: blocked, onClick: () => void execute({ action: 'status', operationId: crypto.randomUUID(), encounterReference: selected.entry.reference, expectedRevision: selected.revision, status }).catch(() => { }), children: statusLabel(status) }, status)), destinations.length > 0 && selected.entry.claims[E.Status] === S.InProgress && _jsx("button", { type: "button", disabled: blocked, onClick: () => setTransferOpen(value => !value), children: copy.transfer })] }), canManage && transferOpen && destination && _jsxs("label", { children: [copy.destination, _jsx("select", { "aria-label": copy.destination, disabled: blocked, value: destination.reference, onChange: event => setDestinationReference(event.target.value), children: destinations.map(item => _jsx("option", { value: item.reference, children: item.label }, item.reference)) })] }), _jsx(EncounterTransferConsole, { copy: copy.transferCopy, patientDisplay: subjectLabel, encounters: stages, sourceEncounterId: transferOpen ? selected?.entry.reference || '' : '', destinationEncounterId: "", contacts: [], readOnly: !canManage || !transferOpen, ...(transferOpen && destination ? { destinationPreview: { serviceLabel: destination.label } } : {}), ...(canManage && transferOpen ? { onApplyTransfer: transfer } : {}) }, transferOpen ? 'edit' : 'read')] }), view.history.length > 0 && _jsxs("details", { children: [_jsx("summary", { children: copy.history }), _jsx("ol", { children: view.history.map(row => _jsxs("li", { "data-encounter-history": row.entry.claims[H.Encounter], children: [_jsx("time", { children: row.entry.claims[H.ActualPeriodStart] }), " \u00B7 ", row.entry.claims[H.Status], " \u00B7 ", view.services.find(service => service.reference === row.entry.claims[H.ServiceType])?.label || row.entry.claims[H.ServiceType]] }, row.entry.reference)) })] }), error && _jsx("p", { role: "alert", children: error }), canManage && error && retry.current && _jsx("button", { type: "button", disabled: busy, onClick: () => void execute(retry.current).catch(() => { }), children: copy.retry }), notice && _jsx("p", { role: "status", children: notice })] });
80
+ }
81
+ //# sourceMappingURL=EncounterJourneyPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterJourneyPanel.js","sourceRoot":"","sources":["../src/EncounterJourneyPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { PortalEncounterRequest, PortalEncounterSourceOutcome } from 'sos-data-utils-ts/portal-encounter-journey';
2
+ export type EncounterTransferStatus = `${Extract<PortalEncounterRequest, {
3
+ action: 'status';
4
+ }>['status']}`;
5
+ export type EncounterSourceOutcome = PortalEncounterSourceOutcome | `${PortalEncounterSourceOutcome}`;
6
+ export type EncounterTransferStage = Readonly<{
7
+ identifier: string;
8
+ /** Human-readable provider business identifier; never replaces the FHIR resource id. */
9
+ displayIdentifier?: string;
10
+ serviceLabel: string;
11
+ locationLabel?: string;
12
+ arrivedAt: string;
13
+ status: EncounterTransferStatus;
14
+ }>;
15
+ export type EmergencyContactAction = Readonly<{
16
+ identifier: string;
17
+ name: string;
18
+ relationship: string;
19
+ phone?: string;
20
+ }>;
21
+ export type EncounterTransferConsoleCopy = Readonly<{
22
+ patientSearchTitle: string;
23
+ scanQr: string;
24
+ patientId: string;
25
+ search: string;
26
+ journeyTitle: string;
27
+ sourceTitle: string;
28
+ destinationTitle: string;
29
+ returning: string;
30
+ returningHint: string;
31
+ notReturning: string;
32
+ notReturningHint: string;
33
+ transferTo: string;
34
+ reviewChanges: string;
35
+ applyTransfer: string;
36
+ emergencyActions: string;
37
+ call: string;
38
+ videoCall: string;
39
+ sendMessage: string;
40
+ text: string;
41
+ audio: string;
42
+ messageLabel: string;
43
+ attach: string;
44
+ pdf: string;
45
+ fhirBundle: string;
46
+ calendar: string;
47
+ send: string;
48
+ resourceSummary: string;
49
+ sourceUpdate: string;
50
+ sourceHistory: string;
51
+ destinationUpdate: string;
52
+ destinationHistory: string;
53
+ indexProjection: string;
54
+ demoWarning: string;
55
+ helpTitle: string;
56
+ helpBody: string;
57
+ transferReady: string;
58
+ messageReady: string;
59
+ callReady: string;
60
+ videoReady: string;
61
+ patientReady: string;
62
+ reviewReady: string;
63
+ attachmentReady: string;
64
+ technicalDetails: string;
65
+ encounterIdentifier: string;
66
+ transferPending: string;
67
+ retryTransfer: string;
68
+ transferRejected: string;
69
+ }>;
70
+ export type EncounterTransferApplyOutcome = Readonly<{
71
+ state: 'confirmed' | 'pending' | 'retryable' | 'rejected';
72
+ message?: string;
73
+ }>;
74
+ export type EncounterTransferConsoleProps = Readonly<{
75
+ copy: EncounterTransferConsoleCopy;
76
+ patientDisplay: string;
77
+ encounters: readonly EncounterTransferStage[];
78
+ sourceEncounterId: string;
79
+ destinationEncounterId: string;
80
+ contacts: readonly EmergencyContactAction[];
81
+ demo?: boolean;
82
+ /** Old illustrative tools are opt-in; normal hosts supply their real card/contact actions separately. */
83
+ legacyTools?: boolean;
84
+ readOnly?: boolean;
85
+ destinationPreview?: Readonly<{
86
+ serviceLabel: string;
87
+ locationLabel?: string;
88
+ }>;
89
+ onApplyTransfer?: (sourceOutcome: EncounterSourceOutcome) => void | EncounterTransferApplyOutcome | Promise<void | EncounterTransferApplyOutcome>;
90
+ }>;
91
+ /**
92
+ * Shared visual editor for one already-authorized subject transfer.
93
+ *
94
+ * Selection and demo state never grant access. The host must resolve the
95
+ * subject, contacts, department sender, HealthcareService and write
96
+ * capability in its BFF. `onApplyTransfer` reports only the requested source
97
+ * outcome; the provider commits authoritative Encounter changes before any
98
+ * completed Communication projects the result to the subject index.
99
+ */
100
+ export declare function EncounterTransferConsole({ copy, patientDisplay, encounters, sourceEncounterId, destinationEncounterId, contacts, demo, legacyTools, readOnly, destinationPreview, onApplyTransfer }: EncounterTransferConsoleProps): import("react").JSX.Element;
101
+ //# sourceMappingURL=EncounterTransferConsole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterTransferConsole.d.ts","sourceRoot":"","sources":["../src/EncounterTransferConsole.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,sBAAsB,EAAC,4BAA4B,EAAC,MAAM,4CAA4C,CAAA;AAEnH,MAAM,MAAM,uBAAuB,GAAG,GAAG,OAAO,CAAC,sBAAsB,EAAC;IAAC,MAAM,EAAC,QAAQ,CAAA;CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAA;AACtG,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,GAAC,GAAG,4BAA4B,EAAE,CAAA;AAEnG,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,uBAAuB,CAAA;CAChC,CAAC,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAEF,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,kBAAkB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;IAC7E,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;IACnE,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;IACxF,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;IAChE,gBAAgB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;IAC9E,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;IAClI,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;IACpJ,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;IACrG,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;IACnI,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CACzE,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,CAAA;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,IAAI,EAAE,4BAA4B,CAAA;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC7C,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,yGAAyG;IACzG,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,QAAQ,CAAC;QAAC,YAAY,EAAC,MAAM,CAAC;QAAA,aAAa,CAAC,EAAC,MAAM,CAAA;KAAC,CAAC,CAAA;IAC1E,eAAe,CAAC,EAAE,CAAC,aAAa,EAAE,sBAAsB,KAAK,IAAI,GAAG,6BAA6B,GAAG,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC,CAAA;CAClJ,CAAC,CAAA;AAcF;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAY,EAAE,WAAmB,EAAE,QAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,EAAE,6BAA6B,+BA8G1P"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useMemo, useRef, useState } from 'react';
3
+ const icons = {
4
+ scan: _jsxs(_Fragment, { children: [_jsx("path", { d: "M4 8V5a1 1 0 0 1 1-1h3M16 4h3a1 1 0 0 1 1 1v3M20 16v3a1 1 0 0 1-1 1h-3M8 20H5a1 1 0 0 1-1-1v-3" }), _jsx("path", { d: "M8 8h3v3H8zM14 8h2v2M8 14h2v2M13 13h3v3h-3z" })] }),
5
+ phone: _jsx("path", { d: "M7.2 3.8 9.4 7 8 9.1a14 14 0 0 0 6.9 6.9l2.1-1.4 3.2 2.2-.8 3a2 2 0 0 1-2.1 1.4C9.8 20.2 3.8 14.2 2.8 6.7A2 2 0 0 1 4.2 4.6z" }),
6
+ video: _jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "6", width: "12", height: "12", rx: "2" }), _jsx("path", { d: "m15 10 6-3v10l-6-3z" })] }),
7
+ message: _jsx("path", { d: "M4 4h16v12H9l-5 4z" }),
8
+ chevron: _jsx("path", { d: "m9 5 7 7-7 7" }),
9
+ };
10
+ function Icon({ name }) {
11
+ return _jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: icons[name] });
12
+ }
13
+ /**
14
+ * Shared visual editor for one already-authorized subject transfer.
15
+ *
16
+ * Selection and demo state never grant access. The host must resolve the
17
+ * subject, contacts, department sender, HealthcareService and write
18
+ * capability in its BFF. `onApplyTransfer` reports only the requested source
19
+ * outcome; the provider commits authoritative Encounter changes before any
20
+ * completed Communication projects the result to the subject index.
21
+ */
22
+ export function EncounterTransferConsole({ copy, patientDisplay, encounters, sourceEncounterId, destinationEncounterId, contacts, demo = false, legacyTools = false, readOnly = false, destinationPreview, onApplyTransfer }) {
23
+ const [sourceOutcome, setSourceOutcome] = useState('on-hold');
24
+ const [selectedContact, setSelectedContact] = useState(contacts[0]?.identifier);
25
+ const [messageOpen, setMessageOpen] = useState(false);
26
+ const [messageMode, setMessageMode] = useState('text');
27
+ const [attachments, setAttachments] = useState([]);
28
+ const [showTechnical, setShowTechnical] = useState(false);
29
+ const [status, setStatus] = useState('');
30
+ const [transferSync, setTransferSync] = useState('idle');
31
+ const railRef = useRef(null);
32
+ const source = useMemo(() => encounters.find((item) => item.identifier === sourceEncounterId), [encounters, sourceEncounterId]);
33
+ const destination = useMemo(() => encounters.find((item) => item.identifier === destinationEncounterId), [encounters, destinationEncounterId]);
34
+ const history = useMemo(() => encounters.filter((item) => item.identifier !== sourceEncounterId && item.identifier !== destinationEncounterId), [encounters, sourceEncounterId, destinationEncounterId]);
35
+ const contact = contacts.find((item) => item.identifier === selectedContact) ?? contacts[0];
36
+ const helpId = useId();
37
+ function toggleAttachment(kind) {
38
+ setAttachments(current => current.includes(kind) ? current.filter(item => item !== kind) : [...current, kind]);
39
+ setStatus(copy.attachmentReady);
40
+ }
41
+ async function applyTransfer() {
42
+ if (readOnly || !onApplyTransfer)
43
+ return;
44
+ setTransferSync('submitting');
45
+ try {
46
+ const outcome = await onApplyTransfer?.(sourceOutcome);
47
+ if (!outcome && !legacyTools) {
48
+ setTransferSync('retryable');
49
+ setStatus(copy.transferPending);
50
+ return;
51
+ }
52
+ if (outcome?.state === 'pending' || outcome?.state === 'retryable') {
53
+ setTransferSync('retryable');
54
+ setStatus(outcome.message || copy.transferPending);
55
+ return;
56
+ }
57
+ if (outcome?.state === 'rejected') {
58
+ setTransferSync('idle');
59
+ setStatus(outcome.message || copy.transferRejected);
60
+ return;
61
+ }
62
+ setTransferSync('idle');
63
+ setStatus(copy.transferReady);
64
+ }
65
+ catch (reason) {
66
+ setTransferSync('retryable');
67
+ setStatus(reason instanceof Error && reason.message ? reason.message : copy.transferPending);
68
+ }
69
+ }
70
+ return _jsxs("section", { className: "uhcp-transfer-console", style: legacyTools ? undefined : { gridTemplateColumns: 'minmax(0,1fr)', minHeight: 'auto' }, children: [legacyTools && _jsx("aside", { className: "uhcp-transfer-contacts", children: _jsxs("details", { open: true, children: [_jsx("summary", { children: copy.emergencyActions }), _jsx("div", { className: "uhcp-transfer-contact-list", role: "list", children: contacts.map((item) => _jsxs("button", { type: "button", role: "listitem", "aria-pressed": item.identifier === contact?.identifier, onClick: () => setSelectedContact(item.identifier), children: [_jsx("span", { "aria-hidden": "true", children: item.name.split(/\s+/).map(part => part[0]).slice(0, 2).join('') }), _jsx("strong", { children: item.name }), _jsxs("small", { children: [item.relationship, item.phone ? ` · ${item.phone}` : ''] })] }, item.identifier)) }), _jsxs("div", { className: "uhcp-transfer-contact-actions", children: [_jsxs("button", { type: "button", onClick: () => setStatus(copy.callReady), children: [_jsx(Icon, { name: "phone" }), copy.call] }), _jsxs("button", { type: "button", onClick: () => setStatus(copy.videoReady), children: [_jsx(Icon, { name: "video" }), copy.videoCall] }), _jsxs("button", { type: "button", "aria-pressed": messageOpen, onClick: () => setMessageOpen(value => !value), children: [_jsx(Icon, { name: "message" }), copy.sendMessage] })] }), messageOpen && contact ? _jsxs("form", { className: "uhcp-transfer-composer", onSubmit: (event) => { event.preventDefault(); setStatus(copy.messageReady); }, children: [_jsxs("h3", { children: [copy.sendMessage, ": ", contact.name] }), _jsxs("div", { className: "uhcp-transfer-mode", role: "group", "aria-label": copy.sendMessage, children: [_jsx("button", { type: "button", "aria-pressed": messageMode === 'text', onClick: () => setMessageMode('text'), children: copy.text }), _jsx("button", { type: "button", "aria-pressed": messageMode === 'audio', onClick: () => setMessageMode('audio'), children: copy.audio })] }), messageMode === 'text' ? _jsxs("label", { children: [copy.messageLabel, _jsx("textarea", { rows: 5 })] }) : _jsxs("button", { className: "uhcp-transfer-record", type: "button", children: ["\u25CF ", copy.audio] }), _jsxs("fieldset", { children: [_jsx("legend", { children: copy.attach }), _jsxs("div", { children: [_jsx("button", { type: "button", "aria-pressed": attachments.includes('pdf'), onClick: () => toggleAttachment('pdf'), children: copy.pdf }), _jsx("button", { type: "button", "aria-pressed": attachments.includes('fhir'), onClick: () => toggleAttachment('fhir'), children: copy.fhirBundle }), _jsx("button", { type: "button", "aria-pressed": attachments.includes('calendar'), onClick: () => toggleAttachment('calendar'), children: copy.calendar })] })] }), _jsx("button", { className: "uhcp-transfer-primary", type: "submit", children: copy.send })] }) : null] }) }), _jsxs("div", { className: "uhcp-transfer-main", children: [legacyTools && _jsxs("header", { className: "uhcp-transfer-patient", children: [_jsx("h2", { children: copy.patientSearchTitle }), _jsxs("div", { children: [_jsxs("button", { type: "button", onClick: () => setStatus(copy.patientReady), children: [_jsx(Icon, { name: "scan" }), copy.scanQr] }), _jsx("span", { "aria-hidden": "true" }), _jsxs("label", { children: [copy.patientId, _jsx("input", { defaultValue: patientDisplay })] }), _jsx("button", { type: "button", onClick: () => setStatus(copy.patientReady), children: copy.search })] })] }), _jsxs("section", { className: "uhcp-transfer-journey", role: "region", "aria-label": copy.journeyTitle, "aria-describedby": readOnly ? undefined : helpId, children: [_jsxs("header", { children: [_jsx("h2", { children: copy.journeyTitle }), _jsxs("div", { children: [_jsx("button", { type: "button", "aria-label": "Anterior", onClick: () => railRef.current?.scrollBy({ left: -260, behavior: 'smooth' }), children: _jsx(Icon, { name: "chevron" }) }), _jsx("button", { type: "button", "aria-label": "Siguiente", onClick: () => railRef.current?.scrollBy({ left: 260, behavior: 'smooth' }), children: _jsx(Icon, { name: "chevron" }) })] })] }), _jsxs("div", { className: "uhcp-transfer-rail", ref: railRef, children: [history.map((item) => _jsx(EncounterCard, { encounter: item }, item.identifier)), source ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-source", children: [_jsx("h3", { children: copy.sourceTitle }), _jsx(EncounterCardBody, { encounter: source, ...(legacyTools ? { identifierLabel: copy.encounterIdentifier } : {}) }), !readOnly && _jsxs("fieldset", { children: [_jsx("legend", { children: copy.helpTitle }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "source-outcome", checked: sourceOutcome === 'on-hold', onChange: () => setSourceOutcome('on-hold') }), _jsxs("span", { children: [_jsx("strong", { children: copy.returning }), _jsx("small", { children: copy.returningHint })] })] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: "source-outcome", checked: sourceOutcome === 'completed', onChange: () => setSourceOutcome('completed') }), _jsxs("span", { children: [_jsx("strong", { children: copy.notReturning }), _jsx("small", { children: copy.notReturningHint })] })] })] })] }) : null, (destination || destinationPreview) && _jsxs("div", { className: "uhcp-transfer-arrow", children: [_jsx("span", { children: copy.transferTo }), _jsx("i", {}), _jsx(Icon, { name: "chevron" })] }), destination ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-destination", children: [_jsx("h3", { children: copy.destinationTitle }), _jsx(EncounterCardBody, { encounter: destination, ...(legacyTools ? { identifierLabel: copy.encounterIdentifier } : {}) })] }) : destinationPreview ? _jsxs("article", { className: "uhcp-transfer-card uhcp-transfer-destination", children: [_jsx("h3", { children: copy.destinationTitle }), _jsx("strong", { children: destinationPreview.serviceLabel }), _jsx("p", { children: destinationPreview.locationLabel })] }) : null] }), !readOnly && _jsxs("details", { className: "uhcp-transfer-help", open: true, children: [_jsx("summary", { id: helpId, children: copy.helpTitle }), _jsx("p", { children: copy.helpBody })] }), !readOnly && _jsxs("div", { className: "uhcp-transfer-controls", children: [legacyTools && _jsx("button", { type: "button", onClick: () => { setShowTechnical(true); setStatus(copy.reviewReady); }, children: copy.reviewChanges }), _jsx("button", { className: "uhcp-transfer-primary", type: "button", disabled: !onApplyTransfer || transferSync === 'submitting', onClick: () => void applyTransfer(), children: transferSync === 'retryable' ? copy.retryTransfer : copy.applyTransfer })] })] }), legacyTools && _jsxs("section", { className: "uhcp-transfer-review", children: [_jsxs("header", { children: [_jsx("h2", { children: copy.resourceSummary }), demo ? _jsx("p", { children: copy.demoWarning }) : null] }), _jsx("ol", { "aria-label": copy.resourceSummary, children: [[copy.sourceUpdate, 'Encounter'], [copy.sourceHistory, 'EncounterHistory'], [copy.destinationUpdate, 'Encounter'], [copy.destinationHistory, 'EncounterHistory'], [copy.indexProjection, 'Communication']].map(([label, resource], index) => _jsxs("li", { children: [_jsx("span", { children: index + 1 }), _jsx("strong", { children: label }), _jsxs("details", { open: showTechnical, children: [_jsx("summary", { children: copy.technicalDetails }), _jsx("code", { children: resource })] })] }, `${resource}-${index}`)) })] }), status ? _jsx("p", { className: "uhcp-transfer-status", role: "status", children: status }) : null] })] });
71
+ }
72
+ function EncounterCard({ encounter }) {
73
+ return _jsx("article", { className: "uhcp-transfer-card", children: _jsx(EncounterCardBody, { encounter: encounter }) });
74
+ }
75
+ function EncounterCardBody({ encounter, identifierLabel }) {
76
+ return _jsxs("div", { className: "uhcp-transfer-card-body", children: [_jsx("time", { children: encounter.arrivedAt }), _jsx("strong", { children: encounter.serviceLabel }), encounter.locationLabel ? _jsx("span", { children: encounter.locationLabel }) : null, _jsx("small", { "data-status": encounter.status, children: encounter.status }), (identifierLabel || encounter.displayIdentifier) && _jsx("code", { "aria-label": identifierLabel, children: encounter.displayIdentifier ?? encounter.identifier })] });
77
+ }
78
+ //# sourceMappingURL=EncounterTransferConsole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncounterTransferConsole.js","sourceRoot":"","sources":["../src/EncounterTransferConsole.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ .uhcp-transfer-console { background:var(--uhcp-surface,#fff); color:var(--uhcp-text,#102754); display:grid; font-family:Inter,ui-sans-serif,system-ui,sans-serif; grid-template-columns:minmax(16rem,23rem) minmax(0,1fr); min-height:calc(100vh - 4.5rem); }
2
+ .uhcp-transfer-console button,.uhcp-transfer-console input,.uhcp-transfer-console textarea { font:inherit; }
3
+ .uhcp-transfer-console svg { fill:none; height:1.25rem; stroke:currentColor; stroke-linecap:round; stroke-linejoin:round; stroke-width:1.8; width:1.25rem; }
4
+ .uhcp-transfer-contacts { border-inline-end:1px solid #dce5ec; padding:1.2rem; }
5
+ .uhcp-transfer-contacts summary { cursor:pointer; font-size:1.05rem; font-weight:850; list-style-position:inside; padding:.35rem 0 1rem; }
6
+ .uhcp-transfer-contact-list { border-block:1px solid #e2e9ef; display:grid; padding:.45rem 0; }
7
+ .uhcp-transfer-contact-list button { background:transparent; border:0; border-inline-start:3px solid transparent; color:inherit; cursor:pointer; display:grid; gap:.15rem; grid-template-columns:2.7rem 1fr; padding:.75rem; text-align:start; }
8
+ .uhcp-transfer-contact-list button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-inline-start-color:var(--uhcp-text,#09a9dc); }
9
+ .uhcp-transfer-contact-list button>span { align-items:center; background:var(--uhcp-surface-muted,#d7e7f1); border-radius:50%; display:flex; font-weight:800; grid-row:span 2; height:2.4rem; justify-content:center; width:2.4rem; }
10
+ .uhcp-transfer-contact-list small { color:var(--uhcp-text,#58708e); }
11
+ .uhcp-transfer-contact-actions { display:grid; gap:.55rem; padding:1rem 0; }
12
+ .uhcp-transfer-contact-actions button,.uhcp-transfer-mode button,.uhcp-transfer-composer fieldset button { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #cad7e2; border-radius:.55rem; color:inherit; cursor:pointer; display:flex; gap:.7rem; padding:.7rem .85rem; }
13
+ .uhcp-transfer-contact-actions button[aria-pressed=true],.uhcp-transfer-mode button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-color:var(--uhcp-text,#09a9dc); color:var(--uhcp-text,#006f96); font-weight:800; }
14
+ .uhcp-transfer-composer fieldset button[aria-pressed=true] { background:var(--uhcp-surface-muted,#eaf8fd); border-color:var(--uhcp-text,#09a9dc); color:var(--uhcp-text,#006f96); font-weight:800; }
15
+ .uhcp-transfer-composer { display:grid; gap:.8rem; }
16
+ .uhcp-transfer-composer h3 { font-size:.95rem; margin:.2rem 0 0; }
17
+ .uhcp-transfer-mode { display:grid; grid-template-columns:1fr 1fr; }
18
+ .uhcp-transfer-mode button { justify-content:center; }
19
+ .uhcp-transfer-composer label { display:grid; font-size:.82rem; font-weight:750; gap:.35rem; }
20
+ .uhcp-transfer-composer textarea { border:1px solid #cad7e2; border-radius:.55rem; color:inherit; resize:vertical; padding:.75rem; }
21
+ .uhcp-transfer-composer fieldset { border:0; margin:0; padding:0; }
22
+ .uhcp-transfer-composer legend { font-size:.82rem; font-weight:750; margin-bottom:.4rem; }
23
+ .uhcp-transfer-composer fieldset>div { display:flex; flex-wrap:wrap; gap:.4rem; }
24
+ .uhcp-transfer-record { background:var(--uhcp-surface,#fff); border:1px dashed #09a9dc; border-radius:.55rem; color:var(--uhcp-text,#006f96); padding:1rem; }
25
+ .uhcp-transfer-primary { background:#0796a8!important; border-color:#0796a8!important; color:#fff!important; font-weight:850!important; }
26
+ .uhcp-transfer-main { min-width:0; padding:1rem; }
27
+ .uhcp-transfer-patient,.uhcp-transfer-journey,.uhcp-transfer-review { border:1px solid #dce5ec; border-radius:.7rem; box-shadow:0 4px 16px rgb(16 39 84 / 5%); }
28
+ .uhcp-transfer-patient { padding:1rem; }
29
+ .uhcp-transfer-patient h2,.uhcp-transfer-journey h2,.uhcp-transfer-review h2 { font-size:1.18rem; margin:0; }
30
+ .uhcp-transfer-patient>div { align-items:center; display:grid; gap:.75rem; grid-template-columns:minmax(11rem,.85fr) 1px minmax(13rem,1fr) auto; margin-top:.75rem; }
31
+ .uhcp-transfer-patient button,.uhcp-transfer-patient label { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #9fb3c8; border-radius:.45rem; display:flex; gap:.65rem; min-height:3rem; padding:.7rem .9rem; }
32
+ .uhcp-transfer-patient button { color:inherit; cursor:pointer; font-weight:800; justify-content:center; }
33
+ .uhcp-transfer-patient button:last-child { background:var(--uhcp-surface-muted,#0796a8); border-color:var(--uhcp-text,#0796a8); color:#fff; }
34
+ .uhcp-transfer-patient>div>span { background:var(--uhcp-surface-muted,#cbd7e1); height:2rem; }
35
+ .uhcp-transfer-patient label { color:var(--uhcp-text,#64748b); }
36
+ .uhcp-transfer-patient input { border:0; color:var(--uhcp-text,#102754); min-width:0; outline:0; width:100%; }
37
+ .uhcp-transfer-journey { margin-top:.8rem; overflow:hidden; padding:1rem; }
38
+ .uhcp-transfer-journey>header,.uhcp-transfer-review>header { align-items:center; display:flex; justify-content:space-between; }
39
+ .uhcp-transfer-journey>header>div { display:flex; gap:.4rem; }
40
+ .uhcp-transfer-journey>header button { align-items:center; background:var(--uhcp-surface,#fff); border:1px solid #cad7e2; border-radius:.45rem; color:inherit; display:flex; padding:.45rem; }
41
+ .uhcp-transfer-journey>header button:first-child svg { transform:rotate(180deg); }
42
+ .uhcp-transfer-rail { align-items:center; display:flex; gap:.8rem; min-height:18rem; overflow-x:auto; padding:1rem .25rem; scrollbar-color:#aebfce #edf2f5; }
43
+ .uhcp-transfer-card { border:1px solid #cad7e2; border-radius:.5rem; flex:0 0 10rem; min-height:12rem; overflow:hidden; }
44
+ .uhcp-transfer-card h3 { background:var(--uhcp-surface-muted,#087db8); color:var(--uhcp-text,#fff); font-size:.82rem; margin:0; padding:.65rem; }
45
+ .uhcp-transfer-card-body { display:grid; gap:.45rem; padding:.85rem; }
46
+ .uhcp-transfer-card-body time,.uhcp-transfer-card-body span,.uhcp-transfer-card-body code { color:var(--uhcp-text,#60738c); font-size:.72rem; }
47
+ .uhcp-transfer-card-body small { background:var(--uhcp-surface-muted,#edf2f5); border-radius:999px; color:var(--uhcp-text,#466079); font-size:.7rem; justify-self:start; padding:.25rem .55rem; }
48
+ .uhcp-transfer-card-body small[data-status=in-progress] { background:var(--uhcp-surface-muted,#d7f4e5); color:var(--uhcp-text,#087a47); }
49
+ .uhcp-transfer-card-body small[data-status=completed] { background:var(--uhcp-surface-muted,#dff6e8); color:var(--uhcp-text,#087a47); }
50
+ .uhcp-transfer-card-body small[data-status=on-hold] { background:var(--uhcp-surface-muted,#fff1d2); color:var(--uhcp-text,#9a5a00); }
51
+ .uhcp-transfer-source { border-color:var(--uhcp-text,#078dcc); flex-basis:13.5rem; }
52
+ .uhcp-transfer-destination { border-color:var(--uhcp-text,#069f69); flex-basis:13rem; }
53
+ .uhcp-transfer-destination h3 { background:var(--uhcp-surface-muted,#069f69); }
54
+ .uhcp-transfer-source fieldset { border:0; border-top:1px solid #dce5ec; margin:.2rem .7rem .7rem; padding:.7rem 0 0; }
55
+ .uhcp-transfer-source legend { font-size:.72rem; font-weight:800; }
56
+ .uhcp-transfer-source label { align-items:start; display:flex; gap:.45rem; padding:.35rem 0; }
57
+ .uhcp-transfer-source label span { display:grid; }
58
+ .uhcp-transfer-source label small { color:var(--uhcp-text,#60738c); font-size:.68rem; }
59
+ .uhcp-transfer-arrow { align-items:center; color:var(--uhcp-text,#0796a8); display:grid; flex:0 0 5rem; grid-template-columns:1fr auto; text-align:center; }
60
+ .uhcp-transfer-arrow span { font-size:.7rem; font-weight:800; grid-column:1/-1; }
61
+ .uhcp-transfer-arrow i { background:var(--uhcp-surface-muted,#0796a8); height:2px; }
62
+ .uhcp-transfer-arrow svg { margin-left:-.45rem; }
63
+ .uhcp-transfer-help { background:var(--uhcp-surface-muted,#f4f9fc); border-radius:.5rem; padding:.65rem .8rem; }
64
+ .uhcp-transfer-help summary { cursor:pointer; font-size:.78rem; font-weight:800; }
65
+ .uhcp-transfer-help p { color:var(--uhcp-text,#51677e); font-size:.78rem; margin:.4rem 0 0; }
66
+ .uhcp-transfer-controls { display:flex; gap:.55rem; justify-content:flex-end; padding-top:.75rem; }
67
+ .uhcp-transfer-controls button { background:var(--uhcp-surface,#fff); border:1px solid #0796a8; border-radius:.45rem; color:var(--uhcp-text,#08738a); padding:.7rem 1rem; }
68
+ .uhcp-transfer-review { margin-top:.8rem; padding:1rem; }
69
+ .uhcp-transfer-review header p { background:var(--uhcp-surface-muted,#fff5dd); border:1px solid #f3ce79; border-radius:.4rem; color:var(--uhcp-text,#925800); font-size:.72rem; margin:0; padding:.5rem .7rem; }
70
+ .uhcp-transfer-review ol { list-style:none; margin:.7rem 0 0; padding:0; }
71
+ .uhcp-transfer-review li { align-items:center; border-top:1px solid #e1e8ee; display:grid; gap:.7rem; grid-template-columns:1.8rem 1fr auto; padding:.55rem; }
72
+ .uhcp-transfer-review li>span { align-items:center; background:var(--uhcp-surface-muted,#e8f6fc); border-radius:50%; color:var(--uhcp-text,#087db8); display:flex; font-size:.72rem; font-weight:900; height:1.7rem; justify-content:center; width:1.7rem; }
73
+ .uhcp-transfer-review li strong { font-size:.8rem; }
74
+ .uhcp-transfer-review details { font-size:.68rem; }
75
+ .uhcp-transfer-review summary { color:var(--uhcp-text,#60738c); cursor:pointer; }
76
+ .uhcp-transfer-status { background:var(--uhcp-surface-muted,#dff6e8); border-radius:.45rem; color:var(--uhcp-text,#087a47); font-weight:750; padding:.75rem; }
77
+ @media(max-width:900px){.uhcp-transfer-console{grid-template-columns:1fr}.uhcp-transfer-contacts{border-bottom:1px solid #dce5ec;border-inline-end:0}.uhcp-transfer-contact-actions{grid-template-columns:repeat(3,1fr)}.uhcp-transfer-patient>div{grid-template-columns:1fr}.uhcp-transfer-patient>div>span{display:none}.uhcp-transfer-review>header{align-items:flex-start;gap:.7rem;flex-direction:column}}
78
+ @media(max-width:560px){.uhcp-transfer-main{padding:.55rem}.uhcp-transfer-contact-actions{grid-template-columns:1fr}.uhcp-transfer-rail{align-items:stretch}.uhcp-transfer-review li{grid-template-columns:1.8rem 1fr}.uhcp-transfer-review li details{grid-column:2}.uhcp-transfer-controls button{flex:1}.uhcp-transfer-review header p{font-size:.65rem}}
79
+
80
+ .sos-encounter-journey { min-width:0; color:var(--uhcp-text,inherit); border:1px solid var(--uhcp-border,#dce5ec); border-radius:1rem; padding:clamp(.75rem,2vw,1.5rem); }
81
+ .sos-encounter-journey>header,.sos-encounter-journey>form,.sos-encounter-actions { display:flex; align-items:center; flex-wrap:wrap; gap:.75rem; margin-bottom:1rem; }
82
+ .sos-encounter-journey>header { justify-content:space-between; }
83
+ .sos-encounter-journey h2 { margin:0; font-size:1.25rem; }
84
+ .sos-encounter-journey label { display:grid; gap:.35rem; min-width:0; }
85
+ .sos-encounter-journey select { max-width:100%; color:inherit; background:var(--uhcp-surface,#fff); border:1px solid var(--uhcp-border,#dce5ec); border-radius:.4rem; padding:.5rem; }
86
+ .sos-encounter-journey button { cursor:pointer; border:1px solid var(--uhcp-border,#9bbfd1); border-radius:.5rem; padding:.55rem .8rem; color:inherit; background:var(--uhcp-surface-muted,#eef6fa); }
87
+ .sos-encounter-journey button:disabled { opacity:.5; cursor:not-allowed; }
88
+ .sos-encounter-journey button:focus-visible,.sos-encounter-journey select:focus-visible { outline:3px solid #1388c9; outline-offset:2px; }
89
+ .sos-encounter-journey time,.sos-encounter-journey code { overflow-wrap:anywhere; }
90
+ .sos-encounter-journey [role=alert] { color:var(--uhcp-danger,#b42318); }
91
+ .sos-encounter-journey [role=status] { color:var(--uhcp-success,#087a47); }
package/dist/index.d.ts CHANGED
@@ -5,4 +5,6 @@ export * from './LiveKitRealtimeCallClient.js';
5
5
  export * from './EmergencyContactCardDirectory.js';
6
6
  export * from './PushNotificationRegistration.js';
7
7
  export * from './useRealtimeCallSessionLifecycle.js';
8
+ export * from './EncounterTransferConsole.js';
9
+ export * from './EncounterJourneyPanel.js';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA"}
package/dist/index.js CHANGED
@@ -5,4 +5,6 @@ export * from './LiveKitRealtimeCallClient.js';
5
5
  export * from './EmergencyContactCardDirectory.js';
6
6
  export * from './PushNotificationRegistration.js';
7
7
  export * from './useRealtimeCallSessionLifecycle.js';
8
+ export * from './EncounterTransferConsole.js';
9
+ export * from './EncounterJourneyPanel.js';
8
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,kCAAkC,CAAA;AAChD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,mCAAmC,CAAA;AACjD,cAAc,sCAAsC,CAAA;AACpD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,4BAA4B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sos-portal-components-react",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Shared portal UI for base components",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -22,7 +22,16 @@
22
22
  "./subject-conversation-chat": {
23
23
  "types": "./dist/SubjectConversationChat.d.ts",
24
24
  "default": "./dist/SubjectConversationChat.js"
25
- }
25
+ },
26
+ "./encounter-journey": {
27
+ "types": "./dist/EncounterJourneyPanel.d.ts",
28
+ "default": "./dist/EncounterJourneyPanel.js"
29
+ },
30
+ "./encounter-transfer-console": {
31
+ "types": "./dist/EncounterTransferConsole.d.ts",
32
+ "default": "./dist/EncounterTransferConsole.js"
33
+ },
34
+ "./encounter-journey.css": "./dist/encounter-journey.css"
26
35
  },
27
36
  "files": [
28
37
  "dist",
@@ -31,7 +40,7 @@
31
40
  ],
32
41
  "scripts": {
33
42
  "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
34
- "build": "npm run clean && tsc -p tsconfig.build.json",
43
+ "build": "npm run clean && tsc -p tsconfig.build.json && node -e \"require('node:fs').copyFileSync('src/encounter-journey.css','dist/encounter-journey.css')\"",
35
44
  "typecheck": "tsc -p tsconfig.json --noEmit",
36
45
  "test": "vitest run --maxWorkers=1",
37
46
  "check": "npm run typecheck && npm test && npm run build",
@@ -76,7 +85,8 @@
76
85
  },
77
86
  "dependencies": {
78
87
  "antifraud-portal-components-react": "0.3.0",
79
- "sos-data-utils-ts": "0.6.30"
88
+ "fhir-data-utils-ts": "0.6.24",
89
+ "sos-data-utils-ts": "0.6.33"
80
90
  },
81
91
  "devDependencies": {
82
92
  "@testing-library/react": "^16.3.2",