uhc-portal-components-react 0.1.19 → 0.1.21
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 +15 -0
- package/README.md +6 -0
- package/dist/ClinicalArtifactEditor.d.ts +64 -0
- package/dist/ClinicalArtifactEditor.d.ts.map +1 -0
- package/dist/ClinicalArtifactEditor.js +157 -0
- package/dist/SoschainWorkspace.d.ts +3 -1
- package/dist/SoschainWorkspace.d.ts.map +1 -1
- package/dist/SoschainWorkspace.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/styles.css +16 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.21
|
|
4
|
+
|
|
5
|
+
- Allow a host with a server-resolved clinical write capability to present the shared SOSChain health workspace as editable instead of showing a contradictory read-only badge.
|
|
6
|
+
|
|
7
|
+
## 0.1.20
|
|
8
|
+
|
|
9
|
+
- Add one brand-neutral, schema-driven clinical artifact editor for UHC,
|
|
10
|
+
Vet/Pet and SOSChain Personal and Professional portals.
|
|
11
|
+
- Keep human-entered clinical text when a terminology candidate is explicitly
|
|
12
|
+
selected, and place its code and display in the schema-owned companion
|
|
13
|
+
claims without silently coding free text.
|
|
14
|
+
- Require host-owned provider persistence to return a fresh Bundle before the
|
|
15
|
+
editor publishes a successful readback. The shared component owns no auth,
|
|
16
|
+
provider URL, write capability or human-versus-animal policy.
|
|
17
|
+
|
|
3
18
|
## 0.1.19
|
|
4
19
|
|
|
5
20
|
- Add an accessible Encounter transfer console with patient lookup, a
|
package/README.md
CHANGED
|
@@ -53,6 +53,12 @@ The package deliberately exposes modules instead of a cloned application:
|
|
|
53
53
|
- `IpsBundleSummary`: receives one in-memory IPS document Bundle, obtains all
|
|
54
54
|
`Composition.section` entries through Common Utils and renders every
|
|
55
55
|
section's cards. It performs no ingestion or GW call.
|
|
56
|
+
- `ClinicalArtifactEditor`: renders the same schema-driven clinical form for
|
|
57
|
+
human and animal subjects. The host supplies its UHC/Vet schema,
|
|
58
|
+
terminology-search adapter and authorized persistence callback. Selecting a
|
|
59
|
+
terminology candidate preserves source text and adds only the confirmed
|
|
60
|
+
`system|code` and display. Success requires a fresh provider readback Bundle;
|
|
61
|
+
local form state is never presented as a persisted write.
|
|
56
62
|
- `InvitationAcceptancePanel`: controlled invitation-code UI for a related
|
|
57
63
|
individual member; the host refreshes the authorized-subject list after its
|
|
58
64
|
BFF accepts the invitation.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ClinicalResourceBundleLike } from 'gdc-common-utils-ts/utils/clinical-resource-view';
|
|
2
|
+
export type ClinicalArtifactSchema = Readonly<{
|
|
3
|
+
resourceType: string;
|
|
4
|
+
requiredClaims: readonly string[];
|
|
5
|
+
optionalClaims: readonly string[];
|
|
6
|
+
}>;
|
|
7
|
+
export type ClinicalArtifactEditorRequest = Readonly<{
|
|
8
|
+
resourceType: string;
|
|
9
|
+
sectionCode: string;
|
|
10
|
+
mode: 'create' | 'update';
|
|
11
|
+
artifactId?: string;
|
|
12
|
+
initialClaims?: Readonly<Record<string, unknown>>;
|
|
13
|
+
}>;
|
|
14
|
+
export type ClinicalArtifactDraft = Readonly<{
|
|
15
|
+
resourceType: string;
|
|
16
|
+
id: string;
|
|
17
|
+
sectionCode: string;
|
|
18
|
+
mode: 'create' | 'update';
|
|
19
|
+
claims: Readonly<Record<string, string>>;
|
|
20
|
+
}>;
|
|
21
|
+
export type ClinicalTerminologyCandidate = Readonly<{
|
|
22
|
+
system: string;
|
|
23
|
+
code: string;
|
|
24
|
+
display: string;
|
|
25
|
+
text?: string;
|
|
26
|
+
}>;
|
|
27
|
+
export type ClinicalTerminologySearch = Readonly<{
|
|
28
|
+
resourceType: string;
|
|
29
|
+
claim: string;
|
|
30
|
+
language: string;
|
|
31
|
+
text: string;
|
|
32
|
+
taxonomyId?: string;
|
|
33
|
+
limit: number;
|
|
34
|
+
}>;
|
|
35
|
+
export type ClinicalArtifactEditorCopy = Readonly<{
|
|
36
|
+
title: string;
|
|
37
|
+
description: string;
|
|
38
|
+
save: string;
|
|
39
|
+
saving: string;
|
|
40
|
+
cancel: string;
|
|
41
|
+
close: string;
|
|
42
|
+
terminologyLoading: string;
|
|
43
|
+
terminologyUnavailable: string;
|
|
44
|
+
readbackMissing: string;
|
|
45
|
+
}>;
|
|
46
|
+
export type ClinicalArtifactEditorProps = Readonly<{
|
|
47
|
+
request: ClinicalArtifactEditorRequest;
|
|
48
|
+
schema: ClinicalArtifactSchema;
|
|
49
|
+
copy: ClinicalArtifactEditorCopy;
|
|
50
|
+
locale?: string;
|
|
51
|
+
taxonomyId?: string;
|
|
52
|
+
fieldLabel: (claim: string) => string;
|
|
53
|
+
searchTerminology?: (input: ClinicalTerminologySearch) => Promise<readonly ClinicalTerminologyCandidate[]>;
|
|
54
|
+
saveArtifact: (draft: ClinicalArtifactDraft) => Promise<ClinicalResourceBundleLike | undefined>;
|
|
55
|
+
onCancel: () => void;
|
|
56
|
+
onReadback: (bundle: ClinicalResourceBundleLike) => void;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Shared human/animal clinical editor. The host owns authorization, transport,
|
|
60
|
+
* persistence and terminology service access. A successful form submission is
|
|
61
|
+
* published only after the host returns a fresh provider readback Bundle.
|
|
62
|
+
*/
|
|
63
|
+
export declare function ClinicalArtifactEditor({ request, schema, copy, locale, taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }: ClinicalArtifactEditorProps): import("react").JSX.Element;
|
|
64
|
+
//# sourceMappingURL=ClinicalArtifactEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClinicalArtifactEditor.d.ts","sourceRoot":"","sources":["../src/ClinicalArtifactEditor.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;AAElG,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC,CAAC,CAAA;AAEF,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC;IACnD,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAClD,CAAC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAA;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACzC,CAAC,CAAA;AAEF,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAC,CAAA;AAEF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd,CAAC,CAAA;AAEF,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,EAAE,MAAM,CAAA;IAC1B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;CACxB,CAAC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,OAAO,EAAE,6BAA6B,CAAA;IACtC,MAAM,EAAE,sBAAsB,CAAA;IAC9B,IAAI,EAAE,0BAA0B,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IACrC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,SAAS,4BAA4B,EAAE,CAAC,CAAA;IAC1G,YAAY,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAA;IAC/F,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAA;CACzD,CAAC,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,MAAM,EACN,IAAI,EACJ,MAAa,EACb,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,UAAU,GACX,EAAE,2BAA2B,+BA2G7B"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useId, useMemo, useState } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Shared human/animal clinical editor. The host owns authorization, transport,
|
|
6
|
+
* persistence and terminology service access. A successful form submission is
|
|
7
|
+
* published only after the host returns a fresh provider readback Bundle.
|
|
8
|
+
*/
|
|
9
|
+
export function ClinicalArtifactEditor({ request, schema, copy, locale = 'en', taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }) {
|
|
10
|
+
const titleId = useId();
|
|
11
|
+
const descriptionId = useId();
|
|
12
|
+
const acceptedClaims = useMemo(() => [...schema.requiredClaims, ...schema.optionalClaims], [schema.optionalClaims, schema.requiredClaims]);
|
|
13
|
+
const fields = useMemo(() => acceptedClaims
|
|
14
|
+
.filter((claim) => !claim.endsWith('.section') && !claim.endsWith('.user-selected'))
|
|
15
|
+
.filter((claim) => !isHiddenCodingCompanion(request.resourceType, claim, acceptedClaims)), [acceptedClaims, request.resourceType]);
|
|
16
|
+
const requiredClaims = useMemo(() => new Set(schema.requiredClaims), [schema.requiredClaims]);
|
|
17
|
+
const [claims, setClaims] = useState(() => ({
|
|
18
|
+
...defaultClaims(request.resourceType),
|
|
19
|
+
...Object.fromEntries(Object.entries(request.initialClaims ?? {}).map(([claim, value]) => [claim, String(value ?? '')])),
|
|
20
|
+
}));
|
|
21
|
+
const [activeTerminologyClaim, setActiveTerminologyClaim] = useState();
|
|
22
|
+
const [candidates, setCandidates] = useState([]);
|
|
23
|
+
const [terminologyBusy, setTerminologyBusy] = useState(false);
|
|
24
|
+
const [terminologyError, setTerminologyError] = useState(false);
|
|
25
|
+
const [saving, setSaving] = useState(false);
|
|
26
|
+
const [error, setError] = useState('');
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!activeTerminologyClaim || !searchTerminology)
|
|
29
|
+
return;
|
|
30
|
+
const sourceText = claims[activeTerminologyClaim]?.trim() ?? '';
|
|
31
|
+
if (sourceText.length < 2) {
|
|
32
|
+
setCandidates([]);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const codeClaim = terminologyCodeClaim(request.resourceType, activeTerminologyClaim);
|
|
36
|
+
let current = true;
|
|
37
|
+
setTerminologyBusy(true);
|
|
38
|
+
setTerminologyError(false);
|
|
39
|
+
const timer = window.setTimeout(() => {
|
|
40
|
+
void searchTerminology({
|
|
41
|
+
resourceType: request.resourceType,
|
|
42
|
+
claim: codeClaim,
|
|
43
|
+
language: locale,
|
|
44
|
+
text: sourceText,
|
|
45
|
+
taxonomyId,
|
|
46
|
+
limit: 20,
|
|
47
|
+
}).then((nextCandidates) => {
|
|
48
|
+
if (current)
|
|
49
|
+
setCandidates(nextCandidates);
|
|
50
|
+
}).catch(() => {
|
|
51
|
+
if (current) {
|
|
52
|
+
setCandidates([]);
|
|
53
|
+
setTerminologyError(true);
|
|
54
|
+
}
|
|
55
|
+
}).finally(() => {
|
|
56
|
+
if (current)
|
|
57
|
+
setTerminologyBusy(false);
|
|
58
|
+
});
|
|
59
|
+
}, 250);
|
|
60
|
+
return () => { current = false; window.clearTimeout(timer); };
|
|
61
|
+
}, [activeTerminologyClaim, claims, locale, request.resourceType, searchTerminology, taxonomyId]);
|
|
62
|
+
async function submit() {
|
|
63
|
+
setSaving(true);
|
|
64
|
+
setError('');
|
|
65
|
+
try {
|
|
66
|
+
const readback = await saveArtifact({
|
|
67
|
+
resourceType: request.resourceType,
|
|
68
|
+
id: request.artifactId ?? crypto.randomUUID(),
|
|
69
|
+
sectionCode: request.sectionCode,
|
|
70
|
+
mode: request.mode,
|
|
71
|
+
claims,
|
|
72
|
+
});
|
|
73
|
+
if (!readback)
|
|
74
|
+
throw new Error(copy.readbackMissing);
|
|
75
|
+
onReadback(readback);
|
|
76
|
+
}
|
|
77
|
+
catch (reason) {
|
|
78
|
+
setError(reason instanceof Error ? reason.message : String(reason));
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
setSaving(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return _jsxs("section", { className: "uhcp-clinical-editor", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, "aria-describedby": descriptionId, children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { id: titleId, children: copy.title }), _jsx("p", { id: descriptionId, children: copy.description })] }), _jsx("button", { type: "button", onClick: onCancel, "aria-label": copy.close, children: "\u00D7" })] }), _jsxs("form", { onSubmit: (event) => { event.preventDefault(); void submit(); }, children: [fields.map((claim) => {
|
|
85
|
+
const parameter = claim.slice(request.resourceType.length + 1);
|
|
86
|
+
const label = fieldLabel(claim);
|
|
87
|
+
const terminologyEnabled = Boolean(searchTerminology && terminologyCodeClaim(request.resourceType, claim));
|
|
88
|
+
const inputId = `${titleId}-${claim}`;
|
|
89
|
+
const value = claims[claim] ?? '';
|
|
90
|
+
const update = (event) => {
|
|
91
|
+
setClaims((current) => ({ ...current, [claim]: event.target.value }));
|
|
92
|
+
if (terminologyEnabled)
|
|
93
|
+
setActiveTerminologyClaim(claim);
|
|
94
|
+
};
|
|
95
|
+
return _jsxs("label", { className: isMultiline(parameter) ? 'uhcp-clinical-editor-wide' : undefined, htmlFor: inputId, children: [_jsxs("span", { children: [label, requiredClaims.has(claim) ? ' *' : ''] }), statusOptions(request.resourceType, parameter) ? _jsx("select", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), onChange: update, children: statusOptions(request.resourceType, parameter).map((option) => _jsx("option", { value: option, children: humanize(option) }, option)) }) : isMultiline(parameter) ? _jsx("textarea", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), rows: 3, onChange: update })
|
|
96
|
+
: _jsx("input", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), type: fieldInputType(parameter), onChange: update }), terminologyEnabled && activeTerminologyClaim === claim ? _jsxs("div", { className: "uhcp-terminology-results", children: [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: () => {
|
|
97
|
+
setClaims((current) => selectedCodingClaims(request.resourceType, claim, candidate, acceptedClaims, current));
|
|
98
|
+
setCandidates([]);
|
|
99
|
+
setActiveTerminologyClaim(undefined);
|
|
100
|
+
}, children: [candidate.display, _jsxs("small", { children: [candidate.system, " \u00B7 ", candidate.code] })] }) }, `${candidate.system}|${candidate.code}`)) }) : null] }) : null] }, claim);
|
|
101
|
+
}), error ? _jsx("p", { className: "uhcp-clinical-editor-error", role: "alert", children: error }) : null, _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: onCancel, children: copy.cancel }), _jsx("button", { type: "submit", disabled: saving, children: saving ? copy.saving : copy.save })] })] })] });
|
|
102
|
+
}
|
|
103
|
+
function defaultClaims(resourceType) {
|
|
104
|
+
if (resourceType === 'Immunization')
|
|
105
|
+
return { 'Immunization.status': 'completed' };
|
|
106
|
+
if (resourceType === 'Observation' || resourceType === 'DiagnosticReport' || resourceType === 'Procedure')
|
|
107
|
+
return { [`${resourceType}.status`]: 'final' };
|
|
108
|
+
if (resourceType === 'Condition' || resourceType === 'AllergyIntolerance')
|
|
109
|
+
return { [`${resourceType}.clinical-status`]: 'active' };
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
function statusOptions(resourceType, parameter) {
|
|
113
|
+
if (parameter !== 'status' && !parameter.endsWith('-status'))
|
|
114
|
+
return undefined;
|
|
115
|
+
if (resourceType === 'Immunization')
|
|
116
|
+
return ['completed', 'not-done', 'entered-in-error'];
|
|
117
|
+
if (resourceType === 'Observation' || resourceType === 'DiagnosticReport')
|
|
118
|
+
return ['final', 'preliminary', 'amended', 'entered-in-error'];
|
|
119
|
+
return ['active', 'completed', 'inactive', 'entered-in-error'];
|
|
120
|
+
}
|
|
121
|
+
function terminologyCodeClaim(resourceType, inputClaim) {
|
|
122
|
+
const parameter = inputClaim.slice(resourceType.length + 1);
|
|
123
|
+
if (parameter.endsWith('-code-text'))
|
|
124
|
+
return `${resourceType}.${parameter.slice(0, -5)}`;
|
|
125
|
+
if (resourceType === 'MedicationStatement' && parameter === 'medication-text')
|
|
126
|
+
return 'MedicationStatement.code';
|
|
127
|
+
if (parameter === 'target-disease' || parameter.endsWith('-code') || parameter === 'code')
|
|
128
|
+
return inputClaim;
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
function isHiddenCodingCompanion(resourceType, claim, acceptedClaims) {
|
|
132
|
+
if (claim.endsWith('-display') && acceptedClaims.includes(`${claim.slice(0, -8)}-text`))
|
|
133
|
+
return true;
|
|
134
|
+
if (acceptedClaims.includes(`${claim}-text`))
|
|
135
|
+
return true;
|
|
136
|
+
return resourceType === 'MedicationStatement' && claim === 'MedicationStatement.code'
|
|
137
|
+
&& acceptedClaims.includes('MedicationStatement.medication-text');
|
|
138
|
+
}
|
|
139
|
+
function selectedCodingClaims(resourceType, inputClaim, candidate, acceptedClaims, current) {
|
|
140
|
+
const codeClaim = terminologyCodeClaim(resourceType, inputClaim);
|
|
141
|
+
const next = { ...current, [inputClaim]: current[inputClaim] || candidate.text || candidate.display };
|
|
142
|
+
if (acceptedClaims.includes(codeClaim))
|
|
143
|
+
next[codeClaim] = `${candidate.system}|${candidate.code}`;
|
|
144
|
+
const displayClaim = `${codeClaim}-display`;
|
|
145
|
+
if (acceptedClaims.includes(displayClaim))
|
|
146
|
+
next[displayClaim] = candidate.display;
|
|
147
|
+
return next;
|
|
148
|
+
}
|
|
149
|
+
function isMultiline(parameter) { return /note|description|summary|instruction|outcome|reference-range-text/.test(parameter); }
|
|
150
|
+
function humanize(value) { return value ? value[0].toUpperCase() + value.slice(1).replaceAll('_', ' ') : value; }
|
|
151
|
+
function fieldInputType(parameter) {
|
|
152
|
+
if (/(?:^|-)number$|frequency$|dose-sequence$/.test(parameter))
|
|
153
|
+
return 'number';
|
|
154
|
+
if (parameter === 'date' || parameter.endsWith('-date') || parameter.endsWith('-datetime'))
|
|
155
|
+
return 'date';
|
|
156
|
+
return 'text';
|
|
157
|
+
}
|
|
@@ -84,6 +84,8 @@ export type SoschainWorkspaceProps = Readonly<{
|
|
|
84
84
|
communications: readonly SoschainCommunicationSummary[];
|
|
85
85
|
/** Host-authorized IPS/clinical projection, normally `IpsBundleSummary`. */
|
|
86
86
|
healthSummary?: ReactNode;
|
|
87
|
+
/** False only when the host has already resolved a current write capability. */
|
|
88
|
+
clinicalReadOnly?: boolean;
|
|
87
89
|
careJourney?: readonly SoschainCareJourneyEntry[];
|
|
88
90
|
emergencyData?: readonly ProtectedIndexEmergencyItem[];
|
|
89
91
|
canManageAssociations: boolean;
|
|
@@ -98,5 +100,5 @@ export type SoschainWorkspaceProps = Readonly<{
|
|
|
98
100
|
* communications. This presentational component never derives authority from
|
|
99
101
|
* a selected role, card, tab or browser-controlled value.
|
|
100
102
|
*/
|
|
101
|
-
export declare function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, healthSummary, careJourney, emergencyData, canManageAssociations, addPlaceHref, addProductHref, importCardHref, }: SoschainWorkspaceProps): import("react").JSX.Element;
|
|
103
|
+
export declare function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, healthSummary, clinicalReadOnly, careJourney, emergencyData, canManageAssociations, addPlaceHref, addProductHref, importCardHref, }: SoschainWorkspaceProps): import("react").JSX.Element;
|
|
102
104
|
//# sourceMappingURL=SoschainWorkspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoschainWorkspace.d.ts","sourceRoot":"","sources":["../src/SoschainWorkspace.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SoschainWorkspace.d.ts","sourceRoot":"","sources":["../src/SoschainWorkspace.tsx"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ function AssociationList({ items, empty }) {
|
|
|
21
21
|
* communications. This presentational component never derives authority from
|
|
22
22
|
* a selected role, card, tab or browser-controlled value.
|
|
23
23
|
*/
|
|
24
|
-
export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, healthSummary, careJourney = [], emergencyData = [], canManageAssociations, addPlaceHref, addProductHref, importCardHref, }) {
|
|
24
|
+
export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, healthSummary, clinicalReadOnly = true, careJourney = [], emergencyData = [], canManageAssociations, addPlaceHref, addProductHref, importCardHref, }) {
|
|
25
25
|
if (!selectedCard) {
|
|
26
26
|
return (_jsxs("section", { className: "uhcp-sos-wrap", "aria-labelledby": "sos-card-picker-title", children: [_jsxs("header", { className: "uhcp-sos-heading", children: [_jsx("span", { children: copy.workspaceEyebrow }), _jsx("h1", { id: "sos-card-picker-title", children: copy.cardsTitle }), _jsx("p", { children: copy.cardsDescription }), importCardHref && copy.importCard ? _jsxs("a", { href: importCardHref, children: [copy.importCard, " \u2192"] }) : null] }), cards.length === 0 ? (_jsxs("div", { className: "uhcp-sos-empty-panel", children: [_jsx("h2", { children: copy.noCardTitle }), _jsx("p", { children: copy.noCardBody })] })) : (_jsx("ul", { className: "uhcp-sos-card-grid", children: cards.map((card) => (_jsx("li", { children: _jsxs("a", { href: card.openHref, children: [_jsx("span", { children: card.kindLabel }), _jsx("strong", { children: card.displayName }), _jsx("small", { children: card.identifier }), _jsxs("b", { children: [copy.openCard, " \u2192"] })] }) }, card.identifier))) }))] }));
|
|
27
27
|
}
|
|
@@ -51,6 +51,6 @@ export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaH
|
|
|
51
51
|
: activeArea === 'emergency-data'
|
|
52
52
|
? copy.emergencyDataBody
|
|
53
53
|
: copy.overviewBody;
|
|
54
|
-
const clinicalAreaIsReadOnly = activeArea === '
|
|
54
|
+
const clinicalAreaIsReadOnly = activeArea === 'care-journey' || (activeArea === 'health-summary' && clinicalReadOnly);
|
|
55
55
|
return (_jsxs("section", { className: "uhcp-sos-wrap", children: [_jsxs("header", { className: "uhcp-sos-heading", children: [_jsx("span", { children: copy.selectedCard }), _jsx("h1", { children: selectedCard.displayName }), _jsxs("p", { children: [selectedCard.kindLabel, " \u00B7 ", selectedCard.identifier] })] }), _jsx("nav", { className: "uhcp-sos-tabs", "aria-label": copy.workspaceEyebrow, children: SOSCHAIN_SUBJECT_WORKSPACE_AREAS.map((area) => (_jsx("a", { href: areaHrefs[area], "aria-current": activeArea === area ? 'page' : undefined, children: copy.areas[area] }, area))) }), _jsxs("div", { className: "uhcp-sos-panel", children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { children: title }), _jsx("p", { children: body })] }), (clinicalAreaIsReadOnly || (!canManageAssociations && activeArea !== 'communications' && activeArea !== 'emergency-data')) && (_jsx("span", { className: "uhcp-sos-readonly", children: copy.readOnly })), canManageAssociations && activeArea === 'places' && addPlaceHref && _jsx("a", { href: addPlaceHref, children: copy.addPlace }), canManageAssociations && activeArea === 'products' && addProductHref && _jsx("a", { href: addProductHref, children: copy.addProduct })] }), activeArea === 'overview' && (_jsxs("div", { className: "uhcp-sos-overview-grid", children: [_jsxs("article", { children: [_jsx("strong", { children: places.length }), _jsx("span", { children: copy.areas.places })] }), _jsxs("article", { children: [_jsx("strong", { children: products.length }), _jsx("span", { children: copy.areas.products })] }), _jsxs("article", { children: [_jsx("strong", { children: communications.length }), _jsx("span", { children: copy.areas.communications })] }), _jsxs("article", { children: [_jsx("strong", { children: careJourney.length }), _jsx("span", { children: copy.areas['care-journey'] })] })] })), activeArea === 'health-summary' && (healthSummary ?? _jsx("p", { className: "uhcp-sos-empty", children: copy.emptyHealthSummary })), activeArea === 'care-journey' && (careJourney.length === 0 ? _jsx("p", { className: "uhcp-sos-empty", children: copy.emptyCareJourney }) : (_jsx("ol", { className: "uhcp-sos-timeline uhcp-sos-care-journey", children: careJourney.map((encounter) => (_jsxs("li", { children: [_jsxs("div", { children: [_jsx("span", { children: encounter.statusLabel }), _jsx("time", { dateTime: encounter.periodStart, children: encounter.periodStart })] }), _jsx("strong", { children: encounter.serviceLabel }), encounter.detail ? _jsx("p", { children: encounter.detail }) : null, encounter.locationLabel || encounter.periodEnd ? _jsx("small", { children: [encounter.locationLabel, encounter.periodEnd].filter(Boolean).join(' · ') }) : null] }, encounter.identifier))) }))), activeArea === 'emergency-data' && _jsx(ProtectedIndexEmergencyData, { copy: copy.emergencyData, items: emergencyData }), activeArea === 'places' && _jsx(AssociationList, { items: places, empty: copy.emptyPlaces }), activeArea === 'products' && _jsx(AssociationList, { items: products, empty: copy.emptyProducts }), activeArea === 'communications' && (communications.length === 0 ? _jsx("p", { className: "uhcp-sos-empty", children: copy.emptyCommunications }) : (_jsx("ol", { className: "uhcp-sos-timeline", children: communications.map((message) => (_jsxs("li", { children: [_jsxs("div", { children: [_jsx("span", { children: message.categoryLabel }), _jsx("time", { children: message.occurredAt })] }), _jsx("strong", { children: message.subject }), _jsx("p", { children: message.body }), _jsxs("small", { children: [message.sender, message.placeLabel ? ` · ${message.placeLabel}` : ''] })] }, message.identifier))) })))] })] }));
|
|
56
56
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from './ProfileProtectionGate.js';
|
|
|
8
8
|
export * from './PortalLoadingSkeleton.js';
|
|
9
9
|
export * from './ClinicalSectionSummary.js';
|
|
10
10
|
export * from './IpsBundleSummary.js';
|
|
11
|
+
export * from './ClinicalArtifactEditor.js';
|
|
11
12
|
export * from './InvitationAcceptancePanel.js';
|
|
12
13
|
export * from './SubjectAccessRequestPanel.js';
|
|
13
14
|
export * from './SoschainWorkspace.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,sCAAsC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ export * from './ProfileProtectionGate.js';
|
|
|
8
8
|
export * from './PortalLoadingSkeleton.js';
|
|
9
9
|
export * from './ClinicalSectionSummary.js';
|
|
10
10
|
export * from './IpsBundleSummary.js';
|
|
11
|
+
export * from './ClinicalArtifactEditor.js';
|
|
11
12
|
export * from './InvitationAcceptancePanel.js';
|
|
12
13
|
export * from './SubjectAccessRequestPanel.js';
|
|
13
14
|
export * from './SoschainWorkspace.js';
|
package/dist/styles.css
CHANGED
|
@@ -171,6 +171,22 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
|
|
|
171
171
|
color: var(--uhcp-text);
|
|
172
172
|
padding: 1.25rem;
|
|
173
173
|
}
|
|
174
|
+
.uhcp-clinical-editor { background:var(--uhcp-panel); border:1px solid var(--uhcp-border); border-radius:1.5rem; box-shadow:0 20px 60px rgb(15 23 42 / 22%); color:var(--uhcp-text); inset:50% auto auto 50%; max-height:calc(100dvh - 2rem); max-width:48rem; overflow:auto; padding:1.5rem; position:fixed; transform:translate(-50%,-50%); width:calc(100% - 2rem); z-index:60; }
|
|
175
|
+
.uhcp-clinical-editor>header { align-items:flex-start; display:flex; gap:1rem; justify-content:space-between; }
|
|
176
|
+
.uhcp-clinical-editor h2,.uhcp-clinical-editor p { margin:.2rem 0; }
|
|
177
|
+
.uhcp-clinical-editor>header>button { background:transparent; border:1px solid var(--uhcp-border); border-radius:50%; color:inherit; cursor:pointer; font-size:1.4rem; height:2.5rem; width:2.5rem; }
|
|
178
|
+
.uhcp-clinical-editor form { display:grid; gap:1rem; grid-template-columns:repeat(2,minmax(0,1fr)); margin-top:1.25rem; }
|
|
179
|
+
.uhcp-clinical-editor label { color:var(--uhcp-text); display:grid; font-weight:700; gap:.35rem; }
|
|
180
|
+
.uhcp-clinical-editor input,.uhcp-clinical-editor select,.uhcp-clinical-editor textarea { background:var(--uhcp-panel); border:1px solid var(--uhcp-border); border-radius:.7rem; color:inherit; font:inherit; padding:.75rem; }
|
|
181
|
+
.uhcp-clinical-editor-wide,.uhcp-clinical-editor-error,.uhcp-clinical-editor footer { grid-column:1/-1; }
|
|
182
|
+
.uhcp-clinical-editor footer { display:flex; gap:.75rem; justify-content:flex-end; }
|
|
183
|
+
.uhcp-clinical-editor footer button,.uhcp-terminology-results button { border:1px solid var(--uhcp-border); border-radius:.7rem; cursor:pointer; font:inherit; padding:.7rem 1rem; }
|
|
184
|
+
.uhcp-clinical-editor footer button[type=submit] { background:linear-gradient(135deg,var(--uhcp-action-start),var(--uhcp-action-end)); color:#fff; font-weight:800; }
|
|
185
|
+
.uhcp-clinical-editor-error { color:#b42318; font-weight:700; }
|
|
186
|
+
.uhcp-terminology-results ul { display:grid; gap:.35rem; list-style:none; margin:.25rem 0 0; padding:0; }
|
|
187
|
+
.uhcp-terminology-results button { background:var(--uhcp-surface-muted); color:inherit; display:grid; text-align:start; width:100%; }
|
|
188
|
+
.uhcp-terminology-results small { color:var(--uhcp-muted); display:block; font-weight:400; }
|
|
189
|
+
@media (max-width:44rem) { .uhcp-clinical-editor form { grid-template-columns:1fr; } }
|
|
174
190
|
|
|
175
191
|
.uhcp-transfer-console { background:#fff; color:#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); }
|
|
176
192
|
.uhcp-transfer-console button,.uhcp-transfer-console input,.uhcp-transfer-console textarea { font:inherit; }
|
package/package.json
CHANGED