@stigmer/react 3.31.0 → 3.33.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.
Files changed (68) hide show
  1. package/api-key/ApiKeyListPanel.js +2 -4
  2. package/api-key/ApiKeyListPanel.js.map +1 -1
  3. package/iam-policy/OrgMembersPanel.d.ts +7 -0
  4. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  5. package/iam-policy/OrgMembersPanel.js +28 -12
  6. package/iam-policy/OrgMembersPanel.js.map +1 -1
  7. package/iam-policy/RoleSelector.d.ts +7 -1
  8. package/iam-policy/RoleSelector.d.ts.map +1 -1
  9. package/iam-policy/RoleSelector.js +2 -2
  10. package/iam-policy/RoleSelector.js.map +1 -1
  11. package/iam-policy/useOwnerAssignment.d.ts +23 -0
  12. package/iam-policy/useOwnerAssignment.d.ts.map +1 -0
  13. package/iam-policy/useOwnerAssignment.js +23 -0
  14. package/iam-policy/useOwnerAssignment.js.map +1 -0
  15. package/iam-policy/useRoleSelector.d.ts +6 -1
  16. package/iam-policy/useRoleSelector.d.ts.map +1 -1
  17. package/iam-policy/useRoleSelector.js +11 -3
  18. package/iam-policy/useRoleSelector.js.map +1 -1
  19. package/internal/LastUsedLabel.d.ts +20 -0
  20. package/internal/LastUsedLabel.d.ts.map +1 -0
  21. package/internal/LastUsedLabel.js +23 -0
  22. package/internal/LastUsedLabel.js.map +1 -0
  23. package/invitation/InvitationManager.d.ts.map +1 -1
  24. package/invitation/InvitationManager.js +5 -1
  25. package/invitation/InvitationManager.js.map +1 -1
  26. package/package.json +5 -5
  27. package/platform-client/PlatformClientDetailPanel.d.ts +13 -3
  28. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  29. package/platform-client/PlatformClientDetailPanel.js +28 -10
  30. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  31. package/platform-client/PlatformClientListPanel.d.ts +19 -3
  32. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  33. package/platform-client/PlatformClientListPanel.js +13 -8
  34. package/platform-client/PlatformClientListPanel.js.map +1 -1
  35. package/platform-client/copy.d.ts +14 -0
  36. package/platform-client/copy.d.ts.map +1 -0
  37. package/platform-client/copy.js +14 -0
  38. package/platform-client/copy.js.map +1 -0
  39. package/platform-client/expiry.d.ts +4 -0
  40. package/platform-client/expiry.d.ts.map +1 -0
  41. package/platform-client/expiry.js +18 -0
  42. package/platform-client/expiry.js.map +1 -0
  43. package/settings/MembersSection.d.ts.map +1 -1
  44. package/settings/MembersSection.js +1 -1
  45. package/settings/MembersSection.js.map +1 -1
  46. package/settings/PlatformClientsSection.d.ts +7 -0
  47. package/settings/PlatformClientsSection.d.ts.map +1 -1
  48. package/settings/PlatformClientsSection.js +18 -2
  49. package/settings/PlatformClientsSection.js.map +1 -1
  50. package/src/api-key/ApiKeyListPanel.tsx +2 -6
  51. package/src/iam-policy/OrgMembersPanel.tsx +38 -8
  52. package/src/iam-policy/RoleSelector.tsx +8 -0
  53. package/src/iam-policy/__tests__/OrgMembersPanel.test.tsx +139 -0
  54. package/src/iam-policy/__tests__/useOwnerAssignment.test.tsx +55 -0
  55. package/src/iam-policy/useOwnerAssignment.ts +40 -0
  56. package/src/iam-policy/useRoleSelector.ts +14 -3
  57. package/src/internal/LastUsedLabel.tsx +41 -0
  58. package/src/invitation/InvitationManager.tsx +5 -0
  59. package/src/platform-client/PlatformClientDetailPanel.tsx +69 -12
  60. package/src/platform-client/PlatformClientListPanel.tsx +57 -21
  61. package/src/platform-client/__tests__/PlatformClientDetailPanel.test.tsx +139 -4
  62. package/src/platform-client/__tests__/PlatformClientListPanel.test.tsx +140 -0
  63. package/src/platform-client/__tests__/expiry.test.ts +37 -0
  64. package/src/platform-client/copy.ts +15 -0
  65. package/src/platform-client/expiry.ts +22 -0
  66. package/src/settings/MembersSection.tsx +2 -1
  67. package/src/settings/PlatformClientsSection.tsx +23 -2
  68. package/src/settings/__tests__/PlatformClientsSection.test.tsx +92 -5
@@ -8,7 +8,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js"
8
8
  import { useApiKeyList } from "./useApiKeyList.js";
9
9
  import { useDeleteApiKey } from "./useDeleteApiKey.js";
