Add useGroupBy hook + update calendar view to use groupBy (#15439)

## Context
Took inspiration from findMany + kanban => Implemented a hook for the
new groupBy API endpoints
Fixed an issue when DnD to an empty day
This commit is contained in:
Weiko
2025-10-31 18:39:22 +01:00
committed by GitHub
parent bb471cb8a5
commit 09c704c8bd
24 changed files with 1218 additions and 39 deletions
@@ -0,0 +1,63 @@
import { gql } from '@apollo/client';
import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { type RecordGqlOperationGqlRecordFields } from '@/object-record/graphql/types/RecordGqlOperationGqlRecordFields';
import { type ObjectPermissions } from 'twenty-shared/types';
import { capitalize } from 'twenty-shared/utils';
export const generateGroupByRecordsQuery = ({
objectMetadataItem,
objectMetadataItems,
recordGqlFields,
computeReferences,
objectPermissionsByObjectMetadataId,
}: {
objectMetadataItem: ObjectMetadataItem;
objectMetadataItems: ObjectMetadataItem[];
recordGqlFields?: RecordGqlOperationGqlRecordFields;
computeReferences?: boolean;
objectPermissionsByObjectMetadataId: Record<
string,
ObjectPermissions & { objectMetadataId: string }
>;
}) => gql`
query GroupBy${capitalize(
objectMetadataItem.namePlural,
)}($groupBy: [${capitalize(
objectMetadataItem.nameSingular,
)}GroupByInput!]!, $filter: ${capitalize(
objectMetadataItem.nameSingular,
)}FilterInput, $orderBy: [${capitalize(
objectMetadataItem.nameSingular,
)}OrderByWithGroupByInput!], $orderByForRecords: [${capitalize(
objectMetadataItem.nameSingular,
)}OrderByInput], $viewId: UUID) {
${objectMetadataItem.namePlural}GroupBy(
groupBy: $groupBy
filter: $filter
orderBy: $orderBy
orderByForRecords: $orderByForRecords
viewId: $viewId
) {
edges {
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
recordGqlFields,
computeReferences,
objectPermissionsByObjectMetadataId,
})}
cursor
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
totalCount
groupByDimensionValues
}
}
`;
@@ -6,11 +6,14 @@ export const getQueryIdentifier = ({
orderBy,
limit,
cursorFilter,
groupBy,
}: RecordGqlOperationVariables & {
objectNameSingular: string;
groupBy?: Record<string, any>[];
}) =>
objectNameSingular +
JSON.stringify(filter) +
JSON.stringify(orderBy) +
limit +
(cursorFilter ? JSON.stringify(cursorFilter) : undefined);
(cursorFilter ? JSON.stringify(cursorFilter) : undefined) +
(groupBy ? JSON.stringify(groupBy) : '');