@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,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useOrgMembers } from '../hooks/useOrgMembers.js';
3
+ import { useCurrentMembership } from '../hooks/useCurrentMembership.js';
4
+ import { AddMemberForm } from '../components/AddMemberForm.js';
5
+ import { OrgPeopleRoster } from '../components/OrgPeopleRoster.js';
6
+ import { SeatUsagePanel } from '../components/SeatUsagePanel.js';
7
+ import { getTeamTheme } from '../theme.js';
8
+ export function OrgPeoplePage({ orgId, onInvite }) {
9
+ const theme = getTeamTheme();
10
+ const { membership } = useCurrentMembership();
11
+ const { hierarchy, loading, error, addMember, updateMember, removeMember, memberCount } = useOrgMembers(orgId);
12
+ const currentRole = membership?.role ?? 'viewer';
13
+ const canManage = currentRole === 'owner' || currentRole === 'admin';
14
+ async function handleAdd(data) {
15
+ const added = await addMember(data);
16
+ if (onInvite) {
17
+ await onInvite({ email: data.email, orgId, role: data.role, userId: added.user_id });
18
+ }
19
+ }
20
+ async function handleRoleChange(userId, role) {
21
+ try {
22
+ await updateMember(userId, { role });
23
+ }
24
+ catch (e) {
25
+ alert(e instanceof Error ? e.message : 'Failed to update role');
26
+ }
27
+ }
28
+ async function handleRemove(userId) {
29
+ if (!confirm('Remove this person from the organization?'))
30
+ return;
31
+ try {
32
+ await removeMember(userId);
33
+ }
34
+ catch (e) {
35
+ alert(e instanceof Error ? e.message : 'Failed to remove member');
36
+ }
37
+ }
38
+ return (_jsxs("div", { "data-testid": "org-people-page", className: "max-w-4xl mx-auto px-4 py-8 min-h-screen", style: { backgroundColor: theme.paper, fontFamily: theme.fontBody, color: theme.ink }, children: [_jsxs("header", { className: "mb-6", children: [_jsx("h1", { className: "text-2xl font-bold mb-1", style: { fontFamily: theme.fontHeading, color: theme.brick }, children: "Org & People" }), _jsx("p", { className: "text-sm", style: { color: theme.brass }, children: "Build your roster free during launch \u2014 billing enforcement arrives in Phase 2." })] }), _jsxs("div", { className: "grid gap-6 lg:grid-cols-3 mb-6", children: [_jsx("div", { className: "lg:col-span-2", children: canManage && _jsx(AddMemberForm, { onSubmit: handleAdd }) }), _jsx(SeatUsagePanel, { memberCount: memberCount })] }), _jsxs("div", { "data-testid": "org-people-count", className: "text-sm mb-4 font-medium", style: { color: theme.ink }, children: [memberCount, " ", memberCount === 1 ? 'person' : 'people', " on roster"] }), loading && (_jsx("div", { "data-testid": "org-people-loading", className: "py-12 text-center text-sm", children: "Loading roster\u2026" })), error && (_jsx("div", { className: "rounded-md border border-red-300 bg-red-50 px-4 py-3 text-sm text-red-800", children: error })), !loading && !error && (_jsx(OrgPeopleRoster, { hierarchy: hierarchy, canManage: canManage, onRoleChange: handleRoleChange, onRemove: handleRemove }))] }));
39
+ }
40
+ //# sourceMappingURL=OrgPeoplePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgPeoplePage.js","sourceRoot":"","sources":["../../../src/client/pages/OrgPeoplePage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface OrgSettingsPageProps {
2
+ orgId: number;
3
+ }
4
+ export declare function OrgSettingsPage({ orgId }: OrgSettingsPageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=OrgSettingsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgSettingsPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/OrgSettingsPage.tsx"],"names":[],"mappings":"AAMA,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,oBAAoB,2CA8K9D"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { getOrg, updateOrg, deleteOrg, initiateTransfer } from '../api.js';
4
+ import { DangerZoneCard } from '../components/DangerZoneCard.js';
5
+ import { useCurrentMembership } from '../hooks/useCurrentMembership.js';
6
+ export function OrgSettingsPage({ orgId }) {
7
+ const { membership } = useCurrentMembership();
8
+ const [org, setOrg] = useState(null);
9
+ const [loading, setLoading] = useState(true);
10
+ const [error, setError] = useState(null);
11
+ const [name, setName] = useState('');
12
+ const [slug, setSlug] = useState('');
13
+ const [saving, setSaving] = useState(false);
14
+ const [saveError, setSaveError] = useState(null);
15
+ const [saveSuccess, setSaveSuccess] = useState(false);
16
+ const [transferUserId, setTransferUserId] = useState('');
17
+ const [transferError, setTransferError] = useState(null);
18
+ const [transferSuccess, setTransferSuccess] = useState(false);
19
+ const isOwner = membership?.role === 'owner';
20
+ const isAdmin = membership?.role === 'admin' || isOwner;
21
+ useEffect(() => {
22
+ setLoading(true);
23
+ getOrg(orgId)
24
+ .then((o) => {
25
+ setOrg(o);
26
+ setName(o.name);
27
+ setSlug(o.slug);
28
+ })
29
+ .catch((e) => setError(e.message))
30
+ .finally(() => setLoading(false));
31
+ }, [orgId]);
32
+ async function handleSave(e) {
33
+ e.preventDefault();
34
+ setSaving(true);
35
+ setSaveError(null);
36
+ setSaveSuccess(false);
37
+ try {
38
+ const updated = await updateOrg(orgId, { name, slug });
39
+ setOrg(updated);
40
+ setSaveSuccess(true);
41
+ setTimeout(() => setSaveSuccess(false), 3000);
42
+ }
43
+ catch (err) {
44
+ setSaveError(err instanceof Error ? err.message : 'Failed to save');
45
+ }
46
+ finally {
47
+ setSaving(false);
48
+ }
49
+ }
50
+ async function handleDelete() {
51
+ await deleteOrg(orgId, org.name);
52
+ window.location.href = '/';
53
+ }
54
+ async function handleInitiateTransfer() {
55
+ const uid = parseInt(transferUserId, 10);
56
+ if (!uid) {
57
+ setTransferError('Enter a valid user ID');
58
+ return;
59
+ }
60
+ setTransferError(null);
61
+ try {
62
+ await initiateTransfer(orgId, uid);
63
+ setTransferSuccess(true);
64
+ setTransferUserId('');
65
+ }
66
+ catch (err) {
67
+ setTransferError(err instanceof Error ? err.message : 'Failed to initiate transfer');
68
+ }
69
+ }
70
+ if (loading) {
71
+ return (_jsx("div", { className: "flex items-center justify-center min-h-64", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) }));
72
+ }
73
+ if (error) {
74
+ return (_jsx("div", { className: "max-w-2xl mx-auto px-4 py-8", children: _jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700", children: error }) }));
75
+ }
76
+ return (_jsxs("div", { className: "max-w-2xl mx-auto px-4 py-8 space-y-8", children: [_jsx("h1", { className: "text-2xl font-bold text-slate-900", children: "Organization Settings" }), isAdmin && (_jsxs("section", { className: "bg-white rounded-lg border border-slate-200 shadow-sm p-6", children: [_jsx("h2", { className: "text-lg font-semibold text-slate-800 mb-4", children: "General" }), _jsxs("form", { onSubmit: handleSave, className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "Organization Name" }), _jsx("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: saving, 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: "Slug" }), _jsx("input", { type: "text", value: slug, onChange: (e) => setSlug(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '-')), required: true, disabled: saving, className: "w-full rounded-md border border-slate-300 px-3 py-2 text-sm font-mono focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500 disabled:bg-slate-50" }), _jsx("p", { className: "mt-1 text-xs text-slate-500", children: "Used in URLs. Lowercase letters, numbers, and hyphens only." })] }), saveError && _jsx("p", { className: "text-sm text-red-600", children: saveError }), saveSuccess && _jsx("p", { className: "text-sm text-green-600", children: "Settings saved!" }), _jsx("button", { type: "submit", disabled: saving, className: "rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-1 disabled:opacity-50 transition-colors", children: saving ? 'Saving…' : 'Save Changes' })] })] })), isOwner && (_jsxs("section", { className: "space-y-4", children: [_jsx("h2", { className: "text-lg font-semibold text-slate-800", children: "Danger Zone" }), _jsxs("div", { className: "border border-amber-200 rounded-lg p-5 bg-amber-50", children: [_jsx("h3", { className: "text-sm font-semibold text-amber-800 mb-1", children: "Transfer Ownership" }), _jsx("p", { className: "text-sm text-amber-700 mb-3", children: "Transfer ownership of this organization to another member. The recipient must accept within 72 hours." }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { type: "number", placeholder: "Target user ID", value: transferUserId, onChange: (e) => setTransferUserId(e.target.value), className: "flex-1 rounded-md border border-amber-300 px-3 py-2 text-sm focus:border-amber-500 focus:outline-none focus:ring-1 focus:ring-amber-500" }), _jsx("button", { onClick: handleInitiateTransfer, className: "rounded-md border border-amber-600 bg-white px-4 py-2 text-sm font-medium text-amber-700 hover:bg-amber-100 transition-colors", children: "Initiate Transfer" })] }), transferError && _jsx("p", { className: "mt-2 text-sm text-red-600", children: transferError }), transferSuccess && _jsx("p", { className: "mt-2 text-sm text-green-600", children: "Transfer initiated! Awaiting recipient acceptance." })] }), _jsx(DangerZoneCard, { title: "Delete Organization", description: "Permanently delete this organization and all its data. This action cannot be undone.", buttonLabel: "Delete Organization", onConfirm: handleDelete, confirmPrompt: org?.name })] }))] }));
77
+ }
78
+ //# sourceMappingURL=OrgSettingsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrgSettingsPage.js","sourceRoot":"","sources":["../../../src/client/pages/OrgSettingsPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface OwnershipTransferPageProps {
2
+ orgId: number;
3
+ }
4
+ export declare function OwnershipTransferPage({ orgId }: OwnershipTransferPageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=OwnershipTransferPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnershipTransferPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/OwnershipTransferPage.tsx"],"names":[],"mappings":"AAKA,UAAU,0BAA0B;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE,0BAA0B,2CAwJ1E"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { usePendingTransfer } from '../hooks/usePendingTransfer.js';
4
+ import { useCurrentMembership } from '../hooks/useCurrentMembership.js';
5
+ import { acceptTransfer, cancelTransfer } from '../api.js';
6
+ export function OwnershipTransferPage({ orgId }) {
7
+ const { transfer, loading, error } = usePendingTransfer(orgId);
8
+ const { membership } = useCurrentMembership();
9
+ const [confirmEmail, setConfirmEmail] = useState('');
10
+ const [submitting, setSubmitting] = useState(false);
11
+ const [actionError, setActionError] = useState(null);
12
+ const [done, setDone] = useState(null);
13
+ const userEmail = membership ? membership.email ?? '' : '';
14
+ const isTarget = transfer?.to_user_id === membership?.user_id;
15
+ const emailConfirmed = confirmEmail.trim().toLowerCase() === userEmail.toLowerCase();
16
+ async function handleAccept() {
17
+ if (!emailConfirmed)
18
+ return;
19
+ setSubmitting(true);
20
+ setActionError(null);
21
+ try {
22
+ await acceptTransfer(orgId);
23
+ setDone('accepted');
24
+ }
25
+ catch (err) {
26
+ setActionError(err instanceof Error ? err.message : 'Failed to accept transfer');
27
+ }
28
+ finally {
29
+ setSubmitting(false);
30
+ }
31
+ }
32
+ async function handleCancel() {
33
+ setSubmitting(true);
34
+ setActionError(null);
35
+ try {
36
+ await cancelTransfer(orgId);
37
+ setDone('cancelled');
38
+ }
39
+ catch (err) {
40
+ setActionError(err instanceof Error ? err.message : 'Failed to cancel transfer');
41
+ }
42
+ finally {
43
+ setSubmitting(false);
44
+ }
45
+ }
46
+ if (loading) {
47
+ return (_jsx("div", { className: "flex items-center justify-center min-h-64", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-blue-500 border-t-transparent" }) }));
48
+ }
49
+ if (error) {
50
+ return (_jsx("div", { className: "max-w-lg mx-auto px-4 py-8", children: _jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700", children: error }) }));
51
+ }
52
+ if (done === 'accepted') {
53
+ 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-14 w-14 items-center justify-center rounded-full bg-green-100", children: _jsx("svg", { className: "h-7 w-7 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: "Ownership transferred!" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "You are now the owner of this organization." }), _jsx("a", { href: `/orgs/${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" })] }));
54
+ }
55
+ if (done === 'cancelled') {
56
+ return (_jsxs("div", { className: "max-w-lg mx-auto px-4 py-8 text-center", children: [_jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Transfer cancelled." }), _jsx("a", { href: `/orgs/${orgId}`, 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 Organization" })] }));
57
+ }
58
+ if (!transfer || !isTarget) {
59
+ return (_jsx("div", { className: "max-w-lg mx-auto px-4 py-8", children: _jsx("div", { className: "rounded-md bg-slate-50 border border-slate-200 px-4 py-3 text-sm text-slate-600", children: "No pending ownership transfer found for you." }) }));
60
+ }
61
+ 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: "Accept Ownership" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "You are being offered ownership of this organization. Accepting grants you full owner privileges." }), _jsxs("div", { className: "bg-white rounded-lg border border-slate-200 shadow-sm p-6 mb-6", children: [_jsx("h2", { className: "text-sm font-semibold text-slate-800 mb-3", children: "Owner Powers You Will Receive" }), _jsx("ul", { className: "space-y-2 text-sm text-slate-700", children: [
62
+ 'Delete the organization',
63
+ 'Appoint and demote admins',
64
+ 'Transfer ownership to others',
65
+ 'Override all member permissions',
66
+ ].map((power) => (_jsxs("li", { className: "flex items-start gap-2", children: [_jsx("svg", { className: "mt-0.5 h-4 w-4 shrink-0 text-blue-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), power] }, power))) })] }), _jsxs("div", { className: "mb-4", children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "Type your email address to confirm:" }), _jsx("input", { type: "email", value: confirmEmail, onChange: (e) => setConfirmEmail(e.target.value), placeholder: userEmail || 'your@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" })] }), actionError && _jsx("p", { className: "mb-3 text-sm text-red-600", children: actionError }), _jsxs("div", { className: "flex gap-3", children: [_jsx("button", { onClick: handleAccept, disabled: !emailConfirmed || submitting, className: "flex-1 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 disabled:cursor-not-allowed transition-colors", children: submitting ? 'Processing…' : 'Accept Ownership' }), _jsx("button", { onClick: handleCancel, disabled: submitting, className: "rounded-md border border-slate-300 px-4 py-2.5 text-sm font-medium text-slate-700 hover:bg-slate-50 disabled:opacity-50 transition-colors", children: "Decline" })] })] }));
67
+ }
68
+ //# sourceMappingURL=OwnershipTransferPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnershipTransferPage.js","sourceRoot":"","sources":["../../../src/client/pages/OwnershipTransferPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface PasswordResetPageProps {
2
+ token: string;
3
+ }
4
+ export declare function PasswordResetPage({ token }: PasswordResetPageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=PasswordResetPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordResetPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PasswordResetPage.tsx"],"names":[],"mappings":"AAGA,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,sBAAsB,2CA8FlE"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { resetPassword } from '../api.js';
4
+ export function PasswordResetPage({ token }) {
5
+ const [newPassword, setNewPassword] = useState('');
6
+ const [confirmPassword, setConfirmPassword] = useState('');
7
+ const [state, setState] = useState('idle');
8
+ const [error, setError] = useState(null);
9
+ const passwordsMatch = newPassword === confirmPassword;
10
+ const isValid = newPassword.length >= 8 && passwordsMatch;
11
+ async function handleSubmit(e) {
12
+ e.preventDefault();
13
+ if (!isValid)
14
+ return;
15
+ setState('submitting');
16
+ setError(null);
17
+ try {
18
+ await resetPassword(token, newPassword);
19
+ setState('success');
20
+ }
21
+ catch (err) {
22
+ setError(err instanceof Error ? err.message : 'Failed to reset password');
23
+ setState('error');
24
+ }
25
+ }
26
+ if (state === 'success') {
27
+ 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: "Password reset!" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Your password has been successfully updated." }), _jsx("a", { href: "/login", 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: "Log In" })] }) }));
28
+ }
29
+ const submitting = state === 'submitting';
30
+ 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: "Reset Password" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Enter and confirm your new password." }), _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 Password" }), _jsx("input", { type: "password", value: newPassword, onChange: (e) => setNewPassword(e.target.value), required: true, minLength: 8, disabled: submitting, placeholder: "At least 8 characters", 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: "Confirm Password" }), _jsx("input", { type: "password", value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, disabled: submitting, placeholder: "Repeat your password", className: `w-full rounded-md border px-3 py-2 text-sm focus:outline-none focus:ring-1 disabled:bg-slate-50 ${confirmPassword && !passwordsMatch
31
+ ? 'border-red-400 focus:border-red-500 focus:ring-red-500'
32
+ : 'border-slate-300 focus:border-blue-500 focus:ring-blue-500'}` }), confirmPassword && !passwordsMatch && (_jsx("p", { className: "mt-1 text-xs text-red-600", children: "Passwords do not match" }))] }), error && _jsx("p", { className: "text-sm text-red-600", children: error }), _jsx("button", { type: "submit", disabled: !isValid || submitting, 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 disabled:opacity-50 disabled:cursor-not-allowed transition-colors", children: submitting ? 'Resetting…' : 'Reset Password' })] })] }) }));
33
+ }
34
+ //# sourceMappingURL=PasswordResetPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordResetPage.js","sourceRoot":"","sources":["../../../src/client/pages/PasswordResetPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function PasswordResetRequestPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PasswordResetRequestPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordResetRequestPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PasswordResetRequestPage.tsx"],"names":[],"mappings":"AAGA,wBAAgB,wBAAwB,4CAmEvC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { requestPasswordReset } from '../api.js';
4
+ export function PasswordResetRequestPage() {
5
+ const [email, setEmail] = useState('');
6
+ const [submitting, setSubmitting] = useState(false);
7
+ const [submitted, setSubmitted] = useState(false);
8
+ async function handleSubmit(e) {
9
+ e.preventDefault();
10
+ setSubmitting(true);
11
+ try {
12
+ await requestPasswordReset(email.trim());
13
+ }
14
+ catch {
15
+ // Intentionally swallow — always show success to prevent enumeration
16
+ }
17
+ finally {
18
+ setSubmitting(false);
19
+ setSubmitted(true);
20
+ }
21
+ }
22
+ if (submitted) {
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-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: "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 inbox" }), _jsxs("p", { className: "text-sm text-slate-600", children: ["If an account exists for ", _jsx("strong", { children: email }), ", you will receive a password reset link shortly."] })] }) }));
24
+ }
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", children: [_jsx("h1", { className: "text-xl font-bold text-slate-900 mb-2", children: "Forgot Password" }), _jsx("p", { className: "text-sm text-slate-600 mb-6", children: "Enter your email address and we will send you a link to reset your password." }), _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" })] }), _jsx("button", { type: "submit", disabled: submitting || !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 disabled:opacity-50 disabled:cursor-not-allowed transition-colors", children: submitting ? 'Sending…' : 'Send Reset Link' })] })] }) }));
26
+ }
27
+ //# sourceMappingURL=PasswordResetRequestPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordResetRequestPage.js","sourceRoot":"","sources":["../../../src/client/pages/PasswordResetRequestPage.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,UAAU,wBAAwB;IACtC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,KAAK,UAAU,YAAY,CAAC,CAAkB;QAC5C,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC7E,eAAK,SAAS,EAAC,+DAA+D,aAC5E,cAAK,SAAS,EAAC,kFAAkF,YAC/F,cAAK,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,YAC1F,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAC,sGAAsG,GAAG,GAC1K,GACF,EACN,aAAI,SAAS,EAAC,uCAAuC,iCAAsB,EAC3E,aAAG,SAAS,EAAC,wBAAwB,0CACV,2BAAS,KAAK,GAAU,yDAC/C,IACA,GACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC7E,eAAK,SAAS,EAAC,mDAAmD,aAChE,aAAI,SAAS,EAAC,uCAAuC,gCAAqB,EAC1E,YAAG,SAAS,EAAC,6BAA6B,6FAEtC,EACJ,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,WAAW,aACjD,0BACE,gBAAO,SAAS,EAAC,+CAA+C,8BAAsB,EACtF,gBACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,QACR,QAAQ,EAAE,UAAU,EACpB,WAAW,EAAC,iBAAiB,EAC7B,SAAS,EAAC,4JAA4J,GACtK,IACE,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACrC,SAAS,EAAC,kNAAkN,YAE3N,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,GACrC,IACJ,IACH,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ /**
3
+ * PlaceholderPage — full-page wrapper for the PlaceholderCard.
4
+ * Host products mount this at their /team route.
5
+ */
6
+ export declare function PlaceholderPage(): React.ReactElement;
7
+ //# sourceMappingURL=PlaceholderPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaceholderPage.d.ts","sourceRoot":"","sources":["../../../src/client/pages/PlaceholderPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;GAGG;AACH,wBAAgB,eAAe,IAAI,KAAK,CAAC,YAAY,CAYpD"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PlaceholderCard } from '../components/PlaceholderCard.js';
3
+ /**
4
+ * PlaceholderPage — full-page wrapper for the PlaceholderCard.
5
+ * Host products mount this at their /team route.
6
+ */
7
+ export function PlaceholderPage() {
8
+ return (_jsx("div", { style: {
9
+ minHeight: '100vh',
10
+ display: 'flex',
11
+ alignItems: 'center',
12
+ justifyContent: 'center',
13
+ backgroundColor: '#f8fafc',
14
+ }, children: _jsx(PlaceholderCard, {}) }));
15
+ }
16
+ //# sourceMappingURL=PlaceholderPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaceholderPage.js","sourceRoot":"","sources":["../../../src/client/pages/PlaceholderPage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CACL,cAAK,KAAK,EAAE;YACV,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,SAAS;SAC3B,YACC,KAAC,eAAe,KAAG,GACf,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function SuperAdminDashboard(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SuperAdminDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuperAdminDashboard.d.ts","sourceRoot":"","sources":["../../../src/client/pages/SuperAdminDashboard.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,mBAAmB,4CAiXlC"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { adminListOrgs, adminGetOrg, adminRestoreOrg, adminAppointOwner, adminHardDeleteOrg, adminAddMember, adminRemoveMember, adminLockUser, adminUnlockUser, adminResetPassword, } from '../api.js';
4
+ import { RoleBadge } from '../components/RoleBadge.js';
5
+ export function SuperAdminDashboard() {
6
+ const [orgs, setOrgs] = useState([]);
7
+ const [loading, setLoading] = useState(true);
8
+ const [error, setError] = useState(null);
9
+ const [search, setSearch] = useState('');
10
+ const [expandedOrg, setExpandedOrg] = useState(null);
11
+ const [orgDetail, setOrgDetail] = useState(null);
12
+ const [modal, setModal] = useState({ type: null });
13
+ const [reason, setReason] = useState('');
14
+ const [targetUserId, setTargetUserId] = useState('');
15
+ const [addRole, setAddRole] = useState('member');
16
+ const [submitting, setSubmitting] = useState(false);
17
+ const [actionError, setActionError] = useState(null);
18
+ const [actionSuccess, setActionSuccess] = useState(null);
19
+ useEffect(() => {
20
+ adminListOrgs()
21
+ .then(setOrgs)
22
+ .catch((e) => setError(e.message))
23
+ .finally(() => setLoading(false));
24
+ }, []);
25
+ async function expandOrg(id) {
26
+ if (expandedOrg === id) {
27
+ setExpandedOrg(null);
28
+ setOrgDetail(null);
29
+ return;
30
+ }
31
+ setExpandedOrg(id);
32
+ setOrgDetail(null);
33
+ try {
34
+ const detail = await adminGetOrg(id);
35
+ setOrgDetail(detail);
36
+ }
37
+ catch (e) {
38
+ console.error(e);
39
+ }
40
+ }
41
+ function openModal(type, orgId, userId) {
42
+ setModal({ type, orgId, userId });
43
+ setReason('');
44
+ setTargetUserId('');
45
+ setAddRole('member');
46
+ setActionError(null);
47
+ setActionSuccess(null);
48
+ }
49
+ async function handleAction() {
50
+ if (!modal.type)
51
+ return;
52
+ setSubmitting(true);
53
+ setActionError(null);
54
+ try {
55
+ const uid = parseInt(targetUserId, 10);
56
+ switch (modal.type) {
57
+ case 'restore':
58
+ await adminRestoreOrg(modal.orgId);
59
+ setActionSuccess('Organization restored.');
60
+ break;
61
+ case 'appoint_owner':
62
+ await adminAppointOwner(modal.orgId, uid, reason);
63
+ setActionSuccess('Owner appointed.');
64
+ break;
65
+ case 'hard_delete':
66
+ await adminHardDeleteOrg(modal.orgId, reason);
67
+ setActionSuccess('Organization hard-deleted.');
68
+ break;
69
+ case 'add_member':
70
+ await adminAddMember(modal.orgId, uid, addRole, reason);
71
+ setActionSuccess('Member added.');
72
+ break;
73
+ case 'remove_member':
74
+ await adminRemoveMember(modal.orgId, modal.userId ?? uid, reason);
75
+ setActionSuccess('Member removed.');
76
+ break;
77
+ case 'lock_user':
78
+ await adminLockUser(modal.userId ?? uid, reason);
79
+ setActionSuccess('User locked.');
80
+ break;
81
+ case 'unlock_user':
82
+ await adminUnlockUser(modal.userId ?? uid, reason);
83
+ setActionSuccess('User unlocked.');
84
+ break;
85
+ case 'reset_password':
86
+ await adminResetPassword(modal.userId ?? uid, reason);
87
+ setActionSuccess('Password reset email sent.');
88
+ break;
89
+ }
90
+ // Refresh org list
91
+ const updated = await adminListOrgs();
92
+ setOrgs(updated);
93
+ if (modal.orgId && expandedOrg === modal.orgId) {
94
+ const detail = await adminGetOrg(modal.orgId);
95
+ setOrgDetail(detail);
96
+ }
97
+ }
98
+ catch (err) {
99
+ setActionError(err instanceof Error ? err.message : 'Action failed');
100
+ }
101
+ finally {
102
+ setSubmitting(false);
103
+ }
104
+ }
105
+ const filtered = orgs.filter((o) => o.name.toLowerCase().includes(search.toLowerCase()) ||
106
+ o.slug.toLowerCase().includes(search.toLowerCase()) ||
107
+ o.owner_email.toLowerCase().includes(search.toLowerCase()));
108
+ const modalTitles = {
109
+ restore: 'Restore Organization',
110
+ appoint_owner: 'Appoint New Owner',
111
+ hard_delete: 'Hard Delete Organization',
112
+ add_member: 'Add Member',
113
+ remove_member: 'Remove Member',
114
+ lock_user: 'Lock User',
115
+ unlock_user: 'Unlock User',
116
+ reset_password: 'Reset User Password',
117
+ };
118
+ const needsTargetUser = (type) => ['appoint_owner', 'add_member', 'lock_user', 'unlock_user', 'reset_password'].includes(type ?? '');
119
+ return (_jsxs("div", { className: "max-w-6xl mx-auto px-4 py-8", children: [_jsxs("div", { className: "flex items-center gap-3 mb-6", children: [_jsx("span", { className: "inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-purple-100 text-purple-800 border border-purple-300", children: "SUPER ADMIN" }), _jsx("h1", { className: "text-2xl font-bold text-slate-900", children: "Admin Dashboard" })] }), error && (_jsx("div", { className: "rounded-md bg-red-50 border border-red-200 px-4 py-3 text-sm text-red-700 mb-6", children: error })), _jsx("div", { className: "mb-4", children: _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search orgs by name, slug, or owner email\u2026", 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" }) }), 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("div", { className: "space-y-2", children: [filtered.map((org) => (_jsxs("div", { className: "rounded-lg border border-slate-200 shadow-sm overflow-hidden", children: [_jsxs("div", { className: "flex items-center gap-4 px-4 py-3 bg-white hover:bg-slate-50 transition-colors", children: [_jsxs("button", { onClick: () => expandOrg(org.id), className: "flex-1 flex items-center gap-4 text-left", children: [_jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm font-semibold text-slate-900", children: org.name }), _jsxs("span", { className: "text-xs text-slate-400 font-mono", children: ["/", org.slug] }), org.deleted_at && (_jsx("span", { className: "inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-red-100 text-red-700", children: "Deleted" }))] }), _jsxs("div", { className: "flex items-center gap-4 mt-0.5 text-xs text-slate-500", children: [_jsxs("span", { children: ["Owner: ", org.owner_email] }), _jsxs("span", { children: [org.member_count, " members"] }), _jsxs("span", { children: ["Created ", new Date(org.created_at).toLocaleDateString()] })] })] }), _jsx("svg", { className: `h-4 w-4 text-slate-400 transition-transform ${expandedOrg === org.id ? 'rotate-180' : ''}`, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })] }), _jsx("div", { className: "flex gap-2 shrink-0", children: org.deleted_at ? (_jsx("button", { onClick: () => openModal('restore', org.id), className: "text-xs text-green-600 hover:text-green-800 font-medium border border-green-300 rounded px-2 py-1 hover:bg-green-50 transition-colors", children: "Restore" })) : (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => openModal('appoint_owner', org.id), className: "text-xs text-blue-600 hover:text-blue-800 font-medium border border-blue-300 rounded px-2 py-1 hover:bg-blue-50 transition-colors", children: "Appoint Owner" }), _jsx("button", { onClick: () => openModal('add_member', org.id), className: "text-xs text-slate-600 hover:text-slate-800 font-medium border border-slate-300 rounded px-2 py-1 hover:bg-slate-50 transition-colors", children: "Add Member" }), _jsx("button", { onClick: () => openModal('hard_delete', org.id), className: "text-xs text-red-600 hover:text-red-800 font-medium border border-red-300 rounded px-2 py-1 hover:bg-red-50 transition-colors", children: "Hard Delete" })] })) })] }), expandedOrg === org.id && (_jsx("div", { className: "border-t border-slate-100 bg-slate-50 px-4 py-3", children: !orgDetail ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-slate-500", children: [_jsx("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-blue-400 border-t-transparent" }), "Loading members\u2026"] })) : (_jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { children: _jsxs("tr", { className: "text-xs text-slate-500 border-b border-slate-200", children: [_jsx("th", { className: "pb-2 text-left font-medium", children: "Member" }), _jsx("th", { className: "pb-2 text-left font-medium", children: "Role" }), _jsx("th", { className: "pb-2 text-left font-medium", children: "Joined" }), _jsx("th", { className: "pb-2 text-right font-medium", children: "Actions" })] }) }), _jsx("tbody", { children: orgDetail.members.map((m) => (_jsxs("tr", { className: "border-b border-slate-100 last:border-0", children: [_jsx("td", { className: "py-2 pr-4", children: _jsxs("div", { children: [_jsx("span", { className: "font-medium text-slate-800", children: m.name ?? m.email }), m.name && _jsx("span", { className: "ml-2 text-xs text-slate-400", children: m.email })] }) }), _jsx("td", { className: "py-2 pr-4", children: _jsx(RoleBadge, { role: m.role }) }), _jsx("td", { className: "py-2 pr-4 text-xs text-slate-500", children: new Date(m.joined_at).toLocaleDateString() }), _jsx("td", { className: "py-2 text-right", children: _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { onClick: () => openModal('lock_user', org.id, m.user_id), className: "text-xs text-amber-600 hover:text-amber-800 font-medium", children: "Lock" }), _jsx("button", { onClick: () => openModal('unlock_user', org.id, m.user_id), className: "text-xs text-green-600 hover:text-green-800 font-medium", children: "Unlock" }), _jsx("button", { onClick: () => openModal('reset_password', org.id, m.user_id), className: "text-xs text-blue-600 hover:text-blue-800 font-medium", children: "Reset PW" }), _jsx("button", { onClick: () => openModal('remove_member', org.id, m.user_id), className: "text-xs text-red-600 hover:text-red-800 font-medium", children: "Remove" })] }) })] }, m.id))) })] })) }))] }, org.id))), filtered.length === 0 && (_jsx("p", { className: "text-center text-sm text-slate-500 py-8", children: "No organizations found." }))] })), modal.type && (_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-4", children: modalTitles[modal.type] }), needsTargetUser(modal.type) && !modal.userId && (_jsxs("div", { className: "mb-4", children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "Target User ID" }), _jsx("input", { type: "number", value: targetUserId, onChange: (e) => setTargetUserId(e.target.value), placeholder: "User ID", 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" })] })), modal.type === 'add_member' && (_jsxs("div", { className: "mb-4", children: [_jsx("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: "Role" }), _jsxs("select", { value: addRole, onChange: (e) => setAddRole(e.target.value), 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", children: [_jsx("option", { value: "admin", children: "Admin" }), _jsx("option", { value: "member", children: "Member" }), _jsx("option", { value: "viewer", children: "Viewer" })] })] })), _jsxs("div", { className: "mb-4", children: [_jsxs("label", { className: "block text-sm font-medium text-slate-700 mb-1", children: ["Reason ", _jsx("span", { className: "text-red-500", children: "*" })] }), _jsx("textarea", { value: reason, onChange: (e) => setReason(e.target.value), rows: 3, placeholder: "Provide a reason for this action (required for audit log)", 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 resize-none" })] }), actionError && _jsx("p", { className: "mb-3 text-sm text-red-600", children: actionError }), actionSuccess && _jsx("p", { className: "mb-3 text-sm text-green-600", children: actionSuccess }), _jsxs("div", { className: "flex gap-3 justify-end", children: [_jsx("button", { onClick: () => setModal({ type: 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: actionSuccess ? 'Close' : 'Cancel' }), !actionSuccess && (_jsx("button", { onClick: handleAction, disabled: submitting || !reason.trim(), className: `rounded-md px-4 py-2 text-sm font-medium text-white focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:opacity-50 disabled:cursor-not-allowed transition-colors ${modal.type === 'hard_delete' || modal.type === 'remove_member' || modal.type === 'lock_user'
120
+ ? 'bg-red-600 hover:bg-red-700 focus:ring-red-500'
121
+ : 'bg-blue-600 hover:bg-blue-700 focus:ring-blue-500'}`, children: submitting ? 'Processing…' : 'Confirm' }))] })] }) }))] }));
122
+ }
123
+ //# sourceMappingURL=SuperAdminDashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuperAdminDashboard.js","sourceRoot":"","sources":["../../../src/client/pages/SuperAdminDashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface TeamManagementTheme {
2
+ paper: string;
3
+ brick: string;
4
+ brass: string;
5
+ ink: string;
6
+ fontHeading: string;
7
+ fontBody: string;
8
+ }
9
+ export declare const DEFAULT_TEAM_THEME: TeamManagementTheme;
10
+ export declare function setTeamTheme(theme: Partial<TeamManagementTheme>): void;
11
+ export declare function getTeamTheme(): TeamManagementTheme;
12
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/client/theme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,EAAE,mBAOhC,CAAC;AAIF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEtE;AAED,wBAAgB,YAAY,IAAI,mBAAmB,CAElD"}
@@ -0,0 +1,16 @@
1
+ export const DEFAULT_TEAM_THEME = {
2
+ paper: '#FAF7F0',
3
+ brick: '#8B3A2F',
4
+ brass: '#B8893E',
5
+ ink: '#211D18',
6
+ fontHeading: '"Fraunces", Georgia, serif',
7
+ fontBody: '"Inter", system-ui, sans-serif',
8
+ };
9
+ let activeTheme = DEFAULT_TEAM_THEME;
10
+ export function setTeamTheme(theme) {
11
+ activeTheme = { ...DEFAULT_TEAM_THEME, ...theme };
12
+ }
13
+ export function getTeamTheme() {
14
+ return activeTheme;
15
+ }
16
+ //# sourceMappingURL=theme.js.map