@burdenoff/microfe-planmagnet 2026.930.22 → 2026.930.24

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 (68) hide show
  1. package/dist/index.js +6 -5
  2. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  3. package/dist/planmagnet/PlanMagnetRoot.js +154 -147
  4. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  6. package/dist/planmagnet/PlanMagnetRoutes.js +66 -62
  7. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  8. package/dist/planmagnet/controls/FeatureControls.d.ts +11 -0
  9. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -1
  10. package/dist/planmagnet/controls/FeatureControls.js +305 -135
  11. package/dist/planmagnet/controls/FeatureControls.js.map +1 -1
  12. package/dist/planmagnet/controls/Pickers.d.ts +18 -0
  13. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  14. package/dist/planmagnet/controls/Pickers.js +78 -1
  15. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  16. package/dist/planmagnet/controls/PrioritizationControls.d.ts +72 -0
  17. package/dist/planmagnet/controls/PrioritizationControls.d.ts.map +1 -0
  18. package/dist/planmagnet/controls/PrioritizationControls.js +246 -0
  19. package/dist/planmagnet/controls/PrioritizationControls.js.map +1 -0
  20. package/dist/planmagnet/dependency/DependencyGraph.d.ts.map +1 -1
  21. package/dist/planmagnet/dependency/DependencyGraph.js +5 -2
  22. package/dist/planmagnet/dependency/DependencyGraph.js.map +1 -1
  23. package/dist/planmagnet/dependency/GanttChart.d.ts.map +1 -1
  24. package/dist/planmagnet/dependency/GanttChart.js +11 -5
  25. package/dist/planmagnet/dependency/GanttChart.js.map +1 -1
  26. package/dist/planmagnet/index.d.ts +1 -0
  27. package/dist/planmagnet/index.d.ts.map +1 -1
  28. package/dist/planmagnet/index.js +1 -0
  29. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  30. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +131 -125
  31. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  32. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  33. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +183 -99
  34. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  35. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  36. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +113 -97
  37. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  38. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js +363 -0
  41. package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  43. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +96 -79
  44. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  45. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  46. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +133 -123
  47. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  48. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +5 -2
  49. package/dist/planmagnet/pages/analytics/StatusFlowCard.js.map +1 -1
  50. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +5 -2
  51. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js.map +1 -1
  52. package/dist/planmagnet/product/ProductControls.d.ts +33 -0
  53. package/dist/planmagnet/product/ProductControls.d.ts.map +1 -1
  54. package/dist/planmagnet/product/ProductControls.js +593 -268
  55. package/dist/planmagnet/product/ProductControls.js.map +1 -1
  56. package/dist/planmagnet/product/routes.d.ts +10 -0
  57. package/dist/planmagnet/product/routes.d.ts.map +1 -0
  58. package/dist/planmagnet/product/routes.js +6 -0
  59. package/dist/planmagnet/product/routes.js.map +1 -0
  60. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts +10 -0
  61. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +1 -1
  62. package/dist/planmagnet/roadmaps/RoadmapControls.js +235 -184
  63. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +1 -1
  64. package/dist/planmagnet/utils/statusColor.d.ts +8 -9
  65. package/dist/planmagnet/utils/statusColor.d.ts.map +1 -1
  66. package/dist/planmagnet/utils/statusColor.js +8 -40
  67. package/dist/planmagnet/utils/statusColor.js.map +1 -1
  68. package/package.json +1 -1
@@ -4,14 +4,14 @@ import { enumLabel as n } from "../controls/WorkItemControls.js";
4
4
  import { detailPath as r } from "../utils/rowNavigation.js";
5
5
  import { useEntityId as i } from "../hooks/useEntityId.js";
6
6
  import { PlanMagnetNotFoundPage as a } from "./NotFoundPage.js";
