@burdenoff/microfe-planmagnet 2026.928.3 → 2026.928.5

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 (245) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +126 -84
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.js +192 -64
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts +5 -0
  8. package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +1 -0
  9. package/dist/planmagnet/automation/AutomationExecutionsPanel.js +107 -0
  10. package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +1 -0
  11. package/dist/planmagnet/automation/AutomationRuleFields.d.ts +29 -0
  12. package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +1 -0
  13. package/dist/planmagnet/automation/AutomationRuleFields.js +308 -0
  14. package/dist/planmagnet/automation/AutomationRuleFields.js.map +1 -0
  15. package/dist/planmagnet/automation/automationRuleTypes.d.ts +60 -0
  16. package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -0
  17. package/dist/planmagnet/automation/automationRuleTypes.js +113 -0
  18. package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -0
  19. package/dist/planmagnet/board/BulkActions.d.ts +11 -0
  20. package/dist/planmagnet/board/BulkActions.d.ts.map +1 -0
  21. package/dist/planmagnet/board/BulkActions.js +182 -0
  22. package/dist/planmagnet/board/BulkActions.js.map +1 -0
  23. package/dist/planmagnet/board/ProjectBoard.d.ts.map +1 -1
  24. package/dist/planmagnet/board/ProjectBoard.js +289 -254
  25. package/dist/planmagnet/board/ProjectBoard.js.map +1 -1
  26. package/dist/planmagnet/budgets/BudgetControls.d.ts +30 -0
  27. package/dist/planmagnet/budgets/BudgetControls.d.ts.map +1 -0
  28. package/dist/planmagnet/budgets/BudgetControls.js +470 -0
  29. package/dist/planmagnet/budgets/BudgetControls.js.map +1 -0
  30. package/dist/planmagnet/budgets/ExpenseControls.d.ts +27 -0
  31. package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +1 -0
  32. package/dist/planmagnet/budgets/ExpenseControls.js +366 -0
  33. package/dist/planmagnet/budgets/ExpenseControls.js.map +1 -0
  34. package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts +5 -0
  35. package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +1 -0
  36. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +112 -0
  37. package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +1 -0
  38. package/dist/planmagnet/budgets/budgetMath.d.ts +26 -0
  39. package/dist/planmagnet/budgets/budgetMath.d.ts.map +1 -0
  40. package/dist/planmagnet/budgets/budgetMath.js +49 -0
  41. package/dist/planmagnet/budgets/budgetMath.js.map +1 -0
  42. package/dist/planmagnet/controls/AutomationRuleControls.d.ts +23 -0
  43. package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +1 -0
  44. package/dist/planmagnet/controls/AutomationRuleControls.js +172 -0
  45. package/dist/planmagnet/controls/AutomationRuleControls.js.map +1 -0
  46. package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
  47. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
  48. package/dist/planmagnet/controls/CompetitorControls.js +172 -0
  49. package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
  50. package/dist/planmagnet/controls/CustomFieldControls.d.ts +42 -0
  51. package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +1 -0
  52. package/dist/planmagnet/controls/CustomFieldControls.js +84 -0
  53. package/dist/planmagnet/controls/CustomFieldControls.js.map +1 -0
  54. package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts +8 -0
  55. package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +1 -0
  56. package/dist/planmagnet/controls/CustomFieldValuesPanel.js +315 -0
  57. package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +1 -0
  58. package/dist/planmagnet/controls/FeatureControls.js +53 -53
  59. package/dist/planmagnet/controls/FeatureTriage.js +11 -11
  60. package/dist/planmagnet/controls/ObjectiveControls.js +37 -37
  61. package/dist/planmagnet/controls/Pickers.d.ts +17 -2
  62. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  63. package/dist/planmagnet/controls/Pickers.js +100 -9
  64. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  65. package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
  66. package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
  67. package/dist/planmagnet/controls/PortfolioControls.js +114 -0
  68. package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
  69. package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
  70. package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
  71. package/dist/planmagnet/controls/ProgramControls.js +187 -0
  72. package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
  73. package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -1
  74. package/dist/planmagnet/controls/ProjectControls.js +54 -47
  75. package/dist/planmagnet/controls/ProjectControls.js.map +1 -1
  76. package/dist/planmagnet/controls/ReleaseControls.js +7 -7
  77. package/dist/planmagnet/controls/RiskControls.d.ts +27 -0
  78. package/dist/planmagnet/controls/RiskControls.d.ts.map +1 -0
  79. package/dist/planmagnet/controls/RiskControls.js +346 -0
  80. package/dist/planmagnet/controls/RiskControls.js.map +1 -0
  81. package/dist/planmagnet/controls/TemplateControls.d.ts +15 -0
  82. package/dist/planmagnet/controls/TemplateControls.d.ts.map +1 -0
  83. package/dist/planmagnet/controls/TemplateControls.js +55 -0
  84. package/dist/planmagnet/controls/TemplateControls.js.map +1 -0
  85. package/dist/planmagnet/controls/WorkItemControls.js +1 -1
  86. package/dist/planmagnet/create/CreateDialogs.d.ts +20 -0
  87. package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
  88. package/dist/planmagnet/create/CreateDialogs.js +455 -116
  89. package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
  90. package/dist/planmagnet/dependency/DependencyPanel.d.ts +6 -0
  91. package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +1 -0
  92. package/dist/planmagnet/dependency/DependencyPanel.js +310 -0
  93. package/dist/planmagnet/dependency/DependencyPanel.js.map +1 -0
  94. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts +2 -0
  95. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +1 -0
  96. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +171 -0
  97. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +1 -0
  98. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts +2 -0
  99. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +1 -0
  100. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +232 -0
  101. package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +1 -0
  102. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts +2 -0
  103. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +1 -0
  104. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +93 -0
  105. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +1 -0
  106. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
  107. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
  108. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
  109. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
  110. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
  111. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
  112. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
  113. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
  114. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
  115. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
  116. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
  117. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
  118. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
  119. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
  120. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
  121. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
  122. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
  123. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
  124. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
  125. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
  126. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
  127. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
  128. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
  129. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
  130. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
  131. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
  132. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
  133. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
  134. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
  135. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
  136. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
  137. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
  138. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  139. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
  140. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  141. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
  142. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
  143. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
  144. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
  145. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
  146. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
  147. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
  148. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
  149. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
  150. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
  151. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
  152. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
  153. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
  154. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
  155. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
  156. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
  157. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts +2 -0
  158. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +1 -0
  159. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +315 -0
  160. package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +1 -0
  161. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts +2 -0
  162. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +1 -0
  163. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +186 -0
  164. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +1 -0
  165. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts +2 -0
  166. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +1 -0
  167. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +164 -0
  168. package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +1 -0
  169. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts +2 -0
  170. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +1 -0
  171. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +348 -0
  172. package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +1 -0
  173. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  174. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
  175. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  176. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +4 -4
  177. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +4 -4
  178. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +6 -6
  179. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  180. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +325 -189
  181. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  182. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  183. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +81 -72
  184. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  185. package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts +2 -0
  186. package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +1 -0
  187. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +278 -0
  188. package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +1 -0
  189. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts +2 -0
  190. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +1 -0
  191. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +191 -0
  192. package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +1 -0
  193. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +5 -5
  194. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +4 -4
  195. package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
  196. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  197. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +161 -137
  198. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  199. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  200. package/dist/planmagnet/pages/TasksTasksPagePage.js +124 -113
  201. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  202. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts +2 -0
  203. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +1 -0
  204. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +263 -0
  205. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +1 -0
  206. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts +2 -0
  207. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +1 -0
  208. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +254 -0
  209. package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +1 -0
  210. package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts +2 -0
  211. package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +1 -0
  212. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +165 -0
  213. package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +1 -0
  214. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts +2 -0
  215. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +1 -0
  216. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +316 -0
  217. package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +1 -0
  218. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts +2 -0
  219. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +1 -0
  220. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +208 -0
  221. package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +1 -0
  222. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +0 -5
  223. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -1
  224. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +47 -89
  225. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -1
  226. package/dist/planmagnet/roadmaps/RoadmapControls.js +24 -24
  227. package/dist/planmagnet/time/TaskTimePanel.d.ts +7 -0
  228. package/dist/planmagnet/time/TaskTimePanel.d.ts.map +1 -0
  229. package/dist/planmagnet/time/TaskTimePanel.js +104 -0
  230. package/dist/planmagnet/time/TaskTimePanel.js.map +1 -0
  231. package/dist/planmagnet/time/TimeEntryControls.d.ts +37 -0
  232. package/dist/planmagnet/time/TimeEntryControls.d.ts.map +1 -0
  233. package/dist/planmagnet/time/TimeEntryControls.js +338 -0
  234. package/dist/planmagnet/time/TimeEntryControls.js.map +1 -0
  235. package/dist/planmagnet/time/TimesheetControls.d.ts +18 -0
  236. package/dist/planmagnet/time/TimesheetControls.d.ts.map +1 -0
  237. package/dist/planmagnet/time/TimesheetControls.js +244 -0
  238. package/dist/planmagnet/time/TimesheetControls.js.map +1 -0
  239. package/dist/planmagnet/time/timeShared.d.ts +29 -0
  240. package/dist/planmagnet/time/timeShared.d.ts.map +1 -0
  241. package/dist/planmagnet/time/timeShared.js +34 -0
  242. package/dist/planmagnet/time/timeShared.js.map +1 -0
  243. package/dist/planmagnet/utils/rowNavigation.js +5 -2
  244. package/dist/planmagnet/utils/rowNavigation.js.map +1 -1
  245. package/package.json +1 -1
