@burdenoff/microfe-planmagnet 2026.1002.1 → 2026.1002.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/generated/wspace-operations.d.ts +2533 -546
  2. package/dist/generated/wspace-operations.d.ts.map +1 -1
  3. package/dist/generated/wspace-types.d.ts +5654 -71
  4. package/dist/generated/wspace-types.d.ts.map +1 -1
  5. package/dist/index.js +8 -8
  6. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  7. package/dist/planmagnet/PlanMagnetRoot.js +180 -162
  8. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  9. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  10. package/dist/planmagnet/PlanMagnetRoutes.js +100 -84
  11. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  12. package/dist/planmagnet/board/BulkActions.d.ts.map +1 -1
  13. package/dist/planmagnet/board/BulkActions.js +106 -55
  14. package/dist/planmagnet/board/BulkActions.js.map +1 -1
  15. package/dist/planmagnet/controls/Pickers.d.ts +10 -5
  16. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  17. package/dist/planmagnet/controls/Pickers.js +10 -9
  18. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  19. package/dist/planmagnet/dashboards/DashboardUI.d.ts +0 -4
  20. package/dist/planmagnet/dashboards/DashboardUI.d.ts.map +1 -1
  21. package/dist/planmagnet/dashboards/DashboardUI.js +6 -13
  22. package/dist/planmagnet/dashboards/DashboardUI.js.map +1 -1
  23. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.d.ts.map +1 -1
  24. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js +70 -59
  25. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js.map +1 -1
  26. package/dist/planmagnet/forecast/ResourceForecastCard.js +1 -1
  27. package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -1
  28. package/dist/planmagnet/index.d.ts +1 -1
  29. package/dist/planmagnet/index.d.ts.map +1 -1
  30. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.d.ts +3 -3
  31. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js +26 -19
  33. package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.d.ts +2 -2
  35. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.d.ts.map +1 -1
  36. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js +18 -12
  37. package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js.map +1 -1
  38. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js +251 -0
  41. package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +4 -4
  43. package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -1
  44. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  45. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +133 -131
  46. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  47. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  48. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +5 -5
  49. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  50. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +6 -6
  51. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +107 -82
  54. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.d.ts +2 -0
  56. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.d.ts.map +1 -0
  57. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js +174 -0
  58. package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js.map +1 -0
  59. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.d.ts +2 -0
  60. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.d.ts.map +1 -0
  61. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js +350 -0
  62. package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js.map +1 -0
  63. package/dist/planmagnet/pages/ProductsProductLinesPagePage.d.ts +2 -0
  64. package/dist/planmagnet/pages/ProductsProductLinesPagePage.d.ts.map +1 -0
  65. package/dist/planmagnet/pages/ProductsProductLinesPagePage.js +168 -0
  66. package/dist/planmagnet/pages/ProductsProductLinesPagePage.js.map +1 -0
  67. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/ProductsProductsPagePage.js +1 -1
  69. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +116 -114
  72. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  74. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +174 -159
  75. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  76. package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
  77. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +159 -145
  78. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  79. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  80. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +161 -143
  81. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  82. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  83. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +160 -156
  84. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  85. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.d.ts.map +1 -1
  86. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +97 -99
  87. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js.map +1 -1
  88. package/dist/planmagnet/product/FeatureLinkPanels.d.ts +29 -0
  89. package/dist/planmagnet/product/FeatureLinkPanels.d.ts.map +1 -0
  90. package/dist/planmagnet/product/FeatureLinkPanels.js +373 -0
  91. package/dist/planmagnet/product/FeatureLinkPanels.js.map +1 -0
  92. package/dist/planmagnet/product/ProductControls.js +1 -1
  93. package/dist/planmagnet/product/ProductControls.js.map +1 -1
  94. package/dist/planmagnet/product/ProductFeatureControls.d.ts +39 -0
  95. package/dist/planmagnet/product/ProductFeatureControls.d.ts.map +1 -0
  96. package/dist/planmagnet/product/ProductFeatureControls.js +315 -0
  97. package/dist/planmagnet/product/ProductFeatureControls.js.map +1 -0
  98. package/dist/planmagnet/product/ProductFeatureLinkCard.d.ts +4 -0
  99. package/dist/planmagnet/product/ProductFeatureLinkCard.d.ts.map +1 -0
  100. package/dist/planmagnet/product/ProductFeatureLinkCard.js +192 -0
  101. package/dist/planmagnet/product/ProductFeatureLinkCard.js.map +1 -0
  102. package/dist/planmagnet/product/ProductLineControls.d.ts +52 -0
  103. package/dist/planmagnet/product/ProductLineControls.d.ts.map +1 -0
  104. package/dist/planmagnet/product/ProductLineControls.js +417 -0
  105. package/dist/planmagnet/product/ProductLineControls.js.map +1 -0
  106. package/dist/planmagnet/product/ProductTeamsPanel.d.ts +4 -0
  107. package/dist/planmagnet/product/ProductTeamsPanel.d.ts.map +1 -0
  108. package/dist/planmagnet/product/ProductTeamsPanel.js +129 -0
  109. package/dist/planmagnet/product/ProductTeamsPanel.js.map +1 -0
  110. package/dist/planmagnet/product/WorkItemProductFeatureChip.d.ts +4 -0
  111. package/dist/planmagnet/product/WorkItemProductFeatureChip.d.ts.map +1 -0
  112. package/dist/planmagnet/product/WorkItemProductFeatureChip.js +41 -0
  113. package/dist/planmagnet/product/WorkItemProductFeatureChip.js.map +1 -0
  114. package/dist/planmagnet/product/hierarchy.d.ts +127 -0
  115. package/dist/planmagnet/product/hierarchy.d.ts.map +1 -0
  116. package/dist/planmagnet/product/hierarchy.js +173 -0
  117. package/dist/planmagnet/product/hierarchy.js.map +1 -0
  118. package/dist/planmagnet/product/hierarchyOperations.d.ts +35 -0
  119. package/dist/planmagnet/product/hierarchyOperations.d.ts.map +1 -0
  120. package/dist/planmagnet/product/hierarchyOperations.js +440 -0
  121. package/dist/planmagnet/product/hierarchyOperations.js.map +1 -0
  122. package/dist/planmagnet/product/refusal.d.ts +14 -0
  123. package/dist/planmagnet/product/refusal.d.ts.map +1 -0
  124. package/dist/planmagnet/product/refusal.js +10 -0
  125. package/dist/planmagnet/product/refusal.js.map +1 -0
  126. package/dist/planmagnet/product/routes.d.ts +10 -0
  127. package/dist/planmagnet/product/routes.d.ts.map +1 -1
  128. package/dist/planmagnet/product/routes.js +2 -2
  129. package/dist/planmagnet/product/routes.js.map +1 -1
  130. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.d.ts +20 -0
  131. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.d.ts.map +1 -0
  132. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js +55 -0
  133. package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js.map +1 -0
  134. package/dist/planmagnet/satisfaction/SatisfactionFigures.d.ts +30 -0
  135. package/dist/planmagnet/satisfaction/SatisfactionFigures.d.ts.map +1 -0
  136. package/dist/planmagnet/satisfaction/SatisfactionFigures.js +282 -0
  137. package/dist/planmagnet/satisfaction/SatisfactionFigures.js.map +1 -0
  138. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.d.ts +9 -0
  139. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.d.ts.map +1 -0
  140. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js +390 -0
  141. package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js.map +1 -0
  142. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.d.ts +17 -0
  143. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.d.ts.map +1 -0
  144. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js +77 -0
  145. package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js.map +1 -0
  146. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.d.ts +18 -0
  147. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.d.ts.map +1 -0
  148. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js +87 -0
  149. package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js.map +1 -0
  150. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.d.ts +13 -0
  151. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.d.ts.map +1 -0
  152. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js +326 -0
  153. package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js.map +1 -0
  154. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.d.ts +23 -0
  155. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.d.ts.map +1 -0
  156. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js +258 -0
  157. package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js.map +1 -0
  158. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.d.ts +6 -0
  159. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.d.ts.map +1 -0
  160. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js +56 -0
  161. package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js.map +1 -0
  162. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.d.ts +16 -0
  163. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.d.ts.map +1 -0
  164. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js +102 -0
  165. package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js.map +1 -0
  166. package/dist/planmagnet/satisfaction/satisfaction.d.ts +154 -0
  167. package/dist/planmagnet/satisfaction/satisfaction.d.ts.map +1 -0
  168. package/dist/planmagnet/satisfaction/satisfaction.js +210 -0
  169. package/dist/planmagnet/satisfaction/satisfaction.js.map +1 -0
  170. package/dist/planmagnet/satisfaction/satisfactionCsv.d.ts +108 -0
  171. package/dist/planmagnet/satisfaction/satisfactionCsv.d.ts.map +1 -0
  172. package/dist/planmagnet/satisfaction/satisfactionCsv.js +211 -0
  173. package/dist/planmagnet/satisfaction/satisfactionCsv.js.map +1 -0
  174. package/dist/planmagnet/satisfaction/satisfactionForm.d.ts +90 -0
  175. package/dist/planmagnet/satisfaction/satisfactionForm.d.ts.map +1 -0
  176. package/dist/planmagnet/satisfaction/satisfactionForm.js +90 -0
  177. package/dist/planmagnet/satisfaction/satisfactionForm.js.map +1 -0
  178. package/dist/planmagnet/satisfaction/satisfactionOperations.d.ts +116 -0
  179. package/dist/planmagnet/satisfaction/satisfactionOperations.d.ts.map +1 -0
  180. package/dist/planmagnet/satisfaction/satisfactionOperations.js +86 -0
  181. package/dist/planmagnet/satisfaction/satisfactionOperations.js.map +1 -0
  182. package/dist/planmagnet/satisfaction/useSatisfactionAccess.d.ts +20 -0
  183. package/dist/planmagnet/satisfaction/useSatisfactionAccess.d.ts.map +1 -0
  184. package/dist/planmagnet/satisfaction/useSatisfactionAccess.js +31 -0
  185. package/dist/planmagnet/satisfaction/useSatisfactionAccess.js.map +1 -0
  186. package/dist/planmagnet/skills/RequiredSkillsEditor.d.ts +35 -0
  187. package/dist/planmagnet/skills/RequiredSkillsEditor.d.ts.map +1 -0
  188. package/dist/planmagnet/skills/RequiredSkillsEditor.js +124 -0
  189. package/dist/planmagnet/skills/RequiredSkillsEditor.js.map +1 -0
  190. package/dist/planmagnet/skills/SkillChips.d.ts +30 -0
  191. package/dist/planmagnet/skills/SkillChips.d.ts.map +1 -0
  192. package/dist/planmagnet/skills/SkillChips.js +57 -0
  193. package/dist/planmagnet/skills/SkillChips.js.map +1 -0
  194. package/dist/planmagnet/skills/SkillCoverageCard.d.ts +24 -0
  195. package/dist/planmagnet/skills/SkillCoverageCard.d.ts.map +1 -0
  196. package/dist/planmagnet/skills/SkillCoverageCard.js +256 -0
  197. package/dist/planmagnet/skills/SkillCoverageCard.js.map +1 -0
  198. package/dist/planmagnet/skills/WorkItemRequiredSkills.d.ts +10 -0
  199. package/dist/planmagnet/skills/WorkItemRequiredSkills.d.ts.map +1 -0
  200. package/dist/planmagnet/skills/WorkItemRequiredSkills.js +65 -0
  201. package/dist/planmagnet/skills/WorkItemRequiredSkills.js.map +1 -0
  202. package/dist/planmagnet/skills/skillOperations.d.ts +52 -0
  203. package/dist/planmagnet/skills/skillOperations.d.ts.map +1 -0
  204. package/dist/planmagnet/skills/skillOperations.js +44 -0
  205. package/dist/planmagnet/skills/skillOperations.js.map +1 -0
  206. package/dist/planmagnet/skills/skillTags.d.ts +103 -0
  207. package/dist/planmagnet/skills/skillTags.d.ts.map +1 -0
  208. package/dist/planmagnet/skills/skillTags.js +115 -0
  209. package/dist/planmagnet/skills/skillTags.js.map +1 -0
  210. package/dist/planmagnet/skills/useRequiredSkillsDraft.d.ts +28 -0
  211. package/dist/planmagnet/skills/useRequiredSkillsDraft.d.ts.map +1 -0
  212. package/dist/planmagnet/skills/useRequiredSkillsDraft.js +30 -0
  213. package/dist/planmagnet/skills/useRequiredSkillsDraft.js.map +1 -0
  214. package/dist/shared/utils/i18n.d.ts +3 -0
  215. package/dist/shared/utils/i18n.d.ts.map +1 -1
  216. package/dist/shared/utils/i18n.js +1 -1
  217. package/dist/shared/utils/i18n.js.map +1 -1
  218. package/package.json +4 -4
