@burdenoff/microfe-workspaces 2026.510.50
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/README.md +88 -0
- package/dist/WorkspacesRoot.d.ts +35 -0
- package/dist/WorkspacesRoot.d.ts.map +1 -0
- package/dist/WorkspacesRoot.js +71 -0
- package/dist/WorkspacesRoot.js.map +1 -0
- package/dist/WorkspacesRoutes.d.ts +10 -0
- package/dist/WorkspacesRoutes.d.ts.map +1 -0
- package/dist/WorkspacesRoutes.js +111 -0
- package/dist/WorkspacesRoutes.js.map +1 -0
- package/dist/components/CreateProjectDialog.d.ts +6 -0
- package/dist/components/CreateProjectDialog.d.ts.map +1 -0
- package/dist/components/CreateProjectDialog.js +115 -0
- package/dist/components/CreateProjectDialog.js.map +1 -0
- package/dist/components/CreateWorkspaceDialog.d.ts +2 -0
- package/dist/components/CreateWorkspaceDialog.d.ts.map +1 -0
- package/dist/components/CreateWorkspaceDialog.js +172 -0
- package/dist/components/CreateWorkspaceDialog.js.map +1 -0
- package/dist/components/InviteMemberDialog.d.ts +7 -0
- package/dist/components/InviteMemberDialog.d.ts.map +1 -0
- package/dist/components/InviteMemberDialog.js +148 -0
- package/dist/components/InviteMemberDialog.js.map +1 -0
- package/dist/components/MemberListItem.d.ts +11 -0
- package/dist/components/MemberListItem.d.ts.map +1 -0
- package/dist/components/MemberListItem.js +118 -0
- package/dist/components/MemberListItem.js.map +1 -0
- package/dist/components/ProjectCard.d.ts +13 -0
- package/dist/components/ProjectCard.d.ts.map +1 -0
- package/dist/components/ProjectCard.js +150 -0
- package/dist/components/ProjectCard.js.map +1 -0
- package/dist/components/WorkspaceCard.d.ts +8 -0
- package/dist/components/WorkspaceCard.d.ts.map +1 -0
- package/dist/components/WorkspaceCard.js +79 -0
- package/dist/components/WorkspaceCard.js.map +1 -0
- package/dist/components/WorkspacesErrorBoundary.d.ts +27 -0
- package/dist/components/WorkspacesErrorBoundary.d.ts.map +1 -0
- package/dist/components/WorkspacesErrorBoundary.js +136 -0
- package/dist/components/WorkspacesErrorBoundary.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +7 -0
- package/dist/constants/permissions.d.ts +33 -0
- package/dist/constants/permissions.d.ts.map +1 -0
- package/dist/constants/permissions.js +31 -0
- package/dist/constants/permissions.js.map +1 -0
- package/dist/generated/global-operations.d.ts +279 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +103 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20714 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2209 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +576 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +54990 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/useMemberMutations.d.ts +61 -0
- package/dist/hooks/useMemberMutations.d.ts.map +1 -0
- package/dist/hooks/useMemberMutations.js +263 -0
- package/dist/hooks/useMemberMutations.js.map +1 -0
- package/dist/hooks/useProjectMutations.d.ts +26 -0
- package/dist/hooks/useProjectMutations.d.ts.map +1 -0
- package/dist/hooks/useProjectMutations.js +127 -0
- package/dist/hooks/useProjectMutations.js.map +1 -0
- package/dist/hooks/useProjects.d.ts +16 -0
- package/dist/hooks/useProjects.d.ts.map +1 -0
- package/dist/hooks/useProjects.js +103 -0
- package/dist/hooks/useProjects.js.map +1 -0
- package/dist/hooks/useScopedNavigation.d.ts +4 -0
- package/dist/hooks/useScopedNavigation.d.ts.map +1 -0
- package/dist/hooks/useScopedNavigation.js +11 -0
- package/dist/hooks/useScopedNavigation.js.map +1 -0
- package/dist/hooks/useTenants.d.ts +13 -0
- package/dist/hooks/useTenants.d.ts.map +1 -0
- package/dist/hooks/useTenants.js +47 -0
- package/dist/hooks/useTenants.js.map +1 -0
- package/dist/hooks/useWorkspaceActivity.d.ts +12 -0
- package/dist/hooks/useWorkspaceActivity.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceActivity.js +31 -0
- package/dist/hooks/useWorkspaceActivity.js.map +1 -0
- package/dist/hooks/useWorkspaceMembers.d.ts +24 -0
- package/dist/hooks/useWorkspaceMembers.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceMembers.js +130 -0
- package/dist/hooks/useWorkspaceMembers.js.map +1 -0
- package/dist/hooks/useWorkspaceMutations.d.ts +36 -0
- package/dist/hooks/useWorkspaceMutations.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceMutations.js +119 -0
- package/dist/hooks/useWorkspaceMutations.js.map +1 -0
- package/dist/hooks/useWorkspacePermissions.d.ts +29 -0
- package/dist/hooks/useWorkspacePermissions.d.ts.map +1 -0
- package/dist/hooks/useWorkspacePermissions.js +33 -0
- package/dist/hooks/useWorkspacePermissions.js.map +1 -0
- package/dist/hooks/useWorkspaceRoles.d.ts +8 -0
- package/dist/hooks/useWorkspaceRoles.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceRoles.js +31 -0
- package/dist/hooks/useWorkspaceRoles.js.map +1 -0
- package/dist/hooks/useWorkspaces.d.ts +21 -0
- package/dist/hooks/useWorkspaces.d.ts.map +1 -0
- package/dist/hooks/useWorkspaces.js +75 -0
- package/dist/hooks/useWorkspaces.js.map +1 -0
- package/dist/hooks/useWorkspacesEventEmitter.d.ts +14 -0
- package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +1 -0
- package/dist/hooks/useWorkspacesEventEmitter.js +14 -0
- package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/pages/ActivityListPage.d.ts +2 -0
- package/dist/pages/ActivityListPage.d.ts.map +1 -0
- package/dist/pages/ActivityListPage.js +119 -0
- package/dist/pages/ActivityListPage.js.map +1 -0
- package/dist/pages/CreateWorkspacePage.d.ts +2 -0
- package/dist/pages/CreateWorkspacePage.d.ts.map +1 -0
- package/dist/pages/CreateWorkspacePage.js +264 -0
- package/dist/pages/CreateWorkspacePage.js.map +1 -0
- package/dist/pages/InviteAcceptancePage.d.ts +6 -0
- package/dist/pages/InviteAcceptancePage.d.ts.map +1 -0
- package/dist/pages/InviteAcceptancePage.js +495 -0
- package/dist/pages/InviteAcceptancePage.js.map +1 -0
- package/dist/pages/MembersListPage.d.ts +2 -0
- package/dist/pages/MembersListPage.d.ts.map +1 -0
- package/dist/pages/MembersListPage.js +420 -0
- package/dist/pages/MembersListPage.js.map +1 -0
- package/dist/pages/ProjectDetailPage.d.ts +2 -0
- package/dist/pages/ProjectDetailPage.d.ts.map +1 -0
- package/dist/pages/ProjectDetailPage.js +361 -0
- package/dist/pages/ProjectDetailPage.js.map +1 -0
- package/dist/pages/ProjectsListPage.d.ts +2 -0
- package/dist/pages/ProjectsListPage.d.ts.map +1 -0
- package/dist/pages/ProjectsListPage.js +398 -0
- package/dist/pages/ProjectsListPage.js.map +1 -0
- package/dist/pages/WorkspaceDetailPage.d.ts +2 -0
- package/dist/pages/WorkspaceDetailPage.d.ts.map +1 -0
- package/dist/pages/WorkspaceDetailPage.js +230 -0
- package/dist/pages/WorkspaceDetailPage.js.map +1 -0
- package/dist/pages/WorkspaceSettingsPage.d.ts +2 -0
- package/dist/pages/WorkspaceSettingsPage.d.ts.map +1 -0
- package/dist/pages/WorkspaceSettingsPage.js +157 -0
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -0
- package/dist/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/pages/WorkspacesListPage.js +186 -0
- package/dist/pages/WorkspacesListPage.js.map +1 -0
- package/dist/pages/dashboard/DashboardCustomizer.d.ts +12 -0
- package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardCustomizer.js +136 -0
- package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -0
- package/dist/pages/dashboard/DashboardGrid.d.ts +8 -0
- package/dist/pages/dashboard/DashboardGrid.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardGrid.js +58 -0
- package/dist/pages/dashboard/DashboardGrid.js.map +1 -0
- package/dist/pages/dashboard/DashboardPage.d.ts +14 -0
- package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardPage.js +136 -0
- package/dist/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/pages/dashboard/WidgetWrapper.d.ts +17 -0
- package/dist/pages/dashboard/WidgetWrapper.d.ts.map +1 -0
- package/dist/pages/dashboard/WidgetWrapper.js +72 -0
- package/dist/pages/dashboard/WidgetWrapper.js.map +1 -0
- package/dist/pages/dashboard/config.d.ts +9 -0
- package/dist/pages/dashboard/config.d.ts.map +1 -0
- package/dist/pages/dashboard/config.js +214 -0
- package/dist/pages/dashboard/config.js.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts +9 -0
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardData.js +118 -0
- package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +4 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.js +32 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.js.map +1 -0
- package/dist/pages/dashboard/types.d.ts +145 -0
- package/dist/pages/dashboard/types.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.js +59 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/MembersWidget.js +65 -0
- package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.js +91 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js +80 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js +81 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/StorageWidget.js +69 -0
- package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js +59 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +61 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/TipsWidget.js +67 -0
- package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +83 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +71 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +97 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js +67 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -0
- package/dist/providers/WorkspacesProvider.d.ts +13 -0
- package/dist/providers/WorkspacesProvider.d.ts.map +1 -0
- package/dist/providers/WorkspacesProvider.js +24 -0
- package/dist/providers/WorkspacesProvider.js.map +1 -0
- package/dist/store/workspacesStore.d.ts +82 -0
- package/dist/store/workspacesStore.d.ts.map +1 -0
- package/dist/store/workspacesStore.js +92 -0
- package/dist/store/workspacesStore.js.map +1 -0
- package/dist/types/index.d.ts +280 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/formatters.d.ts +60 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +61 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/dist/utils/projectTags.d.ts +6 -0
- package/dist/utils/projectTags.d.ts.map +1 -0
- package/dist/utils/projectTags.js +49 -0
- package/dist/utils/projectTags.js.map +1 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +8 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/tokenHelpers.d.ts +114 -0
- package/dist/utils/tokenHelpers.d.ts.map +1 -0
- package/dist/utils/tokenHelpers.js +80 -0
- package/dist/utils/tokenHelpers.js.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { useWorkspacesContext as e } from "../providers/WorkspacesProvider.js";
|
|
2
|
+
import { useWorkspacesStore as t } from "../store/workspacesStore.js";
|
|
3
|
+
import { WORKSPACE_PERMISSIONS as n } from "../constants/permissions.js";
|
|
4
|
+
import { nativeConfirm as r, nativeImpact as ee } from "../utils/nativeBridge.js";
|
|
5
|
+
import { useWorkspaceInvitations as te, useWorkspaceMembers as i } from "../hooks/useWorkspaceMembers.js";
|
|
6
|
+
import { useRemoveUserFromWorkspace as ne, useResendInvitation as re } from "../hooks/useMemberMutations.js";
|
|
7
|
+
import { MemberListItem as ie } from "../components/MemberListItem.js";
|
|
8
|
+
import { InviteMemberDialog as ae } from "../components/InviteMemberDialog.js";
|
|
9
|
+
import { useWorkspacePermissions as oe } from "../hooks/useWorkspacePermissions.js";
|
|
10
|
+
import { useCallback as se, useEffect as a, useMemo as o, useState as s } from "react";
|
|
11
|
+
import { AlertCircle as ce, RefreshCw as le, Search as c, UserPlus as l, Users as u } from "lucide-react";
|
|
12
|
+
import { Fragment as ue, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
13
|
+
import { Badge as p, Button as m, Input as de, Skeleton as h } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
import { useParams as g } from "react-router-dom";
|
|
15
|
+
import { useDebounce as _ } from "@burdenoff/fe-libs/shared/hooks";
|
|
16
|
+
import { PermissionButton as v } from "@burdenoff/fe-libs/shared/components";
|
|
17
|
+
import { useI18n as fe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
18
|
+
//#region src/pages/MembersListPage.tsx
|
|
19
|
+
function y() {
|
|
20
|
+
let { t: y } = fe(), b = se((e, t) => {
|
|
21
|
+
let n = y(e);
|
|
22
|
+
return n === e ? t : n;
|
|
23
|
+
}, [y]), { memberFilters: pe, setMemberFilters: x, selectedMemberIds: S, toggleMemberSelection: C, clearMemberSelection: w, openInviteMemberDialog: me } = t(), { workspaceId: he } = e(), { workspaceId: ge } = g(), T = ge || he, [E, D] = s(pe.search || ""), O = _(E, 500);
|
|
24
|
+
a(() => {
|
|
25
|
+
x({ search: O });
|
|
26
|
+
}, [O, x]);
|
|
27
|
+
let { data: k, isLoading: _e, error: A } = i(T || ""), { data: j, isLoading: M } = te(T || "", "PENDING"), { mutate: N, isPending: P } = re(), { mutate: F, isPending: I } = ne(), [L, R] = s(null), [z, B] = s(/* @__PURE__ */ new Set()), ve = (e) => {
|
|
28
|
+
R(e), N(e, {
|
|
29
|
+
onSuccess: () => {
|
|
30
|
+
R(null);
|
|
31
|
+
},
|
|
32
|
+
onError: (e) => {
|
|
33
|
+
console.error("Failed to resend invitation:", e), R(null);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}, V = o(() => k?.items || [], [k?.items]), H = o(() => j?.items || [], [j?.items]), U = _e || M, W = V.length > 0, G = H.length > 0, K = V.filter((e) => O ? e.userId.toLowerCase().includes(O.toLowerCase()) : !0), q = o(() => K.filter((e) => S.has(e.id)), [K, S]), J = o(() => H.filter((e) => z.has(e.id)), [H, z]), Y = K.length > 0 && K.every((e) => S.has(e.id)), ye = K.some((e) => S.has(e.id)) && !Y, X = H.length > 0 && H.every((e) => z.has(e.id)), be = H.some((e) => z.has(e.id)) && !X;
|
|
37
|
+
a(() => () => w(), [w]);
|
|
38
|
+
let { canListMembers: xe, canInviteMember: Z, canRemoveMember: Q, isLoading: Se } = oe();
|
|
39
|
+
if (Se) return /* @__PURE__ */ f("div", {
|
|
40
|
+
className: "space-y-4 p-6",
|
|
41
|
+
children: [/* @__PURE__ */ d(h, { className: "h-10 w-1/3" }), /* @__PURE__ */ d(h, { className: "h-64" })]
|
|
42
|
+
});
|
|
43
|
+
if (!xe && !Z) return /* @__PURE__ */ d("div", {
|
|
44
|
+
className: "flex items-center justify-center min-h-[400px]",
|
|
45
|
+
children: /* @__PURE__ */ f("div", {
|
|
46
|
+
className: "text-center space-y-2",
|
|
47
|
+
children: [/* @__PURE__ */ d("h2", {
|
|
48
|
+
className: "text-lg font-semibold",
|
|
49
|
+
children: b("membersList.accessDenied", "Access Denied")
|
|
50
|
+
}), /* @__PURE__ */ d("p", {
|
|
51
|
+
className: "text-sm text-muted-foreground",
|
|
52
|
+
children: b("membersList.noPermissionToViewMembers", "You don't have permission to view workspace members.")
|
|
53
|
+
})]
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
let $ = () => {
|
|
57
|
+
T && me({ id: T });
|
|
58
|
+
}, Ce = (e) => {
|
|
59
|
+
K.forEach((t) => {
|
|
60
|
+
e !== S.has(t.id) && C(t.id);
|
|
61
|
+
});
|
|
62
|
+
}, we = (e, t) => {
|
|
63
|
+
B((n) => {
|
|
64
|
+
let r = new Set(n);
|
|
65
|
+
return t ? r.add(e) : r.delete(e), r;
|
|
66
|
+
});
|
|
67
|
+
}, Te = (e) => {
|
|
68
|
+
B((t) => {
|
|
69
|
+
let n = new Set(t);
|
|
70
|
+
return H.forEach((t) => {
|
|
71
|
+
e ? n.add(t.id) : n.delete(t.id);
|
|
72
|
+
}), n;
|
|
73
|
+
});
|
|
74
|
+
}, Ee = async () => {
|
|
75
|
+
if (q.length === 0) return;
|
|
76
|
+
ee("medium");
|
|
77
|
+
let e = `${b("membersList.bulkRemoveConfirmPrefix", "Remove")} ${q.length} ${q.length === 1 ? b("membersList.bulkRemoveConfirmSingular", "selected member") : b("membersList.bulkRemoveConfirmPlural", "selected members")} ${b("membersList.bulkRemoveConfirmSuffix", "from this workspace?")}`, t = await r({
|
|
78
|
+
title: "Remove members",
|
|
79
|
+
message: e,
|
|
80
|
+
okButtonTitle: "Remove",
|
|
81
|
+
cancelButtonTitle: "Cancel"
|
|
82
|
+
});
|
|
83
|
+
(t === null ? window.confirm(e) : t) && (q.forEach((e) => {
|
|
84
|
+
F(e.userId);
|
|
85
|
+
}), w());
|
|
86
|
+
}, De = () => {
|
|
87
|
+
J.length !== 0 && J.forEach((e) => {
|
|
88
|
+
N(e.id, { onSuccess: () => {
|
|
89
|
+
B((t) => {
|
|
90
|
+
let n = new Set(t);
|
|
91
|
+
return n.delete(e.id), n;
|
|
92
|
+
});
|
|
93
|
+
} });
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
return /* @__PURE__ */ f(ue, { children: [/* @__PURE__ */ f("div", {
|
|
97
|
+
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ f("div", {
|
|
100
|
+
className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",
|
|
101
|
+
children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
|
|
102
|
+
className: "text-2xl sm:text-3xl font-bold",
|
|
103
|
+
children: b("membersList.pageTitle", "Members")
|
|
104
|
+
}), /* @__PURE__ */ d("p", {
|
|
105
|
+
className: "text-muted-foreground text-sm sm:text-base",
|
|
106
|
+
children: b("membersList.pageSubtitle", "Manage workspace members and invitations")
|
|
107
|
+
})] }), /* @__PURE__ */ d("div", {
|
|
108
|
+
className: "flex gap-2",
|
|
109
|
+
children: /* @__PURE__ */ d(v, {
|
|
110
|
+
permission: n.MEMBER_CREATE,
|
|
111
|
+
deniedBehavior: "disable",
|
|
112
|
+
deniedTooltip: b("membersList.noPermissionToInvite", "You don't have permission to invite members"),
|
|
113
|
+
children: /* @__PURE__ */ f(m, {
|
|
114
|
+
onClick: $,
|
|
115
|
+
disabled: !T,
|
|
116
|
+
children: [/* @__PURE__ */ d(l, { className: "h-4 w-4 sm:mr-2" }), /* @__PURE__ */ d("span", {
|
|
117
|
+
className: "hidden sm:inline",
|
|
118
|
+
children: b("membersList.inviteMember", "Invite Member")
|
|
119
|
+
})]
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
})]
|
|
123
|
+
}),
|
|
124
|
+
/* @__PURE__ */ f("div", {
|
|
125
|
+
className: "flex flex-col sm:flex-row gap-3 sm:gap-4",
|
|
126
|
+
children: [/* @__PURE__ */ f("div", {
|
|
127
|
+
className: "relative flex-1",
|
|
128
|
+
children: [/* @__PURE__ */ d(c, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ d(de, {
|
|
129
|
+
placeholder: b("membersList.searchPlaceholder", "Search members..."),
|
|
130
|
+
value: E,
|
|
131
|
+
onChange: (e) => D(e.target.value),
|
|
132
|
+
className: "pl-9"
|
|
133
|
+
})]
|
|
134
|
+
}), G && /* @__PURE__ */ d("div", {
|
|
135
|
+
className: "flex items-center gap-2",
|
|
136
|
+
children: /* @__PURE__ */ f(p, {
|
|
137
|
+
variant: "secondary",
|
|
138
|
+
className: "text-sm",
|
|
139
|
+
children: [
|
|
140
|
+
H.length,
|
|
141
|
+
" ",
|
|
142
|
+
H.length === 1 ? b("membersList.pendingInvitation", "Pending Invitation") : b("membersList.pendingInvitations", "Pending Invitations")
|
|
143
|
+
]
|
|
144
|
+
})
|
|
145
|
+
})]
|
|
146
|
+
}),
|
|
147
|
+
K.length > 0 && /* @__PURE__ */ f("div", {
|
|
148
|
+
className: "flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between",
|
|
149
|
+
children: [/* @__PURE__ */ f("label", {
|
|
150
|
+
className: "flex items-center gap-2 text-sm text-foreground",
|
|
151
|
+
children: [/* @__PURE__ */ d("input", {
|
|
152
|
+
type: "checkbox",
|
|
153
|
+
checked: Y,
|
|
154
|
+
ref: (e) => {
|
|
155
|
+
e && (e.indeterminate = ye && !Y);
|
|
156
|
+
},
|
|
157
|
+
onChange: (e) => Ce(e.target.checked),
|
|
158
|
+
"aria-label": b("membersList.selectAllMembersAriaLabel", "Select all workspace members"),
|
|
159
|
+
className: "h-4 w-4 rounded border-border text-primary"
|
|
160
|
+
}), /* @__PURE__ */ d("span", { children: b("membersList.selectAllVisibleMembers", "Select all visible members") })]
|
|
161
|
+
}), /* @__PURE__ */ f("div", {
|
|
162
|
+
className: "flex flex-wrap items-center gap-2",
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ f("span", {
|
|
165
|
+
className: "text-sm text-muted-foreground",
|
|
166
|
+
children: [
|
|
167
|
+
S.size,
|
|
168
|
+
" ",
|
|
169
|
+
b("membersList.selected", "selected")
|
|
170
|
+
]
|
|
171
|
+
}),
|
|
172
|
+
S.size > 0 && /* @__PURE__ */ d(m, {
|
|
173
|
+
variant: "ghost",
|
|
174
|
+
size: "sm",
|
|
175
|
+
onClick: w,
|
|
176
|
+
children: b("membersList.clearSelection", "Clear selection")
|
|
177
|
+
}),
|
|
178
|
+
Q && /* @__PURE__ */ f(m, {
|
|
179
|
+
variant: "outline",
|
|
180
|
+
size: "sm",
|
|
181
|
+
onClick: Ee,
|
|
182
|
+
disabled: q.length === 0 || I,
|
|
183
|
+
className: "text-destructive",
|
|
184
|
+
children: [b("membersList.removeSelected", "Remove Selected"), q.length > 0 ? ` (${q.length})` : ""]
|
|
185
|
+
})
|
|
186
|
+
]
|
|
187
|
+
})]
|
|
188
|
+
}),
|
|
189
|
+
U && /* @__PURE__ */ d("div", {
|
|
190
|
+
className: "space-y-3",
|
|
191
|
+
children: [...[
|
|
192
|
+
,
|
|
193
|
+
,
|
|
194
|
+
,
|
|
195
|
+
,
|
|
196
|
+
,
|
|
197
|
+
]].map((e, t) => /* @__PURE__ */ d(h, { className: "h-20 w-full" }, t))
|
|
198
|
+
}),
|
|
199
|
+
!U && A && /* @__PURE__ */ f("div", {
|
|
200
|
+
className: "flex flex-col items-center justify-center py-12 text-center",
|
|
201
|
+
children: [
|
|
202
|
+
/* @__PURE__ */ d("div", {
|
|
203
|
+
className: "rounded-full bg-destructive/10 p-6 mb-4",
|
|
204
|
+
children: /* @__PURE__ */ d(ce, {
|
|
205
|
+
size: 48,
|
|
206
|
+
className: "text-destructive"
|
|
207
|
+
})
|
|
208
|
+
}),
|
|
209
|
+
/* @__PURE__ */ d("h3", {
|
|
210
|
+
className: "text-lg font-semibold mb-2",
|
|
211
|
+
children: b("membersList.failedToLoad", "Failed to Load Members")
|
|
212
|
+
}),
|
|
213
|
+
/* @__PURE__ */ d("p", {
|
|
214
|
+
className: "text-muted-foreground max-w-sm",
|
|
215
|
+
children: A instanceof Error ? A.message : b("membersList.errorLoadingMembers", "An error occurred while loading members")
|
|
216
|
+
})
|
|
217
|
+
]
|
|
218
|
+
}),
|
|
219
|
+
!U && !A && !T && /* @__PURE__ */ f("div", {
|
|
220
|
+
className: "flex flex-col items-center justify-center py-12 text-center",
|
|
221
|
+
children: [
|
|
222
|
+
/* @__PURE__ */ d("div", {
|
|
223
|
+
className: "rounded-full bg-muted p-6 mb-4",
|
|
224
|
+
children: /* @__PURE__ */ d(u, {
|
|
225
|
+
size: 48,
|
|
226
|
+
className: "text-muted-foreground"
|
|
227
|
+
})
|
|
228
|
+
}),
|
|
229
|
+
/* @__PURE__ */ d("h3", {
|
|
230
|
+
className: "text-lg font-semibold mb-2",
|
|
231
|
+
children: b("membersList.noWorkspaceSelected", "No Workspace Selected")
|
|
232
|
+
}),
|
|
233
|
+
/* @__PURE__ */ d("p", {
|
|
234
|
+
className: "text-muted-foreground max-w-sm",
|
|
235
|
+
children: b("membersList.selectWorkspacePrompt", "Select a workspace to view and manage its members")
|
|
236
|
+
})
|
|
237
|
+
]
|
|
238
|
+
}),
|
|
239
|
+
!U && !A && T && !W && /* @__PURE__ */ f("div", {
|
|
240
|
+
className: "flex flex-col items-center justify-center py-12 text-center",
|
|
241
|
+
children: [
|
|
242
|
+
/* @__PURE__ */ d("div", {
|
|
243
|
+
className: "rounded-full bg-muted p-6 mb-4",
|
|
244
|
+
children: /* @__PURE__ */ d(u, {
|
|
245
|
+
size: 48,
|
|
246
|
+
className: "text-muted-foreground"
|
|
247
|
+
})
|
|
248
|
+
}),
|
|
249
|
+
/* @__PURE__ */ d("h3", {
|
|
250
|
+
className: "text-lg font-semibold mb-2",
|
|
251
|
+
children: b("membersList.noMembersYet", "No Members Yet")
|
|
252
|
+
}),
|
|
253
|
+
/* @__PURE__ */ d("p", {
|
|
254
|
+
className: "text-muted-foreground max-w-sm mb-4",
|
|
255
|
+
children: b("membersList.noMembersPrompt", "Start building your team by inviting members to this workspace")
|
|
256
|
+
}),
|
|
257
|
+
/* @__PURE__ */ d(v, {
|
|
258
|
+
permission: n.MEMBER_CREATE,
|
|
259
|
+
deniedBehavior: "disable",
|
|
260
|
+
deniedTooltip: b("membersList.noPermissionToInvite", "You don't have permission to invite members"),
|
|
261
|
+
children: /* @__PURE__ */ f(m, {
|
|
262
|
+
onClick: $,
|
|
263
|
+
children: [/* @__PURE__ */ d(l, { className: "mr-2 h-4 w-4" }), b("membersList.inviteFirstMember", "Invite Your First Member")]
|
|
264
|
+
})
|
|
265
|
+
})
|
|
266
|
+
]
|
|
267
|
+
}),
|
|
268
|
+
!U && !A && T && W && K.length === 0 && /* @__PURE__ */ f("div", {
|
|
269
|
+
className: "flex flex-col items-center justify-center py-12 text-center",
|
|
270
|
+
children: [
|
|
271
|
+
/* @__PURE__ */ d("div", {
|
|
272
|
+
className: "rounded-full bg-muted p-6 mb-4",
|
|
273
|
+
children: /* @__PURE__ */ d(c, {
|
|
274
|
+
size: 48,
|
|
275
|
+
className: "text-muted-foreground"
|
|
276
|
+
})
|
|
277
|
+
}),
|
|
278
|
+
/* @__PURE__ */ d("h3", {
|
|
279
|
+
className: "text-lg font-semibold mb-2",
|
|
280
|
+
children: b("membersList.noMembersFound", "No Members Found")
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ d("p", {
|
|
283
|
+
className: "text-muted-foreground max-w-sm",
|
|
284
|
+
children: b("membersList.noMembersFoundPrompt", "No members match your search criteria. Try adjusting your search.")
|
|
285
|
+
})
|
|
286
|
+
]
|
|
287
|
+
}),
|
|
288
|
+
!U && K.length > 0 && /* @__PURE__ */ f("div", {
|
|
289
|
+
className: "space-y-3",
|
|
290
|
+
children: [/* @__PURE__ */ d("div", {
|
|
291
|
+
className: "flex items-center justify-between",
|
|
292
|
+
children: /* @__PURE__ */ f("h2", {
|
|
293
|
+
className: "text-lg font-semibold",
|
|
294
|
+
children: [
|
|
295
|
+
b("membersList.activeMembers", "Active Members"),
|
|
296
|
+
" (",
|
|
297
|
+
K.length,
|
|
298
|
+
")"
|
|
299
|
+
]
|
|
300
|
+
})
|
|
301
|
+
}), /* @__PURE__ */ d("div", {
|
|
302
|
+
className: "space-y-2",
|
|
303
|
+
children: K.map((e) => /* @__PURE__ */ d(ie, {
|
|
304
|
+
member: e,
|
|
305
|
+
selected: S.has(e.id),
|
|
306
|
+
onToggleSelect: (t) => {
|
|
307
|
+
t !== S.has(e.id) && C(e.id);
|
|
308
|
+
},
|
|
309
|
+
canRemove: Q
|
|
310
|
+
}, e.id))
|
|
311
|
+
})]
|
|
312
|
+
}),
|
|
313
|
+
!U && G && /* @__PURE__ */ f("div", {
|
|
314
|
+
className: "space-y-3",
|
|
315
|
+
children: [
|
|
316
|
+
/* @__PURE__ */ d("h2", {
|
|
317
|
+
className: "text-lg font-semibold",
|
|
318
|
+
children: b("membersList.pendingInvitationsHeader", "Pending Invitations")
|
|
319
|
+
}),
|
|
320
|
+
/* @__PURE__ */ f("div", {
|
|
321
|
+
className: "flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between",
|
|
322
|
+
children: [/* @__PURE__ */ f("label", {
|
|
323
|
+
className: "flex items-center gap-2 text-sm text-foreground",
|
|
324
|
+
children: [/* @__PURE__ */ d("input", {
|
|
325
|
+
type: "checkbox",
|
|
326
|
+
checked: X,
|
|
327
|
+
ref: (e) => {
|
|
328
|
+
e && (e.indeterminate = be && !X);
|
|
329
|
+
},
|
|
330
|
+
onChange: (e) => Te(e.target.checked),
|
|
331
|
+
"aria-label": b("membersList.selectAllInvitationsAriaLabel", "Select all pending invitations"),
|
|
332
|
+
className: "h-4 w-4 rounded border-border text-primary"
|
|
333
|
+
}), /* @__PURE__ */ d("span", { children: b("membersList.selectAllInvitations", "Select all invitations") })]
|
|
334
|
+
}), /* @__PURE__ */ f("div", {
|
|
335
|
+
className: "flex flex-wrap items-center gap-2",
|
|
336
|
+
children: [
|
|
337
|
+
/* @__PURE__ */ f("span", {
|
|
338
|
+
className: "text-sm text-muted-foreground",
|
|
339
|
+
children: [
|
|
340
|
+
z.size,
|
|
341
|
+
" ",
|
|
342
|
+
b("membersList.selected", "selected")
|
|
343
|
+
]
|
|
344
|
+
}),
|
|
345
|
+
z.size > 0 && /* @__PURE__ */ d(m, {
|
|
346
|
+
variant: "ghost",
|
|
347
|
+
size: "sm",
|
|
348
|
+
onClick: () => B(/* @__PURE__ */ new Set()),
|
|
349
|
+
children: b("membersList.clearSelection", "Clear selection")
|
|
350
|
+
}),
|
|
351
|
+
Z && /* @__PURE__ */ f(m, {
|
|
352
|
+
variant: "outline",
|
|
353
|
+
size: "sm",
|
|
354
|
+
onClick: De,
|
|
355
|
+
disabled: J.length === 0 || P,
|
|
356
|
+
children: [b("membersList.resendSelected", "Resend Selected"), J.length > 0 ? ` (${J.length})` : ""]
|
|
357
|
+
})
|
|
358
|
+
]
|
|
359
|
+
})]
|
|
360
|
+
}),
|
|
361
|
+
/* @__PURE__ */ d("div", {
|
|
362
|
+
className: "space-y-2",
|
|
363
|
+
children: H.map((e) => /* @__PURE__ */ f("div", {
|
|
364
|
+
className: "flex items-center justify-between p-4 border rounded-lg bg-card",
|
|
365
|
+
children: [/* @__PURE__ */ f("div", {
|
|
366
|
+
className: "flex items-center gap-3",
|
|
367
|
+
children: [
|
|
368
|
+
/* @__PURE__ */ d("input", {
|
|
369
|
+
type: "checkbox",
|
|
370
|
+
checked: z.has(e.id),
|
|
371
|
+
onChange: (t) => we(e.id, t.target.checked),
|
|
372
|
+
"aria-label": `${b("membersList.selectInvitationAriaLabel", "Select invitation")} ${e.email}`,
|
|
373
|
+
className: "h-4 w-4 rounded border-border text-primary"
|
|
374
|
+
}),
|
|
375
|
+
/* @__PURE__ */ d("div", {
|
|
376
|
+
className: "w-10 h-10 rounded-full bg-status-warning/10 flex items-center justify-center transition-colors",
|
|
377
|
+
children: /* @__PURE__ */ d(u, { className: "h-5 w-5 text-status-warning" })
|
|
378
|
+
}),
|
|
379
|
+
/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
|
|
380
|
+
className: "font-medium text-sm",
|
|
381
|
+
children: e.email
|
|
382
|
+
}), /* @__PURE__ */ f("p", {
|
|
383
|
+
className: "text-xs text-muted-foreground",
|
|
384
|
+
children: [
|
|
385
|
+
b("membersList.invited", "Invited"),
|
|
386
|
+
" ",
|
|
387
|
+
new Date(e.createdAt).toLocaleDateString()
|
|
388
|
+
]
|
|
389
|
+
})] })
|
|
390
|
+
]
|
|
391
|
+
}), /* @__PURE__ */ f("div", {
|
|
392
|
+
className: "flex items-center gap-2",
|
|
393
|
+
children: [/* @__PURE__ */ d(v, {
|
|
394
|
+
permission: n.MEMBER_CREATE,
|
|
395
|
+
deniedBehavior: "disable",
|
|
396
|
+
deniedTooltip: b("membersList.noPermissionToResend", "You don't have permission to resend invitations"),
|
|
397
|
+
children: /* @__PURE__ */ f(m, {
|
|
398
|
+
variant: "outline",
|
|
399
|
+
size: "sm",
|
|
400
|
+
onClick: () => ve(e.id),
|
|
401
|
+
disabled: P && L === e.id,
|
|
402
|
+
children: [/* @__PURE__ */ d(le, { className: `h-4 w-4 mr-1 ${P && L === e.id ? "animate-spin" : ""}` }), P && L === e.id ? b("membersList.sending", "Sending...") : b("membersList.resend", "Resend")]
|
|
403
|
+
})
|
|
404
|
+
}), /* @__PURE__ */ d(p, {
|
|
405
|
+
variant: "outline",
|
|
406
|
+
className: "bg-status-warning/10 text-status-warning border-status-warning/30 transition-colors",
|
|
407
|
+
children: b("membersList.pending", "Pending")
|
|
408
|
+
})]
|
|
409
|
+
})]
|
|
410
|
+
}, e.id))
|
|
411
|
+
})
|
|
412
|
+
]
|
|
413
|
+
})
|
|
414
|
+
]
|
|
415
|
+
}), /* @__PURE__ */ d(ae, { workspaceId: T })] });
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
export { y as MembersListPage };
|
|
419
|
+
|
|
420
|
+
//# sourceMappingURL=MembersListPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MembersListPage.js","names":[],"sources":["../../src/pages/MembersListPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Users, UserPlus, Search, AlertCircle, RefreshCw } from 'lucide-react';\nimport { Button, Input, Skeleton, Badge } from '@burdenoff/fe-libs/ui';\nimport { useDebounce } from '@burdenoff/fe-libs/shared/hooks';\nimport { nativeConfirm, nativeImpact } from '../utils/nativeBridge';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { PermissionButton } from '@burdenoff/fe-libs/shared/components';\nimport { WORKSPACE_PERMISSIONS } from '../constants/permissions';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesStore } from '../store/workspacesStore';\nimport { useWorkspaceMembers, useWorkspaceInvitations } from '../hooks/useWorkspaceMembers';\nimport { useRemoveUserFromWorkspace, useResendInvitation } from '../hooks/useMemberMutations';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { MemberListItem } from '../components/MemberListItem';\nimport { InviteMemberDialog } from '../components/InviteMemberDialog';\nimport type { Workspace } from '../types';\n\nexport function MembersListPage() {\n const { t } = useI18n();\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const {\n memberFilters,\n setMemberFilters,\n selectedMemberIds,\n toggleMemberSelection,\n clearMemberSelection,\n openInviteMemberDialog,\n } = useWorkspacesStore();\n const { workspaceId: contextWorkspaceId } = useWorkspacesContext();\n const { workspaceId: urlWorkspaceId } = useParams<{ workspaceId: string }>();\n\n // Prefer URL workspaceId over context (user navigated to specific workspace)\n const workspaceId = urlWorkspaceId || contextWorkspaceId;\n\n const [searchValue, setSearchValue] = useState(memberFilters.search || '');\n const debouncedSearch = useDebounce(searchValue, 500);\n\n // Update filters when debounced search changes\n useEffect(() => {\n setMemberFilters({ search: debouncedSearch });\n }, [debouncedSearch, setMemberFilters]);\n\n // Fetch members and invitations\n const {\n data: membersData,\n isLoading: isLoadingMembers,\n error: membersError,\n } = useWorkspaceMembers(workspaceId || '');\n\n const { data: invitationsData, isLoading: isLoadingInvitations } = useWorkspaceInvitations(\n workspaceId || '',\n 'PENDING'\n );\n\n const { mutate: resendInvitation, isPending: isResending } = useResendInvitation();\n const { mutate: removeUserFromWorkspace, isPending: isRemovingMembers } =\n useRemoveUserFromWorkspace();\n const [resendingId, setResendingId] = useState<string | null>(null);\n const [selectedInvitationIds, setSelectedInvitationIds] = useState<Set<string>>(new Set());\n\n const handleResendInvitation = (invitationId: string) => {\n setResendingId(invitationId);\n resendInvitation(invitationId, {\n onSuccess: () => {\n setResendingId(null);\n },\n onError: (error) => {\n console.error('Failed to resend invitation:', error);\n setResendingId(null);\n },\n });\n };\n\n const members = useMemo(() => membersData?.items || [], [membersData?.items]);\n const pendingInvitations = useMemo(() => invitationsData?.items || [], [invitationsData?.items]);\n const isLoading = isLoadingMembers || isLoadingInvitations;\n const hasMembers = members.length > 0;\n const hasPendingInvitations = pendingInvitations.length > 0;\n\n // Filter members based on search\n const filteredMembers = members.filter((member) => {\n if (!debouncedSearch) return true;\n return member.userId.toLowerCase().includes(debouncedSearch.toLowerCase());\n });\n\n const selectedMembers = useMemo(\n () => filteredMembers.filter((member) => selectedMemberIds.has(member.id)),\n [filteredMembers, selectedMemberIds]\n );\n\n const selectedInvitations = useMemo(\n () => pendingInvitations.filter((invitation) => selectedInvitationIds.has(invitation.id)),\n [pendingInvitations, selectedInvitationIds]\n );\n\n const allVisibleMembersSelected =\n filteredMembers.length > 0 &&\n filteredMembers.every((member) => selectedMemberIds.has(member.id));\n const partiallySelectedMembers =\n filteredMembers.some((member) => selectedMemberIds.has(member.id)) &&\n !allVisibleMembersSelected;\n\n const allVisibleInvitationsSelected =\n pendingInvitations.length > 0 &&\n pendingInvitations.every((invitation) => selectedInvitationIds.has(invitation.id));\n const partiallySelectedInvitations =\n pendingInvitations.some((invitation) => selectedInvitationIds.has(invitation.id)) &&\n !allVisibleInvitationsSelected;\n\n // Clear selection on unmount\n useEffect(() => {\n return () => clearMemberSelection();\n }, [clearMemberSelection]);\n\n const {\n canListMembers,\n canInviteMember,\n canRemoveMember,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <Skeleton className=\"h-64\" />\n </div>\n );\n }\n\n if (!canListMembers && !canInviteMember) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tr('membersList.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'membersList.noPermissionToViewMembers',\n \"You don't have permission to view workspace members.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n const handleInviteMember = () => {\n if (workspaceId) {\n openInviteMemberDialog({ id: workspaceId } as Workspace);\n }\n };\n\n const toggleAllMembers = (checked: boolean) => {\n filteredMembers.forEach((member) => {\n const isSelected = selectedMemberIds.has(member.id);\n if (checked !== isSelected) {\n toggleMemberSelection(member.id);\n }\n });\n };\n\n const toggleInvitationSelection = (invitationId: string, checked: boolean) => {\n setSelectedInvitationIds((prev) => {\n const next = new Set(prev);\n if (checked) {\n next.add(invitationId);\n } else {\n next.delete(invitationId);\n }\n return next;\n });\n };\n\n const toggleAllInvitations = (checked: boolean) => {\n setSelectedInvitationIds((prev) => {\n const next = new Set(prev);\n pendingInvitations.forEach((invitation) => {\n if (checked) {\n next.add(invitation.id);\n } else {\n next.delete(invitation.id);\n }\n });\n return next;\n });\n };\n\n const handleBulkRemoveMembers = async () => {\n if (selectedMembers.length === 0) return;\n void nativeImpact('medium');\n const message = `${tr('membersList.bulkRemoveConfirmPrefix', 'Remove')} ${selectedMembers.length} ${\n selectedMembers.length === 1\n ? tr('membersList.bulkRemoveConfirmSingular', 'selected member')\n : tr('membersList.bulkRemoveConfirmPlural', 'selected members')\n } ${tr('membersList.bulkRemoveConfirmSuffix', 'from this workspace?')}`;\n const native = await nativeConfirm({\n title: 'Remove members',\n message,\n okButtonTitle: 'Remove',\n cancelButtonTitle: 'Cancel',\n });\n const confirmed = native === null ? window.confirm(message) : native;\n if (!confirmed) return;\n\n selectedMembers.forEach((member) => {\n removeUserFromWorkspace(member.userId);\n });\n clearMemberSelection();\n };\n\n const handleBulkResendInvitations = () => {\n if (selectedInvitations.length === 0) return;\n selectedInvitations.forEach((invitation) => {\n resendInvitation(invitation.id, {\n onSuccess: () => {\n setSelectedInvitationIds((prev) => {\n const next = new Set(prev);\n next.delete(invitation.id);\n return next;\n });\n },\n });\n });\n };\n\n return (\n <>\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tr('membersList.pageTitle', 'Members')}\n </h1>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {tr('membersList.pageSubtitle', 'Manage workspace members and invitations')}\n </p>\n </div>\n\n <div className=\"flex gap-2\">\n <PermissionButton\n permission={WORKSPACE_PERMISSIONS.MEMBER_CREATE}\n deniedBehavior=\"disable\"\n deniedTooltip={tr(\n 'membersList.noPermissionToInvite',\n \"You don't have permission to invite members\"\n )}\n >\n <Button onClick={handleInviteMember} disabled={!workspaceId}>\n <UserPlus className=\"h-4 w-4 sm:mr-2\" />\n <span className=\"hidden sm:inline\">\n {tr('membersList.inviteMember', 'Invite Member')}\n </span>\n </Button>\n </PermissionButton>\n </div>\n </div>\n\n {/* Search & Stats */}\n <div className=\"flex flex-col sm:flex-row gap-3 sm:gap-4\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder={tr('membersList.searchPlaceholder', 'Search members...')}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n {hasPendingInvitations && (\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\" className=\"text-sm\">\n {pendingInvitations.length}{' '}\n {pendingInvitations.length !== 1\n ? tr('membersList.pendingInvitations', 'Pending Invitations')\n : tr('membersList.pendingInvitation', 'Pending Invitation')}\n </Badge>\n </div>\n )}\n </div>\n\n {filteredMembers.length > 0 && (\n <div className=\"flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between\">\n <label className=\"flex items-center gap-2 text-sm text-foreground\">\n <input\n type=\"checkbox\"\n checked={allVisibleMembersSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate = partiallySelectedMembers && !allVisibleMembersSelected;\n }\n }}\n onChange={(event) => toggleAllMembers(event.target.checked)}\n aria-label={tr(\n 'membersList.selectAllMembersAriaLabel',\n 'Select all workspace members'\n )}\n className=\"h-4 w-4 rounded border-border text-primary\"\n />\n <span>{tr('membersList.selectAllVisibleMembers', 'Select all visible members')}</span>\n </label>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n {selectedMemberIds.size} {tr('membersList.selected', 'selected')}\n </span>\n {selectedMemberIds.size > 0 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={clearMemberSelection}>\n {tr('membersList.clearSelection', 'Clear selection')}\n </Button>\n )}\n {canRemoveMember && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkRemoveMembers}\n disabled={selectedMembers.length === 0 || isRemovingMembers}\n className=\"text-destructive\"\n >\n {tr('membersList.removeSelected', 'Remove Selected')}\n {selectedMembers.length > 0 ? ` (${selectedMembers.length})` : ''}\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className=\"space-y-3\">\n {[...Array(5)].map((_, i) => (\n <Skeleton key={i} className=\"h-20 w-full\" />\n ))}\n </div>\n )}\n\n {/* Error State */}\n {!isLoading && membersError && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-destructive/10 p-6 mb-4\">\n <AlertCircle size={48} className=\"text-destructive\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('membersList.failedToLoad', 'Failed to Load Members')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm\">\n {membersError instanceof Error\n ? membersError.message\n : tr('membersList.errorLoadingMembers', 'An error occurred while loading members')}\n </p>\n </div>\n )}\n\n {/* Empty State - No Workspace */}\n {!isLoading && !membersError && !workspaceId && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-muted p-6 mb-4\">\n <Users size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('membersList.noWorkspaceSelected', 'No Workspace Selected')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm\">\n {tr(\n 'membersList.selectWorkspacePrompt',\n 'Select a workspace to view and manage its members'\n )}\n </p>\n </div>\n )}\n\n {/* Empty State - No Members */}\n {!isLoading && !membersError && workspaceId && !hasMembers && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-muted p-6 mb-4\">\n <Users size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('membersList.noMembersYet', 'No Members Yet')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm mb-4\">\n {tr(\n 'membersList.noMembersPrompt',\n 'Start building your team by inviting members to this workspace'\n )}\n </p>\n <PermissionButton\n permission={WORKSPACE_PERMISSIONS.MEMBER_CREATE}\n deniedBehavior=\"disable\"\n deniedTooltip={tr(\n 'membersList.noPermissionToInvite',\n \"You don't have permission to invite members\"\n )}\n >\n <Button onClick={handleInviteMember}>\n <UserPlus className=\"mr-2 h-4 w-4\" />\n {tr('membersList.inviteFirstMember', 'Invite Your First Member')}\n </Button>\n </PermissionButton>\n </div>\n )}\n\n {/* Empty State - No Search Results */}\n {!isLoading &&\n !membersError &&\n workspaceId &&\n hasMembers &&\n filteredMembers.length === 0 && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"rounded-full bg-muted p-6 mb-4\">\n <Search size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('membersList.noMembersFound', 'No Members Found')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm\">\n {tr(\n 'membersList.noMembersFoundPrompt',\n 'No members match your search criteria. Try adjusting your search.'\n )}\n </p>\n </div>\n )}\n\n {/* Members List */}\n {!isLoading && filteredMembers.length > 0 && (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold\">\n {tr('membersList.activeMembers', 'Active Members')} ({filteredMembers.length})\n </h2>\n </div>\n <div className=\"space-y-2\">\n {filteredMembers.map((member) => (\n <MemberListItem\n key={member.id}\n member={member}\n selected={selectedMemberIds.has(member.id)}\n onToggleSelect={(checked) => {\n const isSelected = selectedMemberIds.has(member.id);\n if (checked !== isSelected) {\n toggleMemberSelection(member.id);\n }\n }}\n canRemove={canRemoveMember}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Pending Invitations Section - Now at bottom */}\n {!isLoading && hasPendingInvitations && (\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">\n {tr('membersList.pendingInvitationsHeader', 'Pending Invitations')}\n </h2>\n <div className=\"flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between\">\n <label className=\"flex items-center gap-2 text-sm text-foreground\">\n <input\n type=\"checkbox\"\n checked={allVisibleInvitationsSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate =\n partiallySelectedInvitations && !allVisibleInvitationsSelected;\n }\n }}\n onChange={(event) => toggleAllInvitations(event.target.checked)}\n aria-label={tr(\n 'membersList.selectAllInvitationsAriaLabel',\n 'Select all pending invitations'\n )}\n className=\"h-4 w-4 rounded border-border text-primary\"\n />\n <span>{tr('membersList.selectAllInvitations', 'Select all invitations')}</span>\n </label>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n {selectedInvitationIds.size} {tr('membersList.selected', 'selected')}\n </span>\n {selectedInvitationIds.size > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setSelectedInvitationIds(new Set())}\n >\n {tr('membersList.clearSelection', 'Clear selection')}\n </Button>\n )}\n {canInviteMember && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkResendInvitations}\n disabled={selectedInvitations.length === 0 || isResending}\n >\n {tr('membersList.resendSelected', 'Resend Selected')}\n {selectedInvitations.length > 0 ? ` (${selectedInvitations.length})` : ''}\n </Button>\n )}\n </div>\n </div>\n <div className=\"space-y-2\">\n {pendingInvitations.map((invitation) => (\n <div\n key={invitation.id}\n className=\"flex items-center justify-between p-4 border rounded-lg bg-card\"\n >\n <div className=\"flex items-center gap-3\">\n <input\n type=\"checkbox\"\n checked={selectedInvitationIds.has(invitation.id)}\n onChange={(event) =>\n toggleInvitationSelection(invitation.id, event.target.checked)\n }\n aria-label={`${tr('membersList.selectInvitationAriaLabel', 'Select invitation')} ${invitation.email}`}\n className=\"h-4 w-4 rounded border-border text-primary\"\n />\n <div className=\"w-10 h-10 rounded-full bg-status-warning/10 flex items-center justify-center transition-colors\">\n <Users className=\"h-5 w-5 text-status-warning\" />\n </div>\n <div>\n <p className=\"font-medium text-sm\">{invitation.email}</p>\n <p className=\"text-xs text-muted-foreground\">\n {tr('membersList.invited', 'Invited')}{' '}\n {new Date(invitation.createdAt).toLocaleDateString()}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <PermissionButton\n permission={WORKSPACE_PERMISSIONS.MEMBER_CREATE}\n deniedBehavior=\"disable\"\n deniedTooltip={tr(\n 'membersList.noPermissionToResend',\n \"You don't have permission to resend invitations\"\n )}\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleResendInvitation(invitation.id)}\n disabled={isResending && resendingId === invitation.id}\n >\n <RefreshCw\n className={`h-4 w-4 mr-1 ${isResending && resendingId === invitation.id ? 'animate-spin' : ''}`}\n />\n {isResending && resendingId === invitation.id\n ? tr('membersList.sending', 'Sending...')\n : tr('membersList.resend', 'Resend')}\n </Button>\n </PermissionButton>\n <Badge\n variant=\"outline\"\n className=\"bg-status-warning/10 text-status-warning border-status-warning/30 transition-colors\"\n >\n {tr('membersList.pending', 'Pending')}\n </Badge>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Dialogs */}\n <InviteMemberDialog workspaceId={workspaceId} />\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,IAAS,EACjB,IAAK,IACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAEK,EACJ,mBACA,qBACA,sBACA,0BACA,yBACA,+BACE,GAAoB,EAClB,EAAE,aAAa,OAAuB,GAAsB,EAC5D,EAAE,aAAa,OAAmB,GAAoC,EAGtE,IAAc,MAAkB,IAEhC,CAAC,GAAa,KAAkB,EAAS,GAAc,UAAU,GAAG,EACpE,IAAkB,EAAY,GAAa,IAAI;AAGrD,SAAgB;AACd,IAAiB,EAAE,QAAQ,GAAiB,CAAC;IAC5C,CAAC,GAAiB,EAAiB,CAAC;CAGvC,IAAM,EACJ,MAAM,GACN,WAAW,IACX,OAAO,MACL,EAAoB,KAAe,GAAG,EAEpC,EAAE,MAAM,GAAiB,WAAW,MAAyB,GACjE,KAAe,IACf,UACD,EAEK,EAAE,QAAQ,GAAkB,WAAW,MAAgB,IAAqB,EAC5E,EAAE,QAAQ,GAAyB,WAAW,MAClD,IAA4B,EACxB,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAuB,KAA4B,kBAAsB,IAAI,KAAK,CAAC,EAEpF,MAA0B,MAAyB;AAEvD,EADA,EAAe,EAAa,EAC5B,EAAiB,GAAc;GAC7B,iBAAiB;AACf,MAAe,KAAK;;GAEtB,UAAU,MAAU;AAElB,IADA,QAAQ,MAAM,gCAAgC,EAAM,EACpD,EAAe,KAAK;;GAEvB,CAAC;IAGE,IAAU,QAAc,GAAa,SAAS,EAAE,EAAE,CAAC,GAAa,MAAM,CAAC,EACvE,IAAqB,QAAc,GAAiB,SAAS,EAAE,EAAE,CAAC,GAAiB,MAAM,CAAC,EAC1F,IAAY,MAAoB,GAChC,IAAa,EAAQ,SAAS,GAC9B,IAAwB,EAAmB,SAAS,GAGpD,IAAkB,EAAQ,QAAQ,MACjC,IACE,EAAO,OAAO,aAAa,CAAC,SAAS,EAAgB,aAAa,CAAC,GAD7C,GAE7B,EAEI,IAAkB,QAChB,EAAgB,QAAQ,MAAW,EAAkB,IAAI,EAAO,GAAG,CAAC,EAC1E,CAAC,GAAiB,EAAkB,CACrC,EAEK,IAAsB,QACpB,EAAmB,QAAQ,MAAe,EAAsB,IAAI,EAAW,GAAG,CAAC,EACzF,CAAC,GAAoB,EAAsB,CAC5C,EAEK,IACJ,EAAgB,SAAS,KACzB,EAAgB,OAAO,MAAW,EAAkB,IAAI,EAAO,GAAG,CAAC,EAC/D,KACJ,EAAgB,MAAM,MAAW,EAAkB,IAAI,EAAO,GAAG,CAAC,IAClE,CAAC,GAEG,IACJ,EAAmB,SAAS,KAC5B,EAAmB,OAAO,MAAe,EAAsB,IAAI,EAAW,GAAG,CAAC,EAC9E,KACJ,EAAmB,MAAM,MAAe,EAAsB,IAAI,EAAW,GAAG,CAAC,IACjF,CAAC;AAGH,eACe,GAAsB,EAClC,CAAC,EAAqB,CAAC;CAE1B,IAAM,EACJ,oBACA,oBACA,oBACA,WAAW,OACT,IAAyB;AAE7B,KAAI,GACF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA,EACnC,kBAAC,GAAD,EAAU,WAAU,QAAS,CAAA,CACzB;;AAIV,KAAI,CAAC,MAAkB,CAAC,EACtB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAG,4BAA4B,gBAAgB;IAC7C,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,yCACA,uDACD;IACC,CAAA,CACA;;EACF,CAAA;CAIV,IAAM,UAA2B;AAC/B,EAAI,KACF,GAAuB,EAAE,IAAI,GAAa,CAAc;IAItD,MAAoB,MAAqB;AAC7C,IAAgB,SAAS,MAAW;AAElC,GAAI,MADe,EAAkB,IAAI,EAAO,GAAG,IAEjD,EAAsB,EAAO,GAAG;IAElC;IAGE,MAA6B,GAAsB,MAAqB;AAC5E,KAA0B,MAAS;GACjC,IAAM,IAAO,IAAI,IAAI,EAAK;AAM1B,UALI,IACF,EAAK,IAAI,EAAa,GAEtB,EAAK,OAAO,EAAa,EAEpB;IACP;IAGE,MAAwB,MAAqB;AACjD,KAA0B,MAAS;GACjC,IAAM,IAAO,IAAI,IAAI,EAAK;AAQ1B,UAPA,EAAmB,SAAS,MAAe;AACzC,IAAI,IACF,EAAK,IAAI,EAAW,GAAG,GAEvB,EAAK,OAAO,EAAW,GAAG;KAE5B,EACK;IACP;IAGE,KAA0B,YAAY;AAC1C,MAAI,EAAgB,WAAW,EAAG;AAC7B,KAAa,SAAS;EAC3B,IAAM,IAAU,GAAG,EAAG,uCAAuC,SAAS,CAAC,GAAG,EAAgB,OAAO,GAC/F,EAAgB,WAAW,IACvB,EAAG,yCAAyC,kBAAkB,GAC9D,EAAG,uCAAuC,mBAAmB,CAClE,GAAG,EAAG,uCAAuC,uBAAuB,IAC/D,IAAS,MAAM,EAAc;GACjC,OAAO;GACP;GACA,eAAe;GACf,mBAAmB;GACpB,CAAC;AACgB,SAAW,OAAO,OAAO,QAAQ,EAAQ,GAAG,OAG9D,EAAgB,SAAS,MAAW;AAClC,KAAwB,EAAO,OAAO;IACtC,EACF,GAAsB;IAGlB,WAAoC;AACpC,IAAoB,WAAW,KACnC,EAAoB,SAAS,MAAe;AAC1C,KAAiB,EAAW,IAAI,EAC9B,iBAAiB;AACf,OAA0B,MAAS;KACjC,IAAM,IAAO,IAAI,IAAI,EAAK;AAE1B,YADA,EAAK,OAAO,EAAW,GAAG,EACnB;MACP;MAEL,CAAC;IACF;;AAGJ,QACE,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAG,yBAAyB,UAAU;KACpC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAG,4BAA4B,2CAA2C;KACzE,CAAA,CACA,EAAA,CAAA,EAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MACE,YAAY,EAAsB;MAClC,gBAAe;MACf,eAAe,EACb,oCACA,8CACD;gBAED,kBAAC,GAAD;OAAQ,SAAS;OAAoB,UAAU,CAAC;iBAAhD,CACE,kBAAC,GAAD,EAAU,WAAU,mBAAoB,CAAA,EACxC,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG,4BAA4B,gBAAgB;QAC3C,CAAA,CACA;;MACQ,CAAA;KACf,CAAA,CACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,kBAAC,IAAD;MACE,aAAa,EAAG,iCAAiC,oBAAoB;MACrE,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE;QAEL,KACC,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAArC;OACG,EAAmB;OAAQ;OAC3B,EAAmB,WAAW,IAE3B,EAAG,iCAAiC,qBAAqB,GADzD,EAAG,kCAAkC,sBAAsB;OAEzD;;KACJ,CAAA,CAEJ;;GAEL,EAAgB,SAAS,KACxB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,SAAD;MACE,MAAK;MACL,SAAS;MACT,MAAM,MAAU;AACd,OAAI,MACF,EAAM,gBAAgB,MAA4B,CAAC;;MAGvD,WAAW,MAAU,GAAiB,EAAM,OAAO,QAAQ;MAC3D,cAAY,EACV,yCACA,+BACD;MACD,WAAU;MACV,CAAA,EACF,kBAAC,QAAD,EAAA,UAAO,EAAG,uCAAuC,6BAA6B,EAAQ,CAAA,CAChF;QAER,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACG,EAAkB;QAAK;QAAE,EAAG,wBAAwB,WAAW;QAC3D;;MACN,EAAkB,OAAO,KACxB,kBAAC,GAAD;OAAQ,SAAQ;OAAQ,MAAK;OAAK,SAAS;iBACxC,EAAG,8BAA8B,kBAAkB;OAC7C,CAAA;MAEV,KACC,kBAAC,GAAD;OACE,SAAQ;OACR,MAAK;OACL,SAAS;OACT,UAAU,EAAgB,WAAW,KAAK;OAC1C,WAAU;iBALZ,CAOG,EAAG,8BAA8B,kBAAkB,EACnD,EAAgB,SAAS,IAAI,KAAK,EAAgB,OAAO,KAAK,GACxD;;MAEP;OACF;;GAIP,KACC,kBAAC,OAAD;IAAK,WAAU;cACZ,CAAC,GAAG;;;;;;KAAQ,CAAC,CAAC,KAAK,GAAG,MACrB,kBAAC,GAAD,EAAkB,WAAU,eAAgB,EAA7B,EAA6B,CAC5C;IACE,CAAA;GAIP,CAAC,KAAa,KACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,IAAD;OAAa,MAAM;OAAI,WAAU;OAAqB,CAAA;MAClD,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,4BAA4B,yBAAyB;MACtD,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBACV,aAAwB,QACrB,EAAa,UACb,EAAG,mCAAmC,0CAA0C;MAClF,CAAA;KACA;;GAIP,CAAC,KAAa,CAAC,KAAgB,CAAC,KAC/B,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAO,MAAM;OAAI,WAAU;OAA0B,CAAA;MACjD,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,mCAAmC,wBAAwB;MAC5D,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,qCACA,oDACD;MACC,CAAA;KACA;;GAIP,CAAC,KAAa,CAAC,KAAgB,KAAe,CAAC,KAC9C,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAO,MAAM;OAAI,WAAU;OAA0B,CAAA;MACjD,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,4BAA4B,iBAAiB;MAC9C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,+BACA,iEACD;MACC,CAAA;KACJ,kBAAC,GAAD;MACE,YAAY,EAAsB;MAClC,gBAAe;MACf,eAAe,EACb,oCACA,8CACD;gBAED,kBAAC,GAAD;OAAQ,SAAS;iBAAjB,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EACpC,EAAG,iCAAiC,2BAA2B,CACzD;;MACQ,CAAA;KACf;;GAIP,CAAC,KACA,CAAC,KACD,KACA,KACA,EAAgB,WAAW,KACzB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAQ,MAAM;OAAI,WAAU;OAA0B,CAAA;MAClD,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,8BAA8B,mBAAmB;MAClD,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,oCACA,oEACD;MACC,CAAA;KACA;;GAIT,CAAC,KAAa,EAAgB,SAAS,KACtC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACG,EAAG,6BAA6B,iBAAiB;OAAC;OAAG,EAAgB;OAAO;OAC1E;;KACD,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAgB,KAAK,MACpB,kBAAC,IAAD;MAEU;MACR,UAAU,EAAkB,IAAI,EAAO,GAAG;MAC1C,iBAAiB,MAAY;AAE3B,OAAI,MADe,EAAkB,IAAI,EAAO,GAAG,IAEjD,EAAsB,EAAO,GAAG;;MAGpC,WAAW;MACX,EAVK,EAAO,GAUZ,CACF;KACE,CAAA,CACF;;GAIP,CAAC,KAAa,KACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,wCAAwC,sBAAsB;MAC/D,CAAA;KACL,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,MAAM,MAAU;AACd,SAAI,MACF,EAAM,gBACJ,MAAgC,CAAC;;QAGvC,WAAW,MAAU,GAAqB,EAAM,OAAO,QAAQ;QAC/D,cAAY,EACV,6CACA,iCACD;QACD,WAAU;QACV,CAAA,EACF,kBAAC,QAAD,EAAA,UAAO,EAAG,oCAAoC,yBAAyB,EAAQ,CAAA,CACzE;UAER,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACG,EAAsB;UAAK;UAAE,EAAG,wBAAwB,WAAW;UAC/D;;QACN,EAAsB,OAAO,KAC5B,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,eAAe,kBAAyB,IAAI,KAAK,CAAC;mBAEjD,EAAG,8BAA8B,kBAAkB;SAC7C,CAAA;QAEV,KACC,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,SAAS;SACT,UAAU,EAAoB,WAAW,KAAK;mBAJhD,CAMG,EAAG,8BAA8B,kBAAkB,EACnD,EAAoB,SAAS,IAAI,KAAK,EAAoB,OAAO,KAAK,GAChE;;QAEP;SACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAmB,KAAK,MACvB,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,SAAD;UACE,MAAK;UACL,SAAS,EAAsB,IAAI,EAAW,GAAG;UACjD,WAAW,MACT,GAA0B,EAAW,IAAI,EAAM,OAAO,QAAQ;UAEhE,cAAY,GAAG,EAAG,yCAAyC,oBAAoB,CAAC,GAAG,EAAW;UAC9F,WAAU;UACV,CAAA;SACF,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA;UAC7C,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAuB,EAAW;UAAU,CAAA,EACzD,kBAAC,KAAD;UAAG,WAAU;oBAAb;WACG,EAAG,uBAAuB,UAAU;WAAE;WACtC,IAAI,KAAK,EAAW,UAAU,CAAC,oBAAoB;WAClD;YACA,EAAA,CAAA;SACF;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,YAAY,EAAsB;SAClC,gBAAe;SACf,eAAe,EACb,oCACA,kDACD;mBAED,kBAAC,GAAD;UACE,SAAQ;UACR,MAAK;UACL,eAAe,GAAuB,EAAW,GAAG;UACpD,UAAU,KAAe,MAAgB,EAAW;oBAJtD,CAME,kBAAC,IAAD,EACE,WAAW,gBAAgB,KAAe,MAAgB,EAAW,KAAK,iBAAiB,MAC3F,CAAA,EACD,KAAe,MAAgB,EAAW,KACvC,EAAG,uBAAuB,aAAa,GACvC,EAAG,sBAAsB,SAAS,CAC/B;;SACQ,CAAA,EACnB,kBAAC,GAAD;SACE,SAAQ;SACR,WAAU;mBAET,EAAG,uBAAuB,UAAU;SAC/B,CAAA,CACJ;UACF;SAtDC,EAAW,GAsDZ,CACN;MACE,CAAA;KACF;;GAEJ;KAGN,kBAAC,IAAD,EAAiC,gBAAe,CAAA,CAC/C,EAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/ProjectDetailPage.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,iBAAiB,4CAqbhC"}
|