@burdenoff/microfe-planmagnet 2026.927.1 → 2026.927.3

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 (87) hide show
  1. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +128 -124
  3. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  4. package/dist/planmagnet/controls/ConfirmButton.d.ts +25 -0
  5. package/dist/planmagnet/controls/ConfirmButton.d.ts.map +1 -0
  6. package/dist/planmagnet/controls/ConfirmButton.js +30 -0
  7. package/dist/planmagnet/controls/ConfirmButton.js.map +1 -0
  8. package/dist/planmagnet/controls/ProjectControls.d.ts +13 -0
  9. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -0
  10. package/dist/planmagnet/controls/ProjectControls.js +104 -0
  11. package/dist/planmagnet/controls/ProjectControls.js.map +1 -0
  12. package/dist/planmagnet/controls/WorkItemControls.d.ts +52 -0
  13. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -0
  14. package/dist/planmagnet/controls/WorkItemControls.js +198 -0
  15. package/dist/planmagnet/controls/WorkItemControls.js.map +1 -0
  16. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  17. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +14 -4
  18. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +4 -4
  20. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  21. package/dist/planmagnet/pages/DocsDocsPagePage.js +4 -4
  22. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -100
  24. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +95 -94
  27. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +97 -90
  30. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +150 -111
  33. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +121 -94
  36. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +84 -73
  39. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +13 -8
  42. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +129 -125
  45. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +112 -109
  48. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +134 -132
  51. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ReportsReportsPagePage.js +72 -83
  54. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +109 -108
  57. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +167 -111
  60. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +101 -99
  63. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +149 -147
  66. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/TasksTasksPagePage.js +4 -8
  69. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/TeamTeamPagePage.js +68 -69
  72. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
  74. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +1 -5
  75. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
  76. package/dist/planmagnet/people/People.d.ts +18 -0
  77. package/dist/planmagnet/people/People.d.ts.map +1 -1
  78. package/dist/planmagnet/people/People.js +26 -12
  79. package/dist/planmagnet/people/People.js.map +1 -1
  80. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts +34 -0
  81. package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +1 -0
  82. package/dist/planmagnet/roadmaps/RoadmapControls.js +301 -0
  83. package/dist/planmagnet/roadmaps/RoadmapControls.js.map +1 -0
  84. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  85. package/dist/planmagnet/sprints/SprintControls.js +194 -215
  86. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  87. package/package.json +1 -1
@@ -1,12 +1,13 @@
1
1
  import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
