@burdenoff/microfe-planmagnet 2026.509.103

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 (222) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +21253 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +8370 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +4182 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  16. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  17. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  18. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  19. package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
  20. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
  21. package/dist/planmagnet/PlanMagnetRoot.js +292 -0
  22. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -0
  23. package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
  24. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
  25. package/dist/planmagnet/PlanMagnetRoutes.js +211 -0
  26. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -0
  27. package/dist/planmagnet/index.d.ts +5 -0
  28. package/dist/planmagnet/index.d.ts.map +1 -0
  29. package/dist/planmagnet/index.js +3 -0
  30. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  31. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  32. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +312 -0
  33. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
  34. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
  35. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
  36. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +110 -0
  37. package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -0
  38. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +96 -0
  41. package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
  43. package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
  44. package/dist/planmagnet/pages/CollaborationFilesPagePage.js +112 -0
  45. package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -0
  46. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +141 -0
  49. package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +124 -0
  53. package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +350 -0
  57. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -0
  58. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
  59. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
  60. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +290 -0
  61. package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -0
  62. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
  63. package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
  64. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +189 -0
  65. package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -0
  66. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
  67. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
  68. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +151 -0
  69. package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -0
  70. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
  71. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
  72. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +257 -0
  73. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -0
  74. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
  75. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
  76. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +221 -0
  77. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -0
  78. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
  79. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
  80. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +284 -0
  81. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -0
  82. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
  83. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
  84. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +291 -0
  85. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -0
  86. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
  87. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
  88. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +257 -0
  89. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -0
  90. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
  91. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
  92. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +222 -0
  93. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -0
  94. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
  95. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
  96. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +288 -0
  97. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -0
  98. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
  99. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
  100. package/dist/planmagnet/pages/ProductsProductsPagePage.js +225 -0
  101. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -0
  102. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
  103. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
  104. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +262 -0
  105. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -0
  106. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
  107. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
  108. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +162 -0
  109. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -0
  110. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
  111. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
  112. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +342 -0
  113. package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -0
  114. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
  115. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
  116. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +233 -0
  117. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -0
  118. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
  119. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
  120. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +193 -0
  121. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -0
  122. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
  123. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
  124. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +116 -0
  125. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -0
  126. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
  127. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
  128. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +199 -0
  129. package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -0
  130. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
  131. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
  132. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +197 -0
  133. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -0
  134. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
  135. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
  136. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +173 -0
  137. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -0
  138. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
  139. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
  140. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +119 -0
  141. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -0
  142. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
  143. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
  144. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +257 -0
  145. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -0
  146. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
  147. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
  148. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +222 -0
  149. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -0
  150. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
  151. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
  152. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +142 -0
  153. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -0
  154. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
  155. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
  156. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +363 -0
  157. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -0
  158. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
  159. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
  160. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +176 -0
  161. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -0
  162. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
  163. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
  164. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +173 -0
  165. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -0
  166. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
  167. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
  168. package/dist/planmagnet/pages/ReportsReportsPagePage.js +221 -0
  169. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -0
  170. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
  171. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
  172. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +282 -0
  173. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -0
  174. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
  175. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
  176. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +227 -0
  177. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -0
  178. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
  179. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
  180. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +234 -0
  181. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -0
  182. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
  183. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
  184. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +232 -0
  185. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -0
  186. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
  187. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
  188. package/dist/planmagnet/pages/TasksTasksPagePage.js +206 -0
  189. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -0
  190. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
  191. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
  192. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +138 -0
  193. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -0
  194. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
  195. package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
  196. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +161 -0
  197. package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -0
  198. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
  199. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
  200. package/dist/planmagnet/pages/TeamTeamPagePage.js +203 -0
  201. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -0
  202. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
  203. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
  204. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +97 -0
  205. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -0
  206. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
  207. package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
  208. package/dist/planmagnet/providers/PlanMagnetProvider.js +119 -0
  209. package/dist/planmagnet/providers/PlanMagnetProvider.js.map +1 -0
  210. package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
  211. package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
  212. package/dist/planmagnet/store/planmagnetStore.js +42 -0
  213. package/dist/planmagnet/store/planmagnetStore.js.map +1 -0
  214. package/dist/planmagnet/types/index.d.ts +317 -0
  215. package/dist/planmagnet/types/index.d.ts.map +1 -0
  216. package/dist/planmagnet/utils/cn.d.ts +4 -0
  217. package/dist/planmagnet/utils/cn.d.ts.map +1 -0
  218. package/dist/planmagnet/utils/navigation.d.ts +2 -0
  219. package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
  220. package/dist/planmagnet/utils/navigation.js +8 -0
  221. package/dist/planmagnet/utils/navigation.js.map +1 -0
  222. package/package.json +107 -0