10
10
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
11
- import { formatRelativeTime } from "../activity/format-relative-time.js";
11
+ import { LastUsedLabel } from "../internal/LastUsedLabel.js";
12
12
  /**
13
13
  * Displays a list of {@link ApiKey} resources for the authenticated
14
14
  * identity with inline delete confirmation.
@@ -83,9 +83,7 @@ function ApiKeyRow({ apiKey, now, isConfirming, onConfirmDelete, onCancelDelete,
83
83
  ? "No expiry"
84
84
  : expiresAt
85
85
  ? `Expires ${formatShortDate(timestampDate(expiresAt))}`
86
- : "No expiry" }), _jsx("span", { children: lastUsedAt
87
- ? formatRelativeTime(timestampDate(lastUsedAt), now)
88
- : "Never used" })] }), _jsx("button", { type: "button", onClick: onConfirmDelete, "aria-label": `Delete ${name}`, className: cn("stg:shrink-0 stg:rounded stg:p-1", "stg:text-muted-foreground stg:hover:text-destructive stg:hover:bg-destructive-subtle", "stg:transition-colors"), children: _jsx(TrashIcon, {}) })] }));
86
+ : "No expiry" }), _jsx(LastUsedLabel, { at: lastUsedAt, now: now })] }), _jsx("button", { type: "button", onClick: onConfirmDelete, "aria-label": `Delete ${name}`, className: cn("stg:shrink-0 stg:rounded stg:p-1", "stg:text-muted-foreground stg:hover:text-destructive stg:hover:bg-destructive-subtle", "stg:transition-colors"), children: _jsx(TrashIcon, {}) })] }));
89
87
  }
90
88
  // ---------------------------------------------------------------------------
91
89
  // Formatting helpers
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeyListPanel.js","sourceRoot":"","sources":["../../src/api-key/ApiKeyListPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeyListPanel.js","sourceRoot":"","sources":["../../src/api-key/ApiKeyListPanel.tsx"],"names":[],"mappings":"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"}
@@ -19,6 +19,13 @@ export interface OrgMembersPanelProps {
19
19
  * `identityAccount.whoAmI()` for self-protection (disabling
20
20
  * destructive actions on yourself).
21
21
  *
22
+ * Owner is assigned by owners: the server asks `can_assign_roles` on the
23
+ * organization before any change to the owner role. The panel asks the
24
+ * same question once, and for a caller without it offers no owner in the
25
+ * role picker and no change or removal on an owner's row. A role change
26
+ * grants the new role before it revokes the old one, so a refused step
27
+ * leaves the member with the role they had.
28
+ *
22
29
  * All visual properties flow through `--stgm-*` design tokens.
23
30
  *
24
31
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"OrgMembersPanel.d.ts","sourceRoot":"","sources":["../../src/iam-policy/OrgMembersPanel.tsx"],"names":[],"mappings":"AAgCA,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,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;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE,oBAAoB,2CAiFtB"}
1
+ {"version":3,"file":"OrgMembersPanel.d.ts","sourceRoot":"","sources":["../../src/iam-policy/OrgMembersPanel.tsx"],"names":[],"mappings":"AAiCA,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,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;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE,oBAAoB,2CAoFtB"}
@@ -3,10 +3,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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 { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
6
7
  import { IamPolicySpecSchema, ApiResourceRefSchema, } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/spec_pb";
7
8
  import { cn } from "@stigmer/theme";
8
9
  import { getUserMessage, iamRoleFromString, iamRoleToString, } from "@stigmer/sdk";
9
10
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
11
+ import { useOwnerAssignment } from "./useOwnerAssignment.js";
10
12
  import { useResourceAccess } from "./useResourceAccess.js";
11
13
  import { usePrincipalsCount } from "./usePrincipalsCount.js";
12
14
  import { useWhoAmI } from "./useWhoAmI.js";
@@ -28,6 +30,13 @@ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
28
30
  * `identityAccount.whoAmI()` for self-protection (disabling
29
31
  * destructive actions on yourself).
30
32
  *
33
+ * Owner is assigned by owners: the server asks `can_assign_roles` on the
34
+ * organization before any change to the owner role. The panel asks the
35
+ * same question once, and for a caller without it offers no owner in the
36
+ * role picker and no change or removal on an owner's row. A role change
37
+ * grants the new role before it revokes the old one, so a refused step
38
+ * leaves the member with the role they had.
39
+ *
31
40
  * All visual properties flow through `--stgm-*` design tokens.
32
41
  *
33
42
  * @example
@@ -41,6 +50,7 @@ export function OrgMembersPanel({ orgId, onRefetchRef, className, }) {
41
50
  const { count, refetch: refetchCount } = usePrincipalsCount(orgId || null);
42
51
  const { account: currentAccount } = useWhoAmI();
43
52
  const currentAccountId = currentAccount?.metadata?.id ?? null;
53
+ const { canAssignOwner, unassignable } = useOwnerAssignment(orgId || null);
44
54
  const [actionMemberId, setActionMemberId] = useState(null);
45
55
  const handleRefetch = useCallback(() => {
46
56
  refetch();
@@ -57,13 +67,13 @@ export function OrgMembersPanel({ orgId, onRefetchRef, className, }) {
57
67
  }
58
68
  return (_jsxs("div", { className: cn("stg:space-y-3", className), children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [_jsx("span", { className: "stg:text-sm stg:font-semibold stg:text-foreground", children: "Members" }), count > 0 && (_jsx("span", { className: "stg:inline-flex stg:items-center stg:rounded-full stg:bg-muted stg:px-2 stg:py-0.5 stg:text-[0.65rem] stg:font-medium stg:text-muted-foreground", children: count }))] }), members.length === 0 ? (_jsx("p", { className: "stg:text-muted-foreground stg:py-4 stg:text-center stg:text-xs", children: "No members found." })) : (_jsx("div", { role: "list", "aria-label": "Organization members", className: "stg:space-y-2", children: members.map((entry) => {
59
69
  const memberId = entry.principal?.id ?? "";
60
- return (_jsx(MemberRow, { entry: entry, orgId: orgId, isSelf: memberId === currentAccountId, isActioning: actionMemberId === memberId, onStartAction: () => setActionMemberId(memberId), onEndAction: () => setActionMemberId(null), onMutated: handleRefetch }, memberId));
70
+ return (_jsx(MemberRow, { entry: entry, orgId: orgId, isSelf: memberId === currentAccountId, canAssignOwner: canAssignOwner, unassignable: unassignable, isActioning: actionMemberId === memberId, onStartAction: () => setActionMemberId(memberId), onEndAction: () => setActionMemberId(null), onMutated: handleRefetch }, memberId));
61
71
  }) }))] }));
62
72
  }
63
73
  // ---------------------------------------------------------------------------
64
74
  // MemberRow (internal)
65
75
  // ---------------------------------------------------------------------------
66
- function MemberRow({ entry, orgId, isSelf, isActioning, onStartAction, onEndAction, onMutated, }) {
76
+ function MemberRow({ entry, orgId, isSelf, canAssignOwner, unassignable, isActioning, onStartAction, onEndAction, onMutated, }) {
67
77
  const [actionType, setActionType] = useState(null);
68
78
  const principal = entry.principal;
69
79
  const memberId = principal?.id ?? "";
@@ -71,6 +81,9 @@ function MemberRow({ entry, orgId, isSelf, isActioning, onStartAction, onEndActi
71
81
  const email = principal?.email ?? "";
72
82
  const initial = name.charAt(0).toUpperCase();
73
83
  const directRoles = entry.roles.filter((r) => !r.isInherited);
84
+ const holdsOwner = directRoles.some((grant) => grant.role?.code === iamRoleToString(IamRole.owner));
85
+ // Changing or removing an owner changes the owner role: an owner's act.
86
+ const mayAct = !isSelf && (canAssignOwner || !holdsOwner);
74
87
  const startAction = (type) => {
75
88
  setActionType(type);
76
89
  onStartAction();
@@ -86,12 +99,12 @@ function MemberRow({ entry, orgId, isSelf, isActioning, onStartAction, onEndActi
86
99
  }, onCancel: cancelAction }));
87
100
  }
88
101
  if (isActioning && actionType === "change-role") {
89
- return (_jsx(ChangeRoleRow, { entry: entry, orgId: orgId, onDone: () => {
102
+ return (_jsx(ChangeRoleRow, { entry: entry, orgId: orgId, omitRoles: unassignable, onDone: () => {
90
103
  cancelAction();
91
104
  onMutated();
92
105
  }, onCancel: cancelAction }));
93
106
  }
94
- return (_jsxs("div", { role: "listitem", className: "stg:flex stg:items-center stg:gap-3 stg:rounded-lg stg:border stg:border-border-muted stg:px-3 stg:py-2.5 stg:hover:border-border stg:transition-colors", children: [_jsx("div", { className: "stg:flex stg:size-8 stg:shrink-0 stg:items-center stg:justify-center stg:rounded-full stg:bg-muted stg:text-xs stg:font-medium stg:text-muted-foreground", children: initial }), _jsxs("div", { className: "stg:min-w-0 stg:flex-1", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5", children: [_jsx("span", { className: "stg:truncate stg:text-sm stg:font-medium stg:text-foreground", children: name }), isSelf && (_jsx("span", { className: "stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium stg:text-muted-foreground", children: "You" })), _jsx(ProviderBadge, { principal: principal })] }), email && email !== name && (_jsx("span", { className: "stg:block stg:truncate stg:text-xs stg:text-muted-foreground", children: email }))] }), _jsx("div", { className: "stg:hidden stg:sm:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: directRoles.map((grant) => (_jsx(RoleBadge, { grant: grant }, grant.role?.code ?? ""))) }), !isSelf && (_jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1", children: [_jsx("button", { type: "button", onClick: () => startAction("change-role"), "aria-label": `Change role for ${name}`, className: "stg:shrink-0 stg:rounded stg:p-1 stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover stg:transition-colors", children: _jsx(EditIcon, {}) }), _jsx("button", { type: "button", onClick: () => startAction("remove"), "aria-label": `Remove ${name}`, className: "stg:shrink-0 stg:rounded stg:p-1 stg:text-muted-foreground stg:hover:text-destructive stg:hover:bg-destructive-subtle stg:transition-colors", children: _jsx(TrashIcon, {}) })] }))] }));
107
+ return (_jsxs("div", { role: "listitem", className: "stg:flex stg:items-center stg:gap-3 stg:rounded-lg stg:border stg:border-border-muted stg:px-3 stg:py-2.5 stg:hover:border-border stg:transition-colors", children: [_jsx("div", { className: "stg:flex stg:size-8 stg:shrink-0 stg:items-center stg:justify-center stg:rounded-full stg:bg-muted stg:text-xs stg:font-medium stg:text-muted-foreground", children: initial }), _jsxs("div", { className: "stg:min-w-0 stg:flex-1", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5", children: [_jsx("span", { className: "stg:truncate stg:text-sm stg:font-medium stg:text-foreground", children: name }), isSelf && (_jsx("span", { className: "stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:text-[0.6rem] stg:font-medium stg:text-muted-foreground", children: "You" })), _jsx(ProviderBadge, { principal: principal })] }), email && email !== name && (_jsx("span", { className: "stg:block stg:truncate stg:text-xs stg:text-muted-foreground", children: email }))] }), _jsx("div", { className: "stg:hidden stg:sm:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: directRoles.map((grant) => (_jsx(RoleBadge, { grant: grant }, grant.role?.code ?? ""))) }), mayAct && (_jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1", children: [_jsx("button", { type: "button", onClick: () => startAction("change-role"), "aria-label": `Change role for ${name}`, className: "stg:shrink-0 stg:rounded stg:p-1 stg:text-muted-foreground stg:hover:text-foreground stg:hover:bg-accent-hover stg:transition-colors", children: _jsx(EditIcon, {}) }), _jsx("button", { type: "button", onClick: () => startAction("remove"), "aria-label": `Remove ${name}`, className: "stg:shrink-0 stg:rounded stg:p-1 stg:text-muted-foreground stg:hover:text-destructive stg:hover:bg-destructive-subtle stg:transition-colors", children: _jsx(TrashIcon, {}) })] }))] }));
95
108
  }
96
109
  // ---------------------------------------------------------------------------
97
110
  // RoleBadge (internal)
@@ -123,7 +136,7 @@ function RemoveConfirmation({ memberId, memberName, orgId, onDone, onCancel, })
123
136
  // ---------------------------------------------------------------------------
124
137
  // ChangeRoleRow (internal)
125
138
  // ---------------------------------------------------------------------------
126
- function ChangeRoleRow({ entry, orgId, onDone, onCancel, }) {
139
+ function ChangeRoleRow({ entry, orgId, omitRoles, onDone, onCancel, }) {
127
140
  const { create: createPolicy, isCreating } = useCreateIamPolicy();
128
141
  const { remove: deletePolicy, isDeleting } = useDeleteIamPolicy();
129
142
  const memberId = entry.principal?.id ?? "";
@@ -142,7 +155,10 @@ function ChangeRoleRow({ entry, orgId, onDone, onCancel, }) {
142
155
  return;
143
156
  setError(null);
144
157
  try {
145
- const deleteSpec = create(IamPolicySpecSchema, {
158
+ // Grant first, then revoke: a refusal of either step (the owner rule,
159
+ // an organization's last owner) leaves the member holding a role, never
160
+ // none, and the revoke is the one that can be retried.
161
+ const createSpec = create(IamPolicySpecSchema, {
146
162
  principal: create(ApiResourceRefSchema, {
147
163
  kind: "identity_account",
148
164
  id: memberId,
@@ -151,10 +167,10 @@ function ChangeRoleRow({ entry, orgId, onDone, onCancel, }) {
151
167
  kind: "organization",
152
168
  id: orgId,
153
169
  }),
154
- relation: currentRoleCode,
170
+ relation: iamRoleToString(selectedRole),
155
171
  });
156
- await deletePolicy(deleteSpec);
157
- const createSpec = create(IamPolicySpecSchema, {
172
+ await createPolicy(createSpec);
173
+ const deleteSpec = create(IamPolicySpecSchema, {
158
174
  principal: create(ApiResourceRefSchema, {
159
175
  kind: "identity_account",
160
176
  id: memberId,
@@ -163,9 +179,9 @@ function ChangeRoleRow({ entry, orgId, onDone, onCancel, }) {
163
179
  kind: "organization",
164
180
  id: orgId,
165
181
  }),
166
- relation: iamRoleToString(selectedRole),
182
+ relation: currentRoleCode,
167
183
  });
168
- await createPolicy(createSpec);
184
+ await deletePolicy(deleteSpec);
169
185
  onDone();
170
186
  }
171
187
  catch (err) {
@@ -180,7 +196,7 @@ function ChangeRoleRow({ entry, orgId, onDone, onCancel, }) {
180
196
  createPolicy,
181
197
  onDone,
182
198
  ]);
183
- return (_jsxs("div", { role: "listitem", className: "stg:rounded-lg stg:border stg:border-primary/30 stg:bg-primary-subtle stg:px-3 stg:py-2.5 stg:space-y-2", children: [_jsxs("p", { className: "stg:text-xs stg:text-foreground", children: ["Change role for ", _jsx("span", { className: "stg:font-medium", children: memberName })] }), _jsx(RoleSelector, { kind: ApiResourceKind.organization, selected: selectedRole ?? currentRole, onSelect: setSelectedRole, disabled: isWorking }), error && (_jsx("p", { className: "stg:text-[0.65rem] stg:text-destructive", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleConfirm, disabled: !canConfirm, 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-40"), children: [isWorking && _jsx(SpinnerIcon, { size: 12 }), isWorking ? "Changing role…" : "Confirm"] }), _jsx("button", { type: "button", onClick: onCancel, disabled: isWorking, 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" })] })] }));
199
+ return (_jsxs("div", { role: "listitem", className: "stg:rounded-lg stg:border stg:border-primary/30 stg:bg-primary-subtle stg:px-3 stg:py-2.5 stg:space-y-2", children: [_jsxs("p", { className: "stg:text-xs stg:text-foreground", children: ["Change role for ", _jsx("span", { className: "stg:font-medium", children: memberName })] }), _jsx(RoleSelector, { kind: ApiResourceKind.organization, selected: selectedRole ?? currentRole, onSelect: setSelectedRole, omitRoles: omitRoles, disabled: isWorking }), error && (_jsx("p", { className: "stg:text-[0.65rem] stg:text-destructive", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", onClick: handleConfirm, disabled: !canConfirm, 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-40"), children: [isWorking && _jsx(SpinnerIcon, { size: 12 }), isWorking ? "Changing role…" : "Confirm"] }), _jsx("button", { type: "button", onClick: onCancel, disabled: isWorking, 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" })] })] }));
184
200
  }
185
201
  // ---------------------------------------------------------------------------
186
202
  // Icons
@@ -1 +1 @@
1
- {"version":3,"file":"OrgMembersPanel.js","sourceRoot":"","sources":["../../src/iam-policy/OrgMembersPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OrgMembersPanel.js","sourceRoot":"","sources":["../../src/iam-policy/OrgMembersPanel.tsx"],"names":[],"mappings":"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"}
@@ -18,6 +18,12 @@ export interface RoleSelectorProps {
18
18
  * Defaults to a person.
19
19
  */
