@burdenoff/microfe-planmagnet 2026.924.2 → 2026.924.4

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 (75) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +93 -142
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  5. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +150 -149
  6. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  7. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  8. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +180 -172
  9. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  10. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  11. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +113 -116
  12. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  13. package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
  14. package/dist/planmagnet/pages/GoalsGoalsPagePage.js +59 -58
  15. package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
  16. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  17. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +150 -149
  18. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +108 -107
  21. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +93 -92
  24. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProductsProductsPagePage.js +89 -87
  27. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +94 -93
  30. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +57 -56
  33. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -81
  36. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +72 -71
  39. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +38 -37
  42. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +72 -71
  45. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +47 -46
  48. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +120 -119
  51. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +131 -130
  54. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +77 -75
  57. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ReportsReportsPagePage.js +71 -70
  60. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/TeamTeamPagePage.js +58 -57
  63. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +81 -72
  66. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +15 -0
  68. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -0
  69. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +302 -0
  70. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -0
  71. package/dist/planmagnet/people/People.d.ts +20 -0
  72. package/dist/planmagnet/people/People.d.ts.map +1 -0
  73. package/dist/planmagnet/people/People.js +42 -0
  74. package/dist/planmagnet/people/People.js.map +1 -0
  75. package/package.json +1 -1
@@ -1,12 +1,13 @@
1
1
  import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { Calendar as t, GitBranch as n, Loader2 as r, Map as i, Star as a, Users as o } from "lucide-react";
3
- import { useParams as s } from "react-router";
4
- import { gql as c } from "@apollo/client";
5
- import { useQuery as l } from "@apollo/client/react";
6
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { Calendar as n, GitBranch as r, Loader2 as i, Map as a, Star as o, Users as s } from "lucide-react";
4
+ import { useParams as c } from "react-router";
5
+ import { gql as l } from "@apollo/client";
6
+ import { useQuery as u } from "@apollo/client/react";
7
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ import { Badge as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _ } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/planmagnet/pages/ProductsProductDetailPagePage.tsx
9
- var _ = c`
10
+ var v = l`
10
11
  query GetRoadmapDetail($id: ID!) {
11
12
  planmagnetRoadmap(id: $id) {
12
13
  id
@@ -31,7 +32,7 @@ var _ = c`
31
32
  }
32
33
  }
33
34
  }
34
- `, v = c`
35
+ `, y = l`
35
36
  query ListFeatureRequestsForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
36
37
  planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {
37
38
  items {
@@ -47,7 +48,7 @@ var _ = c`
47
48
  totalCount
48
49
  }
49
50
  }
50
- `, y = c`
51
+ `, b = l`
51
52
  query ListReleasesForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
