@burdenoff/microfe-planmagnet 2026.930.24 → 2026.930.25

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 (61) hide show
  1. package/dist/planmagnet/comments/CommentThread.d.ts +8 -1
  2. package/dist/planmagnet/comments/CommentThread.d.ts.map +1 -1
  3. package/dist/planmagnet/comments/CommentThread.js +188 -181
  4. package/dist/planmagnet/comments/CommentThread.js.map +1 -1
  5. package/dist/planmagnet/comments/TargetComments.d.ts +10 -2
  6. package/dist/planmagnet/comments/TargetComments.d.ts.map +1 -1
  7. package/dist/planmagnet/comments/TargetComments.js +10 -8
  8. package/dist/planmagnet/comments/TargetComments.js.map +1 -1
  9. package/dist/planmagnet/comments/WorkItemComments.d.ts +7 -1
  10. package/dist/planmagnet/comments/WorkItemComments.d.ts.map +1 -1
  11. package/dist/planmagnet/comments/WorkItemComments.js +5 -4
  12. package/dist/planmagnet/comments/WorkItemComments.js.map +1 -1
  13. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.d.ts +8 -0
  14. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.d.ts.map +1 -0
  15. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +217 -0
  16. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js.map +1 -0
  17. package/dist/planmagnet/docs/DocDiffView.d.ts +26 -0
  18. package/dist/planmagnet/docs/DocDiffView.d.ts.map +1 -0
  19. package/dist/planmagnet/docs/DocDiffView.js +52 -0
  20. package/dist/planmagnet/docs/DocDiffView.js.map +1 -0
  21. package/dist/planmagnet/docs/DocSuggestionsPanel.d.ts +13 -0
  22. package/dist/planmagnet/docs/DocSuggestionsPanel.d.ts.map +1 -0
  23. package/dist/planmagnet/docs/DocSuggestionsPanel.js +308 -0
  24. package/dist/planmagnet/docs/DocSuggestionsPanel.js.map +1 -0
  25. package/dist/planmagnet/docs/DocVersionCompare.d.ts +7 -0
  26. package/dist/planmagnet/docs/DocVersionCompare.d.ts.map +1 -0
  27. package/dist/planmagnet/docs/DocVersionCompare.js +105 -0
  28. package/dist/planmagnet/docs/DocVersionCompare.js.map +1 -0
  29. package/dist/planmagnet/hooks/usePresence.d.ts +39 -0
  30. package/dist/planmagnet/hooks/usePresence.d.ts.map +1 -0
  31. package/dist/planmagnet/hooks/usePresence.js +146 -0
  32. package/dist/planmagnet/hooks/usePresence.js.map +1 -0
  33. package/dist/planmagnet/links/CodeLinksPanel.d.ts +22 -0
  34. package/dist/planmagnet/links/CodeLinksPanel.d.ts.map +1 -0
  35. package/dist/planmagnet/links/CodeLinksPanel.js +94 -0
  36. package/dist/planmagnet/links/CodeLinksPanel.js.map +1 -0
  37. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +488 -217
  39. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +136 -130
  42. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +205 -196
  45. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +194 -160
  48. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  49. package/dist/planmagnet/presence/PresenceAvatars.d.ts +16 -0
  50. package/dist/planmagnet/presence/PresenceAvatars.d.ts.map +1 -0
  51. package/dist/planmagnet/presence/PresenceAvatars.js +56 -0
  52. package/dist/planmagnet/presence/PresenceAvatars.js.map +1 -0
  53. package/dist/planmagnet/utils/graphqlErrors.d.ts +6 -0
  54. package/dist/planmagnet/utils/graphqlErrors.d.ts.map +1 -1
  55. package/dist/planmagnet/utils/graphqlErrors.js +5 -2
  56. package/dist/planmagnet/utils/graphqlErrors.js.map +1 -1
  57. package/dist/planmagnet/utils/lineDiff.d.ts +21 -0
  58. package/dist/planmagnet/utils/lineDiff.d.ts.map +1 -0
  59. package/dist/planmagnet/utils/lineDiff.js +36 -0
  60. package/dist/planmagnet/utils/lineDiff.js.map +1 -0
  61. package/package.json +1 -1
@@ -1,23 +1,25 @@
1
1
  import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
2
  import { PersonName as t } from "../people/People.js";
3
3
  import { readUrlParam as n, writeUrlParam as r } from "../utils/urlParam.js";
4
- import { PlanningFocusBadge as i, planningFocusLabel as a } from "../roadmaps/planningFocus.js";
5
- import { QuadrantBadge as o } from "../controls/PrioritizationControls.js";
6
- import { RemoveRoadmapItemButton as s, RoadmapHeaderActions as c, RoadmapItemDialog as l } from "../roadmaps/RoadmapControls.js";
7
- import { RoadmapDiscussionPanel as u, RoadmapItemCommentsButton as d } from "../comments/RoadmapComments.js";
8
- import { RoadmapNowNextLater as f } from "../roadmaps/RoadmapNowNextLater.js";
9
- import { RoadmapPresentation as p } from "../roadmaps/RoadmapPresentation.js";
10
- import { RoadmapReviewPanel as m } from "../roadmaps/RoadmapReviewPanel.js";
11
- import { RoadmapVersionsPanel as h } from "../roadmaps/RoadmapVersionsPanel.js";
12
- import { useState as g } from "react";
13
- import { Calendar as _, Loader2 as v, Map as y } from "lucide-react";
14
- import { useParams as b } from "react-router";
15
- import { gql as x } from "@apollo/client";
16
- import { useQuery as S } from "@apollo/client/react";
17
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
18
- import { Badge as T, Card as E, CardContent as D, CardHeader as O, CardTitle as k } from "@burdenoff/fe-libs/ui";
4
+ import { PresenceAvatars as i } from "../presence/PresenceAvatars.js";
5
+ import { usePresence as a } from "../hooks/usePresence.js";
6
+ import { PlanningFocusBadge as o, planningFocusLabel as s } from "../roadmaps/planningFocus.js";
7
+ import { QuadrantBadge as c } from "../controls/PrioritizationControls.js";
8
+ import { RemoveRoadmapItemButton as l, RoadmapHeaderActions as u, RoadmapItemDialog as d } from "../roadmaps/RoadmapControls.js";
9
+ import { RoadmapDiscussionPanel as f, RoadmapItemCommentsButton as p } from "../comments/RoadmapComments.js";
10
+ import { RoadmapNowNextLater as m } from "../roadmaps/RoadmapNowNextLater.js";
11
+ import { RoadmapPresentation as h } from "../roadmaps/RoadmapPresentation.js";
12
+ import { RoadmapReviewPanel as g } from "../roadmaps/RoadmapReviewPanel.js";
13
+ import { RoadmapVersionsPanel as _ } from "../roadmaps/RoadmapVersionsPanel.js";
14
+ import { useState as v } from "react";
15
+ import { Calendar as y, Loader2 as b, Map as x } from "lucide-react";
16
+ import { useParams as S } from "react-router";
17
+ import { gql as C } from "@apollo/client";
18
+ import { useQuery as w } from "@apollo/client/react";
19
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
20
+ import { Badge as D, Card as O, CardContent as k, CardHeader as A, CardTitle as j } from "@burdenoff/fe-libs/ui";
19
21
  //#region src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx
