@burdenoff/microfe-planmagnet 2026.1001.6 → 2026.1001.8

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 (94) hide show
  1. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoutes.js +10 -6
  3. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  4. package/dist/planmagnet/automation/automationRuleTypes.d.ts +31 -19
  5. package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -1
  6. package/dist/planmagnet/automation/automationRuleTypes.js +4 -8
  7. package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -1
  8. package/dist/planmagnet/controls/FeatureControls.d.ts +18 -1
  9. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -1
  10. package/dist/planmagnet/controls/FeatureControls.js +259 -202
  11. package/dist/planmagnet/controls/FeatureControls.js.map +1 -1
  12. package/dist/planmagnet/controls/FeedbackControls.d.ts +70 -0
  13. package/dist/planmagnet/controls/FeedbackControls.d.ts.map +1 -0
  14. package/dist/planmagnet/controls/FeedbackControls.js +153 -0
  15. package/dist/planmagnet/controls/FeedbackControls.js.map +1 -0
  16. package/dist/planmagnet/controls/SyncControls.d.ts.map +1 -1
  17. package/dist/planmagnet/controls/SyncControls.js +1 -0
  18. package/dist/planmagnet/controls/SyncControls.js.map +1 -1
  19. package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts +47 -0
  20. package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts.map +1 -0
  21. package/dist/planmagnet/controls/WebhookSubscriptionControls.js +542 -0
  22. package/dist/planmagnet/controls/WebhookSubscriptionControls.js.map +1 -0
  23. package/dist/planmagnet/dashboards/DashboardUI.js +7 -7
  24. package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js +4 -4
  25. package/dist/planmagnet/forecast/DeliveryForecastCard.js +8 -8
  26. package/dist/planmagnet/forecast/ProjectOutlookCard.js +10 -10
  27. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +9 -9
  28. package/dist/planmagnet/forecast/ResourceForecastCard.js +6 -6
  29. package/dist/planmagnet/hooks/useLiveRefresh.d.ts +33 -2
  30. package/dist/planmagnet/hooks/useLiveRefresh.d.ts.map +1 -1
  31. package/dist/planmagnet/hooks/useLiveRefresh.js +71 -42
  32. package/dist/planmagnet/hooks/useLiveRefresh.js.map +1 -1
  33. package/dist/planmagnet/integrations/syncTypes.d.ts +2 -1
  34. package/dist/planmagnet/integrations/syncTypes.d.ts.map +1 -1
  35. package/dist/planmagnet/integrations/syncTypes.js +19 -9
  36. package/dist/planmagnet/integrations/syncTypes.js.map +1 -1
  37. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +8 -8
  38. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +23 -23
  39. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  40. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +340 -248
  41. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  42. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.d.ts.map +1 -1
  43. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js +172 -167
  44. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js.map +1 -1
  45. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.d.ts.map +1 -1
  46. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js +92 -83
  47. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js.map +1 -1
  48. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts +2 -0
  49. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts.map +1 -0
  50. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js +175 -0
  51. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js.map +1 -0
  52. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +151 -126
  54. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +136 -129
  57. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +149 -119
  60. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProductsProductsPagePage.js +13 -13
  62. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -1
  63. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +153 -117
  64. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
  65. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  66. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +173 -138
  67. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  68. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +9 -9
  69. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +8 -8
  70. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +12 -12
  71. package/dist/planmagnet/pages/ReportsReportsPagePage.js +23 -23
  72. package/dist/planmagnet/pages/TasksMyDashboardPagePage.js +18 -18
  73. package/dist/planmagnet/pages/TasksMyWorkPagePage.js +10 -10
  74. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +5 -5
  75. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +8 -8
  76. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +6 -6
  77. package/dist/planmagnet/pages/analytics/MetricsCard.js +6 -6
  78. package/dist/planmagnet/pages/analytics/QualityMetricsCard.js +6 -6
  79. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +8 -8
  80. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +7 -7
  81. package/dist/planmagnet/pages/analytics/ThroughputCard.js +7 -7
  82. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +7 -7
  83. package/dist/planmagnet/people/People.d.ts +14 -0
  84. package/dist/planmagnet/people/People.d.ts.map +1 -1
  85. package/dist/planmagnet/people/People.js +36 -22
  86. package/dist/planmagnet/people/People.js.map +1 -1
  87. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.d.ts.map +1 -1
  88. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +171 -153
  89. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js.map +1 -1
  90. package/dist/planmagnet/webhooks/webhookTypes.d.ts +54 -0
  91. package/dist/planmagnet/webhooks/webhookTypes.d.ts.map +1 -0
  92. package/dist/planmagnet/webhooks/webhookTypes.js +17 -0
  93. package/dist/planmagnet/webhooks/webhookTypes.js.map +1 -0
  94. package/package.json +1 -1
@@ -7,12 +7,13 @@ import { detailPath as s } from "../utils/rowNavigation.js";
7
7
  import { ProjectSelect as c, WorkItemSearchSelect as l } from "./Pickers.js";
8
8
  import { parseIntField as u } from "../utils/formValidation.js";
9
9
  import { PrioritizationScoreFields as d, QuadrantBadge as f, RiceScoreFields as p, kanoLabel as m, moscowLabel as h, prioritizationScoresValid as g, riceInputsValid as _, riceScoreMissingHint as v } from "./PrioritizationControls.js";
