@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.
Files changed (260) hide show
  1. package/README.md +88 -0
  2. package/dist/WorkspacesRoot.d.ts +35 -0
  3. package/dist/WorkspacesRoot.d.ts.map +1 -0
  4. package/dist/WorkspacesRoot.js +71 -0
  5. package/dist/WorkspacesRoot.js.map +1 -0
  6. package/dist/WorkspacesRoutes.d.ts +10 -0
  7. package/dist/WorkspacesRoutes.d.ts.map +1 -0
  8. package/dist/WorkspacesRoutes.js +111 -0
  9. package/dist/WorkspacesRoutes.js.map +1 -0
  10. package/dist/components/CreateProjectDialog.d.ts +6 -0
  11. package/dist/components/CreateProjectDialog.d.ts.map +1 -0
  12. package/dist/components/CreateProjectDialog.js +115 -0
  13. package/dist/components/CreateProjectDialog.js.map +1 -0
  14. package/dist/components/CreateWorkspaceDialog.d.ts +2 -0
  15. package/dist/components/CreateWorkspaceDialog.d.ts.map +1 -0
  16. package/dist/components/CreateWorkspaceDialog.js +172 -0
  17. package/dist/components/CreateWorkspaceDialog.js.map +1 -0
  18. package/dist/components/InviteMemberDialog.d.ts +7 -0
  19. package/dist/components/InviteMemberDialog.d.ts.map +1 -0
  20. package/dist/components/InviteMemberDialog.js +148 -0
  21. package/dist/components/InviteMemberDialog.js.map +1 -0
  22. package/dist/components/MemberListItem.d.ts +11 -0
  23. package/dist/components/MemberListItem.d.ts.map +1 -0
  24. package/dist/components/MemberListItem.js +118 -0
  25. package/dist/components/MemberListItem.js.map +1 -0
  26. package/dist/components/ProjectCard.d.ts +13 -0
  27. package/dist/components/ProjectCard.d.ts.map +1 -0
  28. package/dist/components/ProjectCard.js +150 -0
  29. package/dist/components/ProjectCard.js.map +1 -0
  30. package/dist/components/WorkspaceCard.d.ts +8 -0
  31. package/dist/components/WorkspaceCard.d.ts.map +1 -0
  32. package/dist/components/WorkspaceCard.js +79 -0
  33. package/dist/components/WorkspaceCard.js.map +1 -0
  34. package/dist/components/WorkspacesErrorBoundary.d.ts +27 -0
  35. package/dist/components/WorkspacesErrorBoundary.d.ts.map +1 -0
  36. package/dist/components/WorkspacesErrorBoundary.js +136 -0
  37. package/dist/components/WorkspacesErrorBoundary.js.map +1 -0
  38. package/dist/components/index.d.ts +8 -0
  39. package/dist/components/index.d.ts.map +1 -0
  40. package/dist/components/index.js +7 -0
  41. package/dist/constants/permissions.d.ts +33 -0
  42. package/dist/constants/permissions.d.ts.map +1 -0
  43. package/dist/constants/permissions.js +31 -0
  44. package/dist/constants/permissions.js.map +1 -0
  45. package/dist/generated/global-operations.d.ts +279 -0
  46. package/dist/generated/global-operations.d.ts.map +1 -0
  47. package/dist/generated/global-operations.js +103 -0
  48. package/dist/generated/global-operations.js.map +1 -0
  49. package/dist/generated/global-types.d.ts +20714 -0
  50. package/dist/generated/global-types.d.ts.map +1 -0
  51. package/dist/generated/wspace-operations.d.ts +2209 -0
  52. package/dist/generated/wspace-operations.d.ts.map +1 -0
  53. package/dist/generated/wspace-operations.js +576 -0
  54. package/dist/generated/wspace-operations.js.map +1 -0
  55. package/dist/generated/wspace-types.d.ts +54990 -0
  56. package/dist/generated/wspace-types.d.ts.map +1 -0
  57. package/dist/hooks/index.d.ts +8 -0
  58. package/dist/hooks/index.d.ts.map +1 -0
  59. package/dist/hooks/index.js +7 -0
  60. package/dist/hooks/useMemberMutations.d.ts +61 -0
  61. package/dist/hooks/useMemberMutations.d.ts.map +1 -0
  62. package/dist/hooks/useMemberMutations.js +263 -0
  63. package/dist/hooks/useMemberMutations.js.map +1 -0
  64. package/dist/hooks/useProjectMutations.d.ts +26 -0
  65. package/dist/hooks/useProjectMutations.d.ts.map +1 -0
  66. package/dist/hooks/useProjectMutations.js +127 -0
  67. package/dist/hooks/useProjectMutations.js.map +1 -0
  68. package/dist/hooks/useProjects.d.ts +16 -0
  69. package/dist/hooks/useProjects.d.ts.map +1 -0
  70. package/dist/hooks/useProjects.js +103 -0
  71. package/dist/hooks/useProjects.js.map +1 -0
  72. package/dist/hooks/useScopedNavigation.d.ts +4 -0
  73. package/dist/hooks/useScopedNavigation.d.ts.map +1 -0
  74. package/dist/hooks/useScopedNavigation.js +11 -0
  75. package/dist/hooks/useScopedNavigation.js.map +1 -0
  76. package/dist/hooks/useTenants.d.ts +13 -0
  77. package/dist/hooks/useTenants.d.ts.map +1 -0
  78. package/dist/hooks/useTenants.js +47 -0
  79. package/dist/hooks/useTenants.js.map +1 -0
  80. package/dist/hooks/useWorkspaceActivity.d.ts +12 -0
  81. package/dist/hooks/useWorkspaceActivity.d.ts.map +1 -0
  82. package/dist/hooks/useWorkspaceActivity.js +31 -0
  83. package/dist/hooks/useWorkspaceActivity.js.map +1 -0
  84. package/dist/hooks/useWorkspaceMembers.d.ts +24 -0
  85. package/dist/hooks/useWorkspaceMembers.d.ts.map +1 -0
  86. package/dist/hooks/useWorkspaceMembers.js +130 -0
  87. package/dist/hooks/useWorkspaceMembers.js.map +1 -0
  88. package/dist/hooks/useWorkspaceMutations.d.ts +36 -0
  89. package/dist/hooks/useWorkspaceMutations.d.ts.map +1 -0
  90. package/dist/hooks/useWorkspaceMutations.js +119 -0
  91. package/dist/hooks/useWorkspaceMutations.js.map +1 -0
  92. package/dist/hooks/useWorkspacePermissions.d.ts +29 -0
  93. package/dist/hooks/useWorkspacePermissions.d.ts.map +1 -0
  94. package/dist/hooks/useWorkspacePermissions.js +33 -0
  95. package/dist/hooks/useWorkspacePermissions.js.map +1 -0
  96. package/dist/hooks/useWorkspaceRoles.d.ts +8 -0
  97. package/dist/hooks/useWorkspaceRoles.d.ts.map +1 -0
  98. package/dist/hooks/useWorkspaceRoles.js +31 -0
  99. package/dist/hooks/useWorkspaceRoles.js.map +1 -0
  100. package/dist/hooks/useWorkspaces.d.ts +21 -0
  101. package/dist/hooks/useWorkspaces.d.ts.map +1 -0
  102. package/dist/hooks/useWorkspaces.js +75 -0
  103. package/dist/hooks/useWorkspaces.js.map +1 -0
  104. package/dist/hooks/useWorkspacesEventEmitter.d.ts +14 -0
  105. package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +1 -0
  106. package/dist/hooks/useWorkspacesEventEmitter.js +14 -0
  107. package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -0
  108. package/dist/index.d.ts +33 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +24 -0
  111. package/dist/pages/ActivityListPage.d.ts +2 -0
  112. package/dist/pages/ActivityListPage.d.ts.map +1 -0
  113. package/dist/pages/ActivityListPage.js +119 -0
  114. package/dist/pages/ActivityListPage.js.map +1 -0
  115. package/dist/pages/CreateWorkspacePage.d.ts +2 -0
  116. package/dist/pages/CreateWorkspacePage.d.ts.map +1 -0
  117. package/dist/pages/CreateWorkspacePage.js +264 -0
  118. package/dist/pages/CreateWorkspacePage.js.map +1 -0
  119. package/dist/pages/InviteAcceptancePage.d.ts +6 -0
  120. package/dist/pages/InviteAcceptancePage.d.ts.map +1 -0
  121. package/dist/pages/InviteAcceptancePage.js +495 -0
  122. package/dist/pages/InviteAcceptancePage.js.map +1 -0
  123. package/dist/pages/MembersListPage.d.ts +2 -0
  124. package/dist/pages/MembersListPage.d.ts.map +1 -0
  125. package/dist/pages/MembersListPage.js +420 -0
  126. package/dist/pages/MembersListPage.js.map +1 -0
  127. package/dist/pages/ProjectDetailPage.d.ts +2 -0
  128. package/dist/pages/ProjectDetailPage.d.ts.map +1 -0
  129. package/dist/pages/ProjectDetailPage.js +361 -0
  130. package/dist/pages/ProjectDetailPage.js.map +1 -0
  131. package/dist/pages/ProjectsListPage.d.ts +2 -0
  132. package/dist/pages/ProjectsListPage.d.ts.map +1 -0
  133. package/dist/pages/ProjectsListPage.js +398 -0
  134. package/dist/pages/ProjectsListPage.js.map +1 -0
  135. package/dist/pages/WorkspaceDetailPage.d.ts +2 -0
  136. package/dist/pages/WorkspaceDetailPage.d.ts.map +1 -0
  137. package/dist/pages/WorkspaceDetailPage.js +230 -0
  138. package/dist/pages/WorkspaceDetailPage.js.map +1 -0
  139. package/dist/pages/WorkspaceSettingsPage.d.ts +2 -0
  140. package/dist/pages/WorkspaceSettingsPage.d.ts.map +1 -0
  141. package/dist/pages/WorkspaceSettingsPage.js +157 -0
  142. package/dist/pages/WorkspaceSettingsPage.js.map +1 -0
  143. package/dist/pages/WorkspacesListPage.d.ts +2 -0
  144. package/dist/pages/WorkspacesListPage.d.ts.map +1 -0
  145. package/dist/pages/WorkspacesListPage.js +186 -0
  146. package/dist/pages/WorkspacesListPage.js.map +1 -0
  147. package/dist/pages/dashboard/DashboardCustomizer.d.ts +12 -0
  148. package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +1 -0
  149. package/dist/pages/dashboard/DashboardCustomizer.js +136 -0
  150. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -0
  151. package/dist/pages/dashboard/DashboardGrid.d.ts +8 -0
  152. package/dist/pages/dashboard/DashboardGrid.d.ts.map +1 -0
  153. package/dist/pages/dashboard/DashboardGrid.js +58 -0
  154. package/dist/pages/dashboard/DashboardGrid.js.map +1 -0
  155. package/dist/pages/dashboard/DashboardPage.d.ts +14 -0
  156. package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
  157. package/dist/pages/dashboard/DashboardPage.js +136 -0
  158. package/dist/pages/dashboard/DashboardPage.js.map +1 -0
  159. package/dist/pages/dashboard/WidgetWrapper.d.ts +17 -0
  160. package/dist/pages/dashboard/WidgetWrapper.d.ts.map +1 -0
  161. package/dist/pages/dashboard/WidgetWrapper.js +72 -0
  162. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -0
  163. package/dist/pages/dashboard/config.d.ts +9 -0
  164. package/dist/pages/dashboard/config.d.ts.map +1 -0
  165. package/dist/pages/dashboard/config.js +214 -0
  166. package/dist/pages/dashboard/config.js.map +1 -0
  167. package/dist/pages/dashboard/hooks/useDashboardData.d.ts +9 -0
  168. package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +1 -0
  169. package/dist/pages/dashboard/hooks/useDashboardData.js +118 -0
  170. package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -0
  171. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +4 -0
  172. package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +1 -0
  173. package/dist/pages/dashboard/hooks/useDashboardPreferences.js +32 -0
  174. package/dist/pages/dashboard/hooks/useDashboardPreferences.js.map +1 -0
  175. package/dist/pages/dashboard/types.d.ts +145 -0
  176. package/dist/pages/dashboard/types.d.ts.map +1 -0
  177. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +4 -0
  178. package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +1 -0
  179. package/dist/pages/dashboard/widgets/GroupsWidget.js +59 -0
  180. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -0
  181. package/dist/pages/dashboard/widgets/MembersWidget.d.ts +4 -0
  182. package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +1 -0
  183. package/dist/pages/dashboard/widgets/MembersWidget.js +65 -0
  184. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -0
  185. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +4 -0
  186. package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +1 -0
  187. package/dist/pages/dashboard/widgets/ProjectsWidget.js +91 -0
  188. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -0
  189. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +4 -0
  190. package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +1 -0
  191. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +80 -0
  192. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -0
  193. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +4 -0
  194. package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +1 -0
  195. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +81 -0
  196. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -0
  197. package/dist/pages/dashboard/widgets/StorageWidget.d.ts +4 -0
  198. package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +1 -0
  199. package/dist/pages/dashboard/widgets/StorageWidget.js +69 -0
  200. package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -0
  201. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +4 -0
  202. package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +1 -0
  203. package/dist/pages/dashboard/widgets/SystemHealthWidget.js +59 -0
  204. package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +1 -0
  205. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +4 -0
  206. package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +1 -0
  207. package/dist/pages/dashboard/widgets/TagCloudWidget.js +61 -0
  208. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -0
  209. package/dist/pages/dashboard/widgets/TipsWidget.d.ts +4 -0
  210. package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +1 -0
  211. package/dist/pages/dashboard/widgets/TipsWidget.js +67 -0
  212. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -0
  213. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +4 -0
  214. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +1 -0
  215. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +83 -0
  216. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -0
  217. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +4 -0
  218. package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +1 -0
  219. package/dist/pages/dashboard/widgets/WelcomeWidget.js +71 -0
  220. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -0
  221. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +4 -0
  222. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +1 -0
  223. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +97 -0
  224. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -0
  225. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +4 -0
  226. package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +1 -0
  227. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +67 -0
  228. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -0
  229. package/dist/providers/WorkspacesProvider.d.ts +13 -0
  230. package/dist/providers/WorkspacesProvider.d.ts.map +1 -0
  231. package/dist/providers/WorkspacesProvider.js +24 -0
  232. package/dist/providers/WorkspacesProvider.js.map +1 -0
  233. package/dist/store/workspacesStore.d.ts +82 -0
  234. package/dist/store/workspacesStore.d.ts.map +1 -0
  235. package/dist/store/workspacesStore.js +92 -0
  236. package/dist/store/workspacesStore.js.map +1 -0
  237. package/dist/types/index.d.ts +280 -0
  238. package/dist/types/index.d.ts.map +1 -0
  239. package/dist/utils/formatters.d.ts +60 -0
  240. package/dist/utils/formatters.d.ts.map +1 -0
  241. package/dist/utils/formatters.js +61 -0
  242. package/dist/utils/formatters.js.map +1 -0
  243. package/dist/utils/index.d.ts +3 -0
  244. package/dist/utils/index.d.ts.map +1 -0
  245. package/dist/utils/nativeBridge.d.ts +3 -0
  246. package/dist/utils/nativeBridge.d.ts.map +1 -0
  247. package/dist/utils/nativeBridge.js +2 -0
  248. package/dist/utils/projectTags.d.ts +6 -0
  249. package/dist/utils/projectTags.d.ts.map +1 -0
  250. package/dist/utils/projectTags.js +49 -0
  251. package/dist/utils/projectTags.js.map +1 -0
  252. package/dist/utils/slug.d.ts +13 -0
  253. package/dist/utils/slug.d.ts.map +1 -0
  254. package/dist/utils/slug.js +8 -0
  255. package/dist/utils/slug.js.map +1 -0
  256. package/dist/utils/tokenHelpers.d.ts +114 -0
  257. package/dist/utils/tokenHelpers.d.ts.map +1 -0
  258. package/dist/utils/tokenHelpers.js +80 -0
  259. package/dist/utils/tokenHelpers.js.map +1 -0
  260. package/package.json +113 -0
