@burdenoff/microfe-planmagnet 2026.509.103

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 (222) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +21253 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +8370 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +4182 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  16. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  17. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  18. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  19. package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
  20. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
  21. package/dist/planmagnet/PlanMagnetRoot.js +292 -0
  22. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -0
  23. package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
  24. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
  25. package/dist/planmagnet/PlanMagnetRoutes.js +211 -0
  26. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -0
  27. package/dist/planmagnet/index.d.ts +5 -0
  28. package/dist/planmagnet/index.d.ts.map +1 -0
  29. package/dist/planmagnet/index.js +3 -0
  30. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  31. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  32. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +312 -0
  33. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
  34. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
  35. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
  36. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +110 -0
  37. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -0
  38. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +96 -0
  41. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
  43. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
  44. package/dist/planmagnet/pages/CollaborationFilesPagePage.js +112 -0
  45. package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -0
  46. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +141 -0
  49. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +124 -0
  53. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +350 -0
  57. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -0
  58. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
  59. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
  60. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +290 -0
  61. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -0
  62. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
  63. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
  64. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +189 -0
  65. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -0
  66. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
  67. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
  68. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +151 -0
  69. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -0
  70. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
  71. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
  72. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +257 -0
  73. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -0
  74. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
  75. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
  76. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +221 -0
  77. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -0
  78. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
  79. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
  80. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +284 -0
  81. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -0
  82. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
  83. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
  84. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +291 -0
  85. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -0
  86. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
  87. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
  88. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +257 -0
  89. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -0
  90. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
  91. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
  92. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +222 -0
  93. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -0
  94. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
  95. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
  96. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +288 -0
  97. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -0
  98. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
  99. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
  100. package/dist/planmagnet/pages/ProductsProductsPagePage.js +225 -0
  101. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -0
  102. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
  103. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
  104. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +262 -0
  105. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -0
  106. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
  107. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
  108. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +162 -0
  109. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -0
  110. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
  111. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
  112. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +342 -0
  113. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -0
  114. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
  115. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
  116. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +233 -0
  117. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -0
  118. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
  119. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
  120. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +193 -0
  121. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -0
  122. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
  123. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
  124. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +116 -0
  125. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -0
  126. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
  127. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
  128. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +199 -0
  129. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -0
  130. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
  131. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
  132. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +197 -0
  133. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -0
  134. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
  135. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
  136. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +173 -0
  137. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -0
  138. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
  139. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
  140. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +119 -0
  141. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -0
  142. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
  143. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
  144. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +257 -0
  145. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -0
  146. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
  147. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
  148. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +222 -0
  149. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -0
  150. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
  151. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
  152. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +142 -0
  153. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -0
  154. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
  155. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
  156. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +363 -0
  157. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -0
  158. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
  159. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
  160. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +176 -0
  161. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -0
  162. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
  163. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
  164. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +173 -0
  165. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -0
  166. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
  167. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
  168. package/dist/planmagnet/pages/ReportsReportsPagePage.js +221 -0
  169. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -0
  170. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
  171. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
  172. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +282 -0
  173. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -0
  174. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
  175. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
  176. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +227 -0
  177. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -0
  178. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
  179. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
  180. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +234 -0
  181. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -0
  182. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
  183. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
  184. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +232 -0
  185. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -0
  186. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
  187. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
  188. package/dist/planmagnet/pages/TasksTasksPagePage.js +206 -0
  189. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -0
  190. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
  191. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
  192. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +138 -0
  193. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -0
  194. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
  195. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
  196. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +161 -0
  197. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -0
  198. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
  199. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
  200. package/dist/planmagnet/pages/TeamTeamPagePage.js +203 -0
  201. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -0
  202. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
  203. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
  204. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +97 -0
  205. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -0
  206. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
  207. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
  208. package/dist/planmagnet/providers/PlanMagnetProvider.js +119 -0
  209. package/dist/planmagnet/providers/PlanMagnetProvider.js.map +1 -0
  210. package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
  211. package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
  212. package/dist/planmagnet/store/planmagnetStore.js +42 -0
  213. package/dist/planmagnet/store/planmagnetStore.js.map +1 -0
  214. package/dist/planmagnet/types/index.d.ts +317 -0
  215. package/dist/planmagnet/types/index.d.ts.map +1 -0
  216. package/dist/planmagnet/utils/cn.d.ts +4 -0
  217. package/dist/planmagnet/utils/cn.d.ts.map +1 -0
  218. package/dist/planmagnet/utils/navigation.d.ts +2 -0
  219. package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
  220. package/dist/planmagnet/utils/navigation.js +8 -0
  221. package/dist/planmagnet/utils/navigation.js.map +1 -0
  222. package/package.json +107 -0
