Skip to content

Commit 7ce22d5

Browse files
authored
breaking (soft) - Migrate viewGroup.fieldMetadataId -> view.mainGroupByFieldMetadataId (2/3) (#16277)
Should be merged once #16206 has been released + command run to prod In this PR - Remove usage of viewGroup.fieldMetadataId, both in BE and FE states. - But we still need to properly populate it until we fully remove viewGroup.fieldMetadataId from db and ORM entity (upcoming 3rd PR out of 3). fieldMetadataId was removed from CoreViewGroup type and CreateViewGroupInput and is determined BE-side based on the associated view's mainGroupByFieldMetadataId. **I expect this means a downtime on viewGroup creation, until both FE and BE are deployed and cache is flushed.** This seems acceptable to me as it only regards viewGroup creation. - this information is replaced by view.mainGroupByFieldMetadataID - Handle view group creation, update and deletion in the BE as a side-effect of a view creation, update or deletion. Optimistic effects are still used - Add validation at view creation or update regarding mainGroupByFieldMetadata Left to do in 3rd PR - Remove viewGroup.fieldMetadataId from db and ORM entity - Restore feature allowing to update an existing grouped view's group by field (already OK on BE side but need to rebuild FE optimistic)
1 parent 17d88a0 commit 7ce22d5

File tree

87 files changed

+1336
-1065
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+1336
-1065
lines changed

packages/twenty-front/src/generated-metadata/graphql.ts

Lines changed: 15 additions & 17 deletions
Large diffs are not rendered by default.

packages/twenty-front/src/generated/graphql.ts

Lines changed: 15 additions & 17 deletions
Large diffs are not rendered by default.

packages/twenty-front/src/modules/object-record/object-options-dropdown/hooks/useSetViewTypeFromLayoutOptionsMenu.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
4242
({
4343
id: v4(),
4444
__typename: 'ViewGroup',
45-
fieldMetadataId: randomFieldForKanban,
4645
fieldValue: option.value,
4746
isVisible: true,
4847
position: index,
@@ -55,14 +54,15 @@ export const useSetViewTypeFromLayoutOptionsMenu = () => {
5554
fieldValue: '',
5655
position: viewGroupsToCreate.length,
5756
isVisible: true,
58-
fieldMetadataId: randomFieldForKanban,
5957
} satisfies ViewGroup);
6058

6159
await createViewGroups({
62-
inputs: viewGroupsToCreate.map(({ __typename, ...viewGroup }) => ({
63-
...viewGroup,
64-
viewId: currentViewId,
65-
})),
60+
createCoreViewGroupInputs: {
61+
inputs: viewGroupsToCreate.map(({ __typename, ...viewGroup }) => ({
62+
...viewGroup,
63+
viewId: currentViewId,
64+
})),
65+
},
6666
});
6767

6868
return viewGroupsToCreate;

packages/twenty-front/src/modules/object-record/record-drag/hooks/useProcessTableWithGroupRecordDrop.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ import { originalDragSelectionComponentState } from '@/object-record/record-drag
88
import { processGroupDrop } from '@/object-record/record-drag/utils/processGroupDrop';
99
import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState';
1010
import { RECORD_INDEX_REMOVE_SORTING_MODAL_ID } from '@/object-record/record-index/constants/RecordIndexRemoveSortingModalId';
11+
import { recordIndexGroupFieldMetadataItemComponentState } from '@/object-record/record-index/states/recordIndexGroupFieldMetadataComponentState';
1112
import { recordIndexRecordIdsByGroupComponentFamilyState } from '@/object-record/record-index/states/recordIndexRecordIdsByGroupComponentFamilyState';
1213
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
1314
import { useRecordTableContextOrThrow } from '@/object-record/record-table/contexts/RecordTableContext';
1415
import { selectedRowIdsComponentSelector } from '@/object-record/record-table/states/selectors/selectedRowIdsComponentSelector';
1516
import { useModal } from '@/ui/layout/modal/hooks/useModal';
1617
import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState';
18+
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
1719
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
1820

1921
export const useProcessTableWithGroupRecordDrop = () => {
@@ -47,6 +49,10 @@ export const useProcessTableWithGroupRecordDrop = () => {
4749
originalDragSelectionComponentState,
4850
);
4951

52+
const groupFieldMetadata = useRecoilComponentValue(
53+
recordIndexGroupFieldMetadataItemComponentState,
54+
);
55+
5056
const processTableWithGroupRecordDrop = useRecoilCallback(
5157
({ snapshot }) =>
5258
(result: DropResult) => {
@@ -63,7 +69,7 @@ export const useProcessTableWithGroupRecordDrop = () => {
6369
}
6470

6571
const fieldMetadata = objectMetadataItem.fields.find(
66-
(field) => field.id === destinationRecordGroup.fieldMetadataId,
72+
(field) => field.id === groupFieldMetadata?.id,
6773
);
6874

6975
if (!isDefined(fieldMetadata)) {
@@ -110,14 +116,15 @@ export const useProcessTableWithGroupRecordDrop = () => {
110116
});
111117
},
112118
[
113-
currentRecordSortsCallbackState,
114119
objectMetadataItem.fields,
115-
recordIdsByGroupFamilyState,
116-
updateOneRow,
117-
openModal,
118-
selectedRowIdsSelector,
119120
originalDragSelectionCallbackState,
120121
isDraggingRecordCallbackState,
122+
selectedRowIdsSelector,
123+
currentRecordSortsCallbackState,
124+
recordIdsByGroupFamilyState,
125+
groupFieldMetadata?.id,
126+
openModal,
127+
updateOneRow,
121128
],
122129
);
123130

packages/twenty-front/src/modules/object-record/record-group/hooks/useRecordGroupFilter.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
import { type FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
22
import { useCurrentRecordGroupDefinition } from '@/object-record/record-group/hooks/useCurrentRecordGroupDefinition';
3+
import { recordIndexGroupFieldMetadataItemComponentState } from '@/object-record/record-index/states/recordIndexGroupFieldMetadataComponentState';
4+
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
35
import { useMemo } from 'react';
46
import { isDefined } from 'twenty-shared/utils';
57

68
export const useRecordGroupFilter = (fields: FieldMetadataItem[]) => {
79
const currentRecordGroupDefinition = useCurrentRecordGroupDefinition();
10+
const groupFieldMetadata = useRecoilComponentValue(
11+
recordIndexGroupFieldMetadataItemComponentState,
12+
);
813

914
const recordGroupFilter = useMemo(() => {
1015
if (isDefined(currentRecordGroupDefinition)) {
1116
const fieldMetadataItem = fields.find(
12-
(fieldMetadataItem) =>
13-
fieldMetadataItem.id === currentRecordGroupDefinition.fieldMetadataId,
17+
(fieldMetadataItem) => fieldMetadataItem.id === groupFieldMetadata?.id,
1418
);
1519

1620
if (!fieldMetadataItem) {
1721
throw new Error(
18-
`Field metadata item with id ${currentRecordGroupDefinition.fieldMetadataId} not found`,
22+
`Field metadata item with id ${groupFieldMetadata?.id} not found`,
1923
);
2024
}
2125

@@ -31,7 +35,7 @@ export const useRecordGroupFilter = (fields: FieldMetadataItem[]) => {
3135
}
3236

3337
return {};
34-
}, [currentRecordGroupDefinition, fields]);
38+
}, [currentRecordGroupDefinition, fields, groupFieldMetadata?.id]);
3539

3640
return { recordGroupFilter };
3741
};

packages/twenty-front/src/modules/object-record/record-group/hooks/useReorderRecordGroups.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import { useSetRecordGroups } from '@/object-record/record-group/hooks/useSetRec
33
import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState';
44
import { visibleRecordGroupIdsComponentFamilySelector } from '@/object-record/record-group/states/selectors/visibleRecordGroupIdsComponentFamilySelector';
55
import { type RecordGroupDefinition } from '@/object-record/record-group/types/RecordGroupDefinition';
6+
import { recordIndexGroupFieldMetadataItemComponentState } from '@/object-record/record-index/states/recordIndexGroupFieldMetadataComponentState';
67
import { useRecoilComponentCallbackState } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackState';
8+
import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue';
79
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
810
import { useSaveCurrentViewGroups } from '@/views/hooks/useSaveCurrentViewGroups';
911
import { type ViewType } from '@/views/types/ViewType';
@@ -37,6 +39,10 @@ export const useReorderRecordGroups = ({
3739

3840
const { saveViewGroups } = useSaveCurrentViewGroups();
3941

42+
const groupFieldMetadata = useRecoilComponentValue(
43+
recordIndexGroupFieldMetadataItemComponentState,
44+
);
45+
4046
const reorderRecordGroups = useRecoilCallback(
4147
({ snapshot }) =>
4248
({ fromIndex, toIndex }: ReorderRecordGroupsParams) => {
@@ -80,17 +86,23 @@ export const useReorderRecordGroups = ({
8086
];
8187
}, []);
8288

83-
setRecordGroups(
84-
updatedRecordGroups,
89+
if (!isDefined(groupFieldMetadata?.id)) {
90+
throw new Error('mainGroupByFieldMetadataId is required');
91+
}
92+
93+
setRecordGroups({
94+
mainGroupByFieldMetadataId: groupFieldMetadata?.id,
95+
recordGroups: updatedRecordGroups,
8596
recordIndexId,
86-
objectMetadataItem.id,
87-
);
97+
objectMetadataItemId: objectMetadataItem.id,
98+
});
8899
saveViewGroups(
89100
mapRecordGroupDefinitionsToViewGroups(updatedRecordGroups),
90101
);
91102
},
92103
[
93104
objectMetadataItem.id,
105+
groupFieldMetadata?.id,
94106
recordIndexId,
95107
saveViewGroups,
96108
setRecordGroups,

packages/twenty-front/src/modules/object-record/record-group/hooks/useSetRecordGroups.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@ import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
1616
export const useSetRecordGroups = () => {
1717
const setRecordGroups = useRecoilCallback(
1818
({ snapshot, set }) =>
19-
(
20-
recordGroups: RecordGroupDefinition[],
21-
recordIndexId: string,
22-
objectMetadataItemId: string,
23-
) => {
19+
({
20+
mainGroupByFieldMetadataId,
21+
recordGroups,
22+
recordIndexId,
23+
objectMetadataItemId,
24+
}: {
25+
mainGroupByFieldMetadataId: string;
26+
recordGroups: RecordGroupDefinition[];
27+
recordIndexId: string;
28+
objectMetadataItemId: string;
29+
}) => {
2430
const objectMetadataItems = snapshot
2531
.getLoadable(objectMetadataItemsState)
2632
.getValue();
@@ -40,7 +46,8 @@ export const useSetRecordGroups = () => {
4046
instanceId: recordIndexId,
4147
}),
4248
);
43-
const fieldMetadataId = recordGroups?.[0]?.fieldMetadataId;
49+
50+
const fieldMetadataId = mainGroupByFieldMetadataId;
4451
const fieldMetadata = fieldMetadataId
4552
? objectMetadataItem.fields.find(
4653
(field) => field.id === fieldMetadataId,
@@ -105,26 +112,34 @@ export const useSetRecordGroups = () => {
105112
);
106113

107114
const setRecordGroupsFromViewGroups = useCallback(
108-
(
109-
viewId: string,
110-
viewGroups: ViewGroup[],
111-
objectMetadataItem: ObjectMetadataItem,
112-
) => {
115+
({
116+
viewId,
117+
mainGroupByFieldMetadataId,
118+
viewGroups,
119+
objectMetadataItem,
120+
}: {
121+
viewId: string;
122+
mainGroupByFieldMetadataId: string;
123+
viewGroups: ViewGroup[];
124+
objectMetadataItem: ObjectMetadataItem;
125+
}) => {
113126
const recordIndexId = getRecordIndexIdFromObjectNamePluralAndViewId(
114127
objectMetadataItem.namePlural,
115128
viewId,
116129
);
117130

118131
const newGroupDefinitions = mapViewGroupsToRecordGroupDefinitions({
132+
mainGroupByFieldMetadataId,
119133
objectMetadataItem,
120134
viewGroups,
121135
});
122136

123-
setRecordGroups(
124-
newGroupDefinitions,
137+
setRecordGroups({
138+
mainGroupByFieldMetadataId,
139+
recordGroups: newGroupDefinitions,
125140
recordIndexId,
126-
objectMetadataItem.id,
127-
);
141+
objectMetadataItemId: objectMetadataItem.id,
142+
});
128143
},
129144
[setRecordGroups],
130145
);

packages/twenty-front/src/modules/object-record/record-group/types/RecordGroupDefinition.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export const enum RecordGroupDefinitionType {
66

77
export type RecordGroupDefinition = {
88
id: string;
9-
fieldMetadataId: string;
109
type: RecordGroupDefinitionType;
1110
title: string;
1211
value: string | null;

0 commit comments

Comments
 (0)