7
- import { ProductFeatureRequestsPanel as o, ProductHeaderActions as s, ProductObjectivesPanel as c, ProductReleasesPanel as l, ProductRoadmapsPanel as u } from "../product/ProductControls.js";
8
- import { Calendar as d, Loader2 as f, Package as p, Pencil as m, Target as h, Users as g } from "lucide-react";
9
- import { gql as _ } from "@apollo/client";
10
- import { useQuery as v } from "@apollo/client/react";
11
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
12
- import { Badge as x, Button as S, Card as C, CardContent as w, CardHeader as T, CardTitle as E } from "@burdenoff/fe-libs/ui";
7
+ import { ProductAboutPanel as o, ProductCompetitorsPanel as s, ProductFeatureRequestsPanel as c, ProductHeaderActions as l, ProductObjectivesPanel as u, ProductReleasesPanel as d, ProductRoadmapsPanel as f } from "../product/ProductControls.js";
8
+ import { Calendar as p, Loader2 as m, Package as h, Pencil as g, Target as _, Users as v } from "lucide-react";
9
+ import { gql as y } from "@apollo/client";
10
+ import { useQuery as b } from "@apollo/client/react";
11
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
12
+ import { Badge as C, Button as w, Card as T, CardContent as E, CardHeader as D, CardTitle as O } from "@burdenoff/fe-libs/ui";
13
13
  //#region src/planmagnet/pages/ProductsProductDetailPagePage.tsx
14
- var D = _`
14
+ var k = y`
15
15
  query GetProductDetail($id: ID!) {
16
16
  planmagnetProduct(id: $id) {
17
17
  id
@@ -22,6 +22,16 @@ var D = _`
22
22
  lifecycleStage
23
23
  ownerId
24
24
  archivedAt
25
+ mission
26
+ valueProposition
27
+ businessModel
28
+ targetSegments
29
+ competitors {
30
+ id
31
+ name
32
+ description
33
+ website
34
+ }
25
35
  northStar {
26
36
  name
27
37
  unit
@@ -56,151 +66,158 @@ var D = _`
56
66
  }
57
67
  }