@@ -0,0 +1,440 @@
1
+ import { gql as e } from "@apollo/client";
2
+ //#region src/planmagnet/product/hierarchyOperations.ts
3
+ var t = "\n id\n name\n description\n ownerId\n archivedAt\n createdAt\n updatedAt\n", n = "\n id\n productId\n name\n description\n status\n ownerId\n archivedAt\n createdAt\n updatedAt\n", r = e`
4
+ query ProductLinesPage($workspaceId: ID!, $filter: PlanmagnetProductLineFilter) {
5
+ planmagnetProductLines(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {
6
+ items {
7
+ ${t}
8
+ products {
9
+ id
10
+ name
11
+ archivedAt
12
+ }
13
+ }
14
+ pageInfo {
15
+ hasNextPage
16
+ }
17
+ totalCount
18
+ }
19
+ }
20
+ `, i = e`
21
+ query ProductLineOptions($workspaceId: ID!) {
22
+ planmagnetProductLines(
23
+ workspaceId: $workspaceId
24
+ filter: { isActive: true }
25
+ pagination: { first: 100 }
26
+ ) {
27
+ items {
28
+ id
29
+ name
30
+ }
31
+ totalCount
32
+ }
33
+ }
34
+ `, a = e`
35
+ query ProductLineAssignment($productId: ID!) {
36
+ planmagnetProduct(id: $productId) {
37
+ id
38
+ productLineId
39
+ productLine {
40
+ id
41
+ name
42
+ archivedAt
43
+ }
44
+ }
45
+ }
46
+ `, o = e`
47
+ query ProductLineCandidateProducts($workspaceId: ID!) {
48
+ planmagnetProducts(workspaceId: $workspaceId, pagination: { first: 100 }) {
49
+ items {
50
+ id
51
+ name
52
+ archivedAt
53
+ productLine {
54
+ id
55
+ name
56
+ }
57
+ }
58
+ totalCount
59
+ }
60
+ }
61
+ `, s = e`
62
+ query ProductTeams($productId: ID!) {
63
+ planmagnetProduct(id: $productId) {
64
+ id
65
+ archivedAt
66
+ teams {
67
+ id
68
+ name
69
+ description
70
+ members {
71
+ id
72
+ }
73
+ }
74
+ }
75
+ }
76
+ `, c = e`
77
+ query ProductFeaturesList(
78
+ $workspaceId: ID!
79
+ $productId: ID!
80
+ $filter: PlanmagnetProductFeatureFilter
81
+ ) {
82
+ planmagnetProductFeatures(
83
+ workspaceId: $workspaceId
84
+ productId: $productId
85
+ filter: $filter
86
+ pagination: { first: 100 }
87
+ ) {
88
+ items {
89
+ ${n}
90
+ epics {
91
+ id
92
+ }
93
+ featureRequests {
94
+ id
95
+ }
96
+ }
97
+ pageInfo {
98
+ hasNextPage
99
+ }
100
+ totalCount
101
+ }
102
+ }
103
+ `, l = e`
104
+ query ProductFeatureDetail($id: ID!) {
105
+ planmagnetProductFeature(id: $id) {
106
+ ${n}
107
+ product {
108
+ id
109
+ name
110
+ archivedAt
111
+ productLine {
112
+ id
113
+ name
114
+ }
115
+ }
116
+ epics {
117
+ id
118
+ key
119
+ title
120
+ type
121
+ status
122
+ children {
123
+ id
124
+ key
125
+ title
126
+ type
127
+ status
128
+ }
129
+ }
130
+ featureRequests {
131
+ id
132
+ title
133
+ status
134
+ voteCount
135
+ productId
136
+ }
137
+ }
138
+ }
139
+ `, u = e`
140
+ query ProductFeatureEpicCandidates($workspaceId: ID!, $filter: PlanmagnetWorkItemFilter) {
141
+ planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: { first: 20 }) {
142
+ items {
143
+ id
144
+ key
145
+ title
146
+ type
147
+ productFeature {
148
+ id
149
+ name
150
+ }
151
+ }
152
+ totalCount
153
+ }
154
+ }
155
+ `, d = e`
156
+ query ProductFeatureRequestCandidates(
157
+ $workspaceId: ID!
158
+ $sameProduct: PlanmagnetFeatureRequestFilter!
159
+ $anyProduct: PlanmagnetFeatureRequestFilter
160
+ ) {
161
+ sameProduct: planmagnetFeatureRequests(
162
+ workspaceId: $workspaceId
163
+ filter: $sameProduct
164
+ pagination: { first: 50 }
165
+ ) {
166
+ items {
167
+ id
168
+ title
169
+ status
170
+ productId
171
+ productFeature {
172
+ id
173
+ name
174
+ }
175
+ }
176
+ totalCount
177
+ }
178
+ anyProduct: planmagnetFeatureRequests(
179
+ workspaceId: $workspaceId
180
+ filter: $anyProduct
181
+ pagination: { first: 50 }
182
+ ) {
183
+ items {
184
+ id
185
+ title
186
+ status
187
+ productId
188
+ productFeature {
189
+ id
190
+ name
191
+ }
192
+ }
193
+ totalCount
194
+ }
195
+ }
196
+ `, f = e`
197
+ query ProductHierarchy(
198
+ $workspaceId: ID!
199
+ $lineFilter: PlanmagnetProductLineFilter
200
+ $productFilter: PlanmagnetProductFilter
201
+ $includeArchivedFeatures: Boolean
202
+ ) {
203
+ planmagnetProductLines(
204
+ workspaceId: $workspaceId
205
+ filter: $lineFilter
206
+ pagination: { first: 100 }
207
+ ) {
208
+ items {
209
+ id
210
+ name
211
+ archivedAt
212
+ }
213
+ totalCount
214
+ }
215
+ planmagnetProducts(
216
+ workspaceId: $workspaceId
217
+ filter: $productFilter
218
+ pagination: { first: 100 }
219
+ ) {
220
+ items {
221
+ id
222
+ name
223
+ lifecycleStage
224
+ archivedAt
225
+ productLine {
226
+ id
227
+ name
228
+ archivedAt
229
+ }
230
+ features(includeArchived: $includeArchivedFeatures) {
231
+ id
232
+ name
233
+ status
234
+ archivedAt
235
+ epics {
236
+ id
237
+ key
238
+ title
239
+ type
240
+ status
241
+ children {
242
+ id
243
+ key
244
+ title
245
+ type
246
+ status
247
+ }
248
+ }
249
+ }
250
+ }
251
+ totalCount
252
+ }
253
+ }
254
+ `, p = e`
255
+ query FeatureRequestProductFeature($id: ID!) {
256
+ planmagnetFeatureRequest(id: $id) {
257
+ id
258
+ productId
259
+ productFeature {
260
+ id
261
+ name
262
+ status
263
+ archivedAt
264
+ product {
265
+ id
266
+ name
267
+ }
268
+ }
269
+ }
270
+ }
271
+ `, m = e`
272
+ query FeatureRequestFeatureOptions($workspaceId: ID!, $productId: ID!) {
273
+ planmagnetProductFeatures(
274
+ workspaceId: $workspaceId
275
+ productId: $productId
276
+ filter: { isActive: true }
277
+ pagination: { first: 100 }
278
+ ) {
279
+ items {
280
+ id
281
+ name
282
+ status
283
+ }
284
+ totalCount
285
+ }
286
+ }
287
+ `, h = e`
288
+ query WorkItemProductFeature($id: ID!) {
289
+ planmagnetWorkItem(id: $id) {
290
+ id
291
+ type
292
+ productFeature {
293
+ id
294
+ name
295
+ }
296
+ parent {
297
+ id
298
+ key
299
+ type
300
+ productFeature {
301
+ id
302
+ name
303
+ }
304
+ }
305
+ }
306
+ }
307
+ `, g = e`
308
+ mutation CreateProductLine($input: PlanmagnetCreateProductLineInput!) {
309
+ planmagnetCreateProductLine(input: $input) {
310
+ ${t}
311
+ }
312
+ }
313
+ `, _ = e`
314
+ mutation UpdateProductLine($id: ID!, $input: PlanmagnetUpdateProductLineInput!) {
315
+ planmagnetUpdateProductLine(id: $id, input: $input) {
316
+ ${t}
317
+ }
318
+ }
319
+ `, v = e`
320
+ mutation ArchiveProductLine($id: ID!) {
321
+ planmagnetArchiveProductLine(id: $id) {
322
+ id
323
+ archivedAt
324
+ }
325
+ }
326
+ `, y = e`
327
+ mutation UnarchiveProductLine($id: ID!) {
328
+ planmagnetUnarchiveProductLine(id: $id) {
329
+ id
330
+ archivedAt
331
+ }
332
+ }
333
+ `, b = e`
334
+ mutation DeleteProductLine($id: ID!) {
335
+ planmagnetDeleteProductLine(id: $id)
336
+ }
337
+ `, x = e`
338
+ mutation AssignProductLine($productId: ID!, $productLineId: ID) {
339
+ planmagnetAssignProductLine(productId: $productId, productLineId: $productLineId) {
340
+ id
341
+ productLineId
342
+ productLine {
343
+ id
344
+ name
345
+ archivedAt
346
+ }
347
+ }
348
+ }
349
+ `, S = e`
350
+ mutation LinkProductTeam($productId: ID!, $teamId: ID!) {
351
+ planmagnetLinkProductTeam(productId: $productId, teamId: $teamId) {
352
+ id
353
+ }
354
+ }
355
+ `, C = e`
356
+ mutation UnlinkProductTeam($productId: ID!, $teamId: ID!) {
357
+ planmagnetUnlinkProductTeam(productId: $productId, teamId: $teamId)
358
+ }
359
+ `, w = e`
360
+ mutation CreateProductFeature($input: PlanmagnetCreateProductFeatureInput!) {
361
+ planmagnetCreateProductFeature(input: $input) {
362
+ ${n}
363
+ }
364
+ }
365
+ `, T = e`
366
+ mutation UpdateProductFeature($id: ID!, $input: PlanmagnetUpdateProductFeatureInput!) {
367
+ planmagnetUpdateProductFeature(id: $id, input: $input) {
368
+ ${n}
369
+ }
370
+ }
371
+ `, E = e`
372
+ mutation ArchiveProductFeature($id: ID!) {
373
+ planmagnetArchiveProductFeature(id: $id) {
374
+ id
375
+ archivedAt
376
+ }
377
+ }
378
+ `, D = e`
379
+ mutation UnarchiveProductFeature($id: ID!) {
380
+ planmagnetUnarchiveProductFeature(id: $id) {
381
+ id
382
+ archivedAt
383
+ }
384
+ }
385
+ `, O = e`
386
+ mutation DeleteProductFeature($id: ID!) {
387
+ planmagnetDeleteProductFeature(id: $id)
388
+ }
389
+ `, k = e`
390
+ mutation LinkFeatureRequestToProductFeature($featureRequestId: ID!, $productFeatureId: ID!) {
391
+ planmagnetLinkFeatureRequestToProductFeature(
392
+ featureRequestId: $featureRequestId
393
+ productFeatureId: $productFeatureId
394
+ ) {
395
+ id
396
+ }
397
+ }
398
+ `, A = e`
399
+ mutation UnlinkFeatureRequestFromProductFeature($featureRequestId: ID!, $productFeatureId: ID!) {
400
+ planmagnetUnlinkFeatureRequestFromProductFeature(
401
+ featureRequestId: $featureRequestId
402
+ productFeatureId: $productFeatureId
403
+ ) {
404
+ id
405
+ }
406
+ }
407
+ `, j = e`
408
+ mutation LinkEpicToProductFeature($productFeatureId: ID!, $workItemId: ID!) {
409
+ planmagnetLinkEpicToProductFeature(
410
+ productFeatureId: $productFeatureId
411
+ workItemId: $workItemId
412
+ ) {
413
+ id
414
+ }
415
+ }
416
+ `, M = e`
417
+ mutation UnlinkEpicFromProductFeature($productFeatureId: ID!, $workItemId: ID!) {
418
+ planmagnetUnlinkEpicFromProductFeature(
419
+ productFeatureId: $productFeatureId
420
+ workItemId: $workItemId
421
+ )
422
+ }
423
+ `, N = [
424
+ "ProductLinesPage",
425
+ "ProductLineOptions",
426
+ "ProductLineAssignment",
427
+ "ProductLineCandidateProducts",
428
+ "ProductHierarchy"
429
+ ], P = [
430
+ "ProductFeaturesList",
431
+ "ProductFeatureDetail",
432
+ "ProductHierarchy",
433
+ "FeatureRequestProductFeature",
434
+ "FeatureRequestFeatureOptions",
435
+ "WorkItemProductFeature"
436
+ ];
437
+ //#endregion
438
+ export { E as ARCHIVE_PRODUCT_FEATURE, v as ARCHIVE_PRODUCT_LINE, x as ASSIGN_PRODUCT_LINE, w as CREATE_PRODUCT_FEATURE, g as CREATE_PRODUCT_LINE, O as DELETE_PRODUCT_FEATURE, b as DELETE_PRODUCT_LINE, m as FEATURE_REQUEST_FEATURE_OPTIONS, p as FEATURE_REQUEST_PRODUCT_FEATURE, j as LINK_EPIC_TO_PRODUCT_FEATURE, k as LINK_FEATURE_REQUEST_TO_PRODUCT_FEATURE, S as LINK_PRODUCT_TEAM, c as PRODUCT_FEATURES_LIST, l as PRODUCT_FEATURE_DETAIL, u as PRODUCT_FEATURE_EPIC_CANDIDATES, P as PRODUCT_FEATURE_QUERIES, d as PRODUCT_FEATURE_REQUEST_CANDIDATES, f as PRODUCT_HIERARCHY, r as PRODUCT_LINES_PAGE, a as PRODUCT_LINE_ASSIGNMENT, o as PRODUCT_LINE_CANDIDATE_PRODUCTS, i as PRODUCT_LINE_OPTIONS, N as PRODUCT_LINE_QUERIES, s as PRODUCT_TEAMS, D as UNARCHIVE_PRODUCT_FEATURE, y as UNARCHIVE_PRODUCT_LINE, M as UNLINK_EPIC_FROM_PRODUCT_FEATURE, A as UNLINK_FEATURE_REQUEST_FROM_PRODUCT_FEATURE, C as UNLINK_PRODUCT_TEAM, T as UPDATE_PRODUCT_FEATURE, _ as UPDATE_PRODUCT_LINE, h as WORK_ITEM_PRODUCT_FEATURE };
439
+
440
+ //# sourceMappingURL=hierarchyOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchyOperations.js","names":[],"sources":["../../../src/planmagnet/product/hierarchyOperations.ts"],"sourcesContent":["import { gql } from '@apollo/client';\n\n/**\n * PRM-01 GraphQL documents — product lines, product↔team links, product features and their epic / feature\n * request links, and the hierarchy read. Every document here has a twin in\n * src/operations/wspace/planmagnet/{queries,mutations,fragments}/productHierarchy.graphql, which `bun run codegen`\n * validates against the planmagnet schema and CI's live-supergraph drift job validates against what production\n * serves. tests/productHierarchyOperations.test.ts fails when the two copies differ, so what the pages send is what\n * those gates checked.\n *\n * Each page section that reads a PRM-01 field has a query of its own rather than a field added to an existing\n * page query: a field the gateway does not serve fails the WHOLE query, so a shared query would blank the product\n * page instead of one card.\n */\n\nconst PRODUCT_LINE_FIELDS = `\n id\n name\n description\n ownerId\n archivedAt\n createdAt\n updatedAt\n`;\n\nconst PRODUCT_FEATURE_FIELDS = `\n id\n productId\n name\n description\n status\n ownerId\n archivedAt\n createdAt\n updatedAt\n`;\n\n// ─── Queries ────────────────────────────────────────────────────────────────\n\nexport const PRODUCT_LINES_PAGE = gql`\n query ProductLinesPage($workspaceId: ID!, $filter: PlanmagnetProductLineFilter) {\n planmagnetProductLines(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {\n items {\n ${PRODUCT_LINE_FIELDS}\n products {\n id\n name\n archivedAt\n }\n }\n pageInfo {\n hasNextPage\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_LINE_OPTIONS = gql`\n query ProductLineOptions($workspaceId: ID!) {\n planmagnetProductLines(\n workspaceId: $workspaceId\n filter: { isActive: true }\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_LINE_ASSIGNMENT = gql`\n query ProductLineAssignment($productId: ID!) {\n planmagnetProduct(id: $productId) {\n id\n productLineId\n productLine {\n id\n name\n archivedAt\n }\n }\n }\n`;\n\nexport const PRODUCT_LINE_CANDIDATE_PRODUCTS = gql`\n query ProductLineCandidateProducts($workspaceId: ID!) {\n planmagnetProducts(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n archivedAt\n productLine {\n id\n name\n }\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_TEAMS = gql`\n query ProductTeams($productId: ID!) {\n planmagnetProduct(id: $productId) {\n id\n archivedAt\n teams {\n id\n name\n description\n members {\n id\n }\n }\n }\n }\n`;\n\nexport const PRODUCT_FEATURES_LIST = gql`\n query ProductFeaturesList(\n $workspaceId: ID!\n $productId: ID!\n $filter: PlanmagnetProductFeatureFilter\n ) {\n planmagnetProductFeatures(\n workspaceId: $workspaceId\n productId: $productId\n filter: $filter\n pagination: { first: 100 }\n ) {\n items {\n ${PRODUCT_FEATURE_FIELDS}\n epics {\n id\n }\n featureRequests {\n id\n }\n }\n pageInfo {\n hasNextPage\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_FEATURE_DETAIL = gql`\n query ProductFeatureDetail($id: ID!) {\n planmagnetProductFeature(id: $id) {\n ${PRODUCT_FEATURE_FIELDS}\n product {\n id\n name\n archivedAt\n productLine {\n id\n name\n }\n }\n epics {\n id\n key\n title\n type\n status\n children {\n id\n key\n title\n type\n status\n }\n }\n featureRequests {\n id\n title\n status\n voteCount\n productId\n }\n }\n }\n`;\n\nexport const PRODUCT_FEATURE_EPIC_CANDIDATES = gql`\n query ProductFeatureEpicCandidates($workspaceId: ID!, $filter: PlanmagnetWorkItemFilter) {\n planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: { first: 20 }) {\n items {\n id\n key\n title\n type\n productFeature {\n id\n name\n }\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_FEATURE_REQUEST_CANDIDATES = gql`\n query ProductFeatureRequestCandidates(\n $workspaceId: ID!\n $sameProduct: PlanmagnetFeatureRequestFilter!\n $anyProduct: PlanmagnetFeatureRequestFilter\n ) {\n sameProduct: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: $sameProduct\n pagination: { first: 50 }\n ) {\n items {\n id\n title\n status\n productId\n productFeature {\n id\n name\n }\n }\n totalCount\n }\n anyProduct: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: $anyProduct\n pagination: { first: 50 }\n ) {\n items {\n id\n title\n status\n productId\n productFeature {\n id\n name\n }\n }\n totalCount\n }\n }\n`;\n\nexport const PRODUCT_HIERARCHY = gql`\n query ProductHierarchy(\n $workspaceId: ID!\n $lineFilter: PlanmagnetProductLineFilter\n $productFilter: PlanmagnetProductFilter\n $includeArchivedFeatures: Boolean\n ) {\n planmagnetProductLines(\n workspaceId: $workspaceId\n filter: $lineFilter\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n archivedAt\n }\n totalCount\n }\n planmagnetProducts(\n workspaceId: $workspaceId\n filter: $productFilter\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n lifecycleStage\n archivedAt\n productLine {\n id\n name\n archivedAt\n }\n features(includeArchived: $includeArchivedFeatures) {\n id\n name\n status\n archivedAt\n epics {\n id\n key\n title\n type\n status\n children {\n id\n key\n title\n type\n status\n }\n }\n }\n }\n totalCount\n }\n }\n`;\n\nexport const FEATURE_REQUEST_PRODUCT_FEATURE = gql`\n query FeatureRequestProductFeature($id: ID!) {\n planmagnetFeatureRequest(id: $id) {\n id\n productId\n productFeature {\n id\n name\n status\n archivedAt\n product {\n id\n name\n }\n }\n }\n }\n`;\n\nexport const FEATURE_REQUEST_FEATURE_OPTIONS = gql`\n query FeatureRequestFeatureOptions($workspaceId: ID!, $productId: ID!) {\n planmagnetProductFeatures(\n workspaceId: $workspaceId\n productId: $productId\n filter: { isActive: true }\n pagination: { first: 100 }\n ) {\n items {\n id\n name\n status\n }\n totalCount\n }\n }\n`;\n\nexport const WORK_ITEM_PRODUCT_FEATURE = gql`\n query WorkItemProductFeature($id: ID!) {\n planmagnetWorkItem(id: $id) {\n id\n type\n productFeature {\n id\n name\n }\n parent {\n id\n key\n type\n productFeature {\n id\n name\n }\n }\n }\n }\n`;\n\n// ─── Mutations ──────────────────────────────────────────────────────────────\n\nexport const CREATE_PRODUCT_LINE = gql`\n mutation CreateProductLine($input: PlanmagnetCreateProductLineInput!) {\n planmagnetCreateProductLine(input: $input) {\n ${PRODUCT_LINE_FIELDS}\n }\n }\n`;\n\nexport const UPDATE_PRODUCT_LINE = gql`\n mutation UpdateProductLine($id: ID!, $input: PlanmagnetUpdateProductLineInput!) {\n planmagnetUpdateProductLine(id: $id, input: $input) {\n ${PRODUCT_LINE_FIELDS}\n }\n }\n`;\n\nexport const ARCHIVE_PRODUCT_LINE = gql`\n mutation ArchiveProductLine($id: ID!) {\n planmagnetArchiveProductLine(id: $id) {\n id\n archivedAt\n }\n }\n`;\n\nexport const UNARCHIVE_PRODUCT_LINE = gql`\n mutation UnarchiveProductLine($id: ID!) {\n planmagnetUnarchiveProductLine(id: $id) {\n id\n archivedAt\n }\n }\n`;\n\nexport const DELETE_PRODUCT_LINE = gql`\n mutation DeleteProductLine($id: ID!) {\n planmagnetDeleteProductLine(id: $id)\n }\n`;\n\nexport const ASSIGN_PRODUCT_LINE = gql`\n mutation AssignProductLine($productId: ID!, $productLineId: ID) {\n planmagnetAssignProductLine(productId: $productId, productLineId: $productLineId) {\n id\n productLineId\n productLine {\n id\n name\n archivedAt\n }\n }\n }\n`;\n\nexport const LINK_PRODUCT_TEAM = gql`\n mutation LinkProductTeam($productId: ID!, $teamId: ID!) {\n planmagnetLinkProductTeam(productId: $productId, teamId: $teamId) {\n id\n }\n }\n`;\n\nexport const UNLINK_PRODUCT_TEAM = gql`\n mutation UnlinkProductTeam($productId: ID!, $teamId: ID!) {\n planmagnetUnlinkProductTeam(productId: $productId, teamId: $teamId)\n }\n`;\n\nexport const CREATE_PRODUCT_FEATURE = gql`\n mutation CreateProductFeature($input: PlanmagnetCreateProductFeatureInput!) {\n planmagnetCreateProductFeature(input: $input) {\n ${PRODUCT_FEATURE_FIELDS}\n }\n }\n`;\n\nexport const UPDATE_PRODUCT_FEATURE = gql`\n mutation UpdateProductFeature($id: ID!, $input: PlanmagnetUpdateProductFeatureInput!) {\n planmagnetUpdateProductFeature(id: $id, input: $input) {\n ${PRODUCT_FEATURE_FIELDS}\n }\n }\n`;\n\nexport const ARCHIVE_PRODUCT_FEATURE = gql`\n mutation ArchiveProductFeature($id: ID!) {\n planmagnetArchiveProductFeature(id: $id) {\n id\n archivedAt\n }\n }\n`;\n\nexport const UNARCHIVE_PRODUCT_FEATURE = gql`\n mutation UnarchiveProductFeature($id: ID!) {\n planmagnetUnarchiveProductFeature(id: $id) {\n id\n archivedAt\n }\n }\n`;\n\nexport const DELETE_PRODUCT_FEATURE = gql`\n mutation DeleteProductFeature($id: ID!) {\n planmagnetDeleteProductFeature(id: $id)\n }\n`;\n\nexport const LINK_FEATURE_REQUEST_TO_PRODUCT_FEATURE = gql`\n mutation LinkFeatureRequestToProductFeature($featureRequestId: ID!, $productFeatureId: ID!) {\n planmagnetLinkFeatureRequestToProductFeature(\n featureRequestId: $featureRequestId\n productFeatureId: $productFeatureId\n ) {\n id\n }\n }\n`;\n\nexport const UNLINK_FEATURE_REQUEST_FROM_PRODUCT_FEATURE = gql`\n mutation UnlinkFeatureRequestFromProductFeature($featureRequestId: ID!, $productFeatureId: ID!) {\n planmagnetUnlinkFeatureRequestFromProductFeature(\n featureRequestId: $featureRequestId\n productFeatureId: $productFeatureId\n ) {\n id\n }\n }\n`;\n\nexport const LINK_EPIC_TO_PRODUCT_FEATURE = gql`\n mutation LinkEpicToProductFeature($productFeatureId: ID!, $workItemId: ID!) {\n planmagnetLinkEpicToProductFeature(\n productFeatureId: $productFeatureId\n workItemId: $workItemId\n ) {\n id\n }\n }\n`;\n\nexport const UNLINK_EPIC_FROM_PRODUCT_FEATURE = gql`\n mutation UnlinkEpicFromProductFeature($productFeatureId: ID!, $workItemId: ID!) {\n planmagnetUnlinkEpicFromProductFeature(\n productFeatureId: $productFeatureId\n workItemId: $workItemId\n )\n }\n`;\n\n// ─── Refetch groups ─────────────────────────────────────────────────────────\n\n/** Every query that shows a product line, or which line a product is in. */\nexport const PRODUCT_LINE_QUERIES = [\n 'ProductLinesPage',\n 'ProductLineOptions',\n 'ProductLineAssignment',\n 'ProductLineCandidateProducts',\n 'ProductHierarchy',\n];\n\n/** Every query that shows a product feature, its epics or its requests. */\nexport const PRODUCT_FEATURE_QUERIES = [\n 'ProductFeaturesList',\n 'ProductFeatureDetail',\n 'ProductHierarchy',\n 'FeatureRequestProductFeature',\n 'FeatureRequestFeatureOptions',\n 'WorkItemProductFeature',\n];\n"],"mappings":";;AAeA,IAAM,IAAsB,sFAUtB,IAAyB,6GAclB,IAAqB,CAAG;;;;UAI3B,EAAoB;;;;;;;;;;;;;GAejB,IAAuB,CAAG;;;;;;;;;;;;;;GAgB1B,IAA0B,CAAG;;;;;;;;;;;;GAc7B,IAAkC,CAAG;;;;;;;;;;;;;;;GAiBrC,IAAgB,CAAG;;;;;;;;;;;;;;;GAiBnB,IAAwB,CAAG;;;;;;;;;;;;;UAa9B,EAAuB;;;;;;;;;;;;;;GAgBpB,IAAyB,CAAG;;;QAGjC,EAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmClB,IAAkC,CAAG;;;;;;;;;;;;;;;;GAkBrC,IAAqC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CxC,IAAoB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DvB,IAAkC,CAAG;;;;;;;;;;;;;;;;;GAmBrC,IAAkC,CAAG;;;;;;;;;;;;;;;;GAkBrC,IAA4B,CAAG;;;;;;;;;;;;;;;;;;;;GAwB/B,IAAsB,CAAG;;;QAG9B,EAAoB;;;GAKf,IAAsB,CAAG;;;QAG9B,EAAoB;;;GAKf,IAAuB,CAAG;;;;;;;GAS1B,IAAyB,CAAG;;;;;;;GAS5B,IAAsB,CAAG;;;;GAMzB,IAAsB,CAAG;;;;;;;;;;;;GAczB,IAAoB,CAAG;;;;;;GAQvB,IAAsB,CAAG;;;;GAMzB,IAAyB,CAAG;;;QAGjC,EAAuB;;;GAKlB,IAAyB,CAAG;;;QAGjC,EAAuB;;;GAKlB,IAA0B,CAAG;;;;;;;GAS7B,IAA4B,CAAG;;;;;;;GAS/B,IAAyB,CAAG;;;;GAM5B,IAA0C,CAAG;;;;;;;;;GAW7C,IAA8C,CAAG;;;;;;;;;GAWjD,IAA+B,CAAG;;;;;;;;;GAWlC,IAAmC,CAAG;;;;;;;GAYtC,IAAuB;CAClC;CACA;CACA;CACA;CACA;CACD,EAGY,IAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACD"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A refused PRM-01 write, in words. The gateway's role refusal (FORBIDDEN) reads as the plain `forbidden` sentence
3
+ * the caller passes; anything else shows the service's own reason verbatim — a BAD_USER_INPUT such as "That feature
4
+ * request belongs to another product…" is the actionable message, never paraphrased. Every PRM-01 operation sits on
5
+ * the `planmagnet-product` RBAC resource, and, like the rest of the product pages, the controls stay visible: the
6
+ * gateway decides, and the refusal says why.
7
+ *
8
+ * Verbatim means without `mutationErrorMessage`'s `field: ` prefix. The service tags several of these refusals with
9
+ * `extensions.field` (featureRequestId, workItemId, name, status) and the public gateway forwards it, but every PRM-01
10
+ * reason is already a whole sentence that says what was wrong, so the prefix would only put a raw input name in front
11
+ * of it ("featureRequestId: That feature request belongs to another product…").
12
+ */
13
+ export declare function refusalMessage(error: unknown, fallback: string, forbidden: string): string;
14
+ //# sourceMappingURL=refusal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/product/refusal.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAI1F"}
@@ -0,0 +1,10 @@
1
+ import { CombinedGraphQLErrors as e } from "../../node_modules/@apollo/client/errors/CombinedGraphQLErrors.js";
2
+ import { isForbidden as t, mutationErrorMessage as n } from "../utils/graphqlErrors.js";
3
+ //#region src/planmagnet/product/refusal.ts
4
+ function r(r, i, a) {
5
+ return t(r) ? a : e.is(r) ? r.errors[0]?.message || i : n(r, i);
6
+ }
7
+ //#endregion
8
+ export { r as refusalMessage };
9
+
10
+ //# sourceMappingURL=refusal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.js","names":[],"sources":["../../../src/planmagnet/product/refusal.ts"],"sourcesContent":["import { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\n\n/**\n * A refused PRM-01 write, in words. The gateway's role refusal (FORBIDDEN) reads as the plain `forbidden` sentence\n * the caller passes; anything else shows the service's own reason verbatim — a BAD_USER_INPUT such as \"That feature\n * request belongs to another product…\" is the actionable message, never paraphrased. Every PRM-01 operation sits on\n * the `planmagnet-product` RBAC resource, and, like the rest of the product pages, the controls stay visible: the\n * gateway decides, and the refusal says why.\n *\n * Verbatim means without `mutationErrorMessage`'s `field: ` prefix. The service tags several of these refusals with\n * `extensions.field` (featureRequestId, workItemId, name, status) and the public gateway forwards it, but every PRM-01\n * reason is already a whole sentence that says what was wrong, so the prefix would only put a raw input name in front\n * of it (\"featureRequestId: That feature request belongs to another product…\").\n */\nexport function refusalMessage(error: unknown, fallback: string, forbidden: string): string {\n if (isForbidden(error)) return forbidden;\n if (CombinedGraphQLErrors.is(error)) return error.errors[0]?.message || fallback;\n return mutationErrorMessage(error, fallback);\n}\n"],"mappings":";;;AAeA,SAAgB,EAAe,GAAgB,GAAkB,GAA2B;AAG1F,QAFI,EAAY,EAAM,GAAS,IAC3B,EAAsB,GAAG,EAAM,GAAS,EAAM,OAAO,IAAI,WAAW,IACjE,EAAqB,GAAO,EAAS"}
@@ -7,4 +7,14 @@
7
7
  * so the export here is additionally consumed there.
