uhc-portal-components-react 0.1.9 → 0.1.11
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 +4 -0
- package/dist/OrganizationWorkforceAdministration.d.ts +82 -0
- package/dist/OrganizationWorkforceAdministration.d.ts.map +1 -0
- package/dist/OrganizationWorkforceAdministration.js +21 -0
- package/dist/ProtectedIndexEmergencyData.d.ts +32 -0
- package/dist/ProtectedIndexEmergencyData.d.ts.map +1 -0
- package/dist/ProtectedIndexEmergencyData.js +12 -0
- package/dist/SoschainWorkspace.d.ts +7 -2
- package/dist/SoschainWorkspace.d.ts.map +1 -1
- package/dist/SoschainWorkspace.js +9 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/styles.css +47 -0
- package/package.json +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- Add a brand-neutral protected-index and emergency-copy panel. Hosts supply
|
|
6
|
+
backend-confirmed records; protected storage, individual authorship and
|
|
7
|
+
emergency availability remain separate states, and professional release is
|
|
8
|
+
never inferred by the browser.
|
|
9
|
+
|
|
10
|
+
## 0.1.10 - 2026-08-03
|
|
11
|
+
|
|
12
|
+
- Add the reusable organization workforce administration surface with total,
|
|
13
|
+
used and free license counters, active/inactive employee lifecycle actions,
|
|
14
|
+
invitation status history and an optional future device count.
|
|
15
|
+
- Add browser-DOM interaction tests proving controlled inputs, disabled invite
|
|
16
|
+
behavior, callbacks and the disable-before-purge rule.
|
|
17
|
+
|
|
3
18
|
## 0.1.9 - 2026-08-02
|
|
4
19
|
|
|
5
20
|
- Allow the SOSChain card picker to expose a host-owned card-import action for
|
package/README.md
CHANGED
|
@@ -62,6 +62,10 @@ The package deliberately exposes modules instead of a cloned application:
|
|
|
62
62
|
- `SoschainWorkspace`: subject-card picker and four-area workspace for Places,
|
|
63
63
|
devices/vehicles and read-only emergency communications. The host supplies
|
|
64
64
|
already-authorized cards and capabilities.
|
|
65
|
+
- `OrganizationWorkforceAdministration`: controlled license-capacity,
|
|
66
|
+
employee lifecycle and invitation-status UI. Invitations remain host-owned
|
|
67
|
+
application records; the component does not reserve licenses or create GW
|
|
68
|
+
employees.
|
|
65
69
|
|
|
66
70
|
Clinical label semantics stay in `gdc-common-utils-ts` / the SDK reader. Hosts
|
|
67
71
|
pass human titles to `ClinicalSectionSummary`: local `CodeableConcept.text`
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type WorkforceLicenseSummary = Readonly<{
|
|
2
|
+
total: number;
|
|
3
|
+
used: number;
|
|
4
|
+
free: number;
|
|
5
|
+
}>;
|
|
6
|
+
export type WorkforceEmployee = Readonly<{
|
|
7
|
+
id: string;
|
|
8
|
+
licenseId: string;
|
|
9
|
+
email: string;
|
|
10
|
+
role: string;
|
|
11
|
+
status: 'active' | 'inactive';
|
|
12
|
+
deviceCount?: number;
|
|
13
|
+
}>;
|
|
14
|
+
export type WorkforceInvitation = Readonly<{
|
|
15
|
+
id: string;
|
|
16
|
+
email: string;
|
|
17
|
+
role: string;
|
|
18
|
+
status: 'pending' | 'accepted' | 'cancelled';
|
|
19
|
+
sentAt?: string;
|
|
20
|
+
}>;
|
|
21
|
+
export type WorkforceRoleOption = Readonly<{
|
|
22
|
+
value: string;
|
|
23
|
+
label: string;
|
|
24
|
+
}>;
|
|
25
|
+
export type OrganizationWorkforceCopy = Readonly<{
|
|
26
|
+
title: string;
|
|
27
|
+
description: string;
|
|
28
|
+
totalLicenses: string;
|
|
29
|
+
usedLicenses: string;
|
|
30
|
+
freeLicenses: string;
|
|
31
|
+
employeesTitle: string;
|
|
32
|
+
invitationsTitle: string;
|
|
33
|
+
inviteTitle: string;
|
|
34
|
+
emailLabel: string;
|
|
35
|
+
roleLabel: string;
|
|
36
|
+
unlockSecretLabel: string;
|
|
37
|
+
invite: string;
|
|
38
|
+
inviting: string;
|
|
39
|
+
noFreeLicenses: string;
|
|
40
|
+
noEmployees: string;
|
|
41
|
+
noInvitations: string;
|
|
42
|
+
licenseColumn: string;
|
|
43
|
+
employeeColumn: string;
|
|
44
|
+
roleColumn: string;
|
|
45
|
+
statusColumn: string;
|
|
46
|
+
devicesColumn: string;
|
|
47
|
+
actionsColumn: string;
|
|
48
|
+
active: string;
|
|
49
|
+
inactive: string;
|
|
50
|
+
pending: string;
|
|
51
|
+
accepted: string;
|
|
52
|
+
cancelled: string;
|
|
53
|
+
disable: string;
|
|
54
|
+
purge: string;
|
|
55
|
+
devicesLater: string;
|
|
56
|
+
}>;
|
|
57
|
+
export type OrganizationWorkforceAdministrationProps = Readonly<{
|
|
58
|
+
copy: OrganizationWorkforceCopy;
|
|
59
|
+
summary: WorkforceLicenseSummary;
|
|
60
|
+
employees: readonly WorkforceEmployee[];
|
|
61
|
+
invitations: readonly WorkforceInvitation[];
|
|
62
|
+
roles: readonly WorkforceRoleOption[];
|
|
63
|
+
email: string;
|
|
64
|
+
role: string;
|
|
65
|
+
unlockSecret: string;
|
|
66
|
+
busyAction?: string;
|
|
67
|
+
error?: string;
|
|
68
|
+
onEmailChange: (value: string) => void;
|
|
69
|
+
onRoleChange: (value: string) => void;
|
|
70
|
+
onUnlockSecretChange: (value: string) => void;
|
|
71
|
+
onInvite: () => void | Promise<void>;
|
|
72
|
+
onDisable: (employeeId: string) => void | Promise<void>;
|
|
73
|
+
onPurge: (employeeId: string) => void | Promise<void>;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Controlled organization workforce surface shared by professional portals.
|
|
77
|
+
*
|
|
78
|
+
* The component never infers authorization or changes GW state. The host owns
|
|
79
|
+
* invitation persistence, license reads and employee lifecycle commands.
|
|
80
|
+
*/
|
|
81
|
+
export declare function OrganizationWorkforceAdministration({ copy, summary, employees, invitations, roles, email, role, unlockSecret, busyAction, error, onEmailChange, onRoleChange, onUnlockSecretChange, onInvite, onDisable, onPurge, }: OrganizationWorkforceAdministrationProps): import("react").JSX.Element;
|
|
82
|
+
//# sourceMappingURL=OrganizationWorkforceAdministration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationWorkforceAdministration.d.ts","sourceRoot":"","sources":["../src/OrganizationWorkforceAdministration.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Controlled organization workforce surface shared by professional portals.
|
|
4
|
+
*
|
|
5
|
+
* The component never infers authorization or changes GW state. The host owns
|
|
6
|
+
* invitation persistence, license reads and employee lifecycle commands.
|
|
7
|
+
*/
|
|
8
|
+
export function OrganizationWorkforceAdministration({ copy, summary, employees, invitations, roles, email, role, unlockSecret, busyAction, error, onEmailChange, onRoleChange, onUnlockSecretChange, onInvite, onDisable, onPurge, }) {
|
|
9
|
+
const noCapacity = summary.free < 1;
|
|
10
|
+
const inviting = busyAction === 'invite';
|
|
11
|
+
const canInvite = !noCapacity && !inviting && Boolean(email.trim() && role && unlockSecret);
|
|
12
|
+
function submitInvitation(event) {
|
|
13
|
+
event.preventDefault();
|
|
14
|
+
if (canInvite)
|
|
15
|
+
void onInvite();
|
|
16
|
+
}
|
|
17
|
+
return (_jsxs("section", { className: "uhcp-workforce", "aria-labelledby": "uhcp-workforce-title", children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h1", { id: "uhcp-workforce-title", children: copy.title }), _jsx("p", { children: copy.description })] }), _jsxs("dl", { className: "uhcp-license-summary", children: [_jsxs("div", { children: [_jsx("dt", { children: copy.totalLicenses }), _jsx("dd", { children: summary.total })] }), _jsxs("div", { children: [_jsx("dt", { children: copy.usedLicenses }), _jsx("dd", { children: summary.used })] }), _jsxs("div", { children: [_jsx("dt", { children: copy.freeLicenses }), _jsx("dd", { children: summary.free })] })] })] }), _jsxs("section", { className: "uhcp-workforce-panel", "aria-labelledby": "uhcp-invite-title", children: [_jsx("h2", { id: "uhcp-invite-title", children: copy.inviteTitle }), noCapacity && _jsx("p", { role: "status", className: "uhcp-workforce-warning", children: copy.noFreeLicenses }), _jsxs("form", { onSubmit: submitInvitation, children: [_jsxs("label", { children: [_jsx("span", { children: copy.emailLabel }), _jsx("input", { type: "email", required: true, value: email, onChange: (event) => onEmailChange(event.currentTarget.value) })] }), _jsxs("label", { children: [_jsx("span", { children: copy.roleLabel }), _jsxs("select", { required: true, value: role, onChange: (event) => onRoleChange(event.currentTarget.value), children: [_jsx("option", { value: "" }), roles.map((option) => _jsx("option", { value: option.value, children: option.label }, option.value))] })] }), _jsxs("label", { children: [_jsx("span", { children: copy.unlockSecretLabel }), _jsx("input", { type: "password", required: true, value: unlockSecret, onChange: (event) => onUnlockSecretChange(event.currentTarget.value) })] }), _jsx("button", { type: "submit", disabled: !canInvite, children: inviting ? copy.inviting : copy.invite })] })] }), _jsxs("section", { className: "uhcp-workforce-panel", "aria-labelledby": "uhcp-employees-title", children: [_jsx("h2", { id: "uhcp-employees-title", children: copy.employeesTitle }), employees.length === 0 ? _jsx("p", { children: copy.noEmployees }) : (_jsx("div", { className: "uhcp-table-scroll", children: _jsxs("table", { children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: copy.licenseColumn }), _jsx("th", { children: copy.employeeColumn }), _jsx("th", { children: copy.roleColumn }), _jsx("th", { children: copy.statusColumn }), _jsx("th", { children: copy.devicesColumn }), _jsx("th", { children: copy.actionsColumn })] }) }), _jsx("tbody", { children: employees.map((employee) => {
|
|
18
|
+
const rowBusy = busyAction === employee.id;
|
|
19
|
+
return _jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: employee.licenseId }) }), _jsx("td", { children: employee.email }), _jsx("td", { children: employee.role }), _jsx("td", { children: _jsx("span", { className: `uhcp-status uhcp-status-${employee.status}`, children: employee.status === 'active' ? copy.active : copy.inactive }) }), _jsx("td", { children: employee.deviceCount === undefined ? copy.devicesLater : employee.deviceCount }), _jsxs("td", { className: "uhcp-row-actions", children: [_jsx("button", { type: "button", disabled: rowBusy || employee.status !== 'active', onClick: () => void onDisable(employee.id), children: copy.disable }), _jsx("button", { type: "button", className: "uhcp-danger", disabled: rowBusy || employee.status !== 'inactive', onClick: () => void onPurge(employee.id), children: copy.purge })] })] }, employee.id);
|
|
20
|
+
}) })] }) }))] }), _jsxs("section", { className: "uhcp-workforce-panel", "aria-labelledby": "uhcp-invitations-title", children: [_jsx("h2", { id: "uhcp-invitations-title", children: copy.invitationsTitle }), invitations.length === 0 ? _jsx("p", { children: copy.noInvitations }) : _jsx("ul", { className: "uhcp-invitation-list", children: invitations.map((invitation) => _jsxs("li", { children: [_jsxs("span", { children: [_jsx("strong", { children: invitation.email }), _jsx("small", { children: invitation.role })] }), _jsx("span", { className: `uhcp-status uhcp-status-${invitation.status}`, children: copy[invitation.status] })] }, invitation.id)) })] }), error && _jsx("p", { role: "alert", className: "uhcp-error", children: error })] }));
|
|
21
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type ProtectedIndexEmergencyItem = Readonly<{
|
|
2
|
+
identifier: string;
|
|
3
|
+
title: string;
|
|
4
|
+
categoryLabel: string;
|
|
5
|
+
sourceLabel?: string;
|
|
6
|
+
creatorLabel?: string;
|
|
7
|
+
/** True only after the backend confirms emergency-copy consent and policy. */
|
|
8
|
+
emergencyAvailable: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
export type ProtectedIndexEmergencyCopy = Readonly<{
|
|
11
|
+
title: string;
|
|
12
|
+
body: string;
|
|
13
|
+
securePinTitle: string;
|
|
14
|
+
securePinBody: string;
|
|
15
|
+
emergencyPinTitle: string;
|
|
16
|
+
emergencyPinBody: string;
|
|
17
|
+
emergencyOnly: string;
|
|
18
|
+
protectedOnly: string;
|
|
19
|
+
empty: string;
|
|
20
|
+
sourcePrefix: string;
|
|
21
|
+
creatorPrefix: string;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Presents backend-confirmed protected-index copies and their independent
|
|
25
|
+
* emergency availability. The component never infers emergency consent from
|
|
26
|
+
* individual authorship, storage, a selected card or browser state.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ProtectedIndexEmergencyData({ copy, items, }: Readonly<{
|
|
29
|
+
copy: ProtectedIndexEmergencyCopy;
|
|
30
|
+
items: readonly ProtectedIndexEmergencyItem[];
|
|
31
|
+
}>): import("react").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=ProtectedIndexEmergencyData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtectedIndexEmergencyData.d.ts","sourceRoot":"","sources":["../src/ProtectedIndexEmergencyData.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,kBAAkB,EAAE,OAAO,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,IAAI,EACJ,KAAK,GACN,EAAE,QAAQ,CAAC;IACV,IAAI,EAAE,2BAA2B,CAAA;IACjC,KAAK,EAAE,SAAS,2BAA2B,EAAE,CAAA;CAC9C,CAAC,+BAkCD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Presents backend-confirmed protected-index copies and their independent
|
|
4
|
+
* emergency availability. The component never infers emergency consent from
|
|
5
|
+
* individual authorship, storage, a selected card or browser state.
|
|
6
|
+
*/
|
|
7
|
+
export function ProtectedIndexEmergencyData({ copy, items, }) {
|
|
8
|
+
return (_jsxs("section", { className: "uhcp-emergency-copy", "aria-labelledby": "protected-index-emergency-title", children: [_jsxs("header", { children: [_jsxs("div", { children: [_jsx("h2", { id: "protected-index-emergency-title", children: copy.title }), _jsx("p", { children: copy.body })] }), _jsxs("div", { className: "uhcp-emergency-copy-legend", "aria-label": copy.title, children: [_jsx(Pin, { kind: "secure", label: copy.securePinTitle, help: copy.securePinBody }), _jsx(Pin, { kind: "emergency", label: copy.emergencyPinTitle, help: copy.emergencyPinBody })] })] }), items.length === 0 ? _jsx("p", { className: "uhcp-emergency-copy-empty", children: copy.empty }) : (_jsx("ul", { className: "uhcp-emergency-copy-list", children: items.map((item) => (_jsxs("li", { children: [_jsxs("div", { className: "uhcp-emergency-copy-item-heading", children: [_jsx("span", { className: "uhcp-emergency-copy-category", children: item.categoryLabel }), _jsxs("span", { className: "uhcp-emergency-copy-pins", children: [_jsx(Pin, { kind: "secure", label: copy.securePinTitle, help: copy.securePinBody, compact: true }), item.emergencyAvailable ? _jsx(Pin, { kind: "emergency", label: copy.emergencyPinTitle, help: copy.emergencyPinBody, compact: true }) : null] })] }), _jsx("strong", { children: item.title }), _jsx("small", { children: item.emergencyAvailable ? copy.emergencyOnly : copy.protectedOnly }), item.sourceLabel ? _jsxs("span", { children: [copy.sourcePrefix, ": ", item.sourceLabel] }) : null, item.creatorLabel ? _jsxs("span", { children: [copy.creatorPrefix, ": ", item.creatorLabel] }) : null] }, item.identifier))) }))] }));
|
|
9
|
+
}
|
|
10
|
+
function Pin({ kind, label, help, compact = false, }) {
|
|
11
|
+
return (_jsxs("span", { className: `uhcp-emergency-copy-pin uhcp-emergency-copy-pin-${kind}`, role: "img", "aria-label": label, title: help, children: [_jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: _jsx("path", { d: "M12 17v5m-5-9 2-2V5L7 3h10l-2 2v6l2 2H7Z" }) }), compact ? null : _jsx("span", { children: label })] }));
|
|
12
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ProtectedIndexEmergencyCopy, type ProtectedIndexEmergencyItem } from './ProtectedIndexEmergencyData.js';
|
|
2
|
+
export type SoschainWorkspaceArea = 'overview' | 'emergency-data' | 'places' | 'products' | 'communications';
|
|
2
3
|
export type SoschainCardSummary = Readonly<{
|
|
3
4
|
identifier: string;
|
|
4
5
|
displayName: string;
|
|
@@ -33,6 +34,9 @@ export type SoschainWorkspaceCopy = Readonly<{
|
|
|
33
34
|
areas: Record<SoschainWorkspaceArea, string>;
|
|
34
35
|
overviewTitle: string;
|
|
35
36
|
overviewBody: string;
|
|
37
|
+
emergencyDataTitle: string;
|
|
38
|
+
emergencyDataBody: string;
|
|
39
|
+
emergencyData: ProtectedIndexEmergencyCopy;
|
|
36
40
|
placesTitle: string;
|
|
37
41
|
placesBody: string;
|
|
38
42
|
productsTitle: string;
|
|
@@ -56,6 +60,7 @@ export type SoschainWorkspaceProps = Readonly<{
|
|
|
56
60
|
places: readonly SoschainAssociationSummary[];
|
|
57
61
|
products: readonly SoschainAssociationSummary[];
|
|
58
62
|
communications: readonly SoschainCommunicationSummary[];
|
|
63
|
+
emergencyData?: readonly ProtectedIndexEmergencyItem[];
|
|
59
64
|
canManageAssociations: boolean;
|
|
60
65
|
addPlaceHref?: string;
|
|
61
66
|
addProductHref?: string;
|
|
@@ -68,5 +73,5 @@ export type SoschainWorkspaceProps = Readonly<{
|
|
|
68
73
|
* communications. This presentational component never derives authority from
|
|
69
74
|
* a selected role, card, tab or browser-controlled value.
|
|
70
75
|
*/
|
|
71
|
-
export declare function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, canManageAssociations, addPlaceHref, addProductHref, importCardHref, }: SoschainWorkspaceProps): import("react").JSX.Element;
|
|
76
|
+
export declare function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, emergencyData, canManageAssociations, addPlaceHref, addProductHref, importCardHref, }: SoschainWorkspaceProps): import("react").JSX.Element;
|
|
72
77
|
//# sourceMappingURL=SoschainWorkspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SoschainWorkspace.d.ts","sourceRoot":"","sources":["../src/SoschainWorkspace.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"SoschainWorkspace.d.ts","sourceRoot":"","sources":["../src/SoschainWorkspace.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ProtectedIndexEmergencyData } from './ProtectedIndexEmergencyData.js';
|
|
2
3
|
function AssociationList({ items, empty }) {
|
|
3
4
|
if (items.length === 0)
|
|
4
5
|
return _jsx("p", { className: "uhcp-sos-empty", children: empty });
|
|
@@ -11,7 +12,7 @@ function AssociationList({ items, empty }) {
|
|
|
11
12
|
* communications. This presentational component never derives authority from
|
|
12
13
|
* a selected role, card, tab or browser-controlled value.
|
|
13
14
|
*/
|
|
14
|
-
export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, canManageAssociations, addPlaceHref, addProductHref, importCardHref, }) {
|
|
15
|
+
export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaHrefs, places, products, communications, emergencyData = [], canManageAssociations, addPlaceHref, addProductHref, importCardHref, }) {
|
|
15
16
|
if (!selectedCard) {
|
|
16
17
|
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))) }))] }));
|
|
17
18
|
}
|
|
@@ -21,13 +22,17 @@ export function SoschainWorkspace({ copy, cards, selectedCard, activeArea, areaH
|
|
|
21
22
|
? copy.productsTitle
|
|
22
23
|
: activeArea === 'communications'
|
|
23
24
|
? copy.communicationsTitle
|
|
24
|
-
:
|
|
25
|
+
: activeArea === 'emergency-data'
|
|
26
|
+
? copy.emergencyDataTitle
|
|
27
|
+
: copy.overviewTitle;
|
|
25
28
|
const body = activeArea === 'places'
|
|
26
29
|
? copy.placesBody
|
|
27
30
|
: activeArea === 'products'
|
|
28
31
|
? copy.productsBody
|
|
29
32
|
: activeArea === 'communications'
|
|
30
33
|
? copy.communicationsBody
|
|
31
|
-
:
|
|
32
|
-
|
|
34
|
+
: activeArea === 'emergency-data'
|
|
35
|
+
? copy.emergencyDataBody
|
|
36
|
+
: copy.overviewBody;
|
|
37
|
+
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: Object.keys(areaHrefs).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 })] }), !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 })] })] })), 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))) })))] })] }));
|
|
33
38
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,4 +10,6 @@ export * from './IpsBundleSummary.js';
|
|
|
10
10
|
export * from './InvitationAcceptancePanel.js';
|
|
11
11
|
export * from './SubjectAccessRequestPanel.js';
|
|
12
12
|
export * from './SoschainWorkspace.js';
|
|
13
|
+
export * from './OrganizationWorkforceAdministration.js';
|
|
14
|
+
export * from './ProtectedIndexEmergencyData.js';
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
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,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,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,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,0CAA0C,CAAA;AACxD,cAAc,kCAAkC,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -10,3 +10,5 @@ export * from './IpsBundleSummary.js';
|
|
|
10
10
|
export * from './InvitationAcceptancePanel.js';
|
|
11
11
|
export * from './SubjectAccessRequestPanel.js';
|
|
12
12
|
export * from './SoschainWorkspace.js';
|
|
13
|
+
export * from './OrganizationWorkforceAdministration.js';
|
|
14
|
+
export * from './ProtectedIndexEmergencyData.js';
|
package/dist/styles.css
CHANGED
|
@@ -211,6 +211,36 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
|
|
|
211
211
|
}
|
|
212
212
|
.uhcp-access-panel button:disabled { cursor: not-allowed; opacity: .55; }
|
|
213
213
|
.uhcp-access-panel [role="alert"] { color: #c64747; font-weight: 700; }
|
|
214
|
+
.uhcp-workforce { color: var(--uhcp-text); display: grid; gap: 1.25rem; }
|
|
215
|
+
.uhcp-workforce > header { align-items: end; display: flex; gap: 2rem; justify-content: space-between; }
|
|
216
|
+
.uhcp-workforce h1, .uhcp-workforce h2, .uhcp-workforce p { margin: 0; }
|
|
217
|
+
.uhcp-workforce > header p, .uhcp-workforce-panel > p { color: var(--uhcp-muted); margin-top: .45rem; }
|
|
218
|
+
.uhcp-license-summary { display: grid; gap: .65rem; grid-template-columns: repeat(3, minmax(6rem, 1fr)); margin: 0; }
|
|
219
|
+
.uhcp-license-summary div { background: var(--uhcp-panel); border: 1px solid var(--uhcp-border); border-radius: 1rem; padding: .8rem 1rem; }
|
|
220
|
+
.uhcp-license-summary dt { color: var(--uhcp-muted); font-size: .72rem; font-weight: 800; text-transform: uppercase; }
|
|
221
|
+
.uhcp-license-summary dd { font-size: 1.65rem; font-weight: 900; margin: .2rem 0 0; }
|
|
222
|
+
.uhcp-workforce-panel { background: var(--uhcp-panel); border: 1px solid var(--uhcp-border); border-radius: 1.5rem; padding: 1.25rem; }
|
|
223
|
+
.uhcp-workforce-panel form { align-items: end; display: grid; gap: .8rem; grid-template-columns: 2fr 1.3fr 1.2fr auto; margin-top: 1rem; }
|
|
224
|
+
.uhcp-workforce-panel label { display: grid; font-weight: 700; gap: .35rem; }
|
|
225
|
+
.uhcp-workforce-panel input, .uhcp-workforce-panel select { background: var(--uhcp-panel); border: 1px solid var(--uhcp-border); border-radius: .75rem; color: var(--uhcp-text); font: inherit; min-width: 0; padding: .75rem; }
|
|
226
|
+
.uhcp-workforce button { background: linear-gradient(135deg, var(--uhcp-action-start), var(--uhcp-action-end)); border: 0; border-radius: .75rem; color: #fff; cursor: pointer; font: inherit; font-weight: 800; padding: .75rem 1rem; }
|
|
227
|
+
.uhcp-workforce button:disabled { cursor: not-allowed; opacity: .45; }
|
|
228
|
+
.uhcp-workforce button.uhcp-danger { background: #9e3535; }
|
|
229
|
+
.uhcp-workforce-warning { color: var(--uhcp-attention) !important; font-weight: 800; }
|
|
230
|
+
.uhcp-table-scroll { overflow-x: auto; }
|
|
231
|
+
.uhcp-workforce table { border-collapse: collapse; margin-top: 1rem; width: 100%; }
|
|
232
|
+
.uhcp-workforce th, .uhcp-workforce td { border-bottom: 1px solid var(--uhcp-border); padding: .75rem .5rem; text-align: left; }
|
|
233
|
+
.uhcp-workforce th { color: var(--uhcp-muted); font-size: .75rem; text-transform: uppercase; }
|
|
234
|
+
.uhcp-row-actions { display: flex; gap: .5rem; }
|
|
235
|
+
.uhcp-status { border-radius: 999px; display: inline-flex; font-size: .75rem; font-weight: 800; padding: .3rem .6rem; }
|
|
236
|
+
.uhcp-status-active, .uhcp-status-accepted { background: color-mix(in srgb, var(--uhcp-emerald) 18%, transparent); color: var(--uhcp-emerald); }
|
|
237
|
+
.uhcp-status-inactive, .uhcp-status-cancelled { background: var(--uhcp-panel-muted); color: var(--uhcp-muted); }
|
|
238
|
+
.uhcp-status-pending { background: color-mix(in srgb, var(--uhcp-attention) 18%, transparent); color: var(--uhcp-attention); }
|
|
239
|
+
.uhcp-invitation-list { display: grid; gap: .6rem; list-style: none; margin: 1rem 0 0; padding: 0; }
|
|
240
|
+
.uhcp-invitation-list li { align-items: center; border-bottom: 1px solid var(--uhcp-border); display: flex; justify-content: space-between; padding: .65rem 0; }
|
|
241
|
+
.uhcp-invitation-list li > span:first-child { display: grid; gap: .2rem; }
|
|
242
|
+
.uhcp-invitation-list small { color: var(--uhcp-muted); }
|
|
243
|
+
@media (max-width: 820px) { .uhcp-workforce > header { align-items: stretch; flex-direction: column; } .uhcp-workforce-panel form { grid-template-columns: 1fr; } }
|
|
214
244
|
.uhcp-entry-hero {
|
|
215
245
|
align-items: center;
|
|
216
246
|
background:
|
|
@@ -297,3 +327,20 @@ html[data-theme='dark'] .uhcp-brand-artwork-dark { display: block !important; }
|
|
|
297
327
|
.uhcp-sos-overview-grid { grid-template-columns: 1fr; }
|
|
298
328
|
.uhcp-sos-panel > header { display: grid; }
|
|
299
329
|
}
|
|
330
|
+
.uhcp-emergency-copy { background: var(--uhcp-panel); border: 1px solid var(--uhcp-border); border-radius: 2rem; color: var(--uhcp-text); padding: clamp(1.25rem, 4vw, 2.25rem); }
|
|
331
|
+
.uhcp-emergency-copy > header { align-items: flex-start; display: flex; gap: 1.5rem; justify-content: space-between; }
|
|
332
|
+
.uhcp-emergency-copy h2 { margin: 0 0 .45rem; }
|
|
333
|
+
.uhcp-emergency-copy header p { color: var(--uhcp-muted); line-height: 1.6; margin: 0; max-width: 48rem; }
|
|
334
|
+
.uhcp-emergency-copy-legend { display: grid; flex: 0 0 auto; gap: .5rem; }
|
|
335
|
+
.uhcp-emergency-copy-pin { align-items: center; border-radius: 999px; display: inline-flex; font-size: .75rem; font-weight: 850; gap: .35rem; padding: .35rem .55rem; }
|
|
336
|
+
.uhcp-emergency-copy-pin svg { fill: none; height: 1rem; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.8; width: 1rem; }
|
|
337
|
+
.uhcp-emergency-copy-pin-secure { background: color-mix(in srgb, var(--uhcp-turquoise) 16%, transparent); color: color-mix(in srgb, var(--uhcp-turquoise) 72%, var(--uhcp-text)); }
|
|
338
|
+
.uhcp-emergency-copy-pin-emergency { background: color-mix(in srgb, var(--uhcp-attention) 18%, transparent); color: color-mix(in srgb, var(--uhcp-attention) 78%, var(--uhcp-text)); }
|
|
339
|
+
.uhcp-emergency-copy-list { display: grid; gap: .8rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); list-style: none; margin: 1.5rem 0 0; padding: 0; }
|
|
340
|
+
.uhcp-emergency-copy-list li { background: var(--uhcp-panel-muted); border: 1px solid var(--uhcp-border); border-radius: 1.25rem; display: grid; gap: .45rem; padding: 1rem; }
|
|
341
|
+
.uhcp-emergency-copy-item-heading { align-items: center; display: flex; gap: .6rem; justify-content: space-between; }
|
|
342
|
+
.uhcp-emergency-copy-category { color: var(--uhcp-emerald); font-size: .72rem; font-weight: 900; letter-spacing: .08em; text-transform: uppercase; }
|
|
343
|
+
.uhcp-emergency-copy-pins { display: inline-flex; gap: .3rem; }
|
|
344
|
+
.uhcp-emergency-copy-list small, .uhcp-emergency-copy-list li > span, .uhcp-emergency-copy-empty { color: var(--uhcp-muted); }
|
|
345
|
+
.uhcp-emergency-copy-empty { margin: 1.5rem 0 0; }
|
|
346
|
+
@media (max-width: 620px) { .uhcp-emergency-copy > header { display: grid; } .uhcp-emergency-copy-legend { width: 100%; } }
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uhc-portal-components-react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
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",
|
|
7
|
-
"files": [
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"CHANGELOG.md"
|
|
11
|
+
],
|
|
8
12
|
"main": "./dist/index.js",
|
|
9
13
|
"types": "./dist/index.d.ts",
|
|
10
14
|
"exports": {
|
|
@@ -30,8 +34,11 @@
|
|
|
30
34
|
"gdc-common-utils-ts": "^2.3.12"
|
|
31
35
|
},
|
|
32
36
|
"devDependencies": {
|
|
37
|
+
"@testing-library/react": "^16.3.2",
|
|
38
|
+
"@testing-library/user-event": "^14.6.1",
|
|
33
39
|
"@types/react": "19.2.17",
|
|
34
40
|
"@types/react-dom": "19.2.3",
|
|
41
|
+
"jsdom": "^26.1.0",
|
|
35
42
|
"react": "19.2.8",
|
|
36
43
|
"react-dom": "19.2.8",
|
|
37
44
|
"typescript": "^5.5.4",
|