Fix document pages permissions handling

Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
Émile Ré
2025-12-31 17:17:41 +01:00
committed by Bryan Frimin
parent f3e23850ff
commit 269f963b48
21 changed files with 740 additions and 103 deletions

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<8f842e1d6a4c314a9bfba43097ac2795>> * @generated SignedSource<<8a75dcc06cfe213df84407b8855d73c9>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -188,6 +188,19 @@ return {
"name": "updatedAt", "name": "updatedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{ {
"alias": null, "alias": null,
"args": null, "args": null,
@@ -336,12 +349,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "319502472cd9600df506f084a7648571", "cacheID": "8f0e8730a2b85c51592d45cbf4ad8b1e",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "CreateDocumentDialogMutation", "name": "CreateDocumentDialogMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation CreateDocumentDialogMutation(\n $input: CreateDocumentInput!\n) {\n createDocument(input: $input) {\n documentEdge {\n node {\n id\n ...DocumentsPageRowFragment\n }\n }\n }\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n" "text": "mutation CreateDocumentDialogMutation(\n $input: CreateDocumentInput!\n) {\n createDocument(input: $input) {\n documentEdge {\n node {\n id\n ...DocumentsPageRowFragment\n }\n }\n }\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n canDelete: permission(action: \"core:document:delete\")\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<3ba79250c6ba07fa44aca6eff28b3d9d>> * @generated SignedSource<<66ab14196c29af984b08f90039037dee>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -15,6 +15,9 @@ export type DocumentType = "ISMS" | "OTHER" | "POLICY" | "PROCEDURE";
export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED";
import { FragmentRefs } from "relay-runtime"; import { FragmentRefs } from "relay-runtime";
export type DocumentDetailPageDocumentFragment$data = { export type DocumentDetailPageDocumentFragment$data = {
readonly canDelete: boolean;
readonly canPublish: boolean;
readonly canUpdate: boolean;
readonly classification: DocumentClassification; readonly classification: DocumentClassification;
readonly controlsInfo: { readonly controlsInfo: {
readonly totalCount: number; readonly totalCount: number;
@@ -30,6 +33,7 @@ export type DocumentDetailPageDocumentFragment$data = {
readonly __id: string; readonly __id: string;
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly canDeleteDraft: boolean;
readonly classification: DocumentClassification; readonly classification: DocumentClassification;
readonly content: string; readonly content: string;
readonly id: string; readonly id: string;
@@ -191,6 +195,45 @@ return {
}, },
(v1/*: any*/), (v1/*: any*/),
(v2/*: any*/), (v2/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canPublish",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:publish"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:publish\")"
},
{ {
"args": null, "args": null,
"kind": "FragmentSpread", "kind": "FragmentSpread",
@@ -282,6 +325,19 @@ return {
}, },
(v1/*: any*/), (v1/*: any*/),
(v2/*: any*/), (v2/*: any*/),
{
"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\")"
},
{ {
"args": null, "args": null,
"kind": "FragmentSpread", "kind": "FragmentSpread",
@@ -368,6 +424,6 @@ return {
}; };
})(); })();
(node as any).hash = "e1418d5efeade64db32e9939132c03de"; (node as any).hash = "5ed2f764b1587dd945b0a10c33cee729";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<cbecbaa326b9bff1adb82a94123a2ee2>> * @generated SignedSource<<e3ebdf9d0caacde97761e1e28ac09105>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -133,13 +133,20 @@ v12 = {
] ]
}, },
v13 = [ v13 = [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
v14 = [
{ {
"kind": "Literal", "kind": "Literal",
"name": "first", "name": "first",
"value": 1000 "value": 1000
} }
], ],
v14 = { v15 = {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "PageInfo", "concreteType": "PageInfo",
@@ -229,6 +236,45 @@ return {
}, },
(v3/*: any*/), (v3/*: any*/),
(v5/*: any*/), (v5/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canPublish",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:publish"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:publish\")"
},
{ {
"alias": null, "alias": null,
"args": (v6/*: any*/), "args": (v6/*: any*/),
@@ -413,8 +459,28 @@ return {
(v3/*: any*/), (v3/*: any*/),
(v5/*: any*/), (v5/*: any*/),
{ {
"alias": 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\")"
},
{
"alias": "canRequestSignature",
"args": (v13/*: any*/), "args": (v13/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{
"alias": null,
"args": (v14/*: any*/),
"concreteType": "DocumentVersionSignatureConnection", "concreteType": "DocumentVersionSignatureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "signatures", "name": "signatures",
@@ -478,6 +544,13 @@ return {
"name": "requestedAt", "name": "requestedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canCancel",
"args": (v13/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
(v8/*: any*/) (v8/*: any*/)
], ],
"storageKey": null "storageKey": null
@@ -486,14 +559,14 @@ return {
], ],
"storageKey": null "storageKey": null
}, },
(v14/*: any*/), (v15/*: any*/),
(v12/*: any*/) (v12/*: any*/)
], ],
"storageKey": "signatures(first:1000)" "storageKey": "signatures(first:1000)"
}, },
{ {
"alias": null, "alias": null,
"args": (v13/*: any*/), "args": (v14/*: any*/),
"filters": [ "filters": [
"filter" "filter"
], ],
@@ -504,7 +577,7 @@ return {
}, },
{ {
"alias": null, "alias": null,
"args": (v13/*: any*/), "args": (v14/*: any*/),
"filters": [], "filters": [],
"handle": "connection", "handle": "connection",
"key": "DocumentDetailPage_signatures", "key": "DocumentDetailPage_signatures",
@@ -519,7 +592,7 @@ return {
], ],
"storageKey": null "storageKey": null
}, },
(v14/*: any*/), (v15/*: any*/),
(v12/*: any*/) (v12/*: any*/)
], ],
"storageKey": "versions(first:20)" "storageKey": "versions(first:20)"
@@ -542,12 +615,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "b9140949eb57389fe8c50588c695973b", "cacheID": "91d0c14af00c2a67732d781e41770a81",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentDetailPagePublishMutation", "name": "DocumentDetailPagePublishMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation DocumentDetailPagePublishMutation(\n $input: PublishDocumentVersionInput!\n) {\n publishDocumentVersion(input: $input) {\n document {\n ...DocumentDetailPageDocumentFragment\n id\n }\n }\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 DocumentDetailPageDocumentFragment on Document {\n id\n title\n documentType\n classification\n owner {\n id\n fullName\n }\n ...DocumentControlsTabFragment\n controlsInfo: controls(first: 0) {\n totalCount\n }\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 ...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\nfragment DocumentSignaturesTab_signature on DocumentVersionSignature {\n id\n state\n signedAt\n requestedAt\n signedBy {\n fullName\n primaryEmailAddress\n id\n }\n}\n\nfragment DocumentSignaturesTab_version on DocumentVersion {\n id\n status\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 LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n" "text": "mutation DocumentDetailPagePublishMutation(\n $input: PublishDocumentVersionInput!\n) {\n publishDocumentVersion(input: $input) {\n document {\n ...DocumentDetailPageDocumentFragment\n id\n }\n }\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 DocumentDetailPageDocumentFragment on Document {\n id\n title\n documentType\n classification\n owner {\n id\n fullName\n }\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n canPublish: permission(action: \"core:document-version:publish\")\n ...DocumentControlsTabFragment\n controlsInfo: controls(first: 0) {\n totalCount\n }\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\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 LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<42c3f270cfade27e94b4d0895a0641f5>> * @generated SignedSource<<8982230c048c28cb211d5368b1ab43a0>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -15,6 +15,7 @@ export type DocumentGraphListQuery$variables = {
}; };
export type DocumentGraphListQuery$data = { export type DocumentGraphListQuery$data = {
readonly organization: { readonly organization: {
readonly canCreateDocument?: boolean;
readonly id: string; readonly id: string;
readonly " $fragmentSpreads": FragmentRefs<"DocumentsPageListFragment">; readonly " $fragmentSpreads": FragmentRefs<"DocumentsPageListFragment">;
}; };
@@ -47,13 +48,26 @@ v2 = {
"storageKey": null "storageKey": null
}, },
v3 = { v3 = {
"alias": "canCreateDocument",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:create"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:create\")"
},
v4 = {
"alias": null, "alias": null,
"args": null, "args": null,
"kind": "ScalarField", "kind": "ScalarField",
"name": "__typename", "name": "__typename",
"storageKey": null "storageKey": null
}, },
v4 = [ v5 = [
{ {
"kind": "Literal", "kind": "Literal",
"name": "first", "name": "first",
@@ -85,9 +99,17 @@ return {
"selections": [ "selections": [
(v2/*: any*/), (v2/*: any*/),
{ {
"args": null, "kind": "InlineFragment",
"kind": "FragmentSpread", "selections": [
"name": "DocumentsPageListFragment" (v3/*: any*/),
{
"args": null,
"kind": "FragmentSpread",
"name": "DocumentsPageListFragment"
}
],
"type": "Organization",
"abstractKey": null
} }
], ],
"storageKey": null "storageKey": null
@@ -110,14 +132,15 @@ return {
"name": "node", "name": "node",
"plural": false, "plural": false,
"selections": [ "selections": [
(v3/*: any*/), (v4/*: any*/),
(v2/*: any*/), (v2/*: any*/),
{ {
"kind": "InlineFragment", "kind": "InlineFragment",
"selections": [ "selections": [
(v3/*: any*/),
{ {
"alias": null, "alias": null,
"args": (v4/*: any*/), "args": (v5/*: any*/),
"concreteType": "DocumentConnection", "concreteType": "DocumentConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "documents", "name": "documents",
@@ -140,6 +163,58 @@ return {
"plural": false, "plural": false,
"selections": [ "selections": [
(v2/*: any*/), (v2/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canSendSigningNotifications",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:send-signing-notifications"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:send-signing-notifications\")"
},
{
"alias": "canRequestSignatures",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{ {
"alias": null, "alias": null,
"args": null, "args": null,
@@ -295,7 +370,7 @@ return {
], ],
"storageKey": "versions(first:1)" "storageKey": "versions(first:1)"
}, },
(v3/*: any*/) (v4/*: any*/)
], ],
"storageKey": null "storageKey": null
}, },
@@ -365,7 +440,7 @@ return {
}, },
{ {
"alias": null, "alias": null,
"args": (v4/*: any*/), "args": (v5/*: any*/),
"filters": [ "filters": [
"orderBy" "orderBy"
], ],
@@ -384,16 +459,16 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "74570a2b122efea617c7e2559fb51053", "cacheID": "7c027bc02697b43718813a5bd024985a",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentGraphListQuery", "name": "DocumentGraphListQuery",
"operationKind": "query", "operationKind": "query",
"text": "query DocumentGraphListQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ...DocumentsPageListFragment\n }\n}\n\nfragment DocumentsPageListFragment on Organization {\n documents(first: 50, orderBy: {field: TITLE, direction: ASC}) {\n edges {\n node {\n id\n ...DocumentsPageRowFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n" "text": "query DocumentGraphListQuery(\n $organizationId: ID!\n) {\n organization: node(id: $organizationId) {\n __typename\n id\n ... on Organization {\n canCreateDocument: permission(action: \"core:document:create\")\n ...DocumentsPageListFragment\n }\n }\n}\n\nfragment DocumentsPageListFragment on Organization {\n documents(first: 50, orderBy: {field: TITLE, direction: ASC}) {\n edges {\n node {\n id\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n canSendSigningNotifications: permission(action: \"core:document:send-signing-notifications\")\n canRequestSignatures: permission(action: \"core:document-version:request-signature\")\n ...DocumentsPageRowFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n canDelete: permission(action: \"core:document:delete\")\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "63de39eb2c87fc45b83eeee047ddd36c"; (node as any).hash = "26c7d375cb354649741ce4794612b3e1";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<a39062565d1126fbcbee36865fa8c0fb>> * @generated SignedSource<<c94bc39a3cdb0b46948d5116c3df2764>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -127,13 +127,20 @@ v12 = {
] ]
}, },
v13 = [ v13 = [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
v14 = [
{ {
"kind": "Literal", "kind": "Literal",
"name": "first", "name": "first",
"value": 1000 "value": 1000
} }
], ],
v14 = { v15 = {
"alias": null, "alias": null,
"args": null, "args": null,
"concreteType": "PageInfo", "concreteType": "PageInfo",
@@ -215,6 +222,45 @@ return {
}, },
(v4/*: any*/), (v4/*: any*/),
(v6/*: any*/), (v6/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canPublish",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:publish"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:publish\")"
},
{ {
"alias": null, "alias": null,
"args": (v7/*: any*/), "args": (v7/*: any*/),
@@ -399,8 +445,28 @@ return {
(v4/*: any*/), (v4/*: any*/),
(v6/*: any*/), (v6/*: any*/),
{ {
"alias": 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\")"
},
{
"alias": "canRequestSignature",
"args": (v13/*: any*/), "args": (v13/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{
"alias": null,
"args": (v14/*: any*/),
"concreteType": "DocumentVersionSignatureConnection", "concreteType": "DocumentVersionSignatureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "signatures", "name": "signatures",
@@ -464,6 +530,13 @@ return {
"name": "requestedAt", "name": "requestedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canCancel",
"args": (v13/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
(v2/*: any*/) (v2/*: any*/)
], ],
"storageKey": null "storageKey": null
@@ -472,14 +545,14 @@ return {
], ],
"storageKey": null "storageKey": null
}, },
(v14/*: any*/), (v15/*: any*/),
(v12/*: any*/) (v12/*: any*/)
], ],
"storageKey": "signatures(first:1000)" "storageKey": "signatures(first:1000)"
}, },
{ {
"alias": null, "alias": null,
"args": (v13/*: any*/), "args": (v14/*: any*/),
"filters": [ "filters": [
"filter" "filter"
], ],
@@ -490,7 +563,7 @@ return {
}, },
{ {
"alias": null, "alias": null,
"args": (v13/*: any*/), "args": (v14/*: any*/),
"filters": [], "filters": [],
"handle": "connection", "handle": "connection",
"key": "DocumentDetailPage_signatures", "key": "DocumentDetailPage_signatures",
@@ -505,7 +578,7 @@ return {
], ],
"storageKey": null "storageKey": null
}, },
(v14/*: any*/), (v15/*: any*/),
(v12/*: any*/) (v12/*: any*/)
], ],
"storageKey": "versions(first:20)" "storageKey": "versions(first:20)"
@@ -529,12 +602,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "72db9b5c4f2a4cd076ebf4e45f0eb662", "cacheID": "1fe5b5e75ab7a7aa4b5859ec1c5560c7",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentGraphNodeQuery", "name": "DocumentGraphNodeQuery",
"operationKind": "query", "operationKind": "query",
"text": "query DocumentGraphNodeQuery(\n $documentId: ID!\n) {\n node(id: $documentId) {\n __typename\n ... on Document {\n ...DocumentDetailPageDocumentFragment\n }\n id\n }\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 DocumentDetailPageDocumentFragment on Document {\n id\n title\n documentType\n classification\n owner {\n id\n fullName\n }\n ...DocumentControlsTabFragment\n controlsInfo: controls(first: 0) {\n totalCount\n }\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 ...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\nfragment DocumentSignaturesTab_signature on DocumentVersionSignature {\n id\n state\n signedAt\n requestedAt\n signedBy {\n fullName\n primaryEmailAddress\n id\n }\n}\n\nfragment DocumentSignaturesTab_version on DocumentVersion {\n id\n status\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 LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n" "text": "query DocumentGraphNodeQuery(\n $documentId: ID!\n) {\n node(id: $documentId) {\n __typename\n ... on Document {\n ...DocumentDetailPageDocumentFragment\n }\n id\n }\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 DocumentDetailPageDocumentFragment on Document {\n id\n title\n documentType\n classification\n owner {\n id\n fullName\n }\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n canPublish: permission(action: \"core:document-version:publish\")\n ...DocumentControlsTabFragment\n controlsInfo: controls(first: 0) {\n totalCount\n }\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\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 LinkedControlsCardFragment on Control {\n id\n name\n sectionTitle\n framework {\n id\n name\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<daaba0a12d115e8691984612356d4234>> * @generated SignedSource<<b7fddd28abbffd86c8de3f8ecd3d794b>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -73,6 +73,13 @@ v6 = {
"storageKey": null "storageKey": null
}, },
v7 = [ v7 = [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
v8 = [
{ {
"kind": "Variable", "kind": "Variable",
"name": "after", "name": "after",
@@ -169,8 +176,15 @@ return {
"storageKey": null "storageKey": null
}, },
{ {
"alias": null, "alias": "canRequestSignature",
"args": (v7/*: any*/), "args": (v7/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{
"alias": null,
"args": (v8/*: any*/),
"concreteType": "DocumentVersionSignatureConnection", "concreteType": "DocumentVersionSignatureConnection",
"kind": "LinkedField", "kind": "LinkedField",
"name": "signatures", "name": "signatures",
@@ -240,6 +254,13 @@ return {
"name": "requestedAt", "name": "requestedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canCancel",
"args": (v7/*: any*/),
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
(v5/*: any*/) (v5/*: any*/)
], ],
"storageKey": null "storageKey": null
@@ -296,7 +317,7 @@ return {
}, },
{ {
"alias": null, "alias": null,
"args": (v7/*: any*/), "args": (v8/*: any*/),
"filters": [ "filters": [
"filter" "filter"
], ],
@@ -315,16 +336,16 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "d7b2a5ca29001eca591507471d4178cc", "cacheID": "5f4d3d9043d744d2e35c7c5b3e209a37",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentSignaturesTabRefetchQuery", "name": "DocumentSignaturesTabRefetchQuery",
"operationKind": "query", "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}\n\nfragment DocumentSignaturesTab_version_1vp7QE on DocumentVersion {\n id\n status\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 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"
} }
}; };
})(); })();
(node as any).hash = "497571b827200e09a848436820668d10"; (node as any).hash = "9282fd9e9a1aa10a36535863b896283c";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<de274a51c1b339789540a969b0ebe507>> * @generated SignedSource<<2988f1319b1ad6110c328a00f644f26d>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -210,6 +210,19 @@ return {
"kind": "ScalarField", "kind": "ScalarField",
"name": "requestedAt", "name": "requestedAt",
"storageKey": null "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
@@ -239,12 +252,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "e582b90bdad831d64741b45de17f45b5", "cacheID": "5a9c28a2a8a3234f953f7a609da7d02e",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentSignaturesTab_requestSignatureMutation", "name": "DocumentSignaturesTab_requestSignatureMutation",
"operationKind": "mutation", "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}\n" "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"
} }
}; };
})(); })();

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<7d45f232043aa77c8e1e4ae7f8f330db>> * @generated SignedSource<<02f9338b7a451ae446c87d09ea71a71d>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -12,6 +12,7 @@ import { ReaderFragment } from 'relay-runtime';
export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED";
import { FragmentRefs } from "relay-runtime"; import { FragmentRefs } from "relay-runtime";
export type DocumentSignaturesTab_signature$data = { export type DocumentSignaturesTab_signature$data = {
readonly canCancel: boolean;
readonly id: string; readonly id: string;
readonly requestedAt: any; readonly requestedAt: any;
readonly signedAt: any | null | undefined; readonly signedAt: any | null | undefined;
@@ -85,12 +86,25 @@ const node: ReaderFragment = {
} }
], ],
"storageKey": null "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\")"
} }
], ],
"type": "DocumentVersionSignature", "type": "DocumentVersionSignature",
"abstractKey": null "abstractKey": null
}; };
(node as any).hash = "b07437b34548744fef4ed78d4f1f0a62"; (node as any).hash = "bbfdd78015e97032862da41aad6beeae";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<807a8f8c5c320dadd6b9672ef48583f2>> * @generated SignedSource<<ccb4ac21f5e94f16c4fa5ccff5898f99>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -13,6 +13,7 @@ export type DocumentStatus = "DRAFT" | "PUBLISHED";
export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED";
import { FragmentRefs } from "relay-runtime"; import { FragmentRefs } from "relay-runtime";
export type DocumentSignaturesTab_version$data = { export type DocumentSignaturesTab_version$data = {
readonly canRequestSignature: boolean;
readonly id: string; readonly id: string;
readonly signatures: { readonly signatures: {
readonly __id: string; readonly __id: string;
@@ -107,6 +108,19 @@ return {
"name": "status", "name": "status",
"storageKey": null "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\")"
},
{ {
"alias": "signatures", "alias": "signatures",
"args": [ "args": [
@@ -242,6 +256,6 @@ return {
}; };
})(); })();
(node as any).hash = "497571b827200e09a848436820668d10"; (node as any).hash = "9282fd9e9a1aa10a36535863b896283c";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<83dad18be7a9249bb99048ba14b6de41>> * @generated SignedSource<<2d64b7b84c435d26d97748081e1bb38e>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -215,6 +215,58 @@ return {
"plural": false, "plural": false,
"selections": [ "selections": [
(v12/*: any*/), (v12/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canSendSigningNotifications",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:send-signing-notifications"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:send-signing-notifications\")"
},
{
"alias": "canRequestSignatures",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{ {
"alias": null, "alias": null,
"args": null, "args": null,
@@ -459,16 +511,16 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "2f5cd9919b919f4e9d80354cb26d3e9d", "cacheID": "c7b8d86af8a704ba0a6451bd3877746f",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "DocumentsListQuery", "name": "DocumentsListQuery",
"operationKind": "query", "operationKind": "query",
"text": "query DocumentsListQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: DocumentOrder = {field: TITLE, direction: ASC}\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...DocumentsPageListFragment_16fISc\n id\n }\n}\n\nfragment DocumentsPageListFragment_16fISc on Organization {\n documents(first: $first, after: $after, last: $last, before: $before, orderBy: $order) {\n edges {\n node {\n id\n ...DocumentsPageRowFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n" "text": "query DocumentsListQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: DocumentOrder = {field: TITLE, direction: ASC}\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...DocumentsPageListFragment_16fISc\n id\n }\n}\n\nfragment DocumentsPageListFragment_16fISc on Organization {\n documents(first: $first, after: $after, last: $last, before: $before, orderBy: $order) {\n edges {\n node {\n id\n canUpdate: permission(action: \"core:document:update\")\n canDelete: permission(action: \"core:document:delete\")\n canSendSigningNotifications: permission(action: \"core:document:send-signing-notifications\")\n canRequestSignatures: permission(action: \"core:document-version:request-signature\")\n ...DocumentsPageRowFragment\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n id\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n canDelete: permission(action: \"core:document:delete\")\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();
(node as any).hash = "8cda24b1d10caa3f4b83dbb82035365b"; (node as any).hash = "0f00d125fc711db9e65d54dcc884a72e";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<0abee66a5b3a949907293acd4981f05e>> * @generated SignedSource<<4531c90194c8da0c1cbd00e5e169ff00>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -15,6 +15,10 @@ export type DocumentsPageListFragment$data = {
readonly __id: string; readonly __id: string;
readonly edges: ReadonlyArray<{ readonly edges: ReadonlyArray<{
readonly node: { readonly node: {
readonly canDelete: boolean;
readonly canRequestSignatures: boolean;
readonly canSendSigningNotifications: boolean;
readonly canUpdate: boolean;
readonly id: string; readonly id: string;
readonly " $fragmentSpreads": FragmentRefs<"DocumentsPageRowFragment">; readonly " $fragmentSpreads": FragmentRefs<"DocumentsPageRowFragment">;
}; };
@@ -137,6 +141,58 @@ return {
"plural": false, "plural": false,
"selections": [ "selections": [
(v1/*: any*/), (v1/*: any*/),
{
"alias": "canUpdate",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:update"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:update\")"
},
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{
"alias": "canSendSigningNotifications",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:send-signing-notifications"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:send-signing-notifications\")"
},
{
"alias": "canRequestSignatures",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document-version:request-signature"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document-version:request-signature\")"
},
{ {
"args": null, "args": null,
"kind": "FragmentSpread", "kind": "FragmentSpread",
@@ -223,6 +279,6 @@ return {
}; };
})(); })();
(node as any).hash = "8cda24b1d10caa3f4b83dbb82035365b"; (node as any).hash = "0f00d125fc711db9e65d54dcc884a72e";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<f772c53b0007859aecc59a9484b5b791>> * @generated SignedSource<<6aa146f2bf0d89cd8140da220a2c33d8>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -15,6 +15,7 @@ export type DocumentType = "ISMS" | "OTHER" | "POLICY" | "PROCEDURE";
export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED"; export type DocumentVersionSignatureState = "REQUESTED" | "SIGNED";
import { FragmentRefs } from "relay-runtime"; import { FragmentRefs } from "relay-runtime";
export type DocumentsPageRowFragment$data = { export type DocumentsPageRowFragment$data = {
readonly canDelete: boolean;
readonly classification: DocumentClassification; readonly classification: DocumentClassification;
readonly description: string | null | undefined; readonly description: string | null | undefined;
readonly documentType: DocumentType; readonly documentType: DocumentType;
@@ -99,6 +100,19 @@ return {
"name": "updatedAt", "name": "updatedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{ {
"alias": null, "alias": null,
"args": null, "args": null,
@@ -225,6 +239,6 @@ return {
}; };
})(); })();
(node as any).hash = "cd6d6bebffb9ed17a251aeef4b86f753"; (node as any).hash = "4164f76edc42d40eef1efc54194116ec";
export default node; export default node;

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<bf6b6a8a1f99fd0bfcc4eda44bbfe352>> * @generated SignedSource<<032b44ec9c5c4d5fc0281269dad54098>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -170,6 +170,19 @@ return {
"name": "updatedAt", "name": "updatedAt",
"storageKey": null "storageKey": null
}, },
{
"alias": "canDelete",
"args": [
{
"kind": "Literal",
"name": "action",
"value": "core:document:delete"
}
],
"kind": "ScalarField",
"name": "permission",
"storageKey": "permission(action:\"core:document:delete\")"
},
{ {
"alias": null, "alias": null,
"args": null, "args": null,
@@ -302,12 +315,12 @@ return {
] ]
}, },
"params": { "params": {
"cacheID": "d3e85ba061ad3937ad4a3c6727eb76fa", "cacheID": "56634e96a607e273bf269d4720cd75d9",
"id": null, "id": null,
"metadata": {}, "metadata": {},
"name": "PublishDocumentsDialogMutation", "name": "PublishDocumentsDialogMutation",
"operationKind": "mutation", "operationKind": "mutation",
"text": "mutation PublishDocumentsDialogMutation(\n $input: BulkPublishDocumentVersionsInput!\n) {\n bulkPublishDocumentVersions(input: $input) {\n documentEdges {\n node {\n id\n ...DocumentsPageRowFragment\n }\n }\n }\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n" "text": "mutation PublishDocumentsDialogMutation(\n $input: BulkPublishDocumentVersionsInput!\n) {\n bulkPublishDocumentVersions(input: $input) {\n documentEdges {\n node {\n id\n ...DocumentsPageRowFragment\n }\n }\n }\n}\n\nfragment DocumentsPageRowFragment on Document {\n id\n title\n description\n documentType\n classification\n updatedAt\n canDelete: permission(action: \"core:document:delete\")\n owner {\n id\n fullName\n }\n versions(first: 1) {\n edges {\n node {\n id\n status\n version\n signatures(first: 1000) {\n edges {\n node {\n id\n state\n }\n }\n }\n }\n }\n }\n}\n"
} }
}; };
})(); })();

View File

@@ -10,7 +10,10 @@ export const documentsQuery = graphql`
query DocumentGraphListQuery($organizationId: ID!) { query DocumentGraphListQuery($organizationId: ID!) {
organization: node(id: $organizationId) { organization: node(id: $organizationId) {
id id
...DocumentsPageListFragment ... on Organization {
canCreateDocument: permission(action: "core:document:create")
...DocumentsPageListFragment
}
} }
} }
`; `;

View File

@@ -65,7 +65,7 @@ import {
PdfDownloadDialog, PdfDownloadDialog,
type PdfDownloadDialogRef, type PdfDownloadDialogRef,
} from "/components/documents/PdfDownloadDialog"; } from "/components/documents/PdfDownloadDialog";
import { use, useRef, useState } from "react"; import { useRef, useState } from "react";
import type { NodeOf } from "/types.ts"; import type { NodeOf } from "/types.ts";
import clsx from "clsx"; import clsx from "clsx";
import { PeopleSelectField } from "/components/form/PeopleSelectField"; import { PeopleSelectField } from "/components/form/PeopleSelectField";
@@ -74,7 +74,6 @@ import { DocumentTypeOptions } from "/components/form/DocumentTypeOptions";
import { DocumentClassificationOptions } from "/components/form/DocumentClassificationOptions"; import { DocumentClassificationOptions } from "/components/form/DocumentClassificationOptions";
import { z } from "zod"; import { z } from "zod";
import { useFormWithSchema } from "/hooks/useFormWithSchema"; import { useFormWithSchema } from "/hooks/useFormWithSchema";
import { PermissionsContext } from "/providers/PermissionsContext";
type Props = { type Props = {
queryRef: PreloadedQuery<DocumentGraphNodeQuery>; queryRef: PreloadedQuery<DocumentGraphNodeQuery>;
@@ -90,6 +89,15 @@ const documentFragment = graphql`
id id
fullName fullName
} }
canUpdate: permission(action: "core:document:update")
canDelete: permission(action: "core:document:delete")
canPublish: permission(action: "core:document-version:publish")
# canSendSigningNotifications: permission(
# action: "core:document:send-signing-notifications"
# )
# canRequestSignatures: permission(
# action: "core:document-version:request-signature"
# )
...DocumentControlsTabFragment ...DocumentControlsTabFragment
controlsInfo: controls(first: 0) { controlsInfo: controls(first: 0) {
totalCount totalCount
@@ -109,6 +117,9 @@ const documentFragment = graphql`
id id
fullName fullName
} }
canDeleteDraft: permission(
action: "core:document-version:delete-draft"
)
...DocumentSignaturesTab_version ...DocumentSignaturesTab_version
signatures(first: 1000) signatures(first: 1000)
@connection(key: "DocumentDetailPage_signatures", filters: []) { @connection(key: "DocumentDetailPage_signatures", filters: []) {
@@ -176,6 +187,7 @@ const documentUpdateSchema = z.object({
classification: z.enum(documentClassifications), classification: z.enum(documentClassifications),
}); });
// FIXME
// const UserEmailQuery = graphql` // const UserEmailQuery = graphql`
// query DocumentDetailPageUserEmailQuery { // query DocumentDetailPageUserEmailQuery {
// viewer { // viewer {
@@ -194,7 +206,6 @@ export default function DocumentDetailPage(props: Props) {
const { __ } = useTranslate(); const { __ } = useTranslate();
const organizationId = useOrganizationId(); const organizationId = useOrganizationId();
const navigate = useNavigate(); const navigate = useNavigate();
const { isAuthorized } = use(PermissionsContext);
const [isEditingTitle, setIsEditingTitle] = useState(false); const [isEditingTitle, setIsEditingTitle] = useState(false);
const [isEditingOwner, setIsEditingOwner] = useState(false); const [isEditingOwner, setIsEditingOwner] = useState(false);
@@ -461,7 +472,7 @@ export default function DocumentDetailPage(props: Props) {
]} ]}
/> />
<div className="flex gap-2"> <div className="flex gap-2">
{isDraft && isAuthorized("Document", "publishDocumentVersion") && ( {isDraft && document.canPublish && (
<Button <Button
onClick={handlePublish} onClick={handlePublish}
icon={IconCheckmark1} icon={IconCheckmark1}
@@ -491,7 +502,7 @@ export default function DocumentDetailPage(props: Props) {
</Dropdown> </Dropdown>
<ActionDropdown variant="secondary"> <ActionDropdown variant="secondary">
{isAuthorized("Document", "updateDocument") && ( {document.canUpdate && (
<DropdownItem <DropdownItem
onClick={() => updateDialogRef.current?.open()} onClick={() => updateDialogRef.current?.open()}
icon={IconPencil} icon={IconPencil}
@@ -501,7 +512,7 @@ export default function DocumentDetailPage(props: Props) {
)} )}
{isDraft && {isDraft &&
versions.length > 1 && versions.length > 1 &&
isAuthorized("Document", "deleteDraftDocumentVersion") && ( currentVersion.canDeleteDraft && (
<DropdownItem <DropdownItem
onClick={handleDeleteDraft} onClick={handleDeleteDraft}
icon={IconTrashCan} icon={IconTrashCan}
@@ -517,7 +528,7 @@ export default function DocumentDetailPage(props: Props) {
> >
{__("Download PDF")} {__("Download PDF")}
</DropdownItem> </DropdownItem>
{isAuthorized("Document", "deleteDocument") && ( {document.canDelete && (
<DropdownItem <DropdownItem
variant="danger" variant="danger"
icon={IconTrashCan} icon={IconTrashCan}
@@ -567,7 +578,7 @@ export default function DocumentDetailPage(props: Props) {
) : ( ) : (
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span>{document.title}</span> <span>{document.title}</span>
{isAuthorized("Document", "updateDocument") && ( {document.canUpdate && (
<Button <Button
variant="quaternary" variant="quaternary"
icon={IconPencil} icon={IconPencil}
@@ -620,7 +631,7 @@ export default function DocumentDetailPage(props: Props) {
) : ( ) : (
<ReadOnlyPropertyContent <ReadOnlyPropertyContent
onEdit={() => setIsEditingOwner(true)} onEdit={() => setIsEditingOwner(true)}
canEdit={isAuthorized("Document", "updateDocument")} canEdit={document.canUpdate}
> >
<Badge variant="highlight" size="md" className="gap-2"> <Badge variant="highlight" size="md" className="gap-2">
<Avatar name={currentVersion.owner?.fullName ?? ""} /> <Avatar name={currentVersion.owner?.fullName ?? ""} />
@@ -650,7 +661,7 @@ export default function DocumentDetailPage(props: Props) {
) : ( ) : (
<ReadOnlyPropertyContent <ReadOnlyPropertyContent
onEdit={() => setIsEditingType(true)} onEdit={() => setIsEditingType(true)}
canEdit={isAuthorized("Document", "updateDocument")} canEdit={document.canUpdate}
> >
<div className="text-sm text-txt-secondary"> <div className="text-sm text-txt-secondary">
{getDocumentTypeLabel(__, document.documentType)} {getDocumentTypeLabel(__, document.documentType)}
@@ -679,7 +690,7 @@ export default function DocumentDetailPage(props: Props) {
) : ( ) : (
<ReadOnlyPropertyContent <ReadOnlyPropertyContent
onEdit={() => setIsEditingClassification(true)} onEdit={() => setIsEditingClassification(true)}
canEdit={isAuthorized("Document", "updateDocument")} canEdit={document.canUpdate}
> >
<div className="text-sm text-txt-secondary"> <div className="text-sm text-txt-secondary">
{getDocumentClassificationLabel( {getDocumentClassificationLabel(
@@ -792,7 +803,7 @@ function VersionItem({
<div className="flex gap-3 w-full overflow-hidden"> <div className="flex gap-3 w-full overflow-hidden">
<div <div
className={clsx( className={clsx(
"flex-shrink-0 flex items-center justify-center size-10", "shrink-0 flex items-center justify-center size-10",
active && "bg-active rounded", active && "bg-active rounded",
)} )}
> >

View File

@@ -28,7 +28,7 @@ import {
usePreloadedQuery, usePreloadedQuery,
type PreloadedQuery, type PreloadedQuery,
} from "react-relay"; } from "react-relay";
import { use, useRef } from "react"; import { useRef } from "react";
import { graphql } from "relay-runtime"; import { graphql } from "relay-runtime";
import type { DocumentGraphListQuery } from "/__generated__/core/DocumentGraphListQuery.graphql"; import type { DocumentGraphListQuery } from "/__generated__/core/DocumentGraphListQuery.graphql";
import { import {
@@ -55,7 +55,6 @@ import {
BulkExportDialog, BulkExportDialog,
type BulkExportDialogRef, type BulkExportDialogRef,
} from "/components/documents/BulkExportDialog"; } from "/components/documents/BulkExportDialog";
import { PermissionsContext } from "/providers/PermissionsContext";
const documentsFragment = graphql` const documentsFragment = graphql`
fragment DocumentsPageListFragment on Organization fragment DocumentsPageListFragment on Organization
@@ -81,6 +80,14 @@ const documentsFragment = graphql`
edges { edges {
node { node {
id id
canUpdate: permission(action: "core:document:update")
canDelete: permission(action: "core:document:delete")
canSendSigningNotifications: permission(
action: "core:document:send-signing-notifications"
)
canRequestSignatures: permission(
action: "core:document-version:request-signature"
)
...DocumentsPageRowFragment ...DocumentsPageRowFragment
} }
} }
@@ -104,13 +111,13 @@ type Props = {
export default function DocumentsPage(props: Props) { export default function DocumentsPage(props: Props) {
const { __ } = useTranslate(); const { __ } = useTranslate();
const { isAuthorized } = use(PermissionsContext);
const organization = usePreloadedQuery( const organization = usePreloadedQuery(
documentsQuery, documentsQuery,
props.queryRef, props.queryRef,
).organization; ).organization;
// FIXME
// const userEmailData = useLazyLoadQuery<DocumentsPageUserEmailQuery>( // const userEmailData = useLazyLoadQuery<DocumentsPageUserEmailQuery>(
// UserEmailQuery, // UserEmailQuery,
// {} // {}
@@ -135,9 +142,15 @@ export default function DocumentsPage(props: Props) {
usePageTitle(__("Documents")); usePageTitle(__("Documents"));
const hasAnyAction = const canDeleteAny = documents.some(({ canDelete }) => canDelete);
isAuthorized("Document", "updateDocument") || const canUpdateAny = documents.some(({ canUpdate }) => canUpdate);
isAuthorized("Document", "deleteDocument"); const canSendAnySignatureNotifications = documents.some(
({ canSendSigningNotifications }) => canSendSigningNotifications,
);
const canRequestAnySignatures = documents.some(
({ canRequestSignatures }) => canRequestSignatures,
);
const hasAnyAction = canDeleteAny || canUpdateAny;
const handleSendSigningNotifications = () => { const handleSendSigningNotifications = () => {
sendSigningNotifications({ sendSigningNotifications({
@@ -197,7 +210,7 @@ export default function DocumentsPage(props: Props) {
description={__("Manage your organization's documents")} description={__("Manage your organization's documents")}
> >
<div className="flex gap-2"> <div className="flex gap-2">
{isAuthorized("Document", "sendSigningNotifications") && ( {canSendAnySignatureNotifications && (
<Button <Button
icon={IconBell2} icon={IconBell2}
variant="secondary" variant="secondary"
@@ -206,7 +219,7 @@ export default function DocumentsPage(props: Props) {
{__("Send signing notifications")} {__("Send signing notifications")}
</Button> </Button>
)} )}
{isAuthorized("Organization", "createDocument") && ( {organization.canCreateDocument && (
<CreateDocumentDialog <CreateDocumentDialog
connection={connectionId} connection={connectionId}
trigger={ trigger={
@@ -259,7 +272,7 @@ export default function DocumentsPage(props: Props) {
</button> </button>
</div> </div>
<div className="flex gap-2 items-center"> <div className="flex gap-2 items-center">
{isAuthorized("Document", "updateDocument") && ( {canUpdateAny && (
<PublishDocumentsDialog <PublishDocumentsDialog
documentIds={selection} documentIds={selection}
onSave={clear} onSave={clear}
@@ -272,7 +285,7 @@ export default function DocumentsPage(props: Props) {
</Button> </Button>
</PublishDocumentsDialog> </PublishDocumentsDialog>
)} )}
{isAuthorized("Document", "bulkRequestSignatures") && ( {canRequestAnySignatures && (
<SignatureDocumentsDialog <SignatureDocumentsDialog
documentIds={selection} documentIds={selection}
onSave={clear} onSave={clear}
@@ -301,7 +314,7 @@ export default function DocumentsPage(props: Props) {
{__("Export")} {__("Export")}
</Button> </Button>
</BulkExportDialog> </BulkExportDialog>
{isAuthorized("Document", "deleteDocument") && ( {canDeleteAny && (
<Button <Button
variant="danger" variant="danger"
icon={IconTrashCan} icon={IconTrashCan}
@@ -355,6 +368,7 @@ const rowFragment = graphql`
documentType documentType
classification classification
updatedAt updatedAt
canDelete: permission(action: "core:document:delete")
owner { owner {
id id
fullName fullName
@@ -393,7 +407,6 @@ function DocumentRow({
onCheck: () => void; onCheck: () => void;
hasAnyAction: boolean; hasAnyAction: boolean;
}) { }) {
const { isAuthorized } = use(PermissionsContext);
const document = useFragment<DocumentsPageRowFragment$key>( const document = useFragment<DocumentsPageRowFragment$key>(
rowFragment, rowFragment,
documentKey, documentKey,
@@ -469,7 +482,7 @@ function DocumentRow({
{hasAnyAction && ( {hasAnyAction && (
<Td noLink width={50} className="text-end w-18"> <Td noLink width={50} className="text-end w-18">
<ActionDropdown> <ActionDropdown>
{isAuthorized("Document", "deleteDocument") && ( {document.canDelete && (
<DropdownItem <DropdownItem
variant="danger" variant="danger"
icon={IconTrashCan} icon={IconTrashCan}

View File

@@ -8,7 +8,7 @@ import {
Spinner, Spinner,
} from "@probo/ui"; } from "@probo/ui";
import { useTranslate } from "@probo/i18n"; import { useTranslate } from "@probo/i18n";
import { Suspense, useState, useEffect, useRef, use } from "react"; import { Suspense, useState, useEffect, useRef } from "react";
import type { ItemOf, NodeOf } from "/types"; import type { ItemOf, NodeOf } from "/types";
import { graphql, useFragment, useRefetchableFragment } from "react-relay"; import { graphql, useFragment, useRefetchableFragment } from "react-relay";
import { usePeople } from "/hooks/graph/PeopleGraph.ts"; import { usePeople } from "/hooks/graph/PeopleGraph.ts";
@@ -20,7 +20,6 @@ import { useOutletContext } from "react-router";
import type { DocumentSignaturesTab_signature$key } from "/__generated__/core/DocumentSignaturesTab_signature.graphql.ts"; import type { DocumentSignaturesTab_signature$key } from "/__generated__/core/DocumentSignaturesTab_signature.graphql.ts";
import type { DocumentSignaturesTab_version$key } from "/__generated__/core/DocumentSignaturesTab_version.graphql.ts"; import type { DocumentSignaturesTab_version$key } from "/__generated__/core/DocumentSignaturesTab_version.graphql.ts";
import type { DocumentSignaturesTabRefetchQuery } from "/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql"; import type { DocumentSignaturesTabRefetchQuery } from "/__generated__/core/DocumentSignaturesTabRefetchQuery.graphql";
import { PermissionsContext } from "/providers/PermissionsContext";
type Version = NodeOf<DocumentDetailPageDocumentFragment$data["versions"]>; type Version = NodeOf<DocumentDetailPageDocumentFragment$data["versions"]>;
@@ -34,6 +33,9 @@ const versionFragment = graphql`
) { ) {
id id
status status
canRequestSignature: permission(
action: "core:document-version:request-signature"
)
signatures(first: $count, after: $cursor, filter: $signatureFilter) signatures(first: $count, after: $cursor, filter: $signatureFilter)
@connection( @connection(
key: "DocumentSignaturesTab_signatures" key: "DocumentSignaturesTab_signatures"
@@ -186,6 +188,7 @@ function SignatureList(props: {
people={p} people={p}
connectionId={version.signatures.__id} connectionId={version.signatures.__id}
signable={signable} signable={signable}
canRequestSignature={version.canRequestSignature}
/> />
))} ))}
</div> </div>
@@ -202,6 +205,7 @@ const signatureFragment = graphql`
fullName fullName
primaryEmailAddress primaryEmailAddress
} }
canCancel: permission(action: "core:document-version:request-signature")
} }
`; `;
@@ -244,10 +248,10 @@ function SignatureItem(props: {
people: ItemOf<ReturnType<typeof usePeople>>; people: ItemOf<ReturnType<typeof usePeople>>;
connectionId: string; connectionId: string;
signable: boolean; signable: boolean;
canRequestSignature: boolean;
}) { }) {
const signature = useFragment(signatureFragment, props.signature); const signature = useFragment(signatureFragment, props.signature);
const { __, dateTimeFormat } = useTranslate(); const { __, dateTimeFormat } = useTranslate();
const { isAuthorized } = use(PermissionsContext);
const [requestSignature, isSendingRequest] = useMutationWithToasts( const [requestSignature, isSendingRequest] = useMutationWithToasts(
requestSignatureMutation, requestSignatureMutation,
{ {
@@ -276,7 +280,7 @@ function SignatureItem(props: {
{props.people.primaryEmailAddress} {props.people.primaryEmailAddress}
</div> </div>
</div> </div>
{props.signable && isAuthorized("Document", "requestSignature") && ( {props.signable && props.canRequestSignature && (
<Button <Button
variant="secondary" variant="secondary"
className="ml-auto" className="ml-auto"
@@ -331,7 +335,7 @@ function SignatureItem(props: {
{__("Signed")} {__("Signed")}
</Badge> </Badge>
) : ( ) : (
isAuthorized("DocumentVersionSignature", "cancelSignatureRequest") && ( signature.canCancel && (
<Button <Button
variant="danger" variant="danger"
className="ml-auto" className="ml-auto"

View File

@@ -164,21 +164,21 @@ const (
ActionDocumentSendSigningNotifications = "core:document:send-signing-notifications" ActionDocumentSendSigningNotifications = "core:document:send-signing-notifications"
// DocumentVersion actions // DocumentVersion actions
ActionDocumentVersionGet = "core:document-version:get" ActionDocumentVersionGet = "core:document-version:get"
ActionDocumentVersionList = "core:document-version:list" ActionDocumentVersionList = "core:document-version:list"
ActionDocumentVersionExportPDF = "core:document-version:export-pdf" ActionDocumentVersionExportPDF = "core:document-version:export-pdf"
ActionDocumentVersionExportSignable = "core:document-version:export-signable-pdf" ActionDocumentVersionExportSignable = "core:document-version:export-signable-pdf"
ActionDocumentVersionSign = "core:document-version:sign" ActionDocumentVersionSign = "core:document-version:sign"
ActionDocumentVersionUpdate = "core:document-version:update" ActionDocumentVersionUpdate = "core:document-version:update"
ActionDocumentVersionSignatureRequest = "core:document-version:request-signature" ActionDocumentVersionDeleteDraft = "core:document-version:delete-draft"
ActionDocumentVersionDeleteDraft = "core:document-version:delete-draft" ActionDocumentVersionPublish = "core:document-version:publish"
ActionDocumentVersionPublish = "core:document-version:publish" ActionDocumentVersionExport = "core:document-version:export"
ActionDocumentVersionCancelSignature = "core:document-version:cancel-signature"
ActionDocumentVersionExport = "core:document-version:export"
// DocumentVersionSignature actions // DocumentVersionSignature actions
ActionDocumentVersionSignatureGet = "core:document-version-signature:get" ActionDocumentVersionSignatureRequest = "core:document-version-signature:request"
ActionDocumentVersionSignatureList = "core:document-version-signature:list" ActionDocumentVersionCancelSignature = "core:document-version-signature:cancel"
ActionDocumentVersionSignatureGet = "core:document-version-signature:get"
ActionDocumentVersionSignatureList = "core:document-version-signature:list"
// Risk actions // Risk actions
ActionRiskGet = "core:risk:get" ActionRiskGet = "core:risk:get"

View File

@@ -4681,6 +4681,8 @@ type DocumentVersion implements Node
publishedAt: Datetime publishedAt: Datetime
createdAt: Datetime! createdAt: Datetime!
updatedAt: Datetime! updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
} }
type DocumentVersionSignatureConnection { type DocumentVersionSignatureConnection {

View File

@@ -729,6 +729,7 @@ type ComplexityRoot struct {
Document func(childComplexity int) int Document func(childComplexity int) int
ID func(childComplexity int) int ID func(childComplexity int) int
Owner func(childComplexity int) int Owner func(childComplexity int) int
Permission func(childComplexity int, action string) int
PublishedAt func(childComplexity int) int PublishedAt func(childComplexity int) int
Signatures func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) int Signatures func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) int
Signed func(childComplexity int) int Signed func(childComplexity int) int
@@ -2029,6 +2030,8 @@ type DocumentVersionResolver interface {
Owner(ctx context.Context, obj *types.DocumentVersion) (*types.People, error) Owner(ctx context.Context, obj *types.DocumentVersion) (*types.People, error)
Signatures(ctx context.Context, obj *types.DocumentVersion, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) (*types.DocumentVersionSignatureConnection, error) Signatures(ctx context.Context, obj *types.DocumentVersion, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) (*types.DocumentVersionSignatureConnection, error)
Signed(ctx context.Context, obj *types.DocumentVersion) (bool, error) Signed(ctx context.Context, obj *types.DocumentVersion) (bool, error)
Permission(ctx context.Context, obj *types.DocumentVersion, action string) (bool, error)
} }
type DocumentVersionSignatureResolver interface { type DocumentVersionSignatureResolver interface {
DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error) DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error)
@@ -4314,6 +4317,17 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
} }
return e.complexity.DocumentVersion.Owner(childComplexity), true return e.complexity.DocumentVersion.Owner(childComplexity), true
case "DocumentVersion.permission":
if e.complexity.DocumentVersion.Permission == nil {
break
}
args, err := ec.field_DocumentVersion_permission_args(ctx, rawArgs)
if err != nil {
return 0, false
}
return e.complexity.DocumentVersion.Permission(childComplexity, args["action"].(string)), true
case "DocumentVersion.publishedAt": case "DocumentVersion.publishedAt":
if e.complexity.DocumentVersion.PublishedAt == nil { if e.complexity.DocumentVersion.PublishedAt == nil {
break break
@@ -15037,6 +15051,8 @@ type DocumentVersion implements Node
publishedAt: Datetime publishedAt: Datetime
createdAt: Datetime! createdAt: Datetime!
updatedAt: Datetime! updatedAt: Datetime!
permission(action: String!): Boolean! @goField(forceResolver: true)
} }
type DocumentVersionSignatureConnection { type DocumentVersionSignatureConnection {
@@ -15945,6 +15961,17 @@ func (ec *executionContext) field_DocumentVersionSignature_permission_args(ctx c
return args, nil return args, nil
} }
func (ec *executionContext) field_DocumentVersion_permission_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
var err error
args := map[string]any{}
arg0, err := graphql.ProcessArgField(ctx, rawArgs, "action", ec.unmarshalNString2string)
if err != nil {
return nil, err
}
args["action"] = arg0
return args, nil
}
func (ec *executionContext) field_DocumentVersion_signatures_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { func (ec *executionContext) field_DocumentVersion_signatures_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) {
var err error var err error
args := map[string]any{} args := map[string]any{}
@@ -29520,6 +29547,47 @@ func (ec *executionContext) fieldContext_DocumentVersion_updatedAt(_ context.Con
return fc, nil return fc, nil
} }
func (ec *executionContext) _DocumentVersion_permission(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersion) (ret graphql.Marshaler) {
return graphql.ResolveField(
ctx,
ec.OperationContext,
field,
ec.fieldContext_DocumentVersion_permission,
func(ctx context.Context) (any, error) {
fc := graphql.GetFieldContext(ctx)
return ec.resolvers.DocumentVersion().Permission(ctx, obj, fc.Args["action"].(string))
},
nil,
ec.marshalNBoolean2bool,
true,
true,
)
}
func (ec *executionContext) fieldContext_DocumentVersion_permission(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "DocumentVersion",
Field: field,
IsMethod: true,
IsResolver: true,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type Boolean does not have child fields")
},
}
defer func() {
if r := recover(); r != nil {
err = ec.Recover(ctx, r)
ec.Error(ctx, err)
}
}()
ctx = graphql.WithFieldContext(ctx, fc)
if fc.Args, err = ec.field_DocumentVersion_permission_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
ec.Error(ctx, err)
return fc, err
}
return fc, nil
}
func (ec *executionContext) _DocumentVersionConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionConnection) (ret graphql.Marshaler) { func (ec *executionContext) _DocumentVersionConnection_edges(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersionConnection) (ret graphql.Marshaler) {
return graphql.ResolveField( return graphql.ResolveField(
ctx, ctx,
@@ -29675,6 +29743,8 @@ func (ec *executionContext) fieldContext_DocumentVersionEdge_node(_ context.Cont
return ec.fieldContext_DocumentVersion_createdAt(ctx, field) return ec.fieldContext_DocumentVersion_createdAt(ctx, field)
case "updatedAt": case "updatedAt":
return ec.fieldContext_DocumentVersion_updatedAt(ctx, field) return ec.fieldContext_DocumentVersion_updatedAt(ctx, field)
case "permission":
return ec.fieldContext_DocumentVersion_permission(ctx, field)
} }
return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name) return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name)
}, },
@@ -29763,6 +29833,8 @@ func (ec *executionContext) fieldContext_DocumentVersionSignature_documentVersio
return ec.fieldContext_DocumentVersion_createdAt(ctx, field) return ec.fieldContext_DocumentVersion_createdAt(ctx, field)
case "updatedAt": case "updatedAt":
return ec.fieldContext_DocumentVersion_updatedAt(ctx, field) return ec.fieldContext_DocumentVersion_updatedAt(ctx, field)
case "permission":
return ec.fieldContext_DocumentVersion_permission(ctx, field)
} }
return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name) return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name)
}, },
@@ -44633,6 +44705,8 @@ func (ec *executionContext) fieldContext_PublishDocumentVersionPayload_documentV
return ec.fieldContext_DocumentVersion_createdAt(ctx, field) return ec.fieldContext_DocumentVersion_createdAt(ctx, field)
case "updatedAt": case "updatedAt":
return ec.fieldContext_DocumentVersion_updatedAt(ctx, field) return ec.fieldContext_DocumentVersion_updatedAt(ctx, field)
case "permission":
return ec.fieldContext_DocumentVersion_permission(ctx, field)
} }
return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name) return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name)
}, },
@@ -53584,6 +53658,8 @@ func (ec *executionContext) fieldContext_UpdateDocumentVersionPayload_documentVe
return ec.fieldContext_DocumentVersion_createdAt(ctx, field) return ec.fieldContext_DocumentVersion_createdAt(ctx, field)
case "updatedAt": case "updatedAt":
return ec.fieldContext_DocumentVersion_updatedAt(ctx, field) return ec.fieldContext_DocumentVersion_updatedAt(ctx, field)
case "permission":
return ec.fieldContext_DocumentVersion_permission(ctx, field)
} }
return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name) return nil, fmt.Errorf("no field named %q was found under type DocumentVersion", field.Name)
}, },
@@ -75960,6 +76036,42 @@ func (ec *executionContext) _DocumentVersion(ctx context.Context, sel ast.Select
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1) atomic.AddUint32(&out.Invalids, 1)
} }
case "permission":
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._DocumentVersion_permission(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: default:
panic("unknown field " + strconv.Quote(field.Name)) panic("unknown field " + strconv.Quote(field.Name))
} }

View File

@@ -961,6 +961,11 @@ func (r *documentVersionResolver) Signed(ctx context.Context, obj *types.Documen
return signed, nil return signed, nil
} }
// Permission is the resolver for the permission field.
func (r *documentVersionResolver) Permission(ctx context.Context, obj *types.DocumentVersion, action string) (bool, error) {
return r.Resolver.Permission(ctx, obj, action)
}
// DocumentVersion is the resolver for the documentVersion field. // DocumentVersion is the resolver for the documentVersion field.
func (r *documentVersionSignatureResolver) DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error) { func (r *documentVersionSignatureResolver) DocumentVersion(ctx context.Context, obj *types.DocumentVersionSignature) (*types.DocumentVersion, error) {
r.MustAuthorize(ctx, obj.ID, probo.ActionDocumentVersionGet) r.MustAuthorize(ctx, obj.ID, probo.ActionDocumentVersionGet)