8
8
  */
9
9
  export declare const PRIORITIZATION_PATH = "products/prioritization-page";
10
+ /** Product lines page (PRM-01) — the top of the product hierarchy. Same relative form as PRIORITIZATION_PATH. */
11
+ export declare const PRODUCT_LINES_PATH = "products/product-lines-page";
12
+ /** Product hierarchy page (PRM-01): Product line > Product > Feature > Epic > Story. */
13
+ export declare const PRODUCT_HIERARCHY_PATH = "products/product-hierarchy-page";
14
+ /**
15
+ * Customer satisfaction page (ANR-21): CSAT and NPS with their responses, add / edit / delete and the CSV import. It
16
+ * takes `?window=&from=&to=&product=&release=&project=&metric=` so a product, release or delivery-KPI card can open it
17
+ * already filtered (see satisfaction/satisfaction.ts `satisfactionPageLink`).
18
+ */
19
+ export declare const CUSTOMER_SATISFACTION_PATH = "products/customer-satisfaction-page";
10
20
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/product/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,iCAAiC,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/product/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAElE,iHAAiH;AACjH,eAAO,MAAM,kBAAkB,gCAAgC,CAAC;AAEhE,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,wCAAwC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  //#region src/planmagnet/product/routes.ts
2
- var e = "products/prioritization-page";
2
+ var e = "products/prioritization-page", t = "products/product-lines-page", n = "products/product-hierarchy-page", r = "products/customer-satisfaction-page";
3
3
  //#endregion
