Add create control and framework

Signed-off-by: gearnode <bryan@frimin.fr>
This commit is contained in:
gearnode
2025-02-27 14:22:08 +01:00
parent 63b596464a
commit c54febadb8
21 changed files with 2141 additions and 290 deletions

View File

@@ -16,13 +16,13 @@ import {
SidebarTrigger,
} from "@/components/ui/sidebar";
import { Toaster } from "@/components/ui/toaster";
import { graphql } from "react-relay";
import { useLazyLoadQuery } from "react-relay";
import { graphql, useLazyLoadQuery } from "react-relay";
import { ConsoleLayoutBreadcrumbFrameworkOverviewQuery } from "./__generated__/ConsoleLayoutBreadcrumbFrameworkOverviewQuery.graphql";
import { ConsoleLayoutBreadcrumbPeopleOverviewQuery } from "./__generated__/ConsoleLayoutBreadcrumbPeopleOverviewQuery.graphql";
import { ConsoleLayoutBreadcrumbVendorOverviewQuery } from "./__generated__/ConsoleLayoutBreadcrumbVendorOverviewQuery.graphql";
import { ConsoleLayoutBreadcrumbControlOverviewQuery } from "./__generated__/ConsoleLayoutBreadcrumbControlOverviewQuery.graphql";
import { ConsoleLayoutOrganizationQuery } from "./__generated__/ConsoleLayoutOrganizationQuery.graphql";
import { ConsoleLayoutBreadcrumbCreateControlQuery } from "./__generated__/ConsoleLayoutBreadcrumbCreateControlQuery.graphql";
function BreadcrumbHome({ children }: { children: React.ReactNode }) {
const { organizationId } = useParams();
@@ -57,7 +57,7 @@ function BreadcrumbHome({ children }: { children: React.ReactNode }) {
}
`,
{ organizationId: organizationId! },
{ fetchPolicy: "store-or-network" },
{ fetchPolicy: "store-or-network" }
);
return (
@@ -93,6 +93,17 @@ function BreadcrumbFrameworkList() {
);
}
function BreadcrumbCreateFramework() {
return (
<>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Create</BreadcrumbPage>
</BreadcrumbItem>
</>
);
}
function BreadcrumbFrameworkOverview() {
const { organizationId, frameworkId } = useParams();
const data = useLazyLoadQuery<ConsoleLayoutBreadcrumbFrameworkOverviewQuery>(
@@ -106,8 +117,7 @@ function BreadcrumbFrameworkOverview() {
}
}
`,
{ frameworkId: frameworkId! },
{ fetchPolicy: "store-or-network" },
{ frameworkId: frameworkId! }
);
return (
@@ -116,9 +126,9 @@ function BreadcrumbFrameworkOverview() {
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link
to={`/organizations/${organizationId}/frameworks/${data.framework.id}`}
to={`/organizations/${organizationId}/frameworks/${frameworkId}`}
>
{data.framework.name}
{data.framework?.name}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
@@ -156,7 +166,7 @@ function BreadcrumbVendorOverview() {
}
`,
{ vendorId: vendorId! },
{ fetchPolicy: "store-or-network" },
{ fetchPolicy: "store-or-network" }
);
return (
@@ -216,7 +226,7 @@ function BreadcrumbPeopleOverview() {
}
`,
{ peopleId: peopleId! },
{ fetchPolicy: "store-or-network" },
{ fetchPolicy: "store-or-network" }
);
return (
@@ -258,8 +268,7 @@ function BreadcrumbControlOverview() {
}
}
`,
{ frameworkId: frameworkId!, controlId: controlId! },
{ fetchPolicy: "store-or-network" },
{ frameworkId: frameworkId!, controlId: controlId! }
);
return (
@@ -268,9 +277,9 @@ function BreadcrumbControlOverview() {
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link
to={`/organizations/${organizationId}/frameworks/${data.framework.id}`}
to={`/organizations/${organizationId}/frameworks/${frameworkId}`}
>
{data.framework.name}
{data.framework?.name}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
@@ -278,13 +287,48 @@ function BreadcrumbControlOverview() {
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link
to={`/organizations/${organizationId}/frameworks/${data.framework.id}/controls/${data.control.id}`}
to={`/organizations/${organizationId}/frameworks/${frameworkId}/controls/${controlId}`}
>
{data.control.name}
{data.control?.name}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
<Outlet />
</>
);
}
function BreadcrumbCreateControl() {
const { organizationId, frameworkId } = useParams();
const data = useLazyLoadQuery<ConsoleLayoutBreadcrumbCreateControlQuery>(
graphql`
query ConsoleLayoutBreadcrumbCreateControlQuery($frameworkId: ID!) {
framework: node(id: $frameworkId) {
id
... on Framework {
name
}
}
}
`,
{ frameworkId: frameworkId! }
);
return (
<>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink asChild>
<Link
to={`/organizations/${organizationId}/frameworks/${frameworkId}`}
>
{data.framework?.name}
</Link>
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Create Control</BreadcrumbPage>
</BreadcrumbItem>
</>
);
}
@@ -311,10 +355,19 @@ export default function ConsoleLayout() {
<Route
path=":frameworkId"
element={<BreadcrumbFrameworkOverview />}
/>
>
<Route
path="controls/create"
element={<BreadcrumbCreateControl />}
/>
<Route
path="controls/:controlId"
element={<BreadcrumbControlOverview />}
/>
</Route>
<Route
path=":frameworkId/controls/:controlId"
element={<BreadcrumbControlOverview />}
path="create"
element={<BreadcrumbCreateFramework />}
/>
</Route>
<Route path="peoples" element={<BreadcrumbPeopleList />}>

View File

@@ -0,0 +1,127 @@
/**
* @generated SignedSource<<72acdb0b83faf29c9d1a4f403a40ac5e>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type ConsoleLayoutBreadcrumbCreateControlQuery$variables = {
frameworkId: string;
};
export type ConsoleLayoutBreadcrumbCreateControlQuery$data = {
readonly framework: {
readonly id: string;
readonly name?: string;
};
};
export type ConsoleLayoutBreadcrumbCreateControlQuery = {
response: ConsoleLayoutBreadcrumbCreateControlQuery$data;
variables: ConsoleLayoutBreadcrumbCreateControlQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "frameworkId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "frameworkId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
}
],
"type": "Framework",
"abstractKey": null
};
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "ConsoleLayoutBreadcrumbCreateControlQuery",
"selections": [
{
"alias": "framework",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "ConsoleLayoutBreadcrumbCreateControlQuery",
"selections": [
{
"alias": "framework",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
(v2/*: any*/),
(v3/*: any*/)
],
"storageKey": null
}
]
},
"params": {
"cacheID": "96453f593f21e812afc5b888cc68da3e",
"id": null,
"metadata": {},
"name": "ConsoleLayoutBreadcrumbCreateControlQuery",
"operationKind": "query",
"text": "query ConsoleLayoutBreadcrumbCreateControlQuery(\n $frameworkId: ID!\n) {\n framework: node(id: $frameworkId) {\n __typename\n id\n ... on Framework {\n name\n }\n }\n}\n"
}
};
})();
(node as any).hash = "f249019075c60c4449f6f232229a6965";
export default node;