10
- import { useState as y } from "react";
11
- import { BarChart3 as b, Pencil as x, ThumbsUp as S, Trash2 as C } from "lucide-react";
12
- import { gql as w } from "@apollo/client";
13
- import { useMutation as T } from "@apollo/client/react";
14
- import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
15
- import { Button as k, Card as A, CardContent as j, CardHeader as M, CardTitle as N, Input as P, ResponsiveDialog as F, ResponsiveDialogContent as I, ResponsiveDialogDescription as L, ResponsiveDialogFooter as R, ResponsiveDialogHeader as z, ResponsiveDialogTitle as B, ResponsiveDialogTrigger as V } from "@burdenoff/fe-libs/ui";
10
+ import { AnonymousSubmissionCheckbox as y, FeedbackFields as b } from "./FeedbackControls.js";
11
+ import { useState as x } from "react";
12
+ import { BarChart3 as S, Pencil as C, ThumbsUp as w, Trash2 as T } from "lucide-react";
13
+ import { gql as E } from "@apollo/client";
14
+ import { useMutation as D } from "@apollo/client/react";
15
+ import { Fragment as O, jsx as k, jsxs as A } from "react/jsx-runtime";
16
+ import { Button as j, Card as M, CardContent as N, CardHeader as P, CardTitle as F, Input as I, ResponsiveDialog as L, ResponsiveDialogContent as R, ResponsiveDialogDescription as z, ResponsiveDialogFooter as B, ResponsiveDialogHeader as V, ResponsiveDialogTitle as ee, ResponsiveDialogTrigger as te } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/planmagnet/controls/FeatureControls.tsx
17
18
  var H = [
18
19
  "SUBMITTED",
@@ -30,17 +31,18 @@ var H = [
30
31
  "ListAllFeaturesAnalytics",
31
32
  "GetFeatureRequestAnalytics",
32
33
  "ReleaseCustomerRequests"
33
- ], W = w`
34
- mutation FeatureControlsVote($id: ID!) {
35
- planmagnetVoteOnFeature(featureRequestId: $id) {
34
+ ], W = E`
35
+ mutation FeatureControlsVote($id: ID!, $input: PlanmagnetVoteOnFeatureInput) {
36
+ planmagnetVoteOnFeature(featureRequestId: $id, input: $input) {
36
37
  id
38
+ isAnonymous
37
39
  }
38
40
  }
39
- `, G = w`
41
+ `, G = E`
40
42
  mutation FeatureControlsUnvote($id: ID!) {
41
43
  planmagnetRemoveFeatureVote(featureRequestId: $id)
42
44
  }
43
- `, K = w`
45
+ `, K = E`
44
46
  mutation FeatureControlsUpdate($id: ID!, $input: PlanmagnetUpdateFeatureRequestInput!) {
45
47
  planmagnetUpdateFeatureRequest(id: $id, input: $input) {
46
48
  id
@@ -60,9 +62,13 @@ var H = [
60
62
  impact
61
63
  confidence
62
64
  riceScore
65
+ rating
66
+ category
67
+ isAnonymous
68
+ submittedBy
63
69
  }
64
70
  }
65
- `, q = w`
71
+ `, q = E`
66
72
  mutation FeatureControlsDelete($id: ID!) {
67
73
  planmagnetDeleteFeatureRequest(id: $id)
68
74
  }
@@ -70,33 +76,47 @@ var H = [
70
76
  refetchQueries: U,
71
77
  awaitRefetchQueries: !0
72
78
  };
73
- function Y({ featureId: e, voted: t }) {
74
- let [n, i] = T(W, J), [o, s] = T(G, J), [c, l] = y(null), u = i.loading || s.loading, d = async () => {
75
- l(null);
79
+ function Y({ featureId: e, voted: n }) {
80
+ let [i, o] = D(W, J), [s, c] = D(G, J), [l, u] = x(null), [d, f] = x(!1), [p, m] = x(null), h = p ?? n, g = o.loading || c.loading, _ = async () => {
81
+ u(null);
76
82
  try {
77
- await r((t ? o : n)({ variables: { id: e } }));
83
+ h ? (await r(s({ variables: { id: e } })), m(!1)) : (await r(i({ variables: {
84
+ id: e,
85
+ input: { isAnonymous: d }
86
+ } })), m(!0), f(!1));
78
87
  } catch (e) {
79
- l(e instanceof Error ? e.message : "Your vote could not be saved.");
88
+ u(t(e, "Your vote could not be saved."));
80
89
  }
81
90
  };
82
- return /* @__PURE__ */ O("div", {
91
+ return /* @__PURE__ */ A("div", {
83
92
  className: "flex flex-col items-end gap-1",
84
- children: [/* @__PURE__ */ O(k, {
85
- size: "sm",
86
- variant: t ? "default" : "outline",
87
- "data-testid": "feature-vote",
88
- "aria-pressed": t,
89
- disabled: u,
90
- onClick: () => void d(),
91
- children: [/* @__PURE__ */ D(S, { className: "mr-1 h-4 w-4" }), t ? "Voted" : "Vote"]
92
- }), c && /* @__PURE__ */ D(a, { message: c })]
93
+ children: [
94
+ !h && /* @__PURE__ */ k(y, {
95
+ idPrefix: "feature-vote",
96
+ checked: d,
97
+ onChange: f,
98
+ disabled: g,
99
+ label: "Vote anonymously",
100
+ hint: null
101
+ }),
102
+ /* @__PURE__ */ A(j, {
103
+ size: "sm",
104
+ variant: h ? "default" : "outline",
105
+ "data-testid": "feature-vote",
106
+ "aria-pressed": h,
107
+ disabled: g,
108
+ onClick: () => void _(),
109
+ children: [/* @__PURE__ */ k(w, { className: "mr-1 h-4 w-4" }), h ? "Voted" : "Vote"]
110
+ }),
111
+ l && /* @__PURE__ */ k(a, { message: l })
112
+ ]
93
113
  });
94
114
  }
95
115
  function X({ feature: t }) {
96
- let c = e(), [l, u] = T(K, J), [d, f] = T(q, {
116
+ let c = e(), [l, u] = D(K, J), [d, f] = D(q, {
97
117
  refetchQueries: U.filter((e) => e !== "GetFeatureRequest"),
98
118
  context: n
99
- }), [p, m] = y(null), h = u.loading || f.loading, g = H.includes(t.status) ? H : [t.status, ...H], _ = async (e) => {
119
+ }), [p, m] = x(null), h = u.loading || f.loading, g = H.includes(t.status) ? H : [t.status, ...H], _ = async (e) => {
100
120
  m(null);
101
121
  try {
102
122
  await r(l({ variables: {
@@ -114,12 +134,12 @@ function X({ feature: t }) {
114
134
  m(e instanceof Error ? e.message : "The request could not be deleted.");
115
135
  }
116
136
  };
117
- return /* @__PURE__ */ O("div", {
137
+ return /* @__PURE__ */ A("div", {
118
138
  className: "flex flex-col items-end gap-2",
119
- children: [/* @__PURE__ */ O("div", {
139
+ children: [/* @__PURE__ */ A("div", {
120
140
  className: "flex flex-wrap items-center justify-end gap-2",
121
141
  children: [
122
- /* @__PURE__ */ D("select", {
142
+ /* @__PURE__ */ k("select", {
123
143
  "aria-label": "Status",
124
144
  "data-testid": "feature-status",
125
145
  className: "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60",
@@ -128,23 +148,23 @@ function X({ feature: t }) {
128
148
  onChange: (e) => {
129
149
  e.target.value !== t.status && _(e.target.value);
130
150
  },
131
- children: g.map((e) => /* @__PURE__ */ D("option", {
151
+ children: g.map((e) => /* @__PURE__ */ k("option", {
132
152
  value: e,
133
153
  children: o(e)
134
154
  }, e))
135
155
  }),
136
- /* @__PURE__ */ D(Z, { feature: t }),
137
- /* @__PURE__ */ O(k, {
156
+ /* @__PURE__ */ k(Z, { feature: t }),
157
+ /* @__PURE__ */ A(j, {
138
158
  size: "sm",
139
159
  variant: "outline",
140
160
  "data-testid": "feature-analytics",
141
161
  onClick: () => c(s("/products/feature-analytics-page", t.id)),
142
- children: [/* @__PURE__ */ D(b, { className: "mr-1 h-4 w-4" }), "Analytics"]
162
+ children: [/* @__PURE__ */ k(S, { className: "mr-1 h-4 w-4" }), "Analytics"]
143
163
  }),
144
- /* @__PURE__ */ D(i, {
164
+ /* @__PURE__ */ k(i, {
145
165
  label: "Delete",
146
166
  variant: "outline",
147
- icon: /* @__PURE__ */ D(C, { className: "mr-1 h-4 w-4" }),
167
+ icon: /* @__PURE__ */ k(T, { className: "mr-1 h-4 w-4" }),
148
168
  title: `Delete "${t.title}"?`,
149
169
  description: "The request and its votes are deleted. This cannot be undone here.",
150
170
  confirmLabel: "Delete request",
@@ -153,7 +173,7 @@ function X({ feature: t }) {
153
173
  onConfirm: () => void v()
154
174
  })
155
175
  ]
156
- }), p && /* @__PURE__ */ D(a, { message: p })]
176
+ }), p && /* @__PURE__ */ k(a, { message: p })]
157
177
  });
158
178
  }
159
179
  function Z({ feature: e }) {
@@ -173,40 +193,49 @@ function Z({ feature: e }) {
173
193
  reach: e.reach == null ? "" : String(e.reach),
174
194
  impact: e.impact == null ? "" : String(e.impact),
175
195
  confidence: e.confidence == null ? "" : String(e.confidence)
176
- }, [s, m] = y(!1), [h, v] = y(n), [b, S] = y(i), [C, w] = y(o), [E, A] = y(null), [j, M] = T(K, J), N = u(h.businessValue, {
196
+ }, s = {
197
+ rating: e.rating == null ? "" : String(e.rating),
198
+ category: e.category ?? ""
199
+ }, m = e.isAnonymous ?? !1, [h, v] = x(!1), [S, w] = x(n), [T, E] = x(i), [O, M] = x(o), [N, P] = x(s), [F, H] = x(m), [U, W] = x(null), [G, q] = D(K, J), Y = u(S.businessValue, {
177
200
  min: 0,
178
201
  max: 100
179
- }), H = h.title.trim() !== "" && !N.invalid && g(b) && _(C) && !M.loading, U = async () => {
180
- A(null);
181
- let a = (e) => e.trim() ? e.trim() : null, s = u(b.valueScore, {
202
+ }), X = u(N.rating, {
203
+ min: 1,
204
+ max: 5
205
+ }), Z = S.title.trim() !== "" && !Y.invalid && !X.invalid && g(T) && _(O) && !q.loading, Q = async () => {
206
+ W(null);
207
+ let a = (e) => e.trim() ? e.trim() : null, c = u(T.valueScore, {
182
208
  min: 1,
183
209
  max: 10
184
- }), c = u(b.effortScore, {
210
+ }), l = u(T.effortScore, {
185
211
  min: 1,
186
212
  max: 10
187
- }), l = u(C.reach, {
213
+ }), d = u(O.reach, {
188
214
  min: 1,
189
215
  max: 10
190
- }), d = u(C.impact, {
216
+ }), f = u(O.impact, {
191
217
  min: 1,
192
218
  max: 10
193
- }), f = u(C.confidence, {
219
+ }), p = u(O.confidence, {
194
220
  min: 1,
195
221
  max: 10
196
- }), p = {
197
- title: h.title.trim(),
198
- description: a(h.description),
199
- businessValue: N.value ?? null,
200
- effortEstimate: a(h.effortEstimate),
201
- projectId: h.projectId || null,
202
- workItemId: h.workItemId || null,
203
- moscow: b.moscow || null,
204
- kano: b.kano || null,
205
- valueScore: s.value ?? null,
206
- effortScore: c.value ?? null,
207
- reach: l.value ?? null,
208
- impact: d.value ?? null,
209
- confidence: f.value ?? null
222
+ }), h = {
223
+ title: S.title.trim(),
224
+ description: a(S.description),
225
+ businessValue: Y.value ?? null,
226
+ effortEstimate: a(S.effortEstimate),
227
+ projectId: S.projectId || null,
228
+ workItemId: S.workItemId || null,
229
+ moscow: T.moscow || null,
230
+ kano: T.kano || null,
231
+ valueScore: c.value ?? null,
232
+ effortScore: l.value ?? null,
233
+ reach: d.value ?? null,
234
+ impact: f.value ?? null,
235
+ confidence: p.value ?? null,
236
+ rating: X.value ?? null,
237
+ category: a(N.category),
238
+ isAnonymous: F
210
239
  }, g = {
211
240
  title: n.title,
212
241
  description: a(n.description),
@@ -217,184 +246,187 @@ function Z({ feature: e }) {
217
246
  moscow: i.moscow || null,
218
247
  kano: i.kano || null,
219
248
  valueScore: i.valueScore === "" ? null : Number(i.valueScore),
249
+ rating: s.rating === "" ? null : Number(s.rating),
250
+ category: a(s.category),
251
+ isAnonymous: m,
220
252
  effortScore: i.effortScore === "" ? null : Number(i.effortScore),
221
253
  reach: o.reach === "" ? null : Number(o.reach),
222
254
  impact: o.impact === "" ? null : Number(o.impact),
223
255
  confidence: o.confidence === "" ? null : Number(o.confidence)
224
- }, _ = Object.fromEntries(Object.entries(p).filter(([e, t]) => t !== g[e]));
256
+ }, _ = Object.fromEntries(Object.entries(h).filter(([e, t]) => t !== g[e]));
225
257
  if (Object.keys(_).length === 0) {
226
- m(!1);
258
+ v(!1);
227
259
  return;
228
260
  }
229
261
  try {
230
- await r(j({ variables: {
262
+ await r(G({ variables: {
231
263
  id: e.id,
232
264
  input: _
233
- } })), m(!1);
265
+ } })), v(!1);
234
266
  } catch (e) {
235
- A(t(e, "The request could not be saved."));
267
+ W(t(e, "The request could not be saved."));
236
268
  }
237
- }, W = "text-sm font-medium";
238
- return /* @__PURE__ */ O(F, {
239
- open: s,
269
+ }, $ = "text-sm font-medium";
270
+ return /* @__PURE__ */ A(L, {
271
+ open: h,
240
272
  onOpenChange: (e) => {
241
- m(e), e ? (v(n), S(i), w(o)) : A(null);
273
+ v(e), e ? (w(n), E(i), M(o), P(s), H(m)) : W(null);
242
274
  },
243
- children: [/* @__PURE__ */ D(V, {
275
+ children: [/* @__PURE__ */ k(te, {
244
276
  asChild: !0,
245
- children: /* @__PURE__ */ O(k, {
277
+ children: /* @__PURE__ */ A(j, {
246
278
  size: "sm",
247
279
  variant: "outline",
248
280
  "data-testid": "feature-edit",
249
- children: [/* @__PURE__ */ D(x, { className: "mr-1 h-4 w-4" }), "Edit"]
281
+ children: [/* @__PURE__ */ k(C, { className: "mr-1 h-4 w-4" }), "Edit"]
250
282
  })
251
- }), /* @__PURE__ */ O(I, {
283
+ }), /* @__PURE__ */ A(R, {
252
284
  className: "max-w-lg",
253
285
  children: [
254
- /* @__PURE__ */ O(z, { children: [/* @__PURE__ */ D(B, { children: "Edit feature request" }), /* @__PURE__ */ D(L, { children: "Link the request to the work item that delivers it so releases can show who is waiting on it." })] }),
255
- /* @__PURE__ */ O("div", {
286
+ /* @__PURE__ */ A(V, { children: [/* @__PURE__ */ k(ee, { children: "Edit feature request" }), /* @__PURE__ */ k(z, { children: "Link the request to the work item that delivers it so releases can show who is waiting on it." })] }),
287
+ /* @__PURE__ */ A("div", {
256
288
  className: "space-y-3",
257
289
  children: [
258
- /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
290
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
259
291
  htmlFor: "feature-edit-title",
260
- className: W,
292
+ className: $,
261
293
  children: "Title"
262
- }), /* @__PURE__ */ D(P, {
294
+ }), /* @__PURE__ */ k(I, {
263
295
  id: "feature-edit-title",
264
296
  className: "mt-1",
265
- value: h.title,
266
- onChange: (e) => v({
267
- ...h,
297
+ value: S.title,
298
+ onChange: (e) => w({
299
+ ...S,
268
300
  title: e.target.value
269
301
  })
270
302
  })] }),
271
- /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
303
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
272
304
  htmlFor: "feature-edit-description",
273
- className: W,
305
+ className: $,
274
306
  children: "Description"
275
- }), /* @__PURE__ */ D("textarea", {
307
+ }), /* @__PURE__ */ k("textarea", {
276
308
  id: "feature-edit-description",
277
309
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]",
278
- value: h.description,
279
- onChange: (e) => v({
280
- ...h,
310
+ value: S.description,
311
+ onChange: (e) => w({
312
+ ...S,
281
313
  description: e.target.value
282
314
  })
283
315
  })] }),
284
- /* @__PURE__ */ O("div", {
316
+ /* @__PURE__ */ A("div", {
285
317
  className: "grid grid-cols-2 gap-3",
286
- children: [/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
318
+ children: [/* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
287
319
  htmlFor: "feature-edit-value",
288
- className: W,
320
+ className: $,
289
321
  children: "Business value (0–100)"
290
- }), /* @__PURE__ */ D(P, {
322
+ }), /* @__PURE__ */ k(I, {
291
323
  id: "feature-edit-value",
292
324
  type: "number",
293
325
  min: 0,
294
326
  max: 100,
295
327
  className: "mt-1",
296
- value: h.businessValue,
297
- "aria-invalid": N.invalid,
298
- onChange: (e) => v({
299
- ...h,
328
+ value: S.businessValue,
329
+ "aria-invalid": Y.invalid,
330
+ onChange: (e) => w({
331
+ ...S,
300
332
  businessValue: e.target.value
301
333
  })
302
- })] }), /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
334
+ })] }), /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
303
335
  htmlFor: "feature-edit-effort",
304
- className: W,
336
+ className: $,
305
337
  children: "Effort"
306
- }), /* @__PURE__ */ D(P, {
338
+ }), /* @__PURE__ */ k(I, {
307
339
  id: "feature-edit-effort",
308
340
  className: "mt-1",
309
341
  placeholder: "e.g. M",
310
- value: h.effortEstimate,
311
- onChange: (e) => v({
312
- ...h,
342
+ value: S.effortEstimate,
343
+ onChange: (e) => w({
344
+ ...S,
313
345
  effortEstimate: e.target.value
314
346
  })
315
347
  })] })]
316
348
  }),
317
- N.invalid && /* @__PURE__ */ D(a, { message: "Business value is a whole number from 0 to 100." }),
318
- /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
349
+ Y.invalid && /* @__PURE__ */ k(a, { message: "Business value is a whole number from 0 to 100." }),
350
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
319
351
  htmlFor: "feature-edit-project",
320
- className: W,
352
+ className: $,
321
353
  children: "Project"
322
- }), /* @__PURE__ */ D("div", {
354
+ }), /* @__PURE__ */ k("div", {
323
355
  className: "mt-1",
324
- children: /* @__PURE__ */ D(c, {
356
+ children: /* @__PURE__ */ k(c, {
325
357
  id: "feature-edit-project",
326
- value: h.projectId,
358
+ value: S.projectId,
327
359
  noneLabel: "No project",
328
- onChange: (e) => v({
329
- ...h,
360
+ onChange: (e) => w({
361
+ ...S,
330
362
  projectId: e,
331
363
  workItemId: ""
332
364
  })
333
365
  })
334
366
  })] }),
335
- /* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("label", {
367
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("label", {
336
368
  htmlFor: "feature-edit-workitem",
337
- className: W,
369
+ className: $,
338
370
  children: "Delivered by work item"
339
- }), /* @__PURE__ */ D("div", {
371
+ }), /* @__PURE__ */ k("div", {
340
372
  className: "mt-1",
341
- children: /* @__PURE__ */ D(l, {
373
+ children: /* @__PURE__ */ k(l, {
342
374
  id: "feature-edit-workitem",
343
- projectId: h.projectId || void 0,
344
- value: h.workItemId,
345
- onChange: (e) => v({
346
- ...h,
375
+ projectId: S.projectId || void 0,
376
+ value: S.workItemId,
377
+ onChange: (e) => w({
378
+ ...S,
347
379
  workItemId: e
348
380
  })
349
381
  })
350
382
  })] }),
351
- /* @__PURE__ */ O("div", {
383
+ /* @__PURE__ */ A("div", {
352
384
  className: "border-t pt-3",
353
385
  children: [
354
- /* @__PURE__ */ D("p", {
355
- className: W,
386
+ /* @__PURE__ */ k("p", {
387
+ className: $,
356
388
  children: "Prioritization"
357
389
  }),
358
- /* @__PURE__ */ O("div", {
390
+ /* @__PURE__ */ A("div", {
359
391
  className: "mt-1 flex items-center gap-2",
360
- children: [/* @__PURE__ */ D("span", {
392
+ children: [/* @__PURE__ */ k("span", {
361
393
  className: "text-xs text-muted-foreground",
362
394
  children: "Current quadrant:"
363
- }), /* @__PURE__ */ D(f, { quadrant: e.valueEffortQuadrant ?? null })]
395
+ }), /* @__PURE__ */ k(f, { quadrant: e.valueEffortQuadrant ?? null })]
364
396
  }),
365
- /* @__PURE__ */ D("div", {
397
+ /* @__PURE__ */ k("div", {
366
398
  className: "mt-2",
367
- children: /* @__PURE__ */ D(d, {
399
+ children: /* @__PURE__ */ k(d, {
368
400
  idPrefix: "feature-edit",
369
- values: b,
370
- onChange: S
401
+ values: T,
402
+ onChange: E
371
403
  })
372
404
  }),
373
- /* @__PURE__ */ O("div", {
405
+ /* @__PURE__ */ A("div", {
374
406
  className: "mt-3 border-t pt-3",
375
407
  children: [
376
- /* @__PURE__ */ D("p", {
377
- className: W,
408
+ /* @__PURE__ */ k("p", {
409
+ className: $,
378
410
  children: "RICE"
379
411
  }),
380
- /* @__PURE__ */ O("div", {
412
+ /* @__PURE__ */ A("div", {
381
413
  className: "mt-1 flex items-center gap-2",
382
- children: [/* @__PURE__ */ D("span", {
414
+ children: [/* @__PURE__ */ k("span", {
383
415
  className: "text-xs text-muted-foreground",
384
416
  children: "Current RICE score:"
385
- }), /* @__PURE__ */ D("span", {
417
+ }), /* @__PURE__ */ k("span", {
386
418
  className: "text-sm font-medium",
387
419
  "data-testid": "feature-edit-rice-score",
388
420
  children: e.riceScore == null ? "—" : e.riceScore.toFixed(1)
389
421
  })]
390
422
  }),
391
- /* @__PURE__ */ D("div", {
423
+ /* @__PURE__ */ k("div", {
392
424
  className: "mt-2",
393
- children: /* @__PURE__ */ D(p, {
425
+ children: /* @__PURE__ */ k(p, {
394
426
  idPrefix: "feature-edit",
395
- values: C,
396
- onChange: w,
397
- effortScoreMissing: u(b.effortScore, {
427
+ values: O,
428
+ onChange: M,
429
+ effortScoreMissing: u(T.effortScore, {
398
430
  min: 1,
399
431
  max: 10
400
432
  }).value == null
@@ -404,17 +436,42 @@ function Z({ feature: e }) {
404
436
  })
405
437
  ]
406
438
  }),
407
- E && /* @__PURE__ */ D(a, { message: E })
439
+ /* @__PURE__ */ A("div", {
440
+ className: "border-t pt-3",
441
+ children: [
442
+ /* @__PURE__ */ k("p", {
443
+ className: $,
444
+ children: "Feedback"
445
+ }),
446
+ /* @__PURE__ */ A("div", {
447
+ className: "mt-2",
448
+ children: [/* @__PURE__ */ k(b, {
449
+ idPrefix: "feature-edit",
450
+ values: N,
451
+ onChange: P
452
+ }), X.invalid && /* @__PURE__ */ k(a, { message: "Rating is a whole number from 1 to 5." })]
453
+ }),
454
+ /* @__PURE__ */ k("div", {
455
+ className: "mt-3",
456
+ children: /* @__PURE__ */ k(y, {
457
+ idPrefix: "feature-edit",
458
+ checked: F,
459
+ onChange: H
460
+ })
461
+ })
462
+ ]
463
+ }),
464
+ U && /* @__PURE__ */ k(a, { message: U })
408
465
  ]
409
466
  }),
410
- /* @__PURE__ */ O(R, { children: [/* @__PURE__ */ D(k, {
467
+ /* @__PURE__ */ A(B, { children: [/* @__PURE__ */ k(j, {
411
468
  variant: "outline",
412
- onClick: () => m(!1),
469
+ onClick: () => v(!1),
413
470
  children: "Cancel"
414
- }), /* @__PURE__ */ D(k, {
415
- onClick: () => void U(),
416
- disabled: !H,
417
- children: M.loading ? "Saving…" : "Save"
471
+ }), /* @__PURE__ */ k(j, {
472
+ onClick: () => void Q(),
473
+ disabled: !Z,
474
+ children: q.loading ? "Saving…" : "Save"
418
475
  })] })
419
476
  ]
420
477
  })]
@@ -430,8 +487,8 @@ function Q({ feature: e }) {
430
487
  reach: e.reach == null ? "" : String(e.reach),
431
488
  impact: e.impact == null ? "" : String(e.impact),
432
489
  confidence: e.confidence == null ? "" : String(e.confidence)
433
- }, [o, s] = y(!1), [c, l] = y(n), [b, S] = y(i), [C, w] = y(null), [P, F] = T(K, J), I = () => {
434
- l(n), S(i), w(null), s(!0);
490
+ }, [o, s] = x(!1), [c, l] = x(n), [y, b] = x(i), [S, w] = x(null), [T, E] = D(K, J), I = () => {
491
+ l(n), b(i), w(null), s(!0);
435
492
  }, L = async () => {
436
493
  w(null);
437
494
  let n = u(c.valueScore, {
@@ -440,13 +497,13 @@ function Q({ feature: e }) {
440
497
  }), i = u(c.effortScore, {
441
498
  min: 1,
442
499
  max: 10
443
- }), a = u(b.reach, {
500
+ }), a = u(y.reach, {
444
501
  min: 1,
445
502
  max: 10
446
- }), o = u(b.impact, {
503
+ }), o = u(y.impact, {
447
504
  min: 1,
448
505
  max: 10
449
- }), l = u(b.confidence, {
506
+ }), l = u(y.confidence, {
450
507
  min: 1,
451
508
  max: 10
452
509
  }), d = {
@@ -459,7 +516,7 @@ function Q({ feature: e }) {
459
516
  confidence: l.value ?? null
460
517
  };
461
518
  try {
462
- await r(P({ variables: {
519
+ await r(T({ variables: {
463
520
  id: e.id,
464
521
  input: d
465
522
  } })), s(!1);
@@ -467,157 +524,157 @@ function Q({ feature: e }) {
467
524
  w(t(e, "The prioritization could not be saved."));
468
525
  }
469
526
  };
470
- return /* @__PURE__ */ O(A, {
527
+ return /* @__PURE__ */ A(M, {
471
528
  "data-testid": "feature-prioritization-card",
472
- children: [/* @__PURE__ */ O(M, {
529
+ children: [/* @__PURE__ */ A(P, {
473
530
  className: "flex flex-row items-center justify-between gap-2",
474
- children: [/* @__PURE__ */ D(N, { children: "Prioritization" }), !o && /* @__PURE__ */ O(k, {
531
+ children: [/* @__PURE__ */ k(F, { children: "Prioritization" }), !o && /* @__PURE__ */ A(j, {
475
532
  size: "sm",
476
533
  variant: "outline",
477
534
  "data-testid": "feature-prioritization-edit",
478
535
  onClick: I,
479
- children: [/* @__PURE__ */ D(x, { className: "mr-1 h-4 w-4" }), "Edit"]
536
+ children: [/* @__PURE__ */ k(C, { className: "mr-1 h-4 w-4" }), "Edit"]
480
537
  })]
481
- }), /* @__PURE__ */ D(j, {
538
+ }), /* @__PURE__ */ k(N, {
482
539
  className: "space-y-3",
483
- children: o ? /* @__PURE__ */ O(E, { children: [
484
- /* @__PURE__ */ D(d, {
540
+ children: o ? /* @__PURE__ */ A(O, { children: [
541
+ /* @__PURE__ */ k(d, {
485
542
  idPrefix: "feature-prio",
486
543
  values: c,
487
544
  onChange: l
488
545
  }),
489
- /* @__PURE__ */ O("div", {
546
+ /* @__PURE__ */ A("div", {
490
547
  className: "border-t pt-3",
491
- children: [/* @__PURE__ */ D("p", {
548
+ children: [/* @__PURE__ */ k("p", {
492
549
  className: "text-sm font-medium mb-1",
493
550
  children: "RICE"
494
- }), /* @__PURE__ */ D(p, {
551
+ }), /* @__PURE__ */ k(p, {
495
552
  idPrefix: "feature-prio",
496
- values: b,
497
- onChange: S,
553
+ values: y,
554
+ onChange: b,
498
555
  effortScoreMissing: u(c.effortScore, {
499
556
  min: 1,
500
557
  max: 10
501
558
  }).value == null
502
559
  })]
503
560
  }),
504
- C && /* @__PURE__ */ D(a, { message: C }),
505
- /* @__PURE__ */ O("div", {
561
+ S && /* @__PURE__ */ k(a, { message: S }),
562
+ /* @__PURE__ */ A("div", {
506
563
  className: "flex justify-end gap-2",
507
- children: [/* @__PURE__ */ D(k, {
564
+ children: [/* @__PURE__ */ k(j, {
508
565
  size: "sm",
509
566
  variant: "outline",
510
567
  onClick: () => s(!1),
511
568
  children: "Cancel"
512
- }), /* @__PURE__ */ D(k, {
569
+ }), /* @__PURE__ */ k(j, {
513
570
  size: "sm",
514
571
  "data-testid": "feature-prioritization-save",
515
- disabled: F.loading || !g(c) || !_(b),
572
+ disabled: E.loading || !g(c) || !_(y),
516
573
  onClick: () => void L(),
517
- children: F.loading ? "Saving…" : "Save"
574
+ children: E.loading ? "Saving…" : "Save"
518
575
  })]
519
576
  })
520
- ] }) : /* @__PURE__ */ O(E, { children: [
521
- /* @__PURE__ */ O("div", {
577
+ ] }) : /* @__PURE__ */ A(O, { children: [
578
+ /* @__PURE__ */ A("div", {
522
579
  className: "flex items-center gap-2",
523
- children: [/* @__PURE__ */ D("span", {
580
+ children: [/* @__PURE__ */ k("span", {
524
581
  className: "text-xs text-muted-foreground",
525
582
  children: "Quadrant:"
526
- }), /* @__PURE__ */ D(f, { quadrant: e.valueEffortQuadrant ?? null })]
583
+ }), /* @__PURE__ */ k(f, { quadrant: e.valueEffortQuadrant ?? null })]
527
584
  }),
528
- /* @__PURE__ */ O("div", {
585
+ /* @__PURE__ */ A("div", {
529
586
  className: "grid grid-cols-2 gap-2 text-sm",
530
587
  children: [
531
- /* @__PURE__ */ O("div", {
588
+ /* @__PURE__ */ A("div", {
532
589
  className: "flex justify-between",
533
- children: [/* @__PURE__ */ D("span", {
590
+ children: [/* @__PURE__ */ k("span", {
534
591
  className: "text-muted-foreground",
535
592
  children: "MoSCoW"
536
- }), /* @__PURE__ */ D("span", {
593
+ }), /* @__PURE__ */ k("span", {
537
594
  className: "font-medium",
538
595
  children: h(e.moscow)
539
596
  })]
540
597
  }),
541
- /* @__PURE__ */ O("div", {
598
+ /* @__PURE__ */ A("div", {
542
599
  className: "flex justify-between",
543
- children: [/* @__PURE__ */ D("span", {
600
+ children: [/* @__PURE__ */ k("span", {
544
601
  className: "text-muted-foreground",
545
602
  children: "Kano"
546
- }), /* @__PURE__ */ D("span", {
603
+ }), /* @__PURE__ */ k("span", {
547
604
  className: "font-medium",
548
605
  children: m(e.kano)
549
606
  })]
550
607
  }),
551
- /* @__PURE__ */ O("div", {
608
+ /* @__PURE__ */ A("div", {
552
609
  className: "flex justify-between",
553
- children: [/* @__PURE__ */ D("span", {
610
+ children: [/* @__PURE__ */ k("span", {
554
611
  className: "text-muted-foreground",
555
612
  children: "Value score"
556
- }), /* @__PURE__ */ D("span", {
613
+ }), /* @__PURE__ */ k("span", {
557
614
  className: "font-medium",
558
615
  children: e.valueScore ?? "Not set"
559
616
  })]
560
617
  }),
561
- /* @__PURE__ */ O("div", {
618
+ /* @__PURE__ */ A("div", {
562
619
  className: "flex justify-between",
563
- children: [/* @__PURE__ */ D("span", {
620
+ children: [/* @__PURE__ */ k("span", {
564
621
  className: "text-muted-foreground",
565
622
  children: "Effort score"
566
- }), /* @__PURE__ */ D("span", {
623
+ }), /* @__PURE__ */ k("span", {
567
624
  className: "font-medium",
568
625
  children: e.effortScore ?? "Not set"
569
626
  })]
570
627
  })
571
628
  ]
572
629
  }),
573
- /* @__PURE__ */ O("div", {
630
+ /* @__PURE__ */ A("div", {
574
631
  className: "border-t pt-3",
575
632
  children: [
576
- /* @__PURE__ */ O("div", {
633
+ /* @__PURE__ */ A("div", {
577
634
  className: "flex items-center justify-between",
578
- children: [/* @__PURE__ */ D("span", {
635
+ children: [/* @__PURE__ */ k("span", {
579
636
  className: "text-xs text-muted-foreground",
580
637
  children: "RICE score"
581
- }), /* @__PURE__ */ D("span", {
638
+ }), /* @__PURE__ */ k("span", {
582
639
  className: "font-medium",
583
640
  "data-testid": "feature-rice-score",
584
641
  children: e.riceScore == null ? "—" : e.riceScore.toFixed(1)
585
642
  })]
586
643
  }),
587
- e.riceScore == null && /* @__PURE__ */ D("p", {
644
+ e.riceScore == null && /* @__PURE__ */ k("p", {
588
645
  className: "text-xs text-muted-foreground mt-0.5",
589
646
  "data-testid": "feature-rice-missing-hint",
590
647
  children: v(e)
591
648
  }),
592
- /* @__PURE__ */ O("div", {
649
+ /* @__PURE__ */ A("div", {
593
650
  className: "grid grid-cols-3 gap-2 text-sm mt-2",
594
651
  children: [
595
- /* @__PURE__ */ O("div", {
652
+ /* @__PURE__ */ A("div", {
596
653
  className: "flex justify-between",
597
- children: [/* @__PURE__ */ D("span", {
654
+ children: [/* @__PURE__ */ k("span", {
598
655
  className: "text-muted-foreground",
599
656
  children: "Reach"
600
- }), /* @__PURE__ */ D("span", {
657
+ }), /* @__PURE__ */ k("span", {
601
658
  className: "font-medium",
602
659
  children: e.reach ?? "Not set"
603
660
  })]
604
661
  }),
605
- /* @__PURE__ */ O("div", {
662
+ /* @__PURE__ */ A("div", {
606
663
  className: "flex justify-between",
607
- children: [/* @__PURE__ */ D("span", {
664
+ children: [/* @__PURE__ */ k("span", {
608
665
  className: "text-muted-foreground",
609
666
  children: "Impact"
610
- }), /* @__PURE__ */ D("span", {
667
+ }), /* @__PURE__ */ k("span", {
611
668
  className: "font-medium",
612
669
  children: e.impact ?? "Not set"
613
670
  })]
614
671
  }),
615
- /* @__PURE__ */ O("div", {
672
+ /* @__PURE__ */ A("div", {
616
673
  className: "flex justify-between",
617
- children: [/* @__PURE__ */ D("span", {
674
+ children: [/* @__PURE__ */ k("span", {
618
675
  className: "text-muted-foreground",
619
676
  children: "Confidence"
620
- }), /* @__PURE__ */ D("span", {
677
+ }), /* @__PURE__ */ k("span", {
621
678
  className: "font-medium",
622
679
  children: e.confidence ?? "Not set"
623
680
  })]