Removed sort definitions (#10368)

This PR focuses on complete removal of sort definitions.
This commit is contained in:
Lucas Bordeau
2025-02-21 16:59:38 +01:00
committed by GitHub
parent d747366bf3
commit 22203bfd3c
31 changed files with 93 additions and 324 deletions

View File

@ -63,9 +63,8 @@ describe('useColumnDefinitionsFromFieldMetadata', () => {
}, },
); );
const { columnDefinitions, sortDefinitions } = result.current; const { columnDefinitions } = result.current;
expect(columnDefinitions.length).toBe(21); expect(columnDefinitions.length).toBe(21);
expect(sortDefinitions.length).toBe(14);
}); });
}); });

View File

@ -4,9 +4,9 @@ import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefin
import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns'; import { filterAvailableTableColumns } from '@/object-record/utils/filterAvailableTableColumns';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { formatFieldMetadataItemAsColumnDefinition } from '../utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '../utils/formatFieldMetadataItemAsColumnDefinition';
import { formatFieldMetadataItemsAsSortDefinitions } from '../utils/formatFieldMetadataItemsAsSortDefinitions';
export const useColumnDefinitionsFromFieldMetadata = ( export const useColumnDefinitionsFromFieldMetadata = (
objectMetadataItem: ObjectMetadataItem, objectMetadataItem: ObjectMetadataItem,
@ -21,9 +21,11 @@ export const useColumnDefinitionsFromFieldMetadata = (
}), }),
); );
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({ const sortableFieldMetadataItems = useRecoilValue(
fields: activeFieldMetadataItems, availableFieldMetadataItemsForSortFamilySelector({
}); objectMetadataItemId: objectMetadataItem.id,
}),
);
const columnDefinitions: ColumnDefinition<FieldMetadata>[] = const columnDefinitions: ColumnDefinition<FieldMetadata>[] =
activeFieldMetadataItems activeFieldMetadataItems
@ -40,8 +42,10 @@ export const useColumnDefinitionsFromFieldMetadata = (
(fieldMetadataItem) => (fieldMetadataItem) =>
fieldMetadataItem.id === column.fieldMetadataId, fieldMetadataItem.id === column.fieldMetadataId,
); );
const existsInSortDefinitions = sortDefinitions.some(
(sort) => sort.fieldMetadataId === column.fieldMetadataId, const existsInSortDefinitions = sortableFieldMetadataItems.some(
(fieldMetadataItem) =>
fieldMetadataItem.id === column.fieldMetadataId,
); );
return { return {
...column, ...column,
@ -52,6 +56,5 @@ export const useColumnDefinitionsFromFieldMetadata = (
return { return {
columnDefinitions, columnDefinitions,
sortDefinitions,
}; };
}; };

View File

@ -1,24 +0,0 @@
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { SORTABLE_FIELD_METADATA_TYPES } from '@/object-metadata/constants/SortableFieldMetadataTypes';
import { ObjectMetadataItem } from '../types/ObjectMetadataItem';
export const formatFieldMetadataItemsAsSortDefinitions = ({
fields,
}: {
fields: Array<ObjectMetadataItem['fields'][0]>;
}): SortDefinition[] =>
fields.reduce((acc, field) => {
if (!SORTABLE_FIELD_METADATA_TYPES.includes(field.type)) {
return acc;
}
return [
...acc,
{
fieldMetadataId: field.id,
label: field.label,
iconName: field.icon ?? 'Icon123',
},
];
}, [] as SortDefinition[]);

View File

@ -1,6 +1,8 @@
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { IconChevronDown, MenuItem, useIcons } from 'twenty-ui'; import { IconChevronDown, MenuItem, useIcons } from 'twenty-ui';
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { OBJECT_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ObjectSortDropdownId'; import { OBJECT_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ObjectSortDropdownId';
import { useCloseSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useCloseSortDropdown'; import { useCloseSortDropdown } from '@/object-record/object-sort-dropdown/hooks/useCloseSortDropdown';
import { useResetRecordSortDropdownSearchInput } from '@/object-record/object-sort-dropdown/hooks/useResetRecordSortDropdownSearchInput'; import { useResetRecordSortDropdownSearchInput } from '@/object-record/object-sort-dropdown/hooks/useResetRecordSortDropdownSearchInput';
@ -10,7 +12,6 @@ import { isRecordSortDirectionDropdownMenuUnfoldedComponentState } from '@/objec
import { objectSortDropdownSearchInputComponentState } from '@/object-record/object-sort-dropdown/states/objectSortDropdownSearchInputComponentState'; import { objectSortDropdownSearchInputComponentState } from '@/object-record/object-sort-dropdown/states/objectSortDropdownSearchInputComponentState';
import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState'; import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState';
import { selectedRecordSortDirectionComponentState } from '@/object-record/object-sort-dropdown/states/selectedRecordSortDirectionComponentState'; import { selectedRecordSortDirectionComponentState } from '@/object-record/object-sort-dropdown/states/selectedRecordSortDirectionComponentState';
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
import { import {
RECORD_SORT_DIRECTIONS, RECORD_SORT_DIRECTIONS,
@ -28,8 +29,8 @@ import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { Trans, useLingui } from '@lingui/react/macro'; import { Trans, useLingui } from '@lingui/react/macro';
import { useRecoilValue } from 'recoil';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
export const StyledInput = styled.input` export const StyledInput = styled.input`
@ -89,14 +90,16 @@ export const ObjectSortDropdownButton = ({
const { resetSortDropdown } = useResetSortDropdown(); const { resetSortDropdown } = useResetSortDropdown();
const { recordIndexId } = useRecordIndexContextOrThrow(); const { recordIndexId, objectMetadataItem } = useRecordIndexContextOrThrow();
const objectSortDropdownSearchInput = useRecoilComponentValueV2( const objectSortDropdownSearchInput = useRecoilComponentValueV2(
objectSortDropdownSearchInputComponentState, objectSortDropdownSearchInputComponentState,
); );
const availableSortDefinitions = useRecoilComponentValueV2( const sortableFieldMetadataItems = useRecoilValue(
availableSortDefinitionsComponentState, availableFieldMetadataItemsForSortFamilySelector({
objectMetadataItemId: objectMetadataItem.id,
}),
); );
const { getIcon } = useIcons(); const { getIcon } = useIcons();
@ -105,40 +108,45 @@ export const ObjectSortDropdownButton = ({
visibleTableColumnsComponentSelector, visibleTableColumnsComponentSelector,
recordIndexId, recordIndexId,
); );
const visibleColumnsIds = visibleTableColumns.map( const visibleColumnsFieldMetadataIds = visibleTableColumns.map(
(column) => column.fieldMetadataId, (column) => column.fieldMetadataId,
); );
const hiddenTableColumns = useRecoilComponentValueV2( const hiddenTableColumns = useRecoilComponentValueV2(
hiddenTableColumnsComponentSelector, hiddenTableColumnsComponentSelector,
recordIndexId, recordIndexId,
); );
const hiddenColumnIds = hiddenTableColumns.map( const hiddenColumnFieldMetadataIds = hiddenTableColumns.map(
(column) => column.fieldMetadataId, (column) => column.fieldMetadataId,
); );
const filteredSearchInputSortDefinitions = availableSortDefinitions.filter( const filteredSearchInputFieldMetadataItems =
(item) => sortableFieldMetadataItems.filter((item) =>
item.label item.label
.toLocaleLowerCase() .toLocaleLowerCase()
.includes(objectSortDropdownSearchInput.toLocaleLowerCase()), .includes(objectSortDropdownSearchInput.toLocaleLowerCase()),
); );
const visibleColumnsSortDefinitions = filteredSearchInputSortDefinitions const visibleFieldMetadataItems = filteredSearchInputFieldMetadataItems
.sort((a, b) => { .sort((fieldMetadataItemA, fieldMetadataItemB) => {
return ( return (
visibleColumnsIds.indexOf(a.fieldMetadataId) - visibleColumnsFieldMetadataIds.indexOf(fieldMetadataItemA.id) -
visibleColumnsIds.indexOf(b.fieldMetadataId) visibleColumnsFieldMetadataIds.indexOf(fieldMetadataItemB.id)
); );
}) })
.filter((item) => visibleColumnsIds.includes(item.fieldMetadataId)); .filter((fieldMetadataItem) =>
visibleColumnsFieldMetadataIds.includes(fieldMetadataItem.id),
);
const hiddenColumnsSortDefinitions = filteredSearchInputSortDefinitions const hiddenFieldMetadataItems = filteredSearchInputFieldMetadataItems
.sort((a, b) => a.label.localeCompare(b.label)) .sort((fieldMetadataItemA, fieldMetadataItemB) =>
.filter((item) => hiddenColumnIds.includes(item.fieldMetadataId)); fieldMetadataItemA.label.localeCompare(fieldMetadataItemB.label),
)
.filter((fieldMetadataItem) =>
hiddenColumnFieldMetadataIds.includes(fieldMetadataItem.id),
);
const shoudShowSeparator = const shouldShowSeparator =
visibleColumnsSortDefinitions.length > 0 && visibleFieldMetadataItems.length > 0 && hiddenFieldMetadataItems.length > 0;
hiddenColumnsSortDefinitions.length > 0;
const handleButtonClick = () => { const handleButtonClick = () => {
toggleSortDropdown(); toggleSortDropdown();
@ -153,14 +161,13 @@ export const ObjectSortDropdownButton = ({
const onSortSelect = useRecoilComponentValueV2(onSortSelectComponentState); const onSortSelect = useRecoilComponentValueV2(onSortSelectComponentState);
const handleAddSort = (sortDefinition: SortDefinition) => { const handleAddSort = (fieldMetadataItem: FieldMetadataItem) => {
setObjectSortDropdownSearchInput(''); setObjectSortDropdownSearchInput('');
closeSortDropdown(); closeSortDropdown();
onSortSelect?.({ onSortSelect?.({
id: v4(), id: v4(),
fieldMetadataId: sortDefinition.fieldMetadataId, fieldMetadataId: fieldMetadataItem.id,
direction: selectedRecordSortDirection, direction: selectedRecordSortDirection,
definition: sortDefinition,
}); });
}; };
@ -231,25 +238,25 @@ export const ObjectSortDropdownButton = ({
} }
/> />
<DropdownMenuItemsContainer> <DropdownMenuItemsContainer>
{visibleColumnsSortDefinitions.map( {visibleFieldMetadataItems.map(
(visibleSortDefinition, index) => ( (visibleFieldMetadataItem, index) => (
<MenuItem <MenuItem
testId={`visible-select-sort-${index}`} testId={`visible-select-sort-${index}`}
key={index} key={index}
onClick={() => handleAddSort(visibleSortDefinition)} onClick={() => handleAddSort(visibleFieldMetadataItem)}
LeftIcon={getIcon(visibleSortDefinition.iconName)} LeftIcon={getIcon(visibleFieldMetadataItem.icon)}
text={visibleSortDefinition.label} text={visibleFieldMetadataItem.label}
/> />
), ),
)} )}
{shoudShowSeparator && <DropdownMenuSeparator />} {shouldShowSeparator && <DropdownMenuSeparator />}
{hiddenColumnsSortDefinitions.map((hiddenSortDefinition, index) => ( {hiddenFieldMetadataItems.map((hiddenFieldMetadataItem, index) => (
<MenuItem <MenuItem
testId={`hidden-select-sort-${index}`} testId={`hidden-select-sort-${index}`}
key={index} key={index}
onClick={() => handleAddSort(hiddenSortDefinition)} onClick={() => handleAddSort(hiddenFieldMetadataItem)}
LeftIcon={getIcon(hiddenSortDefinition.iconName)} LeftIcon={getIcon(hiddenFieldMetadataItem.icon)}
text={hiddenSortDefinition.label} text={hiddenFieldMetadataItem.label}
/> />
))} ))}
</DropdownMenuItemsContainer> </DropdownMenuItemsContainer>

View File

@ -1,11 +0,0 @@
import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
import { SortDefinition } from '../types/SortDefinition';
export const availableSortDefinitionsComponentState = createComponentStateV2<
SortDefinition[]
>({
key: 'availableSortDefinitionsComponentState',
defaultValue: [],
componentInstanceContext: ObjectSortDropdownComponentInstanceContext,
});

View File

@ -1,5 +0,0 @@
export type SortDefinition = {
fieldMetadataId: string;
label: string;
iconName: string;
};

View File

@ -1,15 +1,8 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy'; import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort';
const sortDefinition: SortDefinition = {
fieldMetadataId: 'id',
label: 'definition label',
iconName: 'icon',
};
const objectMetadataItem: ObjectMetadataItem = { const objectMetadataItem: ObjectMetadataItem = {
id: 'object1', id: 'object1',
fields: [], fields: [],
@ -47,7 +40,6 @@ describe('turnSortsIntoOrderBy', () => {
id: 'id', id: 'id',
fieldMetadataId: 'field1', fieldMetadataId: 'field1',
direction: 'asc', direction: 'asc',
definition: sortDefinition,
}, },
]; ];
const fields = [{ id: 'field1', name: 'field1' }] as FieldMetadataItem[]; const fields = [{ id: 'field1', name: 'field1' }] as FieldMetadataItem[];
@ -62,13 +54,11 @@ describe('turnSortsIntoOrderBy', () => {
id: 'id', id: 'id',
fieldMetadataId: 'field1', fieldMetadataId: 'field1',
direction: 'asc', direction: 'asc',
definition: sortDefinition,
}, },
{ {
id: 'id', id: 'id',
fieldMetadataId: 'field2', fieldMetadataId: 'field2',
direction: 'desc', direction: 'desc',
definition: sortDefinition,
}, },
]; ];
const fields = [ const fields = [
@ -90,7 +80,6 @@ describe('turnSortsIntoOrderBy', () => {
id: 'id', id: 'id',
fieldMetadataId: 'invalidField', fieldMetadataId: 'invalidField',
direction: 'asc', direction: 'asc',
definition: sortDefinition,
}, },
]; ];
expect(turnSortsIntoOrderBy(objectMetadataItem, sorts)).toEqual([ expect(turnSortsIntoOrderBy(objectMetadataItem, sorts)).toEqual([
@ -104,7 +93,6 @@ describe('turnSortsIntoOrderBy', () => {
id: 'id', id: 'id',
fieldMetadataId: 'invalidField', fieldMetadataId: 'invalidField',
direction: 'asc', direction: 'asc',
definition: sortDefinition,
}, },
]; ];
expect( expect(

View File

@ -4,7 +4,6 @@ import { recordGroupDefinitionFamilyState } from '@/object-record/record-group/s
import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState'; import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState';
import { recordIndexRecordIdsByGroupComponentFamilyState } from '@/object-record/record-index/states/recordIndexRecordIdsByGroupComponentFamilyState'; import { recordIndexRecordIdsByGroupComponentFamilyState } from '@/object-record/record-index/states/recordIndexRecordIdsByGroupComponentFamilyState';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { sortRecordsByPosition } from '@/object-record/utils/sortRecordsByPosition';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2'; import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
@ -49,7 +48,6 @@ export const useSetRecordIdsForColumn = (recordBoardId?: string) => {
(record) => (record) =>
record[recordGroupFieldMetadata.name] === recordGroup?.value, record[recordGroupFieldMetadata.name] === recordGroup?.value,
) )
.sort(sortRecordsByPosition)
.map((record) => record.id); .map((record) => record.id);
if (!isDeeplyEqual(existingRecordGroupRowIds, recordGroupRowIds)) { if (!isDeeplyEqual(existingRecordGroupRowIds, recordGroupRowIds)) {

View File

@ -23,27 +23,21 @@ export const RecordIndexViewBarEffect = ({
objectNameSingular, objectNameSingular,
}); });
const { columnDefinitions, sortDefinitions } = const { columnDefinitions } =
useColumnDefinitionsFromFieldMetadata(objectMetadataItem); useColumnDefinitionsFromFieldMetadata(objectMetadataItem);
const { const { setViewObjectMetadataId, setAvailableFieldDefinitions } =
setViewObjectMetadataId, useInitViewBar(viewBarId);
setAvailableSortDefinitions,
setAvailableFieldDefinitions,
} = useInitViewBar(viewBarId);
useEffect(() => { useEffect(() => {
if (isUndefinedOrNull(objectMetadataItem)) { if (isUndefinedOrNull(objectMetadataItem)) {
return; return;
} }
setViewObjectMetadataId?.(objectMetadataItem.id); setViewObjectMetadataId?.(objectMetadataItem.id);
setAvailableSortDefinitions?.(sortDefinitions);
setAvailableFieldDefinitions?.(columnDefinitions); setAvailableFieldDefinitions?.(columnDefinitions);
}, [ }, [
setViewObjectMetadataId, setViewObjectMetadataId,
objectMetadataItem, objectMetadataItem,
setAvailableSortDefinitions,
sortDefinitions,
setAvailableFieldDefinitions, setAvailableFieldDefinitions,
columnDefinitions, columnDefinitions,
]); ]);

View File

@ -8,7 +8,6 @@ import { useRecordGroupFilter } from '@/object-record/record-group/hooks/useReco
import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState'; import { tableViewFilterGroupsComponentState } from '@/object-record/record-table/states/tableViewFilterGroupsComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
export const useFindManyRecordIndexTableParams = ( export const useFindManyRecordIndexTableParams = (
@ -33,14 +32,9 @@ export const useFindManyRecordIndexTableParams = (
const { currentViewWithCombinedFiltersAndSorts } = const { currentViewWithCombinedFiltersAndSorts } =
useGetCurrentView(recordTableId); useGetCurrentView(recordTableId);
const availableSortDefinitions = useRecoilComponentValueV2(
availableSortDefinitionsComponentState,
recordTableId,
);
const viewSorts = currentViewWithCombinedFiltersAndSorts?.viewSorts ?? []; const viewSorts = currentViewWithCombinedFiltersAndSorts?.viewSorts ?? [];
const sorts = mapViewSortsToSorts(viewSorts, availableSortDefinitions); const sorts = mapViewSortsToSorts(viewSorts);
const currentRecordFilters = useRecoilComponentValueV2( const currentRecordFilters = useRecoilComponentValueV2(
currentRecordFiltersComponentState, currentRecordFiltersComponentState,

View File

@ -40,11 +40,6 @@ export const useHandleToggleColumnSort = ({
const newSort: RecordSort = { const newSort: RecordSort = {
id: v4(), id: v4(),
fieldMetadataId, fieldMetadataId,
definition: {
fieldMetadataId,
label: correspondingColumnDefinition.label,
iconName: correspondingColumnDefinition.iconName,
},
direction: 'asc', direction: 'asc',
}; };

View File

@ -14,7 +14,6 @@ import { recordIndexViewFilterGroupsState } from '@/object-record/record-index/s
import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts'; import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
@ -52,11 +51,7 @@ export const useLoadRecordIndexBoardColumn = ({
const viewsorts = currentViewWithCombinedFiltersAndSorts?.viewSorts ?? []; const viewsorts = currentViewWithCombinedFiltersAndSorts?.viewSorts ?? [];
const sortDefinitions = useRecoilComponentValueV2( const sorts = mapViewSortsToSorts(viewsorts);
availableSortDefinitionsComponentState,
);
const sorts = mapViewSortsToSorts(viewsorts, sortDefinitions);
const { filterValueDependencies } = useFilterValueDependencies(); const { filterValueDependencies } = useFilterValueDependencies();

View File

@ -1,8 +1,8 @@
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
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 { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
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 { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetRecordGroup';
import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState'; import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState';
@ -81,9 +81,13 @@ export const useLoadRecordIndexStates = () => {
) )
.getValue(); .getValue();
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({ const sortableFieldMetadataItems = snapshot
fields: activeFieldMetadataItems, .getLoadable(
}); availableFieldMetadataItemsForSortFamilySelector({
objectMetadataItemId: objectMetadataItem.id,
}),
)
.getValue();
const columnDefinitions: ColumnDefinition<FieldMetadata>[] = const columnDefinitions: ColumnDefinition<FieldMetadata>[] =
activeFieldMetadataItems activeFieldMetadataItems
@ -101,9 +105,12 @@ export const useLoadRecordIndexStates = () => {
(fieldMetadataItem) => (fieldMetadataItem) =>
fieldMetadataItem.id === column.fieldMetadataId, fieldMetadataItem.id === column.fieldMetadataId,
); );
const existsInSortDefinitions = sortDefinitions.some(
(sort) => sort.fieldMetadataId === column.fieldMetadataId, const existsInSortDefinitions = sortableFieldMetadataItems.some(
(fieldMetadataItem) =>
fieldMetadataItem.id === column.fieldMetadataId,
); );
return { return {
...column, ...column,
isFilterable: existsInFilterDefinitions, isFilterable: existsInFilterDefinitions,
@ -228,23 +235,13 @@ export const useLoadRecordIndexStates = () => {
), ),
})); }));
const activeFieldMetadataItems = objectMetadataItem.fields.filter(
({ isActive, isSystem }) => isActive && !isSystem,
);
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({
fields: activeFieldMetadataItems,
});
set( set(
tableSortsComponentState.atomFamily({ tableSortsComponentState.atomFamily({
instanceId: recordIndexId, instanceId: recordIndexId,
}), }),
mapViewSortsToSorts(view.viewSorts, sortDefinitions), mapViewSortsToSorts(view.viewSorts),
);
setRecordIndexSorts(
mapViewSortsToSorts(view.viewSorts, sortDefinitions),
); );
setRecordIndexSorts(mapViewSortsToSorts(view.viewSorts));
setRecordIndexViewType(view.type); setRecordIndexViewType(view.type);
setRecordIndexOpenRecordIn(view.openRecordIn); setRecordIndexOpenRecordIn(view.openRecordIn);
setRecordIndexViewKanbanFieldMetadataIdState( setRecordIndexViewKanbanFieldMetadataIdState(

View File

@ -1,15 +0,0 @@
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
import { useRecoilValue } from 'recoil';
export const useSortableFieldMetadataItemsInRecordIndexContext = () => {
const { objectMetadataItem } = useRecordIndexContextOrThrow();
const sortableFieldMetadataItems = useRecoilValue(
availableFieldMetadataItemsForSortFamilySelector({
objectMetadataItemId: objectMetadataItem.id,
}),
);
return { sortableFieldMetadataItems };
};

View File

@ -1,9 +1,7 @@
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { RecordSortDirection } from '@/object-record/record-sort/types/RecordSortDirection'; import { RecordSortDirection } from '@/object-record/record-sort/types/RecordSortDirection';
export type RecordSort = { export type RecordSort = {
id: string; id: string;
fieldMetadataId: string; fieldMetadataId: string;
direction: RecordSortDirection; direction: RecordSortDirection;
definition: SortDefinition;
}; };

View File

@ -7,7 +7,6 @@ import { useSetRecordIndexEntityCount } from '@/object-record/record-index/hooks
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { useSetTableColumns } from '@/object-record/record-table/hooks/useSetTableColumns'; import { useSetTableColumns } from '@/object-record/record-table/hooks/useSetTableColumns';
import { SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS } from '@/sign-in-background-mock/constants/SignInBackgroundMockColumnDefinitions'; import { SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS } from '@/sign-in-background-mock/constants/SignInBackgroundMockColumnDefinitions';
import { SIGN_IN_BACKGROUND_MOCK_SORT_DEFINITIONS } from '@/sign-in-background-mock/constants/SignInBackgroundMockSortDefinitions';
import { SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS } from '@/sign-in-background-mock/constants/SignInBackgroundMockViewFields'; import { SIGN_IN_BACKGROUND_MOCK_VIEW_FIELDS } from '@/sign-in-background-mock/constants/SignInBackgroundMockViewFields';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useInitViewBar } from '@/views/hooks/useInitViewBar'; import { useInitViewBar } from '@/views/hooks/useInitViewBar';
@ -43,18 +42,14 @@ export const SignInBackgroundMockContainerEffect = ({
objectNameSingular, objectNameSingular,
}); });
const { const { setAvailableFieldDefinitions, setViewObjectMetadataId } =
setAvailableSortDefinitions, useInitViewBar(viewId);
setAvailableFieldDefinitions,
setViewObjectMetadataId,
} = useInitViewBar(viewId);
const { setRecordIndexEntityCount } = useSetRecordIndexEntityCount(viewId); const { setRecordIndexEntityCount } = useSetRecordIndexEntityCount(viewId);
useEffect(() => { useEffect(() => {
setViewObjectMetadataId?.(objectMetadataItem.id); setViewObjectMetadataId?.(objectMetadataItem.id);
setAvailableSortDefinitions?.(SIGN_IN_BACKGROUND_MOCK_SORT_DEFINITIONS);
setAvailableFieldDefinitions?.(SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS); setAvailableFieldDefinitions?.(SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS);
setAvailableTableColumns(SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS); setAvailableTableColumns(SIGN_IN_BACKGROUND_MOCK_COLUMN_DEFINITIONS);
@ -70,7 +65,6 @@ export const SignInBackgroundMockContainerEffect = ({
setContextStoreCurrentObjectMetadataItem(objectMetadataItem); setContextStoreCurrentObjectMetadataItem(objectMetadataItem);
}, [ }, [
setViewObjectMetadataId, setViewObjectMetadataId,
setAvailableSortDefinitions,
setAvailableFieldDefinitions, setAvailableFieldDefinitions,
objectMetadataItem, objectMetadataItem,
setAvailableTableColumns, setAvailableTableColumns,

View File

@ -1,34 +0,0 @@
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
export const SIGN_IN_BACKGROUND_MOCK_SORT_DEFINITIONS = [
{
fieldMetadataId: '20202020-5e4e-4007-a630-8a2617914889',
label: 'Domain Name',
iconName: 'IconLink',
},
{
fieldMetadataId: '20202020-7fbd-41ad-b64d-25a15ff62f04',
label: 'Employees',
iconName: 'IconUsers',
},
{
fieldMetadataId: 'REPLACE_ME',
label: 'Name',
iconName: 'IconBuildingSkyscraper',
},
{
fieldMetadataId: '20202020-ad10-4117-a039-3f04b7a5f939',
label: 'Address',
iconName: 'IconMap',
},
{
fieldMetadataId: '20202020-4dc2-47c9-bb15-6e6f19ba9e46',
label: 'Creation date',
iconName: 'IconCalendar',
},
{
fieldMetadataId: '20202020-9e9f-4235-98b2-c76f3e2d281e',
label: 'ICP',
iconName: 'IconTarget',
},
] as SortDefinition[];

View File

@ -1,5 +1,6 @@
import { IconArrowDown, IconArrowUp } from 'twenty-ui'; import { IconArrowDown, IconArrowUp } from 'twenty-ui';
import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById';
import { useRemoveRecordSort } from '@/object-record/record-sort/hooks/useRemoveRecordSort'; import { useRemoveRecordSort } from '@/object-record/record-sort/hooks/useRemoveRecordSort';
import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort';
import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort';
@ -25,6 +26,10 @@ export const EditableSortChip = ({ recordSort }: EditableSortChipProps) => {
removeRecordSort(recordSort.fieldMetadataId); removeRecordSort(recordSort.fieldMetadataId);
}; };
const { fieldMetadataItem } = useFieldMetadataItemById(
recordSort.fieldMetadataId,
);
const handleClick = () => { const handleClick = () => {
const newSort: RecordSort = { const newSort: RecordSort = {
...recordSort, ...recordSort,
@ -39,7 +44,7 @@ export const EditableSortChip = ({ recordSort }: EditableSortChipProps) => {
<SortOrFilterChip <SortOrFilterChip
key={recordSort.fieldMetadataId} key={recordSort.fieldMetadataId}
testId={recordSort.fieldMetadataId} testId={recordSort.fieldMetadataId}
labelValue={recordSort.definition.label} labelValue={fieldMetadataItem.label}
Icon={recordSort.direction === 'desc' ? IconArrowDown : IconArrowUp} Icon={recordSort.direction === 'desc' ? IconArrowDown : IconArrowUp}
onRemove={handleRemoveClick} onRemove={handleRemoveClick}
onClick={handleClick} onClick={handleClick}

View File

@ -15,6 +15,7 @@ import { useViewFromQueryParams } from '@/views/hooks/internal/useViewFromQueryP
import { useCheckIsSoftDeleteFilter } from '@/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter'; import { useCheckIsSoftDeleteFilter } from '@/object-record/record-filter/hooks/useCheckIsSoftDeleteFilter';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { SoftDeleteFilterChip } from '@/views/components/SoftDeleteFilterChip'; import { SoftDeleteFilterChip } from '@/views/components/SoftDeleteFilterChip';
import { useApplyCurrentViewFiltersToCurrentRecordFilters } from '@/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters'; import { useApplyCurrentViewFiltersToCurrentRecordFilters } from '@/views/hooks/useApplyCurrentViewFiltersToCurrentRecordFilters';
import { useApplyCurrentViewSortsToCurrentRecordSorts } from '@/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts'; import { useApplyCurrentViewSortsToCurrentRecordSorts } from '@/views/hooks/useApplyCurrentViewSortsToCurrentRecordSorts';
@ -22,9 +23,8 @@ import { useAreViewFiltersDifferentFromRecordFilters } from '@/views/hooks/useAr
import { useAreViewSortsDifferentFromRecordSorts } from '@/views/hooks/useAreViewSortsDifferentFromRecordSorts'; import { useAreViewSortsDifferentFromRecordSorts } from '@/views/hooks/useAreViewSortsDifferentFromRecordSorts';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates'; import { useResetUnsavedViewStates } from '@/views/hooks/useResetUnsavedViewStates';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { isViewBarExpandedComponentState } from '@/views/states/isViewBarExpandedComponentState'; import { isViewBarExpandedComponentState } from '@/views/states/isViewBarExpandedComponentState';
import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { isNonEmptyArray } from '@sniptt/guards'; import { isNonEmptyArray } from '@sniptt/guards';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
@ -123,8 +123,8 @@ export const ViewBarDetails = ({
currentRecordFiltersComponentState, currentRecordFiltersComponentState,
); );
const availableSortDefinitions = useRecoilComponentValueV2( const currentRecordSorts = useRecoilComponentValueV2(
availableSortDefinitionsComponentState, currentRecordSortsComponentState,
); );
const { objectNameSingular } = useObjectNameSingularFromPlural({ const { objectNameSingular } = useObjectNameSingularFromPlural({
@ -206,19 +206,14 @@ export const ViewBarDetails = ({
<StyledSeperator /> <StyledSeperator />
</StyledSeperatorContainer> </StyledSeperatorContainer>
)} )}
{mapViewSortsToSorts( {currentRecordSorts.map((recordSort) => (
currentViewWithCombinedFiltersAndSorts?.viewSorts ?? [],
availableSortDefinitions,
).map((recordSort) => (
<EditableSortChip <EditableSortChip
key={recordSort.fieldMetadataId} key={recordSort.fieldMetadataId}
recordSort={recordSort} recordSort={recordSort}
/> />
))} ))}
{isNonEmptyArray(recordFilters) && {isNonEmptyArray(recordFilters) &&
isNonEmptyArray( isNonEmptyArray(currentRecordSorts) && (
currentViewWithCombinedFiltersAndSorts?.viewSorts,
) && (
<StyledSeperatorContainer> <StyledSeperatorContainer>
<StyledSeperator /> <StyledSeperator />
</StyledSeperatorContainer> </StyledSeperatorContainer>

View File

@ -1,7 +1,6 @@
import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState'; import { contextStoreCurrentObjectMetadataItemComponentState } from '@/context-store/states/contextStoreCurrentObjectMetadataItemComponentState';
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector'; import { availableFieldMetadataItemsForSortFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForSortFamilySelector';
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector';
import { useRecoilComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyStateV2'; import { useRecoilComponentFamilyStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyStateV2';
@ -59,14 +58,8 @@ export const ViewBarRecordSortEffect = () => {
return; return;
} }
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({
fields: sortableFieldMetadataItems,
});
if (isDefined(currentView)) { if (isDefined(currentView)) {
setCurrentRecordSorts( setCurrentRecordSorts(mapViewSortsToSorts(currentView.viewSorts));
mapViewSortsToSorts(currentView.viewSorts, sortDefinitions),
);
setHasInitializedCurrentRecordSorts(true); setHasInitializedCurrentRecordSorts(true);
} }
} }

View File

@ -3,47 +3,27 @@ import { useEffect } from 'react';
import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState'; import { onSortSelectComponentState } from '@/object-record/object-sort-dropdown/states/onSortSelectScopedState';
import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort'; import { useUpsertRecordSort } from '@/object-record/record-sort/hooks/useUpsertRecordSort';
import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useUpsertCombinedViewSorts } from '@/views/hooks/useUpsertCombinedViewSorts'; import { useUpsertCombinedViewSorts } from '@/views/hooks/useUpsertCombinedViewSorts';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
export const ViewBarSortEffect = () => { export const ViewBarSortEffect = () => {
const { upsertCombinedViewSort } = useUpsertCombinedViewSorts(); const { upsertCombinedViewSort } = useUpsertCombinedViewSorts();
// TDOO: verify this instance id works
const availableSortDefinitions = useRecoilComponentValueV2(
availableSortDefinitionsComponentState,
);
const { upsertRecordSort } = useUpsertRecordSort(); const { upsertRecordSort } = useUpsertRecordSort();
const setOnSortSelect = useSetRecoilComponentStateV2( const setOnSortSelect = useSetRecoilComponentStateV2(
onSortSelectComponentState, onSortSelectComponentState,
); );
// TDOO: verify this instance id works
const setAvailableSortDefinitionsInSortDropdown =
useSetRecoilComponentStateV2(availableSortDefinitionsComponentState);
useEffect(() => { useEffect(() => {
if (isDefined(availableSortDefinitions)) {
setAvailableSortDefinitionsInSortDropdown(availableSortDefinitions);
}
setOnSortSelect(() => (sort: RecordSort | null) => { setOnSortSelect(() => (sort: RecordSort | null) => {
if (isDefined(sort)) { if (isDefined(sort)) {
upsertCombinedViewSort(sort); upsertCombinedViewSort(sort);
upsertRecordSort(sort); upsertRecordSort(sort);
} }
}); });
}, [ }, [setOnSortSelect, upsertCombinedViewSort, upsertRecordSort]);
availableSortDefinitions,
setAvailableSortDefinitionsInSortDropdown,
setOnSortSelect,
upsertCombinedViewSort,
upsertRecordSort,
]);
return <></>; return <></>;
}; };

View File

@ -96,11 +96,6 @@ describe('useApplyCurrentViewSortsToCurrentRecordSorts', () => {
id: mockViewSort.id, id: mockViewSort.id,
fieldMetadataId: mockViewSort.fieldMetadataId, fieldMetadataId: mockViewSort.fieldMetadataId,
direction: mockViewSort.direction, direction: mockViewSort.direction,
definition: {
fieldMetadataId: mockViewSort.fieldMetadataId,
iconName: mockFieldMetadataItem.icon ?? '',
label: mockFieldMetadataItem.label,
},
} satisfies RecordSort, } satisfies RecordSort,
]); ]);
}); });

View File

@ -70,11 +70,6 @@ describe('useApplyViewSortsToCurrentRecordSorts', () => {
id: mockViewSort.id, id: mockViewSort.id,
fieldMetadataId: mockViewSort.fieldMetadataId, fieldMetadataId: mockViewSort.fieldMetadataId,
direction: mockViewSort.direction, direction: mockViewSort.direction,
definition: {
fieldMetadataId: mockViewSort.fieldMetadataId,
label: mockFieldMetadataItem.label,
iconName: mockFieldMetadataItem.icon ?? '',
},
} satisfies RecordSort, } satisfies RecordSort,
]); ]);
}); });

View File

@ -1,6 +1,4 @@
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
import { useSortableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-sort/hooks/useSortableFieldMetadataItemsInRecordIndexContext';
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector'; import { prefetchViewFromViewIdFamilySelector } from '@/prefetch/states/selector/prefetchViewFromViewIdFamilySelector';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -25,18 +23,9 @@ export const useApplyCurrentViewSortsToCurrentRecordSorts = () => {
currentRecordSortsComponentState, currentRecordSortsComponentState,
); );
const { sortableFieldMetadataItems } =
useSortableFieldMetadataItemsInRecordIndexContext();
const applyCurrentViewSortsToCurrentRecordSorts = () => { const applyCurrentViewSortsToCurrentRecordSorts = () => {
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({
fields: sortableFieldMetadataItems,
});
if (isDefined(currentView)) { if (isDefined(currentView)) {
setCurrentRecordSorts( setCurrentRecordSorts(mapViewSortsToSorts(currentView.viewSorts));
mapViewSortsToSorts(currentView.viewSorts, sortDefinitions),
);
} }
}; };

View File

@ -1,5 +1,3 @@
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
import { useSortableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-sort/hooks/useSortableFieldMetadataItemsInRecordIndexContext';
import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState'; import { currentRecordSortsComponentState } from '@/object-record/record-sort/states/currentRecordSortsComponentState';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { ViewSort } from '@/views/types/ViewSort'; import { ViewSort } from '@/views/types/ViewSort';
@ -10,15 +8,8 @@ export const useApplyViewSortsToCurrentRecordSorts = () => {
currentRecordSortsComponentState, currentRecordSortsComponentState,
); );
const { sortableFieldMetadataItems } =
useSortableFieldMetadataItemsInRecordIndexContext();
const applyViewSortsToCurrentRecordSorts = (viewSorts: ViewSort[]) => { const applyViewSortsToCurrentRecordSorts = (viewSorts: ViewSort[]) => {
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({ const recordSortsToApply = mapViewSortsToSorts(viewSorts);
fields: sortableFieldMetadataItems,
});
const recordSortsToApply = mapViewSortsToSorts(viewSorts, sortDefinitions);
setCurrentRecordSorts(recordSortsToApply); setCurrentRecordSorts(recordSortsToApply);
}; };

View File

@ -1,6 +1,5 @@
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { availableFieldDefinitionsComponentState } from '@/views/states/availableFieldDefinitionsComponentState'; import { availableFieldDefinitionsComponentState } from '@/views/states/availableFieldDefinitionsComponentState';
import { availableSortDefinitionsComponentState } from '@/views/states/availableSortDefinitionsComponentState';
import { viewObjectMetadataIdComponentState } from '@/views/states/viewObjectMetadataIdComponentState'; import { viewObjectMetadataIdComponentState } from '@/views/states/viewObjectMetadataIdComponentState';
export const useInitViewBar = (viewBarInstanceId?: string) => { export const useInitViewBar = (viewBarInstanceId?: string) => {
@ -9,11 +8,6 @@ export const useInitViewBar = (viewBarInstanceId?: string) => {
viewBarInstanceId, viewBarInstanceId,
); );
const setAvailableSortDefinitions = useSetRecoilComponentStateV2(
availableSortDefinitionsComponentState,
viewBarInstanceId,
);
const setViewObjectMetadataId = useSetRecoilComponentStateV2( const setViewObjectMetadataId = useSetRecoilComponentStateV2(
viewObjectMetadataIdComponentState, viewObjectMetadataIdComponentState,
viewBarInstanceId, viewBarInstanceId,
@ -21,7 +15,6 @@ export const useInitViewBar = (viewBarInstanceId?: string) => {
return { return {
setAvailableFieldDefinitions, setAvailableFieldDefinitions,
setAvailableSortDefinitions,
setViewObjectMetadataId, setViewObjectMetadataId,
}; };
}; };

View File

@ -1,5 +1,4 @@
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback } from 'recoil';
import { v4 } from 'uuid';
import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState';
import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort';
@ -103,7 +102,6 @@ export const useUpsertCombinedViewSorts = (viewBarComponentId?: string) => {
...unsavedToUpsertViewSorts, ...unsavedToUpsertViewSorts,
{ {
...upsertedSort, ...upsertedSort,
id: v4(),
__typename: 'ViewSort', __typename: 'ViewSort',
} satisfies ViewSort, } satisfies ViewSort,
]); ]);

View File

@ -1,11 +0,0 @@
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
export const availableSortDefinitionsComponentState = createComponentStateV2<
SortDefinition[]
>({
key: 'availableSortDefinitionsComponentState',
defaultValue: [],
componentInstanceContext: ViewComponentInstanceContext,
});

View File

@ -13,13 +13,6 @@ import { mapViewSortsToSorts } from '@/views/utils/mapViewSortsToSorts';
import { FieldMetadataType } from '~/generated/graphql'; import { FieldMetadataType } from '~/generated/graphql';
const baseDefinition = {
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',
label: 'label',
iconName: 'iconName',
fieldName: 'fieldName',
};
const baseFieldMetadataItem = { const baseFieldMetadataItem = {
id: '05731f68-6e7a-4903-8374-c0b6a9063482', id: '05731f68-6e7a-4903-8374-c0b6a9063482',
createdAt: '2021-01-01', createdAt: '2021-01-01',
@ -44,12 +37,9 @@ describe('mapViewSortsToSorts', () => {
id: 'id', id: 'id',
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482', fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',
direction: 'asc', direction: 'asc',
definition: baseDefinition,
}, },
]; ];
expect(mapViewSortsToSorts(viewSorts, [baseDefinition])).toEqual( expect(mapViewSortsToSorts(viewSorts)).toEqual(expectedSorts);
expectedSorts,
);
}); });
}); });

View File

@ -1,7 +1,6 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy'; import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies'; import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
@ -31,10 +30,6 @@ export const getQueryVariablesFromView = ({
const { viewFilterGroups, viewFilters, viewSorts } = view; const { viewFilterGroups, viewFilters, viewSorts } = view;
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({
fields: fieldMetadataItems,
});
const filter = computeViewRecordGqlOperationFilter( const filter = computeViewRecordGqlOperationFilter(
filterValueDependencies, filterValueDependencies,
mapViewFiltersToFilters(viewFilters, fieldMetadataItems), mapViewFiltersToFilters(viewFilters, fieldMetadataItems),
@ -44,7 +39,7 @@ export const getQueryVariablesFromView = ({
const orderBy = turnSortsIntoOrderBy( const orderBy = turnSortsIntoOrderBy(
objectMetadataItem, objectMetadataItem,
mapViewSortsToSorts(viewSorts, sortDefinitions), mapViewSortsToSorts(viewSorts),
); );
return { return {

View File

@ -1,27 +1,15 @@
import { SortDefinition } from '@/object-record/object-sort-dropdown/types/SortDefinition';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { RecordSort } from '@/object-record/record-sort/types/RecordSort'; import { RecordSort } from '@/object-record/record-sort/types/RecordSort';
import { ViewSort } from '../types/ViewSort'; import { ViewSort } from '../types/ViewSort';
export const mapViewSortsToSorts = ( export const mapViewSortsToSorts = (viewSorts: ViewSort[]): RecordSort[] => {
viewSorts: ViewSort[],
availableSortDefinitions: SortDefinition[],
): RecordSort[] => {
return viewSorts return viewSorts
.map((viewSort) => { .map((viewSort) => {
const availableSortDefinition = availableSortDefinitions.find(
(sortDefinition) =>
sortDefinition.fieldMetadataId === viewSort.fieldMetadataId,
);
if (!availableSortDefinition) return null;
return { return {
id: viewSort.id, id: viewSort.id,
fieldMetadataId: viewSort.fieldMetadataId, fieldMetadataId: viewSort.fieldMetadataId,
direction: viewSort.direction, direction: viewSort.direction,
definition: availableSortDefinition,
}; };
}) })
.filter(isDefined); .filter(isDefined);