From 1867c79aadd751cddb5916a24a4b9e99de20af64 Mon Sep 17 00:00:00 2001 From: gearnode Date: Fri, 28 Mar 2025 14:19:36 +0100 Subject: [PATCH] Add mitigation views Signed-off-by: gearnode --- apps/console/src/components/NavMain.tsx | 6 +- apps/console/src/components/ui/table.tsx | 114 ++++ .../src/pages/organizations/Routes.tsx | 21 +- .../mitigations/CreateMitigationPage.tsx | 33 -- .../mitigations/CreateMitigationView.tsx | 266 --------- .../mitigations/UpdateMitigationPage.tsx | 33 -- .../mitigations/UpdateMitigationView.tsx | 353 ------------ ...ionViewCreateMitigationMutation.graphql.ts | 196 ------- .../UpdateMitigationViewQuery.graphql.ts | 176 ------ ...ionViewUpdateMitigationMutation.graphql.ts | 152 ------ .../mitigations/MitigationListPage.tsx | 46 ++ .../mitigations/MitigationListView.tsx | 514 ++++++++++++++++++ .../mitigations/MitigationPage.tsx | 2 +- .../mitigations/MitigationView.tsx | 20 +- .../MitigationListViewQuery.graphql.ts | 242 +++++++++ ...itigationViewAssignTaskMutation.graphql.ts | 0 ...itigationViewCreateTaskMutation.graphql.ts | 0 ...ationViewDeleteEvidenceMutation.graphql.ts | 0 ...itigationViewDeleteTaskMutation.graphql.ts | 0 ...tionViewGetEvidenceFileUrlQuery.graphql.ts | 0 ...MitigationViewOrganizationQuery.graphql.ts | 0 .../MitigationViewQuery.graphql.ts | 0 ...igationViewUnassignTaskMutation.graphql.ts | 0 ...ewUpdateMitigationStateMutation.graphql.ts | 0 ...tionViewUpdateTaskStateMutation.graphql.ts | 0 ...ationViewUploadEvidenceMutation.graphql.ts | 0 pkg/coredata/mitigation.go | 70 +-- pkg/coredata/task.go | 154 +----- pkg/probo/mitigation_service.go | 57 +- pkg/probo/task_service.go | 84 ++- pkg/server/api/console/v1/schema.graphql | 5 +- pkg/server/api/console/v1/schema/schema.go | 18 +- pkg/server/api/console/v1/v1_resolver.go | 28 +- 33 files changed, 1083 insertions(+), 1507 deletions(-) create mode 100644 apps/console/src/components/ui/table.tsx delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationPage.tsx delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationView.tsx delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/UpdateMitigationPage.tsx delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/UpdateMitigationView.tsx delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/__generated__/CreateMitigationViewCreateMitigationMutation.graphql.ts delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/__generated__/UpdateMitigationViewQuery.graphql.ts delete mode 100644 apps/console/src/pages/organizations/frameworks/mitigations/__generated__/UpdateMitigationViewUpdateMitigationMutation.graphql.ts create mode 100644 apps/console/src/pages/organizations/mitigations/MitigationListPage.tsx create mode 100644 apps/console/src/pages/organizations/mitigations/MitigationListView.tsx rename apps/console/src/pages/organizations/{frameworks => }/mitigations/MitigationPage.tsx (95%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/MitigationView.tsx (98%) create mode 100644 apps/console/src/pages/organizations/mitigations/__generated__/MitigationListViewQuery.graphql.ts rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewAssignTaskMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewCreateTaskMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewDeleteEvidenceMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewDeleteTaskMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewGetEvidenceFileUrlQuery.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewOrganizationQuery.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewQuery.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewUnassignTaskMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewUpdateMitigationStateMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewUpdateTaskStateMutation.graphql.ts (100%) rename apps/console/src/pages/organizations/{frameworks => }/mitigations/__generated__/MitigationViewUploadEvidenceMutation.graphql.ts (100%) diff --git a/apps/console/src/components/NavMain.tsx b/apps/console/src/components/NavMain.tsx index 74b37394f..0390f0cd4 100644 --- a/apps/console/src/components/NavMain.tsx +++ b/apps/console/src/components/NavMain.tsx @@ -145,9 +145,11 @@ function getNavItems(organizationId?: string): NavItem[] { : undefined, }, { - title: "Risk", + title: "Risks", icon: Shield, - url: organizationId ? `/organizations/${organizationId}/risk` : undefined, + url: organizationId + ? `/organizations/${organizationId}/risks` + : undefined, }, { title: "Frameworks", diff --git a/apps/console/src/components/ui/table.tsx b/apps/console/src/components/ui/table.tsx new file mode 100644 index 000000000..1031493c9 --- /dev/null +++ b/apps/console/src/components/ui/table.tsx @@ -0,0 +1,114 @@ +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)); +Table.displayName = "Table"; + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableHeader.displayName = "TableHeader"; + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableBody.displayName = "TableBody"; + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableFooter.displayName = "TableFooter"; + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableRow.displayName = "TableRow"; + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableHead.displayName = "TableHead"; + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableCell.displayName = "TableCell"; + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableCaption.displayName = "TableCaption"; + +export { + Table, + TableHeader, + TableBody, + TableFooter, + TableHead, + TableRow, + TableCell, + TableCaption, +}; diff --git a/apps/console/src/pages/organizations/Routes.tsx b/apps/console/src/pages/organizations/Routes.tsx index 2dae27cfa..7f43c0185 100644 --- a/apps/console/src/pages/organizations/Routes.tsx +++ b/apps/console/src/pages/organizations/Routes.tsx @@ -9,9 +9,7 @@ import { CreatePeoplePage } from "./people/CreatePeoplePage"; import { PeoplePage } from "./people/PeoplePage"; import { CreateFrameworkPage } from "./frameworks/CreateFrameworkPage"; import { UpdateFrameworkPage } from "./frameworks/UpdateFrameworkPage"; -import { CreateMitigationPage } from "./frameworks/mitigations/CreateMitigationPage"; -import { MitigationPage } from "./frameworks/mitigations/MitigationPage"; -import { UpdateMitigationPage } from "./frameworks/mitigations/UpdateMitigationPage"; +import { MitigationPage } from "./mitigations/MitigationPage"; import { VendorPage } from "./vendors/VendorPage"; import { PolicyListPage } from "./policies/PolicyListPage"; import { CreatePolicyPage } from "./policies/CreatePolicyPage"; @@ -19,6 +17,8 @@ import { PolicyPage } from "./policies/PolicyPage"; import { UpdatePolicyPage } from "./policies/UpdatePolicyPage"; import { SettingsPage } from "./SettingsPage"; import { CreateOrganizationPage } from "./CreateOrganizationPage"; +import { MitigationListPage } from "./mitigations/MitigationListPage"; + import HomePage from "./HomePage"; import NotFoundPage from "../NotFoundPage"; @@ -38,18 +38,13 @@ export function OrganizationsRoutes() { path="frameworks/:frameworkId/update" element={} /> + } /> + } /> + {/* } /> } - /> - } - /> - } - /> + /> */} } /> } /> } /> diff --git a/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationPage.tsx b/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationPage.tsx deleted file mode 100644 index 39f05dd52..000000000 --- a/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationPage.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { PageTemplateSkeleton } from "@/components/PageTemplate"; -import { ErrorBoundaryWithLocation } from "../../ErrorBoundary"; -import { Suspense } from "react"; -import { useLocation } from "react-router"; -import { lazy } from "@probo/react-lazy"; - -const CreateMitigationView = lazy(() => import("./CreateMitigationView")); - -export function CreateMitigationViewSkeleton() { - return ( - -
- - ); -} - -export function CreateMitigationPage() { - const location = useLocation(); - - return ( - } - > - - - - - ); -} diff --git a/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationView.tsx b/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationView.tsx deleted file mode 100644 index 43bc841e2..000000000 --- a/apps/console/src/pages/organizations/frameworks/mitigations/CreateMitigationView.tsx +++ /dev/null @@ -1,266 +0,0 @@ -import { Suspense, useState } from "react"; -import { useNavigate, useParams } from "react-router"; -import { graphql, useMutation, ConnectionHandler } from "react-relay"; -import { Button } from "@/components/ui/button"; -import { Card } from "@/components/ui/card"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { Textarea } from "@/components/ui/textarea"; -import { useToast } from "@/hooks/use-toast"; -import { HelpCircle } from "lucide-react"; -import { cn } from "@/lib/utils"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { - CreateMitigationViewCreateMitigationMutation, - MitigationImportance, -} from "./__generated__/CreateMitigationViewCreateMitigationMutation.graphql"; -import { PageTemplate } from "@/components/PageTemplate"; -import { CreateMitigationViewSkeleton } from "./CreateMitigationPage"; - -const createMitigationMutation = graphql` - mutation CreateMitigationViewCreateMitigationMutation( - $input: CreateMitigationInput! - $connections: [ID!]! - ) { - createMitigation(input: $input) { - mitigationEdge @prependEdge(connections: $connections) { - node { - id - name - description - category - state - } - } - } - } -`; - -function EditableField({ - label, - value, - onChange, - type = "text", - helpText, - required, - multiline = false, -}: { - label: string; - value: string; - onChange: (value: string) => void; - type?: string; - helpText?: string; - required?: boolean; - multiline?: boolean; -}) { - return ( -
-
- - {helpText && ( -
- - {helpText} -
- )} -
- {multiline ? ( -