@@ -0,0 +1,291 @@
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-dom";
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";
8
+ //#region src/planmagnet/pages/ProductsFeatureDetailPagePage.tsx
9
+ var g = s`
10
+ query GetFeatureRequest($id: ID!) {
11
+ planmagnetFeatureRequest(id: $id) {
12
+ id
13
+ workspaceId
14
+ projectId
15
+ title
16
+ description
17
+ status
18
+ businessValue
19
+ effortEstimate
20
+ priorityScore
21
+ voteCount
22
+ submittedBy
23
+ workItemId
24
+ tags
25
+ createdAt
26
+ updatedAt
27
+ votes {
28
+ id
29
+ voterId
30
+ weight
31
+ comment
32
+ createdAt
33
+ }
34
+ competitors {
35
+ id
36
+ name
37
+ description
38
+ website
39
+ }
40
+ }
41
+ }
42
+ `;
43
+ function _() {
44
+ let { workspaceId: s } = e(), _ = o().id ?? "", { data: v, loading: y, error: b } = c(g, {
45
+ variables: { id: _ },
46
+ skip: !_
47
+ });
48
+ if (y) return /* @__PURE__ */ l("div", {
49
+ className: "flex items-center justify-center p-12",
50
+ children: /* @__PURE__ */ l(t, { className: "h-8 w-8 animate-spin text-muted-foreground" })
51
+ });
52
+ if (b) return /* @__PURE__ */ u("div", {
53
+ className: "p-6 text-destructive",
54
+ children: ["Failed to load feature: ", b.message]
55
+ });
56
+ let x = v?.planmagnetFeatureRequest;
57
+ if (!x) return /* @__PURE__ */ l("div", {
58
+ className: "p-6 text-muted-foreground",
59
+ children: "Feature not found."
60
+ });
61
+ let S = x.votes ?? [], C = x.competitors ?? [];
62
+ return /* @__PURE__ */ u("div", {
63
+ className: "space-y-6 p-6",
64
+ children: [
65
+ /* @__PURE__ */ u("div", {
66
+ className: "flex items-center justify-between",
67
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
68
+ className: "text-2xl font-semibold",
69
+ children: x.title
70
+ }), /* @__PURE__ */ u("p", {
71
+ className: "text-sm text-muted-foreground",
72
+ children: [
73
+ "Submitted by: ",
74
+ x.submittedBy,
75
+ " · Effort: ",
76
+ x.effortEstimate ?? "N/A"
77
+ ]
78
+ })] }), /* @__PURE__ */ l("div", {
79
+ className: "flex gap-2",
80
+ children: /* @__PURE__ */ l("span", {
81
+ className: `text-xs px-2 py-1 rounded-full capitalize ${{
82
+ SUBMITTED: "bg-gray-100 text-gray-800",
83
+ UNDER_REVIEW: "bg-yellow-100 text-yellow-800",
84
+ PLANNED: "bg-blue-100 text-blue-800",
85
+ IN_PROGRESS: "bg-purple-100 text-purple-800",
86
+ COMPLETED: "bg-green-100 text-green-800",
87
+ DECLINED: "bg-red-100 text-red-800"
88
+ }[x.status] ?? "bg-gray-100"}`,
89
+ children: x.status.toLowerCase().replace("_", " ")
90
+ })
91
+ })]
92
+ }),
93
+ /* @__PURE__ */ u("div", {
94
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
95
+ children: [
96
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
97
+ className: "pt-4 text-center",
98
+ children: [
99
+ /* @__PURE__ */ l(i, { className: "h-5 w-5 mx-auto text-primary" }),
100
+ /* @__PURE__ */ l("p", {
101
+ className: "text-2xl font-bold mt-1",
102
+ children: x.priorityScore ?? 0
103
+ }),
104
+ /* @__PURE__ */ l("p", {
105
+ className: "text-xs text-muted-foreground",
106
+ children: "Priority Score"
107
+ })
108
+ ]
109
+ }) }),
110
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
111
+ className: "pt-4 text-center",
112
+ children: [
113
+ /* @__PURE__ */ l(a, { className: "h-5 w-5 mx-auto text-green-500" }),
114
+ /* @__PURE__ */ l("p", {
115
+ className: "text-2xl font-bold mt-1",
116
+ children: x.voteCount
117
+ }),
118
+ /* @__PURE__ */ l("p", {
119
+ className: "text-xs text-muted-foreground",
120
+ children: "Votes"
121
+ })
122
+ ]
123
+ }) }),
124
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
125
+ className: "pt-4 text-center",
126
+ children: [
127
+ /* @__PURE__ */ l(r, { className: "h-5 w-5 mx-auto text-yellow-500" }),
128
+ /* @__PURE__ */ l("p", {
129
+ className: "text-2xl font-bold mt-1",
130
+ children: x.businessValue ?? 0
131
+ }),
132
+ /* @__PURE__ */ l("p", {
133
+ className: "text-xs text-muted-foreground",
134
+ children: "Business Value"
135
+ })
136
+ ]
137
+ }) }),
138
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
139
+ className: "pt-4 text-center",
140
+ children: [
141
+ /* @__PURE__ */ l(n, { className: "h-5 w-5 mx-auto text-blue-500" }),
142
+ /* @__PURE__ */ l("p", {
143
+ className: "text-2xl font-bold mt-1",
144
+ children: C.length
145
+ }),
146
+ /* @__PURE__ */ l("p", {
147
+ className: "text-xs text-muted-foreground",
148
+ children: "Competitors"
149
+ })
150
+ ]
151
+ }) })
152
+ ]
153
+ }),
154
+ /* @__PURE__ */ u("div", {
155
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
156
+ children: [/* @__PURE__ */ u("div", {
157
+ className: "lg:col-span-2 space-y-6",
158
+ children: [
159
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Description" }) }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l("p", {
160
+ className: "text-sm",
161
+ children: x.description ?? "No description provided."
162
+ }) })] }),
163
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
164
+ "Votes (",
165
+ S.length,
166
+ ")"
167
+ ] }) }), /* @__PURE__ */ u(p, {
168
+ className: "space-y-3",
169
+ children: [S.length === 0 && /* @__PURE__ */ l("p", {
170
+ className: "text-sm text-muted-foreground",
171
+ children: "No votes yet."
172
+ }), S.map((e) => /* @__PURE__ */ u("div", {
173
+ className: "flex items-start justify-between border rounded-md p-3",
174
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("p", {
175
+ className: "text-sm font-medium",
176
+ children: ["Voter: ", e.voterId]
177
+ }), e.comment && /* @__PURE__ */ l("p", {
178
+ className: "text-xs text-muted-foreground mt-1",
179
+ children: e.comment
180
+ })] }), /* @__PURE__ */ u("div", {
181
+ className: "flex items-center gap-1",
182
+ children: [/* @__PURE__ */ l(a, { className: "h-3 w-3 text-green-500" }), /* @__PURE__ */ l("span", {
183
+ className: "text-sm font-bold",
184
+ children: e.weight
185
+ })]
186
+ })]
187
+ }, e.id))]
188
+ })] }),
189
+ C.length > 0 && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, { children: [
190
+ "Competitor Analysis (",
191
+ C.length,
192
+ ")"
193
+ ] }) }), /* @__PURE__ */ l(p, {
194
+ className: "space-y-3",
195
+ children: C.map((e) => /* @__PURE__ */ u("div", {
196
+ className: "border rounded-md p-3",
197
+ children: [/* @__PURE__ */ u("div", {
198
+ className: "flex items-center justify-between",
199
+ children: [/* @__PURE__ */ l("p", {
200
+ className: "text-sm font-medium",
201
+ children: e.name
202
+ }), e.website && /* @__PURE__ */ l("span", {
203
+ className: "text-xs text-primary",
204
+ children: e.website
205
+ })]
206
+ }), e.description && /* @__PURE__ */ l("p", {
207
+ className: "text-xs text-muted-foreground mt-1",
208
+ children: e.description
209
+ })]
210
+ }, e.id))
211
+ })] })
212
+ ]
213
+ }), /* @__PURE__ */ u("div", {
214
+ className: "space-y-6",
215
+ children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Details" }) }), /* @__PURE__ */ u(p, {
216
+ className: "space-y-3 text-sm",
217
+ children: [
218
+ /* @__PURE__ */ u("div", {
219
+ className: "flex justify-between",
220
+ children: [/* @__PURE__ */ l("span", {
221
+ className: "text-muted-foreground",
222
+ children: "Status"
223
+ }), /* @__PURE__ */ l(d, {
224
+ variant: "secondary",
225
+ className: "capitalize",
226
+ children: x.status.toLowerCase().replace("_", " ")
227
+ })]
228
+ }),
229
+ /* @__PURE__ */ u("div", {
230
+ className: "flex justify-between",
231
+ children: [/* @__PURE__ */ l("span", {
232
+ className: "text-muted-foreground",
233
+ children: "Priority Score"
234
+ }), /* @__PURE__ */ l(d, {
235
+ variant: "outline",
236
+ children: x.priorityScore ?? "N/A"
237
+ })]
238
+ }),
239
+ /* @__PURE__ */ u("div", {
240
+ className: "flex justify-between",
241
+ children: [/* @__PURE__ */ l("span", {
242
+ className: "text-muted-foreground",
243
+ children: "Effort"
244
+ }), /* @__PURE__ */ l(d, {
245
+ variant: "outline",
246
+ className: "capitalize",
247
+ children: x.effortEstimate ?? "N/A"
248
+ })]
249
+ }),
250
+ /* @__PURE__ */ u("div", {
251
+ className: "flex justify-between",
252
+ children: [/* @__PURE__ */ l("span", {
253
+ className: "text-muted-foreground",
254
+ children: "Business Value"
255
+ }), /* @__PURE__ */ l("span", {
256
+ className: "font-medium",
257
+ children: x.businessValue ?? "N/A"
258
+ })]
259
+ }),
260
+ /* @__PURE__ */ u("div", {
261
+ className: "flex justify-between",
262
+ children: [/* @__PURE__ */ l("span", {
263
+ className: "text-muted-foreground",
264
+ children: "Submitted By"
265
+ }), /* @__PURE__ */ l("span", { children: x.submittedBy })]
266
+ }),
267
+ /* @__PURE__ */ u("div", {
268
+ className: "flex justify-between",
269
+ children: [/* @__PURE__ */ l("span", {
270
+ className: "text-muted-foreground",
271
+ children: "Updated"
272
+ }), /* @__PURE__ */ l("span", { children: new Date(x.updatedAt).toLocaleDateString() })]
273
+ })
274
+ ]
275
+ })] }), x.tags?.length > 0 && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Tags" }) }), /* @__PURE__ */ l(p, {
276
+ className: "flex flex-wrap gap-1",
277
+ children: x.tags.map((e) => /* @__PURE__ */ l(d, {
278
+ variant: "outline",
279
+ className: "text-xs",
280
+ children: e
281
+ }, e))
282
+ })] })]
283
+ })]
284
+ })
285
+ ]
286
+ });
287
+ }
288
+ //#endregion
289
+ export { _ as ProductsFeatureDetailPagePage };
290
+
291
+ //# sourceMappingURL=ProductsFeatureDetailPagePage.js.map
@@ -0,0 +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-dom';\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 if (loading) {\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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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsFeaturesPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsFeaturesPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsFeaturesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsFeaturesPagePage.tsx"],"names":[],"mappings":"AAqEA,wBAAgB,wBAAwB,4CAsMvC"}
@@ -0,0 +1,257 @@
1
+ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
2
+ import { useState as t } from "react";
3
+ import { ArrowUpDown as n, Filter as r, Loader2 as i, Plus as a, Star as o, Target as s, ThumbsUp as c } from "lucide-react";
4
+ import { gql as l } from "@apollo/client";
5
+ import { useQuery as u } from "@apollo/client/react";
6
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
+ import { Badge as p, Button as m, Card as h, CardContent as g } from "@burdenoff/fe-libs/ui";
8
+ //#region src/planmagnet/pages/ProductsFeaturesPagePage.tsx
9
+ var _ = l`
10
+ query ListFeatureRequests(
11
+ $workspaceId: ID!
12
+ $filter: FeatureRequestFilter
13
+ $pagination: PaginationInput
14
+ ) {
15
+ planmagnetFeatureRequests(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
16
+ items {
17
+ id
18
+ title
19
+ description
20
+ status
21
+ businessValue
22
+ effortEstimate
23
+ priorityScore
24
+ voteCount
25
+ submittedBy
26
+ tags
27
+ createdAt
28
+ updatedAt
29
+ }
30
+ totalCount
31
+ }
32
+ }
33
+ `, v = {
34
+ SUBMITTED: "bg-gray-100 text-gray-800",
35
+ UNDER_REVIEW: "bg-yellow-100 text-yellow-800",
36
+ PLANNED: "bg-blue-100 text-blue-800",
37
+ IN_PROGRESS: "bg-purple-100 text-purple-800",
38
+ COMPLETED: "bg-green-100 text-green-800",
39
+ DECLINED: "bg-red-100 text-red-800",
40
+ DUPLICATE: "bg-orange-100 text-orange-800"
41
+ };
42
+ function y() {
43
+ let { workspaceId: l } = e(), [y, b] = t("all"), [x, S] = t("priorityScore"), { data: C, loading: w, error: T } = u(_, {
44
+ variables: {
45
+ workspaceId: l,
46
+ filter: y === "all" ? void 0 : { status: y },
47
+ pagination: { first: 50 }
48
+ },
49
+ skip: !l
50
+ });
51
+ if (w) return /* @__PURE__ */ d("div", {
52
+ className: "flex items-center justify-center p-12",
53
+ children: /* @__PURE__ */ d(i, { className: "h-8 w-8 animate-spin text-muted-foreground" })
54
+ });
55
+ if (T) return /* @__PURE__ */ f("div", {
56
+ className: "p-6 text-destructive",
57
+ children: ["Failed to load features: ", T.message]
58
+ });
59
+ let E = C?.planmagnetFeatureRequests?.items ?? [], D = C?.planmagnetFeatureRequests?.totalCount ?? 0, O = [...E].sort((e, t) => {
60
+ let n = e[x] ?? 0;
61
+ return (t[x] ?? 0) - n;
62
+ }), k = [
63
+ "all",
64
+ "SUBMITTED",
65
+ "UNDER_REVIEW",
66
+ "PLANNED",
67
+ "IN_PROGRESS",
68
+ "COMPLETED",
69
+ "DECLINED",
70
+ "DUPLICATE"
71
+ ], A = {
72
+ total: D,
73
+ inProgress: E.filter((e) => e.status === "IN_PROGRESS").length,
74
+ completed: E.filter((e) => e.status === "COMPLETED").length,
75
+ avgPriority: E.length > 0 ? Math.round(E.reduce((e, t) => e + (t.priorityScore ?? 0), 0) / E.length) : 0
76
+ };
77
+ return /* @__PURE__ */ f("div", {
78
+ className: "space-y-6 p-6",
79
+ children: [
80
+ /* @__PURE__ */ f("div", {
81
+ className: "flex items-center justify-between",
82
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
83
+ className: "text-2xl font-semibold",
84
+ children: "Features"
85
+ }), /* @__PURE__ */ f("p", {
86
+ className: "text-sm text-muted-foreground",
87
+ children: [D, " feature requests across all products"]
88
+ })] }), /* @__PURE__ */ f(m, {
89
+ size: "sm",
90
+ children: [/* @__PURE__ */ d(a, { className: "mr-1 h-4 w-4" }), "New Feature"]
91
+ })]
92
+ }),
93
+ /* @__PURE__ */ f("div", {
94
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
95
+ children: [
96
+ /* @__PURE__ */ d(h, { children: /* @__PURE__ */ f(g, {
97
+ className: "pt-4",
98
+ children: [/* @__PURE__ */ d("p", {
99
+ className: "text-xs text-muted-foreground",
100
+ children: "Total Features"
101
+ }), /* @__PURE__ */ d("p", {
102
+ className: "text-xl font-bold",
103
+ children: A.total
104
+ })]
105
+ }) }),
106
+ /* @__PURE__ */ d(h, { children: /* @__PURE__ */ f(g, {
107
+ className: "pt-4",
108
+ children: [/* @__PURE__ */ d("p", {
109
+ className: "text-xs text-muted-foreground",
110
+ children: "In Progress"
111
+ }), /* @__PURE__ */ d("p", {
112
+ className: "text-xl font-bold",
113
+ children: A.inProgress
114
+ })]
115
+ }) }),
116
+ /* @__PURE__ */ d(h, { children: /* @__PURE__ */ f(g, {
117
+ className: "pt-4",
118
+ children: [/* @__PURE__ */ d("p", {
119
+ className: "text-xs text-muted-foreground",
120
+ children: "Completed"
121
+ }), /* @__PURE__ */ d("p", {
122
+ className: "text-xl font-bold",
123
+ children: A.completed
124
+ })]
125
+ }) }),
126
+ /* @__PURE__ */ d(h, { children: /* @__PURE__ */ f(g, {
127
+ className: "pt-4",
128
+ children: [/* @__PURE__ */ d("p", {
129
+ className: "text-xs text-muted-foreground",
130
+ children: "Avg Priority Score"
131
+ }), /* @__PURE__ */ d("p", {
132
+ className: "text-xl font-bold",
133
+ children: A.avgPriority
134
+ })]
135
+ }) })
136
+ ]
137
+ }),
138
+ /* @__PURE__ */ f("div", {
139
+ className: "flex items-center justify-between flex-wrap gap-2",
140
+ children: [/* @__PURE__ */ f("div", {
141
+ className: "flex items-center gap-2",
142
+ children: [/* @__PURE__ */ d(r, { className: "h-4 w-4 text-muted-foreground" }), k.map((e) => /* @__PURE__ */ d("button", {
143
+ onClick: () => b(e),
144
+ className: `px-2 py-1 text-xs rounded-md capitalize ${y === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
145
+ children: e === "all" ? "All" : e.toLowerCase().replace("_", " ")
146
+ }, e))]
147
+ }), /* @__PURE__ */ f("div", {
148
+ className: "flex items-center gap-2",
149
+ children: [/* @__PURE__ */ d(n, { className: "h-4 w-4 text-muted-foreground" }), [
150
+ "priorityScore",
151
+ "voteCount",
152
+ "businessValue"
153
+ ].map((e) => /* @__PURE__ */ d("button", {
154
+ onClick: () => S(e),
155
+ className: `px-2 py-1 text-xs rounded-md capitalize ${x === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
156
+ children: e === "priorityScore" ? "Priority" : e === "voteCount" ? "Votes" : "Value"
157
+ }, e))]
158
+ })]
159
+ }),
160
+ /* @__PURE__ */ d("div", {
161
+ className: "space-y-3",
162
+ children: O.map((e) => /* @__PURE__ */ d(h, { children: /* @__PURE__ */ d(g, {
163
+ className: "py-4",
164
+ children: /* @__PURE__ */ f("div", {
165
+ className: "flex items-start justify-between gap-4",
166
+ children: [/* @__PURE__ */ f("div", {
167
+ className: "flex-1 space-y-2",
168
+ children: [
169
+ /* @__PURE__ */ f("div", {
170
+ className: "flex items-center gap-2",
171
+ children: [/* @__PURE__ */ d("span", {
172
+ className: "text-sm font-medium",
173
+ children: e.title
174
+ }), /* @__PURE__ */ d("span", {
175
+ className: `text-[10px] px-1.5 py-0.5 rounded-full capitalize ${v[e.status] ?? "bg-gray-100"}`,
176
+ children: e.status.toLowerCase().replace("_", " ")
177
+ })]
178
+ }),
179
+ /* @__PURE__ */ d("p", {
180
+ className: "text-xs text-muted-foreground",
181
+ children: e.description
182
+ }),
183
+ /* @__PURE__ */ f("div", {
184
+ className: "flex items-center gap-4 text-xs text-muted-foreground",
185
+ children: [
186
+ /* @__PURE__ */ f("span", { children: ["Effort: ", e.effortEstimate ?? "N/A"] }),
187
+ /* @__PURE__ */ f("span", { children: ["Submitted by: ", e.submittedBy] }),
188
+ /* @__PURE__ */ d("span", { children: new Date(e.updatedAt).toLocaleDateString() })
189
+ ]
190
+ }),
191
+ e.tags.length > 0 && /* @__PURE__ */ d("div", {
192
+ className: "flex gap-1",
193
+ children: e.tags.map((e) => /* @__PURE__ */ d(p, {
194
+ variant: "outline",
195
+ className: "text-[10px]",
196
+ children: e
197
+ }, e))
198
+ })
199
+ ]
200
+ }), /* @__PURE__ */ f("div", {
201
+ className: "flex items-center gap-4 shrink-0",
202
+ children: [
203
+ /* @__PURE__ */ f("div", {
204
+ className: "text-center",
205
+ children: [/* @__PURE__ */ f("div", {
206
+ className: "flex items-center gap-1",
207
+ children: [/* @__PURE__ */ d(s, { className: "h-3 w-3 text-primary" }), /* @__PURE__ */ d("span", {
208
+ className: "text-sm font-bold",
209
+ children: e.priorityScore ?? 0
210
+ })]
211
+ }), /* @__PURE__ */ d("p", {
212
+ className: "text-[10px] text-muted-foreground",
213
+ children: "Priority"
214
+ })]
215
+ }),
216
+ /* @__PURE__ */ f("div", {
217
+ className: "text-center",
218
+ children: [/* @__PURE__ */ f("div", {
219
+ className: "flex items-center gap-1",
220
+ children: [/* @__PURE__ */ d(c, { className: "h-3 w-3 text-green-500" }), /* @__PURE__ */ d("span", {
221
+ className: "text-sm font-bold",
222
+ children: e.voteCount
223
+ })]
224
+ }), /* @__PURE__ */ d("p", {
225
+ className: "text-[10px] text-muted-foreground",
226
+ children: "Votes"
227
+ })]
228
+ }),
229
+ /* @__PURE__ */ f("div", {
230
+ className: "text-center",
231
+ children: [/* @__PURE__ */ f("div", {
232
+ className: "flex items-center gap-1",
233
+ children: [/* @__PURE__ */ d(o, { className: "h-3 w-3 text-yellow-500" }), /* @__PURE__ */ d("span", {
234
+ className: "text-sm font-bold",
235
+ children: e.businessValue ?? 0
236
+ })]
237
+ }), /* @__PURE__ */ d("p", {
238
+ className: "text-[10px] text-muted-foreground",
239
+ children: "Value"
240
+ })]
241
+ })
242
+ ]
243
+ })]
244
+ })
245
+ }) }, e.id))
246
+ }),
247
+ O.length === 0 && /* @__PURE__ */ d("p", {
248
+ className: "text-center text-muted-foreground py-8",
249
+ children: "No features match the selected filters."
250
+ })
251
+ ]
252
+ });
253
+ }
254
+ //#endregion
255
+ export { y as ProductsFeaturesPagePage };
256
+
257
+ //# sourceMappingURL=ProductsFeaturesPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsFeaturesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsFeaturesPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport {\n Star,\n Plus,\n ThumbsUp,\n MessageSquare,\n Target,\n Filter,\n ArrowUpDown,\n Loader2,\n} from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst LIST_FEATURE_REQUESTS = gql`\n query ListFeatureRequests(\n $workspaceId: ID!\n $filter: FeatureRequestFilter\n $pagination: PaginationInput\n ) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n title\n description\n status\n businessValue\n effortEstimate\n priorityScore\n voteCount\n submittedBy\n tags\n createdAt\n updatedAt\n }\n totalCount\n }\n }\n`;\n\ninterface FeatureRequestNode {\n id: string;\n title: string;\n description: string | null;\n status: string;\n businessValue: number | null;\n effortEstimate: string | null;\n priorityScore: number | null;\n voteCount: number;\n submittedBy: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nconst 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 DUPLICATE: 'bg-orange-100 text-orange-800',\n};\n\nexport function ProductsFeaturesPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [statusFilter, setStatusFilter] = useState<string>('all');\n const [sortBy, setSortBy] = useState<'priorityScore' | 'voteCount' | 'businessValue'>(\n 'priorityScore'\n );\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_FEATURE_REQUESTS, {\n variables: {\n workspaceId,\n filter: statusFilter !== 'all' ? { status: statusFilter } : undefined,\n pagination: { first: 50 },\n },\n skip: !workspaceId,\n });\n\n if (loading) {\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 features: {error.message}</div>;\n }\n\n const features: FeatureRequestNode[] = data?.planmagnetFeatureRequests?.items ?? [];\n const totalCount = data?.planmagnetFeatureRequests?.totalCount ?? 0;\n\n const sorted = [...features].sort((a, b) => {\n const aVal = a[sortBy] ?? 0;\n const bVal = b[sortBy] ?? 0;\n return (bVal as number) - (aVal as number);\n });\n\n const statuses = [\n 'all',\n 'SUBMITTED',\n 'UNDER_REVIEW',\n 'PLANNED',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'DECLINED',\n 'DUPLICATE',\n ];\n\n const stats = {\n total: totalCount,\n inProgress: features.filter((f) => f.status === 'IN_PROGRESS').length,\n completed: features.filter((f) => f.status === 'COMPLETED').length,\n avgPriority:\n features.length > 0\n ? Math.round(features.reduce((s, f) => s + (f.priorityScore ?? 0), 0) / features.length)\n : 0,\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\">Features</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalCount} feature requests across all products\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Feature\n </Button>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Total Features</p>\n <p className=\"text-xl font-bold\">{stats.total}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">In Progress</p>\n <p className=\"text-xl font-bold\">{stats.inProgress}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n <p className=\"text-xl font-bold\">{stats.completed}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Avg Priority Score</p>\n <p className=\"text-xl font-bold\">{stats.avgPriority}</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n {statuses.map((s) => (\n <button\n key={s}\n onClick={() => setStatusFilter(s)}\n className={`px-2 py-1 text-xs rounded-md capitalize ${statusFilter === s ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {s === 'all' ? 'All' : s.toLowerCase().replace('_', ' ')}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <ArrowUpDown className=\"h-4 w-4 text-muted-foreground\" />\n {(['priorityScore', 'voteCount', 'businessValue'] as const).map((s) => (\n <button\n key={s}\n onClick={() => setSortBy(s)}\n className={`px-2 py-1 text-xs rounded-md capitalize ${sortBy === s ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {s === 'priorityScore' ? 'Priority' : s === 'voteCount' ? 'Votes' : 'Value'}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-3\">\n {sorted.map((feature) => (\n <Card key={feature.id}>\n <CardContent className=\"py-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{feature.title}</span>\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded-full capitalize ${statusColor[feature.status] ?? 'bg-gray-100'}`}\n >\n {feature.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">{feature.description}</p>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span>Effort: {feature.effortEstimate ?? 'N/A'}</span>\n <span>Submitted by: {feature.submittedBy}</span>\n <span>{new Date(feature.updatedAt).toLocaleDateString()}</span>\n </div>\n {feature.tags.length > 0 && (\n <div className=\"flex gap-1\">\n {feature.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-[10px]\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n <div className=\"flex items-center gap-4 shrink-0\">\n <div className=\"text-center\">\n <div className=\"flex items-center gap-1\">\n <Target className=\"h-3 w-3 text-primary\" />\n <span className=\"text-sm font-bold\">{feature.priorityScore ?? 0}</span>\n </div>\n <p className=\"text-[10px] text-muted-foreground\">Priority</p>\n </div>\n <div className=\"text-center\">\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\">{feature.voteCount}</span>\n </div>\n <p className=\"text-[10px] text-muted-foreground\">Votes</p>\n </div>\n <div className=\"text-center\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-yellow-500\" />\n <span className=\"text-sm font-bold\">{feature.businessValue ?? 0}</span>\n </div>\n <p className=\"text-[10px] text-muted-foreground\">Value</p>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n {sorted.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">\n No features match the selected filters.\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProductsNewFeaturePagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProductsNewFeaturePagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsNewFeaturePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProductsNewFeaturePagePage.tsx"],"names":[],"mappings":"AAiCA,wBAAgB,0BAA0B,4CAgMzC"}