Fix typo on measure

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-04-30 14:07:14 -07:00
parent 29a40f5792
commit 1cac29f8ef
100 changed files with 7289 additions and 2664 deletions

View File

@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## [Unreleased] ## [Unreleased]
### Fixed
Fix typo `mesure` instead of `measure`
## [0.18.0] - 2025-04-30 ## [0.18.0] - 2025-04-30
### Added ### Added

View File

@@ -134,10 +134,10 @@ export function NavMain() {
function getNavItems(organizationId?: string): NavItem[] { function getNavItems(organizationId?: string): NavItem[] {
return [ return [
{ {
title: "Mesures", title: "Measures",
icon: ClipboardList, icon: ClipboardList,
url: organizationId url: organizationId
? `/organizations/${organizationId}/mesures` ? `/organizations/${organizationId}/measures`
: undefined, : undefined,
}, },
{ {

View File

@@ -69,7 +69,7 @@ const SidebarProvider = React.forwardRef<
const [openMobile, setOpenMobile] = React.useState(false); const [openMobile, setOpenMobile] = React.useState(false);
// This is the internal state of the sidebar. // This is the internal state of the sidebar.
// We use openProp and setOpenProp for mesure from outside the component. // We use openProp and setOpenProp for measure from outside the component.
const [_open, _setOpen] = React.useState(defaultOpen); const [_open, _setOpen] = React.useState(defaultOpen);
const open = openProp ?? _open; const open = openProp ?? _open;
const setOpen = React.useCallback( const setOpen = React.useCallback(

View File

@@ -2,5 +2,5 @@ import { Navigate, useParams } from "react-router";
export default function HomePage() { export default function HomePage() {
const { organizationId } = useParams(); const { organizationId } = useParams();
return <Navigate to={`/organizations/${organizationId}/mesures`} />; return <Navigate to={`/organizations/${organizationId}/measures`} />;
} }

View File

@@ -16,7 +16,7 @@ import { OrganizationBreadcrumbBreadcrumbPeopleOverviewQuery } from "./__generat
import { OrganizationBreadcrumbBreadcrumbPolicyOverviewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbPolicyOverviewQuery.graphql"; import { OrganizationBreadcrumbBreadcrumbPolicyOverviewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbPolicyOverviewQuery.graphql";
import { OrganizationBreadcrumbBreadcrumbVendorOverviewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbVendorOverviewQuery.graphql"; import { OrganizationBreadcrumbBreadcrumbVendorOverviewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbVendorOverviewQuery.graphql";
import { OrganizationBreadcrumbOrganizationQuery } from "./__generated__/OrganizationBreadcrumbOrganizationQuery.graphql"; import { OrganizationBreadcrumbOrganizationQuery } from "./__generated__/OrganizationBreadcrumbOrganizationQuery.graphql";
import { OrganizationBreadcrumbBreadcrumbMesureViewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbMesureViewQuery.graphql"; import { OrganizationBreadcrumbBreadcrumbMeasureViewQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbMeasureViewQuery.graphql";
import { OrganizationBreadcrumbBreadcrumbControlQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbControlQuery.graphql"; import { OrganizationBreadcrumbBreadcrumbControlQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbControlQuery.graphql";
import { OrganizationBreadcrumbBreadcrumbRiskShowQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbRiskShowQuery.graphql"; import { OrganizationBreadcrumbBreadcrumbRiskShowQuery } from "./__generated__/OrganizationBreadcrumbBreadcrumbRiskShowQuery.graphql";
import ErrorBoundary from "@/components/ErrorBoundary"; import ErrorBoundary from "@/components/ErrorBoundary";
@@ -314,15 +314,15 @@ function BreadcrumbPolicyOverview() {
); );
} }
function BreadcrumbMesureList() { function BreadcrumbMeasureList() {
const { organizationId } = useParams(); const { organizationId } = useParams();
return ( return (
<> <>
<BreadcrumbSeparator /> <BreadcrumbSeparator />
<BreadcrumbItem> <BreadcrumbItem>
<BreadcrumbNavLink to={`/organizations/${organizationId}/mesures`}> <BreadcrumbNavLink to={`/organizations/${organizationId}/measures`}>
Mesures Measures
</BreadcrumbNavLink> </BreadcrumbNavLink>
</BreadcrumbItem> </BreadcrumbItem>
<Outlet /> <Outlet />
@@ -330,22 +330,22 @@ function BreadcrumbMesureList() {
); );
} }
function BreadcrumbMesureView() { function BreadcrumbMeasureView() {
const { organizationId, mesureId } = useParams(); const { organizationId, measureId } = useParams();
const data = const data =
useLazyLoadQuery<OrganizationBreadcrumbBreadcrumbMesureViewQuery>( useLazyLoadQuery<OrganizationBreadcrumbBreadcrumbMeasureViewQuery>(
graphql` graphql`
query OrganizationBreadcrumbBreadcrumbMesureViewQuery($mesureId: ID!) { query OrganizationBreadcrumbBreadcrumbMeasureViewQuery($measureId: ID!) {
mesure: node(id: $mesureId) { measure: node(id: $measureId) {
id id
... on Mesure { ... on Measure {
name name
category category
} }
} }
} }
`, `,
{ mesureId: mesureId! } { measureId: measureId! }
); );
return ( return (
@@ -353,17 +353,17 @@ function BreadcrumbMesureView() {
<BreadcrumbSeparator /> <BreadcrumbSeparator />
<BreadcrumbItem> <BreadcrumbItem>
<BreadcrumbNavLink <BreadcrumbNavLink
to={`/organizations/${organizationId}/mesures#${data.mesure.category}`} to={`/organizations/${organizationId}/measures#${data.measure.category}`}
> >
{data.mesure.category} {data.measure.category}
</BreadcrumbNavLink> </BreadcrumbNavLink>
</BreadcrumbItem> </BreadcrumbItem>
<BreadcrumbSeparator /> <BreadcrumbSeparator />
<BreadcrumbItem> <BreadcrumbItem>
<BreadcrumbNavLink <BreadcrumbNavLink
to={`/organizations/${organizationId}/mesures/${mesureId}`} to={`/organizations/${organizationId}/measures/${measureId}`}
> >
{data.mesure.name} {data.measure.name}
</BreadcrumbNavLink> </BreadcrumbNavLink>
</BreadcrumbItem> </BreadcrumbItem>
<Outlet /> <Outlet />
@@ -461,13 +461,13 @@ export function BreadCrumb() {
</ErrorBoundary> </ErrorBoundary>
} }
> >
<Route path="mesures" element={<BreadcrumbMesureList />}> <Route path="measures" element={<BreadcrumbMeasureList />}>
<Route path="new" element={<New />} /> <Route path="new" element={<New />} />
<Route <Route
path=":mesureId" path=":measureId"
element={ element={
<Suspense> <Suspense>
<BreadcrumbMesureView /> <BreadcrumbMeasureView />
</Suspense> </Suspense>
} }
> >

View File

@@ -11,10 +11,10 @@ import { FrameworkListPage } from "./frameworks/FrameworkListPage";
import { FrameworkPage } from "./frameworks/FrameworkPage"; import { FrameworkPage } from "./frameworks/FrameworkPage";
import { NewFrameworkPage } from "./frameworks/NewFrameworkPage"; import { NewFrameworkPage } from "./frameworks/NewFrameworkPage";
import { ControlPage } from "./frameworks/controls/ControlPage"; import { ControlPage } from "./frameworks/controls/ControlPage";
import { EditMesurePage } from "./mesures/EditMesurePage"; import { EditMeasurePage } from "./measures/EditMeasurePage";
import { MesureListPage } from "./mesures/MesureListPage"; import { MeasureListPage } from "./measures/MeasureListPage";
import { MesurePage } from "./mesures/MesurePage"; import { MeasurePage } from "./measures/MeasurePage";
import { NewMesurePage } from "./mesures/NewMesurePage"; import { NewMeasurePage } from "./measures/NewMeasurePage";
import { NewPeoplePage } from "./people/NewPeoplePage"; import { NewPeoplePage } from "./people/NewPeoplePage";
import { PeopleListPage } from "./people/PeopleListPage"; import { PeopleListPage } from "./people/PeopleListPage";
import { PeoplePage } from "./people/PeoplePage"; import { PeoplePage } from "./people/PeoplePage";
@@ -47,10 +47,10 @@ export function OrganizationsRoutes() {
<Route path="edit" element={<EditFrameworkPage />} /> <Route path="edit" element={<EditFrameworkPage />} />
<Route path="*" element={<NotFoundPage />} /> <Route path="*" element={<NotFoundPage />} />
</Route> </Route>
<Route path="mesures" element={<MesureListPage />} /> <Route path="measures" element={<MeasureListPage />} />
<Route path="mesures/new" element={<NewMesurePage />} /> <Route path="measures/new" element={<NewMeasurePage />} />
<Route path="mesures/:mesureId" element={<MesurePage />} /> <Route path="measures/:measureId" element={<MeasurePage />} />
<Route path="mesures/:mesureId/edit" element={<EditMesurePage />} /> <Route path="measures/:measureId/edit" element={<EditMeasurePage />} />
<Route path="vendors/:vendorId" element={<VendorPage />} /> <Route path="vendors/:vendorId" element={<VendorPage />} />
<Route path="policies" element={<PolicyListPage />} /> <Route path="policies" element={<PolicyListPage />} />
<Route path="policies/:policyId" element={<ShowPolicyPage />} /> <Route path="policies/:policyId" element={<ShowPolicyPage />} />

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<a8e66e7606187f54d173cddac8bcd316>> * @generated SignedSource<<e85f30bc133288dc152ea3f46ced461e>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,19 +9,19 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type OrganizationBreadcrumbBreadcrumbMesureViewQuery$variables = { export type OrganizationBreadcrumbBreadcrumbMeasureViewQuery$variables = {
mesureId: string; measureId: string;
}; };
export type OrganizationBreadcrumbBreadcrumbMesureViewQuery$data = { export type OrganizationBreadcrumbBreadcrumbMeasureViewQuery$data = {
readonly mesure: { readonly measure: {
readonly category?: string; readonly category?: string;
readonly id: string; readonly id: string;
readonly name?: string; readonly name?: string;
}; };
}; };
export type OrganizationBreadcrumbBreadcrumbMesureViewQuery = { export type OrganizationBreadcrumbBreadcrumbMeasureViewQuery = {
response: OrganizationBreadcrumbBreadcrumbMesureViewQuery$data; response: OrganizationBreadcrumbBreadcrumbMeasureViewQuery$data;
variables: OrganizationBreadcrumbBreadcrumbMesureViewQuery$variables; variables: OrganizationBreadcrumbBreadcrumbMeasureViewQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -29,14 +29,14 @@ var v0 = [
{ {
"defaultValue": null, "defaultValue": null,
"kind": "LocalArgument", "kind": "LocalArgument",
"name": "mesureId" "name": "measureId"
} }
], ],
v1 = [ v1 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "id", "name": "id",
"variableName": "mesureId" "variableName": "measureId"
} }
], ],
v2 = { v2 = {
@@ -64,7 +64,7 @@ v3 = {
"storageKey": null "storageKey": null
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
}; };
return { return {
@@ -72,10 +72,10 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "OrganizationBreadcrumbBreadcrumbMesureViewQuery", "name": "OrganizationBreadcrumbBreadcrumbMeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -95,10 +95,10 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "OrganizationBreadcrumbBreadcrumbMesureViewQuery", "name": "OrganizationBreadcrumbBreadcrumbMeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -120,16 +120,16 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "f6183e3013438a1cff8e91c6ff80f452", "cacheID": "3c48e17cf1b1191df67348c4b3fd09e4",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "OrganizationBreadcrumbBreadcrumbMesureViewQuery", "name": "OrganizationBreadcrumbBreadcrumbMeasureViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query OrganizationBreadcrumbBreadcrumbMesureViewQuery(\n $mesureId: ID!\n) {\n mesure: node(id: $mesureId) {\n __typename\n id\n ... on Mesure {\n name\n category\n }\n }\n}\n" "text": "query OrganizationBreadcrumbBreadcrumbMeasureViewQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n name\n category\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "67fd3d426bbfcbe90457c3033dade1b3"; (node as any).hash = "41cebf479daa730843b47f2f9fb46a10";
export default node; export default node;

View File

@@ -10,7 +10,7 @@ export function NewFrameworkViewSkeleton() {
return ( return (
<PageTemplateSkeleton <PageTemplateSkeleton
title="Create Framework" title="Create Framework"
description="Create a new framework to organize your mesures" description="Create a new framework to organize your measures"
> >
<div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" /> <div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" />
</PageTemplateSkeleton> </PageTemplateSkeleton>

View File

@@ -170,7 +170,7 @@ function NewFrameworkViewContent() {
return ( return (
<PageTemplate <PageTemplate
title="Create Framework" title="Create Framework"
description="Create a new framework to organize your mesures" description="Create a new framework to organize your measures"
> >
<Card className="max-w-2xl"> <Card className="max-w-2xl">
<form onSubmit={handleSubmit} className="p-6 space-y-6"> <form onSubmit={handleSubmit} className="p-6 space-y-6">

View File

@@ -26,13 +26,13 @@ import {
} from "react-relay"; } from "react-relay";
import { useParams, Link } from "react-router"; import { useParams, Link } from "react-router";
import { import {
ControlLinkedMesuresQuery$data, ControlLinkedMeasuresQuery$data,
ControlLinkedMesuresQuery, ControlLinkedMeasuresQuery,
} from "./__generated__/ControlLinkedMesuresQuery.graphql"; } from "./__generated__/ControlLinkedMeasuresQuery.graphql";
import { import {
ControlOrganizationMesuresQuery$data, ControlOrganizationMeasuresQuery$data,
ControlOrganizationMesuresQuery, ControlOrganizationMeasuresQuery,
} from "./__generated__/ControlOrganizationMesuresQuery.graphql"; } from "./__generated__/ControlOrganizationMeasuresQuery.graphql";
import { ControlFragment_Control$key } from "./__generated__/ControlFragment_Control.graphql"; import { ControlFragment_Control$key } from "./__generated__/ControlFragment_Control.graphql";
import { import {
ControlLinkedPoliciesQuery$data, ControlLinkedPoliciesQuery$data,
@@ -52,13 +52,13 @@ const controlFragment = graphql`
} }
`; `;
// New query to fetch linked mesures // New query to fetch linked measures
const linkedMesuresQuery = graphql` const linkedMeasuresQuery = graphql`
query ControlLinkedMesuresQuery($controlId: ID!) { query ControlLinkedMeasuresQuery($controlId: ID!) {
control: node(id: $controlId) { control: node(id: $controlId) {
id id
... on Control { ... on Control {
mesures(first: 100) @connection(key: "Control__mesures") { measures(first: 100) @connection(key: "Control__measures") {
edges { edges {
node { node {
id id
@@ -74,13 +74,13 @@ const linkedMesuresQuery = graphql`
} }
`; `;
// Query to fetch all mesures for the organization // Query to fetch all measures for the organization
const organizationMesuresQuery = graphql` const organizationMeasuresQuery = graphql`
query ControlOrganizationMesuresQuery($organizationId: ID!) { query ControlOrganizationMeasuresQuery($organizationId: ID!) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
... on Organization { ... on Organization {
mesures(first: 100) @connection(key: "Organization__mesures") { measures(first: 100) @connection(key: "Organization__measures") {
edges { edges {
node { node {
id id
@@ -150,23 +150,23 @@ const organizationPoliciesQuery = graphql`
} }
`; `;
// Mutation to create a mapping between a control and a mesure // Mutation to create a mapping between a control and a measure
const createMesureMappingMutation = graphql` const createMeasureMappingMutation = graphql`
mutation ControlCreateMesureMappingMutation( mutation ControlCreateMeasureMappingMutation(
$input: CreateControlMesureMappingInput! $input: CreateControlMeasureMappingInput!
) { ) {
createControlMesureMapping(input: $input) { createControlMeasureMapping(input: $input) {
success success
} }
} }
`; `;
// Mutation to delete a mapping between a control and a mesure // Mutation to delete a mapping between a control and a measure
const deleteMesureMappingMutation = graphql` const deleteMeasureMappingMutation = graphql`
mutation ControlDeleteMesureMappingMutation( mutation ControlDeleteMeasureMappingMutation(
$input: DeleteControlMesureMappingInput! $input: DeleteControlMeasureMappingInput!
) { ) {
deleteControlMesureMapping(input: $input) { deleteControlMeasureMapping(input: $input) {
success success
} }
} }
@@ -207,17 +207,17 @@ export function Control({
const { toast } = useToast(); const { toast } = useToast();
const environment = useRelayEnvironment(); const environment = useRelayEnvironment();
// State for mesure mapping // State for measure mapping
const [isMesureMappingDialogOpen, setIsMesureMappingDialogOpen] = const [isMeasureMappingDialogOpen, setIsMeasureMappingDialogOpen] =
useState(false); useState(false);
const [linkedMesuresData, setLinkedMesuresData] = const [linkedMeasuresData, setLinkedMeasuresData] =
useState<ControlLinkedMesuresQuery$data | null>(null); useState<ControlLinkedMeasuresQuery$data | null>(null);
const [organizationMesuresData, setOrganizationMesuresData] = const [organizationMeasuresData, setOrganizationMeasuresData] =
useState<ControlOrganizationMesuresQuery$data | null>(null); useState<ControlOrganizationMeasuresQuery$data | null>(null);
const [mesureSearchQuery, setMesureSearchQuery] = useState(""); const [measureSearchQuery, setMeasureSearchQuery] = useState("");
const [isLoadingMesures, setIsLoadingMesures] = useState(false); const [isLoadingMeasures, setIsLoadingMeasures] = useState(false);
const [isLinkingMesure, setIsLinkingMesure] = useState(false); const [isLinkingMeasure, setIsLinkingMeasure] = useState(false);
const [isUnlinkingMesure, setIsUnlinkingMesure] = useState(false); const [isUnlinkingMeasure, setIsUnlinkingMeasure] = useState(false);
const [categoryFilter, setCategoryFilter] = useState<string | null>(null); const [categoryFilter, setCategoryFilter] = useState<string | null>(null);
// Policy state // Policy state
@@ -233,73 +233,73 @@ export function Control({
const [isUnlinkingPolicy, setIsUnlinkingPolicy] = useState(false); const [isUnlinkingPolicy, setIsUnlinkingPolicy] = useState(false);
// Create mutation hooks // Create mutation hooks
const [commitCreateMesureMapping] = useMutation(createMesureMappingMutation); const [commitCreateMeasureMapping] = useMutation(createMeasureMappingMutation);
const [commitDeleteMesureMapping] = useMutation(deleteMesureMappingMutation); const [commitDeleteMeasureMapping] = useMutation(deleteMeasureMappingMutation);
const [commitCreatePolicyMapping] = useMutation(createPolicyMappingMutation); const [commitCreatePolicyMapping] = useMutation(createPolicyMappingMutation);
const [commitDeletePolicyMapping] = useMutation(deletePolicyMappingMutation); const [commitDeletePolicyMapping] = useMutation(deletePolicyMappingMutation);
// Load initial linked mesures data // Load initial linked measures data
useEffect(() => { useEffect(() => {
if (control.id) { if (control.id) {
setIsLoadingMesures(true); setIsLoadingMeasures(true);
fetchQuery<ControlLinkedMesuresQuery>(environment, linkedMesuresQuery, { fetchQuery<ControlLinkedMeasuresQuery>(environment, linkedMeasuresQuery, {
controlId: control.id, controlId: control.id,
}).subscribe({ }).subscribe({
next: (data) => { next: (data) => {
setLinkedMesuresData(data); setLinkedMeasuresData(data);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error loading initial mesures:", error); console.error("Error loading initial measures:", error);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
}, },
}); });
} }
}, [control.id, environment]); }, [control.id, environment]);
// Load mesures data // Load measures data
const loadMesuresData = useCallback(() => { const loadMeasuresData = useCallback(() => {
if (!organizationId || !control.id) return; if (!organizationId || !control.id) return;
setIsLoadingMesures(true); setIsLoadingMeasures(true);
// Fetch all mesures for the organization // Fetch all measures for the organization
fetchQuery<ControlOrganizationMesuresQuery>( fetchQuery<ControlOrganizationMeasuresQuery>(
environment, environment,
organizationMesuresQuery, organizationMeasuresQuery,
{ {
organizationId, organizationId,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
setOrganizationMesuresData(data); setOrganizationMeasuresData(data);
}, },
complete: () => { complete: () => {
// Fetch linked mesures for this control // Fetch linked measures for this control
fetchQuery<ControlLinkedMesuresQuery>(environment, linkedMesuresQuery, { fetchQuery<ControlLinkedMeasuresQuery>(environment, linkedMeasuresQuery, {
controlId: control.id, controlId: control.id,
}).subscribe({ }).subscribe({
next: (data) => { next: (data) => {
setLinkedMesuresData(data); setLinkedMeasuresData(data);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error fetching linked mesures:", error); console.error("Error fetching linked measures:", error);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to load linked mesures.", description: "Failed to load linked measures.",
variant: "destructive", variant: "destructive",
}); });
}, },
}); });
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error fetching organization mesures:", error); console.error("Error fetching organization measures:", error);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to load mesures.", description: "Failed to load measures.",
variant: "destructive", variant: "destructive",
}); });
}, },
@@ -307,190 +307,190 @@ export function Control({
}, [control.id, environment, organizationId, toast]); }, [control.id, environment, organizationId, toast]);
// Helper functions // Helper functions
const getMesures = useCallback(() => { const getMeasures = useCallback(() => {
if (!organizationMesuresData?.organization?.mesures?.edges) return []; if (!organizationMeasuresData?.organization?.measures?.edges) return [];
return organizationMesuresData.organization.mesures.edges.map( return organizationMeasuresData.organization.measures.edges.map(
(edge) => edge.node (edge) => edge.node
); );
}, [organizationMesuresData]); }, [organizationMeasuresData]);
const getLinkedMesures = useCallback(() => { const getLinkedMeasures = useCallback(() => {
if (!linkedMesuresData?.control?.mesures?.edges) return []; if (!linkedMeasuresData?.control?.measures?.edges) return [];
return linkedMesuresData.control.mesures.edges.map((edge) => edge.node); return linkedMeasuresData.control.measures.edges.map((edge) => edge.node);
}, [linkedMesuresData]); }, [linkedMeasuresData]);
const isMesureLinked = useCallback( const isMeasureLinked = useCallback(
(mesureId: string) => { (measureId: string) => {
const linkedMesures = getLinkedMesures(); const linkedMeasures = getLinkedMeasures();
return linkedMesures.some((mesure) => mesure.id === mesureId); return linkedMeasures.some((measure) => measure.id === measureId);
}, },
[getLinkedMesures] [getLinkedMeasures]
); );
const getMesureCategories = useCallback(() => { const getMeasureCategories = useCallback(() => {
const mesures = getMesures(); const measures = getMeasures();
const categories = new Set<string>(); const categories = new Set<string>();
mesures.forEach((mesure) => { measures.forEach((measure) => {
if (mesure.category) { if (measure.category) {
categories.add(mesure.category); categories.add(measure.category);
} }
}); });
return Array.from(categories).sort(); return Array.from(categories).sort();
}, [getMesures]); }, [getMeasures]);
const filteredMesures = useCallback(() => { const filteredMeasures = useCallback(() => {
const mesures = getMesures(); const measures = getMeasures();
if (!mesureSearchQuery && !categoryFilter) return mesures; if (!measureSearchQuery && !categoryFilter) return measures;
return mesures.filter((mesure) => { return measures.filter((measure) => {
// Filter by search query // Filter by search query
const matchesSearch = const matchesSearch =
!mesureSearchQuery || !measureSearchQuery ||
mesure.name.toLowerCase().includes(mesureSearchQuery.toLowerCase()) || measure.name.toLowerCase().includes(measureSearchQuery.toLowerCase()) ||
(mesure.description && (measure.description &&
mesure.description measure.description
.toLowerCase() .toLowerCase()
.includes(mesureSearchQuery.toLowerCase())); .includes(measureSearchQuery.toLowerCase()));
// Filter by category // Filter by category
const matchesCategory = const matchesCategory =
!categoryFilter || !categoryFilter ||
categoryFilter === "all" || categoryFilter === "all" ||
mesure.category === categoryFilter; measure.category === categoryFilter;
return matchesSearch && matchesCategory; return matchesSearch && matchesCategory;
}); });
}, [categoryFilter, getMesures, mesureSearchQuery]); }, [categoryFilter, getMeasures, measureSearchQuery]);
// Handle link/unlink functions // Handle link/unlink functions
const handleLinkMesure = useCallback( const handleLinkMeasure = useCallback(
(mesureId: string) => { (measureId: string) => {
if (!control.id) return; if (!control.id) return;
setIsLinkingMesure(true); setIsLinkingMeasure(true);
commitCreateMesureMapping({ commitCreateMeasureMapping({
variables: { variables: {
input: { input: {
controlId: control.id, controlId: control.id,
mesureId: mesureId, measureId: measureId,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
setIsLinkingMesure(false); setIsLinkingMeasure(false);
if (errors) { if (errors) {
console.error("Error linking mesure:", errors); console.error("Error linking measure:", errors);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to link mesure. Please try again.", description: "Failed to link measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
return; return;
} }
// Refresh linked mesures data // Refresh linked measures data
fetchQuery<ControlLinkedMesuresQuery>( fetchQuery<ControlLinkedMeasuresQuery>(
environment, environment,
linkedMesuresQuery, linkedMeasuresQuery,
{ {
controlId: control.id, controlId: control.id,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
setLinkedMesuresData(data); setLinkedMeasuresData(data);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error refreshing linked mesures:", error); console.error("Error refreshing linked measures:", error);
}, },
}); });
toast({ toast({
title: "Success", title: "Success",
description: "Mesure successfully linked to control.", description: "Measure successfully linked to control.",
}); });
}, },
onError: (error) => { onError: (error) => {
setIsLinkingMesure(false); setIsLinkingMeasure(false);
console.error("Error linking mesure:", error); console.error("Error linking measure:", error);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to link mesure. Please try again.", description: "Failed to link measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
}, },
}); });
}, },
[commitCreateMesureMapping, control.id, environment, toast] [commitCreateMeasureMapping, control.id, environment, toast]
); );
const handleUnlinkMesure = useCallback( const handleUnlinkMeasure = useCallback(
(mesureId: string) => { (measureId: string) => {
if (!control.id) return; if (!control.id) return;
setIsUnlinkingMesure(true); setIsUnlinkingMeasure(true);
commitDeleteMesureMapping({ commitDeleteMeasureMapping({
variables: { variables: {
input: { input: {
controlId: control.id, controlId: control.id,
mesureId: mesureId, measureId: measureId,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
setIsUnlinkingMesure(false); setIsUnlinkingMeasure(false);
if (errors) { if (errors) {
console.error("Error unlinking mesure:", errors); console.error("Error unlinking measure:", errors);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to unlink mesure. Please try again.", description: "Failed to unlink measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
return; return;
} }
// Refresh linked mesures data // Refresh linked measures data
fetchQuery<ControlLinkedMesuresQuery>( fetchQuery<ControlLinkedMeasuresQuery>(
environment, environment,
linkedMesuresQuery, linkedMeasuresQuery,
{ {
controlId: control.id, controlId: control.id,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
setLinkedMesuresData(data); setLinkedMeasuresData(data);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error refreshing linked mesures:", error); console.error("Error refreshing linked measures:", error);
}, },
}); });
toast({ toast({
title: "Success", title: "Success",
description: "Mesure successfully unlinked from control.", description: "Measure successfully unlinked from control.",
}); });
}, },
onError: (error) => { onError: (error) => {
setIsUnlinkingMesure(false); setIsUnlinkingMeasure(false);
console.error("Error unlinking mesure:", error); console.error("Error unlinking measure:", error);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to unlink mesure. Please try again.", description: "Failed to unlink measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
}, },
}); });
}, },
[commitDeleteMesureMapping, control.id, environment, toast] [commitDeleteMeasureMapping, control.id, environment, toast]
); );
const handleOpenMesureMappingDialog = useCallback(() => { const handleOpenMeasureMappingDialog = useCallback(() => {
loadMesuresData(); loadMeasuresData();
setIsMesureMappingDialogOpen(true); setIsMeasureMappingDialogOpen(true);
}, [loadMesuresData]); }, [loadMeasuresData]);
// Load initial linked policies data // Load initial linked policies data
useEffect(() => { useEffect(() => {
@@ -778,10 +778,10 @@ export function Control({
{/* Security Measures Section */} {/* Security Measures Section */}
<div className="mt-8"> <div className="mt-8">
{/* Mesure Mapping Dialog */} {/* Measure Mapping Dialog */}
<Dialog <Dialog
open={isMesureMappingDialogOpen} open={isMeasureMappingDialogOpen}
onOpenChange={setIsMesureMappingDialogOpen} onOpenChange={setIsMeasureMappingDialogOpen}
> >
<DialogContent className="max-w-3xl max-h-[80vh] overflow-hidden flex flex-col"> <DialogContent className="max-w-3xl max-h-[80vh] overflow-hidden flex flex-col">
<DialogHeader> <DialogHeader>
@@ -798,8 +798,8 @@ export function Control({
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-tertiary" /> <Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-tertiary" />
<Input <Input
placeholder="Search security measures by name or description..." placeholder="Search security measures by name or description..."
value={mesureSearchQuery} value={measureSearchQuery}
onChange={(e) => setMesureSearchQuery(e.target.value)} onChange={(e) => setMeasureSearchQuery(e.target.value)}
className="w-full pl-10" className="w-full pl-10"
/> />
</div> </div>
@@ -816,7 +816,7 @@ export function Control({
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectItem value="all">All categories</SelectItem> <SelectItem value="all">All categories</SelectItem>
{getMesureCategories().map((category) => ( {getMeasureCategories().map((category) => (
<SelectItem key={category} value={category}> <SelectItem key={category} value={category}>
{category} {category}
</SelectItem> </SelectItem>
@@ -827,14 +827,14 @@ export function Control({
</div> </div>
<div className="flex-1 overflow-hidden"> <div className="flex-1 overflow-hidden">
{isLoadingMesures ? ( {isLoadingMeasures ? (
<div className="flex items-center justify-center h-full"> <div className="flex items-center justify-center h-full">
<Loader2 className="w-8 h-8 animate-spin text-info" /> <Loader2 className="w-8 h-8 animate-spin text-info" />
<span className="ml-2">Loading security measures...</span> <span className="ml-2">Loading security measures...</span>
</div> </div>
) : ( ) : (
<div className="max-h-[50vh] overflow-y-auto pr-2"> <div className="max-h-[50vh] overflow-y-auto pr-2">
{filteredMesures().length === 0 ? ( {filteredMeasures().length === 0 ? (
<div className="text-center py-8 text-secondary"> <div className="text-center py-8 text-secondary">
No security measures found. Try adjusting your search or No security measures found. Try adjusting your search or
select a different category. select a different category.
@@ -851,30 +851,30 @@ export function Control({
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{filteredMesures().map((mesure) => { {filteredMeasures().map((measure) => {
const isLinked = isMesureLinked(mesure.id); const isLinked = isMeasureLinked(measure.id);
return ( return (
<tr <tr
key={mesure.id} key={measure.id}
className="border-b hover:bg-invert-bg" className="border-b hover:bg-invert-bg"
> >
<td className="py-3 px-4"> <td className="py-3 px-4">
<div className="font-medium"> <div className="font-medium">
{mesure.name} {measure.name}
</div> </div>
{mesure.description && ( {measure.description && (
<div className="text-xs text-secondary line-clamp-1 mt-0.5"> <div className="text-xs text-secondary line-clamp-1 mt-0.5">
{mesure.description} {measure.description}
</div> </div>
)} )}
</td> </td>
<td className="py-3 px-4"> <td className="py-3 px-4">
<div <div
className={`px-2 py-0.5 rounded-full text-xs ${getStateColor( className={`px-2 py-0.5 rounded-full text-xs ${getStateColor(
mesure.state measure.state
)} inline-block`} )} inline-block`}
> >
{formatState(mesure.state)} {formatState(measure.state)}
</div> </div>
</td> </td>
<td className="py-3 px-4 text-right whitespace-nowrap"> <td className="py-3 px-4 text-right whitespace-nowrap">
@@ -883,12 +883,12 @@ export function Control({
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => onClick={() =>
handleUnlinkMesure(mesure.id) handleUnlinkMeasure(measure.id)
} }
disabled={isUnlinkingMesure} disabled={isUnlinkingMeasure}
className="text-xs h-7 text-danger border-danger-b hover:bg-h-danger-bg" className="text-xs h-7 text-danger border-danger-b hover:bg-h-danger-bg"
> >
{isUnlinkingMesure ? ( {isUnlinkingMeasure ? (
<Loader2 className="w-4 h-4 animate-spin" /> <Loader2 className="w-4 h-4 animate-spin" />
) : ( ) : (
<X className="w-4 h-4" /> <X className="w-4 h-4" />
@@ -900,12 +900,12 @@ export function Control({
variant="secondary" variant="secondary"
size="sm" size="sm"
onClick={() => onClick={() =>
handleLinkMesure(mesure.id) handleLinkMeasure(measure.id)
} }
disabled={isLinkingMesure} disabled={isLinkingMeasure}
className="text-xs h-7 text-info border-info-b hover:bg-h-info-bg" className="text-xs h-7 text-info border-info-b hover:bg-h-info-bg"
> >
{isLinkingMesure ? ( {isLinkingMeasure ? (
<Loader2 className="w-4 h-4 animate-spin" /> <Loader2 className="w-4 h-4 animate-spin" />
) : ( ) : (
<LinkIcon className="w-4 h-4" /> <LinkIcon className="w-4 h-4" />
@@ -925,14 +925,14 @@ export function Control({
</div> </div>
<DialogFooter className="mt-4"> <DialogFooter className="mt-4">
<Button onClick={() => setIsMesureMappingDialogOpen(false)}> <Button onClick={() => setIsMeasureMappingDialogOpen(false)}>
Close Close
</Button> </Button>
</DialogFooter> </DialogFooter>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
{/* Linked Mesures List */} {/* Linked Measures List */}
<div> <div>
<div className="flex justify-between items-center mb-4"> <div className="flex justify-between items-center mb-4">
<h3 className="text-xl font-medium text-secondary"> <h3 className="text-xl font-medium text-secondary">
@@ -942,20 +942,20 @@ export function Control({
variant="outline" variant="outline"
size="sm" size="sm"
className="flex items-center gap-1" className="flex items-center gap-1"
onClick={handleOpenMesureMappingDialog} onClick={handleOpenMeasureMappingDialog}
> >
<LinkIcon className="w-4 h-4" /> <LinkIcon className="w-4 h-4" />
<span>Link Security Measures</span> <span>Link Security Measures</span>
</Button> </Button>
</div> </div>
{isLoadingMesures ? ( {isLoadingMeasures ? (
<div className="flex items-center justify-center h-24"> <div className="flex items-center justify-center h-24">
<Loader2 className="w-6 h-6 animate-spin text-info" /> <Loader2 className="w-6 h-6 animate-spin text-info" />
<span className="ml-2">Loading security measures...</span> <span className="ml-2">Loading security measures...</span>
</div> </div>
) : linkedMesuresData?.control?.mesures?.edges && ) : linkedMeasuresData?.control?.measures?.edges &&
linkedMesuresData.control.mesures.edges.length > 0 ? ( linkedMeasuresData.control.measures.edges.length > 0 ? (
<div className="overflow-x-auto border rounded-md"> <div className="overflow-x-auto border rounded-md">
<table className="w-full"> <table className="w-full">
<thead> <thead>
@@ -968,26 +968,26 @@ export function Control({
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{getLinkedMesures().map((mesure) => ( {getLinkedMeasures().map((measure) => (
<tr <tr
key={mesure.id} key={measure.id}
className="border-b hover:bg-invert-bg" className="border-b hover:bg-invert-bg"
> >
<td className="py-3 px-4"> <td className="py-3 px-4">
<div className="font-medium">{mesure.name}</div> <div className="font-medium">{measure.name}</div>
{mesure.description && ( {measure.description && (
<div className="text-xs text-secondary line-clamp-1 mt-0.5"> <div className="text-xs text-secondary line-clamp-1 mt-0.5">
{mesure.description} {measure.description}
</div> </div>
)} )}
</td> </td>
<td className="py-3 px-4"> <td className="py-3 px-4">
<div <div
className={`px-2 py-0.5 rounded-full text-xs ${getStateColor( className={`px-2 py-0.5 rounded-full text-xs ${getStateColor(
mesure.state measure.state
)} inline-block`} )} inline-block`}
> >
{formatState(mesure.state)} {formatState(measure.state)}
</div> </div>
</td> </td>
<td className="py-3 px-4 text-right whitespace-nowrap"> <td className="py-3 px-4 text-right whitespace-nowrap">
@@ -999,7 +999,7 @@ export function Control({
className="text-xs h-7" className="text-xs h-7"
> >
<Link <Link
to={`/organizations/${organizationId}/mesures/${mesure.id}`} to={`/organizations/${organizationId}/measures/${measure.id}`}
> >
View View
</Link> </Link>
@@ -1007,8 +1007,8 @@ export function Control({
<Button <Button
variant="outline" variant="outline"
size="sm" size="sm"
onClick={() => handleUnlinkMesure(mesure.id)} onClick={() => handleUnlinkMeasure(measure.id)}
disabled={isUnlinkingMesure} disabled={isUnlinkingMeasure}
className="text-xs h-7 text-danger border-danger-b hover:bg-h-danger-bg" className="text-xs h-7 text-danger border-danger-b hover:bg-h-danger-bg"
> >
Unlink Unlink

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<b2d5c0102cdcaff05ca490a75b797625>> * @generated SignedSource<<369cb72e422d254a5e4956d17c47a8ae>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type CreateRiskMesureMappingInput = { export type CreateControlMeasureMappingInput = {
mesureId: string; controlId: string;
riskId: string; measureId: string;
}; };
export type ShowRiskViewCreateRiskMesureMappingMutation$variables = { export type ControlCreateMeasureMappingMutation$variables = {
input: CreateRiskMesureMappingInput; input: CreateControlMeasureMappingInput;
}; };
export type ShowRiskViewCreateRiskMesureMappingMutation$data = { export type ControlCreateMeasureMappingMutation$data = {
readonly createRiskMesureMapping: { readonly createControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type ShowRiskViewCreateRiskMesureMappingMutation = { export type ControlCreateMeasureMappingMutation = {
response: ShowRiskViewCreateRiskMesureMappingMutation$data; response: ControlCreateMeasureMappingMutation$data;
variables: ShowRiskViewCreateRiskMesureMappingMutation$variables; variables: ControlCreateMeasureMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "CreateRiskMesureMappingPayload", "concreteType": "CreateControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "createRiskMesureMapping", "name": "createControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ShowRiskViewCreateRiskMesureMappingMutation", "name": "ControlCreateMeasureMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,20 +74,20 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ShowRiskViewCreateRiskMesureMappingMutation", "name": "ControlCreateMeasureMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "f7d34307825549877c07678c77ca17c6", "cacheID": "5ff3b52a5f40607556617a17e44dc3b1",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ShowRiskViewCreateRiskMesureMappingMutation", "name": "ControlCreateMeasureMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation ShowRiskViewCreateRiskMesureMappingMutation(\n $input: CreateRiskMesureMappingInput!\n) {\n createRiskMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation ControlCreateMeasureMappingMutation(\n $input: CreateControlMeasureMappingInput!\n) {\n createControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "e1d7cdd482d6658c2befddd478a3397d"; (node as any).hash = "2c0061b6e180971d0e0f8b8b5c44d566";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<0fc791ecc00bfd6b1aa3a8da262df36c>> * @generated SignedSource<<6208e6173d03bbf497b38e0f8dece2a7>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type DeleteRiskMesureMappingInput = { export type DeleteControlMeasureMappingInput = {
mesureId: string; controlId: string;
riskId: string; measureId: string;
}; };
export type ShowRiskViewDeleteRiskMesureMappingMutation$variables = { export type ControlDeleteMeasureMappingMutation$variables = {
input: DeleteRiskMesureMappingInput; input: DeleteControlMeasureMappingInput;
}; };
export type ShowRiskViewDeleteRiskMesureMappingMutation$data = { export type ControlDeleteMeasureMappingMutation$data = {
readonly deleteRiskMesureMapping: { readonly deleteControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type ShowRiskViewDeleteRiskMesureMappingMutation = { export type ControlDeleteMeasureMappingMutation = {
response: ShowRiskViewDeleteRiskMesureMappingMutation$data; response: ControlDeleteMeasureMappingMutation$data;
variables: ShowRiskViewDeleteRiskMesureMappingMutation$variables; variables: ControlDeleteMeasureMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "DeleteRiskMesureMappingPayload", "concreteType": "DeleteControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "deleteRiskMesureMapping", "name": "deleteControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ShowRiskViewDeleteRiskMesureMappingMutation", "name": "ControlDeleteMeasureMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,20 +74,20 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ShowRiskViewDeleteRiskMesureMappingMutation", "name": "ControlDeleteMeasureMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "d46920306e833fb33b4f10dca6aa1c5a", "cacheID": "446e0d6cc32e0c0dfc4f5e74e11bdb84",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ShowRiskViewDeleteRiskMesureMappingMutation", "name": "ControlDeleteMeasureMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation ShowRiskViewDeleteRiskMesureMappingMutation(\n $input: DeleteRiskMesureMappingInput!\n) {\n deleteRiskMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation ControlDeleteMeasureMappingMutation(\n $input: DeleteControlMeasureMappingInput!\n) {\n deleteControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "e55c8d6490fbcfe0d287053200b6347d"; (node as any).hash = "f6a94c260a98dffe7d48e4aa9e690845";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<94f5c5a041ae3730b8f4a71ad63530a8>> * @generated SignedSource<<968e00428300c564a03ee9a4b98eed90>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,29 +9,29 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type ControlLinkedMesuresQuery$variables = { export type ControlLinkedMeasuresQuery$variables = {
controlId: string; controlId: string;
}; };
export type ControlLinkedMesuresQuery$data = { export type ControlLinkedMeasuresQuery$data = {
readonly control: { readonly control: {
readonly id: string; readonly id: string;
readonly mesures?: { readonly measures?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
}; };
}>; }>;
}; };
}; };
}; };
export type ControlLinkedMesuresQuery = { export type ControlLinkedMeasuresQuery = {
response: ControlLinkedMesuresQuery$data; response: ControlLinkedMeasuresQuery$data;
variables: ControlLinkedMesuresQuery$variables; variables: ControlLinkedMeasuresQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -67,7 +67,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -75,7 +75,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -161,7 +161,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ControlLinkedMesuresQuery", "name": "ControlLinkedMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "control", "alias": "control",
@@ -176,11 +176,11 @@ return {
"kind": "InlineFragment", "kind": "InlineFragment",
"selections": [ "selections": [
{ {
"alias": "mesures", "alias": "measures",
"args": null, "args": null,
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__Control__mesures_connection", "name": "__Control__measures_connection",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": null "storageKey": null
@@ -200,7 +200,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ControlLinkedMesuresQuery", "name": "ControlLinkedMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "control", "alias": "control",
@@ -218,21 +218,21 @@ return {
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": "mesures(first:100)" "storageKey": "measures(first:100)"
}, },
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "Control__mesures", "key": "Control__measures",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesures" "name": "measures"
} }
], ],
"type": "Control", "type": "Control",
@@ -244,7 +244,7 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "b29cb1662103fc42abf16fa6b3458a68", "cacheID": "1b64a54214517bf3d4555ada606c7e1c",
"id": null, "id": null,
"metadata": { "metadata": {
"connection": [ "connection": [
@@ -254,18 +254,18 @@ return {
"direction": "forward", "direction": "forward",
"path": [ "path": [
"control", "control",
"mesures" "measures"
] ]
} }
] ]
}, },
"name": "ControlLinkedMesuresQuery", "name": "ControlLinkedMeasuresQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ControlLinkedMesuresQuery(\n $controlId: ID!\n) {\n control: node(id: $controlId) {\n __typename\n id\n ... on Control {\n mesures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query ControlLinkedMeasuresQuery(\n $controlId: ID!\n) {\n control: node(id: $controlId) {\n __typename\n id\n ... on Control {\n measures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "e42a48d7b21eaa5c42331377b6a9bc9c"; (node as any).hash = "168cf7c175bd5abf756edada5c8bd533";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<862b2210a9d569a05063cebc805bdd01>> * @generated SignedSource<<b9bcf1b3144ca9e18e7e7c3513dfbd73>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,29 +9,29 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type ControlOrganizationMesuresQuery$variables = { export type ControlOrganizationMeasuresQuery$variables = {
organizationId: string; organizationId: string;
}; };
export type ControlOrganizationMesuresQuery$data = { export type ControlOrganizationMeasuresQuery$data = {
readonly organization: { readonly organization: {
readonly id: string; readonly id: string;
readonly mesures?: { readonly measures?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
}; };
}>; }>;
}; };
}; };
}; };
export type ControlOrganizationMesuresQuery = { export type ControlOrganizationMeasuresQuery = {
response: ControlOrganizationMesuresQuery$data; response: ControlOrganizationMeasuresQuery$data;
variables: ControlOrganizationMesuresQuery$variables; variables: ControlOrganizationMeasuresQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -67,7 +67,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -75,7 +75,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -161,7 +161,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ControlOrganizationMesuresQuery", "name": "ControlOrganizationMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -176,11 +176,11 @@ return {
"kind": "InlineFragment", "kind": "InlineFragment",
"selections": [ "selections": [
{ {
"alias": "mesures", "alias": "measures",
"args": null, "args": null,
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__Organization__mesures_connection", "name": "__Organization__measures_connection",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": null "storageKey": null
@@ -200,7 +200,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ControlOrganizationMesuresQuery", "name": "ControlOrganizationMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -218,21 +218,21 @@ return {
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": "mesures(first:100)" "storageKey": "measures(first:100)"
}, },
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "Organization__mesures", "key": "Organization__measures",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesures" "name": "measures"
} }
], ],
"type": "Organization", "type": "Organization",
@@ -244,7 +244,7 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "bb1066800bfa28aaa64a2fd1f12c5924", "cacheID": "9d2ddaaceb1b73e3c7b967e2d2a1b86b",
"id": null, "id": null,
"metadata": { "metadata": {
"connection": [ "connection": [
@@ -254,18 +254,18 @@ return {
"direction": "forward", "direction": "forward",
"path": [ "path": [
"organization", "organization",
"mesures" "measures"
] ]
} }
] ]
}, },
"name": "ControlOrganizationMesuresQuery", "name": "ControlOrganizationMeasuresQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ControlOrganizationMesuresQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n mesures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query ControlOrganizationMeasuresQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n measures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "5f1d6b11af3d92bec1c4d37ceb12b7c3"; (node as any).hash = "6f5efd4dbac9bdc9b32ed8c155edf1e7";
export default node; export default node;

View File

@@ -4,26 +4,26 @@ import { lazy } from "@probo/react-lazy";
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import { ErrorBoundaryWithLocation } from "../ErrorBoundary"; import { ErrorBoundaryWithLocation } from "../ErrorBoundary";
const NewMesureView = lazy(() => import("./NewMesureView")); const EditMeasureView = lazy(() => import("./EditMeasureView"));
export function NewMesureViewSkeleton() { export function EditMeasureViewSkeleton() {
return ( return (
<PageTemplateSkeleton <PageTemplateSkeleton
title="New Mesure" title="Edit Measure"
description="Add a new mesure. You will be able to link it to control and risks" description="Edit a Measure. You will be able to link it to control and risks"
> >
<div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" /> <div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" />
</PageTemplateSkeleton> </PageTemplateSkeleton>
); );
} }
export function NewMesurePage() { export function EditMeasurePage() {
const location = useLocation(); const location = useLocation();
return ( return (
<Suspense key={location.pathname} fallback={<NewMesureViewSkeleton />}> <Suspense key={location.pathname} fallback={<EditMeasureViewSkeleton />}>
<ErrorBoundaryWithLocation> <ErrorBoundaryWithLocation>
<NewMesureView /> <EditMeasureView />
</ErrorBoundaryWithLocation> </ErrorBoundaryWithLocation>
</Suspense> </Suspense>
); );

View File

@@ -9,19 +9,19 @@ import {
import { useParams, useNavigate } from "react-router"; import { useParams, useNavigate } from "react-router";
import { PageTemplate } from "@/components/PageTemplate"; import { PageTemplate } from "@/components/PageTemplate";
import { useToast } from "@/hooks/use-toast"; import { useToast } from "@/hooks/use-toast";
import { EditMesureViewUpdateMesureMutation } from "./__generated__/EditMesureViewUpdateMesureMutation.graphql"; import { EditMeasureViewUpdateMeasureMutation } from "./__generated__/EditMeasureViewUpdateMeasureMutation.graphql";
import { EditableField } from "@/components/EditableField"; import { EditableField } from "@/components/EditableField";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { EditMesureViewSkeleton } from "./EditMesurePage"; import { EditMeasureViewSkeleton } from "./EditMeasurePage";
import { EditMesureViewQuery } from "./__generated__/EditMesureViewQuery.graphql"; import { EditMeasureViewQuery } from "./__generated__/EditMeasureViewQuery.graphql";
const editMesureQuery = graphql` const editMeasureQuery = graphql`
query EditMesureViewQuery($mesureId: ID!) { query EditMeasureViewQuery($measureId: ID!) {
node(id: $mesureId) { node(id: $measureId) {
... on Mesure { ... on Measure {
id id
name name
description description
@@ -31,10 +31,10 @@ const editMesureQuery = graphql`
} }
`; `;
const updateMesureMutation = graphql` const updateMeasureMutation = graphql`
mutation EditMesureViewUpdateMesureMutation($input: UpdateMesureInput!) { mutation EditMeasureViewUpdateMeasureMutation($input: UpdateMeasureInput!) {
updateMesure(input: $input) { updateMeasure(input: $input) {
mesure { measure {
id id
name name
description description
@@ -43,26 +43,26 @@ const updateMesureMutation = graphql`
} }
`; `;
function EditMesureViewContent({ function EditMeasureViewContent({
queryRef, queryRef,
}: { }: {
queryRef: PreloadedQuery<EditMesureViewQuery>; queryRef: PreloadedQuery<EditMeasureViewQuery>;
}) { }) {
const { organizationId } = useParams<{ const { organizationId } = useParams<{
organizationId: string; organizationId: string;
}>(); }>();
const { mesureId } = useParams(); const { measureId } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const { toast } = useToast(); const { toast } = useToast();
const { node: mesure } = usePreloadedQuery(editMesureQuery, queryRef); const { node: measure } = usePreloadedQuery(editMeasureQuery, queryRef);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
name: mesure.name ?? "", name: measure.name ?? "",
description: mesure.description ?? "", description: measure.description ?? "",
category: mesure.category ?? "" category: measure.category ?? ""
}); });
const [commit, isInFlight] = const [commit, isInFlight] =
useMutation<EditMesureViewUpdateMesureMutation>(updateMesureMutation); useMutation<EditMeasureViewUpdateMeasureMutation>(updateMeasureMutation);
const handleFieldChange = (field: keyof typeof formData, value: unknown) => { const handleFieldChange = (field: keyof typeof formData, value: unknown) => {
setFormData((prev) => ({ setFormData((prev) => ({
@@ -86,7 +86,7 @@ function EditMesureViewContent({
commit({ commit({
variables: { variables: {
input: { input: {
id: mesureId!, id: measureId!,
name: formData.name, name: formData.name,
description: formData.description, description: formData.description,
category: formData.category category: formData.category
@@ -96,7 +96,7 @@ function EditMesureViewContent({
if (errors) { if (errors) {
toast({ toast({
title: "Error", title: "Error",
description: errors[0]?.message || "Failed to update mesure", description: errors[0]?.message || "Failed to update measure",
variant: "destructive", variant: "destructive",
}); });
return; return;
@@ -104,10 +104,10 @@ function EditMesureViewContent({
toast({ toast({
title: "Success", title: "Success",
description: "Mesure updated successfully", description: "Measure updated successfully",
}); });
navigate(`/organizations/${organizationId}/mesures/${mesureId}`); navigate(`/organizations/${organizationId}/measures/${measureId}`);
}, },
onError(error) { onError(error) {
toast({ toast({
@@ -121,8 +121,8 @@ function EditMesureViewContent({
return ( return (
<PageTemplate <PageTemplate
title="Edit Mesure" title="Edit Measure"
description="Edit a mesure. You will be able to link it to control and risks" description="Edit a measure. You will be able to link it to control and risks"
> >
<Card className="max-w-2xl"> <Card className="max-w-2xl">
<form onSubmit={handleSubmit} className="p-6 space-y-6"> <form onSubmit={handleSubmit} className="p-6 space-y-6">
@@ -139,7 +139,7 @@ function EditMesureViewContent({
onChange={(value) => handleFieldChange("description", value)} onChange={(value) => handleFieldChange("description", value)}
required required
multiline multiline
helpText="Provide a detailed description of the mesure" helpText="Provide a detailed description of the measure"
/> />
<EditableField <EditableField
@@ -154,13 +154,13 @@ function EditMesureViewContent({
type="button" type="button"
variant="outline" variant="outline"
onClick={() => onClick={() =>
navigate(`/organizations/${organizationId}/mesures/${mesureId}`) navigate(`/organizations/${organizationId}/measures/${measureId}`)
} }
> >
Cancel Cancel
</Button> </Button>
<Button type="submit" disabled={isInFlight}> <Button type="submit" disabled={isInFlight}>
{isInFlight ? "Updating..." : "Update Mesure"} {isInFlight ? "Updating..." : "Update Measure"}
</Button> </Button>
</div> </div>
</form> </form>
@@ -169,24 +169,24 @@ function EditMesureViewContent({
); );
} }
export default function EditMesureView() { export default function EditMeasureView() {
const { mesureId } = useParams(); const { measureId } = useParams();
const [queryRef, loadQuery] = const [queryRef, loadQuery] =
useQueryLoader<EditMesureViewQuery>(editMesureQuery); useQueryLoader<EditMeasureViewQuery>(editMeasureQuery);
useEffect(() => { useEffect(() => {
if (mesureId) { if (measureId) {
loadQuery({ mesureId }); loadQuery({ measureId });
} }
}, [mesureId, loadQuery]); }, [measureId, loadQuery]);
if (!queryRef) { if (!queryRef) {
return <EditMesureViewSkeleton />; return <EditMeasureViewSkeleton />;
} }
return ( return (
<Suspense fallback={<EditMesureViewSkeleton />}> <Suspense fallback={<EditMeasureViewSkeleton />}>
<EditMesureViewContent queryRef={queryRef} /> <EditMeasureViewContent queryRef={queryRef} />
</Suspense> </Suspense>
); );
} }

View File

@@ -4,13 +4,13 @@ import { lazy } from "@probo/react-lazy";
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import { ErrorBoundaryWithLocation } from "../ErrorBoundary"; import { ErrorBoundaryWithLocation } from "../ErrorBoundary";
const MesureListView = lazy(() => import("./MesureListView")); const MeasureListView = lazy(() => import("./MeasureListView"));
export function MesureListViewSkeleton() { export function MeasureListViewSkeleton() {
return ( return (
<PageTemplateSkeleton <PageTemplateSkeleton
title="Mesures" title="Measures"
description="Mesures are actions taken to reduce the risk of a risk." description="Measures are actions taken to reduce the risk of a risk."
> >
<div className="space-y-6"> <div className="space-y-6">
<div className="h-[72px] bg-subtle-bg animate-pulse rounded-xl" /> <div className="h-[72px] bg-subtle-bg animate-pulse rounded-xl" />
@@ -31,13 +31,13 @@ export function MesureListViewSkeleton() {
); );
} }
export function MesureListPage() { export function MeasureListPage() {
const location = useLocation(); const location = useLocation();
return ( return (
<Suspense key={location.pathname} fallback={<MesureListViewSkeleton />}> <Suspense key={location.pathname} fallback={<MeasureListViewSkeleton />}>
<ErrorBoundaryWithLocation> <ErrorBoundaryWithLocation>
<MesureListView /> <MeasureListView />
</ErrorBoundaryWithLocation> </ErrorBoundaryWithLocation>
</Suspense> </Suspense>
); );

View File

@@ -21,11 +21,11 @@ import {
} from "lucide-react"; } from "lucide-react";
import { PageTemplate } from "@/components/PageTemplate"; import { PageTemplate } from "@/components/PageTemplate";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { MesureListViewQuery as MesureListViewQueryType } from "./__generated__/MesureListViewQuery.graphql"; import { MeasureListViewQuery as MeasureListViewQueryType } from "./__generated__/MeasureListViewQuery.graphql";
import { MesureListViewSkeleton } from "./MesureListPage"; import { MeasureListViewSkeleton } from "./MeasureListPage";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { useToast } from "@/hooks/use-toast"; import { useToast } from "@/hooks/use-toast";
import { MesureListViewImportMesureMutation as MesureListViewImportMesureMutationType } from "./__generated__/MesureListViewImportMesureMutation.graphql"; import { MeasureListViewImportMeasureMutation as MeasureListViewImportMeasureMutationType } from "./__generated__/MeasureListViewImportMeasureMutation.graphql";
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,
@@ -38,12 +38,12 @@ import {
PopoverTrigger, PopoverTrigger,
} from "@/components/ui/popover"; } from "@/components/ui/popover";
const mesureListViewQuery = graphql` const measureListViewQuery = graphql`
query MesureListViewQuery($organizationId: ID!, $first: Int) { query MeasureListViewQuery($organizationId: ID!, $first: Int) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
... on Organization { ... on Organization {
mesures(first: $first) @connection(key: "MesureListView_mesures") { measures(first: $first) @connection(key: "MeasureListView_measures") {
edges { edges {
node { node {
id id
@@ -61,13 +61,13 @@ const mesureListViewQuery = graphql`
} }
`; `;
const importMesureMutation = graphql` const importMeasureMutation = graphql`
mutation MesureListViewImportMesureMutation( mutation MeasureListViewImportMeasureMutation(
$input: ImportMesureInput! $input: ImportMeasureInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
importMesure(input: $input) { importMeasure(input: $input) {
mesureEdges @appendEdge(connections: $connections) { measureEdges @appendEdge(connections: $connections) {
node { node {
id id
name name
@@ -82,7 +82,7 @@ const importMesureMutation = graphql`
} }
`; `;
interface Mesure { interface Measure {
id?: string; id?: string;
name?: string; name?: string;
description?: string; description?: string;
@@ -98,7 +98,7 @@ interface Category {
name: string; name: string;
description: string; description: string;
progress: number; progress: number;
mesures: Mesure[]; measures: Measure[];
doneCount: number; doneCount: number;
totalCount: number; totalCount: number;
} }
@@ -106,21 +106,21 @@ interface Category {
interface OrganizationData { interface OrganizationData {
organization: { organization: {
id: string; id: string;
mesures?: { measures?: {
edges: Array<{ edges: Array<{
node: Mesure; node: Measure;
}>; }>;
}; };
}; };
} }
function MesureListContent({ function MeasureListContent({
queryRef, queryRef,
}: { }: {
queryRef: PreloadedQuery<MesureListViewQueryType>; queryRef: PreloadedQuery<MeasureListViewQueryType>;
}) { }) {
const data = usePreloadedQuery<MesureListViewQueryType>( const data = usePreloadedQuery<MeasureListViewQueryType>(
mesureListViewQuery, measureListViewQuery,
queryRef queryRef
) as unknown as OrganizationData; ) as unknown as OrganizationData;
@@ -129,8 +129,8 @@ function MesureListContent({
const [isImporting, setIsImporting] = useState(false); const [isImporting, setIsImporting] = useState(false);
const { toast } = useToast(); const { toast } = useToast();
const [importMesure] = const [importMeasure] =
useMutation<MesureListViewImportMesureMutationType>(importMesureMutation); useMutation<MeasureListViewImportMeasureMutationType>(importMeasureMutation);
// Monitor URL hash for changes and update state accordingly // Monitor URL hash for changes and update state accordingly
const [initialHashCategory] = useState(() => const [initialHashCategory] = useState(() =>
@@ -175,10 +175,10 @@ function MesureListContent({
}; };
}, [expandedCategories]); }, [expandedCategories]);
const mesures = const measures =
data.organization.mesures?.edges.map((edge) => edge.node) ?? []; data.organization.measures?.edges.map((edge) => edge.node) ?? [];
// Map mesure state to status for the new design // Map measure state to status for the new design
const mapStateToStatus = (state?: string): string => { const mapStateToStatus = (state?: string): string => {
if (!state) return "incomplete"; if (!state) return "incomplete";
switch (state) { switch (state) {
@@ -195,48 +195,48 @@ function MesureListContent({
} }
}; };
const processedMesures = mesures.map((mesure: Mesure) => ({ const processedMeasures = measures.map((measure: Measure) => ({
...mesure, ...measure,
status: mapStateToStatus(mesure.state), status: mapStateToStatus(measure.state),
})); }));
// Calculate global progress // Calculate global progress
const implementedCount = processedMesures.filter( const implementedCount = processedMeasures.filter(
(mesure: Mesure) => mesure.status === "complete" (measure: Measure) => measure.status === "complete"
).length; ).length;
const notApplicableCount = processedMesures.filter( const notApplicableCount = processedMeasures.filter(
(mesure: Mesure) => mesure.status === "not-applicable" (measure: Measure) => measure.status === "not-applicable"
).length; ).length;
const totalMesures = processedMesures.length; const totalMeasures = processedMeasures.length;
// Include not-applicable as effectively "complete" for progress percentage // Include not-applicable as effectively "complete" for progress percentage
const effectiveCompletedCount = implementedCount + notApplicableCount; const effectiveCompletedCount = implementedCount + notApplicableCount;
const globalProgress = totalMesures const globalProgress = totalMeasures
? Math.round((effectiveCompletedCount / totalMesures) * 100) ? Math.round((effectiveCompletedCount / totalMeasures) * 100)
: 0; : 0;
// Get global status counts // Get global status counts
const globalStatusCounts = processedMesures.reduce( const globalStatusCounts = processedMeasures.reduce(
(acc: Record<string, number>, mesure: Mesure) => { (acc: Record<string, number>, measure: Measure) => {
if (mesure.status) { if (measure.status) {
acc[mesure.status] = (acc[mesure.status] || 0) + 1; acc[measure.status] = (acc[measure.status] || 0) + 1;
} }
return acc; return acc;
}, },
{} as Record<string, number> {} as Record<string, number>
); );
// Group mesures by category // Group measures by category
const mesuresByCategory = processedMesures.reduce( const measuresByCategory = processedMeasures.reduce(
(acc: Record<string, Mesure[]>, mesure: Mesure) => { (acc: Record<string, Measure[]>, measure: Measure) => {
if (!mesure?.category) return acc; if (!measure?.category) return acc;
if (!acc[mesure.category]) { if (!acc[measure.category]) {
acc[mesure.category] = []; acc[measure.category] = [];
} }
acc[mesure.category].push(mesure); acc[measure.category].push(measure);
return acc; return acc;
}, },
{} as Record<string, Mesure[]> {} as Record<string, Measure[]>
); );
// Function to toggle a category's expanded state // Function to toggle a category's expanded state
@@ -250,17 +250,17 @@ function MesureListContent({
}); });
}; };
const categories: Category[] = Object.entries(mesuresByCategory) const categories: Category[] = Object.entries(measuresByCategory)
.map(([categoryName, categoryMesures]: [string, Mesure[]]) => { .map(([categoryName, categoryMeasures]: [string, Measure[]]) => {
const catImplementedCount = categoryMesures.filter( const catImplementedCount = categoryMeasures.filter(
(mesure) => mesure.status === "complete" (measure) => measure.status === "complete"
).length; ).length;
const catNotApplicableCount = categoryMesures.filter( const catNotApplicableCount = categoryMeasures.filter(
(mesure) => mesure.status === "not-applicable" (measure) => measure.status === "not-applicable"
).length; ).length;
// Consider both "complete" and "not-applicable" as done for category progress // Consider both "complete" and "not-applicable" as done for category progress
const catDoneCount = catImplementedCount + catNotApplicableCount; const catDoneCount = catImplementedCount + catNotApplicableCount;
const catTotalCount = categoryMesures.length; const catTotalCount = categoryMeasures.length;
const progress = catTotalCount const progress = catTotalCount
? Math.round((catDoneCount / catTotalCount) * 100) ? Math.round((catDoneCount / catTotalCount) * 100)
: 0; : 0;
@@ -268,16 +268,16 @@ function MesureListContent({
return { return {
id: categoryName, id: categoryName,
name: categoryName, name: categoryName,
description: `Mesures related to ${categoryName.toLowerCase()}`, description: `Measures related to ${categoryName.toLowerCase()}`,
progress: progress, progress: progress,
mesures: categoryMesures.sort((a, b) => measures: categoryMeasures.sort((a, b) =>
(a.name || "").localeCompare(b.name || "") (a.name || "").localeCompare(b.name || "")
), ),
doneCount: catDoneCount, doneCount: catDoneCount,
totalCount: catTotalCount, totalCount: catTotalCount,
}; };
}) })
.filter((category) => category.mesures.length > 0) .filter((category) => category.measures.length > 0)
.sort((a, b) => a.name.localeCompare(b.name)); .sort((a, b) => a.name.localeCompare(b.name));
const getStatusIcon = (status: string) => { const getStatusIcon = (status: string) => {
@@ -303,12 +303,12 @@ function MesureListContent({
setIsImporting(true); setIsImporting(true);
importMesure({ importMeasure({
variables: { variables: {
connections: [ connections: [
ConnectionHandler.getConnectionID( ConnectionHandler.getConnectionID(
data.organization.id, data.organization.id,
"MesureListView_mesures" "MeasureListView_measures"
), ),
], ],
input: { input: {
@@ -322,8 +322,8 @@ function MesureListContent({
onCompleted: () => { onCompleted: () => {
setIsImporting(false); setIsImporting(false);
toast({ toast({
title: "Mesures imported", title: "Measures imported",
description: "Mesures have been imported successfully.", description: "Measures have been imported successfully.",
variant: "default", variant: "default",
}); });
if (fileInputRef.current) { if (fileInputRef.current) {
@@ -333,7 +333,7 @@ function MesureListContent({
onError: (error) => { onError: (error) => {
setIsImporting(false); setIsImporting(false);
toast({ toast({
title: "Error importing mesures", title: "Error importing measures",
description: error.message, description: error.message,
variant: "destructive", variant: "destructive",
}); });
@@ -343,8 +343,8 @@ function MesureListContent({
return ( return (
<PageTemplate <PageTemplate
title="Mesures" title="Measures"
description="Mesures are actions taken to reduce the risk. Add them to track their implementation status." description="Measures are actions taken to reduce the risk. Add them to track their implementation status."
actions={ actions={
<div className="flex gap-4"> <div className="flex gap-4">
<Button <Button
@@ -352,17 +352,17 @@ function MesureListContent({
onClick={() => fileInputRef.current?.click()} onClick={() => fileInputRef.current?.click()}
disabled={isImporting} disabled={isImporting}
> >
{isImporting ? "Importing..." : "Import Mesures"} {isImporting ? "Importing..." : "Import Measures"}
</Button> </Button>
<Button asChild> <Button asChild>
<Link to={`/organizations/${organizationId}/mesures/new`}> <Link to={`/organizations/${organizationId}/measures/new`}>
New Mesure New Measure
</Link> </Link>
</Button> </Button>
</div> </div>
} }
> >
{/* Hidden file input for mesure import */} {/* Hidden file input for measure import */}
<input <input
type="file" type="file"
ref={fileInputRef} ref={fileInputRef}
@@ -374,7 +374,7 @@ function MesureListContent({
{/* Global Progress Summary */} {/* Global Progress Summary */}
<div className="mb-8"> <div className="mb-8">
<div className="flex items-center justify-between mb-1"> <div className="flex items-center justify-between mb-1">
<h3 className="text-lg font-medium">Mesure Implementation</h3> <h3 className="text-lg font-medium">Measure Implementation</h3>
<span className="text-sm text-tertiary"> <span className="text-sm text-tertiary">
{globalProgress}% complete {globalProgress}% complete
</span> </span>
@@ -390,7 +390,7 @@ function MesureListContent({
className="bg-green-500 h-full" className="bg-green-500 h-full"
style={{ style={{
width: `${ width: `${
(globalStatusCounts.complete / totalMesures) * 100 (globalStatusCounts.complete / totalMeasures) * 100
}%`, }%`,
}} }}
/> />
@@ -401,7 +401,7 @@ function MesureListContent({
className="bg-blue-500 h-full" className="bg-blue-500 h-full"
style={{ style={{
width: `${ width: `${
(globalStatusCounts["in-progress"] / totalMesures) * 100 (globalStatusCounts["in-progress"] / totalMeasures) * 100
}%`, }%`,
}} }}
/> />
@@ -412,7 +412,7 @@ function MesureListContent({
className="bg-red-500 h-full" className="bg-red-500 h-full"
style={{ style={{
width: `${ width: `${
(globalStatusCounts.incomplete / totalMesures) * 100 (globalStatusCounts.incomplete / totalMeasures) * 100
}%`, }%`,
}} }}
/> />
@@ -423,7 +423,7 @@ function MesureListContent({
className="bg-primary-bg h-full" className="bg-primary-bg h-full"
style={{ style={{
width: `${ width: `${
(globalStatusCounts["not-applicable"] / totalMesures) * 100 (globalStatusCounts["not-applicable"] / totalMeasures) * 100
}%`, }%`,
}} }}
/> />
@@ -434,7 +434,7 @@ function MesureListContent({
className="bg-secondary h-full" className="bg-secondary h-full"
style={{ style={{
width: `${ width: `${
(globalStatusCounts["not-started"] / totalMesures) * 100 (globalStatusCounts["not-started"] / totalMeasures) * 100
}%`, }%`,
}} }}
/> />
@@ -514,7 +514,7 @@ function MesureListContent({
{isExpanded && ( {isExpanded && (
<CardContent className="p-0"> <CardContent className="p-0">
{category.mesures.length > 0 ? ( {category.measures.length > 0 ? (
<div className="w-full"> <div className="w-full">
<table className="w-full"> <table className="w-full">
<thead> <thead>
@@ -522,19 +522,19 @@ function MesureListContent({
<th className="w-24 px-4 py-2 text-left"> <th className="w-24 px-4 py-2 text-left">
Status Status
</th> </th>
<th className="px-4 py-2 text-left">Mesure</th> <th className="px-4 py-2 text-left">Measure</th>
</tr> </tr>
</thead> </thead>
<tbody className="divide-y"> <tbody className="divide-y">
{category.mesures.map((mesure) => ( {category.measures.map((measure) => (
<tr <tr
key={mesure.id || Math.random().toString()} key={measure.id || Math.random().toString()}
className="hover:bg-h-subtle-bg cursor-pointer" className="hover:bg-h-subtle-bg cursor-pointer"
> >
<td className="w-24 px-4 py-3 align-middle"> <td className="w-24 px-4 py-3 align-middle">
<div className="flex items-center justify-center"> <div className="flex items-center justify-center">
{mesure.status {measure.status
? getStatusIcon(mesure.status) ? getStatusIcon(measure.status)
: null} : null}
</div> </div>
</td> </td>
@@ -544,11 +544,11 @@ function MesureListContent({
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<Link <Link
to={`/organizations/${organizationId}/mesures/${mesure.id}`} to={`/organizations/${organizationId}/measures/${measure.id}`}
className="font-medium group flex items-center relative" className="font-medium group flex items-center relative"
> >
<span className="mr-1"> <span className="mr-1">
{mesure.name} {measure.name}
</span> </span>
<span className="absolute bottom-0 left-0 w-full h-0.5 bg-primary-bg scale-x-0 group-hover:scale-x-100 transition-transform"></span> <span className="absolute bottom-0 left-0 w-full h-0.5 bg-primary-bg scale-x-0 group-hover:scale-x-100 transition-transform"></span>
</Link> </Link>
@@ -567,7 +567,7 @@ function MesureListContent({
<Button <Button
variant="ghost" variant="ghost"
className="p-0 h-6 w-6 rounded-full hover:bg-primary-bg" className="p-0 h-6 w-6 rounded-full hover:bg-primary-bg"
aria-label="Learn more about this mesure" aria-label="Learn more about this measure"
> >
<HelpCircle className="h-5 w-5 text-primary hover:text-primary" /> <HelpCircle className="h-5 w-5 text-primary hover:text-primary" />
</Button> </Button>
@@ -580,20 +580,20 @@ function MesureListContent({
<div className="space-y-3"> <div className="space-y-3">
<div className="flex justify-between items-start"> <div className="flex justify-between items-start">
<h4 className="font-bold text-md"> <h4 className="font-bold text-md">
{mesure.name} {measure.name}
</h4> </h4>
</div> </div>
{mesure.description && ( {measure.description && (
<div className="text-sm"> <div className="text-sm">
<p className="font-semibold mb-1"> <p className="font-semibold mb-1">
Why is this important: Why is this important:
</p> </p>
<p> <p>
{mesure.description.startsWith( {measure.description.startsWith(
"##" "##"
) )
? mesure.description ? measure.description
.split("\n") .split("\n")
.find((line) => .find((line) =>
line.startsWith( line.startsWith(
@@ -603,15 +603,15 @@ function MesureListContent({
?.replace("## Why?", "") ?.replace("## Why?", "")
?.replace("## Why", "") ?.replace("## Why", "")
?.trim() || ?.trim() ||
mesure.description.split( measure.description.split(
"\n" "\n"
)[1] || )[1] ||
"" ""
: mesure.description.substring( : measure.description.substring(
0, 0,
180 180
) + ) +
(mesure.description.length > (measure.description.length >
180 180
? "..." ? "..."
: "")} : "")}
@@ -627,7 +627,7 @@ function MesureListContent({
asChild asChild
> >
<Link <Link
to={`/organizations/${organizationId}/mesures/${mesure.id}`} to={`/organizations/${organizationId}/measures/${measure.id}`}
> >
<span> <span>
Implementation guide Implementation guide
@@ -648,7 +648,7 @@ function MesureListContent({
</div> </div>
) : ( ) : (
<div className="flex items-center justify-center p-6 text-center text-tertiary"> <div className="flex items-center justify-center p-6 text-center text-tertiary">
No mesures in this category No measures in this category
</div> </div>
)} )}
</CardContent> </CardContent>
@@ -662,9 +662,9 @@ function MesureListContent({
); );
} }
export default function MesureListView() { export default function MeasureListView() {
const [queryRef, loadQuery] = const [queryRef, loadQuery] =
useQueryLoader<MesureListViewQueryType>(mesureListViewQuery); useQueryLoader<MeasureListViewQueryType>(measureListViewQuery);
const { organizationId } = useParams(); const { organizationId } = useParams();
@@ -676,12 +676,12 @@ export default function MesureListView() {
}, [loadQuery, organizationId]); }, [loadQuery, organizationId]);
if (!queryRef) { if (!queryRef) {
return <MesureListViewSkeleton />; return <MeasureListViewSkeleton />;
} }
return ( return (
<Suspense fallback={<MesureListViewSkeleton />}> <Suspense fallback={<MeasureListViewSkeleton />}>
<MesureListContent queryRef={queryRef} /> <MeasureListContent queryRef={queryRef} />
</Suspense> </Suspense>
); );
} }

View File

@@ -5,9 +5,9 @@ import { lazy } from "@probo/react-lazy";
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import { ErrorBoundaryWithLocation } from "../ErrorBoundary"; import { ErrorBoundaryWithLocation } from "../ErrorBoundary";
const MesureView = lazy(() => import("./MesureView")); const MeasureView = lazy(() => import("./MeasureView"));
export function MesureViewSkeleton() { export function MeasureViewSkeleton() {
return ( return (
<PageTemplateSkeleton <PageTemplateSkeleton
actions={ actions={
@@ -32,13 +32,13 @@ export function MesureViewSkeleton() {
); );
} }
export function MesurePage() { export function MeasurePage() {
const location = useLocation(); const location = useLocation();
return ( return (
<Suspense key={location.pathname} fallback={<MesureViewSkeleton />}> <Suspense key={location.pathname} fallback={<MeasureViewSkeleton />}>
<ErrorBoundaryWithLocation> <ErrorBoundaryWithLocation>
<MesureView /> <MeasureView />
</ErrorBoundaryWithLocation> </ErrorBoundaryWithLocation>
</Suspense> </Suspense>
); );

View File

@@ -80,34 +80,34 @@ import {
import { Badge } from "@/components/ui/badge"; import { Badge } from "@/components/ui/badge";
import { PageTemplate } from "@/components/PageTemplate"; import { PageTemplate } from "@/components/PageTemplate";
import { MesureViewSkeleton } from "./MesurePage"; import { MeasureViewSkeleton } from "./MeasurePage";
import { MesureViewUpdateTaskStateMutation as MesureViewUpdateTaskStateMutationType } from "./__generated__/MesureViewUpdateTaskStateMutation.graphql"; import { MeasureViewUpdateTaskStateMutation as MeasureViewUpdateTaskStateMutationType } from "./__generated__/MeasureViewUpdateTaskStateMutation.graphql";
import { MesureViewCreateTaskMutation as MesureViewCreateTaskMutationType } from "./__generated__/MesureViewCreateTaskMutation.graphql"; import { MeasureViewCreateTaskMutation as MeasureViewCreateTaskMutationType } from "./__generated__/MeasureViewCreateTaskMutation.graphql";
import { MesureViewDeleteTaskMutation as MesureViewDeleteTaskMutationType } from "./__generated__/MesureViewDeleteTaskMutation.graphql"; import { MeasureViewDeleteTaskMutation as MeasureViewDeleteTaskMutationType } from "./__generated__/MeasureViewDeleteTaskMutation.graphql";
import { MesureViewDeleteEvidenceMutation as MesureViewDeleteEvidenceMutationType } from "./__generated__/MesureViewDeleteEvidenceMutation.graphql"; import { MeasureViewDeleteEvidenceMutation as MeasureViewDeleteEvidenceMutationType } from "./__generated__/MeasureViewDeleteEvidenceMutation.graphql";
import { MesureViewAssignTaskMutation as MesureViewAssignTaskMutationType } from "./__generated__/MesureViewAssignTaskMutation.graphql"; import { MeasureViewAssignTaskMutation as MeasureViewAssignTaskMutationType } from "./__generated__/MeasureViewAssignTaskMutation.graphql";
import { MesureViewUnassignTaskMutation as MesureViewUnassignTaskMutationType } from "./__generated__/MesureViewUnassignTaskMutation.graphql"; import { MeasureViewUnassignTaskMutation as MeasureViewUnassignTaskMutationType } from "./__generated__/MeasureViewUnassignTaskMutation.graphql";
import { MesureViewUpdateMesureStateMutation as MesureViewUpdateMesureStateMutationType } from "./__generated__/MesureViewUpdateMesureStateMutation.graphql"; import { MeasureViewUpdateMeasureStateMutation as MeasureViewUpdateMeasureStateMutationType } from "./__generated__/MeasureViewUpdateMeasureStateMutation.graphql";
import { MesureViewQuery as MesureViewQueryType } from "./__generated__/MesureViewQuery.graphql"; import { MeasureViewQuery as MeasureViewQueryType } from "./__generated__/MeasureViewQuery.graphql";
import { import {
MesureViewOrganizationQuery, MeasureViewOrganizationQuery,
MesureViewOrganizationQuery$data, MeasureViewOrganizationQuery$data,
} from "./__generated__/MesureViewOrganizationQuery.graphql"; } from "./__generated__/MeasureViewOrganizationQuery.graphql";
import { import {
MesureViewFrameworksQuery, MeasureViewFrameworksQuery,
MesureViewFrameworksQuery$data, MeasureViewFrameworksQuery$data,
} from "./__generated__/MesureViewFrameworksQuery.graphql"; } from "./__generated__/MeasureViewFrameworksQuery.graphql";
import { import {
MesureViewLinkedControlsQuery, MeasureViewLinkedControlsQuery,
MesureViewLinkedControlsQuery$data, MeasureViewLinkedControlsQuery$data,
} from "./__generated__/MesureViewLinkedControlsQuery.graphql"; } from "./__generated__/MeasureViewLinkedControlsQuery.graphql";
import { MesureViewCreateEvidenceMutation as MesureViewCreateEvidenceMutationType } from "./__generated__/MesureViewCreateEvidenceMutation.graphql"; import { MeasureViewCreateEvidenceMutation as MeasureViewCreateEvidenceMutationType } from "./__generated__/MeasureViewCreateEvidenceMutation.graphql";
import { MesureViewFulfillEvidenceMutation as MesureViewFulfillEvidenceMutationType } from "./__generated__/MesureViewFulfillEvidenceMutation.graphql"; import { MeasureViewFulfillEvidenceMutation as MeasureViewFulfillEvidenceMutationType } from "./__generated__/MeasureViewFulfillEvidenceMutation.graphql";
import { MesureViewCreateControlMappingMutation } from "./__generated__/MesureViewCreateControlMappingMutation.graphql"; import { MeasureViewCreateControlMappingMutation } from "./__generated__/MeasureViewCreateControlMappingMutation.graphql";
import { MesureViewDeleteControlMappingMutation } from "./__generated__/MesureViewDeleteControlMappingMutation.graphql"; import { MeasureViewDeleteControlMappingMutation } from "./__generated__/MeasureViewDeleteControlMappingMutation.graphql";
import { MesureViewRisksQuery$data } from "./__generated__/MesureViewRisksQuery.graphql"; import { MeasureViewRisksQuery$data } from "./__generated__/MeasureViewRisksQuery.graphql";
import { MesureViewRisksQuery } from "./__generated__/MesureViewRisksQuery.graphql"; import { MeasureViewRisksQuery } from "./__generated__/MeasureViewRisksQuery.graphql";
import { MesureViewDeleteMesureMutation } from "./__generated__/MesureViewDeleteMesureMutation.graphql"; import { MeasureViewDeleteMeasureMutation } from "./__generated__/MeasureViewDeleteMeasureMutation.graphql";
// Function to format ISO8601 duration to human-readable format // Function to format ISO8601 duration to human-readable format
const formatDuration = (isoDuration: string): string => { const formatDuration = (isoDuration: string): string => {
@@ -146,16 +146,16 @@ const formatDuration = (isoDuration: string): string => {
} }
}; };
const mesureViewQuery = graphql` const measureViewQuery = graphql`
query MesureViewQuery($mesureId: ID!) { query MeasureViewQuery($measureId: ID!) {
mesure: node(id: $mesureId) { measure: node(id: $measureId) {
id id
... on Mesure { ... on Measure {
name name
description description
state state
category category
tasks(first: 100) @connection(key: "MesureView_tasks") { tasks(first: 100) @connection(key: "MeasureView_tasks") {
__id __id
edges { edges {
node { node {
@@ -169,7 +169,7 @@ const mesureViewQuery = graphql`
fullName fullName
primaryEmailAddress primaryEmailAddress
} }
evidences(first: 50) @connection(key: "MesureView_evidences") { evidences(first: 50) @connection(key: "MeasureView_evidences") {
__id __id
edges { edges {
node { node {
@@ -194,7 +194,7 @@ const mesureViewQuery = graphql`
`; `;
const updateTaskStateMutation = graphql` const updateTaskStateMutation = graphql`
mutation MesureViewUpdateTaskStateMutation($input: UpdateTaskInput!) { mutation MeasureViewUpdateTaskStateMutation($input: UpdateTaskInput!) {
updateTask(input: $input) { updateTask(input: $input) {
task { task {
id id
@@ -206,7 +206,7 @@ const updateTaskStateMutation = graphql`
`; `;
const createTaskMutation = graphql` const createTaskMutation = graphql`
mutation MesureViewCreateTaskMutation( mutation MeasureViewCreateTaskMutation(
$input: CreateTaskInput! $input: CreateTaskInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
@@ -230,7 +230,7 @@ const createTaskMutation = graphql`
`; `;
const deleteTaskMutation = graphql` const deleteTaskMutation = graphql`
mutation MesureViewDeleteTaskMutation( mutation MeasureViewDeleteTaskMutation(
$input: DeleteTaskInput! $input: DeleteTaskInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
@@ -241,7 +241,7 @@ const deleteTaskMutation = graphql`
`; `;
const createEvidenceMutation = graphql` const createEvidenceMutation = graphql`
mutation MesureViewCreateEvidenceMutation( mutation MeasureViewCreateEvidenceMutation(
$input: CreateEvidenceInput! $input: CreateEvidenceInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
@@ -265,7 +265,7 @@ const createEvidenceMutation = graphql`
`; `;
const deleteEvidenceMutation = graphql` const deleteEvidenceMutation = graphql`
mutation MesureViewDeleteEvidenceMutation( mutation MeasureViewDeleteEvidenceMutation(
$input: DeleteEvidenceInput! $input: DeleteEvidenceInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
@@ -277,7 +277,7 @@ const deleteEvidenceMutation = graphql`
// Add a GraphQL query to fetch the fileUrl for an evidence item // Add a GraphQL query to fetch the fileUrl for an evidence item
const getEvidenceFileUrlQuery = graphql` const getEvidenceFileUrlQuery = graphql`
query MesureViewGetEvidenceFileUrlQuery($evidenceId: ID!) { query MeasureViewGetEvidenceFileUrlQuery($evidenceId: ID!) {
node(id: $evidenceId) { node(id: $evidenceId) {
... on Evidence { ... on Evidence {
id id
@@ -288,7 +288,7 @@ const getEvidenceFileUrlQuery = graphql`
`; `;
const assignTaskMutation = graphql` const assignTaskMutation = graphql`
mutation MesureViewAssignTaskMutation($input: AssignTaskInput!) { mutation MeasureViewAssignTaskMutation($input: AssignTaskInput!) {
assignTask(input: $input) { assignTask(input: $input) {
task { task {
id id
@@ -303,7 +303,7 @@ const assignTaskMutation = graphql`
`; `;
const unassignTaskMutation = graphql` const unassignTaskMutation = graphql`
mutation MesureViewUnassignTaskMutation($input: UnassignTaskInput!) { mutation MeasureViewUnassignTaskMutation($input: UnassignTaskInput!) {
unassignTask(input: $input) { unassignTask(input: $input) {
task { task {
id id
@@ -317,10 +317,10 @@ const unassignTaskMutation = graphql`
} }
`; `;
const updateMesureStateMutation = graphql` const updateMeasureStateMutation = graphql`
mutation MesureViewUpdateMesureStateMutation($input: UpdateMesureInput!) { mutation MeasureViewUpdateMeasureStateMutation($input: UpdateMeasureInput!) {
updateMesure(input: $input) { updateMeasure(input: $input) {
mesure { measure {
id id
state state
} }
@@ -328,24 +328,24 @@ const updateMesureStateMutation = graphql`
} }
`; `;
const deleteMesureMutation = graphql` const deleteMeasureMutation = graphql`
mutation MesureViewDeleteMesureMutation( mutation MeasureViewDeleteMeasureMutation(
$input: DeleteMesureInput! $input: DeleteMeasureInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
deleteMesure(input: $input) { deleteMeasure(input: $input) {
deletedMesureId @deleteEdge(connections: $connections) deletedMeasureId @deleteEdge(connections: $connections)
} }
} }
`; `;
const organizationQuery = graphql` const organizationQuery = graphql`
query MesureViewOrganizationQuery($organizationId: ID!) { query MeasureViewOrganizationQuery($organizationId: ID!) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
... on Organization { ... on Organization {
peoples(first: 100, orderBy: { direction: ASC, field: FULL_NAME }) peoples(first: 100, orderBy: { direction: ASC, field: FULL_NAME })
@connection(key: "MesureView_peoples") { @connection(key: "MeasureView_peoples") {
edges { edges {
node { node {
id id
@@ -361,7 +361,7 @@ const organizationQuery = graphql`
// New queries and mutations for Control Mapping // New queries and mutations for Control Mapping
const frameworksQuery = graphql` const frameworksQuery = graphql`
query MesureViewFrameworksQuery($organizationId: ID!) { query MeasureViewFrameworksQuery($organizationId: ID!) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
... on Organization { ... on Organization {
@@ -389,11 +389,11 @@ const frameworksQuery = graphql`
`; `;
const linkedControlsQuery = graphql` const linkedControlsQuery = graphql`
query MesureViewLinkedControlsQuery($mesureId: ID!) { query MeasureViewLinkedControlsQuery($measureId: ID!) {
mesure: node(id: $mesureId) { measure: node(id: $measureId) {
id id
... on Mesure { ... on Measure {
controls(first: 100) @connection(key: "MesureView_controls") { controls(first: 100) @connection(key: "MeasureView_controls") {
edges { edges {
node { node {
id id
@@ -409,20 +409,20 @@ const linkedControlsQuery = graphql`
`; `;
const createControlMappingMutation = graphql` const createControlMappingMutation = graphql`
mutation MesureViewCreateControlMappingMutation( mutation MeasureViewCreateControlMappingMutation(
$input: CreateControlMesureMappingInput! $input: CreateControlMeasureMappingInput!
) { ) {
createControlMesureMapping(input: $input) { createControlMeasureMapping(input: $input) {
success success
} }
} }
`; `;
const deleteControlMappingMutation = graphql` const deleteControlMappingMutation = graphql`
mutation MesureViewDeleteControlMappingMutation( mutation MeasureViewDeleteControlMappingMutation(
$input: DeleteControlMesureMappingInput! $input: DeleteControlMeasureMappingInput!
) { ) {
deleteControlMesureMapping(input: $input) { deleteControlMeasureMapping(input: $input) {
success success
} }
} }
@@ -430,7 +430,7 @@ const deleteControlMappingMutation = graphql`
// Add a mutation to fulfill evidence // Add a mutation to fulfill evidence
const fulfillEvidenceMutation = graphql` const fulfillEvidenceMutation = graphql`
mutation MesureViewFulfillEvidenceMutation( mutation MeasureViewFulfillEvidenceMutation(
$input: FulfillEvidenceInput! $input: FulfillEvidenceInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
@@ -453,13 +453,13 @@ const fulfillEvidenceMutation = graphql`
} }
`; `;
// Add query to fetch risks linked to a mesure // Add query to fetch risks linked to a measure
const mesureRisksQuery = graphql` const measureRisksQuery = graphql`
query MesureViewRisksQuery($mesureId: ID!) { query MeasureViewRisksQuery($measureId: ID!) {
mesure: node(id: $mesureId) { measure: node(id: $measureId) {
id id
... on Mesure { ... on Measure {
risks(first: 100) @connection(key: "MesureView_risks") { risks(first: 100) @connection(key: "MeasureView_risks") {
edges { edges {
node { node {
id id
@@ -481,25 +481,25 @@ const mesureRisksQuery = graphql`
} }
`; `;
function MesureViewContent({ function MeasureViewContent({
queryRef, queryRef,
}: { }: {
queryRef: PreloadedQuery<MesureViewQueryType>; queryRef: PreloadedQuery<MeasureViewQueryType>;
}) { }) {
const data = usePreloadedQuery<MesureViewQueryType>( const data = usePreloadedQuery<MeasureViewQueryType>(
mesureViewQuery, measureViewQuery,
queryRef queryRef
); );
const navigate = useNavigate(); const navigate = useNavigate();
const { toast } = useToast(); const { toast } = useToast();
const { organizationId, mesureId } = useParams<{ const { organizationId, measureId } = useParams<{
organizationId: string; organizationId: string;
mesureId: string; measureId: string;
}>(); }>();
const environment = useRelayEnvironment(); const environment = useRelayEnvironment();
const [commitDeleteMesure, isDeletingMesure] = useMutation<MesureViewDeleteMesureMutation>(deleteMesureMutation); const [commitDeleteMeasure, isDeletingMeasure] = useMutation<MeasureViewDeleteMeasureMutation>(deleteMeasureMutation);
const [isDeleteMesureOpen, setIsDeleteMesureOpen] = useState(false); const [isDeleteMeasureOpen, setIsDeleteMeasureOpen] = useState(false);
// Add state for main content tabs // Add state for main content tabs
const [mainContentTab, setMainContentTab] = useState<string>("tasks"); const [mainContentTab, setMainContentTab] = useState<string>("tasks");
@@ -510,15 +510,15 @@ function MesureViewContent({
// Load organization data for people selector // Load organization data for people selector
const [organizationData, setOrganizationData] = const [organizationData, setOrganizationData] =
useState<MesureViewOrganizationQuery$data | null>(null); useState<MeasureViewOrganizationQuery$data | null>(null);
// Control mapping state // Control mapping state
const [isControlMappingDialogOpen, setIsControlMappingDialogOpen] = const [isControlMappingDialogOpen, setIsControlMappingDialogOpen] =
useState(false); useState(false);
const [frameworksData, setFrameworksData] = const [frameworksData, setFrameworksData] =
useState<MesureViewFrameworksQuery$data | null>(null); useState<MeasureViewFrameworksQuery$data | null>(null);
const [linkedControlsData, setLinkedControlsData] = const [linkedControlsData, setLinkedControlsData] =
useState<MesureViewLinkedControlsQuery$data | null>(null); useState<MeasureViewLinkedControlsQuery$data | null>(null);
const [controlSearchQuery, setControlSearchQuery] = useState(""); const [controlSearchQuery, setControlSearchQuery] = useState("");
const [selectedFrameworkId, setSelectedFrameworkId] = useState<string | null>( const [selectedFrameworkId, setSelectedFrameworkId] = useState<string | null>(
null null
@@ -529,17 +529,17 @@ function MesureViewContent({
// Create mutation hooks for control mapping // Create mutation hooks for control mapping
const [commitCreateControlMapping] = const [commitCreateControlMapping] =
useMutation<MesureViewCreateControlMappingMutation>( useMutation<MeasureViewCreateControlMappingMutation>(
createControlMappingMutation createControlMappingMutation
); );
const [commitDeleteControlMapping] = const [commitDeleteControlMapping] =
useMutation<MesureViewDeleteControlMappingMutation>( useMutation<MeasureViewDeleteControlMappingMutation>(
deleteControlMappingMutation deleteControlMappingMutation
); );
useEffect(() => { useEffect(() => {
if (organizationId) { if (organizationId) {
fetchQuery<MesureViewOrganizationQuery>(environment, organizationQuery, { fetchQuery<MeasureViewOrganizationQuery>(environment, organizationQuery, {
organizationId, organizationId,
}).subscribe({ }).subscribe({
next: (data) => { next: (data) => {
@@ -554,11 +554,11 @@ function MesureViewContent({
// Load linked controls when component mounts // Load linked controls when component mounts
useEffect(() => { useEffect(() => {
if (mesureId) { if (measureId) {
fetchQuery<MesureViewLinkedControlsQuery>( fetchQuery<MeasureViewLinkedControlsQuery>(
environment, environment,
linkedControlsQuery, linkedControlsQuery,
{ mesureId } { measureId }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
setLinkedControlsData(data); setLinkedControlsData(data);
@@ -568,18 +568,18 @@ function MesureViewContent({
}, },
}); });
} }
}, [environment, mesureId]); }, [environment, measureId]);
// Add state for risks data // Add state for risks data
const [risksData, setRisksData] = useState<MesureViewRisksQuery$data | null>( const [risksData, setRisksData] = useState<MeasureViewRisksQuery$data | null>(
null null
); );
// Load risks data when component mounts // Load risks data when component mounts
useEffect(() => { useEffect(() => {
if (mesureId) { if (measureId) {
fetchQuery<MesureViewRisksQuery>(environment, mesureRisksQuery, { fetchQuery<MeasureViewRisksQuery>(environment, measureRisksQuery, {
mesureId, measureId,
}).subscribe({ }).subscribe({
next: (data) => { next: (data) => {
setRisksData(data); setRisksData(data);
@@ -589,7 +589,7 @@ function MesureViewContent({
}, },
}); });
} }
}, [environment, mesureId]); }, [environment, measureId]);
const formatState = (state: string | undefined): string => { const formatState = (state: string | undefined): string => {
if (!state) return ""; if (!state) return "";
@@ -618,30 +618,30 @@ function MesureViewContent({
return "bg-secondary-bg text-primary"; return "bg-secondary-bg text-primary";
}; };
const [updateTask] = useMutation<MesureViewUpdateTaskStateMutationType>( const [updateTask] = useMutation<MeasureViewUpdateTaskStateMutationType>(
updateTaskStateMutation updateTaskStateMutation
); );
const [createTask] = const [createTask] =
useMutation<MesureViewCreateTaskMutationType>(createTaskMutation); useMutation<MeasureViewCreateTaskMutationType>(createTaskMutation);
const [deleteTask] = const [deleteTask] =
useMutation<MesureViewDeleteTaskMutationType>(deleteTaskMutation); useMutation<MeasureViewDeleteTaskMutationType>(deleteTaskMutation);
const [createEvidence] = useMutation<MesureViewCreateEvidenceMutationType>( const [createEvidence] = useMutation<MeasureViewCreateEvidenceMutationType>(
createEvidenceMutation createEvidenceMutation
); );
const [deleteEvidence] = useMutation<MesureViewDeleteEvidenceMutationType>( const [deleteEvidence] = useMutation<MeasureViewDeleteEvidenceMutationType>(
deleteEvidenceMutation deleteEvidenceMutation
); );
const [assignTask] = const [assignTask] =
useMutation<MesureViewAssignTaskMutationType>(assignTaskMutation); useMutation<MeasureViewAssignTaskMutationType>(assignTaskMutation);
const [unassignTask] = const [unassignTask] =
useMutation<MesureViewUnassignTaskMutationType>(unassignTaskMutation); useMutation<MeasureViewUnassignTaskMutationType>(unassignTaskMutation);
const [fulfillEvidence] = useMutation<MesureViewFulfillEvidenceMutationType>( const [fulfillEvidence] = useMutation<MeasureViewFulfillEvidenceMutationType>(
fulfillEvidenceMutation fulfillEvidenceMutation
); );
const [updateMesureState] = const [updateMeasureState] =
useMutation<MesureViewUpdateMesureStateMutationType>( useMutation<MeasureViewUpdateMeasureStateMutationType>(
updateMesureStateMutation updateMeasureStateMutation
); );
const [isCreateTaskOpen, setIsCreateTaskOpen] = useState(false); const [isCreateTaskOpen, setIsCreateTaskOpen] = useState(false);
@@ -724,7 +724,7 @@ function MesureViewContent({
// Track if task panel is open // Track if task panel is open
const [isTaskPanelOpen, setIsTaskPanelOpen] = useState(false); const [isTaskPanelOpen, setIsTaskPanelOpen] = useState(false);
const tasks = data.mesure.tasks?.edges.map((edge) => edge.node) || []; const tasks = data.measure.tasks?.edges.map((edge) => edge.node) || [];
// Add useEffect to handle URL parameters for task selection // Add useEffect to handle URL parameters for task selection
useEffect(() => { useEffect(() => {
@@ -866,10 +866,10 @@ function MesureViewContent({
return; return;
} }
if (!data.mesure.id) { if (!data.measure.id) {
toast({ toast({
title: "Error creating task", title: "Error creating task",
description: "Mesure ID is missing", description: "Measure ID is missing",
variant: "destructive", variant: "destructive",
}); });
return; return;
@@ -879,9 +879,9 @@ function MesureViewContent({
createTask({ createTask({
variables: { variables: {
connections: [`${data.mesure.tasks?.__id}`], connections: [`${data.measure.tasks?.__id}`],
input: { input: {
mesureId: data.mesure.id, measureId: data.measure.id,
name: newTaskName, name: newTaskName,
description: newTaskDescription, description: newTaskDescription,
timeEstimate: isoTimeEstimate === "" ? null : isoTimeEstimate, timeEstimate: isoTimeEstimate === "" ? null : isoTimeEstimate,
@@ -919,7 +919,7 @@ function MesureViewContent({
deleteTask({ deleteTask({
variables: { variables: {
connections: [`${data.mesure.tasks?.__id}`], connections: [`${data.measure.tasks?.__id}`],
input: { input: {
taskId: taskToDelete.id, taskId: taskToDelete.id,
}, },
@@ -942,8 +942,8 @@ function MesureViewContent({
}); });
}; };
const handleEditMesure = () => { const handleEditMeasure = () => {
navigate(`/organizations/${organizationId}/mesures/${mesureId}/edit`); navigate(`/organizations/${organizationId}/measures/${measureId}/edit`);
}; };
const handleCreateEvidence = (taskId: string, taskName: string) => { const handleCreateEvidence = (taskId: string, taskName: string) => {
@@ -1415,12 +1415,12 @@ function MesureViewContent({
}); });
}; };
// Function to handle mesure state change // Function to handle measure state change
const handleMesureStateChange = (newState: string) => { const handleMeasureStateChange = (newState: string) => {
updateMesureState({ updateMeasureState({
variables: { variables: {
input: { input: {
id: data.mesure.id, id: data.measure.id,
state: newState as state: newState as
| "NOT_STARTED" | "NOT_STARTED"
| "IN_PROGRESS" | "IN_PROGRESS"
@@ -1430,15 +1430,15 @@ function MesureViewContent({
}, },
onCompleted: () => { onCompleted: () => {
toast({ toast({
title: "Mesure state updated", title: "Measure state updated",
description: `Mesure state has been updated to ${formatState( description: `Measure state has been updated to ${formatState(
newState newState
)}.`, )}.`,
}); });
}, },
onError: (error) => { onError: (error) => {
toast({ toast({
title: "Error updating mesure state", title: "Error updating measure state",
description: error.message, description: error.message,
variant: "destructive", variant: "destructive",
}); });
@@ -1569,12 +1569,12 @@ function MesureViewContent({
// Control mapping functions // Control mapping functions
const loadFrameworksAndControls = useCallback(() => { const loadFrameworksAndControls = useCallback(() => {
if (!organizationId || !mesureId) return; if (!organizationId || !measureId) return;
setIsLoadingControls(true); setIsLoadingControls(true);
// Fetch all frameworks and their controls // Fetch all frameworks and their controls
fetchQuery<MesureViewFrameworksQuery>(environment, frameworksQuery, { fetchQuery<MeasureViewFrameworksQuery>(environment, frameworksQuery, {
organizationId, organizationId,
}).subscribe({ }).subscribe({
next: (data) => { next: (data) => {
@@ -1592,12 +1592,12 @@ function MesureViewContent({
} }
}, },
complete: () => { complete: () => {
// Fetch already linked controls for this mesure // Fetch already linked controls for this measure
fetchQuery<MesureViewLinkedControlsQuery>( fetchQuery<MeasureViewLinkedControlsQuery>(
environment, environment,
linkedControlsQuery, linkedControlsQuery,
{ {
mesureId, measureId,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
@@ -1625,7 +1625,7 @@ function MesureViewContent({
}); });
}, },
}); });
}, [environment, mesureId, organizationId, selectedFrameworkId, toast]); }, [environment, measureId, organizationId, selectedFrameworkId, toast]);
const getControls = useCallback(() => { const getControls = useCallback(() => {
if (!frameworksData?.organization?.frameworks?.edges) return []; if (!frameworksData?.organization?.frameworks?.edges) return [];
@@ -1649,8 +1649,8 @@ function MesureViewContent({
}, [frameworksData, selectedFrameworkId]); }, [frameworksData, selectedFrameworkId]);
const getLinkedControls = useCallback(() => { const getLinkedControls = useCallback(() => {
if (!linkedControlsData?.mesure?.controls?.edges) return []; if (!linkedControlsData?.measure?.controls?.edges) return [];
return (linkedControlsData.mesure.controls.edges || []).map( return (linkedControlsData.measure.controls.edges || []).map(
(edge) => edge.node (edge) => edge.node
); );
}, [linkedControlsData]); }, [linkedControlsData]);
@@ -1665,7 +1665,7 @@ function MesureViewContent({
const handleLinkControl = useCallback( const handleLinkControl = useCallback(
(controlId: string) => { (controlId: string) => {
if (!mesureId) return; if (!measureId) return;
setIsLinkingControl(true); setIsLinkingControl(true);
@@ -1673,7 +1673,7 @@ function MesureViewContent({
variables: { variables: {
input: { input: {
controlId, controlId,
mesureId, measureId,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
@@ -1690,11 +1690,11 @@ function MesureViewContent({
} }
// Refresh linked controls data // Refresh linked controls data
fetchQuery<MesureViewLinkedControlsQuery>( fetchQuery<MeasureViewLinkedControlsQuery>(
environment, environment,
linkedControlsQuery, linkedControlsQuery,
{ {
mesureId, measureId,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
@@ -1707,7 +1707,7 @@ function MesureViewContent({
toast({ toast({
title: "Success", title: "Success",
description: "Control successfully linked to mesure.", description: "Control successfully linked to measure.",
}); });
}, },
onError: (error) => { onError: (error) => {
@@ -1721,12 +1721,12 @@ function MesureViewContent({
}, },
}); });
}, },
[commitCreateControlMapping, environment, mesureId, toast] [commitCreateControlMapping, environment, measureId, toast]
); );
const handleUnlinkControl = useCallback( const handleUnlinkControl = useCallback(
(controlId: string) => { (controlId: string) => {
if (!mesureId) return; if (!measureId) return;
setIsUnlinkingControl(true); setIsUnlinkingControl(true);
@@ -1734,7 +1734,7 @@ function MesureViewContent({
variables: { variables: {
input: { input: {
controlId, controlId,
mesureId, measureId,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
@@ -1752,10 +1752,10 @@ function MesureViewContent({
// Refresh linked controls data // Refresh linked controls data
fetchQuery(environment, linkedControlsQuery, { fetchQuery(environment, linkedControlsQuery, {
mesureId, measureId,
}).subscribe({ }).subscribe({
next: (data: unknown) => { next: (data: unknown) => {
setLinkedControlsData(data as MesureViewLinkedControlsQuery$data); setLinkedControlsData(data as MeasureViewLinkedControlsQuery$data);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error refreshing linked controls:", error); console.error("Error refreshing linked controls:", error);
@@ -1764,7 +1764,7 @@ function MesureViewContent({
toast({ toast({
title: "Success", title: "Success",
description: "Control successfully unlinked from mesure.", description: "Control successfully unlinked from measure.",
}); });
}, },
onError: (error) => { onError: (error) => {
@@ -1778,7 +1778,7 @@ function MesureViewContent({
}, },
}); });
}, },
[commitDeleteControlMapping, environment, mesureId, toast] [commitDeleteControlMapping, environment, measureId, toast]
); );
const handleOpenControlMappingDialog = useCallback(() => { const handleOpenControlMappingDialog = useCallback(() => {
@@ -1834,33 +1834,33 @@ function MesureViewContent({
return "Very High"; return "Very High";
}; };
const handleDeleteMesure = () => { const handleDeleteMeasure = () => {
setIsDeleteMesureOpen(true); setIsDeleteMeasureOpen(true);
}; };
const confirmDeleteMesure = () => { const confirmDeleteMeasure = () => {
const connectionId = ConnectionHandler.getConnectionID( const connectionId = ConnectionHandler.getConnectionID(
organizationId!, organizationId!,
"MesureListView_mesures" "MeasureListView_measures"
); );
commitDeleteMesure({ commitDeleteMeasure({
variables: { variables: {
connections: [connectionId], connections: [connectionId],
input: { input: {
mesureId: mesureId!, measureId: measureId!,
}, },
}, },
onCompleted: () => { onCompleted: () => {
toast({ toast({
title: "Mesure deleted", title: "Measure deleted",
description: "Mesure has been deleted successfully.", description: "Measure has been deleted successfully.",
}); });
navigate(`/organizations/${organizationId}/mesures`); navigate(`/organizations/${organizationId}/measures`);
}, },
onError: (error) => { onError: (error) => {
toast({ toast({
title: "Error deleting mesure", title: "Error deleting measure",
description: error.message, description: error.message,
variant: "destructive", variant: "destructive",
}); });
@@ -1870,19 +1870,19 @@ function MesureViewContent({
return ( return (
<PageTemplate <PageTemplate
title={data.mesure?.name || "Mesure"} title={data.measure?.name || "Measure"}
description={data.mesure?.description} description={data.measure?.description}
actions={ actions={
<div className="flex gap-2"> <div className="flex gap-2">
<Button <Button
variant="outline" variant="outline"
onClick={handleEditMesure} onClick={handleEditMeasure}
> >
Edit Edit
</Button> </Button>
<select <select
value={data.mesure?.state || ""} value={data.measure?.state || ""}
onChange={(e) => handleMesureStateChange(e.target.value)} onChange={(e) => handleMeasureStateChange(e.target.value)}
className="rounded-full cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-active-b disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-low-b hover:bg-h-tertiary-bg active:bg-p-tertiary-bg focus:bg-tertiary-bg shadow-xs px-2" className="rounded-full cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-active-b disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 border border-low-b hover:bg-h-tertiary-bg active:bg-p-tertiary-bg focus:bg-tertiary-bg shadow-xs px-2"
> >
<option value="">Select state</option> <option value="">Select state</option>
@@ -1893,10 +1893,10 @@ function MesureViewContent({
</select> </select>
<Button <Button
variant="destructive" variant="destructive"
onClick={() => handleDeleteMesure()} onClick={() => handleDeleteMeasure()}
disabled={isDeletingMesure} disabled={isDeletingMeasure}
> >
{isDeletingMesure ? "Deleting..." : "Delete"} {isDeletingMeasure ? "Deleting..." : "Delete"}
</Button> </Button>
</div> </div>
} }
@@ -1905,7 +1905,7 @@ function MesureViewContent({
<Card className="mt-4"> <Card className="mt-4">
<CardContent className="pt-6"> <CardContent className="pt-6">
<div className="prose prose-gray prose-sm md:prose-base text-secondary max-w-3xl"> <div className="prose prose-gray prose-sm md:prose-base text-secondary max-w-3xl">
<ReactMarkdown>{data.mesure.description}</ReactMarkdown> <ReactMarkdown>{data.measure.description}</ReactMarkdown>
</div> </div>
</CardContent> </CardContent>
</Card> </Card>
@@ -1931,20 +1931,20 @@ function MesureViewContent({
<TabsTrigger value="controls" className="flex items-center gap-2"> <TabsTrigger value="controls" className="flex items-center gap-2">
<ShieldCheck className="w-4 h-4" /> <ShieldCheck className="w-4 h-4" />
Controls Controls
{linkedControlsData?.mesure?.controls?.edges && {linkedControlsData?.measure?.controls?.edges &&
linkedControlsData.mesure.controls.edges.length > 0 && ( linkedControlsData.measure.controls.edges.length > 0 && (
<span className="ml-1.5 bg-blue-100 text-blue-800 rounded-full text-xs px-2 py-0.5"> <span className="ml-1.5 bg-blue-100 text-blue-800 rounded-full text-xs px-2 py-0.5">
{linkedControlsData.mesure.controls.edges.length} {linkedControlsData.measure.controls.edges.length}
</span> </span>
)} )}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="risks" className="flex items-center gap-2"> <TabsTrigger value="risks" className="flex items-center gap-2">
<AlertTriangle className="w-4 h-4" /> <AlertTriangle className="w-4 h-4" />
Risks Risks
{risksData?.mesure?.risks?.edges && {risksData?.measure?.risks?.edges &&
risksData.mesure.risks.edges.length > 0 && ( risksData.measure.risks.edges.length > 0 && (
<span className="ml-1.5 bg-blue-100 text-blue-800 rounded-full text-xs px-2 py-0.5"> <span className="ml-1.5 bg-blue-100 text-blue-800 rounded-full text-xs px-2 py-0.5">
{risksData.mesure.risks.edges.length} {risksData.measure.risks.edges.length}
</span> </span>
)} )}
</TabsTrigger> </TabsTrigger>
@@ -1973,10 +1973,10 @@ function MesureViewContent({
> >
<DialogContent className="max-w-3xl max-h-[80vh] overflow-hidden flex flex-col"> <DialogContent className="max-w-3xl max-h-[80vh] overflow-hidden flex flex-col">
<DialogHeader> <DialogHeader>
<DialogTitle>Map Mesure to Controls</DialogTitle> <DialogTitle>Map Measure to Controls</DialogTitle>
<DialogDescription> <DialogDescription>
Search and select controls to link to this mesure. This Search and select controls to link to this measure. This
helps track which controls are addressed by this mesure. helps track which controls are addressed by this measure.
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
@@ -2125,8 +2125,8 @@ function MesureViewContent({
{/* Linked Controls List */} {/* Linked Controls List */}
<Card> <Card>
<CardContent className="p-4"> <CardContent className="p-4">
{linkedControlsData?.mesure?.controls?.edges && {linkedControlsData?.measure?.controls?.edges &&
linkedControlsData.mesure.controls.edges.length > 0 ? ( linkedControlsData.measure.controls.edges.length > 0 ? (
<div className="overflow-x-auto"> <div className="overflow-x-auto">
<table className="w-full"> <table className="w-full">
<thead> <thead>
@@ -2174,7 +2174,7 @@ function MesureViewContent({
</div> </div>
) : ( ) : (
<div className="text-center py-8 text-secondary"> <div className="text-center py-8 text-secondary">
No controls linked to this mesure yet. Click &quot;Map to No controls linked to this measure yet. Click &quot;Map to
Controls&quot; to link controls. Controls&quot; to link controls.
</div> </div>
)} )}
@@ -2207,7 +2207,7 @@ function MesureViewContent({
<DialogHeader> <DialogHeader>
<DialogTitle>Create New Task</DialogTitle> <DialogTitle>Create New Task</DialogTitle>
<DialogDescription> <DialogDescription>
Add a new task to this mesure. Click save when Add a new task to this measure. Click save when
you&apos;re done. you&apos;re done.
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
@@ -2792,8 +2792,8 @@ function MesureViewContent({
<Card> <Card>
<CardContent className="p-4"> <CardContent className="p-4">
{risksData?.mesure?.risks?.edges && {risksData?.measure?.risks?.edges &&
risksData.mesure.risks.edges.length > 0 ? ( risksData.measure.risks.edges.length > 0 ? (
<div className="overflow-x-auto"> <div className="overflow-x-auto">
<table className="w-full"> <table className="w-full">
<thead> <thead>
@@ -2813,7 +2813,7 @@ function MesureViewContent({
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{risksData.mesure.risks.edges.map(({ node }) => ( {risksData.measure.risks.edges.map(({ node }) => (
<tr <tr
key={node.id} key={node.id}
className="border-b hover:bg-invert-bg" className="border-b hover:bg-invert-bg"
@@ -2853,7 +2853,7 @@ function MesureViewContent({
</div> </div>
) : ( ) : (
<div className="text-center py-8 text-secondary"> <div className="text-center py-8 text-secondary">
No risks linked to this mesure yet. No risks linked to this measure yet.
</div> </div>
)} )}
</CardContent> </CardContent>
@@ -3654,28 +3654,28 @@ function MesureViewContent({
</DialogContent> </DialogContent>
</Dialog> </Dialog>
{/* Delete Mesure Confirmation Dialog */} {/* Delete Measure Confirmation Dialog */}
<Dialog open={isDeleteMesureOpen} onOpenChange={setIsDeleteMesureOpen}> <Dialog open={isDeleteMeasureOpen} onOpenChange={setIsDeleteMeasureOpen}>
<DialogContent> <DialogContent>
<DialogHeader> <DialogHeader>
<DialogTitle>Delete Mesure</DialogTitle> <DialogTitle>Delete Measure</DialogTitle>
<DialogDescription> <DialogDescription>
Are you sure you want to delete this mesure? This action cannot be undone. Are you sure you want to delete this measure? This action cannot be undone.
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
<DialogFooter> <DialogFooter>
<Button <Button
variant="outline" variant="outline"
onClick={() => setIsDeleteMesureOpen(false)} onClick={() => setIsDeleteMeasureOpen(false)}
> >
Cancel Cancel
</Button> </Button>
<Button <Button
variant="destructive" variant="destructive"
onClick={confirmDeleteMesure} onClick={confirmDeleteMeasure}
disabled={isDeletingMesure} disabled={isDeletingMeasure}
> >
{isDeletingMesure ? "Deleting..." : "Delete"} {isDeletingMeasure ? "Deleting..." : "Delete"}
</Button> </Button>
</DialogFooter> </DialogFooter>
</DialogContent> </DialogContent>
@@ -3684,24 +3684,24 @@ function MesureViewContent({
); );
} }
export default function MesureView() { export default function MeasureView() {
const { mesureId } = useParams(); const { measureId } = useParams();
const [queryRef, loadQuery] = const [queryRef, loadQuery] =
useQueryLoader<MesureViewQueryType>(mesureViewQuery); useQueryLoader<MeasureViewQueryType>(measureViewQuery);
useEffect(() => { useEffect(() => {
if (mesureId) { if (measureId) {
loadQuery({ mesureId }); loadQuery({ measureId });
} }
}, [mesureId, loadQuery]); }, [measureId, loadQuery]);
if (!queryRef) { if (!queryRef) {
return <MesureViewSkeleton />; return <MeasureViewSkeleton />;
} }
return ( return (
<Suspense fallback={<MesureViewSkeleton />}> <Suspense fallback={<MeasureViewSkeleton />}>
<MesureViewContent queryRef={queryRef} /> <MeasureViewContent queryRef={queryRef} />
</Suspense> </Suspense>
); );
} }

View File

@@ -4,26 +4,26 @@ import { lazy } from "@probo/react-lazy";
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import { ErrorBoundaryWithLocation } from "../ErrorBoundary"; import { ErrorBoundaryWithLocation } from "../ErrorBoundary";
const EditMesureView = lazy(() => import("./EditMesureView")); const NewMeasureView = lazy(() => import("./NewMeasureView"));
export function EditMesureViewSkeleton() { export function NewMeasureViewSkeleton() {
return ( return (
<PageTemplateSkeleton <PageTemplateSkeleton
title="Edit Mesure" title="New Measure"
description="Edit a Mesure. You will be able to link it to control and risks" description="Add a new measure. You will be able to link it to control and risks"
> >
<div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" /> <div className="max-w-2xl aspect-square bg-subtle-bg rounded-xl animate-pulse" />
</PageTemplateSkeleton> </PageTemplateSkeleton>
); );
} }
export function EditMesurePage() { export function NewMeasurePage() {
const location = useLocation(); const location = useLocation();
return ( return (
<Suspense key={location.pathname} fallback={<EditMesureViewSkeleton />}> <Suspense key={location.pathname} fallback={<NewMeasureViewSkeleton />}>
<ErrorBoundaryWithLocation> <ErrorBoundaryWithLocation>
<EditMesureView /> <NewMeasureView />
</ErrorBoundaryWithLocation> </ErrorBoundaryWithLocation>
</Suspense> </Suspense>
); );

View File

@@ -3,20 +3,20 @@ import { ConnectionHandler, graphql, useMutation } from "react-relay";
import { useParams, useNavigate } from "react-router"; import { useParams, useNavigate } from "react-router";
import { PageTemplate } from "@/components/PageTemplate"; import { PageTemplate } from "@/components/PageTemplate";
import { useToast } from "@/hooks/use-toast"; import { useToast } from "@/hooks/use-toast";
import { NewMesureViewCreateMesureMutation } from "./__generated__/NewMesureViewCreateMesureMutation.graphql"; import { NewMeasureViewCreateMeasureMutation } from "./__generated__/NewMeasureViewCreateMeasureMutation.graphql";
import { EditableField } from "@/components/EditableField"; import { EditableField } from "@/components/EditableField";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
const createMesureMutation = graphql` const createMeasureMutation = graphql`
mutation NewMesureViewCreateMesureMutation( mutation NewMeasureViewCreateMeasureMutation(
$input: CreateMesureInput! $input: CreateMeasureInput!
$connections: [ID!]! $connections: [ID!]!
) { ) {
createMesure(input: $input) { createMeasure(input: $input) {
mesureEdge @prependEdge(connections: $connections) { measureEdge @prependEdge(connections: $connections) {
node { node {
id id
name name
@@ -27,7 +27,7 @@ const createMesureMutation = graphql`
} }
`; `;
export default function NewMesureView() { export default function NewMeasureView() {
const { organizationId } = useParams<{ const { organizationId } = useParams<{
organizationId: string; organizationId: string;
}>(); }>();
@@ -40,7 +40,7 @@ export default function NewMesureView() {
}); });
const [commit, isInFlight] = const [commit, isInFlight] =
useMutation<NewMesureViewCreateMesureMutation>(createMesureMutation); useMutation<NewMeasureViewCreateMeasureMutation>(createMeasureMutation);
const handleFieldChange = (field: keyof typeof formData, value: unknown) => { const handleFieldChange = (field: keyof typeof formData, value: unknown) => {
setFormData((prev) => ({ setFormData((prev) => ({
@@ -63,7 +63,7 @@ export default function NewMesureView() {
const connectionId = ConnectionHandler.getConnectionID( const connectionId = ConnectionHandler.getConnectionID(
organizationId!, organizationId!,
"MesureListView_mesures" "MeasureListView_measures"
); );
commit({ commit({
@@ -80,7 +80,7 @@ export default function NewMesureView() {
if (errors) { if (errors) {
toast({ toast({
title: "Error", title: "Error",
description: errors[0]?.message || "Failed to create mesure", description: errors[0]?.message || "Failed to create measure",
variant: "destructive", variant: "destructive",
}); });
return; return;
@@ -88,17 +88,17 @@ export default function NewMesureView() {
toast({ toast({
title: "Success", title: "Success",
description: "Mesure created successfully", description: "Measure created successfully",
}); });
navigate( navigate(
`/organizations/${organizationId}/mesures/${data.createMesure.mesureEdge.node.id}` `/organizations/${organizationId}/measures/${data.createMeasure.measureEdge.node.id}`
); );
}, },
onError(error) { onError(error) {
toast({ toast({
title: "Error", title: "Error",
description: error.message || "Failed to create mesure", description: error.message || "Failed to create measure",
variant: "destructive", variant: "destructive",
}); });
}, },
@@ -107,8 +107,8 @@ export default function NewMesureView() {
return ( return (
<PageTemplate <PageTemplate
title="New Mesure" title="New Measure"
description="Add a new mesure. You will be able to link it to control and risks" description="Add a new measure. You will be able to link it to control and risks"
> >
<Card className="max-w-2xl"> <Card className="max-w-2xl">
<form onSubmit={handleSubmit} className="p-6 space-y-6"> <form onSubmit={handleSubmit} className="p-6 space-y-6">
@@ -125,7 +125,7 @@ export default function NewMesureView() {
onChange={(value) => handleFieldChange("description", value)} onChange={(value) => handleFieldChange("description", value)}
required required
multiline multiline
helpText="Provide a detailed description of the mesure" helpText="Provide a detailed description of the measure"
/> />
<EditableField <EditableField
@@ -140,13 +140,13 @@ export default function NewMesureView() {
type="button" type="button"
variant="outline" variant="outline"
onClick={() => onClick={() =>
navigate(`/organizations/${organizationId}/mesures`) navigate(`/organizations/${organizationId}/measures`)
} }
> >
Cancel Cancel
</Button> </Button>
<Button type="submit" disabled={isInFlight}> <Button type="submit" disabled={isInFlight}>
{isInFlight ? "Creating..." : "Create Mesure"} {isInFlight ? "Creating..." : "Create Measure"}
</Button> </Button>
</div> </div>
</form> </form>

View File

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

View File

@@ -0,0 +1,126 @@
/**
* @generated SignedSource<<baa13bd4048002970217bfb1e8017e05>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type UpdateMeasureInput = {
category?: string | null | undefined;
description?: string | null | undefined;
id: string;
name?: string | null | undefined;
state?: MeasureState | null | undefined;
};
export type EditMeasureViewUpdateMeasureMutation$variables = {
input: UpdateMeasureInput;
};
export type EditMeasureViewUpdateMeasureMutation$data = {
readonly updateMeasure: {
readonly measure: {
readonly description: string;
readonly id: string;
readonly name: string;
};
};
};
export type EditMeasureViewUpdateMeasureMutation = {
response: EditMeasureViewUpdateMeasureMutation$data;
variables: EditMeasureViewUpdateMeasureMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "UpdateMeasurePayload",
"kind": "LinkedField",
"name": "updateMeasure",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Measure",
"kind": "LinkedField",
"name": "measure",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "EditMeasureViewUpdateMeasureMutation",
"selections": (v1/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "EditMeasureViewUpdateMeasureMutation",
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "0d6bab0c03a2c72635e1e42fe69c9551",
"id": null,
"metadata": {},
"name": "EditMeasureViewUpdateMeasureMutation",
"operationKind": "mutation",
"text": "mutation EditMeasureViewUpdateMeasureMutation(\n $input: UpdateMeasureInput!\n) {\n updateMeasure(input: $input) {\n measure {\n id\n name\n description\n }\n }\n}\n"
}
};
})();
(node as any).hash = "1b91ac6890f48a7f536adcba303f1718";
export default node;

View File

@@ -9,10 +9,10 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type EditMesureViewQuery$variables = { export type EditMeasureViewQuery$variables = {
mesureId: string; measureId: string;
}; };
export type EditMesureViewQuery$data = { export type EditMeasureViewQuery$data = {
readonly node: { readonly node: {
readonly category?: string; readonly category?: string;
readonly description?: string; readonly description?: string;
@@ -20,9 +20,9 @@ export type EditMesureViewQuery$data = {
readonly name?: string; readonly name?: string;
}; };
}; };
export type EditMesureViewQuery = { export type EditMeasureViewQuery = {
response: EditMesureViewQuery$data; response: EditMeasureViewQuery$data;
variables: EditMesureViewQuery$variables; variables: EditMeasureViewQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -30,14 +30,14 @@ var v0 = [
{ {
"defaultValue": null, "defaultValue": null,
"kind": "LocalArgument", "kind": "LocalArgument",
"name": "mesureId" "name": "measureId"
} }
], ],
v1 = [ v1 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "id", "name": "id",
"variableName": "mesureId" "variableName": "measureId"
} }
], ],
v2 = { v2 = {
@@ -73,7 +73,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "EditMesureViewQuery", "name": "EditMeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -91,7 +91,7 @@ return {
(v4/*: any*/), (v4/*: any*/),
(v5/*: any*/) (v5/*: any*/)
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -105,7 +105,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "EditMesureViewQuery", "name": "EditMeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -130,7 +130,7 @@ return {
(v4/*: any*/), (v4/*: any*/),
(v5/*: any*/) (v5/*: any*/)
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -142,9 +142,9 @@ return {
"cacheID": "3dbf7d90b0ae49ce617abdf063f6b908", "cacheID": "3dbf7d90b0ae49ce617abdf063f6b908",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "EditMesureViewQuery", "name": "EditMeasureViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query EditMesureViewQuery(\n $mesureId: ID!\n) {\n node(id: $mesureId) {\n __typename\n ... on Mesure {\n id\n name\n description\n category\n }\n id\n }\n}\n" "text": "query EditMeasureViewQuery(\n $measureId: ID!\n) {\n node(id: $measureId) {\n __typename\n ... on Measure {\n id\n name\n description\n category\n }\n id\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,29 +9,29 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type UpdateMesureInput = { export type UpdateMeasureInput = {
category?: string | null | undefined; category?: string | null | undefined;
description?: string | null | undefined; description?: string | null | undefined;
id: string; id: string;
name?: string | null | undefined; name?: string | null | undefined;
state?: MesureState | null | undefined; state?: MeasureState | null | undefined;
}; };
export type EditMesureViewUpdateMesureMutation$variables = { export type EditMeasureViewUpdateMeasureMutation$variables = {
input: UpdateMesureInput; input: UpdateMeasureInput;
}; };
export type EditMesureViewUpdateMesureMutation$data = { export type EditMeasureViewUpdateMeasureMutation$data = {
readonly updateMesure: { readonly updateMeasure: {
readonly mesure: { readonly measure: {
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
}; };
}; };
}; };
export type EditMesureViewUpdateMesureMutation = { export type EditMeasureViewUpdateMeasureMutation = {
response: EditMesureViewUpdateMesureMutation$data; response: EditMeasureViewUpdateMeasureMutation$data;
variables: EditMesureViewUpdateMesureMutation$variables; variables: EditMeasureViewUpdateMeasureMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -52,17 +52,17 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "UpdateMesurePayload", "concreteType": "UpdateMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "updateMesure", "name": "updateMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesure", "name": "measure",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -98,7 +98,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "EditMesureViewUpdateMesureMutation", "name": "EditMeasureViewUpdateMeasureMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -107,16 +107,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "EditMesureViewUpdateMesureMutation", "name": "EditMeasureViewUpdateMeasureMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "ab674147338f145102c150b220578304", "cacheID": "ab674147338f145102c150b220578304",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "EditMesureViewUpdateMesureMutation", "name": "EditMeasureViewUpdateMeasureMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation EditMesureViewUpdateMesureMutation(\n $input: UpdateMesureInput!\n) {\n updateMesure(input: $input) {\n mesure {\n id\n name\n description\n }\n }\n}\n" "text": "mutation EditMeasureViewUpdateMeasureMutation(\n $input: UpdateMeasureInput!\n) {\n updateMeasure(input: $input) {\n measure {\n id\n name\n description\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -0,0 +1,208 @@
/**
* @generated SignedSource<<a93137ce93688a2c3c0986437bf3f4c5>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type ImportMeasureInput = {
file: any;
organizationId: string;
};
export type MeasureListViewImportMeasureMutation$variables = {
connections: ReadonlyArray<string>;
input: ImportMeasureInput;
};
export type MeasureListViewImportMeasureMutation$data = {
readonly importMeasure: {
readonly measureEdges: ReadonlyArray<{
readonly node: {
readonly category: string;
readonly createdAt: string;
readonly description: string;
readonly id: string;
readonly name: string;
readonly state: MeasureState;
readonly updatedAt: string;
};
}>;
};
};
export type MeasureListViewImportMeasureMutation = {
response: MeasureListViewImportMeasureMutation$data;
variables: MeasureListViewImportMeasureMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"concreteType": "MeasureEdge",
"kind": "LinkedField",
"name": "measureEdges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Measure",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureListViewImportMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "ImportMeasurePayload",
"kind": "LinkedField",
"name": "importMeasure",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureListViewImportMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "ImportMeasurePayload",
"kind": "LinkedField",
"name": "importMeasure",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "appendEdge",
"key": "",
"kind": "LinkedHandle",
"name": "measureEdges",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "d257f6fad6ab4c82d2295b7a0342c91b",
"id": null,
"metadata": {},
"name": "MeasureListViewImportMeasureMutation",
"operationKind": "mutation",
"text": "mutation MeasureListViewImportMeasureMutation(\n $input: ImportMeasureInput!\n) {\n importMeasure(input: $input) {\n measureEdges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "6649f536c35390d081835f70d1534847";
export default node;

View File

@@ -0,0 +1,297 @@
/**
* @generated SignedSource<<fcaed74e4a3e71ef452df09877a2b95c>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type MeasureListViewQuery$variables = {
first?: number | null | undefined;
organizationId: string;
};
export type MeasureListViewQuery$data = {
readonly organization: {
readonly id: string;
readonly measures?: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly category: string;
readonly createdAt: string;
readonly description: string;
readonly id: string;
readonly name: string;
readonly state: MeasureState;
readonly updatedAt: string;
};
}>;
};
};
};
export type MeasureListViewQuery = {
response: MeasureListViewQuery$data;
variables: MeasureListViewQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "first"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "organizationId"
},
v2 = [
{
"kind": "Variable",
"name": "id",
"variableName": "organizationId"
}
],
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v4 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v5 = [
{
"alias": null,
"args": null,
"concreteType": "MeasureEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Measure",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"storageKey": null
},
(v4/*: any*/)
],
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
}
],
"storageKey": null
},
{
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
}
],
v6 = [
{
"kind": "Variable",
"name": "first",
"variableName": "first"
}
];
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureListViewQuery",
"selections": [
{
"alias": "organization",
"args": (v2/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v3/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": "measures",
"args": null,
"concreteType": "MeasureConnection",
"kind": "LinkedField",
"name": "__MeasureListView_measures_connection",
"plural": false,
"selections": (v5/*: any*/),
"storageKey": null
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureListViewQuery",
"selections": [
{
"alias": "organization",
"args": (v2/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v4/*: any*/),
(v3/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v6/*: any*/),
"concreteType": "MeasureConnection",
"kind": "LinkedField",
"name": "measures",
"plural": false,
"selections": (v5/*: any*/),
"storageKey": null
},
{
"alias": null,
"args": (v6/*: any*/),
"filters": null,
"handle": "connection",
"key": "MeasureListView_measures",
"kind": "LinkedHandle",
"name": "measures"
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "4d9ad175699f51e62db8923f1dd44ed2",
"id": null,
"metadata": {
"connection": [
{
"count": "first",
"cursor": null,
"direction": "forward",
"path": [
"organization",
"measures"
]
}
]
},
"name": "MeasureListViewQuery",
"operationKind": "query",
"text": "query MeasureListViewQuery(\n $organizationId: ID!\n $first: Int\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n measures(first: $first) {\n edges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "2ad3d938b17d57e015272d4296b41f1f";
export default node;

View File

@@ -0,0 +1,138 @@
/**
* @generated SignedSource<<132e5315003576c357d64d6aaee4b657>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type AssignTaskInput = {
assignedToId: string;
taskId: string;
};
export type MeasureViewAssignTaskMutation$variables = {
input: AssignTaskInput;
};
export type MeasureViewAssignTaskMutation$data = {
readonly assignTask: {
readonly task: {
readonly assignedTo: {
readonly fullName: string;
readonly id: string;
readonly primaryEmailAddress: string;
} | null | undefined;
readonly id: string;
};
};
};
export type MeasureViewAssignTaskMutation = {
response: MeasureViewAssignTaskMutation$data;
variables: MeasureViewAssignTaskMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v2 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "AssignTaskPayload",
"kind": "LinkedField",
"name": "assignTask",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "task",
"plural": false,
"selections": [
(v1/*: any*/),
{
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "assignedTo",
"plural": false,
"selections": [
(v1/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "primaryEmailAddress",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewAssignTaskMutation",
"selections": (v2/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewAssignTaskMutation",
"selections": (v2/*: any*/)
},
"params": {
"cacheID": "ef8536df8f9a92dba371a0f0802d900f",
"id": null,
"metadata": {},
"name": "MeasureViewAssignTaskMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewAssignTaskMutation(\n $input: AssignTaskInput!\n) {\n assignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "47ff4e30fd09d661f7dabfd2289bab17";
export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<aad63785dac93ad7f8db05ee4f219109>> * @generated SignedSource<<441cfaaf785e0628a8c954249ef87bdf>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type CreateControlMesureMappingInput = { export type CreateControlMeasureMappingInput = {
controlId: string; controlId: string;
mesureId: string; measureId: string;
}; };
export type ControlCreateMesureMappingMutation$variables = { export type MeasureViewCreateControlMappingMutation$variables = {
input: CreateControlMesureMappingInput; input: CreateControlMeasureMappingInput;
}; };
export type ControlCreateMesureMappingMutation$data = { export type MeasureViewCreateControlMappingMutation$data = {
readonly createControlMesureMapping: { readonly createControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type ControlCreateMesureMappingMutation = { export type MeasureViewCreateControlMappingMutation = {
response: ControlCreateMesureMappingMutation$data; response: MeasureViewCreateControlMappingMutation$data;
variables: ControlCreateMesureMappingMutation$variables; variables: MeasureViewCreateControlMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "CreateControlMesureMappingPayload", "concreteType": "CreateControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "createControlMesureMapping", "name": "createControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ControlCreateMesureMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,20 +74,20 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ControlCreateMesureMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "589fad9dec58fb2efe52e8e587c8ce85", "cacheID": "ea74e0148d320dbfb79859bb6286427b",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ControlCreateMesureMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation ControlCreateMesureMappingMutation(\n $input: CreateControlMesureMappingInput!\n) {\n createControlMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation MeasureViewCreateControlMappingMutation(\n $input: CreateControlMeasureMappingInput!\n) {\n createControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "8974d4f4025f6e1eaba2a6b30e357486"; (node as any).hash = "dfe964679c82f9c47d418122595989a8";
export default node; export default node;

View File

@@ -0,0 +1,237 @@
/**
* @generated SignedSource<<e5042f900955d846dd86ad6b78d60518>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type EvidenceState = "FULFILLED" | "REQUESTED";
export type EvidenceType = "FILE" | "LINK";
export type CreateEvidenceInput = {
description: string;
file?: any | null | undefined;
name: string;
taskId: string;
type: EvidenceType;
url?: string | null | undefined;
};
export type MeasureViewCreateEvidenceMutation$variables = {
connections: ReadonlyArray<string>;
input: CreateEvidenceInput;
};
export type MeasureViewCreateEvidenceMutation$data = {
readonly createEvidence: {
readonly evidenceEdge: {
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly fileUrl: string | null | undefined;
readonly filename: string;
readonly id: string;
readonly mimeType: string;
readonly size: number;
readonly state: EvidenceState;
readonly type: EvidenceType;
readonly url: string | null | undefined;
};
};
};
};
export type MeasureViewCreateEvidenceMutation = {
response: MeasureViewCreateEvidenceMutation$data;
variables: MeasureViewCreateEvidenceMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"concreteType": "EvidenceEdge",
"kind": "LinkedField",
"name": "evidenceEdge",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Evidence",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "filename",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fileUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "mimeType",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "type",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "url",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "size",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewCreateEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateEvidencePayload",
"kind": "LinkedField",
"name": "createEvidence",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewCreateEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateEvidencePayload",
"kind": "LinkedField",
"name": "createEvidence",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "appendEdge",
"key": "",
"kind": "LinkedHandle",
"name": "evidenceEdge",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "25b9947aa09d7b4c60886f149b06cc6e",
"id": null,
"metadata": {},
"name": "MeasureViewCreateEvidenceMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewCreateEvidenceMutation(\n $input: CreateEvidenceInput!\n) {\n createEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "bc59ec67230776eeb60a389a8360b0af";
export default node;

View File

@@ -0,0 +1,227 @@
/**
* @generated SignedSource<<f037ead461a7a59d39f2e98140e4c72f>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type TaskState = "DONE" | "TODO";
export type CreateTaskInput = {
assignedToId?: string | null | undefined;
description: string;
measureId: string;
name: string;
timeEstimate?: any | null | undefined;
};
export type MeasureViewCreateTaskMutation$variables = {
connections: ReadonlyArray<string>;
input: CreateTaskInput;
};
export type MeasureViewCreateTaskMutation$data = {
readonly createTask: {
readonly taskEdge: {
readonly node: {
readonly assignedTo: {
readonly fullName: string;
readonly id: string;
readonly primaryEmailAddress: string;
} | null | undefined;
readonly description: string;
readonly id: string;
readonly name: string;
readonly state: TaskState;
readonly timeEstimate: any | null | undefined;
};
};
};
};
export type MeasureViewCreateTaskMutation = {
response: MeasureViewCreateTaskMutation$data;
variables: MeasureViewCreateTaskMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v4 = {
"alias": null,
"args": null,
"concreteType": "TaskEdge",
"kind": "LinkedField",
"name": "taskEdge",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "timeEstimate",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "assignedTo",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "primaryEmailAddress",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewCreateTaskMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateTaskPayload",
"kind": "LinkedField",
"name": "createTask",
"plural": false,
"selections": [
(v4/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewCreateTaskMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateTaskPayload",
"kind": "LinkedField",
"name": "createTask",
"plural": false,
"selections": [
(v4/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "prependEdge",
"key": "",
"kind": "LinkedHandle",
"name": "taskEdge",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "53b934e0e7a3d4abf8789ad8672687df",
"id": null,
"metadata": {},
"name": "MeasureViewCreateTaskMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewCreateTaskMutation(\n $input: CreateTaskInput!\n) {\n createTask(input: $input) {\n taskEdge {\n node {\n id\n name\n description\n timeEstimate\n state\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "0df98f5aee4233dc4ffedcff8256891a";
export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<272b7b4a8bc0c81baa4a8d8f3656be0c>> * @generated SignedSource<<9136dd4c154f9e4b2ba8b91316edbf4a>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type DeleteControlMesureMappingInput = { export type DeleteControlMeasureMappingInput = {
controlId: string; controlId: string;
mesureId: string; measureId: string;
}; };
export type ControlDeleteMesureMappingMutation$variables = { export type MeasureViewDeleteControlMappingMutation$variables = {
input: DeleteControlMesureMappingInput; input: DeleteControlMeasureMappingInput;
}; };
export type ControlDeleteMesureMappingMutation$data = { export type MeasureViewDeleteControlMappingMutation$data = {
readonly deleteControlMesureMapping: { readonly deleteControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type ControlDeleteMesureMappingMutation = { export type MeasureViewDeleteControlMappingMutation = {
response: ControlDeleteMesureMappingMutation$data; response: MeasureViewDeleteControlMappingMutation$data;
variables: ControlDeleteMesureMappingMutation$variables; variables: MeasureViewDeleteControlMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "DeleteControlMesureMappingPayload", "concreteType": "DeleteControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "deleteControlMesureMapping", "name": "deleteControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ControlDeleteMesureMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,20 +74,20 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ControlDeleteMesureMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "66b2b12e57f8a150825f0e3f25494093", "cacheID": "8e779137f0502f324968a4c414bff2e6",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ControlDeleteMesureMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation ControlDeleteMesureMappingMutation(\n $input: DeleteControlMesureMappingInput!\n) {\n deleteControlMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation MeasureViewDeleteControlMappingMutation(\n $input: DeleteControlMeasureMappingInput!\n) {\n deleteControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "64e6f03a12a22a87e4893a335e58379b"; (node as any).hash = "7c74e8e787022c1c51fbfc38388445e4";
export default node; export default node;

View File

@@ -0,0 +1,132 @@
/**
* @generated SignedSource<<a930baf9c7542b375151433ec7a0bf90>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type DeleteEvidenceInput = {
evidenceId: string;
};
export type MeasureViewDeleteEvidenceMutation$variables = {
connections: ReadonlyArray<string>;
input: DeleteEvidenceInput;
};
export type MeasureViewDeleteEvidenceMutation$data = {
readonly deleteEvidence: {
readonly deletedEvidenceId: string;
};
};
export type MeasureViewDeleteEvidenceMutation = {
response: MeasureViewDeleteEvidenceMutation$data;
variables: MeasureViewDeleteEvidenceMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "deletedEvidenceId",
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewDeleteEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteEvidencePayload",
"kind": "LinkedField",
"name": "deleteEvidence",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewDeleteEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteEvidencePayload",
"kind": "LinkedField",
"name": "deleteEvidence",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "deleteEdge",
"key": "",
"kind": "ScalarHandle",
"name": "deletedEvidenceId",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "db4b5b4eed57d1361acff9696e8b6667",
"id": null,
"metadata": {},
"name": "MeasureViewDeleteEvidenceMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewDeleteEvidenceMutation(\n $input: DeleteEvidenceInput!\n) {\n deleteEvidence(input: $input) {\n deletedEvidenceId\n }\n}\n"
}
};
})();
(node as any).hash = "4281f93d92eb942cd3d0ebbd05d8bd5d";
export default node;

View File

@@ -0,0 +1,132 @@
/**
* @generated SignedSource<<eabf44008fc79a4bdd03259111bbf097>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type DeleteMeasureInput = {
measureId: string;
};
export type MeasureViewDeleteMeasureMutation$variables = {
connections: ReadonlyArray<string>;
input: DeleteMeasureInput;
};
export type MeasureViewDeleteMeasureMutation$data = {
readonly deleteMeasure: {
readonly deletedMeasureId: string;
};
};
export type MeasureViewDeleteMeasureMutation = {
response: MeasureViewDeleteMeasureMutation$data;
variables: MeasureViewDeleteMeasureMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "deletedMeasureId",
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewDeleteMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteMeasurePayload",
"kind": "LinkedField",
"name": "deleteMeasure",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewDeleteMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteMeasurePayload",
"kind": "LinkedField",
"name": "deleteMeasure",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "deleteEdge",
"key": "",
"kind": "ScalarHandle",
"name": "deletedMeasureId",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "8369c20d01874393d53f4bcb29b43821",
"id": null,
"metadata": {},
"name": "MeasureViewDeleteMeasureMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewDeleteMeasureMutation(\n $input: DeleteMeasureInput!\n) {\n deleteMeasure(input: $input) {\n deletedMeasureId\n }\n}\n"
}
};
})();
(node as any).hash = "e82e708b1d2a39ae3faf6a7be8692b7d";
export default node;

View File

@@ -0,0 +1,132 @@
/**
* @generated SignedSource<<cd8088494f7f5f88d006d90ef72ca8a9>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type DeleteTaskInput = {
taskId: string;
};
export type MeasureViewDeleteTaskMutation$variables = {
connections: ReadonlyArray<string>;
input: DeleteTaskInput;
};
export type MeasureViewDeleteTaskMutation$data = {
readonly deleteTask: {
readonly deletedTaskId: string;
};
};
export type MeasureViewDeleteTaskMutation = {
response: MeasureViewDeleteTaskMutation$data;
variables: MeasureViewDeleteTaskMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "deletedTaskId",
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewDeleteTaskMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteTaskPayload",
"kind": "LinkedField",
"name": "deleteTask",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewDeleteTaskMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "DeleteTaskPayload",
"kind": "LinkedField",
"name": "deleteTask",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "deleteEdge",
"key": "",
"kind": "ScalarHandle",
"name": "deletedTaskId",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "f92703409a953a1fea728aeba622c6d5",
"id": null,
"metadata": {},
"name": "MeasureViewDeleteTaskMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewDeleteTaskMutation(\n $input: DeleteTaskInput!\n) {\n deleteTask(input: $input) {\n deletedTaskId\n }\n}\n"
}
};
})();
(node as any).hash = "dd4f89809cfda8e99ea1a66641c658cb";
export default node;

View File

@@ -0,0 +1,364 @@
/**
* @generated SignedSource<<f3d959452f28259f74fc44f4c1eedcb2>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureViewFrameworksQuery$variables = {
organizationId: string;
};
export type MeasureViewFrameworksQuery$data = {
readonly organization: {
readonly frameworks?: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly controls: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly description: string;
readonly id: string;
readonly name: string;
readonly referenceId: string;
};
}>;
};
readonly id: string;
readonly name: string;
};
}>;
};
readonly id: string;
};
};
export type MeasureViewFrameworksQuery = {
response: MeasureViewFrameworksQuery$data;
variables: MeasureViewFrameworksQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "organizationId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "organizationId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
v4 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v5 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
},
v6 = {
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
},
v7 = [
{
"alias": null,
"args": null,
"concreteType": "ControlEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Control",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "referenceId",
"storageKey": null
},
(v3/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
(v4/*: any*/)
],
"storageKey": null
},
(v5/*: any*/)
],
"storageKey": null
},
(v6/*: any*/)
],
v8 = [
{
"kind": "Literal",
"name": "first",
"value": 100
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewFrameworksQuery",
"selections": [
{
"alias": "organization",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": "frameworks",
"args": null,
"concreteType": "FrameworkConnection",
"kind": "LinkedField",
"name": "__Organization__frameworks_connection",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "FrameworkEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Framework",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
(v3/*: any*/),
{
"alias": "controls",
"args": null,
"concreteType": "ControlConnection",
"kind": "LinkedField",
"name": "__Framework__controls_connection",
"plural": false,
"selections": (v7/*: any*/),
"storageKey": null
},
(v4/*: any*/)
],
"storageKey": null
},
(v5/*: any*/)
],
"storageKey": null
},
(v6/*: any*/)
],
"storageKey": null
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewFrameworksQuery",
"selections": [
{
"alias": "organization",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v4/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v8/*: any*/),
"concreteType": "FrameworkConnection",
"kind": "LinkedField",
"name": "frameworks",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "FrameworkEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Framework",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
(v3/*: any*/),
{
"alias": null,
"args": (v8/*: any*/),
"concreteType": "ControlConnection",
"kind": "LinkedField",
"name": "controls",
"plural": false,
"selections": (v7/*: any*/),
"storageKey": "controls(first:100)"
},
{
"alias": null,
"args": (v8/*: any*/),
"filters": null,
"handle": "connection",
"key": "Framework__controls",
"kind": "LinkedHandle",
"name": "controls"
},
(v4/*: any*/)
],
"storageKey": null
},
(v5/*: any*/)
],
"storageKey": null
},
(v6/*: any*/)
],
"storageKey": "frameworks(first:100)"
},
{
"alias": null,
"args": (v8/*: any*/),
"filters": null,
"handle": "connection",
"key": "Organization__frameworks",
"kind": "LinkedHandle",
"name": "frameworks"
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "f32215939196e9e13f1347b57111f5cb",
"id": null,
"metadata": {
"connection": [
{
"count": null,
"cursor": null,
"direction": "forward",
"path": null
},
{
"count": null,
"cursor": null,
"direction": "forward",
"path": [
"organization",
"frameworks"
]
}
]
},
"name": "MeasureViewFrameworksQuery",
"operationKind": "query",
"text": "query MeasureViewFrameworksQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n frameworks(first: 100) {\n edges {\n node {\n id\n name\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "f1183b14c80a91b160f222af00d49b6f";
export default node;

View File

@@ -0,0 +1,235 @@
/**
* @generated SignedSource<<73ac433b0ba8e4acdf9e0b644ed210ba>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type EvidenceState = "FULFILLED" | "REQUESTED";
export type EvidenceType = "FILE" | "LINK";
export type FulfillEvidenceInput = {
evidenceId: string;
file?: any | null | undefined;
name?: string | null | undefined;
url?: string | null | undefined;
};
export type MeasureViewFulfillEvidenceMutation$variables = {
connections: ReadonlyArray<string>;
input: FulfillEvidenceInput;
};
export type MeasureViewFulfillEvidenceMutation$data = {
readonly fulfillEvidence: {
readonly evidenceEdge: {
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly fileUrl: string | null | undefined;
readonly filename: string;
readonly id: string;
readonly mimeType: string;
readonly size: number;
readonly state: EvidenceState;
readonly type: EvidenceType;
readonly url: string | null | undefined;
};
};
};
};
export type MeasureViewFulfillEvidenceMutation = {
response: MeasureViewFulfillEvidenceMutation$data;
variables: MeasureViewFulfillEvidenceMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"concreteType": "EvidenceEdge",
"kind": "LinkedField",
"name": "evidenceEdge",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Evidence",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "filename",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fileUrl",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "mimeType",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "type",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "url",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "size",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewFulfillEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "FulfillEvidencePayload",
"kind": "LinkedField",
"name": "fulfillEvidence",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "MeasureViewFulfillEvidenceMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "FulfillEvidencePayload",
"kind": "LinkedField",
"name": "fulfillEvidence",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "appendEdge",
"key": "",
"kind": "LinkedHandle",
"name": "evidenceEdge",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "a87965c67907a386e0fe9d72c02e6f69",
"id": null,
"metadata": {},
"name": "MeasureViewFulfillEvidenceMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewFulfillEvidenceMutation(\n $input: FulfillEvidenceInput!\n) {\n fulfillEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "615288332275b30fa96119676fe366e8";
export default node;

View File

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

View File

@@ -0,0 +1,262 @@
/**
* @generated SignedSource<<9b551f9e8f59a5ffe5c00700cdb59c88>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureViewLinkedControlsQuery$variables = {
measureId: string;
};
export type MeasureViewLinkedControlsQuery$data = {
readonly measure: {
readonly controls?: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly description: string;
readonly id: string;
readonly name: string;
readonly referenceId: string;
};
}>;
};
readonly id: string;
};
};
export type MeasureViewLinkedControlsQuery = {
response: MeasureViewLinkedControlsQuery$data;
variables: MeasureViewLinkedControlsQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "measureId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "measureId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v4 = [
{
"alias": null,
"args": null,
"concreteType": "ControlEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Control",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "referenceId",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
(v3/*: any*/)
],
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
}
],
"storageKey": null
},
{
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
}
],
v5 = [
{
"kind": "Literal",
"name": "first",
"value": 100
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewLinkedControlsQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": "controls",
"args": null,
"concreteType": "ControlConnection",
"kind": "LinkedField",
"name": "__MeasureView_controls_connection",
"plural": false,
"selections": (v4/*: any*/),
"storageKey": null
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewLinkedControlsQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v3/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v5/*: any*/),
"concreteType": "ControlConnection",
"kind": "LinkedField",
"name": "controls",
"plural": false,
"selections": (v4/*: any*/),
"storageKey": "controls(first:100)"
},
{
"alias": null,
"args": (v5/*: any*/),
"filters": null,
"handle": "connection",
"key": "MeasureView_controls",
"kind": "LinkedHandle",
"name": "controls"
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "b4f524eea7ce57decf321b7efacdaa03",
"id": null,
"metadata": {
"connection": [
{
"count": null,
"cursor": null,
"direction": "forward",
"path": [
"measure",
"controls"
]
}
]
},
"name": "MeasureViewLinkedControlsQuery",
"operationKind": "query",
"text": "query MeasureViewLinkedControlsQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "5dfd96b1ab2edc5c8c654346046a968f";
export default node;

View File

@@ -0,0 +1,267 @@
/**
* @generated SignedSource<<340108b3d5d790eb9e5cf3caa49c2497>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureViewOrganizationQuery$variables = {
organizationId: string;
};
export type MeasureViewOrganizationQuery$data = {
readonly organization: {
readonly id: string;
readonly peoples?: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly fullName: string;
readonly id: string;
readonly primaryEmailAddress: string;
};
}>;
};
};
};
export type MeasureViewOrganizationQuery = {
response: MeasureViewOrganizationQuery$data;
variables: MeasureViewOrganizationQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "organizationId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "organizationId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"kind": "Literal",
"name": "orderBy",
"value": {
"direction": "ASC",
"field": "FULL_NAME"
}
},
v4 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v5 = [
{
"alias": null,
"args": null,
"concreteType": "PeopleEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "primaryEmailAddress",
"storageKey": null
},
(v4/*: any*/)
],
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
}
],
"storageKey": null
},
{
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
}
],
v6 = [
{
"kind": "Literal",
"name": "first",
"value": 100
},
(v3/*: any*/)
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewOrganizationQuery",
"selections": [
{
"alias": "organization",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": "peoples",
"args": [
(v3/*: any*/)
],
"concreteType": "PeopleConnection",
"kind": "LinkedField",
"name": "__MeasureView_peoples_connection",
"plural": false,
"selections": (v5/*: any*/),
"storageKey": "__MeasureView_peoples_connection(orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})"
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewOrganizationQuery",
"selections": [
{
"alias": "organization",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v4/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v6/*: any*/),
"concreteType": "PeopleConnection",
"kind": "LinkedField",
"name": "peoples",
"plural": false,
"selections": (v5/*: any*/),
"storageKey": "peoples(first:100,orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})"
},
{
"alias": null,
"args": (v6/*: any*/),
"filters": [
"orderBy"
],
"handle": "connection",
"key": "MeasureView_peoples",
"kind": "LinkedHandle",
"name": "peoples"
}
],
"type": "Organization",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "e3e667e3b7336703ac863582368aba65",
"id": null,
"metadata": {
"connection": [
{
"count": null,
"cursor": null,
"direction": "forward",
"path": [
"organization",
"peoples"
]
}
]
},
"name": "MeasureViewOrganizationQuery",
"operationKind": "query",
"text": "query MeasureViewOrganizationQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n peoples(first: 100, orderBy: {direction: ASC, field: FULL_NAME}) {\n edges {\n node {\n id\n fullName\n primaryEmailAddress\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "721e50c0d6835692c77ef891af1561c2";
export default node;

View File

@@ -0,0 +1,508 @@
/**
* @generated SignedSource<<63dbc912431a9ea23a2ce515ba95af86>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type EvidenceState = "FULFILLED" | "REQUESTED";
export type EvidenceType = "FILE" | "LINK";
export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type TaskState = "DONE" | "TODO";
export type MeasureViewQuery$variables = {
measureId: string;
};
export type MeasureViewQuery$data = {
readonly measure: {
readonly category?: string;
readonly description?: string;
readonly id: string;
readonly name?: string;
readonly state?: MeasureState;
readonly tasks?: {
readonly __id: string;
readonly edges: ReadonlyArray<{
readonly node: {
readonly assignedTo: {
readonly fullName: string;
readonly id: string;
readonly primaryEmailAddress: string;
} | null | undefined;
readonly description: string;
readonly evidences: {
readonly __id: string;
readonly edges: ReadonlyArray<{
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly filename: string;
readonly id: string;
readonly mimeType: string;
readonly size: number;
readonly state: EvidenceState;
readonly type: EvidenceType;
readonly url: string | null | undefined;
};
}>;
};
readonly id: string;
readonly name: string;
readonly state: TaskState;
readonly timeEstimate: any | null | undefined;
};
}>;
};
};
};
export type MeasureViewQuery = {
response: MeasureViewQuery$data;
variables: MeasureViewQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "measureId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "measureId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
v4 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
v5 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
v6 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "category",
"storageKey": null
},
v7 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "timeEstimate",
"storageKey": null
},
v8 = {
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "assignedTo",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "primaryEmailAddress",
"storageKey": null
}
],
"storageKey": null
},
v9 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v10 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
},
v11 = {
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
},
v12 = {
"kind": "ClientExtension",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__id",
"storageKey": null
}
]
},
v13 = [
{
"alias": null,
"args": null,
"concreteType": "EvidenceEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Evidence",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "mimeType",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "filename",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "size",
"storageKey": null
},
(v5/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "type",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "url",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
(v4/*: any*/),
(v9/*: any*/)
],
"storageKey": null
},
(v10/*: any*/)
],
"storageKey": null
},
(v11/*: any*/),
(v12/*: any*/)
],
v14 = [
{
"kind": "Literal",
"name": "first",
"value": 100
}
],
v15 = [
{
"kind": "Literal",
"name": "first",
"value": 50
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
(v3/*: any*/),
(v4/*: any*/),
(v5/*: any*/),
(v6/*: any*/),
{
"alias": "tasks",
"args": null,
"concreteType": "TaskConnection",
"kind": "LinkedField",
"name": "__MeasureView_tasks_connection",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "TaskEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
(v3/*: any*/),
(v4/*: any*/),
(v5/*: any*/),
(v7/*: any*/),
(v8/*: any*/),
{
"alias": "evidences",
"args": null,
"concreteType": "EvidenceConnection",
"kind": "LinkedField",
"name": "__MeasureView_evidences_connection",
"plural": false,
"selections": (v13/*: any*/),
"storageKey": null
},
(v9/*: any*/)
],
"storageKey": null
},
(v10/*: any*/)
],
"storageKey": null
},
(v11/*: any*/),
(v12/*: any*/)
],
"storageKey": null
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v9/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
(v3/*: any*/),
(v4/*: any*/),
(v5/*: any*/),
(v6/*: any*/),
{
"alias": null,
"args": (v14/*: any*/),
"concreteType": "TaskConnection",
"kind": "LinkedField",
"name": "tasks",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "TaskEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
(v3/*: any*/),
(v4/*: any*/),
(v5/*: any*/),
(v7/*: any*/),
(v8/*: any*/),
{
"alias": null,
"args": (v15/*: any*/),
"concreteType": "EvidenceConnection",
"kind": "LinkedField",
"name": "evidences",
"plural": false,
"selections": (v13/*: any*/),
"storageKey": "evidences(first:50)"
},
{
"alias": null,
"args": (v15/*: any*/),
"filters": null,
"handle": "connection",
"key": "MeasureView_evidences",
"kind": "LinkedHandle",
"name": "evidences"
},
(v9/*: any*/)
],
"storageKey": null
},
(v10/*: any*/)
],
"storageKey": null
},
(v11/*: any*/),
(v12/*: any*/)
],
"storageKey": "tasks(first:100)"
},
{
"alias": null,
"args": (v14/*: any*/),
"filters": null,
"handle": "connection",
"key": "MeasureView_tasks",
"kind": "LinkedHandle",
"name": "tasks"
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "9c4b0f0032102448259ea5deb2b9d57a",
"id": null,
"metadata": {
"connection": [
{
"count": null,
"cursor": null,
"direction": "forward",
"path": null
},
{
"count": null,
"cursor": null,
"direction": "forward",
"path": [
"measure",
"tasks"
]
}
]
},
"name": "MeasureViewQuery",
"operationKind": "query",
"text": "query MeasureViewQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n name\n description\n state\n category\n tasks(first: 100) {\n edges {\n node {\n id\n name\n description\n state\n timeEstimate\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n evidences(first: 50) {\n edges {\n node {\n id\n mimeType\n filename\n size\n state\n type\n url\n createdAt\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "0de1c02cbaf76feae0ecdbd93f530fa7";
export default node;

View File

@@ -0,0 +1,318 @@
/**
* @generated SignedSource<<f1eccfbde625d131166d0fac7f4613aa>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureViewRisksQuery$variables = {
measureId: string;
};
export type MeasureViewRisksQuery$data = {
readonly measure: {
readonly id: string;
readonly risks?: {
readonly edges: ReadonlyArray<{
readonly node: {
readonly createdAt: string;
readonly description: string;
readonly id: string;
readonly inherentImpact: number;
readonly inherentLikelihood: number;
readonly inherentSeverity: number;
readonly name: string;
readonly residualImpact: number;
readonly residualLikelihood: number;
readonly residualSeverity: number;
readonly updatedAt: string;
};
}>;
};
};
};
export type MeasureViewRisksQuery = {
response: MeasureViewRisksQuery$data;
variables: MeasureViewRisksQuery$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "measureId"
}
],
v1 = [
{
"kind": "Variable",
"name": "id",
"variableName": "measureId"
}
],
v2 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v3 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
v4 = [
{
"alias": null,
"args": null,
"concreteType": "RiskEdge",
"kind": "LinkedField",
"name": "edges",
"plural": true,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Risk",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "inherentLikelihood",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "inherentImpact",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "inherentSeverity",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "residualLikelihood",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "residualImpact",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "residualSeverity",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "createdAt",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "updatedAt",
"storageKey": null
},
(v3/*: any*/)
],
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "cursor",
"storageKey": null
}
],
"storageKey": null
},
{
"alias": null,
"args": null,
"concreteType": "PageInfo",
"kind": "LinkedField",
"name": "pageInfo",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "endCursor",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "hasNextPage",
"storageKey": null
}
],
"storageKey": null
}
],
v5 = [
{
"kind": "Literal",
"name": "first",
"value": 100
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewRisksQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": "risks",
"args": null,
"concreteType": "RiskConnection",
"kind": "LinkedField",
"name": "__MeasureView_risks_connection",
"plural": false,
"selections": (v4/*: any*/),
"storageKey": null
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewRisksQuery",
"selections": [
{
"alias": "measure",
"args": (v1/*: any*/),
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
(v3/*: any*/),
(v2/*: any*/),
{
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": (v5/*: any*/),
"concreteType": "RiskConnection",
"kind": "LinkedField",
"name": "risks",
"plural": false,
"selections": (v4/*: any*/),
"storageKey": "risks(first:100)"
},
{
"alias": null,
"args": (v5/*: any*/),
"filters": null,
"handle": "connection",
"key": "MeasureView_risks",
"kind": "LinkedHandle",
"name": "risks"
}
],
"type": "Measure",
"abstractKey": null
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "e0a3387051cf8312a5ac831f1a9012df",
"id": null,
"metadata": {
"connection": [
{
"count": null,
"cursor": null,
"direction": "forward",
"path": [
"measure",
"risks"
]
}
]
},
"name": "MeasureViewRisksQuery",
"operationKind": "query",
"text": "query MeasureViewRisksQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n risks(first: 100) {\n edges {\n node {\n id\n name\n description\n inherentLikelihood\n inherentImpact\n inherentSeverity\n residualLikelihood\n residualImpact\n residualSeverity\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "22056b7f008dc87a4ad410bacac9a838";
export default node;

View File

@@ -0,0 +1,137 @@
/**
* @generated SignedSource<<681f6e4cd3a8dc325d74472b475df8cf>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type UnassignTaskInput = {
taskId: string;
};
export type MeasureViewUnassignTaskMutation$variables = {
input: UnassignTaskInput;
};
export type MeasureViewUnassignTaskMutation$data = {
readonly unassignTask: {
readonly task: {
readonly assignedTo: {
readonly fullName: string;
readonly id: string;
readonly primaryEmailAddress: string;
} | null | undefined;
readonly id: string;
};
};
};
export type MeasureViewUnassignTaskMutation = {
response: MeasureViewUnassignTaskMutation$data;
variables: MeasureViewUnassignTaskMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = {
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
v2 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "UnassignTaskPayload",
"kind": "LinkedField",
"name": "unassignTask",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "task",
"plural": false,
"selections": [
(v1/*: any*/),
{
"alias": null,
"args": null,
"concreteType": "People",
"kind": "LinkedField",
"name": "assignedTo",
"plural": false,
"selections": [
(v1/*: any*/),
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "fullName",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "primaryEmailAddress",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewUnassignTaskMutation",
"selections": (v2/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewUnassignTaskMutation",
"selections": (v2/*: any*/)
},
"params": {
"cacheID": "656f852f9ff5fa12a239a31652369278",
"id": null,
"metadata": {},
"name": "MeasureViewUnassignTaskMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewUnassignTaskMutation(\n $input: UnassignTaskInput!\n) {\n unassignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "66c29432bc00748955eb5793105ff03b";
export default node;

View File

@@ -0,0 +1,118 @@
/**
* @generated SignedSource<<5c3c644d4844322b34c5fbee967880a8>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type UpdateMeasureInput = {
category?: string | null | undefined;
description?: string | null | undefined;
id: string;
name?: string | null | undefined;
state?: MeasureState | null | undefined;
};
export type MeasureViewUpdateMeasureStateMutation$variables = {
input: UpdateMeasureInput;
};
export type MeasureViewUpdateMeasureStateMutation$data = {
readonly updateMeasure: {
readonly measure: {
readonly id: string;
readonly state: MeasureState;
};
};
};
export type MeasureViewUpdateMeasureStateMutation = {
response: MeasureViewUpdateMeasureStateMutation$data;
variables: MeasureViewUpdateMeasureStateMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "UpdateMeasurePayload",
"kind": "LinkedField",
"name": "updateMeasure",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Measure",
"kind": "LinkedField",
"name": "measure",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewUpdateMeasureStateMutation",
"selections": (v1/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewUpdateMeasureStateMutation",
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "0b67944fab3e9ae13f437aeee2b28c5b",
"id": null,
"metadata": {},
"name": "MeasureViewUpdateMeasureStateMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewUpdateMeasureStateMutation(\n $input: UpdateMeasureInput!\n) {\n updateMeasure(input: $input) {\n measure {\n id\n state\n }\n }\n}\n"
}
};
})();
(node as any).hash = "d89e0bc25930592a1f723bbbdb3c43b8";
export default node;

View File

@@ -0,0 +1,126 @@
/**
* @generated SignedSource<<1595fa9771d6baa14534b181f4a1384a>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type TaskState = "DONE" | "TODO";
export type UpdateTaskInput = {
description?: string | null | undefined;
name?: string | null | undefined;
state?: TaskState | null | undefined;
taskId: string;
timeEstimate?: any | null | undefined;
};
export type MeasureViewUpdateTaskStateMutation$variables = {
input: UpdateTaskInput;
};
export type MeasureViewUpdateTaskStateMutation$data = {
readonly updateTask: {
readonly task: {
readonly id: string;
readonly state: TaskState;
readonly timeEstimate: any | null | undefined;
};
};
};
export type MeasureViewUpdateTaskStateMutation = {
response: MeasureViewUpdateTaskStateMutation$data;
variables: MeasureViewUpdateTaskStateMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "UpdateTaskPayload",
"kind": "LinkedField",
"name": "updateTask",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Task",
"kind": "LinkedField",
"name": "task",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "state",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "timeEstimate",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "MeasureViewUpdateTaskStateMutation",
"selections": (v1/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "MeasureViewUpdateTaskStateMutation",
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "f545a0b12edb8f231a1a7a7c38b6e905",
"id": null,
"metadata": {},
"name": "MeasureViewUpdateTaskStateMutation",
"operationKind": "mutation",
"text": "mutation MeasureViewUpdateTaskStateMutation(\n $input: UpdateTaskInput!\n) {\n updateTask(input: $input) {\n task {\n id\n state\n timeEstimate\n }\n }\n}\n"
}
};
})();
(node as any).hash = "e1d67c030523e56d6bcd595c27fcb3dc";
export default node;

View File

@@ -9,33 +9,33 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type ImportMesureInput = { export type ImportMeasureInput = {
file: any; file: any;
organizationId: string; organizationId: string;
}; };
export type MesureListViewImportMesureMutation$variables = { export type MeasureListViewImportMeasureMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: ImportMesureInput; input: ImportMeasureInput;
}; };
export type MesureListViewImportMesureMutation$data = { export type MeasureListViewImportMeasureMutation$data = {
readonly importMesure: { readonly importMeasure: {
readonly mesureEdges: ReadonlyArray<{ readonly measureEdges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
readonly createdAt: string; readonly createdAt: string;
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
readonly updatedAt: string; readonly updatedAt: string;
}; };
}>; }>;
}; };
}; };
export type MesureListViewImportMesureMutation = { export type MeasureListViewImportMeasureMutation = {
response: MesureListViewImportMesureMutation$data; response: MeasureListViewImportMeasureMutation$data;
variables: MesureListViewImportMesureMutation$variables; variables: MeasureListViewImportMeasureMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -59,15 +59,15 @@ v2 = [
v3 = { v3 = {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesureEdges", "name": "measureEdges",
"plural": true, "plural": true,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -135,14 +135,14 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureListViewImportMesureMutation", "name": "MeasureListViewImportMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "ImportMesurePayload", "concreteType": "ImportMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "importMesure", "name": "importMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/) (v3/*: any*/)
@@ -160,14 +160,14 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureListViewImportMesureMutation", "name": "MeasureListViewImportMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "ImportMesurePayload", "concreteType": "ImportMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "importMesure", "name": "importMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/), (v3/*: any*/),
@@ -178,7 +178,7 @@ return {
"handle": "appendEdge", "handle": "appendEdge",
"key": "", "key": "",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesureEdges", "name": "measureEdges",
"handleArgs": [ "handleArgs": [
{ {
"kind": "Variable", "kind": "Variable",
@@ -196,9 +196,9 @@ return {
"cacheID": "8cf2772dcac48b487c892d2b68a3bb51", "cacheID": "8cf2772dcac48b487c892d2b68a3bb51",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureListViewImportMesureMutation", "name": "MeasureListViewImportMeasureMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureListViewImportMesureMutation(\n $input: ImportMesureInput!\n) {\n importMesure(input: $input) {\n mesureEdges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n }\n }\n }\n}\n" "text": "mutation MeasureListViewImportMeasureMutation(\n $input: ImportMeasureInput!\n) {\n importMeasure(input: $input) {\n measureEdges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,15 +9,15 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type MesureListViewQuery$variables = { export type MeasureListViewQuery$variables = {
first?: number | null | undefined; first?: number | null | undefined;
organizationId: string; organizationId: string;
}; };
export type MesureListViewQuery$data = { export type MeasureListViewQuery$data = {
readonly organization: { readonly organization: {
readonly id: string; readonly id: string;
readonly mesures?: { readonly measures?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
@@ -25,16 +25,16 @@ export type MesureListViewQuery$data = {
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
readonly updatedAt: string; readonly updatedAt: string;
}; };
}>; }>;
}; };
}; };
}; };
export type MesureListViewQuery = { export type MeasureListViewQuery = {
response: MesureListViewQuery$data; response: MeasureListViewQuery$data;
variables: MesureListViewQuery$variables; variables: MeasureListViewQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -73,7 +73,7 @@ v5 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -81,7 +81,7 @@ v5 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -184,7 +184,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureListViewQuery", "name": "MeasureListViewQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -199,11 +199,11 @@ return {
"kind": "InlineFragment", "kind": "InlineFragment",
"selections": [ "selections": [
{ {
"alias": "mesures", "alias": "measures",
"args": null, "args": null,
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureListView_mesures_connection", "name": "__MeasureListView_measures_connection",
"plural": false, "plural": false,
"selections": (v5/*: any*/), "selections": (v5/*: any*/),
"storageKey": null "storageKey": null
@@ -226,7 +226,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureListViewQuery", "name": "MeasureListViewQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -244,9 +244,9 @@ return {
{ {
"alias": null, "alias": null,
"args": (v6/*: any*/), "args": (v6/*: any*/),
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": (v5/*: any*/), "selections": (v5/*: any*/),
"storageKey": null "storageKey": null
@@ -256,9 +256,9 @@ return {
"args": (v6/*: any*/), "args": (v6/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "MesureListView_mesures", "key": "MeasureListView_measures",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesures" "name": "measures"
} }
], ],
"type": "Organization", "type": "Organization",
@@ -280,14 +280,14 @@ return {
"direction": "forward", "direction": "forward",
"path": [ "path": [
"organization", "organization",
"mesures" "measures"
] ]
} }
] ]
}, },
"name": "MesureListViewQuery", "name": "MeasureListViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureListViewQuery(\n $organizationId: ID!\n $first: Int\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n mesures(first: $first) {\n edges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureListViewQuery(\n $organizationId: ID!\n $first: Int\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n measures(first: $first) {\n edges {\n node {\n id\n name\n description\n category\n state\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -13,10 +13,10 @@ export type AssignTaskInput = {
assignedToId: string; assignedToId: string;
taskId: string; taskId: string;
}; };
export type MesureViewAssignTaskMutation$variables = { export type MeasureViewAssignTaskMutation$variables = {
input: AssignTaskInput; input: AssignTaskInput;
}; };
export type MesureViewAssignTaskMutation$data = { export type MeasureViewAssignTaskMutation$data = {
readonly assignTask: { readonly assignTask: {
readonly task: { readonly task: {
readonly assignedTo: { readonly assignedTo: {
@@ -28,9 +28,9 @@ export type MesureViewAssignTaskMutation$data = {
}; };
}; };
}; };
export type MesureViewAssignTaskMutation = { export type MeasureViewAssignTaskMutation = {
response: MesureViewAssignTaskMutation$data; response: MeasureViewAssignTaskMutation$data;
variables: MesureViewAssignTaskMutation$variables; variables: MeasureViewAssignTaskMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -110,7 +110,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewAssignTaskMutation", "name": "MeasureViewAssignTaskMutation",
"selections": (v2/*: any*/), "selections": (v2/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -119,16 +119,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewAssignTaskMutation", "name": "MeasureViewAssignTaskMutation",
"selections": (v2/*: any*/) "selections": (v2/*: any*/)
}, },
"params": { "params": {
"cacheID": "6d3f95b9e223f40d7e333b951193abcc", "cacheID": "6d3f95b9e223f40d7e333b951193abcc",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewAssignTaskMutation", "name": "MeasureViewAssignTaskMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewAssignTaskMutation(\n $input: AssignTaskInput!\n) {\n assignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n" "text": "mutation MeasureViewAssignTaskMutation(\n $input: AssignTaskInput!\n) {\n assignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type CreateControlMesureMappingInput = { export type CreateControlMeasureMappingInput = {
controlId: string; controlId: string;
mesureId: string; measureId: string;
}; };
export type MesureViewCreateControlMappingMutation$variables = { export type MeasureViewCreateControlMappingMutation$variables = {
input: CreateControlMesureMappingInput; input: CreateControlMeasureMappingInput;
}; };
export type MesureViewCreateControlMappingMutation$data = { export type MeasureViewCreateControlMappingMutation$data = {
readonly createControlMesureMapping: { readonly createControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type MesureViewCreateControlMappingMutation = { export type MeasureViewCreateControlMappingMutation = {
response: MesureViewCreateControlMappingMutation$data; response: MeasureViewCreateControlMappingMutation$data;
variables: MesureViewCreateControlMappingMutation$variables; variables: MeasureViewCreateControlMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "CreateControlMesureMappingPayload", "concreteType": "CreateControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "createControlMesureMapping", "name": "createControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewCreateControlMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,16 +74,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewCreateControlMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "78c1205d1a787ee2cc4e1173e3ef463f", "cacheID": "78c1205d1a787ee2cc4e1173e3ef463f",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewCreateControlMappingMutation", "name": "MeasureViewCreateControlMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewCreateControlMappingMutation(\n $input: CreateControlMesureMappingInput!\n) {\n createControlMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation MeasureViewCreateControlMappingMutation(\n $input: CreateControlMeasureMappingInput!\n) {\n createControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -19,11 +19,11 @@ export type CreateEvidenceInput = {
type: EvidenceType; type: EvidenceType;
url?: string | null | undefined; url?: string | null | undefined;
}; };
export type MesureViewCreateEvidenceMutation$variables = { export type MeasureViewCreateEvidenceMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: CreateEvidenceInput; input: CreateEvidenceInput;
}; };
export type MesureViewCreateEvidenceMutation$data = { export type MeasureViewCreateEvidenceMutation$data = {
readonly createEvidence: { readonly createEvidence: {
readonly evidenceEdge: { readonly evidenceEdge: {
readonly node: { readonly node: {
@@ -41,9 +41,9 @@ export type MesureViewCreateEvidenceMutation$data = {
}; };
}; };
}; };
export type MesureViewCreateEvidenceMutation = { export type MeasureViewCreateEvidenceMutation = {
response: MesureViewCreateEvidenceMutation$data; response: MeasureViewCreateEvidenceMutation$data;
variables: MesureViewCreateEvidenceMutation$variables; variables: MeasureViewCreateEvidenceMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -164,7 +164,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewCreateEvidenceMutation", "name": "MeasureViewCreateEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -189,7 +189,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewCreateEvidenceMutation", "name": "MeasureViewCreateEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -225,9 +225,9 @@ return {
"cacheID": "550cd90cddee628ec42ebd53ac749af0", "cacheID": "550cd90cddee628ec42ebd53ac749af0",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewCreateEvidenceMutation", "name": "MeasureViewCreateEvidenceMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewCreateEvidenceMutation(\n $input: CreateEvidenceInput!\n) {\n createEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n" "text": "mutation MeasureViewCreateEvidenceMutation(\n $input: CreateEvidenceInput!\n) {\n createEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -13,15 +13,15 @@ export type TaskState = "DONE" | "TODO";
export type CreateTaskInput = { export type CreateTaskInput = {
assignedToId?: string | null | undefined; assignedToId?: string | null | undefined;
description: string; description: string;
mesureId: string; measureId: string;
name: string; name: string;
timeEstimate?: any | null | undefined; timeEstimate?: any | null | undefined;
}; };
export type MesureViewCreateTaskMutation$variables = { export type MeasureViewCreateTaskMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: CreateTaskInput; input: CreateTaskInput;
}; };
export type MesureViewCreateTaskMutation$data = { export type MeasureViewCreateTaskMutation$data = {
readonly createTask: { readonly createTask: {
readonly taskEdge: { readonly taskEdge: {
readonly node: { readonly node: {
@@ -39,9 +39,9 @@ export type MesureViewCreateTaskMutation$data = {
}; };
}; };
}; };
export type MesureViewCreateTaskMutation = { export type MeasureViewCreateTaskMutation = {
response: MesureViewCreateTaskMutation$data; response: MeasureViewCreateTaskMutation$data;
variables: MesureViewCreateTaskMutation$variables; variables: MeasureViewCreateTaskMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -154,7 +154,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewCreateTaskMutation", "name": "MeasureViewCreateTaskMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -179,7 +179,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewCreateTaskMutation", "name": "MeasureViewCreateTaskMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -215,9 +215,9 @@ return {
"cacheID": "453cd7da016798ce86c012c9d1cf29f1", "cacheID": "453cd7da016798ce86c012c9d1cf29f1",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewCreateTaskMutation", "name": "MeasureViewCreateTaskMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewCreateTaskMutation(\n $input: CreateTaskInput!\n) {\n createTask(input: $input) {\n taskEdge {\n node {\n id\n name\n description\n timeEstimate\n state\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n }\n}\n" "text": "mutation MeasureViewCreateTaskMutation(\n $input: CreateTaskInput!\n) {\n createTask(input: $input) {\n taskEdge {\n node {\n id\n name\n description\n timeEstimate\n state\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type DeleteControlMesureMappingInput = { export type DeleteControlMeasureMappingInput = {
controlId: string; controlId: string;
mesureId: string; measureId: string;
}; };
export type MesureViewDeleteControlMappingMutation$variables = { export type MeasureViewDeleteControlMappingMutation$variables = {
input: DeleteControlMesureMappingInput; input: DeleteControlMeasureMappingInput;
}; };
export type MesureViewDeleteControlMappingMutation$data = { export type MeasureViewDeleteControlMappingMutation$data = {
readonly deleteControlMesureMapping: { readonly deleteControlMeasureMapping: {
readonly success: boolean; readonly success: boolean;
}; };
}; };
export type MesureViewDeleteControlMappingMutation = { export type MeasureViewDeleteControlMappingMutation = {
response: MesureViewDeleteControlMappingMutation$data; response: MeasureViewDeleteControlMappingMutation$data;
variables: MesureViewDeleteControlMappingMutation$variables; variables: MeasureViewDeleteControlMappingMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,9 +44,9 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "DeleteControlMesureMappingPayload", "concreteType": "DeleteControlMeasureMappingPayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "deleteControlMesureMapping", "name": "deleteControlMeasureMapping",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -65,7 +65,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewDeleteControlMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -74,16 +74,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewDeleteControlMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "5293df3ec3b7a9c5dab1ae7c41177186", "cacheID": "5293df3ec3b7a9c5dab1ae7c41177186",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewDeleteControlMappingMutation", "name": "MeasureViewDeleteControlMappingMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewDeleteControlMappingMutation(\n $input: DeleteControlMesureMappingInput!\n) {\n deleteControlMesureMapping(input: $input) {\n success\n }\n}\n" "text": "mutation MeasureViewDeleteControlMappingMutation(\n $input: DeleteControlMeasureMappingInput!\n) {\n deleteControlMeasureMapping(input: $input) {\n success\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -12,18 +12,18 @@ import { ConcreteRequest } from 'relay-runtime';
export type DeleteEvidenceInput = { export type DeleteEvidenceInput = {
evidenceId: string; evidenceId: string;
}; };
export type MesureViewDeleteEvidenceMutation$variables = { export type MeasureViewDeleteEvidenceMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: DeleteEvidenceInput; input: DeleteEvidenceInput;
}; };
export type MesureViewDeleteEvidenceMutation$data = { export type MeasureViewDeleteEvidenceMutation$data = {
readonly deleteEvidence: { readonly deleteEvidence: {
readonly deletedEvidenceId: string; readonly deletedEvidenceId: string;
}; };
}; };
export type MesureViewDeleteEvidenceMutation = { export type MeasureViewDeleteEvidenceMutation = {
response: MesureViewDeleteEvidenceMutation$data; response: MeasureViewDeleteEvidenceMutation$data;
variables: MesureViewDeleteEvidenceMutation$variables; variables: MeasureViewDeleteEvidenceMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -59,7 +59,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewDeleteEvidenceMutation", "name": "MeasureViewDeleteEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -84,7 +84,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewDeleteEvidenceMutation", "name": "MeasureViewDeleteEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -120,9 +120,9 @@ return {
"cacheID": "26fbd71aca06943318c6154a0079d6d7", "cacheID": "26fbd71aca06943318c6154a0079d6d7",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewDeleteEvidenceMutation", "name": "MeasureViewDeleteEvidenceMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewDeleteEvidenceMutation(\n $input: DeleteEvidenceInput!\n) {\n deleteEvidence(input: $input) {\n deletedEvidenceId\n }\n}\n" "text": "mutation MeasureViewDeleteEvidenceMutation(\n $input: DeleteEvidenceInput!\n) {\n deleteEvidence(input: $input) {\n deletedEvidenceId\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,21 +9,21 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type DeleteMesureInput = { export type DeleteMeasureInput = {
mesureId: string; measureId: string;
}; };
export type MesureViewDeleteMesureMutation$variables = { export type MeasureViewDeleteMeasureMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: DeleteMesureInput; input: DeleteMeasureInput;
}; };
export type MesureViewDeleteMesureMutation$data = { export type MeasureViewDeleteMeasureMutation$data = {
readonly deleteMesure: { readonly deleteMeasure: {
readonly deletedMesureId: string; readonly deletedMeasureId: string;
}; };
}; };
export type MesureViewDeleteMesureMutation = { export type MeasureViewDeleteMeasureMutation = {
response: MesureViewDeleteMesureMutation$data; response: MeasureViewDeleteMeasureMutation$data;
variables: MesureViewDeleteMesureMutation$variables; variables: MeasureViewDeleteMeasureMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -48,7 +48,7 @@ v3 = {
"alias": null, "alias": null,
"args": null, "args": null,
"kind": "ScalarField", "kind": "ScalarField",
"name": "deletedMesureId", "name": "deletedMeasureId",
"storageKey": null "storageKey": null
}; };
return { return {
@@ -59,14 +59,14 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewDeleteMesureMutation", "name": "MeasureViewDeleteMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "DeleteMesurePayload", "concreteType": "DeleteMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "deleteMesure", "name": "deleteMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/) (v3/*: any*/)
@@ -84,14 +84,14 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewDeleteMesureMutation", "name": "MeasureViewDeleteMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "DeleteMesurePayload", "concreteType": "DeleteMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "deleteMesure", "name": "deleteMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/), (v3/*: any*/),
@@ -102,7 +102,7 @@ return {
"handle": "deleteEdge", "handle": "deleteEdge",
"key": "", "key": "",
"kind": "ScalarHandle", "kind": "ScalarHandle",
"name": "deletedMesureId", "name": "deletedMeasureId",
"handleArgs": [ "handleArgs": [
{ {
"kind": "Variable", "kind": "Variable",
@@ -120,9 +120,9 @@ return {
"cacheID": "075b3e2d23906985e70fa5ccd3b623c7", "cacheID": "075b3e2d23906985e70fa5ccd3b623c7",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewDeleteMesureMutation", "name": "MeasureViewDeleteMeasureMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewDeleteMesureMutation(\n $input: DeleteMesureInput!\n) {\n deleteMesure(input: $input) {\n deletedMesureId\n }\n}\n" "text": "mutation MeasureViewDeleteMeasureMutation(\n $input: DeleteMeasureInput!\n) {\n deleteMeasure(input: $input) {\n deletedMeasureId\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -12,18 +12,18 @@ import { ConcreteRequest } from 'relay-runtime';
export type DeleteTaskInput = { export type DeleteTaskInput = {
taskId: string; taskId: string;
}; };
export type MesureViewDeleteTaskMutation$variables = { export type MeasureViewDeleteTaskMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: DeleteTaskInput; input: DeleteTaskInput;
}; };
export type MesureViewDeleteTaskMutation$data = { export type MeasureViewDeleteTaskMutation$data = {
readonly deleteTask: { readonly deleteTask: {
readonly deletedTaskId: string; readonly deletedTaskId: string;
}; };
}; };
export type MesureViewDeleteTaskMutation = { export type MeasureViewDeleteTaskMutation = {
response: MesureViewDeleteTaskMutation$data; response: MeasureViewDeleteTaskMutation$data;
variables: MesureViewDeleteTaskMutation$variables; variables: MeasureViewDeleteTaskMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -59,7 +59,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewDeleteTaskMutation", "name": "MeasureViewDeleteTaskMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -84,7 +84,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewDeleteTaskMutation", "name": "MeasureViewDeleteTaskMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -120,9 +120,9 @@ return {
"cacheID": "a5096acddc7796fbc89521cc80b5538e", "cacheID": "a5096acddc7796fbc89521cc80b5538e",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewDeleteTaskMutation", "name": "MeasureViewDeleteTaskMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewDeleteTaskMutation(\n $input: DeleteTaskInput!\n) {\n deleteTask(input: $input) {\n deletedTaskId\n }\n}\n" "text": "mutation MeasureViewDeleteTaskMutation(\n $input: DeleteTaskInput!\n) {\n deleteTask(input: $input) {\n deletedTaskId\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,10 +9,10 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureViewFrameworksQuery$variables = { export type MeasureViewFrameworksQuery$variables = {
organizationId: string; organizationId: string;
}; };
export type MesureViewFrameworksQuery$data = { export type MeasureViewFrameworksQuery$data = {
readonly organization: { readonly organization: {
readonly frameworks?: { readonly frameworks?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
@@ -35,9 +35,9 @@ export type MesureViewFrameworksQuery$data = {
readonly id: string; readonly id: string;
}; };
}; };
export type MesureViewFrameworksQuery = { export type MeasureViewFrameworksQuery = {
response: MesureViewFrameworksQuery$data; response: MeasureViewFrameworksQuery$data;
variables: MesureViewFrameworksQuery$variables; variables: MeasureViewFrameworksQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -163,7 +163,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewFrameworksQuery", "name": "MeasureViewFrameworksQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -240,7 +240,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewFrameworksQuery", "name": "MeasureViewFrameworksQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -352,9 +352,9 @@ return {
} }
] ]
}, },
"name": "MesureViewFrameworksQuery", "name": "MeasureViewFrameworksQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewFrameworksQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n frameworks(first: 100) {\n edges {\n node {\n id\n name\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureViewFrameworksQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n frameworks(first: 100) {\n edges {\n node {\n id\n name\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -17,11 +17,11 @@ export type FulfillEvidenceInput = {
name?: string | null | undefined; name?: string | null | undefined;
url?: string | null | undefined; url?: string | null | undefined;
}; };
export type MesureViewFulfillEvidenceMutation$variables = { export type MeasureViewFulfillEvidenceMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: FulfillEvidenceInput; input: FulfillEvidenceInput;
}; };
export type MesureViewFulfillEvidenceMutation$data = { export type MeasureViewFulfillEvidenceMutation$data = {
readonly fulfillEvidence: { readonly fulfillEvidence: {
readonly evidenceEdge: { readonly evidenceEdge: {
readonly node: { readonly node: {
@@ -39,9 +39,9 @@ export type MesureViewFulfillEvidenceMutation$data = {
}; };
}; };
}; };
export type MesureViewFulfillEvidenceMutation = { export type MeasureViewFulfillEvidenceMutation = {
response: MesureViewFulfillEvidenceMutation$data; response: MeasureViewFulfillEvidenceMutation$data;
variables: MesureViewFulfillEvidenceMutation$variables; variables: MeasureViewFulfillEvidenceMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -162,7 +162,7 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewFulfillEvidenceMutation", "name": "MeasureViewFulfillEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -187,7 +187,7 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "MesureViewFulfillEvidenceMutation", "name": "MeasureViewFulfillEvidenceMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -223,9 +223,9 @@ return {
"cacheID": "605c054b1e501d03ded168635513d859", "cacheID": "605c054b1e501d03ded168635513d859",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewFulfillEvidenceMutation", "name": "MeasureViewFulfillEvidenceMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewFulfillEvidenceMutation(\n $input: FulfillEvidenceInput!\n) {\n fulfillEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n" "text": "mutation MeasureViewFulfillEvidenceMutation(\n $input: FulfillEvidenceInput!\n) {\n fulfillEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n description\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,18 +9,18 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureViewGetEvidenceFileUrlQuery$variables = { export type MeasureViewGetEvidenceFileUrlQuery$variables = {
evidenceId: string; evidenceId: string;
}; };
export type MesureViewGetEvidenceFileUrlQuery$data = { export type MeasureViewGetEvidenceFileUrlQuery$data = {
readonly node: { readonly node: {
readonly fileUrl?: string | null | undefined; readonly fileUrl?: string | null | undefined;
readonly id?: string; readonly id?: string;
}; };
}; };
export type MesureViewGetEvidenceFileUrlQuery = { export type MeasureViewGetEvidenceFileUrlQuery = {
response: MesureViewGetEvidenceFileUrlQuery$data; response: MeasureViewGetEvidenceFileUrlQuery$data;
variables: MesureViewGetEvidenceFileUrlQuery$variables; variables: MeasureViewGetEvidenceFileUrlQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -57,7 +57,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewGetEvidenceFileUrlQuery", "name": "MeasureViewGetEvidenceFileUrlQuery",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -87,7 +87,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewGetEvidenceFileUrlQuery", "name": "MeasureViewGetEvidenceFileUrlQuery",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
@@ -122,9 +122,9 @@ return {
"cacheID": "05edf89cc90a90e1a96bd02f8448b629", "cacheID": "05edf89cc90a90e1a96bd02f8448b629",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewGetEvidenceFileUrlQuery", "name": "MeasureViewGetEvidenceFileUrlQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewGetEvidenceFileUrlQuery(\n $evidenceId: ID!\n) {\n node(id: $evidenceId) {\n __typename\n ... on Evidence {\n id\n fileUrl\n }\n id\n }\n}\n" "text": "query MeasureViewGetEvidenceFileUrlQuery(\n $evidenceId: ID!\n) {\n node(id: $evidenceId) {\n __typename\n ... on Evidence {\n id\n fileUrl\n }\n id\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,11 +9,11 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureViewLinkedControlsQuery$variables = { export type MeasureViewLinkedControlsQuery$variables = {
mesureId: string; measureId: string;
}; };
export type MesureViewLinkedControlsQuery$data = { export type MeasureViewLinkedControlsQuery$data = {
readonly mesure: { readonly measure: {
readonly controls?: { readonly controls?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
@@ -27,9 +27,9 @@ export type MesureViewLinkedControlsQuery$data = {
readonly id: string; readonly id: string;
}; };
}; };
export type MesureViewLinkedControlsQuery = { export type MeasureViewLinkedControlsQuery = {
response: MesureViewLinkedControlsQuery$data; response: MeasureViewLinkedControlsQuery$data;
variables: MesureViewLinkedControlsQuery$variables; variables: MeasureViewLinkedControlsQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -37,14 +37,14 @@ var v0 = [
{ {
"defaultValue": null, "defaultValue": null,
"kind": "LocalArgument", "kind": "LocalArgument",
"name": "mesureId" "name": "measureId"
} }
], ],
v1 = [ v1 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "id", "name": "id",
"variableName": "mesureId" "variableName": "measureId"
} }
], ],
v2 = { v2 = {
@@ -152,10 +152,10 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewLinkedControlsQuery", "name": "MeasureViewLinkedControlsQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -171,13 +171,13 @@ return {
"args": null, "args": null,
"concreteType": "ControlConnection", "concreteType": "ControlConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureView_controls_connection", "name": "__MeasureView_controls_connection",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": null "storageKey": null
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -191,10 +191,10 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewLinkedControlsQuery", "name": "MeasureViewLinkedControlsQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -221,12 +221,12 @@ return {
"args": (v5/*: any*/), "args": (v5/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "MesureView_controls", "key": "MeasureView_controls",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "controls" "name": "controls"
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -244,15 +244,15 @@ return {
"cursor": null, "cursor": null,
"direction": "forward", "direction": "forward",
"path": [ "path": [
"mesure", "measure",
"controls" "controls"
] ]
} }
] ]
}, },
"name": "MesureViewLinkedControlsQuery", "name": "MeasureViewLinkedControlsQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewLinkedControlsQuery(\n $mesureId: ID!\n) {\n mesure: node(id: $mesureId) {\n __typename\n id\n ... on Mesure {\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureViewLinkedControlsQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,10 +9,10 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureViewOrganizationQuery$variables = { export type MeasureViewOrganizationQuery$variables = {
organizationId: string; organizationId: string;
}; };
export type MesureViewOrganizationQuery$data = { export type MeasureViewOrganizationQuery$data = {
readonly organization: { readonly organization: {
readonly id: string; readonly id: string;
readonly peoples?: { readonly peoples?: {
@@ -26,9 +26,9 @@ export type MesureViewOrganizationQuery$data = {
}; };
}; };
}; };
export type MesureViewOrganizationQuery = { export type MeasureViewOrganizationQuery = {
response: MesureViewOrganizationQuery$data; response: MeasureViewOrganizationQuery$data;
variables: MesureViewOrganizationQuery$variables; variables: MeasureViewOrganizationQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -153,7 +153,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewOrganizationQuery", "name": "MeasureViewOrganizationQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -174,10 +174,10 @@ return {
], ],
"concreteType": "PeopleConnection", "concreteType": "PeopleConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureView_peoples_connection", "name": "__MeasureView_peoples_connection",
"plural": false, "plural": false,
"selections": (v5/*: any*/), "selections": (v5/*: any*/),
"storageKey": "__MesureView_peoples_connection(orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})" "storageKey": "__MeasureView_peoples_connection(orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})"
} }
], ],
"type": "Organization", "type": "Organization",
@@ -194,7 +194,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewOrganizationQuery", "name": "MeasureViewOrganizationQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -226,7 +226,7 @@ return {
"orderBy" "orderBy"
], ],
"handle": "connection", "handle": "connection",
"key": "MesureView_peoples", "key": "MeasureView_peoples",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "peoples" "name": "peoples"
} }
@@ -255,9 +255,9 @@ return {
} }
] ]
}, },
"name": "MesureViewOrganizationQuery", "name": "MeasureViewOrganizationQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewOrganizationQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n peoples(first: 100, orderBy: {direction: ASC, field: FULL_NAME}) {\n edges {\n node {\n id\n fullName\n primaryEmailAddress\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureViewOrganizationQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n peoples(first: 100, orderBy: {direction: ASC, field: FULL_NAME}) {\n edges {\n node {\n id\n fullName\n primaryEmailAddress\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -11,18 +11,18 @@
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type EvidenceState = "FULFILLED" | "REQUESTED"; export type EvidenceState = "FULFILLED" | "REQUESTED";
export type EvidenceType = "FILE" | "LINK"; export type EvidenceType = "FILE" | "LINK";
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type TaskState = "DONE" | "TODO"; export type TaskState = "DONE" | "TODO";
export type MesureViewQuery$variables = { export type MeasureViewQuery$variables = {
mesureId: string; measureId: string;
}; };
export type MesureViewQuery$data = { export type MeasureViewQuery$data = {
readonly mesure: { readonly measure: {
readonly category?: string; readonly category?: string;
readonly description?: string; readonly description?: string;
readonly id: string; readonly id: string;
readonly name?: string; readonly name?: string;
readonly state?: MesureState; readonly state?: MeasureState;
readonly tasks?: { readonly tasks?: {
readonly __id: string; readonly __id: string;
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
@@ -58,9 +58,9 @@ export type MesureViewQuery$data = {
}; };
}; };
}; };
export type MesureViewQuery = { export type MeasureViewQuery = {
response: MesureViewQuery$data; response: MeasureViewQuery$data;
variables: MesureViewQuery$variables; variables: MeasureViewQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -68,14 +68,14 @@ var v0 = [
{ {
"defaultValue": null, "defaultValue": null,
"kind": "LocalArgument", "kind": "LocalArgument",
"name": "mesureId" "name": "measureId"
} }
], ],
v1 = [ v1 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "id", "name": "id",
"variableName": "mesureId" "variableName": "measureId"
} }
], ],
v2 = { v2 = {
@@ -289,10 +289,10 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewQuery", "name": "MeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -312,7 +312,7 @@ return {
"args": null, "args": null,
"concreteType": "TaskConnection", "concreteType": "TaskConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureView_tasks_connection", "name": "__MeasureView_tasks_connection",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -342,7 +342,7 @@ return {
"args": null, "args": null,
"concreteType": "EvidenceConnection", "concreteType": "EvidenceConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureView_evidences_connection", "name": "__MeasureView_evidences_connection",
"plural": false, "plural": false,
"selections": (v13/*: any*/), "selections": (v13/*: any*/),
"storageKey": null "storageKey": null
@@ -361,7 +361,7 @@ return {
"storageKey": null "storageKey": null
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -375,10 +375,10 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewQuery", "name": "MeasureViewQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -439,7 +439,7 @@ return {
"args": (v15/*: any*/), "args": (v15/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "MesureView_evidences", "key": "MeasureView_evidences",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "evidences" "name": "evidences"
}, },
@@ -461,12 +461,12 @@ return {
"args": (v14/*: any*/), "args": (v14/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "MesureView_tasks", "key": "MeasureView_tasks",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "tasks" "name": "tasks"
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -490,15 +490,15 @@ return {
"cursor": null, "cursor": null,
"direction": "forward", "direction": "forward",
"path": [ "path": [
"mesure", "measure",
"tasks" "tasks"
] ]
} }
] ]
}, },
"name": "MesureViewQuery", "name": "MeasureViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewQuery(\n $mesureId: ID!\n) {\n mesure: node(id: $mesureId) {\n __typename\n id\n ... on Mesure {\n name\n description\n state\n category\n tasks(first: 100) {\n edges {\n node {\n id\n name\n description\n state\n timeEstimate\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n evidences(first: 50) {\n edges {\n node {\n id\n mimeType\n filename\n size\n state\n type\n url\n createdAt\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureViewQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n name\n description\n state\n category\n tasks(first: 100) {\n edges {\n node {\n id\n name\n description\n state\n timeEstimate\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n evidences(first: 50) {\n edges {\n node {\n id\n mimeType\n filename\n size\n state\n type\n url\n createdAt\n description\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,11 +9,11 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureViewRisksQuery$variables = { export type MeasureViewRisksQuery$variables = {
mesureId: string; measureId: string;
}; };
export type MesureViewRisksQuery$data = { export type MeasureViewRisksQuery$data = {
readonly mesure: { readonly measure: {
readonly id: string; readonly id: string;
readonly risks?: { readonly risks?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
@@ -34,9 +34,9 @@ export type MesureViewRisksQuery$data = {
}; };
}; };
}; };
export type MesureViewRisksQuery = { export type MeasureViewRisksQuery = {
response: MesureViewRisksQuery$data; response: MeasureViewRisksQuery$data;
variables: MesureViewRisksQuery$variables; variables: MeasureViewRisksQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -44,14 +44,14 @@ var v0 = [
{ {
"defaultValue": null, "defaultValue": null,
"kind": "LocalArgument", "kind": "LocalArgument",
"name": "mesureId" "name": "measureId"
} }
], ],
v1 = [ v1 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "id", "name": "id",
"variableName": "mesureId" "variableName": "measureId"
} }
], ],
v2 = { v2 = {
@@ -208,10 +208,10 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewRisksQuery", "name": "MeasureViewRisksQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -227,13 +227,13 @@ return {
"args": null, "args": null,
"concreteType": "RiskConnection", "concreteType": "RiskConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__MesureView_risks_connection", "name": "__MeasureView_risks_connection",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": null "storageKey": null
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -247,10 +247,10 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewRisksQuery", "name": "MeasureViewRisksQuery",
"selections": [ "selections": [
{ {
"alias": "mesure", "alias": "measure",
"args": (v1/*: any*/), "args": (v1/*: any*/),
"concreteType": null, "concreteType": null,
"kind": "LinkedField", "kind": "LinkedField",
@@ -277,12 +277,12 @@ return {
"args": (v5/*: any*/), "args": (v5/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "MesureView_risks", "key": "MeasureView_risks",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "risks" "name": "risks"
} }
], ],
"type": "Mesure", "type": "Measure",
"abstractKey": null "abstractKey": null
} }
], ],
@@ -300,15 +300,15 @@ return {
"cursor": null, "cursor": null,
"direction": "forward", "direction": "forward",
"path": [ "path": [
"mesure", "measure",
"risks" "risks"
] ]
} }
] ]
}, },
"name": "MesureViewRisksQuery", "name": "MeasureViewRisksQuery",
"operationKind": "query", "operationKind": "query",
"text": "query MesureViewRisksQuery(\n $mesureId: ID!\n) {\n mesure: node(id: $mesureId) {\n __typename\n id\n ... on Mesure {\n risks(first: 100) {\n edges {\n node {\n id\n name\n description\n inherentLikelihood\n inherentImpact\n inherentSeverity\n residualLikelihood\n residualImpact\n residualSeverity\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query MeasureViewRisksQuery(\n $measureId: ID!\n) {\n measure: node(id: $measureId) {\n __typename\n id\n ... on Measure {\n risks(first: 100) {\n edges {\n node {\n id\n name\n description\n inherentLikelihood\n inherentImpact\n inherentSeverity\n residualLikelihood\n residualImpact\n residualSeverity\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -12,10 +12,10 @@ import { ConcreteRequest } from 'relay-runtime';
export type UnassignTaskInput = { export type UnassignTaskInput = {
taskId: string; taskId: string;
}; };
export type MesureViewUnassignTaskMutation$variables = { export type MeasureViewUnassignTaskMutation$variables = {
input: UnassignTaskInput; input: UnassignTaskInput;
}; };
export type MesureViewUnassignTaskMutation$data = { export type MeasureViewUnassignTaskMutation$data = {
readonly unassignTask: { readonly unassignTask: {
readonly task: { readonly task: {
readonly assignedTo: { readonly assignedTo: {
@@ -27,9 +27,9 @@ export type MesureViewUnassignTaskMutation$data = {
}; };
}; };
}; };
export type MesureViewUnassignTaskMutation = { export type MeasureViewUnassignTaskMutation = {
response: MesureViewUnassignTaskMutation$data; response: MeasureViewUnassignTaskMutation$data;
variables: MesureViewUnassignTaskMutation$variables; variables: MeasureViewUnassignTaskMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -109,7 +109,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewUnassignTaskMutation", "name": "MeasureViewUnassignTaskMutation",
"selections": (v2/*: any*/), "selections": (v2/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -118,16 +118,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewUnassignTaskMutation", "name": "MeasureViewUnassignTaskMutation",
"selections": (v2/*: any*/) "selections": (v2/*: any*/)
}, },
"params": { "params": {
"cacheID": "3f91f027e7a8a935f306386469bbac21", "cacheID": "3f91f027e7a8a935f306386469bbac21",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewUnassignTaskMutation", "name": "MeasureViewUnassignTaskMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewUnassignTaskMutation(\n $input: UnassignTaskInput!\n) {\n unassignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n" "text": "mutation MeasureViewUnassignTaskMutation(\n $input: UnassignTaskInput!\n) {\n unassignTask(input: $input) {\n task {\n id\n assignedTo {\n id\n fullName\n primaryEmailAddress\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -9,28 +9,28 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type UpdateMesureInput = { export type UpdateMeasureInput = {
category?: string | null | undefined; category?: string | null | undefined;
description?: string | null | undefined; description?: string | null | undefined;
id: string; id: string;
name?: string | null | undefined; name?: string | null | undefined;
state?: MesureState | null | undefined; state?: MeasureState | null | undefined;
}; };
export type MesureViewUpdateMesureStateMutation$variables = { export type MeasureViewUpdateMeasureStateMutation$variables = {
input: UpdateMesureInput; input: UpdateMeasureInput;
}; };
export type MesureViewUpdateMesureStateMutation$data = { export type MeasureViewUpdateMeasureStateMutation$data = {
readonly updateMesure: { readonly updateMeasure: {
readonly mesure: { readonly measure: {
readonly id: string; readonly id: string;
readonly state: MesureState; readonly state: MeasureState;
}; };
}; };
}; };
export type MesureViewUpdateMesureStateMutation = { export type MeasureViewUpdateMeasureStateMutation = {
response: MesureViewUpdateMesureStateMutation$data; response: MeasureViewUpdateMeasureStateMutation$data;
variables: MesureViewUpdateMesureStateMutation$variables; variables: MeasureViewUpdateMeasureStateMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -51,17 +51,17 @@ v1 = [
"variableName": "input" "variableName": "input"
} }
], ],
"concreteType": "UpdateMesurePayload", "concreteType": "UpdateMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "updateMesure", "name": "updateMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesure", "name": "measure",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
@@ -90,7 +90,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewUpdateMesureStateMutation", "name": "MeasureViewUpdateMeasureStateMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -99,16 +99,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewUpdateMesureStateMutation", "name": "MeasureViewUpdateMeasureStateMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "59db8143f555230677a401f5bed6a6c3", "cacheID": "59db8143f555230677a401f5bed6a6c3",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewUpdateMesureStateMutation", "name": "MeasureViewUpdateMeasureStateMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewUpdateMesureStateMutation(\n $input: UpdateMesureInput!\n) {\n updateMesure(input: $input) {\n mesure {\n id\n state\n }\n }\n}\n" "text": "mutation MeasureViewUpdateMeasureStateMutation(\n $input: UpdateMeasureInput!\n) {\n updateMeasure(input: $input) {\n measure {\n id\n state\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -17,10 +17,10 @@ export type UpdateTaskInput = {
taskId: string; taskId: string;
timeEstimate?: any | null | undefined; timeEstimate?: any | null | undefined;
}; };
export type MesureViewUpdateTaskStateMutation$variables = { export type MeasureViewUpdateTaskStateMutation$variables = {
input: UpdateTaskInput; input: UpdateTaskInput;
}; };
export type MesureViewUpdateTaskStateMutation$data = { export type MeasureViewUpdateTaskStateMutation$data = {
readonly updateTask: { readonly updateTask: {
readonly task: { readonly task: {
readonly id: string; readonly id: string;
@@ -29,9 +29,9 @@ export type MesureViewUpdateTaskStateMutation$data = {
}; };
}; };
}; };
export type MesureViewUpdateTaskStateMutation = { export type MeasureViewUpdateTaskStateMutation = {
response: MesureViewUpdateTaskStateMutation$data; response: MeasureViewUpdateTaskStateMutation$data;
variables: MesureViewUpdateTaskStateMutation$variables; variables: MeasureViewUpdateTaskStateMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -98,7 +98,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "MesureViewUpdateTaskStateMutation", "name": "MeasureViewUpdateTaskStateMutation",
"selections": (v1/*: any*/), "selections": (v1/*: any*/),
"type": "Mutation", "type": "Mutation",
"abstractKey": null "abstractKey": null
@@ -107,16 +107,16 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "MesureViewUpdateTaskStateMutation", "name": "MeasureViewUpdateTaskStateMutation",
"selections": (v1/*: any*/) "selections": (v1/*: any*/)
}, },
"params": { "params": {
"cacheID": "3af3e26a5c5be4c129b6d1706d3d1b59", "cacheID": "3af3e26a5c5be4c129b6d1706d3d1b59",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "MesureViewUpdateTaskStateMutation", "name": "MeasureViewUpdateTaskStateMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation MesureViewUpdateTaskStateMutation(\n $input: UpdateTaskInput!\n) {\n updateTask(input: $input) {\n task {\n id\n state\n timeEstimate\n }\n }\n}\n" "text": "mutation MeasureViewUpdateTaskStateMutation(\n $input: UpdateTaskInput!\n) {\n updateTask(input: $input) {\n task {\n id\n state\n timeEstimate\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -19,11 +19,11 @@ export type UploadEvidenceInput = {
type: EvidenceType; type: EvidenceType;
url?: string | null | undefined; url?: string | null | undefined;
}; };
export type MesureViewUploadEvidenceMutation$variables = { export type MeasureViewUploadEvidenceMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: UploadEvidenceInput; input: UploadEvidenceInput;
}; };
export type MesureViewUploadEvidenceMutation$data = { export type MeasureViewUploadEvidenceMutation$data = {
readonly uploadEvidence: { readonly uploadEvidence: {
readonly evidenceEdge: { readonly evidenceEdge: {
readonly node: { readonly node: {
@@ -40,9 +40,9 @@ export type MesureViewUploadEvidenceMutation$data = {
}; };
}; };
}; };
export type MesureViewUploadEvidenceMutation = { export type MeasureViewUploadEvidenceMutation = {
response: MesureViewUploadEvidenceMutation$data; response: MeasureViewUploadEvidenceMutation$data;
variables: MesureViewUploadEvidenceMutation$variables; variables: MeasureViewUploadEvidenceMutation$variables;
}; };
const node: ConcreteRequest = (function () { const node: ConcreteRequest = (function () {
@@ -153,7 +153,7 @@ const node: ConcreteRequest = (function () {
argumentDefinitions: [v0 /*: any*/, v1 /*: any*/], argumentDefinitions: [v0 /*: any*/, v1 /*: any*/],
kind: "Fragment", kind: "Fragment",
metadata: null, metadata: null,
name: "MesureViewUploadEvidenceMutation", name: "MeasureViewUploadEvidenceMutation",
selections: [ selections: [
{ {
alias: null, alias: null,
@@ -173,7 +173,7 @@ const node: ConcreteRequest = (function () {
operation: { operation: {
argumentDefinitions: [v1 /*: any*/, v0 /*: any*/], argumentDefinitions: [v1 /*: any*/, v0 /*: any*/],
kind: "Operation", kind: "Operation",
name: "MesureViewUploadEvidenceMutation", name: "MeasureViewUploadEvidenceMutation",
selections: [ selections: [
{ {
alias: null, alias: null,
@@ -209,9 +209,9 @@ const node: ConcreteRequest = (function () {
cacheID: "30a6915055d3f6b63d96836b26f05a45", cacheID: "30a6915055d3f6b63d96836b26f05a45",
id: null, id: null,
metadata: {}, metadata: {},
name: "MesureViewUploadEvidenceMutation", name: "MeasureViewUploadEvidenceMutation",
operationKind: "mutation", operationKind: "mutation",
text: "mutation MesureViewUploadEvidenceMutation(\n $input: UploadEvidenceInput!\n) {\n uploadEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n }\n }\n }\n}\n", text: "mutation MeasureViewUploadEvidenceMutation(\n $input: UploadEvidenceInput!\n) {\n uploadEvidence(input: $input) {\n evidenceEdge {\n node {\n id\n filename\n fileUrl\n mimeType\n type\n url\n size\n state\n createdAt\n }\n }\n }\n}\n",
}, },
}; };
})(); })();

View File

@@ -0,0 +1,177 @@
/**
* @generated SignedSource<<5e6355327f3097f4e2081c313e93143a>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type CreateMeasureInput = {
category: string;
description: string;
name: string;
organizationId: string;
};
export type NewMeasureViewCreateMeasureMutation$variables = {
connections: ReadonlyArray<string>;
input: CreateMeasureInput;
};
export type NewMeasureViewCreateMeasureMutation$data = {
readonly createMeasure: {
readonly measureEdge: {
readonly node: {
readonly description: string;
readonly id: string;
readonly name: string;
};
};
};
};
export type NewMeasureViewCreateMeasureMutation = {
response: NewMeasureViewCreateMeasureMutation$data;
variables: NewMeasureViewCreateMeasureMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "connections"
},
v1 = {
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
},
v2 = [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
v3 = {
"alias": null,
"args": null,
"concreteType": "MeasureEdge",
"kind": "LinkedField",
"name": "measureEdge",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"concreteType": "Measure",
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "description",
"storageKey": null
}
],
"storageKey": null
}
],
"storageKey": null
};
return {
"fragment": {
"argumentDefinitions": [
(v0/*: any*/),
(v1/*: any*/)
],
"kind": "Fragment",
"metadata": null,
"name": "NewMeasureViewCreateMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateMeasurePayload",
"kind": "LinkedField",
"name": "createMeasure",
"plural": false,
"selections": [
(v3/*: any*/)
],
"storageKey": null
}
],
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [
(v1/*: any*/),
(v0/*: any*/)
],
"kind": "Operation",
"name": "NewMeasureViewCreateMeasureMutation",
"selections": [
{
"alias": null,
"args": (v2/*: any*/),
"concreteType": "CreateMeasurePayload",
"kind": "LinkedField",
"name": "createMeasure",
"plural": false,
"selections": [
(v3/*: any*/),
{
"alias": null,
"args": null,
"filters": null,
"handle": "prependEdge",
"key": "",
"kind": "LinkedHandle",
"name": "measureEdge",
"handleArgs": [
{
"kind": "Variable",
"name": "connections",
"variableName": "connections"
}
]
}
],
"storageKey": null
}
]
},
"params": {
"cacheID": "653394b4ee4a38ca9a1ab16847969464",
"id": null,
"metadata": {},
"name": "NewMeasureViewCreateMeasureMutation",
"operationKind": "mutation",
"text": "mutation NewMeasureViewCreateMeasureMutation(\n $input: CreateMeasureInput!\n) {\n createMeasure(input: $input) {\n measureEdge {\n node {\n id\n name\n description\n }\n }\n }\n}\n"
}
};
})();
(node as any).hash = "e75d982c8f9d92fcea1aef2de7b2ad47";
export default node;

View File

@@ -9,19 +9,19 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type CreateMesureInput = { export type CreateMeasureInput = {
category: string; category: string;
description: string; description: string;
name: string; name: string;
organizationId: string; organizationId: string;
}; };
export type NewMesureViewCreateMesureMutation$variables = { export type NewMeasureViewCreateMeasureMutation$variables = {
connections: ReadonlyArray<string>; connections: ReadonlyArray<string>;
input: CreateMesureInput; input: CreateMeasureInput;
}; };
export type NewMesureViewCreateMesureMutation$data = { export type NewMeasureViewCreateMeasureMutation$data = {
readonly createMesure: { readonly createMeasure: {
readonly mesureEdge: { readonly measureEdge: {
readonly node: { readonly node: {
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
@@ -30,9 +30,9 @@ export type NewMesureViewCreateMesureMutation$data = {
}; };
}; };
}; };
export type NewMesureViewCreateMesureMutation = { export type NewMeasureViewCreateMeasureMutation = {
response: NewMesureViewCreateMesureMutation$data; response: NewMeasureViewCreateMeasureMutation$data;
variables: NewMesureViewCreateMesureMutation$variables; variables: NewMeasureViewCreateMeasureMutation$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -56,15 +56,15 @@ v2 = [
v3 = { v3 = {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesureEdge", "name": "measureEdge",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -104,14 +104,14 @@ return {
], ],
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "NewMesureViewCreateMesureMutation", "name": "NewMeasureViewCreateMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "CreateMesurePayload", "concreteType": "CreateMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "createMesure", "name": "createMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/) (v3/*: any*/)
@@ -129,14 +129,14 @@ return {
(v0/*: any*/) (v0/*: any*/)
], ],
"kind": "Operation", "kind": "Operation",
"name": "NewMesureViewCreateMesureMutation", "name": "NewMeasureViewCreateMeasureMutation",
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": (v2/*: any*/), "args": (v2/*: any*/),
"concreteType": "CreateMesurePayload", "concreteType": "CreateMeasurePayload",
"kind": "LinkedField", "kind": "LinkedField",
"name": "createMesure", "name": "createMeasure",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/), (v3/*: any*/),
@@ -147,7 +147,7 @@ return {
"handle": "prependEdge", "handle": "prependEdge",
"key": "", "key": "",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesureEdge", "name": "measureEdge",
"handleArgs": [ "handleArgs": [
{ {
"kind": "Variable", "kind": "Variable",
@@ -165,9 +165,9 @@ return {
"cacheID": "de8b930c9628c62ae4272bd427076ebd", "cacheID": "de8b930c9628c62ae4272bd427076ebd",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "NewMesureViewCreateMesureMutation", "name": "NewMeasureViewCreateMeasureMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation NewMesureViewCreateMesureMutation(\n $input: CreateMesureInput!\n) {\n createMesure(input: $input) {\n mesureEdge {\n node {\n id\n name\n description\n }\n }\n }\n}\n" "text": "mutation NewMeasureViewCreateMeasureMutation(\n $input: CreateMeasureInput!\n) {\n createMeasure(input: $input) {\n measureEdge {\n node {\n id\n name\n description\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -114,7 +114,7 @@ function NewPeopleViewContent() {
), ),
ConnectionHandler.getConnectionID( ConnectionHandler.getConnectionID(
organizationId!, organizationId!,
"MesureView_peoples", "MeasureView_peoples",
{ {
orderBy: { orderBy: {
direction: "ASC", direction: "ASC",

View File

@@ -16,7 +16,7 @@ export function PolicyListViewSkeleton() {
<div className="bg-subtle-bg animate-pulse h-9 w-1/6 rounded-lg" /> <div className="bg-subtle-bg animate-pulse h-9 w-1/6 rounded-lg" />
} }
> >
{/* Search and filter mesures skeleton */} {/* Search and filter measures skeleton */}
<div className="flex flex-col md:flex-row gap-4 mb-6"> <div className="flex flex-col md:flex-row gap-4 mb-6">
<div className="flex-1 h-10 bg-subtle-bg animate-pulse rounded" /> <div className="flex-1 h-10 bg-subtle-bg animate-pulse rounded" />
<div className="flex gap-2"> <div className="flex gap-2">

View File

@@ -106,7 +106,7 @@ const listRiskViewFragment = graphql`
id id
fullName fullName
} }
mesures(first: 1) { measures(first: 1) {
edges { edges {
node { node {
category category
@@ -240,7 +240,7 @@ type RiskNode = {
readonly id: string; readonly id: string;
readonly fullName: string; readonly fullName: string;
} | null; } | null;
readonly mesures: { readonly measures: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;

View File

@@ -54,11 +54,11 @@ import {
TableRow, TableRow,
} from "@/components/ui/table"; } from "@/components/ui/table";
import { import {
ShowRiskViewOrganizationMesuresQuery, ShowRiskViewOrganizationMeasuresQuery,
ShowRiskViewOrganizationMesuresQuery$data, ShowRiskViewOrganizationMeasuresQuery$data,
} from "./__generated__/ShowRiskViewOrganizationMesuresQuery.graphql"; } from "./__generated__/ShowRiskViewOrganizationMeasuresQuery.graphql";
import { ShowRiskViewCreateRiskMesureMappingMutation } from "./__generated__/ShowRiskViewCreateRiskMesureMappingMutation.graphql"; import { ShowRiskViewCreateRiskMeasureMappingMutation } from "./__generated__/ShowRiskViewCreateRiskMeasureMappingMutation.graphql";
import { ShowRiskViewDeleteRiskMesureMappingMutation } from "./__generated__/ShowRiskViewDeleteRiskMesureMappingMutation.graphql"; import { ShowRiskViewDeleteRiskMeasureMappingMutation } from "./__generated__/ShowRiskViewDeleteRiskMeasureMappingMutation.graphql";
import { import {
ShowRiskViewOrganizationPoliciesQuery, ShowRiskViewOrganizationPoliciesQuery,
ShowRiskViewOrganizationPoliciesQuery$data, ShowRiskViewOrganizationPoliciesQuery$data,
@@ -85,7 +85,7 @@ const showRiskViewQuery = graphql`
note note
createdAt createdAt
updatedAt updatedAt
mesures(first: 100) @connection(key: "Risk__mesures") { measures(first: 100) @connection(key: "Risk__measures") {
edges { edges {
node { node {
id id
@@ -122,13 +122,13 @@ const showRiskViewQuery = graphql`
} }
`; `;
// Add query to fetch all mesures for the organization // Add query to fetch all measures for the organization
const organizationMesuresQuery = graphql` const organizationMeasuresQuery = graphql`
query ShowRiskViewOrganizationMesuresQuery($organizationId: ID!) { query ShowRiskViewOrganizationMeasuresQuery($organizationId: ID!) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
... on Organization { ... on Organization {
mesures(first: 100) @connection(key: "Organization__mesures") { measures(first: 100) @connection(key: "Organization__measures") {
edges { edges {
node { node {
id id
@@ -163,23 +163,23 @@ const organizationPoliciesQuery = graphql`
} }
`; `;
// Add mutation to create risk-mesure mapping // Add mutation to create risk-measure mapping
const createRiskMesureMappingMutation = graphql` const createRiskMeasureMappingMutation = graphql`
mutation ShowRiskViewCreateRiskMesureMappingMutation( mutation ShowRiskViewCreateRiskMeasureMappingMutation(
$input: CreateRiskMesureMappingInput! $input: CreateRiskMeasureMappingInput!
) { ) {
createRiskMesureMapping(input: $input) { createRiskMeasureMapping(input: $input) {
success success
} }
} }
`; `;
// Add mutation to delete risk-mesure mapping // Add mutation to delete risk-measure mapping
const deleteRiskMesureMappingMutation = graphql` const deleteRiskMeasureMappingMutation = graphql`
mutation ShowRiskViewDeleteRiskMesureMappingMutation( mutation ShowRiskViewDeleteRiskMeasureMappingMutation(
$input: DeleteRiskMesureMappingInput! $input: DeleteRiskMeasureMappingInput!
) { ) {
deleteRiskMesureMapping(input: $input) { deleteRiskMeasureMapping(input: $input) {
success success
} }
} }
@@ -329,8 +329,8 @@ function ShowRiskViewContent({
risk.inherentImpact! risk.inherentImpact!
); );
// Fix typing for mesures // Fix typing for measures
const mesures = risk.mesures?.edges?.map((edge) => edge.node) || []; const measures = risk.measures?.edges?.map((edge) => edge.node) || [];
const residualSeverity = getRiskSeverity( const residualSeverity = getRiskSeverity(
risk.residualLikelihood!, risk.residualLikelihood!,
risk.residualImpact! risk.residualImpact!
@@ -342,17 +342,17 @@ function ShowRiskViewContent({
// Fix typing for controls // Fix typing for controls
const controls = risk.controls?.edges?.map((edge) => edge.node) || []; const controls = risk.controls?.edges?.map((edge) => edge.node) || [];
// Add state for mesure mapping dialog // Add state for measure mapping dialog
const [isMesureDialogOpen, setIsMesureDialogOpen] = useState(false); const [isMeasureDialogOpen, setIsMeasureDialogOpen] = useState(false);
const [organizationMesuresData, setOrganizationMesuresData] = const [organizationMeasuresData, setOrganizationMeasuresData] =
useState<ShowRiskViewOrganizationMesuresQuery$data | null>(null); useState<ShowRiskViewOrganizationMeasuresQuery$data | null>(null);
const [mesureSearchQuery, setMesureSearchQuery] = useState(""); const [measureSearchQuery, setMeasureSearchQuery] = useState("");
const [categoryFilter, setCategoryFilter] = useState<string | null>(null); const [categoryFilter, setCategoryFilter] = useState<string | null>(null);
const [isLoadingMesures, setIsLoadingMesures] = useState(false); const [isLoadingMeasures, setIsLoadingMeasures] = useState(false);
const [linkingMesures, setLinkingMesures] = useState<Record<string, boolean>>( const [linkingMeasures, setLinkingMeasures] = useState<Record<string, boolean>>(
{} {}
); );
const [unlinkingMesures, setUnlinkingMesures] = useState< const [unlinkingMeasures, setUnlinkingMeasures] = useState<
Record<string, boolean> Record<string, boolean>
>({}); >({});
@@ -370,13 +370,13 @@ function ShowRiskViewContent({
>({}); >({});
// Setup mutation hooks // Setup mutation hooks
const [createRiskMesureMapping] = const [createRiskMeasureMapping] =
useMutation<ShowRiskViewCreateRiskMesureMappingMutation>( useMutation<ShowRiskViewCreateRiskMeasureMappingMutation>(
createRiskMesureMappingMutation createRiskMeasureMappingMutation
); );
const [deleteRiskMesureMapping] = const [deleteRiskMeasureMapping] =
useMutation<ShowRiskViewDeleteRiskMesureMappingMutation>( useMutation<ShowRiskViewDeleteRiskMeasureMappingMutation>(
deleteRiskMesureMappingMutation deleteRiskMeasureMappingMutation
); );
// Setup policy mutation hooks // Setup policy mutation hooks
@@ -391,13 +391,13 @@ function ShowRiskViewContent({
// Clear filters when dialog closes // Clear filters when dialog closes
useEffect(() => { useEffect(() => {
if (!isMesureDialogOpen) { if (!isMeasureDialogOpen) {
setMesureSearchQuery(""); setMeasureSearchQuery("");
setCategoryFilter(null); setCategoryFilter(null);
setLinkingMesures({}); setLinkingMeasures({});
setUnlinkingMesures({}); setUnlinkingMeasures({});
} }
}, [isMesureDialogOpen]); }, [isMeasureDialogOpen]);
// Clear filters when policy dialog closes // Clear filters when policy dialog closes
useEffect(() => { useEffect(() => {
@@ -408,30 +408,30 @@ function ShowRiskViewContent({
} }
}, [isPolicyDialogOpen]); }, [isPolicyDialogOpen]);
// Load mesures data when needed // Load measures data when needed
const loadMesuresData = useCallback(() => { const loadMeasuresData = useCallback(() => {
if (!organizationId || !risk.id) return; if (!organizationId || !risk.id) return;
setIsLoadingMesures(true); setIsLoadingMeasures(true);
// Fetch all mesures for the organization // Fetch all measures for the organization
fetchQuery<ShowRiskViewOrganizationMesuresQuery>( fetchQuery<ShowRiskViewOrganizationMeasuresQuery>(
environment, environment,
organizationMesuresQuery, organizationMeasuresQuery,
{ {
organizationId, organizationId,
} }
).subscribe({ ).subscribe({
next: (data) => { next: (data) => {
setOrganizationMesuresData(data); setOrganizationMeasuresData(data);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
}, },
error: (error: Error) => { error: (error: Error) => {
console.error("Error fetching organization mesures:", error); console.error("Error fetching organization measures:", error);
setIsLoadingMesures(false); setIsLoadingMeasures(false);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to load mesures.", description: "Failed to load measures.",
variant: "destructive", variant: "destructive",
}); });
}, },
@@ -469,49 +469,49 @@ function ShowRiskViewContent({
}, [risk.id, environment, organizationId, toast]); }, [risk.id, environment, organizationId, toast]);
// Helper functions // Helper functions
const getMesures = useCallback(() => { const getMeasures = useCallback(() => {
if (!organizationMesuresData?.organization?.mesures?.edges) return []; if (!organizationMeasuresData?.organization?.measures?.edges) return [];
return organizationMesuresData.organization.mesures.edges.map( return organizationMeasuresData.organization.measures.edges.map(
(edge) => edge.node (edge) => edge.node
); );
}, [organizationMesuresData]); }, [organizationMeasuresData]);
const getMesureCategories = useCallback(() => { const getMeasureCategories = useCallback(() => {
const mesures = getMesures(); const measures = getMeasures();
const categories = new Set<string>(); const categories = new Set<string>();
mesures.forEach((mesure) => { measures.forEach((measure) => {
if (mesure.category) { if (measure.category) {
categories.add(mesure.category); categories.add(measure.category);
} }
}); });
return Array.from(categories).sort(); return Array.from(categories).sort();
}, [getMesures]); }, [getMeasures]);
const filteredMesures = useCallback(() => { const filteredMeasures = useCallback(() => {
const mesures = getMesures(); const measures = getMeasures();
if (!mesureSearchQuery && !categoryFilter) return mesures; if (!measureSearchQuery && !categoryFilter) return measures;
return mesures.filter((mesure) => { return measures.filter((measure) => {
// Filter by search query // Filter by search query
const matchesSearch = const matchesSearch =
!mesureSearchQuery || !measureSearchQuery ||
mesure.name.toLowerCase().includes(mesureSearchQuery.toLowerCase()) || measure.name.toLowerCase().includes(measureSearchQuery.toLowerCase()) ||
(mesure.description && (measure.description &&
mesure.description measure.description
.toLowerCase() .toLowerCase()
.includes(mesureSearchQuery.toLowerCase())); .includes(measureSearchQuery.toLowerCase()));
// Filter by category // Filter by category
const matchesCategory = const matchesCategory =
!categoryFilter || !categoryFilter ||
categoryFilter === "all" || categoryFilter === "all" ||
mesure.category === categoryFilter; measure.category === categoryFilter;
return matchesSearch && matchesCategory; return matchesSearch && matchesCategory;
}); });
}, [getMesures, mesureSearchQuery, categoryFilter]); }, [getMeasures, measureSearchQuery, categoryFilter]);
// Helper functions for policies // Helper functions for policies
const getPolicies = useCallback(() => { const getPolicies = useCallback(() => {
@@ -533,38 +533,38 @@ function ShowRiskViewContent({
}); });
}, [getPolicies, policySearchQuery]); }, [getPolicies, policySearchQuery]);
// Handle linking a mesure to this risk // Handle linking a measure to this risk
const handleLinkMesure = useCallback( const handleLinkMeasure = useCallback(
( (
mesure: NonNullable< measure: NonNullable<
NonNullable< NonNullable<
ShowRiskViewOrganizationMesuresQuery$data["organization"] ShowRiskViewOrganizationMeasuresQuery$data["organization"]
>["mesures"] >["measures"]
>["edges"][0]["node"] >["edges"][0]["node"]
) => { ) => {
if (!risk.id) return; if (!risk.id) return;
// Track this specific mesure as linking // Track this specific measure as linking
setLinkingMesures((prev) => ({ ...prev, [mesure.id]: true })); setLinkingMeasures((prev) => ({ ...prev, [measure.id]: true }));
createRiskMesureMapping({ createRiskMeasureMapping({
variables: { variables: {
input: { input: {
riskId: risk.id, riskId: risk.id,
mesureId: mesure.id, measureId: measure.id,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
setLinkingMesures((prev) => ({ setLinkingMeasures((prev) => ({
...prev, ...prev,
[mesure.id]: false, [measure.id]: false,
})); }));
if (errors && errors.length > 0) { if (errors && errors.length > 0) {
console.error("Error linking mesure:", errors); console.error("Error linking measure:", errors);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to link mesure. Please try again.", description: "Failed to link measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
return; return;
@@ -585,58 +585,58 @@ function ShowRiskViewContent({
toast({ toast({
title: "Success", title: "Success",
description: `Linked mesure "${mesure.name}" to this risk.`, description: `Linked measure "${measure.name}" to this risk.`,
}); });
}, },
onError: (error) => { onError: (error) => {
setLinkingMesures((prev) => ({ setLinkingMeasures((prev) => ({
...prev, ...prev,
[mesure.id]: false, [measure.id]: false,
})); }));
console.error("Error linking mesure:", error); console.error("Error linking measure:", error);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to link mesure. Please try again.", description: "Failed to link measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
}, },
}); });
}, },
[risk.id, createRiskMesureMapping, toast, environment, loadQuery] [risk.id, createRiskMeasureMapping, toast, environment, loadQuery]
); );
// Handle unlinking a mesure from this risk // Handle unlinking a measure from this risk
const handleUnlinkMesure = useCallback( const handleUnlinkMeasure = useCallback(
( (
mesure: NonNullable< measure: NonNullable<
NonNullable< NonNullable<
ShowRiskViewOrganizationMesuresQuery$data["organization"] ShowRiskViewOrganizationMeasuresQuery$data["organization"]
>["mesures"] >["measures"]
>["edges"][0]["node"] >["edges"][0]["node"]
) => { ) => {
if (!risk.id) return; if (!risk.id) return;
// Track this specific mesure as unlinking // Track this specific measure as unlinking
setUnlinkingMesures((prev) => ({ ...prev, [mesure.id]: true })); setUnlinkingMeasures((prev) => ({ ...prev, [measure.id]: true }));
deleteRiskMesureMapping({ deleteRiskMeasureMapping({
variables: { variables: {
input: { input: {
riskId: risk.id, riskId: risk.id,
mesureId: mesure.id, measureId: measure.id,
}, },
}, },
onCompleted: (_, errors) => { onCompleted: (_, errors) => {
setUnlinkingMesures((prev) => ({ setUnlinkingMeasures((prev) => ({
...prev, ...prev,
[mesure.id]: false, [measure.id]: false,
})); }));
if (errors && errors.length > 0) { if (errors && errors.length > 0) {
console.error("Error unlinking mesure:", errors); console.error("Error unlinking measure:", errors);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to unlink mesure. Please try again.", description: "Failed to unlink measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
return; return;
@@ -657,24 +657,24 @@ function ShowRiskViewContent({
toast({ toast({
title: "Success", title: "Success",
description: `Unlinked mesure "${mesure.name}" from this risk.`, description: `Unlinked measure "${measure.name}" from this risk.`,
}); });
}, },
onError: (error) => { onError: (error) => {
setUnlinkingMesures((prev) => ({ setUnlinkingMeasures((prev) => ({
...prev, ...prev,
[mesure.id]: false, [measure.id]: false,
})); }));
console.error("Error unlinking mesure:", error); console.error("Error unlinking measure:", error);
toast({ toast({
title: "Error", title: "Error",
description: "Failed to unlink mesure. Please try again.", description: "Failed to unlink measure. Please try again.",
variant: "destructive", variant: "destructive",
}); });
}, },
}); });
}, },
[risk.id, deleteRiskMesureMapping, toast, environment, loadQuery] [risk.id, deleteRiskMeasureMapping, toast, environment, loadQuery]
); );
// Handle linking a policy to this risk // Handle linking a policy to this risk
@@ -994,10 +994,10 @@ function ShowRiskViewContent({
{risk.residualLikelihood! * risk.residualImpact!}) {risk.residualLikelihood! * risk.residualImpact!})
</span> </span>
{risk.treatment === "MITIGATED" && {risk.treatment === "MITIGATED" &&
risk.mesures?.edges && risk.measures?.edges &&
risk.mesures.edges.length > 0 && risk.measures.edges.length > 0 &&
` with ${risk.mesures.edges.length} ${ ` with ${risk.measures.edges.length} ${
risk.mesures.edges.length === 1 risk.measures.edges.length === 1
? "measure" ? "measure"
: "measures" : "measures"
}`} }`}
@@ -1022,53 +1022,53 @@ function ShowRiskViewContent({
</Card> </Card>
)} )}
<Tabs defaultValue="mesures" className="w-full"> <Tabs defaultValue="measures" className="w-full">
<TabsList> <TabsList>
<TabsTrigger value="mesures">Mesures</TabsTrigger> <TabsTrigger value="measures">Measures</TabsTrigger>
<TabsTrigger value="policies">Policies</TabsTrigger> <TabsTrigger value="policies">Policies</TabsTrigger>
<TabsTrigger value="controls">Controls</TabsTrigger> <TabsTrigger value="controls">Controls</TabsTrigger>
</TabsList> </TabsList>
<TabsContent value="mesures" className="space-y-4"> <TabsContent value="measures" className="space-y-4">
<div className="flex justify-between items-center mb-4"> <div className="flex justify-between items-center mb-4">
<h2 className="text-xl font-semibold">Risk Mesures</h2> <h2 className="text-xl font-semibold">Risk Measures</h2>
<Button <Button
onClick={() => { onClick={() => {
setIsMesureDialogOpen(true); setIsMeasureDialogOpen(true);
loadMesuresData(); loadMeasuresData();
}} }}
> >
<Plus className="mr-2 h-4 w-4" /> <Plus className="mr-2 h-4 w-4" />
Link Mesure Link Measure
</Button> </Button>
</div> </div>
{risk.mesures?.edges && risk.mesures.edges.length > 0 ? ( {risk.measures?.edges && risk.measures.edges.length > 0 ? (
<div className="rounded-md border"> <div className="rounded-md border">
<Table> <Table>
<TableHeader> <TableHeader>
<TableRow> <TableRow>
<TableHead className="w-full">Mesure</TableHead> <TableHead className="w-full">Measure</TableHead>
<TableHead className="w-20">Actions</TableHead> <TableHead className="w-20">Actions</TableHead>
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
{risk.mesures?.edges.map(({ node: mesure }) => ( {risk.measures?.edges.map(({ node: measure }) => (
<TableRow key={mesure.id}> <TableRow key={measure.id}>
<TableCell> <TableCell>
<Link <Link
to={`/organizations/${organizationId}/mesures/${mesure.id}`} to={`/organizations/${organizationId}/measures/${measure.id}`}
className="font-medium text-blue-600 hover:underline" className="font-medium text-blue-600 hover:underline"
> >
{mesure.name} {measure.name}
</Link> </Link>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
onClick={() => handleUnlinkMesure(mesure)} onClick={() => handleUnlinkMeasure(measure)}
disabled={unlinkingMesures[mesure.id] || false} disabled={unlinkingMeasures[measure.id] || false}
title="Unlink mesure" title="Unlink measure"
> >
<Trash2 className="h-4 w-4 text-danger" /> <Trash2 className="h-4 w-4 text-danger" />
</Button> </Button>
@@ -1080,7 +1080,7 @@ function ShowRiskViewContent({
</div> </div>
) : ( ) : (
<div className="text-center py-10 text-secondary"> <div className="text-center py-10 text-secondary">
<p>No mesures associated with this risk.</p> <p>No measures associated with this risk.</p>
</div> </div>
)} )}
</TabsContent> </TabsContent>
@@ -1189,15 +1189,15 @@ function ShowRiskViewContent({
</TabsContent> </TabsContent>
</Tabs> </Tabs>
{/* Dialog for linking mesures */} {/* Dialog for linking measures */}
<Dialog open={isMesureDialogOpen} onOpenChange={setIsMesureDialogOpen}> <Dialog open={isMeasureDialogOpen} onOpenChange={setIsMeasureDialogOpen}>
<DialogContent className="max-w-3xl"> <DialogContent className="max-w-3xl">
<DialogHeader> <DialogHeader>
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<div> <div>
<DialogTitle>Manage Risk Mesures</DialogTitle> <DialogTitle>Manage Risk Measures</DialogTitle>
<DialogDescription> <DialogDescription>
Link or unlink mesures to manage this risk. Link or unlink measures to manage this risk.
</DialogDescription> </DialogDescription>
</div> </div>
</div> </div>
@@ -1209,10 +1209,10 @@ function ShowRiskViewContent({
<div className="relative"> <div className="relative">
<Search className="absolute left-2 top-2.5 h-4 w-4 text-tertiary" /> <Search className="absolute left-2 top-2.5 h-4 w-4 text-tertiary" />
<Input <Input
placeholder="Search mesures..." placeholder="Search measures..."
className="pl-8" className="pl-8"
value={mesureSearchQuery} value={measureSearchQuery}
onChange={(e) => setMesureSearchQuery(e.target.value)} onChange={(e) => setMeasureSearchQuery(e.target.value)}
/> />
</div> </div>
</div> </div>
@@ -1227,7 +1227,7 @@ function ShowRiskViewContent({
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectItem value="all">All Categories</SelectItem> <SelectItem value="all">All Categories</SelectItem>
{getMesureCategories().map((category) => ( {getMeasureCategories().map((category) => (
<SelectItem key={category} value={category}> <SelectItem key={category} value={category}>
{category} {category}
</SelectItem> </SelectItem>
@@ -1237,35 +1237,35 @@ function ShowRiskViewContent({
</div> </div>
<div className="border rounded-md max-h-96 overflow-y-auto"> <div className="border rounded-md max-h-96 overflow-y-auto">
{isLoadingMesures ? ( {isLoadingMeasures ? (
<div className="p-4 text-center">Loading mesures...</div> <div className="p-4 text-center">Loading measures...</div>
) : filteredMesures().length === 0 ? ( ) : filteredMeasures().length === 0 ? (
<div className="p-4 text-center">No mesures found.</div> <div className="p-4 text-center">No measures found.</div>
) : ( ) : (
<div className="divide-y"> <div className="divide-y">
{filteredMesures().map((mesure) => { {filteredMeasures().map((measure) => {
// For each render, recalculate linked status directly against the current risk data // For each render, recalculate linked status directly against the current risk data
const isLinked = risk.mesures?.edges?.some( const isLinked = risk.measures?.edges?.some(
(edge) => edge.node.id === mesure.id (edge) => edge.node.id === measure.id
); );
const isLinking = linkingMesures[mesure.id] || false; const isLinking = linkingMeasures[measure.id] || false;
const isUnlinking = unlinkingMesures[mesure.id] || false; const isUnlinking = unlinkingMeasures[measure.id] || false;
return ( return (
<div <div
key={mesure.id} key={measure.id}
className="relative p-4 hover:bg-blue-50 transition-colors duration-150" className="relative p-4 hover:bg-blue-50 transition-colors duration-150"
> >
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<h3 className="font-medium">{mesure.name}</h3> <h3 className="font-medium">{measure.name}</h3>
{mesure.category && ( {measure.category && (
<Badge <Badge
variant="outline" variant="outline"
className="text-xs font-normal" className="text-xs font-normal"
> >
<Tag className="h-3 w-3 mr-1" /> <Tag className="h-3 w-3 mr-1" />
{mesure.category} {measure.category}
</Badge> </Badge>
)} )}
</div> </div>
@@ -1274,7 +1274,7 @@ function ShowRiskViewContent({
size="sm" size="sm"
variant="outline" variant="outline"
disabled={isUnlinking} disabled={isUnlinking}
onClick={() => handleUnlinkMesure(mesure)} onClick={() => handleUnlinkMeasure(measure)}
className="text-red-600 border-red-200 hover:bg-red-50" className="text-red-600 border-red-200 hover:bg-red-50"
> >
{isUnlinking ? "Unlinking..." : "Unlink"} {isUnlinking ? "Unlinking..." : "Unlink"}
@@ -1283,7 +1283,7 @@ function ShowRiskViewContent({
<Button <Button
size="sm" size="sm"
disabled={isLinking} disabled={isLinking}
onClick={() => handleLinkMesure(mesure)} onClick={() => handleLinkMeasure(measure)}
> >
{isLinking ? "Linking..." : "Link"} {isLinking ? "Linking..." : "Link"}
</Button> </Button>
@@ -1300,7 +1300,7 @@ function ShowRiskViewContent({
<DialogFooter> <DialogFooter>
<Button <Button
variant="outline" variant="outline"
onClick={() => setIsMesureDialogOpen(false)} onClick={() => setIsMeasureDialogOpen(false)}
> >
Close Close
</Button> </Button>

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<f0234c8da839e9d7babc696edb1171aa>> * @generated SignedSource<<42dea43217da18c2c1c44893753af2a0>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -278,15 +278,15 @@ return {
"value": 1 "value": 1
} }
], ],
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -294,7 +294,7 @@ return {
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -308,7 +308,7 @@ return {
"storageKey": null "storageKey": null
} }
], ],
"storageKey": "mesures(first:1)" "storageKey": "measures(first:1)"
}, },
(v7/*: any*/) (v7/*: any*/)
], ],
@@ -397,16 +397,16 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "398efd65ce3f24d13b357e8cf32c4f6e", "cacheID": "2d35bb699b87877054e407eccb1c398b",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ListRiskViewPaginationQuery", "name": "ListRiskViewPaginationQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ListRiskViewPaginationQuery(\n $after: CursorKey\n $before: CursorKey\n $first: Int\n $last: Int\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...ListRiskView_risks_pbnwq\n id\n }\n}\n\nfragment ListRiskView_risks_pbnwq on Organization {\n risks(first: $first, after: $after, last: $last, before: $before) {\n edges {\n node {\n id\n name\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n treatment\n description\n category\n createdAt\n updatedAt\n owner {\n id\n fullName\n }\n mesures(first: 1) {\n edges {\n node {\n category\n id\n }\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n id\n}\n" "text": "query ListRiskViewPaginationQuery(\n $after: CursorKey\n $before: CursorKey\n $first: Int\n $last: Int\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...ListRiskView_risks_pbnwq\n id\n }\n}\n\nfragment ListRiskView_risks_pbnwq on Organization {\n risks(first: $first, after: $after, last: $last, before: $before) {\n edges {\n node {\n id\n name\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n treatment\n description\n category\n createdAt\n updatedAt\n owner {\n id\n fullName\n }\n measures(first: 1) {\n edges {\n node {\n category\n id\n }\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n id\n}\n"
} }
}; };
})(); })();
(node as any).hash = "3fc46af4f252617f4547c988184bb168"; (node as any).hash = "064cf25e6278fd29f1e474d9a65c6d18";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<d4fc01f5c38bce1054b2198af7e021f2>> * @generated SignedSource<<c0daa0e600804b3750294c11acacec17>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -280,15 +280,15 @@ return {
"value": 1 "value": 1
} }
], ],
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -296,7 +296,7 @@ return {
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -310,7 +310,7 @@ return {
"storageKey": null "storageKey": null
} }
], ],
"storageKey": "mesures(first:1)" "storageKey": "measures(first:1)"
}, },
(v8/*: any*/) (v8/*: any*/)
], ],
@@ -399,12 +399,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "519139d7f492b8d719abf1b0e788853a", "cacheID": "3e7d8e722a266ae4e1892ad472d29e69",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "ListRiskViewQuery", "name": "ListRiskViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ListRiskViewQuery(\n $organizationId: ID!\n $first: Int\n $after: CursorKey\n $last: Int\n $before: CursorKey\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ...ListRiskView_risks_pbnwq\n }\n}\n\nfragment ListRiskView_risks_pbnwq on Organization {\n risks(first: $first, after: $after, last: $last, before: $before) {\n edges {\n node {\n id\n name\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n treatment\n description\n category\n createdAt\n updatedAt\n owner {\n id\n fullName\n }\n mesures(first: 1) {\n edges {\n node {\n category\n id\n }\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n id\n}\n" "text": "query ListRiskViewQuery(\n $organizationId: ID!\n $first: Int\n $after: CursorKey\n $last: Int\n $before: CursorKey\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ...ListRiskView_risks_pbnwq\n }\n}\n\nfragment ListRiskView_risks_pbnwq on Organization {\n risks(first: $first, after: $after, last: $last, before: $before) {\n edges {\n node {\n id\n name\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n treatment\n description\n category\n createdAt\n updatedAt\n owner {\n id\n fullName\n }\n measures(first: 1) {\n edges {\n node {\n category\n id\n }\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n id\n}\n"
} }
}; };
})(); })();

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<1dd4443afe99bdd114d082b0d175776d>> * @generated SignedSource<<ff2ba5959c29398eb8e36b013c459b6b>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -23,7 +23,7 @@ export type ListRiskView_risks$data = {
readonly id: string; readonly id: string;
readonly inherentImpact: number; readonly inherentImpact: number;
readonly inherentLikelihood: number; readonly inherentLikelihood: number;
readonly mesures: { readonly measures: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
@@ -247,15 +247,15 @@ return {
"value": 1 "value": 1
} }
], ],
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": [ "selections": [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -263,7 +263,7 @@ return {
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -276,7 +276,7 @@ return {
"storageKey": null "storageKey": null
} }
], ],
"storageKey": "mesures(first:1)" "storageKey": "measures(first:1)"
}, },
{ {
"alias": null, "alias": null,
@@ -359,6 +359,6 @@ return {
}; };
})(); })();
(node as any).hash = "3fc46af4f252617f4547c988184bb168"; (node as any).hash = "064cf25e6278fd29f1e474d9a65c6d18";
export default node; export default node;

View File

@@ -0,0 +1,93 @@
/**
* @generated SignedSource<<ac6b4af30ca3e03181512667a7ee6d76>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type CreateRiskMeasureMappingInput = {
measureId: string;
riskId: string;
};
export type ShowRiskViewCreateRiskMeasureMappingMutation$variables = {
input: CreateRiskMeasureMappingInput;
};
export type ShowRiskViewCreateRiskMeasureMappingMutation$data = {
readonly createRiskMeasureMapping: {
readonly success: boolean;
};
};
export type ShowRiskViewCreateRiskMeasureMappingMutation = {
response: ShowRiskViewCreateRiskMeasureMappingMutation$data;
variables: ShowRiskViewCreateRiskMeasureMappingMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "CreateRiskMeasureMappingPayload",
"kind": "LinkedField",
"name": "createRiskMeasureMapping",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "success",
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "ShowRiskViewCreateRiskMeasureMappingMutation",
"selections": (v1/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "ShowRiskViewCreateRiskMeasureMappingMutation",
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "f9e85548eb6e6aeb601fc36f92803ab6",
"id": null,
"metadata": {},
"name": "ShowRiskViewCreateRiskMeasureMappingMutation",
"operationKind": "mutation",
"text": "mutation ShowRiskViewCreateRiskMeasureMappingMutation(\n $input: CreateRiskMeasureMappingInput!\n) {\n createRiskMeasureMapping(input: $input) {\n success\n }\n}\n"
}
};
})();
(node as any).hash = "6246bbb8af3e7c1a2e968eb5482c91ce";
export default node;

View File

@@ -0,0 +1,93 @@
/**
* @generated SignedSource<<2cf110e09c6e34e64c013c6fc260e918>>
* @lightSyntaxTransform
* @nogrep
*/
/* tslint:disable */
/* eslint-disable */
// @ts-nocheck
import { ConcreteRequest } from 'relay-runtime';
export type DeleteRiskMeasureMappingInput = {
measureId: string;
riskId: string;
};
export type ShowRiskViewDeleteRiskMeasureMappingMutation$variables = {
input: DeleteRiskMeasureMappingInput;
};
export type ShowRiskViewDeleteRiskMeasureMappingMutation$data = {
readonly deleteRiskMeasureMapping: {
readonly success: boolean;
};
};
export type ShowRiskViewDeleteRiskMeasureMappingMutation = {
response: ShowRiskViewDeleteRiskMeasureMappingMutation$data;
variables: ShowRiskViewDeleteRiskMeasureMappingMutation$variables;
};
const node: ConcreteRequest = (function(){
var v0 = [
{
"defaultValue": null,
"kind": "LocalArgument",
"name": "input"
}
],
v1 = [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "input",
"variableName": "input"
}
],
"concreteType": "DeleteRiskMeasureMappingPayload",
"kind": "LinkedField",
"name": "deleteRiskMeasureMapping",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "success",
"storageKey": null
}
],
"storageKey": null
}
];
return {
"fragment": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Fragment",
"metadata": null,
"name": "ShowRiskViewDeleteRiskMeasureMappingMutation",
"selections": (v1/*: any*/),
"type": "Mutation",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": (v0/*: any*/),
"kind": "Operation",
"name": "ShowRiskViewDeleteRiskMeasureMappingMutation",
"selections": (v1/*: any*/)
},
"params": {
"cacheID": "76adf5d3867e6179bb11daeda4de9fc5",
"id": null,
"metadata": {},
"name": "ShowRiskViewDeleteRiskMeasureMappingMutation",
"operationKind": "mutation",
"text": "mutation ShowRiskViewDeleteRiskMeasureMappingMutation(\n $input: DeleteRiskMeasureMappingInput!\n) {\n deleteRiskMeasureMapping(input: $input) {\n success\n }\n}\n"
}
};
})();
(node as any).hash = "c51d0282a2d54bab88d56d9f2fdc9e49";
export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<1fdd1781c11f4c88aeb14ba52fc3e884>> * @generated SignedSource<<55b3897717ff85153a57b02526644ab8>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,29 +9,29 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type ShowRiskViewOrganizationMesuresQuery$variables = { export type ShowRiskViewOrganizationMeasuresQuery$variables = {
organizationId: string; organizationId: string;
}; };
export type ShowRiskViewOrganizationMesuresQuery$data = { export type ShowRiskViewOrganizationMeasuresQuery$data = {
readonly organization: { readonly organization: {
readonly id: string; readonly id: string;
readonly mesures?: { readonly measures?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
}; };
}>; }>;
}; };
}; };
}; };
export type ShowRiskViewOrganizationMesuresQuery = { export type ShowRiskViewOrganizationMeasuresQuery = {
response: ShowRiskViewOrganizationMesuresQuery$data; response: ShowRiskViewOrganizationMeasuresQuery$data;
variables: ShowRiskViewOrganizationMesuresQuery$variables; variables: ShowRiskViewOrganizationMeasuresQuery$variables;
}; };
const node: ConcreteRequest = (function(){ const node: ConcreteRequest = (function(){
@@ -67,7 +67,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -75,7 +75,7 @@ v4 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -161,7 +161,7 @@ return {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Fragment", "kind": "Fragment",
"metadata": null, "metadata": null,
"name": "ShowRiskViewOrganizationMesuresQuery", "name": "ShowRiskViewOrganizationMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -176,11 +176,11 @@ return {
"kind": "InlineFragment", "kind": "InlineFragment",
"selections": [ "selections": [
{ {
"alias": "mesures", "alias": "measures",
"args": null, "args": null,
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__Organization__mesures_connection", "name": "__Organization__measures_connection",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": null "storageKey": null
@@ -200,7 +200,7 @@ return {
"operation": { "operation": {
"argumentDefinitions": (v0/*: any*/), "argumentDefinitions": (v0/*: any*/),
"kind": "Operation", "kind": "Operation",
"name": "ShowRiskViewOrganizationMesuresQuery", "name": "ShowRiskViewOrganizationMeasuresQuery",
"selections": [ "selections": [
{ {
"alias": "organization", "alias": "organization",
@@ -218,21 +218,21 @@ return {
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": (v4/*: any*/), "selections": (v4/*: any*/),
"storageKey": "mesures(first:100)" "storageKey": "measures(first:100)"
}, },
{ {
"alias": null, "alias": null,
"args": (v5/*: any*/), "args": (v5/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "Organization__mesures", "key": "Organization__measures",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesures" "name": "measures"
} }
], ],
"type": "Organization", "type": "Organization",
@@ -244,7 +244,7 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "af9a0c71ad20ea7e65e3c625e30b00d8", "cacheID": "8d3ef87f30b0db1a4805df59ff0703c8",
"id": null, "id": null,
"metadata": { "metadata": {
"connection": [ "connection": [
@@ -254,18 +254,18 @@ return {
"direction": "forward", "direction": "forward",
"path": [ "path": [
"organization", "organization",
"mesures" "measures"
] ]
} }
] ]
}, },
"name": "ShowRiskViewOrganizationMesuresQuery", "name": "ShowRiskViewOrganizationMeasuresQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ShowRiskViewOrganizationMesuresQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n mesures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query ShowRiskViewOrganizationMeasuresQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n measures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "addb9873294354cedf28bc3262cb736a"; (node as any).hash = "23094414dbfa064d558c59163678d658";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<5d1745636bcff5f05d946bcd613463e5>> * @generated SignedSource<<48d940f6040fa9375ac915ce8851c658>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -9,7 +9,7 @@
// @ts-nocheck // @ts-nocheck
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
export type MesureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED"; export type MeasureState = "IMPLEMENTED" | "IN_PROGRESS" | "NOT_APPLICABLE" | "NOT_STARTED";
export type RiskTreatment = "ACCEPTED" | "AVOIDED" | "MITIGATED" | "TRANSFERRED"; export type RiskTreatment = "ACCEPTED" | "AVOIDED" | "MITIGATED" | "TRANSFERRED";
export type ShowRiskViewQuery$variables = { export type ShowRiskViewQuery$variables = {
riskId: string; riskId: string;
@@ -32,7 +32,7 @@ export type ShowRiskViewQuery$data = {
readonly id: string; readonly id: string;
readonly inherentImpact?: number; readonly inherentImpact?: number;
readonly inherentLikelihood?: number; readonly inherentLikelihood?: number;
readonly mesures?: { readonly measures?: {
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly category: string; readonly category: string;
@@ -40,7 +40,7 @@ export type ShowRiskViewQuery$data = {
readonly description: string; readonly description: string;
readonly id: string; readonly id: string;
readonly name: string; readonly name: string;
readonly state: MesureState; readonly state: MeasureState;
}; };
}>; }>;
}; };
@@ -224,7 +224,7 @@ v17 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "MesureEdge", "concreteType": "MeasureEdge",
"kind": "LinkedField", "kind": "LinkedField",
"name": "edges", "name": "edges",
"plural": true, "plural": true,
@@ -232,7 +232,7 @@ v17 = [
{ {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "Mesure", "concreteType": "Measure",
"kind": "LinkedField", "kind": "LinkedField",
"name": "node", "name": "node",
"plural": false, "plural": false,
@@ -377,11 +377,11 @@ return {
(v12/*: any*/), (v12/*: any*/),
(v13/*: any*/), (v13/*: any*/),
{ {
"alias": "mesures", "alias": "measures",
"args": null, "args": null,
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "__Risk__mesures_connection", "name": "__Risk__measures_connection",
"plural": false, "plural": false,
"selections": (v17/*: any*/), "selections": (v17/*: any*/),
"storageKey": null "storageKey": null
@@ -450,21 +450,21 @@ return {
{ {
"alias": null, "alias": null,
"args": (v20/*: any*/), "args": (v20/*: any*/),
"concreteType": "MesureConnection", "concreteType": "MeasureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "mesures", "name": "measures",
"plural": false, "plural": false,
"selections": (v17/*: any*/), "selections": (v17/*: any*/),
"storageKey": "mesures(first:100)" "storageKey": "measures(first:100)"
}, },
{ {
"alias": null, "alias": null,
"args": (v20/*: any*/), "args": (v20/*: any*/),
"filters": null, "filters": null,
"handle": "connection", "handle": "connection",
"key": "Risk__mesures", "key": "Risk__measures",
"kind": "LinkedHandle", "kind": "LinkedHandle",
"name": "mesures" "name": "measures"
}, },
{ {
"alias": null, "alias": null,
@@ -514,7 +514,7 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "a88eba4c398c292d41deaddd1d77bb3b", "cacheID": "487765d92cad8c0915ad4fee24d7e702",
"id": null, "id": null,
"metadata": { "metadata": {
"connection": [ "connection": [
@@ -524,7 +524,7 @@ return {
"direction": "forward", "direction": "forward",
"path": [ "path": [
"node", "node",
"mesures" "measures"
] ]
}, },
{ {
@@ -549,11 +549,11 @@ return {
}, },
"name": "ShowRiskViewQuery", "name": "ShowRiskViewQuery",
"operationKind": "query", "operationKind": "query",
"text": "query ShowRiskViewQuery(\n $riskId: ID!\n) {\n node(id: $riskId) {\n __typename\n id\n ... on Risk {\n name\n description\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n note\n createdAt\n updatedAt\n mesures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n createdAt\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n policies(first: 100) {\n edges {\n node {\n id\n title\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n" "text": "query ShowRiskViewQuery(\n $riskId: ID!\n) {\n node(id: $riskId) {\n __typename\n id\n ... on Risk {\n name\n description\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n note\n createdAt\n updatedAt\n measures(first: 100) {\n edges {\n node {\n id\n name\n description\n category\n createdAt\n state\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n policies(first: 100) {\n edges {\n node {\n id\n title\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n controls(first: 100) {\n edges {\n node {\n id\n referenceId\n name\n description\n createdAt\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "96158658ecb7c406fc969e086917c03e"; (node as any).hash = "b8506a3dd8980cd16b5344b990471533";
export default node; export default node;

View File

@@ -116,11 +116,11 @@ WHERE %s
return nil return nil
} }
func (c *Controls) LoadByMesureID( func (c *Controls) LoadByMeasureID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[ControlOrderField], cursor *page.Cursor[ControlOrderField],
) error { ) error {
q := ` q := `
@@ -137,9 +137,9 @@ WITH ctrl AS (
FROM FROM
controls c controls c
INNER JOIN INNER JOIN
controls_mesures cm ON c.id = cm.control_id controls_measures cm ON c.id = cm.control_id
WHERE WHERE
cm.mesure_id = @mesure_id cm.measure_id = @measure_id
) )
SELECT SELECT
id, id,
@@ -157,7 +157,7 @@ WHERE %s
` `
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
args := pgx.NamedArgs{"mesure_id": mesureID} args := pgx.NamedArgs{"measure_id": measureID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
@@ -200,9 +200,9 @@ WITH ctrl AS (
LEFT JOIN LEFT JOIN
risks_policies rp ON cp.policy_id = rp.policy_id risks_policies rp ON cp.policy_id = rp.policy_id
LEFT JOIN LEFT JOIN
controls_mesures cm ON c.id = cm.control_id controls_measures cm ON c.id = cm.control_id
LEFT JOIN LEFT JOIN
risks_mesures rm ON (rm.mesure_id = cm.mesure_id) risks_measures rm ON (rm.measure_id = cm.measure_id)
WHERE WHERE
rp.risk_id = @risk_id OR rm.risk_id = @risk_id rp.risk_id = @risk_id OR rm.risk_id = @risk_id
) )

View File

@@ -26,41 +26,41 @@ import (
) )
type ( type (
ControlMesure struct { ControlMeasure struct {
ControlID gid.GID `db:"control_id"` ControlID gid.GID `db:"control_id"`
MesureID gid.GID `db:"mesure_id"` MeasureID gid.GID `db:"measure_id"`
TenantID gid.TenantID `db:"tenant_id"` TenantID gid.TenantID `db:"tenant_id"`
CreatedAt time.Time `db:"created_at"` CreatedAt time.Time `db:"created_at"`
} }
ControlMesures []*ControlMesure ControlMeasures []*ControlMeasure
) )
func (cm ControlMesure) Upsert( func (cm ControlMeasure) Upsert(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
INSERT INTO INSERT INTO
controls_mesures ( controls_measures (
control_id, control_id,
mesure_id, measure_id,
tenant_id, tenant_id,
created_at created_at
) )
VALUES ( VALUES (
@control_id, @control_id,
@mesure_id, @measure_id,
@tenant_id, @tenant_id,
@created_at @created_at
) )
ON CONFLICT (control_id, mesure_id) DO NOTHING; ON CONFLICT (control_id, measure_id) DO NOTHING;
` `
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"control_id": cm.ControlID, "control_id": cm.ControlID,
"mesure_id": cm.MesureID, "measure_id": cm.MeasureID,
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"created_at": cm.CreatedAt, "created_at": cm.CreatedAt,
} }
@@ -68,22 +68,22 @@ ON CONFLICT (control_id, mesure_id) DO NOTHING;
return err return err
} }
func (cm ControlMesure) Insert( func (cm ControlMeasure) Insert(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
INSERT INTO INSERT INTO
controls_mesures ( controls_measures (
control_id, control_id,
mesure_id, measure_id,
tenant_id, tenant_id,
created_at created_at
) )
VALUES ( VALUES (
@control_id, @control_id,
@mesure_id, @measure_id,
@tenant_id, @tenant_id,
@created_at @created_at
); );
@@ -91,7 +91,7 @@ VALUES (
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"control_id": cm.ControlID, "control_id": cm.ControlID,
"mesure_id": cm.MesureID, "measure_id": cm.MeasureID,
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"created_at": cm.CreatedAt, "created_at": cm.CreatedAt,
} }
@@ -99,7 +99,7 @@ VALUES (
return err return err
} }
func (cm ControlMesure) Delete( func (cm ControlMeasure) Delete(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
@@ -107,16 +107,16 @@ func (cm ControlMesure) Delete(
q := ` q := `
DELETE DELETE
FROM FROM
controls_mesures controls_measures
WHERE WHERE
%s %s
AND control_id = @control_id AND control_id = @control_id
AND mesure_id = @mesure_id; AND measure_id = @measure_id;
` `
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"control_id": cm.ControlID, "control_id": cm.ControlID,
"mesure_id": cm.MesureID, "measure_id": cm.MeasureID,
} }
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
@@ -125,39 +125,39 @@ WHERE
return err return err
} }
func (cms *ControlMesures) LoadByMesureID( func (cms *ControlMeasures) LoadByMeasureID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
q := ` q := `
SELECT SELECT
control_id, control_id,
mesure_id, measure_id,
tenant_id, tenant_id,
created_at created_at
FROM FROM
controls_mesures controls_measures
WHERE WHERE
%s %s
AND mesure_id = @mesure_id AND measure_id = @measure_id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"mesure_id": mesureID} args := pgx.StrictNamedArgs{"measure_id": measureID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query control_mesures: %w", err) return fmt.Errorf("cannot query control_measures: %w", err)
} }
controlMesures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ControlMesure]) controlMeasures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[ControlMeasure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect control_mesures: %w", err) return fmt.Errorf("cannot collect control_measures: %w", err)
} }
*cms = controlMesures *cms = controlMeasures
return nil return nil
} }

View File

@@ -17,7 +17,7 @@ package coredata
const ( const (
OrganizationEntityType uint16 = iota OrganizationEntityType uint16 = iota
FrameworkEntityType FrameworkEntityType
MesureEntityType MeasureEntityType
TaskEntityType TaskEntityType
EvidenceEntityType EvidenceEntityType
ConnectorEntityType ConnectorEntityType

View File

@@ -28,37 +28,37 @@ import (
) )
type ( type (
Mesure struct { Measure struct {
ID gid.GID `db:"id"` ID gid.GID `db:"id"`
TenantID gid.TenantID `db:"tenant_id"` TenantID gid.TenantID `db:"tenant_id"`
OrganizationID gid.GID `db:"organization_id"` OrganizationID gid.GID `db:"organization_id"`
Category string `db:"category"` Category string `db:"category"`
Name string `db:"name"` Name string `db:"name"`
Description string `db:"description"` Description string `db:"description"`
State MesureState `db:"state"` State MeasureState `db:"state"`
ReferenceID string `db:"reference_id"` ReferenceID string `db:"reference_id"`
CreatedAt time.Time `db:"created_at"` CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"` UpdatedAt time.Time `db:"updated_at"`
} }
Mesures []*Mesure Measures []*Measure
) )
func (m Mesure) CursorKey(orderBy MesureOrderField) page.CursorKey { func (m Measure) CursorKey(orderBy MeasureOrderField) page.CursorKey {
switch orderBy { switch orderBy {
case MesureOrderFieldCreatedAt: case MeasureOrderFieldCreatedAt:
return page.NewCursorKey(m.ID, m.CreatedAt) return page.NewCursorKey(m.ID, m.CreatedAt)
} }
panic(fmt.Sprintf("unsupported order by: %s", orderBy)) panic(fmt.Sprintf("unsupported order by: %s", orderBy))
} }
func (m *Mesures) LoadByRiskID( func (m *Measures) LoadByRiskID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
riskID gid.GID, riskID gid.GID,
cursor *page.Cursor[MesureOrderField], cursor *page.Cursor[MeasureOrderField],
) error { ) error {
q := ` q := `
WITH msrs AS ( WITH msrs AS (
@@ -74,9 +74,9 @@ WITH msrs AS (
m.created_at, m.created_at,
m.updated_at m.updated_at
FROM FROM
mesures m measures m
INNER JOIN INNER JOIN
risks_mesures rm ON m.id = rm.mesure_id risks_measures rm ON m.id = rm.measure_id
WHERE WHERE
rm.risk_id = @risk_id rm.risk_id = @risk_id
) )
@@ -104,25 +104,25 @@ WHERE %s
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query mesures: %w", err) return fmt.Errorf("cannot query measures: %w", err)
} }
mesures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Mesure]) measures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Measure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect mesures: %w", err) return fmt.Errorf("cannot collect measures: %w", err)
} }
*m = mesures *m = measures
return nil return nil
} }
func (m *Mesures) LoadByControlID( func (m *Measures) LoadByControlID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
controlID gid.GID, controlID gid.GID,
cursor *page.Cursor[MesureOrderField], cursor *page.Cursor[MeasureOrderField],
) error { ) error {
q := ` q := `
WITH mtgtns AS ( WITH mtgtns AS (
@@ -138,9 +138,9 @@ WITH mtgtns AS (
m.created_at, m.created_at,
m.updated_at m.updated_at
FROM FROM
mesures m measures m
INNER JOIN INNER JOIN
controls_mesures cm ON m.id = cm.mesure_id controls_measures cm ON m.id = cm.measure_id
WHERE WHERE
cm.control_id = @control_id cm.control_id = @control_id
) )
@@ -168,25 +168,25 @@ WHERE %s
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query mesures: %w", err) return fmt.Errorf("cannot query measures: %w", err)
} }
mesures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Mesure]) measures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Measure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect mesures: %w", err) return fmt.Errorf("cannot collect measures: %w", err)
} }
*m = mesures *m = measures
return nil return nil
} }
func (m *Mesures) LoadByOrganizationID( func (m *Measures) LoadByOrganizationID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
organizationID gid.GID, organizationID gid.GID,
cursor *page.Cursor[MesureOrderField], cursor *page.Cursor[MeasureOrderField],
) error { ) error {
q := ` q := `
SELECT SELECT
@@ -201,7 +201,7 @@ SELECT
created_at, created_at,
updated_at updated_at
FROM FROM
mesures measures
WHERE WHERE
%s %s
AND organization_id = @organization_id AND organization_id = @organization_id
@@ -215,24 +215,24 @@ WHERE
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query mesures: %w", err) return fmt.Errorf("cannot query measures: %w", err)
} }
mesures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Mesure]) measures, err := pgx.CollectRows(rows, pgx.RowToAddrOfStructByName[Measure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect mesures: %w", err) return fmt.Errorf("cannot collect measures: %w", err)
} }
*m = mesures *m = measures
return nil return nil
} }
func (m *Mesure) LoadByID( func (m *Measure) LoadByID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
q := ` q := `
SELECT SELECT
@@ -247,41 +247,41 @@ SELECT
created_at, created_at,
updated_at updated_at
FROM FROM
mesures measures
WHERE WHERE
%s %s
AND id = @mesure_id AND id = @measure_id
LIMIT 1; LIMIT 1;
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"mesure_id": mesureID} args := pgx.StrictNamedArgs{"measure_id": measureID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query mesures: %w", err) return fmt.Errorf("cannot query measures: %w", err)
} }
mesure, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Mesure]) measure, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Measure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect mesures: %w", err) return fmt.Errorf("cannot collect measures: %w", err)
} }
*m = mesure *m = measure
return nil return nil
} }
func (m *Mesure) Upsert( func (m *Measure) Upsert(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
INSERT INTO INSERT INTO
mesures ( measures (
tenant_id, tenant_id,
id, id,
organization_id, organization_id,
@@ -295,7 +295,7 @@ INSERT INTO
) )
VALUES ( VALUES (
@tenant_id, @tenant_id,
@mesure_id, @measure_id,
@organization_id, @organization_id,
@category, @category,
@name, @name,
@@ -325,7 +325,7 @@ RETURNING
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"mesure_id": m.ID, "measure_id": m.ID,
"organization_id": m.OrganizationID, "organization_id": m.OrganizationID,
"category": m.Category, "category": m.Category,
"name": m.Name, "name": m.Name,
@@ -338,27 +338,27 @@ RETURNING
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)
if err != nil { if err != nil {
return fmt.Errorf("cannot query mesures: %w", err) return fmt.Errorf("cannot query measures: %w", err)
} }
mesure, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Mesure]) measure, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByName[Measure])
if err != nil { if err != nil {
return fmt.Errorf("cannot collect mesures: %w", err) return fmt.Errorf("cannot collect measures: %w", err)
} }
*m = mesure *m = measure
return nil return nil
} }
func (m Mesure) Insert( func (m Measure) Insert(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
INSERT INTO INSERT INTO
mesures ( measures (
tenant_id, tenant_id,
id, id,
organization_id, organization_id,
@@ -372,7 +372,7 @@ INSERT INTO
) )
VALUES ( VALUES (
@tenant_id, @tenant_id,
@mesure_id, @measure_id,
@organization_id, @organization_id,
@category, @category,
@name, @name,
@@ -386,7 +386,7 @@ VALUES (
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"mesure_id": m.ID, "measure_id": m.ID,
"organization_id": m.OrganizationID, "organization_id": m.OrganizationID,
"category": m.Category, "category": m.Category,
"name": m.Name, "name": m.Name,
@@ -400,13 +400,13 @@ VALUES (
return err return err
} }
func (m *Mesure) Update( func (m *Measure) Update(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
UPDATE mesures UPDATE measures
SET SET
name = @name, name = @name,
description = @description, description = @description,
@@ -414,12 +414,12 @@ SET
state = @state, state = @state,
updated_at = @updated_at updated_at = @updated_at
WHERE %s WHERE %s
AND id = @mesure_id AND id = @measure_id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.NamedArgs{ args := pgx.NamedArgs{
"mesure_id": m.ID, "measure_id": m.ID,
"name": m.Name, "name": m.Name,
"description": m.Description, "description": m.Description,
"category": m.Category, "category": m.Category,
@@ -433,19 +433,19 @@ WHERE %s
return err return err
} }
func (m *Mesure) Delete( func (m *Measure) Delete(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
DELETE FROM mesures DELETE FROM measures
WHERE %s WHERE %s
AND id = @mesure_id AND id = @measure_id
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"mesure_id": m.ID} args := pgx.StrictNamedArgs{"measure_id": m.ID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
_, err := conn.Exec(ctx, q, args) _, err := conn.Exec(ctx, q, args)

View File

@@ -15,26 +15,26 @@
package coredata package coredata
type ( type (
MesureOrderField string MeasureOrderField string
) )
const ( const (
MesureOrderFieldCreatedAt MesureOrderField = "CREATED_AT" MeasureOrderFieldCreatedAt MeasureOrderField = "CREATED_AT"
) )
func (p MesureOrderField) Column() string { func (p MeasureOrderField) Column() string {
return string(p) return string(p)
} }
func (p MesureOrderField) String() string { func (p MeasureOrderField) String() string {
return string(p) return string(p)
} }
func (p MesureOrderField) MarshalText() ([]byte, error) { func (p MeasureOrderField) MarshalText() ([]byte, error) {
return []byte(p.String()), nil return []byte(p.String()), nil
} }
func (p *MesureOrderField) UnmarshalText(text []byte) error { func (p *MeasureOrderField) UnmarshalText(text []byte) error {
*p = MesureOrderField(text) *p = MeasureOrderField(text)
return nil return nil
} }

View File

@@ -20,65 +20,65 @@ import (
) )
type ( type (
MesureState uint8 MeasureState uint8
) )
const ( const (
MesureStateNotStarted MesureState = iota MeasureStateNotStarted MeasureState = iota
MesureStateInProgress MeasureStateInProgress
MesureStateNotApplicable MeasureStateNotApplicable
MesureStateImplemented MeasureStateImplemented
) )
func (ms MesureState) MarshalText() ([]byte, error) { func (ms MeasureState) MarshalText() ([]byte, error) {
return []byte(ms.String()), nil return []byte(ms.String()), nil
} }
func (ms *MesureState) UnmarshalText(data []byte) error { func (ms *MeasureState) UnmarshalText(data []byte) error {
val := string(data) val := string(data)
switch val { switch val {
case MesureStateNotStarted.String(): case MeasureStateNotStarted.String():
*ms = MesureStateNotStarted *ms = MeasureStateNotStarted
case MesureStateInProgress.String(): case MeasureStateInProgress.String():
*ms = MesureStateInProgress *ms = MeasureStateInProgress
case MesureStateNotApplicable.String(): case MeasureStateNotApplicable.String():
*ms = MesureStateNotApplicable *ms = MeasureStateNotApplicable
case MesureStateImplemented.String(): case MeasureStateImplemented.String():
*ms = MesureStateImplemented *ms = MeasureStateImplemented
default: default:
return fmt.Errorf("invalid MesureState value: %q", val) return fmt.Errorf("invalid MeasureState value: %q", val)
} }
return nil return nil
} }
func (ms MesureState) String() string { func (ms MeasureState) String() string {
var val string var val string
switch ms { switch ms {
case MesureStateNotStarted: case MeasureStateNotStarted:
val = "NOT_STARTED" val = "NOT_STARTED"
case MesureStateInProgress: case MeasureStateInProgress:
val = "IN_PROGRESS" val = "IN_PROGRESS"
case MesureStateNotApplicable: case MeasureStateNotApplicable:
val = "NOT_APPLICABLE" val = "NOT_APPLICABLE"
case MesureStateImplemented: case MeasureStateImplemented:
val = "IMPLEMENTED" val = "IMPLEMENTED"
} }
return val return val
} }
func (ms *MesureState) Scan(value any) error { func (ms *MeasureState) Scan(value any) error {
val, ok := value.(string) val, ok := value.(string)
if !ok { if !ok {
return fmt.Errorf("invalid scan source for MesureState, expected string got %T", value) return fmt.Errorf("invalid scan source for MeasureState, expected string got %T", value)
} }
return ms.UnmarshalText([]byte(val)) return ms.UnmarshalText([]byte(val))
} }
func (ms MesureState) Value() (driver.Value, error) { func (ms MeasureState) Value() (driver.Value, error) {
return ms.String(), nil return ms.String(), nil
} }

View File

@@ -0,0 +1,6 @@
ALTER TABLE mesures RENAME TO measures;
ALTER TABLE controls_mesures RENAME TO controls_measures;
ALTER TABLE risks_mesures RENAME TO risks_measures;
ALTER TABLE tasks RENAME COLUMN mesure_id TO measure_id;
ALTER TABLE controls_measures RENAME COLUMN mesure_id TO measure_id;
ALTER TABLE risks_measures RENAME COLUMN mesure_id TO measure_id;

View File

@@ -64,11 +64,11 @@ func (r *Risk) ResidualSeverity() int {
return r.ResidualLikelihood * r.ResidualImpact return r.ResidualLikelihood * r.ResidualImpact
} }
func (r *Risks) LoadByMesureID( func (r *Risks) LoadByMeasureID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[RiskOrderField], cursor *page.Cursor[RiskOrderField],
) error { ) error {
q := ` q := `
@@ -92,9 +92,9 @@ WITH rsks AS (
FROM FROM
risks r risks r
INNER JOIN INNER JOIN
risks_mesures rm ON r.id = rm.risk_id risks_measures rm ON r.id = rm.risk_id
WHERE WHERE
rm.mesure_id = @mesure_id rm.measure_id = @measure_id
) )
SELECT SELECT
id, id,
@@ -118,7 +118,7 @@ WHERE %s
` `
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
args := pgx.NamedArgs{"mesure_id": mesureID} args := pgx.NamedArgs{"measure_id": measureID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
rows, err := conn.Query(ctx, q, args) rows, err := conn.Query(ctx, q, args)

View File

@@ -26,32 +26,32 @@ import (
) )
type ( type (
RiskMesure struct { RiskMeasure struct {
RiskID gid.GID `db:"risk_id"` RiskID gid.GID `db:"risk_id"`
MesureID gid.GID `db:"mesure_id"` MeasureID gid.GID `db:"measure_id"`
TenantID gid.TenantID `db:"tenant_id"` TenantID gid.TenantID `db:"tenant_id"`
CreatedAt time.Time `db:"created_at"` CreatedAt time.Time `db:"created_at"`
} }
RiskMesures []*RiskMesure RiskMeasures []*RiskMeasure
) )
func (rm RiskMesure) Insert( func (rm RiskMeasure) Insert(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
) error { ) error {
q := ` q := `
INSERT INTO INSERT INTO
risks_mesures ( risks_measures (
risk_id, risk_id,
mesure_id, measure_id,
tenant_id, tenant_id,
created_at created_at
) )
VALUES ( VALUES (
@risk_id, @risk_id,
@mesure_id, @measure_id,
@tenant_id, @tenant_id,
@created_at @created_at
); );
@@ -59,7 +59,7 @@ VALUES (
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"risk_id": rm.RiskID, "risk_id": rm.RiskID,
"mesure_id": rm.MesureID, "measure_id": rm.MeasureID,
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"created_at": rm.CreatedAt, "created_at": rm.CreatedAt,
} }
@@ -67,7 +67,7 @@ VALUES (
return err return err
} }
func (rm RiskMesure) Delete( func (rm RiskMeasure) Delete(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
@@ -75,18 +75,18 @@ func (rm RiskMesure) Delete(
q := ` q := `
DELETE DELETE
FROM FROM
risks_mesures risks_measures
WHERE WHERE
%s %s
AND risk_id = @risk_id AND risk_id = @risk_id
AND mesure_id = @mesure_id; AND measure_id = @measure_id;
` `
q = fmt.Sprintf(q, scope.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"risk_id": rm.RiskID, "risk_id": rm.RiskID,
"mesure_id": rm.MesureID, "measure_id": rm.MeasureID,
} }
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())

View File

@@ -30,7 +30,7 @@ import (
type ( type (
Task struct { Task struct {
ID gid.GID `db:"id"` ID gid.GID `db:"id"`
MesureID gid.GID `db:"mesure_id"` MeasureID gid.GID `db:"measure_id"`
Name string `db:"name"` Name string `db:"name"`
Description string `db:"description"` Description string `db:"description"`
State TaskState `db:"state"` State TaskState `db:"state"`
@@ -62,7 +62,7 @@ func (c *Task) LoadByID(
q := ` q := `
SELECT SELECT
id, id,
mesure_id, measure_id,
name, name,
description, description,
state, state,
@@ -109,7 +109,7 @@ INSERT INTO
tasks ( tasks (
tenant_id, tenant_id,
id, id,
mesure_id, measure_id,
name, name,
description, description,
reference_id, reference_id,
@@ -122,7 +122,7 @@ INSERT INTO
VALUES ( VALUES (
@tenant_id, @tenant_id,
@task_id, @task_id,
@mesure_id, @measure_id,
@name, @name,
@description, @description,
@reference_id, @reference_id,
@@ -137,7 +137,7 @@ VALUES (
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"task_id": c.ID, "task_id": c.ID,
"mesure_id": c.MesureID, "measure_id": c.MeasureID,
"name": c.Name, "name": c.Name,
"description": c.Description, "description": c.Description,
"reference_id": c.ReferenceID, "reference_id": c.ReferenceID,
@@ -161,7 +161,7 @@ INSERT INTO
tasks ( tasks (
tenant_id, tenant_id,
id, id,
mesure_id, measure_id,
name, name,
description, description,
reference_id, reference_id,
@@ -174,7 +174,7 @@ INSERT INTO
VALUES ( VALUES (
@tenant_id, @tenant_id,
@task_id, @task_id,
@mesure_id, @measure_id,
@name, @name,
@description, @description,
@reference_id, @reference_id,
@@ -184,13 +184,13 @@ VALUES (
@created_at, @created_at,
@updated_at @updated_at
) )
ON CONFLICT (mesure_id, reference_id) DO UPDATE SET ON CONFLICT (measure_id, reference_id) DO UPDATE SET
name = @name, name = @name,
description = @description, description = @description,
updated_at = @updated_at updated_at = @updated_at
RETURNING RETURNING
id, id,
mesure_id, measure_id,
name, name,
description, description,
reference_id, reference_id,
@@ -204,7 +204,7 @@ RETURNING
args := pgx.StrictNamedArgs{ args := pgx.StrictNamedArgs{
"tenant_id": scope.GetTenantID(), "tenant_id": scope.GetTenantID(),
"task_id": c.ID, "task_id": c.ID,
"mesure_id": c.MesureID, "measure_id": c.MeasureID,
"name": c.Name, "name": c.Name,
"description": c.Description, "description": c.Description,
"reference_id": c.ReferenceID, "reference_id": c.ReferenceID,
@@ -229,17 +229,17 @@ RETURNING
return nil return nil
} }
func (c *Tasks) LoadByMesureID( func (c *Tasks) LoadByMeasureID(
ctx context.Context, ctx context.Context,
conn pg.Conn, conn pg.Conn,
scope Scoper, scope Scoper,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[TaskOrderField], cursor *page.Cursor[TaskOrderField],
) error { ) error {
q := ` q := `
SELECT SELECT
id, id,
mesure_id, measure_id,
name, name,
description, description,
state, state,
@@ -252,12 +252,12 @@ FROM
tasks tasks
WHERE WHERE
%s %s
AND mesure_id = @mesure_id AND measure_id = @measure_id
AND %s AND %s
` `
q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment()) q = fmt.Sprintf(q, scope.SQLFragment(), cursor.SQLFragment())
args := pgx.StrictNamedArgs{"mesure_id": mesureID} args := pgx.StrictNamedArgs{"measure_id": measureID}
maps.Copy(args, scope.SQLArguments()) maps.Copy(args, scope.SQLArguments())
maps.Copy(args, cursor.SQLArguments()) maps.Copy(args, cursor.SQLArguments())
@@ -323,7 +323,7 @@ WHERE %s
AND id = @task_id AND id = @task_id
RETURNING RETURNING
id, id,
mesure_id, measure_id,
name, name,
description, description,
reference_id, reference_id,
@@ -371,7 +371,7 @@ WHERE %s
AND id = @task_id AND id = @task_id
RETURNING RETURNING
id, id,
mesure_id, measure_id,
name, name,
description, description,
reference_id, reference_id,

View File

@@ -76,9 +76,9 @@ func (s ControlService) ListForPolicyID(
return page.NewPage(controls, cursor), nil return page.NewPage(controls, cursor), nil
} }
func (s ControlService) ListForMesureID( func (s ControlService) ListForMeasureID(
ctx context.Context, ctx context.Context,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[coredata.ControlOrderField], cursor *page.Cursor[coredata.ControlOrderField],
) (*page.Page[*coredata.Control, coredata.ControlOrderField], error) { ) (*page.Page[*coredata.Control, coredata.ControlOrderField], error) {
var controls coredata.Controls var controls coredata.Controls
@@ -86,7 +86,7 @@ func (s ControlService) ListForMesureID(
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return controls.LoadByMesureID(ctx, conn, s.svc.scope, mesureID, cursor) return controls.LoadByMeasureID(ctx, conn, s.svc.scope, measureID, cursor)
}, },
) )
@@ -97,14 +97,14 @@ func (s ControlService) ListForMesureID(
return page.NewPage(controls, cursor), nil return page.NewPage(controls, cursor), nil
} }
func (s ControlService) CreateMesureMapping( func (s ControlService) CreateMeasureMapping(
ctx context.Context, ctx context.Context,
controlID gid.GID, controlID gid.GID,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
controlMesure := &coredata.ControlMesure{ controlMeasure := &coredata.ControlMeasure{
ControlID: controlID, ControlID: controlID,
MesureID: mesureID, MeasureID: measureID,
TenantID: s.svc.scope.GetTenantID(), TenantID: s.svc.scope.GetTenantID(),
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }
@@ -112,19 +112,19 @@ func (s ControlService) CreateMesureMapping(
return s.svc.pg.WithConn( return s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return controlMesure.Insert(ctx, conn, s.svc.scope) return controlMeasure.Insert(ctx, conn, s.svc.scope)
}, },
) )
} }
func (s ControlService) DeleteMesureMapping( func (s ControlService) DeleteMeasureMapping(
ctx context.Context, ctx context.Context,
controlID gid.GID, controlID gid.GID,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
controlMesure := &coredata.ControlMesure{ controlMeasure := &coredata.ControlMeasure{
ControlID: controlID, ControlID: controlID,
MesureID: mesureID, MeasureID: measureID,
TenantID: s.svc.scope.GetTenantID(), TenantID: s.svc.scope.GetTenantID(),
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }
@@ -132,7 +132,7 @@ func (s ControlService) DeleteMesureMapping(
return s.svc.pg.WithConn( return s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return controlMesure.Delete(ctx, conn, s.svc.scope) return controlMeasure.Delete(ctx, conn, s.svc.scope)
}, },
) )
} }

View File

@@ -27,27 +27,27 @@ import (
) )
type ( type (
MesureService struct { MeasureService struct {
svc *TenantService svc *TenantService
} }
CreateMesureRequest struct { CreateMeasureRequest struct {
OrganizationID gid.GID OrganizationID gid.GID
Name string Name string
Description string Description string
Category string Category string
} }
UpdateMesureRequest struct { UpdateMeasureRequest struct {
ID gid.GID ID gid.GID
Name *string Name *string
Description *string Description *string
Category *string Category *string
State *coredata.MesureState State *coredata.MeasureState
} }
ImportMesureRequest struct { ImportMeasureRequest struct {
Mesures []struct { Measures []struct {
Name string `json:"name"` Name string `json:"name"`
Category string `json:"category"` Category string `json:"category"`
ReferenceID string `json:"reference-id"` ReferenceID string `json:"reference-id"`
@@ -65,21 +65,21 @@ type (
Name string `json:"name"` Name string `json:"name"`
} `json:"requested-evidences"` } `json:"requested-evidences"`
} `json:"tasks"` } `json:"tasks"`
} `json:"mesures"` } `json:"measures"`
} }
) )
func (s MesureService) ListForRiskID( func (s MeasureService) ListForRiskID(
ctx context.Context, ctx context.Context,
riskID gid.GID, riskID gid.GID,
cursor *page.Cursor[coredata.MesureOrderField], cursor *page.Cursor[coredata.MeasureOrderField],
) (*page.Page[*coredata.Mesure, coredata.MesureOrderField], error) { ) (*page.Page[*coredata.Measure, coredata.MeasureOrderField], error) {
var mesures coredata.Mesures var measures coredata.Measures
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return mesures.LoadByRiskID(ctx, conn, s.svc.scope, riskID, cursor) return measures.LoadByRiskID(ctx, conn, s.svc.scope, riskID, cursor)
}, },
) )
@@ -87,20 +87,20 @@ func (s MesureService) ListForRiskID(
return nil, err return nil, err
} }
return page.NewPage(mesures, cursor), nil return page.NewPage(measures, cursor), nil
} }
func (s MesureService) ListForControlID( func (s MeasureService) ListForControlID(
ctx context.Context, ctx context.Context,
controlID gid.GID, controlID gid.GID,
cursor *page.Cursor[coredata.MesureOrderField], cursor *page.Cursor[coredata.MeasureOrderField],
) (*page.Page[*coredata.Mesure, coredata.MesureOrderField], error) { ) (*page.Page[*coredata.Measure, coredata.MeasureOrderField], error) {
var mesures coredata.Mesures var measures coredata.Measures
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return mesures.LoadByControlID(ctx, conn, s.svc.scope, controlID, cursor) return measures.LoadByControlID(ctx, conn, s.svc.scope, controlID, cursor)
}, },
) )
@@ -108,19 +108,19 @@ func (s MesureService) ListForControlID(
return nil, err return nil, err
} }
return page.NewPage(mesures, cursor), nil return page.NewPage(measures, cursor), nil
} }
func (s MesureService) Get( func (s MeasureService) Get(
ctx context.Context, ctx context.Context,
mesureID gid.GID, measureID gid.GID,
) (*coredata.Mesure, error) { ) (*coredata.Measure, error) {
mesure := &coredata.Mesure{} measure := &coredata.Measure{}
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return mesure.LoadByID(ctx, conn, s.svc.scope, mesureID) return measure.LoadByID(ctx, conn, s.svc.scope, measureID)
}, },
) )
@@ -128,46 +128,46 @@ func (s MesureService) Get(
return nil, err return nil, err
} }
return mesure, nil return measure, nil
} }
func (s MesureService) Import( func (s MeasureService) Import(
ctx context.Context, ctx context.Context,
organizationID gid.GID, organizationID gid.GID,
req ImportMesureRequest, req ImportMeasureRequest,
) (*page.Page[*coredata.Mesure, coredata.MesureOrderField], error) { ) (*page.Page[*coredata.Measure, coredata.MeasureOrderField], error) {
importedMesures := coredata.Mesures{} importedMeasures := coredata.Measures{}
err := s.svc.pg.WithTx( err := s.svc.pg.WithTx(
ctx, ctx,
func(tx pg.Conn) error { func(tx pg.Conn) error {
for i := range req.Mesures { for i := range req.Measures {
now := time.Now() now := time.Now()
mesureID, err := gid.NewGID(organizationID.TenantID(), coredata.MesureEntityType) measureID, err := gid.NewGID(organizationID.TenantID(), coredata.MeasureEntityType)
if err != nil { if err != nil {
return fmt.Errorf("cannot create global id: %w", err) return fmt.Errorf("cannot create global id: %w", err)
} }
mesure := &coredata.Mesure{ measure := &coredata.Measure{
ID: mesureID, ID: measureID,
OrganizationID: organizationID, OrganizationID: organizationID,
Name: req.Mesures[i].Name, Name: req.Measures[i].Name,
Description: "", Description: "",
Category: req.Mesures[i].Category, Category: req.Measures[i].Category,
State: coredata.MesureStateNotStarted, State: coredata.MeasureStateNotStarted,
ReferenceID: req.Mesures[i].ReferenceID, ReferenceID: req.Measures[i].ReferenceID,
CreatedAt: now, CreatedAt: now,
UpdatedAt: now, UpdatedAt: now,
} }
importedMesures = append(importedMesures, mesure) importedMeasures = append(importedMeasures, measure)
if err := mesure.Upsert(ctx, tx, s.svc.scope); err != nil { if err := measure.Upsert(ctx, tx, s.svc.scope); err != nil {
return fmt.Errorf("cannot upsert mesure: %w", err) return fmt.Errorf("cannot upsert measure: %w", err)
} }
for j := range req.Mesures[i].Tasks { for j := range req.Measures[i].Tasks {
taskID, err := gid.NewGID(organizationID.TenantID(), coredata.TaskEntityType) taskID, err := gid.NewGID(organizationID.TenantID(), coredata.TaskEntityType)
if err != nil { if err != nil {
return fmt.Errorf("cannot create global id: %w", err) return fmt.Errorf("cannot create global id: %w", err)
@@ -175,10 +175,10 @@ func (s MesureService) Import(
task := &coredata.Task{ task := &coredata.Task{
ID: taskID, ID: taskID,
MesureID: mesure.ID, MeasureID: measure.ID,
Name: req.Mesures[i].Tasks[j].Name, Name: req.Measures[i].Tasks[j].Name,
Description: req.Mesures[i].Tasks[j].Description, Description: req.Measures[i].Tasks[j].Description,
ReferenceID: req.Mesures[i].Tasks[j].ReferenceID, ReferenceID: req.Measures[i].Tasks[j].ReferenceID,
State: coredata.TaskStateTodo, State: coredata.TaskStateTodo,
CreatedAt: now, CreatedAt: now,
UpdatedAt: now, UpdatedAt: now,
@@ -188,7 +188,7 @@ func (s MesureService) Import(
return fmt.Errorf("cannot upsert task: %w", err) return fmt.Errorf("cannot upsert task: %w", err)
} }
for k := range req.Mesures[i].Tasks[j].RequestedEvidences { for k := range req.Measures[i].Tasks[j].RequestedEvidences {
evidenceID, err := gid.NewGID(organizationID.TenantID(), coredata.EvidenceEntityType) evidenceID, err := gid.NewGID(organizationID.TenantID(), coredata.EvidenceEntityType)
if err != nil { if err != nil {
return fmt.Errorf("cannot create global id: %w", err) return fmt.Errorf("cannot create global id: %w", err)
@@ -198,9 +198,9 @@ func (s MesureService) Import(
State: coredata.EvidenceStateRequested, State: coredata.EvidenceStateRequested,
ID: evidenceID, ID: evidenceID,
TaskID: task.ID, TaskID: task.ID,
ReferenceID: req.Mesures[i].Tasks[j].RequestedEvidences[k].ReferenceID, ReferenceID: req.Measures[i].Tasks[j].RequestedEvidences[k].ReferenceID,
Type: req.Mesures[i].Tasks[j].RequestedEvidences[k].Type, Type: req.Measures[i].Tasks[j].RequestedEvidences[k].Type,
Description: req.Mesures[i].Tasks[j].RequestedEvidences[k].Name, Description: req.Measures[i].Tasks[j].RequestedEvidences[k].Name,
CreatedAt: now, CreatedAt: now,
UpdatedAt: now, UpdatedAt: now,
} }
@@ -211,7 +211,7 @@ func (s MesureService) Import(
} }
} }
for _, standard := range req.Mesures[i].Standards { for _, standard := range req.Measures[i].Standards {
framework := &coredata.Framework{} framework := &coredata.Framework{}
if err := framework.LoadByReferenceID(ctx, tx, s.svc.scope, standard.Framework); err != nil { if err := framework.LoadByReferenceID(ctx, tx, s.svc.scope, standard.Framework); err != nil {
continue continue
@@ -222,14 +222,14 @@ func (s MesureService) Import(
continue continue
} }
controlMesure := &coredata.ControlMesure{ controlMeasure := &coredata.ControlMeasure{
ControlID: control.ID, ControlID: control.ID,
MesureID: mesure.ID, MeasureID: measure.ID,
CreatedAt: now, CreatedAt: now,
} }
if err := controlMesure.Upsert(ctx, tx, s.svc.scope); err != nil { if err := controlMeasure.Upsert(ctx, tx, s.svc.scope); err != nil {
return fmt.Errorf("cannot insert control mesure: %w", err) return fmt.Errorf("cannot insert control measure: %w", err)
} }
} }
} }
@@ -239,55 +239,55 @@ func (s MesureService) Import(
) )
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot import mesures: %w", err) return nil, fmt.Errorf("cannot import measures: %w", err)
} }
cursor := page.NewCursor( cursor := page.NewCursor(
len(importedMesures), len(importedMeasures),
nil, nil,
page.Head, page.Head,
page.OrderBy[coredata.MesureOrderField]{ page.OrderBy[coredata.MeasureOrderField]{
Field: coredata.MesureOrderFieldCreatedAt, Field: coredata.MeasureOrderFieldCreatedAt,
Direction: page.OrderDirectionAsc, Direction: page.OrderDirectionAsc,
}, },
) )
return page.NewPage(importedMesures, cursor), nil return page.NewPage(importedMeasures, cursor), nil
} }
func (s MesureService) Update( func (s MeasureService) Update(
ctx context.Context, ctx context.Context,
req UpdateMesureRequest, req UpdateMeasureRequest,
) (*coredata.Mesure, error) { ) (*coredata.Measure, error) {
mesure := &coredata.Mesure{ID: req.ID} measure := &coredata.Measure{ID: req.ID}
err := s.svc.pg.WithTx( err := s.svc.pg.WithTx(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
if err := mesure.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil { if err := measure.LoadByID(ctx, conn, s.svc.scope, req.ID); err != nil {
return fmt.Errorf("cannot load mesure: %w", err) return fmt.Errorf("cannot load measure: %w", err)
} }
if req.Name != nil { if req.Name != nil {
mesure.Name = *req.Name measure.Name = *req.Name
} }
if req.Description != nil { if req.Description != nil {
mesure.Description = *req.Description measure.Description = *req.Description
} }
if req.Category != nil { if req.Category != nil {
mesure.Category = *req.Category measure.Category = *req.Category
} }
if req.State != nil { if req.State != nil {
mesure.State = *req.State measure.State = *req.State
} }
mesure.UpdatedAt = time.Now() measure.UpdatedAt = time.Now()
if err := mesure.Update(ctx, conn, s.svc.scope); err != nil { if err := measure.Update(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot update mesure: %w", err) return fmt.Errorf("cannot update measure: %w", err)
} }
return nil return nil
@@ -297,20 +297,20 @@ func (s MesureService) Update(
return nil, err return nil, err
} }
return mesure, nil return measure, nil
} }
func (s MesureService) ListForOrganizationID( func (s MeasureService) ListForOrganizationID(
ctx context.Context, ctx context.Context,
organizationID gid.GID, organizationID gid.GID,
cursor *page.Cursor[coredata.MesureOrderField], cursor *page.Cursor[coredata.MeasureOrderField],
) (*page.Page[*coredata.Mesure, coredata.MesureOrderField], error) { ) (*page.Page[*coredata.Measure, coredata.MeasureOrderField], error) {
var mesures coredata.Mesures var measures coredata.Measures
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return mesures.LoadByOrganizationID( return measures.LoadByOrganizationID(
ctx, ctx,
conn, conn,
s.svc.scope, s.svc.scope,
@@ -324,17 +324,17 @@ func (s MesureService) ListForOrganizationID(
return nil, err return nil, err
} }
return page.NewPage(mesures, cursor), nil return page.NewPage(measures, cursor), nil
} }
func (s MesureService) Create( func (s MeasureService) Create(
ctx context.Context, ctx context.Context,
req CreateMesureRequest, req CreateMeasureRequest,
) (*coredata.Mesure, error) { ) (*coredata.Measure, error) {
now := time.Now() now := time.Now()
mesureID, err := gid.NewGID(s.svc.scope.GetTenantID(), coredata.MesureEntityType) measureID, err := gid.NewGID(s.svc.scope.GetTenantID(), coredata.MeasureEntityType)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot create mesure global id: %w", err) return nil, fmt.Errorf("cannot create measure global id: %w", err)
} }
referenceID, err := uuid.NewV4() referenceID, err := uuid.NewV4()
@@ -342,14 +342,14 @@ func (s MesureService) Create(
return nil, fmt.Errorf("cannot generate reference id: %w", err) return nil, fmt.Errorf("cannot generate reference id: %w", err)
} }
mesure := &coredata.Mesure{ measure := &coredata.Measure{
ID: mesureID, ID: measureID,
OrganizationID: req.OrganizationID, OrganizationID: req.OrganizationID,
Name: req.Name, Name: req.Name,
Description: req.Description, Description: req.Description,
Category: req.Category, Category: req.Category,
ReferenceID: "custom-mesure-" + referenceID.String(), ReferenceID: "custom-measure-" + referenceID.String(),
State: coredata.MesureStateNotStarted, State: coredata.MeasureStateNotStarted,
CreatedAt: now, CreatedAt: now,
UpdatedAt: now, UpdatedAt: now,
} }
@@ -357,8 +357,8 @@ func (s MesureService) Create(
err = s.svc.pg.WithTx( err = s.svc.pg.WithTx(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
if err := mesure.Insert(ctx, conn, s.svc.scope); err != nil { if err := measure.Insert(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot insert mesure: %w", err) return fmt.Errorf("cannot insert measure: %w", err)
} }
return nil return nil
@@ -369,18 +369,18 @@ func (s MesureService) Create(
return nil, err return nil, err
} }
return mesure, nil return measure, nil
} }
func (s MesureService) Delete( func (s MeasureService) Delete(
ctx context.Context, ctx context.Context,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
return s.svc.pg.WithTx(ctx, func(conn pg.Conn) error { return s.svc.pg.WithTx(ctx, func(conn pg.Conn) error {
mesure := &coredata.Mesure{ID: mesureID} measure := &coredata.Measure{ID: measureID}
if err := mesure.Delete(ctx, conn, s.svc.scope); err != nil { if err := measure.Delete(ctx, conn, s.svc.scope); err != nil {
return fmt.Errorf("cannot delete mesure: %w", err) return fmt.Errorf("cannot delete measure: %w", err)
} }
return nil return nil

View File

@@ -59,9 +59,9 @@ type (
} }
) )
func (s RiskService) ListForMesureID( func (s RiskService) ListForMeasureID(
ctx context.Context, ctx context.Context,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[coredata.RiskOrderField], cursor *page.Cursor[coredata.RiskOrderField],
) (*page.Page[*coredata.Risk, coredata.RiskOrderField], error) { ) (*page.Page[*coredata.Risk, coredata.RiskOrderField], error) {
var risks coredata.Risks var risks coredata.Risks
@@ -69,7 +69,7 @@ func (s RiskService) ListForMesureID(
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return risks.LoadByMesureID(ctx, conn, s.svc.scope, mesureID, cursor) return risks.LoadByMeasureID(ctx, conn, s.svc.scope, measureID, cursor)
}, },
) )
@@ -120,14 +120,14 @@ func (s RiskService) DeletePolicyMapping(
) )
} }
func (s RiskService) CreateMesureMapping( func (s RiskService) CreateMeasureMapping(
ctx context.Context, ctx context.Context,
riskID gid.GID, riskID gid.GID,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
riskMesure := &coredata.RiskMesure{ riskMeasure := &coredata.RiskMeasure{
RiskID: riskID, RiskID: riskID,
MesureID: mesureID, MeasureID: measureID,
TenantID: s.svc.scope.GetTenantID(), TenantID: s.svc.scope.GetTenantID(),
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }
@@ -135,19 +135,19 @@ func (s RiskService) CreateMesureMapping(
return s.svc.pg.WithConn( return s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return riskMesure.Insert(ctx, conn, s.svc.scope) return riskMeasure.Insert(ctx, conn, s.svc.scope)
}, },
) )
} }
func (s RiskService) DeleteMesureMapping( func (s RiskService) DeleteMeasureMapping(
ctx context.Context, ctx context.Context,
riskID gid.GID, riskID gid.GID,
mesureID gid.GID, measureID gid.GID,
) error { ) error {
riskMesure := &coredata.RiskMesure{ riskMeasure := &coredata.RiskMeasure{
RiskID: riskID, RiskID: riskID,
MesureID: mesureID, MeasureID: measureID,
TenantID: s.svc.scope.GetTenantID(), TenantID: s.svc.scope.GetTenantID(),
CreatedAt: time.Now(), CreatedAt: time.Now(),
} }
@@ -155,7 +155,7 @@ func (s RiskService) DeleteMesureMapping(
return s.svc.pg.WithConn( return s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return riskMesure.Delete(ctx, conn, s.svc.scope) return riskMeasure.Delete(ctx, conn, s.svc.scope)
}, },
) )
} }

View File

@@ -44,7 +44,7 @@ type (
hostname string hostname string
tokenSecret string tokenSecret string
Frameworks *FrameworkService Frameworks *FrameworkService
Mesures *MesureService Measures *MeasureService
Tasks *TaskService Tasks *TaskService
Evidences *EvidenceService Evidences *EvidenceService
Organizations *OrganizationService Organizations *OrganizationService
@@ -95,7 +95,7 @@ func (s *Service) WithTenant(tenantID gid.TenantID) *TenantService {
} }
tenantService.Frameworks = &FrameworkService{svc: tenantService} tenantService.Frameworks = &FrameworkService{svc: tenantService}
tenantService.Mesures = &MesureService{svc: tenantService} tenantService.Measures = &MeasureService{svc: tenantService}
tenantService.Tasks = &TaskService{svc: tenantService} tenantService.Tasks = &TaskService{svc: tenantService}
tenantService.Evidences = &EvidenceService{svc: tenantService} tenantService.Evidences = &EvidenceService{svc: tenantService}
tenantService.Peoples = &PeopleService{svc: tenantService} tenantService.Peoples = &PeopleService{svc: tenantService}

View File

@@ -32,7 +32,7 @@ type (
} }
CreateTaskRequest struct { CreateTaskRequest struct {
MesureID gid.GID MeasureID gid.GID
Name string Name string
Description string Description string
TimeEstimate *time.Duration TimeEstimate *time.Duration
@@ -65,7 +65,7 @@ func (s TaskService) Create(
task := &coredata.Task{ task := &coredata.Task{
ID: taskID, ID: taskID,
MesureID: req.MesureID, MeasureID: req.MeasureID,
Name: req.Name, Name: req.Name,
Description: req.Description, Description: req.Description,
TimeEstimate: req.TimeEstimate, TimeEstimate: req.TimeEstimate,
@@ -215,9 +215,9 @@ func (s TaskService) Delete(
return nil return nil
} }
func (s TaskService) ListForMesureID( func (s TaskService) ListForMeasureID(
ctx context.Context, ctx context.Context,
mesureID gid.GID, measureID gid.GID,
cursor *page.Cursor[coredata.TaskOrderField], cursor *page.Cursor[coredata.TaskOrderField],
) (*page.Page[*coredata.Task, coredata.TaskOrderField], error) { ) (*page.Page[*coredata.Task, coredata.TaskOrderField], error) {
var tasks coredata.Tasks var tasks coredata.Tasks
@@ -225,11 +225,11 @@ func (s TaskService) ListForMesureID(
err := s.svc.pg.WithConn( err := s.svc.pg.WithConn(
ctx, ctx,
func(conn pg.Conn) error { func(conn pg.Conn) error {
return tasks.LoadByMesureID( return tasks.LoadByMeasureID(
ctx, ctx,
conn, conn,
s.svc.scope, s.svc.scope,
mesureID, measureID,
cursor, cursor,
) )
}, },

View File

@@ -40,23 +40,23 @@ enum OrderDirection
DESC @goEnum(value: "github.com/getprobo/probo/pkg/page.OrderDirectionDesc") DESC @goEnum(value: "github.com/getprobo/probo/pkg/page.OrderDirectionDesc")
} }
enum MesureState enum MeasureState
@goModel(model: "github.com/getprobo/probo/pkg/coredata.MesureState") { @goModel(model: "github.com/getprobo/probo/pkg/coredata.MeasureState") {
NOT_STARTED NOT_STARTED
@goEnum( @goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MesureStateNotStarted" value: "github.com/getprobo/probo/pkg/coredata.MeasureStateNotStarted"
) )
IN_PROGRESS IN_PROGRESS
@goEnum( @goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MesureStateInProgress" value: "github.com/getprobo/probo/pkg/coredata.MeasureStateInProgress"
) )
NOT_APPLICABLE NOT_APPLICABLE
@goEnum( @goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MesureStateNotApplicable" value: "github.com/getprobo/probo/pkg/coredata.MeasureStateNotApplicable"
) )
IMPLEMENTED IMPLEMENTED
@goEnum( @goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MesureStateImplemented" value: "github.com/getprobo/probo/pkg/coredata.MeasureStateImplemented"
) )
} }
@@ -170,11 +170,11 @@ enum ControlOrderField
) )
} }
enum MesureOrderField enum MeasureOrderField
@goModel(model: "github.com/getprobo/probo/pkg/coredata.MesureOrderField") { @goModel(model: "github.com/getprobo/probo/pkg/coredata.MeasureOrderField") {
CREATED_AT CREATED_AT
@goEnum( @goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MesureOrderFieldCreatedAt" value: "github.com/getprobo/probo/pkg/coredata.MeasureOrderFieldCreatedAt"
) )
} }
@@ -321,12 +321,12 @@ input ControlOrder
field: ControlOrderField! field: ControlOrderField!
} }
input MesureOrder input MeasureOrder
@goModel( @goModel(
model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.MesureOrderBy" model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.MeasureOrderBy"
) { ) {
direction: OrderDirection! direction: OrderDirection!
field: MesureOrderField! field: MeasureOrderField!
} }
input TaskOrder input TaskOrder
@@ -445,13 +445,13 @@ type Organization implements Node {
orderBy: PolicyOrder orderBy: PolicyOrder
): PolicyConnection! @goField(forceResolver: true) ): PolicyConnection! @goField(forceResolver: true)
mesures( measures(
first: Int first: Int
after: CursorKey after: CursorKey
last: Int last: Int
before: CursorKey before: CursorKey
orderBy: MesureOrder orderBy: MeasureOrder
): MesureConnection! @goField(forceResolver: true) ): MeasureConnection! @goField(forceResolver: true)
risks( risks(
first: Int first: Int
@@ -571,13 +571,13 @@ type Control implements Node {
name: String! name: String!
description: String! description: String!
mesures( measures(
first: Int first: Int
after: CursorKey after: CursorKey
last: Int last: Int
before: CursorKey before: CursorKey
orderBy: MesureOrder orderBy: MeasureOrder
): MesureConnection! @goField(forceResolver: true) ): MeasureConnection! @goField(forceResolver: true)
policies( policies(
first: Int first: Int
@@ -591,12 +591,12 @@ type Control implements Node {
updatedAt: Datetime! updatedAt: Datetime!
} }
type Mesure implements Node { type Measure implements Node {
id: ID! id: ID!
category: String! category: String!
name: String! name: String!
description: String! description: String!
state: MesureState! state: MeasureState!
tasks( tasks(
first: Int first: Int
@@ -705,13 +705,13 @@ type Risk implements Node {
owner: People @goField(forceResolver: true) owner: People @goField(forceResolver: true)
mesures( measures(
first: Int first: Int
after: CursorKey after: CursorKey
last: Int last: Int
before: CursorKey before: CursorKey
orderBy: MesureOrder orderBy: MeasureOrder
): MesureConnection! @goField(forceResolver: true) ): MeasureConnection! @goField(forceResolver: true)
policies( policies(
first: Int first: Int
@@ -812,14 +812,14 @@ type ControlEdge {
node: Control! node: Control!
} }
type MesureConnection { type MeasureConnection {
edges: [MesureEdge!]! edges: [MeasureEdge!]!
pageInfo: PageInfo! pageInfo: PageInfo!
} }
type MesureEdge { type MeasureEdge {
cursor: CursorKey! cursor: CursorKey!
node: Mesure! node: Measure!
} }
type TaskConnection { type TaskConnection {
@@ -941,22 +941,22 @@ type Mutation {
importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload! importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload!
deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload! deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload!
# Mesure mutations # Measure mutations
createMesure(input: CreateMesureInput!): CreateMesurePayload! createMeasure(input: CreateMeasureInput!): CreateMeasurePayload!
updateMesure(input: UpdateMesureInput!): UpdateMesurePayload! updateMeasure(input: UpdateMeasureInput!): UpdateMeasurePayload!
importMesure(input: ImportMesureInput!): ImportMesurePayload! importMeasure(input: ImportMeasureInput!): ImportMeasurePayload!
deleteMesure(input: DeleteMesureInput!): DeleteMesurePayload! deleteMeasure(input: DeleteMeasureInput!): DeleteMeasurePayload!
# Control mutations # Control mutations
createControlMesureMapping( createControlMeasureMapping(
input: CreateControlMesureMappingInput! input: CreateControlMeasureMappingInput!
): CreateControlMesureMappingPayload! ): CreateControlMeasureMappingPayload!
createControlPolicyMapping( createControlPolicyMapping(
input: CreateControlPolicyMappingInput! input: CreateControlPolicyMappingInput!
): CreateControlPolicyMappingPayload! ): CreateControlPolicyMappingPayload!
deleteControlMesureMapping( deleteControlMeasureMapping(
input: DeleteControlMesureMappingInput! input: DeleteControlMeasureMappingInput!
): DeleteControlMesureMappingPayload! ): DeleteControlMeasureMappingPayload!
deleteControlPolicyMapping( deleteControlPolicyMapping(
input: DeleteControlPolicyMappingInput! input: DeleteControlPolicyMappingInput!
): DeleteControlPolicyMappingPayload! ): DeleteControlPolicyMappingPayload!
@@ -972,12 +972,12 @@ type Mutation {
createRisk(input: CreateRiskInput!): CreateRiskPayload! createRisk(input: CreateRiskInput!): CreateRiskPayload!
updateRisk(input: UpdateRiskInput!): UpdateRiskPayload! updateRisk(input: UpdateRiskInput!): UpdateRiskPayload!
deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload! deleteRisk(input: DeleteRiskInput!): DeleteRiskPayload!
createRiskMesureMapping( createRiskMeasureMapping(
input: CreateRiskMesureMappingInput! input: CreateRiskMeasureMappingInput!
): CreateRiskMesureMappingPayload! ): CreateRiskMeasureMappingPayload!
deleteRiskMesureMapping( deleteRiskMeasureMapping(
input: DeleteRiskMesureMappingInput! input: DeleteRiskMeasureMappingInput!
): DeleteRiskMesureMappingPayload! ): DeleteRiskMeasureMappingPayload!
createRiskPolicyMapping( createRiskPolicyMapping(
input: CreateRiskPolicyMappingInput! input: CreateRiskPolicyMappingInput!
@@ -1116,28 +1116,28 @@ input DeleteFrameworkInput {
frameworkId: ID! frameworkId: ID!
} }
input CreateMesureInput { input CreateMeasureInput {
organizationId: ID! organizationId: ID!
name: String! name: String!
description: String! description: String!
category: String! category: String!
} }
input UpdateMesureInput { input UpdateMeasureInput {
id: ID! id: ID!
name: String name: String
description: String description: String
category: String category: String
state: MesureState state: MeasureState
} }
input ImportMesureInput { input ImportMeasureInput {
organizationId: ID! organizationId: ID!
file: Upload! file: Upload!
} }
input CreateTaskInput { input CreateTaskInput {
mesureId: ID! measureId: ID!
name: String! name: String!
description: String! description: String!
timeEstimate: Duration timeEstimate: Duration
@@ -1165,9 +1165,9 @@ input UnassignTaskInput {
taskId: ID! taskId: ID!
} }
input CreateControlMesureMappingInput { input CreateControlMeasureMappingInput {
controlId: ID! controlId: ID!
mesureId: ID! measureId: ID!
} }
input CreateControlPolicyMappingInput { input CreateControlPolicyMappingInput {
@@ -1175,9 +1175,9 @@ input CreateControlPolicyMappingInput {
policyId: ID! policyId: ID!
} }
input DeleteControlMesureMappingInput { input DeleteControlMeasureMappingInput {
controlId: ID! controlId: ID!
mesureId: ID! measureId: ID!
} }
input DeleteControlPolicyMappingInput { input DeleteControlPolicyMappingInput {
@@ -1217,14 +1217,14 @@ input DeleteRiskInput {
riskId: ID! riskId: ID!
} }
input CreateRiskMesureMappingInput { input CreateRiskMeasureMappingInput {
riskId: ID! riskId: ID!
mesureId: ID! measureId: ID!
} }
input DeleteRiskMesureMappingInput { input DeleteRiskMeasureMappingInput {
riskId: ID! riskId: ID!
mesureId: ID! measureId: ID!
} }
input CreateRiskPolicyMappingInput { input CreateRiskPolicyMappingInput {
@@ -1363,16 +1363,16 @@ type DeleteFrameworkPayload {
deletedFrameworkId: ID! deletedFrameworkId: ID!
} }
type CreateMesurePayload { type CreateMeasurePayload {
mesureEdge: MesureEdge! measureEdge: MeasureEdge!
} }
type UpdateMesurePayload { type UpdateMeasurePayload {
mesure: Mesure! measure: Measure!
} }
type ImportMesurePayload { type ImportMeasurePayload {
mesureEdges: [MesureEdge!]! measureEdges: [MeasureEdge!]!
} }
type CreateTaskPayload { type CreateTaskPayload {
@@ -1395,7 +1395,7 @@ type UnassignTaskPayload {
task: Task! task: Task!
} }
type CreateControlMesureMappingPayload { type CreateControlMeasureMappingPayload {
success: Boolean! success: Boolean!
} }
@@ -1403,7 +1403,7 @@ type CreateControlPolicyMappingPayload {
success: Boolean! success: Boolean!
} }
type DeleteControlMesureMappingPayload { type DeleteControlMeasureMappingPayload {
success: Boolean! success: Boolean!
} }
@@ -1423,11 +1423,11 @@ type DeleteRiskPayload {
deletedRiskId: ID! deletedRiskId: ID!
} }
type CreateRiskMesureMappingPayload { type CreateRiskMeasureMappingPayload {
success: Boolean! success: Boolean!
} }
type DeleteRiskMesureMappingPayload { type DeleteRiskMeasureMappingPayload {
success: Boolean! success: Boolean!
} }
@@ -1535,12 +1535,12 @@ type CreateVendorRiskAssessmentPayload {
vendorRiskAssessmentEdge: VendorRiskAssessmentEdge! vendorRiskAssessmentEdge: VendorRiskAssessmentEdge!
} }
input DeleteMesureInput { input DeleteMeasureInput {
mesureId: ID! measureId: ID!
} }
type DeleteMesurePayload { type DeleteMeasurePayload {
deletedMesureId: ID! deletedMeasureId: ID!
} }
type PolicyVersion implements Node { type PolicyVersion implements Node {

File diff suppressed because it is too large Load Diff

View File

@@ -20,31 +20,31 @@ import (
) )
type ( type (
MesureOrderBy OrderBy[coredata.MesureOrderField] MeasureOrderBy OrderBy[coredata.MeasureOrderField]
) )
func NewMesureConnection(p *page.Page[*coredata.Mesure, coredata.MesureOrderField]) *MesureConnection { func NewMeasureConnection(p *page.Page[*coredata.Measure, coredata.MeasureOrderField]) *MeasureConnection {
var edges = make([]*MesureEdge, len(p.Data)) var edges = make([]*MeasureEdge, len(p.Data))
for i := range edges { for i := range edges {
edges[i] = NewMesureEdge(p.Data[i], p.Cursor.OrderBy.Field) edges[i] = NewMeasureEdge(p.Data[i], p.Cursor.OrderBy.Field)
} }
return &MesureConnection{ return &MeasureConnection{
Edges: edges, Edges: edges,
PageInfo: NewPageInfo(p), PageInfo: NewPageInfo(p),
} }
} }
func NewMesureEdge(c *coredata.Mesure, orderBy coredata.MesureOrderField) *MesureEdge { func NewMeasureEdge(c *coredata.Measure, orderBy coredata.MeasureOrderField) *MeasureEdge {
return &MesureEdge{ return &MeasureEdge{
Cursor: c.CursorKey(orderBy), Cursor: c.CursorKey(orderBy),
Node: NewMesure(c), Node: NewMeasure(c),
} }
} }
func NewMesure(c *coredata.Mesure) *Mesure { func NewMeasure(c *coredata.Measure) *Measure {
return &Mesure{ return &Measure{
ID: c.ID, ID: c.ID,
Category: c.Category, Category: c.Category,
Name: c.Name, Name: c.Name,

View File

@@ -67,7 +67,7 @@ type Control struct {
ReferenceID string `json:"referenceId"` ReferenceID string `json:"referenceId"`
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
Mesures *MesureConnection `json:"mesures"` Measures *MeasureConnection `json:"measures"`
Policies *PolicyConnection `json:"policies"` Policies *PolicyConnection `json:"policies"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
@@ -86,12 +86,12 @@ type ControlEdge struct {
Node *Control `json:"node"` Node *Control `json:"node"`
} }
type CreateControlMesureMappingInput struct { type CreateControlMeasureMappingInput struct {
ControlID gid.GID `json:"controlId"` ControlID gid.GID `json:"controlId"`
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
} }
type CreateControlMesureMappingPayload struct { type CreateControlMeasureMappingPayload struct {
Success bool `json:"success"` Success bool `json:"success"`
} }
@@ -135,15 +135,15 @@ type CreateFrameworkPayload struct {
FrameworkEdge *FrameworkEdge `json:"frameworkEdge"` FrameworkEdge *FrameworkEdge `json:"frameworkEdge"`
} }
type CreateMesureInput struct { type CreateMeasureInput struct {
OrganizationID gid.GID `json:"organizationId"` OrganizationID gid.GID `json:"organizationId"`
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
Category string `json:"category"` Category string `json:"category"`
} }
type CreateMesurePayload struct { type CreateMeasurePayload struct {
MesureEdge *MesureEdge `json:"mesureEdge"` MeasureEdge *MeasureEdge `json:"measureEdge"`
} }
type CreateOrganizationInput struct { type CreateOrganizationInput struct {
@@ -192,12 +192,12 @@ type CreateRiskInput struct {
Note *string `json:"note,omitempty"` Note *string `json:"note,omitempty"`
} }
type CreateRiskMesureMappingInput struct { type CreateRiskMeasureMappingInput struct {
RiskID gid.GID `json:"riskId"` RiskID gid.GID `json:"riskId"`
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
} }
type CreateRiskMesureMappingPayload struct { type CreateRiskMeasureMappingPayload struct {
Success bool `json:"success"` Success bool `json:"success"`
} }
@@ -215,7 +215,7 @@ type CreateRiskPolicyMappingPayload struct {
} }
type CreateTaskInput struct { type CreateTaskInput struct {
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
TimeEstimate *time.Duration `json:"timeEstimate,omitempty"` TimeEstimate *time.Duration `json:"timeEstimate,omitempty"`
@@ -265,12 +265,12 @@ type CreateVendorRiskAssessmentPayload struct {
VendorRiskAssessmentEdge *VendorRiskAssessmentEdge `json:"vendorRiskAssessmentEdge"` VendorRiskAssessmentEdge *VendorRiskAssessmentEdge `json:"vendorRiskAssessmentEdge"`
} }
type DeleteControlMesureMappingInput struct { type DeleteControlMeasureMappingInput struct {
ControlID gid.GID `json:"controlId"` ControlID gid.GID `json:"controlId"`
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
} }
type DeleteControlMesureMappingPayload struct { type DeleteControlMeasureMappingPayload struct {
Success bool `json:"success"` Success bool `json:"success"`
} }
@@ -299,12 +299,12 @@ type DeleteFrameworkPayload struct {
DeletedFrameworkID gid.GID `json:"deletedFrameworkId"` DeletedFrameworkID gid.GID `json:"deletedFrameworkId"`
} }
type DeleteMesureInput struct { type DeleteMeasureInput struct {
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
} }
type DeleteMesurePayload struct { type DeleteMeasurePayload struct {
DeletedMesureID gid.GID `json:"deletedMesureId"` DeletedMeasureID gid.GID `json:"deletedMeasureId"`
} }
type DeleteOrganizationInput struct { type DeleteOrganizationInput struct {
@@ -335,12 +335,12 @@ type DeleteRiskInput struct {
RiskID gid.GID `json:"riskId"` RiskID gid.GID `json:"riskId"`
} }
type DeleteRiskMesureMappingInput struct { type DeleteRiskMeasureMappingInput struct {
RiskID gid.GID `json:"riskId"` RiskID gid.GID `json:"riskId"`
MesureID gid.GID `json:"mesureId"` MeasureID gid.GID `json:"measureId"`
} }
type DeleteRiskMesureMappingPayload struct { type DeleteRiskMeasureMappingPayload struct {
Success bool `json:"success"` Success bool `json:"success"`
} }
@@ -450,13 +450,13 @@ type ImportFrameworkPayload struct {
FrameworkEdge *FrameworkEdge `json:"frameworkEdge"` FrameworkEdge *FrameworkEdge `json:"frameworkEdge"`
} }
type ImportMesureInput struct { type ImportMeasureInput struct {
OrganizationID gid.GID `json:"organizationId"` OrganizationID gid.GID `json:"organizationId"`
File graphql.Upload `json:"file"` File graphql.Upload `json:"file"`
} }
type ImportMesurePayload struct { type ImportMeasurePayload struct {
MesureEdges []*MesureEdge `json:"mesureEdges"` MeasureEdges []*MeasureEdge `json:"measureEdges"`
} }
type InviteUserInput struct { type InviteUserInput struct {
@@ -469,12 +469,12 @@ type InviteUserPayload struct {
Success bool `json:"success"` Success bool `json:"success"`
} }
type Mesure struct { type Measure struct {
ID gid.GID `json:"id"` ID gid.GID `json:"id"`
Category string `json:"category"` Category string `json:"category"`
Name string `json:"name"` Name string `json:"name"`
Description string `json:"description"` Description string `json:"description"`
State coredata.MesureState `json:"state"` State coredata.MeasureState `json:"state"`
Tasks *TaskConnection `json:"tasks"` Tasks *TaskConnection `json:"tasks"`
Risks *RiskConnection `json:"risks"` Risks *RiskConnection `json:"risks"`
Controls *ControlConnection `json:"controls"` Controls *ControlConnection `json:"controls"`
@@ -482,17 +482,17 @@ type Mesure struct {
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
} }
func (Mesure) IsNode() {} func (Measure) IsNode() {}
func (this Mesure) GetID() gid.GID { return this.ID } func (this Measure) GetID() gid.GID { return this.ID }
type MesureConnection struct { type MeasureConnection struct {
Edges []*MesureEdge `json:"edges"` Edges []*MeasureEdge `json:"edges"`
PageInfo *PageInfo `json:"pageInfo"` PageInfo *PageInfo `json:"pageInfo"`
} }
type MesureEdge struct { type MeasureEdge struct {
Cursor page.CursorKey `json:"cursor"` Cursor page.CursorKey `json:"cursor"`
Node *Mesure `json:"node"` Node *Measure `json:"node"`
} }
type Mutation struct { type Mutation struct {
@@ -508,7 +508,7 @@ type Organization struct {
Vendors *VendorConnection `json:"vendors"` Vendors *VendorConnection `json:"vendors"`
Peoples *PeopleConnection `json:"peoples"` Peoples *PeopleConnection `json:"peoples"`
Policies *PolicyConnection `json:"policies"` Policies *PolicyConnection `json:"policies"`
Mesures *MesureConnection `json:"mesures"` Measures *MeasureConnection `json:"measures"`
Risks *RiskConnection `json:"risks"` Risks *RiskConnection `json:"risks"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
@@ -703,7 +703,7 @@ type Risk struct {
ResidualSeverity int `json:"residualSeverity"` ResidualSeverity int `json:"residualSeverity"`
Note string `json:"note"` Note string `json:"note"`
Owner *People `json:"owner,omitempty"` Owner *People `json:"owner,omitempty"`
Mesures *MesureConnection `json:"mesures"` Measures *MeasureConnection `json:"measures"`
Policies *PolicyConnection `json:"policies"` Policies *PolicyConnection `json:"policies"`
Controls *ControlConnection `json:"controls"` Controls *ControlConnection `json:"controls"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
@@ -779,16 +779,16 @@ type UpdateFrameworkPayload struct {
Framework *Framework `json:"framework"` Framework *Framework `json:"framework"`
} }
type UpdateMesureInput struct { type UpdateMeasureInput struct {
ID gid.GID `json:"id"` ID gid.GID `json:"id"`
Name *string `json:"name,omitempty"` Name *string `json:"name,omitempty"`
Description *string `json:"description,omitempty"` Description *string `json:"description,omitempty"`
Category *string `json:"category,omitempty"` Category *string `json:"category,omitempty"`
State *coredata.MesureState `json:"state,omitempty"` State *coredata.MeasureState `json:"state,omitempty"`
} }
type UpdateMesurePayload struct { type UpdateMeasurePayload struct {
Mesure *Mesure `json:"mesure"` Measure *Measure `json:"measure"`
} }
type UpdateOrganizationInput struct { type UpdateOrganizationInput struct {

View File

@@ -20,16 +20,16 @@ import (
"github.com/vektah/gqlparser/v2/gqlerror" "github.com/vektah/gqlparser/v2/gqlerror"
) )
// Mesures is the resolver for the mesures field. // Measures is the resolver for the measures field.
func (r *controlResolver) Mesures(ctx context.Context, obj *types.Control, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MesureOrderBy) (*types.MesureConnection, error) { func (r *controlResolver) Measures(ctx context.Context, obj *types.Control, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MeasureOrderBy) (*types.MeasureConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.MesureOrderField]{ pageOrderBy := page.OrderBy[coredata.MeasureOrderField]{
Field: coredata.MesureOrderFieldCreatedAt, Field: coredata.MeasureOrderFieldCreatedAt,
Direction: page.OrderDirectionDesc, Direction: page.OrderDirectionDesc,
} }
if orderBy != nil { if orderBy != nil {
pageOrderBy = page.OrderBy[coredata.MesureOrderField]{ pageOrderBy = page.OrderBy[coredata.MeasureOrderField]{
Field: orderBy.Field, Field: orderBy.Field,
Direction: orderBy.Direction, Direction: orderBy.Direction,
} }
@@ -37,12 +37,12 @@ func (r *controlResolver) Mesures(ctx context.Context, obj *types.Control, first
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Mesures.ListForControlID(ctx, obj.ID, cursor) page, err := svc.Measures.ListForControlID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot list mesures: %w", err) return nil, fmt.Errorf("cannot list measures: %w", err)
} }
return types.NewMesureConnection(page), nil return types.NewMeasureConnection(page), nil
} }
// Policies is the resolver for the policies field. // Policies is the resolver for the policies field.
@@ -113,7 +113,7 @@ func (r *frameworkResolver) Controls(ctx context.Context, obj *types.Framework,
} }
// Tasks is the resolver for the tasks field. // Tasks is the resolver for the tasks field.
func (r *mesureResolver) Tasks(ctx context.Context, obj *types.Mesure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.TaskOrderBy) (*types.TaskConnection, error) { func (r *measureResolver) Tasks(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.TaskOrderBy) (*types.TaskConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.TaskOrderField]{ pageOrderBy := page.OrderBy[coredata.TaskOrderField]{
@@ -129,16 +129,16 @@ func (r *mesureResolver) Tasks(ctx context.Context, obj *types.Mesure, first *in
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Tasks.ListForMesureID(ctx, obj.ID, cursor) page, err := svc.Tasks.ListForMeasureID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot list mesure tasks: %w", err) return nil, fmt.Errorf("cannot list measure tasks: %w", err)
} }
return types.NewTaskConnection(page), nil return types.NewTaskConnection(page), nil
} }
// Risks is the resolver for the risks field. // Risks is the resolver for the risks field.
func (r *mesureResolver) Risks(ctx context.Context, obj *types.Mesure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.RiskOrderBy) (*types.RiskConnection, error) { func (r *measureResolver) Risks(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.RiskOrderBy) (*types.RiskConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.RiskOrderField]{ pageOrderBy := page.OrderBy[coredata.RiskOrderField]{
@@ -154,16 +154,16 @@ func (r *mesureResolver) Risks(ctx context.Context, obj *types.Mesure, first *in
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Risks.ListForMesureID(ctx, obj.ID, cursor) page, err := svc.Risks.ListForMeasureID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot list mesure risks: %w", err) return nil, fmt.Errorf("cannot list measure risks: %w", err)
} }
return types.NewRiskConnection(page), nil return types.NewRiskConnection(page), nil
} }
// Controls is the resolver for the controls field. // Controls is the resolver for the controls field.
func (r *mesureResolver) Controls(ctx context.Context, obj *types.Mesure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ControlOrderBy) (*types.ControlConnection, error) { func (r *measureResolver) Controls(ctx context.Context, obj *types.Measure, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ControlOrderBy) (*types.ControlConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.ControlOrderField]{ pageOrderBy := page.OrderBy[coredata.ControlOrderField]{
@@ -179,9 +179,9 @@ func (r *mesureResolver) Controls(ctx context.Context, obj *types.Mesure, first
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Controls.ListForMesureID(ctx, obj.ID, cursor) page, err := svc.Controls.ListForMeasureID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot list mesure controls: %w", err) return nil, fmt.Errorf("cannot list measure controls: %w", err)
} }
return types.NewControlConnection(page), nil return types.NewControlConnection(page), nil
@@ -530,30 +530,30 @@ func (r *mutationResolver) DeleteFramework(ctx context.Context, input types.Dele
}, nil }, nil
} }
// // CreateMesure is the resolver for the createMesure field. // // CreateMeasure is the resolver for the createMeasure field.
func (r *mutationResolver) CreateMesure(ctx context.Context, input types.CreateMesureInput) (*types.CreateMesurePayload, error) { func (r *mutationResolver) CreateMeasure(ctx context.Context, input types.CreateMeasureInput) (*types.CreateMeasurePayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.OrganizationID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.OrganizationID.TenantID())
mesure, err := svc.Mesures.Create(ctx, probo.CreateMesureRequest{ measure, err := svc.Measures.Create(ctx, probo.CreateMeasureRequest{
OrganizationID: input.OrganizationID, OrganizationID: input.OrganizationID,
Name: input.Name, Name: input.Name,
Description: input.Description, Description: input.Description,
Category: input.Category, Category: input.Category,
}) })
if err != nil { if err != nil {
panic(fmt.Errorf("cannot create mesure: %w", err)) panic(fmt.Errorf("cannot create measure: %w", err))
} }
return &types.CreateMesurePayload{ return &types.CreateMeasurePayload{
MesureEdge: types.NewMesureEdge(mesure, coredata.MesureOrderFieldCreatedAt), MeasureEdge: types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt),
}, nil }, nil
} }
// UpdateMesure is the resolver for the updateMesure field. // UpdateMeasure is the resolver for the updateMeasure field.
func (r *mutationResolver) UpdateMesure(ctx context.Context, input types.UpdateMesureInput) (*types.UpdateMesurePayload, error) { func (r *mutationResolver) UpdateMeasure(ctx context.Context, input types.UpdateMeasureInput) (*types.UpdateMeasurePayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.ID.TenantID())
mesure, err := svc.Mesures.Update(ctx, probo.UpdateMesureRequest{ measure, err := svc.Measures.Update(ctx, probo.UpdateMeasureRequest{
ID: input.ID, ID: input.ID,
Name: input.Name, Name: input.Name,
Description: input.Description, Description: input.Description,
@@ -561,62 +561,62 @@ func (r *mutationResolver) UpdateMesure(ctx context.Context, input types.UpdateM
State: input.State, State: input.State,
}) })
if err != nil { if err != nil {
panic(fmt.Errorf("cannot update mesure: %w", err)) panic(fmt.Errorf("cannot update measure: %w", err))
} }
return &types.UpdateMesurePayload{ return &types.UpdateMeasurePayload{
Mesure: types.NewMesure(mesure), Measure: types.NewMeasure(measure),
}, nil }, nil
} }
// ImportMesure is the resolver for the importMesure field. // ImportMeasure is the resolver for the importMeasure field.
func (r *mutationResolver) ImportMesure(ctx context.Context, input types.ImportMesureInput) (*types.ImportMesurePayload, error) { func (r *mutationResolver) ImportMeasure(ctx context.Context, input types.ImportMeasureInput) (*types.ImportMeasurePayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.OrganizationID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.OrganizationID.TenantID())
var req probo.ImportMesureRequest var req probo.ImportMeasureRequest
if err := json.NewDecoder(input.File.File).Decode(&req.Mesures); err != nil { if err := json.NewDecoder(input.File.File).Decode(&req.Measures); err != nil {
return nil, fmt.Errorf("cannot unmarshal mesure: %w", err) return nil, fmt.Errorf("cannot unmarshal measure: %w", err)
} }
mesures, err := svc.Mesures.Import(ctx, input.OrganizationID, req) measures, err := svc.Measures.Import(ctx, input.OrganizationID, req)
if err != nil { if err != nil {
return nil, fmt.Errorf("cannot import mesure: %w", err) return nil, fmt.Errorf("cannot import measure: %w", err)
} }
mesureEdges := make([]*types.MesureEdge, len(mesures.Data)) measureEdges := make([]*types.MeasureEdge, len(measures.Data))
for i, mesure := range mesures.Data { for i, measure := range measures.Data {
mesureEdges[i] = types.NewMesureEdge(mesure, coredata.MesureOrderFieldCreatedAt) measureEdges[i] = types.NewMeasureEdge(measure, coredata.MeasureOrderFieldCreatedAt)
} }
return &types.ImportMesurePayload{ return &types.ImportMeasurePayload{
MesureEdges: mesureEdges, MeasureEdges: measureEdges,
}, nil }, nil
} }
// DeleteMesure is the resolver for the deleteMesure field. // DeleteMeasure is the resolver for the deleteMeasure field.
func (r *mutationResolver) DeleteMesure(ctx context.Context, input types.DeleteMesureInput) (*types.DeleteMesurePayload, error) { func (r *mutationResolver) DeleteMeasure(ctx context.Context, input types.DeleteMeasureInput) (*types.DeleteMeasurePayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.MesureID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.MeasureID.TenantID())
err := svc.Mesures.Delete(ctx, input.MesureID) err := svc.Measures.Delete(ctx, input.MeasureID)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot delete mesure: %w", err)) panic(fmt.Errorf("cannot delete measure: %w", err))
} }
return &types.DeleteMesurePayload{ return &types.DeleteMeasurePayload{
DeletedMesureID: input.MesureID, DeletedMeasureID: input.MeasureID,
}, nil }, nil
} }
// CreateControlMesureMapping is the resolver for the createControlMesureMapping field. // CreateControlMeasureMapping is the resolver for the createControlMeasureMapping field.
func (r *mutationResolver) CreateControlMesureMapping(ctx context.Context, input types.CreateControlMesureMappingInput) (*types.CreateControlMesureMappingPayload, error) { func (r *mutationResolver) CreateControlMeasureMapping(ctx context.Context, input types.CreateControlMeasureMappingInput) (*types.CreateControlMeasureMappingPayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.MesureID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.MeasureID.TenantID())
err := svc.Controls.CreateMesureMapping(ctx, input.ControlID, input.MesureID) err := svc.Controls.CreateMeasureMapping(ctx, input.ControlID, input.MeasureID)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot create control mesure mapping: %w", err)) panic(fmt.Errorf("cannot create control measure mapping: %w", err))
} }
return &types.CreateControlMesureMappingPayload{ return &types.CreateControlMeasureMappingPayload{
Success: true, Success: true,
}, nil }, nil
} }
@@ -635,16 +635,16 @@ func (r *mutationResolver) CreateControlPolicyMapping(ctx context.Context, input
}, nil }, nil
} }
// DeleteControlMesureMapping is the resolver for the deleteControlMesureMapping field. // DeleteControlMeasureMapping is the resolver for the deleteControlMeasureMapping field.
func (r *mutationResolver) DeleteControlMesureMapping(ctx context.Context, input types.DeleteControlMesureMappingInput) (*types.DeleteControlMesureMappingPayload, error) { func (r *mutationResolver) DeleteControlMeasureMapping(ctx context.Context, input types.DeleteControlMeasureMappingInput) (*types.DeleteControlMeasureMappingPayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.MesureID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.MeasureID.TenantID())
err := svc.Controls.DeleteMesureMapping(ctx, input.ControlID, input.MesureID) err := svc.Controls.DeleteMeasureMapping(ctx, input.ControlID, input.MeasureID)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot delete control mesure mapping: %w", err)) panic(fmt.Errorf("cannot delete control measure mapping: %w", err))
} }
return &types.DeleteControlMesureMappingPayload{ return &types.DeleteControlMeasureMappingPayload{
Success: true, Success: true,
}, nil }, nil
} }
@@ -665,10 +665,10 @@ func (r *mutationResolver) DeleteControlPolicyMapping(ctx context.Context, input
// CreateTask is the resolver for the createTask field. // CreateTask is the resolver for the createTask field.
func (r *mutationResolver) CreateTask(ctx context.Context, input types.CreateTaskInput) (*types.CreateTaskPayload, error) { func (r *mutationResolver) CreateTask(ctx context.Context, input types.CreateTaskInput) (*types.CreateTaskPayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.MesureID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.MeasureID.TenantID())
task, err := svc.Tasks.Create(ctx, probo.CreateTaskRequest{ task, err := svc.Tasks.Create(ctx, probo.CreateTaskRequest{
MesureID: input.MesureID, MeasureID: input.MeasureID,
Name: input.Name, Name: input.Name,
Description: input.Description, Description: input.Description,
TimeEstimate: input.TimeEstimate, TimeEstimate: input.TimeEstimate,
@@ -816,30 +816,30 @@ func (r *mutationResolver) DeleteRisk(ctx context.Context, input types.DeleteRis
}, nil }, nil
} }
// CreateRiskMesureMapping is the resolver for the createRiskMesureMapping field. // CreateRiskMeasureMapping is the resolver for the createRiskMeasureMapping field.
func (r *mutationResolver) CreateRiskMesureMapping(ctx context.Context, input types.CreateRiskMesureMappingInput) (*types.CreateRiskMesureMappingPayload, error) { func (r *mutationResolver) CreateRiskMeasureMapping(ctx context.Context, input types.CreateRiskMeasureMappingInput) (*types.CreateRiskMeasureMappingPayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.RiskID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.RiskID.TenantID())
err := svc.Risks.CreateMesureMapping(ctx, input.RiskID, input.MesureID) err := svc.Risks.CreateMeasureMapping(ctx, input.RiskID, input.MeasureID)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot create risk mesure mapping: %w", err)) panic(fmt.Errorf("cannot create risk measure mapping: %w", err))
} }
return &types.CreateRiskMesureMappingPayload{ return &types.CreateRiskMeasureMappingPayload{
Success: true, Success: true,
}, nil }, nil
} }
// DeleteRiskMesureMapping is the resolver for the deleteRiskMesureMapping field. // DeleteRiskMeasureMapping is the resolver for the deleteRiskMeasureMapping field.
func (r *mutationResolver) DeleteRiskMesureMapping(ctx context.Context, input types.DeleteRiskMesureMappingInput) (*types.DeleteRiskMesureMappingPayload, error) { func (r *mutationResolver) DeleteRiskMeasureMapping(ctx context.Context, input types.DeleteRiskMeasureMappingInput) (*types.DeleteRiskMeasureMappingPayload, error) {
svc := GetTenantService(ctx, r.proboSvc, input.RiskID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, input.RiskID.TenantID())
err := svc.Risks.DeleteMesureMapping(ctx, input.RiskID, input.MesureID) err := svc.Risks.DeleteMeasureMapping(ctx, input.RiskID, input.MeasureID)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot delete risk mesure mapping: %w", err)) panic(fmt.Errorf("cannot delete risk measure mapping: %w", err))
} }
return &types.DeleteRiskMesureMappingPayload{ return &types.DeleteRiskMeasureMappingPayload{
Success: true, Success: true,
}, nil }, nil
} }
@@ -1327,16 +1327,16 @@ func (r *organizationResolver) Policies(ctx context.Context, obj *types.Organiza
return types.NewPolicyConnection(page), nil return types.NewPolicyConnection(page), nil
} }
// Mesures is the resolver for the mesures field. // Measures is the resolver for the measures field.
func (r *organizationResolver) Mesures(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MesureOrderBy) (*types.MesureConnection, error) { func (r *organizationResolver) Measures(ctx context.Context, obj *types.Organization, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MeasureOrderBy) (*types.MeasureConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.MesureOrderField]{ pageOrderBy := page.OrderBy[coredata.MeasureOrderField]{
Field: coredata.MesureOrderFieldCreatedAt, Field: coredata.MeasureOrderFieldCreatedAt,
Direction: page.OrderDirectionDesc, Direction: page.OrderDirectionDesc,
} }
if orderBy != nil { if orderBy != nil {
pageOrderBy = page.OrderBy[coredata.MesureOrderField]{ pageOrderBy = page.OrderBy[coredata.MeasureOrderField]{
Field: orderBy.Field, Field: orderBy.Field,
Direction: orderBy.Direction, Direction: orderBy.Direction,
} }
@@ -1344,12 +1344,12 @@ func (r *organizationResolver) Mesures(ctx context.Context, obj *types.Organizat
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Mesures.ListForOrganizationID(ctx, obj.ID, cursor) page, err := svc.Measures.ListForOrganizationID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot list organization mesures: %w", err)) panic(fmt.Errorf("cannot list organization measures: %w", err))
} }
return types.NewMesureConnection(page), nil return types.NewMeasureConnection(page), nil
} }
// Risks is the resolver for the risks field. // Risks is the resolver for the risks field.
@@ -1592,13 +1592,13 @@ func (r *queryResolver) Node(ctx context.Context, id gid.GID) (types.Node, error
} }
return types.NewFramework(framework), nil return types.NewFramework(framework), nil
case coredata.MesureEntityType: case coredata.MeasureEntityType:
mesure, err := svc.Mesures.Get(ctx, id) measure, err := svc.Measures.Get(ctx, id)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot get mesure: %w", err)) panic(fmt.Errorf("cannot get measure: %w", err))
} }
return types.NewMesure(mesure), nil return types.NewMeasure(measure), nil
case coredata.TaskEntityType: case coredata.TaskEntityType:
task, err := svc.Tasks.Get(ctx, id) task, err := svc.Tasks.Get(ctx, id)
if err != nil { if err != nil {
@@ -1688,16 +1688,16 @@ func (r *riskResolver) Owner(ctx context.Context, obj *types.Risk) (*types.Peopl
return types.NewPeople(owner), nil return types.NewPeople(owner), nil
} }
// Mesures is the resolver for the mesures field. // Measures is the resolver for the measures field.
func (r *riskResolver) Mesures(ctx context.Context, obj *types.Risk, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MesureOrderBy) (*types.MesureConnection, error) { func (r *riskResolver) Measures(ctx context.Context, obj *types.Risk, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.MeasureOrderBy) (*types.MeasureConnection, error) {
svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID()) svc := GetTenantService(ctx, r.proboSvc, obj.ID.TenantID())
pageOrderBy := page.OrderBy[coredata.MesureOrderField]{ pageOrderBy := page.OrderBy[coredata.MeasureOrderField]{
Field: coredata.MesureOrderFieldCreatedAt, Field: coredata.MeasureOrderFieldCreatedAt,
Direction: page.OrderDirectionDesc, Direction: page.OrderDirectionDesc,
} }
if orderBy != nil { if orderBy != nil {
pageOrderBy = page.OrderBy[coredata.MesureOrderField]{ pageOrderBy = page.OrderBy[coredata.MeasureOrderField]{
Field: orderBy.Field, Field: orderBy.Field,
Direction: orderBy.Direction, Direction: orderBy.Direction,
} }
@@ -1705,12 +1705,12 @@ func (r *riskResolver) Mesures(ctx context.Context, obj *types.Risk, first *int,
cursor := types.NewCursor(first, after, last, before, pageOrderBy) cursor := types.NewCursor(first, after, last, before, pageOrderBy)
page, err := svc.Mesures.ListForRiskID(ctx, obj.ID, cursor) page, err := svc.Measures.ListForRiskID(ctx, obj.ID, cursor)
if err != nil { if err != nil {
panic(fmt.Errorf("cannot list risk mesures: %w", err)) panic(fmt.Errorf("cannot list risk measures: %w", err))
} }
return types.NewMesureConnection(page), nil return types.NewMeasureConnection(page), nil
} }
// Policies is the resolver for the policies field. // Policies is the resolver for the policies field.
@@ -1999,8 +1999,8 @@ func (r *Resolver) Evidence() schema.EvidenceResolver { return &evidenceResolver
// Framework returns schema.FrameworkResolver implementation. // Framework returns schema.FrameworkResolver implementation.
func (r *Resolver) Framework() schema.FrameworkResolver { return &frameworkResolver{r} } func (r *Resolver) Framework() schema.FrameworkResolver { return &frameworkResolver{r} }
// Mesure returns schema.MesureResolver implementation. // Measure returns schema.MeasureResolver implementation.
func (r *Resolver) Mesure() schema.MesureResolver { return &mesureResolver{r} } func (r *Resolver) Measure() schema.MeasureResolver { return &measureResolver{r} }
// Mutation returns schema.MutationResolver implementation. // Mutation returns schema.MutationResolver implementation.
func (r *Resolver) Mutation() schema.MutationResolver { return &mutationResolver{r} } func (r *Resolver) Mutation() schema.MutationResolver { return &mutationResolver{r} }
@@ -2050,7 +2050,7 @@ func (r *Resolver) Viewer() schema.ViewerResolver { return &viewerResolver{r} }
type controlResolver struct{ *Resolver } type controlResolver struct{ *Resolver }
type evidenceResolver struct{ *Resolver } type evidenceResolver struct{ *Resolver }
type frameworkResolver struct{ *Resolver } type frameworkResolver struct{ *Resolver }
type mesureResolver struct{ *Resolver } type measureResolver struct{ *Resolver }
type mutationResolver struct{ *Resolver } type mutationResolver struct{ *Resolver }
type organizationResolver struct{ *Resolver } type organizationResolver struct{ *Resolver }
type policyResolver struct{ *Resolver } type policyResolver struct{ *Resolver }