From 1c27206b4103114a30e8cdbd508225d741d692fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Wed, 22 Oct 2025 14:19:02 +0200 Subject: [PATCH] Use aggregate operations in the widget configuration instead of extended aggregate operations (#15248) - Use aggregate operations in the widget configuration instead of extended aggregate operations - Use aggregate operation from generated graphql in the frontend --- .../src/generated-metadata/graphql.ts | 27 +++---------- .../twenty-front/src/generated/graphql.ts | 31 ++++----------- ...egateOperationSelectionDropdownContent.tsx | 25 ++++++++---- .../__tests__/useChartSettingsValues.test.tsx | 6 +-- .../hooks/useGraphXSortOptionLabels.ts | 6 +-- .../mapToGraphQLExtendedAggregateOperation.ts | 38 ------------------- .../utils/getAggregateOperationLabel.ts | 3 +- .../hooks/useViewFieldAggregateOperation.tsx | 10 +++-- .../types/ExtendedAggregateOperations.ts | 2 +- ...dAggregateOperationToAggregateOperation.ts | 2 +- .../PageLayoutRenderer.stories.tsx | 10 ++--- .../usePageLayoutDraftState.test.tsx | 7 +--- .../utils/__tests__/addWidgetToTab.test.ts | 4 +- .../__tests__/convertLayoutsToWidgets.test.ts | 6 +-- .../convertPageLayoutToTabLayouts.test.ts | 8 ++-- .../extractFieldMetadataIdsFromWidget.test.ts | 16 ++++---- .../__tests__/removeWidgetFromTab.test.ts | 6 +-- .../utils/createDefaultGraphWidget.ts | 12 +++--- .../__stories__/WidgetRenderer.stories.tsx | 22 +++++------ ...VariablesFromBarChartConfiguration.test.ts | 4 +- ...woDimensionalGroupByToBarChartData.test.ts | 4 +- .../views/hooks/useUpdateViewAggregate.ts | 12 ++++-- .../extended-aggregate-operations.constant.ts | 24 ------------ .../dtos/bar-chart-configuration.dto.ts | 8 ++-- .../dtos/gauge-chart-configuration.dto.ts | 8 ++-- .../dtos/line-chart-configuration.dto.ts | 8 ++-- .../dtos/number-chart-configuration.dto.ts | 8 ++-- .../dtos/pie-chart-configuration.dto.ts | 8 ++-- 28 files changed, 118 insertions(+), 207 deletions(-) delete mode 100644 packages/twenty-front/src/modules/command-menu/pages/page-layout/utils/mapToGraphQLExtendedAggregateOperation.ts delete mode 100644 packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant.ts diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index 6e5b545591..3fc9510208 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -302,7 +302,7 @@ export enum AxisNameDisplay { export type BarChartConfiguration = { __typename?: 'BarChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; axisNameDisplay?: Maybe; color?: Maybe; description?: Maybe; @@ -1218,23 +1218,6 @@ export type ExecuteServerlessFunctionInput = { version?: Scalars['String']; }; -export enum ExtendedAggregateOperations { - AVG = 'AVG', - COUNT = 'COUNT', - COUNT_EMPTY = 'COUNT_EMPTY', - COUNT_FALSE = 'COUNT_FALSE', - COUNT_NOT_EMPTY = 'COUNT_NOT_EMPTY', - COUNT_TRUE = 'COUNT_TRUE', - COUNT_UNIQUE_VALUES = 'COUNT_UNIQUE_VALUES', - EARLIEST = 'EARLIEST', - LATEST = 'LATEST', - MAX = 'MAX', - MIN = 'MIN', - PERCENTAGE_EMPTY = 'PERCENTAGE_EMPTY', - PERCENTAGE_NOT_EMPTY = 'PERCENTAGE_NOT_EMPTY', - SUM = 'SUM' -} - export type FeatureFlag = { __typename?: 'FeatureFlag'; id: Scalars['UUID']; @@ -1424,7 +1407,7 @@ export type FullName = { export type GaugeChartConfiguration = { __typename?: 'GaugeChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; color?: Maybe; description?: Maybe; displayDataLabel?: Maybe; @@ -1671,7 +1654,7 @@ export enum JobState { export type LineChartConfiguration = { __typename?: 'LineChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; axisNameDisplay?: Maybe; color?: Maybe; description?: Maybe; @@ -2813,7 +2796,7 @@ export type NativeModelCapabilities = { export type NumberChartConfiguration = { __typename?: 'NumberChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; description?: Maybe; displayDataLabel?: Maybe; filter?: Maybe; @@ -3058,7 +3041,7 @@ export enum PermissionFlagType { export type PieChartConfiguration = { __typename?: 'PieChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; color?: Maybe; description?: Maybe; displayDataLabel?: Maybe; diff --git a/packages/twenty-front/src/generated/graphql.ts b/packages/twenty-front/src/generated/graphql.ts index 8b7231f5c5..4e2ca072f7 100644 --- a/packages/twenty-front/src/generated/graphql.ts +++ b/packages/twenty-front/src/generated/graphql.ts @@ -302,7 +302,7 @@ export enum AxisNameDisplay { export type BarChartConfiguration = { __typename?: 'BarChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; axisNameDisplay?: Maybe; color?: Maybe; description?: Maybe; @@ -1182,23 +1182,6 @@ export type ExecuteServerlessFunctionInput = { version?: Scalars['String']; }; -export enum ExtendedAggregateOperations { - AVG = 'AVG', - COUNT = 'COUNT', - COUNT_EMPTY = 'COUNT_EMPTY', - COUNT_FALSE = 'COUNT_FALSE', - COUNT_NOT_EMPTY = 'COUNT_NOT_EMPTY', - COUNT_TRUE = 'COUNT_TRUE', - COUNT_UNIQUE_VALUES = 'COUNT_UNIQUE_VALUES', - EARLIEST = 'EARLIEST', - LATEST = 'LATEST', - MAX = 'MAX', - MIN = 'MIN', - PERCENTAGE_EMPTY = 'PERCENTAGE_EMPTY', - PERCENTAGE_NOT_EMPTY = 'PERCENTAGE_NOT_EMPTY', - SUM = 'SUM' -} - export type FeatureFlag = { __typename?: 'FeatureFlag'; id: Scalars['UUID']; @@ -1381,7 +1364,7 @@ export type FullName = { export type GaugeChartConfiguration = { __typename?: 'GaugeChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; color?: Maybe; description?: Maybe; displayDataLabel?: Maybe; @@ -1628,7 +1611,7 @@ export enum JobState { export type LineChartConfiguration = { __typename?: 'LineChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; axisNameDisplay?: Maybe; color?: Maybe; description?: Maybe; @@ -2724,7 +2707,7 @@ export type NativeModelCapabilities = { export type NumberChartConfiguration = { __typename?: 'NumberChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; description?: Maybe; displayDataLabel?: Maybe; filter?: Maybe; @@ -2969,7 +2952,7 @@ export enum PermissionFlagType { export type PieChartConfiguration = { __typename?: 'PieChartConfiguration'; aggregateFieldMetadataId: Scalars['UUID']; - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; color?: Maybe; description?: Maybe; displayDataLabel?: Maybe; @@ -4635,7 +4618,7 @@ export type SearchQueryVariables = Exact<{ export type SearchQuery = { __typename?: 'Query', search: { __typename?: 'SearchResultConnection', edges: Array<{ __typename?: 'SearchResultEdge', cursor: string, node: { __typename?: 'SearchRecord', recordId: any, objectNameSingular: string, label: string, imageUrl?: string | null, tsRankCD: number, tsRank: number } }>, pageInfo: { __typename?: 'SearchResultPageInfo', hasNextPage: boolean, endCursor?: string | null } } }; -export type PageLayoutWidgetFragmentFragment = { __typename?: 'PageLayoutWidget', id: any, title: string, type: WidgetType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, pageLayoutTabId: any, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, configuration?: { __typename?: 'BarChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null } | { __typename?: 'GaugeChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'IframeConfiguration', url: string } | { __typename?: 'LineChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'NumberChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, displayDataLabel?: boolean | null, description?: string | null, filter?: any | null } | { __typename?: 'PieChartConfiguration', graphType: GraphType, groupByFieldMetadataId: any, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, groupBySubFieldName?: string | null, orderBy?: GraphOrderBy | null, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | null }; +export type PageLayoutWidgetFragmentFragment = { __typename?: 'PageLayoutWidget', id: any, title: string, type: WidgetType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, pageLayoutTabId: any, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, configuration?: { __typename?: 'BarChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null } | { __typename?: 'GaugeChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'IframeConfiguration', url: string } | { __typename?: 'LineChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'NumberChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, description?: string | null, filter?: any | null } | { __typename?: 'PieChartConfiguration', graphType: GraphType, groupByFieldMetadataId: any, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, orderBy?: GraphOrderBy | null, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | null }; export type UpdatePageLayoutWithTabsAndWidgetsMutationVariables = Exact<{ id: Scalars['String']; @@ -4643,7 +4626,7 @@ export type UpdatePageLayoutWithTabsAndWidgetsMutationVariables = Exact<{ }>; -export type UpdatePageLayoutWithTabsAndWidgetsMutation = { __typename?: 'Mutation', updatePageLayoutWithTabsAndWidgets: { __typename?: 'PageLayout', id: any, name: string, type: PageLayoutType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, tabs?: Array<{ __typename?: 'PageLayoutTab', id: any, title: string, position: number, pageLayoutId: any, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: any, title: string, type: WidgetType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, pageLayoutTabId: any, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, configuration?: { __typename?: 'BarChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null } | { __typename?: 'GaugeChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'IframeConfiguration', url: string } | { __typename?: 'LineChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'NumberChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, displayDataLabel?: boolean | null, description?: string | null, filter?: any | null } | { __typename?: 'PieChartConfiguration', graphType: GraphType, groupByFieldMetadataId: any, aggregateFieldMetadataId: any, aggregateOperation: ExtendedAggregateOperations, groupBySubFieldName?: string | null, orderBy?: GraphOrderBy | null, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | null }> | null }> | null } }; +export type UpdatePageLayoutWithTabsAndWidgetsMutation = { __typename?: 'Mutation', updatePageLayoutWithTabsAndWidgets: { __typename?: 'PageLayout', id: any, name: string, type: PageLayoutType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, tabs?: Array<{ __typename?: 'PageLayoutTab', id: any, title: string, position: number, pageLayoutId: any, createdAt: string, updatedAt: string, widgets?: Array<{ __typename?: 'PageLayoutWidget', id: any, title: string, type: WidgetType, objectMetadataId?: any | null, createdAt: string, updatedAt: string, deletedAt?: string | null, pageLayoutTabId: any, gridPosition: { __typename?: 'GridPosition', column: number, columnSpan: number, row: number, rowSpan: number }, configuration?: { __typename?: 'BarChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null, groupMode?: BarChartGroupMode | null } | { __typename?: 'GaugeChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'IframeConfiguration', url: string } | { __typename?: 'LineChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, primaryAxisGroupByFieldMetadataId: any, primaryAxisGroupBySubFieldName?: string | null, primaryAxisOrderBy?: GraphOrderBy | null, secondaryAxisGroupByFieldMetadataId?: any | null, secondaryAxisGroupBySubFieldName?: string | null, secondaryAxisOrderBy?: GraphOrderBy | null, omitNullValues?: boolean | null, axisNameDisplay?: AxisNameDisplay | null, displayDataLabel?: boolean | null, rangeMin?: number | null, rangeMax?: number | null, color?: string | null, description?: string | null, filter?: any | null } | { __typename?: 'NumberChartConfiguration', graphType: GraphType, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, displayDataLabel?: boolean | null, description?: string | null, filter?: any | null } | { __typename?: 'PieChartConfiguration', graphType: GraphType, groupByFieldMetadataId: any, aggregateFieldMetadataId: any, aggregateOperation: AggregateOperations, groupBySubFieldName?: string | null, orderBy?: GraphOrderBy | null, displayDataLabel?: boolean | null, color?: string | null, description?: string | null, filter?: any | null } | null }> | null }> | null } }; export type OnDbEventSubscriptionVariables = Exact<{ input: OnDbEventInput; diff --git a/packages/twenty-front/src/modules/command-menu/pages/page-layout/components/dropdown-content/ChartAggregateOperationSelectionDropdownContent.tsx b/packages/twenty-front/src/modules/command-menu/pages/page-layout/components/dropdown-content/ChartAggregateOperationSelectionDropdownContent.tsx index 2b6e4e3aa6..9f21c13bd2 100644 --- a/packages/twenty-front/src/modules/command-menu/pages/page-layout/components/dropdown-content/ChartAggregateOperationSelectionDropdownContent.tsx +++ b/packages/twenty-front/src/modules/command-menu/pages/page-layout/components/dropdown-content/ChartAggregateOperationSelectionDropdownContent.tsx @@ -1,11 +1,10 @@ import { usePageLayoutIdFromContextStoreTargetedRecord } from '@/command-menu/pages/page-layout/hooks/usePageLayoutFromContextStoreTargetedRecord'; import { useUpdateCurrentWidgetConfig } from '@/command-menu/pages/page-layout/hooks/useUpdateCurrentWidgetConfig'; import { useWidgetInEditMode } from '@/command-menu/pages/page-layout/hooks/useWidgetInEditMode'; -import { mapToGraphQLExtendedAggregateOperation } from '@/command-menu/pages/page-layout/utils/mapToGraphQLExtendedAggregateOperation'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { getAggregateOperationLabel } from '@/object-record/record-board/record-board-column/utils/getAggregateOperationLabel'; import { getAvailableAggregateOperationsForFieldMetadataType } from '@/object-record/record-table/record-table-footer/utils/getAvailableAggregateOperationsForFieldMetadataType'; -import { type ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; +import { convertExtendedAggregateOperationToAggregateOperation } from '@/object-record/utils/convertExtendedAggregateOperationToAggregateOperation'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader/DropdownMenuHeader'; import { DropdownMenuHeaderLeftComponent } from '@/ui/layout/dropdown/components/DropdownMenuHeader/internal/DropdownMenuHeaderLeftComponent'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; @@ -23,6 +22,7 @@ import { useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { IconChevronLeft } from 'twenty-ui/display'; import { MenuItemSelect } from 'twenty-ui/navigation'; +import { type AggregateOperations } from '~/generated/graphql'; import { filterBySearchQuery } from '~/utils/filterBySearchQuery'; export const ChartAggregateOperationSelectionDropdownContent = ({ @@ -94,13 +94,12 @@ export const ChartAggregateOperationSelectionDropdownContent = ({ } const handleSelectAggregateOperation = ( - aggregateOperation: ExtendedAggregateOperations, + aggregateOperation: AggregateOperations, ) => { updateCurrentWidgetConfig({ configToUpdate: { aggregateFieldMetadataId: currentFieldMetadataId, - aggregateOperation: - mapToGraphQLExtendedAggregateOperation(aggregateOperation), + aggregateOperation, }, }); closeDropdown(); @@ -139,18 +138,28 @@ export const ChartAggregateOperationSelectionDropdownContent = ({ key={item.operation} itemId={item.operation} onEnter={() => { - handleSelectAggregateOperation(item.operation); + handleSelectAggregateOperation( + convertExtendedAggregateOperationToAggregateOperation( + item.operation, + ), + ); }} > { - handleSelectAggregateOperation(item.operation); + handleSelectAggregateOperation( + convertExtendedAggregateOperationToAggregateOperation( + item.operation, + ), + ); }} /> diff --git a/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/__tests__/useChartSettingsValues.test.tsx b/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/__tests__/useChartSettingsValues.test.tsx index ab8309925c..107eb2f125 100644 --- a/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/__tests__/useChartSettingsValues.test.tsx +++ b/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/__tests__/useChartSettingsValues.test.tsx @@ -6,10 +6,10 @@ import { CHART_CONFIGURATION_SETTING_IDS } from '@/command-menu/pages/page-layou import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { + AggregateOperations, AxisNameDisplay, type BarChartConfiguration, BarChartGroupMode, - ExtendedAggregateOperations, FieldMetadataType, GraphOrderBy, GraphType, @@ -64,7 +64,7 @@ const buildBarChartConfiguration = ( ({ __typename: 'BarChartConfiguration', aggregateFieldMetadataId: 'field-amount', - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, graphType: GraphType.VERTICAL_BAR, primaryAxisGroupByFieldMetadataId: 'field-company-name', primaryAxisGroupBySubFieldName: null, @@ -545,7 +545,7 @@ describe('useChartSettingsValues', () => { primaryAxisGroupByFieldMetadataId: 'field-company-name', secondaryAxisGroupByFieldMetadataId: 'field-stage', aggregateFieldMetadataId: 'field-amount', - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, axisNameDisplay: AxisNameDisplay.BOTH, diff --git a/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/useGraphXSortOptionLabels.ts b/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/useGraphXSortOptionLabels.ts index 6dcce7b6f3..b0db2c50f9 100644 --- a/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/useGraphXSortOptionLabels.ts +++ b/packages/twenty-front/src/modules/command-menu/pages/page-layout/hooks/useGraphXSortOptionLabels.ts @@ -1,14 +1,12 @@ import { getFieldLabelWithSubField } from '@/command-menu/pages/page-layout/utils/getFieldLabelWithSubField'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { getAggregateOperationLabel } from '@/object-record/record-board/record-board-column/utils/getAggregateOperationLabel'; +import { type ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; import { t } from '@lingui/core/macro'; import { useRecoilValue } from 'recoil'; import { type CompositeFieldSubFieldName } from 'twenty-shared/types'; import { assertUnreachable, isDefined } from 'twenty-shared/utils'; -import { - type ExtendedAggregateOperations, - GraphOrderBy, -} from '~/generated/graphql'; +import { GraphOrderBy } from '~/generated/graphql'; export const useGraphXSortOptionLabels = ({ objectMetadataId, diff --git a/packages/twenty-front/src/modules/command-menu/pages/page-layout/utils/mapToGraphQLExtendedAggregateOperation.ts b/packages/twenty-front/src/modules/command-menu/pages/page-layout/utils/mapToGraphQLExtendedAggregateOperation.ts deleted file mode 100644 index f7cd3d91fd..0000000000 --- a/packages/twenty-front/src/modules/command-menu/pages/page-layout/utils/mapToGraphQLExtendedAggregateOperation.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { AggregateOperations } from '@/object-record/record-table/constants/AggregateOperations'; -import { DateAggregateOperations } from '@/object-record/record-table/constants/DateAggregateOperations'; -import { type ExtendedAggregateOperations as FrontendExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; -import { ExtendedAggregateOperations as GraphQLExtendedAggregateOperations } from '~/generated-metadata/graphql'; - -const AGGREGATE_OPERATION_MAPPING: Record< - FrontendExtendedAggregateOperations, - GraphQLExtendedAggregateOperations -> = { - [AggregateOperations.MIN]: GraphQLExtendedAggregateOperations.MIN, - [AggregateOperations.MAX]: GraphQLExtendedAggregateOperations.MAX, - [AggregateOperations.AVG]: GraphQLExtendedAggregateOperations.AVG, - [AggregateOperations.SUM]: GraphQLExtendedAggregateOperations.SUM, - [AggregateOperations.COUNT]: GraphQLExtendedAggregateOperations.COUNT, - [AggregateOperations.COUNT_EMPTY]: - GraphQLExtendedAggregateOperations.COUNT_EMPTY, - [AggregateOperations.COUNT_NOT_EMPTY]: - GraphQLExtendedAggregateOperations.COUNT_NOT_EMPTY, - [AggregateOperations.COUNT_UNIQUE_VALUES]: - GraphQLExtendedAggregateOperations.COUNT_UNIQUE_VALUES, - [AggregateOperations.PERCENTAGE_EMPTY]: - GraphQLExtendedAggregateOperations.PERCENTAGE_EMPTY, - [AggregateOperations.PERCENTAGE_NOT_EMPTY]: - GraphQLExtendedAggregateOperations.PERCENTAGE_NOT_EMPTY, - [AggregateOperations.COUNT_TRUE]: - GraphQLExtendedAggregateOperations.COUNT_TRUE, - [AggregateOperations.COUNT_FALSE]: - GraphQLExtendedAggregateOperations.COUNT_FALSE, - [DateAggregateOperations.EARLIEST]: - GraphQLExtendedAggregateOperations.EARLIEST, - [DateAggregateOperations.LATEST]: GraphQLExtendedAggregateOperations.LATEST, -}; - -export const mapToGraphQLExtendedAggregateOperation = ( - operation: FrontendExtendedAggregateOperations, -): GraphQLExtendedAggregateOperations => { - return AGGREGATE_OPERATION_MAPPING[operation]; -}; diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/getAggregateOperationLabel.ts b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/getAggregateOperationLabel.ts index 6af0747836..e7e96809e3 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/getAggregateOperationLabel.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-column/utils/getAggregateOperationLabel.ts @@ -3,10 +3,9 @@ import { DateAggregateOperations } from '@/object-record/record-table/constants/ import { type ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; import { t } from '@lingui/core/macro'; import { CustomError } from 'twenty-shared/utils'; -import type { ExtendedAggregateOperations as GqlExtendedAggregateOperations } from '~/generated/graphql'; export const getAggregateOperationLabel = ( - operation: ExtendedAggregateOperations | GqlExtendedAggregateOperations, + operation: ExtendedAggregateOperations, ) => { switch (operation) { case AggregateOperations.MIN: diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx index c56013fd35..97b848a6b4 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/hooks/useViewFieldAggregateOperation.tsx @@ -8,6 +8,7 @@ import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshCoreViewsByObjectMetadataId'; import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; +import { isDefined } from 'twenty-shared/utils'; export const useViewFieldAggregateOperation = () => { const { fieldMetadataId } = useContext( @@ -38,10 +39,11 @@ export const useViewFieldAggregateOperation = () => { isVisible: currentViewField.isVisible, position: currentViewField.position, size: currentViewField.size, - aggregateOperation: - convertExtendedAggregateOperationToAggregateOperation( - aggregateOperation, - ), + aggregateOperation: isDefined(aggregateOperation) + ? convertExtendedAggregateOperationToAggregateOperation( + aggregateOperation, + ) + : null, }, }, }, diff --git a/packages/twenty-front/src/modules/object-record/record-table/types/ExtendedAggregateOperations.ts b/packages/twenty-front/src/modules/object-record/record-table/types/ExtendedAggregateOperations.ts index adbada1696..6ce8d0890b 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/types/ExtendedAggregateOperations.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/types/ExtendedAggregateOperations.ts @@ -1,5 +1,5 @@ -import { type AggregateOperations } from '@/object-record/record-table/constants/AggregateOperations'; import { type DateAggregateOperations } from '@/object-record/record-table/constants/DateAggregateOperations'; +import { type AggregateOperations } from '~/generated/graphql'; export type ExtendedAggregateOperations = | AggregateOperations diff --git a/packages/twenty-front/src/modules/object-record/utils/convertExtendedAggregateOperationToAggregateOperation.ts b/packages/twenty-front/src/modules/object-record/utils/convertExtendedAggregateOperationToAggregateOperation.ts index 767d01b29d..e94fcc350f 100644 --- a/packages/twenty-front/src/modules/object-record/utils/convertExtendedAggregateOperationToAggregateOperation.ts +++ b/packages/twenty-front/src/modules/object-record/utils/convertExtendedAggregateOperationToAggregateOperation.ts @@ -4,7 +4,7 @@ import { DateAggregateOperations } from '@/object-record/record-table/constants/ import { type ExtendedAggregateOperations } from '@/object-record/record-table/types/ExtendedAggregateOperations'; export const convertExtendedAggregateOperationToAggregateOperation = ( - extendedAggregateOperation: ExtendedAggregateOperations | null, + extendedAggregateOperation: ExtendedAggregateOperations, ) => { if (extendedAggregateOperation === DateAggregateOperations.EARLIEST) { return AggregateOperations.MIN; diff --git a/packages/twenty-front/src/modules/page-layout/components/__stories__/PageLayoutRenderer.stories.tsx b/packages/twenty-front/src/modules/page-layout/components/__stories__/PageLayoutRenderer.stories.tsx index 0b610998bf..aae3ff7f1d 100644 --- a/packages/twenty-front/src/modules/page-layout/components/__stories__/PageLayoutRenderer.stories.tsx +++ b/packages/twenty-front/src/modules/page-layout/components/__stories__/PageLayoutRenderer.stories.tsx @@ -20,9 +20,9 @@ import { WidgetType, } from '~/generated-metadata/graphql'; import { + AggregateOperations, AxisNameDisplay, type BarChartConfiguration, - ExtendedAggregateOperations, PageLayoutType, type PageLayoutWidget, } from '~/generated/graphql'; @@ -90,7 +90,7 @@ const mixedGraphsPageLayoutMocks = { configuration: { __typename: 'NumberChartConfiguration', graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, }, createdAt: '2024-01-01T00:00:00Z', @@ -114,7 +114,7 @@ const mixedGraphsPageLayoutMocks = { configuration: { __typename: 'GaugeChartConfiguration', graphType: GraphType.GAUGE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, displayDataLabel: false, }, @@ -139,7 +139,7 @@ const mixedGraphsPageLayoutMocks = { configuration: { __typename: 'PieChartConfiguration', graphType: GraphType.PIE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, groupByFieldMetadataId: createdAtField.id, orderBy: GraphOrderBy.VALUE_DESC, @@ -165,7 +165,7 @@ const mixedGraphsPageLayoutMocks = { configuration: { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: nameField.id, primaryAxisGroupByFieldMetadataId: createdAtField.id, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, diff --git a/packages/twenty-front/src/modules/page-layout/hooks/__tests__/usePageLayoutDraftState.test.tsx b/packages/twenty-front/src/modules/page-layout/hooks/__tests__/usePageLayoutDraftState.test.tsx index bf9c6e96d4..d87ec46c07 100644 --- a/packages/twenty-front/src/modules/page-layout/hooks/__tests__/usePageLayoutDraftState.test.tsx +++ b/packages/twenty-front/src/modules/page-layout/hooks/__tests__/usePageLayoutDraftState.test.tsx @@ -4,10 +4,7 @@ import { GraphType, WidgetType, } from '~/generated-metadata/graphql'; -import { - ExtendedAggregateOperations, - PageLayoutType, -} from '~/generated/graphql'; +import { AggregateOperations, PageLayoutType } from '~/generated/graphql'; import { usePageLayoutDraftState } from '../usePageLayoutDraftState'; import { PAGE_LAYOUT_TEST_INSTANCE_ID, @@ -104,7 +101,7 @@ describe('usePageLayoutDraftState', () => { gridPosition: { row: 2, column: 2, rowSpan: 2, columnSpan: 2 }, configuration: { graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', primaryAxisGroupByFieldMetadataId: 'createdAt', primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, diff --git a/packages/twenty-front/src/modules/page-layout/utils/__tests__/addWidgetToTab.test.ts b/packages/twenty-front/src/modules/page-layout/utils/__tests__/addWidgetToTab.test.ts index 8d24f76f23..ddd09a4c37 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/__tests__/addWidgetToTab.test.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/__tests__/addWidgetToTab.test.ts @@ -1,6 +1,6 @@ import { GraphType, WidgetType } from '~/generated-metadata/graphql'; import { - ExtendedAggregateOperations, + AggregateOperations, type PageLayoutWidget, } from '~/generated/graphql'; import { type PageLayoutTab } from '../../types/PageLayoutTab'; @@ -15,7 +15,7 @@ describe('addWidgetToTab', () => { type: WidgetType.GRAPH, configuration: { graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', displayDataLabel: false, }, diff --git a/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertLayoutsToWidgets.test.ts b/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertLayoutsToWidgets.test.ts index 44ebfbf3d3..1b7ab3f63d 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertLayoutsToWidgets.test.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertLayoutsToWidgets.test.ts @@ -1,5 +1,5 @@ import { - ExtendedAggregateOperations, + AggregateOperations, GraphOrderBy, GraphType, WidgetType, @@ -23,7 +23,7 @@ describe('convertLayoutsToWidgets', () => { }, configuration: { graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', displayDataLabel: false, }, @@ -45,7 +45,7 @@ describe('convertLayoutsToWidgets', () => { }, configuration: { graphType: GraphType.PIE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', groupByFieldMetadataId: 'status', orderBy: GraphOrderBy.VALUE_DESC, diff --git a/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertPageLayoutToTabLayouts.test.ts b/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertPageLayoutToTabLayouts.test.ts index 01b946a188..907ecfc2c5 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertPageLayoutToTabLayouts.test.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/__tests__/convertPageLayoutToTabLayouts.test.ts @@ -1,12 +1,12 @@ import { type PageLayout } from '@/page-layout/types/PageLayout'; import { convertPageLayoutToTabLayouts } from '@/page-layout/utils/convertPageLayoutToTabLayouts'; import { - ExtendedAggregateOperations, + AggregateOperations, GraphOrderBy, GraphType, PageLayoutType, WidgetType, -} from '~/generated-metadata/graphql'; +} from '~/generated/graphql'; describe('convertPageLayoutToTabLayouts', () => { it('should convert page layout to tab layouts', () => { @@ -30,7 +30,7 @@ describe('convertPageLayoutToTabLayouts', () => { type: WidgetType.GRAPH, configuration: { graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', displayDataLabel: false, }, @@ -48,7 +48,7 @@ describe('convertPageLayoutToTabLayouts', () => { type: WidgetType.GRAPH, configuration: { graphType: GraphType.PIE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', groupByFieldMetadataId: 'status', orderBy: GraphOrderBy.VALUE_DESC, diff --git a/packages/twenty-front/src/modules/page-layout/utils/__tests__/extractFieldMetadataIdsFromWidget.test.ts b/packages/twenty-front/src/modules/page-layout/utils/__tests__/extractFieldMetadataIdsFromWidget.test.ts index 4c2b21036e..4868acda40 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/__tests__/extractFieldMetadataIdsFromWidget.test.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/__tests__/extractFieldMetadataIdsFromWidget.test.ts @@ -3,8 +3,8 @@ import { WidgetType, } from '~/generated-metadata/graphql'; import { + AggregateOperations, AxisNameDisplay, - ExtendedAggregateOperations, GraphOrderBy, GraphType, } from '~/generated/graphql'; @@ -52,7 +52,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'BarChartConfiguration' as const, graphType: GraphType.VERTICAL_BAR, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, primaryAxisGroupByFieldMetadataId: 'field-2', primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, axisNameDisplay: AxisNameDisplay.BOTH, @@ -74,7 +74,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'BarChartConfiguration' as const, graphType: GraphType.VERTICAL_BAR, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, primaryAxisGroupByFieldMetadataId: 'field-2', secondaryAxisGroupByFieldMetadataId: 'field-3', primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, @@ -98,7 +98,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'LineChartConfiguration' as const, graphType: GraphType.LINE, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, primaryAxisGroupByFieldMetadataId: 'field-2', primaryAxisOrderBy: GraphOrderBy.FIELD_DESC, axisNameDisplay: AxisNameDisplay.BOTH, @@ -120,7 +120,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'PieChartConfiguration' as const, graphType: GraphType.PIE, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, groupByFieldMetadataId: 'field-2', orderBy: GraphOrderBy.FIELD_ASC, displayDataLabel: false, @@ -141,7 +141,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'NumberChartConfiguration' as const, graphType: GraphType.NUMBER, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.AVG, + aggregateOperation: AggregateOperations.AVG, displayDataLabel: false, }, objectMetadataId: 'object-1', @@ -159,7 +159,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'GaugeChartConfiguration' as const, graphType: GraphType.GAUGE, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, displayDataLabel: false, }, objectMetadataId: 'object-1', @@ -177,7 +177,7 @@ describe('extractFieldMetadataIdsFromWidget', () => { __typename: 'BarChartConfiguration' as const, graphType: GraphType.VERTICAL_BAR, aggregateFieldMetadataId: 'field-1', - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, primaryAxisGroupByFieldMetadataId: 'field-2', secondaryAxisGroupByFieldMetadataId: undefined, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, diff --git a/packages/twenty-front/src/modules/page-layout/utils/__tests__/removeWidgetFromTab.test.ts b/packages/twenty-front/src/modules/page-layout/utils/__tests__/removeWidgetFromTab.test.ts index 31165ae0a2..8b75386970 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/__tests__/removeWidgetFromTab.test.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/__tests__/removeWidgetFromTab.test.ts @@ -1,5 +1,5 @@ import { - ExtendedAggregateOperations, + AggregateOperations, GraphOrderBy, GraphType, WidgetType, @@ -23,7 +23,7 @@ describe('removeWidgetFromTab', () => { type: WidgetType.GRAPH, configuration: { graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', displayDataLabel: false, }, @@ -41,7 +41,7 @@ describe('removeWidgetFromTab', () => { type: WidgetType.GRAPH, configuration: { graphType: GraphType.PIE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: 'id', groupByFieldMetadataId: 'status', orderBy: GraphOrderBy.VALUE_DESC, diff --git a/packages/twenty-front/src/modules/page-layout/utils/createDefaultGraphWidget.ts b/packages/twenty-front/src/modules/page-layout/utils/createDefaultGraphWidget.ts index 47d1775705..dd19c6a72d 100644 --- a/packages/twenty-front/src/modules/page-layout/utils/createDefaultGraphWidget.ts +++ b/packages/twenty-front/src/modules/page-layout/utils/createDefaultGraphWidget.ts @@ -1,12 +1,10 @@ import { assertUnreachable, isDefined } from 'twenty-shared/utils'; import { type ThemeColor } from 'twenty-ui/theme'; import { - ExtendedAggregateOperations, + AggregateOperations, + AxisNameDisplay, GraphOrderBy, GraphType, -} from '~/generated-metadata/graphql'; -import { - AxisNameDisplay, type GridPosition, type PageLayoutWidget, type WidgetConfiguration, @@ -28,7 +26,7 @@ const createDefaultGraphConfiguration = ( __typename: 'NumberChartConfiguration', graphType: GraphType.NUMBER, aggregateFieldMetadataId: fieldSelection.aggregateFieldMetadataId, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, displayDataLabel: true, }; @@ -50,7 +48,7 @@ const createDefaultGraphConfiguration = ( primaryAxisGroupByFieldMetadataId: fieldSelection.groupByFieldMetadataIdX, aggregateFieldMetadataId: fieldSelection.aggregateFieldMetadataId, - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, axisNameDisplay: AxisNameDisplay.BOTH, }; @@ -70,7 +68,7 @@ const createDefaultGraphConfiguration = ( primaryAxisGroupByFieldMetadataId: fieldSelection.groupByFieldMetadataIdX, aggregateFieldMetadataId: fieldSelection.aggregateFieldMetadataId, - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, axisNameDisplay: AxisNameDisplay.BOTH, }; diff --git a/packages/twenty-front/src/modules/page-layout/widgets/components/__stories__/WidgetRenderer.stories.tsx b/packages/twenty-front/src/modules/page-layout/widgets/components/__stories__/WidgetRenderer.stories.tsx index 5bc9df959d..83b0392df3 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/components/__stories__/WidgetRenderer.stories.tsx +++ b/packages/twenty-front/src/modules/page-layout/widgets/components/__stories__/WidgetRenderer.stories.tsx @@ -5,12 +5,12 @@ import { } from '@apollo/client'; import { type MockedResponse } from '@apollo/client/testing'; import { type Meta, type StoryObj } from '@storybook/react'; -import { type MutableSnapshot } from 'recoil'; import { MemoryRouter } from 'react-router-dom'; +import { type MutableSnapshot } from 'recoil'; +import { ApolloCoreClientContext } from '@/object-metadata/contexts/ApolloCoreClientContext'; import { isAppWaitingForFreshObjectMetadataState } from '@/object-metadata/states/isAppWaitingForFreshObjectMetadataState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { ApolloCoreClientContext } from '@/object-metadata/contexts/ApolloCoreClientContext'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { PageLayoutTestWrapper } from '@/page-layout/hooks/__tests__/PageLayoutTestWrapper'; import { WidgetRenderer } from '@/page-layout/widgets/components/WidgetRenderer'; @@ -21,8 +21,8 @@ import { WidgetType, } from '~/generated-metadata/graphql'; import { + AggregateOperations, AxisNameDisplay, - ExtendedAggregateOperations, type PageLayoutWidget, } from '~/generated/graphql'; import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; @@ -171,7 +171,7 @@ export const WithNumberChart: Story = { configuration: { __typename: 'NumberChartConfiguration', graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, displayDataLabel: true, }, @@ -206,7 +206,7 @@ export const WithGaugeChart: Story = { configuration: { __typename: 'GaugeChartConfiguration', graphType: GraphType.GAUGE, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, displayDataLabel: false, }, @@ -241,7 +241,7 @@ export const WithBarChart: Story = { configuration: { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, primaryAxisGroupByFieldMetadataId: createdAtField.id, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, @@ -279,7 +279,7 @@ export const SmallWidget: Story = { configuration: { __typename: 'NumberChartConfiguration', graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, displayDataLabel: true, }, @@ -321,7 +321,7 @@ export const MediumWidget: Story = { configuration: { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, primaryAxisGroupByFieldMetadataId: createdAtField.id, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, @@ -366,7 +366,7 @@ export const LargeWidget: Story = { configuration: { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, primaryAxisGroupByFieldMetadataId: createdAtField.id, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, @@ -411,7 +411,7 @@ export const WideWidget: Story = { configuration: { __typename: 'NumberChartConfiguration', graphType: GraphType.NUMBER, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, displayDataLabel: true, }, @@ -453,7 +453,7 @@ export const TallWidget: Story = { configuration: { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, aggregateFieldMetadataId: idField.id, primaryAxisGroupByFieldMetadataId: createdAtField.id, primaryAxisOrderBy: GraphOrderBy.FIELD_ASC, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/generateGroupByQueryVariablesFromBarChartConfiguration.test.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/generateGroupByQueryVariablesFromBarChartConfiguration.test.ts index 8a0f8b1d13..297048389c 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/generateGroupByQueryVariablesFromBarChartConfiguration.test.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/generateGroupByQueryVariablesFromBarChartConfiguration.test.ts @@ -1,7 +1,7 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { + AggregateOperations, type BarChartConfiguration, - ExtendedAggregateOperations, FieldMetadataType, GraphType, } from '~/generated-metadata/graphql'; @@ -42,7 +42,7 @@ describe('generateGroupByQueryVariablesFromBarChartConfiguration', () => { ({ __typename: 'BarChartConfiguration', aggregateFieldMetadataId: 'aggregate-field', - aggregateOperation: ExtendedAggregateOperations.COUNT, + aggregateOperation: AggregateOperations.COUNT, graphType: GraphType.VERTICAL_BAR, primaryAxisGroupByFieldMetadataId: 'field-1', ...overrides, diff --git a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts index 8db5e91f73..7ae8bbc24e 100644 --- a/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts +++ b/packages/twenty-front/src/modules/page-layout/widgets/graph/utils/__tests__/transformTwoDimensionalGroupByToBarChartData.test.ts @@ -3,7 +3,7 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataI import { type GroupByRawResult } from '@/page-layout/widgets/graph/types/GroupByRawResult'; import { FieldMetadataType } from '~/generated-metadata/graphql'; import { - ExtendedAggregateOperations, + AggregateOperations, GraphOrderBy, GraphType, type BarChartConfiguration, @@ -43,7 +43,7 @@ describe('transformTwoDimensionalGroupByToBarChartData', () => { __typename: 'BarChartConfiguration', graphType: GraphType.VERTICAL_BAR, aggregateFieldMetadataId: 'field-aggregate', - aggregateOperation: ExtendedAggregateOperations.SUM, + aggregateOperation: AggregateOperations.SUM, primaryAxisGroupByFieldMetadataId: 'field-x', secondaryAxisGroupByFieldMetadataId: 'field-y', secondaryAxisOrderBy: GraphOrderBy.FIELD_DESC, diff --git a/packages/twenty-front/src/modules/views/hooks/useUpdateViewAggregate.ts b/packages/twenty-front/src/modules/views/hooks/useUpdateViewAggregate.ts index 2976173b4c..069ea4558f 100644 --- a/packages/twenty-front/src/modules/views/hooks/useUpdateViewAggregate.ts +++ b/packages/twenty-front/src/modules/views/hooks/useUpdateViewAggregate.ts @@ -7,6 +7,7 @@ import { useRefreshCoreViewsByObjectMetadataId } from '@/views/hooks/useRefreshC import { useUpdateView } from '@/views/hooks/useUpdateView'; import { useCallback } from 'react'; import { useSetRecoilState } from 'recoil'; +import { isDefined } from 'twenty-shared/utils'; export const useUpdateViewAggregate = () => { const currentViewId = useRecoilComponentValue( @@ -31,10 +32,13 @@ export const useUpdateViewAggregate = () => { kanbanAggregateOperation: ExtendedAggregateOperations | null; objectMetadataId: string; }) => { - const convertedKanbanAggregateOperation = - convertExtendedAggregateOperationToAggregateOperation( - kanbanAggregateOperation, - ); + const convertedKanbanAggregateOperation = isDefined( + kanbanAggregateOperation, + ) + ? convertExtendedAggregateOperationToAggregateOperation( + kanbanAggregateOperation, + ) + : null; updateView({ id: currentViewId, kanbanAggregateOperationFieldMetadataId, diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant.ts deleted file mode 100644 index b8b81e390f..0000000000 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { registerEnumType } from '@nestjs/graphql'; - -import { AggregateOperations } from './aggregate-operations.constant'; - -export enum ExtendedAggregateOperations { - MIN = AggregateOperations.MIN, - MAX = AggregateOperations.MAX, - AVG = AggregateOperations.AVG, - SUM = AggregateOperations.SUM, - COUNT = AggregateOperations.COUNT, - COUNT_UNIQUE_VALUES = AggregateOperations.COUNT_UNIQUE_VALUES, - COUNT_EMPTY = AggregateOperations.COUNT_EMPTY, - COUNT_NOT_EMPTY = AggregateOperations.COUNT_NOT_EMPTY, - COUNT_TRUE = AggregateOperations.COUNT_TRUE, - COUNT_FALSE = AggregateOperations.COUNT_FALSE, - PERCENTAGE_EMPTY = AggregateOperations.PERCENTAGE_EMPTY, - PERCENTAGE_NOT_EMPTY = AggregateOperations.PERCENTAGE_NOT_EMPTY, - EARLIEST = 'EARLIEST', - LATEST = 'LATEST', -} - -registerEnumType(ExtendedAggregateOperations, { - name: 'ExtendedAggregateOperations', -}); diff --git a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/bar-chart-configuration.dto.ts b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/bar-chart-configuration.dto.ts index ac4c3f71f0..9c5d11967a 100644 --- a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/bar-chart-configuration.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/bar-chart-configuration.dto.ts @@ -15,7 +15,7 @@ import { GraphQLJSON } from 'graphql-type-json'; import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { ExtendedAggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { AxisNameDisplay } from 'src/engine/core-modules/page-layout/enums/axis-name-display.enum'; import { BarChartGroupMode } from 'src/engine/core-modules/page-layout/enums/bar-chart-group-mode.enum'; @@ -34,10 +34,10 @@ export class BarChartConfigurationDTO { @IsNotEmpty() aggregateFieldMetadataId: string; - @Field(() => ExtendedAggregateOperations) - @IsEnum(ExtendedAggregateOperations) + @Field(() => AggregateOperations) + @IsEnum(AggregateOperations) @IsNotEmpty() - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; @Field(() => UUIDScalarType) @IsUUID() diff --git a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/gauge-chart-configuration.dto.ts b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/gauge-chart-configuration.dto.ts index 5189b38f3a..6998eab488 100644 --- a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/gauge-chart-configuration.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/gauge-chart-configuration.dto.ts @@ -13,7 +13,7 @@ import { GraphQLJSON } from 'graphql-type-json'; import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { ExtendedAggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { GraphType } from 'src/engine/core-modules/page-layout/enums/graph-type.enum'; @@ -29,10 +29,10 @@ export class GaugeChartConfigurationDTO { @IsNotEmpty() aggregateFieldMetadataId: string; - @Field(() => ExtendedAggregateOperations) - @IsEnum(ExtendedAggregateOperations) + @Field(() => AggregateOperations) + @IsEnum(AggregateOperations) @IsNotEmpty() - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; @Field(() => Boolean, { nullable: true, defaultValue: false }) @IsBoolean() diff --git a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/line-chart-configuration.dto.ts b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/line-chart-configuration.dto.ts index 726aee0711..0f5ef5931d 100644 --- a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/line-chart-configuration.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/line-chart-configuration.dto.ts @@ -14,7 +14,7 @@ import { GraphQLJSON } from 'graphql-type-json'; import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { ExtendedAggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { AxisNameDisplay } from 'src/engine/core-modules/page-layout/enums/axis-name-display.enum'; import { GraphOrderBy } from 'src/engine/core-modules/page-layout/enums/graph-order-by.enum'; @@ -32,10 +32,10 @@ export class LineChartConfigurationDTO { @IsNotEmpty() aggregateFieldMetadataId: string; - @Field(() => ExtendedAggregateOperations) - @IsEnum(ExtendedAggregateOperations) + @Field(() => AggregateOperations) + @IsEnum(AggregateOperations) @IsNotEmpty() - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; @Field(() => UUIDScalarType) @IsUUID() diff --git a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/number-chart-configuration.dto.ts b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/number-chart-configuration.dto.ts index a92b55afdf..77f2cb2fd8 100644 --- a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/number-chart-configuration.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/number-chart-configuration.dto.ts @@ -13,7 +13,7 @@ import { GraphQLJSON } from 'graphql-type-json'; import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { ExtendedAggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { GraphType } from 'src/engine/core-modules/page-layout/enums/graph-type.enum'; @@ -29,10 +29,10 @@ export class NumberChartConfigurationDTO { @IsNotEmpty() aggregateFieldMetadataId: string; - @Field(() => ExtendedAggregateOperations) - @IsEnum(ExtendedAggregateOperations) + @Field(() => AggregateOperations) + @IsEnum(AggregateOperations) @IsNotEmpty() - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; @Field(() => String, { nullable: true }) @IsString() diff --git a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/pie-chart-configuration.dto.ts b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/pie-chart-configuration.dto.ts index 0359afe5fe..b7fac15339 100644 --- a/packages/twenty-server/src/engine/core-modules/page-layout/dtos/pie-chart-configuration.dto.ts +++ b/packages/twenty-server/src/engine/core-modules/page-layout/dtos/pie-chart-configuration.dto.ts @@ -13,7 +13,7 @@ import { GraphQLJSON } from 'graphql-type-json'; import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface'; -import { ExtendedAggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/extended-aggregate-operations.constant'; +import { AggregateOperations } from 'src/engine/api/graphql/graphql-query-runner/constants/aggregate-operations.constant'; import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { GraphOrderBy } from 'src/engine/core-modules/page-layout/enums/graph-order-by.enum'; import { GraphType } from 'src/engine/core-modules/page-layout/enums/graph-type.enum'; @@ -30,10 +30,10 @@ export class PieChartConfigurationDTO { @IsNotEmpty() aggregateFieldMetadataId: string; - @Field(() => ExtendedAggregateOperations) - @IsEnum(ExtendedAggregateOperations) + @Field(() => AggregateOperations) + @IsEnum(AggregateOperations) @IsNotEmpty() - aggregateOperation: ExtendedAggregateOperations; + aggregateOperation: AggregateOperations; @Field(() => UUIDScalarType) @IsUUID()