From 524f209df72794c30e6ce97c611e872872a45f6e Mon Sep 17 00:00:00 2001 From: Sacha Al Himdani Date: Wed, 15 Apr 2026 13:27:49 +0200 Subject: [PATCH] Filter people with ended contracts from signature request dialog Move the paginated people query from PeopleGraph.ts into SignatureDocumentsDialog.tsx following colocated query conventions and pass excludeContractEnded: true to hide people whose contract has ended. Signed-off-by: Sacha Al Himdani --- apps/console/src/hooks/graph/PeopleGraph.ts | 53 --------------- .../_components/SignatureDocumentsDialog.tsx | 68 +++++++++++++++---- 2 files changed, 56 insertions(+), 65 deletions(-) diff --git a/apps/console/src/hooks/graph/PeopleGraph.ts b/apps/console/src/hooks/graph/PeopleGraph.ts index 2213479a4..5ab8f0ea9 100644 --- a/apps/console/src/hooks/graph/PeopleGraph.ts +++ b/apps/console/src/hooks/graph/PeopleGraph.ts @@ -63,56 +63,3 @@ export function usePeople( return data.organization?.profiles?.edges.map(edge => edge.node) ?? []; }, [data]); } - -export const paginatedPeopleQuery = graphql` - query PeopleGraphPaginatedQuery($organizationId: ID!) { - organization: node(id: $organizationId) { - id - ... on Organization { - ...PeopleGraphPaginatedFragment - } - } - } -`; - -export const paginatedPeopleFragment = graphql` - fragment PeopleGraphPaginatedFragment on Organization - @refetchable(queryName: "PeopleListQuery") - @argumentDefinitions( - first: { type: "Int", defaultValue: 50 } - order: { - type: "ProfileOrder" - defaultValue: { direction: ASC, field: FULL_NAME } - } - filter: { type: "ProfileFilter", defaultValue: null } - after: { type: "CursorKey", defaultValue: null } - before: { type: "CursorKey", defaultValue: null } - last: { type: "Int", defaultValue: null } - ) { - canCreatePeople: permission(action: "iam:membership-profile:create") - profiles( - first: $first - after: $after - last: $last - before: $before - orderBy: $order - filter: $filter - ) @connection(key: "PeopleGraphPaginatedQuery_profiles") { - __id - edges { - node { - id - fullName - emailAddress - kind - position - additionalEmailAddresses - contractStartDate - contractEndDate - canDelete: permission(action: "iam:membership-profile:delete") - canUpdate: permission(action: "iam:membership-profile:update") - } - } - } - } -`; diff --git a/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx b/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx index e90b94c10..384715ebc 100644 --- a/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx +++ b/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx @@ -36,14 +36,9 @@ import { useLazyLoadQuery, usePaginationFragment } from "react-relay"; import { graphql } from "relay-runtime"; import { z } from "zod"; -import type { PeopleGraphPaginatedFragment$key } from "#/__generated__/core/PeopleGraphPaginatedFragment.graphql"; -import type { PeopleGraphPaginatedQuery } from "#/__generated__/core/PeopleGraphPaginatedQuery.graphql"; -import type { PeopleListQuery } from "#/__generated__/core/PeopleListQuery.graphql"; import type { SignatureDocumentsDialogMutation } from "#/__generated__/core/SignatureDocumentsDialogMutation.graphql"; -import { - paginatedPeopleFragment, - paginatedPeopleQuery, -} from "#/hooks/graph/PeopleGraph"; +import type { SignatureDocumentsDialogPeopleQuery } from "#/__generated__/core/SignatureDocumentsDialogPeopleQuery.graphql"; +import type { SignatureDocumentsDialogPeopleRefetchQuery } from "#/__generated__/core/SignatureDocumentsDialogPeopleRefetchQuery.graphql"; import { useFormWithSchema } from "#/hooks/useFormWithSchema"; import { useMutationWithToasts } from "#/hooks/useMutationWithToasts"; import { useOrganizationId } from "#/hooks/useOrganizationId"; @@ -54,6 +49,54 @@ type Props = { onSave: () => void; }; +const signatureDocumentsDialogPeopleQuery = graphql` + query SignatureDocumentsDialogPeopleQuery( + $organizationId: ID! + $filter: ProfileFilter + ) { + organization: node(id: $organizationId) { + id + ... on Organization { + ...SignatureDocumentsDialogPeopleFragment + @arguments(filter: $filter) + } + } + } +`; + +const signatureDocumentsDialogPeopleFragment = graphql` + fragment SignatureDocumentsDialogPeopleFragment on Organization + @refetchable(queryName: "SignatureDocumentsDialogPeopleRefetchQuery") + @argumentDefinitions( + first: { type: "Int", defaultValue: 50 } + order: { + type: "ProfileOrder" + defaultValue: { direction: ASC, field: FULL_NAME } + } + filter: { type: "ProfileFilter", defaultValue: null } + after: { type: "CursorKey", defaultValue: null } + before: { type: "CursorKey", defaultValue: null } + last: { type: "Int", defaultValue: null } + ) { + profiles( + first: $first + after: $after + last: $last + before: $before + orderBy: $order + filter: $filter + ) @connection(key: "SignatureDocumentsDialog_profiles") { + edges { + node { + id + fullName + emailAddress + } + } + } + } +`; + const documentsSignatureMutation = graphql` mutation SignatureDocumentsDialogMutation( $input: BulkRequestSignaturesInput! @@ -148,10 +191,11 @@ function PeopleList({ }) { const { __ } = useTranslate(); const organizationId = useOrganizationId(); - const data = useLazyLoadQuery( - paginatedPeopleQuery, + const data = useLazyLoadQuery( + signatureDocumentsDialogPeopleQuery, { organizationId, + filter: { excludeContractEnded: true }, }, ); const { @@ -159,9 +203,9 @@ function PeopleList({ hasNext, loadNext, isLoadingNext, - } = usePaginationFragment( - paginatedPeopleFragment, - data.organization as PeopleGraphPaginatedFragment$key, + } = usePaginationFragment( + signatureDocumentsDialogPeopleFragment, + data.organization, ); const profiles = page.profiles.edges.map(edge => edge.node); return (