20
- var A = x`
22
+ var M = C`
21
23
  query GetRoadmapDetailPage($id: ID!) {
22
24
  planmagnetRoadmap(id: $id) {
23
25
  id
@@ -58,7 +60,7 @@ var A = x`
58
60
  }
59
61
  }
60
62
  }
61
- `, j = (e) => e === "timeline" || e === "nnl", M = {
63
+ `, N = (e) => e === "timeline" || e === "nnl", P = {
62
64
  TODO: "bg-gray-100 text-gray-800",
63
65
  IN_PROGRESS: "bg-blue-100 text-blue-800",
64
66
  DONE: "bg-green-100 text-green-800",
@@ -66,106 +68,110 @@ var A = x`
66
68
  BLOCKED: "bg-red-100 text-red-800",
67
69
  PLANNED: "bg-yellow-100 text-yellow-800"
68
70
  };
69
- function N() {
70
- let { workspaceId: x } = e(), N = b().id ?? "", [P, F] = g(() => {
71
+ function F() {
72
+ let { workspaceId: C } = e(), F = S().id ?? "", I = a("ROADMAP", F || null), [L, R] = v(() => {
71
73
  let e = n("view");
72
- return j(e) ? e : "timeline";
73
- }), I = (e) => {
74
- F(e), r("view", e === "timeline" ? null : e);
75
- }, { data: L, loading: R, error: z } = S(A, {
76
- variables: { id: N },
77
- skip: !N
74
+ return N(e) ? e : "timeline";
75
+ }), z = (e) => {
76
+ R(e), r("view", e === "timeline" ? null : e);
77
+ }, { data: B, loading: V, error: H } = w(M, {
78
+ variables: { id: F },
79
+ skip: !F
78
80
  });
79
- if (R && !L) return /* @__PURE__ */ C("div", {
81
+ if (V && !B) return /* @__PURE__ */ T("div", {
80
82
  className: "flex items-center justify-center p-12",
81
- children: /* @__PURE__ */ C(v, { className: "h-8 w-8 animate-spin text-muted-foreground" })
83
+ children: /* @__PURE__ */ T(b, { className: "h-8 w-8 animate-spin text-muted-foreground" })
82
84
  });
83
- if (z) return /* @__PURE__ */ w("div", {
85
+ if (H) return /* @__PURE__ */ E("div", {
84
86
  className: "p-6 text-destructive",
85
- children: ["Failed to load roadmap: ", z.message]
87
+ children: ["Failed to load roadmap: ", H.message]
86
88
  });
87
- let B = L?.planmagnetRoadmap;
88
- if (!B) return /* @__PURE__ */ C("div", {
89
+ let U = B?.planmagnetRoadmap;
90
+ if (!U) return /* @__PURE__ */ T("div", {
89
91
  className: "p-6 text-muted-foreground",
90
92
  children: "Roadmap not found."
91
93
  });
92
- let V = (B.items ?? []).slice().sort((e, t) => e.sortOrder - t.sortOrder), H = V.filter((e) => e.status === "COMPLETED" || e.status === "DONE"), U = V.length > 0 ? Math.round(H.length / V.length * 100) : 0, W = [...new Set(V.map((e) => e.swimlane).filter(Boolean))], G = {};
93
- for (let e of V) {
94
+ let W = (U.items ?? []).slice().sort((e, t) => e.sortOrder - t.sortOrder), G = W.filter((e) => e.status === "COMPLETED" || e.status === "DONE"), K = W.length > 0 ? Math.round(G.length / W.length * 100) : 0, q = [...new Set(W.map((e) => e.swimlane).filter(Boolean))], J = {};
95
+ for (let e of W) {
94
96
  let t = e.swimlane ?? "Uncategorized";
95
- G[t] || (G[t] = []), G[t].push(e);
97
+ J[t] || (J[t] = []), J[t].push(e);
96
98
  }
97
- return /* @__PURE__ */ w("div", {
99
+ return /* @__PURE__ */ E("div", {
98
100
  className: "space-y-6 p-6",
99
101
  children: [
100
- /* @__PURE__ */ w("div", {
102
+ /* @__PURE__ */ E("div", {
101
103
  className: "flex items-center justify-between",
102
- children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("div", {
103
- className: "flex items-center gap-2",
104
- children: [/* @__PURE__ */ C(y, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ C("h1", {
105
- className: "text-2xl font-semibold",
106
- children: B.name
107
- })]
108
- }), /* @__PURE__ */ C("p", {
109
- className: "text-sm text-muted-foreground mt-1",
110
- children: B.description ?? "No description"
111
- })] }), /* @__PURE__ */ w("div", {
104
+ children: [/* @__PURE__ */ E("div", { children: [
105
+ /* @__PURE__ */ E("div", {
106
+ className: "flex items-center gap-2",
107
+ children: [/* @__PURE__ */ T(x, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ T("h1", {
108
+ className: "text-2xl font-semibold",
109
+ children: U.name
110
+ })]
111
+ }),
112
+ /* @__PURE__ */ T("p", {
113
+ className: "text-sm text-muted-foreground mt-1",
114
+ children: U.description ?? "No description"
115
+ }),
116
+ /* @__PURE__ */ T(i, { others: I.others })
117
+ ] }), /* @__PURE__ */ E("div", {
112
118
  className: "flex flex-col items-end gap-2",
113
- children: [/* @__PURE__ */ w("div", {
119
+ children: [/* @__PURE__ */ E("div", {
114
120
  className: "flex items-center gap-2",
115
- children: [/* @__PURE__ */ C(p, {
116
- roadmapName: B.name,
117
- roadmapDescription: B.description,
118
- view: P,
119
- items: V
120
- }), /* @__PURE__ */ C(c, {
121
- roadmapId: B.id,
122
- name: B.name
121
+ children: [/* @__PURE__ */ T(h, {
122
+ roadmapName: U.name,
123
+ roadmapDescription: U.description,
124
+ view: L,
125
+ items: W
126
+ }), /* @__PURE__ */ T(u, {
127
+ roadmapId: U.id,
128
+ name: U.name
123
129
  })]
124
- }), /* @__PURE__ */ w("div", {
130
+ }), /* @__PURE__ */ E("div", {
125
131
  className: "flex gap-2",
126
- children: [/* @__PURE__ */ C(T, {
127
- variant: B.isPublic ? "default" : "secondary",
132
+ children: [/* @__PURE__ */ T(D, {
133
+ variant: U.isPublic ? "default" : "secondary",
128
134
  className: "capitalize",
129
- children: B.isPublic ? "public" : "private"
130
- }), /* @__PURE__ */ C(i, { focus: B.planningFocus })]
135
+ children: U.isPublic ? "public" : "private"
136
+ }), /* @__PURE__ */ T(o, { focus: U.planningFocus })]
131
137
  })]
132
138
  })]
133
139
  }),
134
- /* @__PURE__ */ C("div", {
140
+ /* @__PURE__ */ T("div", {
135
141
  className: "grid grid-cols-2 md:grid-cols-5 gap-4",
136
142
  children: [
137
143
  {
138
144
  label: "Progress",
139
- value: `${U}%`
145
+ value: `${K}%`
140
146
  },
141
147
  {
142
148
  label: "Total Items",
143
- value: V.length
149
+ value: W.length
144
150
  },
145
151
  {
146
152
  label: "Completed",
147
- value: H.length
153
+ value: G.length
148
154
  },
149
155
  {
150
156
  label: "Planning focus",
151
- value: a(B.planningFocus)
157
+ value: s(U.planningFocus)
152
158
  },
153
159
  {
154
160
  label: "Visibility",
155
- value: B.isPublic ? "Public" : "Private"
161
+ value: U.isPublic ? "Public" : "Private"
156
162
  }
157
- ].map((e) => /* @__PURE__ */ C(E, { children: /* @__PURE__ */ w(D, {
163
+ ].map((e) => /* @__PURE__ */ T(O, { children: /* @__PURE__ */ E(k, {
158
164
  className: "pt-4 text-center",
159
- children: [/* @__PURE__ */ C("p", {
165
+ children: [/* @__PURE__ */ T("p", {
160
166
  className: "text-xs text-muted-foreground",
161
167
  children: e.label
162
- }), /* @__PURE__ */ C("p", {
168
+ }), /* @__PURE__ */ T("p", {
163
169
  className: "text-lg font-semibold capitalize",
164
170
  children: e.value
165
171
  })]
166
172
  }) }, e.label))
167
173
  }),
168
- /* @__PURE__ */ C("div", {
174
+ /* @__PURE__ */ T("div", {
169
175
  className: "flex items-center gap-2",
170
176
  role: "group",
171
177
  "aria-label": "Roadmap view",
@@ -176,68 +182,68 @@ function N() {
176
182
  }, {
177
183
  key: "nnl",
178
184
  label: "Now / Next / Later"
179
- }].map((e) => /* @__PURE__ */ C("button", {
185
+ }].map((e) => /* @__PURE__ */ T("button", {
180
186
  type: "button",
181
- "aria-pressed": P === e.key,
182
- onClick: () => I(e.key),
183
- className: `px-2 py-1 text-xs rounded-md ${P === e.key ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
187
+ "aria-pressed": L === e.key,
188
+ onClick: () => z(e.key),
189
+ className: `px-2 py-1 text-xs rounded-md ${L === e.key ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
184
190
  children: e.label
185
191
  }, e.key))
186
192
  }),
187
- P === "nnl" && /* @__PURE__ */ C(f, { roadmapId: B.id }),
188
- P === "timeline" && /* @__PURE__ */ w("div", {
193
+ L === "nnl" && /* @__PURE__ */ T(m, { roadmapId: U.id }),
194
+ L === "timeline" && /* @__PURE__ */ E("div", {
189
195
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
190
- children: [/* @__PURE__ */ w("div", {
196
+ children: [/* @__PURE__ */ E("div", {
191
197
  className: "lg:col-span-2 space-y-6",
192
198
  children: [
193
- /* @__PURE__ */ w(E, { children: [/* @__PURE__ */ w(O, {
199
+ /* @__PURE__ */ E(O, { children: [/* @__PURE__ */ E(A, {
194
200
  className: "flex flex-row items-center justify-between gap-2",
195
- children: [/* @__PURE__ */ C(k, { children: "Progress Overview" }), /* @__PURE__ */ C(l, {
196
- roadmapId: B.id,
197
- lanes: W
201
+ children: [/* @__PURE__ */ T(j, { children: "Progress Overview" }), /* @__PURE__ */ T(d, {
202
+ roadmapId: U.id,
203
+ lanes: q
198
204
  })]
199
- }), /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w("div", {
205
+ }), /* @__PURE__ */ E(k, { children: [/* @__PURE__ */ E("div", {
200
206
  className: "flex justify-between text-sm mb-2",
201
- children: [/* @__PURE__ */ C("span", {
207
+ children: [/* @__PURE__ */ T("span", {
202
208
  className: "text-muted-foreground",
203
209
  children: "Overall Completion"
204
- }), /* @__PURE__ */ w("span", {
210
+ }), /* @__PURE__ */ E("span", {
205
211
  className: "font-medium",
206
- children: [U, "%"]
212
+ children: [K, "%"]
207
213
  })]
208
- }), /* @__PURE__ */ C("div", {
214
+ }), /* @__PURE__ */ T("div", {
209
215
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
210
- children: /* @__PURE__ */ C("div", {
216
+ children: /* @__PURE__ */ T("div", {
211
217
  className: "h-full bg-primary rounded-full transition-all",
212
- style: { width: `${U}%` }
218
+ style: { width: `${K}%` }
213
219
  })
214
220
  })] })] }),
215
- V.length === 0 && /* @__PURE__ */ w("p", {
221
+ W.length === 0 && /* @__PURE__ */ E("p", {
216
222
  className: "rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground",
217
223
  children: [
218
224
  "This roadmap has no items yet. Use ",
219
- /* @__PURE__ */ C("span", {
225
+ /* @__PURE__ */ T("span", {
220
226
  className: "font-medium",
221
227
  children: "Add item"
222
228
  }),
223
229
  " to plan the first one."
224
230
  ]
225
231
  }),
226
- Object.entries(G).map(([e, t]) => /* @__PURE__ */ w(E, { children: [/* @__PURE__ */ C(O, { children: /* @__PURE__ */ w(k, { children: [
232
+ Object.entries(J).map(([e, t]) => /* @__PURE__ */ E(O, { children: [/* @__PURE__ */ T(A, { children: /* @__PURE__ */ E(j, { children: [
227
233
  e,
228
234
  " (",
229
235
  t.length,
230
236
  ")"
231
- ] }) }), /* @__PURE__ */ C(D, {
237
+ ] }) }), /* @__PURE__ */ T(k, {
232
238
  className: "space-y-3",
233
- children: t.map((e) => /* @__PURE__ */ w("div", {
239
+ children: t.map((e) => /* @__PURE__ */ E("div", {
234
240
  className: "flex items-center justify-between border rounded-md p-3",
235
- children: [/* @__PURE__ */ w("div", { children: [
236
- /* @__PURE__ */ C("p", {
241
+ children: [/* @__PURE__ */ E("div", { children: [
242
+ /* @__PURE__ */ T("p", {
237
243
  className: "text-sm font-medium",
238
244
  children: e.title
239
245
  }),
240
- e.featureRequestDemand && e.featureRequestDemand.requests > 0 && /* @__PURE__ */ w("p", {
246
+ e.featureRequestDemand && e.featureRequestDemand.requests > 0 && /* @__PURE__ */ E("p", {
241
247
  className: "text-xs text-muted-foreground",
242
248
  "data-testid": "roadmap-item-demand",
243
249
  children: [
@@ -251,45 +257,45 @@ function N() {
251
257
  e.featureRequestDemand.votes === 1 ? "" : "s"
252
258
  ]
253
259
  }),
254
- e.description && /* @__PURE__ */ C("p", {
260
+ e.description && /* @__PURE__ */ T("p", {
255
261
  className: "text-xs text-muted-foreground",
256
262
  children: e.description.length > 60 ? `${e.description.slice(0, 60)}…` : e.description
257
263
  }),
258
- (e.startDate || e.endDate) && /* @__PURE__ */ w("div", {
264
+ (e.startDate || e.endDate) && /* @__PURE__ */ E("div", {
259
265
  className: "flex items-center gap-1 mt-1 text-xs text-muted-foreground",
260
266
  children: [
261
- /* @__PURE__ */ C(_, { className: "h-3 w-3" }),
267
+ /* @__PURE__ */ T(y, { className: "h-3 w-3" }),
262
268
  e.startDate ? new Date(e.startDate).toLocaleDateString() : "?",
263
269
  " - ",
264
270
  e.endDate ? new Date(e.endDate).toLocaleDateString() : "?"
265
271
  ]
266
272
  })
267
- ] }), /* @__PURE__ */ w("div", {
273
+ ] }), /* @__PURE__ */ E("div", {
268
274
  className: "flex items-center gap-2",
269
275
  children: [
270
- e.color && /* @__PURE__ */ C("div", {
276
+ e.color && /* @__PURE__ */ T("div", {
271
277
  className: "h-3 w-3 rounded-full",
272
278
  style: { backgroundColor: e.color }
273
279
  }),
274
- /* @__PURE__ */ C("span", {
275
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${M[e.status] ?? "bg-gray-100"}`,
280
+ /* @__PURE__ */ T("span", {
281
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${P[e.status] ?? "bg-gray-100"}`,
276
282
  children: e.status.toLowerCase().replace("_", " ")
277
283
  }),
278
- /* @__PURE__ */ C(o, {
284
+ /* @__PURE__ */ T(c, {
279
285
  quadrant: e.valueEffortQuadrant,
280
286
  hideWhenUnscored: !0
281
287
  }),
282
- /* @__PURE__ */ C(d, {
283
- roadmapId: B.id,
288
+ /* @__PURE__ */ T(p, {
289
+ roadmapId: U.id,
284
290
  itemId: e.id,
285
291
  itemTitle: e.title
286
292
  }),
287
- /* @__PURE__ */ C(l, {
288
- roadmapId: B.id,
293
+ /* @__PURE__ */ T(d, {
294
+ roadmapId: U.id,
289
295
  item: e,
290
- lanes: W
296
+ lanes: q
291
297
  }),
292
- /* @__PURE__ */ C(s, {
298
+ /* @__PURE__ */ T(l, {
293
299
  id: e.id,
294
300
  title: e.title
295
301
  })
@@ -298,57 +304,57 @@ function N() {
298
304
  }, e.id))
299
305
  })] }, e))
300
306
  ]
301
- }), /* @__PURE__ */ C("div", {
307
+ }), /* @__PURE__ */ T("div", {
302
308
  className: "space-y-6",
303
- children: /* @__PURE__ */ w(E, { children: [/* @__PURE__ */ C(O, { children: /* @__PURE__ */ C(k, { children: "Details" }) }), /* @__PURE__ */ w(D, {
309
+ children: /* @__PURE__ */ E(O, { children: [/* @__PURE__ */ T(A, { children: /* @__PURE__ */ T(j, { children: "Details" }) }), /* @__PURE__ */ E(k, {
304
310
  className: "space-y-2 text-sm",
305
311
  children: [
306
- /* @__PURE__ */ w("div", {
312
+ /* @__PURE__ */ E("div", {
307
313
  className: "flex justify-between",
308
- children: [/* @__PURE__ */ C("span", {
314
+ children: [/* @__PURE__ */ T("span", {
309
315
  className: "text-muted-foreground",
310
316
  children: "Planning focus"
311
- }), /* @__PURE__ */ C(i, { focus: B.planningFocus })]
317
+ }), /* @__PURE__ */ T(o, { focus: U.planningFocus })]
312
318
  }),
313
- /* @__PURE__ */ w("div", {
319
+ /* @__PURE__ */ E("div", {
314
320
  className: "flex justify-between",
315
- children: [/* @__PURE__ */ C("span", {
321
+ children: [/* @__PURE__ */ T("span", {
316
322
  className: "text-muted-foreground",
317
323
  children: "Owner"
318
- }), /* @__PURE__ */ C("span", { children: /* @__PURE__ */ C(t, { id: B.ownerId }) })]
324
+ }), /* @__PURE__ */ T("span", { children: /* @__PURE__ */ T(t, { id: U.ownerId }) })]
319
325
  }),
320
- /* @__PURE__ */ w("div", {
326
+ /* @__PURE__ */ E("div", {
321
327
  className: "flex justify-between",
322
- children: [/* @__PURE__ */ C("span", {
328
+ children: [/* @__PURE__ */ T("span", {
323
329
  className: "text-muted-foreground",
324
330
  children: "Created"
325
- }), /* @__PURE__ */ C("span", { children: new Date(B.createdAt).toLocaleDateString() })]
331
+ }), /* @__PURE__ */ T("span", { children: new Date(U.createdAt).toLocaleDateString() })]
326
332
  }),
327
- /* @__PURE__ */ w("div", {
333
+ /* @__PURE__ */ E("div", {
328
334
  className: "flex justify-between",
329
- children: [/* @__PURE__ */ C("span", {
335
+ children: [/* @__PURE__ */ T("span", {
330
336
  className: "text-muted-foreground",
331
337
  children: "Updated"
332
- }), /* @__PURE__ */ C("span", { children: new Date(B.updatedAt).toLocaleDateString() })]
338
+ }), /* @__PURE__ */ T("span", { children: new Date(U.updatedAt).toLocaleDateString() })]
333
339
  })
334
340
  ]
335
341
  })] })
336
342
  })]
337
343
  }),
338
- /* @__PURE__ */ w("div", {
344
+ /* @__PURE__ */ E("div", {
339
345
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
340
- children: [/* @__PURE__ */ C("div", {
346
+ children: [/* @__PURE__ */ T("div", {
341
347
  className: "lg:col-span-2",
342
- children: /* @__PURE__ */ C(u, { roadmapId: B.id })
343
- }), /* @__PURE__ */ w("div", {
348
+ children: /* @__PURE__ */ T(f, { roadmapId: U.id })
349
+ }), /* @__PURE__ */ E("div", {
344
350
  className: "space-y-6",
345
- children: [/* @__PURE__ */ C(m, { roadmapId: B.id }), /* @__PURE__ */ C(h, { roadmapId: B.id })]
351
+ children: [/* @__PURE__ */ T(g, { roadmapId: U.id }), /* @__PURE__ */ T(_, { roadmapId: U.id })]
346
352
  })]
347
353
  })
348
354
  ]
349
355
  });
350
356
  }
351
357
  //#endregion
352
- export { N as ProductsRoadmapDetailPagePage };
358
+ export { F as ProductsRoadmapDetailPagePage };
353
359
 
354
360
  //# sourceMappingURL=ProductsRoadmapDetailPagePage.js.map
@@ -1 +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 { useState } from 'react';\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';\nimport { PersonName } from '../people/People';\nimport { PlanningFocusBadge, planningFocusLabel } from '../roadmaps/planningFocus';\nimport {\n RemoveRoadmapItemButton,\n RoadmapHeaderActions,\n RoadmapItemDialog,\n} from '../roadmaps/RoadmapControls';\nimport { RoadmapNowNextLater } from '../roadmaps/RoadmapNowNextLater';\nimport { RoadmapPresentation } from '../roadmaps/RoadmapPresentation';\nimport { RoadmapReviewPanel } from '../roadmaps/RoadmapReviewPanel';\nimport { RoadmapVersionsPanel } from '../roadmaps/RoadmapVersionsPanel';\nimport { RoadmapDiscussionPanel, RoadmapItemCommentsButton } from '../comments/RoadmapComments';\nimport { readUrlParam, writeUrlParam } from '../utils/urlParam';\nimport { QuadrantBadge } from '../controls/PrioritizationControls';\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 planningFocus\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 horizon\n confidence\n riskLevel\n riskNote\n moscow\n kano\n valueScore\n effortScore\n valueEffortQuadrant\n featureRequestDemand {\n requests\n votes\n }\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 /** Now/Next/Later placement (PRM-06) — read here only to hand off to `RoadmapItemDialog`'s edit form; the\n * Now/Next/Later view itself reads and writes these through its own query/mutation, not this one. */\n horizon: string | null;\n confidence: number | null;\n riskLevel: string | null;\n riskNote: string | null;\n /** PRM-27 — read here only to show on the row and hand off to RoadmapItemDialog's edit form. */\n moscow: string | null;\n kano: string | null;\n valueScore: number | null;\n effortScore: number | null;\n valueEffortQuadrant: string | null;\n featureRequestDemand: { requests: number; votes: number } | null;\n}\n\ntype RoadmapView = 'timeline' | 'nnl';\nconst isRoadmapView = (v: string | null): v is RoadmapView => v === 'timeline' || v === 'nnl';\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 // Timeline | Now-Next-Later (PRM-06): persisted in the URL (`?view=nnl`) so the applied view is linkable and\n // survives a reload, without touching the host shell's own router — same technique as\n // `board/boardViewConfig.ts`'s `?view=` for saved board views (see `utils/urlParam.ts`).\n const [view, setViewState] = useState<RoadmapView>(() => {\n const fromUrl = readUrlParam('view');\n return isRoadmapView(fromUrl) ? fromUrl : 'timeline';\n });\n const setView = (next: RoadmapView) => {\n setViewState(next);\n writeUrlParam('view', next === 'timeline' ? null : next);\n };\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 // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\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 const lanes = [...new Set(items.map((i) => i.swimlane).filter(Boolean))] as string[];\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 flex-col items-end gap-2\">\n <div className=\"flex items-center gap-2\">\n {/* PRM-11: reuses this same `items` list (already carries horizon/confidence/risk/dates) rather\n than firing a query of its own. */}\n <RoadmapPresentation\n roadmapName={roadmap.name}\n roadmapDescription={roadmap.description}\n view={view}\n items={items}\n />\n <RoadmapHeaderActions roadmapId={roadmap.id} name={roadmap.name} />\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 <PlanningFocusBadge focus={roadmap.planningFocus} />\n </div>\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: 'Planning focus', value: planningFocusLabel(roadmap.planningFocus) },\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\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label=\"Roadmap view\"\n data-testid=\"roadmap-view-toggle\"\n >\n {(\n [\n { key: 'timeline', label: 'Timeline' },\n { key: 'nnl', label: 'Now / Next / Later' },\n ] as const\n ).map((v) => (\n <button\n key={v.key}\n type=\"button\"\n aria-pressed={view === v.key}\n onClick={() => setView(v.key)}\n className={`px-2 py-1 text-xs rounded-md ${view === v.key ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {v.label}\n </button>\n ))}\n </div>\n\n {view === 'nnl' && <RoadmapNowNextLater roadmapId={roadmap.id} />}\n\n {view === 'timeline' && (\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 className=\"flex flex-row items-center justify-between gap-2\">\n <CardTitle>Progress Overview</CardTitle>\n <RoadmapItemDialog roadmapId={roadmap.id} lanes={lanes} />\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 {items.length === 0 && (\n <p className=\"rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground\">\n This roadmap has no items yet. Use <span className=\"font-medium\">Add item</span> to\n plan the first one.\n </p>\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 {/* PRM-24: demand behind the initiative, counted by the server. */}\n {item.featureRequestDemand && item.featureRequestDemand.requests > 0 && (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"roadmap-item-demand\"\n >\n {item.featureRequestDemand.requests} feature request\n {item.featureRequestDemand.requests === 1 ? '' : 's'} ·{' '}\n {item.featureRequestDemand.votes} vote\n {item.featureRequestDemand.votes === 1 ? '' : 's'}\n </p>\n )}\n {item.description && (\n <p className=\"text-xs text-muted-foreground\">\n {item.description.length > 60\n ? `${item.description.slice(0, 60)}…`\n : item.description}\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 {/* PRM-27 — read back from the server; hidden for the common case of an unscored item. */}\n <QuadrantBadge quadrant={item.valueEffortQuadrant} hideWhenUnscored />\n <RoadmapItemCommentsButton\n roadmapId={roadmap.id}\n itemId={item.id}\n itemTitle={item.title}\n />\n <RoadmapItemDialog roadmapId={roadmap.id} item={item} lanes={lanes} />\n <RemoveRoadmapItemButton id={item.id} title={item.title} />\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\">Planning focus</span>\n <PlanningFocusBadge focus={roadmap.planningFocus} />\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\">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 )}\n\n {/* PRM-11: collaboration (discussion, review, versions) is roadmap-level state, not tied to either view\n above — shown regardless of the Timeline/Now-Next-Later toggle. */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2\">\n <RoadmapDiscussionPanel roadmapId={roadmap.id} />\n </div>\n <div className=\"space-y-6\">\n <RoadmapReviewPanel roadmapId={roadmap.id} />\n <RoadmapVersionsPanel roadmapId={roadmap.id} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,IAAM,IAAc,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEjB,KAAiB,MAAuC,MAAM,cAAc,MAAM,OAElF,IAAsC;CAC1C,MAAM;CACN,aAAa;CACb,MAAM;CACN,WAAW;CACX,SAAS;CACT,SAAS;CACV;AAED,SAAgB,IAAgC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,IADS,GAA2B,CACjB,MAAM,IAIzB,CAAC,GAAM,KAAgB,QAA4B;EACvD,IAAM,IAAU,EAAa,OAAO;AACpC,SAAO,EAAc,EAAQ,GAAG,IAAU;GAC1C,EACI,KAAW,MAAsB;AAErC,EADA,EAAa,EAAK,EAClB,EAAc,QAAQ,MAAS,aAAa,OAAO,EAAK;IAGpD,EACJ,SACA,YACA,aAGA,EAA8B,GAAa;EACzC,WAAW,EAAE,IAAI,GAAW;EAC5B,MAAM,CAAC;EACR,CAAC;AAMJ,KAAI,KAAW,CAAC,EACd,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,KAA4B,EAAQ,SAAS,EAAE,EAClD,OAAO,CACP,MAAM,GAAoB,MAAuB,EAAE,YAAY,EAAE,UAAU,EACxE,IAAiB,EAAM,QAAQ,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,OAAO,EACrF,IAAW,EAAM,SAAS,IAAI,KAAK,MAAO,EAAe,SAAS,EAAM,SAAU,IAAI,GAAG,GAEzF,IAAQ,CAAC,GAAG,IAAI,IAAI,EAAM,KAAK,MAAM,EAAE,SAAS,CAAC,OAAO,QAAQ,CAAC,CAAC,EAGlE,IAAoD,EAAE;AAC5D,MAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAO,EAAK,YAAY;AAE9B,EADK,EAAe,OAAO,EAAe,KAAQ,EAAE,GACpD,EAAe,GAAM,KAAK,EAAK;;AAGjC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAK,WAAU,wBAAyB,CAAA,EACxC,kBAAC,MAAD;MAAI,WAAU;gBAA0B,EAAQ;MAAU,CAAA,CACtD;QACN,kBAAC,KAAD;KAAG,WAAU;eACV,EAAQ,eAAe;KACtB,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAGE,kBAAC,GAAD;OACE,aAAa,EAAQ;OACrB,oBAAoB,EAAQ;OACtB;OACC;OACP,CAAA,EACF,kBAAC,GAAD;OAAsB,WAAW,EAAQ;OAAI,MAAM,EAAQ;OAAQ,CAAA,CAC/D;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAS,EAAQ,WAAW,YAAY;OAAa,WAAU;iBACnE,EAAQ,WAAW,WAAW;OACzB,CAAA,EACR,kBAAC,GAAD,EAAoB,OAAO,EAAQ,eAAiB,CAAA,CAChD;QACF;OACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,OAAO;MAAY,OAAO,GAAG,EAAS;MAAI;KAC5C;MAAE,OAAO;MAAe,OAAO,EAAM;MAAQ;KAC7C;MAAE,OAAO;MAAa,OAAO,EAAe;MAAQ;KACpD;MAAE,OAAO;MAAkB,OAAO,EAAmB,EAAQ,cAAc;MAAE;KAC7E;MAAE,OAAO;MAAc,OAAO,EAAQ,WAAW,WAAW;MAAW;KACxE,CAAC,KAAK,MACL,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAiC,EAAE;MAAU,CAAA,EAC1D,kBAAC,KAAD;MAAG,WAAU;gBAAoC,EAAE;MAAU,CAAA,CACjD;QACT,EALI,EAAE,MAKN,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,cAAW;IACX,eAAY;cAGV,CACE;KAAE,KAAK;KAAY,OAAO;KAAY,EACtC;KAAE,KAAK;KAAO,OAAO;KAAsB,CAC5C,CACD,KAAK,MACL,kBAAC,UAAD;KAEE,MAAK;KACL,gBAAc,MAAS,EAAE;KACzB,eAAe,EAAQ,EAAE,IAAI;KAC7B,WAAW,gCAAgC,MAAS,EAAE,MAAM,uCAAuC;eAElG,EAAE;KACI,EAPF,EAAE,IAOA,CACT;IACE,CAAA;GAEL,MAAS,SAAS,kBAAC,GAAD,EAAqB,WAAW,EAAQ,IAAM,CAAA;GAEhE,MAAS,cACR,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD,EAAA,UAAW,qBAA6B,CAAA,EACxC,kBAAC,GAAD;QAAmB,WAAW,EAAQ;QAAW;QAAS,CAAA,CAC/C;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAwB;QAAyB,CAAA,EACjE,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAA+B,GAAS,IAAQ;UAC5C;UACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,OAAD;QACE,WAAU;QACV,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;QAChC,CAAA;OACE,CAAA,CACM,EAAA,CAAA,CACT,EAAA,CAAA;MAEN,EAAM,WAAW,KAChB,kBAAC,KAAD;OAAG,WAAU;iBAAb;QAA6F;QACxD,kBAAC,QAAD;SAAM,WAAU;mBAAc;SAAe,CAAA;;QAE9E;;MAEL,OAAO,QAAQ,EAAe,CAAC,KAAK,CAAC,GAAM,OAC1C,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;OACG;OAAK;OAAG,EAAU;OAAO;OAChB,EAAA,CAAA,EACD,CAAA,EACb,kBAAC,GAAD;OAAa,WAAU;iBACpB,EAAU,KAAK,MACd,kBAAC,OAAD;QAEE,WAAU;kBAFZ,CAIE,kBAAC,OAAD,EAAA,UAAA;SACE,kBAAC,KAAD;UAAG,WAAU;oBAAuB,EAAK;UAAU,CAAA;SAElD,EAAK,wBAAwB,EAAK,qBAAqB,WAAW,KACjE,kBAAC,KAAD;UACE,WAAU;UACV,eAAY;oBAFd;WAIG,EAAK,qBAAqB;WAAS;WACnC,EAAK,qBAAqB,aAAa,IAAI,KAAK;WAAI;WAAG;WACvD,EAAK,qBAAqB;WAAM;WAChC,EAAK,qBAAqB,UAAU,IAAI,KAAK;WAC5C;;SAEL,EAAK,eACJ,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAK,YAAY,SAAS,KACvB,GAAG,EAAK,YAAY,MAAM,GAAG,GAAG,CAAC,KACjC,EAAK;UACP,CAAA;UAEJ,EAAK,aAAa,EAAK,YACvB,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;WAC/B,EAAK,YAAY,IAAI,KAAK,EAAK,UAAU,CAAC,oBAAoB,GAAG;WACjE;WACA,EAAK,UAAU,IAAI,KAAK,EAAK,QAAQ,CAAC,oBAAoB,GAAG;WAC1D;;SAEJ,EAAA,CAAA,EACN,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACG,EAAK,SACJ,kBAAC,OAAD;WACE,WAAU;WACV,OAAO,EAAE,iBAAiB,EAAK,OAAO;WACtC,CAAA;UAEJ,kBAAC,QAAD;WACE,WAAW,+CAA+C,EAAY,EAAK,WAAW;qBAErF,EAAK,OAAO,aAAa,CAAC,QAAQ,KAAK,IAAI;WACvC,CAAA;UAEP,kBAAC,GAAD;WAAe,UAAU,EAAK;WAAqB,kBAAA;WAAmB,CAAA;UACtE,kBAAC,GAAD;WACE,WAAW,EAAQ;WACnB,QAAQ,EAAK;WACb,WAAW,EAAK;WAChB,CAAA;UACF,kBAAC,GAAD;WAAmB,WAAW,EAAQ;WAAU;WAAa;WAAS,CAAA;UACtE,kBAAC,GAAD;WAAyB,IAAI,EAAK;WAAI,OAAO,EAAK;WAAS,CAAA;UACvD;WACF;UAvDC,EAAK,GAuDN,CACN;OACU,CAAA,CACT,EAAA,EAnEI,EAmEJ,CACP;MACE;QAEN,kBAAC,OAAD;KAAK,WAAU;eACb,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;SAAqB,CAAA,EAC7D,kBAAC,GAAD,EAAoB,OAAO,EAAQ,eAAiB,CAAA,CAChD;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAY,CAAA,EACpD,kBAAC,QAAD,EAAA,UACE,kBAAC,GAAD,EAAY,IAAI,EAAQ,SAAW,CAAA,EAC9B,CAAA,CACH;;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;SAAc,CAAA,EACtD,kBAAC,QAAD,EAAA,UAAO,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB,EAAQ,CAAA,CAC3D;;OACM;QACT,EAAA,CAAA;KACH,CAAA,CACF;;GAKR,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAwB,WAAW,EAAQ,IAAM,CAAA;KAC7C,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAoB,WAAW,EAAQ,IAAM,CAAA,EAC7C,kBAAC,GAAD,EAAsB,WAAW,EAAQ,IAAM,CAAA,CAC3C;OACF;;GACF"}
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 { useState } from 'react';\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';\nimport { PersonName } from '../people/People';\nimport { PlanningFocusBadge, planningFocusLabel } from '../roadmaps/planningFocus';\nimport {\n RemoveRoadmapItemButton,\n RoadmapHeaderActions,\n RoadmapItemDialog,\n} from '../roadmaps/RoadmapControls';\nimport { RoadmapNowNextLater } from '../roadmaps/RoadmapNowNextLater';\nimport { RoadmapPresentation } from '../roadmaps/RoadmapPresentation';\nimport { RoadmapReviewPanel } from '../roadmaps/RoadmapReviewPanel';\nimport { RoadmapVersionsPanel } from '../roadmaps/RoadmapVersionsPanel';\nimport { RoadmapDiscussionPanel, RoadmapItemCommentsButton } from '../comments/RoadmapComments';\nimport { readUrlParam, writeUrlParam } from '../utils/urlParam';\nimport { QuadrantBadge } from '../controls/PrioritizationControls';\nimport { usePresence } from '../hooks/usePresence';\nimport { PresenceAvatars } from '../presence/PresenceAvatars';\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 planningFocus\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 horizon\n confidence\n riskLevel\n riskNote\n moscow\n kano\n valueScore\n effortScore\n valueEffortQuadrant\n featureRequestDemand {\n requests\n votes\n }\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 /** Now/Next/Later placement (PRM-06) — read here only to hand off to `RoadmapItemDialog`'s edit form; the\n * Now/Next/Later view itself reads and writes these through its own query/mutation, not this one. */\n horizon: string | null;\n confidence: number | null;\n riskLevel: string | null;\n riskNote: string | null;\n /** PRM-27 — read here only to show on the row and hand off to RoadmapItemDialog's edit form. */\n moscow: string | null;\n kano: string | null;\n valueScore: number | null;\n effortScore: number | null;\n valueEffortQuadrant: string | null;\n featureRequestDemand: { requests: number; votes: number } | null;\n}\n\ntype RoadmapView = 'timeline' | 'nnl';\nconst isRoadmapView = (v: string | null): v is RoadmapView => v === 'timeline' || v === 'nnl';\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 // CWF-24: who else is looking at this roadmap right now.\n const presence = usePresence('ROADMAP', roadmapId || null);\n // Timeline | Now-Next-Later (PRM-06): persisted in the URL (`?view=nnl`) so the applied view is linkable and\n // survives a reload, without touching the host shell's own router — same technique as\n // `board/boardViewConfig.ts`'s `?view=` for saved board views (see `utils/urlParam.ts`).\n const [view, setViewState] = useState<RoadmapView>(() => {\n const fromUrl = readUrlParam('view');\n return isRoadmapView(fromUrl) ? fromUrl : 'timeline';\n });\n const setView = (next: RoadmapView) => {\n setViewState(next);\n writeUrlParam('view', next === 'timeline' ? null : next);\n };\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 // Only before the first load: a refetch must not blank the page (it\n\n // unmounts every component on it and loses their state).\n\n if (loading && !data) {\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 const lanes = [...new Set(items.map((i) => i.swimlane).filter(Boolean))] as string[];\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 <PresenceAvatars others={presence.others} />\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex items-center gap-2\">\n {/* PRM-11: reuses this same `items` list (already carries horizon/confidence/risk/dates) rather\n than firing a query of its own. */}\n <RoadmapPresentation\n roadmapName={roadmap.name}\n roadmapDescription={roadmap.description}\n view={view}\n items={items}\n />\n <RoadmapHeaderActions roadmapId={roadmap.id} name={roadmap.name} />\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 <PlanningFocusBadge focus={roadmap.planningFocus} />\n </div>\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: 'Planning focus', value: planningFocusLabel(roadmap.planningFocus) },\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\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label=\"Roadmap view\"\n data-testid=\"roadmap-view-toggle\"\n >\n {(\n [\n { key: 'timeline', label: 'Timeline' },\n { key: 'nnl', label: 'Now / Next / Later' },\n ] as const\n ).map((v) => (\n <button\n key={v.key}\n type=\"button\"\n aria-pressed={view === v.key}\n onClick={() => setView(v.key)}\n className={`px-2 py-1 text-xs rounded-md ${view === v.key ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {v.label}\n </button>\n ))}\n </div>\n\n {view === 'nnl' && <RoadmapNowNextLater roadmapId={roadmap.id} />}\n\n {view === 'timeline' && (\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 className=\"flex flex-row items-center justify-between gap-2\">\n <CardTitle>Progress Overview</CardTitle>\n <RoadmapItemDialog roadmapId={roadmap.id} lanes={lanes} />\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 {items.length === 0 && (\n <p className=\"rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground\">\n This roadmap has no items yet. Use <span className=\"font-medium\">Add item</span> to\n plan the first one.\n </p>\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 {/* PRM-24: demand behind the initiative, counted by the server. */}\n {item.featureRequestDemand && item.featureRequestDemand.requests > 0 && (\n <p\n className=\"text-xs text-muted-foreground\"\n data-testid=\"roadmap-item-demand\"\n >\n {item.featureRequestDemand.requests} feature request\n {item.featureRequestDemand.requests === 1 ? '' : 's'} ·{' '}\n {item.featureRequestDemand.votes} vote\n {item.featureRequestDemand.votes === 1 ? '' : 's'}\n </p>\n )}\n {item.description && (\n <p className=\"text-xs text-muted-foreground\">\n {item.description.length > 60\n ? `${item.description.slice(0, 60)}…`\n : item.description}\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 {/* PRM-27 — read back from the server; hidden for the common case of an unscored item. */}\n <QuadrantBadge quadrant={item.valueEffortQuadrant} hideWhenUnscored />\n <RoadmapItemCommentsButton\n roadmapId={roadmap.id}\n itemId={item.id}\n itemTitle={item.title}\n />\n <RoadmapItemDialog roadmapId={roadmap.id} item={item} lanes={lanes} />\n <RemoveRoadmapItemButton id={item.id} title={item.title} />\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\">Planning focus</span>\n <PlanningFocusBadge focus={roadmap.planningFocus} />\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\">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 )}\n\n {/* PRM-11: collaboration (discussion, review, versions) is roadmap-level state, not tied to either view\n above — shown regardless of the Timeline/Now-Next-Later toggle. */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2\">\n <RoadmapDiscussionPanel roadmapId={roadmap.id} />\n </div>\n <div className=\"space-y-6\">\n <RoadmapReviewPanel roadmapId={roadmap.id} />\n <RoadmapVersionsPanel roadmapId={roadmap.id} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsProjectDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"names":[],"mappings":"AAiIA,wBAAgB,6BAA6B,4CAmkB5C"}
1
+ {"version":3,"file":"ProjectsProjectDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"names":[],"mappings":"AAmIA,wBAAgB,6BAA6B,4CAskB5C"}