uhc-portal-components-react 0.1.9 → 0.1.10
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 +8 -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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/styles.css +30 -0
- package/package.json +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.10 - 2026-08-03
|
|
4
|
+
|
|
5
|
+
- Add the reusable organization workforce administration surface with total,
|
|
6
|
+
used and free license counters, active/inactive employee lifecycle actions,
|
|
7
|
+
invitation status history and an optional future device count.
|
|
8
|
+
- Add browser-DOM interaction tests proving controlled inputs, disabled invite
|
|
9
|
+
behavior, callbacks and the disable-before-purge rule.
|
|
10
|
+
|
|
3
11
|
## 0.1.9 - 2026-08-02
|
|
4
12
|
|
|
5
13
|
- 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
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,4 +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';
|
|
13
14
|
//# 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"}
|
package/dist/index.js
CHANGED
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:
|
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.10",
|
|
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",
|