Added parallel code path to set new record sorts state (#10345)

This PR implements a parallel code path to set record sorts without
impacting the actual sort, like we did on record filter.

We add a ViewBarRecordSortEffect which mirrors
ViewBarRecordFilterEffect.

It also adds availableFieldMetadataItemsForSortFamilySelector to replace
sortDefinitions progressively.
This commit is contained in:
Lucas Bordeau
2025-02-20 10:40:25 +01:00
committed by GitHub
parent 316876fcb5
commit 3f93aba5fc
31 changed files with 326 additions and 129 deletions

View File

@ -0,0 +1,26 @@
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { filterSortableFieldMetadataItems } from '@/object-metadata/utils/filterSortableFieldMetadataItems';
import { selectorFamily } from 'recoil';
import { isDefined } from 'twenty-shared';
export const availableFieldMetadataItemsForSortFamilySelector = selectorFamily({
key: 'availableFieldMetadataItemsForSortFamilySelector',
get:
({ objectMetadataItemId }: { objectMetadataItemId: string }) =>
({ get }) => {
const objectMetadataItems = get(objectMetadataItemsState);
const objectMetadataItem = objectMetadataItems.find(
(item) => item.id === objectMetadataItemId,
);
if (!isDefined(objectMetadataItem)) {
return [];
}
const availableFieldMetadataItemsForSort =
objectMetadataItem.fields.filter(filterSortableFieldMetadataItems);
return availableFieldMetadataItemsForSort;
},
});

View File

@ -0,0 +1,13 @@
import { SORTABLE_FIELD_METADATA_TYPES } from '@/object-metadata/constants/SortableFieldMetadataTypes';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
export const filterSortableFieldMetadataItems = (field: FieldMetadataItem) => {
const isSystemField = field.isSystem;
const isFieldActive = field.isActive;
const isFieldTypeSortable = SORTABLE_FIELD_METADATA_TYPES.includes(
field.type,
);
return !isSystemField && isFieldActive && isFieldTypeSortable;
};

View File

@ -11,14 +11,6 @@ export const getRelationObjectMetadataNameSingular = ({
return field.relationDefinition?.targetObjectMetadata.nameSingular;
};
export const getRelationObjectMetadataNamePlural = ({
field,
}: {
field: ObjectMetadataItem['fields'][0];
}): string | undefined => {
return field.relationDefinition?.targetObjectMetadata.namePlural;
};
export const getFilterTypeFromFieldType = (
fieldType: FieldMetadataType,
): FilterableFieldType => {