uhc-portal-components-react 0.1.30 → 0.1.32
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/dist/ClinicalArtifactEditor.d.ts +5 -1
- package/dist/ClinicalArtifactEditor.d.ts.map +1 -1
- package/dist/ClinicalArtifactEditor.js +43 -3
- package/dist/ConsentPermissionDirectory.d.ts +60 -0
- package/dist/ConsentPermissionDirectory.d.ts.map +1 -0
- package/dist/ConsentPermissionDirectory.js +52 -0
- 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 +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.32
|
|
4
|
+
|
|
5
|
+
- Present every JSON-Schema `date-time` and `fhir-date-time` clinical claim as
|
|
6
|
+
separate calendar-date and local-time controls, including accessible actions
|
|
7
|
+
for the current date and time, while preserving canonical FHIR instants.
|
|
8
|
+
- Keep optional status fields genuinely empty until selected so an
|
|
9
|
+
edit/delete/recreate round trip never invents clinical state.
|
|
10
|
+
- Consume the canonical clinical subject-reference fix from
|
|
11
|
+
`fhir-data-utils-ts@0.6.12`.
|
|
12
|
+
|
|
3
13
|
## 0.1.30
|
|
4
14
|
|
|
5
15
|
- Pin the corrected shared clinical reader so IPS cards prefer each resource's
|
|
@@ -147,6 +157,11 @@
|
|
|
147
157
|
|
|
148
158
|
## Unreleased
|
|
149
159
|
|
|
160
|
+
- Add a reusable, accessible Consent permission directory/editor for
|
|
161
|
+
provider-backed create, edit, suspend/reactivate and delete flows. The host
|
|
162
|
+
owns the schema-backed Bundle mutation and must return authoritative
|
|
163
|
+
readback; the component performs no optimistic authorization mutation.
|
|
164
|
+
|
|
150
165
|
- Add the repository-wide mandatory red-green-refactor contributor contract
|
|
151
166
|
and mark the existing component suites with an explicit TDD contract header.
|
|
152
167
|
- Correct the reuse contract: the package currently provides presentation
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ClinicalResourceBundleLike } from 'gdc-common-utils-ts/utils/clinical-resource-view';
|
|
2
2
|
import { type MultichannelOperationSchema, type MultichannelOperationValues } from 'sos-data-utils-ts/multichannel-operation-schemas';
|
|
3
|
+
import type { ClinicalDateTimeFieldLabels } from './ClinicalTimeline.js';
|
|
3
4
|
export type ClinicalArtifactSchema = Readonly<{
|
|
4
5
|
resourceType: string;
|
|
5
6
|
sectionCode?: string;
|
|
@@ -75,6 +76,7 @@ export type ClinicalArtifactEditorCopy = Readonly<{
|
|
|
75
76
|
readbackMissing: string;
|
|
76
77
|
pending?: string;
|
|
77
78
|
retry?: string;
|
|
79
|
+
dateTime?: ClinicalDateTimeFieldLabels;
|
|
78
80
|
}>;
|
|
79
81
|
export type ClinicalArtifactSaveOutcome = Readonly<{
|
|
80
82
|
state: 'confirmed';
|
|
@@ -95,6 +97,8 @@ export type ClinicalArtifactEditorProps = Readonly<{
|
|
|
95
97
|
authoringContext?: ClinicalArtifactAuthoringContext;
|
|
96
98
|
copy: ClinicalArtifactEditorCopy;
|
|
97
99
|
locale?: string;
|
|
100
|
+
/** IANA zone used to present and compose separate local date/time controls. */
|
|
101
|
+
timeZone?: string;
|
|
98
102
|
taxonomyId?: string;
|
|
99
103
|
fieldLabel: (claim: string) => string;
|
|
100
104
|
searchTerminology?: (input: ClinicalTerminologySearch) => Promise<readonly ClinicalTerminologyCandidate[]>;
|
|
@@ -107,5 +111,5 @@ export type ClinicalArtifactEditorProps = Readonly<{
|
|
|
107
111
|
* persistence and terminology service access. A successful form submission is
|
|
108
112
|
* published only after the host returns a fresh provider readback Bundle.
|
|
109
113
|
*/
|
|
110
|
-
export declare function ClinicalArtifactEditor({ request, schema, operationSchema, authoringContext, copy, locale, taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }: ClinicalArtifactEditorProps): import("react").JSX.Element;
|
|
114
|
+
export declare function ClinicalArtifactEditor({ request, schema, operationSchema, authoringContext, copy, locale, timeZone, taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }: ClinicalArtifactEditorProps): import("react").JSX.Element;
|
|
111
115
|
//# sourceMappingURL=ClinicalArtifactEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClinicalArtifactEditor.d.ts","sourceRoot":"","sources":["../src/ClinicalArtifactEditor.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAA;
|
|
1
|
+
{"version":3,"file":"ClinicalArtifactEditor.d.ts","sourceRoot":"","sources":["../src/ClinicalArtifactEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
4
|
-
import { clinicalArtifactEditorClaimsFromFhirR4, clinicalArtifactFhirR4ToFlat, } from 'fhir-data-utils-ts';
|
|
4
|
+
import { clinicalArtifactEditorClaimsFromFhirR4, clinicalArtifactFhirR4ToFlat, composeFhirDateTimeFromLocalParts, splitFhirDateTimeForInput, } from 'fhir-data-utils-ts';
|
|
5
5
|
import { buildMultichannelOperationBundle, MultichannelOperationMode, readMultichannelOperationFromBundle, selectMultichannelOperationClaimValues, } from 'sos-data-utils-ts/multichannel-operation-schemas';
|
|
6
6
|
/**
|
|
7
7
|
* Shared human/animal clinical editor. The host owns authorization, transport,
|
|
8
8
|
* persistence and terminology service access. A successful form submission is
|
|
9
9
|
* published only after the host returns a fresh provider readback Bundle.
|
|
10
10
|
*/
|
|
11
|
-
export function ClinicalArtifactEditor({ request, schema, operationSchema, authoringContext, copy, locale = 'en', taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }) {
|
|
11
|
+
export function ClinicalArtifactEditor({ request, schema, operationSchema, authoringContext, copy, locale = 'en', timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone, taxonomyId, fieldLabel, searchTerminology, saveArtifact, onCancel, onReadback, }) {
|
|
12
12
|
const titleId = useId();
|
|
13
13
|
const descriptionId = useId();
|
|
14
14
|
const acceptedClaims = useMemo(() => operationSchema
|
|
@@ -131,12 +131,15 @@ export function ClinicalArtifactEditor({ request, schema, operationSchema, autho
|
|
|
131
131
|
const terminologyEnabled = Boolean(searchTerminology && terminologyCodeClaim(request.resourceType, claim));
|
|
132
132
|
const inputId = `${titleId}-${claim}`;
|
|
133
133
|
const value = claims[claim] ?? '';
|
|
134
|
+
const schemaNode = operationSchema?.properties.claims?.properties?.[claim];
|
|
134
135
|
const update = (event) => {
|
|
135
136
|
setClaims((current) => ({ ...current, [claim]: event.target.value }));
|
|
136
137
|
if (terminologyEnabled)
|
|
137
138
|
setActiveTerminologyClaim(claim);
|
|
138
139
|
};
|
|
139
|
-
|
|
140
|
+
if (isDateTimeSchemaNode(schemaNode))
|
|
141
|
+
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);
|
|
142
|
+
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) ? _jsxs("select", { id: inputId, "aria-label": label, value: value, required: requiredClaims.has(claim), onChange: update, children: [!requiredClaims.has(claim) ? _jsx("option", { value: "" }) : null, 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 })
|
|
140
143
|
: _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: [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: () => {
|
|
141
144
|
setClaims((current) => selectedCodingClaims(request.resourceType, claim, candidate, acceptedClaims, current));
|
|
142
145
|
setCandidates([]);
|
|
@@ -144,6 +147,43 @@ export function ClinicalArtifactEditor({ request, schema, operationSchema, autho
|
|
|
144
147
|
}, children: [candidate.display, _jsxs("small", { children: [candidate.system, " \u00B7 ", candidate.code] })] }) }, `${candidate.system}|${candidate.code}`)) }) : null] }) : null] }, claim);
|
|
145
148
|
}), 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 })] })] })] });
|
|
146
149
|
}
|
|
150
|
+
const DEFAULT_DATE_TIME_LABELS = Object.freeze({
|
|
151
|
+
date: 'Date',
|
|
152
|
+
time: 'Time',
|
|
153
|
+
useToday: 'Use today',
|
|
154
|
+
useCurrentTime: 'Use current time',
|
|
155
|
+
});
|
|
156
|
+
function ClinicalDateTimeClaimField({ label, required, value, timeZone, labels, onChange }) {
|
|
157
|
+
const [parts, setParts] = useState(() => splitTemporalClaim(value, timeZone));
|
|
158
|
+
const current = splitFhirDateTimeForInput(new Date(), timeZone);
|
|
159
|
+
const update = (next) => {
|
|
160
|
+
setParts(next);
|
|
161
|
+
onChange(composeTemporalClaim(next, timeZone));
|
|
162
|
+
};
|
|
163
|
+
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" })] });
|
|
164
|
+
}
|
|
165
|
+
function splitTemporalClaim(value, timeZone) {
|
|
166
|
+
if (!value)
|
|
167
|
+
return { date: '', time: '' };
|
|
168
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
169
|
+
return { date: value, time: '' };
|
|
170
|
+
try {
|
|
171
|
+
return splitFhirDateTimeForInput(value, timeZone);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return { date: '', time: '' };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function composeTemporalClaim(parts, timeZone) {
|
|
178
|
+
if (!parts.date)
|
|
179
|
+
return '';
|
|
180
|
+
if (!parts.time)
|
|
181
|
+
return parts.date;
|
|
182
|
+
return composeFhirDateTimeFromLocalParts({ ...parts, timeZone });
|
|
183
|
+
}
|
|
184
|
+
function isDateTimeSchemaNode(schemaNode) {
|
|
185
|
+
return schemaNode?.format === 'date-time' || schemaNode?.format === 'fhir-date-time';
|
|
186
|
+
}
|
|
147
187
|
function isSaveOutcome(value) {
|
|
148
188
|
return typeof value === 'object' && value !== null && 'state' in value;
|
|
149
189
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ConsentDecision, type ConsentStatus } from 'gdc-common-utils-ts/models/consent-rule';
|
|
2
|
+
export type ConsentPermissionOption = Readonly<{
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}>;
|
|
6
|
+
export type ConsentPermissionContact = Readonly<{
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
}>;
|
|
10
|
+
export type ConsentPermissionRecord = Readonly<{
|
|
11
|
+
id: string;
|
|
12
|
+
contactReference: string;
|
|
13
|
+
contactName: string;
|
|
14
|
+
decision: ConsentDecision;
|
|
15
|
+
status: ConsentStatus;
|
|
16
|
+
purposes: readonly string[];
|
|
17
|
+
roles: readonly string[];
|
|
18
|
+
targets: readonly string[];
|
|
19
|
+
}>;
|
|
20
|
+
export type ConsentPermissionDraft = Readonly<Omit<ConsentPermissionRecord, 'id' | 'contactName'> & {
|
|
21
|
+
id?: string;
|
|
22
|
+
contactName?: string;
|
|
23
|
+
}>;
|
|
24
|
+
export type ConsentPermissionDirectoryCopy = Readonly<{
|
|
25
|
+
title: string;
|
|
26
|
+
empty: string;
|
|
27
|
+
add: string;
|
|
28
|
+
edit: string;
|
|
29
|
+
remove: string;
|
|
30
|
+
suspend: string;
|
|
31
|
+
activate: string;
|
|
32
|
+
save: string;
|
|
33
|
+
cancel: string;
|
|
34
|
+
contact: string;
|
|
35
|
+
decision: string;
|
|
36
|
+
permit: string;
|
|
37
|
+
deny: string;
|
|
38
|
+
status: string;
|
|
39
|
+
active: string;
|
|
40
|
+
inactive: string;
|
|
41
|
+
purposes: string;
|
|
42
|
+
roles: string;
|
|
43
|
+
targets: string;
|
|
44
|
+
saving: string;
|
|
45
|
+
loadError: string;
|
|
46
|
+
required: string;
|
|
47
|
+
}>;
|
|
48
|
+
export declare function ConsentPermissionDirectory({ records, contacts, purposeOptions, roleOptions, targetOptions, copy, editable, onSave, onStatusChange, onDelete }: Readonly<{
|
|
49
|
+
records: readonly ConsentPermissionRecord[];
|
|
50
|
+
contacts: readonly ConsentPermissionContact[];
|
|
51
|
+
purposeOptions: readonly ConsentPermissionOption[];
|
|
52
|
+
roleOptions: readonly ConsentPermissionOption[];
|
|
53
|
+
targetOptions: readonly ConsentPermissionOption[];
|
|
54
|
+
copy: ConsentPermissionDirectoryCopy;
|
|
55
|
+
editable?: boolean;
|
|
56
|
+
onSave?: (draft: ConsentPermissionDraft) => Promise<void> | void;
|
|
57
|
+
onStatusChange?: (id: string, status: ConsentStatus) => Promise<void> | void;
|
|
58
|
+
onDelete?: (id: string) => Promise<void> | void;
|
|
59
|
+
}>): import("react").JSX.Element;
|
|
60
|
+
//# sourceMappingURL=ConsentPermissionDirectory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsentPermissionDirectory.d.ts","sourceRoot":"","sources":["../src/ConsentPermissionDirectory.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { ConsentDecisions, ConsentStatuses } from 'gdc-common-utils-ts/models/consent-rule';
|
|
4
|
+
export function ConsentPermissionDirectory({ records, contacts, purposeOptions, roleOptions, targetOptions, copy, editable = false, onSave, onStatusChange, onDelete }) {
|
|
5
|
+
const [editing, setEditing] = useState(null);
|
|
6
|
+
const [saving, setSaving] = useState(false);
|
|
7
|
+
const [error, setError] = useState('');
|
|
8
|
+
const labels = useMemo(() => new Map([...purposeOptions, ...roleOptions, ...targetOptions].map(({ value, label }) => [value, label])), [purposeOptions, roleOptions, targetOptions]);
|
|
9
|
+
async function save() {
|
|
10
|
+
if (!editing || !editing.contactReference || !editing.purposes.length || !editing.roles.length || !editing.targets.length) {
|
|
11
|
+
setError(copy.required);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setSaving(true);
|
|
15
|
+
setError('');
|
|
16
|
+
try {
|
|
17
|
+
await onSave?.(editing);
|
|
18
|
+
setEditing(null);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
setError(copy.loadError);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setSaving(false);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function changeStatus(record) {
|
|
28
|
+
setError('');
|
|
29
|
+
try {
|
|
30
|
+
await onStatusChange?.(record.id, record.status === ConsentStatuses.Active ? ConsentStatuses.Inactive : ConsentStatuses.Active);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
setError(copy.loadError);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function remove(record) {
|
|
37
|
+
setError('');
|
|
38
|
+
try {
|
|
39
|
+
await onDelete?.(record.id);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
setError(copy.loadError);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return _jsxs("section", { className: "uhcp-consent-directory", "aria-labelledby": "uhcp-consent-directory-title", children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { id: "uhcp-consent-directory-title", children: copy.title }), _jsx("p", { children: records.length ? `${records.length}` : copy.empty })] }), editable ? _jsx("button", { type: "button", onClick: () => setEditing(emptyDraft()), children: copy.add }) : null] }), error ? _jsx("p", { role: "alert", children: error }) : null, _jsx("div", { className: "uhcp-consent-list", children: records.map((record) => _jsxs("article", { children: [_jsxs("div", { children: [_jsx("strong", { children: record.contactName }), _jsx("span", { children: record.decision === ConsentDecisions.Permit ? copy.permit : copy.deny }), _jsx("span", { children: record.status === ConsentStatuses.Active ? copy.active : copy.inactive })] }), _jsx("p", { children: record.purposes.map((value) => labels.get(value) ?? value).join(', ') }), _jsx("p", { children: record.roles.map((value) => labels.get(value) ?? value).join(', ') }), _jsx("p", { children: record.targets.map((value) => labels.get(value) ?? value).join(', ') }), editable ? _jsxs("div", { className: "uhcp-consent-actions", children: [_jsx("button", { type: "button", "aria-label": `${copy.edit} ${record.contactName}`, onClick: () => setEditing(record), children: copy.edit }), _jsx("button", { type: "button", "aria-label": `${record.status === ConsentStatuses.Active ? copy.suspend : copy.activate} ${record.contactName}`, onClick: () => void changeStatus(record), children: record.status === ConsentStatuses.Active ? copy.suspend : copy.activate }), _jsx("button", { type: "button", "aria-label": `${copy.remove} ${record.contactName}`, onClick: () => void remove(record), children: copy.remove })] }) : null] }, record.id)) }), editing ? _jsxs("form", { className: "uhcp-consent-editor", onSubmit: (event) => { event.preventDefault(); void save(); }, children: [_jsxs("label", { children: [copy.contact, _jsxs("select", { value: editing.contactReference, onChange: (event) => setEditing({ ...editing, contactReference: event.target.value, contactName: contacts.find(({ id }) => id === event.target.value)?.name }), children: [_jsx("option", { value: "" }), contacts.map((contact) => _jsx("option", { value: contact.id, children: contact.name }, contact.id))] })] }), _jsxs("label", { children: [copy.decision, _jsxs("select", { value: editing.decision, onChange: (event) => setEditing({ ...editing, decision: event.target.value }), children: [_jsx("option", { value: ConsentDecisions.Permit, children: copy.permit }), _jsx("option", { value: ConsentDecisions.Deny, children: copy.deny })] })] }), _jsxs("label", { children: [copy.status, _jsxs("select", { value: editing.status, onChange: (event) => setEditing({ ...editing, status: event.target.value }), children: [_jsx("option", { value: ConsentStatuses.Active, children: copy.active }), _jsx("option", { value: ConsentStatuses.Inactive, children: copy.inactive })] })] }), _jsx(OptionGroup, { legend: copy.purposes, options: purposeOptions, selected: editing.purposes, onChange: (purposes) => setEditing({ ...editing, purposes }) }), _jsx(OptionGroup, { legend: copy.roles, options: roleOptions, selected: editing.roles, onChange: (roles) => setEditing({ ...editing, roles }) }), _jsx(OptionGroup, { legend: copy.targets, options: targetOptions, selected: editing.targets, onChange: (targets) => setEditing({ ...editing, targets }) }), _jsxs("div", { children: [_jsx("button", { type: "submit", disabled: saving, children: saving ? copy.saving : copy.save }), _jsx("button", { type: "button", onClick: () => setEditing(null), children: copy.cancel })] })] }) : null] });
|
|
46
|
+
}
|
|
47
|
+
function OptionGroup({ legend, options, selected, onChange }) {
|
|
48
|
+
return _jsxs("fieldset", { children: [_jsx("legend", { children: legend }), options.map((option) => _jsxs("label", { children: [_jsx("input", { type: "checkbox", checked: selected.includes(option.value), onChange: (event) => onChange(event.target.checked ? [...selected, option.value] : selected.filter((value) => value !== option.value)) }), option.label] }, option.value))] });
|
|
49
|
+
}
|
|
50
|
+
function emptyDraft() {
|
|
51
|
+
return Object.freeze({ contactReference: '', decision: ConsentDecisions.Permit, status: ConsentStatuses.Active, purposes: Object.freeze([]), roles: Object.freeze([]), targets: Object.freeze([]) });
|
|
52
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './SubjectAccessRequestPanel.js';
|
|
|
18
18
|
export * from './SoschainWorkspace.js';
|
|
19
19
|
export * from './EncounterTransferConsole.js';
|
|
20
20
|
export * from './EmergencyContactDirectory.js';
|
|
21
|
+
export * from './ConsentPermissionDirectory.js';
|
|
21
22
|
export * from './OrganizationWorkforceAdministration.js';
|
|
22
23
|
export * from './ProtectedIndexEmergencyData.js';
|
|
23
24
|
export * from './PortalSettingsPanel.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,wCAAwC,CAAA;AACtD,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,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,wCAAwC,CAAA;AACtD,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,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
|
@@ -18,6 +18,7 @@ export * from './SubjectAccessRequestPanel.js';
|
|
|
18
18
|
export * from './SoschainWorkspace.js';
|
|
19
19
|
export * from './EncounterTransferConsole.js';
|
|
20
20
|
export * from './EmergencyContactDirectory.js';
|
|
21
|
+
export * from './ConsentPermissionDirectory.js';
|
|
21
22
|
export * from './OrganizationWorkforceAdministration.js';
|
|
22
23
|
export * from './ProtectedIndexEmergencyData.js';
|
|
23
24
|
export * from './PortalSettingsPanel.js';
|
package/dist/styles.css
CHANGED
|
@@ -638,4 +638,5 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
|
|
|
638
638
|
@media (max-width: 620px) { .uhcp-emergency-copy > header { display: grid; } .uhcp-emergency-copy-legend { width: 100%; } }
|
|
639
639
|
.uhcp-settings{max-width:72rem;margin:0 auto;padding:2rem 1rem 4rem;display:grid;gap:1rem}.uhcp-settings>header,.uhcp-settings>section{background:var(--uhcp-surface,#fff);border:1px solid var(--uhcp-border,#dbe4ea);border-radius:1rem;padding:1.25rem}.uhcp-settings h1,.uhcp-settings h2{margin-top:0}.uhcp-settings fieldset{border:0;padding:0;margin:1rem 0;display:flex;gap:.5rem;flex-wrap:wrap}.uhcp-settings legend{width:100%;font-weight:700;margin-bottom:.5rem}.uhcp-settings button,.uhcp-settings-links a{border:1px solid var(--uhcp-border,#c9d7df);border-radius:.7rem;background:transparent;color:inherit;padding:.65rem .85rem;text-decoration:none}.uhcp-settings button[aria-pressed=true]{background:var(--uhcp-accent,#dceff7);border-color:var(--uhcp-accent-strong,#2489a7)}.uhcp-settings-links{display:flex;gap:.6rem;flex-wrap:wrap}
|
|
640
640
|
.uhcp-legal-document{color:var(--uhcp-text);line-height:1.7}.uhcp-legal-document h2{font-size:clamp(1.6rem,4vw,2.35rem);line-height:1.15;margin:0 0 1.25rem}.uhcp-legal-document h3{font-size:1.2rem;line-height:1.3;margin:2rem 0 .65rem}.uhcp-legal-document p{margin:0 0 1rem}.uhcp-legal-document ul{margin:0 0 1rem;padding-left:1.4rem}.uhcp-legal-document code{background:var(--uhcp-panel-muted);border-radius:.3rem;padding:.08rem .3rem}
|
|
641
|
+
.uhcp-consent-directory{background:var(--uhcp-panel);border:1px solid var(--uhcp-border);border-radius:1.5rem;color:var(--uhcp-text);display:grid;gap:1rem;padding:1.25rem}.uhcp-consent-directory>header{align-items:flex-start;display:flex;gap:1rem;justify-content:space-between}.uhcp-consent-directory h2,.uhcp-consent-directory p{margin:0}.uhcp-consent-directory>header p,.uhcp-consent-list article>p{color:var(--uhcp-muted)}.uhcp-consent-directory button,.uhcp-consent-directory select{background:var(--uhcp-panel);border:1px solid var(--uhcp-border);border-radius:.7rem;color:inherit;font:inherit;padding:.65rem .85rem}.uhcp-consent-list{display:grid;gap:.75rem}.uhcp-consent-list article{background:var(--uhcp-panel-muted);border:1px solid var(--uhcp-border);border-radius:1rem;display:grid;gap:.55rem;padding:1rem}.uhcp-consent-list article>div:first-child{align-items:center;display:flex;flex-wrap:wrap;gap:.55rem}.uhcp-consent-list article span{background:color-mix(in srgb,var(--uhcp-turquoise) 13%,transparent);border-radius:999px;font-size:.8rem;padding:.25rem .5rem}.uhcp-consent-actions{display:flex;flex-wrap:wrap;gap:.5rem}.uhcp-consent-editor{border-top:1px solid var(--uhcp-border);display:grid;gap:1rem;padding-top:1rem}.uhcp-consent-editor>label{display:grid;gap:.35rem}.uhcp-consent-editor fieldset{border:1px solid var(--uhcp-border);border-radius:1rem;display:flex;flex-wrap:wrap;gap:.75rem;margin:0;padding:1rem}.uhcp-consent-editor legend{font-weight:800;padding:0 .35rem}.uhcp-consent-editor fieldset label{align-items:center;display:flex;gap:.35rem}.uhcp-consent-editor>div{display:flex;gap:.6rem}@media(max-width:620px){.uhcp-consent-directory>header{display:grid}.uhcp-consent-editor fieldset{display:grid}}
|
|
641
642
|
.uhcp-loading-skeleton{background:var(--uhcp-panel);border:1px solid var(--uhcp-border);border-radius:2rem;display:grid;gap:1rem;margin:0 auto;max-width:1160px;overflow:hidden;padding:clamp(1.25rem,4vw,2.5rem);position:relative}.uhcp-loading-skeleton::after{animation:uhcp-loading-sweep 1.45s ease-in-out infinite;background:linear-gradient(90deg,transparent,color-mix(in srgb,#fff 42%,transparent),transparent);content:"";inset:0;position:absolute;transform:translateX(-100%)}.uhcp-loading-label{height:1px;overflow:hidden;position:absolute;width:1px;clip-path:inset(50%)}.uhcp-loading-heading,.uhcp-loading-copy,.uhcp-loading-row span{animation:uhcp-loading-pulse 1.45s ease-in-out infinite;background:color-mix(in srgb,var(--uhcp-muted) 17%,var(--uhcp-panel-muted));border-radius:999px}.uhcp-loading-heading{height:2.25rem;max-width:23rem;width:62%}.uhcp-loading-copy{height:1rem;max-width:38rem;width:86%}.uhcp-loading-grid{display:grid;gap:1rem;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));margin-top:.5rem}.uhcp-loading-row{background:var(--uhcp-panel-muted);border:1px solid var(--uhcp-border);border-radius:1.35rem;display:grid;gap:.8rem;padding:1.25rem}.uhcp-loading-row span{display:block;height:.8rem}.uhcp-loading-row span:nth-child(1){width:35%}.uhcp-loading-row span:nth-child(2){height:1.2rem;width:72%}.uhcp-loading-row span:nth-child(3){width:90%}.uhcp-loading-skeleton-compact{border-radius:1.25rem;padding:1.25rem}.uhcp-loading-skeleton-compact .uhcp-loading-heading{height:1.5rem}@keyframes uhcp-loading-pulse{0%,100%{opacity:.55}50%{opacity:1}}@keyframes uhcp-loading-sweep{to{transform:translateX(100%)}}@media(prefers-reduced-motion:reduce){.uhcp-loading-skeleton::after,.uhcp-loading-heading,.uhcp-loading-copy,.uhcp-loading-row span{animation:none}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uhc-portal-components-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.32",
|
|
4
4
|
"description": "Brand-neutral React portal shell, account preferences and protected-profile UI for UHC and VetChain portals.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"react-dom": ">=18.3.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"fhir-data-utils-ts": "0.6.
|
|
34
|
+
"fhir-data-utils-ts": "0.6.12",
|
|
35
35
|
"gdc-common-utils-ts": "2.9.27",
|
|
36
36
|
"sos-data-utils-ts": "0.6.3"
|
|
37
37
|
},
|