@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,398 @@
|
|
|
1
|
+
import { useWorkspacesStore as e } from "../store/workspacesStore.js";
|
|
2
|
+
import { nativeConfirm as t, nativeImpact as n } from "../utils/nativeBridge.js";
|
|
3
|
+
import { useProjects as r } from "../hooks/useProjects.js";
|
|
4
|
+
import { useArchiveProject as i, useDeleteProject as ee, useUnarchiveProject as a } from "../hooks/useProjectMutations.js";
|
|
5
|
+
import { ProjectCard as o } from "../components/ProjectCard.js";
|
|
6
|
+
import { CreateProjectDialog as te } from "../components/CreateProjectDialog.js";
|
|
7
|
+
import { useWorkspacePermissions as ne } from "../hooks/useWorkspacePermissions.js";
|
|
8
|
+
import { useCallback as s, useEffect as c, useMemo as l, useState as u } from "react";
|
|
9
|
+
import { FolderKanban as d, Grid3x3 as re, List as f, Plus as p, Search as ie } from "lucide-react";
|
|
10
|
+
import { Fragment as ae, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
11
|
+
import { Button as g, Card as _, CardContent as v, Input as oe, Select as y, SelectContent as b, SelectItem as x, SelectTrigger as S, SelectValue as C, Skeleton as w } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { useParams as se } from "react-router-dom";
|
|
13
|
+
import { useDebounce as ce } from "@burdenoff/fe-libs/shared/hooks";
|
|
14
|
+
import { useI18n as le } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
15
|
+
import { TagBadge as ue } from "@burdenoff/fe-libs/tag";
|
|
16
|
+
//#region src/pages/ProjectsListPage.tsx
|
|
17
|
+
function T() {
|
|
18
|
+
let { t: T } = le(), E = s((e, t) => {
|
|
19
|
+
let n = T(e);
|
|
20
|
+
return n === e ? t : n;
|
|
21
|
+
}, [T]), { workspaceId: D } = se(), { viewMode: O, setViewMode: k, projectFilters: A, setProjectFilters: j, clearProjectFilters: de, selectedProjectIds: M, toggleProjectSelection: N, clearProjectSelection: P, openCreateProjectDialog: fe, isCreateProjectDialogOpen: pe } = e(), [F, I] = u(A.search || ""), [L, R] = u([]), [z, B] = u(!0), V = ce(F, 500);
|
|
22
|
+
c(() => {
|
|
23
|
+
j({ search: V });
|
|
24
|
+
}, [V, j]), c(() => {
|
|
25
|
+
if (L.length === 0) {
|
|
26
|
+
j({
|
|
27
|
+
tagIds: void 0,
|
|
28
|
+
tagHierarchyPaths: void 0,
|
|
29
|
+
matchAllTags: void 0,
|
|
30
|
+
includeDescendants: void 0
|
|
31
|
+
});
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
j({
|
|
35
|
+
tagIds: L.map((e) => e.tagId),
|
|
36
|
+
tagHierarchyPaths: L.map((e) => e.hierarchyPath).filter((e) => typeof e == "string" && e.length > 0),
|
|
37
|
+
matchAllTags: z,
|
|
38
|
+
includeDescendants: !0
|
|
39
|
+
});
|
|
40
|
+
}, [
|
|
41
|
+
L,
|
|
42
|
+
z,
|
|
43
|
+
j
|
|
44
|
+
]), c(() => () => P(), [P]);
|
|
45
|
+
let { data: H, isLoading: U, error: W } = r(A, void 0, D), { mutateAsync: me } = i(D), { mutateAsync: he } = a(D), { mutateAsync: ge } = ee(D), G = l(() => H?.items.filter((e) => M.has(e.id)) ?? [], [H?.items, M]), K = l(() => G.filter((e) => !e.archived), [G]), q = l(() => G.filter((e) => e.archived), [G]), J = (H?.items.length ?? 0) > 0 && (H?.items ?? []).every((e) => M.has(e.id)), _e = (H?.items ?? []).some((e) => M.has(e.id)) && !J, { canListProjects: ve, canCreateProject: Y, canDeleteProject: X, canArchiveProject: Z, isLoading: ye } = ne();
|
|
46
|
+
if (ye) return /* @__PURE__ */ h("div", {
|
|
47
|
+
className: "space-y-4 p-6",
|
|
48
|
+
children: [/* @__PURE__ */ m(w, { className: "h-10 w-1/3" }), /* @__PURE__ */ h("div", {
|
|
49
|
+
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ m(w, { className: "h-32" }),
|
|
52
|
+
/* @__PURE__ */ m(w, { className: "h-32" }),
|
|
53
|
+
/* @__PURE__ */ m(w, { className: "h-32" })
|
|
54
|
+
]
|
|
55
|
+
})]
|
|
56
|
+
});
|
|
57
|
+
if (!ve) return /* @__PURE__ */ m("div", {
|
|
58
|
+
className: "flex items-center justify-center min-h-[400px]",
|
|
59
|
+
children: /* @__PURE__ */ h("div", {
|
|
60
|
+
className: "text-center space-y-2",
|
|
61
|
+
children: [/* @__PURE__ */ m("h2", {
|
|
62
|
+
className: "text-lg font-semibold",
|
|
63
|
+
children: E("projectsList.accessDenied", "Access Denied")
|
|
64
|
+
}), /* @__PURE__ */ m("p", {
|
|
65
|
+
className: "text-sm text-muted-foreground",
|
|
66
|
+
children: E("projectsList.noPermissionToViewProjects", "You don't have permission to view projects.")
|
|
67
|
+
})]
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
let Q = () => {
|
|
71
|
+
fe({});
|
|
72
|
+
}, be = (e) => {
|
|
73
|
+
if (e === "all") {
|
|
74
|
+
let e = { ...A };
|
|
75
|
+
delete e.status, j(e);
|
|
76
|
+
} else j({ status: e });
|
|
77
|
+
}, xe = (e) => {
|
|
78
|
+
if (e === "all") {
|
|
79
|
+
let e = { ...A };
|
|
80
|
+
delete e.archived, j(e);
|
|
81
|
+
} else j({ archived: e === "true" });
|
|
82
|
+
}, $ = (e) => {
|
|
83
|
+
R((t) => t.some((t) => t.tagId === e.tagId) ? t.filter((t) => t.tagId !== e.tagId) : [...t, e]);
|
|
84
|
+
}, Se = () => {
|
|
85
|
+
I(""), R([]), B(!0), de();
|
|
86
|
+
}, Ce = (e) => {
|
|
87
|
+
(H?.items ?? []).forEach((t) => {
|
|
88
|
+
e !== M.has(t.id) && N(t.id);
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
return /* @__PURE__ */ h("div", {
|
|
92
|
+
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ h("div", {
|
|
95
|
+
className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4",
|
|
96
|
+
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
|
|
97
|
+
className: "text-2xl sm:text-3xl font-bold",
|
|
98
|
+
children: E("projectsList.pageTitle", "Projects")
|
|
99
|
+
}), /* @__PURE__ */ m("p", {
|
|
100
|
+
className: "text-muted-foreground",
|
|
101
|
+
children: E("projectsList.pageSubtitle", "Manage and organize your projects")
|
|
102
|
+
})] }), /* @__PURE__ */ h("div", {
|
|
103
|
+
className: "flex items-center gap-2",
|
|
104
|
+
children: [/* @__PURE__ */ h("div", {
|
|
105
|
+
className: "flex items-center gap-1 border rounded-lg p-1",
|
|
106
|
+
children: [/* @__PURE__ */ m(g, {
|
|
107
|
+
variant: O === "grid" ? "secondary" : "ghost",
|
|
108
|
+
size: "sm",
|
|
109
|
+
onClick: () => k("grid"),
|
|
110
|
+
className: "h-8 w-8 p-0",
|
|
111
|
+
"aria-label": E("projectsList.gridViewAriaLabel", "Show projects in grid view"),
|
|
112
|
+
children: /* @__PURE__ */ m(re, { size: 16 })
|
|
113
|
+
}), /* @__PURE__ */ m(g, {
|
|
114
|
+
variant: O === "list" ? "secondary" : "ghost",
|
|
115
|
+
size: "sm",
|
|
116
|
+
onClick: () => k("list"),
|
|
117
|
+
className: "h-8 w-8 p-0",
|
|
118
|
+
"aria-label": E("projectsList.listViewAriaLabel", "Show projects in list view"),
|
|
119
|
+
children: /* @__PURE__ */ m(f, { size: 16 })
|
|
120
|
+
})]
|
|
121
|
+
}), Y && /* @__PURE__ */ h(g, {
|
|
122
|
+
onClick: Q,
|
|
123
|
+
children: [/* @__PURE__ */ m(p, { className: "h-4 w-4 sm:mr-2" }), /* @__PURE__ */ m("span", {
|
|
124
|
+
className: "hidden sm:inline",
|
|
125
|
+
children: E("projectsList.createProject", "Create Project")
|
|
126
|
+
})]
|
|
127
|
+
})]
|
|
128
|
+
})]
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ h("div", {
|
|
131
|
+
className: "flex flex-col sm:flex-row gap-3",
|
|
132
|
+
children: [
|
|
133
|
+
/* @__PURE__ */ h("div", {
|
|
134
|
+
className: "relative flex-1",
|
|
135
|
+
children: [/* @__PURE__ */ m(ie, {
|
|
136
|
+
className: "absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground",
|
|
137
|
+
size: 18
|
|
138
|
+
}), /* @__PURE__ */ m(oe, {
|
|
139
|
+
placeholder: E("projectsList.searchPlaceholder", "Search projects..."),
|
|
140
|
+
value: F,
|
|
141
|
+
onChange: (e) => I(e.target.value),
|
|
142
|
+
className: "pl-[3.25rem]"
|
|
143
|
+
})]
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ h(y, {
|
|
146
|
+
value: A.status || "all",
|
|
147
|
+
onValueChange: be,
|
|
148
|
+
children: [/* @__PURE__ */ m(S, {
|
|
149
|
+
className: "w-full sm:w-[180px]",
|
|
150
|
+
children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.filterByStatus", "Filter by status") })
|
|
151
|
+
}), /* @__PURE__ */ h(b, { children: [
|
|
152
|
+
/* @__PURE__ */ m(x, {
|
|
153
|
+
value: "all",
|
|
154
|
+
children: E("projectsList.statusAll", "All Statuses")
|
|
155
|
+
}),
|
|
156
|
+
/* @__PURE__ */ m(x, {
|
|
157
|
+
value: "ACTIVE",
|
|
158
|
+
children: E("projectsList.statusActive", "Active")
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ m(x, {
|
|
161
|
+
value: "INACTIVE",
|
|
162
|
+
children: E("projectsList.statusInactive", "Inactive")
|
|
163
|
+
})
|
|
164
|
+
] })]
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ h(y, {
|
|
167
|
+
value: A.archived === void 0 ? "all" : A.archived ? "true" : "false",
|
|
168
|
+
onValueChange: xe,
|
|
169
|
+
children: [/* @__PURE__ */ m(S, {
|
|
170
|
+
className: "w-full sm:w-[180px]",
|
|
171
|
+
children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.filterByArchive", "Filter by archive") })
|
|
172
|
+
}), /* @__PURE__ */ h(b, { children: [
|
|
173
|
+
/* @__PURE__ */ m(x, {
|
|
174
|
+
value: "all",
|
|
175
|
+
children: E("projectsList.archiveAll", "All Projects")
|
|
176
|
+
}),
|
|
177
|
+
/* @__PURE__ */ m(x, {
|
|
178
|
+
value: "false",
|
|
179
|
+
children: E("projectsList.archiveActiveProjects", "Active Projects")
|
|
180
|
+
}),
|
|
181
|
+
/* @__PURE__ */ m(x, {
|
|
182
|
+
value: "true",
|
|
183
|
+
children: E("projectsList.archiveArchived", "Archived")
|
|
184
|
+
})
|
|
185
|
+
] })]
|
|
186
|
+
}),
|
|
187
|
+
(A.search || A.status || A.archived !== void 0 || L.length > 0) && /* @__PURE__ */ m(g, {
|
|
188
|
+
variant: "outline",
|
|
189
|
+
onClick: Se,
|
|
190
|
+
children: E("projectsList.clearFilters", "Clear Filters")
|
|
191
|
+
})
|
|
192
|
+
]
|
|
193
|
+
}),
|
|
194
|
+
L.length > 0 && /* @__PURE__ */ h("div", {
|
|
195
|
+
className: "flex flex-col gap-3 rounded-lg border border-border bg-card px-4 py-3",
|
|
196
|
+
children: [/* @__PURE__ */ h("div", {
|
|
197
|
+
className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
198
|
+
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
|
|
199
|
+
className: "text-sm font-medium",
|
|
200
|
+
children: E("projectsList.activeTagFilters", "Active tag filters")
|
|
201
|
+
}), /* @__PURE__ */ m("p", {
|
|
202
|
+
className: "text-xs text-muted-foreground",
|
|
203
|
+
children: E("projectsList.activeTagFiltersDescription", "Click a project tag to add or remove it from the current filter set.")
|
|
204
|
+
})] }), /* @__PURE__ */ h(y, {
|
|
205
|
+
value: z ? "all" : "any",
|
|
206
|
+
onValueChange: (e) => B(e === "all"),
|
|
207
|
+
children: [/* @__PURE__ */ m(S, {
|
|
208
|
+
className: "w-full sm:w-[180px]",
|
|
209
|
+
children: /* @__PURE__ */ m(C, { placeholder: E("projectsList.tagMatchMode", "Tag match mode") })
|
|
210
|
+
}), /* @__PURE__ */ h(b, { children: [/* @__PURE__ */ m(x, {
|
|
211
|
+
value: "all",
|
|
212
|
+
children: E("projectsList.tagMatchAll", "Match all tags")
|
|
213
|
+
}), /* @__PURE__ */ m(x, {
|
|
214
|
+
value: "any",
|
|
215
|
+
children: E("projectsList.tagMatchAny", "Match any tag")
|
|
216
|
+
})] })]
|
|
217
|
+
})]
|
|
218
|
+
}), /* @__PURE__ */ m("div", {
|
|
219
|
+
className: "flex flex-wrap gap-2",
|
|
220
|
+
children: L.map((e) => /* @__PURE__ */ m(ue, {
|
|
221
|
+
id: e.tagId,
|
|
222
|
+
label: e.label,
|
|
223
|
+
color: e.color ?? void 0,
|
|
224
|
+
icon: e.icon ?? void 0,
|
|
225
|
+
description: e.description ?? void 0,
|
|
226
|
+
removable: !0,
|
|
227
|
+
onRemove: () => $(e),
|
|
228
|
+
size: "sm"
|
|
229
|
+
}, e.tagId))
|
|
230
|
+
})]
|
|
231
|
+
}),
|
|
232
|
+
W && /* @__PURE__ */ m(_, {
|
|
233
|
+
className: "border-destructive",
|
|
234
|
+
children: /* @__PURE__ */ m(v, {
|
|
235
|
+
className: "pt-6",
|
|
236
|
+
children: /* @__PURE__ */ h("div", {
|
|
237
|
+
className: "flex flex-col items-center justify-center py-8 text-center",
|
|
238
|
+
children: [/* @__PURE__ */ m("p", {
|
|
239
|
+
className: "text-destructive font-semibold mb-2",
|
|
240
|
+
children: E("projectsList.errorLoading", "Error loading projects")
|
|
241
|
+
}), /* @__PURE__ */ m("p", {
|
|
242
|
+
className: "text-sm text-muted-foreground",
|
|
243
|
+
children: W instanceof Error ? W.message : E("projectsList.unknownError", "An unknown error occurred")
|
|
244
|
+
})]
|
|
245
|
+
})
|
|
246
|
+
})
|
|
247
|
+
}),
|
|
248
|
+
U && /* @__PURE__ */ m("div", {
|
|
249
|
+
className: "grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",
|
|
250
|
+
children: Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ m(_, { children: /* @__PURE__ */ m(v, {
|
|
251
|
+
className: "pt-6",
|
|
252
|
+
children: /* @__PURE__ */ h("div", {
|
|
253
|
+
className: "space-y-3",
|
|
254
|
+
children: [
|
|
255
|
+
/* @__PURE__ */ m(w, { className: "h-12 w-12 rounded-lg" }),
|
|
256
|
+
/* @__PURE__ */ m(w, { className: "h-4 w-3/4" }),
|
|
257
|
+
/* @__PURE__ */ m(w, { className: "h-4 w-1/2" })
|
|
258
|
+
]
|
|
259
|
+
})
|
|
260
|
+
}) }, t))
|
|
261
|
+
}),
|
|
262
|
+
!U && !W && H?.items.length === 0 && /* @__PURE__ */ m(_, { children: /* @__PURE__ */ m(v, {
|
|
263
|
+
className: "pt-6",
|
|
264
|
+
children: /* @__PURE__ */ h("div", {
|
|
265
|
+
className: "flex flex-col items-center justify-center py-12 text-center",
|
|
266
|
+
children: [
|
|
267
|
+
/* @__PURE__ */ m("div", {
|
|
268
|
+
className: "rounded-full bg-muted p-6 mb-4",
|
|
269
|
+
children: /* @__PURE__ */ m(d, {
|
|
270
|
+
size: 48,
|
|
271
|
+
className: "text-muted-foreground"
|
|
272
|
+
})
|
|
273
|
+
}),
|
|
274
|
+
/* @__PURE__ */ m("h3", {
|
|
275
|
+
className: "text-lg font-semibold mb-2",
|
|
276
|
+
children: E("projectsList.noProjectsFound", "No projects found")
|
|
277
|
+
}),
|
|
278
|
+
/* @__PURE__ */ m("p", {
|
|
279
|
+
className: "text-muted-foreground max-w-sm mb-4",
|
|
280
|
+
children: A.search ? E("projectsList.adjustSearchOrFilters", "Try adjusting your search or filters") : E("projectsList.createFirstProject", "Create your first project to get started organizing your work")
|
|
281
|
+
}),
|
|
282
|
+
!A.search && Y && /* @__PURE__ */ h(g, {
|
|
283
|
+
onClick: Q,
|
|
284
|
+
children: [/* @__PURE__ */ m(p, {
|
|
285
|
+
size: 16,
|
|
286
|
+
className: "mr-2"
|
|
287
|
+
}), E("projectsList.createProject", "Create Project")]
|
|
288
|
+
})
|
|
289
|
+
]
|
|
290
|
+
})
|
|
291
|
+
}) }),
|
|
292
|
+
!U && !W && H && H.items.length > 0 && /* @__PURE__ */ h(ae, { children: [
|
|
293
|
+
/* @__PURE__ */ h("div", {
|
|
294
|
+
className: "flex flex-col gap-3 rounded-lg border bg-card p-4 sm:flex-row sm:items-center sm:justify-between",
|
|
295
|
+
children: [/* @__PURE__ */ h("label", {
|
|
296
|
+
className: "flex items-center gap-2 text-sm text-foreground",
|
|
297
|
+
children: [/* @__PURE__ */ m("input", {
|
|
298
|
+
type: "checkbox",
|
|
299
|
+
checked: J,
|
|
300
|
+
ref: (e) => {
|
|
301
|
+
e && (e.indeterminate = _e && !J);
|
|
302
|
+
},
|
|
303
|
+
onChange: (e) => Ce(e.target.checked),
|
|
304
|
+
"aria-label": E("projectsList.selectAllAriaLabel", "Select all projects"),
|
|
305
|
+
className: "h-4 w-4 rounded border-border text-primary"
|
|
306
|
+
}), /* @__PURE__ */ m("span", { children: E("projectsList.selectAllVisible", "Select all visible") })]
|
|
307
|
+
}), /* @__PURE__ */ h("div", {
|
|
308
|
+
className: "flex flex-wrap items-center gap-2",
|
|
309
|
+
children: [
|
|
310
|
+
/* @__PURE__ */ h("span", {
|
|
311
|
+
className: "text-sm text-muted-foreground",
|
|
312
|
+
children: [
|
|
313
|
+
M.size,
|
|
314
|
+
" ",
|
|
315
|
+
E("projectsList.selected", "selected")
|
|
316
|
+
]
|
|
317
|
+
}),
|
|
318
|
+
M.size > 0 && /* @__PURE__ */ m(g, {
|
|
319
|
+
variant: "ghost",
|
|
320
|
+
size: "sm",
|
|
321
|
+
onClick: P,
|
|
322
|
+
children: E("projectsList.clearSelection", "Clear selection")
|
|
323
|
+
}),
|
|
324
|
+
Z && /* @__PURE__ */ h(g, {
|
|
325
|
+
variant: "outline",
|
|
326
|
+
size: "sm",
|
|
327
|
+
onClick: async () => {
|
|
328
|
+
K.length !== 0 && (await Promise.allSettled(K.map((e) => me(e.id))), P());
|
|
329
|
+
},
|
|
330
|
+
disabled: K.length === 0,
|
|
331
|
+
children: [E("projectsList.archiveSelected", "Archive Selected"), K.length > 0 ? ` (${K.length})` : ""]
|
|
332
|
+
}),
|
|
333
|
+
Z && /* @__PURE__ */ h(g, {
|
|
334
|
+
variant: "outline",
|
|
335
|
+
size: "sm",
|
|
336
|
+
onClick: async () => {
|
|
337
|
+
q.length !== 0 && (await Promise.allSettled(q.map((e) => he(e.id))), P());
|
|
338
|
+
},
|
|
339
|
+
disabled: q.length === 0,
|
|
340
|
+
children: [E("projectsList.unarchiveSelected", "Unarchive Selected"), q.length > 0 ? ` (${q.length})` : ""]
|
|
341
|
+
}),
|
|
342
|
+
X && /* @__PURE__ */ h(g, {
|
|
343
|
+
variant: "outline",
|
|
344
|
+
size: "sm",
|
|
345
|
+
onClick: async () => {
|
|
346
|
+
if (G.length === 0) return;
|
|
347
|
+
n("medium");
|
|
348
|
+
let e = E("projectsList.bulkDeleteConfirmPrefix", "Delete ") + G.length + " " + E("projectsList.bulkDeleteConfirmProject", "selected project") + (G.length === 1 ? "" : E("projectsList.bulkDeleteConfirmPluralSuffix", "s")) + E("projectsList.bulkDeleteConfirmSuffix", "? This cannot be undone."), r = await t({
|
|
349
|
+
title: "Delete projects",
|
|
350
|
+
message: e,
|
|
351
|
+
okButtonTitle: "Delete",
|
|
352
|
+
cancelButtonTitle: "Cancel"
|
|
353
|
+
});
|
|
354
|
+
(r === null ? window.confirm(e) : r) && (await Promise.allSettled(G.map((e) => ge(e.id))), P());
|
|
355
|
+
},
|
|
356
|
+
disabled: G.length === 0,
|
|
357
|
+
className: "text-destructive",
|
|
358
|
+
children: [E("projectsList.deleteSelected", "Delete Selected"), G.length > 0 ? ` (${G.length})` : ""]
|
|
359
|
+
})
|
|
360
|
+
]
|
|
361
|
+
})]
|
|
362
|
+
}),
|
|
363
|
+
/* @__PURE__ */ m("div", {
|
|
364
|
+
className: O === "list" ? "space-y-3" : "grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4",
|
|
365
|
+
children: H.items.map((e) => /* @__PURE__ */ m(o, {
|
|
366
|
+
project: e,
|
|
367
|
+
selected: M.has(e.id),
|
|
368
|
+
canArchive: Z,
|
|
369
|
+
canDelete: X,
|
|
370
|
+
onTagClick: $,
|
|
371
|
+
onToggleSelect: (t) => {
|
|
372
|
+
t !== M.has(e.id) && N(e.id);
|
|
373
|
+
}
|
|
374
|
+
}, e.id))
|
|
375
|
+
}),
|
|
376
|
+
H.total > H.items.length && /* @__PURE__ */ h("div", {
|
|
377
|
+
className: "text-center text-sm text-muted-foreground",
|
|
378
|
+
children: [
|
|
379
|
+
E("projectsList.showingPrefix", "Showing"),
|
|
380
|
+
" ",
|
|
381
|
+
H.items.length,
|
|
382
|
+
" ",
|
|
383
|
+
E("projectsList.showingOf", "of"),
|
|
384
|
+
" ",
|
|
385
|
+
H.total,
|
|
386
|
+
" ",
|
|
387
|
+
E("projectsList.showingProjects", "projects")
|
|
388
|
+
]
|
|
389
|
+
})
|
|
390
|
+
] }),
|
|
391
|
+
pe && /* @__PURE__ */ m(te, { workspaceId: D })
|
|
392
|
+
]
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
//#endregion
|
|
396
|
+
export { T as ProjectsListPage };
|
|
397
|
+
|
|
398
|
+
//# sourceMappingURL=ProjectsListPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsListPage.js","names":[],"sources":["../../src/pages/ProjectsListPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { FolderKanban, Plus, Grid3x3, List, Search } from 'lucide-react';\nimport { TagBadge } from '@burdenoff/fe-libs/tag';\nimport {\n Button,\n Input,\n Card,\n CardContent,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport { useDebounce } from '@burdenoff/fe-libs/shared/hooks';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useWorkspacesStore } from '../store/workspacesStore';\nimport { nativeConfirm, nativeImpact } from '../utils/nativeBridge';\nimport { useProjects } from '../hooks/useProjects';\nimport {\n useArchiveProject,\n useDeleteProject,\n useUnarchiveProject,\n} from '../hooks/useProjectMutations';\nimport { ProjectCard } from '../components/ProjectCard';\nimport { CreateProjectDialog } from '../components/CreateProjectDialog';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport type { ProjectTag, Workspace } from '../types';\n\nexport function ProjectsListPage() {\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 { workspaceId } = useParams<{ workspaceId: string }>();\n const {\n viewMode,\n setViewMode,\n projectFilters,\n setProjectFilters,\n clearProjectFilters,\n selectedProjectIds,\n toggleProjectSelection,\n clearProjectSelection,\n openCreateProjectDialog,\n isCreateProjectDialogOpen,\n } = useWorkspacesStore();\n\n const [searchValue, setSearchValue] = useState(projectFilters.search || '');\n const [activeTagFilters, setActiveTagFilters] = useState<ProjectTag[]>([]);\n const [matchAllTagFilters, setMatchAllTagFilters] = useState(true);\n const debouncedSearch = useDebounce(searchValue, 500);\n\n // Update filters when debounced search changes\n useEffect(() => {\n setProjectFilters({ search: debouncedSearch });\n }, [debouncedSearch, setProjectFilters]);\n\n useEffect(() => {\n if (activeTagFilters.length === 0) {\n setProjectFilters({\n tagIds: undefined,\n tagHierarchyPaths: undefined,\n matchAllTags: undefined,\n includeDescendants: undefined,\n });\n return;\n }\n\n setProjectFilters({\n tagIds: activeTagFilters.map((tag) => tag.tagId),\n tagHierarchyPaths: activeTagFilters\n .map((tag) => tag.hierarchyPath)\n .filter((tagPath): tagPath is string => typeof tagPath === 'string' && tagPath.length > 0),\n matchAllTags: matchAllTagFilters,\n includeDescendants: true,\n });\n }, [activeTagFilters, matchAllTagFilters, setProjectFilters]);\n\n useEffect(() => {\n return () => clearProjectSelection();\n }, [clearProjectSelection]);\n\n const { data, isLoading, error } = useProjects(projectFilters, undefined, workspaceId);\n const { mutateAsync: archiveProject } = useArchiveProject(workspaceId);\n const { mutateAsync: unarchiveProject } = useUnarchiveProject(workspaceId);\n const { mutateAsync: deleteProject } = useDeleteProject(workspaceId);\n\n const selectedProjects = useMemo(\n () => data?.items.filter((project) => selectedProjectIds.has(project.id)) ?? [],\n [data?.items, selectedProjectIds]\n );\n\n const archivableProjects = useMemo(\n () => selectedProjects.filter((project) => !project.archived),\n [selectedProjects]\n );\n\n const unarchivableProjects = useMemo(\n () => selectedProjects.filter((project) => project.archived),\n [selectedProjects]\n );\n\n const allVisibleSelected =\n (data?.items.length ?? 0) > 0 &&\n (data?.items ?? []).every((project) => selectedProjectIds.has(project.id));\n const partiallySelected =\n (data?.items ?? []).some((project) => selectedProjectIds.has(project.id)) &&\n !allVisibleSelected;\n\n const {\n canListProjects,\n canCreateProject,\n canDeleteProject,\n canArchiveProject,\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 <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (!canListProjects) {\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('projectsList.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'projectsList.noPermissionToViewProjects',\n \"You don't have permission to view projects.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n const handleCreateProject = () => {\n openCreateProjectDialog({} as Workspace);\n };\n\n const handleStatusFilter = (value: string) => {\n if (value === 'all') {\n const nextFilters = { ...projectFilters };\n delete nextFilters.status;\n setProjectFilters(nextFilters);\n } else {\n setProjectFilters({ status: value as 'ACTIVE' | 'INACTIVE' | 'ARCHIVED' });\n }\n };\n\n const handleArchivedFilter = (value: string) => {\n if (value === 'all') {\n const nextFilters = { ...projectFilters };\n delete nextFilters.archived;\n setProjectFilters(nextFilters);\n } else {\n setProjectFilters({ archived: value === 'true' });\n }\n };\n\n const toggleTagFilter = (tag: ProjectTag) => {\n setActiveTagFilters((current) => {\n const exists = current.some((entry) => entry.tagId === tag.tagId);\n if (exists) {\n return current.filter((entry) => entry.tagId !== tag.tagId);\n }\n\n return [...current, tag];\n });\n };\n\n const clearAllProjectFilters = () => {\n setSearchValue('');\n setActiveTagFilters([]);\n setMatchAllTagFilters(true);\n clearProjectFilters();\n };\n\n const toggleAllProjects = (checked: boolean) => {\n (data?.items ?? []).forEach((project) => {\n const isSelected = selectedProjectIds.has(project.id);\n if (checked !== isSelected) {\n toggleProjectSelection(project.id);\n }\n });\n };\n\n const handleBulkArchive = async () => {\n if (archivableProjects.length === 0) return;\n await Promise.allSettled(archivableProjects.map((project) => archiveProject(project.id)));\n clearProjectSelection();\n };\n\n const handleBulkUnarchive = async () => {\n if (unarchivableProjects.length === 0) return;\n await Promise.allSettled(unarchivableProjects.map((project) => unarchiveProject(project.id)));\n clearProjectSelection();\n };\n\n const handleBulkDelete = async () => {\n if (selectedProjects.length === 0) return;\n void nativeImpact('medium');\n const message =\n tr('projectsList.bulkDeleteConfirmPrefix', 'Delete ') +\n selectedProjects.length +\n ' ' +\n tr('projectsList.bulkDeleteConfirmProject', 'selected project') +\n (selectedProjects.length === 1 ? '' : tr('projectsList.bulkDeleteConfirmPluralSuffix', 's')) +\n tr('projectsList.bulkDeleteConfirmSuffix', '? This cannot be undone.');\n const native = await nativeConfirm({\n title: 'Delete projects',\n message,\n okButtonTitle: 'Delete',\n cancelButtonTitle: 'Cancel',\n });\n const confirmed = native === null ? window.confirm(message) : native;\n if (!confirmed) return;\n\n await Promise.allSettled(selectedProjects.map((project) => deleteProject(project.id)));\n clearProjectSelection();\n };\n\n return (\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 justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tr('projectsList.pageTitle', 'Projects')}\n </h1>\n <p className=\"text-muted-foreground\">\n {tr('projectsList.pageSubtitle', 'Manage and organize your projects')}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {/* View mode toggle */}\n <div className=\"flex items-center gap-1 border rounded-lg p-1\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('grid')}\n className=\"h-8 w-8 p-0\"\n aria-label={tr('projectsList.gridViewAriaLabel', 'Show projects in grid view')}\n >\n <Grid3x3 size={16} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"sm\"\n onClick={() => setViewMode('list')}\n className=\"h-8 w-8 p-0\"\n aria-label={tr('projectsList.listViewAriaLabel', 'Show projects in list view')}\n >\n <List size={16} />\n </Button>\n </div>\n {canCreateProject && (\n <Button onClick={handleCreateProject}>\n <Plus className=\"h-4 w-4 sm:mr-2\" />\n <span className=\"hidden sm:inline\">\n {tr('projectsList.createProject', 'Create Project')}\n </span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Filters & Search */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search\n className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-muted-foreground\"\n size={18}\n />\n <Input\n placeholder={tr('projectsList.searchPlaceholder', 'Search projects...')}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n className=\"pl-[3.25rem]\"\n />\n </div>\n <Select value={projectFilters.status || 'all'} onValueChange={handleStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.filterByStatus', 'Filter by status')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{tr('projectsList.statusAll', 'All Statuses')}</SelectItem>\n <SelectItem value=\"ACTIVE\">{tr('projectsList.statusActive', 'Active')}</SelectItem>\n <SelectItem value=\"INACTIVE\">\n {tr('projectsList.statusInactive', 'Inactive')}\n </SelectItem>\n </SelectContent>\n </Select>\n <Select\n value={\n projectFilters.archived === undefined\n ? 'all'\n : projectFilters.archived\n ? 'true'\n : 'false'\n }\n onValueChange={handleArchivedFilter}\n >\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.filterByArchive', 'Filter by archive')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{tr('projectsList.archiveAll', 'All Projects')}</SelectItem>\n <SelectItem value=\"false\">\n {tr('projectsList.archiveActiveProjects', 'Active Projects')}\n </SelectItem>\n <SelectItem value=\"true\">{tr('projectsList.archiveArchived', 'Archived')}</SelectItem>\n </SelectContent>\n </Select>\n {(projectFilters.search ||\n projectFilters.status ||\n projectFilters.archived !== undefined ||\n activeTagFilters.length > 0) && (\n <Button variant=\"outline\" onClick={clearAllProjectFilters}>\n {tr('projectsList.clearFilters', 'Clear Filters')}\n </Button>\n )}\n </div>\n\n {activeTagFilters.length > 0 && (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <p className=\"text-sm font-medium\">\n {tr('projectsList.activeTagFilters', 'Active tag filters')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'projectsList.activeTagFiltersDescription',\n 'Click a project tag to add or remove it from the current filter set.'\n )}\n </p>\n </div>\n <Select\n value={matchAllTagFilters ? 'all' : 'any'}\n onValueChange={(value) => setMatchAllTagFilters(value === 'all')}\n >\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue placeholder={tr('projectsList.tagMatchMode', 'Tag match mode')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tr('projectsList.tagMatchAll', 'Match all tags')}\n </SelectItem>\n <SelectItem value=\"any\">\n {tr('projectsList.tagMatchAny', 'Match any tag')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n {activeTagFilters.map((tag) => (\n <TagBadge\n key={tag.tagId}\n id={tag.tagId}\n label={tag.label}\n color={tag.color ?? undefined}\n icon={tag.icon ?? undefined}\n description={tag.description ?? undefined}\n removable\n onRemove={() => toggleTagFilter(tag)}\n size=\"sm\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <Card className=\"border-destructive\">\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <p className=\"text-destructive font-semibold mb-2\">\n {tr('projectsList.errorLoading', 'Error loading projects')}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {error instanceof Error\n ? error.message\n : tr('projectsList.unknownError', 'An unknown error occurred')}\n </p>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Loading State */}\n {isLoading && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Card key={i}>\n <CardContent className=\"pt-6\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-12 w-12 rounded-lg\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {/* Empty State */}\n {!isLoading && !error && data?.items.length === 0 && (\n <Card>\n <CardContent className=\"pt-6\">\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 <FolderKanban size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('projectsList.noProjectsFound', 'No projects found')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm mb-4\">\n {projectFilters.search\n ? tr('projectsList.adjustSearchOrFilters', 'Try adjusting your search or filters')\n : tr(\n 'projectsList.createFirstProject',\n 'Create your first project to get started organizing your work'\n )}\n </p>\n {!projectFilters.search && canCreateProject && (\n <Button onClick={handleCreateProject}>\n <Plus size={16} className=\"mr-2\" />\n {tr('projectsList.createProject', 'Create Project')}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Projects Grid */}\n {!isLoading && !error && data && data.items.length > 0 && (\n <>\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={allVisibleSelected}\n ref={(input) => {\n if (input) {\n input.indeterminate = partiallySelected && !allVisibleSelected;\n }\n }}\n onChange={(event) => toggleAllProjects(event.target.checked)}\n aria-label={tr('projectsList.selectAllAriaLabel', 'Select all projects')}\n className=\"h-4 w-4 rounded border-border text-primary\"\n />\n <span>{tr('projectsList.selectAllVisible', 'Select all visible')}</span>\n </label>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n {selectedProjectIds.size} {tr('projectsList.selected', 'selected')}\n </span>\n {selectedProjectIds.size > 0 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={clearProjectSelection}>\n {tr('projectsList.clearSelection', 'Clear selection')}\n </Button>\n )}\n {canArchiveProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkArchive}\n disabled={archivableProjects.length === 0}\n >\n {tr('projectsList.archiveSelected', 'Archive Selected')}\n {archivableProjects.length > 0 ? ` (${archivableProjects.length})` : ''}\n </Button>\n )}\n {canArchiveProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkUnarchive}\n disabled={unarchivableProjects.length === 0}\n >\n {tr('projectsList.unarchiveSelected', 'Unarchive Selected')}\n {unarchivableProjects.length > 0 ? ` (${unarchivableProjects.length})` : ''}\n </Button>\n )}\n {canDeleteProject && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleBulkDelete}\n disabled={selectedProjects.length === 0}\n className=\"text-destructive\"\n >\n {tr('projectsList.deleteSelected', 'Delete Selected')}\n {selectedProjects.length > 0 ? ` (${selectedProjects.length})` : ''}\n </Button>\n )}\n </div>\n </div>\n\n <div\n className={\n viewMode === 'list'\n ? 'space-y-3'\n : 'grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4'\n }\n >\n {data.items.map((project) => (\n <ProjectCard\n key={project.id}\n project={project}\n selected={selectedProjectIds.has(project.id)}\n canArchive={canArchiveProject}\n canDelete={canDeleteProject}\n onTagClick={toggleTagFilter}\n onToggleSelect={(checked) => {\n const isSelected = selectedProjectIds.has(project.id);\n if (checked !== isSelected) {\n toggleProjectSelection(project.id);\n }\n }}\n />\n ))}\n </div>\n\n {/* Pagination Info */}\n {data.total > data.items.length && (\n <div className=\"text-center text-sm text-muted-foreground\">\n {tr('projectsList.showingPrefix', 'Showing')} {data.items.length}{' '}\n {tr('projectsList.showingOf', 'of')} {data.total}{' '}\n {tr('projectsList.showingProjects', 'projects')}\n </div>\n )}\n </>\n )}\n\n {/* Create Project Dialog */}\n {isCreateProjectDialogOpen && <CreateProjectDialog workspaceId={workspaceId} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/WorkspaceDetailPage.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,mBAAmB,4CA8PlC"}
|