@@ -0,0 +1,361 @@
1
+ import { useWorkspacesContext as e } from "../providers/WorkspacesProvider.js";
2
+ import { getProjectStatusClasses as t } from "../utils/tokenHelpers.js";
3
+ import { useScopedNavigation as n } from "../hooks/useScopedNavigation.js";
4
+ import { nativeImpact as r, nativeNotify as i } from "../utils/nativeBridge.js";
5
+ import { useProject as a, useProjectMembersCount as ee } from "../hooks/useProjects.js";
6
+ import { useArchiveProject as te, useDeleteProject as ne, useUnarchiveProject as re, useUpdateProject as o } from "../hooks/useProjectMutations.js";
7
+ import { formatDate as s } from "../utils/formatters.js";
8
+ import { normalizeProjectTags as c, toProjectTag as l } from "../utils/projectTags.js";
9
+ import { useWorkspaceActivity as ie } from "../hooks/useWorkspaceActivity.js";
10
+ import { useWorkspacePermissions as ae } from "../hooks/useWorkspacePermissions.js";
11
+ import { useCallback as oe, useEffect as se, useMemo as ce, useState as u } from "react";
12
+ import { Activity as d, Archive as f, ArrowLeft as p, Clock as m, FolderKanban as h, MoreVertical as g, Users as _ } from "lucide-react";
13
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
+ import { AlertDialog as le, AlertDialogAction as ue, AlertDialogCancel as de, AlertDialogContent as fe, AlertDialogDescription as pe, AlertDialogFooter as me, AlertDialogHeader as he, AlertDialogTitle as ge, Badge as b, Button as x, Card as S, CardContent as C, CardHeader as w, CardTitle as T, DropdownMenu as _e, DropdownMenuContent as E, DropdownMenuItem as D, DropdownMenuSeparator as O, DropdownMenuTrigger as k, Skeleton as A } from "@burdenoff/fe-libs/ui";
15
+ import { useNavigate as j, useParams as M } from "react-router-dom";
16
+ import { useI18n as N } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
17
+ import { TagsWidget as P } from "@burdenoff/fe-libs/tag";
18
+ //#region src/pages/ProjectDetailPage.tsx
19
+ function F() {
20
+ let { t: F } = N(), I = oe((e, t) => {
21
+ let n = F(e);
22
+ return n === e ? t : n;
23
+ }, [F]), { workspaceId: L, projectId: R } = M(), z = j(), { basePath: B = "/workspaces" } = e(), { withCurrentSearch: V } = n(), { data: H, isLoading: ve, error: ye } = a(R || "", L), [be, U] = u(!1), [W, G] = u(() => c(H?.tags)), { mutate: xe, isPending: K } = te(L), { mutate: Se, isPending: q } = re(L), { mutate: Ce, isPending: J } = ne(L), { mutateAsync: we, isPending: Te } = o(L), { data: Ee } = ee(R || "", L), { data: De } = ie(L), Y = (De ?? []).filter((e) => e.resourceId === R || e.resourceType?.toLowerCase() === "project").length, { canViewProject: Oe, canDeleteProject: X, canArchiveProject: Z, isLoading: ke } = ae();
24
+ se(() => {
25
+ G(c(H?.tags));
26
+ }, [H?.tags]);
27
+ let Ae = ce(() => W, [W]);
28
+ if (ke) return /* @__PURE__ */ y("div", {
29
+ className: "space-y-4 p-6",
30
+ children: [/* @__PURE__ */ v(A, { className: "h-10 w-1/3" }), /* @__PURE__ */ v(A, { className: "h-64" })]
31
+ });
32
+ if (!Oe) return /* @__PURE__ */ v("div", {
33
+ className: "flex items-center justify-center min-h-[400px]",
34
+ children: /* @__PURE__ */ y("div", {
35
+ className: "text-center space-y-2",
36
+ children: [/* @__PURE__ */ v("h2", {
37
+ className: "text-lg font-semibold",
38
+ children: I("projectDetail.accessDenied", "Access Denied")
39
+ }), /* @__PURE__ */ v("p", {
40
+ className: "text-sm text-muted-foreground",
41
+ children: I("projectDetail.noPermissionToViewProject", "You don't have permission to view this project.")
42
+ })]
43
+ })
44
+ });
45
+ let Q = () => {
46
+ z(V(`${B}/${L}/projects`));
47
+ }, je = () => {
48
+ H && (H.archived ? Se(H.id, { onError: (e) => {
49
+ console.error("Failed to unarchive project:", e);
50
+ } }) : xe(H.id, { onError: (e) => {
51
+ console.error("Failed to archive project:", e);
52
+ } }));
53
+ }, Me = () => {
54
+ H && (r("medium"), Ce(H.id, {
55
+ onSuccess: () => {
56
+ i("success"), U(!1), z(V(`${B}/${L}/projects`));
57
+ },
58
+ onError: (e) => {
59
+ i("error"), console.error("Failed to delete project:", e);
60
+ }
61
+ }));
62
+ }, $ = async (e) => {
63
+ if (!H) return;
64
+ let t = e.map((e) => l(e));
65
+ G(t);
66
+ try {
67
+ await we({
68
+ id: H.id,
69
+ input: { tags: t }
70
+ });
71
+ } catch (e) {
72
+ throw G(c(H.tags)), e;
73
+ }
74
+ };
75
+ return ve ? /* @__PURE__ */ y("div", {
76
+ className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
77
+ children: [
78
+ /* @__PURE__ */ v(A, { className: "h-10 w-32" }),
79
+ /* @__PURE__ */ v(A, { className: "h-10 w-1/3" }),
80
+ /* @__PURE__ */ y("div", {
81
+ className: "grid grid-cols-1 md:grid-cols-3 gap-4",
82
+ children: [
83
+ /* @__PURE__ */ v(A, { className: "h-32" }),
84
+ /* @__PURE__ */ v(A, { className: "h-32" }),
85
+ /* @__PURE__ */ v(A, { className: "h-32" })
86
+ ]
87
+ }),
88
+ /* @__PURE__ */ v(A, { className: "h-48" })
89
+ ]
90
+ }) : ye || !H ? /* @__PURE__ */ y("div", {
91
+ className: "space-y-4 p-6",
92
+ children: [/* @__PURE__ */ y(x, {
93
+ variant: "ghost",
94
+ onClick: Q,
95
+ className: "gap-2",
96
+ children: [/* @__PURE__ */ v(p, { size: 20 }), I("projectDetail.backToProjects", "Back to Projects")]
97
+ }), /* @__PURE__ */ y("div", {
98
+ className: "text-center py-12",
99
+ children: [
100
+ /* @__PURE__ */ v("div", {
101
+ className: "rounded-full bg-muted p-6 mb-4 inline-block",
102
+ children: /* @__PURE__ */ v(h, {
103
+ size: 48,
104
+ className: "text-muted-foreground"
105
+ })
106
+ }),
107
+ /* @__PURE__ */ v("h3", {
108
+ className: "text-lg font-semibold mb-2",
109
+ children: I("projectDetail.projectNotFound", "Project not found")
110
+ }),
111
+ /* @__PURE__ */ v("p", {
112
+ className: "text-muted-foreground max-w-sm mx-auto mb-4",
113
+ children: I("projectDetail.projectNotFoundDescription", "The project you're looking for doesn't exist or you don't have permission to view it.")
114
+ }),
115
+ /* @__PURE__ */ y(x, {
116
+ onClick: Q,
117
+ children: [/* @__PURE__ */ v(p, {
118
+ size: 16,
119
+ className: "mr-2"
120
+ }), I("projectDetail.backToProjects", "Back to Projects")]
121
+ })
122
+ ]
123
+ })]
124
+ }) : /* @__PURE__ */ y("div", {
125
+ className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
126
+ children: [
127
+ /* @__PURE__ */ y("div", {
128
+ className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
129
+ children: [/* @__PURE__ */ y("div", { children: [
130
+ /* @__PURE__ */ y(x, {
131
+ variant: "ghost",
132
+ onClick: Q,
133
+ className: "gap-2 mb-2 -ml-2",
134
+ children: [/* @__PURE__ */ v(p, { size: 20 }), I("projectDetail.backToProjects", "Back to Projects")]
135
+ }),
136
+ /* @__PURE__ */ y("div", {
137
+ className: "flex items-center gap-3",
138
+ children: [/* @__PURE__ */ v("div", {
139
+ className: "p-3 rounded-lg bg-primary/10",
140
+ children: /* @__PURE__ */ v(h, {
141
+ className: "text-primary",
142
+ size: 28
143
+ })
144
+ }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("h1", {
145
+ className: "text-2xl sm:text-3xl font-bold",
146
+ children: H.name
147
+ }), /* @__PURE__ */ v("p", {
148
+ className: "text-sm text-muted-foreground font-mono",
149
+ children: H.key
150
+ })] })]
151
+ }),
152
+ /* @__PURE__ */ y("div", {
153
+ className: "flex items-center gap-2 mt-3",
154
+ children: [/* @__PURE__ */ v(b, {
155
+ className: `border ${t(H.status)}`,
156
+ children: H.status
157
+ }), H.archived && /* @__PURE__ */ y(b, {
158
+ variant: "outline",
159
+ className: "border-workspace-archived-border text-workspace-archived-text",
160
+ children: [/* @__PURE__ */ v(f, {
161
+ size: 12,
162
+ className: "mr-1"
163
+ }), I("projectDetail.archived", "Archived")]
164
+ })]
165
+ })
166
+ ] }), /* @__PURE__ */ v("div", {
167
+ className: "flex items-center gap-2",
168
+ children: /* @__PURE__ */ y(_e, { children: [/* @__PURE__ */ v(k, {
169
+ asChild: !0,
170
+ children: /* @__PURE__ */ v(x, {
171
+ variant: "outline",
172
+ size: "icon",
173
+ "aria-label": I("projectDetail.openProjectActionsAriaLabel", "Open project actions"),
174
+ children: /* @__PURE__ */ v(g, { size: 20 })
175
+ })
176
+ }), /* @__PURE__ */ y(E, {
177
+ align: "end",
178
+ children: [
179
+ Z && /* @__PURE__ */ y(D, {
180
+ onClick: je,
181
+ disabled: K || q,
182
+ children: [/* @__PURE__ */ v(f, {
183
+ size: 16,
184
+ className: "mr-2"
185
+ }), K || q ? I("projectDetail.processing", "Processing...") : H.archived ? I("projectDetail.unarchive", "Unarchive") : I("projectDetail.archive", "Archive")]
186
+ }),
187
+ Z && X && /* @__PURE__ */ v(O, {}),
188
+ X && /* @__PURE__ */ v(D, {
189
+ onClick: () => U(!0),
190
+ className: "text-destructive",
191
+ children: I("projectDetail.deleteProject", "Delete Project")
192
+ })
193
+ ]
194
+ })] })
195
+ })]
196
+ }),
197
+ /* @__PURE__ */ y("div", {
198
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
199
+ children: [/* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, {
200
+ className: "flex flex-row items-center justify-between pb-2",
201
+ children: /* @__PURE__ */ y(T, {
202
+ className: "flex items-center gap-2 text-base",
203
+ children: [/* @__PURE__ */ v(_, {
204
+ size: 20,
205
+ className: "text-muted-foreground"
206
+ }), I("projectDetail.membersCardTitle", "Members")]
207
+ })
208
+ }), /* @__PURE__ */ y(C, { children: [/* @__PURE__ */ v("p", {
209
+ className: "text-3xl font-bold",
210
+ children: Ee ?? 0
211
+ }), /* @__PURE__ */ v("p", {
212
+ className: "text-sm text-muted-foreground",
213
+ children: I("projectDetail.projectMembers", "Project members")
214
+ })] })] }), /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, {
215
+ className: "flex flex-row items-center justify-between pb-2",
216
+ children: /* @__PURE__ */ y(T, {
217
+ className: "flex items-center gap-2 text-base",
218
+ children: [/* @__PURE__ */ v(d, {
219
+ size: 20,
220
+ className: "text-muted-foreground"
221
+ }), I("projectDetail.activityCardTitle", "Activity")]
222
+ })
223
+ }), /* @__PURE__ */ y(C, { children: [/* @__PURE__ */ v("p", {
224
+ className: "text-3xl font-bold",
225
+ children: Y
226
+ }), /* @__PURE__ */ v("p", {
227
+ className: "text-sm text-muted-foreground",
228
+ children: I("projectDetail.recentActivityItems", "Recent activity items")
229
+ })] })] })]
230
+ }),
231
+ /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, { children: I("projectDetail.tagsTitle", "Tags") }) }), /* @__PURE__ */ y(C, {
232
+ className: "space-y-3",
233
+ children: [/* @__PURE__ */ v("p", {
234
+ className: "text-sm text-muted-foreground",
235
+ children: I("projectDetail.tagsDescription", "Use universal tags to classify and filter this project across the workspace.")
236
+ }), /* @__PURE__ */ v(P, {
237
+ entityType: "Project",
238
+ entityId: H.id,
239
+ workspaceId: L,
240
+ tags: Ae,
241
+ onAdd: async (e) => {
242
+ await $([...W, l(e)]);
243
+ },
244
+ onRemove: async (e) => {
245
+ await $(W.filter((t) => t.tagId !== e && t.id !== e));
246
+ },
247
+ syncGraphNotifications: !1,
248
+ className: Te ? "pointer-events-none opacity-75" : void 0
249
+ })]
250
+ })] }),
251
+ /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, { children: I("projectDetail.projectInformation", "Project Information") }) }), /* @__PURE__ */ y(C, {
252
+ className: "space-y-4",
253
+ children: [/* @__PURE__ */ y("div", {
254
+ className: "grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm",
255
+ children: [
256
+ /* @__PURE__ */ y("div", {
257
+ className: "space-y-1",
258
+ children: [/* @__PURE__ */ y("span", {
259
+ className: "text-muted-foreground flex items-center gap-2",
260
+ children: [/* @__PURE__ */ v(h, { size: 14 }), I("projectDetail.projectId", "Project ID")]
261
+ }), /* @__PURE__ */ v("span", {
262
+ className: "font-mono text-xs block",
263
+ children: H.id
264
+ })]
265
+ }),
266
+ /* @__PURE__ */ y("div", {
267
+ className: "space-y-1",
268
+ children: [/* @__PURE__ */ y("span", {
269
+ className: "text-muted-foreground flex items-center gap-2",
270
+ children: [/* @__PURE__ */ v(h, { size: 14 }), I("projectDetail.projectKey", "Project Key")]
271
+ }), /* @__PURE__ */ v("span", {
272
+ className: "font-medium",
273
+ children: H.key
274
+ })]
275
+ }),
276
+ /* @__PURE__ */ y("div", {
277
+ className: "space-y-1",
278
+ children: [/* @__PURE__ */ y("span", {
279
+ className: "text-muted-foreground flex items-center gap-2",
280
+ children: [/* @__PURE__ */ v(m, { size: 14 }), I("projectDetail.created", "Created")]
281
+ }), /* @__PURE__ */ v("span", { children: s(H.createdAt) })]
282
+ }),
283
+ /* @__PURE__ */ y("div", {
284
+ className: "space-y-1",
285
+ children: [/* @__PURE__ */ y("span", {
286
+ className: "text-muted-foreground flex items-center gap-2",
287
+ children: [/* @__PURE__ */ v(m, { size: 14 }), I("projectDetail.lastUpdated", "Last Updated")]
288
+ }), /* @__PURE__ */ v("span", { children: s(H.updatedAt) })]
289
+ }),
290
+ /* @__PURE__ */ y("div", {
291
+ className: "space-y-1",
292
+ children: [/* @__PURE__ */ y("span", {
293
+ className: "text-muted-foreground flex items-center gap-2",
294
+ children: [/* @__PURE__ */ v(_, { size: 14 }), I("projectDetail.workspaceId", "Workspace ID")]
295
+ }), /* @__PURE__ */ v("span", {
296
+ className: "font-mono text-xs block",
297
+ children: H.workspaceId
298
+ })]
299
+ }),
300
+ /* @__PURE__ */ y("div", {
301
+ className: "space-y-1",
302
+ children: [/* @__PURE__ */ y("span", {
303
+ className: "text-muted-foreground flex items-center gap-2",
304
+ children: [/* @__PURE__ */ v(_, { size: 14 }), I("projectDetail.creatorId", "Creator ID")]
305
+ }), /* @__PURE__ */ v("span", {
306
+ className: "font-mono text-xs block",
307
+ children: H.creatorId
308
+ })]
309
+ })
310
+ ]
311
+ }), H.config && Object.keys(H.config).length > 0 && /* @__PURE__ */ y("div", {
312
+ className: "pt-4 border-t",
313
+ children: [/* @__PURE__ */ v("h4", {
314
+ className: "text-sm font-medium mb-2",
315
+ children: I("projectDetail.configuration", "Configuration")
316
+ }), /* @__PURE__ */ v("pre", {
317
+ className: "text-xs bg-muted p-3 rounded-lg overflow-auto",
318
+ children: JSON.stringify(H.config, null, 2)
319
+ })]
320
+ })]
321
+ })] }),
322
+ /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, { children: I("projectDetail.quickActions", "Quick Actions") }) }), /* @__PURE__ */ v(C, { children: /* @__PURE__ */ y("div", {
323
+ className: "flex flex-wrap gap-2",
324
+ children: [/* @__PURE__ */ y(x, {
325
+ variant: "outline",
326
+ size: "sm",
327
+ onClick: () => z(V(`${B}/${L}/members`)),
328
+ children: [/* @__PURE__ */ v(_, {
329
+ size: 16,
330
+ className: "mr-2"
331
+ }), I("projectDetail.workspaceMembers", "Workspace Members")]
332
+ }), /* @__PURE__ */ y(x, {
333
+ variant: "outline",
334
+ size: "sm",
335
+ onClick: () => z(V(`${B}/${L}/activity`)),
336
+ children: [/* @__PURE__ */ v(d, {
337
+ size: 16,
338
+ className: "mr-2"
339
+ }), I("projectDetail.workspaceActivity", "Workspace Activity")]
340
+ })]
341
+ }) })] }),
342
+ /* @__PURE__ */ v(le, {
343
+ open: be,
344
+ onOpenChange: U,
345
+ children: /* @__PURE__ */ y(fe, { children: [/* @__PURE__ */ y(he, { children: [/* @__PURE__ */ v(ge, { children: I("projectDetail.deleteDialogTitle", "Delete Project") }), /* @__PURE__ */ v(pe, { children: I("projectDetail.deleteConfirmPrefix", "Are you sure you want to delete \"") + H.name + I("projectDetail.deleteConfirmSuffix", "\"? This action cannot be undone and all project data will be permanently removed.") })] }), /* @__PURE__ */ y(me, { children: [/* @__PURE__ */ v(de, {
346
+ disabled: J,
347
+ children: I("projectDetail.cancel", "Cancel")
348
+ }), /* @__PURE__ */ v(ue, {
349
+ onClick: Me,
350
+ disabled: J,
351
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
352
+ children: J ? I("projectDetail.deleting", "Deleting...") : I("projectDetail.deleteProject", "Delete Project")
353
+ })] })] })
354
+ })
355
+ ]
356
+ });
357
+ }
358
+ //#endregion
359
+ export { F as ProjectDetailPage };
360
+
361
+ //# sourceMappingURL=ProjectDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectDetailPage.js","names":[],"sources":["../../src/pages/ProjectDetailPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n ArrowLeft,\n FolderKanban,\n Users,\n Activity,\n Archive,\n MoreVertical,\n Clock,\n} from 'lucide-react';\nimport {\n Button,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n Badge,\n Skeleton,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n DropdownMenuSeparator,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { type TagItem, TagsWidget } from '@burdenoff/fe-libs/tag';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useProject, useProjectMembersCount } from '../hooks/useProjects';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport {\n useArchiveProject,\n useUnarchiveProject,\n useDeleteProject,\n useUpdateProject,\n} from '../hooks/useProjectMutations';\nimport { formatDate } from '../utils/formatters';\nimport { nativeImpact, nativeNotify } from '../utils/nativeBridge';\nimport { normalizeProjectTags, toProjectTag } from '../utils/projectTags';\nimport { getProjectStatusClasses } from '../utils/tokenHelpers';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\n\nexport function ProjectDetailPage() {\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, projectId } = useParams<{ workspaceId: string; projectId: string }>();\n const navigate = useNavigate();\n const { basePath = '/workspaces' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { data: project, isLoading, error } = useProject(projectId || '', workspaceId);\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n const [projectTags, setProjectTags] = useState(() => normalizeProjectTags(project?.tags));\n\n const { mutate: archiveProject, isPending: isArchiving } = useArchiveProject(workspaceId);\n const { mutate: unarchiveProject, isPending: isUnarchiving } = useUnarchiveProject(workspaceId);\n const { mutate: deleteProject, isPending: isDeleting } = useDeleteProject(workspaceId);\n const { mutateAsync: updateProject, isPending: isUpdatingProject } =\n useUpdateProject(workspaceId);\n const { data: projectMemberCount } = useProjectMembersCount(projectId || '', workspaceId);\n const { data: workspaceActivity } = useWorkspaceActivity(workspaceId);\n const relatedActivityCount = (workspaceActivity ?? []).filter(\n (item) => item.resourceId === projectId || item.resourceType?.toLowerCase() === 'project'\n ).length;\n\n const {\n canViewProject,\n canDeleteProject,\n canArchiveProject,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n useEffect(() => {\n setProjectTags(normalizeProjectTags(project?.tags));\n }, [project?.tags]);\n\n const widgetTags = useMemo<TagItem[]>(() => projectTags, [projectTags]);\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 (!canViewProject) {\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('projectDetail.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'projectDetail.noPermissionToViewProject',\n \"You don't have permission to view this project.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n const handleBack = () => {\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`));\n };\n\n const handleArchive = () => {\n if (!project) return;\n if (project.archived) {\n unarchiveProject(project.id, {\n onError: (err) => {\n console.error('Failed to unarchive project:', err);\n },\n });\n } else {\n archiveProject(project.id, {\n onError: (err) => {\n console.error('Failed to archive project:', err);\n },\n });\n }\n };\n\n const handleDelete = () => {\n if (!project) return;\n void nativeImpact('medium');\n deleteProject(project.id, {\n onSuccess: () => {\n void nativeNotify('success');\n setShowDeleteDialog(false);\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`));\n },\n onError: (err) => {\n void nativeNotify('error');\n console.error('Failed to delete project:', err);\n },\n });\n };\n\n const persistProjectTags = async (nextTags: TagItem[]) => {\n if (!project) {\n return;\n }\n\n const normalizedNextTags = nextTags.map((tag) => toProjectTag(tag));\n setProjectTags(normalizedNextTags);\n\n try {\n await updateProject({\n id: project.id,\n input: {\n tags: normalizedNextTags,\n },\n });\n } catch (err) {\n setProjectTags(normalizeProjectTags(project.tags));\n throw err;\n }\n };\n\n const handleAddTag = async (tag: TagItem) => {\n const nextTags = [...projectTags, toProjectTag(tag)];\n await persistProjectTags(nextTags);\n };\n\n const handleRemoveTag = async (tagId: string) => {\n const nextTags = projectTags.filter((tag) => tag.tagId !== tagId && tag.id !== tagId);\n await persistProjectTags(nextTags);\n };\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-32\" />\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 <Skeleton className=\"h-48\" />\n </div>\n );\n }\n\n if (error || !project) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button variant=\"ghost\" onClick={handleBack} className=\"gap-2\">\n <ArrowLeft size={20} />\n {tr('projectDetail.backToProjects', 'Back to Projects')}\n </Button>\n <div className=\"text-center py-12\">\n <div className=\"rounded-full bg-muted p-6 mb-4 inline-block\">\n <FolderKanban size={48} className=\"text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">\n {tr('projectDetail.projectNotFound', 'Project not found')}\n </h3>\n <p className=\"text-muted-foreground max-w-sm mx-auto mb-4\">\n {tr(\n 'projectDetail.projectNotFoundDescription',\n \"The project you're looking for doesn't exist or you don't have permission to view it.\"\n )}\n </p>\n <Button onClick={handleBack}>\n <ArrowLeft size={16} className=\"mr-2\" />\n {tr('projectDetail.backToProjects', 'Back to Projects')}\n </Button>\n </div>\n </div>\n );\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-start sm:justify-between gap-3\">\n <div>\n <Button variant=\"ghost\" onClick={handleBack} className=\"gap-2 mb-2 -ml-2\">\n <ArrowLeft size={20} />\n {tr('projectDetail.backToProjects', 'Back to Projects')}\n </Button>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-primary/10\">\n <FolderKanban className=\"text-primary\" size={28} />\n </div>\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">{project.name}</h1>\n <p className=\"text-sm text-muted-foreground font-mono\">{project.key}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 mt-3\">\n <Badge className={`border ${getProjectStatusClasses(project.status)}`}>\n {project.status}\n </Badge>\n {project.archived && (\n <Badge\n variant=\"outline\"\n className=\"border-workspace-archived-border text-workspace-archived-text\"\n >\n <Archive size={12} className=\"mr-1\" />\n {tr('projectDetail.archived', 'Archived')}\n </Badge>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n aria-label={tr('projectDetail.openProjectActionsAriaLabel', 'Open project actions')}\n >\n <MoreVertical size={20} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {canArchiveProject && (\n <DropdownMenuItem onClick={handleArchive} disabled={isArchiving || isUnarchiving}>\n <Archive size={16} className=\"mr-2\" />\n {isArchiving || isUnarchiving\n ? tr('projectDetail.processing', 'Processing...')\n : project.archived\n ? tr('projectDetail.unarchive', 'Unarchive')\n : tr('projectDetail.archive', 'Archive')}\n </DropdownMenuItem>\n )}\n {canArchiveProject && canDeleteProject && <DropdownMenuSeparator />}\n {canDeleteProject && (\n <DropdownMenuItem\n onClick={() => setShowDeleteDialog(true)}\n className=\"text-destructive\"\n >\n {tr('projectDetail.deleteProject', 'Delete Project')}\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Users size={20} className=\"text-muted-foreground\" />\n {tr('projectDetail.membersCardTitle', 'Members')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold\">{projectMemberCount ?? 0}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('projectDetail.projectMembers', 'Project members')}\n </p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity size={20} className=\"text-muted-foreground\" />\n {tr('projectDetail.activityCardTitle', 'Activity')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold\">{relatedActivityCount}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('projectDetail.recentActivityItems', 'Recent activity items')}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>{tr('projectDetail.tagsTitle', 'Tags')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'projectDetail.tagsDescription',\n 'Use universal tags to classify and filter this project across the workspace.'\n )}\n </p>\n <TagsWidget\n entityType=\"Project\"\n entityId={project.id}\n workspaceId={workspaceId}\n tags={widgetTags}\n onAdd={handleAddTag}\n onRemove={handleRemoveTag}\n syncGraphNotifications={false}\n className={isUpdatingProject ? 'pointer-events-none opacity-75' : undefined}\n />\n </CardContent>\n </Card>\n\n {/* Project Information */}\n <Card>\n <CardHeader>\n <CardTitle>{tr('projectDetail.projectInformation', 'Project Information')}</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm\">\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <FolderKanban size={14} />\n {tr('projectDetail.projectId', 'Project ID')}\n </span>\n <span className=\"font-mono text-xs block\">{project.id}</span>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <FolderKanban size={14} />\n {tr('projectDetail.projectKey', 'Project Key')}\n </span>\n <span className=\"font-medium\">{project.key}</span>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <Clock size={14} />\n {tr('projectDetail.created', 'Created')}\n </span>\n <span>{formatDate(project.createdAt)}</span>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <Clock size={14} />\n {tr('projectDetail.lastUpdated', 'Last Updated')}\n </span>\n <span>{formatDate(project.updatedAt)}</span>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <Users size={14} />\n {tr('projectDetail.workspaceId', 'Workspace ID')}\n </span>\n <span className=\"font-mono text-xs block\">{project.workspaceId}</span>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-muted-foreground flex items-center gap-2\">\n <Users size={14} />\n {tr('projectDetail.creatorId', 'Creator ID')}\n </span>\n <span className=\"font-mono text-xs block\">{project.creatorId}</span>\n </div>\n </div>\n\n {project.config && Object.keys(project.config).length > 0 && (\n <div className=\"pt-4 border-t\">\n <h4 className=\"text-sm font-medium mb-2\">\n {tr('projectDetail.configuration', 'Configuration')}\n </h4>\n <pre className=\"text-xs bg-muted p-3 rounded-lg overflow-auto\">\n {JSON.stringify(project.config, null, 2)}\n </pre>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Quick Actions */}\n <Card>\n <CardHeader>\n <CardTitle>{tr('projectDetail.quickActions', 'Quick Actions')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`))}\n >\n <Users size={16} className=\"mr-2\" />\n {tr('projectDetail.workspaceMembers', 'Workspace Members')}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/activity`))}\n >\n <Activity size={16} className=\"mr-2\" />\n {tr('projectDetail.workspaceActivity', 'Workspace Activity')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Delete Confirmation Dialog */}\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {tr('projectDetail.deleteDialogTitle', 'Delete Project')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {tr('projectDetail.deleteConfirmPrefix', 'Are you sure you want to delete \"') +\n project.name +\n tr(\n 'projectDetail.deleteConfirmSuffix',\n '\"? This action cannot be undone and all project data will be permanently removed.'\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>\n {tr('projectDetail.cancel', 'Cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDelete}\n disabled={isDeleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isDeleting\n ? tr('projectDetail.deleting', 'Deleting...')\n : tr('projectDetail.deleteProject', 'Delete Project')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProjectsListPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProjectsListPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsListPage.d.ts","sourceRoot":"","sources":["../../src/pages/ProjectsListPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,gBAAgB,4CAshB/B"}