@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,20 @@
1
+ import type { OrgRole, PublicMember, OrgHierarchyGroup } from './types.js';
2
+ export declare function addMember(orgId: number, data: {
3
+ email: string;
4
+ role: OrgRole;
5
+ name?: string;
6
+ }): Promise<PublicMember>;
7
+ export declare function updateMember(orgId: number, userId: number, data: {
8
+ role?: OrgRole;
9
+ name?: string;
10
+ }): Promise<PublicMember>;
11
+ export declare function removeMember(orgId: number, userId: number): Promise<void>;
12
+ export declare function listMembers(orgId: number): Promise<PublicMember[]>;
13
+ export declare function getHierarchy(orgId: number): Promise<OrgHierarchyGroup[]>;
14
+ export declare const orgAdminActions: {
15
+ addMember: typeof addMember;
16
+ updateMember: typeof updateMember;
17
+ removeMember: typeof removeMember;
18
+ listMembers: typeof listMembers;
19
+ };
20
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAS3E,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAExE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAE9E;AAED,eAAO,MAAM,eAAe;;;;;CAK3B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { addOrgMember as apiAddMember, updateOrgMember as apiUpdateMember, removeMember as apiRemoveMember, listMembers as apiListMembers, getOrgHierarchy as apiGetHierarchy, } from './api.js';
2
+ export async function addMember(orgId, data) {
3
+ return apiAddMember(orgId, data);
4
+ }
5
+ export async function updateMember(orgId, userId, data) {
6
+ return apiUpdateMember(orgId, userId, data);
7
+ }
8
+ export async function removeMember(orgId, userId) {
9
+ return apiRemoveMember(orgId, userId);
10
+ }
11
+ export async function listMembers(orgId) {
12
+ return apiListMembers(orgId);
13
+ }
14
+ export async function getHierarchy(orgId) {
15
+ return apiGetHierarchy(orgId);
16
+ }
17
+ export const orgAdminActions = {
18
+ addMember,
19
+ updateMember,
20
+ removeMember,
21
+ listMembers,
22
+ };
23
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,IAAI,YAAY,EAC5B,eAAe,IAAI,eAAe,EAClC,YAAY,IAAI,eAAe,EAC/B,WAAW,IAAI,cAAc,EAC7B,eAAe,IAAI,eAAe,GACnC,MAAM,UAAU,CAAC;AAElB,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,IAAqD;IAErD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAa,EACb,MAAc,EACd,IAAuC;IAEvC,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,MAAc;IAC9D,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa;IAC7C,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,WAAW;CACZ,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { PublicOrg, PublicMember, PendingInvitation, CurrentMembership, OwnershipTransfer, AuditEvent, SuperAdminOrgSummary, OrgRole, OrgHierarchyGroup } from './types.js';
2
+ export declare let TM_API_BASE: string;
3
+ export declare function setTmApiBase(base: string): void;
4
+ export declare function getOrg(orgId: number): Promise<PublicOrg>;
5
+ export declare function updateOrg(orgId: number, data: {
6
+ name?: string;
7
+ slug?: string;
8
+ }): Promise<PublicOrg>;
9
+ export declare function deleteOrg(orgId: number, confirmName: string): Promise<void>;
10
+ export declare function listMembers(orgId: number, opts?: {
11
+ includeFormer?: boolean;
12
+ }): Promise<PublicMember[]>;
13
+ export declare function addOrgMember(orgId: number, data: {
14
+ email: string;
15
+ role: OrgRole;
16
+ name?: string;
17
+ }): Promise<PublicMember>;
18
+ export declare function updateOrgMember(orgId: number, userId: number, data: {
19
+ role?: OrgRole;
20
+ name?: string;
21
+ }): Promise<PublicMember>;
22
+ export declare function getOrgHierarchy(orgId: number): Promise<OrgHierarchyGroup[]>;
23
+ export declare function removeMember(orgId: number, userId: number, reason?: string): Promise<void>;
24
+ export declare function changeMemberRole(orgId: number, userId: number, newRole: OrgRole): Promise<PublicMember>;
25
+ export declare function listInvitations(orgId: number): Promise<PendingInvitation[]>;
26
+ export declare function createInvitation(orgId: number, data: {
27
+ email: string;
28
+ role: OrgRole;
29
+ }): Promise<PendingInvitation>;
30
+ export declare function revokeInvitation(orgId: number, invitationId: number): Promise<void>;
31
+ export declare function resendInvitation(orgId: number, invitationId: number): Promise<void>;
32
+ export declare function getInvitationCode(orgId: number, invitationId: number): Promise<{
33
+ code: string;
34
+ }>;
35
+ export declare function acceptInvitationByToken(token: string): Promise<{
36
+ orgId: number;
37
+ role: OrgRole;
38
+ }>;
39
+ export declare function acceptInvitationByCode(email: string, code: string): Promise<{
40
+ orgId: number;
41
+ role: OrgRole;
42
+ }>;
43
+ export declare function getMyMembership(): Promise<CurrentMembership>;
44
+ export declare function requestEmailChange(newEmail: string): Promise<void>;
45
+ export declare function verifyEmailChange(token: string): Promise<void>;
46
+ export declare function cancelEmailChange(token: string): Promise<void>;
47
+ export declare function requestPasswordReset(email: string): Promise<void>;
48
+ export declare function resetPassword(token: string, newPassword: string): Promise<void>;
49
+ export declare function getPendingTransfer(orgId: number): Promise<OwnershipTransfer | null>;
50
+ export declare function initiateTransfer(orgId: number, toUserId: number): Promise<OwnershipTransfer>;
51
+ export declare function acceptTransfer(orgId: number): Promise<void>;
52
+ export declare function cancelTransfer(orgId: number): Promise<void>;
53
+ export declare function getAuditLog(orgId: number, opts?: {
54
+ page?: number;
55
+ limit?: number;
56
+ action?: string;
57
+ }): Promise<{
58
+ events: AuditEvent[];
59
+ total: number;
60
+ page: number;
61
+ }>;
62
+ export declare function adminListOrgs(): Promise<SuperAdminOrgSummary[]>;
63
+ export declare function adminGetOrg(orgId: number): Promise<SuperAdminOrgSummary & {
64
+ members: PublicMember[];
65
+ }>;
66
+ export declare function adminRestoreOrg(orgId: number): Promise<void>;
67
+ export declare function adminAppointOwner(orgId: number, targetUserId: number, reason: string): Promise<void>;
68
+ export declare function adminHardDeleteOrg(orgId: number, legalBasis: string): Promise<void>;
69
+ export declare function adminAddMember(orgId: number, userId: number, role: OrgRole, reason: string): Promise<void>;
70
+ export declare function adminRemoveMember(orgId: number, userId: number, reason: string): Promise<void>;
71
+ export declare function adminLockUser(userId: number, reason: string): Promise<void>;
72
+ export declare function adminUnlockUser(userId: number, reason: string): Promise<void>;
73
+ export declare function adminResetPassword(userId: number, reason: string): Promise<void>;
74
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ export let TM_API_BASE = '/api/team';
2
+ export function setTmApiBase(base) {
3
+ TM_API_BASE = base;
4
+ }
5
+ async function fetchTm(path, options = {}) {
6
+ const res = await fetch(`${TM_API_BASE}${path}`, {
7
+ ...options,
8
+ credentials: 'include',
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ ...(options.headers ?? {}),
12
+ },
13
+ });
14
+ if (res.status === 204) {
15
+ return undefined;
16
+ }
17
+ const data = await res.json().catch(() => ({ error: res.statusText }));
18
+ if (!res.ok) {
19
+ const err = data;
20
+ const msg = err.details ? `${err.error}: ${err.details.join(', ')}` : err.error;
21
+ throw new Error(msg ?? `HTTP ${res.status}`);
22
+ }
23
+ return data;
24
+ }
25
+ function normalizeMember(row) {
26
+ return {
27
+ id: row.id,
28
+ org_id: row.org_id,
29
+ user_id: row.user_id,
30
+ role: row.role,
31
+ email: row.user?.email ?? row.email ?? '',
32
+ name: row.user?.name ?? row.name,
33
+ joined_at: row.joined_at,
34
+ removed_at: row.removed_at ?? undefined,
35
+ removed_by_user_id: row.removed_by_user_id ?? undefined,
36
+ removal_reason: row.removal_reason ?? undefined,
37
+ };
38
+ }
39
+ function normalizeMemberRecord(record) {
40
+ return normalizeMember({
41
+ ...record.membership,
42
+ email: record.email,
43
+ name: record.name,
44
+ user: { id: record.membership.user_id, email: record.email, name: record.name },
45
+ });
46
+ }
47
+ // ─── Orgs ────────────────────────────────────────────────────────────────────
48
+ export async function getOrg(orgId) {
49
+ return fetchTm(`/orgs/${orgId}`);
50
+ }
51
+ export async function updateOrg(orgId, data) {
52
+ return fetchTm(`/orgs/${orgId}`, {
53
+ method: 'PATCH',
54
+ body: JSON.stringify(data),
55
+ });
56
+ }
57
+ export async function deleteOrg(orgId, confirmName) {
58
+ return fetchTm(`/orgs/${orgId}`, {
59
+ method: 'DELETE',
60
+ body: JSON.stringify({ confirmName }),
61
+ });
62
+ }
63
+ export async function listMembers(orgId, opts) {
64
+ const qs = opts?.includeFormer ? '?includeFormer=true' : '';
65
+ const data = await fetchTm(`/orgs/${orgId}/members${qs}`);
66
+ return data.members.map(normalizeMember);
67
+ }
68
+ export async function addOrgMember(orgId, data) {
69
+ const res = await fetchTm(`/orgs/${orgId}/members`, { method: 'POST', body: JSON.stringify(data) });
70
+ return normalizeMemberRecord(res.member);
71
+ }
72
+ export async function updateOrgMember(orgId, userId, data) {
73
+ const res = await fetchTm(`/orgs/${orgId}/members/${userId}`, { method: 'PATCH', body: JSON.stringify(data) });
74
+ return normalizeMemberRecord(res.member);
75
+ }
76
+ export async function getOrgHierarchy(orgId) {
77
+ const data = await fetchTm(`/orgs/${orgId}/hierarchy`);
78
+ return data.hierarchy.map((group) => ({
79
+ role: group.role,
80
+ members: group.members.map(normalizeMemberRecord),
81
+ }));
82
+ }
83
+ export async function removeMember(orgId, userId, reason) {
84
+ return fetchTm(`/orgs/${orgId}/members/${userId}`, {
85
+ method: 'DELETE',
86
+ body: JSON.stringify({ reason }),
87
+ });
88
+ }
89
+ export async function changeMemberRole(orgId, userId, newRole) {
90
+ return updateOrgMember(orgId, userId, { role: newRole });
91
+ }
92
+ // ─── Invitations ─────────────────────────────────────────────────────────────
93
+ export async function listInvitations(orgId) {
94
+ return fetchTm(`/orgs/${orgId}/invitations`);
95
+ }
96
+ export async function createInvitation(orgId, data) {
97
+ return fetchTm(`/orgs/${orgId}/invitations`, {
98
+ method: 'POST',
99
+ body: JSON.stringify(data),
100
+ });
101
+ }
102
+ export async function revokeInvitation(orgId, invitationId) {
103
+ return fetchTm(`/orgs/${orgId}/invitations/${invitationId}`, {
104
+ method: 'DELETE',
105
+ });
106
+ }
107
+ export async function resendInvitation(orgId, invitationId) {
108
+ return fetchTm(`/orgs/${orgId}/invitations/${invitationId}/resend`, {
109
+ method: 'POST',
110
+ });
111
+ }
112
+ export async function getInvitationCode(orgId, invitationId) {
113
+ return fetchTm(`/orgs/${orgId}/invitations/${invitationId}/code`);
114
+ }
115
+ export async function acceptInvitationByToken(token) {
116
+ return fetchTm(`/invitations/accept`, {
117
+ method: 'POST',
118
+ body: JSON.stringify({ token }),
119
+ });
120
+ }
121
+ export async function acceptInvitationByCode(email, code) {
122
+ return fetchTm(`/invitations/accept-code`, {
123
+ method: 'POST',
124
+ body: JSON.stringify({ email, code }),
125
+ });
126
+ }
127
+ // ─── Me / self-service ───────────────────────────────────────────────────────
128
+ export async function getMyMembership() {
129
+ return fetchTm(`/me/membership`);
130
+ }
131
+ export async function requestEmailChange(newEmail) {
132
+ return fetchTm(`/me/email-change`, {
133
+ method: 'POST',
134
+ body: JSON.stringify({ newEmail }),
135
+ });
136
+ }
137
+ export async function verifyEmailChange(token) {
138
+ return fetchTm(`/me/email-change/verify`, {
139
+ method: 'POST',
140
+ body: JSON.stringify({ token }),
141
+ });
142
+ }
143
+ export async function cancelEmailChange(token) {
144
+ return fetchTm(`/me/email-change/cancel`, {
145
+ method: 'POST',
146
+ body: JSON.stringify({ token }),
147
+ });
148
+ }
149
+ export async function requestPasswordReset(email) {
150
+ return fetchTm(`/password-reset/request`, {
151
+ method: 'POST',
152
+ body: JSON.stringify({ email }),
153
+ });
154
+ }
155
+ export async function resetPassword(token, newPassword) {
156
+ return fetchTm(`/password-reset/confirm`, {
157
+ method: 'POST',
158
+ body: JSON.stringify({ token, newPassword }),
159
+ });
160
+ }
161
+ // ─── Ownership transfer ───────────────────────────────────────────────────────
162
+ export async function getPendingTransfer(orgId) {
163
+ return fetchTm(`/orgs/${orgId}/transfer`);
164
+ }
165
+ export async function initiateTransfer(orgId, toUserId) {
166
+ return fetchTm(`/orgs/${orgId}/transfer`, {
167
+ method: 'POST',
168
+ body: JSON.stringify({ toUserId }),
169
+ });
170
+ }
171
+ export async function acceptTransfer(orgId) {
172
+ return fetchTm(`/orgs/${orgId}/transfer/accept`, {
173
+ method: 'POST',
174
+ });
175
+ }
176
+ export async function cancelTransfer(orgId) {
177
+ return fetchTm(`/orgs/${orgId}/transfer/cancel`, {
178
+ method: 'POST',
179
+ });
180
+ }
181
+ // ─── Audit log ───────────────────────────────────────────────────────────────
182
+ export async function getAuditLog(orgId, opts) {
183
+ const params = new URLSearchParams();
184
+ if (opts?.page !== undefined)
185
+ params.set('page', String(opts.page));
186
+ if (opts?.limit !== undefined)
187
+ params.set('limit', String(opts.limit));
188
+ if (opts?.action)
189
+ params.set('action', opts.action);
190
+ const qs = params.toString() ? `?${params.toString()}` : '';
191
+ return fetchTm(`/orgs/${orgId}/audit-log${qs}`);
192
+ }
193
+ // ─── Super-admin ─────────────────────────────────────────────────────────────
194
+ export async function adminListOrgs() {
195
+ return fetchTm(`/admin/orgs`);
196
+ }
197
+ export async function adminGetOrg(orgId) {
198
+ return fetchTm(`/admin/orgs/${orgId}`);
199
+ }
200
+ export async function adminRestoreOrg(orgId) {
201
+ return fetchTm(`/admin/orgs/${orgId}/restore`, { method: 'POST' });
202
+ }
203
+ export async function adminAppointOwner(orgId, targetUserId, reason) {
204
+ return fetchTm(`/admin/orgs/${orgId}/appoint-owner`, {
205
+ method: 'POST',
206
+ body: JSON.stringify({ targetUserId, reason }),
207
+ });
208
+ }
209
+ export async function adminHardDeleteOrg(orgId, legalBasis) {
210
+ return fetchTm(`/admin/orgs/${orgId}/hard-delete`, {
211
+ method: 'DELETE',
212
+ body: JSON.stringify({ legalBasis }),
213
+ });
214
+ }
215
+ export async function adminAddMember(orgId, userId, role, reason) {
216
+ return fetchTm(`/admin/orgs/${orgId}/members`, {
217
+ method: 'POST',
218
+ body: JSON.stringify({ userId, role, reason }),
219
+ });
220
+ }
221
+ export async function adminRemoveMember(orgId, userId, reason) {
222
+ return fetchTm(`/admin/orgs/${orgId}/members/${userId}`, {
223
+ method: 'DELETE',
224
+ body: JSON.stringify({ reason }),
225
+ });
226
+ }
227
+ export async function adminLockUser(userId, reason) {
228
+ return fetchTm(`/admin/users/${userId}/lock`, {
229
+ method: 'POST',
230
+ body: JSON.stringify({ reason }),
231
+ });
232
+ }
233
+ export async function adminUnlockUser(userId, reason) {
234
+ return fetchTm(`/admin/users/${userId}/unlock`, {
235
+ method: 'POST',
236
+ body: JSON.stringify({ reason }),
237
+ });
238
+ }
239
+ export async function adminResetPassword(userId, reason) {
240
+ return fetchTm(`/admin/users/${userId}/reset-password`, {
241
+ method: 'POST',
242
+ body: JSON.stringify({ reason }),
243
+ });
244
+ }
245
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/client/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import type { OrgRole } from '../types.js';
3
+ interface AddMemberFormProps {
4
+ onSubmit: (data: {
5
+ email: string;
6
+ role: OrgRole;
7
+ name?: string;
8
+ }) => Promise<void>;
9
+ }
10
+ export declare function AddMemberForm({ onSubmit }: AddMemberFormProps): React.ReactElement;
11
+ export {};
12
+ //# sourceMappingURL=AddMemberForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMemberForm.d.ts","sourceRoot":"","sources":["../../../src/client/components/AddMemberForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CA8ElF"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { RoleSelect } from './RoleSelect.js';
4
+ import { getTeamTheme } from '../theme.js';
5
+ export function AddMemberForm({ onSubmit }) {
6
+ const theme = getTeamTheme();
7
+ const [email, setEmail] = useState('');
8
+ const [name, setName] = useState('');
9
+ const [role, setRole] = useState('member');
10
+ const [submitting, setSubmitting] = useState(false);
11
+ const [error, setError] = useState(null);
12
+ async function handleSubmit(e) {
13
+ e.preventDefault();
14
+ if (!email.trim())
15
+ return;
16
+ setSubmitting(true);
17
+ setError(null);
18
+ try {
19
+ await onSubmit({
20
+ email: email.trim(),
21
+ role,
22
+ name: name.trim() || undefined,
23
+ });
24
+ setEmail('');
25
+ setName('');
26
+ setRole('member');
27
+ }
28
+ catch (err) {
29
+ setError(err instanceof Error ? err.message : 'Failed to add member');
30
+ }
31
+ finally {
32
+ setSubmitting(false);
33
+ }
34
+ }
35
+ return (_jsxs("form", { "data-testid": "add-member-form", onSubmit: handleSubmit, className: "rounded-lg border p-4 shadow-sm", style: { backgroundColor: '#fff', borderColor: theme.brass }, children: [_jsx("h3", { className: "text-sm font-semibold mb-3", style: { fontFamily: theme.fontHeading, color: theme.brick }, children: "Add person to org" }), _jsxs("div", { className: "grid gap-2 sm:grid-cols-2 lg:grid-cols-4", children: [_jsx("input", { "data-testid": "add-member-email", type: "email", placeholder: "Email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: submitting, className: "rounded-md border px-3 py-2 text-sm", style: { borderColor: theme.brass } }), _jsx("input", { "data-testid": "add-member-name", type: "text", placeholder: "Display name (optional)", value: name, onChange: (e) => setName(e.target.value), disabled: submitting, className: "rounded-md border px-3 py-2 text-sm", style: { borderColor: theme.brass } }), _jsx(RoleSelect, { value: role, onChange: setRole, disabled: submitting, disabledRoles: ['owner'] }), _jsx("button", { "data-testid": "add-member-submit", type: "submit", disabled: submitting || !email.trim(), className: "rounded-md px-4 py-2 text-sm font-medium text-white disabled:opacity-50", style: { backgroundColor: theme.brick }, children: submitting ? 'Adding…' : 'Add to roster' })] }), error && _jsx("p", { className: "mt-2 text-sm text-red-700", children: error })] }));
36
+ }
37
+ //# sourceMappingURL=AddMemberForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMemberForm.js","sourceRoot":"","sources":["../../../src/client/components/AddMemberForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AuditEvent } from '../types.js';
2
+ interface AuditEventRowProps {
3
+ event: AuditEvent;
4
+ }
5
+ export declare function AuditEventRow({ event }: AuditEventRowProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=AuditEventRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditEventRow.d.ts","sourceRoot":"","sources":["../../../src/client/components/AuditEventRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,UAAU,CAAC;CACnB;AAkBD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,2CAkC1D"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ function humanizeAction(action) {
3
+ return action
4
+ .replace(/_/g, ' ')
5
+ .replace(/\b\w/g, (c) => c.toUpperCase());
6
+ }
7
+ function formatTimestamp(iso) {
8
+ return new Date(iso).toLocaleString(undefined, {
9
+ year: 'numeric',
10
+ month: 'short',
11
+ day: 'numeric',
12
+ hour: '2-digit',
13
+ minute: '2-digit',
14
+ });
15
+ }
16
+ export function AuditEventRow({ event }) {
17
+ const isAdminAction = event.actor_type === 'super_admin';
18
+ 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 items-center gap-2", children: [_jsx("span", { className: `text-sm font-medium ${isAdminAction ? 'text-purple-700' : 'text-slate-900'}`, children: event.actor_display_name }), isAdminAction && (_jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-700", children: "Support" }))] }) }), _jsx("td", { className: "py-3 px-4", children: _jsx("span", { className: "text-sm text-slate-700", children: humanizeAction(event.action) }) }), _jsx("td", { className: "py-3 px-4", children: event.target_type && event.target_id ? (_jsxs("span", { className: "text-xs text-slate-500", children: [event.target_type, " #", event.target_id] })) : (_jsx("span", { className: "text-slate-300", children: "\u2014" })) }), _jsx("td", { className: "py-3 px-4 text-xs text-slate-500 whitespace-nowrap", children: formatTimestamp(event.created_at) })] }));
19
+ }
20
+ //# sourceMappingURL=AuditEventRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditEventRow.js","sourceRoot":"","sources":["../../../src/client/components/AuditEventRow.tsx"],"names":[],"mappings":";AAOA,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM;SACV,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE;QAC7C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAsB;IACzD,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,KAAK,aAAa,CAAC;IAEzD,OAAO,CACL,cAAI,SAAS,EAAC,6EAA6E,aACzF,aAAI,SAAS,EAAC,WAAW,YACvB,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAE,uBAAuB,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,EAAE,YAC3F,KAAK,CAAC,kBAAkB,GACpB,EACN,aAAa,IAAI,CAChB,eAAM,SAAS,EAAC,kGAAkG,wBAE3G,CACR,IACG,GACH,EACL,aAAI,SAAS,EAAC,WAAW,YACvB,eAAM,SAAS,EAAC,wBAAwB,YAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,GAAQ,GAC3E,EACL,aAAI,SAAS,EAAC,WAAW,YACtB,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CACtC,gBAAM,SAAS,EAAC,wBAAwB,aACrC,KAAK,CAAC,WAAW,QAAI,KAAK,CAAC,SAAS,IAChC,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,gBAAgB,uBAAS,CAC1C,GACE,EACL,aAAI,SAAS,EAAC,oDAAoD,YAC/D,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,GAC/B,IACF,CACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface CascadeItem {
2
+ label: string;
3
+ count: number;
4
+ description: string;
5
+ }
6
+ interface CascadePreviewProps {
7
+ items: CascadeItem[];
8
+ }
9
+ export declare function CascadePreview({ items }: CascadePreviewProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export {};
11
+ //# sourceMappingURL=CascadePreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CascadePreview.d.ts","sourceRoot":"","sources":["../../../src/client/components/CascadePreview.tsx"],"names":[],"mappings":"AAEA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,mBAAmB,kDAuB5D"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function CascadePreview({ items }) {
3
+ if (items.length === 0)
4
+ return null;
5
+ return (_jsxs("div", { className: "rounded-lg border border-amber-200 bg-amber-50 p-4", children: [_jsx("p", { className: "text-sm font-semibold text-amber-800 mb-3", children: "The following will be affected:" }), _jsx("ul", { className: "space-y-2", children: items.map((item, i) => (_jsxs("li", { className: "flex items-start gap-3", children: [_jsx("span", { className: "mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-amber-200 text-xs font-bold text-amber-800", children: item.count }), _jsxs("div", { children: [_jsx("span", { className: "text-sm font-medium text-amber-900", children: item.label }), _jsx("p", { className: "text-xs text-amber-700", children: item.description })] })] }, i))) })] }));
6
+ }
7
+ //# sourceMappingURL=CascadePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CascadePreview.js","sourceRoot":"","sources":["../../../src/client/components/CascadePreview.tsx"],"names":[],"mappings":";AAYA,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAuB;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,CACL,eAAK,SAAS,EAAC,oDAAoD,aACjE,YAAG,SAAS,EAAC,2CAA2C,gDAEpD,EACJ,aAAI,SAAS,EAAC,WAAW,YACtB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,cAAY,SAAS,EAAC,wBAAwB,aAC5C,eAAM,SAAS,EAAC,qHAAqH,YAClI,IAAI,CAAC,KAAK,GACN,EACP,0BACE,eAAM,SAAS,EAAC,oCAAoC,YAAE,IAAI,CAAC,KAAK,GAAQ,EACxE,YAAG,SAAS,EAAC,wBAAwB,YAAE,IAAI,CAAC,WAAW,GAAK,IACxD,KAPC,CAAC,CAQL,CACN,CAAC,GACC,IACD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ interface DangerZoneCardProps {
2
+ title: string;
3
+ description: string;
4
+ buttonLabel: string;
5
+ onConfirm: () => Promise<void> | void;
6
+ confirmPrompt?: string;
7
+ }
8
+ export declare function DangerZoneCard({ title, description, buttonLabel, onConfirm, confirmPrompt, }: DangerZoneCardProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=DangerZoneCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DangerZoneCard.d.ts","sourceRoot":"","sources":["../../../src/client/components/DangerZoneCard.tsx"],"names":[],"mappings":"AAEA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,GACd,EAAE,mBAAmB,2CAsFrB"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ export function DangerZoneCard({ title, description, buttonLabel, onConfirm, confirmPrompt, }) {
4
+ const [showModal, setShowModal] = useState(false);
5
+ const [confirmText, setConfirmText] = useState('');
6
+ const [submitting, setSubmitting] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ const isConfirmed = !confirmPrompt || confirmText === confirmPrompt;
9
+ async function handleConfirm() {
10
+ if (!isConfirmed)
11
+ return;
12
+ setSubmitting(true);
13
+ setError(null);
14
+ try {
15
+ await onConfirm();
16
+ setShowModal(false);
17
+ setConfirmText('');
18
+ }
19
+ catch (err) {
20
+ setError(err instanceof Error ? err.message : 'Action failed');
21
+ }
22
+ finally {
23
+ setSubmitting(false);
24
+ }
25
+ }
26
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "border border-red-200 rounded-lg p-5 bg-red-50", children: _jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center gap-4", children: [_jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-sm font-semibold text-red-800", children: title }), _jsx("p", { className: "mt-1 text-sm text-red-700", children: description })] }), _jsx("button", { onClick: () => setShowModal(true), className: "shrink-0 rounded-md border border-red-600 bg-white px-4 py-2 text-sm font-medium text-red-600 hover:bg-red-600 hover:text-white focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-1 transition-colors", children: buttonLabel })] }) }), showModal && (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4", children: _jsxs("div", { className: "bg-white rounded-xl shadow-2xl w-full max-w-md p-6", children: [_jsx("h2", { className: "text-lg font-semibold text-slate-900 mb-2", children: title }), _jsx("p", { className: "text-sm text-slate-600 mb-4", children: description }), confirmPrompt && (_jsxs("div", { className: "mb-4", children: [_jsxs("p", { className: "text-sm text-slate-700 mb-1", children: ["Type ", _jsx("strong", { className: "font-mono", children: confirmPrompt }), " to confirm:"] }), _jsx("input", { type: "text", value: confirmText, onChange: (e) => setConfirmText(e.target.value), placeholder: confirmPrompt, className: "w-full rounded-md border border-slate-300 px-3 py-2 text-sm focus:border-red-500 focus:outline-none focus:ring-1 focus:ring-red-500" })] })), error && (_jsx("p", { className: "mb-3 text-sm text-red-600", children: error })), _jsxs("div", { className: "flex gap-3 justify-end", children: [_jsx("button", { onClick: () => { setShowModal(false); setConfirmText(''); setError(null); }, disabled: submitting, className: "rounded-md border border-slate-300 px-4 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 transition-colors", children: "Cancel" }), _jsx("button", { onClick: handleConfirm, disabled: !isConfirmed || submitting, className: "rounded-md bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed transition-colors", children: submitting ? 'Processing…' : buttonLabel })] })] }) }))] }));
27
+ }
28
+ //# sourceMappingURL=DangerZoneCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DangerZoneCard.js","sourceRoot":"","sources":["../../../src/client/components/DangerZoneCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface InvitationCodeDisplayProps {
2
+ orgId: number;
3
+ invitationId: number;
4
+ }
5
+ export declare function InvitationCodeDisplay({ orgId, invitationId }: InvitationCodeDisplayProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=InvitationCodeDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InvitationCodeDisplay.d.ts","sourceRoot":"","sources":["../../../src/client/components/InvitationCodeDisplay.tsx"],"names":[],"mappings":"AAGA,UAAU,0BAA0B;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,0BAA0B,2CAuCxF"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { getInvitationCode } from '../api.js';
4
+ export function InvitationCodeDisplay({ orgId, invitationId }) {
5
+ const [code, setCode] = useState(null);
6
+ const [loading, setLoading] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ async function handleShowCode() {
9
+ if (code)
10
+ return;
11
+ setLoading(true);
12
+ setError(null);
13
+ try {
14
+ const result = await getInvitationCode(orgId, invitationId);
15
+ setCode(result.code);
16
+ }
17
+ catch (err) {
18
+ setError(err instanceof Error ? err.message : 'Failed to load code');
19
+ }
20
+ finally {
21
+ setLoading(false);
22
+ }
23
+ }
24
+ return (_jsxs("div", { className: "inline-flex items-center gap-2", children: [code ? (_jsx("span", { className: "font-mono text-sm font-semibold tracking-widest text-slate-900 bg-slate-100 border border-slate-300 rounded px-3 py-1 select-all", children: code })) : (_jsx("button", { onClick: handleShowCode, disabled: loading, className: "text-xs text-blue-600 hover:text-blue-800 underline disabled:opacity-50 transition-colors", children: loading ? 'Loading…' : 'Show Code' })), error && (_jsx("span", { className: "text-xs text-red-600", children: error }))] }));
25
+ }
26
+ //# sourceMappingURL=InvitationCodeDisplay.js.map