@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,233 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { Calendar as t, Loader2 as n, Map as r } from "lucide-react";
3
+ import { useParams as i } from "react-router-dom";
4
+ import { gql as a } from "@apollo/client";
5
+ import { useQuery as o } from "@apollo/client/react";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ import { Badge as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p } from "@burdenoff/fe-libs/ui";
8
+ //#region src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx
9
+ var m = a`
10
+ query GetRoadmapDetailPage($id: ID!) {
11
+ planmagnetRoadmap(id: $id) {
12
+ id
13
+ workspaceId
14
+ name
15
+ description
16
+ type
17
+ isPublic
18
+ ownerId
19
+ createdAt
20
+ updatedAt
21
+ items {
22
+ id
23
+ title
24
+ description
25
+ status
26
+ startDate
27
+ endDate
28
+ color
29
+ swimlane
30
+ sortOrder
31
+ projectId
32
+ milestoneId
33
+ }
34
+ }
35
+ }
36
+ `, h = {
37
+ TODO: "bg-gray-100 text-gray-800",
38
+ IN_PROGRESS: "bg-blue-100 text-blue-800",
39
+ DONE: "bg-green-100 text-green-800",
40
+ COMPLETED: "bg-green-100 text-green-800",
41
+ BLOCKED: "bg-red-100 text-red-800",
42
+ PLANNED: "bg-yellow-100 text-yellow-800"
43
+ };
44
+ function g() {
45
+ let { workspaceId: a } = e(), g = i().id ?? "", { data: _, loading: v, error: y } = o(m, {
46
+ variables: { id: g },
47
+ skip: !g
48
+ });
49
+ if (v) return /* @__PURE__ */ s("div", {
50
+ className: "flex items-center justify-center p-12",
51
+ children: /* @__PURE__ */ s(n, { className: "h-8 w-8 animate-spin text-muted-foreground" })
52
+ });
53
+ if (y) return /* @__PURE__ */ c("div", {
54
+ className: "p-6 text-destructive",
55
+ children: ["Failed to load roadmap: ", y.message]
56
+ });
57
+ let b = _?.planmagnetRoadmap;
58
+ if (!b) return /* @__PURE__ */ s("div", {
59
+ className: "p-6 text-muted-foreground",
60
+ children: "Roadmap not found."
61
+ });
62
+ let x = (b.items ?? []).slice().sort((e, t) => e.sortOrder - t.sortOrder), S = x.filter((e) => e.status === "COMPLETED" || e.status === "DONE"), C = x.length > 0 ? Math.round(S.length / x.length * 100) : 0, w = {};
63
+ for (let e of x) {
64
+ let t = e.swimlane ?? "Uncategorized";
65
+ w[t] || (w[t] = []), w[t].push(e);
66
+ }
67
+ return /* @__PURE__ */ c("div", {
68
+ className: "space-y-6 p-6",
69
+ children: [
70
+ /* @__PURE__ */ c("div", {
71
+ className: "flex items-center justify-between",
72
+ children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ c("div", {
73
+ className: "flex items-center gap-2",
74
+ children: [/* @__PURE__ */ s(r, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ s("h1", {
75
+ className: "text-2xl font-semibold",
76
+ children: b.name
77
+ })]
78
+ }), /* @__PURE__ */ s("p", {
79
+ className: "text-sm text-muted-foreground mt-1",
80
+ children: b.description ?? "No description"
81
+ })] }), /* @__PURE__ */ c("div", {
82
+ className: "flex gap-2",
83
+ children: [/* @__PURE__ */ s(l, {
84
+ variant: b.isPublic ? "default" : "secondary",
85
+ className: "capitalize",
86
+ children: b.isPublic ? "public" : "private"
87
+ }), /* @__PURE__ */ s(l, {
88
+ variant: "outline",
89
+ className: "capitalize",
90
+ children: b.type.toLowerCase()
91
+ })]
92
+ })]
93
+ }),
94
+ /* @__PURE__ */ s("div", {
95
+ className: "grid grid-cols-2 md:grid-cols-5 gap-4",
96
+ children: [
97
+ {
98
+ label: "Progress",
99
+ value: `${C}%`
100
+ },
101
+ {
102
+ label: "Total Items",
103
+ value: x.length
104
+ },
105
+ {
106
+ label: "Completed",
107
+ value: S.length
108
+ },
109
+ {
110
+ label: "Type",
111
+ value: b.type.toLowerCase()
112
+ },
113
+ {
114
+ label: "Visibility",
115
+ value: b.isPublic ? "Public" : "Private"
116
+ }
117
+ ].map((e) => /* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
118
+ className: "pt-4 text-center",
119
+ children: [/* @__PURE__ */ s("p", {
120
+ className: "text-xs text-muted-foreground",
121
+ children: e.label
122
+ }), /* @__PURE__ */ s("p", {
123
+ className: "text-lg font-semibold capitalize",
124
+ children: e.value
125
+ })]
126
+ }) }, e.label))
127
+ }),
128
+ /* @__PURE__ */ c("div", {
129
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
130
+ children: [/* @__PURE__ */ c("div", {
131
+ className: "lg:col-span-2 space-y-6",
132
+ children: [/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ s(p, { children: "Progress Overview" }) }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
133
+ className: "flex justify-between text-sm mb-2",
134
+ children: [/* @__PURE__ */ s("span", {
135
+ className: "text-muted-foreground",
136
+ children: "Overall Completion"
137
+ }), /* @__PURE__ */ c("span", {
138
+ className: "font-medium",
139
+ children: [C, "%"]
140
+ })]
141
+ }), /* @__PURE__ */ s("div", {
142
+ className: "w-full h-4 rounded-full bg-muted overflow-hidden",
143
+ children: /* @__PURE__ */ s("div", {
144
+ className: "h-full bg-primary rounded-full transition-all",
145
+ style: { width: `${C}%` }
146
+ })
147
+ })] })] }), Object.entries(w).map(([e, n]) => /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ c(p, { children: [
148
+ e,
149
+ " (",
150
+ n.length,
151
+ ")"
152
+ ] }) }), /* @__PURE__ */ s(d, {
153
+ className: "space-y-3",
154
+ children: n.map((e) => /* @__PURE__ */ c("div", {
155
+ className: "flex items-center justify-between border rounded-md p-3",
156
+ children: [/* @__PURE__ */ c("div", { children: [
157
+ /* @__PURE__ */ s("p", {
158
+ className: "text-sm font-medium",
159
+ children: e.title
160
+ }),
161
+ e.description && /* @__PURE__ */ c("p", {
162
+ className: "text-xs text-muted-foreground",
163
+ children: [e.description.slice(0, 60), "..."]
164
+ }),
165
+ (e.startDate || e.endDate) && /* @__PURE__ */ c("div", {
166
+ className: "flex items-center gap-1 mt-1 text-xs text-muted-foreground",
167
+ children: [
168
+ /* @__PURE__ */ s(t, { className: "h-3 w-3" }),
169
+ e.startDate ? new Date(e.startDate).toLocaleDateString() : "?",
170
+ " - ",
171
+ e.endDate ? new Date(e.endDate).toLocaleDateString() : "?"
172
+ ]
173
+ })
174
+ ] }), /* @__PURE__ */ c("div", {
175
+ className: "flex items-center gap-2",
176
+ children: [e.color && /* @__PURE__ */ s("div", {
177
+ className: "h-3 w-3 rounded-full",
178
+ style: { backgroundColor: e.color }
179
+ }), /* @__PURE__ */ s("span", {
180
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${h[e.status] ?? "bg-gray-100"}`,
181
+ children: e.status.toLowerCase().replace("_", " ")
182
+ })]
183
+ })]
184
+ }, e.id))
185
+ })] }, e))]
186
+ }), /* @__PURE__ */ s("div", {
187
+ className: "space-y-6",
188
+ children: /* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ s(p, { children: "Details" }) }), /* @__PURE__ */ c(d, {
189
+ className: "space-y-2 text-sm",
190
+ children: [
191
+ /* @__PURE__ */ c("div", {
192
+ className: "flex justify-between",
193
+ children: [/* @__PURE__ */ s("span", {
194
+ className: "text-muted-foreground",
195
+ children: "Type"
196
+ }), /* @__PURE__ */ s(l, {
197
+ variant: "outline",
198
+ className: "text-xs capitalize",
199
+ children: b.type.toLowerCase()
200
+ })]
201
+ }),
202
+ /* @__PURE__ */ c("div", {
203
+ className: "flex justify-between",
204
+ children: [/* @__PURE__ */ s("span", {
205
+ className: "text-muted-foreground",
206
+ children: "Owner"
207
+ }), /* @__PURE__ */ s("span", { children: b.ownerId })]
208
+ }),
209
+ /* @__PURE__ */ c("div", {
210
+ className: "flex justify-between",
211
+ children: [/* @__PURE__ */ s("span", {
212
+ className: "text-muted-foreground",
213
+ children: "Created"
214
+ }), /* @__PURE__ */ s("span", { children: new Date(b.createdAt).toLocaleDateString() })]
215
+ }),
216
+ /* @__PURE__ */ c("div", {
217
+ className: "flex justify-between",
218
+ children: [/* @__PURE__ */ s("span", {
219
+ className: "text-muted-foreground",
220
+ children: "Updated"
221
+ }), /* @__PURE__ */ s("span", { children: new Date(b.updatedAt).toLocaleDateString() })]
222
+ })
223
+ ]
224
+ })] })
225
+ })]
226
+ })
227
+ ]
228
+ });
229
+ }
230
+ //#endregion
231
+ export { g as ProductsRoadmapDetailPagePage };
232
+
233
+ //# sourceMappingURL=ProductsRoadmapDetailPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsRoadmapDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.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 { Map, Calendar, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router-dom';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapDetailPage($id: ID!) {\n planmagnetRoadmap(id: $id) {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n title\n description\n status\n startDate\n endDate\n color\n swimlane\n sortOrder\n projectId\n milestoneId\n }\n }\n }\n`;\n\ninterface RoadmapItemNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n color: string | null;\n swimlane: string | null;\n sortOrder: number;\n projectId: string | null;\n milestoneId: string | null;\n}\n\nconst statusColor: Record<string, string> = {\n TODO: 'bg-gray-100 text-gray-800',\n IN_PROGRESS: 'bg-blue-100 text-blue-800',\n DONE: 'bg-green-100 text-green-800',\n COMPLETED: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n PLANNED: 'bg-yellow-100 text-yellow-800',\n};\n\nexport function ProductsRoadmapDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const roadmapId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_ROADMAP, {\n variables: { id: roadmapId },\n skip: !roadmapId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load roadmap: {error.message}</div>;\n }\n\n const roadmap = data?.planmagnetRoadmap;\n if (!roadmap) return <div className=\"p-6 text-muted-foreground\">Roadmap not found.</div>;\n\n const items: RoadmapItemNode[] = (roadmap.items ?? [])\n .slice()\n .sort((a: RoadmapItemNode, b: RoadmapItemNode) => a.sortOrder - b.sortOrder);\n const completedItems = items.filter((i) => i.status === 'COMPLETED' || i.status === 'DONE');\n const progress = items.length > 0 ? Math.round((completedItems.length / items.length) * 100) : 0;\n\n // Group items by swimlane\n const swimlaneGroups: Record<string, RoadmapItemNode[]> = {};\n for (const item of items) {\n const lane = item.swimlane ?? 'Uncategorized';\n if (!swimlaneGroups[lane]) swimlaneGroups[lane] = [];\n swimlaneGroups[lane].push(item);\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <Map className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{roadmap.name}</h1>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {roadmap.description ?? 'No description'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant={roadmap.isPublic ? 'default' : 'secondary'} className=\"capitalize\">\n {roadmap.isPublic ? 'public' : 'private'}\n </Badge>\n <Badge variant=\"outline\" className=\"capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-5 gap-4\">\n {[\n { label: 'Progress', value: `${progress}%` },\n { label: 'Total Items', value: items.length },\n { label: 'Completed', value: completedItems.length },\n { label: 'Type', value: roadmap.type.toLowerCase() },\n { label: 'Visibility', value: roadmap.isPublic ? 'Public' : 'Private' },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">{s.label}</p>\n <p className=\"text-lg font-semibold capitalize\">{s.value}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Progress Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Overall Completion</span>\n <span className=\"font-medium\">{progress}%</span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </CardContent>\n </Card>\n\n {Object.entries(swimlaneGroups).map(([lane, laneItems]) => (\n <Card key={lane}>\n <CardHeader>\n <CardTitle>\n {lane} ({laneItems.length})\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {laneItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between border rounded-md p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{item.title}</p>\n {item.description && (\n <p className=\"text-xs text-muted-foreground\">\n {item.description.slice(0, 60)}...\n </p>\n )}\n {(item.startDate || item.endDate) && (\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {item.startDate ? new Date(item.startDate).toLocaleDateString() : '?'}\n {' - '}\n {item.endDate ? new Date(item.endDate).toLocaleDateString() : '?'}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {item.color && (\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[item.status] ?? 'bg-gray-100'}`}\n >\n {item.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {roadmap.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>{roadmap.ownerId}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(roadmap.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(roadmap.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsRoadmapsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsRoadmapsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsRoadmapsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapsPagePage.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,wBAAwB,4CAiKvC"}
@@ -0,0 +1,193 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { useState as t } from "react";
3
+ import { Calendar as n, Filter as r, Loader2 as i, Map as a, Plus as o } from "lucide-react";
4
+ import { gql as s } from "@apollo/client";
5
+ import { useQuery as c } from "@apollo/client/react";
6
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
+ import { Badge as d, Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
8
+ //#region src/planmagnet/pages/ProductsRoadmapsPagePage.tsx
9
+ var _ = s`
10
+ query ListRoadmapsPage($workspaceId: ID!, $filter: RoadmapFilter, $pagination: PaginationInput) {
11
+ planmagnetRoadmaps(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
12
+ items {
13
+ id
14
+ workspaceId
15
+ name
16
+ description
17
+ type
18
+ isPublic
19
+ ownerId
20
+ createdAt
21
+ updatedAt
22
+ items {
23
+ id
24
+ title
25
+ status
26
+ startDate
27
+ endDate
28
+ }
29
+ }
30
+ totalCount
31
+ }
32
+ }
33
+ `, v = {
34
+ TIMELINE: "bg-purple-100 text-purple-800",
35
+ GANTT: "bg-orange-100 text-orange-800",
36
+ SWIMLANE: "bg-green-100 text-green-800",
37
+ CUSTOM: "bg-blue-100 text-blue-800"
38
+ };
39
+ function y() {
40
+ let { workspaceId: s } = e(), [y, b] = t("all"), [x, S] = t("all"), { data: C, loading: w, error: T } = c(_, {
41
+ variables: {
42
+ workspaceId: s,
43
+ pagination: { first: 50 }
44
+ },
45
+ skip: !s
46
+ });
47
+ if (w) return /* @__PURE__ */ l("div", {
48
+ className: "flex items-center justify-center p-12",
49
+ children: /* @__PURE__ */ l(i, { className: "h-8 w-8 animate-spin text-muted-foreground" })
50
+ });
51
+ if (T) return /* @__PURE__ */ u("div", {
52
+ className: "p-6 text-destructive",
53
+ children: ["Failed to load roadmaps: ", T.message]
54
+ });
55
+ let E = C?.planmagnetRoadmaps?.items ?? [], D = C?.planmagnetRoadmaps?.totalCount ?? 0, O = ["all", ...new Set(E.map((e) => e.type))], k = [
56
+ "all",
57
+ "public",
58
+ "private"
59
+ ], A = E.filter((e) => (y === "all" || e.type === y) && (x === "all" || x === "public" && e.isPublic || x === "private" && !e.isPublic));
60
+ return /* @__PURE__ */ u("div", {
61
+ className: "space-y-6 p-6",
62
+ children: [
63
+ /* @__PURE__ */ u("div", {
64
+ className: "flex items-center justify-between",
65
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
66
+ className: "text-2xl font-semibold",
67
+ children: "Roadmaps"
68
+ }), /* @__PURE__ */ u("p", {
69
+ className: "text-sm text-muted-foreground",
70
+ children: [D, " roadmaps across all products"]
71
+ })] }), /* @__PURE__ */ u(f, {
72
+ size: "sm",
73
+ children: [/* @__PURE__ */ l(o, { className: "mr-1 h-4 w-4" }), "New Roadmap"]
74
+ })]
75
+ }),
76
+ /* @__PURE__ */ u("div", {
77
+ className: "flex gap-4 flex-wrap",
78
+ children: [/* @__PURE__ */ u("div", {
79
+ className: "flex items-center gap-2",
80
+ children: [
81
+ /* @__PURE__ */ l(r, { className: "h-4 w-4 text-muted-foreground" }),
82
+ /* @__PURE__ */ l("span", {
83
+ className: "text-sm text-muted-foreground",
84
+ children: "Type:"
85
+ }),
86
+ O.map((e) => /* @__PURE__ */ l("button", {
87
+ onClick: () => b(e),
88
+ className: `px-2 py-1 text-xs rounded-md capitalize ${y === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
89
+ children: e === "all" ? "All" : e.toLowerCase()
90
+ }, e))
91
+ ]
92
+ }), /* @__PURE__ */ u("div", {
93
+ className: "flex items-center gap-2",
94
+ children: [/* @__PURE__ */ l("span", {
95
+ className: "text-sm text-muted-foreground",
96
+ children: "Visibility:"
97
+ }), k.map((e) => /* @__PURE__ */ l("button", {
98
+ onClick: () => S(e),
99
+ className: `px-2 py-1 text-xs rounded-md capitalize ${x === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
100
+ children: e
101
+ }, e))]
102
+ })]
103
+ }),
104
+ /* @__PURE__ */ l("div", {
105
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
106
+ children: A.map((e) => {
107
+ let t = e.items?.length ?? 0, r = e.items?.filter((e) => e.status === "COMPLETED" || e.status === "DONE").length ?? 0, i = t > 0 ? Math.round(r / t * 100) : 0, o = e.items?.map((e) => e.startDate).filter(Boolean) ?? [], s = e.items?.map((e) => e.endDate).filter(Boolean) ?? [], c = o.length > 0 ? o.sort()[0] : null, f = s.length > 0 ? s.sort().reverse()[0] : null;
108
+ return /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l(h, {
109
+ className: "pb-2",
110
+ children: /* @__PURE__ */ u("div", {
111
+ className: "flex items-center justify-between",
112
+ children: [/* @__PURE__ */ l(g, {
113
+ className: "text-base",
114
+ children: e.name
115
+ }), /* @__PURE__ */ l(d, {
116
+ variant: e.isPublic ? "default" : "secondary",
117
+ className: "capitalize",
118
+ children: e.isPublic ? "public" : "private"
119
+ })]
120
+ })
121
+ }), /* @__PURE__ */ u(m, {
122
+ className: "space-y-3",
123
+ children: [
124
+ /* @__PURE__ */ l("p", {
125
+ className: "text-sm text-muted-foreground",
126
+ children: e.description ?? "No description"
127
+ }),
128
+ /* @__PURE__ */ u("div", {
129
+ className: "flex items-center gap-2",
130
+ children: [/* @__PURE__ */ l("span", {
131
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${v[e.type] ?? "bg-gray-100"}`,
132
+ children: e.type.toLowerCase()
133
+ }), /* @__PURE__ */ l(d, {
134
+ variant: "outline",
135
+ className: "text-xs capitalize",
136
+ children: e.isPublic ? "public" : "private"
137
+ })]
138
+ }),
139
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("div", {
140
+ className: "flex justify-between text-xs mb-1",
141
+ children: [/* @__PURE__ */ l("span", {
142
+ className: "text-muted-foreground",
143
+ children: "Progress"
144
+ }), /* @__PURE__ */ u("span", {
145
+ className: "font-medium",
146
+ children: [i, "%"]
147
+ })]
148
+ }), /* @__PURE__ */ l("div", {
149
+ className: "w-full h-2 rounded-full bg-muted overflow-hidden",
150
+ children: /* @__PURE__ */ l("div", {
151
+ className: "h-full bg-primary rounded-full",
152
+ style: { width: `${i}%` }
153
+ })
154
+ })] }),
155
+ /* @__PURE__ */ l("div", {
156
+ className: "flex gap-4 text-xs text-muted-foreground",
157
+ children: /* @__PURE__ */ u("span", {
158
+ className: "flex items-center gap-1",
159
+ children: [
160
+ /* @__PURE__ */ l(a, { className: "h-3 w-3" }),
161
+ t,
162
+ " items"
163
+ ]
164
+ })
165
+ }),
166
+ /* @__PURE__ */ u("div", {
167
+ className: "flex items-center justify-between text-xs text-muted-foreground border-t pt-2",
168
+ children: [/* @__PURE__ */ u("span", { children: ["Owner: ", e.ownerId] }), c && f && /* @__PURE__ */ u("span", {
169
+ className: "flex items-center gap-1",
170
+ children: [
171
+ /* @__PURE__ */ l(n, { className: "h-3 w-3" }),
172
+ new Date(c).toLocaleDateString(),
173
+ " -",
174
+ " ",
175
+ new Date(f).toLocaleDateString()
176
+ ]
177
+ })]
178
+ })
179
+ ]
180
+ })] }, e.id);
181
+ })
182
+ }),
183
+ A.length === 0 && /* @__PURE__ */ l("p", {
184
+ className: "text-center text-muted-foreground py-8",
185
+ children: "No roadmaps match the selected filters."
186
+ })
187
+ ]
188
+ });
189
+ }
190
+ //#endregion
191
+ export { y as ProductsRoadmapsPagePage };
192
+
193
+ //# sourceMappingURL=ProductsRoadmapsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsRoadmapsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsRoadmapsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { Map, Calendar, Plus, Filter, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst LIST_ROADMAPS = gql`\n query ListRoadmapsPage($workspaceId: ID!, $filter: RoadmapFilter, $pagination: PaginationInput) {\n planmagnetRoadmaps(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n createdAt\n updatedAt\n items {\n id\n title\n status\n startDate\n endDate\n }\n }\n totalCount\n }\n }\n`;\n\ninterface RoadmapItemNode {\n id: string;\n title: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface RoadmapNode {\n id: string;\n name: string;\n description: string | null;\n type: string;\n isPublic: boolean;\n ownerId: string;\n createdAt: string;\n updatedAt: string;\n items: RoadmapItemNode[];\n}\n\nconst typeColor: Record<string, string> = {\n TIMELINE: 'bg-purple-100 text-purple-800',\n GANTT: 'bg-orange-100 text-orange-800',\n SWIMLANE: 'bg-green-100 text-green-800',\n CUSTOM: 'bg-blue-100 text-blue-800',\n};\n\nexport function ProductsRoadmapsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [typeFilter, setTypeFilter] = useState<string>('all');\n const [visFilter, setVisFilter] = useState<string>('all');\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_ROADMAPS, {\n variables: {\n workspaceId,\n pagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-destructive\">Failed to load roadmaps: {error.message}</div>;\n }\n\n const roadmaps: RoadmapNode[] = data?.planmagnetRoadmaps?.items ?? [];\n const totalCount = data?.planmagnetRoadmaps?.totalCount ?? 0;\n\n const types = ['all', ...new Set(roadmaps.map((r) => r.type))];\n const visibilities = ['all', 'public', 'private'];\n\n const filtered = roadmaps.filter(\n (r) =>\n (typeFilter === 'all' || r.type === typeFilter) &&\n (visFilter === 'all' ||\n (visFilter === 'public' && r.isPublic) ||\n (visFilter === 'private' && !r.isPublic))\n );\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\">Roadmaps</h1>\n <p className=\"text-sm text-muted-foreground\">{totalCount} roadmaps across all products</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Roadmap\n </Button>\n </div>\n\n <div className=\"flex gap-4 flex-wrap\">\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">Type:</span>\n {types.map((t) => (\n <button\n key={t}\n onClick={() => setTypeFilter(t)}\n className={`px-2 py-1 text-xs rounded-md capitalize ${typeFilter === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t === 'all' ? 'All' : t.toLowerCase()}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">Visibility:</span>\n {visibilities.map((v) => (\n <button\n key={v}\n onClick={() => setVisFilter(v)}\n className={`px-2 py-1 text-xs rounded-md capitalize ${visFilter === v ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {v}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {filtered.map((rm) => {\n const itemCount = rm.items?.length ?? 0;\n const completedItems =\n rm.items?.filter((i) => i.status === 'COMPLETED' || i.status === 'DONE').length ?? 0;\n const progress = itemCount > 0 ? Math.round((completedItems / itemCount) * 100) : 0;\n const startDates = rm.items?.map((i) => i.startDate).filter(Boolean) ?? [];\n const endDates = rm.items?.map((i) => i.endDate).filter(Boolean) ?? [];\n const earliestStart = startDates.length > 0 ? startDates.sort()[0] : null;\n const latestEnd = endDates.length > 0 ? endDates.sort().reverse()[0] : null;\n\n return (\n <Card key={rm.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{rm.name}</CardTitle>\n <Badge variant={rm.isPublic ? 'default' : 'secondary'} className=\"capitalize\">\n {rm.isPublic ? 'public' : 'private'}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {rm.description ?? 'No description'}\n </p>\n <div className=\"flex items-center gap-2\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${typeColor[rm.type] ?? 'bg-gray-100'}`}\n >\n {rm.type.toLowerCase()}\n </span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {rm.isPublic ? 'public' : 'private'}\n </Badge>\n </div>\n <div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-muted-foreground\">Progress</span>\n <span className=\"font-medium\">{progress}%</span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Map className=\"h-3 w-3\" />\n {itemCount} items\n </span>\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground border-t pt-2\">\n <span>Owner: {rm.ownerId}</span>\n {earliestStart && latestEnd && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {new Date(earliestStart).toLocaleDateString()} -{' '}\n {new Date(latestEnd).toLocaleDateString()}\n </span>\n )}\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n {filtered.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">\n No roadmaps match the selected filters.\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProjectsActiveProjectsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProjectsActiveProjectsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsActiveProjectsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsActiveProjectsPagePage.tsx"],"names":[],"mappings":"AA0CA,wBAAgB,8BAA8B,4CAuF7C"}
@@ -0,0 +1,116 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { Users as t } from "lucide-react";
3
+ import { gql as n } from "@apollo/client";
4
+ import { useQuery as r } from "@apollo/client/react";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { Badge as o, Card as s, CardContent as c, CardHeader as l, CardTitle as u } from "@burdenoff/fe-libs/ui";
7
+ //#region src/planmagnet/pages/ProjectsActiveProjectsPagePage.tsx
8
+ var d = n`
9
+ query GetActiveProjects($workspaceId: ID!) {
10
+ planmagnetProjects(
11
+ workspaceId: $workspaceId
12
+ filter: { status: ACTIVE }
13
+ pagination: { first: 100 }
14
+ ) {
15
+ items {
16
+ id
17
+ name
18
+ key
19
+ description
20
+ status
21
+ methodology
22
+ ownerId
23
+ startDate
24
+ endDate
25
+ tags
26
+ createdAt
27
+ }
28
+ totalCount
29
+ }
30
+ }
31
+ `;
32
+ function f() {
33
+ let { workspaceId: n } = e(), { data: f, loading: p, error: m } = r(d, { variables: { workspaceId: n ?? "default" } });
34
+ if (p) return /* @__PURE__ */ i("div", {
35
+ className: "flex items-center justify-center p-12",
36
+ children: /* @__PURE__ */ i("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
37
+ });
38
+ if (m) return /* @__PURE__ */ a("div", {
39
+ className: "p-6 text-red-500",
40
+ children: ["Error loading active projects: ", m.message]
41
+ });
42
+ let h = f?.planmagnetProjects?.items ?? [];
43
+ return /* @__PURE__ */ a("div", {
44
+ className: "space-y-6 p-6",
45
+ children: [
46
+ /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
47
+ className: "text-2xl font-semibold",
48
+ children: "Active Projects"
49
+ }), /* @__PURE__ */ a("p", {
50
+ className: "text-sm text-muted-foreground",
51
+ children: [h.length, " active projects in progress"]
52
+ })] }),
53
+ /* @__PURE__ */ i("div", {
54
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
55
+ children: h.map((e) => /* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, {
56
+ className: "pb-2",
57
+ children: /* @__PURE__ */ a("div", {
58
+ className: "flex items-center justify-between",
59
+ children: [/* @__PURE__ */ i(u, {
60
+ className: "text-base",
61
+ children: e.name
62
+ }), /* @__PURE__ */ i("span", {
63
+ className: "text-xs font-mono text-muted-foreground",
64
+ children: e.key
65
+ })]
66
+ })
67
+ }), /* @__PURE__ */ a(c, {
68
+ className: "space-y-3",
69
+ children: [
70
+ /* @__PURE__ */ i("p", {
71
+ className: "text-sm text-muted-foreground",
72
+ children: e.description ?? "No description"
73
+ }),
74
+ /* @__PURE__ */ a("div", {
75
+ className: "flex gap-2",
76
+ children: [/* @__PURE__ */ i(o, {
77
+ variant: "outline",
78
+ className: "capitalize",
79
+ children: e.methodology.toLowerCase()
80
+ }), e.tags.slice(0, 3).map((e) => /* @__PURE__ */ i(o, {
81
+ variant: "outline",
82
+ className: "text-xs",
83
+ children: e
84
+ }, e))]
85
+ }),
86
+ /* @__PURE__ */ i("div", {
87
+ className: "flex gap-4 text-xs text-muted-foreground",
88
+ children: /* @__PURE__ */ a("span", { children: [
89
+ e.startDate ? new Date(e.startDate).toLocaleDateString() : "—",
90
+ " -",
91
+ " ",
92
+ e.endDate ? new Date(e.endDate).toLocaleDateString() : "—"
93
+ ] })
94
+ }),
95
+ /* @__PURE__ */ a("div", {
96
+ className: "text-xs text-muted-foreground border-t pt-2 flex items-center gap-1",
97
+ children: [
98
+ /* @__PURE__ */ i(t, { className: "h-3 w-3" }),
99
+ "Owner: ",
100
+ e.ownerId
101
+ ]
102
+ })
103
+ ]
104
+ })] }, e.id))
105
+ }),
106
+ h.length === 0 && /* @__PURE__ */ i("p", {
107
+ className: "text-center text-muted-foreground py-8",
108
+ children: "No active projects."
109
+ })
110
+ ]
111
+ });
112
+ }
113
+ //#endregion
114
+ export { f as ProjectsActiveProjectsPagePage };
115
+
116
+ //# sourceMappingURL=ProjectsActiveProjectsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsActiveProjectsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsActiveProjectsPagePage.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 { Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_ACTIVE_PROJECTS = gql`\n query GetActiveProjects($workspaceId: ID!) {\n planmagnetProjects(\n workspaceId: $workspaceId\n filter: { status: ACTIVE }\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n totalCount\n }\n }\n`;\n\nconst methodColor: Record<string, string> = {\n SCRUM: 'bg-blue-100 text-blue-800',\n KANBAN: 'bg-purple-100 text-purple-800',\n WATERFALL: 'bg-gray-100 text-gray-800',\n HYBRID: 'bg-teal-100 text-teal-800',\n AGILE: 'bg-indigo-100 text-indigo-800',\n CUSTOM: 'bg-amber-100 text-amber-800',\n};\n\nexport function ProjectsActiveProjectsPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_ACTIVE_PROJECTS, {\n variables: { workspaceId: workspaceId ?? 'default' },\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 if (error)\n return <div className=\"p-6 text-red-500\">Error loading active projects: {error.message}</div>;\n\n const active = data?.planmagnetProjects?.items ?? [];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Active Projects</h1>\n <p className=\"text-sm text-muted-foreground\">{active.length} active projects in progress</p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {active.map(\n (project: {\n id: string;\n name: string;\n key: string;\n description: string | null;\n status: string;\n methodology: string;\n ownerId: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n }) => {\n return (\n <Card key={project.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <span className=\"text-xs font-mono text-muted-foreground\">{project.key}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {project.description ?? 'No description'}\n </p>\n <div className=\"flex gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {project.methodology.toLowerCase()}\n </Badge>\n {project.tags.slice(0, 3).map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span>\n {project.startDate ? new Date(project.startDate).toLocaleDateString() : '—'} -{' '}\n {project.endDate ? new Date(project.endDate).toLocaleDateString() : '—'}\n </span>\n </div>\n <div className=\"text-xs text-muted-foreground border-t pt-2 flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n Owner: {project.ownerId}\n </div>\n </CardContent>\n </Card>\n );\n }\n )}\n </div>\n {active.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">No active projects.</p>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;AAkC/B,SAAgB,IAAiC;CAC/C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EACJ,SACA,YACA,aAGA,EAA8B,GAAqB,EACjD,WAAW,EAAE,aAAa,KAAe,WAAW,EACrD,CAAC;AAEJ,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAEV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,mCAAgC,EAAM,QAAc;;CAE/F,IAAM,IAAS,GAAM,oBAAoB,SAAS,EAAE;AAEpD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAoB,CAAA,EAC3D,kBAAC,KAAD;IAAG,WAAU;cAAb,CAA8C,EAAO,QAAO,+BAAgC;MACxF,EAAA,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO,KACL,MAaG,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAY,WAAU;eACpB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,WAAU;iBAAa,EAAQ;OAAiB,CAAA,EAC3D,kBAAC,QAAD;OAAM,WAAU;iBAA2C,EAAQ;OAAW,CAAA,CAC1E;;KACK,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eAAvB;MACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAQ,eAAe;OACtB,CAAA;MACJ,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAQ,YAAY,aAAa;QAC5B,CAAA,EACP,EAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MAC7B,kBAAC,GAAD;QAAiB,SAAQ;QAAU,WAAU;kBAC1C;QACK,EAFI,EAEJ,CACR,CACE;;MACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,QAAD,EAAA,UAAA;QACG,EAAQ,YAAY,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB,GAAG;QAAI;QAAG;QAC9E,EAAQ,UAAU,IAAI,KAAK,EAAQ,QAAQ,CAAC,oBAAoB,GAAG;QAC/D,EAAA,CAAA;OACH,CAAA;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;;QACrB,EAAQ;QACZ;;MACM;OACT,EAAA,EAhCI,EAAQ,GAgCZ,CAGZ;IACG,CAAA;GACL,EAAO,WAAW,KACjB,kBAAC,KAAD;IAAG,WAAU;cAAyC;IAAuB,CAAA;GAE3E"}
@@ -0,0 +1,2 @@
1
+ export declare function ProjectsCreateProjectPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProjectsCreateProjectPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsCreateProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsCreateProjectPagePage.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,6BAA6B,4CA4J5C"}