52
53
  planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {
53
54
  items {
@@ -61,114 +62,114 @@ var _ = c`
61
62
  }
62
63
  }
63
64
  `;
64
- function b() {
65
- let { workspaceId: c } = e(), b = s().id ?? "", { data: x, loading: S, error: C } = l(_, {
66
- variables: { id: b },
67
- skip: !b
68
- }), { data: w } = l(v, {
65
+ function x() {
66
+ let { workspaceId: l } = e(), x = c().id ?? "", { data: S, loading: C, error: w } = u(v, {
67
+ variables: { id: x },
68
+ skip: !x
69
+ }), { data: T } = u(y, {
69
70
  variables: {
70
- workspaceId: c,
71
+ workspaceId: l,
71
72
  pagination: { first: 20 }
72
73
  },
73
- skip: !c
74
- }), { data: T } = l(y, {
74
+ skip: !l
75
+ }), { data: E } = u(b, {
75
76
  variables: {
76
- workspaceId: c,
77
+ workspaceId: l,
77
78
  pagination: { first: 20 }
78
79
  },
79
- skip: !c
80
+ skip: !l
80
81
  });
81
- if (S) return /* @__PURE__ */ u("div", {
82
+ if (C) return /* @__PURE__ */ d("div", {
82
83
  className: "flex items-center justify-center p-12",
83
- children: /* @__PURE__ */ u(r, { className: "h-8 w-8 animate-spin text-muted-foreground" })
84
+ children: /* @__PURE__ */ d(i, { className: "h-8 w-8 animate-spin text-muted-foreground" })
84
85
  });
85
- if (C) return /* @__PURE__ */ d("div", {
86
+ if (w) return /* @__PURE__ */ f("div", {
86
87
  className: "p-6 text-destructive",
87
- children: ["Failed to load product: ", C.message]
88
+ children: ["Failed to load product: ", w.message]
88
89
  });
89
- let E = x?.planmagnetRoadmap;
90
- if (!E) return /* @__PURE__ */ u("div", {
90
+ let D = S?.planmagnetRoadmap;
91
+ if (!D) return /* @__PURE__ */ d("div", {
91
92
  className: "p-6 text-muted-foreground",
92
93
  children: "Product not found."
93
94
  });
94
- let D = E.items ?? [], O = w?.planmagnetFeatureRequests?.items ?? [], k = T?.planmagnetReleases?.items ?? [], A = w?.planmagnetFeatureRequests?.totalCount ?? 0, j = T?.planmagnetReleases?.totalCount ?? 0;
95
- return /* @__PURE__ */ d("div", {
95
+ let O = D.items ?? [], k = T?.planmagnetFeatureRequests?.items ?? [], A = E?.planmagnetReleases?.items ?? [], j = T?.planmagnetFeatureRequests?.totalCount ?? 0, M = E?.planmagnetReleases?.totalCount ?? 0;
96
+ return /* @__PURE__ */ f("div", {
96
97
  className: "space-y-6 p-6",
97
98
  children: [
98
- /* @__PURE__ */ d("div", {
99
+ /* @__PURE__ */ f("div", {
99
100
  className: "flex items-center justify-between",
100
- children: [/* @__PURE__ */ d("div", {
101
+ children: [/* @__PURE__ */ f("div", {
101
102
  className: "flex items-center gap-3",
102
- children: [/* @__PURE__ */ u("div", { className: `h-3 w-3 rounded-full ${{
103
+ children: [/* @__PURE__ */ d("div", { className: `h-3 w-3 rounded-full ${{
103
104
  TIMELINE: "bg-green-500",
104
105
  GANTT: "bg-blue-500",
105
106
  SWIMLANE: "bg-yellow-500",
106
107
  CUSTOM: "bg-purple-500"
107
- }[E.type] ?? "bg-gray-400"}` }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
108
+ }[D.type] ?? "bg-gray-400"}` }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
108
109
  className: "text-2xl font-semibold",
109
- children: E.name
110
- }), /* @__PURE__ */ u("p", {
110
+ children: D.name
111
+ }), /* @__PURE__ */ d("p", {
111
112
  className: "text-sm text-muted-foreground",
112
- children: E.description ?? "No description"
113
+ children: D.description ?? "No description"
113
114
  })] })]
114
- }), /* @__PURE__ */ u(f, {
115
+ }), /* @__PURE__ */ d(p, {
115
116
  className: "capitalize",
116
- children: E.type.toLowerCase()
117
+ children: D.type.toLowerCase()
117
118
  })]
118
119
  }),
119
- /* @__PURE__ */ u("div", {
120
+ /* @__PURE__ */ d("div", {
120
121
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
121
122
  children: [
122
123
  {
123
124
  label: "Roadmap Items",
124
- value: D.length,
125
- icon: a
125
+ value: O.length,
126
+ icon: o
126
127
  },
127
128
  {
128
129
  label: "Releases",
129
- value: j,
130
- icon: n
130
+ value: M,
131
+ icon: r
131
132
  },
132
133
  {
133
134
  label: "Features",
134
- value: A,
135
- icon: i
135
+ value: j,
136
+ icon: a
136
137
  },
137
138
  {
138
139
  label: "Owner",
139
- value: E.ownerId,
140
- icon: o
140
+ value: D.ownerId,
141
+ icon: s
141
142
  }
142
- ].map((e) => /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
143
+ ].map((e) => /* @__PURE__ */ d(m, { children: /* @__PURE__ */ f(h, {
143
144
  className: "pt-4",
144
- children: [/* @__PURE__ */ d("div", {
145
+ children: [/* @__PURE__ */ f("div", {
145
146
  className: "flex items-center gap-2 text-muted-foreground text-sm",
146
- children: [/* @__PURE__ */ u(e.icon, { className: "h-4 w-4" }), e.label]
147
- }), /* @__PURE__ */ u("p", {
147
+ children: [/* @__PURE__ */ d(e.icon, { className: "h-4 w-4" }), e.label]
148
+ }), /* @__PURE__ */ d("p", {
148
149
  className: "text-xl font-semibold mt-1",
149
150
  children: e.value
150
151
  })]
151
152
  }) }, e.label))
152
153
  }),
153
- /* @__PURE__ */ d("div", {
154
+ /* @__PURE__ */ f("div", {
154
155
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
155
- children: [/* @__PURE__ */ d("div", {
156
+ children: [/* @__PURE__ */ f("div", {
156
157
  className: "lg:col-span-2 space-y-6",
157
- children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
158
+ children: [/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ f(_, { children: [
158
159
  "Feature Requests (",
159
- O.length,
160
+ k.length,
160
161
  ")"
161
- ] }) }), /* @__PURE__ */ d(m, {
162
+ ] }) }), /* @__PURE__ */ f(h, {
162
163
  className: "space-y-3",
163
- children: [O.length === 0 && /* @__PURE__ */ u("p", {
164
+ children: [k.length === 0 && /* @__PURE__ */ d("p", {
164
165
  className: "text-sm text-muted-foreground",
165
166
  children: "No feature requests yet."
166
- }), O.map((e) => /* @__PURE__ */ d("div", {
167
+ }), k.map((e) => /* @__PURE__ */ f("div", {
167
168
  className: "flex items-center justify-between rounded-md border p-3",
168
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
169
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
169
170
  className: "text-sm font-medium",
170
171
  children: e.title
171
- }), /* @__PURE__ */ d("p", {
172
+ }), /* @__PURE__ */ f("p", {
172
173
  className: "text-xs text-muted-foreground",
173
174
  children: [
174
175
  "Votes: ",
@@ -176,104 +177,104 @@ function b() {
176
177
  " · Business Value: ",
177
178
  e.businessValue ?? "N/A"
178
179
  ]
179
- })] }), /* @__PURE__ */ u("div", {
180
+ })] }), /* @__PURE__ */ d("div", {
180
181
  className: "flex items-center gap-2",
181
- children: /* @__PURE__ */ u(f, {
182
+ children: /* @__PURE__ */ d(p, {
182
183
  variant: "secondary",
183
184
  className: "capitalize text-xs",
184
185
  children: e.status.toLowerCase().replace("_", " ")
185
186
  })
186
187
  })]
187
188
  }, e.id))]
188
- })] }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
189
+ })] }), /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ f(_, { children: [
189
190
  "Roadmap Items (",
190
- D.length,
191
+ O.length,
191
192
  ")"
192
- ] }) }), /* @__PURE__ */ d(m, {
193
+ ] }) }), /* @__PURE__ */ f(h, {
193
194
  className: "space-y-3",
194
- children: [D.length === 0 && /* @__PURE__ */ u("p", {
195
+ children: [O.length === 0 && /* @__PURE__ */ d("p", {
195
196
  className: "text-sm text-muted-foreground",
196
197
  children: "No roadmap items linked."
197
- }), D.map((e) => /* @__PURE__ */ d("div", {
198
+ }), O.map((e) => /* @__PURE__ */ f("div", {
198
199
  className: "flex items-center justify-between rounded-md border p-3",
199
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
200
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
200
201
  className: "text-sm font-medium",
201
202
  children: e.title
202
- }), /* @__PURE__ */ d("p", {
203
+ }), /* @__PURE__ */ f("p", {
203
204
  className: "text-xs text-muted-foreground",
204
205
  children: [
205
206
  e.startDate ? new Date(e.startDate).toLocaleDateString() : "No start date",
206
207
  " - ",
207
208
  e.endDate ? new Date(e.endDate).toLocaleDateString() : "No end date"
208
209
  ]
209
- })] }), /* @__PURE__ */ u(f, {
210
+ })] }), /* @__PURE__ */ d(p, {
210
211
  variant: "outline",
211
212
  className: "capitalize text-xs",
212
213
  children: e.status.toLowerCase().replace("_", " ")
213
214
  })]
214
215
  }, e.id))]
215
216
  })] })]
216
- }), /* @__PURE__ */ d("div", {
217
+ }), /* @__PURE__ */ f("div", {
217
218
  className: "space-y-6",
218
- children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Recent Releases" }) }), /* @__PURE__ */ d(m, {
219
+ children: [/* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Recent Releases" }) }), /* @__PURE__ */ f(h, {
219
220
  className: "space-y-3",
220
- children: [k.length === 0 && /* @__PURE__ */ u("p", {
221
+ children: [A.length === 0 && /* @__PURE__ */ d("p", {
221
222
  className: "text-sm text-muted-foreground",
222
223
  children: "No releases yet."
223
- }), k.map((e) => /* @__PURE__ */ d("div", {
224
+ }), A.map((e) => /* @__PURE__ */ f("div", {
224
225
  className: "border-b pb-2 last:border-0 last:pb-0",
225
226
  children: [
226
- /* @__PURE__ */ d("div", {
227
+ /* @__PURE__ */ f("div", {
227
228
  className: "flex items-center justify-between",
228
- children: [/* @__PURE__ */ u("span", {
229
+ children: [/* @__PURE__ */ d("span", {
229
230
  className: "text-sm font-medium",
230
231
  children: e.version
231
- }), /* @__PURE__ */ u(f, {
232
+ }), /* @__PURE__ */ d(p, {
232
233
  variant: "outline",
233
234
  className: "text-xs capitalize",
234
235
  children: e.status.toLowerCase().replace("_", " ")
235
236
  })]
236
237
  }),
237
- /* @__PURE__ */ u("p", {
238
+ /* @__PURE__ */ d("p", {
238
239
  className: "text-xs text-muted-foreground",
239
240
  children: e.name
240
241
  }),
241
- /* @__PURE__ */ d("div", {
242
+ /* @__PURE__ */ f("div", {
242
243
  className: "flex items-center gap-1 mt-1 text-xs text-muted-foreground",
243
- children: [/* @__PURE__ */ u(t, { className: "h-3 w-3" }), e.plannedDate ? new Date(e.plannedDate).toLocaleDateString() : "No date set"]
244
+ children: [/* @__PURE__ */ d(n, { className: "h-3 w-3" }), e.plannedDate ? new Date(e.plannedDate).toLocaleDateString() : "No date set"]
244
245
  })
245
246
  ]
246
247
  }, e.id))]
247
- })] }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Details" }) }), /* @__PURE__ */ d(m, {
248
+ })] }), /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, { children: /* @__PURE__ */ d(_, { children: "Details" }) }), /* @__PURE__ */ f(h, {
248
249
  className: "space-y-2 text-sm",
249
250
  children: [
250
- /* @__PURE__ */ d("div", {
251
+ /* @__PURE__ */ f("div", {
251
252
  className: "flex justify-between",
252
- children: [/* @__PURE__ */ u("span", {
253
+ children: [/* @__PURE__ */ d("span", {
253
254
  className: "text-muted-foreground",
254
255
  children: "Created"
255
- }), /* @__PURE__ */ u("span", { children: new Date(E.createdAt).toLocaleDateString() })]
256
+ }), /* @__PURE__ */ d("span", { children: new Date(D.createdAt).toLocaleDateString() })]
256
257
  }),
257
- /* @__PURE__ */ d("div", {
258
+ /* @__PURE__ */ f("div", {
258
259
  className: "flex justify-between",
259
- children: [/* @__PURE__ */ u("span", {
260
+ children: [/* @__PURE__ */ d("span", {
260
261
  className: "text-muted-foreground",
261
262
  children: "Updated"
262
- }), /* @__PURE__ */ u("span", { children: new Date(E.updatedAt).toLocaleDateString() })]
263
+ }), /* @__PURE__ */ d("span", { children: new Date(D.updatedAt).toLocaleDateString() })]
263
264
  }),
264
- /* @__PURE__ */ d("div", {
265
+ /* @__PURE__ */ f("div", {
265
266
  className: "flex justify-between",
266
- children: [/* @__PURE__ */ u("span", {
267
+ children: [/* @__PURE__ */ d("span", {
267
268
  className: "text-muted-foreground",
268
269
  children: "Owner"
269
- }), /* @__PURE__ */ u("span", { children: E.ownerId })]
270
+ }), /* @__PURE__ */ d("span", { children: /* @__PURE__ */ d(t, { id: D.ownerId }) })]
270
271
  }),
271
- /* @__PURE__ */ d("div", {
272
+ /* @__PURE__ */ f("div", {
272
273
  className: "flex justify-between",
273
- children: [/* @__PURE__ */ u("span", {
274
+ children: [/* @__PURE__ */ d("span", {
274
275
  className: "text-muted-foreground",
275
276
  children: "Visibility"
276
- }), /* @__PURE__ */ u("span", { children: E.isPublic ? "Public" : "Private" })]
277
+ }), /* @__PURE__ */ d("span", { children: D.isPublic ? "Public" : "Private" })]
277
278
  })
278
279
  ]
279
280
  })] })]
@@ -283,6 +284,6 @@ function b() {
283
284
  });
284
285
  }
285
286
  //#endregion
286
- export { b as ProductsProductDetailPagePage };
287
+ export { x as ProductsProductDetailPagePage };
287
288
 
288
289
  //# sourceMappingURL=ProductsProductDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsProductDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductDetailPagePage.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 { Package, GitBranch, Map, Star, Users, Calendar, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapDetail($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 }\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS_FOR_PRODUCT = gql`\n query ListFeatureRequestsForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n title\n description\n status\n priorityScore\n voteCount\n businessValue\n createdAt\n }\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES_FOR_PRODUCT = gql`\n query ListReleasesForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n version\n status\n plannedDate\n }\n totalCount\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}\n\ninterface FeatureRequestNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n priorityScore: number | null;\n voteCount: number;\n businessValue: number | null;\n}\n\ninterface ReleaseNode {\n id: string;\n name: string;\n version: string;\n status: string;\n plannedDate: string | null;\n}\n\nexport function ProductsProductDetailPagePage() {\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 const {\n data: featuresData,\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_FEATURE_REQUESTS_FOR_PRODUCT, {\n variables: { workspaceId, pagination: { first: 20 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\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_RELEASES_FOR_PRODUCT, {\n variables: { workspaceId, pagination: { first: 20 } },\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 product: {error.message}</div>;\n }\n\n const roadmap = data?.planmagnetRoadmap;\n if (!roadmap) return <div className=\"p-6 text-muted-foreground\">Product not found.</div>;\n\n const roadmapItems: RoadmapItemNode[] = roadmap.items ?? [];\n const features: FeatureRequestNode[] = featuresData?.planmagnetFeatureRequests?.items ?? [];\n const releases: ReleaseNode[] = releasesData?.planmagnetReleases?.items ?? [];\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeColor: Record<string, string> = {\n TIMELINE: 'bg-green-500',\n GANTT: 'bg-blue-500',\n SWIMLANE: 'bg-yellow-500',\n CUSTOM: 'bg-purple-500',\n };\n\n const statusColor: Record<string, string> = {\n SUBMITTED: 'bg-gray-100 text-gray-800',\n UNDER_REVIEW: 'bg-yellow-100 text-yellow-800',\n PLANNED: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-purple-100 text-purple-800',\n COMPLETED: 'bg-green-100 text-green-800',\n DECLINED: 'bg-red-100 text-red-800',\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className={`h-3 w-3 rounded-full ${typeColor[roadmap.type] ?? 'bg-gray-400'}`} />\n <div>\n <h1 className=\"text-2xl font-semibold\">{roadmap.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ?? 'No description'}\n </p>\n </div>\n </div>\n <Badge className=\"capitalize\">{roadmap.type.toLowerCase()}</Badge>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n { label: 'Roadmap Items', value: roadmapItems.length, icon: Star },\n { label: 'Releases', value: totalReleases, icon: GitBranch },\n { label: 'Features', value: totalFeatures, icon: Map },\n { label: 'Owner', value: roadmap.ownerId, icon: Users },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <s.icon className=\"h-4 w-4\" />\n {s.label}\n </div>\n <p className=\"text-xl font-semibold mt-1\">{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>Feature Requests ({features.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {features.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No feature requests yet.</p>\n )}\n {features.map((f) => (\n <div key={f.id} className=\"flex items-center justify-between rounded-md border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{f.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n Votes: {f.voteCount} &middot; Business Value: {f.businessValue ?? 'N/A'}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\" className=\"capitalize text-xs\">\n {f.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Roadmap Items ({roadmapItems.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {roadmapItems.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No roadmap items linked.</p>\n )}\n {roadmapItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between rounded-md border p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{item.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {item.startDate\n ? new Date(item.startDate).toLocaleDateString()\n : 'No start date'}\n {' - '}\n {item.endDate ? new Date(item.endDate).toLocaleDateString() : 'No end date'}\n </p>\n </div>\n <Badge variant=\"outline\" className=\"capitalize text-xs\">\n {item.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Recent Releases</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {releases.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No releases yet.</p>\n )}\n {releases.map((r) => (\n <div key={r.id} className=\"border-b pb-2 last:border-0 last:pb-0\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{r.version}</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {r.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">{r.name}</p>\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {r.plannedDate ? new Date(r.plannedDate).toLocaleDateString() : 'No date set'}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\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\">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 <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\">Visibility</span>\n <span>{roadmap.isPublic ? 'Public' : 'Private'}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AASA,IAAM,IAAc,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;GA2BjB,IAAoC,CAAG;;;;;;;;;;;;;;;;GAkBvC,IAA4B,CAAG;;;;;;;;;;;;;;AA0CrC,SAAgB,IAAgC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,IADS,GAA2B,CACjB,MAAM,IAEzB,EACJ,SACA,YACA,aAGA,EAA8B,GAAa;EACzC,WAAW,EAAE,IAAI,GAAW;EAC5B,MAAM,CAAC;EACR,CAAC,EAEE,EACJ,MAAM,MAGN,EAA8B,GAAmC;EAC/D,WAAW;GAAE;GAAa,YAAY,EAAE,OAAO,IAAI;GAAE;EACrD,MAAM,CAAC;EACR,CAAC,EAEE,EACJ,MAAM,MAGN,EAA8B,GAA2B;EACvD,WAAW;GAAE;GAAa,YAAY,EAAE,OAAO,IAAI;GAAE;EACrD,MAAM,CAAC;EACR,CAAC;AAEJ,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAS,WAAU,8CAA+C,CAAA;EAC9D,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAsC,4BAAyB,EAAM,QAAc;;CAG5F,IAAM,IAAU,GAAM;AACtB,KAAI,CAAC,EAAS,QAAO,kBAAC,OAAD;EAAK,WAAU;YAA4B;EAAwB,CAAA;CAExF,IAAM,IAAkC,EAAQ,SAAS,EAAE,EACrD,IAAiC,GAAc,2BAA2B,SAAS,EAAE,EACrF,IAA0B,GAAc,oBAAoB,SAAS,EAAE,EACvE,IAAgB,GAAc,2BAA2B,cAAc,GACvE,IAAgB,GAAc,oBAAoB,cAAc;AAkBtE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD,EAAK,WAAW,wBApBkB;MACxC,UAAU;MACV,OAAO;MACP,UAAU;MACV,QAAQ;MACT,CAeyD,EAAQ,SAAS,iBAAmB,CAAA,EACtF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA0B,EAAQ;MAAU,CAAA,EAC1D,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAQ,eAAe;MACtB,CAAA,CACA,EAAA,CAAA,CACF;QACN,kBAAC,GAAD;KAAO,WAAU;eAAc,EAAQ,KAAK,aAAa;KAAS,CAAA,CAC9D;;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,OAAO;MAAiB,OAAO,EAAa;MAAQ,MAAM;MAAM;KAClE;MAAE,OAAO;MAAY,OAAO;MAAe,MAAM;MAAW;KAC5D;MAAE,OAAO;MAAY,OAAO;MAAe,MAAM;MAAK;KACtD;MAAE,OAAO;MAAS,OAAO,EAAQ;MAAS,MAAM;MAAO;KACxD,CAAC,KAAK,MACL,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,EAAE,MAAH,EAAQ,WAAU,WAAY,CAAA,EAC7B,EAAE,MACC;SACN,kBAAC,KAAD;MAAG,WAAU;gBAA8B,EAAE;MAAU,CAAA,CAC3C;QACT,EARI,EAAE,MAQN,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MAAW;MAAmB,EAAS;MAAO;MAAa,EAAA,CAAA,EAChD,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACG,EAAS,WAAW,KACnB,kBAAC,KAAD;OAAG,WAAU;iBAAgC;OAA4B,CAAA,EAE1E,EAAS,KAAK,MACb,kBAAC,OAAD;OAAgB,WAAU;iBAA1B,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAE;QAAU,CAAA,EAChD,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA6C;SACnC,EAAE;SAAU;SAA2B,EAAE,iBAAiB;SAChE;UACA,EAAA,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SAAO,SAAQ;SAAY,WAAU;mBAClC,EAAE,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;SACnC,CAAA;QACJ,CAAA,CACF;SAZI,EAAE,GAYN,CACN,CACU;QACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MAAW;MAAgB,EAAa;MAAO;MAAa,EAAA,CAAA,EACjD,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACG,EAAa,WAAW,KACvB,kBAAC,KAAD;OAAG,WAAU;iBAAgC;OAA4B,CAAA,EAE1E,EAAa,KAAK,MACjB,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAK;QAAU,CAAA,EACnD,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAK,YACF,IAAI,KAAK,EAAK,UAAU,CAAC,oBAAoB,GAC7C;SACH;SACA,EAAK,UAAU,IAAI,KAAK,EAAK,QAAQ,CAAC,oBAAoB,GAAG;SAC5D;UACA,EAAA,CAAA,EACN,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAK,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;QACtC,CAAA,CACJ;SAhBC,EAAK,GAgBN,CACN,CACU;QACT,EAAA,CAAA,CACH;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,mBAA2B,CAAA,EAC3B,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACG,EAAS,WAAW,KACnB,kBAAC,KAAD;OAAG,WAAU;iBAAgC;OAAoB,CAAA,EAElE,EAAS,KAAK,MACb,kBAAC,OAAD;OAAgB,WAAU;iBAA1B;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD;UAAM,WAAU;oBAAuB,EAAE;UAAe,CAAA,EACxD,kBAAC,GAAD;UAAO,SAAQ;UAAU,WAAU;oBAChC,EAAE,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;UACnC,CAAA,CACJ;;QACN,kBAAC,KAAD;SAAG,WAAU;mBAAiC,EAAE;SAAS,CAAA;QACzD,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAC/B,EAAE,cAAc,IAAI,KAAK,EAAE,YAAY,CAAC,oBAAoB,GAAG,cAC5D;;QACF;SAZI,EAAE,GAYN,CACN,CACU;QACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,WAAmB,CAAA,EACnB,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAc,CAAA,EACtD,kBAAC,QAAD,EAAA,UAAO,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB,EAAQ,CAAA,CAC3D;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAc,CAAA,EACtD,kBAAC,QAAD,EAAA,UAAO,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB,EAAQ,CAAA,CAC3D;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAY,CAAA,EACpD,kBAAC,QAAD,EAAA,UAAO,EAAQ,SAAe,CAAA,CAC1B;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAiB,CAAA,EACzD,kBAAC,QAAD,EAAA,UAAO,EAAQ,WAAW,WAAW,WAAiB,CAAA,CAClD;;OACM;QACT,EAAA,CAAA,CACH;OACF;;GACF"}
1
+ {"version":3,"file":"ProductsProductDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductDetailPagePage.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 { Package, GitBranch, Map, Star, Users, Calendar, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\n\nconst GET_ROADMAP = gql`\n query GetRoadmapDetail($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 }\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS_FOR_PRODUCT = gql`\n query ListFeatureRequestsForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n title\n description\n status\n priorityScore\n voteCount\n businessValue\n createdAt\n }\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES_FOR_PRODUCT = gql`\n query ListReleasesForProduct($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n version\n status\n plannedDate\n }\n totalCount\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}\n\ninterface FeatureRequestNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n priorityScore: number | null;\n voteCount: number;\n businessValue: number | null;\n}\n\ninterface ReleaseNode {\n id: string;\n name: string;\n version: string;\n status: string;\n plannedDate: string | null;\n}\n\nexport function ProductsProductDetailPagePage() {\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 const {\n data: featuresData,\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_FEATURE_REQUESTS_FOR_PRODUCT, {\n variables: { workspaceId, pagination: { first: 20 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\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_RELEASES_FOR_PRODUCT, {\n variables: { workspaceId, pagination: { first: 20 } },\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 product: {error.message}</div>;\n }\n\n const roadmap = data?.planmagnetRoadmap;\n if (!roadmap) return <div className=\"p-6 text-muted-foreground\">Product not found.</div>;\n\n const roadmapItems: RoadmapItemNode[] = roadmap.items ?? [];\n const features: FeatureRequestNode[] = featuresData?.planmagnetFeatureRequests?.items ?? [];\n const releases: ReleaseNode[] = releasesData?.planmagnetReleases?.items ?? [];\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeColor: Record<string, string> = {\n TIMELINE: 'bg-green-500',\n GANTT: 'bg-blue-500',\n SWIMLANE: 'bg-yellow-500',\n CUSTOM: 'bg-purple-500',\n };\n\n const statusColor: Record<string, string> = {\n SUBMITTED: 'bg-gray-100 text-gray-800',\n UNDER_REVIEW: 'bg-yellow-100 text-yellow-800',\n PLANNED: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-purple-100 text-purple-800',\n COMPLETED: 'bg-green-100 text-green-800',\n DECLINED: 'bg-red-100 text-red-800',\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className={`h-3 w-3 rounded-full ${typeColor[roadmap.type] ?? 'bg-gray-400'}`} />\n <div>\n <h1 className=\"text-2xl font-semibold\">{roadmap.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ?? 'No description'}\n </p>\n </div>\n </div>\n <Badge className=\"capitalize\">{roadmap.type.toLowerCase()}</Badge>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n { label: 'Roadmap Items', value: roadmapItems.length, icon: Star },\n { label: 'Releases', value: totalReleases, icon: GitBranch },\n { label: 'Features', value: totalFeatures, icon: Map },\n { label: 'Owner', value: roadmap.ownerId, icon: Users },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <s.icon className=\"h-4 w-4\" />\n {s.label}\n </div>\n <p className=\"text-xl font-semibold mt-1\">{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>Feature Requests ({features.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {features.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No feature requests yet.</p>\n )}\n {features.map((f) => (\n <div key={f.id} className=\"flex items-center justify-between rounded-md border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{f.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n Votes: {f.voteCount} &middot; Business Value: {f.businessValue ?? 'N/A'}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\" className=\"capitalize text-xs\">\n {f.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Roadmap Items ({roadmapItems.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {roadmapItems.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No roadmap items linked.</p>\n )}\n {roadmapItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between rounded-md border p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{item.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {item.startDate\n ? new Date(item.startDate).toLocaleDateString()\n : 'No start date'}\n {' - '}\n {item.endDate ? new Date(item.endDate).toLocaleDateString() : 'No end date'}\n </p>\n </div>\n <Badge variant=\"outline\" className=\"capitalize text-xs\">\n {item.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Recent Releases</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {releases.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No releases yet.</p>\n )}\n {releases.map((r) => (\n <div key={r.id} className=\"border-b pb-2 last:border-0 last:pb-0\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{r.version}</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {r.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">{r.name}</p>\n <div className=\"flex items-center gap-1 mt-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {r.plannedDate ? new Date(r.plannedDate).toLocaleDateString() : 'No date set'}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\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\">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 <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>\n <PersonName id={roadmap.ownerId} />\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Visibility</span>\n <span>{roadmap.isPublic ? 'Public' : 'Private'}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsProductsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"names":[],"mappings":"AAiEA,wBAAgB,wBAAwB,4CA6LvC"}
1
+ {"version":3,"file":"ProductsProductsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"names":[],"mappings":"AAkEA,wBAAgB,wBAAwB,4CA8LvC"}