- import { Loader2 as t, MessageSquare as n, Star as r, Target as i, ThumbsUp as a } from "lucide-react";
3
- import { useParams as o } from "react-router";
4
- import { gql as s } from "@apollo/client";
5
- import { useQuery as c } from "@apollo/client/react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
- import { Badge as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { Loader2 as n, MessageSquare as r, Star as i, Target as a, ThumbsUp as o } from "lucide-react";
4
+ import { useParams as s } from "react-router";
5
+ import { gql as c } from "@apollo/client";
6
+ import { useQuery as l } from "@apollo/client/react";
7
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx
9
- var g = s`
10
+ var _ = c`
10
11
  query GetFeatureRequest($id: ID!) {
11
12
  planmagnetFeatureRequest(id: $id) {
12
13
  id
@@ -40,44 +41,45 @@ var g = s`
40
41
  }
41
42
  }
42
43
  `;
43
- function _() {
44
- let { workspaceId: s } = e(), _ = o().id ?? "", { data: v, loading: y, error: b } = c(g, {
45
- variables: { id: _ },
46
- skip: !_
44
+ function v() {
45
+ let { workspaceId: c } = e(), v = s().id ?? "", { data: y, loading: b, error: x } = l(_, {
46
+ variables: { id: v },
47
+ skip: !v
47
48
  });
48
- if (y && !v) return /* @__PURE__ */ l("div", {
49
+ if (b && !y) return /* @__PURE__ */ u("div", {
49
50
  className: "flex items-center justify-center p-12",
50
- children: /* @__PURE__ */ l(t, { className: "h-8 w-8 animate-spin text-muted-foreground" })
51
+ children: /* @__PURE__ */ u(n, { className: "h-8 w-8 animate-spin text-muted-foreground" })
51
52
  });
52
- if (b) return /* @__PURE__ */ u("div", {
53
+ if (x) return /* @__PURE__ */ d("div", {
53
54
  className: "p-6 text-destructive",
54
- children: ["Failed to load feature: ", b.message]
55
+ children: ["Failed to load feature: ", x.message]
55
56
  });
56
- let x = v?.planmagnetFeatureRequest;
57
- if (!x) return /* @__PURE__ */ l("div", {
57
+ let S = y?.planmagnetFeatureRequest;
58
+ if (!S) return /* @__PURE__ */ u("div", {
58
59
  className: "p-6 text-muted-foreground",
59
60
  children: "Feature not found."
60
61
  });
61
- let S = x.votes ?? [], C = x.competitors ?? [];
62
- return /* @__PURE__ */ u("div", {
62
+ let C = S.votes ?? [], w = S.competitors ?? [];
63
+ return /* @__PURE__ */ d("div", {
63
64
  className: "space-y-6 p-6",
64
65
  children: [
65
- /* @__PURE__ */ u("div", {
66
+ /* @__PURE__ */ d("div", {
66
67
  className: "flex items-center justify-between",
67
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
68
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
68
69
  className: "text-2xl font-semibold",
69
- children: x.title
70
- }), /* @__PURE__ */ u("p", {
70
+ children: S.title
71
+ }), /* @__PURE__ */ d("p", {
71
72
  className: "text-sm text-muted-foreground",
72
73
  children: [
73
74
  "Submitted by: ",
74
- x.submittedBy,
75
- " · Effort: ",
76
- x.effortEstimate ?? "N/A"
75
+ /* @__PURE__ */ u(t, { id: S.submittedBy }),
76
+ " · Effort:",
77
+ " ",
78
+ S.effortEstimate ?? "N/A"
77
79
  ]
78
- })] }), /* @__PURE__ */ l("div", {
80
+ })] }), /* @__PURE__ */ u("div", {
79
81
  className: "flex gap-2",
80
- children: /* @__PURE__ */ l("span", {
82
+ children: /* @__PURE__ */ u("span", {
81
83
  className: `text-xs px-2 py-1 rounded-full capitalize ${{
82
84
  SUBMITTED: "bg-gray-100 text-gray-800",
83
85
  UNDER_REVIEW: "bg-yellow-100 text-yellow-800",
@@ -85,65 +87,65 @@ function _() {
85
87
  IN_PROGRESS: "bg-purple-100 text-purple-800",
86
88
  COMPLETED: "bg-green-100 text-green-800",
87
89
  DECLINED: "bg-red-100 text-red-800"
88
- }[x.status] ?? "bg-gray-100"}`,
89
- children: x.status.toLowerCase().replace("_", " ")
90
+ }[S.status] ?? "bg-gray-100"}`,
91
+ children: S.status.toLowerCase().replace("_", " ")
90
92
  })
91
93
  })]
92
94
  }),
93
- /* @__PURE__ */ u("div", {
95
+ /* @__PURE__ */ d("div", {
94
96
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
95
97
  children: [
96
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
98
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
97
99
  className: "pt-4 text-center",
98
100
  children: [
99
- /* @__PURE__ */ l(i, { className: "h-5 w-5 mx-auto text-primary" }),
100
- /* @__PURE__ */ l("p", {
101
+ /* @__PURE__ */ u(a, { className: "h-5 w-5 mx-auto text-primary" }),
102
+ /* @__PURE__ */ u("p", {
101
103
  className: "text-2xl font-bold mt-1",
102
- children: x.priorityScore ?? 0
104
+ children: S.priorityScore ?? 0
103
105
  }),
104
- /* @__PURE__ */ l("p", {
106
+ /* @__PURE__ */ u("p", {
105
107
  className: "text-xs text-muted-foreground",
106
108
  children: "Priority Score"
107
109
  })
108
110
  ]
109
111
  }) }),
110
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
112
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
111
113
  className: "pt-4 text-center",
112
114
  children: [
113
- /* @__PURE__ */ l(a, { className: "h-5 w-5 mx-auto text-green-500" }),
114
- /* @__PURE__ */ l("p", {
115
+ /* @__PURE__ */ u(o, { className: "h-5 w-5 mx-auto text-green-500" }),
116
+ /* @__PURE__ */ u("p", {
115
117
  className: "text-2xl font-bold mt-1",
116
- children: x.voteCount
118
+ children: S.voteCount
117
119
  }),
118
- /* @__PURE__ */ l("p", {
120
+ /* @__PURE__ */ u("p", {
119
121
  className: "text-xs text-muted-foreground",
120
122
  children: "Votes"
121
123
  })
122
124
  ]
123
125
  }) }),
124
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
126
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
125
127
  className: "pt-4 text-center",
126
128
  children: [
127
- /* @__PURE__ */ l(r, { className: "h-5 w-5 mx-auto text-yellow-500" }),
128
- /* @__PURE__ */ l("p", {
129
+ /* @__PURE__ */ u(i, { className: "h-5 w-5 mx-auto text-yellow-500" }),
130
+ /* @__PURE__ */ u("p", {
129
131
  className: "text-2xl font-bold mt-1",
130
- children: x.businessValue ?? 0
132
+ children: S.businessValue ?? 0
131
133
  }),
132
- /* @__PURE__ */ l("p", {
134
+ /* @__PURE__ */ u("p", {
133
135
  className: "text-xs text-muted-foreground",
134
136
  children: "Business Value"
135
137
  })
136
138
  ]
137
139
  }) }),
138
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
140
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
139
141
  className: "pt-4 text-center",
140
142
  children: [
141
- /* @__PURE__ */ l(n, { className: "h-5 w-5 mx-auto text-blue-500" }),
142
- /* @__PURE__ */ l("p", {
143
+ /* @__PURE__ */ u(r, { className: "h-5 w-5 mx-auto text-blue-500" }),
144
+ /* @__PURE__ */ u("p", {
143
145
  className: "text-2xl font-bold mt-1",
144
- children: C.length
146
+ children: w.length
145
147
  }),
146
- /* @__PURE__ */ l("p", {
148
+ /* @__PURE__ */ u("p", {
147
149
  className: "text-xs text-muted-foreground",
148
150
  children: "Competitors"
149
151
  })
@@ -151,130 +153,130 @@ function _() {
151
153
  }) })
152
154
  ]
153
155
  }),
154
- /* @__PURE__ */ u("div", {
156
+ /* @__PURE__ */ d("div", {
155
157
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
156
- children: [/* @__PURE__ */ u("div", {
158
+ children: [/* @__PURE__ */ d("div", {
157
159
  className: "lg:col-span-2 space-y-6",
158
160
  children: [
159
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Description" }) }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l("p", {
161
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Description" }) }), /* @__PURE__ */ u(m, { children: /* @__PURE__ */ u("p", {
160
162
  className: "text-sm",
161
- children: x.description ?? "No description provided."
163
+ children: S.description ?? "No description provided."
162
164
  }) })] }),
163
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
165
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
164
166
  "Votes (",
165
- S.length,
167
+ C.length,
166
168
  ")"
167
- ] }) }), /* @__PURE__ */ u(p, {
169
+ ] }) }), /* @__PURE__ */ d(m, {
168
170
  className: "space-y-3",
169
- children: [S.length === 0 && /* @__PURE__ */ l("p", {
171
+ children: [C.length === 0 && /* @__PURE__ */ u("p", {
170
172
  className: "text-sm text-muted-foreground",
171
173
  children: "No votes yet."
172
- }), S.map((e) => /* @__PURE__ */ u("div", {
174
+ }), C.map((e) => /* @__PURE__ */ d("div", {
173
175
  className: "flex items-start justify-between border rounded-md p-3",
174
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("p", {
176
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("p", {
175
177
  className: "text-sm font-medium",
176
- children: ["Voter: ", e.voterId]
177
- }), e.comment && /* @__PURE__ */ l("p", {
178
+ children: ["Voter: ", /* @__PURE__ */ u(t, { id: e.voterId })]
179
+ }), e.comment && /* @__PURE__ */ u("p", {
178
180
  className: "text-xs text-muted-foreground mt-1",
179
181
  children: e.comment
180
- })] }), /* @__PURE__ */ u("div", {
182
+ })] }), /* @__PURE__ */ d("div", {
181
183
  className: "flex items-center gap-1",
182
- children: [/* @__PURE__ */ l(a, { className: "h-3 w-3 text-green-500" }), /* @__PURE__ */ l("span", {
184
+ children: [/* @__PURE__ */ u(o, { className: "h-3 w-3 text-green-500" }), /* @__PURE__ */ u("span", {
183
185
  className: "text-sm font-bold",
184
186
  children: e.weight
185
187
  })]
186
188
  })]
187
189
  }, e.id))]
188
190
  })] }),
189
- C.length > 0 && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
191
+ w.length > 0 && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ d(g, { children: [
190
192
  "Competitor Analysis (",
191
- C.length,
193
+ w.length,
192
194
  ")"
193
- ] }) }), /* @__PURE__ */ l(p, {
195
+ ] }) }), /* @__PURE__ */ u(m, {
194
196
  className: "space-y-3",
195
- children: C.map((e) => /* @__PURE__ */ u("div", {
197
+ children: w.map((e) => /* @__PURE__ */ d("div", {
196
198
  className: "border rounded-md p-3",
197
- children: [/* @__PURE__ */ u("div", {
199
+ children: [/* @__PURE__ */ d("div", {
198
200
  className: "flex items-center justify-between",
199
- children: [/* @__PURE__ */ l("p", {
201
+ children: [/* @__PURE__ */ u("p", {
200
202
  className: "text-sm font-medium",
201
203
  children: e.name
202
- }), e.website && /* @__PURE__ */ l("span", {
204
+ }), e.website && /* @__PURE__ */ u("span", {
203
205
  className: "text-xs text-primary",
204
206
  children: e.website
205
207
  })]
206
- }), e.description && /* @__PURE__ */ l("p", {
208
+ }), e.description && /* @__PURE__ */ u("p", {
207
209
  className: "text-xs text-muted-foreground mt-1",
208
210
  children: e.description
209
211
  })]
210
212
  }, e.id))
211
213
  })] })
212
214
  ]
213
- }), /* @__PURE__ */ u("div", {
215
+ }), /* @__PURE__ */ d("div", {
214
216
  className: "space-y-6",
215
- children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Details" }) }), /* @__PURE__ */ u(p, {
217
+ children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Details" }) }), /* @__PURE__ */ d(m, {
216
218
  className: "space-y-3 text-sm",
217
219
  children: [
218
- /* @__PURE__ */ u("div", {
220
+ /* @__PURE__ */ d("div", {
219
221
  className: "flex justify-between",
220
- children: [/* @__PURE__ */ l("span", {
222
+ children: [/* @__PURE__ */ u("span", {
221
223
  className: "text-muted-foreground",
222
224
  children: "Status"
223
- }), /* @__PURE__ */ l(d, {
225
+ }), /* @__PURE__ */ u(f, {
224
226
  variant: "secondary",
225
227
  className: "capitalize",
226
- children: x.status.toLowerCase().replace("_", " ")
228
+ children: S.status.toLowerCase().replace("_", " ")
227
229
  })]
228
230
  }),
229
- /* @__PURE__ */ u("div", {
231
+ /* @__PURE__ */ d("div", {
230
232
  className: "flex justify-between",
231
- children: [/* @__PURE__ */ l("span", {
233
+ children: [/* @__PURE__ */ u("span", {
232
234
  className: "text-muted-foreground",
233
235
  children: "Priority Score"
234
- }), /* @__PURE__ */ l(d, {
236
+ }), /* @__PURE__ */ u(f, {
235
237
  variant: "outline",
236
- children: x.priorityScore ?? "N/A"
238
+ children: S.priorityScore ?? "N/A"
237
239
  })]
238
240
  }),
239
- /* @__PURE__ */ u("div", {
241
+ /* @__PURE__ */ d("div", {
240
242
  className: "flex justify-between",
241
- children: [/* @__PURE__ */ l("span", {
243
+ children: [/* @__PURE__ */ u("span", {
242
244
  className: "text-muted-foreground",
243
245
  children: "Effort"
244
- }), /* @__PURE__ */ l(d, {
246
+ }), /* @__PURE__ */ u(f, {
245
247
  variant: "outline",
246
248
  className: "capitalize",
247
- children: x.effortEstimate ?? "N/A"
249
+ children: S.effortEstimate ?? "N/A"
248
250
  })]
249
251
  }),
250
- /* @__PURE__ */ u("div", {
252
+ /* @__PURE__ */ d("div", {
251
253
  className: "flex justify-between",
252
- children: [/* @__PURE__ */ l("span", {
254
+ children: [/* @__PURE__ */ u("span", {
253
255
  className: "text-muted-foreground",
254
256
  children: "Business Value"
255
- }), /* @__PURE__ */ l("span", {
257
+ }), /* @__PURE__ */ u("span", {
256
258
  className: "font-medium",
257
- children: x.businessValue ?? "N/A"
259
+ children: S.businessValue ?? "N/A"
258
260
  })]
259
261
  }),
260
- /* @__PURE__ */ u("div", {
262
+ /* @__PURE__ */ d("div", {
261
263
  className: "flex justify-between",
262
- children: [/* @__PURE__ */ l("span", {
264
+ children: [/* @__PURE__ */ u("span", {
263
265
  className: "text-muted-foreground",
264
266
  children: "Submitted By"
265
- }), /* @__PURE__ */ l("span", { children: x.submittedBy })]
267
+ }), /* @__PURE__ */ u(t, { id: S.submittedBy })]
266
268
  }),
267
- /* @__PURE__ */ u("div", {
269
+ /* @__PURE__ */ d("div", {
268
270
  className: "flex justify-between",
269
- children: [/* @__PURE__ */ l("span", {
271
+ children: [/* @__PURE__ */ u("span", {
270
272
  className: "text-muted-foreground",
271
273
  children: "Updated"
272
- }), /* @__PURE__ */ l("span", { children: new Date(x.updatedAt).toLocaleDateString() })]
274
+ }), /* @__PURE__ */ u("span", { children: new Date(S.updatedAt).toLocaleDateString() })]
273
275
  })
274
276
  ]
275
- })] }), x.tags?.length > 0 && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Tags" }) }), /* @__PURE__ */ l(p, {
277
+ })] }), S.tags?.length > 0 && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Tags" }) }), /* @__PURE__ */ u(m, {
276
278
  className: "flex flex-wrap gap-1",
277
- children: x.tags.map((e) => /* @__PURE__ */ l(d, {
279
+ children: S.tags.map((e) => /* @__PURE__ */ u(f, {
278
280
  variant: "outline",
279
281
  className: "text-xs",
280
282
  children: e
@@ -286,6 +288,6 @@ function _() {
286
288
  });
287
289
  }
288
290
  //#endregion
289
- export { _ as ProductsFeatureDetailPagePage };
291
+ export { v as ProductsFeatureDetailPagePage };
290
292
 
291
293
  //# sourceMappingURL=ProductsFeatureDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsFeatureDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Star, ThumbsUp, MessageSquare, Target, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\n\nconst GET_FEATURE_REQUEST = gql`\n query GetFeatureRequest($id: ID!) {\n planmagnetFeatureRequest(id: $id) {\n id\n workspaceId\n projectId\n title\n description\n status\n businessValue\n effortEstimate\n priorityScore\n voteCount\n submittedBy\n workItemId\n tags\n createdAt\n updatedAt\n votes {\n id\n voterId\n weight\n comment\n createdAt\n }\n competitors {\n id\n name\n description\n website\n }\n }\n }\n`;\n\ninterface FeatureVoteNode {\n id: string;\n voterId: string;\n weight: number;\n comment: string | null;\n createdAt: string;\n}\n\ninterface CompetitorNode {\n id: string;\n name: string;\n description: string | null;\n website: string | null;\n}\n\nexport function ProductsFeatureDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const featureId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_FEATURE_REQUEST, {\n variables: { id: featureId },\n skip: !featureId,\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 feature: {error.message}</div>;\n }\n\n const feature = data?.planmagnetFeatureRequest;\n if (!feature) return <div className=\"p-6 text-muted-foreground\">Feature not found.</div>;\n\n const votes: FeatureVoteNode[] = feature.votes ?? [];\n const competitors: CompetitorNode[] = feature.competitors ?? [];\n\n const statusColor: Record<string, string> = {\n SUBMITTED: 'bg-gray-100 text-gray-800',\n UNDER_REVIEW: 'bg-yellow-100 text-yellow-800',\n PLANNED: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-purple-100 text-purple-800',\n COMPLETED: 'bg-green-100 text-green-800',\n DECLINED: 'bg-red-100 text-red-800',\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{feature.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Submitted by: {feature.submittedBy} &middot; Effort: {feature.effortEstimate ?? 'N/A'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <span\n className={`text-xs px-2 py-1 rounded-full capitalize ${statusColor[feature.status] ?? 'bg-gray-100'}`}\n >\n {feature.status.toLowerCase().replace('_', ' ')}\n </span>\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 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-primary\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.priorityScore ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Priority Score</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <ThumbsUp className=\"h-5 w-5 mx-auto text-green-500\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.voteCount}</p>\n <p className=\"text-xs text-muted-foreground\">Votes</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-yellow-500\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.businessValue ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Business Value</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <MessageSquare className=\"h-5 w-5 mx-auto text-blue-500\" />\n <p className=\"text-2xl font-bold mt-1\">{competitors.length}</p>\n <p className=\"text-xs text-muted-foreground\">Competitors</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{feature.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Votes ({votes.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {votes.length === 0 && <p className=\"text-sm text-muted-foreground\">No votes yet.</p>}\n {votes.map((vote) => (\n <div\n key={vote.id}\n className=\"flex items-start justify-between border rounded-md p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">Voter: {vote.voterId}</p>\n {vote.comment && (\n <p className=\"text-xs text-muted-foreground mt-1\">{vote.comment}</p>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <ThumbsUp className=\"h-3 w-3 text-green-500\" />\n <span className=\"text-sm font-bold\">{vote.weight}</span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {competitors.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Competitor Analysis ({competitors.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {competitors.map((comp) => (\n <div key={comp.id} className=\"border rounded-md p-3\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">{comp.name}</p>\n {comp.website && <span className=\"text-xs text-primary\">{comp.website}</span>}\n </div>\n {comp.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{comp.description}</p>\n )}\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-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant=\"secondary\" className=\"capitalize\">\n {feature.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority Score</span>\n <Badge variant=\"outline\">{feature.priorityScore ?? 'N/A'}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Effort</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {feature.effortEstimate ?? 'N/A'}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Business Value</span>\n <span className=\"font-medium\">{feature.businessValue ?? 'N/A'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Submitted By</span>\n <span>{feature.submittedBy}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(feature.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n {feature.tags?.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1\">\n {feature.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProductsFeatureDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Star, ThumbsUp, MessageSquare, Target, Loader2 } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\n\nconst GET_FEATURE_REQUEST = gql`\n query GetFeatureRequest($id: ID!) {\n planmagnetFeatureRequest(id: $id) {\n id\n workspaceId\n projectId\n title\n description\n status\n businessValue\n effortEstimate\n priorityScore\n voteCount\n submittedBy\n workItemId\n tags\n createdAt\n updatedAt\n votes {\n id\n voterId\n weight\n comment\n createdAt\n }\n competitors {\n id\n name\n description\n website\n }\n }\n }\n`;\n\ninterface FeatureVoteNode {\n id: string;\n voterId: string;\n weight: number;\n comment: string | null;\n createdAt: string;\n}\n\ninterface CompetitorNode {\n id: string;\n name: string;\n description: string | null;\n website: string | null;\n}\n\nexport function ProductsFeatureDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n const params = useParams<{ id: string }>();\n const featureId = params.id ?? '';\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_FEATURE_REQUEST, {\n variables: { id: featureId },\n skip: !featureId,\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 feature: {error.message}</div>;\n }\n\n const feature = data?.planmagnetFeatureRequest;\n if (!feature) return <div className=\"p-6 text-muted-foreground\">Feature not found.</div>;\n\n const votes: FeatureVoteNode[] = feature.votes ?? [];\n const competitors: CompetitorNode[] = feature.competitors ?? [];\n\n const statusColor: Record<string, string> = {\n SUBMITTED: 'bg-gray-100 text-gray-800',\n UNDER_REVIEW: 'bg-yellow-100 text-yellow-800',\n PLANNED: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-purple-100 text-purple-800',\n COMPLETED: 'bg-green-100 text-green-800',\n DECLINED: 'bg-red-100 text-red-800',\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{feature.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n Submitted by: <PersonName id={feature.submittedBy} /> &middot; Effort:{' '}\n {feature.effortEstimate ?? 'N/A'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <span\n className={`text-xs px-2 py-1 rounded-full capitalize ${statusColor[feature.status] ?? 'bg-gray-100'}`}\n >\n {feature.status.toLowerCase().replace('_', ' ')}\n </span>\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 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-primary\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.priorityScore ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Priority Score</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <ThumbsUp className=\"h-5 w-5 mx-auto text-green-500\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.voteCount}</p>\n <p className=\"text-xs text-muted-foreground\">Votes</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-yellow-500\" />\n <p className=\"text-2xl font-bold mt-1\">{feature.businessValue ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Business Value</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <MessageSquare className=\"h-5 w-5 mx-auto text-blue-500\" />\n <p className=\"text-2xl font-bold mt-1\">{competitors.length}</p>\n <p className=\"text-xs text-muted-foreground\">Competitors</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{feature.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Votes ({votes.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {votes.length === 0 && <p className=\"text-sm text-muted-foreground\">No votes yet.</p>}\n {votes.map((vote) => (\n <div\n key={vote.id}\n className=\"flex items-start justify-between border rounded-md p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">\n Voter: <PersonName id={vote.voterId} />\n </p>\n {vote.comment && (\n <p className=\"text-xs text-muted-foreground mt-1\">{vote.comment}</p>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <ThumbsUp className=\"h-3 w-3 text-green-500\" />\n <span className=\"text-sm font-bold\">{vote.weight}</span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {competitors.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Competitor Analysis ({competitors.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {competitors.map((comp) => (\n <div key={comp.id} className=\"border rounded-md p-3\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">{comp.name}</p>\n {comp.website && <span className=\"text-xs text-primary\">{comp.website}</span>}\n </div>\n {comp.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{comp.description}</p>\n )}\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-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge variant=\"secondary\" className=\"capitalize\">\n {feature.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority Score</span>\n <Badge variant=\"outline\">{feature.priorityScore ?? 'N/A'}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Effort</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {feature.effortEstimate ?? 'N/A'}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Business Value</span>\n <span className=\"font-medium\">{feature.businessValue ?? 'N/A'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Submitted By</span>\n <PersonName id={feature.submittedBy} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(feature.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n {feature.tags?.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1\">\n {feature.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProductsFeaturesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeaturesPagePage.tsx"],"names":[],"mappings":"AAsEA,wBAAgB,wBAAwB,4CAiNvC"}
1
+ {"version":3,"file":"ProductsFeaturesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeaturesPagePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,wBAAwB,4CAoNvC"}