From 272f63828f31f50b51fd8b0791ce4cd10a83e0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Fri, 24 Apr 2026 11:45:52 +0400 Subject: [PATCH] Add state to MCP profile and refactor contract filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the profile state attribute (ACTIVE/INACTIVE) to the MCP Profile schema so listUsers and getUser tools expose it, and add a state filter to listUsers. Rename excludeContractEnded to contractEnded across the entire stack (MCP, GraphQL, CLI, frontend). The new boolean is two-way: true returns only users with ended contracts, false returns only users with active or no contract, and null returns all. Signed-off-by: Émile Ré --- .../components/form/PeopleMultiSelectField.tsx | 2 +- .../src/components/form/PeopleSelectField.tsx | 2 +- .../src/components/table/PeopleCell.tsx | 2 +- apps/console/src/hooks/graph/PeopleGraph.ts | 4 ++-- .../_components/SignatureDocumentsDialog.tsx | 2 +- .../signatures/DocumentSignaturesPage.tsx | 2 +- .../organizations/findings/FindingsPage.tsx | 2 +- pkg/cmd/user/list/list.go | 4 ++-- pkg/coredata/membership_profile_filter.go | 14 ++++++++------ .../api/connect/v1/graphql/profile.graphql | 2 +- .../api/connect/v1/identity_resolvers.go | 2 +- .../console/v1/graphql/organization.graphql | 2 +- .../api/console/v1/organization_resolvers.go | 2 +- pkg/server/api/mcp/v1/schema.resolvers.go | 5 ++++- pkg/server/api/mcp/v1/specification.yaml | 18 ++++++++++++++++-- pkg/server/api/mcp/v1/types/profile.go | 1 + 16 files changed, 43 insertions(+), 23 deletions(-) diff --git a/apps/console/src/components/form/PeopleMultiSelectField.tsx b/apps/console/src/components/form/PeopleMultiSelectField.tsx index 1cbb6b602..b1f7c6d6a 100644 --- a/apps/console/src/components/form/PeopleMultiSelectField.tsx +++ b/apps/console/src/components/form/PeopleMultiSelectField.tsx @@ -65,7 +65,7 @@ function PeopleMultiSelectWithQuery( ) { const { __ } = useTranslate(); const { name, organizationId, control, selectedPeople = [], placeholder } = props; - const people = usePeople(organizationId, { excludeContractEnded: true }); + const people = usePeople(organizationId, { contractEnded: false }); const [isOpen, setIsOpen] = useState(false); const allPeople = [...people]; diff --git a/apps/console/src/components/form/PeopleSelectField.tsx b/apps/console/src/components/form/PeopleSelectField.tsx index 667fb3dcc..78b158987 100644 --- a/apps/console/src/components/form/PeopleSelectField.tsx +++ b/apps/console/src/components/form/PeopleSelectField.tsx @@ -61,7 +61,7 @@ function PeopleSelectWithQuery( ) { const { __ } = useTranslate(); const { name, organizationId, control } = props; - const people = usePeople(organizationId, { excludeContractEnded: true }); + const people = usePeople(organizationId, { contractEnded: false }); return ( data.organization?.profiles?.edges.map(edge => edge.node) ?? []} diff --git a/apps/console/src/hooks/graph/PeopleGraph.ts b/apps/console/src/hooks/graph/PeopleGraph.ts index 5ab8f0ea9..df20a4e2e 100644 --- a/apps/console/src/hooks/graph/PeopleGraph.ts +++ b/apps/console/src/hooks/graph/PeopleGraph.ts @@ -49,13 +49,13 @@ export const peopleQuery = graphql` */ export function usePeople( organizationId: string, - { excludeContractEnded }: { excludeContractEnded?: boolean } = {}, + { contractEnded }: { contractEnded?: boolean } = {}, ) { const data = useLazyLoadQuery( peopleQuery, { organizationId: organizationId, - filter: excludeContractEnded ? { excludeContractEnded: true } : null, + filter: contractEnded !== undefined ? { contractEnded } : null, }, { fetchPolicy: "network-only" }, ); diff --git a/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx b/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx index 98082c79b..dabf2cffa 100644 --- a/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx +++ b/apps/console/src/pages/organizations/documents/_components/SignatureDocumentsDialog.tsx @@ -196,7 +196,7 @@ function PeopleList({ signatureDocumentsDialogPeopleQuery, { organizationId, - filter: { excludeContractEnded: true }, + filter: { contractEnded: false }, }, ); const { diff --git a/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx index a23775c16..993476b32 100644 --- a/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx +++ b/apps/console/src/pages/organizations/documents/signatures/DocumentSignaturesPage.tsx @@ -27,7 +27,7 @@ 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 }) + ...DocumentSignatureList_peopleFragment @arguments(filter: { contractEnded: false }) } # We use this on /documents/:documentId document: node(id: $documentId) @skip(if: $versionSpecified) { diff --git a/apps/console/src/pages/organizations/findings/FindingsPage.tsx b/apps/console/src/pages/organizations/findings/FindingsPage.tsx index e7d774d99..1be34507d 100644 --- a/apps/console/src/pages/organizations/findings/FindingsPage.tsx +++ b/apps/console/src/pages/organizations/findings/FindingsPage.tsx @@ -550,7 +550,7 @@ function OwnerFilterSelect({ onChange, }: OwnerFilterSelectProps) { const { __ } = useTranslate(); - const people = usePeople(organizationId, { excludeContractEnded: true }); + const people = usePeople(organizationId, { contractEnded: false }); return (