58
68
  `;
59
- function O() {
60
- let _ = e(), O = i("productId") ?? "", { data: k, loading: A, error: j } = v(D, {
61
- variables: { id: O },
62
- skip: !O
69
+ function A() {
70
+ let y = e(), A = i("productId") ?? "", { data: j, loading: M, error: N } = b(k, {
71
+ variables: { id: A },
72
+ skip: !A
63
73
  });
64
- if (!O) return /* @__PURE__ */ y("div", {
74
+ if (!A) return /* @__PURE__ */ x("div", {
65
75
  className: "p-6 text-muted-foreground",
66
76
  children: "No product selected. Open one from the list."
67
77
  });
68
- if (A && !k) return /* @__PURE__ */ y("div", {
78
+ if (M && !j) return /* @__PURE__ */ x("div", {
69
79
  className: "flex items-center justify-center p-12",
70
- children: /* @__PURE__ */ y(f, { className: "h-8 w-8 animate-spin text-muted-foreground" })
80
+ children: /* @__PURE__ */ x(m, { className: "h-8 w-8 animate-spin text-muted-foreground" })
71
81
  });
72
- if (j) return /* @__PURE__ */ b("div", {
82
+ if (N) return /* @__PURE__ */ S("div", {
73
83
  className: "p-6 text-destructive",
74
- children: ["Failed to load product: ", j.message]
84
+ children: ["Failed to load product: ", N.message]
75
85
  });
76
- let M = k?.planmagnetProduct;
77
- return M ? /* @__PURE__ */ b("div", {
86
+ let P = j?.planmagnetProduct;
87
+ return P ? /* @__PURE__ */ S("div", {
78
88
  className: "space-y-6 p-6",
79
89
  children: [
80
- /* @__PURE__ */ b("div", {
90
+ /* @__PURE__ */ S("div", {
81
91
  className: "flex items-start justify-between gap-4",
82
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
92
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("div", {
83
93
  className: "flex items-center gap-2",
84
94
  children: [
85
- /* @__PURE__ */ y(p, { className: "h-5 w-5 text-primary" }),
86
- /* @__PURE__ */ y("h1", {
95
+ /* @__PURE__ */ x(h, { className: "h-5 w-5 text-primary" }),
96
+ /* @__PURE__ */ x("h1", {
87
97
  className: "text-2xl font-semibold",
88
- children: M.name
98
+ children: P.name
89
99
  }),
90
- M.archivedAt && /* @__PURE__ */ y(x, {
100
+ P.archivedAt && /* @__PURE__ */ x(C, {
91
101
  variant: "outline",
92
102
  children: "Archived"
93
103
  }),
94
- /* @__PURE__ */ y(x, {
104
+ /* @__PURE__ */ x(C, {
95
105
  variant: "secondary",
96
106
  className: "capitalize",
97
- children: n(M.lifecycleStage)
107
+ children: n(P.lifecycleStage)
98
108
  })
99
109
  ]
100
- }), /* @__PURE__ */ y("p", {
110
+ }), /* @__PURE__ */ x("p", {
101
111
  className: "text-sm text-muted-foreground mt-1",
102
- children: M.vision || "No vision set"
103
- })] }), /* @__PURE__ */ y("div", {
112
+ children: P.vision || "No vision set"
113
+ })] }), /* @__PURE__ */ x("div", {
104
114
  className: "flex flex-col items-end gap-2",
105
- children: /* @__PURE__ */ b("div", {
115
+ children: /* @__PURE__ */ S("div", {
106
116
  className: "flex gap-2",
107
- children: [/* @__PURE__ */ b(S, {
117
+ children: [/* @__PURE__ */ S(w, {
108
118
  size: "sm",
109
119
  variant: "outline",
110
- onClick: () => _(r("/products/edit-product-page", M.id)),
111
- children: [/* @__PURE__ */ y(m, { className: "mr-1 h-4 w-4" }), "Edit"]
112
- }), /* @__PURE__ */ y(s, {
113
- productId: M.id,
114
- name: M.name,
115
- archivedAt: M.archivedAt
120
+ onClick: () => y(r("/products/edit-product-page", P.id)),
121
+ children: [/* @__PURE__ */ x(g, { className: "mr-1 h-4 w-4" }), "Edit"]
122
+ }), /* @__PURE__ */ x(l, {
123
+ productId: P.id,
124
+ name: P.name,
125
+ archivedAt: P.archivedAt
116
126
  })]
117
127
  })
118
128
  })]
119
129
  }),
120
- /* @__PURE__ */ b("div", {
130
+ /* @__PURE__ */ S("div", {
121
131
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
122
132
  children: [
123
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
133
+ /* @__PURE__ */ x(T, { children: /* @__PURE__ */ S(E, {
124
134
  className: "pt-4",
125
- children: [/* @__PURE__ */ b("div", {
135
+ children: [/* @__PURE__ */ S("div", {
126
136
  className: "flex items-center gap-2 text-muted-foreground text-xs",
127
- children: [/* @__PURE__ */ y(h, { className: "h-4 w-4" }), "North Star"]
128
- }), M.northStar ? /* @__PURE__ */ b("p", {
137
+ children: [/* @__PURE__ */ x(_, { className: "h-4 w-4" }), "North Star"]
138
+ }), P.northStar ? /* @__PURE__ */ S("p", {
129
139
  className: "text-sm font-bold mt-1 truncate",
130
140
  children: [
131
- M.northStar.current,
141
+ P.northStar.current,
132
142
  " / ",
133
- M.northStar.target,
143
+ P.northStar.target,
134
144
  " ",
135
- M.northStar.unit,
136
- M.northStar.progressRatio == null ? "" : ` (${Math.round(M.northStar.progressRatio * 100)}%)`
145
+ P.northStar.unit,
146
+ P.northStar.progressRatio == null ? "" : ` (${Math.round(P.northStar.progressRatio * 100)}%)`
137
147
  ]
138
- }) : /* @__PURE__ */ y("p", {
148
+ }) : /* @__PURE__ */ x("p", {
139
149
  className: "text-sm font-medium mt-1 text-muted-foreground",
140
150
  children: "Not set"
141
151
  })]
142
152
  }) }),
143
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
153
+ /* @__PURE__ */ x(T, { children: /* @__PURE__ */ S(E, {
144
154
  className: "pt-4",
145
- children: [/* @__PURE__ */ b("div", {
155
+ children: [/* @__PURE__ */ S("div", {
146
156
  className: "flex items-center gap-2 text-muted-foreground text-xs",
147
- children: [/* @__PURE__ */ y(g, { className: "h-4 w-4" }), "Owner"]
148
- }), /* @__PURE__ */ y("p", {
157
+ children: [/* @__PURE__ */ x(v, { className: "h-4 w-4" }), "Owner"]
158
+ }), /* @__PURE__ */ x("p", {
149
159
  className: "text-sm font-bold mt-1 truncate",
150
- children: /* @__PURE__ */ y(t, { id: M.ownerId })
160
+ children: /* @__PURE__ */ x(t, { id: P.ownerId })
151
161
  })]
152
162
  }) }),
153
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
163
+ /* @__PURE__ */ x(T, { children: /* @__PURE__ */ S(E, {
154
164
  className: "pt-4",
155
- children: [/* @__PURE__ */ b("div", {
165
+ children: [/* @__PURE__ */ S("div", {
156
166
  className: "flex items-center gap-2 text-muted-foreground text-xs",
157
- children: [/* @__PURE__ */ y(d, { className: "h-4 w-4" }), "Created"]
158
- }), /* @__PURE__ */ y("p", {
167
+ children: [/* @__PURE__ */ x(p, { className: "h-4 w-4" }), "Created"]
168
+ }), /* @__PURE__ */ x("p", {
159
169
  className: "text-xl font-bold mt-1",
160
- children: new Date(M.createdAt).toLocaleDateString()
170
+ children: new Date(P.createdAt).toLocaleDateString()
161
171
  })]
162
172
  }) }),
163
- /* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
173
+ /* @__PURE__ */ x(T, { children: /* @__PURE__ */ S(E, {
164
174
  className: "pt-4",
165
- children: [/* @__PURE__ */ b("div", {
175
+ children: [/* @__PURE__ */ S("div", {
166
176
  className: "flex items-center gap-2 text-muted-foreground text-xs",
167
- children: [/* @__PURE__ */ y(d, { className: "h-4 w-4" }), "Updated"]
168
- }), /* @__PURE__ */ y("p", {
177
+ children: [/* @__PURE__ */ x(p, { className: "h-4 w-4" }), "Updated"]
178
+ }), /* @__PURE__ */ x("p", {
169
179
  className: "text-xl font-bold mt-1",
170
- children: new Date(M.updatedAt).toLocaleDateString()
180
+ children: new Date(P.updatedAt).toLocaleDateString()
171
181
  })]
172
182
  }) })
173
183
  ]
174
184
  }),
175
- M.description && /* @__PURE__ */ y(C, { children: /* @__PURE__ */ y(w, {
185
+ P.description && /* @__PURE__ */ x(T, { children: /* @__PURE__ */ x(E, {
176
186
  className: "pt-4 text-sm text-muted-foreground",
177
- children: M.description
187
+ children: P.description
178
188
  }) }),
179
- /* @__PURE__ */ b("div", {
189
+ /* @__PURE__ */ S("div", {
190
+ className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
191
+ children: [/* @__PURE__ */ x(o, { product: P }), /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Competitive landscape" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x(s, {
192
+ productId: P.id,
193
+ competitors: P.competitors
194
+ }) })] })]
195
+ }),
196
+ /* @__PURE__ */ S("div", {
180
197
  className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
181
198
  children: [
182
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "Roadmaps" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(u, {
183
- productId: M.id,
184
- roadmaps: M.roadmaps
199
+ /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Roadmaps" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x(f, {
200
+ productId: P.id,
201
+ roadmaps: P.roadmaps
185
202
  }) })] }),
186
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "Releases" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(l, {
187
- productId: M.id,
188
- releases: M.releases
203
+ /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Releases" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x(d, {
204
+ productId: P.id,
205
+ releases: P.releases
189
206
  }) })] }),
190
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "Feature Requests" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(o, {
191
- productId: M.id,
192
- featureRequests: M.featureRequests
207
+ /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "Feature Requests" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x(c, {
208
+ productId: P.id,
209
+ featureRequests: P.featureRequests
193
210
  }) })] }),
194
- /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(T, { children: /* @__PURE__ */ y(E, { children: "OKR Objectives" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(c, {
195
- productId: M.id,
196
- objectives: M.objectives
211
+ /* @__PURE__ */ S(T, { children: [/* @__PURE__ */ x(D, { children: /* @__PURE__ */ x(O, { children: "OKR Objectives" }) }), /* @__PURE__ */ x(E, { children: /* @__PURE__ */ x(u, {
212
+ productId: P.id,
213
+ objectives: P.objectives
197
214
  }) })] })
198
215
  ]
199
216
  })
200
217
  ]
201
- }) : /* @__PURE__ */ y(a, {});
218
+ }) : /* @__PURE__ */ x(a, {});
202
219
  }
203
220
  //#endregion
204
- export { O as ProductsProductDetailPagePage };
221
+ export { A as ProductsProductDetailPagePage };
205
222
 
206
223
  //# sourceMappingURL=ProductsProductDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsProductDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { Package, Target, Users, Calendar, Loader2, Pencil } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { PlanMagnetNotFoundPage } from './NotFoundPage';\nimport {\n ProductHeaderActions,\n ProductRoadmapsPanel,\n ProductReleasesPanel,\n ProductFeatureRequestsPanel,\n ProductObjectivesPanel,\n type ProductRoadmapRef,\n type ProductReleaseRef,\n type ProductFeatureRequestRef,\n type ProductObjectiveRef,\n} from '../product/ProductControls';\n\n/**\n * Product detail (BOFF-8045): the product's own fields, its North Star, and a Links\n * management panel for roadmaps/releases/feature requests/OKR objectives. Every relation\n * is selected directly off `planmagnetProduct(id)` rather than a separate workspace-wide\n * query — before this rewrite the page queried EVERY feature request/release in the\n * workspace regardless of product, which is the pre-existing bug this fixes (there was no\n * productId to filter on until now).\n */\n\nconst GET_PRODUCT_DETAIL = gql`\n query GetProductDetail($id: ID!) {\n planmagnetProduct(id: $id) {\n id\n workspaceId\n name\n description\n vision\n lifecycleStage\n ownerId\n archivedAt\n northStar {\n name\n unit\n target\n current\n window\n measuredAt\n progressRatio\n }\n roadmaps {\n id\n name\n }\n releases {\n id\n name\n version\n status\n }\n featureRequests {\n id\n title\n status\n }\n objectives {\n id\n title\n status\n }\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface ProductDetail {\n id: string;\n workspaceId: string;\n name: string;\n description: string | null;\n vision: string;\n lifecycleStage: string;\n ownerId: string;\n archivedAt: string | null;\n northStar: {\n name: string;\n unit: string;\n target: number;\n current: number;\n window: string;\n measuredAt: string | null;\n progressRatio: number | null;\n } | null;\n roadmaps: ProductRoadmapRef[];\n releases: ProductReleaseRef[];\n featureRequests: ProductFeatureRequestRef[];\n objectives: ProductObjectiveRef[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport function ProductsProductDetailPagePage() {\n const navigate = usePlanMagnetNavigate();\n const productId = useEntityId('productId') ?? '';\n\n const { data, loading, error } = useQuery<{ planmagnetProduct: ProductDetail | null }>(\n GET_PRODUCT_DETAIL,\n { variables: { id: productId }, skip: !productId }\n );\n\n if (!productId) {\n return (\n <div className=\"p-6 text-muted-foreground\">No product selected. Open one from the list.</div>\n );\n }\n\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\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 product: {error.message}</div>;\n }\n\n const product = data?.planmagnetProduct;\n // Deleted, unauthorized or an unknown id all read back the same way (no cross-tenant\n // existence leak) — the real 404 page, not an inline message.\n if (!product) return <PlanMagnetNotFoundPage />;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"flex items-center gap-2\">\n <Package className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{product.name}</h1>\n {product.archivedAt && <Badge variant=\"outline\">Archived</Badge>}\n <Badge variant=\"secondary\" className=\"capitalize\">\n {enumLabel(product.lifecycleStage)}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">{product.vision || 'No vision set'}</p>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => navigate(detailPath('/products/edit-product-page', product.id))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ProductHeaderActions\n productId={product.id}\n name={product.name}\n archivedAt={product.archivedAt}\n />\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Target className=\"h-4 w-4\" />\n North Star\n </div>\n {product.northStar ? (\n <p className=\"text-sm font-bold mt-1 truncate\">\n {product.northStar.current} / {product.northStar.target} {product.northStar.unit}\n {product.northStar.progressRatio != null\n ? ` (${Math.round(product.northStar.progressRatio * 100)}%)`\n : ''}\n </p>\n ) : (\n <p className=\"text-sm font-medium mt-1 text-muted-foreground\">Not set</p>\n )}\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Users className=\"h-4 w-4\" />\n Owner\n </div>\n <p className=\"text-sm font-bold mt-1 truncate\">\n <PersonName id={product.ownerId} />\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Calendar className=\"h-4 w-4\" />\n Created\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {new Date(product.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Calendar className=\"h-4 w-4\" />\n Updated\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {new Date(product.updatedAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n {product.description && (\n <Card>\n <CardContent className=\"pt-4 text-sm text-muted-foreground\">\n {product.description}\n </CardContent>\n </Card>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle>Roadmaps</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductRoadmapsPanel productId={product.id} roadmaps={product.roadmaps} />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Releases</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductReleasesPanel productId={product.id} releases={product.releases} />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Feature Requests</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductFeatureRequestsPanel\n productId={product.id}\n featureRequests={product.featureRequests}\n />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>OKR Objectives</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductObjectivesPanel productId={product.id} objectives={product.objectives} />\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,IAAM,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwE9B,SAAgB,IAAgC;CAC9C,IAAM,IAAW,GAAuB,EAClC,IAAY,EAAY,YAAY,IAAI,IAExC,EAAE,SAAM,YAAS,aAAU,EAC/B,GACA;EAAE,WAAW,EAAE,IAAI,GAAW;EAAE,MAAM,CAAC;EAAW,CACnD;AAED,KAAI,CAAC,EACH,QACE,kBAAC,OAAD;EAAK,WAAU;YAA4B;EAAkD,CAAA;AAMjG,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;AAKtB,QAFK,IAGH,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA;MAC5C,kBAAC,MAAD;OAAI,WAAU;iBAA0B,EAAQ;OAAU,CAAA;MACzD,EAAQ,cAAc,kBAAC,GAAD;OAAO,SAAQ;iBAAU;OAAgB,CAAA;MAChE,kBAAC,GAAD;OAAO,SAAQ;OAAY,WAAU;iBAClC,EAAU,EAAQ,eAAe;OAC5B,CAAA;MACJ;QACN,kBAAC,KAAD;KAAG,WAAU;eAAsC,EAAQ,UAAU;KAAoB,CAAA,CACrF,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAK;OACL,SAAQ;OACR,eAAe,EAAS,EAAW,+BAA+B,EAAQ,GAAG,CAAC;iBAHhF,CAKE,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;UACT,kBAAC,GAAD;OACE,WAAW,EAAQ;OACnB,MAAM,EAAQ;OACd,YAAY,EAAQ;OACpB,CAAA,CACE;;KACF,CAAA,CACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,aAE1B;UACL,EAAQ,YACP,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAQ,UAAU;QAAQ;QAAI,EAAQ,UAAU;QAAO;QAAE,EAAQ,UAAU;QAC3E,EAAQ,UAAU,iBAAiB,OAEhC,KADA,KAAK,KAAK,MAAM,EAAQ,UAAU,gBAAgB,IAAI,CAAC;QAEzD;WAEJ,kBAAC,KAAD;OAAG,WAAU;iBAAiD;OAAW,CAAA,CAE/D;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,QAEzB;UACN,kBAAC,KAAD;OAAG,WAAU;iBACX,kBAAC,GAAD,EAAY,IAAI,EAAQ,SAAW,CAAA;OACjC,CAAA,CACQ;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,UAE5B;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB;OAC/C,CAAA,CACQ;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,UAE5B;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB;OAC/C,CAAA,CACQ;SACT,CAAA;KACH;;GAEL,EAAQ,eACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACpB,EAAQ;IACG,CAAA,EACT,CAAA;GAGT,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,YAAoB,CAAA,EACpB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAsB,WAAW,EAAQ;MAAI,UAAU,EAAQ;MAAY,CAAA,EAC/D,CAAA,CACT,EAAA,CAAA;KACP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,YAAoB,CAAA,EACpB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAsB,WAAW,EAAQ;MAAI,UAAU,EAAQ;MAAY,CAAA,EAC/D,CAAA,CACT,EAAA,CAAA;KACP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,oBAA4B,CAAA,EAC5B,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MACE,WAAW,EAAQ;MACnB,iBAAiB,EAAQ;MACzB,CAAA,EACU,CAAA,CACT,EAAA,CAAA;KACP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,kBAA0B,CAAA,EAC1B,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAwB,WAAW,EAAQ;MAAI,YAAY,EAAQ;MAAc,CAAA,EACrE,CAAA,CACT,EAAA,CAAA;KACH;;GACF;MAtIa,kBAAC,GAAD,EAA0B,CAAA"}
1
+ {"version":3,"file":"ProductsProductDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { Package, Target, Users, Calendar, Loader2, Pencil } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { PlanMagnetNotFoundPage } from './NotFoundPage';\nimport {\n ProductHeaderActions,\n ProductRoadmapsPanel,\n ProductReleasesPanel,\n ProductFeatureRequestsPanel,\n ProductObjectivesPanel,\n ProductAboutPanel,\n ProductCompetitorsPanel,\n type ProductRoadmapRef,\n type ProductReleaseRef,\n type ProductFeatureRequestRef,\n type ProductObjectiveRef,\n type ProductCompetitorRef,\n} from '../product/ProductControls';\n\n/**\n * Product detail (BOFF-8045): the product's own fields, its North Star, and a Links\n * management panel for roadmaps/releases/feature requests/OKR objectives. Every relation\n * is selected directly off `planmagnetProduct(id)` rather than a separate workspace-wide\n * query — before this rewrite the page queried EVERY feature request/release in the\n * workspace regardless of product, which is the pre-existing bug this fixes (there was no\n * productId to filter on until now).\n */\n\nconst GET_PRODUCT_DETAIL = gql`\n query GetProductDetail($id: ID!) {\n planmagnetProduct(id: $id) {\n id\n workspaceId\n name\n description\n vision\n lifecycleStage\n ownerId\n archivedAt\n mission\n valueProposition\n businessModel\n targetSegments\n competitors {\n id\n name\n description\n website\n }\n northStar {\n name\n unit\n target\n current\n window\n measuredAt\n progressRatio\n }\n roadmaps {\n id\n name\n }\n releases {\n id\n name\n version\n status\n }\n featureRequests {\n id\n title\n status\n }\n objectives {\n id\n title\n status\n }\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface ProductDetail {\n id: string;\n workspaceId: string;\n name: string;\n description: string | null;\n vision: string;\n lifecycleStage: string;\n ownerId: string;\n archivedAt: string | null;\n mission: string | null;\n valueProposition: string | null;\n businessModel: string | null;\n targetSegments: string[];\n competitors: ProductCompetitorRef[];\n northStar: {\n name: string;\n unit: string;\n target: number;\n current: number;\n window: string;\n measuredAt: string | null;\n progressRatio: number | null;\n } | null;\n roadmaps: ProductRoadmapRef[];\n releases: ProductReleaseRef[];\n featureRequests: ProductFeatureRequestRef[];\n objectives: ProductObjectiveRef[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport function ProductsProductDetailPagePage() {\n const navigate = usePlanMagnetNavigate();\n const productId = useEntityId('productId') ?? '';\n\n const { data, loading, error } = useQuery<{ planmagnetProduct: ProductDetail | null }>(\n GET_PRODUCT_DETAIL,\n { variables: { id: productId }, skip: !productId }\n );\n\n if (!productId) {\n return (\n <div className=\"p-6 text-muted-foreground\">No product selected. Open one from the list.</div>\n );\n }\n\n // Only before the first load: a refetch must not blank the page (it\n // unmounts every component on it and loses their state).\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 product: {error.message}</div>;\n }\n\n const product = data?.planmagnetProduct;\n // Deleted, unauthorized or an unknown id all read back the same way (no cross-tenant\n // existence leak) — the real 404 page, not an inline message.\n if (!product) return <PlanMagnetNotFoundPage />;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <div className=\"flex items-center gap-2\">\n <Package className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{product.name}</h1>\n {product.archivedAt && <Badge variant=\"outline\">Archived</Badge>}\n <Badge variant=\"secondary\" className=\"capitalize\">\n {enumLabel(product.lifecycleStage)}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">{product.vision || 'No vision set'}</p>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => navigate(detailPath('/products/edit-product-page', product.id))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ProductHeaderActions\n productId={product.id}\n name={product.name}\n archivedAt={product.archivedAt}\n />\n </div>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Target className=\"h-4 w-4\" />\n North Star\n </div>\n {product.northStar ? (\n <p className=\"text-sm font-bold mt-1 truncate\">\n {product.northStar.current} / {product.northStar.target} {product.northStar.unit}\n {product.northStar.progressRatio != null\n ? ` (${Math.round(product.northStar.progressRatio * 100)}%)`\n : ''}\n </p>\n ) : (\n <p className=\"text-sm font-medium mt-1 text-muted-foreground\">Not set</p>\n )}\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Users className=\"h-4 w-4\" />\n Owner\n </div>\n <p className=\"text-sm font-bold mt-1 truncate\">\n <PersonName id={product.ownerId} />\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Calendar className=\"h-4 w-4\" />\n Created\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {new Date(product.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Calendar className=\"h-4 w-4\" />\n Updated\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {new Date(product.updatedAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n {product.description && (\n <Card>\n <CardContent className=\"pt-4 text-sm text-muted-foreground\">\n {product.description}\n </CardContent>\n </Card>\n )}\n\n {/* PRM-02: strategy narrative + competitive landscape. */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <ProductAboutPanel product={product} />\n <Card>\n <CardHeader>\n <CardTitle>Competitive landscape</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductCompetitorsPanel productId={product.id} competitors={product.competitors} />\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle>Roadmaps</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductRoadmapsPanel productId={product.id} roadmaps={product.roadmaps} />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Releases</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductReleasesPanel productId={product.id} releases={product.releases} />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Feature Requests</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductFeatureRequestsPanel\n productId={product.id}\n featureRequests={product.featureRequests}\n />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>OKR Objectives</CardTitle>\n </CardHeader>\n <CardContent>\n <ProductObjectivesPanel productId={product.id} objectives={product.objectives} />\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsRoadmapDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx"],"names":[],"mappings":"AA8FA,wBAAgB,6BAA6B,4CAuR5C"}
1
+ {"version":3,"file":"ProductsRoadmapDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsRoadmapDetailPagePage.tsx"],"names":[],"mappings":"AA0GA,wBAAgB,6BAA6B,4CAyR5C"}