Skip to content

Commit 8ecf07f

Browse files
authored
[Aggregate queries for table views - #1] Introduce aggregateOperationForViewFieldState (twentyhq#9010)
Introducing aggregateOperationForViewFieldState to add a state storing the aggregate operation for each view field
1 parent b6e02b6 commit 8ecf07f

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexContainer.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetReco
2828
import { RecordIndexFiltersToContextStoreEffect } from '@/object-record/record-index/components/RecordIndexFiltersToContextStoreEffect';
2929
import { recordIndexKanbanAggregateOperationState } from '@/object-record/record-index/states/recordIndexKanbanAggregateOperationState';
3030
import { recordIndexViewFilterGroupsState } from '@/object-record/record-index/states/recordIndexViewFilterGroupsState';
31+
import { aggregateOperationForViewFieldState } from '@/object-record/record-table/record-table-footer/states/aggregateOperationForViewFieldState';
3132
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
3233
import { ViewBar } from '@/views/components/ViewBar';
3334
import { ViewField } from '@/views/types/ViewField';
@@ -118,6 +119,25 @@ export const RecordIndexContainer = () => {
118119
) {
119120
set(recordIndexFieldDefinitionsState, newFieldDefinitions);
120121
}
122+
123+
for (const viewField of viewFields) {
124+
const aggregateOperationForViewField = snapshot
125+
.getLoadable(
126+
aggregateOperationForViewFieldState({
127+
viewFieldId: viewField.id,
128+
}),
129+
)
130+
.getValue();
131+
132+
if (aggregateOperationForViewField !== viewField.aggregateOperation) {
133+
set(
134+
aggregateOperationForViewFieldState({
135+
viewFieldId: viewField.id,
136+
}),
137+
viewField.aggregateOperation,
138+
);
139+
}
140+
}
121141
},
122142
[columnDefinitions, setTableColumns],
123143
);

packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainerEffect.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import { RecordIndexRootPropsContext } from '@/object-record/record-index/contex
66
import { useHandleToggleColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleColumnFilter';
77
import { useHandleToggleColumnSort } from '@/object-record/record-index/hooks/useHandleToggleColumnSort';
88
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
9+
import { aggregateOperationForViewFieldState } from '@/object-record/record-table/record-table-footer/states/aggregateOperationForViewFieldState';
10+
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
911
import { useSetRecordCountInCurrentView } from '@/views/hooks/useSetRecordCountInCurrentView';
12+
import { ViewField } from '@/views/types/ViewField';
13+
import { useRecoilCallback } from 'recoil';
1014

1115
export const RecordIndexTableContainerEffect = () => {
1216
const { recordIndexId, objectNameSingular } = useContext(
@@ -48,6 +52,8 @@ export const RecordIndexTableContainerEffect = () => {
4852
viewBarId,
4953
});
5054

55+
const { currentViewWithSavedFiltersAndSorts } = useGetCurrentView();
56+
5157
useEffect(() => {
5258
setOnToggleColumnFilter(
5359
() => (fieldMetadataId: string) =>
@@ -68,5 +74,37 @@ export const RecordIndexTableContainerEffect = () => {
6874
);
6975
}, [setRecordCountInCurrentView, setOnEntityCountChange]);
7076

77+
const setViewFieldAggregateOperation = useRecoilCallback(
78+
({ set, snapshot }) =>
79+
(viewField: ViewField) => {
80+
const aggregateOperationForViewField = snapshot
81+
.getLoadable(
82+
aggregateOperationForViewFieldState({
83+
viewFieldId: viewField.id,
84+
}),
85+
)
86+
.getValue();
87+
88+
if (aggregateOperationForViewField !== viewField.aggregateOperation) {
89+
set(
90+
aggregateOperationForViewFieldState({
91+
viewFieldId: viewField.id,
92+
}),
93+
viewField.aggregateOperation,
94+
);
95+
}
96+
},
97+
[],
98+
);
99+
100+
useEffect(() => {
101+
currentViewWithSavedFiltersAndSorts?.viewFields.forEach((viewField) => {
102+
setViewFieldAggregateOperation(viewField);
103+
});
104+
}, [
105+
currentViewWithSavedFiltersAndSorts?.viewFields,
106+
setViewFieldAggregateOperation,
107+
]);
108+
71109
return <></>;
72110
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { AGGREGATE_OPERATIONS } from '@/object-record/record-table/constants/AggregateOperations';
2+
import { createFamilyState } from '@/ui/utilities/state/utils/createFamilyState';
3+
4+
export const aggregateOperationForViewFieldState = createFamilyState<
5+
AGGREGATE_OPERATIONS | null | undefined,
6+
{ viewFieldId: string }
7+
>({
8+
key: 'aggregateOperationForViewFieldState',
9+
defaultValue: null,
10+
});

0 commit comments

Comments
 (0)