@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.
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +126 -84
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +192 -64
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts +5 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +1 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js +107 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +1 -0
- package/dist/planmagnet/automation/AutomationRuleFields.d.ts +29 -0
- package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +1 -0
- package/dist/planmagnet/automation/AutomationRuleFields.js +308 -0
- package/dist/planmagnet/automation/AutomationRuleFields.js.map +1 -0
- package/dist/planmagnet/automation/automationRuleTypes.d.ts +60 -0
- package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -0
- package/dist/planmagnet/automation/automationRuleTypes.js +113 -0
- package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -0
- package/dist/planmagnet/board/BulkActions.d.ts +11 -0
- package/dist/planmagnet/board/BulkActions.d.ts.map +1 -0
- package/dist/planmagnet/board/BulkActions.js +182 -0
- package/dist/planmagnet/board/BulkActions.js.map +1 -0
- package/dist/planmagnet/board/ProjectBoard.d.ts.map +1 -1
- package/dist/planmagnet/board/ProjectBoard.js +289 -254
- package/dist/planmagnet/board/ProjectBoard.js.map +1 -1
- package/dist/planmagnet/budgets/BudgetControls.d.ts +30 -0
- package/dist/planmagnet/budgets/BudgetControls.d.ts.map +1 -0
- package/dist/planmagnet/budgets/BudgetControls.js +470 -0
- package/dist/planmagnet/budgets/BudgetControls.js.map +1 -0
- package/dist/planmagnet/budgets/ExpenseControls.d.ts +27 -0
- package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +1 -0
- package/dist/planmagnet/budgets/ExpenseControls.js +366 -0
- package/dist/planmagnet/budgets/ExpenseControls.js.map +1 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts +5 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +1 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +112 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +1 -0
- package/dist/planmagnet/budgets/budgetMath.d.ts +26 -0
- package/dist/planmagnet/budgets/budgetMath.d.ts.map +1 -0
- package/dist/planmagnet/budgets/budgetMath.js +49 -0
- package/dist/planmagnet/budgets/budgetMath.js.map +1 -0
- package/dist/planmagnet/controls/AutomationRuleControls.d.ts +23 -0
- package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/AutomationRuleControls.js +172 -0
- package/dist/planmagnet/controls/AutomationRuleControls.js.map +1 -0
- package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
- package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/CompetitorControls.js +172 -0
- package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
- package/dist/planmagnet/controls/CustomFieldControls.d.ts +42 -0
- package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/CustomFieldControls.js +84 -0
- package/dist/planmagnet/controls/CustomFieldControls.js.map +1 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts +8 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +1 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js +315 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +1 -0
- package/dist/planmagnet/controls/FeatureControls.js +53 -53
- package/dist/planmagnet/controls/FeatureTriage.js +11 -11
- package/dist/planmagnet/controls/ObjectiveControls.js +37 -37
- package/dist/planmagnet/controls/Pickers.d.ts +17 -2
- package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
- package/dist/planmagnet/controls/Pickers.js +100 -9
- package/dist/planmagnet/controls/Pickers.js.map +1 -1
- package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
- package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/PortfolioControls.js +114 -0
- package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
- package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
- package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/ProgramControls.js +187 -0
- package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
- package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/ProjectControls.js +54 -47
- package/dist/planmagnet/controls/ProjectControls.js.map +1 -1
- package/dist/planmagnet/controls/ReleaseControls.js +7 -7
- package/dist/planmagnet/controls/RiskControls.d.ts +27 -0
- package/dist/planmagnet/controls/RiskControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/RiskControls.js +346 -0
- package/dist/planmagnet/controls/RiskControls.js.map +1 -0
- package/dist/planmagnet/controls/TemplateControls.d.ts +15 -0
- package/dist/planmagnet/controls/TemplateControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/TemplateControls.js +55 -0
- package/dist/planmagnet/controls/TemplateControls.js.map +1 -0
- package/dist/planmagnet/controls/WorkItemControls.js +1 -1
- package/dist/planmagnet/create/CreateDialogs.d.ts +20 -0
- package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
- package/dist/planmagnet/create/CreateDialogs.js +455 -116
- package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
- package/dist/planmagnet/dependency/DependencyPanel.d.ts +6 -0
- package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +1 -0
- package/dist/planmagnet/dependency/DependencyPanel.js +310 -0
- package/dist/planmagnet/dependency/DependencyPanel.js.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +171 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +232 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +93 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +315 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +186 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +164 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +348 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +4 -4
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +4 -4
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +6 -6
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +325 -189
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +81 -72
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +278 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +191 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +5 -5
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +4 -4
- package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +161 -137
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +124 -113
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +263 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +254 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +165 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +316 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +1 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +208 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +0 -5
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +47 -89
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js +24 -24
- package/dist/planmagnet/time/TaskTimePanel.d.ts +7 -0
- package/dist/planmagnet/time/TaskTimePanel.d.ts.map +1 -0
- package/dist/planmagnet/time/TaskTimePanel.js +104 -0
- package/dist/planmagnet/time/TaskTimePanel.js.map +1 -0
- package/dist/planmagnet/time/TimeEntryControls.d.ts +37 -0
- package/dist/planmagnet/time/TimeEntryControls.d.ts.map +1 -0
- package/dist/planmagnet/time/TimeEntryControls.js +338 -0
- package/dist/planmagnet/time/TimeEntryControls.js.map +1 -0
- package/dist/planmagnet/time/TimesheetControls.d.ts +18 -0
- package/dist/planmagnet/time/TimesheetControls.d.ts.map +1 -0
- package/dist/planmagnet/time/TimesheetControls.js +244 -0
- package/dist/planmagnet/time/TimesheetControls.js.map +1 -0
- package/dist/planmagnet/time/timeShared.d.ts +29 -0
- package/dist/planmagnet/time/timeShared.d.ts.map +1 -0
- package/dist/planmagnet/time/timeShared.js +34 -0
- package/dist/planmagnet/time/timeShared.js.map +1 -0
- package/dist/planmagnet/utils/rowNavigation.js +5 -2
- package/dist/planmagnet/utils/rowNavigation.js.map +1 -1
- 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 @@
|
|
|
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 {
|
|
4
|
-
import {
|
|
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 =
|
|
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:
|
|
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(
|
|
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 {
|
|
4
|
-
import {
|
|
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 =
|
|
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:
|
|
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 {
|
|
4
|
-
import {
|
|
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(
|
|
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(
|
|
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(
|
|
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":"
|
|
1
|
+
{"version":3,"file":"TasksTaskDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"names":[],"mappings":"AAyVA,wBAAgB,uBAAuB,4CAqJtC"}
|