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