@@ -0,0 +1,278 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { useEntityId as n } from "../hooks/useEntityId.js";
4
+ import { enumLabel as r } from "../controls/WorkItemControls.js";
5
+ import { detailPath as i } from "../utils/rowNavigation.js";
6
+ import { RiskHeaderActions as a } from "../controls/RiskControls.js";
7
+ import { Calendar as o, FolderKanban as s, Gauge as c, ShieldAlert as l, User as u } from "lucide-react";
8
+ import { gql as d } from "@apollo/client";
9
+ import { useQuery as f } from "@apollo/client/react";
10
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
+ import { Badge as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y } from "@burdenoff/fe-libs/ui";
12
+ //#region src/planmagnet/pages/RisksRiskDetailPagePage.tsx
13
+ var b = d`
14
+ query GetRiskDetail($id: ID!) {
15
+ planmagnetRisk(id: $id) {
16
+ id
17
+ projectId
18
+ project {
19
+ id
20
+ name
21
+ }
22
+ title
23
+ description
24
+ severity
25
+ status
26
+ likelihood
27
+ impact
28
+ riskScore
29
+ category
30
+ mitigationPlan
31
+ contingencyPlan
32
+ ownerId
33
+ dueDate
34
+ resolvedAt
35
+ tags
36
+ createdAt
37
+ updatedAt
38
+ }
39
+ }
40
+ `, x = {
41
+ CRITICAL: "bg-red-100 text-red-800",
42
+ HIGH: "bg-orange-100 text-orange-800",
43
+ MEDIUM: "bg-yellow-100 text-yellow-800",
44
+ LOW: "bg-blue-100 text-blue-800",
45
+ NEGLIGIBLE: "bg-gray-100 text-gray-800"
46
+ }, S = 12;
47
+ function C() {
48
+ let d = n(), C = e(), { data: w, loading: T, error: E } = f(b, {
49
+ variables: { id: d },
50
+ skip: !d
51
+ });
52
+ if (!d) return /* @__PURE__ */ p("div", {
53
+ className: "p-6 text-muted-foreground",
54
+ children: "No risk selected. Open one from the register."
55
+ });
56
+ if (T && !w) return /* @__PURE__ */ p("div", {
57
+ className: "flex items-center justify-center p-12",
58
+ children: /* @__PURE__ */ p("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
59
+ });
60
+ if (E) return /* @__PURE__ */ m("div", {
61
+ className: "p-6 text-red-500",
62
+ children: ["Error loading risk: ", E.message]
63
+ });
64
+ let D = w?.planmagnetRisk;
65
+ return D ? /* @__PURE__ */ m("div", {
66
+ className: "space-y-6 p-6",
67
+ children: [/* @__PURE__ */ m("div", {
68
+ className: "flex items-center justify-between gap-4",
69
+ children: [/* @__PURE__ */ m("div", {
70
+ className: "flex items-center gap-3",
71
+ children: [/* @__PURE__ */ p(l, { className: "h-6 w-6 text-primary" }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("div", {
72
+ className: "flex items-center gap-2",
73
+ children: [/* @__PURE__ */ p("h1", {
74
+ className: "text-2xl font-semibold",
75
+ children: D.title
76
+ }), /* @__PURE__ */ p("span", {
77
+ className: `text-xs px-2 py-0.5 rounded-full shrink-0 ${x[D.severity] ?? "bg-gray-100"}`,
78
+ children: r(D.severity)
79
+ })]
80
+ }), /* @__PURE__ */ m("p", {
81
+ className: "text-sm text-muted-foreground",
82
+ children: ["Project: ", D.project?.name ?? "not available"]
83
+ })] })]
84
+ }), /* @__PURE__ */ p(a, { risk: D })]
85
+ }), /* @__PURE__ */ m("div", {
86
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
87
+ children: [/* @__PURE__ */ m("div", {
88
+ className: "lg:col-span-2 space-y-6",
89
+ children: [
90
+ /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: "Overview" }) }), /* @__PURE__ */ m(_, {
91
+ className: "space-y-4",
92
+ children: [
93
+ /* @__PURE__ */ p("p", {
94
+ className: "text-sm",
95
+ children: D.description ?? "No description provided."
96
+ }),
97
+ /* @__PURE__ */ m("div", {
98
+ className: "flex justify-between text-sm",
99
+ children: [/* @__PURE__ */ p("span", {
100
+ className: "text-muted-foreground",
101
+ children: "Status"
102
+ }), /* @__PURE__ */ p(h, {
103
+ variant: D.status === "RESOLVED" || D.status === "CLOSED" ? "default" : "secondary",
104
+ className: "capitalize",
105
+ children: r(D.status)
106
+ })]
107
+ }),
108
+ D.category && /* @__PURE__ */ m("div", {
109
+ className: "flex justify-between text-sm",
110
+ children: [/* @__PURE__ */ p("span", {
111
+ className: "text-muted-foreground",
112
+ children: "Category"
113
+ }), /* @__PURE__ */ p("span", {
114
+ className: "font-medium",
115
+ children: D.category
116
+ })]
117
+ })
118
+ ]
119
+ })] }),
120
+ /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ m(y, {
121
+ className: "flex items-center gap-2",
122
+ children: [/* @__PURE__ */ p(c, { className: "h-4 w-4 text-primary" }), "Risk score"]
123
+ }) }), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m("div", {
124
+ className: "grid grid-cols-3 gap-4 text-center",
125
+ children: [
126
+ /* @__PURE__ */ m("div", {
127
+ className: "p-4 bg-muted rounded-md",
128
+ children: [/* @__PURE__ */ p("p", {
129
+ className: "text-xl font-bold",
130
+ children: D.likelihood
131
+ }), /* @__PURE__ */ p("p", {
132
+ className: "text-xs text-muted-foreground",
133
+ children: "Likelihood (1-5)"
134
+ })]
135
+ }),
136
+ /* @__PURE__ */ m("div", {
137
+ className: "p-4 bg-muted rounded-md",
138
+ children: [/* @__PURE__ */ p("p", {
139
+ className: "text-xl font-bold",
140
+ children: D.impact
141
+ }), /* @__PURE__ */ p("p", {
142
+ className: "text-xs text-muted-foreground",
143
+ children: "Impact (1-5)"
144
+ })]
145
+ }),
146
+ /* @__PURE__ */ m("div", {
147
+ className: `p-4 rounded-md ${D.riskScore >= S ? "bg-destructive/10" : "bg-muted"}`,
148
+ children: [/* @__PURE__ */ p("p", {
149
+ className: "text-xl font-bold",
150
+ children: D.riskScore
151
+ }), /* @__PURE__ */ m("p", {
152
+ className: "text-xs text-muted-foreground",
153
+ children: ["Score", D.riskScore >= S ? " — needs attention" : ""]
154
+ })]
155
+ })
156
+ ]
157
+ }) })] }),
158
+ (D.mitigationPlan || D.contingencyPlan) && /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: "Response plan" }) }), /* @__PURE__ */ m(_, {
159
+ className: "space-y-4",
160
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
161
+ className: "text-xs font-medium text-muted-foreground uppercase",
162
+ children: "Mitigation"
163
+ }), /* @__PURE__ */ p("p", {
164
+ className: "text-sm mt-1",
165
+ children: D.mitigationPlan ?? "Not set."
166
+ })] }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
167
+ className: "text-xs font-medium text-muted-foreground uppercase",
168
+ children: "Contingency"
169
+ }), /* @__PURE__ */ p("p", {
170
+ className: "text-sm mt-1",
171
+ children: D.contingencyPlan ?? "Not set."
172
+ })] })]
173
+ })] })
174
+ ]
175
+ }), /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: "Details" }) }), /* @__PURE__ */ m(_, {
176
+ className: "space-y-3 text-sm",
177
+ children: [
178
+ /* @__PURE__ */ m("div", {
179
+ className: "flex items-center gap-2",
180
+ children: [
181
+ /* @__PURE__ */ p(s, { className: "h-4 w-4 text-muted-foreground" }),
182
+ /* @__PURE__ */ p("span", {
183
+ className: "text-muted-foreground",
184
+ children: "Project:"
185
+ }),
186
+ D.project ? /* @__PURE__ */ p("button", {
187
+ type: "button",
188
+ className: "font-medium text-primary hover:underline",
189
+ onClick: () => C(i("/projects/project-detail-page", D.project?.id)),
190
+ children: D.project.name
191
+ }) : /* @__PURE__ */ p("span", {
192
+ className: "text-muted-foreground",
193
+ children: "not available"
194
+ })
195
+ ]
196
+ }),
197
+ D.ownerId && /* @__PURE__ */ m("div", {
198
+ className: "flex items-center gap-2",
199
+ children: [
200
+ /* @__PURE__ */ p(u, { className: "h-4 w-4 text-muted-foreground" }),
201
+ /* @__PURE__ */ p("span", {
202
+ className: "text-muted-foreground",
203
+ children: "Owner:"
204
+ }),
205
+ /* @__PURE__ */ p("span", {
206
+ className: "font-medium",
207
+ children: /* @__PURE__ */ p(t, { id: D.ownerId })
208
+ })
209
+ ]
210
+ }),
211
+ /* @__PURE__ */ m("div", {
212
+ className: "flex items-center gap-2",
213
+ children: [
214
+ /* @__PURE__ */ p(o, { className: "h-4 w-4 text-muted-foreground" }),
215
+ /* @__PURE__ */ p("span", {
216
+ className: "text-muted-foreground",
217
+ children: "Due:"
218
+ }),
219
+ /* @__PURE__ */ p("span", {
220
+ className: "font-medium",
221
+ children: D.dueDate ? new Date(D.dueDate).toLocaleDateString() : "Not set"
222
+ })
223
+ ]
224
+ }),
225
+ D.resolvedAt && /* @__PURE__ */ m("div", {
226
+ className: "flex items-center gap-2",
227
+ children: [
228
+ /* @__PURE__ */ p(o, { className: "h-4 w-4 text-muted-foreground" }),
229
+ /* @__PURE__ */ p("span", {
230
+ className: "text-muted-foreground",
231
+ children: "Resolved:"
232
+ }),
233
+ /* @__PURE__ */ p("span", {
234
+ className: "font-medium",
235
+ children: new Date(D.resolvedAt).toLocaleDateString()
236
+ })
237
+ ]
238
+ }),
239
+ D.tags.length > 0 && /* @__PURE__ */ m("div", {
240
+ className: "flex justify-between items-start",
241
+ children: [/* @__PURE__ */ p("span", {
242
+ className: "text-muted-foreground",
243
+ children: "Tags"
244
+ }), /* @__PURE__ */ p("div", {
245
+ className: "flex gap-1 flex-wrap justify-end",
246
+ children: D.tags.map((e) => /* @__PURE__ */ p(h, {
247
+ variant: "outline",
248
+ className: "text-xs",
249
+ children: e
250
+ }, e))
251
+ })]
252
+ }),
253
+ /* @__PURE__ */ m("div", {
254
+ className: "flex justify-between",
255
+ children: [/* @__PURE__ */ p("span", {
256
+ className: "text-muted-foreground",
257
+ children: "Created"
258
+ }), /* @__PURE__ */ p("span", { children: new Date(D.createdAt).toLocaleDateString() })]
259
+ }),
260
+ /* @__PURE__ */ m("div", {
261
+ className: "flex justify-between",
262
+ children: [/* @__PURE__ */ p("span", {
263
+ className: "text-muted-foreground",
264
+ children: "Updated"
265
+ }), /* @__PURE__ */ p("span", { children: new Date(D.updatedAt).toLocaleDateString() })]
266
+ })
267
+ ]
268
+ })] })]
269
+ })]
270
+ }) : /* @__PURE__ */ p("div", {
271
+ className: "p-6 text-muted-foreground",
272
+ children: "Risk not found."
273
+ });
274
+ }
275
+ //#endregion
276
+ export { C as RisksRiskDetailPagePage };
277
+
278
+ //# sourceMappingURL=RisksRiskDetailPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RisksRiskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/RisksRiskDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { ShieldAlert, Calendar, FolderKanban, User, Gauge } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { PersonName } from '../people/People';\nimport { RiskHeaderActions } from '../controls/RiskControls';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\n\nconst GET_RISK_DETAIL = gql`\n query GetRiskDetail($id: ID!) {\n planmagnetRisk(id: $id) {\n id\n projectId\n project {\n id\n name\n }\n title\n description\n severity\n status\n likelihood\n impact\n riskScore\n category\n mitigationPlan\n contingencyPlan\n ownerId\n dueDate\n resolvedAt\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nconst severityColor: Record<string, string> = {\n CRITICAL: 'bg-red-100 text-red-800',\n HIGH: 'bg-orange-100 text-orange-800',\n MEDIUM: 'bg-yellow-100 text-yellow-800',\n LOW: 'bg-blue-100 text-blue-800',\n NEGLIGIBLE: 'bg-gray-100 text-gray-800',\n};\n\n/** likelihood/impact are each 1-5; anything at or above this product is called out as needing attention. */\nconst HIGH_SCORE_THRESHOLD = 12;\n\nexport function RisksRiskDetailPagePage() {\n const riskId = useEntityId();\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<{\n planmagnetRisk: {\n id: string;\n projectId: string;\n project: { id: string; name: string } | null;\n title: string;\n description: string | null;\n severity: string;\n status: string;\n likelihood: number;\n impact: number;\n riskScore: number;\n category: string | null;\n mitigationPlan: string | null;\n contingencyPlan: string | null;\n ownerId: string | null;\n dueDate: string | null;\n resolvedAt: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n } | null;\n }>(GET_RISK_DETAIL, {\n variables: { id: riskId },\n skip: !riskId,\n });\n\n if (!riskId)\n return (\n <div className=\"p-6 text-muted-foreground\">No risk selected. Open one from the register.</div>\n );\n // Only before the first load: a refetch must not blank the page (it unmounts every component and loses state).\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error) return <div className=\"p-6 text-red-500\">Error loading risk: {error.message}</div>;\n\n const risk = data?.planmagnetRisk;\n if (!risk) return <div className=\"p-6 text-muted-foreground\">Risk not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n <ShieldAlert className=\"h-6 w-6 text-primary\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl font-semibold\">{risk.title}</h1>\n <span\n className={`text-xs px-2 py-0.5 rounded-full shrink-0 ${severityColor[risk.severity] ?? 'bg-gray-100'}`}\n >\n {enumLabel(risk.severity)}\n </span>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n Project: {risk.project?.name ?? 'not available'}\n </p>\n </div>\n </div>\n <RiskHeaderActions risk={risk} />\n </div>\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>Overview</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm\">{risk.description ?? 'No description provided.'}</p>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Status</span>\n <Badge\n variant={\n risk.status === 'RESOLVED' || risk.status === 'CLOSED' ? 'default' : 'secondary'\n }\n className=\"capitalize\"\n >\n {enumLabel(risk.status)}\n </Badge>\n </div>\n {risk.category && (\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Category</span>\n <span className=\"font-medium\">{risk.category}</span>\n </div>\n )}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Gauge className=\"h-4 w-4 text-primary\" />\n Risk score\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-xl font-bold\">{risk.likelihood}</p>\n <p className=\"text-xs text-muted-foreground\">Likelihood (1-5)</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-xl font-bold\">{risk.impact}</p>\n <p className=\"text-xs text-muted-foreground\">Impact (1-5)</p>\n </div>\n <div\n className={`p-4 rounded-md ${risk.riskScore >= HIGH_SCORE_THRESHOLD ? 'bg-destructive/10' : 'bg-muted'}`}\n >\n <p className=\"text-xl font-bold\">{risk.riskScore}</p>\n <p className=\"text-xs text-muted-foreground\">\n Score{risk.riskScore >= HIGH_SCORE_THRESHOLD ? ' — needs attention' : ''}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n {(risk.mitigationPlan || risk.contingencyPlan) && (\n <Card>\n <CardHeader>\n <CardTitle>Response plan</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase\">Mitigation</p>\n <p className=\"text-sm mt-1\">{risk.mitigationPlan ?? 'Not set.'}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase\">Contingency</p>\n <p className=\"text-sm mt-1\">{risk.contingencyPlan ?? 'Not set.'}</p>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n {risk.project ? (\n <button\n type=\"button\"\n className=\"font-medium text-primary hover:underline\"\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', risk.project?.id))\n }\n >\n {risk.project.name}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">not available</span>\n )}\n </div>\n {risk.ownerId && (\n <div className=\"flex items-center gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Owner:</span>\n <span className=\"font-medium\">\n <PersonName id={risk.ownerId} />\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Due:</span>\n <span className=\"font-medium\">\n {risk.dueDate ? new Date(risk.dueDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n {risk.resolvedAt && (\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Resolved:</span>\n <span className=\"font-medium\">\n {new Date(risk.resolvedAt).toLocaleDateString()}\n </span>\n </div>\n )}\n {risk.tags.length > 0 && (\n <div className=\"flex justify-between items-start\">\n <span className=\"text-muted-foreground\">Tags</span>\n <div className=\"flex gap-1 flex-wrap justify-end\">\n {risk.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(risk.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(risk.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function RisksRiskRegisterPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=RisksRiskRegisterPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RisksRiskRegisterPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/RisksRiskRegisterPagePage.tsx"],"names":[],"mappings":"AAyFA,wBAAgB,yBAAyB,4CAwJxC"}
@@ -0,0 +1,191 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as n } from "../people/People.js";
3
+ import { enumLabel as r } from "../controls/WorkItemControls.js";
4
+ import { detailPath as i, rowLinkProps as a } from "../utils/rowNavigation.js";
5
+ import { RISK_SEVERITIES as o, RISK_STATUSES as s } from "../controls/RiskControls.js";
6
+ import { NewRiskDialog as c } from "../create/CreateDialogs.js";
7
+ import { useState as l } from "react";
8
+ import { Calendar as u, ShieldAlert as d, User as f } from "lucide-react";
9
+ import { useSearchParams as p } from "react-router";
10
+ import { gql as m } from "@apollo/client";
11
+ import { useQuery as h } from "@apollo/client/react";
12
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
13
+ import { Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
14
+ //#region src/planmagnet/pages/RisksRiskRegisterPagePage.tsx
15
+ var S = m`
16
+ query GetRiskRegisterProject($id: ID!) {
17
+ planmagnetProject(id: $id) {
18
+ id
19
+ name
20
+ }
21
+ }
22
+ `, C = m`
23
+ query GetRisks($workspaceId: ID!, $filter: PlanmagnetRiskFilter) {
24
+ planmagnetRisks(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {
25
+ items {
26
+ id
27
+ title
28
+ description
29
+ projectId
30
+ project {
31
+ id
32
+ name
33
+ }
34
+ severity
35
+ status
36
+ likelihood
37
+ impact
38
+ riskScore
39
+ ownerId
40
+ dueDate
41
+ category
42
+ }
43
+ totalCount
44
+ }
45
+ }
46
+ `, w = {
47
+ CRITICAL: "bg-red-100 text-red-800",
48
+ HIGH: "bg-orange-100 text-orange-800",
49
+ MEDIUM: "bg-yellow-100 text-yellow-800",
50
+ LOW: "bg-blue-100 text-blue-800",
51
+ NEGLIGIBLE: "bg-gray-100 text-gray-800"
52
+ }, T = {
53
+ IDENTIFIED: "bg-gray-100 text-gray-800",
54
+ ANALYZING: "bg-blue-100 text-blue-800",
55
+ MITIGATING: "bg-yellow-100 text-yellow-800",
56
+ ACCEPTED: "bg-purple-100 text-purple-800",
57
+ RESOLVED: "bg-green-100 text-green-800",
58
+ CLOSED: "bg-gray-100 text-gray-500"
59
+ }, E = ["all", ...o];
60
+ function D() {
61
+ let { workspaceId: o } = e(), m = t(), [D] = p(), O = D.get("projectId") ?? void 0, [k, A] = l("all"), [j, M] = l("all"), N = {};
62
+ O && (N.projectId = O), k !== "all" && (N.severity = k), j !== "all" && (N.status = j);
63
+ let { data: P, loading: F, error: I } = h(C, {
64
+ variables: {
65
+ workspaceId: o ?? "default",
66
+ filter: N
67
+ },
68
+ skip: !o
69
+ }), { data: L } = h(S, {
70
+ variables: { id: O },
71
+ skip: !O
72
+ });
73
+ if (F && !P) return /* @__PURE__ */ g("div", {
74
+ className: "flex items-center justify-center p-12",
75
+ children: /* @__PURE__ */ g("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
76
+ });
77
+ let R = P?.planmagnetRisks?.items ?? [], z = P?.planmagnetRisks?.totalCount ?? 0, B = L?.planmagnetProject?.name;
78
+ return /* @__PURE__ */ _("div", {
79
+ className: "space-y-6 p-6",
80
+ children: [
81
+ /* @__PURE__ */ _("div", {
82
+ className: "flex items-center justify-between",
83
+ children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("h1", {
84
+ className: "text-2xl font-semibold flex items-center gap-2",
85
+ children: [/* @__PURE__ */ g(d, { className: "h-5 w-5 text-primary" }), "Risk Register"]
86
+ }), /* @__PURE__ */ g("p", {
87
+ className: "text-sm text-muted-foreground",
88
+ children: O ? `${z} risk${z === 1 ? "" : "s"} for ${B ?? "this project"}` : `${z} risk${z === 1 ? "" : "s"} across all projects`
89
+ })] }), /* @__PURE__ */ g(c, {
90
+ projectId: O,
91
+ onCreated: (e) => m(i("/risks/risk-detail-page", e))
92
+ })]
93
+ }),
94
+ /* @__PURE__ */ _("div", {
95
+ className: "flex flex-wrap gap-4",
96
+ children: [/* @__PURE__ */ g("div", {
97
+ className: "flex gap-1",
98
+ children: E.map((e) => /* @__PURE__ */ g("button", {
99
+ onClick: () => A(e),
100
+ className: `px-3 py-1.5 text-sm rounded-md capitalize ${k === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
101
+ children: e === "all" ? "All severities" : r(e)
102
+ }, e))
103
+ }), /* @__PURE__ */ _("select", {
104
+ "aria-label": "Status",
105
+ className: "rounded-md border border-input bg-background px-2 py-1 text-sm",
106
+ value: j,
107
+ onChange: (e) => M(e.target.value),
108
+ children: [/* @__PURE__ */ g("option", {
109
+ value: "all",
110
+ children: "All statuses"
111
+ }), s.map((e) => /* @__PURE__ */ g("option", {
112
+ value: e,
113
+ children: r(e)
114
+ }, e))]
115
+ })]
116
+ }),
117
+ I && /* @__PURE__ */ _("div", {
118
+ role: "alert",
119
+ className: "rounded-md border border-destructive/40 p-4 text-sm text-destructive",
120
+ children: ["Risks could not be loaded: ", I.message]
121
+ }),
122
+ /* @__PURE__ */ g("div", {
123
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
124
+ children: R.map((e) => /* @__PURE__ */ _(v, {
125
+ ...a(() => m(i("/risks/risk-detail-page", e.id)), e.title),
126
+ children: [/* @__PURE__ */ g(b, {
127
+ className: "pb-2",
128
+ children: /* @__PURE__ */ _("div", {
129
+ className: "flex items-center justify-between gap-2",
130
+ children: [/* @__PURE__ */ g(x, {
131
+ className: "text-base",
132
+ children: e.title
133
+ }), /* @__PURE__ */ g("span", {
134
+ className: `text-xs px-2 py-0.5 rounded-full shrink-0 ${w[e.severity] ?? "bg-gray-100"}`,
135
+ children: r(e.severity)
136
+ })]
137
+ })
138
+ }), /* @__PURE__ */ _(y, {
139
+ className: "space-y-3",
140
+ children: [
141
+ /* @__PURE__ */ g("p", {
142
+ className: "text-sm text-muted-foreground line-clamp-2",
143
+ children: e.description ?? "No description"
144
+ }),
145
+ /* @__PURE__ */ _("div", {
146
+ className: "flex items-center justify-between text-xs",
147
+ children: [/* @__PURE__ */ g("span", {
148
+ className: `px-2 py-0.5 rounded-full capitalize ${T[e.status] ?? "bg-gray-100"}`,
149
+ children: r(e.status)
150
+ }), /* @__PURE__ */ _("span", {
151
+ className: "text-muted-foreground",
152
+ children: [
153
+ "Score ",
154
+ e.riskScore,
155
+ " (",
156
+ e.likelihood,
157
+ "×",
158
+ e.impact,
159
+ ")"
160
+ ]
161
+ })]
162
+ }),
163
+ /* @__PURE__ */ _("div", {
164
+ className: "flex gap-3 text-xs text-muted-foreground",
165
+ children: [e.dueDate && /* @__PURE__ */ _("span", {
166
+ className: "flex items-center gap-1",
167
+ children: [/* @__PURE__ */ g(u, { className: "h-3 w-3" }), new Date(e.dueDate).toLocaleDateString()]
168
+ }), e.ownerId && /* @__PURE__ */ _("span", {
169
+ className: "flex items-center gap-1",
170
+ children: [/* @__PURE__ */ g(f, { className: "h-3 w-3" }), /* @__PURE__ */ g(n, { id: e.ownerId })]
171
+ })]
172
+ }),
173
+ !O && /* @__PURE__ */ _("div", {
174
+ className: "text-xs text-muted-foreground",
175
+ children: ["Project: ", e.project?.name ?? "not available"]
176
+ })
177
+ ]
178
+ })]
179
+ }, e.id))
180
+ }),
181
+ !I && R.length === 0 && /* @__PURE__ */ g("p", {
182
+ className: "text-center text-muted-foreground py-8",
183
+ children: "No risks found."
184
+ })
185
+ ]
186
+ });
187
+ }
188
+ //#endregion
189
+ export { D as RisksRiskRegisterPagePage };
190
+
191
+ //# sourceMappingURL=RisksRiskRegisterPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RisksRiskRegisterPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/RisksRiskRegisterPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useSearchParams } from 'react-router';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ShieldAlert, Calendar, User } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\nimport { NewRiskDialog } from '../create/CreateDialogs';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { RISK_STATUSES, RISK_SEVERITIES } from '../controls/RiskControls';\n\n/**\n * Risk register (BOFF-8047). The register was `api-only` — planmagnetRisks/planmagnetCreateRisk/\n * planmagnetRiskMatrix are served and prod-verified, but no page read or wrote them. Entry points: the sidebar\n * (Projects > Risk Register), and a per-project link from the project detail page's Risks card.\n */\n\nconst GET_RISK_REGISTER_PROJECT = gql`\n query GetRiskRegisterProject($id: ID!) {\n planmagnetProject(id: $id) {\n id\n name\n }\n }\n`;\n\nconst GET_RISKS = gql`\n query GetRisks($workspaceId: ID!, $filter: PlanmagnetRiskFilter) {\n planmagnetRisks(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {\n items {\n id\n title\n description\n projectId\n project {\n id\n name\n }\n severity\n status\n likelihood\n impact\n riskScore\n ownerId\n dueDate\n category\n }\n totalCount\n }\n }\n`;\n\nconst severityColor: Record<string, string> = {\n CRITICAL: 'bg-red-100 text-red-800',\n HIGH: 'bg-orange-100 text-orange-800',\n MEDIUM: 'bg-yellow-100 text-yellow-800',\n LOW: 'bg-blue-100 text-blue-800',\n NEGLIGIBLE: 'bg-gray-100 text-gray-800',\n};\n\nconst statusColor: Record<string, string> = {\n IDENTIFIED: 'bg-gray-100 text-gray-800',\n ANALYZING: 'bg-blue-100 text-blue-800',\n MITIGATING: 'bg-yellow-100 text-yellow-800',\n ACCEPTED: 'bg-purple-100 text-purple-800',\n RESOLVED: 'bg-green-100 text-green-800',\n CLOSED: 'bg-gray-100 text-gray-500',\n};\n\nconst severityFilters = ['all', ...RISK_SEVERITIES] as const;\n\ninterface RiskRow {\n id: string;\n title: string;\n description: string | null;\n projectId: string;\n project: { id: string; name: string } | null;\n severity: string;\n status: string;\n likelihood: number;\n impact: number;\n riskScore: number;\n ownerId: string | null;\n dueDate: string | null;\n category: string | null;\n}\n\nexport function RisksRiskRegisterPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [params] = useSearchParams();\n const projectId = params.get('projectId') ?? undefined;\n const [severity, setSeverity] = useState<string>('all');\n const [status, setStatus] = useState<string>('all');\n\n const filter: Record<string, unknown> = {};\n if (projectId) filter.projectId = projectId;\n if (severity !== 'all') filter.severity = severity;\n if (status !== 'all') filter.status = status;\n\n const { data, loading, error } = useQuery<{\n planmagnetRisks: { items: RiskRow[]; totalCount: number };\n }>(GET_RISKS, {\n variables: { workspaceId: workspaceId ?? 'default', filter },\n skip: !workspaceId,\n });\n const { data: projectData } = useQuery<{\n planmagnetProject: { id: string; name: string } | null;\n }>(GET_RISK_REGISTER_PROJECT, { variables: { id: projectId }, skip: !projectId });\n\n // Only before the first load: a refetch after a create must not blank the page.\n if (loading && !data)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n\n const risks = data?.planmagnetRisks?.items ?? [];\n const totalCount = data?.planmagnetRisks?.totalCount ?? 0;\n const projectName = projectData?.planmagnetProject?.name;\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 flex items-center gap-2\">\n <ShieldAlert className=\"h-5 w-5 text-primary\" />\n Risk Register\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {projectId\n ? `${totalCount} risk${totalCount === 1 ? '' : 's'} for ${projectName ?? 'this project'}`\n : `${totalCount} risk${totalCount === 1 ? '' : 's'} across all projects`}\n </p>\n </div>\n <NewRiskDialog\n projectId={projectId}\n onCreated={(id) => navigate(detailPath('/risks/risk-detail-page', id))}\n />\n </div>\n\n <div className=\"flex flex-wrap gap-4\">\n <div className=\"flex gap-1\">\n {severityFilters.map((s) => (\n <button\n key={s}\n onClick={() => setSeverity(s)}\n className={`px-3 py-1.5 text-sm rounded-md capitalize ${severity === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'all' ? 'All severities' : enumLabel(s)}\n </button>\n ))}\n </div>\n <select\n aria-label=\"Status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm\"\n value={status}\n onChange={(e) => setStatus(e.target.value)}\n >\n <option value=\"all\">All statuses</option>\n {RISK_STATUSES.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n </div>\n\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-md border border-destructive/40 p-4 text-sm text-destructive\"\n >\n Risks could not be loaded: {error.message}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {risks.map((risk) => (\n <Card\n key={risk.id}\n {...rowLinkProps(\n () => navigate(detailPath('/risks/risk-detail-page', risk.id)),\n risk.title\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <CardTitle className=\"text-base\">{risk.title}</CardTitle>\n <span\n className={`text-xs px-2 py-0.5 rounded-full shrink-0 ${severityColor[risk.severity] ?? 'bg-gray-100'}`}\n >\n {enumLabel(risk.severity)}\n </span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {risk.description ?? 'No description'}\n </p>\n <div className=\"flex items-center justify-between text-xs\">\n <span\n className={`px-2 py-0.5 rounded-full capitalize ${statusColor[risk.status] ?? 'bg-gray-100'}`}\n >\n {enumLabel(risk.status)}\n </span>\n <span className=\"text-muted-foreground\">\n Score {risk.riskScore} ({risk.likelihood}×{risk.impact})\n </span>\n </div>\n <div className=\"flex gap-3 text-xs text-muted-foreground\">\n {risk.dueDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {new Date(risk.dueDate).toLocaleDateString()}\n </span>\n )}\n {risk.ownerId && (\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" />\n <PersonName id={risk.ownerId} />\n </span>\n )}\n </div>\n {!projectId && (\n <div className=\"text-xs text-muted-foreground\">\n Project: {risk.project?.name ?? 'not available'}\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n {!error && risks.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">No risks found.</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as n } from "../utils/mutationResult.js";
3
- import { parseIntField as r } from "../utils/formValidation.js";
4
- import { AssigneeSelect as i, WORK_ITEM_PRIORITIES as a } from "../controls/WorkItemControls.js";
3
+ import { AssigneeSelect as r, WORK_ITEM_PRIORITIES as i } from "../controls/WorkItemControls.js";
4
+ import { parseIntField as a } from "../utils/formValidation.js";
5
5
  import { useState as o } from "react";
6
6
  import { CheckSquare as s, Save as c, X as l } from "lucide-react";
7
7
  import { gql as u } from "@apollo/client";
@@ -75,7 +75,7 @@ function T() {
75
75
  projectId: M
76
76
  },
77
77
  skip: !u || !M
78
- }), F = (N?.planmagnetSprints?.items ?? []).filter((e) => w.has(e.status)), I = t(), [L, { loading: R }] = d(x, { refetchQueries: ["GetWorkItems"] }), [z, B] = o(null), V = r(T.storyPoints, { min: 0 });
78
+ }), F = (N?.planmagnetSprints?.items ?? []).filter((e) => w.has(e.status)), I = t(), [L, { loading: R }] = d(x, { refetchQueries: ["GetWorkItems"] }), [z, B] = o(null), V = a(T.storyPoints, { min: 0 });
79
79
  return /* @__PURE__ */ m("div", {
80
80
  className: "space-y-6 p-6 max-w-4xl",
81
81
  children: [
@@ -216,7 +216,7 @@ function T() {
216
216
  ...T,
217
217
  priority: e.target.value
218
218
  }),
219
- children: a.map((e) => /* @__PURE__ */ p("option", {
219
+ children: i.map((e) => /* @__PURE__ */ p("option", {
220
220
  value: e,
221
221
  children: e.toLowerCase()
222
222
  }, e))
@@ -317,7 +317,7 @@ function T() {
317
317
  children: "Assignee"
318
318
  }), /* @__PURE__ */ p("div", {
319
319
  className: "mt-1",
320
- children: /* @__PURE__ */ p(i, {
320
+ children: /* @__PURE__ */ p(r, {
321
321
  id: "task-assignee",
322
322
  value: T.assigneeId,
323
323
  onChange: (e) => E({
@@ -1,7 +1,7 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as n } from "../utils/mutationResult.js";
3
- import { parseIntField as r } from "../utils/formValidation.js";
4
- import { WORK_ITEM_PRIORITIES as i } from "../controls/WorkItemControls.js";
3
+ import { WORK_ITEM_PRIORITIES as r } from "../controls/WorkItemControls.js";
4
+ import { parseIntField as i } from "../utils/formValidation.js";
5
5
  import { useMemo as a, useState as o } from "react";
6
6
  import { ArrowLeft as s, Save as c } from "lucide-react";
7
7
  import { gql as l } from "@apollo/client";
@@ -66,7 +66,7 @@ function S() {
66
66
  }), [N]), [F, I] = o({}), L = {
67
67
  ...P,
68
68
  ...F
69
- }, R = (e) => I(e), z = r(L.storyPoints, { min: 0 }), B = async () => {
69
+ }, R = (e) => I(e), z = i(L.storyPoints, { min: 0 }), B = async () => {
70
70
  if (!l || !S || z.invalid) return;
71
71
  if (!L.title.trim()) {
72
72
  A("A task needs a title.");
@@ -190,7 +190,7 @@ function S() {
190
190
  ...L,
191
191
  priority: e.target.value
192
192
  }),
193
- children: i.map((e) => /* @__PURE__ */ f("option", {
193
+ children: r.map((e) => /* @__PURE__ */ f("option", {
194
194
  value: e,
195
195
  children: e.toLowerCase()
196
196
  }, e))
@@ -1,7 +1,7 @@
1
1
  import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
2
  import { throwOnError as t } from "../utils/mutationResult.js";
3
- import { ProjectSelect as n } from "../controls/Pickers.js";
4
- import { ErrorLine as r } from "../controls/ConfirmButton.js";
3
+ import { ErrorLine as n } from "../controls/ConfirmButton.js";
4
+ import { ProjectSelect as r } from "../controls/Pickers.js";
5
5
  import { IMPORT_FIELDS as i, exportColumns as a, formatOf as o } from "../import/exportColumns.js";
6
6
  import { useState as s } from "react";
7
7
  import { ArrowLeft as c, ExternalLink as l, FileUp as u, Loader2 as d } from "lucide-react";
@@ -101,7 +101,7 @@ function T() {
101
101
  children: "Import into project"
102
102
  }), /* @__PURE__ */ m("div", {
103
103
  className: "mt-1",
104
- children: /* @__PURE__ */ m(n, {
104
+ children: /* @__PURE__ */ m(r, {
105
105
  id: "import-project",
106
106
  value: T,
107
107
  noneLabel: "Choose a project",
@@ -135,7 +135,7 @@ function T() {
135
135
  k.length === 1 ? "" : "s"
136
136
  ]
137
137
  }),
138
- N && /* @__PURE__ */ m(r, { message: N })
138
+ N && /* @__PURE__ */ m(n, { message: N })
139
139
  ] })]
140
140
  })] }),
141
141
  D && /* @__PURE__ */ h(_, { children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ m(b, { children: "2. Columns" }) }), /* @__PURE__ */ h(v, {
@@ -198,7 +198,7 @@ function T() {
198
198
  })
199
199
  ]
200
200
  }),
201
- F && /* @__PURE__ */ m(r, { message: F }),
201
+ F && /* @__PURE__ */ m(n, { message: F }),
202
202
  (L || z) && /* @__PURE__ */ h(_, {
203
203
  "data-testid": "import-report",
204
204
  children: [/* @__PURE__ */ m(y, { children: /* @__PURE__ */ m(b, { children: z ? "Imported" : "Preview — nothing has been written" }) }), /* @__PURE__ */ h(v, {
@@ -1 +1 @@
1
- {"version":3,"file":"TasksTaskDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"names":[],"mappings":"AAgVA,wBAAgB,uBAAuB,4CAqItC"}
1
+ {"version":3,"file":"TasksTaskDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"names":[],"mappings":"AAyVA,wBAAgB,uBAAuB,4CAqJtC"}