diff --git a/apps/console/src/__generated__/core/ProcessingActivitiesPageFragment.graphql.ts b/apps/console/src/__generated__/core/ProcessingActivitiesPageFragment.graphql.ts index 4ca3270f1..0a632aac7 100644 --- a/apps/console/src/__generated__/core/ProcessingActivitiesPageFragment.graphql.ts +++ b/apps/console/src/__generated__/core/ProcessingActivitiesPageFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<7cb2759bd509c11cb25bb1af2a6105cd>> * @lightSyntaxTransform * @nogrep */ @@ -17,6 +17,8 @@ export type ProcessingActivitiesPageFragment$data = { readonly __id: string; readonly edges: ReadonlyArray<{ readonly node: { + readonly canDelete: boolean; + readonly canUpdate: boolean; readonly createdAt: string; readonly dataSubjectCategory: string | null | undefined; readonly id: string; @@ -228,6 +230,32 @@ return { "name": "updatedAt", "storageKey": null }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:delete\")" + }, { "alias": null, "args": null, @@ -294,6 +322,6 @@ return { }; })(); -(node as any).hash = "e60b3eb3cf3d172625c2873cb05039bd"; +(node as any).hash = "df348ac63bc56da06da97e484fb2c0e5"; export default node; diff --git a/apps/console/src/__generated__/core/ProcessingActivitiesPageRefetchQuery.graphql.ts b/apps/console/src/__generated__/core/ProcessingActivitiesPageRefetchQuery.graphql.ts index f022c7cb9..cc62b19e2 100644 --- a/apps/console/src/__generated__/core/ProcessingActivitiesPageRefetchQuery.graphql.ts +++ b/apps/console/src/__generated__/core/ProcessingActivitiesPageRefetchQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<0408262bc53f870212c3a87156f861f4>> + * @generated SignedSource<<504b0d0e997eb43eb8d370a21cb3e0fb>> * @lightSyntaxTransform * @nogrep */ @@ -263,6 +263,32 @@ return { "name": "updatedAt", "storageKey": null }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:delete\")" + }, (v8/*: any*/) ], "storageKey": null @@ -338,16 +364,16 @@ return { ] }, "params": { - "cacheID": "bf2fb9a8eb709e64268710ca36f86a72", + "cacheID": "71c255d719fe0ffafda13169e925b4b8", "id": null, "metadata": {}, "name": "ProcessingActivitiesPageRefetchQuery", "operationKind": "query", - "text": "query ProcessingActivitiesPageRefetchQuery(\n $after: CursorKey\n $first: Int = 10\n $snapshotId: ID = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...ProcessingActivitiesPageFragment_35e0S5\n id\n }\n}\n\nfragment ProcessingActivitiesPageFragment_35e0S5 on Organization {\n id\n processingActivities(first: $first, after: $after, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n snapshotId\n sourceId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n lawfulBasis\n location\n internationalTransfers\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n" + "text": "query ProcessingActivitiesPageRefetchQuery(\n $after: CursorKey\n $first: Int = 10\n $snapshotId: ID = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...ProcessingActivitiesPageFragment_35e0S5\n id\n }\n}\n\nfragment ProcessingActivitiesPageFragment_35e0S5 on Organization {\n id\n processingActivities(first: $first, after: $after, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n snapshotId\n sourceId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n lawfulBasis\n location\n internationalTransfers\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:processing-activity:update\")\n canDelete: permission(action: \"core:processing-activity:delete\")\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n" } }; })(); -(node as any).hash = "e60b3eb3cf3d172625c2873cb05039bd"; +(node as any).hash = "df348ac63bc56da06da97e484fb2c0e5"; export default node; diff --git a/apps/console/src/__generated__/core/ProcessingActivityGraphCreateMutation.graphql.ts b/apps/console/src/__generated__/core/ProcessingActivityGraphCreateMutation.graphql.ts index e4a551db0..d65206244 100644 --- a/apps/console/src/__generated__/core/ProcessingActivityGraphCreateMutation.graphql.ts +++ b/apps/console/src/__generated__/core/ProcessingActivityGraphCreateMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<238d486ca746aa2d13f6e87ddab1c8e3>> * @lightSyntaxTransform * @nogrep */ @@ -46,6 +46,8 @@ export type ProcessingActivityGraphCreateMutation$data = { readonly createProcessingActivity: { readonly processingActivityEdge: { readonly node: { + readonly canDelete: boolean; + readonly canUpdate: boolean; readonly consentEvidenceLink: string | null | undefined; readonly createdAt: string; readonly dataProtectionImpactAssessmentNeeded: ProcessingActivityDataProtectionImpactAssessment; @@ -330,6 +332,32 @@ v5 = { "kind": "ScalarField", "name": "createdAt", "storageKey": null + }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:delete\")" } ], "storageKey": null @@ -403,16 +431,16 @@ return { ] }, "params": { - "cacheID": "00d5d2374c8b6933fd01544e67518c14", + "cacheID": "534bd7c442063267f6556101350e0d74", "id": null, "metadata": {}, "name": "ProcessingActivityGraphCreateMutation", "operationKind": "mutation", - "text": "mutation ProcessingActivityGraphCreateMutation(\n $input: CreateProcessingActivityInput!\n) {\n createProcessingActivity(input: $input) {\n processingActivityEdge {\n node {\n id\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n specialOrCriminalData\n consentEvidenceLink\n lawfulBasis\n recipients\n location\n internationalTransfers\n transferSafeguards\n retentionPeriod\n securityMeasures\n dataProtectionImpactAssessmentNeeded\n transferImpactAssessmentNeeded\n lastReviewDate\n nextReviewDate\n role\n dataProtectionOfficer {\n id\n fullName\n }\n vendors(first: 50) {\n edges {\n node {\n id\n name\n websiteUrl\n }\n }\n }\n createdAt\n }\n }\n }\n}\n" + "text": "mutation ProcessingActivityGraphCreateMutation(\n $input: CreateProcessingActivityInput!\n) {\n createProcessingActivity(input: $input) {\n processingActivityEdge {\n node {\n id\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n specialOrCriminalData\n consentEvidenceLink\n lawfulBasis\n recipients\n location\n internationalTransfers\n transferSafeguards\n retentionPeriod\n securityMeasures\n dataProtectionImpactAssessmentNeeded\n transferImpactAssessmentNeeded\n lastReviewDate\n nextReviewDate\n role\n dataProtectionOfficer {\n id\n fullName\n }\n vendors(first: 50) {\n edges {\n node {\n id\n name\n websiteUrl\n }\n }\n }\n createdAt\n canUpdate: permission(action: \"core:processing-activity:update\")\n canDelete: permission(action: \"core:processing-activity:delete\")\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "63271cfac482a18f5754df0af220e45d"; +(node as any).hash = "69c155bfe5b8a028d1d72c3b57d8de98"; export default node; diff --git a/apps/console/src/__generated__/core/ProcessingActivityGraphListQuery.graphql.ts b/apps/console/src/__generated__/core/ProcessingActivityGraphListQuery.graphql.ts index 4faabdc13..42ea61885 100644 --- a/apps/console/src/__generated__/core/ProcessingActivityGraphListQuery.graphql.ts +++ b/apps/console/src/__generated__/core/ProcessingActivityGraphListQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<4f7512912c29e784f2cd2a52fd5f81b4>> + * @generated SignedSource<<14e03b23c216da916e36cecb49aefa6d>> * @lightSyntaxTransform * @nogrep */ @@ -16,6 +16,7 @@ export type ProcessingActivityGraphListQuery$variables = { }; export type ProcessingActivityGraphListQuery$data = { readonly node: { + readonly canCreateProcessingActivity?: boolean; readonly " $fragmentSpreads": FragmentRefs<"ProcessingActivitiesPageDPIAFragment" | "ProcessingActivitiesPageFragment" | "ProcessingActivitiesPageTIAFragment">; }; }; @@ -44,30 +45,43 @@ v1 = [ "variableName": "organizationId" } ], -v2 = [ +v2 = { + "alias": "canCreateProcessingActivity", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:create\")" +}, +v3 = [ { "kind": "Variable", "name": "snapshotId", "variableName": "snapshotId" } ], -v3 = { +v4 = { "alias": null, "args": null, "kind": "ScalarField", "name": "__typename", "storageKey": null }, -v4 = { +v5 = { "alias": null, "args": null, "kind": "ScalarField", "name": "id", "storageKey": null }, -v5 = [ +v6 = [ { - "fields": (v2/*: any*/), + "fields": (v3/*: any*/), "kind": "ObjectValue", "name": "filter" }, @@ -77,42 +91,42 @@ v5 = [ "value": 10 } ], -v6 = { +v7 = { "alias": null, "args": null, "kind": "ScalarField", "name": "totalCount", "storageKey": null }, -v7 = { +v8 = { "alias": null, "args": null, "kind": "ScalarField", "name": "name", "storageKey": null }, -v8 = { +v9 = { "alias": null, "args": null, "kind": "ScalarField", "name": "createdAt", "storageKey": null }, -v9 = { +v10 = { "alias": null, "args": null, "kind": "ScalarField", "name": "updatedAt", "storageKey": null }, -v10 = { +v11 = { "alias": null, "args": null, "kind": "ScalarField", "name": "cursor", "storageKey": null }, -v11 = { +v12 = { "alias": null, "args": null, "concreteType": "PageInfo", @@ -137,7 +151,7 @@ v11 = { ], "storageKey": null }, -v12 = { +v13 = { "kind": "ClientExtension", "selections": [ { @@ -149,10 +163,10 @@ v12 = { } ] }, -v13 = [ +v14 = [ "filter" ], -v14 = { +v15 = { "alias": null, "args": null, "concreteType": "ProcessingActivity", @@ -160,8 +174,8 @@ v14 = { "name": "processingActivity", "plural": false, "selections": [ - (v4/*: any*/), - (v7/*: any*/) + (v5/*: any*/), + (v8/*: any*/) ], "storageKey": null }; @@ -183,18 +197,19 @@ return { { "kind": "InlineFragment", "selections": [ + (v2/*: any*/), { - "args": (v2/*: any*/), + "args": (v3/*: any*/), "kind": "FragmentSpread", "name": "ProcessingActivitiesPageFragment" }, { - "args": (v2/*: any*/), + "args": (v3/*: any*/), "kind": "FragmentSpread", "name": "ProcessingActivitiesPageDPIAFragment" }, { - "args": (v2/*: any*/), + "args": (v3/*: any*/), "kind": "FragmentSpread", "name": "ProcessingActivitiesPageTIAFragment" } @@ -223,20 +238,21 @@ return { "name": "node", "plural": false, "selections": [ - (v3/*: any*/), (v4/*: any*/), + (v5/*: any*/), { "kind": "InlineFragment", "selections": [ + (v2/*: any*/), { "alias": null, - "args": (v5/*: any*/), + "args": (v6/*: any*/), "concreteType": "ProcessingActivityConnection", "kind": "LinkedField", "name": "processingActivities", "plural": false, "selections": [ - (v6/*: any*/), + (v7/*: any*/), { "alias": null, "args": null, @@ -253,7 +269,7 @@ return { "name": "node", "plural": false, "selections": [ - (v4/*: any*/), + (v5/*: any*/), { "alias": null, "args": null, @@ -268,7 +284,7 @@ return { "name": "sourceId", "storageKey": null }, - (v7/*: any*/), + (v8/*: any*/), { "alias": null, "args": null, @@ -311,25 +327,51 @@ return { "name": "internationalTransfers", "storageKey": null }, - (v8/*: any*/), (v9/*: any*/), - (v3/*: any*/) + (v10/*: any*/), + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:delete\")" + }, + (v4/*: any*/) ], "storageKey": null }, - (v10/*: any*/) + (v11/*: any*/) ], "storageKey": null }, - (v11/*: any*/), - (v12/*: any*/) + (v12/*: any*/), + (v13/*: any*/) ], "storageKey": null }, { "alias": null, - "args": (v5/*: any*/), - "filters": (v13/*: any*/), + "args": (v6/*: any*/), + "filters": (v14/*: any*/), "handle": "connection", "key": "ProcessingActivitiesPage_processingActivities", "kind": "LinkedHandle", @@ -337,13 +379,13 @@ return { }, { "alias": null, - "args": (v5/*: any*/), + "args": (v6/*: any*/), "concreteType": "DataProtectionImpactAssessmentConnection", "kind": "LinkedField", "name": "dataProtectionImpactAssessments", "plural": false, "selections": [ - (v6/*: any*/), + (v7/*: any*/), { "alias": null, "args": null, @@ -360,7 +402,7 @@ return { "name": "node", "plural": false, "selections": [ - (v4/*: any*/), + (v5/*: any*/), { "alias": null, "args": null, @@ -382,26 +424,26 @@ return { "name": "residualRisk", "storageKey": null }, - (v14/*: any*/), - (v8/*: any*/), + (v15/*: any*/), (v9/*: any*/), - (v3/*: any*/) + (v10/*: any*/), + (v4/*: any*/) ], "storageKey": null }, - (v10/*: any*/) + (v11/*: any*/) ], "storageKey": null }, - (v11/*: any*/), - (v12/*: any*/) + (v12/*: any*/), + (v13/*: any*/) ], "storageKey": null }, { "alias": null, - "args": (v5/*: any*/), - "filters": (v13/*: any*/), + "args": (v6/*: any*/), + "filters": (v14/*: any*/), "handle": "connection", "key": "ProcessingActivitiesPage_dataProtectionImpactAssessments", "kind": "LinkedHandle", @@ -409,13 +451,13 @@ return { }, { "alias": null, - "args": (v5/*: any*/), + "args": (v6/*: any*/), "concreteType": "TransferImpactAssessmentConnection", "kind": "LinkedField", "name": "transferImpactAssessments", "plural": false, "selections": [ - (v6/*: any*/), + (v7/*: any*/), { "alias": null, "args": null, @@ -432,7 +474,7 @@ return { "name": "node", "plural": false, "selections": [ - (v4/*: any*/), + (v5/*: any*/), { "alias": null, "args": null, @@ -454,26 +496,26 @@ return { "name": "localLawRisk", "storageKey": null }, - (v14/*: any*/), - (v8/*: any*/), + (v15/*: any*/), (v9/*: any*/), - (v3/*: any*/) + (v10/*: any*/), + (v4/*: any*/) ], "storageKey": null }, - (v10/*: any*/) + (v11/*: any*/) ], "storageKey": null }, - (v11/*: any*/), - (v12/*: any*/) + (v12/*: any*/), + (v13/*: any*/) ], "storageKey": null }, { "alias": null, - "args": (v5/*: any*/), - "filters": (v13/*: any*/), + "args": (v6/*: any*/), + "filters": (v14/*: any*/), "handle": "connection", "key": "ProcessingActivitiesPage_transferImpactAssessments", "kind": "LinkedHandle", @@ -489,16 +531,16 @@ return { ] }, "params": { - "cacheID": "5901fa4af27b039bd50a1c97cdcb54d4", + "cacheID": "1d48f2badad2cfdbc1d36a06756a9ec7", "id": null, "metadata": {}, "name": "ProcessingActivityGraphListQuery", "operationKind": "query", - "text": "query ProcessingActivityGraphListQuery(\n $organizationId: ID!\n $snapshotId: ID\n) {\n node(id: $organizationId) {\n __typename\n ... on Organization {\n ...ProcessingActivitiesPageFragment_3iomuz\n ...ProcessingActivitiesPageDPIAFragment_3iomuz\n ...ProcessingActivitiesPageTIAFragment_3iomuz\n }\n id\n }\n}\n\nfragment ProcessingActivitiesPageDPIAFragment_3iomuz on Organization {\n id\n dataProtectionImpactAssessments(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n description\n potentialRisk\n residualRisk\n processingActivity {\n id\n name\n }\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nfragment ProcessingActivitiesPageFragment_3iomuz on Organization {\n id\n processingActivities(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n snapshotId\n sourceId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n lawfulBasis\n location\n internationalTransfers\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nfragment ProcessingActivitiesPageTIAFragment_3iomuz on Organization {\n id\n transferImpactAssessments(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n dataSubjects\n transfer\n localLawRisk\n processingActivity {\n id\n name\n }\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n" + "text": "query ProcessingActivityGraphListQuery(\n $organizationId: ID!\n $snapshotId: ID\n) {\n node(id: $organizationId) {\n __typename\n ... on Organization {\n canCreateProcessingActivity: permission(action: \"core:processing-activity:create\")\n ...ProcessingActivitiesPageFragment_3iomuz\n ...ProcessingActivitiesPageDPIAFragment_3iomuz\n ...ProcessingActivitiesPageTIAFragment_3iomuz\n }\n id\n }\n}\n\nfragment ProcessingActivitiesPageDPIAFragment_3iomuz on Organization {\n id\n dataProtectionImpactAssessments(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n description\n potentialRisk\n residualRisk\n processingActivity {\n id\n name\n }\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nfragment ProcessingActivitiesPageFragment_3iomuz on Organization {\n id\n processingActivities(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n snapshotId\n sourceId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n lawfulBasis\n location\n internationalTransfers\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:processing-activity:update\")\n canDelete: permission(action: \"core:processing-activity:delete\")\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n\nfragment ProcessingActivitiesPageTIAFragment_3iomuz on Organization {\n id\n transferImpactAssessments(first: 10, filter: {snapshotId: $snapshotId}) {\n totalCount\n edges {\n node {\n id\n dataSubjects\n transfer\n localLawRisk\n processingActivity {\n id\n name\n }\n createdAt\n updatedAt\n __typename\n }\n cursor\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n}\n" } }; })(); -(node as any).hash = "b92a7dc2b38a5ae25c9a47a975fb718b"; +(node as any).hash = "7a0d589abac7bbd3710a0caad37d6273"; export default node; diff --git a/apps/console/src/__generated__/core/ProcessingActivityGraphNodeQuery.graphql.ts b/apps/console/src/__generated__/core/ProcessingActivityGraphNodeQuery.graphql.ts index 14a57ef39..b02261163 100644 --- a/apps/console/src/__generated__/core/ProcessingActivityGraphNodeQuery.graphql.ts +++ b/apps/console/src/__generated__/core/ProcessingActivityGraphNodeQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -22,9 +22,15 @@ export type ProcessingActivityGraphNodeQuery$variables = { }; export type ProcessingActivityGraphNodeQuery$data = { readonly node: { + readonly canCreateDPIA?: boolean; + readonly canCreateTIA?: boolean; + readonly canDelete?: boolean; + readonly canUpdate?: boolean; readonly consentEvidenceLink?: string | null | undefined; readonly createdAt?: string; readonly dataProtectionImpactAssessment?: { + readonly canDelete: boolean; + readonly canUpdate: boolean; readonly createdAt: string; readonly description: string | null | undefined; readonly id: string; @@ -60,6 +66,8 @@ export type ProcessingActivityGraphNodeQuery$data = { readonly snapshotId?: string | null | undefined; readonly specialOrCriminalData?: ProcessingActivitySpecialOrCriminalDatum; readonly transferImpactAssessment?: { + readonly canDelete: boolean; + readonly canUpdate: boolean; readonly createdAt: string; readonly dataSubjects: string | null | undefined; readonly id: string; @@ -377,7 +385,33 @@ v26 = { "storageKey": null }, (v24/*: any*/), - (v25/*: any*/) + (v25/*: any*/), + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:data-protection-impact-assessment:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:data-protection-impact-assessment:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:data-protection-impact-assessment:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:data-protection-impact-assessment:delete\")" + } ], "storageKey": null }, @@ -426,7 +460,33 @@ v27 = { "storageKey": null }, (v24/*: any*/), - (v25/*: any*/) + (v25/*: any*/), + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:transfer-impact-assessment:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:transfer-impact-assessment:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:transfer-impact-assessment:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:transfer-impact-assessment:delete\")" + } ], "storageKey": null }, @@ -442,6 +502,58 @@ v28 = { (v4/*: any*/) ], "storageKey": null +}, +v29 = { + "alias": "canCreateDPIA", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:data-protection-impact-assessment:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:data-protection-impact-assessment:create\")" +}, +v30 = { + "alias": "canCreateTIA", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:transfer-impact-assessment:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:transfer-impact-assessment:create\")" +}, +v31 = { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:update\")" +}, +v32 = { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:processing-activity:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:processing-activity:delete\")" }; return { "fragment": { @@ -487,7 +599,11 @@ return { (v27/*: any*/), (v28/*: any*/), (v24/*: any*/), - (v25/*: any*/) + (v25/*: any*/), + (v29/*: any*/), + (v30/*: any*/), + (v31/*: any*/), + (v32/*: any*/) ], "type": "ProcessingActivity", "abstractKey": null @@ -549,7 +665,11 @@ return { (v27/*: any*/), (v28/*: any*/), (v24/*: any*/), - (v25/*: any*/) + (v25/*: any*/), + (v29/*: any*/), + (v30/*: any*/), + (v31/*: any*/), + (v32/*: any*/) ], "type": "ProcessingActivity", "abstractKey": null @@ -560,16 +680,16 @@ return { ] }, "params": { - "cacheID": "8a92ed21a8b24d93c81ceba4b62a0911", + "cacheID": "29bddd12b9399a78fb24420f11b6d56d", "id": null, "metadata": {}, "name": "ProcessingActivityGraphNodeQuery", "operationKind": "query", - "text": "query ProcessingActivityGraphNodeQuery(\n $processingActivityId: ID!\n) {\n node(id: $processingActivityId) {\n __typename\n ... on ProcessingActivity {\n id\n snapshotId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n specialOrCriminalData\n consentEvidenceLink\n lawfulBasis\n recipients\n location\n internationalTransfers\n transferSafeguards\n retentionPeriod\n securityMeasures\n dataProtectionImpactAssessmentNeeded\n transferImpactAssessmentNeeded\n lastReviewDate\n nextReviewDate\n role\n dataProtectionOfficer {\n id\n fullName\n }\n vendors(first: 50) {\n edges {\n node {\n id\n name\n websiteUrl\n category\n }\n }\n }\n dataProtectionImpactAssessment {\n id\n description\n necessityAndProportionality\n potentialRisk\n mitigations\n residualRisk\n createdAt\n updatedAt\n }\n transferImpactAssessment {\n id\n dataSubjects\n legalMechanism\n transfer\n localLawRisk\n supplementaryMeasures\n createdAt\n updatedAt\n }\n organization {\n id\n name\n }\n createdAt\n updatedAt\n }\n id\n }\n}\n" + "text": "query ProcessingActivityGraphNodeQuery(\n $processingActivityId: ID!\n) {\n node(id: $processingActivityId) {\n __typename\n ... on ProcessingActivity {\n id\n snapshotId\n name\n purpose\n dataSubjectCategory\n personalDataCategory\n specialOrCriminalData\n consentEvidenceLink\n lawfulBasis\n recipients\n location\n internationalTransfers\n transferSafeguards\n retentionPeriod\n securityMeasures\n dataProtectionImpactAssessmentNeeded\n transferImpactAssessmentNeeded\n lastReviewDate\n nextReviewDate\n role\n dataProtectionOfficer {\n id\n fullName\n }\n vendors(first: 50) {\n edges {\n node {\n id\n name\n websiteUrl\n category\n }\n }\n }\n dataProtectionImpactAssessment {\n id\n description\n necessityAndProportionality\n potentialRisk\n mitigations\n residualRisk\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:data-protection-impact-assessment:update\")\n canDelete: permission(action: \"core:data-protection-impact-assessment:delete\")\n }\n transferImpactAssessment {\n id\n dataSubjects\n legalMechanism\n transfer\n localLawRisk\n supplementaryMeasures\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:transfer-impact-assessment:update\")\n canDelete: permission(action: \"core:transfer-impact-assessment:delete\")\n }\n organization {\n id\n name\n }\n createdAt\n updatedAt\n canCreateDPIA: permission(action: \"core:data-protection-impact-assessment:create\")\n canCreateTIA: permission(action: \"core:transfer-impact-assessment:create\")\n canUpdate: permission(action: \"core:processing-activity:update\")\n canDelete: permission(action: \"core:processing-activity:delete\")\n }\n id\n }\n}\n" } }; })(); -(node as any).hash = "3fe20997f675ea566fe083e672bc82a3"; +(node as any).hash = "d670e7ec4d612b19532332247c8c1f8f"; export default node; diff --git a/apps/console/src/__generated__/core/RiskGraphFragment.graphql.ts b/apps/console/src/__generated__/core/RiskGraphFragment.graphql.ts index 729df3a18..9ff3d9e24 100644 --- a/apps/console/src/__generated__/core/RiskGraphFragment.graphql.ts +++ b/apps/console/src/__generated__/core/RiskGraphFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -12,11 +12,14 @@ import { ReaderFragment } from 'relay-runtime'; export type RiskTreatment = "ACCEPTED" | "AVOIDED" | "MITIGATED" | "TRANSFERRED"; import { FragmentRefs } from "relay-runtime"; export type RiskGraphFragment$data = { + readonly canCreateRisk: boolean; readonly id: string; readonly risks: { readonly __id: string; readonly edges: ReadonlyArray<{ readonly node: { + readonly canDelete: boolean; + readonly canUpdate: boolean; readonly category: string; readonly id: string; readonly inherentImpact: number; @@ -126,6 +129,19 @@ return { }, "name": "RiskGraphFragment", "selections": [ + { + "alias": "canCreateRisk", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:create\")" + }, { "alias": "risks", "args": [ @@ -252,6 +268,32 @@ return { "name": "residualRiskScore", "storageKey": null }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:delete\")" + }, { "args": null, "kind": "FragmentSpread", @@ -338,6 +380,6 @@ return { }; })(); -(node as any).hash = "d8048ddb0ff8d4b08b7b9676d9b98f1a"; +(node as any).hash = "41dc9e3adc5d7d9b2126a49afef685c7"; export default node; diff --git a/apps/console/src/__generated__/core/RiskGraphListQuery.graphql.ts b/apps/console/src/__generated__/core/RiskGraphListQuery.graphql.ts index 2d489bc04..6912d42bb 100644 --- a/apps/console/src/__generated__/core/RiskGraphListQuery.graphql.ts +++ b/apps/console/src/__generated__/core/RiskGraphListQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<4a3c1f52f5b371d6cbea3557e609252e>> * @lightSyntaxTransform * @nogrep */ @@ -133,6 +133,19 @@ return { { "kind": "InlineFragment", "selections": [ + { + "alias": "canCreateRisk", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:create\")" + }, { "alias": null, "args": (v5/*: any*/), @@ -247,6 +260,32 @@ return { "name": "residualRiskScore", "storageKey": null }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:delete\")" + }, { "alias": null, "args": null, @@ -350,12 +389,12 @@ return { ] }, "params": { - "cacheID": "225123bb702f2bce307ca69bea183e88", + "cacheID": "feed1e410567a8707ca0e2e4b651bb7a", "id": null, "metadata": {}, "name": "RiskGraphListQuery", "operationKind": "query", - "text": "query RiskGraphListQuery(\n $organizationId: ID!\n $snapshotId: ID\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ...RiskGraphFragment_3iomuz\n }\n}\n\nfragment RiskGraphFragment_3iomuz on Organization {\n risks(first: 50, orderBy: {direction: DESC, field: CREATED_AT}, filter: {snapshotId: $snapshotId}) {\n edges {\n node {\n id\n snapshotId\n name\n category\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n ...useRiskFormFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" + "text": "query RiskGraphListQuery(\n $organizationId: ID!\n $snapshotId: ID\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ...RiskGraphFragment_3iomuz\n }\n}\n\nfragment RiskGraphFragment_3iomuz on Organization {\n canCreateRisk: permission(action: \"core:risk:create\")\n risks(first: 50, orderBy: {direction: DESC, field: CREATED_AT}, filter: {snapshotId: $snapshotId}) {\n edges {\n node {\n id\n snapshotId\n name\n category\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n canUpdate: permission(action: \"core:risk:update\")\n canDelete: permission(action: \"core:risk:delete\")\n ...useRiskFormFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" } }; })(); diff --git a/apps/console/src/__generated__/core/RiskGraphNodeQuery.graphql.ts b/apps/console/src/__generated__/core/RiskGraphNodeQuery.graphql.ts index e98c0aba3..4775f97c6 100644 --- a/apps/console/src/__generated__/core/RiskGraphNodeQuery.graphql.ts +++ b/apps/console/src/__generated__/core/RiskGraphNodeQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<36175d4a9f9c3b377ec502f518a47015>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -16,6 +16,8 @@ export type RiskGraphNodeQuery$variables = { }; export type RiskGraphNodeQuery$data = { readonly node: { + readonly canDelete?: boolean; + readonly canUpdate?: boolean; readonly controlsInfo?: { readonly totalCount: number; }; @@ -196,41 +198,67 @@ v17 = { "storageKey": "obligations(first:0)" }, v18 = { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:update\")" +}, +v19 = { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:delete\")" +}, +v20 = { "alias": null, "args": null, "kind": "ScalarField", "name": "__typename", "storageKey": null }, -v19 = [ +v21 = [ { "kind": "Literal", "name": "first", "value": 100 } ], -v20 = { +v22 = { "alias": null, "args": null, "kind": "ScalarField", "name": "cursor", "storageKey": null }, -v21 = { +v23 = { "alias": null, "args": null, "kind": "ScalarField", "name": "endCursor", "storageKey": null }, -v22 = { +v24 = { "alias": null, "args": null, "kind": "ScalarField", "name": "hasNextPage", "storageKey": null }, -v23 = { +v25 = { "alias": null, "args": null, "concreteType": "PageInfo", @@ -238,12 +266,12 @@ v23 = { "name": "pageInfo", "plural": false, "selections": [ - (v21/*: any*/), - (v22/*: any*/) + (v23/*: any*/), + (v24/*: any*/) ], "storageKey": null }, -v24 = { +v26 = { "kind": "ClientExtension", "selections": [ { @@ -255,14 +283,14 @@ v24 = { } ] }, -v25 = { +v27 = { "alias": null, "args": null, "kind": "ScalarField", "name": "status", "storageKey": null }, -v26 = [ +v28 = [ { "kind": "Literal", "name": "first", @@ -300,6 +328,8 @@ return { (v15/*: any*/), (v16/*: any*/), (v17/*: any*/), + (v18/*: any*/), + (v19/*: any*/), { "args": null, "kind": "FragmentSpread", @@ -355,7 +385,7 @@ return { "name": "node", "plural": false, "selections": [ - (v18/*: any*/), + (v20/*: any*/), (v2/*: any*/), { "kind": "InlineFragment", @@ -372,6 +402,8 @@ return { (v15/*: any*/), (v16/*: any*/), (v17/*: any*/), + (v18/*: any*/), + (v19/*: any*/), { "alias": null, "args": null, @@ -409,7 +441,7 @@ return { }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "concreteType": "MeasureConnection", "kind": "LinkedField", "name": "measures", @@ -440,22 +472,22 @@ return { "name": "state", "storageKey": null }, - (v18/*: any*/) + (v20/*: any*/) ], "storageKey": null }, - (v20/*: any*/) + (v22/*: any*/) ], "storageKey": null }, - (v23/*: any*/), - (v24/*: any*/) + (v25/*: any*/), + (v26/*: any*/) ], "storageKey": "measures(first:100)" }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "filters": null, "handle": "connection", "key": "Risk__measures", @@ -464,7 +496,7 @@ return { }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "concreteType": "DocumentConnection", "kind": "LinkedField", "name": "documents", @@ -539,7 +571,7 @@ return { "plural": false, "selections": [ (v2/*: any*/), - (v25/*: any*/) + (v27/*: any*/) ], "storageKey": null } @@ -549,22 +581,22 @@ return { ], "storageKey": "versions(first:1)" }, - (v18/*: any*/) + (v20/*: any*/) ], "storageKey": null }, - (v20/*: any*/) + (v22/*: any*/) ], "storageKey": null }, - (v23/*: any*/), - (v24/*: any*/) + (v25/*: any*/), + (v26/*: any*/) ], "storageKey": "documents(first:100)" }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "filters": null, "handle": "connection", "key": "Risk__documents", @@ -573,7 +605,7 @@ return { }, { "alias": null, - "args": (v26/*: any*/), + "args": (v28/*: any*/), "concreteType": "ControlConnection", "kind": "LinkedField", "name": "controls", @@ -617,11 +649,11 @@ return { ], "storageKey": null }, - (v18/*: any*/) + (v20/*: any*/) ], "storageKey": null }, - (v20/*: any*/) + (v22/*: any*/) ], "storageKey": null }, @@ -633,8 +665,8 @@ return { "name": "pageInfo", "plural": false, "selections": [ - (v21/*: any*/), - (v22/*: any*/), + (v23/*: any*/), + (v24/*: any*/), { "alias": null, "args": null, @@ -657,7 +689,7 @@ return { }, { "alias": null, - "args": (v26/*: any*/), + "args": (v28/*: any*/), "filters": [ "orderBy", "filter" @@ -669,7 +701,7 @@ return { }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "concreteType": "ObligationConnection", "kind": "LinkedField", "name": "obligations", @@ -713,7 +745,7 @@ return { "name": "source", "storageKey": null }, - (v25/*: any*/), + (v27/*: any*/), { "alias": null, "args": null, @@ -727,22 +759,22 @@ return { ], "storageKey": null }, - (v18/*: any*/) + (v20/*: any*/) ], "storageKey": null }, - (v20/*: any*/) + (v22/*: any*/) ], "storageKey": null }, - (v23/*: any*/), - (v24/*: any*/) + (v25/*: any*/), + (v26/*: any*/) ], "storageKey": "obligations(first:100)" }, { "alias": null, - "args": (v19/*: any*/), + "args": (v21/*: any*/), "filters": null, "handle": "connection", "key": "Risk__obligations", @@ -759,16 +791,16 @@ return { ] }, "params": { - "cacheID": "a909af9427061d9e06e22798cbe1ba14", + "cacheID": "0445299e60879ca00110fb07c5c1a3d9", "id": null, "metadata": {}, "name": "RiskGraphNodeQuery", "operationKind": "query", - "text": "query RiskGraphNodeQuery(\n $riskId: ID!\n) {\n node(id: $riskId) {\n __typename\n ... on Risk {\n id\n snapshotId\n name\n description\n treatment\n owner {\n id\n fullName\n }\n note\n inherentRiskScore\n residualRiskScore\n measuresInfo: measures(first: 0) {\n totalCount\n }\n documentsInfo: documents(first: 0) {\n totalCount\n }\n controlsInfo: controls(first: 0) {\n totalCount\n }\n obligationsInfo: obligations(first: 0) {\n totalCount\n }\n ...useRiskFormFragment\n ...RiskOverviewTabFragment\n ...RiskMeasuresTabFragment\n ...RiskDocumentsTabFragment\n ...RiskControlsTabFragment\n ...RiskObligationsTabFragment\n }\n id\n }\n}\n\nfragment LinkedDocumentsCardFragment on Document {\n id\n title\n createdAt\n documentType\n versions(first: 1) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n\nfragment LinkedMeasuresCardFragment on Measure {\n id\n name\n state\n}\n\nfragment LinkedObligationsCardFragment on Obligation {\n id\n requirement\n area\n source\n status\n owner {\n fullName\n id\n }\n}\n\nfragment RiskControlsTabFragment on Risk {\n id\n controls(first: 20) {\n edges {\n node {\n id\n sectionTitle\n name\n framework {\n id\n name\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment RiskDocumentsTabFragment on Risk {\n id\n documents(first: 100) {\n edges {\n node {\n id\n ...LinkedDocumentsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskMeasuresTabFragment on Risk {\n id\n measures(first: 100) {\n edges {\n node {\n id\n ...LinkedMeasuresCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskObligationsTabFragment on Risk {\n id\n obligations(first: 100) {\n edges {\n node {\n id\n ...LinkedObligationsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskOverviewTabFragment on Risk {\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" + "text": "query RiskGraphNodeQuery(\n $riskId: ID!\n) {\n node(id: $riskId) {\n __typename\n ... on Risk {\n id\n snapshotId\n name\n description\n treatment\n owner {\n id\n fullName\n }\n note\n inherentRiskScore\n residualRiskScore\n measuresInfo: measures(first: 0) {\n totalCount\n }\n documentsInfo: documents(first: 0) {\n totalCount\n }\n controlsInfo: controls(first: 0) {\n totalCount\n }\n obligationsInfo: obligations(first: 0) {\n totalCount\n }\n canUpdate: permission(action: \"core:risk:update\")\n canDelete: permission(action: \"core:risk:delete\")\n ...useRiskFormFragment\n ...RiskOverviewTabFragment\n ...RiskMeasuresTabFragment\n ...RiskDocumentsTabFragment\n ...RiskControlsTabFragment\n ...RiskObligationsTabFragment\n }\n id\n }\n}\n\nfragment LinkedDocumentsCardFragment on Document {\n id\n title\n createdAt\n documentType\n versions(first: 1) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n\nfragment LinkedMeasuresCardFragment on Measure {\n id\n name\n state\n}\n\nfragment LinkedObligationsCardFragment on Obligation {\n id\n requirement\n area\n source\n status\n owner {\n fullName\n id\n }\n}\n\nfragment RiskControlsTabFragment on Risk {\n id\n controls(first: 20) {\n edges {\n node {\n id\n sectionTitle\n name\n framework {\n id\n name\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment RiskDocumentsTabFragment on Risk {\n id\n documents(first: 100) {\n edges {\n node {\n id\n ...LinkedDocumentsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskMeasuresTabFragment on Risk {\n id\n measures(first: 100) {\n edges {\n node {\n id\n ...LinkedMeasuresCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskObligationsTabFragment on Risk {\n id\n obligations(first: 100) {\n edges {\n node {\n id\n ...LinkedObligationsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment RiskOverviewTabFragment on Risk {\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" } }; })(); -(node as any).hash = "f173ffcac7b82f1b62394cb74d1a78ee"; +(node as any).hash = "3e80bcaa15ae8b722471a1c802767c29"; export default node; diff --git a/apps/console/src/__generated__/core/RisksListQuery.graphql.ts b/apps/console/src/__generated__/core/RisksListQuery.graphql.ts index c464e365a..2128f3592 100644 --- a/apps/console/src/__generated__/core/RisksListQuery.graphql.ts +++ b/apps/console/src/__generated__/core/RisksListQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<8c69925ff6e0312b590896229c9bc688>> + * @generated SignedSource<<173bd86c9660b900d34ccd42228adae5>> * @lightSyntaxTransform * @nogrep */ @@ -211,6 +211,19 @@ return { { "kind": "InlineFragment", "selections": [ + { + "alias": "canCreateRisk", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:create" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:create\")" + }, { "alias": null, "args": (v15/*: any*/), @@ -325,6 +338,32 @@ return { "name": "residualRiskScore", "storageKey": null }, + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:update\")" + }, + { + "alias": "canDelete", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:risk:delete" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:risk:delete\")" + }, { "alias": null, "args": null, @@ -428,16 +467,16 @@ return { ] }, "params": { - "cacheID": "34a33dde7e4e7868a885b6b6317f506b", + "cacheID": "92be64a69721c7097dcc87a525d7d706", "id": null, "metadata": {}, "name": "RisksListQuery", "operationKind": "query", - "text": "query RisksListQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: RiskOrder = {direction: DESC, field: CREATED_AT}\n $snapshotId: ID = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...RiskGraphFragment_25MC8O\n id\n }\n}\n\nfragment RiskGraphFragment_25MC8O on Organization {\n risks(first: $first, after: $after, last: $last, before: $before, orderBy: $order, filter: {snapshotId: $snapshotId}) {\n edges {\n node {\n id\n snapshotId\n name\n category\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n ...useRiskFormFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" + "text": "query RisksListQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: RiskOrder = {direction: DESC, field: CREATED_AT}\n $snapshotId: ID = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...RiskGraphFragment_25MC8O\n id\n }\n}\n\nfragment RiskGraphFragment_25MC8O on Organization {\n canCreateRisk: permission(action: \"core:risk:create\")\n risks(first: $first, after: $after, last: $last, before: $before, orderBy: $order, filter: {snapshotId: $snapshotId}) {\n edges {\n node {\n id\n snapshotId\n name\n category\n treatment\n owner {\n id\n fullName\n }\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n canUpdate: permission(action: \"core:risk:update\")\n canDelete: permission(action: \"core:risk:delete\")\n ...useRiskFormFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment useRiskFormFragment on Risk {\n id\n name\n category\n description\n treatment\n inherentLikelihood\n inherentImpact\n residualLikelihood\n residualImpact\n inherentRiskScore\n residualRiskScore\n note\n owner {\n id\n }\n}\n" } }; })(); -(node as any).hash = "d8048ddb0ff8d4b08b7b9676d9b98f1a"; +(node as any).hash = "41dc9e3adc5d7d9b2126a49afef685c7"; export default node; diff --git a/apps/console/src/hooks/graph/ProcessingActivityGraph.ts b/apps/console/src/hooks/graph/ProcessingActivityGraph.ts index d98a94543..1fadbe7c6 100644 --- a/apps/console/src/hooks/graph/ProcessingActivityGraph.ts +++ b/apps/console/src/hooks/graph/ProcessingActivityGraph.ts @@ -5,16 +5,25 @@ import { useTranslate } from "@probo/i18n"; import { promisifyMutation, sprintf } from "@probo/helpers"; import { useMutationWithToasts } from "../useMutationWithToasts"; -export const ProcessingActivitiesConnectionKey = "ProcessingActivitiesPage_processingActivities"; +export const ProcessingActivitiesConnectionKey = + "ProcessingActivitiesPage_processingActivities"; export type ProcessingActivityDPIAResidualRisk = "LOW" | "MEDIUM" | "HIGH"; export const processingActivitiesQuery = graphql` - query ProcessingActivityGraphListQuery($organizationId: ID!, $snapshotId: ID) { + query ProcessingActivityGraphListQuery( + $organizationId: ID! + $snapshotId: ID + ) { node(id: $organizationId) { ... on Organization { + canCreateProcessingActivity: permission( + action: "core:processing-activity:create" + ) ...ProcessingActivitiesPageFragment @arguments(snapshotId: $snapshotId) - ...ProcessingActivitiesPageDPIAFragment @arguments(snapshotId: $snapshotId) - ...ProcessingActivitiesPageTIAFragment @arguments(snapshotId: $snapshotId) + ...ProcessingActivitiesPageDPIAFragment + @arguments(snapshotId: $snapshotId) + ...ProcessingActivitiesPageTIAFragment + @arguments(snapshotId: $snapshotId) } } } @@ -67,6 +76,12 @@ export const processingActivityNodeQuery = graphql` residualRisk createdAt updatedAt + canUpdate: permission( + action: "core:data-protection-impact-assessment:update" + ) + canDelete: permission( + action: "core:data-protection-impact-assessment:delete" + ) } transferImpactAssessment { id @@ -77,6 +92,12 @@ export const processingActivityNodeQuery = graphql` supplementaryMeasures createdAt updatedAt + canUpdate: permission( + action: "core:transfer-impact-assessment:update" + ) + canDelete: permission( + action: "core:transfer-impact-assessment:delete" + ) } organization { id @@ -84,6 +105,14 @@ export const processingActivityNodeQuery = graphql` } createdAt updatedAt + canCreateDPIA: permission( + action: "core:data-protection-impact-assessment:create" + ) + canCreateTIA: permission( + action: "core:transfer-impact-assessment:create" + ) + canUpdate: permission(action: "core:processing-activity:update") + canDelete: permission(action: "core:processing-activity:delete") } } } @@ -130,6 +159,8 @@ export const createProcessingActivityMutation = graphql` } } createdAt + canUpdate: permission(action: "core:processing-activity:update") + canDelete: permission(action: "core:processing-activity:delete") } } } @@ -137,7 +168,9 @@ export const createProcessingActivityMutation = graphql` `; export const updateProcessingActivityMutation = graphql` - mutation ProcessingActivityGraphUpdateMutation($input: UpdateProcessingActivityInput!) { + mutation ProcessingActivityGraphUpdateMutation( + $input: UpdateProcessingActivityInput! + ) { updateProcessingActivity(input: $input) { processingActivity { id @@ -191,7 +224,7 @@ export const deleteProcessingActivityMutation = graphql` export const useDeleteProcessingActivity = ( processingActivity: { id: string; name: string }, - connectionId: string + connectionId: string, ) => { const { __ } = useTranslate(); const [mutate] = useMutationWithToasts(deleteProcessingActivityMutation, { @@ -214,11 +247,11 @@ export const useDeleteProcessingActivity = ( { message: sprintf( __( - "This will permanently delete the processing activity %s. This action cannot be undone." + "This will permanently delete the processing activity %s. This action cannot be undone.", ), - processingActivity.name + processingActivity.name, ), - } + }, ); }; }; @@ -251,10 +284,14 @@ export const useCreateProcessingActivity = (connectionId?: string) => { vendorIds?: string[]; }) => { if (!input.organizationId) { - return alert(__("Failed to create processing activity: organization is required")); + return alert( + __("Failed to create processing activity: organization is required"), + ); } if (!input.name) { - return alert(__("Failed to create processing activity: name is required")); + return alert( + __("Failed to create processing activity: name is required"), + ); } return promisifyMutation(mutate)({ @@ -274,7 +311,8 @@ export const useCreateProcessingActivity = (connectionId?: string) => { transferSafeguards: input.transferSafeguards, retentionPeriod: input.retentionPeriod, securityMeasures: input.securityMeasures, - dataProtectionImpactAssessmentNeeded: input.dataProtectionImpactAssessmentNeeded, + dataProtectionImpactAssessmentNeeded: + input.dataProtectionImpactAssessmentNeeded, transferImpactAssessmentNeeded: input.transferImpactAssessmentNeeded, lastReviewDate: input.lastReviewDate, nextReviewDate: input.nextReviewDate, @@ -388,7 +426,9 @@ export const useCreateDataProtectionImpactAssessment = () => { residualRisk?: ProcessingActivityDPIAResidualRisk; }) => { if (!input.processingActivityId) { - return alert(__("Failed to create DPIA: Processing Activity ID is required")); + return alert( + __("Failed to create DPIA: Processing Activity ID is required"), + ); } return promisifyMutation(mutate)({ @@ -425,13 +465,16 @@ export const useUpdateDataProtectionImpactAssessment = () => { export const useDeleteDataProtectionImpactAssessment = ( dpia: { id: string }, - options?: { onSuccess?: () => void } + options?: { onSuccess?: () => void }, ) => { const { __ } = useTranslate(); - const [mutate] = useMutationWithToasts(deleteDataProtectionImpactAssessmentMutation, { - successMessage: __("DPIA deleted successfully"), - errorMessage: __("Failed to delete DPIA"), - }); + const [mutate] = useMutationWithToasts( + deleteDataProtectionImpactAssessmentMutation, + { + successMessage: __("DPIA deleted successfully"), + errorMessage: __("Failed to delete DPIA"), + }, + ); const confirm = useConfirm(); return () => { @@ -447,9 +490,9 @@ export const useDeleteDataProtectionImpactAssessment = ( }), { message: __( - "This will permanently delete this Data Protection Impact Assessment. This action cannot be undone." + "This will permanently delete this Data Protection Impact Assessment. This action cannot be undone.", ), - } + }, ); }; }; @@ -515,7 +558,9 @@ export const useCreateTransferImpactAssessment = () => { supplementaryMeasures?: string; }) => { if (!input.processingActivityId) { - return alert(__("Failed to create TIA: Processing Activity ID is required")); + return alert( + __("Failed to create TIA: Processing Activity ID is required"), + ); } return promisifyMutation(mutate)({ @@ -552,13 +597,16 @@ export const useUpdateTransferImpactAssessment = () => { export const useDeleteTransferImpactAssessment = ( tia: { id: string }, - options?: { onSuccess?: () => void } + options?: { onSuccess?: () => void }, ) => { const { __ } = useTranslate(); - const [mutate] = useMutationWithToasts(deleteTransferImpactAssessmentMutation, { - successMessage: __("TIA deleted successfully"), - errorMessage: __("Failed to delete TIA"), - }); + const [mutate] = useMutationWithToasts( + deleteTransferImpactAssessmentMutation, + { + successMessage: __("TIA deleted successfully"), + errorMessage: __("Failed to delete TIA"), + }, + ); const confirm = useConfirm(); return () => { @@ -574,9 +622,9 @@ export const useDeleteTransferImpactAssessment = ( }), { message: __( - "This will permanently delete this Transfer Impact Assessment. This action cannot be undone." + "This will permanently delete this Transfer Impact Assessment. This action cannot be undone.", ), - } + }, ); }; }; diff --git a/apps/console/src/hooks/graph/RiskGraph.ts b/apps/console/src/hooks/graph/RiskGraph.ts index c7d64aa3f..733fb4741 100644 --- a/apps/console/src/hooks/graph/RiskGraph.ts +++ b/apps/console/src/hooks/graph/RiskGraph.ts @@ -53,6 +53,7 @@ const risksFragment = graphql` last: { type: "Int", defaultValue: null } snapshotId: { type: "ID", defaultValue: null } ) { + canCreateRisk: permission(action: "core:risk:create") risks( first: $first after: $after @@ -79,6 +80,8 @@ const risksFragment = graphql` residualImpact inherentRiskScore residualRiskScore + canUpdate: permission(action: "core:risk:update") + canDelete: permission(action: "core:risk:delete") ...useRiskFormFragment } } @@ -131,6 +134,8 @@ export const riskNodeQuery = graphql` obligationsInfo: obligations(first: 0) { totalCount } + canUpdate: permission(action: "core:risk:update") + canDelete: permission(action: "core:risk:delete") ...useRiskFormFragment ...RiskOverviewTabFragment ...RiskMeasuresTabFragment diff --git a/apps/console/src/pages/organizations/processingActivities/ProcessingActivitiesPage.tsx b/apps/console/src/pages/organizations/processingActivities/ProcessingActivitiesPage.tsx index 122bf2d7d..6f0e4385c 100644 --- a/apps/console/src/pages/organizations/processingActivities/ProcessingActivitiesPage.tsx +++ b/apps/console/src/pages/organizations/processingActivities/ProcessingActivitiesPage.tsx @@ -64,8 +64,7 @@ import type { ProcessingActivitiesPageTIAFragment$key, ProcessingActivitiesPageTIAFragment$data, } from "/__generated__/core/ProcessingActivitiesPageTIAFragment.graphql"; -import { PermissionsContext } from "/providers/PermissionsContext"; -import { use, useState } from "react"; +import { useState } from "react"; import type { ProcessingActivityGraphListQuery } from "/__generated__/core/ProcessingActivityGraphListQuery.graphql"; interface ProcessingActivitiesPageProps { @@ -106,6 +105,8 @@ const processingActivitiesPageFragment = graphql` internationalTransfers createdAt updatedAt + canUpdate: permission(action: "core:processing-activity:update") + canDelete: permission(action: "core:processing-activity:delete") } } pageInfo { @@ -237,7 +238,6 @@ export default function ProcessingActivitiesPage({ const organizationId = useOrganizationId(); const { snapshotId } = useParams<{ snapshotId?: string }>(); const isSnapshotMode = Boolean(snapshotId); - const { isAuthorized } = use(PermissionsContext); const [activeTab, setActiveTab] = useState<"activities" | "dpia" | "tia">( "activities", ); @@ -292,8 +292,7 @@ export default function ProcessingActivitiesPage({ const hasAnyAction = !isSnapshotMode && - (isAuthorized("ProcessingActivity", "updateProcessingActivity") || - isAuthorized("ProcessingActivity", "deleteProcessingActivity")); + activities.some(({ canUpdate, canDelete }) => canUpdate || canDelete); const canExportPDF = isAuthorized( "ProcessingActivity", @@ -467,7 +466,7 @@ export default function ProcessingActivitiesPage({ )} {!isSnapshotMode && activeTab === "activities" && - isAuthorized("Organization", "createProcessingActivity") && ( + organization.node.canCreateProcessingActivity && ( { confirm( @@ -729,7 +727,7 @@ function ActivityRow({ {hasAnyAction && ( - {isAuthorized("ProcessingActivity", "deleteProcessingActivity") && ( + {activity.canDelete && ( ( - processingActivityNodeQuery, - props.queryRef, - ); - const activity = data.node; + const { node: activity } = + usePreloadedQuery( + processingActivityNodeQuery, + props.queryRef, + ); const { __ } = useTranslate(); const { toast } = useToast(); const organizationId = useOrganizationId(); const { snapshotId } = useParams<{ snapshotId?: string }>(); const isSnapshotMode = Boolean(snapshotId); - const { isAuthorized } = use(PermissionsContext); // Get initial tab from URL hash const getInitialTab = (): "overview" | "dpia" | "tia" => { @@ -132,6 +130,13 @@ export default function ProcessingActivityDetailsPage(props: Props) { const [dpiaDeleted, setDpiaDeleted] = useState(false); const [tiaDeleted, setTiaDeleted] = useState(false); + const canCreateOrUpdateDPIA = activity.dataProtectionImpactAssessment + ? activity.dataProtectionImpactAssessment.canUpdate + : activity.canCreateDPIA; + const canCreateOrUpdateTIA = activity.transferImpactAssessment + ? activity.transferImpactAssessment.canUpdate + : activity.canCreateTIA; + useEffect(() => { window.location.hash = activeTab === "overview" ? "" : activeTab; }, [activeTab]); @@ -422,14 +427,13 @@ export default function ProcessingActivityDetailsPage(props: Props) { { label: activity.name! }, ]} /> - {!isSnapshotMode && - isAuthorized("ProcessingActivity", "deleteProcessingActivity") && ( - - - {__("Delete")} - - - )} + {!isSnapshotMode && activity.canDelete && ( + + + {__("Delete")} + + + )}
@@ -468,7 +472,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { {...register("name")} error={formState.errors.name?.message} required - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -483,7 +487,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -502,7 +506,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { {...register("purpose")} placeholder={__("Describe the purpose of processing")} rows={3} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -510,14 +514,14 @@ export default function ProcessingActivityDetailsPage(props: Props) { label={__("Data Subject Category")} {...register("dataSubjectCategory")} placeholder={__("e.g., employees, customers, prospects")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -536,7 +540,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -553,7 +557,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { label={__("Consent Evidence Link")} {...register("consentEvidenceLink")} placeholder={__("Link to consent evidence if applicable")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -568,7 +572,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -589,7 +593,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { id="lastReviewDate" type="date" {...register("lastReviewDate")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -601,7 +605,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { id="nextReviewDate" type="date" {...register("nextReviewDate")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -610,7 +614,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { control={control} name="dataProtectionOfficerId" label={__("Data Protection Officer")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -619,14 +623,14 @@ export default function ProcessingActivityDetailsPage(props: Props) { label={__("Recipients")} {...register("recipients")} placeholder={__("Who receives the data")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} /> {__("Data is transferred internationally")} @@ -663,7 +667,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -680,7 +684,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { label={__("Retention Period")} {...register("retentionPeriod")} placeholder={__("How long is data retained")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -689,7 +693,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { {...register("securityMeasures")} placeholder={__("Technical and organizational measures")} rows={3} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} />
@@ -707,7 +711,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -737,7 +741,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} > @@ -761,15 +765,12 @@ export default function ProcessingActivityDetailsPage(props: Props) { name="vendorIds" selectedVendors={vendors} label={__("Vendors")} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !activity.canUpdate} /> {!isSnapshotMode && (
- {isAuthorized( - "ProcessingActivity", - "updateProcessingActivity", - ) && ( + {activity.canUpdate && ( - )} + {!isSnapshotMode && activity.canCreateDPIA && ( + + )}
) : ( <> @@ -818,10 +815,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { {!isSnapshotMode && activity?.dataProtectionImpactAssessment?.id && !dpiaDeleted && - isAuthorized( - "DataProtectionImpactAssessment", - "deleteDataProtectionImpactAssessment", - ) && ( + activity.dataProtectionImpactAssessment.canDelete && ( @@ -840,7 +834,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe the processing activity and its purpose", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateDPIA} /> @@ -855,7 +849,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Explain why the processing is necessary and proportionate", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateDPIA} /> @@ -870,7 +864,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe the potential risks to data subjects", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateDPIA} /> @@ -885,7 +879,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe measures to mitigate the identified risks", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateDPIA} /> @@ -903,7 +897,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { onValueChange={field.onChange} value={field.value} className="w-full" - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateDPIA} > @@ -927,14 +921,8 @@ export default function ProcessingActivityDetailsPage(props: Props) { )} {(activity?.dataProtectionImpactAssessment?.id && !dpiaDeleted - ? isAuthorized( - "DataProtectionImpactAssessment", - "updateDataProtectionImpactAssessment", - ) - : isAuthorized( - "ProcessingActivity", - "createDataProtectionImpactAssessment", - )) && ( + ? activity.dataProtectionImpactAssessment.canUpdate + : activity.canCreateDPIA) && ( - )} + {!isSnapshotMode && activity.canCreateTIA && ( + + )} ) : ( <> @@ -988,10 +972,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { {!isSnapshotMode && activity?.transferImpactAssessment?.id && !tiaDeleted && - isAuthorized( - "TransferImpactAssessment", - "deleteTransferImpactAssessment", - ) && ( + activity.transferImpactAssessment.canDelete && ( @@ -1010,7 +991,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe the data subjects involved in the transfer", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateTIA} /> @@ -1025,7 +1006,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe the legal mechanism for the transfer (e.g., SCCs, BCRs, adequacy decision)", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateTIA} /> @@ -1038,7 +1019,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe the nature and details of the data transfer", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateTIA} /> @@ -1053,7 +1034,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Assess the risks related to the local laws of the destination country", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateTIA} /> @@ -1068,7 +1049,7 @@ export default function ProcessingActivityDetailsPage(props: Props) { "Describe any supplementary measures taken to ensure adequate protection", )} rows={4} - disabled={isSnapshotMode} + disabled={isSnapshotMode || !canCreateOrUpdateTIA} /> @@ -1085,14 +1066,8 @@ export default function ProcessingActivityDetailsPage(props: Props) { )} {(activity?.transferImpactAssessment?.id && !tiaDeleted - ? isAuthorized( - "TransferImpactAssessment", - "updateTransferImpactAssessment", - ) - : isAuthorized( - "ProcessingActivity", - "createTransferImpactAssessment", - )) && ( + ? activity.transferImpactAssessment.canUpdate + : activity.canCreateTIA) && (