import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { type GroupByChartConfiguration } from '@/page-layout/widgets/graph/types/GroupByChartConfiguration'; import { getGroupByOrderBy } from '@/page-layout/widgets/graph/utils/getGroupByOrderBy'; import { type AggregateOrderByWithGroupByField, type ObjectRecordOrderByForCompositeField, type ObjectRecordOrderByForScalarField, type ObjectRecordOrderByWithGroupByDateField, } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { buildGroupByFieldObject } from './buildGroupByFieldObject'; export const generateGroupByQueryVariablesFromChartConfiguration = ({ objectMetadataItem, chartConfiguration, aggregateOperation, }: { objectMetadataItem: ObjectMetadataItem; chartConfiguration: GroupByChartConfiguration; aggregateOperation?: string; }) => { const groupByFieldXId = chartConfiguration.primaryAxisGroupByFieldMetadataId; const groupByFieldYId = chartConfiguration.secondaryAxisGroupByFieldMetadataId; const groupBySubFieldNameX = chartConfiguration.primaryAxisGroupBySubFieldName ?? undefined; const groupBySubFieldNameY = chartConfiguration.secondaryAxisGroupBySubFieldName ?? undefined; const groupByFieldX = objectMetadataItem.fields.find( (field) => field.id === groupByFieldXId, ); const groupByFieldY = isDefined(groupByFieldYId) ? objectMetadataItem.fields.find((field) => field.id === groupByFieldYId) : undefined; if (!isDefined(groupByFieldX) || !isDefined(groupByFieldXId)) { throw new Error( `Field with id ${groupByFieldXId} not found in object metadata`, ); } const groupBy: Array< Record> > = []; groupBy.push( buildGroupByFieldObject({ field: groupByFieldX, subFieldName: groupBySubFieldNameX, dateGranularity: chartConfiguration.primaryAxisDateGranularity ?? undefined, }), ); if (isDefined(groupByFieldY)) { groupBy.push( buildGroupByFieldObject({ field: groupByFieldY, subFieldName: groupBySubFieldNameY, dateGranularity: chartConfiguration.secondaryAxisGroupByDateGranularity ?? undefined, }), ); } const orderBy: Array< | AggregateOrderByWithGroupByField | ObjectRecordOrderByForScalarField | ObjectRecordOrderByWithGroupByDateField | ObjectRecordOrderByForCompositeField > = []; if (isDefined(chartConfiguration.primaryAxisOrderBy)) { orderBy.push( getGroupByOrderBy({ graphOrderBy: chartConfiguration.primaryAxisOrderBy, groupByField: groupByFieldX, groupBySubFieldName: chartConfiguration.primaryAxisGroupBySubFieldName, aggregateOperation, dateGranularity: chartConfiguration.primaryAxisDateGranularity ?? undefined, }), ); } if ( isDefined(groupByFieldY) && isDefined(chartConfiguration.secondaryAxisOrderBy) ) { orderBy.push( getGroupByOrderBy({ graphOrderBy: chartConfiguration.secondaryAxisOrderBy, groupByField: groupByFieldY, groupBySubFieldName: chartConfiguration.secondaryAxisGroupBySubFieldName, aggregateOperation, dateGranularity: chartConfiguration.secondaryAxisGroupByDateGranularity ?? undefined, }), ); } return { groupBy, ...(orderBy.length > 0 && { orderBy }), }; };