@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":"usePendingTransfer.js","sourceRoot":"","sources":["../../../src/client/hooks/usePendingTransfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG/C,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAC;IACzE,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,kBAAkB,CAAC,KAAK,CAAC;aACtB,IAAI,CAAC,WAAW,CAAC;aACjB,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;QACP,oDAAoD;QACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,KAAM,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,31 @@
1
+ export { OrgPeoplePage } from './pages/OrgPeoplePage.js';
2
+ export { MembersPage } from './pages/MembersPage.js';
3
+ export { OrgSettingsPage } from './pages/OrgSettingsPage.js';
4
+ export { InvitationAcceptPage } from './pages/InvitationAcceptPage.js';
5
+ export { InvitationCodePage } from './pages/InvitationCodePage.js';
6
+ export { AuditLogPage } from './pages/AuditLogPage.js';
7
+ export { OwnershipTransferPage } from './pages/OwnershipTransferPage.js';
8
+ export { EmailChangePage } from './pages/EmailChangePage.js';
9
+ export { PasswordResetRequestPage } from './pages/PasswordResetRequestPage.js';
10
+ export { PasswordResetPage } from './pages/PasswordResetPage.js';
11
+ export { SuperAdminDashboard } from './pages/SuperAdminDashboard.js';
12
+ export { RoleBadge } from './components/RoleBadge.js';
13
+ export { RoleSelect } from './components/RoleSelect.js';
14
+ export { MemberRow } from './components/MemberRow.js';
15
+ export { InviteForm } from './components/InviteForm.js';
16
+ export { InvitationCodeDisplay } from './components/InvitationCodeDisplay.js';
17
+ export { AuditEventRow } from './components/AuditEventRow.js';
18
+ export { DangerZoneCard } from './components/DangerZoneCard.js';
19
+ export { CascadePreview } from './components/CascadePreview.js';
20
+ export { PendingTransferBanner } from './components/PendingTransferBanner.js';
21
+ export { useOrgMembers } from './hooks/useOrgMembers.js';
22
+ export { useCurrentMembership } from './hooks/useCurrentMembership.js';
23
+ export { useMembers } from './hooks/useMembers.js';
24
+ export { usePendingInvitations } from './hooks/usePendingInvitations.js';
25
+ export { usePendingTransfer } from './hooks/usePendingTransfer.js';
26
+ export { orgAdminActions } from './actions.js';
27
+ export { getTeamTheme, setTeamTheme, DEFAULT_TEAM_THEME } from './theme.js';
28
+ export type { TeamManagementTheme } from './theme.js';
29
+ export { setTmApiBase, getOrg, updateOrg, deleteOrg, listMembers, addOrgMember, updateOrgMember, getOrgHierarchy, removeMember, changeMemberRole, listInvitations, createInvitation, revokeInvitation, resendInvitation, getInvitationCode, acceptInvitationByToken, acceptInvitationByCode, getMyMembership, requestEmailChange, verifyEmailChange, cancelEmailChange, requestPasswordReset, resetPassword, getPendingTransfer, initiateTransfer, acceptTransfer, cancelTransfer, getAuditLog, adminListOrgs, adminGetOrg, adminRestoreOrg, adminAppointOwner, adminHardDeleteOrg, adminAddMember, adminRemoveMember, adminLockUser, adminUnlockUser, adminResetPassword, } from './api.js';
30
+ export type { OrgRole, TransferStatus, PublicOrg, PublicMember, PendingInvitation, AuditEvent, OwnershipTransfer, CurrentMembership, SuperAdminOrgSummary, ApiError, OrgHierarchyGroup, } from './types.js';
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG9E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EACL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,YAAY,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,EACR,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
+ export { OrgPeoplePage } from './pages/OrgPeoplePage.js';
1
2
  export { MembersPage } from './pages/MembersPage.js';
2
3
  export { OrgSettingsPage } from './pages/OrgSettingsPage.js';
3
4
  export { InvitationAcceptPage } from './pages/InvitationAcceptPage.js';
@@ -8,7 +9,6 @@ export { EmailChangePage } from './pages/EmailChangePage.js';
8
9
  export { PasswordResetRequestPage } from './pages/PasswordResetRequestPage.js';
9
10
  export { PasswordResetPage } from './pages/PasswordResetPage.js';
10
11
  export { SuperAdminDashboard } from './pages/SuperAdminDashboard.js';
