From 36a936fcf421223cf2a6842cbdb5b21a1ab8e873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Wed, 28 Jan 2026 16:52:17 +0400 Subject: [PATCH] Refactor compliance page documents page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- ...pliancePageDocumentListFragment.graphql.ts | 116 +++++++++ ...ListItem_compliancePageFragment.graphql.ts | 48 ++++ ...umentListItem_documentFragment.graphql.ts} | 56 ++--- ...tItem_updateVisibilityMutation.graphql.ts} | 68 +++-- ...mpliancePageDocumentsPageQuery.graphql.ts} | 163 +++++------- .../core/TrustCenterGraphQuery.graphql.ts | 238 ++---------------- .../organizations/SlackConnection.tsx | 104 -------- .../trustCenter/TrustCenterDocumentsCard.tsx | 188 -------------- .../hooks/graph/TrustCenterDocumentGraph.ts | 49 ---- .../src/hooks/graph/TrustCenterGraph.ts | 19 -- .../documents/CompliancePageDocumentsPage.tsx | 40 +++ .../CompliancePageDocumentsPageLoader.tsx | 32 +++ .../CompliancePageDocumentList.tsx | 78 ++++++ .../CompliancePageDocumentListItem.tsx | 121 +++++++++ .../organizations/compliance-page/routes.ts | 5 + .../trustCenter/TrustCenterDocumentsTab.tsx | 38 --- apps/console/src/routes/trustCenterRoutes.ts | 8 - 17 files changed, 584 insertions(+), 787 deletions(-) create mode 100644 apps/console/src/__generated__/core/CompliancePageDocumentListFragment.graphql.ts create mode 100644 apps/console/src/__generated__/core/CompliancePageDocumentListItem_compliancePageFragment.graphql.ts rename apps/console/src/__generated__/core/{TrustCenterDocumentsCardFragment.graphql.ts => CompliancePageDocumentListItem_documentFragment.graphql.ts} (74%) rename apps/console/src/__generated__/core/{TrustCenterDocumentGraphUpdateMutation.graphql.ts => CompliancePageDocumentListItem_updateVisibilityMutation.graphql.ts} (72%) rename apps/console/src/__generated__/core/{TrustCenterDocumentGraphQuery.graphql.ts => CompliancePageDocumentsPageQuery.graphql.ts} (64%) delete mode 100644 apps/console/src/components/organizations/SlackConnection.tsx delete mode 100644 apps/console/src/components/trustCenter/TrustCenterDocumentsCard.tsx delete mode 100644 apps/console/src/hooks/graph/TrustCenterDocumentGraph.ts create mode 100644 apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPage.tsx create mode 100644 apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPageLoader.tsx create mode 100644 apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentList.tsx create mode 100644 apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentListItem.tsx delete mode 100644 apps/console/src/pages/organizations/trustCenter/TrustCenterDocumentsTab.tsx diff --git a/apps/console/src/__generated__/core/CompliancePageDocumentListFragment.graphql.ts b/apps/console/src/__generated__/core/CompliancePageDocumentListFragment.graphql.ts new file mode 100644 index 000000000..14c2b9b14 --- /dev/null +++ b/apps/console/src/__generated__/core/CompliancePageDocumentListFragment.graphql.ts @@ -0,0 +1,116 @@ +/** + * @generated SignedSource<<520e633d06f7c68a9270600108ec81da>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type CompliancePageDocumentListFragment$data = { + readonly compliancePage: { + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListItem_compliancePageFragment">; + }; + readonly documents: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly id: string; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListItem_documentFragment">; + }; + }>; + }; + readonly " $fragmentType": "CompliancePageDocumentListFragment"; +}; +export type CompliancePageDocumentListFragment$key = { + readonly " $data"?: CompliancePageDocumentListFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "CompliancePageDocumentListFragment", + "selections": [ + { + "kind": "RequiredField", + "field": { + "alias": "compliancePage", + "args": null, + "concreteType": "TrustCenter", + "kind": "LinkedField", + "name": "trustCenter", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "CompliancePageDocumentListItem_compliancePageFragment" + } + ], + "storageKey": null + }, + "action": "THROW" + }, + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 1000 + } + ], + "concreteType": "DocumentConnection", + "kind": "LinkedField", + "name": "documents", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "DocumentEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "Document", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "args": null, + "kind": "FragmentSpread", + "name": "CompliancePageDocumentListItem_documentFragment" + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "documents(first:1000)" + } + ], + "type": "Organization", + "abstractKey": null +}; + +(node as any).hash = "10da8f0838c700d4a2535ec5193844a8"; + +export default node; diff --git a/apps/console/src/__generated__/core/CompliancePageDocumentListItem_compliancePageFragment.graphql.ts b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_compliancePageFragment.graphql.ts new file mode 100644 index 000000000..d735d050c --- /dev/null +++ b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_compliancePageFragment.graphql.ts @@ -0,0 +1,48 @@ +/** + * @generated SignedSource<<24c6b253b4339703abe0106728cb4a6f>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type CompliancePageDocumentListItem_compliancePageFragment$data = { + readonly canUpdate: boolean; + readonly " $fragmentType": "CompliancePageDocumentListItem_compliancePageFragment"; +}; +export type CompliancePageDocumentListItem_compliancePageFragment$key = { + readonly " $data"?: CompliancePageDocumentListItem_compliancePageFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListItem_compliancePageFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "CompliancePageDocumentListItem_compliancePageFragment", + "selections": [ + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:trust-center:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:trust-center:update\")" + } + ], + "type": "TrustCenter", + "abstractKey": null +}; + +(node as any).hash = "7c884fb02ab6613707d02aa44c547ac7"; + +export default node; diff --git a/apps/console/src/__generated__/core/TrustCenterDocumentsCardFragment.graphql.ts b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_documentFragment.graphql.ts similarity index 74% rename from apps/console/src/__generated__/core/TrustCenterDocumentsCardFragment.graphql.ts rename to apps/console/src/__generated__/core/CompliancePageDocumentListItem_documentFragment.graphql.ts index f60366df7..a2b2d4152 100644 --- a/apps/console/src/__generated__/core/TrustCenterDocumentsCardFragment.graphql.ts +++ b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_documentFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<112e917e3fb881859a56b794f07ce7e7>> * @lightSyntaxTransform * @nogrep */ @@ -13,13 +13,10 @@ export type DocumentStatus = "DRAFT" | "PUBLISHED"; export type DocumentType = "ISMS" | "OTHER" | "POLICY" | "PROCEDURE"; export type TrustCenterVisibility = "NONE" | "PRIVATE" | "PUBLIC"; import { FragmentRefs } from "relay-runtime"; -export type TrustCenterDocumentsCardFragment$data = { - readonly createdAt: string; +export type CompliancePageDocumentListItem_documentFragment$data = { readonly documentType: DocumentType; readonly id: string; - readonly title: string; - readonly trustCenterVisibility: TrustCenterVisibility; - readonly versions: { + readonly lastVersion: { readonly edges: ReadonlyArray<{ readonly node: { readonly id: string; @@ -27,11 +24,13 @@ export type TrustCenterDocumentsCardFragment$data = { }; }>; }; - readonly " $fragmentType": "TrustCenterDocumentsCardFragment"; + readonly title: string; + readonly trustCenterVisibility: TrustCenterVisibility; + readonly " $fragmentType": "CompliancePageDocumentListItem_documentFragment"; }; -export type TrustCenterDocumentsCardFragment$key = { - readonly " $data"?: TrustCenterDocumentsCardFragment$data; - readonly " $fragmentSpreads": FragmentRefs<"TrustCenterDocumentsCardFragment">; +export type CompliancePageDocumentListItem_documentFragment$key = { + readonly " $data"?: CompliancePageDocumentListItem_documentFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListItem_documentFragment">; }; const node: ReaderFragment = (function(){ @@ -46,23 +45,9 @@ return { "argumentDefinitions": [], "kind": "Fragment", "metadata": null, - "name": "TrustCenterDocumentsCardFragment", + "name": "CompliancePageDocumentListItem_documentFragment", "selections": [ (v0/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "title", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - }, { "alias": null, "args": null, @@ -74,16 +59,31 @@ return { "alias": null, "args": null, "kind": "ScalarField", - "name": "trustCenterVisibility", + "name": "title", "storageKey": null }, { "alias": null, + "args": null, + "kind": "ScalarField", + "name": "trustCenterVisibility", + "storageKey": null + }, + { + "alias": "lastVersion", "args": [ { "kind": "Literal", "name": "first", "value": 1 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } } ], "concreteType": "DocumentVersionConnection", @@ -122,7 +122,7 @@ return { "storageKey": null } ], - "storageKey": "versions(first:1)" + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" } ], "type": "Document", @@ -130,6 +130,6 @@ return { }; })(); -(node as any).hash = "a90715444be8a289eae6615ce44e244d"; +(node as any).hash = "ab2b10ffbd76c59d1a3facab0f794402"; export default node; diff --git a/apps/console/src/__generated__/core/TrustCenterDocumentGraphUpdateMutation.graphql.ts b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_updateVisibilityMutation.graphql.ts similarity index 72% rename from apps/console/src/__generated__/core/TrustCenterDocumentGraphUpdateMutation.graphql.ts rename to apps/console/src/__generated__/core/CompliancePageDocumentListItem_updateVisibilityMutation.graphql.ts index 4b456b7b0..10ff9b2c8 100644 --- a/apps/console/src/__generated__/core/TrustCenterDocumentGraphUpdateMutation.graphql.ts +++ b/apps/console/src/__generated__/core/CompliancePageDocumentListItem_updateVisibilityMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<383c2d6a9d25911bb5df8c148a8a3e51>> + * @generated SignedSource<<499820c9df6a66e5a4969b593e6f257c>> * @lightSyntaxTransform * @nogrep */ @@ -22,21 +22,19 @@ export type UpdateDocumentInput = { title?: string | null | undefined; trustCenterVisibility?: TrustCenterVisibility | null | undefined; }; -export type TrustCenterDocumentGraphUpdateMutation$variables = { +export type CompliancePageDocumentListItem_updateVisibilityMutation$variables = { input: UpdateDocumentInput; }; -export type TrustCenterDocumentGraphUpdateMutation$data = { +export type CompliancePageDocumentListItem_updateVisibilityMutation$data = { readonly updateDocument: { readonly document: { - readonly id: string; - readonly trustCenterVisibility: TrustCenterVisibility; - readonly " $fragmentSpreads": FragmentRefs<"TrustCenterDocumentsCardFragment">; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListItem_documentFragment">; }; }; }; -export type TrustCenterDocumentGraphUpdateMutation = { - response: TrustCenterDocumentGraphUpdateMutation$data; - variables: TrustCenterDocumentGraphUpdateMutation$variables; +export type CompliancePageDocumentListItem_updateVisibilityMutation = { + response: CompliancePageDocumentListItem_updateVisibilityMutation$data; + variables: CompliancePageDocumentListItem_updateVisibilityMutation$variables; }; const node: ConcreteRequest = (function(){ @@ -60,20 +58,13 @@ v2 = { "kind": "ScalarField", "name": "id", "storageKey": null -}, -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "trustCenterVisibility", - "storageKey": null }; return { "fragment": { "argumentDefinitions": (v0/*: any*/), "kind": "Fragment", "metadata": null, - "name": "TrustCenterDocumentGraphUpdateMutation", + "name": "CompliancePageDocumentListItem_updateVisibilityMutation", "selections": [ { "alias": null, @@ -91,12 +82,10 @@ return { "name": "document", "plural": false, "selections": [ - (v2/*: any*/), - (v3/*: any*/), { "args": null, "kind": "FragmentSpread", - "name": "TrustCenterDocumentsCardFragment" + "name": "CompliancePageDocumentListItem_documentFragment" } ], "storageKey": null @@ -112,7 +101,7 @@ return { "operation": { "argumentDefinitions": (v0/*: any*/), "kind": "Operation", - "name": "TrustCenterDocumentGraphUpdateMutation", + "name": "CompliancePageDocumentListItem_updateVisibilityMutation", "selections": [ { "alias": null, @@ -131,7 +120,13 @@ return { "plural": false, "selections": [ (v2/*: any*/), - (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "documentType", + "storageKey": null + }, { "alias": null, "args": null, @@ -143,23 +138,24 @@ return { "alias": null, "args": null, "kind": "ScalarField", - "name": "createdAt", + "name": "trustCenterVisibility", "storageKey": null }, { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "documentType", - "storageKey": null - }, - { - "alias": null, + "alias": "lastVersion", "args": [ { "kind": "Literal", "name": "first", "value": 1 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } } ], "concreteType": "DocumentVersionConnection", @@ -198,7 +194,7 @@ return { "storageKey": null } ], - "storageKey": "versions(first:1)" + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" } ], "storageKey": null @@ -209,16 +205,16 @@ return { ] }, "params": { - "cacheID": "04cb2a4e83386dfffce8c12eae320cfe", + "cacheID": "f72f0dd5039dbfeaa609b7914308c0fe", "id": null, "metadata": {}, - "name": "TrustCenterDocumentGraphUpdateMutation", + "name": "CompliancePageDocumentListItem_updateVisibilityMutation", "operationKind": "mutation", - "text": "mutation TrustCenterDocumentGraphUpdateMutation(\n $input: UpdateDocumentInput!\n) {\n updateDocument(input: $input) {\n document {\n id\n trustCenterVisibility\n ...TrustCenterDocumentsCardFragment\n }\n }\n}\n\nfragment TrustCenterDocumentsCardFragment on Document {\n id\n title\n createdAt\n documentType\n trustCenterVisibility\n versions(first: 1) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n" + "text": "mutation CompliancePageDocumentListItem_updateVisibilityMutation(\n $input: UpdateDocumentInput!\n) {\n updateDocument(input: $input) {\n document {\n ...CompliancePageDocumentListItem_documentFragment\n id\n }\n }\n}\n\nfragment CompliancePageDocumentListItem_documentFragment on Document {\n id\n documentType\n title\n trustCenterVisibility\n lastVersion: versions(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "293896dbfec4de53d0fe30a2462f833b"; +(node as any).hash = "3f49f1e719ba93bc8cc69c483d50e225"; export default node; diff --git a/apps/console/src/__generated__/core/TrustCenterDocumentGraphQuery.graphql.ts b/apps/console/src/__generated__/core/CompliancePageDocumentsPageQuery.graphql.ts similarity index 64% rename from apps/console/src/__generated__/core/TrustCenterDocumentGraphQuery.graphql.ts rename to apps/console/src/__generated__/core/CompliancePageDocumentsPageQuery.graphql.ts index dc5392a0a..0c8015343 100644 --- a/apps/console/src/__generated__/core/TrustCenterDocumentGraphQuery.graphql.ts +++ b/apps/console/src/__generated__/core/CompliancePageDocumentsPageQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<1135bf3b786a26466e2763cbeecb7b5b>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -10,25 +10,17 @@ import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; -export type TrustCenterDocumentGraphQuery$variables = { +export type CompliancePageDocumentsPageQuery$variables = { organizationId: string; }; -export type TrustCenterDocumentGraphQuery$data = { +export type CompliancePageDocumentsPageQuery$data = { readonly organization: { - readonly documents?: { - readonly edges: ReadonlyArray<{ - readonly node: { - readonly id: string; - readonly " $fragmentSpreads": FragmentRefs<"TrustCenterDocumentsCardFragment">; - }; - }>; - }; - readonly id?: string; + readonly " $fragmentSpreads": FragmentRefs<"CompliancePageDocumentListFragment">; }; }; -export type TrustCenterDocumentGraphQuery = { - response: TrustCenterDocumentGraphQuery$data; - variables: TrustCenterDocumentGraphQuery$variables; +export type CompliancePageDocumentsPageQuery = { + response: CompliancePageDocumentsPageQuery$data; + variables: CompliancePageDocumentsPageQuery$variables; }; const node: ConcreteRequest = (function(){ @@ -52,20 +44,13 @@ v2 = { "kind": "ScalarField", "name": "id", "storageKey": null -}, -v3 = [ - { - "kind": "Literal", - "name": "first", - "value": 100 - } -]; +}; return { "fragment": { "argumentDefinitions": (v0/*: any*/), "kind": "Fragment", "metadata": null, - "name": "TrustCenterDocumentGraphQuery", + "name": "CompliancePageDocumentsPageQuery", "selections": [ { "alias": "organization", @@ -76,51 +61,9 @@ return { "plural": false, "selections": [ { - "kind": "InlineFragment", - "selections": [ - (v2/*: any*/), - { - "alias": null, - "args": (v3/*: any*/), - "concreteType": "DocumentConnection", - "kind": "LinkedField", - "name": "documents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Document", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "TrustCenterDocumentsCardFragment" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": "documents(first:100)" - } - ], - "type": "Organization", - "abstractKey": null + "args": null, + "kind": "FragmentSpread", + "name": "CompliancePageDocumentListFragment" } ], "storageKey": null @@ -133,7 +76,7 @@ return { "operation": { "argumentDefinitions": (v0/*: any*/), "kind": "Operation", - "name": "TrustCenterDocumentGraphQuery", + "name": "CompliancePageDocumentsPageQuery", "selections": [ { "alias": "organization", @@ -150,13 +93,43 @@ return { "name": "__typename", "storageKey": null }, - (v2/*: any*/), { "kind": "InlineFragment", "selections": [ + { + "alias": "compliancePage", + "args": null, + "concreteType": "TrustCenter", + "kind": "LinkedField", + "name": "trustCenter", + "plural": false, + "selections": [ + { + "alias": "canUpdate", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:trust-center:update" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:trust-center:update\")" + }, + (v2/*: any*/) + ], + "storageKey": null + }, { "alias": null, - "args": (v3/*: any*/), + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 1000 + } + ], "concreteType": "DocumentConnection", "kind": "LinkedField", "name": "documents", @@ -179,20 +152,6 @@ return { "plural": false, "selections": [ (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "title", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - }, { "alias": null, "args": null, @@ -200,6 +159,13 @@ return { "name": "documentType", "storageKey": null }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null + }, { "alias": null, "args": null, @@ -208,12 +174,20 @@ return { "storageKey": null }, { - "alias": null, + "alias": "lastVersion", "args": [ { "kind": "Literal", "name": "first", "value": 1 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } } ], "concreteType": "DocumentVersionConnection", @@ -252,7 +226,7 @@ return { "storageKey": null } ], - "storageKey": "versions(first:1)" + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" } ], "storageKey": null @@ -261,28 +235,29 @@ return { "storageKey": null } ], - "storageKey": "documents(first:100)" + "storageKey": "documents(first:1000)" } ], "type": "Organization", "abstractKey": null - } + }, + (v2/*: any*/) ], "storageKey": null } ] }, "params": { - "cacheID": "1df18b182ace4562ffa876b7e8073a22", + "cacheID": "675dc82aa65110e99b4ddc51992999c3", "id": null, "metadata": {}, - "name": "TrustCenterDocumentGraphQuery", + "name": "CompliancePageDocumentsPageQuery", "operationKind": "query", - "text": "query TrustCenterDocumentGraphQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n ... on Organization {\n id\n documents(first: 100) {\n edges {\n node {\n id\n ...TrustCenterDocumentsCardFragment\n }\n }\n }\n }\n id\n }\n}\n\nfragment TrustCenterDocumentsCardFragment on Document {\n id\n title\n createdAt\n documentType\n trustCenterVisibility\n versions(first: 1) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n" + "text": "query CompliancePageDocumentsPageQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n ...CompliancePageDocumentListFragment\n id\n }\n}\n\nfragment CompliancePageDocumentListFragment on Organization {\n compliancePage: trustCenter {\n ...CompliancePageDocumentListItem_compliancePageFragment\n id\n }\n documents(first: 1000) {\n edges {\n node {\n id\n ...CompliancePageDocumentListItem_documentFragment\n }\n }\n }\n}\n\nfragment CompliancePageDocumentListItem_compliancePageFragment on TrustCenter {\n canUpdate: permission(action: \"core:trust-center:update\")\n}\n\nfragment CompliancePageDocumentListItem_documentFragment on Document {\n id\n documentType\n title\n trustCenterVisibility\n lastVersion: versions(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n" } }; })(); -(node as any).hash = "f4e34ac09a2b56c2298bc319d9701f4d"; +(node as any).hash = "d81c7a5da1810d0e8d7fadb5b8a3766a"; export default node; diff --git a/apps/console/src/__generated__/core/TrustCenterGraphQuery.graphql.ts b/apps/console/src/__generated__/core/TrustCenterGraphQuery.graphql.ts index a0d05748b..2336484f6 100644 --- a/apps/console/src/__generated__/core/TrustCenterGraphQuery.graphql.ts +++ b/apps/console/src/__generated__/core/TrustCenterGraphQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<409b8c7ffaa92ad8d718689cb254228e>> + * @generated SignedSource<<0f4473cdf4275afaab6b6825f6b6d546>> * @lightSyntaxTransform * @nogrep */ @@ -20,27 +20,8 @@ export type TrustCenterGraphQuery$data = { readonly domain: string; readonly id: string; } | null | undefined; - readonly documents?: { - readonly edges: ReadonlyArray<{ - readonly node: { - readonly id: string; - readonly " $fragmentSpreads": FragmentRefs<"TrustCenterDocumentsCardFragment">; - }; - }>; - }; readonly id?: string; readonly name?: string; - readonly slackConnections?: { - readonly edges: ReadonlyArray<{ - readonly node: { - readonly channel: string | null | undefined; - readonly channelId: string | null | undefined; - readonly createdAt: string; - readonly id: string; - readonly updatedAt: string; - }; - }>; - }; readonly trustCenter?: { readonly active: boolean; readonly canCreateAccess: boolean; @@ -326,63 +307,6 @@ v13 = { ] }, v14 = { - "alias": null, - "args": (v9/*: any*/), - "concreteType": "SlackConnectionConnection", - "kind": "LinkedField", - "name": "slackConnections", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "SlackConnectionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "SlackConnection", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "channel", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "channelId", - "storageKey": null - }, - (v6/*: any*/), - (v7/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": "slackConnections(first:100)" -}, -v15 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "trustCenterVisibility", - "storageKey": null -}, -v16 = { "alias": null, "args": null, "kind": "ScalarField", @@ -412,45 +336,6 @@ return { (v4/*: any*/), (v5/*: any*/), (v8/*: any*/), - { - "alias": null, - "args": (v9/*: any*/), - "concreteType": "DocumentConnection", - "kind": "LinkedField", - "name": "documents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Document", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "args": null, - "kind": "FragmentSpread", - "name": "TrustCenterDocumentsCardFragment" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": "documents(first:100)" - }, { "alias": null, "args": (v9/*: any*/), @@ -532,8 +417,7 @@ return { (v13/*: any*/) ], "storageKey": null - }, - (v14/*: any*/) + } ], "type": "Organization", "abstractKey": null @@ -568,103 +452,6 @@ return { (v4/*: any*/), (v5/*: any*/), (v8/*: any*/), - { - "alias": null, - "args": (v9/*: any*/), - "concreteType": "DocumentConnection", - "kind": "LinkedField", - "name": "documents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Document", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "title", - "storageKey": null - }, - (v6/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "documentType", - "storageKey": null - }, - (v15/*: any*/), - { - "alias": null, - "args": [ - { - "kind": "Literal", - "name": "first", - "value": 1 - } - ], - "concreteType": "DocumentVersionConnection", - "kind": "LinkedField", - "name": "versions", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersion", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": "versions(first:1)" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": "documents(first:100)" - }, { "alias": null, "args": (v9/*: any*/), @@ -691,7 +478,7 @@ return { "selections": [ (v2/*: any*/), (v3/*: any*/), - (v16/*: any*/), + (v14/*: any*/), { "alias": null, "args": null, @@ -755,7 +542,7 @@ return { "selections": [ (v2/*: any*/), (v3/*: any*/), - (v16/*: any*/), + (v14/*: any*/), { "alias": null, "args": null, @@ -763,7 +550,13 @@ return { "name": "fileUrl", "storageKey": null }, - (v15/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "trustCenterVisibility", + "storageKey": null + }, (v6/*: any*/), (v7/*: any*/), { @@ -813,8 +606,7 @@ return { "key": "TrustCenterPage_trustCenterFiles", "kind": "LinkedHandle", "name": "trustCenterFiles" - }, - (v14/*: any*/) + } ], "type": "Organization", "abstractKey": null @@ -825,7 +617,7 @@ return { ] }, "params": { - "cacheID": "9c65178da92b31263957b8ccc6747639", + "cacheID": "ae3ba021303da59b774b89df514bd91e", "id": null, "metadata": { "connection": [ @@ -842,11 +634,11 @@ return { }, "name": "TrustCenterGraphQuery", "operationKind": "query", - "text": "query TrustCenterGraphQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n ... on Organization {\n id\n name\n canCreateTrustCenterFile: permission(action: \"core:trust-center-file:create\")\n customDomain {\n id\n domain\n }\n trustCenter {\n id\n active\n ndaFileName\n ndaFileUrl\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:trust-center:update\")\n canGetNDA: permission(action: \"core:trust-center:get-nda\")\n canUploadNDA: permission(action: \"core:trust-center:upload-nda\")\n canDeleteNDA: permission(action: \"core:trust-center:delete-nda\")\n canCreateReference: permission(action: \"core:trust-center-reference:create\")\n canCreateAccess: permission(action: \"core:trust-center-access:create\")\n }\n documents(first: 100) {\n edges {\n node {\n id\n ...TrustCenterDocumentsCardFragment\n }\n }\n }\n vendors(first: 100) {\n edges {\n node {\n id\n ...TrustCenterVendorsCardFragment\n }\n }\n }\n trustCenterFiles(first: 100) {\n edges {\n node {\n id\n ...TrustCenterFilesCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n slackConnections(first: 100) {\n edges {\n node {\n id\n channel\n channelId\n createdAt\n updatedAt\n }\n }\n }\n }\n id\n }\n}\n\nfragment TrustCenterDocumentsCardFragment on Document {\n id\n title\n createdAt\n documentType\n trustCenterVisibility\n versions(first: 1) {\n edges {\n node {\n id\n status\n }\n }\n }\n}\n\nfragment TrustCenterFilesCardFragment on TrustCenterFile {\n id\n name\n category\n fileUrl\n trustCenterVisibility\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:trust-center-file:update\")\n canDelete: permission(action: \"core:trust-center-file:delete\")\n}\n\nfragment TrustCenterVendorsCardFragment on Vendor {\n id\n name\n category\n description\n showOnTrustCenter\n createdAt\n canUpdate: permission(action: \"core:vendor:update\")\n}\n" + "text": "query TrustCenterGraphQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n ... on Organization {\n id\n name\n canCreateTrustCenterFile: permission(action: \"core:trust-center-file:create\")\n customDomain {\n id\n domain\n }\n trustCenter {\n id\n active\n ndaFileName\n ndaFileUrl\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:trust-center:update\")\n canGetNDA: permission(action: \"core:trust-center:get-nda\")\n canUploadNDA: permission(action: \"core:trust-center:upload-nda\")\n canDeleteNDA: permission(action: \"core:trust-center:delete-nda\")\n canCreateReference: permission(action: \"core:trust-center-reference:create\")\n canCreateAccess: permission(action: \"core:trust-center-access:create\")\n }\n vendors(first: 100) {\n edges {\n node {\n id\n ...TrustCenterVendorsCardFragment\n }\n }\n }\n trustCenterFiles(first: 100) {\n edges {\n node {\n id\n ...TrustCenterFilesCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n}\n\nfragment TrustCenterFilesCardFragment on TrustCenterFile {\n id\n name\n category\n fileUrl\n trustCenterVisibility\n createdAt\n updatedAt\n canUpdate: permission(action: \"core:trust-center-file:update\")\n canDelete: permission(action: \"core:trust-center-file:delete\")\n}\n\nfragment TrustCenterVendorsCardFragment on Vendor {\n id\n name\n category\n description\n showOnTrustCenter\n createdAt\n canUpdate: permission(action: \"core:vendor:update\")\n}\n" } }; })(); -(node as any).hash = "5f4dd8eb5f6ceb0dcb1d3ce3eff4978c"; +(node as any).hash = "abd5b3222d2bd168213a8ede829b4881"; export default node; diff --git a/apps/console/src/components/organizations/SlackConnection.tsx b/apps/console/src/components/organizations/SlackConnection.tsx deleted file mode 100644 index 67378cf4b..000000000 --- a/apps/console/src/components/organizations/SlackConnection.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { sprintf } from "@probo/helpers"; -import { useTranslate } from "@probo/i18n"; -import { Badge, Button, Card } from "@probo/ui"; - -import type { TrustCenterGraphQuery$data } from "#/__generated__/core/TrustCenterGraphQuery.graphql"; - -type Props = { - canUpdate: boolean; - organizationId: string; - slackConnections: NonNullable< - TrustCenterGraphQuery$data["organization"]["slackConnections"] - >["edges"][number]["node"][]; -}; - -export function SlackConnections({ - canUpdate, - organizationId, - slackConnections: connectedSlackConnections, -}: Props) { - const { __, dateTimeFormat } = useTranslate(); - const slackConnectionDefinitions = [ - { - id: "SLACK", - name: "Slack", - protocol: "OAUTH2", - description: __("Manage your trust center access with slack"), - }, - ]; - - const slackConnections = slackConnectionDefinitions.map((def) => { - const connected = connectedSlackConnections.find(c => c.id); - return { - ...def, - createdAt: connected?.createdAt, - channel: connected?.channel, - channelId: connected?.channelId, - }; - }); - - const getUrl = (provider: string) => { - const baseUrl = import.meta.env.VITE_API_URL || window.location.origin; - const url = new URL("/api/console/v1/connectors/initiate", baseUrl); - url.searchParams.append("organization_id", organizationId); - url.searchParams.append("provider", provider); - const trustCenterUrl = `/organizations/${organizationId}/trust-center`; - url.searchParams.append("continue", trustCenterUrl); - const finalUrl = url.toString(); - return finalUrl; - }; - - return ( -
- {slackConnections.map(slackConnection => ( - -
- -
-
-

{slackConnection.name}

-

- {slackConnection.createdAt - ? ( - <> - {sprintf( - __("Connected on %s"), - dateTimeFormat(slackConnection.createdAt), - )} - {slackConnection.channel && ( - <> - {" • "} - {sprintf(__("Channel: %s"), slackConnection.channel)} - - )} - - ) - : ( - slackConnection.description - )} -

-
- {slackConnection.createdAt - ? ( -
- - {__("Connected")} - -
- ) - : ( - canUpdate && ( - - ) - )} -
- ))} -
- ); -} diff --git a/apps/console/src/components/trustCenter/TrustCenterDocumentsCard.tsx b/apps/console/src/components/trustCenter/TrustCenterDocumentsCard.tsx deleted file mode 100644 index f0e4e3644..000000000 --- a/apps/console/src/components/trustCenter/TrustCenterDocumentsCard.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { getTrustCenterVisibilityOptions, sprintf } from "@probo/helpers"; -import { useTranslate } from "@probo/i18n"; -import { - Badge, - Button, - DocumentTypeBadge, - DocumentVersionBadge, - Field, - IconChevronDown, - Option, - Table, - Tbody, - Td, - Th, - Thead, - Tr, -} from "@probo/ui"; -import { useCallback, useMemo, useState } from "react"; -import { useFragment } from "react-relay"; -import { graphql } from "relay-runtime"; - -import type { TrustCenterDocumentsCardFragment$key } from "#/__generated__/core/TrustCenterDocumentsCardFragment.graphql"; -import { useOrganizationId } from "#/hooks/useOrganizationId"; - -const trustCenterDocumentFragment = graphql` - fragment TrustCenterDocumentsCardFragment on Document { - id - title - createdAt - documentType - trustCenterVisibility - versions(first: 1) { - edges { - node { - id - status - } - } - } - } -`; - -type Mutation = (p: { - variables: { - input: { - id: string; - trustCenterVisibility: "NONE" | "PRIVATE" | "PUBLIC"; - } & Params; - }; -}) => Promise; - -type Props = { - documents: TrustCenterDocumentsCardFragment$key[]; - params: Params; - disabled?: boolean; - onChangeVisibility: Mutation; - canUpdate: boolean; -}; - -export function TrustCenterDocumentsCard(props: Props) { - const { __ } = useTranslate(); - const [limit, setLimit] = useState(100); - const documents = useMemo(() => { - return limit ? props.documents.slice(0, limit) : props.documents; - }, [props.documents, limit]); - const showMoreButton = limit !== null && props.documents.length > limit; - - const onChangeVisibility = async ( - documentId: string, - trustCenterVisibility: "NONE" | "PRIVATE" | "PUBLIC", - ) => { - await props.onChangeVisibility({ - variables: { - input: { - id: documentId, - trustCenterVisibility, - ...props.params, - }, - }, - }); - }; - - return ( -
- - - - - - - - - - - {documents.length === 0 && ( - - - - )} - {documents.map((document, index) => ( - - ))} - -
{__("Name")}{__("Type")}{__("State")}{__("Visibility")}
- {__("No documents available")} -
- {showMoreButton && ( - - )} -
- ); -} - -function DocumentRow(props: { - documentFragmentRef: TrustCenterDocumentsCardFragment$key; - onChangeVisibility: ( - documentId: string, - trustCenterVisibility: "NONE" | "PRIVATE" | "PUBLIC", - ) => Promise; - disabled?: boolean; - canUpdate: boolean; -}) { - const { documentFragmentRef, onChangeVisibility, disabled, canUpdate } - = props; - const document = useFragment( - trustCenterDocumentFragment, - documentFragmentRef, - ); - const organizationId = useOrganizationId(); - const { __ } = useTranslate(); - - const handleValueChange = useCallback( - async (value: string) => { - const stringValue = typeof value === "string" ? value : ""; - const typedValue = stringValue as "NONE" | "PRIVATE" | "PUBLIC"; - await onChangeVisibility(document.id, typedValue); - }, - [document.id, onChangeVisibility], - ); - - const visibilityOptions = getTrustCenterVisibilityOptions(__); - - return ( - - -
{document.title}
- - - - - - - - - void handleValueChange(value)} - disabled={disabled || !canUpdate} - className="w-[105px]" - > - {visibilityOptions.map(option => ( - - ))} - - - - ); -} diff --git a/apps/console/src/hooks/graph/TrustCenterDocumentGraph.ts b/apps/console/src/hooks/graph/TrustCenterDocumentGraph.ts deleted file mode 100644 index ea23c5164..000000000 --- a/apps/console/src/hooks/graph/TrustCenterDocumentGraph.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { useTranslate } from "@probo/i18n"; -import { graphql } from "relay-runtime"; - -import type { TrustCenterDocumentGraphUpdateMutation } from "#/__generated__/core/TrustCenterDocumentGraphUpdateMutation.graphql"; -import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; - -export const trustCenterDocumentsQuery = graphql` - query TrustCenterDocumentGraphQuery($organizationId: ID!) { - organization: node(id: $organizationId) { - ... on Organization { - id - documents(first: 100) { - edges { - node { - id - ...TrustCenterDocumentsCardFragment - } - } - } - } - } - } -`; - -export const updateDocumentVisibilityMutation = graphql` - mutation TrustCenterDocumentGraphUpdateMutation( - $input: UpdateDocumentInput! - ) { - updateDocument(input: $input) { - document { - id - trustCenterVisibility - ...TrustCenterDocumentsCardFragment - } - } - } -`; - -export function useUpdateDocumentVisibilityMutation() { - const { __ } = useTranslate(); - - return useMutationWithToasts( - updateDocumentVisibilityMutation, - { - successMessage: __("Document visibility updated successfully."), - errorMessage: __("Failed to update document visibility"), - }, - ); -} diff --git a/apps/console/src/hooks/graph/TrustCenterGraph.ts b/apps/console/src/hooks/graph/TrustCenterGraph.ts index b84a99175..c1711576e 100644 --- a/apps/console/src/hooks/graph/TrustCenterGraph.ts +++ b/apps/console/src/hooks/graph/TrustCenterGraph.ts @@ -32,14 +32,6 @@ export const trustCenterQuery = graphql` ) canCreateAccess: permission(action: "core:trust-center-access:create") } - documents(first: 100) { - edges { - node { - id - ...TrustCenterDocumentsCardFragment - } - } - } vendors(first: 100) { edges { node { @@ -58,17 +50,6 @@ export const trustCenterQuery = graphql` } } } - slackConnections(first: 100) { - edges { - node { - id - channel - channelId - createdAt - updatedAt - } - } - } } } } diff --git a/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPage.tsx b/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPage.tsx new file mode 100644 index 000000000..a73ce0e57 --- /dev/null +++ b/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPage.tsx @@ -0,0 +1,40 @@ +import { useTranslate } from "@probo/i18n"; +import { graphql, type PreloadedQuery, usePreloadedQuery } from "react-relay"; + +import type { CompliancePageDocumentsPageQuery } from "#/__generated__/core/CompliancePageDocumentsPageQuery.graphql"; + +import { CompliancePageDocumentList } from "./_components/CompliancePageDocumentList"; + +export const compliancePageDocumentsPageQuery = graphql` + query CompliancePageDocumentsPageQuery($organizationId: ID!) { + organization: node(id: $organizationId) { + ...CompliancePageDocumentListFragment + } + } +`; + +export function CompliancePageDocumentsPage(props: { queryRef: PreloadedQuery }) { + const { queryRef } = props; + + const { __ } = useTranslate(); + + const { organization } = usePreloadedQuery( + compliancePageDocumentsPageQuery, + queryRef, + ); + + return ( +
+
+
+

{__("Documents")}

+

+ {__("Manage policies, procedures and compliance documents")} +

+
+
+ + +
+ ); +}; diff --git a/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPageLoader.tsx b/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPageLoader.tsx new file mode 100644 index 000000000..1f4ec131b --- /dev/null +++ b/apps/console/src/pages/organizations/compliance-page/documents/CompliancePageDocumentsPageLoader.tsx @@ -0,0 +1,32 @@ +import { useEffect } from "react"; +import { useQueryLoader } from "react-relay"; + +import type { CompliancePageDocumentsPageQuery } from "#/__generated__/core/CompliancePageDocumentsPageQuery.graphql"; +import { LinkCardSkeleton } from "#/components/skeletons/LinkCardSkeleton"; +import { useOrganizationId } from "#/hooks/useOrganizationId"; +import { CoreRelayProvider } from "#/providers/CoreRelayProvider"; + +import { CompliancePageDocumentsPage, compliancePageDocumentsPageQuery } from "./CompliancePageDocumentsPage"; + +function CompliancePageDocumentsPageQueryLoader() { + const organizationId = useOrganizationId(); + const [queryRef, loadQuery] = useQueryLoader(compliancePageDocumentsPageQuery); + + useEffect(() => { + if (!queryRef) { + loadQuery({ organizationId }); + } + }); + + if (!queryRef) return ; + + return ; +} + +export default function CompliancePageDocumentsPageLoader() { + return ( + + + + ); +} diff --git a/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentList.tsx b/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentList.tsx new file mode 100644 index 000000000..228e840ef --- /dev/null +++ b/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentList.tsx @@ -0,0 +1,78 @@ +import { sprintf } from "@probo/helpers"; +import { useTranslate } from "@probo/i18n"; +import { Button, IconChevronDown, Table, Tbody, Td, Th, Thead, Tr } from "@probo/ui"; +import { useState } from "react"; +import { useFragment } from "react-relay"; +import { graphql } from "relay-runtime"; + +import type { CompliancePageDocumentListFragment$key } from "#/__generated__/core/CompliancePageDocumentListFragment.graphql"; + +import { CompliancePageDocumentListItem } from "./CompliancePageDocumentListItem"; + +const fragment = graphql` + fragment CompliancePageDocumentListFragment on Organization { + compliancePage: trustCenter @required(action: THROW) { + ...CompliancePageDocumentListItem_compliancePageFragment + } + documents(first: 1000) { + edges { + node { + id + ...CompliancePageDocumentListItem_documentFragment + } + } + } + } +`; + +export function CompliancePageDocumentList(props: { fragmentRef: CompliancePageDocumentListFragment$key }) { + const { fragmentRef } = props; + + const { __ } = useTranslate(); + + const { compliancePage, documents } = useFragment(fragment, fragmentRef); + + const [limit, setLimit] = useState(100); + const showMoreButton = limit !== null && documents.edges.length > limit; + + return ( +
+ + + + + + + + + + + {documents.edges.length === 0 && ( + + + + )} + {documents.edges.map(({ node: document }) => ( + + ))} + +
{__("Name")}{__("Type")}{__("State")}{__("Visibility")}
+ {__("No documents available")} +
+ {showMoreButton && ( + + )} +
+ ); +}; diff --git a/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentListItem.tsx b/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentListItem.tsx new file mode 100644 index 000000000..e91c5a9c6 --- /dev/null +++ b/apps/console/src/pages/organizations/compliance-page/documents/_components/CompliancePageDocumentListItem.tsx @@ -0,0 +1,121 @@ +import { getTrustCenterVisibilityOptions } from "@probo/helpers"; +import { useTranslate } from "@probo/i18n"; +import { Badge, DocumentTypeBadge, DocumentVersionBadge, Field, Option, Td, Tr } from "@probo/ui"; +import { useCallback } from "react"; +import { useFragment } from "react-relay"; +import { graphql } from "relay-runtime"; + +import type { CompliancePageDocumentListItem_compliancePageFragment$key } from "#/__generated__/core/CompliancePageDocumentListItem_compliancePageFragment.graphql"; +import type { CompliancePageDocumentListItem_documentFragment$key } from "#/__generated__/core/CompliancePageDocumentListItem_documentFragment.graphql"; +import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; +import { useOrganizationId } from "#/hooks/useOrganizationId"; + +const compliancePageFragment = graphql` + fragment CompliancePageDocumentListItem_compliancePageFragment on TrustCenter { + canUpdate: permission(action: "core:trust-center:update") + } +`; + +const documentFragment = graphql` + fragment CompliancePageDocumentListItem_documentFragment on Document { + id + documentType + title + trustCenterVisibility + lastVersion: versions(first: 1, orderBy: { field: CREATED_AT, direction: DESC }) { + edges { + node { + id + status + } + } + } + } +`; + +const updateDocumentVisibilityMutation = graphql` + mutation CompliancePageDocumentListItem_updateVisibilityMutation( + $input: UpdateDocumentInput! + ) { + updateDocument(input: $input) { + document { + ...CompliancePageDocumentListItem_documentFragment + } + } + } +`; + +export function CompliancePageDocumentListItem(props: { + compliancePageFragmentRef: CompliancePageDocumentListItem_compliancePageFragment$key; + documentFragmentRef: CompliancePageDocumentListItem_documentFragment$key; +}) { + const { compliancePageFragmentRef, documentFragmentRef } = props; + + const organizationId = useOrganizationId(); + const { __ } = useTranslate(); + const visibilityOptions = getTrustCenterVisibilityOptions(__); + + const compliancePage = useFragment( + compliancePageFragment, + compliancePageFragmentRef, + ); + const document = useFragment( + documentFragment, + documentFragmentRef, + ); + const [updateDocumentVisibility, isUpdatingDocumentVisibility] = useMutationWithToasts( + updateDocumentVisibilityMutation, + { + successMessage: __("Document visibility updated successfully."), + errorMessage: __("Failed to update document visibility"), + }, + ); + const handleVsibilityChange = useCallback( + async (value: string) => { + const stringValue = typeof value === "string" ? value : ""; + const typedValue = stringValue as "NONE" | "PRIVATE" | "PUBLIC"; + await updateDocumentVisibility({ + variables: { + input: { + id: document.id, + trustCenterVisibility: typedValue, + }, + }, + }); + }, + [document.id, updateDocumentVisibility], + ); + + return ( + + +
{document.title}
+ + + + + + + + + void handleVsibilityChange(value)} + disabled={isUpdatingDocumentVisibility || !compliancePage.canUpdate} + className="w-[105px]" + > + {visibilityOptions.map(option => ( + + ))} + + + + ); +} diff --git a/apps/console/src/pages/organizations/compliance-page/routes.ts b/apps/console/src/pages/organizations/compliance-page/routes.ts index bc729c88c..bf937ffb4 100644 --- a/apps/console/src/pages/organizations/compliance-page/routes.ts +++ b/apps/console/src/pages/organizations/compliance-page/routes.ts @@ -24,6 +24,11 @@ export const compliancePageRoutes = [ Fallback: LinkCardSkeleton, Component: lazy(() => import("#/pages/organizations/compliance-page/audits/CompliancePageAuditsPageLoader")), }, + { + path: "documents", + Fallback: LinkCardSkeleton, + Component: lazy(() => import("#/pages/organizations/compliance-page/documents/CompliancePageDocumentsPageLoader")), + }, ], }, ]; diff --git a/apps/console/src/pages/organizations/trustCenter/TrustCenterDocumentsTab.tsx b/apps/console/src/pages/organizations/trustCenter/TrustCenterDocumentsTab.tsx deleted file mode 100644 index c74f2a5b5..000000000 --- a/apps/console/src/pages/organizations/trustCenter/TrustCenterDocumentsTab.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { useTranslate } from "@probo/i18n"; -import { Spinner } from "@probo/ui"; -import { useOutletContext } from "react-router"; - -import type { TrustCenterGraphQuery$data } from "#/__generated__/core/TrustCenterGraphQuery.graphql"; -import { TrustCenterDocumentsCard } from "#/components/trustCenter/TrustCenterDocumentsCard"; -import { useUpdateDocumentVisibilityMutation } from "#/hooks/graph/TrustCenterDocumentGraph"; - -export default function TrustCenterDocumentsTab() { - const { __ } = useTranslate(); - const { organization } = useOutletContext(); - const [updateDocumentVisibility, isUpdatingDocuments] - = useUpdateDocumentVisibilityMutation(); - - const documents - = organization.documents?.edges?.map(edge => edge.node) || []; - - return ( -
-
-
-

{__("Documents")}

-

- {__("Manage policies, procedures and compliance documents")} -

-
- {isUpdatingDocuments && } -
- -
- ); -} diff --git a/apps/console/src/routes/trustCenterRoutes.ts b/apps/console/src/routes/trustCenterRoutes.ts index 6f2740833..e7e242adb 100644 --- a/apps/console/src/routes/trustCenterRoutes.ts +++ b/apps/console/src/routes/trustCenterRoutes.ts @@ -29,14 +29,6 @@ export const trustCenterRoutes = [ lazy(() => import("#/pages/organizations/trustCenter/TrustCenterPage")), ), children: [ - { - path: "documents", - Fallback: LinkCardSkeleton, - Component: lazy( - () => - import("#/pages/organizations/trustCenter/TrustCenterDocumentsTab"), - ), - }, { path: "files", Fallback: LinkCardSkeleton,