4
- export { e as PRIORITIZATION_PATH };
4
+ export { r as CUSTOMER_SATISFACTION_PATH, e as PRIORITIZATION_PATH, n as PRODUCT_HIERARCHY_PATH, t as PRODUCT_LINES_PATH };
5
5
 
6
6
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","names":[],"sources":["../../../src/planmagnet/product/routes.ts"],"sourcesContent":["/**\n * Prioritization page route target (PRM-27), exported so the host shell can build a `NavItem` against the real,\n * routed path instead of a hand-typed string that can drift from `PlanMagnetRoutes.tsx` — same reasoning as\n * `integrations/routes.ts`. Relative, no leading slash — the same form `PlanMagnetRoot.tsx` passes through\n * `joinPath(basePath, ...)` for every other nav entry in this package, and the same form `path=\"…\"` carries in\n * `PlanMagnetRoutes.tsx`. This MFE also registers its own \"Products\" nav tree internally (PlanMagnetRoot.tsx),\n * so the export here is additionally consumed there.\n */\nexport const PRIORITIZATION_PATH = 'products/prioritization-page';\n"],"mappings":";AAQA,IAAa,IAAsB"}
1
+ {"version":3,"file":"routes.js","names":[],"sources":["../../../src/planmagnet/product/routes.ts"],"sourcesContent":["/**\n * Prioritization page route target (PRM-27), exported so the host shell can build a `NavItem` against the real,\n * routed path instead of a hand-typed string that can drift from `PlanMagnetRoutes.tsx` — same reasoning as\n * `integrations/routes.ts`. Relative, no leading slash — the same form `PlanMagnetRoot.tsx` passes through\n * `joinPath(basePath, ...)` for every other nav entry in this package, and the same form `path=\"…\"` carries in\n * `PlanMagnetRoutes.tsx`. This MFE also registers its own \"Products\" nav tree internally (PlanMagnetRoot.tsx),\n * so the export here is additionally consumed there.\n */\nexport const PRIORITIZATION_PATH = 'products/prioritization-page';\n\n/** Product lines page (PRM-01) — the top of the product hierarchy. Same relative form as PRIORITIZATION_PATH. */\nexport const PRODUCT_LINES_PATH = 'products/product-lines-page';\n\n/** Product hierarchy page (PRM-01): Product line > Product > Feature > Epic > Story. */\nexport const PRODUCT_HIERARCHY_PATH = 'products/product-hierarchy-page';\n\n/**\n * Customer satisfaction page (ANR-21): CSAT and NPS with their responses, add / edit / delete and the CSV import. It\n * takes `?window=&from=&to=&product=&release=&project=&metric=` so a product, release or delivery-KPI card can open it\n * already filtered (see satisfaction/satisfaction.ts `satisfactionPageLink`).\n */\nexport const CUSTOMER_SATISFACTION_PATH = 'products/customer-satisfaction-page';\n"],"mappings":";AAQA,IAAa,IAAsB,gCAGtB,IAAqB,+BAGrB,IAAyB,mCAOzB,IAA6B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ANR-21 on the delivery KPIs card: CSAT — the default delivery KPI — and NPS next to the on-time rate and scope
3
+ * adherence, for the same scope (the workspace, or responses linked to the selected project) and the same UTC days as
4
+ * the rest of the card.
5
+ *
6
+ * It reads `planmagnetCustomerSatisfaction` with the card's own range as a CUSTOM window rather than selecting
7
+ * `planmagnetDeliveryKpis.customerSatisfaction` on the card's query. The figures are the same — the service resolves
8
+ * both from one summary over the same UTC days when dates are given — but a query of its own means a satisfaction
9
+ * failure (or a role that cannot read `planmagnet-product`) leaves the on-time and scope figures standing: a non-null
10
+ * field that fails nulls the whole `planmagnetDeliveryKpis`. A second `planmagnetDeliveryKpis` query just for this
11
+ * field would recompute every other KPI on the server.
12
+ */
13
+ export declare function DeliverySatisfactionSection({ workspaceId, projectId, startDate, endDate, }: {
14
+ workspaceId: string;
15
+ projectId?: string;
16
+ /** ISO instants: the start of the range's first UTC day and the end of its last. */
17
+ startDate: string;
18
+ endDate: string;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=DeliverySatisfactionSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeliverySatisfactionSection.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/DeliverySatisfactionSection.tsx"],"names":[],"mappings":"AAaA;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,SAAS,EACT,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,2CAiEA"}
@@ -0,0 +1,55 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { useTr as t } from "../../shared/hooks/useTr.js";
3
+ import { isForbidden as n } from "../utils/graphqlErrors.js";
4
+ import { satisfactionPageLink as r, utcDay as i } from "./satisfaction.js";
5
+ import { CompactSatisfactionFigures as a } from "./SatisfactionFigures.js";
6
+ import { CUSTOMER_SATISFACTION_SUMMARY as o } from "./satisfactionOperations.js";
7
+ import { ArrowRight as s } from "lucide-react";
8
+ import { useQuery as c } from "@apollo/client/react";
9
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
10
+ import { Button as d } from "@burdenoff/fe-libs/ui";
11
+ //#region src/planmagnet/satisfaction/DeliverySatisfactionSection.tsx
12
+ function f({ workspaceId: f, projectId: p, startDate: m, endDate: h }) {
13
+ let g = t(), _ = e(), { data: v, loading: y, error: b } = c(o, { variables: {
14
+ workspaceId: f,
15
+ filter: {
16
+ ...p ? { projectId: p } : {},
17
+ window: {
18
+ preset: "CUSTOM",
19
+ from: m,
20
+ to: h
21
+ }
22
+ }
23
+ } }), x = v?.planmagnetCustomerSatisfaction, S = i(m), C = i(h);
24
+ return /* @__PURE__ */ u("div", {
25
+ "data-testid": "delivery-satisfaction",
26
+ children: [/* @__PURE__ */ u("div", {
27
+ className: "mb-1 flex items-center justify-between gap-2",
28
+ children: [/* @__PURE__ */ l("h3", {
29
+ className: "text-sm font-medium",
30
+ children: g("planmagnet.analytics.delivery.satisfaction", "Customer satisfaction")
31
+ }), /* @__PURE__ */ u(d, {
32
+ size: "sm",
33
+ variant: "ghost",
34
+ className: "h-7 px-2 text-xs",
35
+ onClick: () => _(r({ projectId: p }, S && C ? {
36
+ preset: "CUSTOM",
37
+ from: S,
38
+ to: C
39
+ } : void 0)),
40
+ "data-testid": "delivery-satisfaction-open",
41
+ children: [g("planmagnet.analytics.delivery.satisfactionOpen", "Responses"), /* @__PURE__ */ l(s, { className: "ml-1 h-3.5 w-3.5" })]
42
+ })]
43
+ }), y && !x ? /* @__PURE__ */ l("p", {
44
+ className: "py-2 text-sm text-muted-foreground",
45
+ children: g("planmagnet.satisfaction.loading", "Loading…")
46
+ }) : b && !x ? /* @__PURE__ */ l("p", {
47
+ className: "py-2 text-sm text-status-error-text",
48
+ children: n(b) ? g("planmagnet.satisfaction.errors.readForbidden", "Your role cannot see customer satisfaction in this workspace.") : g("planmagnet.satisfaction.errors.load", "Customer satisfaction could not be loaded: {{message}}", { message: b.message })
49
+ }) : x ? /* @__PURE__ */ l(a, { summary: x }) : null]
50
+ });
51
+ }
52
+ //#endregion
53
+ export { f as DeliverySatisfactionSection };
54
+
55
+ //# sourceMappingURL=DeliverySatisfactionSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeliverySatisfactionSection.js","names":[],"sources":["../../../src/planmagnet/satisfaction/DeliverySatisfactionSection.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ArrowRight } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { CompactSatisfactionFigures } from './SatisfactionFigures';\nimport { satisfactionPageLink, utcDay } from './satisfaction';\nimport {\n CUSTOMER_SATISFACTION_SUMMARY,\n type CustomerSatisfactionSummaryData,\n} from './satisfactionOperations';\n\n/**\n * ANR-21 on the delivery KPIs card: CSAT — the default delivery KPI — and NPS next to the on-time rate and scope\n * adherence, for the same scope (the workspace, or responses linked to the selected project) and the same UTC days as\n * the rest of the card.\n *\n * It reads `planmagnetCustomerSatisfaction` with the card's own range as a CUSTOM window rather than selecting\n * `planmagnetDeliveryKpis.customerSatisfaction` on the card's query. The figures are the same — the service resolves\n * both from one summary over the same UTC days when dates are given — but a query of its own means a satisfaction\n * failure (or a role that cannot read `planmagnet-product`) leaves the on-time and scope figures standing: a non-null\n * field that fails nulls the whole `planmagnetDeliveryKpis`. A second `planmagnetDeliveryKpis` query just for this\n * field would recompute every other KPI on the server.\n */\nexport function DeliverySatisfactionSection({\n workspaceId,\n projectId,\n startDate,\n endDate,\n}: {\n workspaceId: string;\n projectId?: string;\n /** ISO instants: the start of the range's first UTC day and the end of its last. */\n startDate: string;\n endDate: string;\n}) {\n const tr = useTr();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<CustomerSatisfactionSummaryData>(\n CUSTOMER_SATISFACTION_SUMMARY,\n {\n variables: {\n workspaceId,\n filter: {\n ...(projectId ? { projectId } : {}),\n window: { preset: 'CUSTOM', from: startDate, to: endDate },\n },\n },\n }\n );\n const summary = data?.planmagnetCustomerSatisfaction;\n const from = utcDay(startDate);\n const to = utcDay(endDate);\n\n return (\n <div data-testid=\"delivery-satisfaction\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-medium\">\n {tr('planmagnet.analytics.delivery.satisfaction', 'Customer satisfaction')}\n </h3>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2 text-xs\"\n onClick={() =>\n navigate(\n satisfactionPageLink(\n { projectId },\n from && to ? { preset: 'CUSTOM', from, to } : undefined\n )\n )\n }\n data-testid=\"delivery-satisfaction-open\"\n >\n {tr('planmagnet.analytics.delivery.satisfactionOpen', 'Responses')}\n <ArrowRight className=\"ml-1 h-3.5 w-3.5\" />\n </Button>\n </div>\n {loading && !summary ? (\n <p className=\"py-2 text-sm text-muted-foreground\">\n {tr('planmagnet.satisfaction.loading', 'Loading…')}\n </p>\n ) : error && !summary ? (\n <p className=\"py-2 text-sm text-status-error-text\">\n {isForbidden(error)\n ? tr(\n 'planmagnet.satisfaction.errors.readForbidden',\n 'Your role cannot see customer satisfaction in this workspace.'\n )\n : tr(\n 'planmagnet.satisfaction.errors.load',\n 'Customer satisfaction could not be loaded: {{message}}',\n { message: error.message }\n )}\n </p>\n ) : summary ? (\n <CompactSatisfactionFigures summary={summary} />\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAyBA,SAAgB,EAA4B,EAC1C,gBACA,cACA,cACA,cAOC;CACD,IAAM,IAAK,GAAO,EACZ,IAAW,GAAuB,EAClC,EAAE,SAAM,YAAS,aAAU,EAC/B,GACA,EACE,WAAW;EACT;EACA,QAAQ;GACN,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,QAAQ;IAAE,QAAQ;IAAU,MAAM;IAAW,IAAI;IAAS;GAC3D;EACF,EACF,CACF,EACK,IAAU,GAAM,gCAChB,IAAO,EAAO,EAAU,EACxB,IAAK,EAAO,EAAQ;AAE1B,QACE,kBAAC,OAAD;EAAK,eAAY;YAAjB,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAG,8CAA8C,wBAAwB;IACvE,CAAA,EACL,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,WAAU;IACV,eACE,EACE,EACE,EAAE,cAAW,EACb,KAAQ,IAAK;KAAE,QAAQ;KAAU;KAAM;KAAI,GAAG,KAAA,EAC/C,CACF;IAEH,eAAY;cAZd,CAcG,EAAG,kDAAkD,YAAY,EAClE,kBAAC,GAAD,EAAY,WAAU,oBAAqB,CAAA,CACpC;MACL;MACL,KAAW,CAAC,IACX,kBAAC,KAAD;GAAG,WAAU;aACV,EAAG,mCAAmC,WAAW;GAChD,CAAA,GACF,KAAS,CAAC,IACZ,kBAAC,KAAD;GAAG,WAAU;aACV,EAAY,EAAM,GACf,EACE,gDACA,gEACD,GACD,EACE,uCACA,0DACA,EAAE,SAAS,EAAM,SAAS,CAC3B;GACH,CAAA,GACF,IACF,kBAAC,GAAD,EAAqC,YAAW,CAAA,GAC9C,KACA"}
@@ -0,0 +1,30 @@
1
+ import { useTr } from '../../shared/hooks/useTr';
2
+ import { ScoreCategory } from './satisfaction';
3
+ import { CustomerSatisfactionSummary, SatisfactionWindowEcho } from './satisfactionOperations';
4
+
5
+ /**
6
+ * ANR-21 figures. Every figure carries its response count and the window it covers (owner decision 2026-10-02), and
7
+ * a metric below its minimum responses reads "Not enough responses" — never 0 and never a score computed from too few
8
+ * answers. CSAT and NPS are counted separately: twelve NPS answers never lend a score to four CSAT answers.
9
+ */
10
+ type Tr = ReturnType<typeof useTr>;
11
+ export declare function responseCountText(tr: Tr, count: number): string;
12
+ export declare function windowText(tr: Tr, window: SatisfactionWindowEcho): string;
13
+ export declare function windowPresetLabel(tr: Tr, preset: SatisfactionWindowEcho['preset']): string;
14
+ /**
15
+ * Badge colours for one answer's category — semantic status tokens only, and only those the host shells' Tailwind
16
+ * theme maps (planmagnet-app styles.css @theme): `bg-status-*-bg`, `bg-status-*-bg-subtle`, `text-status-success-text`,
17
+ * `text-status-error-text`. A token missing there generates no CSS at all.
18
+ */
19
+ export declare const CATEGORY_CLASS: Record<ScoreCategory, string>;
20
+ export declare function categoryLabel(tr: Tr, category: ScoreCategory): string;
21
+ /** The page's two figure cards, side by side. */
22
+ export declare function SatisfactionFigureCards({ summary }: {
23
+ summary: CustomerSatisfactionSummary;
24
+ }): import("react/jsx-runtime").JSX.Element;
25
+ /** CSAT and NPS as two small tiles with their counts, and the window under them — for cards on other pages. */
26
+ export declare function CompactSatisfactionFigures({ summary }: {
27
+ summary: CustomerSatisfactionSummary;
28
+ }): import("react/jsx-runtime").JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=SatisfactionFigures.d.ts.map