20
20
  readonly granteeKind?: GranteeKind;
21
+ /**
22
+ * Roles to leave out even though the kind grants them: the ones the
23
+ * caller may not assign (an organization's `owner`, for anyone who is not
24
+ * its owner). See {@link useRoleSelector}.
25
+ */
26
+ readonly omitRoles?: readonly IamRole[];
21
27
  /** Additional CSS class names for the root container. */
22
28
  readonly className?: string;
23
29
  }
@@ -39,5 +45,5 @@ export interface RoleSelectorProps {
39
45
  * />
40
46
  * ```
41
47
  */
42
- export declare function RoleSelector({ kind, onSelect, selected: controlledSelected, defaultRole, disabled, granteeKind, className, }: RoleSelectorProps): import("react/jsx-runtime").JSX.Element | null;
48
+ export declare function RoleSelector({ kind, onSelect, selected: controlledSelected, defaultRole, disabled, granteeKind, omitRoles, className, }: RoleSelectorProps): import("react/jsx-runtime").JSX.Element | null;
43
49
  //# sourceMappingURL=RoleSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoleSelector.d.ts","sourceRoot":"","sources":["../../src/iam-policy/RoleSelector.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAC3H,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EACX,QAAgB,EAChB,WAAgC,EAChC,SAAS,GACV,EAAE,iBAAiB,kDA8DnB"}
1
+ {"version":3,"file":"RoleSelector.d.ts","sourceRoot":"","sources":["../../src/iam-policy/RoleSelector.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAC3H,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kDAAkD;IAClD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EACX,QAAgB,EAChB,WAAgC,EAChC,SAAS,EACT,SAAS,GACV,EAAE,iBAAiB,kDA+DnB"}
@@ -22,13 +22,13 @@ import { useRoleSelector } from "./useRoleSelector.js";
22
22
  * />
23
23
  * ```
24
24
  */
25
- export function RoleSelector({ kind, onSelect, selected: controlledSelected, defaultRole, disabled = false, granteeKind = "identity_account", className, }) {
25
+ export function RoleSelector({ kind, onSelect, selected: controlledSelected, defaultRole, disabled = false, granteeKind = "identity_account", omitRoles, className, }) {
26
26
  // Instance-scoped radio-group name (oss#593): a hardcoded name would make
27
27
  // every mounted RoleSelector share ONE radio group — with two copies on a
28
28
  // page (e.g. zone-cached detail pages), keyboard selection escapes into
29
29
  // the other, possibly aria-hidden, copy.
30
30
  const groupName = useId();
31
- const { options, selected: internalSelected, select } = useRoleSelector(kind, defaultRole, granteeKind);
31
+ const { options, selected: internalSelected, select } = useRoleSelector(kind, defaultRole, granteeKind, omitRoles);
32
32
  const currentSelected = controlledSelected !== undefined
33
33
  ? controlledSelected
34
34
  : internalSelected;
@@ -1 +1 @@
1
- {"version":3,"file":"RoleSelector.js","sourceRoot":"","sources":["../../src/iam-policy/RoleSelector.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAuBvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EACX,QAAQ,GAAG,KAAK,EAChB,WAAW,GAAG,kBAAkB,EAChC,SAAS,GACS;IAClB,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAE1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,eAAe,CACrE,IAAI,EACJ,WAAW,EACX,WAAW,CACZ,CAAC;IAEF,MAAM,eAAe,GAAG,kBAAkB,KAAK,SAAS;QACtD,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,gBAAgB,CAAC;IAErB,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAU,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,aACtE,iBAAQ,SAAS,EAAC,iDAAiD,qBAAc,EACjF,cAAK,SAAS,EAAC,kCAAkC,YAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnB,MAAM,SAAS,GAAG,eAAe,KAAK,GAAG,CAAC,IAAI,CAAC;oBAC/C,OAAO,CACL,iBAEE,SAAS,EAAE,EAAE,CACX,iIAAiI,EACjI,SAAS;4BACP,CAAC,CAAC,2EAA2E;4BAC7E,CAAC,CAAC,gHAAgH,EACpH,QAAQ,IAAI,wCAAwC,CACrD,aAED,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EACtC,SAAS,EAAC,aAAa,GACvB,EACF,yBAAO,GAAG,CAAC,KAAK,GAAQ,EACxB,eAAM,SAAS,EAAC,0EAA0E,YACvF,GAAG,CAAC,WAAW,GACX,KArBF,GAAG,CAAC,KAAK,CAsBR,CACT,CAAC;gBACJ,CAAC,CAAC,GACE,IACG,CACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"RoleSelector.js","sourceRoot":"","sources":["../../src/iam-policy/RoleSelector.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AA6BvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,EACJ,QAAQ,EACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EACX,QAAQ,GAAG,KAAK,EAChB,WAAW,GAAG,kBAAkB,EAChC,SAAS,EACT,SAAS,GACS;IAClB,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAC;IAE1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,eAAe,CACrE,IAAI,EACJ,WAAW,EACX,WAAW,EACX,SAAS,CACV,CAAC;IAEF,MAAM,eAAe,GAAG,kBAAkB,KAAK,SAAS;QACtD,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,gBAAgB,CAAC;IAErB,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC;QACb,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,oBAAU,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,aACtE,iBAAQ,SAAS,EAAC,iDAAiD,qBAAc,EACjF,cAAK,SAAS,EAAC,kCAAkC,YAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnB,MAAM,SAAS,GAAG,eAAe,KAAK,GAAG,CAAC,IAAI,CAAC;oBAC/C,OAAO,CACL,iBAEE,SAAS,EAAE,EAAE,CACX,iIAAiI,EACjI,SAAS;4BACP,CAAC,CAAC,2EAA2E;4BAC7E,CAAC,CAAC,gHAAgH,EACpH,QAAQ,IAAI,wCAAwC,CACrD,aAED,gBACE,IAAI,EAAC,OAAO,EACZ,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EACtC,SAAS,EAAC,aAAa,GACvB,EACF,yBAAO,GAAG,CAAC,KAAK,GAAQ,EACxB,eAAM,SAAS,EAAC,0EAA0E,YACvF,GAAG,CAAC,WAAW,GACX,KArBF,GAAG,CAAC,KAAK,CAsBR,CACT,CAAC;gBACJ,CAAC,CAAC,GACE,IACG,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
2
+ /** Return value of {@link useOwnerAssignment}. */
3
+ export interface UseOwnerAssignmentReturn {
4
+ /** Whether the caller may grant, revoke or remove the owner role on the organization. */
5
+ readonly canAssignOwner: boolean;
6
+ /**
7
+ * The organization roles to leave out of a role picker for this caller:
8
+ * owner unless they may assign it. A stable list, as `RoleSelector`'s
9
+ * `omitRoles` asks.
10
+ */
11
+ readonly unassignable: readonly IamRole[];
12
+ }
13
+ /**
14
+ * The console's one reading of the owner rule: the server asks
15
+ * `can_assign_roles` on an organization before any change to its owner
16
+ * role (only its owners hold it), and every surface that offers such a
17
+ * change asks the same question here. Fails open, like every capability
18
+ * gate: the server refuses whatever this lets through.
19
+ *
20
+ * @param orgId - The organization's id, or `null` to skip the check.
21
+ */
22
+ export declare function useOwnerAssignment(orgId: string | null): UseOwnerAssignmentReturn;
23
+ //# sourceMappingURL=useOwnerAssignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOwnerAssignment.d.ts","sourceRoot":"","sources":["../../src/iam-policy/useOwnerAssignment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AAOpE,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC,yFAAyF;IACzF,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,SAAS,OAAO,EAAE,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,wBAAwB,CASjF"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
3
+ import { useCheckPermission } from "./useCheckPermission.js";
4
+ /** What a caller who is not an owner may not assign: owner is assigned by owners. */
5
+ const OWNER_ONLY = [IamRole.owner];
6
+ const NOTHING_OMITTED = [];
7
+ /**
8
+ * The console's one reading of the owner rule: the server asks
9
+ * `can_assign_roles` on an organization before any change to its owner
10
+ * role (only its owners hold it), and every surface that offers such a
11
+ * change asks the same question here. Fails open, like every capability
12
+ * gate: the server refuses whatever this lets through.
13
+ *
14
+ * @param orgId - The organization's id, or `null` to skip the check.
15
+ */
16
+ export function useOwnerAssignment(orgId) {
17
+ const { allowed } = useCheckPermission(orgId ? { kind: "organization", id: orgId } : null, "can_assign_roles");
18
+ return {
19
+ canAssignOwner: allowed,
20
+ unassignable: allowed ? NOTHING_OMITTED : OWNER_ONLY,
21
+ };
22
+ }
23
+ //# sourceMappingURL=useOwnerAssignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOwnerAssignment.js","sourceRoot":"","sources":["../../src/iam-policy/useOwnerAssignment.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,qFAAqF;AACrF,MAAM,UAAU,GAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvD,MAAM,eAAe,GAAuB,EAAE,CAAC;AAc/C;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,kBAAkB,CACpC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAClD,kBAAkB,CACnB,CAAC;IACF,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU;KACrD,CAAC;AACJ,CAAC"}
@@ -39,6 +39,11 @@ export interface UseRoleSelectorReturn {
39
39
  * @param defaultRole - Optional initial selection.
40
40
  * @param granteeKind - Who the role is for: a person (the default) may
41
41
  * hold any grantable role, a team only the kind's team roles.
42
+ * @param omit - Roles to leave out even though the kind grants them: the
43
+ * ones the caller may not assign (an organization's `owner`, for anyone
44
+ * who is not its owner). The server refuses them anyway; leaving them out
45
+ * keeps a choice off the screen that could only fail. Pass a stable list
46
+ * (a constant, or a memoized one): the options follow its identity.
42
47
  *
43
48
  * @example
44
49
  * ```tsx
@@ -51,5 +56,5 @@ export interface UseRoleSelectorReturn {
51
56
  * ));
52
57
  * ```
53
58
  */
54
- export declare function useRoleSelector(kind: ApiResourceKind | null, defaultRole?: IamRole, granteeKind?: GranteeKind): UseRoleSelectorReturn;
59
+ export declare function useRoleSelector(kind: ApiResourceKind | null, defaultRole?: IamRole, granteeKind?: GranteeKind, omit?: readonly IamRole[]): UseRoleSelectorReturn;
55
60
  //# sourceMappingURL=useRoleSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRoleSelector.d.ts","sourceRoot":"","sources":["../../src/iam-policy/useRoleSelector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACpE,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,WAAW,CAAC,EAAE,OAAO,EACrB,WAAW,GAAE,WAAgC,GAC5C,qBAAqB,CAoCvB"}
1
+ {"version":3,"file":"useRoleSelector.d.ts","sourceRoot":"","sources":["../../src/iam-policy/useRoleSelector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAC;AACpE,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAKtB,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,WAAW,CAAC,EAAE,OAAO,EACrB,WAAW,GAAE,WAAgC,EAC7C,IAAI,GAAE,SAAS,OAAO,EAAoB,GACzC,qBAAqB,CAsCvB"}
@@ -1,6 +1,8 @@
1
1
  "use client";
2
2
  import { useCallback, useMemo, useState } from "react";
3
3
  import { getGrantableRoles, getTeamGrantableRoles, iamRoleDisplayName, iamRoleDescription, iamRoleToString, } from "@stigmer/sdk";
4
+ /** The default for `omit`: one shared empty list, so the options never recompute for it. */
5
+ const NOTHING_OMITTED = [];
4
6
  /**
5
7
  * Headless hook for selecting an IAM role for a given resource kind.
6
8
  *
@@ -13,6 +15,11 @@ import { getGrantableRoles, getTeamGrantableRoles, iamRoleDisplayName, iamRoleDe
13
15
  * @param defaultRole - Optional initial selection.
14
16
  * @param granteeKind - Who the role is for: a person (the default) may
15
17
  * hold any grantable role, a team only the kind's team roles.
18
+ * @param omit - Roles to leave out even though the kind grants them: the
19
+ * ones the caller may not assign (an organization's `owner`, for anyone
20
+ * who is not its owner). The server refuses them anyway; leaving them out
21
+ * keeps a choice off the screen that could only fail. Pass a stable list
22
+ * (a constant, or a memoized one): the options follow its identity.
16
23
  *
17
24
  * @example
18
25
  * ```tsx
@@ -25,19 +32,20 @@ import { getGrantableRoles, getTeamGrantableRoles, iamRoleDisplayName, iamRoleDe
25
32
  * ));
26
33
  * ```
27
34
  */
28
- export function useRoleSelector(kind, defaultRole, granteeKind = "identity_account") {
35
+ export function useRoleSelector(kind, defaultRole, granteeKind = "identity_account", omit = NOTHING_OMITTED) {
29
36
  const [selected, setSelected] = useState(defaultRole ?? null);
30
37
  const options = useMemo(() => {
31
38
  if (kind === null)
32
39
  return [];
33
- const roles = granteeKind === "team" ? getTeamGrantableRoles(kind) : getGrantableRoles(kind);
40
+ const left = new Set(omit);
41
+ const roles = (granteeKind === "team" ? getTeamGrantableRoles(kind) : getGrantableRoles(kind)).filter((role) => !left.has(role));
34
42
  return roles.map((role) => ({
35
43
  role,
36
44
  label: iamRoleDisplayName(role),
37
45
  description: iamRoleDescription(role),
38
46
  value: iamRoleToString(role),
39
47
  }));
40
- }, [kind, granteeKind]);
48
+ }, [kind, granteeKind, omit]);
41
49
  const selectedValue = useMemo(() => (selected !== null ? iamRoleToString(selected) : ""), [selected]);
42
50
  const select = useCallback((role) => setSelected(role), []);
43
51
  const clear = useCallback(() => setSelected(null), []);
@@ -1 +1 @@
1
- {"version":3,"file":"useRoleSelector.js","sourceRoot":"","sources":["../../src/iam-policy/useRoleSelector.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAEhB,MAAM,cAAc,CAAC;AA8BtB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA4B,EAC5B,WAAqB,EACrB,cAA2B,kBAAkB;IAE7C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,WAAW,IAAI,IAAI,CACpB,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAwB,GAAG,EAAE;QAClD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GACT,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI;YACJ,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC;YAC/B,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAExB,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAC1D,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,MAAM;QACN,KAAK;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;KAC/B,CAAC,EACF,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useRoleSelector.js","sourceRoot":"","sources":["../../src/iam-policy/useRoleSelector.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAEhB,MAAM,cAAc,CAAC;AAEtB,4FAA4F;AAC5F,MAAM,eAAe,GAAuB,EAAE,CAAC;AA8B/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA4B,EAC5B,WAAqB,EACrB,cAA2B,kBAAkB,EAC7C,OAA2B,eAAe;IAE1C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,WAAW,IAAI,IAAI,CACpB,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAwB,GAAG,EAAE;QAClD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,CACZ,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAC/E,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI;YACJ,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC;YAC/B,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9B,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAC1D,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEvD,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,OAAO;QACP,QAAQ;QACR,aAAa;QACb,MAAM;QACN,KAAK;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;KAC/B,CAAC,EACF,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
2
+ /** Props for {@link LastUsedLabel}. */
3
+ export interface LastUsedLabelProps {
4
+ /** The credential's `status.last_used_at`; absent means it was never used. */
5
+ readonly at: Timestamp | undefined;
6
+ /** Frozen clock for tests; defaults to the wall clock. */
7
+ readonly now?: Date;
8
+ }
9
+ /**
10
+ * When a credential was last used, said one way on every surface that
11
+ * lists credentials (API keys, platform clients): "Used 5m" in the SDK's
12
+ * compact relative vocabulary, with the exact instant in a tooltip, or
13
+ * "Never used". The label names what the time is, because it sits beside
14
+ * other dates (created, expires) in the same row.
15
+ *
16
+ * The server records a use at most once a minute, so "Used now" means
17
+ * within the last minute or so.
18
+ */
19
+ export declare function LastUsedLabel({ at, now }: LastUsedLabelProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=LastUsedLabel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LastUsedLabel.d.ts","sourceRoot":"","sources":["../../src/internal/LastUsedLabel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;IACnC,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,kBAAkB,2CAe5D"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
4
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
5
+ import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.js";
6
+ /**
7
+ * When a credential was last used, said one way on every surface that
8
+ * lists credentials (API keys, platform clients): "Used 5m" in the SDK's
9
+ * compact relative vocabulary, with the exact instant in a tooltip, or
10
+ * "Never used". The label names what the time is, because it sits beside
11
+ * other dates (created, expires) in the same row.
12
+ *
13
+ * The server records a use at most once a minute, so "Used now" means
14
+ * within the last minute or so.
15
+ */
16
+ export function LastUsedLabel({ at, now }) {
17
+ if (at === undefined) {
18
+ return _jsx("span", { children: "Never used" });
19
+ }
20
+ const date = timestampDate(at);
21
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx("time", { dateTime: date.toISOString() }), children: `Used ${formatRelativeTime(date, now)}` }), _jsx(TooltipContent, { side: "top", children: `Last used ${date.toISOString()}` })] }));
22
+ }
23
+ //# sourceMappingURL=LastUsedLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LastUsedLabel.js","sourceRoot":"","sources":["../../src/internal/LastUsedLabel.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUvE;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAsB;IAC3D,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,wCAAuB,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,MAAM,EAAE,eAAM,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,GAAI,YAC3D,QAAQ,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GACzB,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,KAAK,YACvB,aAAa,IAAI,CAAC,WAAW,EAAE,EAAE,GACnB,IACT,CACX,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InvitationManager.d.ts","sourceRoot":"","sources":["../../src/invitation/InvitationManager.tsx"],"names":[],"mappings":"AA2BA,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,cAAsC,EACtC,SAAS,GACV,EAAE,sBAAsB,2CA2HxB"}
1
+ {"version":3,"file":"InvitationManager.d.ts","sourceRoot":"","sources":["../../src/invitation/InvitationManager.tsx"],"names":[],"mappings":"AA4BA,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAcD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,cAAsC,EACtC,SAAS,GACV,EAAE,sBAAsB,2CA2HxB"}
@@ -14,6 +14,7 @@ import { useRevokeInvitation } from "./useRevokeInvitation.js";
14
14
  import { InvitationCreatedAlert } from "./InvitationCreatedAlert.js";
15
15
  import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
16
16
  import { RoleSelector } from "../iam-policy/RoleSelector.js";
17
+ import { useOwnerAssignment } from "../iam-policy/useOwnerAssignment.js";
17
18
  import { SpinnerIcon } from "../internal/SpinnerIcon.js";
18
19
  import { useCopyFeedback } from "../internal/useCopyFeedback.js";
19
20
  function defaultBuildInviteUrl(token) {
@@ -84,6 +85,9 @@ const EXPIRY_OPTIONS = [
84
85
  ];
85
86
  function CreateInvitationForm({ org, onCreated, onCancel, }) {
86
87
  const { create, isCreating, error, clearError } = useCreateInvitation();
88
+ // An invitation grants with its creator's authority: only an owner may
89
+ // invite an owner, and the server refuses anyone else.
90
+ const { unassignable } = useOwnerAssignment(org);
87
91
  const baseId = useId();
88
92
  const [label, setLabel] = useState("");
89
93
  const [role, setRole] = useState(IamRole.viewer);
@@ -110,7 +114,7 @@ function CreateInvitationForm({ org, onCreated, onCancel, }) {
110
114
  // error state is managed by useCreateInvitation
111
115
  }
112
116
  }, [canSubmit, label, org, role, expiry, redemptionMode, create, clearError, onCreated]);
113
- return (_jsxs("form", { onSubmit: handleSubmit, className: "stg:space-y-3", children: [_jsxs("div", { className: "stg:space-y-1", children: [_jsxs("label", { htmlFor: `${baseId}-label`, className: "stg:text-xs stg:font-medium stg:text-foreground", children: ["Label", " ", _jsx("span", { className: "stg:font-normal stg:text-muted-foreground", children: "(optional)" })] }), _jsx("input", { id: `${baseId}-label`, type: "text", value: label, onChange: (e) => setLabel(e.target.value), placeholder: "e.g. Engineering team link", disabled: isCreating, autoFocus: true, maxLength: 200, 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: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(RoleSelector, { kind: ApiResourceKind.organization, selected: role, onSelect: (r) => setRole(r), disabled: isCreating }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-1.5"), children: [_jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Expires in" }), _jsx("div", { className: "stg:flex stg:flex-wrap stg:gap-2", children: EXPIRY_OPTIONS.map(({ value, label: optLabel }) => (_jsx(ExpiryRadio, { name: `${baseId}-expiry`, value: value, label: optLabel, checked: expiry === value, disabled: isCreating, onChange: setExpiry }, value))) })] }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-1.5"), children: [_jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Usage limit" }), _jsxs("div", { className: "stg:flex stg:flex-wrap stg:gap-2", children: [_jsx(RedemptionRadio, { name: `${baseId}-redemption`, value: "unlimited", label: "Unlimited", description: "Anyone with the link can join", checked: redemptionMode === "unlimited", disabled: isCreating, onChange: setRedemptionMode }), _jsx(RedemptionRadio, { name: `${baseId}-redemption`, value: "single", label: "Single use", description: "One person only", checked: redemptionMode === "single", disabled: isCreating, onChange: setRedemptionMode })] })] }), error && (_jsx("p", { className: "stg:text-destructive stg:text-[0.65rem]", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [_jsxs("button", { type: "submit", disabled: !canSubmit, 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: [isCreating && _jsx(SpinnerIcon, { size: 12 }), "Create invite link"] }), _jsx("button", { type: "button", onClick: onCancel, disabled: isCreating, className: cn("stg:rounded-md stg:px-3 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" })] })] }));
117
+ return (_jsxs("form", { onSubmit: handleSubmit, className: "stg:space-y-3", children: [_jsxs("div", { className: "stg:space-y-1", children: [_jsxs("label", { htmlFor: `${baseId}-label`, className: "stg:text-xs stg:font-medium stg:text-foreground", children: ["Label", " ", _jsx("span", { className: "stg:font-normal stg:text-muted-foreground", children: "(optional)" })] }), _jsx("input", { id: `${baseId}-label`, type: "text", value: label, onChange: (e) => setLabel(e.target.value), placeholder: "e.g. Engineering team link", disabled: isCreating, autoFocus: true, maxLength: 200, 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: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(RoleSelector, { kind: ApiResourceKind.organization, selected: role, onSelect: (r) => setRole(r), omitRoles: unassignable, disabled: isCreating }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-1.5"), children: [_jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Expires in" }), _jsx("div", { className: "stg:flex stg:flex-wrap stg:gap-2", children: EXPIRY_OPTIONS.map(({ value, label: optLabel }) => (_jsx(ExpiryRadio, { name: `${baseId}-expiry`, value: value, label: optLabel, checked: expiry === value, disabled: isCreating, onChange: setExpiry }, value))) })] }), _jsxs("fieldset", { className: cn(UNSTYLED_FIELDSET, "stg:space-y-1.5"), children: [_jsx("legend", { className: "stg:text-xs stg:font-medium stg:text-foreground", children: "Usage limit" }), _jsxs("div", { className: "stg:flex stg:flex-wrap stg:gap-2", children: [_jsx(RedemptionRadio, { name: `${baseId}-redemption`, value: "unlimited", label: "Unlimited", description: "Anyone with the link can join", checked: redemptionMode === "unlimited", disabled: isCreating, onChange: setRedemptionMode }), _jsx(RedemptionRadio, { name: `${baseId}-redemption`, value: "single", label: "Single use", description: "One person only", checked: redemptionMode === "single", disabled: isCreating, onChange: setRedemptionMode })] })] }), error && (_jsx("p", { className: "stg:text-destructive stg:text-[0.65rem]", role: "alert", children: getUserMessage(error) })), _jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [_jsxs("button", { type: "submit", disabled: !canSubmit, 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: [isCreating && _jsx(SpinnerIcon, { size: 12 }), "Create invite link"] }), _jsx("button", { type: "button", onClick: onCancel, disabled: isCreating, className: cn("stg:rounded-md stg:px-3 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" })] })] }));
114
118
  }
115
119
  // ---------------------------------------------------------------------------
116
120
  // InvitationRow (internal)