@burdenoff/microfe-planmagnet 2026.1001.5 → 2026.1001.7

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