Set record groups when view groups are updated (#10863)

Currently we need to refresh to see view group updates.
This commit is contained in:
Thomas Trompette
2025-03-13 19:17:48 +01:00
committed by GitHub
parent dfb00f2b61
commit cb96f019d6
4 changed files with 64 additions and 37 deletions

View File

@ -1,6 +1,6 @@
import { OnDragEndResponder } from '@hello-pangea/dnd'; import { OnDragEndResponder } from '@hello-pangea/dnd';
import { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetRecordGroup'; import { useSetRecordGroups } from '@/object-record/record-group/hooks/useSetRecordGroups';
import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState'; import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState';
import { visibleRecordGroupIdsComponentFamilySelector } from '@/object-record/record-group/states/selectors/visibleRecordGroupIdsComponentFamilySelector'; import { visibleRecordGroupIdsComponentFamilySelector } from '@/object-record/record-group/states/selectors/visibleRecordGroupIdsComponentFamilySelector';
import { RecordGroupDefinition } from '@/object-record/record-group/types/RecordGroupDefinition'; import { RecordGroupDefinition } from '@/object-record/record-group/types/RecordGroupDefinition';
@ -23,7 +23,7 @@ export const useRecordGroupReorder = ({
viewBarId, viewBarId,
viewType, viewType,
}: UseRecordGroupHandlersParams) => { }: UseRecordGroupHandlersParams) => {
const setRecordGroup = useSetRecordGroup(); const { setRecordGroups } = useSetRecordGroups();
const visibleRecordGroupIdsFamilySelector = useRecoilComponentCallbackStateV2( const visibleRecordGroupIdsFamilySelector = useRecoilComponentCallbackStateV2(
visibleRecordGroupIdsComponentFamilySelector, visibleRecordGroupIdsComponentFamilySelector,
@ -78,14 +78,14 @@ export const useRecordGroupReorder = ({
]; ];
}, []); }, []);
setRecordGroup(updatedRecordGroups, viewBarId); setRecordGroups(updatedRecordGroups, viewBarId);
saveViewGroups( saveViewGroups(
mapRecordGroupDefinitionsToViewGroups(updatedRecordGroups), mapRecordGroupDefinitionsToViewGroups(updatedRecordGroups),
); );
}, },
[ [
saveViewGroups, saveViewGroups,
setRecordGroup, setRecordGroups,
viewBarId, viewBarId,
viewType, viewType,
visibleRecordGroupIdsFamilySelector, visibleRecordGroupIdsFamilySelector,

View File

@ -1,17 +1,24 @@
import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId'; import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId';
import { useContextStoreObjectMetadataItemOrThrow } from '@/context-store/hooks/useContextStoreObjectMetadataItemOrThrow';
import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState'; import { contextStoreCurrentObjectMetadataItemIdComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemIdComponentState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState'; import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/states/recordGroupDefinitionFamilyState';
import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState'; import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState';
import { recordGroupIdsComponentState } from '@/object-record/record-group/states/recordGroupIdsComponentState'; import { recordGroupIdsComponentState } from '@/object-record/record-group/states/recordGroupIdsComponentState';
import { RecordGroupDefinition } from '@/object-record/record-group/types/RecordGroupDefinition'; import { RecordGroupDefinition } from '@/object-record/record-group/types/RecordGroupDefinition';
import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId';
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
import { ViewGroup } from '@/views/types/ViewGroup';
import { mapViewGroupsToRecordGroupDefinitions } from '@/views/utils/mapViewGroupsToRecordGroupDefinitions';
import { useCallback } from 'react';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
export const useSetRecordGroup = () => { export const useSetRecordGroups = () => {
return useRecoilCallback( const { objectMetadataItem } = useContextStoreObjectMetadataItemOrThrow();
const setRecordGroups = useRecoilCallback(
({ snapshot, set }) => ({ snapshot, set }) =>
(recordGroups: RecordGroupDefinition[], recordIndexId: string) => { (recordGroups: RecordGroupDefinition[], recordIndexId: string) => {
const objectMetadataItemId = snapshot const objectMetadataItemId = snapshot
@ -104,4 +111,26 @@ export const useSetRecordGroup = () => {
}, },
[], [],
); );
const setRecordGroupsFromViewGroups = useCallback(
(viewId: string, viewGroups: ViewGroup[]) => {
const recordIndexId = getRecordIndexIdFromObjectNamePluralAndViewId(
objectMetadataItem.namePlural,
viewId,
);
const newGroupDefinitions = mapViewGroupsToRecordGroupDefinitions({
objectMetadataItem,
viewGroups,
});
setRecordGroups(newGroupDefinitions, recordIndexId);
},
[objectMetadataItem, setRecordGroups],
);
return {
setRecordGroups,
setRecordGroupsFromViewGroups,
};
}; };

View File

@ -1,5 +1,6 @@
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { useSetRecordGroups } from '@/object-record/record-group/hooks/useSetRecordGroups';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { usePersistViewGroupRecords } from '@/views/hooks/internal/usePersistViewGroupRecords'; import { usePersistViewGroupRecords } from '@/views/hooks/internal/usePersistViewGroupRecords';
import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState'; import { useGetViewFromPrefetchState } from '@/views/hooks/useGetViewFromPrefetchState';
@ -18,6 +19,8 @@ export const useHandleRecordGroupField = () => {
const { getViewFromPrefetchState } = useGetViewFromPrefetchState(); const { getViewFromPrefetchState } = useGetViewFromPrefetchState();
const { setRecordGroupsFromViewGroups } = useSetRecordGroups();
const handleRecordGroupFieldChange = useRecoilCallback( const handleRecordGroupFieldChange = useRecoilCallback(
({ snapshot }) => ({ snapshot }) =>
async (fieldMetadataItem: FieldMetadataItem) => { async (fieldMetadataItem: FieldMetadataItem) => {
@ -86,6 +89,15 @@ export const useHandleRecordGroupField = () => {
(group) => group.fieldMetadataId !== fieldMetadataItem.id, (group) => group.fieldMetadataId !== fieldMetadataItem.id,
); );
const newViewGroupsList = [
...view.viewGroups.filter(
(group) => group.fieldMetadataId === fieldMetadataItem.id,
),
...viewGroupsToCreate,
];
setRecordGroupsFromViewGroups(view.id, newViewGroupsList);
if (viewGroupsToCreate.length > 0) { if (viewGroupsToCreate.length > 0) {
await createViewGroupRecords({ viewGroupsToCreate, viewId: view.id }); await createViewGroupRecords({ viewGroupsToCreate, viewId: view.id });
} }
@ -95,10 +107,11 @@ export const useHandleRecordGroupField = () => {
} }
}, },
[ [
createViewGroupRecords,
deleteViewGroupRecords,
currentViewIdCallbackState, currentViewIdCallbackState,
getViewFromPrefetchState, getViewFromPrefetchState,
setRecordGroupsFromViewGroups,
createViewGroupRecords,
deleteViewGroupRecords,
], ],
); );

View File

@ -4,7 +4,7 @@ import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metad
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetRecordGroup'; import { useSetRecordGroups } from '@/object-record/record-group/hooks/useSetRecordGroups';
import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState'; import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState';
import { recordIndexFiltersState } from '@/object-record/record-index/states/recordIndexFiltersState'; import { recordIndexFiltersState } from '@/object-record/record-index/states/recordIndexFiltersState';
import { recordIndexIsCompactModeActiveState } from '@/object-record/record-index/states/recordIndexIsCompactModeActiveState'; import { recordIndexIsCompactModeActiveState } from '@/object-record/record-index/states/recordIndexIsCompactModeActiveState';
@ -21,15 +21,13 @@ import { tableSortsComponentState } from '@/object-record/record-table/states/ta
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
import { convertAggregateOperationToExtendedAggregateOperation } from '@/object-record/utils/convertAggregateOperationToExtendedAggregateOperation'; import { convertAggregateOperationToExtendedAggregateOperation } from '@/object-record/utils/convertAggregateOperationToExtendedAggregateOperation';
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns'; import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
import { getRecordIndexIdFromObjectNamePluralAndViewId } from '@/object-record/utils/getRecordIndexIdFromObjectNamePluralAndViewId';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { View } from '@/views/types/View'; import { View } from '@/views/types/View';
import { ViewField } from '@/views/types/ViewField'; import { ViewField } from '@/views/types/ViewField';
import { ViewGroup } from '@/views/types/ViewGroup';
import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToColumnDefinitions'; import { mapViewFieldsToColumnDefinitions } from '@/views/utils/mapViewFieldsToColumnDefinitions';
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
import { mapViewGroupsToRecordGroupDefinitions } from '@/views/utils/mapViewGroupsToRecordGroupDefinitions';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { useCallback } from 'react';
import { useRecoilCallback, useSetRecoilState } from 'recoil'; import { useRecoilCallback, useSetRecoilState } from 'recoil';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
@ -57,7 +55,7 @@ export const useLoadRecordIndexStates = () => {
const setRecordIndexViewKanbanAggregateOperationState = useSetRecoilState( const setRecordIndexViewKanbanAggregateOperationState = useSetRecoilState(
recordIndexKanbanAggregateOperationState, recordIndexKanbanAggregateOperationState,
); );
const setRecordGroup = useSetRecordGroup(); const { setRecordGroupsFromViewGroups } = useSetRecordGroups();
const { setTableColumns } = useSetTableColumns(); const { setTableColumns } = useSetTableColumns();
@ -173,26 +171,13 @@ export const useLoadRecordIndexStates = () => {
[setTableColumns], [setTableColumns],
); );
const onViewGroupsChange = useCallback(
(
viewGroups: ViewGroup[],
objectMetadataItem: ObjectMetadataItem,
recordIndexId: string,
) => {
const newGroupDefinitions = mapViewGroupsToRecordGroupDefinitions({
objectMetadataItem,
viewGroups,
});
setRecordGroup(newGroupDefinitions, recordIndexId);
},
[setRecordGroup],
);
const loadRecordIndexStates = useRecoilCallback( const loadRecordIndexStates = useRecoilCallback(
({ snapshot, set }) => ({ snapshot, set }) =>
async (view: View, objectMetadataItem: ObjectMetadataItem) => { async (view: View, objectMetadataItem: ObjectMetadataItem) => {
const recordIndexId = `${objectMetadataItem.namePlural}-${view.id}`; const recordIndexId = getRecordIndexIdFromObjectNamePluralAndViewId(
objectMetadataItem.namePlural,
view.id,
);
const filterableFieldMetadataItems = snapshot const filterableFieldMetadataItems = snapshot
.getLoadable( .getLoadable(
@ -203,7 +188,7 @@ export const useLoadRecordIndexStates = () => {
.getValue(); .getValue();
onViewFieldsChange(view.viewFields, objectMetadataItem, recordIndexId); onViewFieldsChange(view.viewFields, objectMetadataItem, recordIndexId);
onViewGroupsChange(view.viewGroups, objectMetadataItem, recordIndexId); setRecordGroupsFromViewGroups(view.id, view.viewGroups);
set( set(
tableFiltersComponentState.atomFamily({ tableFiltersComponentState.atomFamily({
@ -259,16 +244,16 @@ export const useLoadRecordIndexStates = () => {
}, },
[ [
onViewFieldsChange, onViewFieldsChange,
onViewGroupsChange, setRecordGroupsFromViewGroups,
setContextStoreTargetedRecordsRuleComponentState,
setRecordIndexFilters, setRecordIndexFilters,
setRecordIndexIsCompactModeActive,
setRecordIndexSorts,
setRecordIndexViewFilterGroups, setRecordIndexViewFilterGroups,
setRecordIndexViewKanbanAggregateOperationState, setContextStoreTargetedRecordsRuleComponentState,
setRecordIndexViewKanbanFieldMetadataIdState, setRecordIndexSorts,
setRecordIndexViewType, setRecordIndexViewType,
setRecordIndexOpenRecordIn, setRecordIndexOpenRecordIn,
setRecordIndexViewKanbanFieldMetadataIdState,
setRecordIndexViewKanbanAggregateOperationState,
setRecordIndexIsCompactModeActive,
], ],
); );