@@ -0,0 +1,312 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { BarChart3 as t, FolderKanban as n, Target as r, TrendingUp as i, Zap as a } from "lucide-react";
3
+ import { gql as o } from "@apollo/client";
4
+ import { useQuery as s } from "@apollo/client/react";
5
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { Badge as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
8
+ //#region src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx
9
+ var g = o`
10
+ query GetAnalyticsData(
11
+ $workspaceId: ID!
12
+ $projectPagination: PaginationInput
13
+ $workItemPagination: PaginationInput
14
+ $sprintPagination: PaginationInput
15
+ $milestonePagination: PaginationInput
16
+ ) {
17
+ planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {
18
+ items {
19
+ id
20
+ name
21
+ key
22
+ status
23
+ startDate
24
+ endDate
25
+ tags
26
+ }
27
+ totalCount
28
+ }
29
+ planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {
30
+ items {
31
+ id
32
+ status
33
+ priority
34
+ storyPoints
35
+ assigneeId
36
+ }
37
+ totalCount
38
+ }
39
+ planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {
40
+ items {
41
+ id
42
+ name
43
+ status
44
+ velocity
45
+ capacity
46
+ startDate
47
+ endDate
48
+ }
49
+ totalCount
50
+ }
51
+ planmagnetMilestones(workspaceId: $workspaceId, pagination: $milestonePagination) {
52
+ items {
53
+ id
54
+ name
55
+ status
56
+ dueDate
57
+ }
58
+ totalCount
59
+ }
60
+ }
61
+ `;
62
+ function _() {
63
+ let { workspaceId: o } = e(), { t: _ } = u(), { data: v, loading: y, error: b } = s(g, {
64
+ variables: {
65
+ workspaceId: o,
66
+ projectPagination: { first: 100 },
67
+ workItemPagination: { first: 500 },
68
+ sprintPagination: { first: 100 },
69
+ milestonePagination: { first: 100 }
70
+ },
71
+ skip: !o
72
+ });
73
+ if (y) return /* @__PURE__ */ c("div", {
74
+ className: "flex items-center justify-center p-12",
75
+ children: /* @__PURE__ */ c("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
76
+ });
77
+ if (b) return /* @__PURE__ */ l("div", {
78
+ className: "p-6 text-red-500",
79
+ children: [
80
+ _("planmagnet.analytics.errorLoading", "Error loading analytics"),
81
+ ": ",
82
+ b.message
83
+ ]
84
+ });
85
+ let x = v?.planmagnetProjects?.items ?? [], S = v?.planmagnetWorkItems?.items ?? [], C = v?.planmagnetSprints?.items ?? [], w = v?.planmagnetMilestones?.items ?? [], T = S.length, E = S.filter((e) => e.status === "DONE").length, D = S.filter((e) => e.status === "BLOCKED").length, O = S.reduce((e, t) => e + (t.storyPoints ?? 0), 0), k = S.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0), A = C.filter((e) => e.velocity != null && e.velocity > 0), j = A.length > 0 ? Math.round(A.reduce((e, t) => e + (t.velocity ?? 0), 0) / A.length) : 0, M = C.filter((e) => e.status === "ACTIVE").length, N = w.filter((e) => e.status === "AT_RISK" || e.status === "OVERDUE").length, P = x.filter((e) => e.status === "ACTIVE").length, F = T > 0 ? Math.round(E / T * 100) : 0, I = A.slice(-6).map((e) => ({
86
+ label: e.name,
87
+ pts: e.velocity ?? 0
88
+ })), L = I.length > 0 ? Math.max(...I.map((e) => e.pts)) : 1, R = S.reduce((e, t) => (e[t.status] = (e[t.status] || 0) + 1, e), {}), z = {
89
+ BACKLOG: "bg-gray-400",
90
+ TODO: "bg-blue-400",
91
+ IN_PROGRESS: "bg-yellow-400",
92
+ IN_REVIEW: "bg-purple-400",
93
+ DONE: "bg-green-400",
94
+ BLOCKED: "bg-red-400"
95
+ }, B = [
96
+ {
97
+ label: _("planmagnet.analytics.metrics.totalWorkItems.label", "Total Work Items"),
98
+ value: String(T),
99
+ trend: `${F}% ${_("planmagnet.analytics.metrics.totalWorkItems.trend", "completed")}`
100
+ },
101
+ {
102
+ label: _("planmagnet.analytics.metrics.storyPoints.label", "Story Points"),
103
+ value: String(O),
104
+ trend: `${k} ${_("planmagnet.analytics.metrics.storyPoints.trend", "completed")}`
105
+ },
106
+ {
107
+ label: _("planmagnet.analytics.metrics.activeProjects.label", "Active Projects"),
108
+ value: String(P),
109
+ trend: `${x.length} ${_("planmagnet.analytics.metrics.activeProjects.trend", "total")}`
110
+ },
111
+ {
112
+ label: _("planmagnet.analytics.metrics.blockedItems.label", "Blocked Items"),
113
+ value: String(D),
114
+ trend: D > 0 ? _("planmagnet.analytics.metrics.blockedItems.attention", "Needs attention") : _("planmagnet.analytics.metrics.blockedItems.clear", "All clear")
115
+ }
116
+ ];
117
+ return /* @__PURE__ */ l("div", {
118
+ className: "space-y-6 p-6",
119
+ children: [
120
+ /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
121
+ className: "text-2xl font-semibold",
122
+ children: _("planmagnet.analytics.title", "Analytics Dashboard")
123
+ }), /* @__PURE__ */ c("p", {
124
+ className: "text-sm text-muted-foreground",
125
+ children: _("planmagnet.analytics.subtitle", "Overview of project health and team performance")
126
+ })] }),
127
+ /* @__PURE__ */ c("div", {
128
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
129
+ children: B.map((e) => /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
130
+ className: "pt-4",
131
+ children: [
132
+ /* @__PURE__ */ c("p", {
133
+ className: "text-xs text-muted-foreground",
134
+ children: e.label
135
+ }),
136
+ /* @__PURE__ */ c("p", {
137
+ className: "text-xl font-bold mt-1",
138
+ children: e.value
139
+ }),
140
+ /* @__PURE__ */ c("p", {
141
+ className: "text-xs text-green-600 mt-1",
142
+ children: e.trend
143
+ })
144
+ ]
145
+ }) }, e.label))
146
+ }),
147
+ /* @__PURE__ */ l("div", {
148
+ className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
149
+ children: [/* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
150
+ className: "flex items-center gap-2",
151
+ children: [
152
+ /* @__PURE__ */ c(t, { className: "h-4 w-4" }),
153
+ _("planmagnet.analytics.velocity.title", "Sprint Velocity"),
154
+ " (",
155
+ I.length,
156
+ " ",
157
+ _("planmagnet.analytics.velocity.sprints", "Sprints"),
158
+ ")"
159
+ ]
160
+ }) }), /* @__PURE__ */ c(p, { children: I.length > 0 ? /* @__PURE__ */ c("div", {
161
+ className: "flex items-end gap-2 h-40",
162
+ children: I.map((e) => /* @__PURE__ */ l("div", {
163
+ className: "flex-1 flex flex-col items-center gap-1",
164
+ children: [
165
+ /* @__PURE__ */ c("div", {
166
+ className: "w-full flex justify-center",
167
+ children: /* @__PURE__ */ c("div", {
168
+ className: "w-6 bg-primary rounded-t",
169
+ style: { height: `${e.pts / L * 130}px` }
170
+ })
171
+ }),
172
+ /* @__PURE__ */ c("span", {
173
+ className: "text-xs text-muted-foreground truncate max-w-full",
174
+ children: e.label
175
+ }),
176
+ /* @__PURE__ */ c("span", {
177
+ className: "text-[10px] font-medium",
178
+ children: e.pts
179
+ })
180
+ ]
181
+ }, e.label))
182
+ }) : /* @__PURE__ */ c("p", {
183
+ className: "text-sm text-muted-foreground py-8 text-center",
184
+ children: _("planmagnet.analytics.velocity.empty", "No sprint velocity data available yet")
185
+ }) })] }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ c(h, { children: _("planmagnet.analytics.taskDistribution.title", "Task Distribution") }) }), /* @__PURE__ */ l(p, {
186
+ className: "space-y-3",
187
+ children: [Object.entries(R).map(([e, t]) => {
188
+ let n = T > 0 ? Math.round(t / T * 100) : 0;
189
+ return /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
190
+ className: "flex justify-between text-sm mb-1",
191
+ children: [/* @__PURE__ */ c("span", {
192
+ className: "capitalize",
193
+ children: e.toLowerCase().replace("_", " ")
194
+ }), /* @__PURE__ */ l("span", {
195
+ className: "font-medium",
196
+ children: [
197
+ t,
198
+ " (",
199
+ n,
200
+ "%)"
201
+ ]
202
+ })]
203
+ }), /* @__PURE__ */ c("div", {
204
+ className: "w-full h-2 rounded-full bg-muted overflow-hidden",
205
+ children: /* @__PURE__ */ c("div", {
206
+ className: `h-full rounded-full ${z[e] ?? "bg-gray-300"}`,
207
+ style: { width: `${n}%` }
208
+ })
209
+ })] }, e);
210
+ }), Object.keys(R).length === 0 && /* @__PURE__ */ c("p", {
211
+ className: "text-sm text-muted-foreground py-4 text-center",
212
+ children: _("planmagnet.analytics.taskDistribution.empty", "No work items found")
213
+ })]
214
+ })] })]
215
+ }),
216
+ /* @__PURE__ */ l("div", {
217
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
218
+ children: [
219
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
220
+ className: "pt-4",
221
+ children: [/* @__PURE__ */ l("div", {
222
+ className: "flex items-center gap-2 text-muted-foreground text-xs",
223
+ children: [/* @__PURE__ */ c(n, { className: "h-4 w-4" }), _("planmagnet.analytics.summary.activeProjects", "Active Projects")]
224
+ }), /* @__PURE__ */ c("p", {
225
+ className: "text-xl font-bold mt-1",
226
+ children: P
227
+ })]
228
+ }) }),
229
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
230
+ className: "pt-4",
231
+ children: [/* @__PURE__ */ l("div", {
232
+ className: "flex items-center gap-2 text-muted-foreground text-xs",
233
+ children: [/* @__PURE__ */ c(a, { className: "h-4 w-4" }), _("planmagnet.analytics.summary.activeSprints", "Active Sprints")]
234
+ }), /* @__PURE__ */ c("p", {
235
+ className: "text-xl font-bold mt-1",
236
+ children: M
237
+ })]
238
+ }) }),
239
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
240
+ className: "pt-4",
241
+ children: [/* @__PURE__ */ l("div", {
242
+ className: "flex items-center gap-2 text-muted-foreground text-xs",
243
+ children: [/* @__PURE__ */ c(i, { className: "h-4 w-4" }), _("planmagnet.analytics.summary.avgVelocity", "Avg Velocity")]
244
+ }), /* @__PURE__ */ l("p", {
245
+ className: "text-xl font-bold mt-1",
246
+ children: [
247
+ j,
248
+ " ",
249
+ _("planmagnet.analytics.summary.pointsShort", "pts")
250
+ ]
251
+ })]
252
+ }) }),
253
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
254
+ className: "pt-4",
255
+ children: [/* @__PURE__ */ l("div", {
256
+ className: "flex items-center gap-2 text-muted-foreground text-xs",
257
+ children: [/* @__PURE__ */ c(r, { className: "h-4 w-4" }), _("planmagnet.analytics.summary.atRisk", "At Risk")]
258
+ }), /* @__PURE__ */ l("p", {
259
+ className: "text-xl font-bold mt-1",
260
+ children: [
261
+ N,
262
+ " ",
263
+ _("planmagnet.analytics.summary.milestones", "milestones")
264
+ ]
265
+ })]
266
+ }) })
267
+ ]
268
+ }),
269
+ /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ c(h, { children: _("planmagnet.analytics.projectHealth.title", "Project Health") }) }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ l("div", {
270
+ className: "space-y-3",
271
+ children: [x.filter((e) => e.status === "ACTIVE").map((e) => {
272
+ let t = S.filter((e) => e.assigneeId != null), n = t.filter((e) => e.status === "DONE").length, r = t.length > 0 ? Math.round(n / t.length * 100) : 0, i = e.endDate && new Date(e.endDate) < /* @__PURE__ */ new Date() && r < 100 ? "at_risk" : r >= 75 ? "on_track" : "in_progress";
273
+ return /* @__PURE__ */ l("div", {
274
+ className: "flex items-center gap-4",
275
+ children: [
276
+ /* @__PURE__ */ c("span", {
277
+ className: "text-sm font-medium w-40 truncate",
278
+ children: e.name
279
+ }),
280
+ /* @__PURE__ */ c("div", {
281
+ className: "flex-1",
282
+ children: /* @__PURE__ */ c("div", {
283
+ className: "w-full h-2 rounded-full bg-muted overflow-hidden",
284
+ children: /* @__PURE__ */ c("div", {
285
+ className: `h-full rounded-full ${i === "at_risk" ? "bg-orange-400" : i === "on_track" ? "bg-green-400" : "bg-blue-400"}`,
286
+ style: { width: `${r}%` }
287
+ })
288
+ })
289
+ }),
290
+ /* @__PURE__ */ l("span", {
291
+ className: "text-sm w-12 text-right",
292
+ children: [r, "%"]
293
+ }),
294
+ /* @__PURE__ */ c(d, {
295
+ variant: "outline",
296
+ className: "capitalize text-xs w-20 justify-center",
297
+ children: i.replace("_", " ")
298
+ })
299
+ ]
300
+ }, e.id);
301
+ }), x.filter((e) => e.status === "ACTIVE").length === 0 && /* @__PURE__ */ c("p", {
302
+ className: "text-sm text-muted-foreground text-center py-4",
303
+ children: _("planmagnet.analytics.projectHealth.empty", "No active projects found")
304
+ })]
305
+ }) })] })
306
+ ]
307
+ });
308
+ }
309
+ //#endregion
310
+ export { _ as AnalyticsAnalyticsPagePage };
311
+
312
+ //# sourceMappingURL=AnalyticsAnalyticsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAnalyticsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { TrendingUp, Zap, FolderKanban, BarChart3, Target } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_ANALYTICS_DATA = gql`\n query GetAnalyticsData(\n $workspaceId: ID!\n $projectPagination: PaginationInput\n $workItemPagination: PaginationInput\n $sprintPagination: PaginationInput\n $milestonePagination: PaginationInput\n ) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {\n items {\n id\n name\n key\n status\n startDate\n endDate\n tags\n }\n totalCount\n }\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: $workItemPagination) {\n items {\n id\n status\n priority\n storyPoints\n assigneeId\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: $sprintPagination) {\n items {\n id\n name\n status\n velocity\n capacity\n startDate\n endDate\n }\n totalCount\n }\n planmagnetMilestones(workspaceId: $workspaceId, pagination: $milestonePagination) {\n items {\n id\n name\n status\n dueDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n}\n\ninterface WorkItemNode {\n id: string;\n status: string;\n priority: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n status: string;\n velocity: number | null;\n capacity: number | null;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface MilestoneNode {\n id: string;\n name: string;\n status: string;\n dueDate: string | null;\n}\n\ninterface AnalyticsData {\n projects: { items: ProjectNode[]; totalCount: number };\n workItems: { items: WorkItemNode[]; totalCount: number };\n sprints: { items: SprintNode[]; totalCount: number };\n milestones: { items: MilestoneNode[]; totalCount: number };\n}\n\nexport function AnalyticsAnalyticsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const { t } = useI18n();\n\n const { data, loading, error } = useQuery<AnalyticsData>(GET_ANALYTICS_DATA, {\n variables: {\n workspaceId,\n projectPagination: { first: 100 },\n workItemPagination: { first: 500 },\n sprintPagination: { first: 100 },\n milestonePagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"p-6 text-red-500\">\n {t('planmagnet.analytics.errorLoading', 'Error loading analytics')}: {error.message}\n </div>\n );\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const milestones = data?.planmagnetMilestones?.items ?? [];\n\n const totalTasks = tasks.length;\n const doneTasks = tasks.filter((t) => t.status === 'DONE').length;\n const blockedTasks = tasks.filter((t) => t.status === 'BLOCKED').length;\n const totalPoints = tasks.reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n const completedPoints = tasks\n .filter((t) => t.status === 'DONE')\n .reduce((s, t) => s + (t.storyPoints ?? 0), 0);\n\n const sprintsWithVelocity = sprints.filter((s) => s.velocity != null && s.velocity > 0);\n const avgVelocity =\n sprintsWithVelocity.length > 0\n ? Math.round(\n sprintsWithVelocity.reduce((s, sp) => s + (sp.velocity ?? 0), 0) /\n sprintsWithVelocity.length\n )\n : 0;\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE').length;\n const atRiskMs = milestones.filter(\n (m) => m.status === 'AT_RISK' || m.status === 'OVERDUE'\n ).length;\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE').length;\n\n const completionRate = totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;\n\n const velocityBySprintData = sprintsWithVelocity.slice(-6).map((sp) => ({\n label: sp.name,\n pts: sp.velocity ?? 0,\n }));\n const maxPts =\n velocityBySprintData.length > 0 ? Math.max(...velocityBySprintData.map((d) => d.pts)) : 1;\n\n const tasksByStatus = tasks.reduce(\n (acc, t) => {\n acc[t.status] = (acc[t.status] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n const statusColors: Record<string, string> = {\n BACKLOG: 'bg-gray-400',\n TODO: 'bg-blue-400',\n IN_PROGRESS: 'bg-yellow-400',\n IN_REVIEW: 'bg-purple-400',\n DONE: 'bg-green-400',\n BLOCKED: 'bg-red-400',\n };\n\n const metrics = [\n {\n label: t('planmagnet.analytics.metrics.totalWorkItems.label', 'Total Work Items'),\n value: String(totalTasks),\n trend: `${completionRate}% ${t('planmagnet.analytics.metrics.totalWorkItems.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.storyPoints.label', 'Story Points'),\n value: String(totalPoints),\n trend: `${completedPoints} ${t('planmagnet.analytics.metrics.storyPoints.trend', 'completed')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.activeProjects.label', 'Active Projects'),\n value: String(activeProjects),\n trend: `${projects.length} ${t('planmagnet.analytics.metrics.activeProjects.trend', 'total')}`,\n },\n {\n label: t('planmagnet.analytics.metrics.blockedItems.label', 'Blocked Items'),\n value: String(blockedTasks),\n trend:\n blockedTasks > 0\n ? t('planmagnet.analytics.metrics.blockedItems.attention', 'Needs attention')\n : t('planmagnet.analytics.metrics.blockedItems.clear', 'All clear'),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {t('planmagnet.analytics.title', 'Analytics Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.analytics.subtitle', 'Overview of project health and team performance')}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {metrics.map((m) => (\n <Card key={m.label}>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">{m.label}</p>\n <p className=\"text-xl font-bold mt-1\">{m.value}</p>\n <p className=\"text-xs text-green-600 mt-1\">{m.trend}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4\" />\n {t('planmagnet.analytics.velocity.title', 'Sprint Velocity')} (\n {velocityBySprintData.length} {t('planmagnet.analytics.velocity.sprints', 'Sprints')})\n </CardTitle>\n </CardHeader>\n <CardContent>\n {velocityBySprintData.length > 0 ? (\n <div className=\"flex items-end gap-2 h-40\">\n {velocityBySprintData.map((d) => (\n <div key={d.label} className=\"flex-1 flex flex-col items-center gap-1\">\n <div className=\"w-full flex justify-center\">\n <div\n className=\"w-6 bg-primary rounded-t\"\n style={{ height: `${(d.pts / maxPts) * 130}px` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground truncate max-w-full\">\n {d.label}\n </span>\n <span className=\"text-[10px] font-medium\">{d.pts}</span>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground py-8 text-center\">\n {t('planmagnet.analytics.velocity.empty', 'No sprint velocity data available yet')}\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {t('planmagnet.analytics.taskDistribution.title', 'Task Distribution')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(tasksByStatus).map(([status, count]) => {\n const pct = totalTasks > 0 ? Math.round((count / totalTasks) * 100) : 0;\n return (\n <div key={status}>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"capitalize\">{status.toLowerCase().replace('_', ' ')}</span>\n <span className=\"font-medium\">\n {count} ({pct}%)\n </span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${statusColors[status] ?? 'bg-gray-300'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n {Object.keys(tasksByStatus).length === 0 && (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">\n {t('planmagnet.analytics.taskDistribution.empty', 'No work items found')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <FolderKanban className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeProjects', 'Active Projects')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeProjects}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Zap className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.activeSprints', 'Active Sprints')}\n </div>\n <p className=\"text-xl font-bold mt-1\">{activeSprints}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <TrendingUp className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.avgVelocity', 'Avg Velocity')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {avgVelocity} {t('planmagnet.analytics.summary.pointsShort', 'pts')}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Target className=\"h-4 w-4\" />\n {t('planmagnet.analytics.summary.atRisk', 'At Risk')}\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {atRiskMs} {t('planmagnet.analytics.summary.milestones', 'milestones')}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>{t('planmagnet.analytics.projectHealth.title', 'Project Health')}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {projects\n .filter((p) => p.status === 'ACTIVE')\n .map((p) => {\n const projectTasks = tasks.filter((t) => t.assigneeId != null);\n const projectDone = projectTasks.filter((t) => t.status === 'DONE').length;\n const progress =\n projectTasks.length > 0\n ? Math.round((projectDone / projectTasks.length) * 100)\n : 0;\n const hasOverdue = p.endDate && new Date(p.endDate) < new Date() && progress < 100;\n const health = hasOverdue ? 'at_risk' : progress >= 75 ? 'on_track' : 'in_progress';\n return (\n <div key={p.id} className=\"flex items-center gap-4\">\n <span className=\"text-sm font-medium w-40 truncate\">{p.name}</span>\n <div className=\"flex-1\">\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${health === 'at_risk' ? 'bg-orange-400' : health === 'on_track' ? 'bg-green-400' : 'bg-blue-400'}`}\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <span className=\"text-sm w-12 text-right\">{progress}%</span>\n <Badge variant=\"outline\" className=\"capitalize text-xs w-20 justify-center\">\n {health.replace('_', ' ')}\n </Badge>\n </div>\n );\n })}\n {projects.filter((p) => p.status === 'ACTIVE').length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.analytics.projectHealth.empty', 'No active projects found')}\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AASA,IAAM,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgG9B,SAAgB,IAA6B;CAC3C,IAAM,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,GAAS,EAEjB,EAAE,SAAM,YAAS,aAAU,EAAwB,GAAoB;EAC3E,WAAW;GACT;GACA,mBAAmB,EAAE,OAAO,KAAK;GACjC,oBAAoB,EAAE,OAAO,KAAK;GAClC,kBAAkB,EAAE,OAAO,KAAK;GAChC,qBAAqB,EAAE,OAAO,KAAK;GACpC;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACG,EAAE,qCAAqC,0BAA0B;GAAC;GAAG,EAAM;GACxE;;CAIV,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAChD,IAAQ,GAAM,qBAAqB,SAAS,EAAE,EAC9C,IAAU,GAAM,mBAAmB,SAAS,EAAE,EAC9C,IAAa,GAAM,sBAAsB,SAAS,EAAE,EAEpD,IAAa,EAAM,QACnB,IAAY,EAAM,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC,QACrD,IAAe,EAAM,QAAQ,MAAM,EAAE,WAAW,UAAU,CAAC,QAC3D,IAAc,EAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,eAAe,IAAI,EAAE,EACjE,IAAkB,EACrB,QAAQ,MAAM,EAAE,WAAW,OAAO,CAClC,QAAQ,GAAG,MAAM,KAAK,EAAE,eAAe,IAAI,EAAE,EAE1C,IAAsB,EAAQ,QAAQ,MAAM,EAAE,YAAY,QAAQ,EAAE,WAAW,EAAE,EACjF,IACJ,EAAoB,SAAS,IACzB,KAAK,MACH,EAAoB,QAAQ,GAAG,MAAO,KAAK,EAAG,YAAY,IAAI,EAAE,GAC9D,EAAoB,OACvB,GACD,GACA,IAAgB,EAAQ,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QAC7D,IAAW,EAAW,QACzB,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,UAC/C,CAAC,QACI,IAAiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QAE/D,IAAiB,IAAa,IAAI,KAAK,MAAO,IAAY,IAAc,IAAI,GAAG,GAE/E,IAAuB,EAAoB,MAAM,GAAG,CAAC,KAAK,OAAQ;EACtE,OAAO,EAAG;EACV,KAAK,EAAG,YAAY;EACrB,EAAE,EACG,IACJ,EAAqB,SAAS,IAAI,KAAK,IAAI,GAAG,EAAqB,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,GAEpF,IAAgB,EAAM,QACzB,GAAK,OACJ,EAAI,EAAE,WAAW,EAAI,EAAE,WAAW,KAAK,GAChC,IAET,EAAE,CACH,EACK,IAAuC;EAC3C,SAAS;EACT,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,SAAS;EACV,EAEK,IAAU;EACd;GACE,OAAO,EAAE,qDAAqD,mBAAmB;GACjF,OAAO,OAAO,EAAW;GACzB,OAAO,GAAG,EAAe,IAAI,EAAE,qDAAqD,YAAY;GACjG;EACD;GACE,OAAO,EAAE,kDAAkD,eAAe;GAC1E,OAAO,OAAO,EAAY;GAC1B,OAAO,GAAG,EAAgB,GAAG,EAAE,kDAAkD,YAAY;GAC9F;EACD;GACE,OAAO,EAAE,qDAAqD,kBAAkB;GAChF,OAAO,OAAO,EAAe;GAC7B,OAAO,GAAG,EAAS,OAAO,GAAG,EAAE,qDAAqD,QAAQ;GAC7F;EACD;GACE,OAAO,EAAE,mDAAmD,gBAAgB;GAC5E,OAAO,OAAO,EAAa;GAC3B,OACE,IAAe,IACX,EAAE,uDAAuD,kBAAkB,GAC3E,EAAE,mDAAmD,YAAY;GACxE;EACF;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,8BAA8B,sBAAsB;IACpD,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,EAAE,iCAAiC,kDAAkD;IACpF,CAAA,CACA,EAAA,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,KAAK,MACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eAAvB;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAE;OAAU,CAAA;MAC1D,kBAAC,KAAD;OAAG,WAAU;iBAA0B,EAAE;OAAU,CAAA;MACnD,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAE;OAAU,CAAA;MAC5C;QACT,EANI,EAAE,MAMN,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAW,WAAU;eAArB;MACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MAChC,EAAE,uCAAuC,kBAAkB;MAAC;MAC5D,EAAqB;MAAO;MAAE,EAAE,yCAAyC,UAAU;MAAC;MAC3E;QACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAqB,SAAS,IAC7B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAqB,KAAK,MACzB,kBAAC,OAAD;MAAmB,WAAU;gBAA7B;OACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,QAAQ,GAAI,EAAE,MAAM,IAAU,IAAI,KAAK;SAChD,CAAA;QACE,CAAA;OACN,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA;OACP,kBAAC,QAAD;QAAM,WAAU;kBAA2B,EAAE;QAAW,CAAA;OACpD;QAXI,EAAE,MAWN,CACN;KACE,CAAA,GAEN,kBAAC,KAAD;KAAG,WAAU;eACV,EAAE,uCAAuC,wCAAwC;KAChF,CAAA,EAEM,CAAA,CACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAE,+CAA+C,oBAAoB,EAC5D,CAAA,EACD,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACG,OAAO,QAAQ,EAAc,CAAC,KAAK,CAAC,GAAQ,OAAW;MACtD,IAAM,IAAM,IAAa,IAAI,KAAK,MAAO,IAAQ,IAAc,IAAI,GAAG;AACtE,aACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAc,EAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;QAAQ,CAAA,EAC5E,kBAAC,QAAD;QAAM,WAAU;kBAAhB;SACG;SAAM;SAAG;SAAI;SACT;UACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,OAAD;QACE,WAAW,uBAAuB,EAAa,MAAW;QAC1D,OAAO,EAAE,OAAO,GAAG,EAAI,IAAI;QAC3B,CAAA;OACE,CAAA,CACF,EAAA,EAbI,EAaJ;OAER,EACD,OAAO,KAAK,EAAc,CAAC,WAAW,KACrC,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAE,+CAA+C,sBAAsB;MACtE,CAAA,CAEM;OACT,EAAA,CAAA,CACH;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EACnC,EAAE,+CAA+C,kBAAkB,CAChE;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA0B;OAAmB,CAAA,CAC9C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA,EAC1B,EAAE,8CAA8C,iBAAiB,CAC9D;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA0B;OAAkB,CAAA,CAC7C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EACjC,EAAE,4CAA4C,eAAe,CAC1D;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG;QAAY;QAAE,EAAE,4CAA4C,MAAM;QACjE;SACQ;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAC7B,EAAE,uCAAuC,UAAU,CAChD;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG;QAAS;QAAE,EAAE,2CAA2C,aAAa;QACpE;SACQ;SACT,CAAA;KACH;;GAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAY,EAAE,4CAA4C,iBAAiB,EAAa,CAAA,EAC7E,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EACE,QAAQ,MAAM,EAAE,WAAW,SAAS,CACpC,KAAK,MAAM;KACV,IAAM,IAAe,EAAM,QAAQ,MAAM,EAAE,cAAc,KAAK,EACxD,IAAc,EAAa,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC,QAC9D,IACJ,EAAa,SAAS,IAClB,KAAK,MAAO,IAAc,EAAa,SAAU,IAAI,GACrD,GAEA,IADa,EAAE,WAAW,IAAI,KAAK,EAAE,QAAQ,mBAAG,IAAI,MAAM,IAAI,IAAW,MACnD,YAAY,KAAY,KAAK,aAAa;AACtE,YACE,kBAAC,OAAD;MAAgB,WAAU;gBAA1B;OACE,kBAAC,QAAD;QAAM,WAAU;kBAAqC,EAAE;QAAY,CAAA;OACnE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,WAAW,uBAAuB,MAAW,YAAY,kBAAkB,MAAW,aAAa,iBAAiB;UACpH,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;UAChC,CAAA;SACE,CAAA;QACF,CAAA;OACN,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAA2C,GAAS,IAAQ;;OAC5D,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAO,QAAQ,KAAK,IAAI;QACnB,CAAA;OACJ;QAdI,EAAE,GAcN;MAER,EACH,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,WAAW,KACxD,kBAAC,KAAD;KAAG,WAAU;eACV,EAAE,4CAA4C,2BAA2B;KACxE,CAAA,CAEF;OACM,CAAA,CACT,EAAA,CAAA;GACH"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationCollaborationPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationCollaborationPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCollaborationPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,kCAAkC,4CAsFjD"}
@@ -0,0 +1,110 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { Hash as n, Plus as r } from "lucide-react";
3
+ import { gql as i } from "@apollo/client";
4
+ import { useQuery as a } from "@apollo/client/react";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { Button as c, Card as l, CardContent as u } from "@burdenoff/fe-libs/ui";
7
+ //#region src/planmagnet/pages/CollaborationCollaborationPagePage.tsx
8
+ var d = i`
9
+ query GetProjectsForChannels($workspaceId: ID!, $pagination: PaginationInput) {
10
+ planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
11
+ items {
12
+ id
13
+ name
14
+ key
15
+ status
16
+ tags
17
+ startDate
18
+ }
19
+ totalCount
20
+ }
21
+ }
22
+ `;
23
+ function f() {
24
+ let { workspaceId: i } = e(), f = t(), { data: p, loading: m, error: h } = a(d, {
25
+ variables: {
26
+ workspaceId: i,
27
+ pagination: { first: 100 }
28
+ },
29
+ skip: !i
30
+ });
31
+ if (m) return /* @__PURE__ */ o("div", {
32
+ className: "flex items-center justify-center p-12",
33
+ children: /* @__PURE__ */ o("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
34
+ });
35
+ if (h) return /* @__PURE__ */ s("div", {
36
+ className: "p-6 text-red-500",
37
+ children: ["Error: ", h.message]
38
+ });
39
+ let g = p?.planmagnetProjects?.items ?? [], _ = g.filter((e) => e.status === "ACTIVE").map((e) => ({
40
+ id: e.id,
41
+ name: e.name,
42
+ description: `Discussion channel for ${e.key}`,
43
+ type: "public",
44
+ membersCount: 0,
45
+ key: e.key,
46
+ status: e.status
47
+ })), v = _.length;
48
+ return /* @__PURE__ */ s("div", {
49
+ className: "space-y-6 p-6",
50
+ children: [/* @__PURE__ */ s("div", {
51
+ className: "flex items-center justify-between",
52
+ children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
53
+ className: "text-2xl font-semibold",
54
+ children: "Collaboration"
55
+ }), /* @__PURE__ */ s("p", {
56
+ className: "text-sm text-muted-foreground",
57
+ children: [
58
+ v,
59
+ " project channels · ",
60
+ g.length,
61
+ " total projects"
62
+ ]
63
+ })] }), /* @__PURE__ */ s(c, {
64
+ size: "sm",
65
+ onClick: () => f("/collaboration/create-channel"),
66
+ children: [/* @__PURE__ */ o(r, { className: "mr-1 h-4 w-4" }), "New Channel"]
67
+ })]
68
+ }), /* @__PURE__ */ s("div", {
69
+ className: "space-y-3",
70
+ children: [_.map((e) => /* @__PURE__ */ o(l, {
71
+ className: "hover:bg-muted/30 cursor-pointer transition-colors",
72
+ children: /* @__PURE__ */ s(u, {
73
+ className: "py-3 flex items-center justify-between",
74
+ children: [/* @__PURE__ */ s("div", {
75
+ className: "flex items-center gap-3",
76
+ children: [/* @__PURE__ */ o(n, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("div", {
77
+ className: "flex items-center gap-2",
78
+ children: [/* @__PURE__ */ o("span", {
79
+ className: "text-sm font-medium",
80
+ children: e.name
81
+ }), /* @__PURE__ */ o("span", {
82
+ className: "text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700",
83
+ children: e.key
84
+ })]
85
+ }), /* @__PURE__ */ o("p", {
86
+ className: "text-xs text-muted-foreground",
87
+ children: e.description
88
+ })] })]
89
+ }), /* @__PURE__ */ o("div", {
90
+ className: "flex items-center gap-4 text-xs text-muted-foreground",
91
+ children: /* @__PURE__ */ o("span", {
92
+ className: "capitalize",
93
+ children: e.status.toLowerCase()
94
+ })
95
+ })]
96
+ })
97
+ }, e.id)), _.length === 0 && /* @__PURE__ */ s("div", {
98
+ className: "text-center py-12",
99
+ children: [/* @__PURE__ */ o(n, { className: "h-12 w-12 text-muted-foreground mx-auto mb-3" }), /* @__PURE__ */ o("p", {
100
+ className: "text-sm text-muted-foreground",
101
+ children: "No active projects found. Create a project to start collaborating."
102
+ })]
103
+ })]
104
+ })]
105
+ });
106
+ }
107
+ //#endregion
108
+ export { f as CollaborationCollaborationPagePage };
109
+
110
+ //# sourceMappingURL=CollaborationCollaborationPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCollaborationPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, Button } from '@burdenoff/fe-libs/ui';\nimport { Plus, Hash, Lock, Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_CHANNELS = gql`\n query GetProjectsForChannels($workspaceId: ID!, $pagination: PaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n tags\n startDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n tags: string[];\n startDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationCollaborationPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_CHANNELS, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE');\n\n const channels = activeProjects.map((project) => ({\n id: project.id,\n name: project.name,\n description: `Discussion channel for ${project.key}`,\n type: 'public' as const,\n membersCount: 0,\n key: project.key,\n status: project.status,\n }));\n\n const totalChannels = channels.length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Collaboration</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalChannels} project channels &middot; {projects.length} total projects\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/collaboration/create-channel')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Channel\n </Button>\n </div>\n <div className=\"space-y-3\">\n {channels.map((ch) => (\n <Card key={ch.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{ch.name}</span>\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700\">\n {ch.key}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">{ch.description}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{ch.status.toLowerCase()}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n {channels.length === 0 && (\n <div className=\"text-center py-12\">\n <Hash className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No active projects found. Create a project to start collaborating.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AASA,IAAM,IAA4B,CAAG;;;;;;;;;;;;;;;AA6BrC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA2B;EACjF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAGhD,IAFiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAEpC,KAAK,OAAa;EAChD,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,aAAa,0BAA0B,EAAQ;EAC/C,MAAM;EACN,cAAc;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EACjB,EAAE,EAEG,IAAgB,EAAS;AAE/B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAkB,CAAA,EACzD,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG;KAAc;KAA4B,EAAS;KAAO;KACzD;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,eAAe,EAAS,gCAAgC;cAA1E,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,cAE1B;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAS,KAAK,MACb,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,iCAAkC,CAAA,EAClD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAG;QAAY,CAAA,EACtD,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG;QACC,CAAA,CACH;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAG;OAAgB,CAAA,CAC7D,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,QAAD;OAAM,WAAU;iBAAc,EAAG,OAAO,aAAa;OAAQ,CAAA;MACzD,CAAA,CACM;;IACT,EAlBI,EAAG,GAkBP,CACP,EACD,EAAS,WAAW,KACnB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationCreateChannelPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationCreateChannelPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCreateChannelPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,kCAAkC,4CA8EjD"}
@@ -0,0 +1,96 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { useState as t } from "react";
3
+ import { Hash as n, Save as r, X as i } from "lucide-react";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, Input as f } from "@burdenoff/fe-libs/ui";
6
+ //#region src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx
7
+ function p() {
8
+ let [p, m] = t({
9
+ name: "",
10
+ description: "",
11
+ type: "public"
12
+ }), h = e();
13
+ return /* @__PURE__ */ o("div", {
14
+ className: "space-y-6 p-6 max-w-4xl",
15
+ children: [/* @__PURE__ */ o("div", {
16
+ className: "flex items-center justify-between",
17
+ children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
18
+ className: "text-2xl font-semibold",
19
+ children: "Create Channel"
20
+ }), /* @__PURE__ */ a("p", {
21
+ className: "text-sm text-muted-foreground",
22
+ children: "Set up a new communication channel for your team."
23
+ })] }), /* @__PURE__ */ o("div", {
24
+ className: "flex gap-2",
25
+ children: [/* @__PURE__ */ o(s, {
26
+ variant: "outline",
27
+ size: "sm",
28
+ onClick: () => h("/collaboration"),
29
+ children: [/* @__PURE__ */ a(i, { className: "mr-1 h-4 w-4" }), "Cancel"]
30
+ }), /* @__PURE__ */ o(s, {
31
+ size: "sm",
32
+ onClick: () => {
33
+ p.name.trim() && h("/collaboration");
34
+ },
35
+ children: [/* @__PURE__ */ a(r, { className: "mr-1 h-4 w-4" }), "Create Channel"]
36
+ })]
37
+ })]
38
+ }), /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ o(d, {
39
+ className: "flex items-center gap-2",
40
+ children: [/* @__PURE__ */ a(n, { className: "h-4 w-4" }), "Channel Details"]
41
+ }) }), /* @__PURE__ */ o(l, {
42
+ className: "space-y-4",
43
+ children: [
44
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
45
+ className: "text-sm font-medium",
46
+ children: "Channel Name"
47
+ }), /* @__PURE__ */ a(f, {
48
+ value: p.name,
49
+ onChange: (e) => m({
50
+ ...p,
51
+ name: e.target.value
52
+ }),
53
+ className: "mt-1",
54
+ placeholder: "e.g. engineering-updates"
55
+ })] }),
56
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
57
+ className: "text-sm font-medium",
58
+ children: "Description"
59
+ }), /* @__PURE__ */ a("textarea", {
60
+ className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
61
+ value: p.description,
62
+ onChange: (e) => m({
63
+ ...p,
64
+ description: e.target.value
65
+ }),
66
+ placeholder: "What is this channel for?"
67
+ })] }),
68
+ /* @__PURE__ */ o("div", { children: [
69
+ /* @__PURE__ */ a("label", {
70
+ className: "text-sm font-medium",
71
+ children: "Type"
72
+ }),
73
+ /* @__PURE__ */ a("div", {
74
+ className: "mt-1 flex gap-2",
75
+ children: ["public", "private"].map((e) => /* @__PURE__ */ a("button", {
76
+ onClick: () => m({
77
+ ...p,
78
+ type: e
79
+ }),
80
+ className: `px-4 py-2 rounded-md text-sm capitalize ${p.type === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
81
+ children: e
82
+ }, e))
83
+ }),
84
+ /* @__PURE__ */ a("p", {
85
+ className: "text-xs text-muted-foreground mt-1",
86
+ children: p.type === "public" ? "Anyone in the workspace can join" : "Only invited members can access"
87
+ })
88
+ ] })
89
+ ]
90
+ })] })]
91
+ });
92
+ }
93
+ //#endregion
94
+ export { p as CollaborationCreateChannelPagePage };
95
+
96
+ //# sourceMappingURL=CollaborationCreateChannelPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationCreateChannelPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, Hash } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nexport function CollaborationCreateChannelPagePage() {\n const [form, setForm] = useState({ name: '', description: '', type: 'public' });\n const navigate = usePlanMagnetNavigate();\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n navigate('/collaboration');\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Channel</h1>\n <p className=\"text-sm text-muted-foreground\">\n Set up a new communication channel for your team.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/collaboration')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate}>\n <Save className=\"mr-1 h-4 w-4\" />\n Create Channel\n </Button>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Hash className=\"h-4 w-4\" />\n Channel Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Channel Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. engineering-updates\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"What is this channel for?\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <div className=\"mt-1 flex gap-2\">\n {['public', 'private'].map((t) => (\n <button\n key={t}\n onClick={() => setForm({ ...form, type: t })}\n className={`px-4 py-2 rounded-md text-sm capitalize ${form.type === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t}\n </button>\n ))}\n </div>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {form.type === 'public'\n ? 'Anyone in the workspace can join'\n : 'Only invited members can access'}\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,IAAqC;CACnD,IAAM,CAAC,GAAM,KAAW,EAAS;EAAE,MAAM;EAAI,aAAa;EAAI,MAAM;EAAU,CAAC,EACzE,IAAW,GAAuB;AAOxC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAmB,CAAA,EAC1D,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAe,EAAS,iBAAiB;eAA7E,CACE,kBAAC,GAAD,EAAG,WAAU,gBAAiB,CAAA,EAAA,SAEvB;QACT,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAnBC;AACpB,QAAK,KAAK,MAAM,IACrB,EAAS,iBAAiB;;eAiBpB,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;OACL;MACF;MACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAElB;MACD,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAoB,CAAA,EAC3D,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,MAAM,EAAE,OAAO;MAAO,CAAC;KAC3D,WAAU;KACV,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAmB,CAAA,EAC1D,kBAAC,YAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,aAAa,EAAE,OAAO;MAAO,CAAC;KAClE,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,SAAD;MAAO,WAAU;gBAAsB;MAAY,CAAA;KACnD,kBAAC,OAAD;MAAK,WAAU;gBACZ,CAAC,UAAU,UAAU,CAAC,KAAK,MAC1B,kBAAC,UAAD;OAEE,eAAe,EAAQ;QAAE,GAAG;QAAM,MAAM;QAAG,CAAC;OAC5C,WAAW,2CAA2C,EAAK,SAAS,IAAI,uCAAuC;iBAE9G;OACM,EALF,EAKE,CACT;MACE,CAAA;KACN,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAK,SAAS,WACX,qCACA;MACF,CAAA;KACA,EAAA,CAAA;IACM;KACT,EAAA,CAAA,CACH"}
@@ -0,0 +1,2 @@
1
+ export declare function CollaborationFilesPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=CollaborationFilesPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollaborationFilesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,0BAA0B,4CAyFzC"}