@stigmer/react 3.31.0 → 3.32.0
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/iam-policy/OrgMembersPanel.d.ts +7 -0
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +28 -12
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts +7 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +2 -2
- package/iam-policy/RoleSelector.js.map +1 -1
- package/iam-policy/useOwnerAssignment.d.ts +23 -0
- package/iam-policy/useOwnerAssignment.d.ts.map +1 -0
- package/iam-policy/useOwnerAssignment.js +23 -0
- package/iam-policy/useOwnerAssignment.js.map +1 -0
- package/iam-policy/useRoleSelector.d.ts +6 -1
- package/iam-policy/useRoleSelector.d.ts.map +1 -1
- package/iam-policy/useRoleSelector.js +11 -3
- package/iam-policy/useRoleSelector.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +5 -1
- package/invitation/InvitationManager.js.map +1 -1
- package/package.json +5 -5
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +9 -4
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -1
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/expiry.d.ts +4 -0
- package/platform-client/expiry.d.ts.map +1 -0
- package/platform-client/expiry.js +18 -0
- package/platform-client/expiry.js.map +1 -0
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +1 -1
- package/settings/MembersSection.js.map +1 -1
- package/src/iam-policy/OrgMembersPanel.tsx +38 -8
- package/src/iam-policy/RoleSelector.tsx +8 -0
- package/src/iam-policy/__tests__/OrgMembersPanel.test.tsx +139 -0
- package/src/iam-policy/__tests__/useOwnerAssignment.test.tsx +55 -0
- package/src/iam-policy/useOwnerAssignment.ts +40 -0
- package/src/iam-policy/useRoleSelector.ts +14 -3
- package/src/invitation/InvitationManager.tsx +5 -0
- package/src/platform-client/PlatformClientDetailPanel.tsx +28 -5
- package/src/platform-client/PlatformClientListPanel.tsx +2 -1
- package/src/platform-client/__tests__/PlatformClientDetailPanel.test.tsx +45 -3
- package/src/platform-client/__tests__/expiry.test.ts +37 -0
- package/src/platform-client/expiry.ts +22 -0
- package/src/settings/MembersSection.tsx +2 -1
|
@@ -10,6 +10,7 @@ import { useUpdatePlatformClient } from "./useUpdatePlatformClient.js";
|
|
|
10
10
|
import { useRotatePlatformClientSecret } from "./useRotatePlatformClientSecret.js";
|
|
11
11
|
import { useDeletePlatformClient } from "./useDeletePlatformClient.js";
|
|
12
12
|
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
13
|
+
import { isPlatformClientExpired } from "./expiry.js";
|
|
13
14
|
/**
|
|
14
15
|
* View and edit panel for an existing platform client.
|
|
15
16
|
*
|
|
@@ -50,6 +51,8 @@ export function PlatformClientDetailPanel({ platformClient, onUpdated, onSecretR
|
|
|
50
51
|
const [confirmingDelete, setConfirmingDelete] = useState(false);
|
|
51
52
|
const [confirmingRotate, setConfirmingRotate] = useState(false);
|
|
52
53
|
const isBusy = isUpdating || isRotating || isDeleting;
|
|
54
|
+
// Rotating never revives an expired client: only a later expiry does.
|
|
55
|
+
const expired = isPlatformClientExpired(spec);
|
|
53
56
|
// Edit form state
|
|
54
57
|
const [neverExpires, setNeverExpires] = useState(spec?.neverExpires ?? true);
|
|
55
58
|
const [expiresAt, setExpiresAt] = useState(() => {
|
|
@@ -173,7 +176,7 @@ export function PlatformClientDetailPanel({ platformClient, onUpdated, onSecretR
|
|
|
173
176
|
return (_jsxs("div", { className: cn("stg:space-y-4", className), children: [_jsxs("div", { className: "stg:flex stg:items-start stg:justify-between stg:gap-3", children: [_jsxs("div", { className: "stg:min-w-0", children: [onBack && (_jsxs("button", { type: "button", onClick: onBack, className: "stg:text-muted-foreground stg:hover:text-foreground stg:mb-1 stg:flex stg:items-center stg:gap-1 stg:text-xs stg:transition-colors", children: [_jsx(ArrowLeftIcon, {}), "Back to list"] })), _jsx("h3", { className: "stg:text-foreground stg:truncate stg:text-sm stg:font-semibold", children: meta?.name ?? "Platform Client" }), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [meta?.slug && (_jsx("span", { className: "stg:text-muted-foreground stg:font-mono stg:text-xs", children: meta.slug })), spec?.autoProvisionAccounts && (_jsx("span", { className: "stg:inline-flex stg:items-center stg:rounded-full stg:border stg:border-primary/30 stg:bg-primary-subtle stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-medium stg:text-primary", children: "JIT" }))] })] }), mode === "view" && (_jsx("button", { type: "button", onClick: enterEdit, className: cn("stg:shrink-0 stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs stg:font-medium", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:transition-colors"), children: "Edit" }))] }), mode === "view" ? (_jsx(ViewMode, { spec: spec, createdAt: createdAt, updatedAt: updatedAt })) : (_jsxs("form", { onSubmit: handleSave, className: "stg:space-y-3", children: [_jsxs("div", { className: "stg:rounded-md stg:border stg:border-border-muted stg:bg-muted-faint stg:px-3 stg:py-2 stg:space-y-1", children: [_jsx("p", { className: "stg:text-[0.65rem] stg:font-medium stg:text-muted-foreground", children: "Client ID" }), _jsx("p", { className: "stg:font-mono stg:text-xs stg:text-foreground", children: spec?.clientId ?? "—" })] }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-2"), disabled: isUpdating, children: [_jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Expiry" }), _jsx(ToggleSwitch, { checked: neverExpires, onChange: setNeverExpires, label: "Never expires", disabled: isUpdating }), !neverExpires && (_jsxs("div", { className: "stg:space-y-1", children: [_jsx("label", { htmlFor: `${baseId}-expires-at`, className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Expires at" }), _jsx("input", { id: `${baseId}-expires-at`, type: "datetime-local", value: expiresAt, onChange: (e) => setExpiresAt(e.target.value), disabled: isUpdating, className: cn("stg:w-full stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-foreground", "stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring", "stg:disabled:pointer-events-none stg:disabled:opacity-50") })] }))] }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-2.5"), disabled: isUpdating, children: [_jsx("hr", { className: "stg:border-border-muted" }), _jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "JIT provisioning" }), _jsx(ToggleSwitch, { checked: autoProvision, onChange: handleAutoProvisionChange, label: "Auto-provision accounts", hint: "Create a Stigmer identity account automatically on first token mint", disabled: isUpdating }), _jsx(ToggleSwitch, { checked: autoGrant, onChange: handleAutoGrantChange, label: "Auto-grant on organization", hint: "Grant a role on the owning organization when an account is provisioned", disabled: isUpdating || !autoProvision }), autoGrant && (_jsxs("div", { className: "stg:space-y-1", children: [_jsx("label", { htmlFor: `${baseId}-grant-role`, className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Auto-grant role" }), _jsx("select", { id: `${baseId}-grant-role`, value: String(autoGrantRole), onChange: (e) => setAutoGrantRole(Number(e.target.value)), disabled: isUpdating, className: cn("stg:w-full stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-foreground", "stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: JIT_ROLE_OPTIONS.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value))) })] }))] }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-2"), disabled: isUpdating, children: [_jsx("hr", { className: "stg:border-border-muted" }), _jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Allowed origins" }), _jsx("p", { className: "stg:text-[0.65rem] stg:text-muted-foreground", children: "Browser origins permitted to use tokens minted by this client. Leave empty to allow all origins." }), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [_jsx("input", { type: "text", value: originInput, onChange: (e) => setOriginInput(e.target.value), onKeyDown: handleOriginKeyDown, onBlur: () => {
|
|
174
177
|
if (originInput.trim())
|
|
175
178
|
addOrigin();
|
|
176
|
-
}, placeholder: "https://example.com", disabled: isUpdating, className: cn("stg:min-w-0 stg:flex-1 stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-foreground", "stg:placeholder:text-muted-foreground", "stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring", "stg:disabled:pointer-events-none stg:disabled:opacity-50") }), _jsx("button", { type: "button", onClick: addOrigin, disabled: isUpdating || !originInput.trim(), className: cn("stg:shrink-0 stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs stg:font-medium", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50", "stg:transition-colors"), children: "Add" })] }), origins.length > 0 && (_jsx("div", { className: "stg:flex stg:flex-wrap stg:gap-1.5", children: origins.map((origin) => (_jsxs("span", { className: "stg:inline-flex stg:items-center stg:gap-1 stg:rounded-full stg:border stg:border-border-muted stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-mono stg:text-foreground", children: [origin, _jsx("button", { type: "button", onClick: () => removeOrigin(origin), disabled: isUpdating, "aria-label": `Remove ${origin}`, className: "stg:text-muted-foreground stg:hover:text-destructive stg:transition-colors", children: _jsx(XIcon, {}) })] }, origin))) }))] }), updateError && (_jsx("p", { className: "stg:text-destructive stg:text-[0.65rem]", role: "alert", children: getUserMessage(updateError) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:pt-1", children: [_jsxs("button", { type: "submit", disabled: isUpdating, className: cn("stg:inline-flex stg:items-center stg:gap-1.5 stg:rounded-md stg:px-3 stg:py-1.5 stg:text-xs stg:font-medium", "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-40"), children: [isUpdating && _jsx(SpinnerIcon, { size: 12 }), "Save changes"] }), _jsx("button", { type: "button", onClick: cancelEdit, disabled: isUpdating, className: cn("stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] })), mode === "view" && (_jsxs("div", { className: "stg:space-y-2 stg:pt-2", children: [_jsx("hr", { className: "stg:border-border-muted" }), confirmingRotate ? (_jsxs("div", { className: "stg:flex stg:items-center stg:justify-between stg:rounded-md stg:border stg:border-warning/30 stg:bg-warning/5 stg:px-3 stg:py-2", children: [_jsxs("p", { className: "stg:text-xs stg:text-foreground", children: ["Rotate secret? The current secret will be", _jsx("span", { className: "stg:font-medium", children: " permanently invalidated" }), "."] }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleRotateSecret, disabled: isBusy, className: cn("stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isRotating && _jsx(SpinnerIcon, { size: 12 }), "Rotate"] }), _jsx("button", { type: "button", onClick: () => {
|
|
179
|
+
}, placeholder: "https://example.com", disabled: isUpdating, className: cn("stg:min-w-0 stg:flex-1 stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-foreground", "stg:placeholder:text-muted-foreground", "stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring", "stg:disabled:pointer-events-none stg:disabled:opacity-50") }), _jsx("button", { type: "button", onClick: addOrigin, disabled: isUpdating || !originInput.trim(), className: cn("stg:shrink-0 stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs stg:font-medium", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50", "stg:transition-colors"), children: "Add" })] }), origins.length > 0 && (_jsx("div", { className: "stg:flex stg:flex-wrap stg:gap-1.5", children: origins.map((origin) => (_jsxs("span", { className: "stg:inline-flex stg:items-center stg:gap-1 stg:rounded-full stg:border stg:border-border-muted stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-mono stg:text-foreground", children: [origin, _jsx("button", { type: "button", onClick: () => removeOrigin(origin), disabled: isUpdating, "aria-label": `Remove ${origin}`, className: "stg:text-muted-foreground stg:hover:text-destructive stg:transition-colors", children: _jsx(XIcon, {}) })] }, origin))) }))] }), updateError && (_jsx("p", { className: "stg:text-destructive stg:text-[0.65rem]", role: "alert", children: getUserMessage(updateError) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:pt-1", children: [_jsxs("button", { type: "submit", disabled: isUpdating, className: cn("stg:inline-flex stg:items-center stg:gap-1.5 stg:rounded-md stg:px-3 stg:py-1.5 stg:text-xs stg:font-medium", "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-40"), children: [isUpdating && _jsx(SpinnerIcon, { size: 12 }), "Save changes"] }), _jsx("button", { type: "button", onClick: cancelEdit, disabled: isUpdating, className: cn("stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] })), mode === "view" && (_jsxs("div", { className: "stg:space-y-2 stg:pt-2", children: [_jsx("hr", { className: "stg:border-border-muted" }), confirmingRotate ? (_jsxs("div", { className: "stg:flex stg:items-center stg:justify-between stg:rounded-md stg:border stg:border-warning/30 stg:bg-warning/5 stg:px-3 stg:py-2", children: [_jsxs("p", { className: "stg:text-xs stg:text-foreground", children: ["Rotate secret? The current secret will be", _jsx("span", { className: "stg:font-medium", children: " permanently invalidated" }), ".", expired && (_jsx("span", { className: "stg:mt-1 stg:block stg:text-destructive", children: "This client has expired. Rotating does not extend it; edit its expiry instead." }))] }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleRotateSecret, disabled: isBusy, className: cn("stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isRotating && _jsx(SpinnerIcon, { size: 12 }), "Rotate"] }), _jsx("button", { type: "button", onClick: () => {
|
|
177
180
|
setConfirmingRotate(false);
|
|
178
181
|
clearRotateError();
|
|
179
182
|
}, disabled: isBusy, className: cn("stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] })) : (_jsx("button", { type: "button", onClick: () => setConfirmingRotate(true), disabled: isBusy, className: cn("stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs stg:font-medium", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50", "stg:transition-colors"), children: "Rotate secret" })), rotateError && (_jsx("p", { className: "stg:text-destructive stg:text-[0.65rem]", role: "alert", children: getUserMessage(rotateError) })), confirmingDelete ? (_jsxs("div", { className: "stg:flex stg:items-center stg:justify-between stg:rounded-md stg:border stg:border-destructive/30 stg:bg-destructive-subtle stg:px-3 stg:py-2", children: [_jsxs("div", { className: "stg:min-w-0 stg:flex-1", children: [_jsxs("p", { className: "stg:text-xs stg:text-foreground", children: ["Delete", " ", _jsx("span", { className: "stg:font-medium", children: meta?.name }), "? This action is permanent."] }), deleteError && (_jsx("p", { className: "stg:mt-0.5 stg:text-[0.65rem] stg:text-destructive", children: getUserMessage(deleteError) }))] }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleDelete, disabled: isBusy, className: cn("stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-destructive stg:text-destructive-foreground stg:hover:bg-destructive-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isDeleting && _jsx(SpinnerIcon, { size: 12 }), "Delete"] }), _jsx("button", { type: "button", onClick: () => setConfirmingDelete(false), disabled: isBusy, className: cn("stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs", "stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] })) : (_jsx("button", { type: "button", onClick: () => setConfirmingDelete(true), disabled: isBusy, className: cn("stg:rounded-md stg:px-2.5 stg:py-1.5 stg:text-xs stg:font-medium", "stg:text-destructive stg:hover:text-destructive-foreground stg:hover:bg-destructive-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50", "stg:transition-colors"), children: "Delete platform client" }))] }))] }));
|
|
@@ -184,15 +187,17 @@ export function PlatformClientDetailPanel({ platformClient, onUpdated, onSecretR
|
|
|
184
187
|
function ViewMode({ spec, createdAt, updatedAt, }) {
|
|
185
188
|
return (_jsxs("dl", { className: "stg:space-y-2.5", children: [_jsx(Field, { label: "Client ID", value: spec?.clientId, mono: true }), _jsx(Field, { label: "Secret fingerprint", value: spec?.secretFingerprint
|
|
186
189
|
? `••••${spec.secretFingerprint.slice(-4)}`
|
|
187
|
-
: undefined, mono: true }), spec?.neverExpires ? (_jsx(Field, { label: "Expiry", value: "Never expires" })) : spec?.expiresAt ? (_jsx(Field, { label: "Expires", value: formatDate(timestampDate(spec.expiresAt)) })) : null, _jsx("hr", { className: "stg:border-border-muted" }), _jsx(Field, { label: "Auto-provision accounts", value: spec?.autoProvisionAccounts ? "Enabled" : "Disabled" }), _jsx(Field, { label: "Auto-grant on organization", value: spec?.autoGrantOnOrg ? "Enabled" : "Disabled" }), spec?.autoGrantOnOrg && (_jsx(Field, { label: "Auto-grant role", value: formatIamRole(spec.autoGrantRole) })), (spec?.allowedOrigins.length ?? 0) > 0 && (_jsxs(_Fragment, { children: [_jsx("hr", { className: "stg:border-border-muted" }), _jsxs("div", { children: [_jsx("dt", { className: "stg:text-muted-foreground stg:text-[0.65rem] stg:font-medium", children: "Allowed origins" }), _jsx("dd", { className: "stg:mt-0.5 stg:flex stg:flex-wrap stg:gap-1.5", children: spec.allowedOrigins.map((origin) => (_jsx("span", { className: "stg:inline-block stg:rounded-full stg:border stg:border-border-muted stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-mono stg:text-foreground", children: origin }, origin))) })] })] })), _jsxs("div", { className: "stg:flex stg:gap-6", children: [createdAt && (_jsx(Field, { label: "Created", value: formatDate(timestampDate(createdAt)) })), updatedAt && (_jsx(Field, { label: "Updated", value: formatDate(timestampDate(updatedAt)) }))] })] }));
|
|
190
|
+
: undefined, mono: true }), spec?.neverExpires ? (_jsx(Field, { label: "Expiry", value: "Never expires" })) : spec?.expiresAt ? (isPlatformClientExpired(spec) ? (_jsx(Field, { label: "Expired", value: formatDate(timestampDate(spec.expiresAt)), tone: "destructive" })) : (_jsx(Field, { label: "Expires", value: formatDate(timestampDate(spec.expiresAt)) }))) : null, _jsx("hr", { className: "stg:border-border-muted" }), _jsx(Field, { label: "Auto-provision accounts", value: spec?.autoProvisionAccounts ? "Enabled" : "Disabled" }), _jsx(Field, { label: "Auto-grant on organization", value: spec?.autoGrantOnOrg ? "Enabled" : "Disabled" }), spec?.autoGrantOnOrg && (_jsx(Field, { label: "Auto-grant role", value: formatIamRole(spec.autoGrantRole) })), (spec?.allowedOrigins.length ?? 0) > 0 && (_jsxs(_Fragment, { children: [_jsx("hr", { className: "stg:border-border-muted" }), _jsxs("div", { children: [_jsx("dt", { className: "stg:text-muted-foreground stg:text-[0.65rem] stg:font-medium", children: "Allowed origins" }), _jsx("dd", { className: "stg:mt-0.5 stg:flex stg:flex-wrap stg:gap-1.5", children: spec.allowedOrigins.map((origin) => (_jsx("span", { className: "stg:inline-block stg:rounded-full stg:border stg:border-border-muted stg:bg-muted-subtle stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-mono stg:text-foreground", children: origin }, origin))) })] })] })), _jsxs("div", { className: "stg:flex stg:gap-6", children: [createdAt && (_jsx(Field, { label: "Created", value: formatDate(timestampDate(createdAt)) })), updatedAt && (_jsx(Field, { label: "Updated", value: formatDate(timestampDate(updatedAt)) }))] })] }));
|
|
188
191
|
}
|
|
189
192
|
// ---------------------------------------------------------------------------
|
|
190
193
|
// Shared primitives
|
|
191
194
|
// ---------------------------------------------------------------------------
|
|
192
|
-
function Field({ label, value, mono, }) {
|
|
195
|
+
function Field({ label, value, mono, tone, }) {
|
|
193
196
|
if (!value)
|
|
194
197
|
return null;
|
|
195
|
-
return (_jsxs("div", { children: [_jsx("dt", { className: "stg:text-muted-foreground stg:text-[0.65rem] stg:font-medium", children: label }), _jsx("dd", { className: cn("stg:
|
|
198
|
+
return (_jsxs("div", { children: [_jsx("dt", { className: "stg:text-muted-foreground stg:text-[0.65rem] stg:font-medium", children: label }), _jsx("dd", { className: cn("stg:mt-0.5 stg:break-all stg:text-xs", tone === "destructive"
|
|
199
|
+
? "stg:text-destructive stg:font-medium"
|
|
200
|
+
: "stg:text-foreground", mono && "stg:font-mono"), children: value })] }));
|
|
196
201
|
}
|
|
197
202
|
function ToggleSwitch({ checked, onChange, label, hint, disabled, }) {
|
|
198
203
|
return (_jsxs("div", { className: "stg:space-y-0.5", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [_jsx("button", { type: "button", role: "switch", "aria-checked": checked, onClick: () => onChange(!checked), disabled: disabled, className: cn("stg:relative stg:inline-flex stg:h-5 stg:w-9 stg:shrink-0 stg:cursor-pointer stg:rounded-full stg:border-2 stg:border-transparent stg:transition-colors", checked ? "stg:bg-primary" : "stg:bg-muted", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: _jsx("span", { className: cn("stg:pointer-events-none stg:inline-block stg:h-4 stg:w-4 stg:rounded-full stg:bg-background stg:shadow-sm stg:ring-0 stg:transition-transform", checked ? "stg:translate-x-4" : "stg:translate-x-0") }) }), _jsx("span", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: label })] }), hint && (_jsx("p", { className: "stg:pl-11 stg:text-[0.65rem] stg:text-muted-foreground", children: hint }))] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformClientDetailPanel.js","sourceRoot":"","sources":["../../src/platform-client/PlatformClientDetailPanel.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlatformClientDetailPanel.js","sourceRoot":"","sources":["../../src/platform-client/PlatformClientDetailPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformClientListPanel.d.ts","sourceRoot":"","sources":["../../src/platform-client/PlatformClientListPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"PlatformClientListPanel.d.ts","sourceRoot":"","sources":["../../src/platform-client/PlatformClientListPanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAO9F,iDAAiD;AACjD,MAAM,WAAW,4BAA4B;IAC3C,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;IAC/C,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACtD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,GAAG,EACH,MAAM,EACN,YAAY,EACZ,SAAS,GACV,EAAE,4BAA4B,2CAwE9B"}
|
|
@@ -8,6 +8,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js"
|
|
|
8
8
|
import { usePlatformClientList } from "./usePlatformClientList.js";
|
|
9
9
|
import { useDeletePlatformClient } from "./useDeletePlatformClient.js";
|
|
10
10
|
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
11
|
+
import { isPlatformClientExpired } from "./expiry.js";
|
|
11
12
|
/**
|
|
12
13
|
* Displays a list of {@link PlatformClient} resources for an
|
|
13
14
|
* organization with inline delete confirmation.
|
|
@@ -92,7 +93,7 @@ function ExpiryBadge({ spec }) {
|
|
|
92
93
|
}
|
|
93
94
|
if (spec?.expiresAt) {
|
|
94
95
|
const date = timestampDate(spec.expiresAt);
|
|
95
|
-
const isExpired =
|
|
96
|
+
const isExpired = isPlatformClientExpired(spec);
|
|
96
97
|
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx("time", { dateTime: date.toISOString(), className: cn("stg:text-[0.65rem]", isExpired ? "stg:text-destructive stg:font-medium" : "stg:text-muted-foreground") }), children: isExpired ? "Expired" : `Exp ${formatShortDate(date)}` }), _jsx(TooltipContent, { side: "top", children: `Expires ${date.toISOString()}` })] }));
|
|
97
98
|
}
|
|
98
99
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformClientListPanel.js","sourceRoot":"","sources":["../../src/platform-client/PlatformClientListPanel.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"PlatformClientListPanel.js","sourceRoot":"","sources":["../../src/platform-client/PlatformClientListPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PlatformClient } from "@stigmer/protos/ai/stigmer/iam/platformclient/v1/api_pb";
|
|
2
|
+
/** Whether the client's secret no longer mints (its expiry has passed). */
|
|
3
|
+
export declare function isPlatformClientExpired(spec: PlatformClient["spec"], now?: Date): boolean;
|
|
4
|
+
//# sourceMappingURL=expiry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expiry.d.ts","sourceRoot":"","sources":["../../src/platform-client/expiry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAE9F,2EAA2E;AAC3E,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAC5B,GAAG,GAAE,IAAiB,GACrB,OAAO,CAKT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one rule for "this PlatformClient has expired", shared by the list's
|
|
3
|
+
* expiry badge, the detail view and the rotate confirmation so the three
|
|
4
|
+
* never disagree. It is the server's rule, the one the mint refuses by: an
|
|
5
|
+
* expiry is set, `never_expires` is off, and the expiry has passed.
|
|
6
|
+
*
|
|
7
|
+
* Package-internal on purpose: every name the barrel exports is a public
|
|
8
|
+
* API contract, and no platform builder has asked for this one.
|
|
9
|
+
*/
|
|
10
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
11
|
+
/** Whether the client's secret no longer mints (its expiry has passed). */
|
|
12
|
+
export function isPlatformClientExpired(spec, now = new Date()) {
|
|
13
|
+
if (spec === undefined || spec.neverExpires || spec.expiresAt === undefined) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return timestampDate(spec.expiresAt).getTime() < now.getTime();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=expiry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expiry.js","sourceRoot":"","sources":["../../src/platform-client/expiry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB,CACrC,IAA4B,EAC5B,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersSection.d.ts","sourceRoot":"","sources":["../../src/settings/MembersSection.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"MembersSection.d.ts","sourceRoot":"","sources":["../../src/settings/MembersSection.tsx"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,4CA4D7B"}
|
|
@@ -25,6 +25,6 @@ export function MembersSection() {
|
|
|
25
25
|
const orgSlug = activeOrg?.metadata?.slug ?? "";
|
|
26
26
|
const { identityProviders } = useIdentityProviderList(idpAvailable && orgSlug ? orgSlug : null);
|
|
27
27
|
const hasJitProviders = identityProviders.some((idp) => idp.spec?.autoProvisionAccounts || idp.spec?.isSsoProvider);
|
|
28
|
-
return (_jsxs("section", { "aria-labelledby": headingId, children: [_jsx("h2", { id: headingId, className: "stg:text-foreground stg:mb-1 stg:text-sm stg:font-semibold", children: "Members" }), _jsxs("p", { className: "stg:text-muted-foreground stg:mb-4 stg:text-xs", children: ["Manage who has access to this organization and what they can do. Members can be granted owner, admin, member, or viewer roles.", !invitationsAvailable && (_jsxs(_Fragment, { children: [" ", "There are no invitations on this edition: people join this organization the first time they sign in, and you adjust their roles here."] }))] }), !orgId ? (_jsx("p", { className: "stg:text-muted-foreground stg:py-4 stg:text-center stg:text-xs", children: "Select an organization to manage members." })) : (_jsxs(_Fragment, { children: [hasJitProviders && (_jsx("div", { className: "stg:mb-3 stg:rounded-md stg:border stg:border-border-muted stg:bg-muted-faint stg:px-3 stg:py-2", children: _jsx("p", { className: "stg:text-[0.65rem] stg:text-muted-foreground", children: "This organization has identity providers with auto-provisioning enabled. Members may appear here automatically when users authenticate via federated identity." }) })), _jsx(OrgMembersPanel, { orgId: orgId })] }))] }));
|
|
28
|
+
return (_jsxs("section", { "aria-labelledby": headingId, children: [_jsx("h2", { id: headingId, className: "stg:text-foreground stg:mb-1 stg:text-sm stg:font-semibold", children: "Members" }), _jsxs("p", { className: "stg:text-muted-foreground stg:mb-4 stg:text-xs", children: ["Manage who has access to this organization and what they can do. Members can be granted owner, admin, member, or viewer roles; only an owner grants or removes owner.", !invitationsAvailable && (_jsxs(_Fragment, { children: [" ", "There are no invitations on this edition: people join this organization the first time they sign in, and you adjust their roles here."] }))] }), !orgId ? (_jsx("p", { className: "stg:text-muted-foreground stg:py-4 stg:text-center stg:text-xs", children: "Select an organization to manage members." })) : (_jsxs(_Fragment, { children: [hasJitProviders && (_jsx("div", { className: "stg:mb-3 stg:rounded-md stg:border stg:border-border-muted stg:bg-muted-faint stg:px-3 stg:py-2", children: _jsx("p", { className: "stg:text-[0.65rem] stg:text-muted-foreground", children: "This organization has identity providers with auto-provisioning enabled. Members may appear here automatically when users authenticate via federated identity." }) })), _jsx(OrgMembersPanel, { orgId: orgId })] }))] }));
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=MembersSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersSection.js","sourceRoot":"","sources":["../../src/settings/MembersSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,oBAAoB,GAAG,oBAAoB,CAC/C,eAAe,CAAC,UAAU,CAC3B,CAAC;IACF,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;IAEhD,MAAM,EAAE,iBAAiB,EAAE,GAAG,uBAAuB,CACnD,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,qBAAqB,IAAI,GAAG,CAAC,IAAI,EAAE,aAAa,CACpE,CAAC;IAEF,OAAO,CACL,sCAA0B,SAAS,aACjC,aACE,EAAE,EAAE,SAAS,EACb,SAAS,EAAC,4DAA4D,wBAGnE,EACL,aAAG,SAAS,EAAC,gDAAgD
|
|
1
|
+
{"version":3,"file":"MembersSection.js","sourceRoot":"","sources":["../../src/settings/MembersSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAE1F;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,MAAM,oBAAoB,GAAG,oBAAoB,CAC/C,eAAe,CAAC,UAAU,CAC3B,CAAC;IACF,MAAM,YAAY,GAAG,oBAAoB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;IAEhD,MAAM,EAAE,iBAAiB,EAAE,GAAG,uBAAuB,CACnD,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACzC,CAAC;IAEF,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,qBAAqB,IAAI,GAAG,CAAC,IAAI,EAAE,aAAa,CACpE,CAAC;IAEF,OAAO,CACL,sCAA0B,SAAS,aACjC,aACE,EAAE,EAAE,SAAS,EACb,SAAS,EAAC,4DAA4D,wBAGnE,EACL,aAAG,SAAS,EAAC,gDAAgD,sLAI1D,CAAC,oBAAoB,IAAI,CACxB,8BACG,GAAG,6IAIH,CACJ,IACC,EAEH,CAAC,KAAK,CAAC,CAAC,CAAC,CACR,YAAG,SAAS,EAAC,gEAAgE,0DAEzE,CACL,CAAC,CAAC,CAAC,CACF,8BACG,eAAe,IAAI,CAClB,cAAK,SAAS,EAAC,iGAAiG,YAC9G,YAAG,SAAS,EAAC,8CAA8C,+KAIvD,GACA,CACP,EACD,KAAC,eAAe,IAAC,KAAK,EAAE,KAAK,GAAI,IAChC,CACJ,IACO,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useCallback, useState } from "react";
|
|
4
4
|
import { create } from "@bufbuild/protobuf";
|
|
5
5
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
6
|
-
import
|
|
6
|
+
import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
7
7
|
import type { PrincipalAccess, RoleGrant } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/io_pb";
|
|
8
8
|
import {
|
|
9
9
|
IamPolicySpecSchema,
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
iamRoleToString,
|
|
17
17
|
} from "@stigmer/sdk";
|
|
18
18
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
|
|
19
|
+
import { useOwnerAssignment } from "./useOwnerAssignment.js";
|
|
19
20
|
import { useResourceAccess } from "./useResourceAccess.js";
|
|
20
21
|
import { usePrincipalsCount } from "./usePrincipalsCount.js";
|
|
21
22
|
import { useWhoAmI } from "./useWhoAmI.js";
|
|
@@ -52,6 +53,13 @@ export interface OrgMembersPanelProps {
|
|
|
52
53
|
* `identityAccount.whoAmI()` for self-protection (disabling
|
|
53
54
|
* destructive actions on yourself).
|
|
54
55
|
*
|
|
56
|
+
* Owner is assigned by owners: the server asks `can_assign_roles` on the
|
|
57
|
+
* organization before any change to the owner role. The panel asks the
|
|
58
|
+
* same question once, and for a caller without it offers no owner in the
|
|
59
|
+
* role picker and no change or removal on an owner's row. A role change
|
|
60
|
+
* grants the new role before it revokes the old one, so a refused step
|
|
61
|
+
* leaves the member with the role they had.
|
|
62
|
+
*
|
|
55
63
|
* All visual properties flow through `--stgm-*` design tokens.
|
|
56
64
|
*
|
|
57
65
|
* @example
|
|
@@ -69,6 +77,7 @@ export function OrgMembersPanel({
|
|
|
69
77
|
const { count, refetch: refetchCount } = usePrincipalsCount(orgId || null);
|
|
70
78
|
const { account: currentAccount } = useWhoAmI();
|
|
71
79
|
const currentAccountId = currentAccount?.metadata?.id ?? null;
|
|
80
|
+
const { canAssignOwner, unassignable } = useOwnerAssignment(orgId || null);
|
|
72
81
|
|
|
73
82
|
const [actionMemberId, setActionMemberId] = useState<string | null>(null);
|
|
74
83
|
|
|
@@ -133,6 +142,8 @@ export function OrgMembersPanel({
|
|
|
133
142
|
entry={entry}
|
|
134
143
|
orgId={orgId}
|
|
135
144
|
isSelf={memberId === currentAccountId}
|
|
145
|
+
canAssignOwner={canAssignOwner}
|
|
146
|
+
unassignable={unassignable}
|
|
136
147
|
isActioning={actionMemberId === memberId}
|
|
137
148
|
onStartAction={() => setActionMemberId(memberId)}
|
|
138
149
|
onEndAction={() => setActionMemberId(null)}
|
|
@@ -154,6 +165,8 @@ function MemberRow({
|
|
|
154
165
|
entry,
|
|
155
166
|
orgId,
|
|
156
167
|
isSelf,
|
|
168
|
+
canAssignOwner,
|
|
169
|
+
unassignable,
|
|
157
170
|
isActioning,
|
|
158
171
|
onStartAction,
|
|
159
172
|
onEndAction,
|
|
@@ -162,6 +175,10 @@ function MemberRow({
|
|
|
162
175
|
entry: PrincipalAccess;
|
|
163
176
|
orgId: string;
|
|
164
177
|
isSelf: boolean;
|
|
178
|
+
/** Whether the caller may grant, revoke or remove the owner role here. */
|
|
179
|
+
canAssignOwner: boolean;
|
|
180
|
+
/** The roles the caller may not assign, left out of the role picker. */
|
|
181
|
+
unassignable: readonly IamRole[];
|
|
165
182
|
isActioning: boolean;
|
|
166
183
|
onStartAction: () => void;
|
|
167
184
|
onEndAction: () => void;
|
|
@@ -177,6 +194,11 @@ function MemberRow({
|
|
|
177
194
|
const email = principal?.email ?? "";
|
|
178
195
|
const initial = name.charAt(0).toUpperCase();
|
|
179
196
|
const directRoles = entry.roles.filter((r) => !r.isInherited);
|
|
197
|
+
const holdsOwner = directRoles.some(
|
|
198
|
+
(grant) => grant.role?.code === iamRoleToString(IamRole.owner),
|
|
199
|
+
);
|
|
200
|
+
// Changing or removing an owner changes the owner role: an owner's act.
|
|
201
|
+
const mayAct = !isSelf && (canAssignOwner || !holdsOwner);
|
|
180
202
|
|
|
181
203
|
const startAction = (type: "remove" | "change-role") => {
|
|
182
204
|
setActionType(type);
|
|
@@ -208,6 +230,7 @@ function MemberRow({
|
|
|
208
230
|
<ChangeRoleRow
|
|
209
231
|
entry={entry}
|
|
210
232
|
orgId={orgId}
|
|
233
|
+
omitRoles={unassignable}
|
|
211
234
|
onDone={() => {
|
|
212
235
|
cancelAction();
|
|
213
236
|
onMutated();
|
|
@@ -255,7 +278,7 @@ function MemberRow({
|
|
|
255
278
|
</div>
|
|
256
279
|
|
|
257
280
|
{/* Actions */}
|
|
258
|
-
{
|
|
281
|
+
{mayAct && (
|
|
259
282
|
<div className="stg:flex stg:shrink-0 stg:items-center stg:gap-1">
|
|
260
283
|
<button
|
|
261
284
|
type="button"
|
|
@@ -398,11 +421,14 @@ function RemoveConfirmation({
|
|
|
398
421
|
function ChangeRoleRow({
|
|
399
422
|
entry,
|
|
400
423
|
orgId,
|
|
424
|
+
omitRoles,
|
|
401
425
|
onDone,
|
|
402
426
|
onCancel,
|
|
403
427
|
}: {
|
|
404
428
|
entry: PrincipalAccess;
|
|
405
429
|
orgId: string;
|
|
430
|
+
/** The roles the caller may not assign, left out of the picker. */
|
|
431
|
+
omitRoles: readonly IamRole[];
|
|
406
432
|
onDone: () => void;
|
|
407
433
|
onCancel: () => void;
|
|
408
434
|
}) {
|
|
@@ -429,7 +455,10 @@ function ChangeRoleRow({
|
|
|
429
455
|
setError(null);
|
|
430
456
|
|
|
431
457
|
try {
|
|
432
|
-
|
|
458
|
+
// Grant first, then revoke: a refusal of either step (the owner rule,
|
|
459
|
+
// an organization's last owner) leaves the member holding a role, never
|
|
460
|
+
// none, and the revoke is the one that can be retried.
|
|
461
|
+
const createSpec = create(IamPolicySpecSchema, {
|
|
433
462
|
principal: create(ApiResourceRefSchema, {
|
|
434
463
|
kind: "identity_account",
|
|
435
464
|
id: memberId,
|
|
@@ -438,11 +467,11 @@ function ChangeRoleRow({
|
|
|
438
467
|
kind: "organization",
|
|
439
468
|
id: orgId,
|
|
440
469
|
}),
|
|
441
|
-
relation:
|
|
470
|
+
relation: iamRoleToString(selectedRole),
|
|
442
471
|
});
|
|
443
|
-
await
|
|
472
|
+
await createPolicy(createSpec);
|
|
444
473
|
|
|
445
|
-
const
|
|
474
|
+
const deleteSpec = create(IamPolicySpecSchema, {
|
|
446
475
|
principal: create(ApiResourceRefSchema, {
|
|
447
476
|
kind: "identity_account",
|
|
448
477
|
id: memberId,
|
|
@@ -451,9 +480,9 @@ function ChangeRoleRow({
|
|
|
451
480
|
kind: "organization",
|
|
452
481
|
id: orgId,
|
|
453
482
|
}),
|
|
454
|
-
relation:
|
|
483
|
+
relation: currentRoleCode,
|
|
455
484
|
});
|
|
456
|
-
await
|
|
485
|
+
await deletePolicy(deleteSpec);
|
|
457
486
|
|
|
458
487
|
onDone();
|
|
459
488
|
} catch (err) {
|
|
@@ -482,6 +511,7 @@ function ChangeRoleRow({
|
|
|
482
511
|
kind={ApiResourceKind.organization}
|
|
483
512
|
selected={selectedRole ?? currentRole}
|
|
484
513
|
onSelect={setSelectedRole}
|
|
514
|
+
omitRoles={omitRoles}
|
|
485
515
|
disabled={isWorking}
|
|
486
516
|
/>
|
|
487
517
|
|
|
@@ -25,6 +25,12 @@ export interface RoleSelectorProps {
|
|
|
25
25
|
* Defaults to a person.
|
|
26
26
|
*/
|
|
27
27
|
readonly granteeKind?: GranteeKind;
|
|
28
|
+
/**
|
|
29
|
+
* Roles to leave out even though the kind grants them: the ones the
|
|
30
|
+
* caller may not assign (an organization's `owner`, for anyone who is not
|
|
31
|
+
* its owner). See {@link useRoleSelector}.
|
|
32
|
+
*/
|
|
33
|
+
readonly omitRoles?: readonly IamRole[];
|
|
28
34
|
/** Additional CSS class names for the root container. */
|
|
29
35
|
readonly className?: string;
|
|
30
36
|
}
|
|
@@ -54,6 +60,7 @@ export function RoleSelector({
|
|
|
54
60
|
defaultRole,
|
|
55
61
|
disabled = false,
|
|
56
62
|
granteeKind = "identity_account",
|
|
63
|
+
omitRoles,
|
|
57
64
|
className,
|
|
58
65
|
}: RoleSelectorProps) {
|
|
59
66
|
// Instance-scoped radio-group name (oss#593): a hardcoded name would make
|
|
@@ -66,6 +73,7 @@ export function RoleSelector({
|
|
|
66
73
|
kind,
|
|
67
74
|
defaultRole,
|
|
68
75
|
granteeKind,
|
|
76
|
+
omitRoles,
|
|
69
77
|
);
|
|
70
78
|
|
|
71
79
|
const currentSelected = controlledSelected !== undefined
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins OrgMembersPanel's reading of the owner rule (the server asks
|
|
3
|
+
* `can_assign_roles` on the organization before any change to its owner
|
|
4
|
+
* role):
|
|
5
|
+
*
|
|
6
|
+
* - a caller who may not assign owner is offered no change and no removal
|
|
7
|
+
* on an owner's row, and no owner in the role picker for anyone else;
|
|
8
|
+
* an owner is offered all of them;
|
|
9
|
+
* - a role change grants the new role before it revokes the old one, so
|
|
10
|
+
* a refused grant leaves the member with the role they had.
|
|
11
|
+
*
|
|
12
|
+
* The data hooks are stubbed: each is proven by its own tests, and the
|
|
13
|
+
* permission answer is the one question this panel adds.
|
|
14
|
+
*/
|
|
15
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
16
|
+
import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
17
|
+
import { create } from "@bufbuild/protobuf";
|
|
18
|
+
import {
|
|
19
|
+
PrincipalAccessSchema,
|
|
20
|
+
type PrincipalAccess,
|
|
21
|
+
} from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/io_pb";
|
|
22
|
+
import type { IamPolicySpec } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/spec_pb";
|
|
23
|
+
import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
24
|
+
|
|
25
|
+
const state = vi.hoisted(() => ({
|
|
26
|
+
members: [] as PrincipalAccess[],
|
|
27
|
+
canAssignOwner: false,
|
|
28
|
+
calls: [] as string[],
|
|
29
|
+
createFails: false,
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
vi.mock("../useResourceAccess.js", () => ({
|
|
33
|
+
useResourceAccess: () => ({
|
|
34
|
+
members: state.members,
|
|
35
|
+
isLoading: false,
|
|
36
|
+
error: null,
|
|
37
|
+
refetch: () => {},
|
|
38
|
+
}),
|
|
39
|
+
}));
|
|
40
|
+
vi.mock("../usePrincipalsCount.js", () => ({
|
|
41
|
+
usePrincipalsCount: () => ({ count: state.members.length, refetch: () => {} }),
|
|
42
|
+
}));
|
|
43
|
+
vi.mock("../useWhoAmI.js", () => ({
|
|
44
|
+
useWhoAmI: () => ({ account: { metadata: { id: "ida_me" } } }),
|
|
45
|
+
}));
|
|
46
|
+
vi.mock("../useOwnerAssignment.js", () => ({
|
|
47
|
+
useOwnerAssignment: () => ({
|
|
48
|
+
canAssignOwner: state.canAssignOwner,
|
|
49
|
+
unassignable: state.canAssignOwner ? [] : [IamRole.owner],
|
|
50
|
+
}),
|
|
51
|
+
}));
|
|
52
|
+
vi.mock("../useRevokeOrgAccess.js", () => ({
|
|
53
|
+
useRevokeOrgAccess: () => ({ revoke: async () => {}, isRevoking: false, error: null }),
|
|
54
|
+
}));
|
|
55
|
+
vi.mock("../useCreateIamPolicy.js", () => ({
|
|
56
|
+
useCreateIamPolicy: () => ({
|
|
57
|
+
create: async (spec: IamPolicySpec) => {
|
|
58
|
+
state.calls.push(`create ${spec.relation}`);
|
|
59
|
+
if (state.createFails) {
|
|
60
|
+
throw new Error("only an owner of the organization can grant, revoke or remove the owner role");
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
isCreating: false,
|
|
64
|
+
}),
|
|
65
|
+
}));
|
|
66
|
+
vi.mock("../useDeleteIamPolicy.js", () => ({
|
|
67
|
+
useDeleteIamPolicy: () => ({
|
|
68
|
+
remove: async (spec: IamPolicySpec) => {
|
|
69
|
+
state.calls.push(`delete ${spec.relation}`);
|
|
70
|
+
},
|
|
71
|
+
isDeleting: false,
|
|
72
|
+
}),
|
|
73
|
+
}));
|
|
74
|
+
|
|
75
|
+
import { OrgMembersPanel } from "../OrgMembersPanel";
|
|
76
|
+
|
|
77
|
+
function member(id: string, name: string, role: string): PrincipalAccess {
|
|
78
|
+
return create(PrincipalAccessSchema, {
|
|
79
|
+
principal: { kind: "identity_account", id, name },
|
|
80
|
+
roles: [{ role: { code: role, name: role } }],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
afterEach(() => {
|
|
85
|
+
cleanup();
|
|
86
|
+
state.members = [];
|
|
87
|
+
state.canAssignOwner = false;
|
|
88
|
+
state.calls = [];
|
|
89
|
+
state.createFails = false;
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe("OrgMembersPanel and the owner role", () => {
|
|
93
|
+
it("offers a caller who is no owner nothing on an owner's row, and no owner in the picker", () => {
|
|
94
|
+
state.members = [member("ida_root", "Root", "owner"), member("ida_dave", "Dave", "member")];
|
|
95
|
+
render(<OrgMembersPanel orgId="acme" />);
|
|
96
|
+
|
|
97
|
+
expect(screen.queryByRole("button", { name: "Change role for Root" })).toBeNull();
|
|
98
|
+
expect(screen.queryByRole("button", { name: "Remove Root" })).toBeNull();
|
|
99
|
+
expect(screen.getByRole("button", { name: "Remove Dave" })).toBeTruthy();
|
|
100
|
+
|
|
101
|
+
fireEvent.click(screen.getByRole("button", { name: "Change role for Dave" }));
|
|
102
|
+
expect(screen.queryByRole("radio", { name: /^Owner/ })).toBeNull();
|
|
103
|
+
expect(screen.getByRole("radio", { name: /^Admin/ })).toBeTruthy();
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("offers an owner every control on every row, owner in the picker included", () => {
|
|
107
|
+
state.canAssignOwner = true;
|
|
108
|
+
state.members = [member("ida_root", "Root", "owner"), member("ida_dave", "Dave", "member")];
|
|
109
|
+
render(<OrgMembersPanel orgId="acme" />);
|
|
110
|
+
|
|
111
|
+
expect(screen.getByRole("button", { name: "Remove Root" })).toBeTruthy();
|
|
112
|
+
fireEvent.click(screen.getByRole("button", { name: "Change role for Dave" }));
|
|
113
|
+
expect(screen.getByRole("radio", { name: /^Owner/ })).toBeTruthy();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("grants the new role before it revokes the old one", async () => {
|
|
117
|
+
state.canAssignOwner = true;
|
|
118
|
+
state.members = [member("ida_dave", "Dave", "member")];
|
|
119
|
+
render(<OrgMembersPanel orgId="acme" />);
|
|
120
|
+
|
|
121
|
+
fireEvent.click(screen.getByRole("button", { name: "Change role for Dave" }));
|
|
122
|
+
fireEvent.click(screen.getByRole("radio", { name: /^Admin/ }));
|
|
123
|
+
fireEvent.click(screen.getByRole("button", { name: "Confirm" }));
|
|
124
|
+
await waitFor(() => expect(state.calls).toEqual(["create admin", "delete member"]));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("revokes nothing when the new role is refused, so the member keeps the one they had", async () => {
|
|
128
|
+
state.canAssignOwner = true;
|
|
129
|
+
state.createFails = true;
|
|
130
|
+
state.members = [member("ida_dave", "Dave", "member")];
|
|
131
|
+
render(<OrgMembersPanel orgId="acme" />);
|
|
132
|
+
|
|
133
|
+
fireEvent.click(screen.getByRole("button", { name: "Change role for Dave" }));
|
|
134
|
+
fireEvent.click(screen.getByRole("radio", { name: /^Owner/ }));
|
|
135
|
+
fireEvent.click(screen.getByRole("button", { name: "Confirm" }));
|
|
136
|
+
await waitFor(() => expect(screen.getByRole("alert")).toBeTruthy());
|
|
137
|
+
expect(state.calls).toEqual(["create owner"]);
|
|
138
|
+
});
|
|
139
|
+
});
|