11
-
12
12
  // Components
13
13
  export { RoleBadge } from './components/RoleBadge.js';
14
14
  export { RoleSelect } from './components/RoleSelect.js';
@@ -19,62 +19,14 @@ export { AuditEventRow } from './components/AuditEventRow.js';
19
19
  export { DangerZoneCard } from './components/DangerZoneCard.js';
20
20
  export { CascadePreview } from './components/CascadePreview.js';
21
21
  export { PendingTransferBanner } from './components/PendingTransferBanner.js';
22
-
23
22
  // Hooks
23
+ export { useOrgMembers } from './hooks/useOrgMembers.js';
24
24
  export { useCurrentMembership } from './hooks/useCurrentMembership.js';
25
25
  export { useMembers } from './hooks/useMembers.js';
26
26
  export { usePendingInvitations } from './hooks/usePendingInvitations.js';
27
27
  export { usePendingTransfer } from './hooks/usePendingTransfer.js';
28
-
28
+ export { orgAdminActions } from './actions.js';
29
+ export { getTeamTheme, setTeamTheme, DEFAULT_TEAM_THEME } from './theme.js';
29
30
  // API
30
- export {
31
- setTmApiBase,
32
- getOrg,
33
- updateOrg,
34
- deleteOrg,
35
- listMembers,
36
- removeMember,
37
- changeMemberRole,
38
- listInvitations,
39
- createInvitation,
40
- revokeInvitation,
41
- resendInvitation,
42
- getInvitationCode,
43
- acceptInvitationByToken,
44
- acceptInvitationByCode,
45
- getMyMembership,
46
- requestEmailChange,
47
- verifyEmailChange,
48
- cancelEmailChange,
49
- requestPasswordReset,
50
- resetPassword,
51
- getPendingTransfer,
52
- initiateTransfer,
53
- acceptTransfer,
54
- cancelTransfer,
55
- getAuditLog,
56
- adminListOrgs,
57
- adminGetOrg,
58
- adminRestoreOrg,
59
- adminAppointOwner,
60
- adminHardDeleteOrg,
61
- adminAddMember,
62
- adminRemoveMember,
63
- adminLockUser,
64
- adminUnlockUser,
65
- adminResetPassword,
66
- } from './api.js';
67
-
68
- // Types
69
- export type {
70
- OrgRole,
71
- TransferStatus,
72
- PublicOrg,
73
- PublicMember,
74
- PendingInvitation,
75
- AuditEvent,
76
- OwnershipTransfer,
77
- CurrentMembership,
78
- SuperAdminOrgSummary,
79
- ApiError,
80
- } from './types.js';
31
+ export { setTmApiBase, getOrg, updateOrg, deleteOrg, listMembers, addOrgMember, updateOrgMember, getOrgHierarchy, removeMember, changeMemberRole, listInvitations, createInvitation, revokeInvitation, resendInvitation, getInvitationCode, acceptInvitationByToken, acceptInvitationByCode, getMyMembership, requestEmailChange, verifyEmailChange, cancelEmailChange, requestPasswordReset, resetPassword, getPendingTransfer, initiateTransfer, acceptTransfer, cancelTransfer, getAuditLog, adminListOrgs, adminGetOrg, adminRestoreOrg, adminAppointOwner, adminHardDeleteOrg, adminAddMember, adminRemoveMember, adminLockUser, adminUnlockUser, adminResetPassword, } from './api.js';
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG5E,MAAM;AACN,OAAO,EACL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,kBAAkB,GACnB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface AuditLogPageProps {
2
+ orgId: number;
3
+ }
4
+ export declare function AuditLogPage({ orgId }: AuditLogPageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=AuditLogPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/AuditLogPage.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,2CAuJxD"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useState } from 'react';
3
+ import { useCurrentMembership } from '../hooks/useCurrentMembership.js';
4
+ import { AuditEventRow } from '../components/AuditEventRow.js';
5
+ import { getAuditLog } from '../api.js';
6
+ const PAGE_SIZE = 25;
7
+ export function AuditLogPage({ orgId }) {
8
+ const { membership } = useCurrentMembership();
9
+ const [events, setEvents] = useState([]);
10
+ const [total, setTotal] = useState(0);
11
+ const [page, setPage] = useState(1);
12
+ const [loading, setLoading] = useState(false);
13
+ const [error, setError] = useState(null);
14
+ const [actionFilter, setActionFilter] = useState('');
15
+ const [initialized, setInitialized] = useState(false);
16
+ const role = membership?.role;
17
+ const canView = role === 'owner' || role === 'admin';
18
+ async function load(p, action) {
19
+ setLoading(true);
20
+ setError(null);
21
+ try {
22
+ const result = await getAuditLog(orgId, { page: p, limit: PAGE_SIZE, action: action || undefined });
23
+ setEvents(result.events);
24
+ setTotal(result.total);
25
+ setPage(result.page);
26
+ }
27
+ catch (err) {
28
+ setError(err instanceof Error ? err.message : 'Failed to load audit log');
29
+ }
30
+ finally {
31
+ setLoading(false);
32
+ setInitialized(true);
33
+ }
34
+ }
35
+ // Load on first render after membership check
36
+ React.useEffect(() => {
37
+ if (canView && !initialized) {
38
+ load(1, actionFilter);
39
+ }
40
+ }, [canView]);
41
+ async function handleFilter(e) {
42
+ e.preventDefault();
43
+ await load(1, actionFilter);
44
+ }
45
+ const totalPages = Math.ceil(total / PAGE_SIZE);
46
+ if (!canView) {
47
+ return (_jsx("div", { className: "max-w-4xl mx-auto px-4 py-8", children: _jsx("div", { className: "rounded-md bg-amber-50 border border-amber-200 px-4 py-3 text-sm text-amber-700", children: "You do not have permission to view the audit log." }) }));
48
+ }
49
+ return (_jsxs("div", { className: "max-w-5xl mx-auto px-4 py-8", children: [_jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center gap-4 mb-6", children: [_jsx("h1", { className: "text-2xl font-bold text-slate-900 flex-1", children: "Audit Log" }), _jsxs("form", { onSubmit: handleFilter, className: "flex gap-2", children: [_jsx("input", { type: "text", value: actionFilter, onChange: (e) => setActionFilter(e.target.value), placeholder: "Filter by action\u2026", className: "rounded-md border border-slate-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500" }), _jsx("button", { type: "submit", className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 transition-colors", children: "Filter" }), actionFilter && (_jsx("button", { type: "button", onClick: () => { setActionFilter(''); load(1, ''); }, className: "rounded-md border border-slate-300 px-3 py-2 text-sm text-slate-600 hover:bg-slate-50 transition-colors", children: "Clear" }))] })] }), error && (_jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700 mb-4", children: error })), loading ? (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "overflow-hidden rounded-lg border border-slate-200 shadow-sm", children: _jsxs("table", { className: "w-full text-left", children: [_jsx("thead", { className: "bg-slate-50 border-b border-slate-200", children: _jsxs("tr", { children: [_jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Actor" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Action" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Target" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "When" })] }) }), _jsxs("tbody", { className: "bg-white divide-y divide-slate-100", children: [events.map((event) => (_jsx(AuditEventRow, { event: event }, event.id))), events.length === 0 && initialized && (_jsx("tr", { children: _jsx("td", { colSpan: 4, className: "py-10 text-center text-sm text-slate-500", children: "No audit events found." }) }))] })] }) }), totalPages > 1 && (_jsxs("div", { className: "mt-4 flex items-center justify-between", children: [_jsxs("p", { className: "text-sm text-slate-600", children: ["Showing ", (page - 1) * PAGE_SIZE + 1, "\u2013", Math.min(page * PAGE_SIZE, total), " of ", total, " events"] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: () => load(page - 1, actionFilter), disabled: page <= 1 || loading, className: "rounded-md border border-slate-300 px-3 py-1.5 text-sm text-slate-700 hover:bg-slate-50 disabled:opacity-40 disabled:cursor-not-allowed transition-colors", children: "Previous" }), _jsxs("span", { className: "flex items-center px-2 text-sm text-slate-600", children: [page, " / ", totalPages] }), _jsx("button", { onClick: () => load(page + 1, actionFilter), disabled: page >= totalPages || loading, className: "rounded-md border border-slate-300 px-3 py-1.5 text-sm text-slate-700 hover:bg-slate-50 disabled:opacity-40 disabled:cursor-not-allowed transition-colors", children: "Next" })] })] }))] }))] }));
50
+ }
51
+ //# sourceMappingURL=AuditLogPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogPage.js","sourceRoot":"","sources":["../../../src/client/pages/AuditLogPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface EmailChangePageProps {
2
+ /** 'request' | 'verify' | 'cancel' */
3
+ mode: 'request' | 'verify' | 'cancel';
4
+ token?: string;
5
+ }
6
+ export declare function EmailChangePage({ mode, token }: EmailChangePageProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=EmailChangePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailChangePage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/EmailChangePage.tsx"],"names":[],"mappings":"AAGA,UAAU,oBAAoB;IAC5B,sCAAsC;IACtC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,oBAAoB,2CAsIpE"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { requestEmailChange, verifyEmailChange, cancelEmailChange } from '../api.js';
4
+ export function EmailChangePage({ mode, token }) {
5
+ const [newEmail, setNewEmail] = useState('');
6
+ const [submitting, setSubmitting] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ const [success, setSuccess] = useState(false);
9
+ // Auto-submit verify/cancel on mount
10
+ useEffect(() => {
11
+ if ((mode === 'verify' || mode === 'cancel') && token) {
12
+ setSubmitting(true);
13
+ const fn = mode === 'verify' ? verifyEmailChange : cancelEmailChange;
14
+ fn(token)
15
+ .then(() => setSuccess(true))
16
+ .catch((e) => setError(e.message))
17
+ .finally(() => setSubmitting(false));
18
+ }
19
+ }, [mode, token]);
20
+ if (mode === 'verify' || mode === 'cancel') {
21
+ if (submitting) {
22
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50", children: _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "mx-auto h-10 w-10 animate-spin rounded-full border-2 border-blue-500 border-t-transparent mb-4" }), _jsx("p", { className: "text-sm text-slate-600", children: mode === 'verify' ? 'Verifying your email change…' : 'Cancelling email change…' })] }) }));
23
+ }
24
+ if (success) {
25
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: mode === 'verify' ? 'Email updated!' : 'Email change cancelled.' }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: mode === 'verify'
26
+ ? 'Your email address has been successfully updated.'
27
+ : 'The email change request has been cancelled. Your email remains unchanged.' }), _jsx("a", { href: "/settings", className: "inline-block rounded-md border border-slate-300 px-6 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 transition-colors", children: "Back to Settings" })] }) }));
28
+ }
29
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-red-100", children: _jsx("svg", { className: "h-6 w-6 text-red-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Something went wrong" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: error }), _jsx("a", { href: "/settings", className: "inline-block rounded-md border border-slate-300 px-6 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 transition-colors", children: "Back to Settings" })] }) }));
30
+ }
31
+ // mode === 'request'
32
+ async function handleSubmit(e) {
33
+ e.preventDefault();
34
+ setSubmitting(true);
35
+ setError(null);
36
+ try {
37
+ await requestEmailChange(newEmail.trim());
38
+ setSuccess(true);
39
+ }
40
+ catch (err) {
41
+ setError(err instanceof Error ? err.message : 'Failed to request email change');
42
+ }
43
+ finally {
44
+ setSubmitting(false);
45
+ }
46
+ }
47
+ if (success) {
48
+ return (_jsxs("div", { className: "max-w-lg mx-auto px-4 py-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Check your email" }), _jsxs("p", { className: "text-sm text-slate-600", children: ["We sent a confirmation link to ", _jsx("strong", { children: newEmail }), ". Click the link to confirm your new email address."] })] }));
49
+ }
50
+ return (_jsxs("div", { className: "max-w-lg mx-auto px-4 py-8", children: [_jsx("h1", { className: "text-2xl font-bold text-slate-900 mb-2", children: "Change Email Address" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Enter your new email address. We will send a confirmation link to verify the change." }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "New Email Address" }), _jsx("input", { type: "email", value: newEmail, onChange: (e) => setNewEmail(e.target.value), required: true, disabled: submitting, placeholder: "new@email.com", className: "w-full rounded-md border border-slate-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:bg-slate-50" })] }), error && _jsx("p", { className: "text-sm text-red-600", children: error }), _jsx("button", { type: "submit", disabled: submitting || !newEmail.trim(), className: "rounded-md bg-blue-600 px-4 py-2.5 text-sm font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 disabled:opacity-50 transition-colors", children: submitting ? 'Sending…' : 'Send Confirmation' })] })] }));
51
+ }
52
+ //# sourceMappingURL=EmailChangePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailChangePage.js","sourceRoot":"","sources":["../../../src/client/pages/EmailChangePage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ interface InvitationAcceptPageProps {
2
+ /** The magic-link token, typically extracted from the URL query string */
3
+ token: string;
4
+ /** Whether the current user is authenticated */
5
+ isAuthenticated: boolean;
6
+ loginUrl?: string;
7
+ signupUrl?: string;
8
+ }
9
+ export declare function InvitationAcceptPage({ token, isAuthenticated, loginUrl, signupUrl, }: InvitationAcceptPageProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=InvitationAcceptPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationAcceptPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/InvitationAcceptPage.tsx"],"names":[],"mappings":"AAIA,UAAU,yBAAyB;IACjC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,eAAe,EACf,QAAmB,EACnB,SAAqB,GACtB,EAAE,yBAAyB,2CAyI3B"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { acceptInvitationByToken } from '../api.js';
4
+ export function InvitationAcceptPage({ token, isAuthenticated, loginUrl = '/login', signupUrl = '/signup', }) {
5
+ const [state, setState] = useState(isAuthenticated ? { status: 'loading' } : { status: 'unauthenticated' });
6
+ useEffect(() => {
7
+ if (!isAuthenticated || !token)
8
+ return;
9
+ acceptInvitationByToken(token)
10
+ .then(({ orgId, role }) => setState({ status: 'success', orgId, role }))
11
+ .catch((err) => {
12
+ const msg = err.message ?? 'Something went wrong';
13
+ if (msg.includes('already') || msg.includes('member')) {
14
+ setState({ status: 'already_member', message: msg });
15
+ }
16
+ else {
17
+ setState({ status: 'error', message: msg });
18
+ }
19
+ });
20
+ }, [token, isAuthenticated]);
21
+ if (state.status === 'unauthenticated') {
22
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-blue-100", children: _jsx("svg", { className: "h-6 w-6 text-blue-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "You have been invited!" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Please log in or create an account to accept this invitation." }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx("a", { href: `${loginUrl}?redirect_token=${encodeURIComponent(token)}`, className: "rounded-md bg-blue-600 px-4 py-2.5 text-sm font-medium text-white hover:bg-blue-700 text-center transition-colors", children: "Log In" }), _jsx("a", { href: `${signupUrl}?redirect_token=${encodeURIComponent(token)}`, className: "rounded-md border border-slate-300 px-4 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 text-center transition-colors", children: "Create Account" })] })] }) }));
23
+ }
24
+ if (state.status === 'loading') {
25
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50", children: _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "mx-auto h-10 w-10 animate-spin rounded-full border-2 border-blue-500 border-t-transparent mb-4" }), _jsx("p", { className: "text-sm text-slate-600", children: "Accepting your invitation\u2026" })] }) }));
26
+ }
27
+ if (state.status === 'success') {
28
+ const roleLabels = {
29
+ owner: 'Owner',
30
+ admin: 'Admin',
31
+ member: 'Member',
32
+ viewer: 'Viewer',
33
+ };
34
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Welcome aboard!" }), _jsxs("p", { className: "text-sm text-slate-600 mb-6", children: ["You have joined the organization as ", _jsx("strong", { children: roleLabels[state.role] }), "."] }), _jsx("a", { href: `/orgs/${state.orgId}`, className: "inline-block rounded-md bg-blue-600 px-6 py-2.5 text-sm font-medium text-white hover:bg-blue-700 transition-colors", children: "Go to Organization" })] }) }));
35
+ }
36
+ if (state.status === 'already_member') {
37
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-amber-100", children: _jsx("svg", { className: "h-6 w-6 text-amber-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Already a member" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: state.message }), _jsx("a", { href: "/", className: "inline-block rounded-md border border-slate-300 px-6 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 transition-colors", children: "Back to Home" })] }) }));
38
+ }
39
+ // error state
40
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-red-100", children: _jsx("svg", { className: "h-6 w-6 text-red-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Invitation failed" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: 'message' in state ? state.message : 'This invitation link is invalid or has expired.' }), _jsx("a", { href: "/", className: "inline-block rounded-md border border-slate-300 px-6 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 transition-colors", children: "Back to Home" })] }) }));
41
+ }
42
+ //# sourceMappingURL=InvitationAcceptPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationAcceptPage.js","sourceRoot":"","sources":["../../../src/client/pages/InvitationAcceptPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface InvitationCodePageProps {
2
+ prefillEmail?: string;
3
+ }
4
+ export declare function InvitationCodePage({ prefillEmail }: InvitationCodePageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=InvitationCodePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationCodePage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/InvitationCodePage.tsx"],"names":[],"mappings":"AAIA,UAAU,uBAAuB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAQD,wBAAgB,kBAAkB,CAAC,EAAE,YAAiB,EAAE,EAAE,uBAAuB,2CA6FhF"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { acceptInvitationByCode } from '../api.js';
4
+ export function InvitationCodePage({ prefillEmail = '' }) {
5
+ const [email, setEmail] = useState(prefillEmail);
6
+ const [code, setCode] = useState('');
7
+ const [state, setState] = useState({ status: 'idle' });
8
+ async function handleSubmit(e) {
9
+ e.preventDefault();
10
+ setState({ status: 'submitting' });
11
+ try {
12
+ const result = await acceptInvitationByCode(email.trim(), code.trim());
13
+ setState({ status: 'success', ...result });
14
+ }
15
+ catch (err) {
16
+ setState({ status: 'error', message: err instanceof Error ? err.message : 'Invalid code' });
17
+ }
18
+ }
19
+ if (state.status === 'success') {
20
+ const roleLabels = {
21
+ owner: 'Owner', admin: 'Admin', member: 'Member', viewer: 'Viewer',
22
+ };
23
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8 text-center", children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-6 w-6 text-green-600", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }) }), _jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "You're in!" }), _jsxs("p", { className: "text-sm text-slate-600 mb-6", children: ["You joined as ", _jsx("strong", { children: roleLabels[state.role] }), "."] }), _jsx("a", { href: `/orgs/${state.orgId}`, className: "inline-block rounded-md bg-blue-600 px-6 py-2.5 text-sm font-medium text-white hover:bg-blue-700 transition-colors", children: "Go to Organization" })] }) }));
24
+ }
25
+ const submitting = state.status === 'submitting';
26
+ return (_jsx("div", { className: "min-h-screen flex items-center justify-center bg-slate-50 px-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-md w-full max-w-md p-8", children: [_jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Enter Invitation Code" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Enter the email address your invitation was sent to and the 6-digit code you received." }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "Email Address" }), _jsx("input", { type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: submitting, placeholder: "you@company.com", className: "w-full rounded-md border border-slate-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:bg-slate-50" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "6-Digit Code" }), _jsx("input", { type: "text", value: code, onChange: (e) => setCode(e.target.value.replace(/\D/g, '').slice(0, 6)), required: true, disabled: submitting, placeholder: "123456", maxLength: 6, inputMode: "numeric", className: "w-full rounded-md border border-slate-300 px-3 py-2 text-sm font-mono tracking-widest text-center focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:bg-slate-50" })] }), state.status === 'error' && (_jsx("p", { className: "text-sm text-red-600", children: state.message })), _jsx("button", { type: "submit", disabled: submitting || code.length !== 6 || !email.trim(), className: "w-full rounded-md bg-blue-600 px-4 py-2.5 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 ? 'Verifying…' : 'Accept Invitation' })] })] }) }));
27
+ }
28
+ //# sourceMappingURL=InvitationCodePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationCodePage.js","sourceRoot":"","sources":["../../../src/client/pages/InvitationCodePage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface MembersPageProps {
2
+ orgId: number;
3
+ }
4
+ export declare function MembersPage({ orgId }: MembersPageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=MembersPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembersPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/MembersPage.tsx"],"names":[],"mappings":"AAYA,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA+QtD"}
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useMembers } from '../hooks/useMembers.js';
4
+ import { usePendingInvitations } from '../hooks/usePendingInvitations.js';
5
+ import { usePendingTransfer } from '../hooks/usePendingTransfer.js';
6
+ import { useCurrentMembership } from '../hooks/useCurrentMembership.js';
7
+ import { MemberRow } from '../components/MemberRow.js';
8
+ import { InviteForm } from '../components/InviteForm.js';
9
+ import { PendingTransferBanner } from '../components/PendingTransferBanner.js';
10
+ import { RoleBadge } from '../components/RoleBadge.js';
11
+ import { removeMember, changeMemberRole, revokeInvitation, resendInvitation } from '../api.js';
12
+ export function MembersPage({ orgId }) {
13
+ const [tab, setTab] = useState('active');
14
+ const { membership } = useCurrentMembership();
15
+ const { members, loading: membersLoading, error: membersError, refresh: refreshMembers } = useMembers(orgId);
16
+ const { members: formerMembers, loading: formerLoading, error: formerError } = useMembers(orgId, { includeFormer: true });
17
+ const { invitations, loading: invLoading, error: invError, refresh: refreshInvitations } = usePendingInvitations(orgId);
18
+ const { transfer, refresh: refreshTransfer } = usePendingTransfer(orgId);
19
+ const currentRole = membership?.role ?? 'viewer';
20
+ const canManage = currentRole === 'owner' || currentRole === 'admin';
21
+ async function handleRemove(userId) {
22
+ if (!confirm('Remove this member from the organization?'))
23
+ return;
24
+ try {
25
+ await removeMember(orgId, userId);
26
+ refreshMembers();
27
+ }
28
+ catch (e) {
29
+ alert(e instanceof Error ? e.message : 'Failed to remove member');
30
+ }
31
+ }
32
+ async function handleRoleChange(userId, newRole) {
33
+ try {
34
+ await changeMemberRole(orgId, userId, newRole);
35
+ refreshMembers();
36
+ }
37
+ catch (e) {
38
+ alert(e instanceof Error ? e.message : 'Failed to change role');
39
+ }
40
+ }
41
+ async function handleRevoke(invitationId) {
42
+ if (!confirm('Revoke this invitation?'))
43
+ return;
44
+ try {
45
+ await revokeInvitation(orgId, invitationId);
46
+ refreshInvitations();
47
+ }
48
+ catch (e) {
49
+ alert(e instanceof Error ? e.message : 'Failed to revoke invitation');
50
+ }
51
+ }
52
+ async function handleResend(invitationId) {
53
+ try {
54
+ await resendInvitation(orgId, invitationId);
55
+ alert('Invitation resent!');
56
+ }
57
+ catch (e) {
58
+ alert(e instanceof Error ? e.message : 'Failed to resend invitation');
59
+ }
60
+ }
61
+ const activeMembers = members.filter((m) => !m.removed_at);
62
+ const formerOnly = formerMembers.filter((m) => m.removed_at);
63
+ return (_jsxs("div", { className: "max-w-4xl mx-auto px-4 py-8", children: [_jsx("h1", { className: "text-2xl font-bold text-slate-900 mb-6", children: "Team Members" }), transfer && membership && (_jsx("div", { className: "mb-6", children: _jsx(PendingTransferBanner, { transfer: transfer, currentUserId: membership.user_id, orgId: orgId, onAction: refreshTransfer }) })), canManage && (_jsx("div", { className: "mb-6", children: _jsx(InviteForm, { orgId: orgId, onSuccess: refreshInvitations }) })), _jsx("div", { className: "flex gap-1 border-b border-slate-200 mb-4", children: ['active', 'invitations', 'former'].map((t) => ((t === 'former' || t === 'invitations') && !canManage ? null : (_jsxs("button", { onClick: () => setTab(t), className: `px-4 py-2 text-sm font-medium border-b-2 transition-colors -mb-px ${tab === t
64
+ ? 'border-blue-500 text-blue-600'
65
+ : 'border-transparent text-slate-500 hover:text-slate-700'}`, children: [t === 'active' ? 'Active' : t === 'invitations' ? 'Pending Invitations' : 'Former Members', t === 'active' && (_jsx("span", { className: "ml-1.5 inline-flex items-center px-1.5 py-0.5 rounded-full text-xs bg-slate-100 text-slate-600", children: activeMembers.length })), t === 'invitations' && (_jsx("span", { className: "ml-1.5 inline-flex items-center px-1.5 py-0.5 rounded-full text-xs bg-blue-100 text-blue-600", children: invitations.length }))] }, t)))) }), tab === 'active' && (_jsxs("div", { children: [membersLoading && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) })), membersError && (_jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700", children: membersError })), !membersLoading && !membersError && (_jsx("div", { className: "overflow-hidden rounded-lg border border-slate-200 shadow-sm", children: _jsxs("table", { className: "w-full text-left", children: [_jsx("thead", { className: "bg-slate-50 border-b border-slate-200", children: _jsxs("tr", { children: [_jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Member" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Role" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Joined" }), _jsx("th", { className: "py-3 px-4" })] }) }), _jsxs("tbody", { className: "bg-white divide-y divide-slate-100", children: [activeMembers.map((member) => (_jsx(MemberRow, { member: member, currentUserRole: currentRole, onRemove: handleRemove, onRoleChange: handleRoleChange }, member.id))), activeMembers.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 4, className: "py-8 text-center text-sm text-slate-500", children: "No active members found." }) }))] })] }) }))] })), tab === 'invitations' && canManage && (_jsxs("div", { children: [invLoading && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) })), invError && (_jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700", children: invError })), !invLoading && !invError && (_jsx("div", { className: "overflow-hidden rounded-lg border border-slate-200 shadow-sm", children: _jsxs("table", { className: "w-full text-left", children: [_jsx("thead", { className: "bg-slate-50 border-b border-slate-200", children: _jsxs("tr", { children: [_jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Email" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Role" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Expires" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Actions" })] }) }), _jsxs("tbody", { className: "bg-white divide-y divide-slate-100", children: [invitations.map((inv) => (_jsxs("tr", { className: "hover:bg-slate-50 transition-colors", children: [_jsx("td", { className: "py-3 px-4 text-sm text-slate-900", children: inv.email }), _jsx("td", { className: "py-3 px-4", children: _jsx(RoleBadge, { role: inv.role }) }), _jsx("td", { className: "py-3 px-4 text-xs text-slate-500", children: new Date(inv.expires_at).toLocaleDateString() }), _jsx("td", { className: "py-3 px-4", children: _jsxs("div", { className: "flex gap-3", children: [_jsx("button", { onClick: () => handleResend(inv.id), className: "text-xs text-blue-600 hover:text-blue-800 font-medium", children: "Resend" }), _jsx("button", { onClick: () => handleRevoke(inv.id), className: "text-xs text-red-600 hover:text-red-800 font-medium", children: "Revoke" })] }) })] }, inv.id))), invitations.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 4, className: "py-8 text-center text-sm text-slate-500", children: "No pending invitations." }) }))] })] }) }))] })), tab === 'former' && canManage && (_jsxs("div", { children: [formerLoading && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) })), formerError && (_jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700", children: formerError })), !formerLoading && !formerError && (_jsx("div", { className: "overflow-hidden rounded-lg border border-slate-200 shadow-sm", children: _jsxs("table", { className: "w-full text-left", children: [_jsx("thead", { className: "bg-slate-50 border-b border-slate-200", children: _jsxs("tr", { children: [_jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Member" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Former Role" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Removed" }), _jsx("th", { className: "py-3 px-4 text-xs font-semibold uppercase tracking-wide text-slate-500", children: "Reason" })] }) }), _jsxs("tbody", { className: "bg-white divide-y divide-slate-100", children: [formerOnly.map((member) => (_jsxs("tr", { className: "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-700", children: member.name ?? member.email }), member.name && _jsx("span", { className: "text-xs text-slate-400", children: member.email })] }) }), _jsx("td", { className: "py-3 px-4", children: _jsx(RoleBadge, { role: member.role }) }), _jsx("td", { className: "py-3 px-4 text-xs text-slate-500", children: member.removed_at ? new Date(member.removed_at).toLocaleDateString() : '—' }), _jsx("td", { className: "py-3 px-4 text-xs text-slate-500", children: member.removal_reason ?? '—' })] }, member.id))), formerOnly.length === 0 && (_jsx("tr", { children: _jsx("td", { colSpan: 4, className: "py-8 text-center text-sm text-slate-500", children: "No former members." }) }))] })] }) }))] }))] }));
66
+ }
67
+ //# sourceMappingURL=MembersPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MembersPage.js","sourceRoot":"","sources":["../../../src/client/pages/MembersPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { OrgRole } from '../types.js';
3
+ export interface OrgPeoplePageProps {
4
+ orgId: number;
5
+ /** Optional hook for real email invites in Phase 2 — no-op by default. */
6
+ onInvite?: (data: {
7
+ email: string;
8
+ orgId: number;
9
+ role: OrgRole;
10
+ userId: number;
11
+ }) => void | Promise<void>;
12
+ }
13
+ export declare function OrgPeoplePage({ orgId, onInvite }: OrgPeoplePageProps): React.ReactElement;
14
+ //# sourceMappingURL=OrgPeoplePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgPeoplePage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/OrgPeoplePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAsFzF"}