From 7c721e5ff74d28a6460588a214d346b451e0f0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Tue, 27 Jan 2026 15:46:59 +0400 Subject: [PATCH] Refactor DocumentSignaturesTab to DocumentSignaturesPage + fix count bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Émile Ré --- ...tionsDropdown_documentFragment.graphql.ts} | 16 +- ...ActionsDropdown_versionFragment.graphql.ts | 73 ++ ...tLayoutDrawer_documentFragment.graphql.ts} | 16 +- ...entLayoutDrawer_versionFragment.graphql.ts | 110 +++ .../core/DocumentLayoutQuery.graphql.ts | 758 +++++++++--------- ...umentSignatureListItemFragment.graphql.ts} | 64 +- ...stItem_cancelSignatureMutation.graphql.ts} | 24 +- ... => DocumentSignatureListQuery.graphql.ts} | 78 +- ...entSignatureList_peopleFragment.graphql.ts | 118 +++ ...tSignatureList_versionFragment.graphql.ts} | 78 +- ...laceholder_organizationFragment.graphql.ts | 48 ++ ...aturePlaceholder_personFragment.graphql.ts | 58 ++ ...holder_requestSignatureMutation.graphql.ts | 184 +++++ ...turePlaceholder_versionFragment.graphql.ts | 51 ++ .../DocumentSignaturesPageQuery.graphql.ts | 603 ++++++++++++++ ...resTab_requestSignatureMutation.graphql.ts | 267 ------ .../documents/DocumentLayout.tsx | 90 +-- .../documents/DocumentLayoutLoader.tsx | 8 +- .../_components/DocumentActionsDropdown.tsx | 41 +- .../_components/DocumentLayoutDrawer.tsx | 54 +- .../_components/DocumentVersionsDropdown.tsx | 7 +- .../DocumentVersionsDropdownItem.tsx | 61 +- .../DocumentVersionsDropdownMenu.tsx | 12 +- .../signatures/DocumentSignaturesPage.tsx | 110 +++ .../DocumentSignaturesPageLoader.tsx | 47 ++ .../_components/DocumentSignatureList.tsx | 128 +++ .../_components/DocumentSignatureListItem.tsx | 108 +++ .../DocumentSignaturePlaceholder.tsx | 111 +++ .../documents/tabs/DocumentDescriptionTab.tsx | 4 +- .../documents/tabs/DocumentSignaturesTab.tsx | 365 --------- apps/console/src/routes/documentsRoutes.ts | 2 +- pkg/coredata/document_version_signature.go | 34 + .../document_version_signature_filter.go | 44 +- pkg/probo/document_service.go | 31 +- pkg/server/api/console/v1/schema.graphql | 7 +- pkg/server/api/console/v1/schema/schema.go | 104 ++- .../v1/types/document_version_signature.go | 24 +- pkg/server/api/console/v1/types/types.go | 8 +- pkg/server/api/console/v1/v1_resolver.go | 54 +- pkg/server/api/mcp/v1/schema.resolvers.go | 15 +- pkg/server/api/mcp/v1/specification.yaml | 3 + pkg/server/api/mcp/v1/types/types.go | 4 +- 42 files changed, 2661 insertions(+), 1361 deletions(-) rename apps/console/src/__generated__/core/{DocumentActionsDropdownFragment.graphql.ts => DocumentActionsDropdown_documentFragment.graphql.ts} (84%) create mode 100644 apps/console/src/__generated__/core/DocumentActionsDropdown_versionFragment.graphql.ts rename apps/console/src/__generated__/core/{DocumentLayoutDrawerFragment.graphql.ts => DocumentLayoutDrawer_documentFragment.graphql.ts} (72%) create mode 100644 apps/console/src/__generated__/core/DocumentLayoutDrawer_versionFragment.graphql.ts rename apps/console/src/__generated__/core/{DocumentSignaturesTab_signature.graphql.ts => DocumentSignatureListItemFragment.graphql.ts} (68%) rename apps/console/src/__generated__/core/{DocumentSignaturesTab_cancelSignatureMutation.graphql.ts => DocumentSignatureListItem_cancelSignatureMutation.graphql.ts} (72%) rename apps/console/src/__generated__/core/{DocumentSignaturesTabRefetchQuery.graphql.ts => DocumentSignatureListQuery.graphql.ts} (77%) create mode 100644 apps/console/src/__generated__/core/DocumentSignatureList_peopleFragment.graphql.ts rename apps/console/src/__generated__/core/{DocumentSignaturesTab_version.graphql.ts => DocumentSignatureList_versionFragment.graphql.ts} (66%) create mode 100644 apps/console/src/__generated__/core/DocumentSignaturePlaceholder_organizationFragment.graphql.ts create mode 100644 apps/console/src/__generated__/core/DocumentSignaturePlaceholder_personFragment.graphql.ts create mode 100644 apps/console/src/__generated__/core/DocumentSignaturePlaceholder_requestSignatureMutation.graphql.ts create mode 100644 apps/console/src/__generated__/core/DocumentSignaturePlaceholder_versionFragment.graphql.ts create mode 100644 apps/console/src/__generated__/core/DocumentSignaturesPageQuery.graphql.ts delete mode 100644 apps/console/src/__generated__/core/DocumentSignaturesTab_requestSignatureMutation.graphql.ts create mode 100644 apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx create mode 100644 apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPageLoader.tsx create mode 100644 apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureList.tsx create mode 100644 apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureListItem.tsx create mode 100644 apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignaturePlaceholder.tsx delete mode 100644 apps/console/src/pages/organizations/documents/tabs/DocumentSignaturesTab.tsx diff --git a/apps/console/src/__generated__/core/DocumentActionsDropdownFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentActionsDropdown_documentFragment.graphql.ts similarity index 84% rename from apps/console/src/__generated__/core/DocumentActionsDropdownFragment.graphql.ts rename to apps/console/src/__generated__/core/DocumentActionsDropdown_documentFragment.graphql.ts index 663ae04d3..aa0ff4757 100644 --- a/apps/console/src/__generated__/core/DocumentActionsDropdownFragment.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentActionsDropdown_documentFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<190e32d0bc7808055f7390730de5efd4>> * @lightSyntaxTransform * @nogrep */ @@ -10,7 +10,7 @@ import { ReaderFragment } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; -export type DocumentActionsDropdownFragment$data = { +export type DocumentActionsDropdown_documentFragment$data = { readonly canDelete: boolean; readonly canUpdate: boolean; readonly id: string; @@ -20,18 +20,18 @@ export type DocumentActionsDropdownFragment$data = { readonly totalCount: number; }; readonly " $fragmentSpreads": FragmentRefs<"UpdateVersionDialogFragment">; - readonly " $fragmentType": "DocumentActionsDropdownFragment"; + readonly " $fragmentType": "DocumentActionsDropdown_documentFragment"; }; -export type DocumentActionsDropdownFragment$key = { - readonly " $data"?: DocumentActionsDropdownFragment$data; - readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdownFragment">; +export type DocumentActionsDropdown_documentFragment$key = { + readonly " $data"?: DocumentActionsDropdown_documentFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdown_documentFragment">; }; const node: ReaderFragment = { "argumentDefinitions": [], "kind": "Fragment", "metadata": null, - "name": "DocumentActionsDropdownFragment", + "name": "DocumentActionsDropdown_documentFragment", "selections": [ { "alias": null, @@ -119,6 +119,6 @@ const node: ReaderFragment = { "abstractKey": null }; -(node as any).hash = "bc3632812ef26d793478c01bd41e7dbe"; +(node as any).hash = "0e6d41c74914e28aea353ddef6bf7385"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentActionsDropdown_versionFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentActionsDropdown_versionFragment.graphql.ts new file mode 100644 index 000000000..55c09529c --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentActionsDropdown_versionFragment.graphql.ts @@ -0,0 +1,73 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +export type DocumentStatus = "DRAFT" | "PUBLISHED"; +import { FragmentRefs } from "relay-runtime"; +export type DocumentActionsDropdown_versionFragment$data = { + readonly canDeleteDraft: boolean; + readonly id: string; + readonly status: DocumentStatus; + readonly version: number; + readonly " $fragmentType": "DocumentActionsDropdown_versionFragment"; +}; +export type DocumentActionsDropdown_versionFragment$key = { + readonly " $data"?: DocumentActionsDropdown_versionFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdown_versionFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "DocumentActionsDropdown_versionFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "version", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "status", + "storageKey": null + }, + { + "alias": "canDeleteDraft", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:document-version:delete-draft" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:document-version:delete-draft\")" + } + ], + "type": "DocumentVersion", + "abstractKey": null +}; + +(node as any).hash = "00619a8709984275b2e18c2c44dd4e36"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentLayoutDrawerFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentLayoutDrawer_documentFragment.graphql.ts similarity index 72% rename from apps/console/src/__generated__/core/DocumentLayoutDrawerFragment.graphql.ts rename to apps/console/src/__generated__/core/DocumentLayoutDrawer_documentFragment.graphql.ts index 78d8ad1df..a6ea15ad0 100644 --- a/apps/console/src/__generated__/core/DocumentLayoutDrawerFragment.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentLayoutDrawer_documentFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<927b958ffdaa974f5a5054be4638b60d>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -11,22 +11,22 @@ import { ReaderFragment } from 'relay-runtime'; export type DocumentType = "ISMS" | "OTHER" | "POLICY" | "PROCEDURE"; import { FragmentRefs } from "relay-runtime"; -export type DocumentLayoutDrawerFragment$data = { +export type DocumentLayoutDrawer_documentFragment$data = { readonly canUpdate: boolean; readonly documentType: DocumentType; readonly id: string; - readonly " $fragmentType": "DocumentLayoutDrawerFragment"; + readonly " $fragmentType": "DocumentLayoutDrawer_documentFragment"; }; -export type DocumentLayoutDrawerFragment$key = { - readonly " $data"?: DocumentLayoutDrawerFragment$data; - readonly " $fragmentSpreads": FragmentRefs<"DocumentLayoutDrawerFragment">; +export type DocumentLayoutDrawer_documentFragment$key = { + readonly " $data"?: DocumentLayoutDrawer_documentFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentLayoutDrawer_documentFragment">; }; const node: ReaderFragment = { "argumentDefinitions": [], "kind": "Fragment", "metadata": null, - "name": "DocumentLayoutDrawerFragment", + "name": "DocumentLayoutDrawer_documentFragment", "selections": [ { "alias": null, @@ -60,6 +60,6 @@ const node: ReaderFragment = { "abstractKey": null }; -(node as any).hash = "a8f55efdb2682fb35a7bc68f3ef1808a"; +(node as any).hash = "0f2e539cf30c4e116fe81392605b1481"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentLayoutDrawer_versionFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentLayoutDrawer_versionFragment.graphql.ts new file mode 100644 index 000000000..4cb713b67 --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentLayoutDrawer_versionFragment.graphql.ts @@ -0,0 +1,110 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +export type DocumentClassification = "CONFIDENTIAL" | "INTERNAL" | "PUBLIC" | "SECRET"; +export type DocumentStatus = "DRAFT" | "PUBLISHED"; +import { FragmentRefs } from "relay-runtime"; +export type DocumentLayoutDrawer_versionFragment$data = { + readonly classification: DocumentClassification; + readonly id: string; + readonly owner: { + readonly fullName: string; + readonly id: string; + }; + readonly publishedAt: string | null | undefined; + readonly status: DocumentStatus; + readonly updatedAt: string; + readonly version: number; + readonly " $fragmentType": "DocumentLayoutDrawer_versionFragment"; +}; +export type DocumentLayoutDrawer_versionFragment$key = { + readonly " $data"?: DocumentLayoutDrawer_versionFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentLayoutDrawer_versionFragment">; +}; + +const node: ReaderFragment = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "DocumentLayoutDrawer_versionFragment", + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "classification", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "owner", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "fullName", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "version", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "status", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "updatedAt", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "publishedAt", + "storageKey": null + } + ], + "type": "DocumentVersion", + "abstractKey": null +}; +})(); + +(node as any).hash = "f5e9183b163586bab18475a19843b186"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentLayoutQuery.graphql.ts b/apps/console/src/__generated__/core/DocumentLayoutQuery.graphql.ts index b5d2a6936..d30eb4494 100644 --- a/apps/console/src/__generated__/core/DocumentLayoutQuery.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentLayoutQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<2d8a714fdbea520c2365e64524b68da5>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -10,60 +10,55 @@ import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; -export type DocumentClassification = "CONFIDENTIAL" | "INTERNAL" | "PUBLIC" | "SECRET"; export type DocumentStatus = "DRAFT" | "PUBLISHED"; -export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentLayoutQuery$variables = { documentId: string; + versionId: string; + versionSpecified: boolean; }; export type DocumentLayoutQuery$data = { readonly document: { readonly __typename: "Document"; readonly canPublish: boolean; - readonly classification: DocumentClassification; readonly controlInfo: { readonly totalCount: number; }; readonly id: string; - readonly owner: { - readonly fullName: string; - readonly id: string; - }; - readonly title: string; - readonly versions: { - readonly __id: string; + readonly lastVersion?: { readonly edges: ReadonlyArray<{ readonly node: { - readonly canDeleteDraft: boolean; - readonly classification: DocumentClassification; readonly content: string; readonly id: string; - readonly owner: { - readonly fullName: string; - readonly id: string; - }; - readonly publishedAt: string | null | undefined; readonly signatures: { - readonly __id: string; - readonly edges: ReadonlyArray<{ - readonly node: { - readonly id: string; - readonly signedBy: { - readonly id: string; - }; - readonly state: DocumentVersionSignatureState; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_signature">; - }; - }>; + readonly totalCount: number; + }; + readonly signedSignatures: { + readonly totalCount: number; }; readonly status: DocumentStatus; - readonly updatedAt: string; - readonly version: number; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_version">; + readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdown_versionFragment" | "DocumentLayoutDrawer_versionFragment">; }; }>; }; - readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdownFragment" | "DocumentControlsTabFragment" | "DocumentLayoutDrawerFragment" | "DocumentTitleFormFragment">; + readonly title: string; + readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdown_documentFragment" | "DocumentControlsTabFragment" | "DocumentLayoutDrawer_documentFragment" | "DocumentTitleFormFragment">; + } | { + // This will never be '%other', but we need some + // value in case none of the concrete values match. + readonly __typename: "%other"; + }; + readonly version?: { + readonly __typename: "DocumentVersion"; + readonly content: string; + readonly id: string; + readonly signatures: { + readonly totalCount: number; + }; + readonly signedSignatures: { + readonly totalCount: number; + }; + readonly status: DocumentStatus; + readonly " $fragmentSpreads": FragmentRefs<"DocumentActionsDropdown_versionFragment" | "DocumentLayoutDrawer_versionFragment">; } | { // This will never be '%other', but we need some // value in case none of the concrete values match. @@ -81,13 +76,23 @@ var v0 = [ "defaultValue": null, "kind": "LocalArgument", "name": "documentId" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "versionId" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "versionSpecified" } ], v1 = [ { "kind": "Variable", "name": "id", - "variableName": "documentId" + "variableName": "versionId" } ], v2 = { @@ -108,37 +113,104 @@ v4 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "title", + "name": "status", "storageKey": null }, v5 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "classification", + "name": "content", "storageKey": null }, v6 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "fullName", - "storageKey": null + "kind": "Literal", + "name": "first", + "value": 0 }, v7 = { "alias": null, "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "owner", - "plural": false, - "selections": [ - (v3/*: any*/), - (v6/*: any*/) - ], + "kind": "ScalarField", + "name": "totalCount", "storageKey": null }, -v8 = { +v8 = [ + (v7/*: any*/) +], +v9 = { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "filter", + "value": { + "activeContract": true + } + }, + (v6/*: any*/) + ], + "concreteType": "DocumentVersionSignatureConnection", + "kind": "LinkedField", + "name": "signatures", + "plural": false, + "selections": (v8/*: any*/), + "storageKey": "signatures(filter:{\"activeContract\":true},first:0)" +}, +v10 = { + "alias": "signedSignatures", + "args": [ + { + "kind": "Literal", + "name": "filter", + "value": { + "activeContract": true, + "states": [ + "SIGNED" + ] + } + }, + (v6/*: any*/) + ], + "concreteType": "DocumentVersionSignatureConnection", + "kind": "LinkedField", + "name": "signatures", + "plural": false, + "selections": (v8/*: any*/), + "storageKey": "signatures(filter:{\"activeContract\":true,\"states\":[\"SIGNED\"]},first:0)" +}, +v11 = [ + (v3/*: any*/), + (v4/*: any*/), + (v5/*: any*/), + { + "args": null, + "kind": "FragmentSpread", + "name": "DocumentActionsDropdown_versionFragment" + }, + { + "args": null, + "kind": "FragmentSpread", + "name": "DocumentLayoutDrawer_versionFragment" + }, + (v9/*: any*/), + (v10/*: any*/) +], +v12 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "documentId" + } +], +v13 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "title", + "storageKey": null +}, +v14 = { "alias": "canPublish", "args": [ { @@ -151,67 +223,88 @@ v8 = { "name": "permission", "storageKey": "permission(action:\"core:document-version:publish\")" }, -v9 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "totalCount", - "storageKey": null -}, -v10 = { +v15 = { "alias": "controlInfo", "args": [ - { - "kind": "Literal", - "name": "first", - "value": 0 - } + (v6/*: any*/) ], "concreteType": "ControlConnection", "kind": "LinkedField", "name": "controls", "plural": false, - "selections": [ - (v9/*: any*/) - ], + "selections": (v8/*: any*/), "storageKey": "controls(first:0)" }, -v11 = { +v16 = [ + { + "kind": "Literal", + "name": "first", + "value": 1 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } + } +], +v17 = [ + { + "kind": "Literal", + "name": "first", + "value": 20 + } +], +v18 = { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__id", + "storageKey": null + } + ] +}, +v19 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "content", + "name": "cursor", "storageKey": null }, -v12 = { +v20 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "status", + "name": "endCursor", "storageKey": null }, -v13 = { +v21 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "publishedAt", + "name": "hasNextPage", "storageKey": null }, -v14 = { +v22 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null +}, +v23 = { "alias": null, "args": null, "kind": "ScalarField", "name": "version", "storageKey": null }, -v15 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updatedAt", - "storageKey": null -}, -v16 = { +v24 = { "alias": "canDeleteDraft", "args": [ { @@ -224,85 +317,44 @@ v16 = { "name": "permission", "storageKey": "permission(action:\"core:document-version:delete-draft\")" }, -v17 = { +v25 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "state", + "name": "classification", "storageKey": null }, -v18 = { +v26 = { "alias": null, "args": null, - "kind": "ScalarField", - "name": "cursor", - "storageKey": null -}, -v19 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endCursor", - "storageKey": null -}, -v20 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "hasNextPage", - "storageKey": null -}, -v21 = { - "alias": null, - "args": null, - "concreteType": "PageInfo", + "concreteType": "People", "kind": "LinkedField", - "name": "pageInfo", + "name": "owner", "plural": false, "selections": [ - (v19/*: any*/), - (v20/*: any*/) - ], - "storageKey": null -}, -v22 = { - "kind": "ClientExtension", - "selections": [ + (v3/*: any*/), { "alias": null, "args": null, "kind": "ScalarField", - "name": "__id", + "name": "fullName", "storageKey": null } - ] + ], + "storageKey": null }, -v23 = [ - { - "kind": "Literal", - "name": "first", - "value": 20 - } -], -v24 = [ - { - "kind": "Literal", - "name": "action", - "value": "core:document-version:request-signature" - } -], -v25 = [ - { - "kind": "Literal", - "name": "first", - "value": 1000 - } -], -v26 = { +v27 = { "alias": null, "args": null, "kind": "ScalarField", - "name": "name", + "name": "updatedAt", + "storageKey": null +}, +v28 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "publishedAt", "storageKey": null }; return { @@ -312,9 +364,34 @@ return { "metadata": null, "name": "DocumentLayoutQuery", "selections": [ + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": "version", + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "selections": (v11/*: any*/), + "type": "DocumentVersion", + "abstractKey": null + } + ], + "storageKey": null + } + ] + }, { "alias": "document", - "args": (v1/*: any*/), + "args": (v12/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", @@ -325,11 +402,9 @@ return { "kind": "InlineFragment", "selections": [ (v3/*: any*/), - (v4/*: any*/), - (v5/*: any*/), - (v7/*: any*/), - (v8/*: any*/), - (v10/*: any*/), + (v13/*: any*/), + (v14/*: any*/), + (v15/*: any*/), { "args": null, "kind": "FragmentSpread", @@ -338,12 +413,12 @@ return { { "args": null, "kind": "FragmentSpread", - "name": "DocumentActionsDropdownFragment" + "name": "DocumentActionsDropdown_documentFragment" }, { "args": null, "kind": "FragmentSpread", - "name": "DocumentLayoutDrawerFragment" + "name": "DocumentLayoutDrawer_documentFragment" }, { "args": null, @@ -351,111 +426,43 @@ return { "name": "DocumentControlsTabFragment" }, { - "alias": "versions", - "args": null, - "concreteType": "DocumentVersionConnection", - "kind": "LinkedField", - "name": "__DocumentLayout_versions_connection", - "plural": false, + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": false, "selections": [ { - "alias": null, - "args": null, - "concreteType": "DocumentVersionEdge", + "alias": "lastVersion", + "args": (v16/*: any*/), + "concreteType": "DocumentVersionConnection", "kind": "LinkedField", - "name": "edges", - "plural": true, + "name": "versions", + "plural": false, "selections": [ { "alias": null, "args": null, - "concreteType": "DocumentVersion", + "concreteType": "DocumentVersionEdge", "kind": "LinkedField", - "name": "node", - "plural": false, + "name": "edges", + "plural": true, "selections": [ - (v3/*: any*/), - (v11/*: any*/), - (v12/*: any*/), - (v13/*: any*/), - (v14/*: any*/), - (v15/*: any*/), - (v5/*: any*/), - (v7/*: any*/), - (v16/*: any*/), { + "alias": null, "args": null, - "kind": "FragmentSpread", - "name": "DocumentSignaturesTab_version" - }, - { - "alias": "signatures", - "args": null, - "concreteType": "DocumentVersionSignatureConnection", + "concreteType": "DocumentVersion", "kind": "LinkedField", - "name": "__DocumentDetailPage_signatures_connection", + "name": "node", "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignatureEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignature", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - (v17/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "signedBy", - "plural": false, - "selections": [ - (v3/*: any*/) - ], - "storageKey": null - }, - { - "args": null, - "kind": "FragmentSpread", - "name": "DocumentSignaturesTab_signature" - }, - (v2/*: any*/) - ], - "storageKey": null - }, - (v18/*: any*/) - ], - "storageKey": null - }, - (v21/*: any*/), - (v22/*: any*/) - ], + "selections": (v11/*: any*/), "storageKey": null - }, - (v2/*: any*/) + } ], "storageKey": null - }, - (v18/*: any*/) + } ], - "storageKey": null - }, - (v21/*: any*/), - (v22/*: any*/) - ], - "storageKey": null + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ] } ], "type": "Document", @@ -476,7 +483,7 @@ return { "selections": [ { "alias": "document", - "args": (v1/*: any*/), + "args": (v12/*: any*/), "concreteType": null, "kind": "LinkedField", "name": "node", @@ -487,11 +494,9 @@ return { { "kind": "InlineFragment", "selections": [ - (v4/*: any*/), - (v5/*: any*/), - (v7/*: any*/), - (v8/*: any*/), - (v10/*: any*/), + (v13/*: any*/), + (v14/*: any*/), + (v15/*: any*/), { "alias": "canUpdate", "args": [ @@ -520,14 +525,14 @@ return { }, { "alias": null, - "args": (v23/*: any*/), + "args": (v17/*: any*/), "concreteType": "DocumentVersionConnection", "kind": "LinkedField", "name": "versions", "plural": false, "selections": [ - (v9/*: any*/), - (v22/*: any*/), + (v7/*: any*/), + (v18/*: any*/), { "alias": null, "args": null, @@ -545,136 +550,35 @@ return { "plural": false, "selections": [ (v3/*: any*/), - (v12/*: any*/), - (v11/*: any*/), - (v2/*: any*/), - (v13/*: any*/), - (v14/*: any*/), - (v15/*: any*/), + (v4/*: any*/), (v5/*: any*/), - (v7/*: any*/), - (v16/*: any*/), - { - "alias": "canRequestSignature", - "args": (v24/*: any*/), - "kind": "ScalarField", - "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" - }, - { - "alias": null, - "args": (v25/*: any*/), - "concreteType": "DocumentVersionSignatureConnection", - "kind": "LinkedField", - "name": "signatures", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignatureEdge", - "kind": "LinkedField", - "name": "edges", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignature", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - (v17/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "signedBy", - "plural": false, - "selections": [ - (v3/*: any*/), - (v6/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "primaryEmailAddress", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "signedAt", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "requestedAt", - "storageKey": null - }, - { - "alias": "canCancel", - "args": (v24/*: any*/), - "kind": "ScalarField", - "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" - }, - (v2/*: any*/) - ], - "storageKey": null - }, - (v18/*: any*/) - ], - "storageKey": null - }, - (v21/*: any*/), - (v22/*: any*/) - ], - "storageKey": "signatures(first:1000)" - }, - { - "alias": null, - "args": (v25/*: any*/), - "filters": [ - "filter" - ], - "handle": "connection", - "key": "DocumentSignaturesTab_signatures", - "kind": "LinkedHandle", - "name": "signatures" - }, - { - "alias": null, - "args": (v25/*: any*/), - "filters": [], - "handle": "connection", - "key": "DocumentDetailPage_signatures", - "kind": "LinkedHandle", - "name": "signatures" - } + (v2/*: any*/) ], "storageKey": null }, - (v18/*: any*/) + (v19/*: any*/) ], "storageKey": null }, - (v21/*: any*/) + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + (v20/*: any*/), + (v21/*: any*/) + ], + "storageKey": null + } ], "storageKey": "versions(first:20)" }, { "alias": null, - "args": (v23/*: any*/), + "args": (v17/*: any*/), "filters": null, "handle": "connection", "key": "DocumentLayout_versions", @@ -690,7 +594,7 @@ return { }, { "alias": null, - "args": (v23/*: any*/), + "args": (v17/*: any*/), "concreteType": "ControlConnection", "kind": "LinkedField", "name": "controls", @@ -713,7 +617,7 @@ return { "plural": false, "selections": [ (v3/*: any*/), - (v26/*: any*/), + (v22/*: any*/), { "alias": null, "args": null, @@ -730,7 +634,7 @@ return { "plural": false, "selections": [ (v3/*: any*/), - (v26/*: any*/) + (v22/*: any*/) ], "storageKey": null }, @@ -738,7 +642,7 @@ return { ], "storageKey": null }, - (v18/*: any*/) + (v19/*: any*/) ], "storageKey": null }, @@ -750,8 +654,8 @@ return { "name": "pageInfo", "plural": false, "selections": [ - (v19/*: any*/), (v20/*: any*/), + (v21/*: any*/), { "alias": null, "args": null, @@ -769,13 +673,13 @@ return { ], "storageKey": null }, - (v22/*: any*/) + (v18/*: any*/) ], "storageKey": "controls(first:20)" }, { "alias": null, - "args": (v23/*: any*/), + "args": (v17/*: any*/), "filters": [ "orderBy", "filter" @@ -784,6 +688,57 @@ return { "key": "DocumentControlsTab_controls", "kind": "LinkedHandle", "name": "controls" + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": false, + "selections": [ + { + "alias": "lastVersion", + "args": (v16/*: any*/), + "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": [ + (v3/*: any*/), + (v4/*: any*/), + (v5/*: any*/), + (v23/*: any*/), + (v24/*: any*/), + (v25/*: any*/), + (v26/*: any*/), + (v27/*: any*/), + (v28/*: any*/), + (v9/*: any*/), + (v10/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ] } ], "type": "Document", @@ -791,38 +746,57 @@ return { } ], "storageKey": null + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": "version", + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v3/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + (v4/*: any*/), + (v5/*: any*/), + (v23/*: any*/), + (v24/*: any*/), + (v25/*: any*/), + (v26/*: any*/), + (v27/*: any*/), + (v28/*: any*/), + (v9/*: any*/), + (v10/*: any*/) + ], + "type": "DocumentVersion", + "abstractKey": null + } + ], + "storageKey": null + } + ] } ] }, "params": { - "cacheID": "fdb52683d7fce578839cfff215840057", + "cacheID": "9d915bec70a2a5c1b9924d73e537d3b1", "id": null, - "metadata": { - "connection": [ - { - "count": null, - "cursor": null, - "direction": "forward", - "path": null - }, - { - "count": null, - "cursor": null, - "direction": "forward", - "path": [ - "document", - "versions" - ] - } - ] - }, + "metadata": {}, "name": "DocumentLayoutQuery", "operationKind": "query", - "text": "query DocumentLayoutQuery(\n $documentId: ID!\n) {\n document: node(id: $documentId) {\n __typename\n ... on Document {\n id\n title\n classification\n owner {\n id\n fullName\n }\n canPublish: permission(action: \"core:document-version:publish\")\n controlInfo: controls(first: 0) {\n totalCount\n }\n ...DocumentTitleFormFragment\n ...DocumentActionsDropdownFragment\n ...DocumentLayoutDrawerFragment\n ...DocumentControlsTabFragment\n versions(first: 20) {\n edges {\n node {\n id\n content\n status\n publishedAt\n version\n updatedAt\n classification\n owner {\n id\n fullName\n }\n canDeleteDraft: permission(action: \"core:document-version:delete-draft\")\n ...DocumentSignaturesTab_version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n signedBy {\n id\n }\n ...DocumentSignaturesTab_signature\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n }\n id\n }\n}\n\nfragment DocumentActionsDropdownFragment on Document {\n id\n title\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n versions(first: 20) {\n totalCount\n }\n ...UpdateVersionDialogFragment\n}\n\nfragment DocumentControlsTabFragment on Document {\n id\n controls(first: 20) {\n edges {\n node {\n id\n ...LinkedControlsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment DocumentLayoutDrawerFragment on Document {\n id\n documentType\n canUpdate: permission(action: \"core:document:update\")\n}\n\nfragment DocumentSignaturesTab_signature on DocumentVersionSignature {\n id\n state\n signedAt\n requestedAt\n signedBy {\n fullName\n primaryEmailAddress\n id\n }\n canCancel: permission(action: \"core:document-version:request-signature\")\n}\n\nfragment DocumentSignaturesTab_version on DocumentVersion {\n id\n status\n canRequestSignature: permission(action: \"core:document-version:request-signature\")\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n signedBy {\n id\n fullName\n primaryEmailAddress\n }\n ...DocumentSignaturesTab_signature\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n\nfragment DocumentTitleFormFragment on Document {\n id\n title\n canUpdate: permission(action: \"core:document:update\")\n}\n\nfragment LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n\nfragment UpdateVersionDialogFragment on Document {\n id\n versions(first: 20) {\n edges {\n node {\n id\n status\n content\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n" + "text": "query DocumentLayoutQuery(\n $documentId: ID!\n $versionId: ID!\n $versionSpecified: Boolean!\n) {\n version: node(id: $versionId) @include(if: $versionSpecified) {\n __typename\n ... on DocumentVersion {\n id\n status\n content\n ...DocumentActionsDropdown_versionFragment\n ...DocumentLayoutDrawer_versionFragment\n signatures(first: 0, filter: {activeContract: true}) {\n totalCount\n }\n signedSignatures: signatures(first: 0, filter: {states: [SIGNED], activeContract: true}) {\n totalCount\n }\n }\n id\n }\n document: node(id: $documentId) {\n __typename\n ... on Document {\n id\n title\n canPublish: permission(action: \"core:document-version:publish\")\n controlInfo: controls(first: 0) {\n totalCount\n }\n ...DocumentTitleFormFragment\n ...DocumentActionsDropdown_documentFragment\n ...DocumentLayoutDrawer_documentFragment\n ...DocumentControlsTabFragment\n lastVersion: versions(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) @skip(if: $versionSpecified) {\n edges {\n node {\n id\n status\n content\n ...DocumentActionsDropdown_versionFragment\n ...DocumentLayoutDrawer_versionFragment\n signatures(first: 0, filter: {activeContract: true}) {\n totalCount\n }\n signedSignatures: signatures(first: 0, filter: {states: [SIGNED], activeContract: true}) {\n totalCount\n }\n }\n }\n }\n }\n id\n }\n}\n\nfragment DocumentActionsDropdown_documentFragment on Document {\n id\n title\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n versions(first: 20) {\n totalCount\n }\n ...UpdateVersionDialogFragment\n}\n\nfragment DocumentActionsDropdown_versionFragment on DocumentVersion {\n id\n version\n status\n canDeleteDraft: permission(action: \"core:document-version:delete-draft\")\n}\n\nfragment DocumentControlsTabFragment on Document {\n id\n controls(first: 20) {\n edges {\n node {\n id\n ...LinkedControlsCardFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment DocumentLayoutDrawer_documentFragment on Document {\n id\n documentType\n canUpdate: permission(action: \"core:document:update\")\n}\n\nfragment DocumentLayoutDrawer_versionFragment on DocumentVersion {\n id\n classification\n owner {\n id\n fullName\n }\n version\n status\n updatedAt\n publishedAt\n}\n\nfragment DocumentTitleFormFragment on Document {\n id\n title\n canUpdate: permission(action: \"core:document:update\")\n}\n\nfragment LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n\nfragment UpdateVersionDialogFragment on Document {\n id\n versions(first: 20) {\n edges {\n node {\n id\n status\n content\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n" } }; })(); -(node as any).hash = "eb6bf3db2691763a5d1f4f2435f986e6"; +(node as any).hash = "ef2d8e2f721cb77607af7421f76cd695"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesTab_signature.graphql.ts b/apps/console/src/__generated__/core/DocumentSignatureListItemFragment.graphql.ts similarity index 68% rename from apps/console/src/__generated__/core/DocumentSignaturesTab_signature.graphql.ts rename to apps/console/src/__generated__/core/DocumentSignatureListItemFragment.graphql.ts index 7c7563dae..df95537bf 100644 --- a/apps/console/src/__generated__/core/DocumentSignaturesTab_signature.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentSignatureListItemFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -11,28 +11,27 @@ import { ReaderFragment } from 'relay-runtime'; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; import { FragmentRefs } from "relay-runtime"; -export type DocumentSignaturesTab_signature$data = { +export type DocumentSignatureListItemFragment$data = { readonly canCancel: boolean; readonly id: string; readonly requestedAt: string; readonly signedAt: string | null | undefined; readonly signedBy: { readonly fullName: string; - readonly primaryEmailAddress: string; }; readonly state: DocumentVersionSignatureState; - readonly " $fragmentType": "DocumentSignaturesTab_signature"; + readonly " $fragmentType": "DocumentSignatureListItemFragment"; }; -export type DocumentSignaturesTab_signature$key = { - readonly " $data"?: DocumentSignaturesTab_signature$data; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_signature">; +export type DocumentSignatureListItemFragment$key = { + readonly " $data"?: DocumentSignatureListItemFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureListItemFragment">; }; const node: ReaderFragment = { "argumentDefinitions": [], "kind": "Fragment", "metadata": null, - "name": "DocumentSignaturesTab_signature", + "name": "DocumentSignatureListItemFragment", "selections": [ { "alias": null, @@ -41,6 +40,24 @@ const node: ReaderFragment = { "name": "id", "storageKey": null }, + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "signedBy", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "fullName", + "storageKey": null + } + ], + "storageKey": null + }, { "alias": null, "args": null, @@ -62,49 +79,24 @@ const node: ReaderFragment = { "name": "requestedAt", "storageKey": null }, - { - "alias": null, - "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "signedBy", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "fullName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "primaryEmailAddress", - "storageKey": null - } - ], - "storageKey": null - }, { "alias": "canCancel", "args": [ { "kind": "Literal", "name": "action", - "value": "core:document-version:request-signature" + "value": "core:document-version-signature:cancel" } ], "kind": "ScalarField", "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" + "storageKey": "permission(action:\"core:document-version-signature:cancel\")" } ], "type": "DocumentVersionSignature", "abstractKey": null }; -(node as any).hash = "bbfdd78015e97032862da41aad6beeae"; +(node as any).hash = "59bdf4434147c77415ed636a9b78e154"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesTab_cancelSignatureMutation.graphql.ts b/apps/console/src/__generated__/core/DocumentSignatureListItem_cancelSignatureMutation.graphql.ts similarity index 72% rename from apps/console/src/__generated__/core/DocumentSignaturesTab_cancelSignatureMutation.graphql.ts rename to apps/console/src/__generated__/core/DocumentSignatureListItem_cancelSignatureMutation.graphql.ts index d2767601c..3dd8f01d0 100644 --- a/apps/console/src/__generated__/core/DocumentSignaturesTab_cancelSignatureMutation.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentSignatureListItem_cancelSignatureMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<0a17c03011fe74b75a90dbeae02ab2ef>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -12,18 +12,18 @@ import { ConcreteRequest } from 'relay-runtime'; export type CancelSignatureRequestInput = { documentVersionSignatureId: string; }; -export type DocumentSignaturesTab_cancelSignatureMutation$variables = { +export type DocumentSignatureListItem_cancelSignatureMutation$variables = { connections: ReadonlyArray; input: CancelSignatureRequestInput; }; -export type DocumentSignaturesTab_cancelSignatureMutation$data = { +export type DocumentSignatureListItem_cancelSignatureMutation$data = { readonly cancelSignatureRequest: { readonly deletedDocumentVersionSignatureId: string; }; }; -export type DocumentSignaturesTab_cancelSignatureMutation = { - response: DocumentSignaturesTab_cancelSignatureMutation$data; - variables: DocumentSignaturesTab_cancelSignatureMutation$variables; +export type DocumentSignatureListItem_cancelSignatureMutation = { + response: DocumentSignatureListItem_cancelSignatureMutation$data; + variables: DocumentSignatureListItem_cancelSignatureMutation$variables; }; const node: ConcreteRequest = (function(){ @@ -59,7 +59,7 @@ return { ], "kind": "Fragment", "metadata": null, - "name": "DocumentSignaturesTab_cancelSignatureMutation", + "name": "DocumentSignatureListItem_cancelSignatureMutation", "selections": [ { "alias": null, @@ -84,7 +84,7 @@ return { (v0/*: any*/) ], "kind": "Operation", - "name": "DocumentSignaturesTab_cancelSignatureMutation", + "name": "DocumentSignatureListItem_cancelSignatureMutation", "selections": [ { "alias": null, @@ -117,16 +117,16 @@ return { ] }, "params": { - "cacheID": "c57722e2b57faca64eea4950864e034d", + "cacheID": "494afd972f44f534cf6f728196717a82", "id": null, "metadata": {}, - "name": "DocumentSignaturesTab_cancelSignatureMutation", + "name": "DocumentSignatureListItem_cancelSignatureMutation", "operationKind": "mutation", - "text": "mutation DocumentSignaturesTab_cancelSignatureMutation(\n $input: CancelSignatureRequestInput!\n) {\n cancelSignatureRequest(input: $input) {\n deletedDocumentVersionSignatureId\n }\n}\n" + "text": "mutation DocumentSignatureListItem_cancelSignatureMutation(\n $input: CancelSignatureRequestInput!\n) {\n cancelSignatureRequest(input: $input) {\n deletedDocumentVersionSignatureId\n }\n}\n" } }; })(); -(node as any).hash = "9f5d3ff869ec6f91285140285248e824"; +(node as any).hash = "1a98d7aee9dc6758f186e915e1abe073"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql.ts b/apps/console/src/__generated__/core/DocumentSignatureListQuery.graphql.ts similarity index 77% rename from apps/console/src/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql.ts rename to apps/console/src/__generated__/core/DocumentSignatureListQuery.graphql.ts index 884ba5925..0eb97fe32 100644 --- a/apps/console/src/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentSignatureListQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<568018897f0db254b4d8c43c05abb7c6>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -12,22 +12,23 @@ import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentVersionSignatureFilter = { + activeContract?: boolean | null | undefined; states?: ReadonlyArray | null | undefined; }; -export type DocumentSignaturesTabRefetchQuery$variables = { +export type DocumentSignatureListQuery$variables = { count?: number | null | undefined; cursor?: string | null | undefined; id: string; signatureFilter?: DocumentVersionSignatureFilter | null | undefined; }; -export type DocumentSignaturesTabRefetchQuery$data = { +export type DocumentSignatureListQuery$data = { readonly node: { - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_version">; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_versionFragment">; }; }; -export type DocumentSignaturesTabRefetchQuery = { - response: DocumentSignaturesTabRefetchQuery$data; - variables: DocumentSignaturesTabRefetchQuery$variables; +export type DocumentSignatureListQuery = { + response: DocumentSignatureListQuery$data; + variables: DocumentSignatureListQuery$variables; }; const node: ConcreteRequest = (function(){ @@ -73,13 +74,6 @@ v6 = { "storageKey": null }, v7 = [ - { - "kind": "Literal", - "name": "action", - "value": "core:document-version:request-signature" - } -], -v8 = [ { "kind": "Variable", "name": "after", @@ -106,7 +100,7 @@ return { ], "kind": "Fragment", "metadata": null, - "name": "DocumentSignaturesTabRefetchQuery", + "name": "DocumentSignatureListQuery", "selections": [ { "alias": null, @@ -135,7 +129,7 @@ return { } ], "kind": "FragmentSpread", - "name": "DocumentSignaturesTab_version" + "name": "DocumentSignatureList_versionFragment" } ], "storageKey": null @@ -153,7 +147,7 @@ return { (v2/*: any*/) ], "kind": "Operation", - "name": "DocumentSignaturesTabRefetchQuery", + "name": "DocumentSignatureListQuery", "selections": [ { "alias": null, @@ -175,16 +169,9 @@ return { "name": "status", "storageKey": null }, - { - "alias": "canRequestSignature", - "args": (v7/*: any*/), - "kind": "ScalarField", - "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" - }, { "alias": null, - "args": (v8/*: any*/), + "args": (v7/*: any*/), "concreteType": "DocumentVersionSignatureConnection", "kind": "LinkedField", "name": "signatures", @@ -207,13 +194,6 @@ return { "plural": false, "selections": [ (v6/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "state", - "storageKey": null - }, { "alias": null, "args": null, @@ -229,17 +209,17 @@ return { "kind": "ScalarField", "name": "fullName", "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "primaryEmailAddress", - "storageKey": null } ], "storageKey": null }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "state", + "storageKey": null + }, { "alias": null, "args": null, @@ -256,10 +236,16 @@ return { }, { "alias": "canCancel", - "args": (v7/*: any*/), + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:document-version-signature:cancel" + } + ], "kind": "ScalarField", "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" + "storageKey": "permission(action:\"core:document-version-signature:cancel\")" }, (v5/*: any*/) ], @@ -317,7 +303,7 @@ return { }, { "alias": null, - "args": (v8/*: any*/), + "args": (v7/*: any*/), "filters": [ "filter" ], @@ -336,16 +322,16 @@ return { ] }, "params": { - "cacheID": "5f4d3d9043d744d2e35c7c5b3e209a37", + "cacheID": "25f679c343e22278c8a3d5e2db9bb3d0", "id": null, "metadata": {}, - "name": "DocumentSignaturesTabRefetchQuery", + "name": "DocumentSignatureListQuery", "operationKind": "query", - "text": "query DocumentSignaturesTabRefetchQuery(\n $count: Int = 1000\n $cursor: CursorKey\n $signatureFilter: DocumentVersionSignatureFilter\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...DocumentSignaturesTab_version_1vp7QE\n id\n }\n}\n\nfragment DocumentSignaturesTab_signature on DocumentVersionSignature {\n id\n state\n signedAt\n requestedAt\n signedBy {\n fullName\n primaryEmailAddress\n id\n }\n canCancel: permission(action: \"core:document-version:request-signature\")\n}\n\nfragment DocumentSignaturesTab_version_1vp7QE on DocumentVersion {\n id\n status\n canRequestSignature: permission(action: \"core:document-version:request-signature\")\n signatures(first: $count, after: $cursor, filter: $signatureFilter) {\n edges {\n node {\n id\n state\n signedBy {\n id\n fullName\n primaryEmailAddress\n }\n ...DocumentSignaturesTab_signature\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}\n" + "text": "query DocumentSignatureListQuery(\n $count: Int = 1000\n $cursor: CursorKey\n $signatureFilter: DocumentVersionSignatureFilter\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...DocumentSignatureList_versionFragment_1vp7QE\n id\n }\n}\n\nfragment DocumentSignatureListItemFragment on DocumentVersionSignature {\n id\n signedBy {\n fullName\n id\n }\n state\n signedAt\n requestedAt\n canCancel: permission(action: \"core:document-version-signature:cancel\")\n}\n\nfragment DocumentSignatureList_versionFragment_1vp7QE on DocumentVersion {\n ...DocumentSignaturePlaceholder_versionFragment\n signatures(first: $count, after: $cursor, filter: $signatureFilter) {\n edges {\n node {\n id\n signedBy {\n id\n }\n ...DocumentSignatureListItemFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment DocumentSignaturePlaceholder_versionFragment on DocumentVersion {\n id\n status\n}\n" } }; })(); -(node as any).hash = "9282fd9e9a1aa10a36535863b896283c"; +(node as any).hash = "cc402c3b46eacfb04db1186bbd744f67"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignatureList_peopleFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentSignatureList_peopleFragment.graphql.ts new file mode 100644 index 000000000..b85d1d7b2 --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignatureList_peopleFragment.graphql.ts @@ -0,0 +1,118 @@ +/** + * @generated SignedSource<<3b60ebae6765024147f97c157f6251fe>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type DocumentSignatureList_peopleFragment$data = { + readonly people: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly id: string; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_personFragment">; + }; + }>; + }; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_organizationFragment">; + readonly " $fragmentType": "DocumentSignatureList_peopleFragment"; +}; +export type DocumentSignatureList_peopleFragment$key = { + readonly " $data"?: DocumentSignatureList_peopleFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_peopleFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "filter" + } + ], + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignatureList_peopleFragment", + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "DocumentSignaturePlaceholder_organizationFragment" + }, + { + "alias": "people", + "args": [ + { + "kind": "Variable", + "name": "filter", + "variableName": "filter" + }, + { + "kind": "Literal", + "name": "first", + "value": 1000 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "ASC", + "field": "FULL_NAME" + } + } + ], + "concreteType": "PeopleConnection", + "kind": "LinkedField", + "name": "peoples", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "PeopleEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "args": null, + "kind": "FragmentSpread", + "name": "DocumentSignaturePlaceholder_personFragment" + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "type": "Organization", + "abstractKey": null +}; + +(node as any).hash = "6c0a2b965d1440c2e0fd8ec9ce3c5e85"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesTab_version.graphql.ts b/apps/console/src/__generated__/core/DocumentSignatureList_versionFragment.graphql.ts similarity index 66% rename from apps/console/src/__generated__/core/DocumentSignaturesTab_version.graphql.ts rename to apps/console/src/__generated__/core/DocumentSignatureList_versionFragment.graphql.ts index 19a8bf1c8..5e6466e2a 100644 --- a/apps/console/src/__generated__/core/DocumentSignaturesTab_version.graphql.ts +++ b/apps/console/src/__generated__/core/DocumentSignatureList_versionFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<51a0ef23951497b2d074fafbda0ea04b>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -9,11 +9,8 @@ // @ts-nocheck import { ReaderFragment } from 'relay-runtime'; -export type DocumentStatus = "DRAFT" | "PUBLISHED"; -export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; import { FragmentRefs } from "relay-runtime"; -export type DocumentSignaturesTab_version$data = { - readonly canRequestSignature: boolean; +export type DocumentSignatureList_versionFragment$data = { readonly id: string; readonly signatures: { readonly __id: string; @@ -21,24 +18,21 @@ export type DocumentSignaturesTab_version$data = { readonly node: { readonly id: string; readonly signedBy: { - readonly fullName: string; readonly id: string; - readonly primaryEmailAddress: string; }; - readonly state: DocumentVersionSignatureState; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_signature">; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureListItemFragment">; }; }>; }; - readonly status: DocumentStatus; - readonly " $fragmentType": "DocumentSignaturesTab_version"; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_versionFragment">; + readonly " $fragmentType": "DocumentSignatureList_versionFragment"; }; -export type DocumentSignaturesTab_version$key = { - readonly " $data"?: DocumentSignaturesTab_version$data; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_version">; +export type DocumentSignatureList_versionFragment$key = { + readonly " $data"?: DocumentSignatureList_versionFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_versionFragment">; }; -import DocumentSignaturesTabRefetchQuery_graphql from './DocumentSignaturesTabRefetchQuery.graphql'; +import DocumentSignatureListQuery_graphql from './DocumentSignatureListQuery.graphql'; const node: ReaderFragment = (function(){ var v0 = [ @@ -91,35 +85,19 @@ return { "fragmentPathInResult": [ "node" ], - "operation": DocumentSignaturesTabRefetchQuery_graphql, + "operation": DocumentSignatureListQuery_graphql, "identifierInfo": { "identifierField": "id", "identifierQueryVariableName": "id" } } }, - "name": "DocumentSignaturesTab_version", + "name": "DocumentSignatureList_versionFragment", "selections": [ - (v1/*: any*/), { - "alias": null, "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - }, - { - "alias": "canRequestSignature", - "args": [ - { - "kind": "Literal", - "name": "action", - "value": "core:document-version:request-signature" - } - ], - "kind": "ScalarField", - "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" + "kind": "FragmentSpread", + "name": "DocumentSignaturePlaceholder_versionFragment" }, { "alias": "signatures", @@ -152,13 +130,6 @@ return { "plural": false, "selections": [ (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "state", - "storageKey": null - }, { "alias": null, "args": null, @@ -167,28 +138,14 @@ return { "name": "signedBy", "plural": false, "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "fullName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "primaryEmailAddress", - "storageKey": null - } + (v1/*: any*/) ], "storageKey": null }, { "args": null, "kind": "FragmentSpread", - "name": "DocumentSignaturesTab_signature" + "name": "DocumentSignatureListItemFragment" }, { "alias": null, @@ -249,13 +206,14 @@ return { } ], "storageKey": null - } + }, + (v1/*: any*/) ], "type": "DocumentVersion", "abstractKey": null }; })(); -(node as any).hash = "9282fd9e9a1aa10a36535863b896283c"; +(node as any).hash = "cc402c3b46eacfb04db1186bbd744f67"; export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_organizationFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_organizationFragment.graphql.ts new file mode 100644 index 000000000..6a7ca2949 --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_organizationFragment.graphql.ts @@ -0,0 +1,48 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type DocumentSignaturePlaceholder_organizationFragment$data = { + readonly canRequestSignature: boolean; + readonly " $fragmentType": "DocumentSignaturePlaceholder_organizationFragment"; +}; +export type DocumentSignaturePlaceholder_organizationFragment$key = { + readonly " $data"?: DocumentSignaturePlaceholder_organizationFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_organizationFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignaturePlaceholder_organizationFragment", + "selections": [ + { + "alias": "canRequestSignature", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:document-version:request-signature" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:document-version:request-signature\")" + } + ], + "type": "Organization", + "abstractKey": null +}; + +(node as any).hash = "4bb0c71b4b90f335c9938b0283639f36"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_personFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_personFragment.graphql.ts new file mode 100644 index 000000000..9e928bd30 --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_personFragment.graphql.ts @@ -0,0 +1,58 @@ +/** + * @generated SignedSource<<5a43f6367b3b03e57c58a1ab616e867b>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type DocumentSignaturePlaceholder_personFragment$data = { + readonly fullName: string; + readonly id: string; + readonly primaryEmailAddress: string; + readonly " $fragmentType": "DocumentSignaturePlaceholder_personFragment"; +}; +export type DocumentSignaturePlaceholder_personFragment$key = { + readonly " $data"?: DocumentSignaturePlaceholder_personFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_personFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignaturePlaceholder_personFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "fullName", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "primaryEmailAddress", + "storageKey": null + } + ], + "type": "People", + "abstractKey": null +}; + +(node as any).hash = "4b77b54fc11c37a0e1c50f4d482b0f18"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_requestSignatureMutation.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_requestSignatureMutation.graphql.ts new file mode 100644 index 000000000..99646a57c --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_requestSignatureMutation.graphql.ts @@ -0,0 +1,184 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from 'relay-runtime'; +export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; +export type RequestSignatureInput = { + documentVersionId: string; + signatoryId: string; +}; +export type DocumentSignaturePlaceholder_requestSignatureMutation$variables = { + connections: ReadonlyArray; + input: RequestSignatureInput; +}; +export type DocumentSignaturePlaceholder_requestSignatureMutation$data = { + readonly requestSignature: { + readonly documentVersionSignatureEdge: { + readonly node: { + readonly id: string; + readonly signedBy: { + readonly id: string; + }; + readonly state: DocumentVersionSignatureState; + }; + }; + }; +}; +export type DocumentSignaturePlaceholder_requestSignatureMutation = { + response: DocumentSignaturePlaceholder_requestSignatureMutation$data; + variables: DocumentSignaturePlaceholder_requestSignatureMutation$variables; +}; + +const node: ConcreteRequest = (function(){ +var v0 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "connections" +}, +v1 = { + "defaultValue": null, + "kind": "LocalArgument", + "name": "input" +}, +v2 = [ + { + "kind": "Variable", + "name": "input", + "variableName": "input" + } +], +v3 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v4 = { + "alias": null, + "args": null, + "concreteType": "DocumentVersionSignatureEdge", + "kind": "LinkedField", + "name": "documentVersionSignatureEdge", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "DocumentVersionSignature", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v3/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "state", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "signedBy", + "plural": false, + "selections": [ + (v3/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [ + (v0/*: any*/), + (v1/*: any*/) + ], + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignaturePlaceholder_requestSignatureMutation", + "selections": [ + { + "alias": null, + "args": (v2/*: any*/), + "concreteType": "RequestSignaturePayload", + "kind": "LinkedField", + "name": "requestSignature", + "plural": false, + "selections": [ + (v4/*: any*/) + ], + "storageKey": null + } + ], + "type": "Mutation", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [ + (v1/*: any*/), + (v0/*: any*/) + ], + "kind": "Operation", + "name": "DocumentSignaturePlaceholder_requestSignatureMutation", + "selections": [ + { + "alias": null, + "args": (v2/*: any*/), + "concreteType": "RequestSignaturePayload", + "kind": "LinkedField", + "name": "requestSignature", + "plural": false, + "selections": [ + (v4/*: any*/), + { + "alias": null, + "args": null, + "filters": null, + "handle": "prependEdge", + "key": "", + "kind": "LinkedHandle", + "name": "documentVersionSignatureEdge", + "handleArgs": [ + { + "kind": "Variable", + "name": "connections", + "variableName": "connections" + } + ] + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "e1c767d2441f84b783ed4d3824e2f0e8", + "id": null, + "metadata": {}, + "name": "DocumentSignaturePlaceholder_requestSignatureMutation", + "operationKind": "mutation", + "text": "mutation DocumentSignaturePlaceholder_requestSignatureMutation(\n $input: RequestSignatureInput!\n) {\n requestSignature(input: $input) {\n documentVersionSignatureEdge {\n node {\n id\n state\n signedBy {\n id\n }\n }\n }\n }\n}\n" + } +}; +})(); + +(node as any).hash = "9a5d20aef93c6bf4b83f88851a13b9c9"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_versionFragment.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_versionFragment.graphql.ts new file mode 100644 index 000000000..f5819a9b7 --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignaturePlaceholder_versionFragment.graphql.ts @@ -0,0 +1,51 @@ +/** + * @generated SignedSource<<34ec1be8ec1087ce5163f0642009d71a>> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from 'relay-runtime'; +export type DocumentStatus = "DRAFT" | "PUBLISHED"; +import { FragmentRefs } from "relay-runtime"; +export type DocumentSignaturePlaceholder_versionFragment$data = { + readonly id: string; + readonly status: DocumentStatus; + readonly " $fragmentType": "DocumentSignaturePlaceholder_versionFragment"; +}; +export type DocumentSignaturePlaceholder_versionFragment$key = { + readonly " $data"?: DocumentSignaturePlaceholder_versionFragment$data; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturePlaceholder_versionFragment">; +}; + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignaturePlaceholder_versionFragment", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "status", + "storageKey": null + } + ], + "type": "DocumentVersion", + "abstractKey": null +}; + +(node as any).hash = "935a86ea9eb392eedff1c0d0558f4aac"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesPageQuery.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturesPageQuery.graphql.ts new file mode 100644 index 000000000..20a79aebf --- /dev/null +++ b/apps/console/src/__generated__/core/DocumentSignaturesPageQuery.graphql.ts @@ -0,0 +1,603 @@ +/** + * @generated SignedSource<> + * @lightSyntaxTransform + * @nogrep + */ + +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ConcreteRequest } from 'relay-runtime'; +import { FragmentRefs } from "relay-runtime"; +export type DocumentSignaturesPageQuery$variables = { + documentId: string; + organizationId: string; + versionId: string; + versionSpecified: boolean; +}; +export type DocumentSignaturesPageQuery$data = { + readonly document?: { + readonly __typename: "Document"; + readonly lastVersion: { + readonly edges: ReadonlyArray<{ + readonly node: { + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_versionFragment">; + }; + }>; + }; + } | { + // This will never be '%other', but we need some + // value in case none of the concrete values match. + readonly __typename: "%other"; + }; + readonly organization: { + readonly __typename: string; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_peopleFragment">; + }; + readonly version?: { + readonly __typename: string; + readonly " $fragmentSpreads": FragmentRefs<"DocumentSignatureList_versionFragment">; + }; +}; +export type DocumentSignaturesPageQuery = { + response: DocumentSignaturesPageQuery$data; + variables: DocumentSignaturesPageQuery$variables; +}; + +const node: ConcreteRequest = (function(){ +var v0 = [ + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "documentId" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "organizationId" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "versionId" + }, + { + "defaultValue": null, + "kind": "LocalArgument", + "name": "versionSpecified" + } +], +v1 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "organizationId" + } +], +v2 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__typename", + "storageKey": null +}, +v3 = { + "kind": "Literal", + "name": "filter", + "value": { + "excludeContractEnded": true + } +}, +v4 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "documentId" + } +], +v5 = [ + { + "kind": "Literal", + "name": "first", + "value": 1 + }, + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "DESC", + "field": "CREATED_AT" + } + } +], +v6 = { + "args": null, + "kind": "FragmentSpread", + "name": "DocumentSignatureList_versionFragment" +}, +v7 = [ + { + "kind": "Variable", + "name": "id", + "variableName": "versionId" + } +], +v8 = { + "kind": "Literal", + "name": "first", + "value": 1000 +}, +v9 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}, +v10 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "fullName", + "storageKey": null +}, +v11 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "status", + "storageKey": null +}, +v12 = [ + (v8/*: any*/) +], +v13 = { + "alias": null, + "args": (v12/*: any*/), + "concreteType": "DocumentVersionSignatureConnection", + "kind": "LinkedField", + "name": "signatures", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "DocumentVersionSignatureEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "DocumentVersionSignature", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v9/*: any*/), + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "signedBy", + "plural": false, + "selections": [ + (v9/*: any*/), + (v10/*: any*/) + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "state", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "signedAt", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "requestedAt", + "storageKey": null + }, + { + "alias": "canCancel", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:document-version-signature:cancel" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:document-version-signature:cancel\")" + }, + (v2/*: any*/) + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + } + ], + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "PageInfo", + "kind": "LinkedField", + "name": "pageInfo", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "endCursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "hasNextPage", + "storageKey": null + } + ], + "storageKey": null + }, + { + "kind": "ClientExtension", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "__id", + "storageKey": null + } + ] + } + ], + "storageKey": "signatures(first:1000)" +}, +v14 = { + "alias": null, + "args": (v12/*: any*/), + "filters": [ + "filter" + ], + "handle": "connection", + "key": "DocumentSignaturesTab_signatures", + "kind": "LinkedHandle", + "name": "signatures" +}; +return { + "fragment": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Fragment", + "metadata": null, + "name": "DocumentSignaturesPageQuery", + "selections": [ + { + "alias": "organization", + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "args": [ + (v3/*: any*/) + ], + "kind": "FragmentSpread", + "name": "DocumentSignatureList_peopleFragment" + } + ], + "storageKey": null + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": false, + "selections": [ + { + "alias": "document", + "args": (v4/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": "lastVersion", + "args": (v5/*: any*/), + "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": [ + (v6/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "type": "Document", + "abstractKey": null + } + ], + "storageKey": null + } + ] + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": "version", + "args": (v7/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v6/*: any*/) + ], + "storageKey": null + } + ] + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": (v0/*: any*/), + "kind": "Operation", + "name": "DocumentSignaturesPageQuery", + "selections": [ + { + "alias": "organization", + "args": (v1/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": "canRequestSignature", + "args": [ + { + "kind": "Literal", + "name": "action", + "value": "core:document-version:request-signature" + } + ], + "kind": "ScalarField", + "name": "permission", + "storageKey": "permission(action:\"core:document-version:request-signature\")" + }, + { + "alias": "people", + "args": [ + (v3/*: any*/), + (v8/*: any*/), + { + "kind": "Literal", + "name": "orderBy", + "value": { + "direction": "ASC", + "field": "FULL_NAME" + } + } + ], + "concreteType": "PeopleConnection", + "kind": "LinkedField", + "name": "peoples", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "PeopleEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "People", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v9/*: any*/), + (v10/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "primaryEmailAddress", + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "peoples(filter:{\"excludeContractEnded\":true},first:1000,orderBy:{\"direction\":\"ASC\",\"field\":\"FULL_NAME\"})" + } + ], + "type": "Organization", + "abstractKey": null + }, + (v9/*: any*/) + ], + "storageKey": null + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": false, + "selections": [ + { + "alias": "document", + "args": (v4/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + { + "alias": "lastVersion", + "args": (v5/*: any*/), + "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": [ + (v9/*: any*/), + (v11/*: any*/), + (v13/*: any*/), + (v14/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "versions(first:1,orderBy:{\"direction\":\"DESC\",\"field\":\"CREATED_AT\"})" + } + ], + "type": "Document", + "abstractKey": null + }, + (v9/*: any*/) + ], + "storageKey": null + } + ] + }, + { + "condition": "versionSpecified", + "kind": "Condition", + "passingValue": true, + "selections": [ + { + "alias": "version", + "args": (v7/*: any*/), + "concreteType": null, + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v2/*: any*/), + (v9/*: any*/), + { + "kind": "InlineFragment", + "selections": [ + (v11/*: any*/), + (v13/*: any*/), + (v14/*: any*/) + ], + "type": "DocumentVersion", + "abstractKey": null + } + ], + "storageKey": null + } + ] + } + ] + }, + "params": { + "cacheID": "a14fdbc42e1aa20bbe0dc24680404388", + "id": null, + "metadata": {}, + "name": "DocumentSignaturesPageQuery", + "operationKind": "query", + "text": "query DocumentSignaturesPageQuery(\n $documentId: ID!\n $organizationId: ID!\n $versionId: ID!\n $versionSpecified: Boolean!\n) {\n organization: node(id: $organizationId) {\n __typename\n ...DocumentSignatureList_peopleFragment_4oWXMW\n id\n }\n document: node(id: $documentId) @skip(if: $versionSpecified) {\n __typename\n ... on Document {\n lastVersion: versions(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {\n edges {\n node {\n ...DocumentSignatureList_versionFragment\n id\n }\n }\n }\n }\n id\n }\n version: node(id: $versionId) @include(if: $versionSpecified) {\n __typename\n ...DocumentSignatureList_versionFragment\n id\n }\n}\n\nfragment DocumentSignatureListItemFragment on DocumentVersionSignature {\n id\n signedBy {\n fullName\n id\n }\n state\n signedAt\n requestedAt\n canCancel: permission(action: \"core:document-version-signature:cancel\")\n}\n\nfragment DocumentSignatureList_peopleFragment_4oWXMW on Organization {\n ...DocumentSignaturePlaceholder_organizationFragment\n people: peoples(first: 1000, orderBy: {direction: ASC, field: FULL_NAME}, filter: {excludeContractEnded: true}) {\n edges {\n node {\n id\n ...DocumentSignaturePlaceholder_personFragment\n }\n }\n }\n}\n\nfragment DocumentSignatureList_versionFragment on DocumentVersion {\n ...DocumentSignaturePlaceholder_versionFragment\n signatures(first: 1000) {\n edges {\n node {\n id\n signedBy {\n id\n }\n ...DocumentSignatureListItemFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n id\n}\n\nfragment DocumentSignaturePlaceholder_organizationFragment on Organization {\n canRequestSignature: permission(action: \"core:document-version:request-signature\")\n}\n\nfragment DocumentSignaturePlaceholder_personFragment on People {\n id\n fullName\n primaryEmailAddress\n}\n\nfragment DocumentSignaturePlaceholder_versionFragment on DocumentVersion {\n id\n status\n}\n" + } +}; +})(); + +(node as any).hash = "2468bd3b1b46b19f6f7a35e9b69beab6"; + +export default node; diff --git a/apps/console/src/__generated__/core/DocumentSignaturesTab_requestSignatureMutation.graphql.ts b/apps/console/src/__generated__/core/DocumentSignaturesTab_requestSignatureMutation.graphql.ts deleted file mode 100644 index 27e3e057e..000000000 --- a/apps/console/src/__generated__/core/DocumentSignaturesTab_requestSignatureMutation.graphql.ts +++ /dev/null @@ -1,267 +0,0 @@ -/** - * @generated SignedSource<<2988f1319b1ad6110c328a00f644f26d>> - * @lightSyntaxTransform - * @nogrep - */ - -/* tslint:disable */ -/* eslint-disable */ -// @ts-nocheck - -import { ConcreteRequest } from 'relay-runtime'; -import { FragmentRefs } from "relay-runtime"; -export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; -export type RequestSignatureInput = { - documentVersionId: string; - signatoryId: string; -}; -export type DocumentSignaturesTab_requestSignatureMutation$variables = { - connections: ReadonlyArray; - input: RequestSignatureInput; -}; -export type DocumentSignaturesTab_requestSignatureMutation$data = { - readonly requestSignature: { - readonly documentVersionSignatureEdge: { - readonly node: { - readonly id: string; - readonly signedBy: { - readonly id: string; - }; - readonly state: DocumentVersionSignatureState; - readonly " $fragmentSpreads": FragmentRefs<"DocumentSignaturesTab_signature">; - }; - }; - }; -}; -export type DocumentSignaturesTab_requestSignatureMutation = { - response: DocumentSignaturesTab_requestSignatureMutation$data; - variables: DocumentSignaturesTab_requestSignatureMutation$variables; -}; - -const node: ConcreteRequest = (function(){ -var v0 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connections" -}, -v1 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "input" -}, -v2 = [ - { - "kind": "Variable", - "name": "input", - "variableName": "input" - } -], -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v4 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "state", - "storageKey": null -}; -return { - "fragment": { - "argumentDefinitions": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "kind": "Fragment", - "metadata": null, - "name": "DocumentSignaturesTab_requestSignatureMutation", - "selections": [ - { - "alias": null, - "args": (v2/*: any*/), - "concreteType": "RequestSignaturePayload", - "kind": "LinkedField", - "name": "requestSignature", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignatureEdge", - "kind": "LinkedField", - "name": "documentVersionSignatureEdge", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignature", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "signedBy", - "plural": false, - "selections": [ - (v3/*: any*/) - ], - "storageKey": null - }, - { - "args": null, - "kind": "FragmentSpread", - "name": "DocumentSignaturesTab_signature" - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "type": "Mutation", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [ - (v1/*: any*/), - (v0/*: any*/) - ], - "kind": "Operation", - "name": "DocumentSignaturesTab_requestSignatureMutation", - "selections": [ - { - "alias": null, - "args": (v2/*: any*/), - "concreteType": "RequestSignaturePayload", - "kind": "LinkedField", - "name": "requestSignature", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignatureEdge", - "kind": "LinkedField", - "name": "documentVersionSignatureEdge", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "DocumentVersionSignature", - "kind": "LinkedField", - "name": "node", - "plural": false, - "selections": [ - (v3/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "People", - "kind": "LinkedField", - "name": "signedBy", - "plural": false, - "selections": [ - (v3/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "fullName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "primaryEmailAddress", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "signedAt", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "requestedAt", - "storageKey": null - }, - { - "alias": "canCancel", - "args": [ - { - "kind": "Literal", - "name": "action", - "value": "core:document-version:request-signature" - } - ], - "kind": "ScalarField", - "name": "permission", - "storageKey": "permission(action:\"core:document-version:request-signature\")" - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "filters": null, - "handle": "prependEdge", - "key": "", - "kind": "LinkedHandle", - "name": "documentVersionSignatureEdge", - "handleArgs": [ - { - "kind": "Variable", - "name": "connections", - "variableName": "connections" - } - ] - } - ], - "storageKey": null - } - ] - }, - "params": { - "cacheID": "5a9c28a2a8a3234f953f7a609da7d02e", - "id": null, - "metadata": {}, - "name": "DocumentSignaturesTab_requestSignatureMutation", - "operationKind": "mutation", - "text": "mutation DocumentSignaturesTab_requestSignatureMutation(\n $input: RequestSignatureInput!\n) {\n requestSignature(input: $input) {\n documentVersionSignatureEdge {\n node {\n id\n state\n signedBy {\n id\n }\n ...DocumentSignaturesTab_signature\n }\n }\n }\n}\n\nfragment DocumentSignaturesTab_signature on DocumentVersionSignature {\n id\n state\n signedAt\n requestedAt\n signedBy {\n fullName\n primaryEmailAddress\n id\n }\n canCancel: permission(action: \"core:document-version:request-signature\")\n}\n" - } -}; -})(); - -(node as any).hash = "f0b9fc6ff9db455e9079bf7e45fcd603"; - -export default node; diff --git a/apps/console/src/pages/organizations/documents/DocumentLayout.tsx b/apps/console/src/pages/organizations/documents/DocumentLayout.tsx index 505263f62..4ac09c857 100644 --- a/apps/console/src/pages/organizations/documents/DocumentLayout.tsx +++ b/apps/console/src/pages/organizations/documents/DocumentLayout.tsx @@ -14,57 +14,52 @@ import { DocumentTitleForm } from "./_components/DocumentTitleForm"; import { DocumentVersionsDropdown } from "./_components/DocumentVersionsDropdown"; export const documentLayoutQuery = graphql` - query DocumentLayoutQuery($documentId: ID!) { + query DocumentLayoutQuery($documentId: ID! $versionId: ID! $versionSpecified: Boolean!) { + # We use this on /documents/:documentId/versions/:versionId + version: node(id: $versionId) @include(if: $versionSpecified) { + __typename + ... on DocumentVersion { + id + status + content # TODO: remove, is used on description tab + ...DocumentActionsDropdown_versionFragment + ...DocumentLayoutDrawer_versionFragment + signatures(first: 0 filter: { activeContract: true }) { + totalCount + } + signedSignatures: signatures(first: 0 filter: { states: [SIGNED], activeContract: true }) { + totalCount + } + } + } document: node(id: $documentId) { __typename ... on Document { id title - classification - owner { - id - fullName - } canPublish: permission(action: "core:document-version:publish") controlInfo: controls(first: 0) { totalCount } ...DocumentTitleFormFragment - ...DocumentActionsDropdownFragment - ...DocumentLayoutDrawerFragment + ...DocumentActionsDropdown_documentFragment + ...DocumentLayoutDrawer_documentFragment + # TDOO: remove ...DocumentControlsTabFragment - versions(first: 20) @connection(key: "DocumentLayout_versions") { - __id + # We use this on /documents/:documentId + lastVersion: versions(first: 1 orderBy: { field: CREATED_AT, direction: DESC }) @skip(if: $versionSpecified) { edges { node { id - content status - publishedAt - version - updatedAt - classification - owner { - id - fullName + content # TODO: remove, is used on description tab + ...DocumentActionsDropdown_versionFragment + ...DocumentLayoutDrawer_versionFragment + signatures(first: 0 filter: { activeContract: true }) { + totalCount } - canDeleteDraft: permission( - action: "core:document-version:delete-draft" - ) - ...DocumentSignaturesTab_version - signatures(first: 1000) - @connection(key: "DocumentDetailPage_signatures", filters: []) { - __id - edges { - node { - id - state - signedBy { - id - } - ...DocumentSignaturesTab_signature - } - } + signedSignatures: signatures(first: 0 filter: { states: [SIGNED], activeContract: true }) { + totalCount } } } @@ -94,17 +89,19 @@ export function DocumentLayout(props: { queryRef: PreloadedQuery(documentLayoutQuery, queryRef); - if (document.__typename !== "Document") { + const { document, version } = usePreloadedQuery(documentLayoutQuery, queryRef); + if (document.__typename !== "Document" || (version && version.__typename !== "DocumentVersion")) { throw new Error("invalid node type"); } + const lastVersion = document.lastVersion?.edges[0].node; - const currentVersion - = document.versions.edges.find(v => v.node.id === versionId)?.node - ?? document.versions.edges[0].node; + if (!version && !lastVersion) { + throw new Error("current version not specified"); + } + + // It is ok to cas as NonNullable here since we know we have either version or lastVersion + const currentVersion = version ?? lastVersion as NonNullable; const isDraft = currentVersion.status === "DRAFT"; - const signatures = currentVersion.signatures?.edges?.map(s => s.node) ?? []; - const signedSignatures = signatures.filter(s => s.state === "SIGNED"); const [publishDocumentVersion, isPublishing] = useMutationWithToasts( publishDocumentVersionMutation, @@ -153,7 +150,7 @@ export function DocumentLayout(props: { queryRef: PreloadedQuery )} - + @@ -171,18 +168,19 @@ export function DocumentLayout(props: { queryRef: PreloadedQuery {__("Signatures")} - {signedSignatures.length} + {currentVersion.signedSignatures.totalCount} / - {signatures.length} + {currentVersion.signatures.totalCount} )} + {/* TODO: remove context once control tab is using its own query */} - + ); } diff --git a/apps/console/src/pages/organizations/documents/DocumentLayoutLoader.tsx b/apps/console/src/pages/organizations/documents/DocumentLayoutLoader.tsx index ad4762d50..55e03899a 100644 --- a/apps/console/src/pages/organizations/documents/DocumentLayoutLoader.tsx +++ b/apps/console/src/pages/organizations/documents/DocumentLayoutLoader.tsx @@ -9,7 +9,7 @@ import { CoreRelayProvider } from "#/providers/CoreRelayProvider"; import { DocumentLayout, documentLayoutQuery } from "./DocumentLayout"; function DocumentLayoutQueryLoader() { - const { documentId } = useParams(); + const { documentId, versionId } = useParams(); if (!documentId) { throw new Error(":documentId missing in route params"); } @@ -17,7 +17,11 @@ function DocumentLayoutQueryLoader() { useEffect(() => { if (!queryRef) { - loadQuery({ documentId }); + loadQuery({ + documentId, + versionId: versionId ?? "", + versionSpecified: !!versionId, + }); } }); diff --git a/apps/console/src/pages/organizations/documents/_components/DocumentActionsDropdown.tsx b/apps/console/src/pages/organizations/documents/_components/DocumentActionsDropdown.tsx index 9573f3f7f..7b88e28cb 100644 --- a/apps/console/src/pages/organizations/documents/_components/DocumentActionsDropdown.tsx +++ b/apps/console/src/pages/organizations/documents/_components/DocumentActionsDropdown.tsx @@ -6,23 +6,22 @@ import { loadQuery, useFragment } from "react-relay"; import { useNavigate } from "react-router"; import { graphql } from "relay-runtime"; -import type { DocumentActionsDropdownFragment$key } from "#/__generated__/core/DocumentActionsDropdownFragment.graphql"; +import type { DocumentActionsDropdown_documentFragment$key } from "#/__generated__/core/DocumentActionsDropdown_documentFragment.graphql"; +import type { DocumentActionsDropdown_versionFragment$key } from "#/__generated__/core/DocumentActionsDropdown_versionFragment.graphql"; import type { DocumentActionsDropdownn_exportVersionMutation } from "#/__generated__/core/DocumentActionsDropdownn_exportVersionMutation.graphql"; -import type { DocumentLayoutQuery$data } from "#/__generated__/core/DocumentLayoutQuery.graphql"; import { PdfDownloadDialog, type PdfDownloadDialogRef } from "#/components/documents/PdfDownloadDialog"; import { coreEnvironment } from "#/environments"; import { useDeleteDocumentMutation, useDeleteDraftDocumentVersionMutation } from "#/hooks/graph/DocumentGraph"; import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; import { useOrganizationId } from "#/hooks/useOrganizationId"; import { CurrentUser } from "#/providers/CurrentUser"; -import type { NodeOf } from "#/types"; import { documentLayoutQuery } from "../DocumentLayout"; import UpdateVersionDialog from "./UpdateVersionDialog"; -const fragment = graphql` - fragment DocumentActionsDropdownFragment on Document { +const documentFragment = graphql` + fragment DocumentActionsDropdown_documentFragment on Document { id title canUpdate: permission(action: "core:document:update") @@ -35,6 +34,15 @@ const fragment = graphql` } `; +const versionFragment = graphql` + fragment DocumentActionsDropdown_versionFragment on DocumentVersion { + id + version + status + canDeleteDraft: permission(action: "core:document-version:delete-draft") + } +`; + const exportDocumentVersionMutation = graphql` mutation DocumentActionsDropdownn_exportVersionMutation( $input: ExportDocumentVersionPDFInput! @@ -46,11 +54,10 @@ const exportDocumentVersionMutation = graphql` `; export function DocumentActionsDropdownn(props: { - currentVersion: NodeOf["versions"]>; - fKey: DocumentActionsDropdownFragment$key; - isDraft: boolean; + documentFragmentRef: DocumentActionsDropdown_documentFragment$key; + versionFragmentRef: DocumentActionsDropdown_versionFragment$key; }) { - const { currentVersion, fKey, isDraft } = props; + const { documentFragmentRef, versionFragmentRef } = props; const organizationId = useOrganizationId(); const navigate = useNavigate(); @@ -60,7 +67,11 @@ export function DocumentActionsDropdownn(props: { const pdfDownloadDialogRef = useRef(null); const confirm = useConfirm(); - const document = useFragment(fragment, fKey); + const document = useFragment(documentFragment, documentFragmentRef); + const version = useFragment(versionFragment, versionFragmentRef); + + const isDraft = version.status === "DRAFT"; + const [deleteDocument, isDeleting] = useDeleteDocumentMutation(); const [deleteDraftDocumentVersion, isDeletingDraft] = useDeleteDraftDocumentVersionMutation(); @@ -105,7 +116,7 @@ export function DocumentActionsDropdownn(props: { new Promise((resolve) => { void deleteDraftDocumentVersion({ variables: { - input: { documentVersionId: currentVersion.id }, + input: { documentVersionId: version.id }, connections: [document.versions.__id], }, onSuccess() { @@ -126,7 +137,7 @@ export function DocumentActionsDropdownn(props: { __( "This will permanently delete the draft version %s of \"%s\". This action cannot be undone.", ), - currentVersion.version, + version.version, document.title, ), }, @@ -139,7 +150,7 @@ export function DocumentActionsDropdownn(props: { watermarkEmail?: string; }) => { const input = { - documentVersionId: currentVersion.id, + documentVersionId: version.id, withWatermark: options.withWatermark, withSignatures: options.withSignatures, ...(options.withWatermark @@ -156,7 +167,7 @@ export function DocumentActionsDropdownn(props: { if (data.exportDocumentVersionPDF) { const link = window.document.createElement("a"); link.href = data.exportDocumentVersionPDF.data; - link.download = `${document.title}-v${currentVersion.version}.pdf`; + link.download = `${document.title}-v${version.version}.pdf`; window.document.body.appendChild(link); link.click(); window.document.body.removeChild(link); @@ -188,7 +199,7 @@ export function DocumentActionsDropdownn(props: { )} {isDraft && document.versions.totalCount > 1 - && currentVersion.canDeleteDraft && ( + && version.canDeleteDraft && ( ["versions"]>; - fKey: DocumentLayoutDrawerFragment$key; - isDraft: boolean; + documentFragmentRef: DocumentLayoutDrawer_documentFragment$key; + versionFragmentRef: DocumentLayoutDrawer_versionFragment$key; }) { - const { currentVersion, fKey, isDraft } = props; + const { documentFragmentRef, versionFragmentRef } = props; const organizationId = useOrganizationId(); const { __ } = useTranslate(); @@ -65,15 +78,18 @@ export function DocumentLayoutDrawer(props: { const [isEditingType, setIsEditingType] = useState(false); const [isEditingClassification, setIsEditingClassification] = useState(false); - const document = useFragment(fragment, fKey); + const document = useFragment(documentFragment, documentFragmentRef); + const version = useFragment(versionFragment, versionFragmentRef); + + const isDraft = version.status === "DRAFT"; const { control, handleSubmit, reset } = useFormWithSchema( schema, { defaultValues: { - ownerId: currentVersion.owner?.id || "", + ownerId: version.owner.id, documentType: document.documentType, - classification: currentVersion.classification, + classification: version.classification, }, }, ); @@ -174,8 +190,8 @@ export function DocumentLayoutDrawer(props: { canEdit={document.canUpdate} > - - {currentVersion.owner?.fullName} + + {version.owner.fullName} )} @@ -239,7 +255,7 @@ export function DocumentLayoutDrawer(props: {
{getDocumentClassificationLabel( __, - currentVersion.classification, + version.classification, )}
@@ -256,18 +272,18 @@ export function DocumentLayoutDrawer(props: {
- {currentVersion.version} + {version.version}
- {formatDate(currentVersion.updatedAt)} + {formatDate(version.updatedAt)}
- {currentVersion.publishedAt && ( + {version.publishedAt && (
- {formatDate(currentVersion.publishedAt)} + {formatDate(version.publishedAt)}
)} diff --git a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdown.tsx b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdown.tsx index 2c1e10df3..20a8b522b 100644 --- a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdown.tsx +++ b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdown.tsx @@ -1,5 +1,6 @@ import { useTranslate } from "@probo/i18n"; import { Button, Dropdown, IconChevronDown, IconClock } from "@probo/ui"; +import { Suspense } from "react"; import { useQueryLoader } from "react-relay"; import { useParams } from "react-router"; @@ -30,8 +31,10 @@ export function DocumentVersionsDropdown(props: { )} > - {queryRef - && } + + {queryRef + && } + ); } diff --git a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownItem.tsx b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownItem.tsx index ed4f643c9..9fea76124 100644 --- a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownItem.tsx +++ b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownItem.tsx @@ -1,5 +1,5 @@ import { useTranslate } from "@probo/i18n"; -import { Badge } from "@probo/ui"; +import { Badge, DropdownItem } from "@probo/ui"; import { clsx } from "clsx"; import { useFragment } from "react-relay"; import { Link, useLocation, useParams } from "react-router"; @@ -21,10 +21,10 @@ const fragment = graphql` `; export function DocumentVersionsDropdownItem(props: { - fKey: DocumentVersionsDropdownItemFragment$key; + fragmentRef: DocumentVersionsDropdownItemFragment$key; active?: boolean; }) { - const { fKey, active } = props; + const { fragmentRef, active } = props; const { dateTimeFormat, __ } = useTranslate(); const organizationId = useOrganizationId(); @@ -33,40 +33,41 @@ export function DocumentVersionsDropdownItem(props: { throw new Error(":documentId route param missing"); } - const version = useFragment(fragment, fKey); + const version = useFragment(fragment, fragmentRef); const suffix = useLocation().pathname.split("/").at(-1); return ( - -
-
-
- {version.version} -
-
-
-
- {version.status === "DRAFT" && ( - - {__("Draft")} - + + +
+
+
+ {version.version} +
-
- {dateTimeFormat(version.publishedAt ?? version.updatedAt)} +
+
+ {version.status === "DRAFT" && ( + + {__("Draft")} + + )} +
+
+ {dateTimeFormat(version.publishedAt ?? version.updatedAt)} +
-
- + +
); } diff --git a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownMenu.tsx b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownMenu.tsx index 80421c2e5..dab218764 100644 --- a/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownMenu.tsx +++ b/apps/console/src/pages/organizations/documents/_components/DocumentVersionsDropdownMenu.tsx @@ -1,4 +1,3 @@ -import { DropdownItem } from "@probo/ui"; import { type PreloadedQuery, usePreloadedQuery } from "react-relay"; import { graphql } from "relay-runtime"; @@ -41,12 +40,11 @@ export function DocumentVersionsDropdownMenu(props: { return ( <> {document.versions.edges.map(({ node: version }) => ( - - - + ))} ); diff --git a/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx new file mode 100644 index 000000000..cc9ae9c48 --- /dev/null +++ b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx @@ -0,0 +1,110 @@ +import { useTranslate } from "@probo/i18n"; +import { Checkbox, Spinner } from "@probo/ui"; +import { Suspense, useState } from "react"; +import { type PreloadedQuery, usePreloadedQuery } from "react-relay"; +import { graphql } from "relay-runtime"; + +import type { DocumentSignatureList_versionFragment$key } from "#/__generated__/core/DocumentSignatureList_versionFragment.graphql"; +import type { DocumentSignaturesPageQuery } from "#/__generated__/core/DocumentSignaturesPageQuery.graphql"; + +import { DocumentSignatureList } from "./_components/DocumentSignatureList"; + +export const documentSignaturesPageQuery = graphql` + query DocumentSignaturesPageQuery($documentId: ID! $organizationId: ID! $versionId: ID! $versionSpecified: Boolean!) { + organization: node(id: $organizationId) { + __typename + ...DocumentSignatureList_peopleFragment @arguments(filter: { excludeContractEnded: true }) + } + # We use this on /documents/:documentId + document: node(id: $documentId) @skip(if: $versionSpecified) { + __typename + ... on Document { + lastVersion: versions( + first: 1 + orderBy: { field: CREATED_AT, direction: DESC } + ) { + edges { + node { + ...DocumentSignatureList_versionFragment + } + } + } + } + } + # We use this on /documents/:documentId/versions/:versionId + version: node(id: $versionId) @include(if: $versionSpecified) { + __typename + ...DocumentSignatureList_versionFragment + } + } +`; + +type SignatureState = "REQUESTED" | "SIGNED"; + +export function DocumentSignaturesPage(props: { queryRef: PreloadedQuery }) { + const { queryRef } = props; + + const { __ } = useTranslate(); + + const { + organization, + document, + version, + } = usePreloadedQuery(documentSignaturesPageQuery, queryRef); + if (organization.__typename != "Organization" || (version && version.__typename != "DocumentVersion") || (document && document.__typename !== "Document")) { + throw new Error("invalid type for node"); + } + if (!document && !version) { + throw new Error("no document or version sepcified"); + } + + const [selectedStates, setSelectedStates] = useState([]); + const handleSelectState = (state: SignatureState) => { + setSelectedStates(prev => + prev.includes(state) ? prev.filter(s => s !== state) : [...prev, state], + ); + }; + + return ( +
+
+ + {__("Filter by state:")} + +
+ handleSelectState("REQUESTED")} + /> + handleSelectState("REQUESTED")} + > + {__("Requested")} + +
+
+ handleSelectState("SIGNED")} + /> + handleSelectState("SIGNED")} + > + {__("Signed")} + +
+
+ }> + + +
+ ); +} diff --git a/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPageLoader.tsx b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPageLoader.tsx new file mode 100644 index 000000000..80e908ce2 --- /dev/null +++ b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPageLoader.tsx @@ -0,0 +1,47 @@ +import { Suspense, useEffect } from "react"; +import { useQueryLoader } from "react-relay"; +import { useParams } from "react-router"; + +import type { DocumentSignaturesPageQuery } from "#/__generated__/core/DocumentSignaturesPageQuery.graphql"; +import { LinkCardSkeleton } from "#/components/skeletons/LinkCardSkeleton"; +import { useOrganizationId } from "#/hooks/useOrganizationId"; +import { CoreRelayProvider } from "#/providers/CoreRelayProvider"; + +import { DocumentSignaturesPage, documentSignaturesPageQuery } from "./DocumentSignaturesPage"; + +function DocumentSignaturesPageQueryLoader() { + const organizationId = useOrganizationId(); + const { documentId, versionId } = useParams(); + if (!documentId) { + throw new Error(":documentId missing in route params"); + } + + const [queryRef, loadQuery] = useQueryLoader(documentSignaturesPageQuery); + + useEffect(() => { + if (!queryRef) { + loadQuery({ + organizationId, + documentId: documentId, + versionId: versionId ?? "", + versionSpecified: !!versionId, + }); + } + }); + + if (!queryRef) { + return ; + } + + return ; +} + +export default function DocumentSignaturesPageLoader() { + return ( + + }> + + + + ); +} diff --git a/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureList.tsx b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureList.tsx new file mode 100644 index 000000000..9f256cdb9 --- /dev/null +++ b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureList.tsx @@ -0,0 +1,128 @@ +import { useEffect, useRef } from "react"; +import { useFragment, useRefetchableFragment } from "react-relay"; +import { graphql } from "relay-runtime"; + +import type { DocumentSignatureList_peopleFragment$key } from "#/__generated__/core/DocumentSignatureList_peopleFragment.graphql"; +import type { DocumentSignatureList_versionFragment$key } from "#/__generated__/core/DocumentSignatureList_versionFragment.graphql"; +import type { DocumentSignatureListQuery } from "#/__generated__/core/DocumentSignatureListQuery.graphql"; + +import { DocumentSignatureListItem } from "./DocumentSignatureListItem"; +import { DocumentSignaturePlaceholder } from "./DocumentSignaturePlaceholder"; + +const versionFragment = graphql` + fragment DocumentSignatureList_versionFragment on DocumentVersion + @refetchable(queryName: "DocumentSignatureListQuery") + @argumentDefinitions( + count: { type: "Int", defaultValue: 1000 } + cursor: { type: "CursorKey" } + signatureFilter: { type: "DocumentVersionSignatureFilter" } + ) { + ...DocumentSignaturePlaceholder_versionFragment + signatures(first: $count, after: $cursor, filter: $signatureFilter) + @connection( + key: "DocumentSignaturesTab_signatures" + filters: ["filter"] + ) { + __id + edges { + node { + id + signedBy { + id + } + ...DocumentSignatureListItemFragment + } + } + } + } +`; + +const peopleFragment = graphql` + fragment DocumentSignatureList_peopleFragment on Organization @argumentDefinitions( + filter: { type: "PeopleFilter" } + ) { + ...DocumentSignaturePlaceholder_organizationFragment + people: peoples( + first: 1000 + orderBy: { direction: ASC, field: FULL_NAME } + filter: $filter + ) { + edges { + node { + id + ...DocumentSignaturePlaceholder_personFragment + } + } + } + } +`; + +type SignatureState = "REQUESTED" | "SIGNED"; + +export function DocumentSignatureList(props: { + peopleFragmentRef: DocumentSignatureList_peopleFragment$key; + versionFragmentRef: DocumentSignatureList_versionFragment$key; + selectedStates: SignatureState[]; +}) { + const { peopleFragmentRef, selectedStates, versionFragmentRef } = props; + + const { people, ...organization } = useFragment( + peopleFragment, + peopleFragmentRef, + ); + const [version, refetch] = useRefetchableFragment< + DocumentSignatureListQuery, + DocumentSignatureList_versionFragment$key + >( + versionFragment, + versionFragmentRef, + ); + const signatureMap = new Map(version.signatures.edges.map(({ node }) => [node.signedBy.id, node])); + + const isFirstRender = useRef(true); + + // Refetch when filter changes (skip initial render) + useEffect(() => { + if (isFirstRender.current) { + isFirstRender.current = false; + return; + } + + const filter + = selectedStates.length > 0 ? { states: selectedStates } : null; + + refetch({ signatureFilter: filter }); + }, [selectedStates, refetch]); + + const filteredPeople + = selectedStates.length > 0 + ? people.edges.filter(({ node }) => signatureMap.has(node.id)) + : people.edges; + + return ( +
+ {filteredPeople.map(({ node: p }) => { + const signature = signatureMap.get(p.id); + return ( + signature + ? ( + + ) + : ( + + ) + ); + })} +
+ ); +} diff --git a/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureListItem.tsx b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureListItem.tsx new file mode 100644 index 000000000..3c709e485 --- /dev/null +++ b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignatureListItem.tsx @@ -0,0 +1,108 @@ +import { sprintf } from "@probo/helpers"; +import { useTranslate } from "@probo/i18n"; +import { Avatar, Badge, Button, IconCircleCheck, IconClock } from "@probo/ui"; +import { useFragment } from "react-relay"; +import { type DataID, graphql } from "relay-runtime"; + +import type { DocumentSignatureListItemFragment$key } from "#/__generated__/core/DocumentSignatureListItemFragment.graphql"; +import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; + +const fragment = graphql` + fragment DocumentSignatureListItemFragment on DocumentVersionSignature { + id + signedBy { + fullName + } + state + signedAt + requestedAt + canCancel: permission(action: "core:document-version-signature:cancel") + } +`; + +const cancelSignatureMutation = graphql` + mutation DocumentSignatureListItem_cancelSignatureMutation( + $input: CancelSignatureRequestInput! + $connections: [ID!]! + ) { + cancelSignatureRequest(input: $input) { + deletedDocumentVersionSignatureId @deleteEdge(connections: $connections) + } + } +`; + +export function DocumentSignatureListItem(props: { + fragmentRef: DocumentSignatureListItemFragment$key; + connectionId: DataID; +}) { + const { connectionId, fragmentRef } = props; + + const { __, dateTimeFormat } = useTranslate(); + const signature = useFragment(fragment, fragmentRef); + + const isSigned = signature.state === "SIGNED"; + const label = isSigned ? __("Signed on %s") : __("Requested on %s"); + + const [cancelSignature, isCancellingSignature] = useMutationWithToasts( + cancelSignatureMutation, + { + successMessage: __("Request cancelled successfully"), + errorMessage: __("Failed to cancel signature request"), + }, + ); + + return ( +
+ +
+
+ {signature.signedBy.fullName} +
+
+ {isSigned + ? ( + + ) + : ( + + )} + + {sprintf( + label, + dateTimeFormat( + isSigned ? signature.signedAt : signature.requestedAt, + ), + )} + +
+
+ {isSigned + ? ( + + {__("Signed")} + + ) + : ( + signature.canCancel && ( + + ) + )} +
+ ); +} diff --git a/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignaturePlaceholder.tsx b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignaturePlaceholder.tsx new file mode 100644 index 000000000..3223a27b9 --- /dev/null +++ b/apps/console/src/pages/organizations/documents/signatures/_components/DocumentSignaturePlaceholder.tsx @@ -0,0 +1,111 @@ +import { useTranslate } from "@probo/i18n"; +import { Avatar, Button } from "@probo/ui"; +import { useFragment } from "react-relay"; +import { type DataID, graphql } from "relay-runtime"; + +import type { DocumentSignaturePlaceholder_organizationFragment$key } from "#/__generated__/core/DocumentSignaturePlaceholder_organizationFragment.graphql"; +import type { DocumentSignaturePlaceholder_personFragment$key } from "#/__generated__/core/DocumentSignaturePlaceholder_personFragment.graphql"; +import type { DocumentSignaturePlaceholder_versionFragment$key } from "#/__generated__/core/DocumentSignaturePlaceholder_versionFragment.graphql"; +import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; + +const organizationFragment = graphql` + fragment DocumentSignaturePlaceholder_organizationFragment on Organization { + canRequestSignature: permission( + action: "core:document-version:request-signature" + ) + } +`; + +const personFragment = graphql` + fragment DocumentSignaturePlaceholder_personFragment on People { + id + fullName + primaryEmailAddress + } +`; + +const versionFragment = graphql` + fragment DocumentSignaturePlaceholder_versionFragment on DocumentVersion { + id + status + } +`; + +const requestSignatureMutation = graphql` + mutation DocumentSignaturePlaceholder_requestSignatureMutation( + $input: RequestSignatureInput! + $connections: [ID!]! + ) { + requestSignature(input: $input) { + documentVersionSignatureEdge @prependEdge(connections: $connections) { + node { + id + state + signedBy { + id + } + } + } + } + } +`; + +export function DocumentSignaturePlaceholder(props: { + connectionId: DataID; + organizationFragmentRef: DocumentSignaturePlaceholder_organizationFragment$key; + personFragmentRef: DocumentSignaturePlaceholder_personFragment$key; + versionFragmentRef: DocumentSignaturePlaceholder_versionFragment$key; +}) { + const { connectionId, organizationFragmentRef, personFragmentRef, versionFragmentRef } = props; + + const { __ } = useTranslate(); + + const { canRequestSignature } = useFragment( + organizationFragment, + organizationFragmentRef, + ); + const person = useFragment(personFragment, personFragmentRef); + const version = useFragment(versionFragment, versionFragmentRef); + + const [requestSignature, isSendingRequest] = useMutationWithToasts( + requestSignatureMutation, + { + successMessage: __("Signature request sent successfully"), + errorMessage: __("Failed to send signature request"), + }, + ); + + return ( +
+ +
+
+ {person.fullName} +
+
+ {person.primaryEmailAddress} +
+
+ {version.status === "PUBLISHED" && canRequestSignature && ( + + )} +
+ ); +} diff --git a/apps/console/src/pages/organizations/documents/tabs/DocumentDescriptionTab.tsx b/apps/console/src/pages/organizations/documents/tabs/DocumentDescriptionTab.tsx index a1b8ab91e..3244947a9 100644 --- a/apps/console/src/pages/organizations/documents/tabs/DocumentDescriptionTab.tsx +++ b/apps/console/src/pages/organizations/documents/tabs/DocumentDescriptionTab.tsx @@ -6,7 +6,9 @@ import type { NodeOf } from "#/types"; export default function DocumentDescriptionTab() { const { version } = useOutletContext<{ - version: NodeOf["versions"]>; + version: NodeOf< + Extract["lastVersion"] + > | Extract; }>(); return (
diff --git a/apps/console/src/pages/organizations/documents/tabs/DocumentSignaturesTab.tsx b/apps/console/src/pages/organizations/documents/tabs/DocumentSignaturesTab.tsx deleted file mode 100644 index 4ac2d037a..000000000 --- a/apps/console/src/pages/organizations/documents/tabs/DocumentSignaturesTab.tsx +++ /dev/null @@ -1,365 +0,0 @@ -import { sprintf } from "@probo/helpers"; -import { useTranslate } from "@probo/i18n"; -import { - Avatar, - Badge, - Button, - Checkbox, - IconCircleCheck, - IconClock, - Spinner, -} from "@probo/ui"; -import { Suspense, useEffect, useRef, useState } from "react"; -import { graphql, useFragment, useRefetchableFragment } from "react-relay"; -import { useOutletContext } from "react-router"; - -import type { DocumentLayoutQuery$data } from "#/__generated__/core/DocumentLayoutQuery.graphql"; -import type { DocumentSignaturesTab_signature$key } from "#/__generated__/core/DocumentSignaturesTab_signature.graphql"; -import type { DocumentSignaturesTab_version$key } from "#/__generated__/core/DocumentSignaturesTab_version.graphql"; -import type { DocumentSignaturesTabRefetchQuery } from "#/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql"; -import { usePeople } from "#/hooks/graph/PeopleGraph"; -import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; -import { useOrganizationId } from "#/hooks/useOrganizationId"; -import type { ItemOf, NodeOf } from "#/types"; - -type Version = NodeOf["versions"]>; - -const versionFragment = graphql` - fragment DocumentSignaturesTab_version on DocumentVersion - @refetchable(queryName: "DocumentSignaturesTabRefetchQuery") - @argumentDefinitions( - count: { type: "Int", defaultValue: 1000 } - cursor: { type: "CursorKey" } - signatureFilter: { type: "DocumentVersionSignatureFilter" } - ) { - id - status - canRequestSignature: permission( - action: "core:document-version:request-signature" - ) - signatures(first: $count, after: $cursor, filter: $signatureFilter) - @connection( - key: "DocumentSignaturesTab_signatures" - filters: ["filter"] - ) { - __id - edges { - node { - id - state - signedBy { - id - fullName - primaryEmailAddress - } - ...DocumentSignaturesTab_signature - } - } - } - } -`; - -type SignatureState = "REQUESTED" | "SIGNED"; - -export default function DocumentSignaturesTab() { - const { version: versionFromContext } = useOutletContext<{ - version: Version; - }>(); - const [selectedStates, setSelectedStates] = useState([]); - const { __ } = useTranslate(); - - if (!versionFromContext) { - return null; - } - - const toggleState = (state: SignatureState) => { - setSelectedStates(prev => - prev.includes(state) ? prev.filter(s => s !== state) : [...prev, state], - ); - }; - - return ( -
-
- - {__("Filter by state:")} - -
- toggleState("REQUESTED")} - /> - toggleState("REQUESTED")} - > - {__("Requested")} - -
-
- toggleState("SIGNED")} - /> - toggleState("SIGNED")} - > - {__("Signed")} - -
-
- }> - - -
- ); -} - -function SignatureList(props: { - version: Version; - selectedStates: SignatureState[]; -}) { - const { version: propVersion, selectedStates } = props; - const [version, refetch] = useRefetchableFragment< - DocumentSignaturesTabRefetchQuery, - DocumentSignaturesTab_version$key - >(versionFragment, propVersion); - const signatures = version.signatures?.edges?.map(edge => edge.node) ?? []; - const { __ } = useTranslate(); - const signatureMap = new Map(signatures.map(s => [s.signedBy.id, s])); - const organizationId = useOrganizationId(); - const people = usePeople(organizationId, { excludeContractEnded: true }); - const signable = version.status === "PUBLISHED"; - const isFirstRender = useRef(true); - - // Refetch when filter changes (skip initial render) - useEffect(() => { - if (isFirstRender.current) { - isFirstRender.current = false; - return; - } - - const filter - = selectedStates.length > 0 ? { states: selectedStates } : null; - - refetch({ signatureFilter: filter }); - }, [selectedStates, refetch]); - - if (!version.signatures) { - return ( -
- {__("Loading signatures...")} -
- ); - } - - if (people.length === 0) { - return ( -
- {__("No people available to request signatures from")} -
- ); - } - - // When a filter is active, only show people who have signatures in the filtered results - const filteredPeople - = selectedStates.length > 0 - ? people.filter(p => signatureMap.has(p.id)) - : people; - - if (filteredPeople.length === 0 && selectedStates.length > 0) { - return ( -
- {__("No signatures match the selected filters")} -
- ); - } - - return ( -
- {filteredPeople.map(p => ( - - ))} -
- ); -} - -const signatureFragment = graphql` - fragment DocumentSignaturesTab_signature on DocumentVersionSignature { - id - state - signedAt - requestedAt - signedBy { - fullName - primaryEmailAddress - } - canCancel: permission(action: "core:document-version:request-signature") - } -`; - -/** - * Mutations - */ -const requestSignatureMutation = graphql` - mutation DocumentSignaturesTab_requestSignatureMutation( - $input: RequestSignatureInput! - $connections: [ID!]! - ) { - requestSignature(input: $input) { - documentVersionSignatureEdge @prependEdge(connections: $connections) { - node { - id - state - signedBy { - id - } - ...DocumentSignaturesTab_signature - } - } - } - } -`; -const cancelSignatureMutation = graphql` - mutation DocumentSignaturesTab_cancelSignatureMutation( - $input: CancelSignatureRequestInput! - $connections: [ID!]! - ) { - cancelSignatureRequest(input: $input) { - deletedDocumentVersionSignatureId @deleteEdge(connections: $connections) - } - } -`; - -function SignatureItem(props: { - versionId: string; - signature?: DocumentSignaturesTab_signature$key; - people: ItemOf>; - connectionId: string; - signable: boolean; - canRequestSignature: boolean; -}) { - const signature = useFragment(signatureFragment, props.signature); - const { __, dateTimeFormat } = useTranslate(); - const [requestSignature, isSendingRequest] = useMutationWithToasts( - requestSignatureMutation, - { - successMessage: __("Signature request sent successfully"), - errorMessage: __("Failed to send signature request"), - }, - ); - const [cancelSignature, isCancellingSignature] = useMutationWithToasts( - cancelSignatureMutation, - { - successMessage: __("Request cancelled successfully"), - errorMessage: __("Failed to cancel signature request"), - }, - ); - - // No signature request for this user - if (!signature) { - return ( -
- -
-
- {props.people.fullName} -
-
- {props.people.primaryEmailAddress} -
-
- {props.signable && props.canRequestSignature && ( - - )} -
- ); - } - - const isSigned = signature.state === "SIGNED"; - const label = isSigned ? __("Signed on %s") : __("Requested on %s"); - - return ( -
- -
-
- {signature.signedBy.fullName} -
-
- {isSigned - ? ( - - ) - : ( - - )} - - {sprintf( - label, - dateTimeFormat( - isSigned ? signature.signedAt : signature.requestedAt, - ), - )} - -
-
- {isSigned - ? ( - - {__("Signed")} - - ) - : ( - signature.canCancel && ( - - ) - )} -
- ); -} diff --git a/apps/console/src/routes/documentsRoutes.ts b/apps/console/src/routes/documentsRoutes.ts index d6a924974..56e414c5c 100644 --- a/apps/console/src/routes/documentsRoutes.ts +++ b/apps/console/src/routes/documentsRoutes.ts @@ -45,7 +45,7 @@ const documentTabs = (prefix: string) => { Fallback: LinkCardSkeleton, Component: lazy( () => - import("../pages/organizations/documents/tabs/DocumentSignaturesTab"), + import("#/pages/organizations/documents/signatures/DocumentSignaturesPageLoader"), ), }, ]; diff --git a/pkg/coredata/document_version_signature.go b/pkg/coredata/document_version_signature.go index 3762935f6..3f1e00ab0 100644 --- a/pkg/coredata/document_version_signature.go +++ b/pkg/coredata/document_version_signature.go @@ -51,6 +51,7 @@ type ( DocumentVersionSignaturesWithPeople []*DocumentVersionSignatureWithPeople ) + func (pvs DocumentVersionSignature) CursorKey(orderBy DocumentVersionSignatureOrderField) page.CursorKey { switch orderBy { case DocumentVersionSignatureOrderFieldCreatedAt: @@ -447,3 +448,36 @@ SELECT EXISTS ( return signed, nil } + +func (dvs *DocumentVersionSignatures) CountByDocumentVersionID( + ctx context.Context, + conn pg.Conn, + scope Scoper, + documentVersionID gid.GID, + filter *DocumentVersionSignatureFilter, +) (int, error) { + q := ` +SELECT + COUNT(id) +FROM + document_version_signatures +WHERE + %s + AND document_version_id = @document_version_id + AND %s +` + + q = fmt.Sprintf(q, scope.SQLFragment(), filter.SQLFragment()) + + args := pgx.NamedArgs{"document_version_id": documentVersionID} + maps.Copy(args, scope.SQLArguments()) + maps.Copy(args, filter.SQLArguments()) + + row := conn.QueryRow(ctx, q, args) + var count int + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("cannot scan count: %w", err) + } + + return count, nil +} diff --git a/pkg/coredata/document_version_signature_filter.go b/pkg/coredata/document_version_signature_filter.go index ed69b6ff8..e8f8dffbd 100644 --- a/pkg/coredata/document_version_signature_filter.go +++ b/pkg/coredata/document_version_signature_filter.go @@ -20,29 +20,55 @@ import ( type ( DocumentVersionSignatureFilter struct { - states DocumentVersionSignatureStates + states DocumentVersionSignatureStates + activeContract *bool } ) -func NewDocumentVersionSignatureFilter(states []DocumentVersionSignatureState) *DocumentVersionSignatureFilter { +func NewDocumentVersionSignatureFilter(states []DocumentVersionSignatureState, activeContract *bool) *DocumentVersionSignatureFilter { return &DocumentVersionSignatureFilter{ - states: DocumentVersionSignatureStates(states), + states: DocumentVersionSignatureStates(states), + activeContract: activeContract, } } func (f *DocumentVersionSignatureFilter) SQLArguments() pgx.StrictNamedArgs { return pgx.StrictNamedArgs{ - "states": f.states, + "states": f.states, + "active_contract": f.activeContract, } } func (f *DocumentVersionSignatureFilter) SQLFragment() string { return ` ( - CASE - WHEN @states::policy_version_signature_state[] IS NOT NULL THEN - state = ANY(@states::policy_version_signature_state[]) - ELSE TRUE - END + CASE + WHEN @states::policy_version_signature_state[] IS NOT NULL THEN + state = ANY(@states::policy_version_signature_state[]) + ELSE TRUE + END + AND + CASE + WHEN @active_contract::boolean IS NULL + THEN TRUE + ELSE EXISTS ( + SELECT 1 + FROM peoples p + WHERE p.id = signed_by + AND ( + ( + @active_contract::boolean = TRUE + AND ( + p.contract_end_date IS NULL OR p.contract_end_date > NOW() + ) + ) OR ( + @active_contract::boolean = FALSE + AND ( + p.contract_end_date IS NOT NULL AND p.contract_end_date <= NOW() + ) + ) + ) + ) + END )` } diff --git a/pkg/probo/document_service.go b/pkg/probo/document_service.go index a5717b71d..6de34d97d 100644 --- a/pkg/probo/document_service.go +++ b/pkg/probo/document_service.go @@ -1119,16 +1119,37 @@ func (s *DocumentService) CountVersionsForDocumentID( func(conn pg.Conn) (err error) { documentVersions := &coredata.DocumentVersions{} count, err = documentVersions.CountByDocumentID(ctx, conn, s.svc.scope, documentID, filter) - if err != nil { - return fmt.Errorf("cannot count document versions: %w", err) - } - return nil + return err }, ) if err != nil { - return 0, fmt.Errorf("cannot count document versions: %w", err) + return 0, err + } + + return count, nil +} + +func (s *DocumentService) CountSignaturesForVersionID( + ctx context.Context, + documentVersionID gid.GID, + filter *coredata.DocumentVersionSignatureFilter, +) (int, error) { + var count int + + err := s.svc.pg.WithConn( + ctx, + func(conn pg.Conn) (err error) { + documentVersionSignatures := &coredata.DocumentVersionSignatures{} + count, err = documentVersionSignatures.CountByDocumentVersionID(ctx, conn, s.svc.scope, documentVersionID, filter) + + return err + }, + ) + + if err != nil { + return 0, err } return count, nil diff --git a/pkg/server/api/console/v1/schema.graphql b/pkg/server/api/console/v1/schema.graphql index 1ccaa3f72..bc0fff325 100644 --- a/pkg/server/api/console/v1/schema.graphql +++ b/pkg/server/api/console/v1/schema.graphql @@ -4728,9 +4728,13 @@ type DocumentVersion implements Node { permission(action: String!): Boolean! @goField(forceResolver: true) } -type DocumentVersionSignatureConnection { +type DocumentVersionSignatureConnection + @goModel( + model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersionSignatureConnection" + ) { edges: [DocumentVersionSignatureEdge!]! pageInfo: PageInfo! + totalCount: Int! @goField(forceResolver: true) } type DocumentVersionSignatureEdge { @@ -4745,6 +4749,7 @@ input DocumentVersionSignatureOrder { input DocumentVersionSignatureFilter { states: [DocumentVersionSignatureState!] + activeContract: Boolean } enum DocumentVersionSignatureState diff --git a/pkg/server/api/console/v1/schema/schema.go b/pkg/server/api/console/v1/schema/schema.go index a0fd27143..02e046dcd 100644 --- a/pkg/server/api/console/v1/schema/schema.go +++ b/pkg/server/api/console/v1/schema/schema.go @@ -67,6 +67,7 @@ type ResolverRoot interface { DocumentVersion() DocumentVersionResolver DocumentVersionConnection() DocumentVersionConnectionResolver DocumentVersionSignature() DocumentVersionSignatureResolver + DocumentVersionSignatureConnection() DocumentVersionSignatureConnectionResolver Evidence() EvidenceResolver EvidenceConnection() EvidenceConnectionResolver File() FileResolver @@ -767,8 +768,9 @@ type ComplexityRoot struct { } DocumentVersionSignatureConnection struct { - Edges func(childComplexity int) int - PageInfo func(childComplexity int) int + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + TotalCount func(childComplexity int) int } DocumentVersionSignatureEdge struct { @@ -2032,6 +2034,9 @@ type DocumentVersionSignatureResolver interface { Permission(ctx context.Context, obj *types.DocumentVersionSignature, action string) (bool, error) } +type DocumentVersionSignatureConnectionResolver interface { + TotalCount(ctx context.Context, obj *types.DocumentVersionSignatureConnection) (int, error) +} type EvidenceResolver interface { File(ctx context.Context, obj *types.Evidence) (*types.File, error) @@ -4468,6 +4473,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin } return e.complexity.DocumentVersionSignatureConnection.PageInfo(childComplexity), true + case "DocumentVersionSignatureConnection.totalCount": + if e.complexity.DocumentVersionSignatureConnection.TotalCount == nil { + break + } + + return e.complexity.DocumentVersionSignatureConnection.TotalCount(childComplexity), true case "DocumentVersionSignatureEdge.cursor": if e.complexity.DocumentVersionSignatureEdge.Cursor == nil { @@ -15028,9 +15039,13 @@ type DocumentVersion implements Node { permission(action: String!): Boolean! @goField(forceResolver: true) } -type DocumentVersionSignatureConnection { +type DocumentVersionSignatureConnection + @goModel( + model: "go.probo.inc/probo/pkg/server/api/console/v1/types.DocumentVersionSignatureConnection" + ) { edges: [DocumentVersionSignatureEdge!]! pageInfo: PageInfo! + totalCount: Int! @goField(forceResolver: true) } type DocumentVersionSignatureEdge { @@ -15045,6 +15060,7 @@ input DocumentVersionSignatureOrder { input DocumentVersionSignatureFilter { states: [DocumentVersionSignatureState!] + activeContract: Boolean } enum DocumentVersionSignatureState @@ -29457,6 +29473,8 @@ func (ec *executionContext) fieldContext_DocumentVersion_signatures(ctx context. return ec.fieldContext_DocumentVersionSignatureConnection_edges(ctx, field) case "pageInfo": return ec.fieldContext_DocumentVersionSignatureConnection_pageInfo(ctx, field) + case "totalCount": + return ec.fieldContext_DocumentVersionSignatureConnection_totalCount(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type DocumentVersionSignatureConnection", field.Name) }, @@ -30199,7 +30217,7 @@ func (ec *executionContext) _DocumentVersionSignatureConnection_pageInfo(ctx con return obj.PageInfo, nil }, nil, - ec.marshalNPageInfo2ᚖgoᚗproboᚗincᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐPageInfo, + ec.marshalNPageInfo2goᚗproboᚗincᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐPageInfo, true, true, ) @@ -30228,6 +30246,35 @@ func (ec *executionContext) fieldContext_DocumentVersionSignatureConnection_page return fc, nil } +func (ec *executionContext) _DocumentVersionSignatureConnection_totalCount(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionSignatureConnection) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_DocumentVersionSignatureConnection_totalCount, + func(ctx context.Context) (any, error) { + return ec.resolvers.DocumentVersionSignatureConnection().TotalCount(ctx, obj) + }, + nil, + ec.marshalNInt2int, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_DocumentVersionSignatureConnection_totalCount(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "DocumentVersionSignatureConnection", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _DocumentVersionSignatureEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionSignatureEdge) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -64805,7 +64852,7 @@ func (ec *executionContext) unmarshalInputDocumentVersionSignatureFilter(ctx con asMap[k] = v } - fieldsInOrder := [...]string{"states"} + fieldsInOrder := [...]string{"states", "activeContract"} for _, k := range fieldsInOrder { v, ok := asMap[k] if !ok { @@ -64819,6 +64866,13 @@ func (ec *executionContext) unmarshalInputDocumentVersionSignatureFilter(ctx con return it, err } it.States = data + case "activeContract": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("activeContract")) + data, err := ec.unmarshalOBoolean2ᚖbool(ctx, v) + if err != nil { + return it, err + } + it.ActiveContract = data } } @@ -76206,13 +76260,49 @@ func (ec *executionContext) _DocumentVersionSignatureConnection(ctx context.Cont case "edges": out.Values[i] = ec._DocumentVersionSignatureConnection_edges(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } case "pageInfo": out.Values[i] = ec._DocumentVersionSignatureConnection_pageInfo(ctx, field, obj) if out.Values[i] == graphql.Null { - out.Invalids++ + atomic.AddUint32(&out.Invalids, 1) } + case "totalCount": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._DocumentVersionSignatureConnection_totalCount(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) } diff --git a/pkg/server/api/console/v1/types/document_version_signature.go b/pkg/server/api/console/v1/types/document_version_signature.go index 81fcd6c60..2893bb553 100644 --- a/pkg/server/api/console/v1/types/document_version_signature.go +++ b/pkg/server/api/console/v1/types/document_version_signature.go @@ -16,14 +16,30 @@ package types import ( "go.probo.inc/probo/pkg/coredata" + "go.probo.inc/probo/pkg/gid" "go.probo.inc/probo/pkg/page" ) type ( DocumentVersionSignatureOrderBy OrderBy[coredata.DocumentVersionSignatureOrderField] + + DocumentVersionSignatureConnection struct { + TotalCount int + Edges []*DocumentVersionSignatureEdge + PageInfo PageInfo + + Resolver any + ParentID gid.GID + Filters *coredata.DocumentVersionSignatureFilter + } ) -func NewDocumentVersionSignatureConnection(page *page.Page[*coredata.DocumentVersionSignature, coredata.DocumentVersionSignatureOrderField]) *DocumentVersionSignatureConnection { +func NewDocumentVersionSignatureConnection( + page *page.Page[*coredata.DocumentVersionSignature, coredata.DocumentVersionSignatureOrderField], + parentType any, + parentID gid.GID, + filter *coredata.DocumentVersionSignatureFilter, +) *DocumentVersionSignatureConnection { edges := make([]*DocumentVersionSignatureEdge, len(page.Data)) for i, documentVersionSignature := range page.Data { edges[i] = NewDocumentVersionSignatureEdge(documentVersionSignature, page.Cursor.OrderBy.Field) @@ -31,7 +47,11 @@ func NewDocumentVersionSignatureConnection(page *page.Page[*coredata.DocumentVer return &DocumentVersionSignatureConnection{ Edges: edges, - PageInfo: NewPageInfo(page), + PageInfo: *NewPageInfo(page), + + Resolver: parentType, + ParentID: parentID, + Filters: filter, } } diff --git a/pkg/server/api/console/v1/types/types.go b/pkg/server/api/console/v1/types/types.go index 8f9a400b4..e431cfa04 100644 --- a/pkg/server/api/console/v1/types/types.go +++ b/pkg/server/api/console/v1/types/types.go @@ -1201,18 +1201,14 @@ type DocumentVersionSignature struct { func (DocumentVersionSignature) IsNode() {} func (this DocumentVersionSignature) GetID() gid.GID { return this.ID } -type DocumentVersionSignatureConnection struct { - Edges []*DocumentVersionSignatureEdge `json:"edges"` - PageInfo *PageInfo `json:"pageInfo"` -} - type DocumentVersionSignatureEdge struct { Cursor page.CursorKey `json:"cursor"` Node *DocumentVersionSignature `json:"node"` } type DocumentVersionSignatureFilter struct { - States []coredata.DocumentVersionSignatureState `json:"states,omitempty"` + States []coredata.DocumentVersionSignatureState `json:"states,omitempty"` + ActiveContract *bool `json:"activeContract,omitempty"` } type DocumentVersionSignatureOrder struct { diff --git a/pkg/server/api/console/v1/v1_resolver.go b/pkg/server/api/console/v1/v1_resolver.go index 21d3a1d0e..e6cc1ccbd 100644 --- a/pkg/server/api/console/v1/v1_resolver.go +++ b/pkg/server/api/console/v1/v1_resolver.go @@ -1080,10 +1080,16 @@ func (r *documentVersionResolver) Signatures(ctx context.Context, obj *types.Doc } var signatureStates []coredata.DocumentVersionSignatureState - if filter != nil && filter.States != nil { - signatureStates = filter.States + var activeContract *bool + if filter != nil { + if filter.States != nil { + signatureStates = filter.States + } + if filter.ActiveContract != nil { + activeContract = filter.ActiveContract + } } - signatureFilter := coredata.NewDocumentVersionSignatureFilter(signatureStates) + signatureFilter := coredata.NewDocumentVersionSignatureFilter(signatureStates, activeContract) cursor := types.NewCursor(first, after, last, before, pageOrderBy) @@ -1093,7 +1099,7 @@ func (r *documentVersionResolver) Signatures(ctx context.Context, obj *types.Doc panic(fmt.Errorf("cannot list document version signatures: %w", err)) } - return types.NewDocumentVersionSignatureConnection(page), nil + return types.NewDocumentVersionSignatureConnection(page, r, obj.ID, signatureFilter), nil } // Signed is the resolver for the signed field. @@ -1122,7 +1128,7 @@ func (r *documentVersionResolver) Permission(ctx context.Context, obj *types.Doc // TotalCount is the resolver for the totalCount field. func (r *documentVersionConnectionResolver) TotalCount(ctx context.Context, obj *types.DocumentVersionConnection) (int, error) { - if err := r.authorize(ctx, obj.ParentID, probo.ActionEvidenceList); err != nil { + if err := r.authorize(ctx, obj.ParentID, probo.ActionDocumentVersionList); err != nil { return 0, err } @@ -1137,7 +1143,7 @@ func (r *documentVersionConnectionResolver) TotalCount(ctx context.Context, obj count, err := prb.Documents.CountVersionsForDocumentID(ctx, obj.ParentID, filter) if err != nil { // TODO no panic use gqlutils.InternalError - panic(fmt.Errorf("cannot count tasks: %w", err)) + panic(fmt.Errorf("cannot count document versions: %w", err)) } return count, nil } @@ -1189,6 +1195,32 @@ func (r *documentVersionSignatureResolver) Permission(ctx context.Context, obj * return r.Resolver.Permission(ctx, obj, action) } +// TotalCount is the resolver for the totalCount field. +func (r *documentVersionSignatureConnectionResolver) TotalCount(ctx context.Context, obj *types.DocumentVersionSignatureConnection) (int, error) { + if err := r.authorize(ctx, obj.ParentID, probo.ActionDocumentVersionSignatureList); err != nil { + return 0, err + } + + prb := r.ProboService(ctx, obj.ParentID.TenantID()) + + switch obj.Resolver.(type) { + case *documentVersionResolver: + filter := &coredata.DocumentVersionSignatureFilter{} + if obj.Filters != nil { + filter = obj.Filters + } + count, err := prb.Documents.CountSignaturesForVersionID(ctx, obj.ParentID, filter) + if err != nil { + // TODO no panic use gqlutils.InternalError + panic(fmt.Errorf("cannot count signatures: %w", err)) + } + return count, nil + } + + // TODO no panic use gqlutils.InternalError + panic(fmt.Errorf("unsupported resolver: %T", obj.Resolver)) +} + // File is the resolver for the file field. func (r *evidenceResolver) File(ctx context.Context, obj *types.Evidence) (*types.File, error) { if err := r.authorize(ctx, obj.ID, probo.ActionFileGet); err != nil { @@ -1277,14 +1309,14 @@ func (r *evidenceConnectionResolver) TotalCount(ctx context.Context, obj *types. count, err := prb.Evidences.CountForMeasureID(ctx, obj.ParentID) if err != nil { // TODO no panic use gqlutils.InternalError - panic(fmt.Errorf("cannot count tasks: %w", err)) + panic(fmt.Errorf("cannot count measure evidence: %w", err)) } return count, nil case *taskResolver: count, err := prb.Evidences.CountForTaskID(ctx, obj.ParentID) if err != nil { // TODO no panic use gqlutils.InternalError - panic(fmt.Errorf("cannot count tasks: %w", err)) + panic(fmt.Errorf("cannot count task evidence: %w", err)) } return count, nil } @@ -8558,6 +8590,11 @@ func (r *Resolver) DocumentVersionSignature() schema.DocumentVersionSignatureRes return &documentVersionSignatureResolver{r} } +// DocumentVersionSignatureConnection returns schema.DocumentVersionSignatureConnectionResolver implementation. +func (r *Resolver) DocumentVersionSignatureConnection() schema.DocumentVersionSignatureConnectionResolver { + return &documentVersionSignatureConnectionResolver{r} +} + // Evidence returns schema.EvidenceResolver implementation. func (r *Resolver) Evidence() schema.EvidenceResolver { return &evidenceResolver{r} } @@ -8787,6 +8824,7 @@ type documentConnectionResolver struct{ *Resolver } type documentVersionResolver struct{ *Resolver } type documentVersionConnectionResolver struct{ *Resolver } type documentVersionSignatureResolver struct{ *Resolver } +type documentVersionSignatureConnectionResolver struct{ *Resolver } type evidenceResolver struct{ *Resolver } type evidenceConnectionResolver struct{ *Resolver } type fileResolver struct{ *Resolver } diff --git a/pkg/server/api/mcp/v1/schema.resolvers.go b/pkg/server/api/mcp/v1/schema.resolvers.go index ab81990a6..1880b5bc9 100644 --- a/pkg/server/api/mcp/v1/schema.resolvers.go +++ b/pkg/server/api/mcp/v1/schema.resolvers.go @@ -1717,12 +1717,17 @@ func (r *Resolver) ListDocumentVersionSignaturesTool(ctx context.Context, req *m cursor := types.NewCursor(input.Size, input.Cursor, pageOrderBy) - var signatureFilter *coredata.DocumentVersionSignatureFilter - if input.Filter != nil && input.Filter.States != nil && len(input.Filter.States) > 0 { - signatureFilter = coredata.NewDocumentVersionSignatureFilter(input.Filter.States) - } else { - signatureFilter = coredata.NewDocumentVersionSignatureFilter(nil) + var signatureStates []coredata.DocumentVersionSignatureState + var activeContract *bool + if input.Filter != nil { + if input.Filter.States != nil { + signatureStates = input.Filter.States + } + if input.Filter.ActiveContract != nil { + activeContract = input.Filter.ActiveContract + } } + signatureFilter := coredata.NewDocumentVersionSignatureFilter(signatureStates, activeContract) page, err := prb.Documents.ListSignatures(ctx, input.DocumentVersionID, cursor, signatureFilter) if err != nil { diff --git a/pkg/server/api/mcp/v1/specification.yaml b/pkg/server/api/mcp/v1/specification.yaml index 0bae6f6c8..1523040a8 100644 --- a/pkg/server/api/mcp/v1/specification.yaml +++ b/pkg/server/api/mcp/v1/specification.yaml @@ -3860,6 +3860,9 @@ components: items: $ref: "#/components/schemas/DocumentVersionSignatureState" description: Signature states + active_contract: + type: boolean + description: Signatory contract status ListDocumentVersionSignaturesOutput: type: object diff --git a/pkg/server/api/mcp/v1/types/types.go b/pkg/server/api/mcp/v1/types/types.go index a62fe5dac..eaed4180e 100644 --- a/pkg/server/api/mcp/v1/types/types.go +++ b/pkg/server/api/mcp/v1/types/types.go @@ -101,7 +101,7 @@ var ( ListControlsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["controls"],"properties":{"controls":{"type":"array","items":{"type":"object","required":["id","organization_id","framework_id","section_title","name","status","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"description":{"description":"Control description"},"exclusion_justification":{"description":"Exclusion justification"},"framework_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Control name"},"organization_id":{"type":"string","format":"string"},"section_title":{"type":"string","description":"Section title"},"status":{"type":"string","enum":["INCLUDED","EXCLUDED"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) ListDataToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["organization_id"],"properties":{"cursor":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"snapshot_id":{"type":"string","format":"string"}}},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","NAME","DATA_CLASSIFICATION"]}}},"organization_id":{"type":"string","format":"string"},"size":{"type":"integer","description":"Page size"}}}`) ListDataToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id","organization_id","name","data_classification","owner_id","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"data_classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"id":{"type":"string","format":"string"},"name":{"type":"string","description":"Datum name"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"snapshot_id":{"description":"Snapshot ID","anyOf":[{"type":"string","format":"string"},{"type":"null","description":"No snapshot"}]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) - ListDocumentVersionSignaturesToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["document_version_id"],"properties":{"cursor":{"type":"string","format":"string"},"document_version_id":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"states":{"type":"array","description":"Signature states","items":{"type":"string","enum":["REQUESTED","SIGNED"]}}}},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","SIGNED_AT"]}}},"size":{"type":"integer","description":"Page size"}}}`) + ListDocumentVersionSignaturesToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["document_version_id"],"properties":{"cursor":{"type":"string","format":"string"},"document_version_id":{"type":"string","format":"string"},"filter":{"type":"object","properties":{"active_contract":{"type":"boolean","description":"Signatory contract status"},"states":{"type":"array","description":"Signature states","items":{"type":"string","enum":["REQUESTED","SIGNED"]}}}},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","SIGNED_AT"]}}},"size":{"type":"integer","description":"Page size"}}}`) ListDocumentVersionSignaturesToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["document_version_signatures"],"properties":{"document_version_signatures":{"type":"array","items":{"type":"object","required":["id","organization_id","document_version_id","state","signed_by","requested_at","created_at","updated_at"],"properties":{"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"document_version_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"requested_at":{"type":"string","description":"Requested timestamp","format":"date-time"},"signed_at":{"description":"Signed timestamp","format":"date-time"},"signed_by":{"type":"string","format":"string"},"state":{"type":"string","enum":["REQUESTED","SIGNED"]},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"}}}},"next_cursor":{"type":"string","format":"string"}}}`) ListDocumentVersionsToolInputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["document_id"],"properties":{"cursor":{"type":"string","format":"string"},"document_id":{"type":"string","format":"string"},"order_by":{"type":"object","required":["field","direction"],"properties":{"direction":{"type":"string","enum":["ASC","DESC"]},"field":{"type":"string","enum":["CREATED_AT","VERSION"]}}},"size":{"type":"integer","description":"Page size"}}}`) ListDocumentVersionsToolOutputSchema = mcp.MustUnmarshalSchema(`{"type":"object","required":["document_versions"],"properties":{"document_versions":{"type":"array","items":{"type":"object","required":["id","organization_id","document_id","title","owner_id","version_number","classification","content","changelog","status","created_at","updated_at"],"properties":{"changelog":{"type":"string","description":"Changelog"},"classification":{"type":"string","enum":["PUBLIC","INTERNAL","CONFIDENTIAL","SECRET"]},"content":{"type":"string","description":"Document content"},"created_at":{"type":"string","description":"Creation timestamp","format":"date-time"},"document_id":{"type":"string","format":"string"},"id":{"type":"string","format":"string"},"organization_id":{"type":"string","format":"string"},"owner_id":{"type":"string","format":"string"},"published_at":{"description":"Published timestamp","format":"date-time"},"status":{"type":"string","enum":["DRAFT","PUBLISHED"]},"title":{"type":"string","description":"Document version title"},"updated_at":{"type":"string","description":"Update timestamp","format":"date-time"},"version_number":{"type":"integer","description":"Version number"}}}},"next_cursor":{"type":"string","format":"string"}}}`) @@ -2173,6 +2173,8 @@ type ListDataInputFilter struct { // ListDocumentVersionSignaturesInputFilter represents the schema type ListDocumentVersionSignaturesInputFilter struct { + // Signatory contract status + ActiveContract *bool `json:"active_contract,omitempty"` // Signature states States []coredata.DocumentVersionSignatureState `json:"states,omitempty"` }