@varshylinc/team-management 0.1.0 → 0.2.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 (254) hide show
  1. package/dist/client/actions.d.ts +20 -0
  2. package/dist/client/actions.d.ts.map +1 -0
  3. package/dist/client/actions.js +23 -0
  4. package/dist/client/actions.js.map +1 -0
  5. package/dist/client/api.d.ts +74 -0
  6. package/dist/client/api.d.ts.map +1 -0
  7. package/dist/client/api.js +245 -0
  8. package/dist/client/api.js.map +1 -0
  9. package/dist/client/components/AddMemberForm.d.ts +12 -0
  10. package/dist/client/components/AddMemberForm.d.ts.map +1 -0
  11. package/dist/client/components/AddMemberForm.js +37 -0
  12. package/dist/client/components/AddMemberForm.js.map +1 -0
  13. package/dist/client/components/AuditEventRow.d.ts +7 -0
  14. package/dist/client/components/AuditEventRow.d.ts.map +1 -0
  15. package/dist/client/components/AuditEventRow.js +20 -0
  16. package/dist/client/components/AuditEventRow.js.map +1 -0
  17. package/dist/client/components/CascadePreview.d.ts +11 -0
  18. package/dist/client/components/CascadePreview.d.ts.map +1 -0
  19. package/dist/client/components/CascadePreview.js +7 -0
  20. package/dist/client/components/CascadePreview.js.map +1 -0
  21. package/dist/client/components/DangerZoneCard.d.ts +10 -0
  22. package/dist/client/components/DangerZoneCard.d.ts.map +1 -0
  23. package/dist/client/components/DangerZoneCard.js +28 -0
  24. package/dist/client/components/DangerZoneCard.js.map +1 -0
  25. package/dist/client/components/InvitationCodeDisplay.d.ts +7 -0
  26. package/dist/client/components/InvitationCodeDisplay.d.ts.map +1 -0
  27. package/dist/client/components/InvitationCodeDisplay.js +26 -0
  28. package/dist/client/components/InvitationCodeDisplay.js.map +1 -0
  29. package/dist/client/components/InviteForm.d.ts +7 -0
  30. package/dist/client/components/InviteForm.d.ts.map +1 -0
  31. package/dist/client/components/InviteForm.js +35 -0
  32. package/dist/client/components/InviteForm.js.map +1 -0
  33. package/dist/client/components/MemberRow.d.ts +10 -0
  34. package/dist/client/components/MemberRow.d.ts.map +1 -0
  35. package/dist/client/components/MemberRow.js +17 -0
  36. package/dist/client/components/MemberRow.js.map +1 -0
  37. package/dist/client/components/OrgPeopleRoster.d.ts +11 -0
  38. package/dist/client/components/OrgPeopleRoster.d.ts.map +1 -0
  39. package/dist/client/components/OrgPeopleRoster.js +13 -0
  40. package/dist/client/components/OrgPeopleRoster.js.map +1 -0
  41. package/dist/client/components/PendingTransferBanner.d.ts +10 -0
  42. package/dist/client/components/PendingTransferBanner.d.ts.map +1 -0
  43. package/dist/client/components/PendingTransferBanner.js +48 -0
  44. package/dist/client/components/PendingTransferBanner.js.map +1 -0
  45. package/dist/client/components/PlaceholderCard.d.ts +7 -0
  46. package/dist/client/components/PlaceholderCard.d.ts.map +1 -0
  47. package/dist/client/components/PlaceholderCard.js +15 -0
  48. package/dist/client/components/PlaceholderCard.js.map +1 -0
  49. package/dist/client/components/RoleBadge.d.ts +5 -0
  50. package/dist/client/components/RoleBadge.d.ts.map +1 -0
  51. package/dist/client/components/RoleBadge.js +17 -0
  52. package/dist/client/components/RoleBadge.js.map +1 -0
  53. package/dist/client/components/RoleSelect.d.ts +10 -0
  54. package/dist/client/components/RoleSelect.d.ts.map +1 -0
  55. package/dist/client/components/RoleSelect.js +12 -0
  56. package/dist/client/components/RoleSelect.js.map +1 -0
  57. package/dist/client/components/SeatUsagePanel.d.ts +6 -0
  58. package/dist/client/components/SeatUsagePanel.d.ts.map +1 -0
  59. package/dist/client/components/SeatUsagePanel.js +13 -0
  60. package/dist/client/components/SeatUsagePanel.js.map +1 -0
  61. package/dist/client/hooks/useCurrentMembership.d.ts +8 -0
  62. package/dist/client/hooks/useCurrentMembership.d.ts.map +1 -0
  63. package/dist/client/hooks/useCurrentMembership.js +20 -0
  64. package/dist/client/hooks/useCurrentMembership.js.map +1 -0
  65. package/dist/client/hooks/useMembers.d.ts +10 -0
  66. package/dist/client/hooks/useMembers.d.ts.map +1 -0
  67. package/dist/client/hooks/useMembers.js +20 -0
  68. package/dist/client/hooks/useMembers.js.map +1 -0
  69. package/dist/client/hooks/useOrgMembers.d.ts +20 -0
  70. package/dist/client/hooks/useOrgMembers.d.ts.map +1 -0
  71. package/dist/client/hooks/useOrgMembers.js +63 -0
  72. package/dist/client/hooks/useOrgMembers.js.map +1 -0
  73. package/dist/client/hooks/usePendingInvitations.d.ts +8 -0
  74. package/dist/client/hooks/usePendingInvitations.d.ts.map +1 -0
  75. package/dist/client/hooks/usePendingInvitations.js +20 -0
  76. package/dist/client/hooks/usePendingInvitations.js.map +1 -0
  77. package/dist/client/hooks/usePendingTransfer.d.ts +8 -0
  78. package/dist/client/hooks/usePendingTransfer.d.ts.map +1 -0
  79. package/dist/client/hooks/usePendingTransfer.js +23 -0
  80. package/dist/client/hooks/usePendingTransfer.js.map +1 -0
  81. package/dist/client/index.d.ts +31 -0
  82. package/dist/client/index.d.ts.map +1 -0
  83. package/{src/client/index.ts → dist/client/index.js} +6 -54
  84. package/dist/client/index.js.map +1 -0
  85. package/dist/client/pages/AuditLogPage.d.ts +6 -0
  86. package/dist/client/pages/AuditLogPage.d.ts.map +1 -0
  87. package/dist/client/pages/AuditLogPage.js +51 -0
  88. package/dist/client/pages/AuditLogPage.js.map +1 -0
  89. package/dist/client/pages/EmailChangePage.d.ts +8 -0
  90. package/dist/client/pages/EmailChangePage.d.ts.map +1 -0
  91. package/dist/client/pages/EmailChangePage.js +52 -0
  92. package/dist/client/pages/EmailChangePage.js.map +1 -0
  93. package/dist/client/pages/InvitationAcceptPage.d.ts +11 -0
  94. package/dist/client/pages/InvitationAcceptPage.d.ts.map +1 -0
  95. package/dist/client/pages/InvitationAcceptPage.js +42 -0
  96. package/dist/client/pages/InvitationAcceptPage.js.map +1 -0
  97. package/dist/client/pages/InvitationCodePage.d.ts +6 -0
  98. package/dist/client/pages/InvitationCodePage.d.ts.map +1 -0
  99. package/dist/client/pages/InvitationCodePage.js +28 -0
  100. package/dist/client/pages/InvitationCodePage.js.map +1 -0
  101. package/dist/client/pages/MembersPage.d.ts +6 -0
  102. package/dist/client/pages/MembersPage.d.ts.map +1 -0
  103. package/dist/client/pages/MembersPage.js +67 -0
  104. package/dist/client/pages/MembersPage.js.map +1 -0
  105. package/dist/client/pages/OrgPeoplePage.d.ts +14 -0
  106. package/dist/client/pages/OrgPeoplePage.d.ts.map +1 -0
  107. package/dist/client/pages/OrgPeoplePage.js +40 -0
  108. package/dist/client/pages/OrgPeoplePage.js.map +1 -0
  109. package/dist/client/pages/OrgSettingsPage.d.ts +6 -0
  110. package/dist/client/pages/OrgSettingsPage.d.ts.map +1 -0
  111. package/dist/client/pages/OrgSettingsPage.js +78 -0
  112. package/dist/client/pages/OrgSettingsPage.js.map +1 -0
  113. package/dist/client/pages/OwnershipTransferPage.d.ts +6 -0
  114. package/dist/client/pages/OwnershipTransferPage.d.ts.map +1 -0
  115. package/dist/client/pages/OwnershipTransferPage.js +68 -0
  116. package/dist/client/pages/OwnershipTransferPage.js.map +1 -0
  117. package/dist/client/pages/PasswordResetPage.d.ts +6 -0
  118. package/dist/client/pages/PasswordResetPage.d.ts.map +1 -0
  119. package/dist/client/pages/PasswordResetPage.js +34 -0
  120. package/dist/client/pages/PasswordResetPage.js.map +1 -0
  121. package/dist/client/pages/PasswordResetRequestPage.d.ts +2 -0
  122. package/dist/client/pages/PasswordResetRequestPage.d.ts.map +1 -0
  123. package/dist/client/pages/PasswordResetRequestPage.js +27 -0
  124. package/dist/client/pages/PasswordResetRequestPage.js.map +1 -0
  125. package/dist/client/pages/PlaceholderPage.d.ts +7 -0
  126. package/dist/client/pages/PlaceholderPage.d.ts.map +1 -0
  127. package/dist/client/pages/PlaceholderPage.js +16 -0
  128. package/dist/client/pages/PlaceholderPage.js.map +1 -0
  129. package/dist/client/pages/SuperAdminDashboard.d.ts +2 -0
  130. package/dist/client/pages/SuperAdminDashboard.d.ts.map +1 -0
  131. package/dist/client/pages/SuperAdminDashboard.js +123 -0
  132. package/dist/client/pages/SuperAdminDashboard.js.map +1 -0
  133. package/dist/client/theme.d.ts +12 -0
  134. package/dist/client/theme.d.ts.map +1 -0
  135. package/dist/client/theme.js +16 -0
  136. package/dist/client/theme.js.map +1 -0
  137. package/dist/client/types.d.ts +78 -0
  138. package/dist/client/types.d.ts.map +1 -0
  139. package/dist/client/types.js +2 -0
  140. package/dist/client/types.js.map +1 -0
  141. package/dist/index.d.ts +3 -1
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +2 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/server/index.d.ts +2 -0
  146. package/dist/server/index.d.ts.map +1 -1
  147. package/dist/server/index.js +1 -0
  148. package/dist/server/index.js.map +1 -1
  149. package/dist/server/org-admin.d.ts +45 -0
  150. package/dist/server/org-admin.d.ts.map +1 -0
  151. package/dist/server/org-admin.js +63 -0
  152. package/dist/server/org-admin.js.map +1 -0
  153. package/dist/server/routes/orgs.routes.d.ts.map +1 -1
  154. package/dist/server/routes/orgs.routes.js +81 -12
  155. package/dist/server/routes/orgs.routes.js.map +1 -1
  156. package/dist/server/types.d.ts +2 -0
  157. package/dist/server/types.d.ts.map +1 -1
  158. package/dist/server/types.js.map +1 -1
  159. package/package.json +18 -11
  160. package/.eslintrc.cjs +0 -18
  161. package/CHANGELOG.md +0 -159
  162. package/src/client/api.ts +0 -314
  163. package/src/client/components/AuditEventRow.tsx +0 -59
  164. package/src/client/components/CascadePreview.tsx +0 -36
  165. package/src/client/components/DangerZoneCard.tsx +0 -103
  166. package/src/client/components/InvitationCodeDisplay.tsx +0 -48
  167. package/src/client/components/InviteForm.tsx +0 -77
  168. package/src/client/components/MemberRow.tsx +0 -69
  169. package/src/client/components/PendingTransferBanner.tsx +0 -98
  170. package/src/client/components/PlaceholderCard.tsx +0 -26
  171. package/src/client/components/RoleBadge.tsx +0 -26
  172. package/src/client/components/RoleSelect.tsx +0 -35
  173. package/src/client/hooks/.gitkeep +0 -0
  174. package/src/client/hooks/useCurrentMembership.ts +0 -24
  175. package/src/client/hooks/useMembers.ts +0 -24
  176. package/src/client/hooks/usePendingInvitations.ts +0 -24
  177. package/src/client/hooks/usePendingTransfer.ts +0 -27
  178. package/src/client/pages/AuditLogPage.tsx +0 -164
  179. package/src/client/pages/EmailChangePage.tsx +0 -144
  180. package/src/client/pages/InvitationAcceptPage.tsx +0 -163
  181. package/src/client/pages/InvitationCodePage.tsx +0 -108
  182. package/src/client/pages/MembersPage.tsx +0 -290
  183. package/src/client/pages/OrgSettingsPage.tsx +0 -185
  184. package/src/client/pages/OwnershipTransferPage.tsx +0 -163
  185. package/src/client/pages/PasswordResetPage.tsx +0 -104
  186. package/src/client/pages/PasswordResetRequestPage.tsx +0 -71
  187. package/src/client/pages/PlaceholderPage.tsx +0 -20
  188. package/src/client/pages/SuperAdminDashboard.tsx +0 -401
  189. package/src/client/types.ts +0 -78
  190. package/src/index.ts +0 -24
  191. package/src/server/crypto.ts +0 -47
  192. package/src/server/index.ts +0 -167
  193. package/src/server/middleware/require-membership.ts +0 -48
  194. package/src/server/middleware/require-role.ts +0 -19
  195. package/src/server/middleware/require-super-admin.ts +0 -32
  196. package/src/server/migrations/0001_create_tm_schema_migrations.sql +0 -13
  197. package/src/server/migrations/0002_create_tm_organizations.sql +0 -14
  198. package/src/server/migrations/0003_create_tm_memberships.sql +0 -24
  199. package/src/server/migrations/0004_create_tm_invitations.sql +0 -22
  200. package/src/server/migrations/0005_create_tm_audit_events.sql +0 -17
  201. package/src/server/migrations/0006_create_tm_email_change_requests.sql +0 -13
  202. package/src/server/migrations/0007_create_tm_ownership_transfers.sql +0 -22
  203. package/src/server/migrations/0008_create_tm_super_admins.sql +0 -8
  204. package/src/server/migrations/0009_create_tm_password_reset_requests.sql +0 -9
  205. package/src/server/migrations/0010_create_tm_shared_access.sql +0 -8
  206. package/src/server/migrations/0011_seed_super_admin.sql +0 -15
  207. package/src/server/migrations/0012_create_tm_user_locks.sql +0 -7
  208. package/src/server/routes/admin.routes.ts +0 -208
  209. package/src/server/routes/audit.routes.ts +0 -93
  210. package/src/server/routes/health.routes.ts +0 -46
  211. package/src/server/routes/invitations.routes.ts +0 -252
  212. package/src/server/routes/me.routes.ts +0 -143
  213. package/src/server/routes/orgs.routes.ts +0 -428
  214. package/src/server/routes/transfer.routes.ts +0 -110
  215. package/src/server/services/.gitkeep +0 -0
  216. package/src/server/services/audit.service.ts +0 -49
  217. package/src/server/services/email-change.service.ts +0 -178
  218. package/src/server/services/invitations.service.ts +0 -316
  219. package/src/server/services/memberships.service.ts +0 -129
  220. package/src/server/services/organizations.service.ts +0 -110
  221. package/src/server/services/ownership.service.ts +0 -170
  222. package/src/server/services/password-reset.service.ts +0 -94
  223. package/src/server/services/super-admin.service.ts +0 -321
  224. package/src/server/sql/.gitkeep +0 -0
  225. package/src/server/types.ts +0 -145
  226. package/src/shared/types.ts +0 -24
  227. package/tests/integration/audit-fires.test.ts +0 -288
  228. package/tests/integration/cascade-preview.test.ts +0 -157
  229. package/tests/integration/email-change.test.ts +0 -190
  230. package/tests/integration/feature-flags.test.ts +0 -213
  231. package/tests/integration/invitations-code.test.ts +0 -218
  232. package/tests/integration/invitations-expiry.test.ts +0 -216
  233. package/tests/integration/invitations-resend.test.ts +0 -241
  234. package/tests/integration/invitations-revoke.test.ts +0 -226
  235. package/tests/integration/invitations-switch-org.test.ts +0 -156
  236. package/tests/integration/invitations-token.test.ts +0 -221
  237. package/tests/integration/migrations.test.ts +0 -119
  238. package/tests/integration/only-owner-protections.test.ts +0 -130
  239. package/tests/integration/org-lifecycle.test.ts +0 -169
  240. package/tests/integration/ownership-transfer-cancel.test.ts +0 -171
  241. package/tests/integration/ownership-transfer-expire.test.ts +0 -171
  242. package/tests/integration/ownership-transfer-happy.test.ts +0 -184
  243. package/tests/integration/ownership-transfer-locks.test.ts +0 -146
  244. package/tests/integration/password-reset.test.ts +0 -200
  245. package/tests/integration/super-admin-actions.test.ts +0 -180
  246. package/tests/integration/super-admin-restrictions.test.ts +0 -209
  247. package/tests/setup/global-setup.ts +0 -20
  248. package/tests/unit/adapter-shape.test.ts +0 -330
  249. package/tests/unit/role-permissions.test.ts +0 -236
  250. package/tests/unit/validation.test.ts +0 -304
  251. package/tsconfig.client.json +0 -13
  252. package/tsconfig.json +0 -12
  253. package/tsconfig.tsbuildinfo +0 -1
  254. package/vitest.config.ts +0 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationCodeDisplay.js","sourceRoot":"","sources":["../../../src/client/components/InvitationCodeDisplay.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAO9C,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,EAAE,YAAY,EAA8B;IACvF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,KAAK,UAAU,cAAc;QAC3B,IAAI,IAAI;YAAE,OAAO;QACjB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,gCAAgC,aAC5C,IAAI,CAAC,CAAC,CAAC,CACN,eAAM,SAAS,EAAC,kIAAkI,YAC/I,IAAI,GACA,CACR,CAAC,CAAC,CAAC,CACF,iBACE,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAC,2FAA2F,YAEpG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,GAC5B,CACV,EACA,KAAK,IAAI,CACR,eAAM,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAQ,CACtD,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface InviteFormProps {
2
+ orgId: number;
3
+ onSuccess: () => void;
4
+ }
5
+ export declare function InviteForm({ orgId, onSuccess }: InviteFormProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=InviteForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteForm.d.ts","sourceRoot":"","sources":["../../../src/client/components/InviteForm.tsx"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,2CAkE/D"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { createInvitation } from '../api.js';
4
+ import { RoleSelect } from './RoleSelect.js';
5
+ export function InviteForm({ orgId, onSuccess }) {
6
+ const [email, setEmail] = useState('');
7
+ const [role, setRole] = useState('member');
8
+ const [submitting, setSubmitting] = useState(false);
9
+ const [error, setError] = useState(null);
10
+ const [success, setSuccess] = useState(false);
11
+ async function handleSubmit(e) {
12
+ e.preventDefault();
13
+ if (!email.trim())
14
+ return;
15
+ setSubmitting(true);
16
+ setError(null);
17
+ setSuccess(false);
18
+ try {
19
+ await createInvitation(orgId, { email: email.trim(), role });
20
+ setEmail('');
21
+ setRole('member');
22
+ setSuccess(true);
23
+ onSuccess();
24
+ setTimeout(() => setSuccess(false), 3000);
25
+ }
26
+ catch (err) {
27
+ setError(err instanceof Error ? err.message : 'Failed to send invitation');
28
+ }
29
+ finally {
30
+ setSubmitting(false);
31
+ }
32
+ }
33
+ return (_jsxs("form", { onSubmit: handleSubmit, className: "bg-white border border-slate-200 rounded-lg p-4 shadow-sm", children: [_jsx("h3", { className: "text-sm font-semibold text-slate-800 mb-3", children: "Invite a team member" }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-2", children: [_jsx("input", { type: "email", placeholder: "colleague@company.com", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: submitting, className: "flex-1 rounded-md border border-slate-300 px-3 py-2 text-sm placeholder-slate-400 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:bg-slate-50" }), _jsx("div", { className: "w-full sm:w-36", children: _jsx(RoleSelect, { value: role, onChange: setRole, disabled: submitting, disabledRoles: ['owner'] }) }), _jsx("button", { type: "submit", disabled: submitting || !email.trim(), className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed transition-colors", children: submitting ? 'Sending…' : 'Send Invite' })] }), error && (_jsx("p", { className: "mt-2 text-sm text-red-600", children: error })), success && (_jsx("p", { className: "mt-2 text-sm text-green-600", children: "Invitation sent successfully!" }))] }));
34
+ }
35
+ //# sourceMappingURL=InviteForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InviteForm.js","sourceRoot":"","sources":["../../../src/client/components/InviteForm.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAO7C,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAmB;IAC9D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAU,QAAQ,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,KAAK,UAAU,YAAY,CAAC,CAAkB;QAC5C,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO;QAE1B,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,UAAU,CAAC,KAAK,CAAC,CAAC;QAElB,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,SAAS,EAAE,CAAC;YACZ,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,CACL,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,2DAA2D,aACjG,aAAI,SAAS,EAAC,2CAA2C,qCAA0B,EACnF,eAAK,SAAS,EAAC,iCAAiC,aAC9C,gBACE,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,uBAAuB,EACnC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,QACR,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,kLAAkL,GAC5L,EACF,cAAK,SAAS,EAAC,gBAAgB,YAC7B,KAAC,UAAU,IACT,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,CAAC,OAAO,CAAC,GACxB,GACE,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACrC,SAAS,EAAC,6NAA6N,YAEtO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,GACjC,IACL,EACL,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,2BAA2B,YAAE,KAAK,GAAK,CACrD,EACA,OAAO,IAAI,CACV,YAAG,SAAS,EAAC,6BAA6B,8CAAkC,CAC7E,IACI,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PublicMember, OrgRole } from '../types.js';
2
+ interface MemberRowProps {
3
+ member: PublicMember;
4
+ currentUserRole: OrgRole;
5
+ onRemove: (userId: number) => void;
6
+ onRoleChange: (userId: number, newRole: OrgRole) => void;
7
+ }
8
+ export declare function MemberRow({ member, currentUserRole, onRemove, onRoleChange }: MemberRowProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=MemberRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemberRow.d.ts","sourceRoot":"","sources":["../../../src/client/components/MemberRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAIzD,UAAU,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1D;AAcD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,cAAc,2CA2C5F"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RoleBadge } from './RoleBadge.js';
3
+ import { RoleSelect } from './RoleSelect.js';
4
+ const canManage = (currentRole) => currentRole === 'owner' || currentRole === 'admin';
5
+ function formatDate(iso) {
6
+ return new Date(iso).toLocaleDateString(undefined, {
7
+ year: 'numeric',
8
+ month: 'short',
9
+ day: 'numeric',
10
+ });
11
+ }
12
+ export function MemberRow({ member, currentUserRole, onRemove, onRoleChange }) {
13
+ const canEdit = canManage(currentUserRole) && member.role !== 'owner';
14
+ const disabledRoles = currentUserRole === 'admin' ? ['owner'] : [];
15
+ return (_jsxs("tr", { className: "border-b border-slate-100 last:border-0 hover:bg-slate-50 transition-colors", children: [_jsx("td", { className: "py-3 px-4", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-sm font-medium text-slate-900", children: member.name ?? member.email }), member.name && (_jsx("span", { className: "text-xs text-slate-500", children: member.email }))] }) }), _jsx("td", { className: "py-3 px-4", children: canEdit ? (_jsx(RoleSelect, { value: member.role, onChange: (r) => onRoleChange(member.user_id, r), disabledRoles: disabledRoles })) : (_jsx(RoleBadge, { role: member.role })) }), _jsx("td", { className: "py-3 px-4 text-sm text-slate-500 whitespace-nowrap", children: formatDate(member.joined_at) }), _jsx("td", { className: "py-3 px-4 text-right", children: canEdit && (_jsx("button", { onClick: () => onRemove(member.user_id), className: "text-sm text-red-600 hover:text-red-800 font-medium transition-colors", children: "Remove" })) })] }));
16
+ }
17
+ //# sourceMappingURL=MemberRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemberRow.js","sourceRoot":"","sources":["../../../src/client/components/MemberRow.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAS7C,MAAM,SAAS,GAAG,CAAC,WAAoB,EAAW,EAAE,CAClD,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,OAAO,CAAC;AAGrD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACjD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAkB;IAC3F,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IACtE,MAAM,aAAa,GACjB,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,OAAO,CACL,cAAI,SAAS,EAAC,6EAA6E,aACzF,aAAI,SAAS,EAAC,WAAW,YACvB,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAM,SAAS,EAAC,oCAAoC,YACjD,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GACvB,EACN,MAAM,CAAC,IAAI,IAAI,CACd,eAAM,SAAS,EAAC,wBAAwB,YAAE,MAAM,CAAC,KAAK,GAAQ,CAC/D,IACG,GACH,EACL,aAAI,SAAS,EAAC,WAAW,YACtB,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,UAAU,IACT,KAAK,EAAE,MAAM,CAAC,IAAI,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAChD,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CACjC,GACE,EACL,aAAI,SAAS,EAAC,oDAAoD,YAC/D,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,GAC1B,EACL,aAAI,SAAS,EAAC,sBAAsB,YACjC,OAAO,IAAI,CACV,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EACvC,SAAS,EAAC,uEAAuE,uBAG1E,CACV,GACE,IACF,CACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { OrgHierarchyGroup, OrgRole } from '../types.js';
3
+ interface OrgPeopleRosterProps {
4
+ hierarchy: OrgHierarchyGroup[];
5
+ canManage: boolean;
6
+ onRoleChange: (userId: number, role: OrgRole) => void;
7
+ onRemove: (userId: number) => void;
8
+ }
9
+ export declare function OrgPeopleRoster({ hierarchy, canManage, onRoleChange, onRemove, }: OrgPeopleRosterProps): React.ReactElement;
10
+ export {};
11
+ //# sourceMappingURL=OrgPeopleRoster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgPeopleRoster.d.ts","sourceRoot":"","sources":["../../../src/client/components/OrgPeopleRoster.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAgB,MAAM,aAAa,CAAC;AAK5E,UAAU,oBAAoB;IAC5B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,SAAS,EACT,YAAY,EACZ,QAAQ,GACT,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA4B3C"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RoleBadge } from './RoleBadge.js';
3
+ import { RoleSelect } from './RoleSelect.js';
4
+ import { getTeamTheme } from '../theme.js';
5
+ export function OrgPeopleRoster({ hierarchy, canManage, onRoleChange, onRemove, }) {
6
+ const theme = getTeamTheme();
7
+ return (_jsx("div", { "data-testid": "org-people-roster", className: "space-y-4", children: hierarchy.map((group) => (_jsxs("section", { "data-testid": `hierarchy-${group.role}`, children: [_jsx("h3", { className: "text-xs font-semibold uppercase tracking-wide mb-2", style: { color: theme.brass, fontFamily: theme.fontHeading }, children: group.role }), _jsx("ul", { className: "rounded-lg border overflow-hidden", style: { borderColor: theme.brass }, children: group.members.map((member) => (_jsx(OrgPeopleRow, { member: member, canManage: canManage && member.role !== 'owner', onRoleChange: onRoleChange, onRemove: onRemove }, member.user_id))) })] }, group.role))) }));
8
+ }
9
+ function OrgPeopleRow({ member, canManage, onRoleChange, onRemove, }) {
10
+ const theme = getTeamTheme();
11
+ return (_jsxs("li", { "data-testid": `member-row-${member.user_id}`, className: "flex flex-col sm:flex-row sm:items-center justify-between gap-2 px-4 py-3 border-b last:border-b-0", style: { borderColor: theme.brass, backgroundColor: '#fff' }, children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium", style: { color: theme.ink }, children: member.name ?? member.email }), member.name && (_jsx("div", { className: "text-xs", style: { color: theme.brass }, children: member.email }))] }), _jsxs("div", { className: "flex items-center gap-3", children: [canManage ? (_jsx(RoleSelect, { value: member.role, onChange: (r) => onRoleChange(member.user_id, r), disabledRoles: ['owner'] })) : (_jsx(RoleBadge, { role: member.role })), canManage && (_jsx("button", { "data-testid": `remove-member-${member.user_id}`, type: "button", onClick: () => onRemove(member.user_id), className: "text-xs font-medium", style: { color: theme.brick }, children: "Remove" }))] })] }));
12
+ }
13
+ //# sourceMappingURL=OrgPeopleRoster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgPeopleRoster.js","sourceRoot":"","sources":["../../../src/client/components/OrgPeopleRoster.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,EACT,SAAS,EACT,YAAY,EACZ,QAAQ,GACa;IACrB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,OAAO,CACL,6BAAiB,mBAAmB,EAAC,SAAS,EAAC,WAAW,YACvD,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACxB,kCAAuC,aAAa,KAAK,CAAC,IAAI,EAAE,aAC9D,aACE,SAAS,EAAC,oDAAoD,EAC9D,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,YAE3D,KAAK,CAAC,IAAI,GACR,EACL,aAAI,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,YAClF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,KAAC,YAAY,IAEX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAC/C,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,IAJb,MAAM,CAAC,OAAO,CAKnB,CACH,CAAC,GACC,KAjBO,KAAK,CAAC,IAAI,CAkBd,CACX,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EACpB,MAAM,EACN,SAAS,EACT,YAAY,EACZ,QAAQ,GAMT;IACC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,OAAO,CACL,6BACe,cAAc,MAAM,CAAC,OAAO,EAAE,EAC3C,SAAS,EAAC,oGAAoG,EAC9G,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,aAE5D,0BACE,cAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,YAC7D,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,GACxB,EACL,MAAM,CAAC,IAAI,IAAI,CACd,cAAK,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,YACnD,MAAM,CAAC,KAAK,GACT,CACP,IACG,EACN,eAAK,SAAS,EAAC,yBAAyB,aACrC,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,UAAU,IACT,KAAK,EAAE,MAAM,CAAC,IAAI,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,EAChD,aAAa,EAAE,CAAC,OAAO,CAAC,GACxB,CACH,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CACjC,EACA,SAAS,IAAI,CACZ,gCACe,iBAAiB,MAAM,CAAC,OAAO,EAAE,EAC9C,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EACvC,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,uBAGtB,CACV,IACG,IACH,CACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { OwnershipTransfer } from '../types.js';
2
+ interface PendingTransferBannerProps {
3
+ transfer: OwnershipTransfer;
4
+ currentUserId: number;
5
+ orgId: number;
6
+ onAction: () => void;
7
+ }
8
+ export declare function PendingTransferBanner({ transfer, currentUserId, orgId, onAction, }: PendingTransferBannerProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=PendingTransferBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PendingTransferBanner.d.ts","sourceRoot":"","sources":["../../../src/client/components/PendingTransferBanner.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,UAAU,0BAA0B;IAClC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAWD,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,GACT,EAAE,0BAA0B,2CAwE5B"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { acceptTransfer, cancelTransfer } from '../api.js';
4
+ function formatDate(iso) {
5
+ return new Date(iso).toLocaleString(undefined, {
6
+ month: 'short',
7
+ day: 'numeric',
8
+ hour: '2-digit',
9
+ minute: '2-digit',
10
+ });
11
+ }
12
+ export function PendingTransferBanner({ transfer, currentUserId, orgId, onAction, }) {
13
+ const [submitting, setSubmitting] = useState(false);
14
+ const [error, setError] = useState(null);
15
+ const isTarget = currentUserId === transfer.to_user_id;
16
+ async function handleAccept() {
17
+ setSubmitting(true);
18
+ setError(null);
19
+ try {
20
+ await acceptTransfer(orgId);
21
+ onAction();
22
+ }
23
+ catch (err) {
24
+ setError(err instanceof Error ? err.message : 'Action failed');
25
+ }
26
+ finally {
27
+ setSubmitting(false);
28
+ }
29
+ }
30
+ async function handleDecline() {
31
+ setSubmitting(true);
32
+ setError(null);
33
+ try {
34
+ await cancelTransfer(orgId);
35
+ onAction();
36
+ }
37
+ catch (err) {
38
+ setError(err instanceof Error ? err.message : 'Action failed');
39
+ }
40
+ finally {
41
+ setSubmitting(false);
42
+ }
43
+ }
44
+ return (_jsxs("div", { className: "rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 shadow-sm", children: [_jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center gap-3", children: [_jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "text-sm font-semibold text-amber-900", children: "Pending Ownership Transfer" }), _jsx("p", { className: "text-sm text-amber-800 mt-0.5", children: isTarget
45
+ ? `You have been invited to become the new owner of this organization.`
46
+ : `An ownership transfer has been initiated to user #${transfer.to_user_id}.` }), _jsxs("p", { className: "text-xs text-amber-700 mt-1", children: ["Expires ", formatDate(transfer.expires_at)] })] }), isTarget && (_jsxs("div", { className: "flex gap-2 shrink-0", children: [_jsx("button", { onClick: handleAccept, disabled: submitting, className: "rounded-md bg-amber-600 px-4 py-2 text-sm font-medium text-white hover:bg-amber-700 focus:outline-none focus:ring-2 focus:ring-amber-500 disabled:opacity-50 transition-colors", children: "Accept" }), _jsx("button", { onClick: handleDecline, disabled: submitting, className: "rounded-md border border-amber-400 bg-white px-4 py-2 text-sm font-medium text-amber-800 hover:bg-amber-100 focus:outline-none focus:ring-2 focus:ring-amber-400 disabled:opacity-50 transition-colors", children: "Decline" })] }))] }), error && (_jsx("p", { className: "mt-2 text-sm text-red-600", children: error }))] }));
47
+ }
48
+ //# sourceMappingURL=PendingTransferBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PendingTransferBanner.js","sourceRoot":"","sources":["../../../src/client/components/PendingTransferBanner.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAS3D,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE;QAC7C,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,GACmB;IAC3B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,aAAa,KAAK,QAAQ,CAAC,UAAU,CAAC;IAEvD,KAAK,UAAU,YAAY;QACzB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,aAAa;QAC1B,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,oEAAoE,aACjF,eAAK,SAAS,EAAC,iDAAiD,aAC9D,eAAK,SAAS,EAAC,QAAQ,aACrB,YAAG,SAAS,EAAC,sCAAsC,2CAE/C,EACJ,YAAG,SAAS,EAAC,+BAA+B,YACzC,QAAQ;oCACP,CAAC,CAAC,qEAAqE;oCACvE,CAAC,CAAC,qDAAqD,QAAQ,CAAC,UAAU,GAAG,GAC7E,EACJ,aAAG,SAAS,EAAC,6BAA6B,yBAC/B,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IACtC,IACA,EACL,QAAQ,IAAI,CACX,eAAK,SAAS,EAAC,qBAAqB,aAClC,iBACE,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,gLAAgL,uBAGnL,EACT,iBACE,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAC,wMAAwM,wBAG3M,IACL,CACP,IACG,EACL,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,2BAA2B,YAAE,KAAK,GAAK,CACrD,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ /**
3
+ * PlaceholderCard — rendered by host products while the full
4
+ * Team Management feature is in development.
5
+ */
6
+ export declare function PlaceholderCard(): React.ReactElement;
7
+ //# sourceMappingURL=PlaceholderCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaceholderCard.d.ts","sourceRoot":"","sources":["../../../src/client/components/PlaceholderCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,wBAAgB,eAAe,IAAI,KAAK,CAAC,YAAY,CAmBpD"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PlaceholderCard — rendered by host products while the full
4
+ * Team Management feature is in development.
5
+ */
6
+ export function PlaceholderCard() {
7
+ return (_jsxs("div", { style: {
8
+ border: '1px solid #e2e8f0',
9
+ borderRadius: '8px',
10
+ padding: '24px',
11
+ maxWidth: '400px',
12
+ fontFamily: 'system-ui, sans-serif',
13
+ }, children: [_jsx("div", { style: { fontSize: '24px', marginBottom: '8px' }, children: "\uD83D\uDC65" }), _jsx("h3", { style: { margin: '0 0 8px', fontSize: '16px', fontWeight: 600, color: '#1a2230' }, children: "Team Management" }), _jsx("p", { style: { margin: 0, fontSize: '14px', color: '#64748b' }, children: "Coming soon. Invite teammates, manage roles, and control access to your Varshyl products." })] }));
14
+ }
15
+ //# sourceMappingURL=PlaceholderCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaceholderCard.js","sourceRoot":"","sources":["../../../src/client/components/PlaceholderCard.tsx"],"names":[],"mappings":";AAEA;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CACL,eAAK,KAAK,EAAE;YACV,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,KAAK;YACnB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,uBAAuB;SACpC,aACC,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,6BAAU,EAC/D,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,gCAEhF,EACL,YAAG,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,0GAGvD,IACA,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { OrgRole } from '../types.js';
2
+ export declare function RoleBadge({ role }: {
3
+ role: OrgRole;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=RoleBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleBadge.d.ts","sourceRoot":"","sources":["../../../src/client/components/RoleBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgB3C,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,2CAQpD"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const roleStyles = {
3
+ owner: 'bg-purple-100 text-purple-800 border border-purple-300',
4
+ admin: 'bg-blue-100 text-blue-800 border border-blue-300',
5
+ member: 'bg-green-100 text-green-800 border border-green-300',
6
+ viewer: 'bg-slate-100 text-slate-700 border border-slate-300',
7
+ };
8
+ const roleLabels = {
9
+ owner: 'Owner',
10
+ admin: 'Admin',
11
+ member: 'Member',
12
+ viewer: 'Viewer',
13
+ };
14
+ export function RoleBadge({ role }) {
15
+ return (_jsx("span", { className: `inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${roleStyles[role]}`, children: roleLabels[role] }));
16
+ }
17
+ //# sourceMappingURL=RoleBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleBadge.js","sourceRoot":"","sources":["../../../src/client/components/RoleBadge.tsx"],"names":[],"mappings":";AAGA,MAAM,UAAU,GAA4B;IAC1C,KAAK,EAAE,wDAAwD;IAC/D,KAAK,EAAE,kDAAkD;IACzD,MAAM,EAAE,qDAAqD;IAC7D,MAAM,EAAE,qDAAqD;CAC9D,CAAC;AAEF,MAAM,UAAU,GAA4B;IAC1C,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAqB;IACnD,OAAO,CACL,eACE,SAAS,EAAE,2EAA2E,UAAU,CAAC,IAAI,CAAC,EAAE,YAEvG,UAAU,CAAC,IAAI,CAAC,GACZ,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { OrgRole } from '../types.js';
2
+ interface RoleSelectProps {
3
+ value: OrgRole;
4
+ onChange: (r: OrgRole) => void;
5
+ disabled?: boolean;
6
+ disabledRoles?: OrgRole[];
7
+ }
8
+ export declare function RoleSelect({ value, onChange, disabled, disabledRoles }: RoleSelectProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=RoleSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleSelect.d.ts","sourceRoot":"","sources":["../../../src/client/components/RoleSelect.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,UAAU,eAAe;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAkB,EAAE,EAAE,eAAe,2CAe5F"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const ALL_ROLES = ['owner', 'admin', 'member', 'viewer'];
3
+ const roleLabels = {
4
+ owner: 'Owner',
5
+ admin: 'Admin',
6
+ member: 'Member',
7
+ viewer: 'Viewer',
8
+ };
9
+ export function RoleSelect({ value, onChange, disabled, disabledRoles = [] }) {
10
+ return (_jsx("select", { value: value, onChange: (e) => onChange(e.target.value), disabled: disabled, className: "block w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 text-sm text-slate-900 shadow-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:cursor-not-allowed disabled:bg-slate-50 disabled:text-slate-400", children: ALL_ROLES.map((r) => (_jsx("option", { value: r, disabled: disabledRoles.includes(r), children: roleLabels[r] }, r))) }));
11
+ }
12
+ //# sourceMappingURL=RoleSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleSelect.js","sourceRoot":"","sources":["../../../src/client/components/RoleSelect.tsx"],"names":[],"mappings":";AAGA,MAAM,SAAS,GAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAEpE,MAAM,UAAU,GAA4B;IAC1C,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;AASF,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,EAAE,EAAmB;IAC3F,OAAO,CACL,iBACE,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAgB,CAAC,EACpD,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,0PAA0P,YAEnQ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACpB,iBAAgB,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,YAC1D,UAAU,CAAC,CAAC,CAAC,IADH,CAAC,CAEL,CACV,CAAC,GACK,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ /** PHASE 2: seat assignment — see VARSHYL_TOOLKIT_ROADMAP.md §4 */
3
+ export declare function SeatUsagePanel({ memberCount }: {
4
+ memberCount: number;
5
+ }): React.ReactElement;
6
+ //# sourceMappingURL=SeatUsagePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatUsagePanel.d.ts","sourceRoot":"","sources":["../../../src/client/components/SeatUsagePanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,EAAE,WAAW,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,CA6B3F"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getTeamTheme } from '../theme.js';
3
+ /** PHASE 2: seat assignment — see VARSHYL_TOOLKIT_ROADMAP.md §4 */
4
+ export function SeatUsagePanel({ memberCount }) {
5
+ const theme = getTeamTheme();
6
+ return (_jsxs("section", { "data-testid": "seat-usage-panel", "aria-disabled": "true", className: "rounded-lg border p-4 opacity-70 pointer-events-none select-none", style: {
7
+ backgroundColor: theme.paper,
8
+ borderColor: theme.brass,
9
+ color: theme.ink,
10
+ fontFamily: theme.fontBody,
11
+ }, children: [_jsx("h2", { className: "text-sm font-semibold mb-1", style: { fontFamily: theme.fontHeading, color: theme.brick }, children: "Seat usage" }), _jsx("p", { className: "text-sm mb-2", style: { color: theme.ink }, children: "Seats: unlimited during launch \u2014 paid seats coming soon." }), _jsxs("p", { className: "text-xs", style: { color: theme.brass }, children: [memberCount, " people on roster \u00B7 assignment controls disabled until Phase 2 billing"] })] }));
12
+ }
13
+ //# sourceMappingURL=SeatUsagePanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatUsagePanel.js","sourceRoot":"","sources":["../../../src/client/components/SeatUsagePanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAC,EAAE,WAAW,EAA2B;IACrE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,OAAO,CACL,kCACc,kBAAkB,mBAChB,MAAM,EACpB,SAAS,EAAC,kEAAkE,EAC5E,KAAK,EAAE;YACL,eAAe,EAAE,KAAK,CAAC,KAAK;YAC5B,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,KAAK,EAAE,KAAK,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK,CAAC,QAAQ;SAC3B,aAED,aACE,SAAS,EAAC,4BAA4B,EACtC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,2BAGzD,EACL,YAAG,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,8EAEnD,EACJ,aAAG,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aACjD,WAAW,mFACV,IACI,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CurrentMembership } from '../types.js';
2
+ export declare function useCurrentMembership(): {
3
+ membership: CurrentMembership | null;
4
+ loading: boolean;
5
+ error: string | null;
6
+ refresh: () => void;
7
+ };
8
+ //# sourceMappingURL=useCurrentMembership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCurrentMembership.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/useCurrentMembership.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,oBAAoB;;;;;EAmBnC"}
@@ -0,0 +1,20 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { getMyMembership } from '../api.js';
3
+ export function useCurrentMembership() {
4
+ const [membership, setMembership] = useState(null);
5
+ const [loading, setLoading] = useState(true);
6
+ const [error, setError] = useState(null);
7
+ const load = useCallback(() => {
8
+ setLoading(true);
9
+ setError(null);
10
+ getMyMembership()
11
+ .then(setMembership)
12
+ .catch((e) => setError(e.message))
13
+ .finally(() => setLoading(false));
14
+ }, []);
15
+ useEffect(() => {
16
+ load();
17
+ }, [load]);
18
+ return { membership, loading, error, refresh: load };
19
+ }
20
+ //# sourceMappingURL=useCurrentMembership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCurrentMembership.js","sourceRoot":"","sources":["../../../src/client/hooks/useCurrentMembership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,eAAe,EAAE;aACd,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aACxC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PublicMember } from '../types.js';
2
+ export declare function useMembers(orgId: number, opts?: {
3
+ includeFormer?: boolean;
4
+ }): {
5
+ members: PublicMember[];
6
+ loading: boolean;
7
+ error: string | null;
8
+ refresh: () => void;
9
+ };
10
+ //# sourceMappingURL=useMembers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMembers.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/useMembers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;EAmB3E"}
@@ -0,0 +1,20 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { listMembers } from '../api.js';
3
+ export function useMembers(orgId, opts) {
4
+ const [members, setMembers] = useState([]);
5
+ const [loading, setLoading] = useState(true);
6
+ const [error, setError] = useState(null);
7
+ const load = useCallback(() => {
8
+ setLoading(true);
9
+ setError(null);
10
+ listMembers(orgId, opts)
11
+ .then(setMembers)
12
+ .catch((e) => setError(e.message))
13
+ .finally(() => setLoading(false));
14
+ }, [orgId, opts?.includeFormer]);
15
+ useEffect(() => {
16
+ load();
17
+ }, [load]);
18
+ return { members, loading, error, refresh: load };
19
+ }
20
+ //# sourceMappingURL=useMembers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMembers.js","sourceRoot":"","sources":["../../../src/client/hooks/useMembers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAkC;IAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;aACrB,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aACxC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAEjC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { OrgRole, PublicMember, OrgHierarchyGroup } from '../types.js';
2
+ export declare function useOrgMembers(orgId: number): {
3
+ members: PublicMember[];
4
+ hierarchy: OrgHierarchyGroup[];
5
+ loading: boolean;
6
+ error: string | null;
7
+ refresh: () => Promise<void>;
8
+ addMember: (data: {
9
+ email: string;
10
+ role: OrgRole;
11
+ name?: string;
12
+ }) => Promise<PublicMember>;
13
+ updateMember: (userId: number, data: {
14
+ role?: OrgRole;
15
+ name?: string;
16
+ }) => Promise<void>;
17
+ removeMember: (userId: number) => Promise<void>;
18
+ memberCount: number;
19
+ };
20
+ //# sourceMappingURL=useOrgMembers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrgMembers.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/useOrgMembers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAI5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM;;;;;;sBAqC1B;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;2BAS7C,MAAM,QAAQ;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;2BAQ/C,MAAM;;EAkBxB"}
@@ -0,0 +1,63 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { orgAdminActions } from '../actions.js';
3
+ import { getOrgHierarchy } from '../api.js';
4
+ export function useOrgMembers(orgId) {
5
+ const [members, setMembers] = useState([]);
6
+ const [hierarchy, setHierarchy] = useState([]);
7
+ const [loading, setLoading] = useState(true);
8
+ const [error, setError] = useState(null);
9
+ const refresh = useCallback(async () => {
10
+ setLoading(true);
11
+ setError(null);
12
+ try {
13
+ const [list, tree] = await Promise.all([
14
+ orgAdminActions.listMembers(orgId),
15
+ getOrgHierarchy(orgId),
16
+ ]);
17
+ setMembers(list);
18
+ if (tree.length > 0) {
19
+ setHierarchy(tree);
20
+ }
21
+ else {
22
+ const roles = ['owner', 'admin', 'member', 'viewer'];
23
+ setHierarchy(roles
24
+ .map((role) => ({ role, members: list.filter((m) => m.role === role) }))
25
+ .filter((g) => g.members.length > 0));
26
+ }
27
+ }
28
+ catch (e) {
29
+ setError(e instanceof Error ? e.message : 'Failed to load members');
30
+ }
31
+ finally {
32
+ setLoading(false);
33
+ }
34
+ }, [orgId]);
35
+ useEffect(() => {
36
+ void refresh();
37
+ }, [refresh]);
38
+ const addMember = useCallback(async (data) => {
39
+ const created = await orgAdminActions.addMember(orgId, data);
40
+ await refresh();
41
+ return created;
42
+ }, [orgId, refresh]);
43
+ const updateMember = useCallback(async (userId, data) => {
44
+ await orgAdminActions.updateMember(orgId, userId, data);
45
+ await refresh();
46
+ }, [orgId, refresh]);
47
+ const removeMember = useCallback(async (userId) => {
48
+ await orgAdminActions.removeMember(orgId, userId);
49
+ await refresh();
50
+ }, [orgId, refresh]);
51
+ return {
52
+ members,
53
+ hierarchy,
54
+ loading,
55
+ error,
56
+ refresh,
57
+ addMember,
58
+ updateMember,
59
+ removeMember,
60
+ memberCount: members.length,
61
+ };
62
+ }
63
+ //# sourceMappingURL=useOrgMembers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrgMembers.js","sourceRoot":"","sources":["../../../src/client/hooks/useOrgMembers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiB,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAsB,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACrC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC;gBAClC,eAAe,CAAC,KAAK,CAAC;aACvB,CAAC,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAChE,YAAY,CACV,KAAK;qBACF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;qBACvE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CACvC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,OAAO,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,WAAW,CAC3B,KAAK,EAAE,IAAqD,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC,EACD,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,MAAc,EAAE,IAAuC,EAAE,EAAE;QAChE,MAAM,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,EACD,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,MAAc,EAAE,EAAE;QACvB,MAAM,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,EACD,CAAC,KAAK,EAAE,OAAO,CAAC,CACjB,CAAC;IAEF,OAAO;QACL,OAAO;QACP,SAAS;QACT,OAAO;QACP,KAAK;QACL,OAAO;QACP,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,WAAW,EAAE,OAAO,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PendingInvitation } from '../types.js';
2
+ export declare function usePendingInvitations(orgId: number): {
3
+ invitations: PendingInvitation[];
4
+ loading: boolean;
5
+ error: string | null;
6
+ refresh: () => void;
7
+ };
8
+ //# sourceMappingURL=usePendingInvitations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePendingInvitations.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/usePendingInvitations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM;;;;;EAmBlD"}
@@ -0,0 +1,20 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { listInvitations } from '../api.js';
3
+ export function usePendingInvitations(orgId) {
4
+ const [invitations, setInvitations] = useState([]);
5
+ const [loading, setLoading] = useState(true);
6
+ const [error, setError] = useState(null);
7
+ const load = useCallback(() => {
8
+ setLoading(true);
9
+ setError(null);
10
+ listInvitations(orgId)
11
+ .then(setInvitations)
12
+ .catch((e) => setError(e.message))
13
+ .finally(() => setLoading(false));
14
+ }, [orgId]);
15
+ useEffect(() => {
16
+ load();
17
+ }, [load]);
18
+ return { invitations, loading, error, refresh: load };
19
+ }
20
+ //# sourceMappingURL=usePendingInvitations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePendingInvitations.js","sourceRoot":"","sources":["../../../src/client/hooks/usePendingInvitations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAsB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,eAAe,CAAC,KAAK,CAAC;aACnB,IAAI,CAAC,cAAc,CAAC;aACpB,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aACxC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { OwnershipTransfer } from '../types.js';
2
+ export declare function usePendingTransfer(orgId: number): {
3
+ transfer: OwnershipTransfer | null;
4
+ loading: boolean;
5
+ error: string | null;
6
+ refresh: () => void;
7
+ };
8
+ //# sourceMappingURL=usePendingTransfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePendingTransfer.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/usePendingTransfer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;;;;EAsB/C"}
@@ -0,0 +1,23 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { getPendingTransfer } from '../api.js';
3
+ export function usePendingTransfer(orgId) {
4
+ const [transfer, setTransfer] = useState(null);
5
+ const [loading, setLoading] = useState(true);
6
+ const [error, setError] = useState(null);
7
+ const load = useCallback(() => {
8
+ setLoading(true);
9
+ setError(null);
10
+ getPendingTransfer(orgId)
11
+ .then(setTransfer)
12
+ .catch((e) => setError(e.message))
13
+ .finally(() => setLoading(false));
14
+ }, [orgId]);
15
+ useEffect(() => {
16
+ load();
17
+ // Poll every 30 seconds for transfer status changes
18
+ const interval = setInterval(load, 30000);
19
+ return () => clearInterval(interval);
20
+ }, [load]);
21
+ return { transfer, loading, error, refresh: load };
22
+ }
23
+ //# sourceMappingURL=usePendingTransfer.js.map