Remove filter definition (#10227)

This PR removes completely filter definition usage and states,
everything is now derived from fieldMetadataItem.
This commit is contained in:
Lucas Bordeau
2025-02-14 18:37:34 +01:00
committed by GitHub
parent 68db9a7a8c
commit 70e5cdfe83
51 changed files with 250 additions and 766 deletions

View File

@ -6,7 +6,8 @@ process.env.TZ = 'GMT';
process.env.LC_ALL = 'en_US.UTF-8'; process.env.LC_ALL = 'en_US.UTF-8';
const jestConfig: JestConfigWithTsJest = { const jestConfig: JestConfigWithTsJest = {
// to enable logs, comment out the following line // to enable logs, comment out the following line
silent: false, silent: true,
verbose: false,
// For more information please have a look to official docs https://jestjs.io/docs/configuration/#prettierpath-string // For more information please have a look to official docs https://jestjs.io/docs/configuration/#prettierpath-string
// Prettier v3 will should be supported in jest v30 https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.1 // Prettier v3 will should be supported in jest v30 https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.1
prettierPath: null, prettierPath: null,

View File

@ -90,12 +90,8 @@ describe('useDestroyMultipleRecordsAction', () => {
value: '', value: '',
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { type: 'DATE_TIME',
label: 'Deleted', label: 'Deleted',
iconName: 'IconTrash',
fieldMetadataId: personMockObjectMetadataItemDeletedAtField.id,
type: 'DATE_TIME',
},
}, },
], ],
}), }),

View File

@ -52,14 +52,8 @@ describe('computeContextStoreFilters', () => {
displayValue: 'John', displayValue: 'John',
displayAvatarUrl: undefined, displayAvatarUrl: undefined,
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
definition: { type: 'TEXT',
fieldMetadataId: personObjectMetadataItem.fields.find( label: 'Name',
(field) => field.name === 'name',
)!.id,
label: 'Name',
iconName: 'person',
type: 'TEXT',
},
}, },
]; ];

View File

@ -1,69 +1,8 @@
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import {
FieldMetadataType,
RelationDefinitionType,
} from '~/generated-metadata/graphql';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType'; import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { ObjectMetadataItem } from '../types/ObjectMetadataItem'; import { ObjectMetadataItem } from '../types/ObjectMetadataItem';
export const formatFieldMetadataItemsAsFilterDefinitions = ({
fields,
isJsonFilterEnabled,
}: {
fields: Array<ObjectMetadataItem['fields'][0]>;
isJsonFilterEnabled: boolean;
}): RecordFilterDefinition[] => {
return fields.reduce((acc, field) => {
if (
field.type === FieldMetadataType.RELATION &&
field.relationDefinition?.direction !==
RelationDefinitionType.MANY_TO_ONE &&
field.relationDefinition?.direction !== RelationDefinitionType.ONE_TO_ONE
) {
return acc;
}
if (
![
FieldMetadataType.BOOLEAN,
FieldMetadataType.DATE_TIME,
FieldMetadataType.DATE,
FieldMetadataType.TEXT,
FieldMetadataType.EMAILS,
FieldMetadataType.NUMBER,
FieldMetadataType.LINKS,
FieldMetadataType.FULL_NAME,
FieldMetadataType.ADDRESS,
FieldMetadataType.RELATION,
FieldMetadataType.SELECT,
FieldMetadataType.MULTI_SELECT,
FieldMetadataType.CURRENCY,
FieldMetadataType.RATING,
FieldMetadataType.ACTOR,
FieldMetadataType.PHONES,
FieldMetadataType.ARRAY,
...(isJsonFilterEnabled ? [FieldMetadataType.RAW_JSON] : []),
].includes(field.type)
) {
return acc;
}
return [...acc, formatFieldMetadataItemAsFilterDefinition({ field })];
}, [] as RecordFilterDefinition[]);
};
export const formatFieldMetadataItemAsFilterDefinition = ({
field,
}: {
field: ObjectMetadataItem['fields'][0];
}): RecordFilterDefinition => ({
fieldMetadataId: field.id,
label: field.label,
iconName: field.icon ?? 'Icon123',
type: getFilterTypeFromFieldType(field.type),
});
export const getRelationObjectMetadataNameSingular = ({ export const getRelationObjectMetadataNameSingular = ({
field, field,
}: { }: {

View File

@ -1,9 +1,6 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup'; import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
@ -85,10 +82,6 @@ export const AdvancedFilterAddFilterRuleSelect = ({
const defaultFieldMetadataItem = getDefaultFieldMetadataItem(); const defaultFieldMetadataItem = getDefaultFieldMetadataItem();
const defaultFilterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: defaultFieldMetadataItem,
});
const filterType = getFilterTypeFromFieldType( const filterType = getFilterTypeFromFieldType(
defaultFieldMetadataItem.type, defaultFieldMetadataItem.type,
); );
@ -100,11 +93,11 @@ export const AdvancedFilterAddFilterRuleSelect = ({
operand: getRecordFilterOperands({ operand: getRecordFilterOperands({
filterType, filterType,
})[0], })[0],
definition: defaultFilterDefinition,
value: '', value: '',
displayValue: '', displayValue: '',
viewFilterGroupId: viewFilterGroup.id, viewFilterGroupId: viewFilterGroup.id,
positionInViewFilterGroup: newPositionInViewFilterGroup, positionInViewFilterGroup: newPositionInViewFilterGroup,
label: defaultFieldMetadataItem.label,
}); });
}; };
@ -127,10 +120,6 @@ export const AdvancedFilterAddFilterRuleSelect = ({
const defaultFieldMetadataItem = getDefaultFieldMetadataItem(); const defaultFieldMetadataItem = getDefaultFieldMetadataItem();
const defaultFilterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: defaultFieldMetadataItem,
});
const filterType = getFilterTypeFromFieldType( const filterType = getFilterTypeFromFieldType(
defaultFieldMetadataItem.type, defaultFieldMetadataItem.type,
); );
@ -142,11 +131,11 @@ export const AdvancedFilterAddFilterRuleSelect = ({
operand: getRecordFilterOperands({ operand: getRecordFilterOperands({
filterType, filterType,
})[0], })[0],
definition: defaultFilterDefinition,
value: '', value: '',
displayValue: '', displayValue: '',
viewFilterGroupId: newViewFilterGroup.id, viewFilterGroupId: newViewFilterGroup.id,
positionInViewFilterGroup: newPositionInViewFilterGroup, positionInViewFilterGroup: newPositionInViewFilterGroup,
label: defaultFieldMetadataItem.label,
}); });
}; };

View File

@ -1,7 +1,6 @@
import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter'; import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter';
import { ObjectFilterDropdownFilterInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInput'; import { ObjectFilterDropdownFilterInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterInput';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { SelectControl } from '@/ui/input/components/SelectControl'; import { SelectControl } from '@/ui/input/components/SelectControl';
@ -23,10 +22,6 @@ export const AdvancedFilterViewFilterValueInput = ({
const isDisabled = !filter?.fieldMetadataId || !filter.operand; const isDisabled = !filter?.fieldMetadataId || !filter.operand;
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
);
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
); );
@ -64,7 +59,6 @@ export const AdvancedFilterViewFilterValueInput = ({
} }
onOpen={() => { onOpen={() => {
setFieldMetadataItemIdUsedInDropdown(filter.fieldMetadataId); setFieldMetadataItemIdUsedInDropdown(filter.fieldMetadataId);
setFilterDefinitionUsedInDropdown(filter.definition);
setSelectedOperandInDropdown(filter.operand); setSelectedOperandInDropdown(filter.operand);
setSelectedFilter(filter); setSelectedFilter(filter);
}} }}

View File

@ -1,4 +1,4 @@
import { useFilterDefinitionsFromFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterDefinitionsFromFilterableFieldMetadataItems'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters'; import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
@ -7,8 +7,8 @@ export const useCurrentViewFilter = ({
}: { }: {
viewFilterId?: string; viewFilterId?: string;
}) => { }) => {
const { filterDefinitions } = const { filterableFieldMetadataItems } =
useFilterDefinitionsFromFilterableFieldMetadataItems(); useFilterableFieldMetadataItemsInRecordIndexContext();
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
@ -20,7 +20,10 @@ export const useCurrentViewFilter = ({
return undefined; return undefined;
} }
const [filter] = mapViewFiltersToFilters([viewFilter], filterDefinitions); const [filter] = mapViewFiltersToFilters(
[viewFilter],
filterableFieldMetadataItems,
);
return filter; return filter;
}; };

View File

@ -1,9 +1,6 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById'; import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup'; import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
@ -110,10 +107,6 @@ export const AdvancedFilterButton = () => {
throw new Error('Missing default filter definition'); throw new Error('Missing default filter definition');
} }
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: defaultFieldMetadataItem,
});
const filterType = getFilterTypeFromFieldType( const filterType = getFilterTypeFromFieldType(
defaultFieldMetadataItem.type, defaultFieldMetadataItem.type,
); );
@ -126,10 +119,11 @@ export const AdvancedFilterButton = () => {
id: v4(), id: v4(),
fieldMetadataId: defaultFieldMetadataItem.id, fieldMetadataId: defaultFieldMetadataItem.id,
operand: firstOperand, operand: firstOperand,
definition: filterDefinition,
value: '', value: '',
displayValue: '', displayValue: '',
viewFilterGroupId: newViewFilterGroup.id, viewFilterGroupId: newViewFilterGroup.id,
type: getFilterTypeFromFieldType(defaultFieldMetadataItem.type),
label: defaultFieldMetadataItem.label,
}); });
} }

View File

@ -3,7 +3,7 @@ import styled from '@emotion/styled';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
@ -72,18 +72,15 @@ export const ObjectFilterDropdownBooleanSelect = () => {
return; return;
} }
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ?? v4(), id: selectedFilter?.id ?? v4(),
definition: filterDefinition,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: value ? 'True' : 'False', displayValue: value ? 'True' : 'False',
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: value.toString(), value: value.toString(),
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
}); });
setSelectedValue(value); setSelectedValue(value);

View File

@ -1,6 +1,6 @@
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
@ -49,13 +49,8 @@ export const ObjectFilterDropdownDateInput = () => {
if (!fieldMetadataItemUsedInDropdown || !selectedOperandInDropdown) return; if (!fieldMetadataItemUsedInDropdown || !selectedOperandInDropdown) return;
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ? selectedFilter.id : v4(), id: selectedFilter?.id ? selectedFilter.id : v4(),
definition: filterDefinition,
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: newDate?.toISOString() ?? '', value: newDate?.toISOString() ?? '',
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
@ -65,6 +60,8 @@ export const ObjectFilterDropdownDateInput = () => {
: newDate.toLocaleDateString() : newDate.toLocaleDateString()
: '', : '',
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
}); });
}; };
@ -77,10 +74,6 @@ export const ObjectFilterDropdownDateInput = () => {
) => { ) => {
if (!fieldMetadataItemUsedInDropdown || !selectedOperandInDropdown) return; if (!fieldMetadataItemUsedInDropdown || !selectedOperandInDropdown) return;
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
const value = relativeDate const value = relativeDate
? computeVariableDateViewFilterValue( ? computeVariableDateViewFilterValue(
relativeDate.direction, relativeDate.direction,
@ -95,8 +88,9 @@ export const ObjectFilterDropdownDateInput = () => {
value, value,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: getRelativeDateDisplayValue(relativeDate), displayValue: getRelativeDateDisplayValue(relativeDate),
definition: filterDefinition,
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
}); });
}; };

View File

@ -6,7 +6,7 @@ import { useAdvancedFilterDropdown } from '@/object-record/advanced-filter/hooks
import { AdvancedFilterButton } from '@/object-record/object-filter-dropdown/components/AdvancedFilterButton'; import { AdvancedFilterButton } from '@/object-record/object-filter-dropdown/components/AdvancedFilterButton';
import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem'; import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId'; import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
@ -23,7 +23,7 @@ import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { FeatureFlagKey } from '~/generated/graphql'; import { FeatureFlagKey } from '~/generated/graphql';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { useSelectFilterUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope'; import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
@ -124,8 +124,7 @@ export const ObjectFilterDropdownFilterSelect = ({
(fieldMetadataItem) => fieldMetadataItem.id, (fieldMetadataItem) => fieldMetadataItem.id,
); );
const { selectFilterDefinitionUsedInDropdown } = const { selectFilterUsedInDropdown } = useSelectFilterUsedInDropdown();
useSelectFilterDefinitionUsedInDropdown();
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
@ -144,12 +143,8 @@ export const ObjectFilterDropdownFilterSelect = ({
resetSelectedItem(); resetSelectedItem();
const selectedFilterDefinition = formatFieldMetadataItemAsFilterDefinition({ selectFilterUsedInDropdown({
field: selectedFieldMetadataItem, fieldMetadataItemId,
});
selectFilterDefinitionUsedInDropdown({
filterDefinition: selectedFilterDefinition,
}); });
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItemId); setFieldMetadataItemIdUsedInDropdown(fieldMetadataItemId);

View File

@ -5,9 +5,7 @@ import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/o
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
import { objectFilterDropdownFirstLevelFilterDefinitionComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState';
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState'; import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState'; import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
@ -17,7 +15,6 @@ import { getCompositeSubFieldLabel } from '@/object-record/object-filter-dropdow
import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel'; import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue'; import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter'; import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs'; import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs';
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader'; import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
@ -34,13 +31,6 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
const { getIcon } = useIcons(); const { getIcon } = useIcons();
const [
objectFilterDropdownFirstLevelFilterDefinition,
setObjectFilterDropdownFirstLevelFilterDefinition,
] = useRecoilComponentStateV2(
objectFilterDropdownFirstLevelFilterDefinitionComponentState,
);
const fieldMetadataItemUsedInDropdown = useRecoilComponentValueV2( const fieldMetadataItemUsedInDropdown = useRecoilComponentValueV2(
fieldMetadataItemUsedInDropdownComponentSelector, fieldMetadataItemUsedInDropdownComponentSelector,
); );
@ -65,10 +55,6 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
objectFilterDropdownSubMenuFieldTypeComponentState, objectFilterDropdownSubMenuFieldTypeComponentState,
); );
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
);
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
); );
@ -100,14 +86,6 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
subFieldName?: string | null | undefined, subFieldName?: string | null | undefined,
) => { ) => {
if (isDefined(fieldMetadataItem)) { if (isDefined(fieldMetadataItem)) {
const filterDefinition: RecordFilterDefinition = {
fieldMetadataId: fieldMetadataItem.id,
type: getFilterTypeFromFieldType(fieldMetadataItem.type),
label: fieldMetadataItem.label,
iconName: fieldMetadataItem.icon ?? '',
compositeFieldName: subFieldName ?? undefined,
};
if ( if (
isDefined(advancedFilterViewFilterId) && isDefined(advancedFilterViewFilterId) &&
isDefined(advancedFilterViewFilterGroupId) isDefined(advancedFilterViewFilterGroupId)
@ -129,13 +107,13 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
value, value,
operand, operand,
displayValue, displayValue,
definition: filterDefinition, type: getFilterTypeFromFieldType(fieldMetadataItem.type),
label: fieldMetadataItem.label,
viewFilterGroupId: advancedFilterViewFilterGroupId, viewFilterGroupId: advancedFilterViewFilterGroupId,
subFieldName: subFieldName, subFieldName: subFieldName,
}); });
} }
setFilterDefinitionUsedInDropdown(filterDefinition);
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id); setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id);
const type = getFilterTypeFromFieldType(fieldMetadataItem.type); const type = getFilterTypeFromFieldType(fieldMetadataItem.type);
@ -157,17 +135,12 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
const handleSubMenuBack = () => { const handleSubMenuBack = () => {
setFieldMetadataItemIdUsedInDropdown(null); setFieldMetadataItemIdUsedInDropdown(null);
setFilterDefinitionUsedInDropdown(null);
setObjectFilterDropdownSubMenuFieldType(null); setObjectFilterDropdownSubMenuFieldType(null);
setObjectFilterDropdownFirstLevelFilterDefinition(null);
setObjectFilterDropdownIsSelectingCompositeField(false); setObjectFilterDropdownIsSelectingCompositeField(false);
setObjectFilterDropdownFilterIsSelected(false); setObjectFilterDropdownFilterIsSelected(false);
}; };
if ( if (!isDefined(objectFilterDropdownSubMenuFieldType)) {
!isDefined(objectFilterDropdownSubMenuFieldType) ||
!isDefined(objectFilterDropdownFirstLevelFilterDefinition)
) {
return null; return null;
} }

View File

@ -3,17 +3,13 @@ import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdow
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
import { objectFilterDropdownFirstLevelFilterDefinitionComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState';
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState'; import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState'; import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { isCompositeField } from '@/object-record/object-filter-dropdown/utils/isCompositeField'; import { isCompositeField } from '@/object-record/object-filter-dropdown/utils/isCompositeField';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
@ -36,11 +32,6 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
); );
const [, setObjectFilterDropdownFirstLevelFilterDefinition] =
useRecoilComponentStateV2(
objectFilterDropdownFirstLevelFilterDefinitionComponentState,
);
const [, setObjectFilterDropdownSubMenuFieldType] = useRecoilComponentStateV2( const [, setObjectFilterDropdownSubMenuFieldType] = useRecoilComponentStateV2(
objectFilterDropdownSubMenuFieldTypeComponentState, objectFilterDropdownSubMenuFieldTypeComponentState,
); );
@ -66,10 +57,6 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
selectedOperandInDropdownComponentState, selectedOperandInDropdownComponentState,
); );
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
);
const advancedFilterViewFilterId = useRecoilComponentValueV2( const advancedFilterViewFilterId = useRecoilComponentValueV2(
advancedFilterViewFilterIdComponentState, advancedFilterViewFilterIdComponentState,
); );
@ -85,12 +72,6 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id); setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id);
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItem,
});
setFilterDefinitionUsedInDropdown(filterDefinition);
const filterType = getFilterTypeFromFieldType(fieldMetadataItem.type); const filterType = getFilterTypeFromFieldType(fieldMetadataItem.type);
if (filterType === 'RELATION' || filterType === 'SELECT') { if (filterType === 'RELATION' || filterType === 'SELECT') {
@ -122,11 +103,6 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
if (isCompositeField(filterType)) { if (isCompositeField(filterType)) {
setObjectFilterDropdownSubMenuFieldType(filterType); setObjectFilterDropdownSubMenuFieldType(filterType);
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemToSelect,
});
setObjectFilterDropdownFirstLevelFilterDefinition(filterDefinition);
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItemToSelect.id); setFieldMetadataItemIdUsedInDropdown(fieldMetadataItemToSelect.id);
setObjectFilterDropdownIsSelectingCompositeField(true); setObjectFilterDropdownIsSelectingCompositeField(true);
} else { } else {

View File

@ -1,7 +1,7 @@
import { ChangeEvent, useCallback, useState } from 'react'; import { ChangeEvent, useCallback, useState } from 'react';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
@ -55,17 +55,16 @@ export const ObjectFilterDropdownNumberInput = () => {
setInputValue(newValue); setInputValue(newValue);
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ? selectedFilter.id : v4(), id: selectedFilter?.id ? selectedFilter.id : v4(),
fieldMetadataId: fieldMetadataItemUsedInDropdown?.id ?? '', fieldMetadataId: fieldMetadataItemUsedInDropdown?.id ?? '',
value: newValue, value: newValue,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: newValue, displayValue: newValue,
definition: filterDefinition, type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInDropdown.type,
),
label: fieldMetadataItemUsedInDropdown.label,
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
}); });
}} }}

View File

@ -1,9 +1,6 @@
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
@ -68,17 +65,14 @@ export const ObjectFilterDropdownOperandSelect = () => {
setSelectedOperandInDropdown(newOperand); setSelectedOperandInDropdown(newOperand);
if (isValuelessOperand && isDefined(fieldMetadataItemUsedInDropdown)) { if (isValuelessOperand && isDefined(fieldMetadataItemUsedInDropdown)) {
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: v4(), id: v4(),
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
displayValue: '', displayValue: '',
operand: newOperand, operand: newOperand,
value: '', value: '',
definition: filterDefinition, type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
}); });
return; return;
} }
@ -98,17 +92,14 @@ export const ObjectFilterDropdownOperandSelect = () => {
selectedFilter.displayValue, selectedFilter.displayValue,
); );
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter.id ? selectedFilter.id : v4(), id: selectedFilter.id ? selectedFilter.id : v4(),
fieldMetadataId: selectedFilter.fieldMetadataId, fieldMetadataId: selectedFilter.fieldMetadataId,
displayValue, displayValue,
operand: newOperand, operand: newOperand,
value, value,
definition: filterDefinition, type: filterType,
label: fieldMetadataItemUsedInDropdown.label,
}); });
} }
}; };

View File

@ -13,7 +13,7 @@ import { SelectableList } from '@/ui/layout/selectable-list/components/Selectabl
import { useSelectableListStates } from '@/ui/layout/selectable-list/hooks/internal/useSelectableListStates'; import { useSelectableListStates } from '@/ui/layout/selectable-list/hooks/internal/useSelectableListStates';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState'; import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState';
@ -134,13 +134,10 @@ export const ObjectFilterDropdownOptionSelect = () => {
? JSON.stringify(selectedOptions.map((option) => option.value)) ? JSON.stringify(selectedOptions.map((option) => option.value))
: EMPTY_FILTER_VALUE; : EMPTY_FILTER_VALUE;
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ? selectedFilter.id : v4(), id: selectedFilter?.id ? selectedFilter.id : v4(),
definition: filterDefinition, type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
label: fieldMetadataItemUsedInDropdown.label,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: filterDisplayValue, displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,

View File

@ -8,7 +8,7 @@ import { RatingInput } from '@/ui/field/input/components/RatingInput';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
const convertFieldRatingValueToNumber = ( const convertFieldRatingValueToNumber = (
@ -59,18 +59,17 @@ export const ObjectFilterDropdownRatingInput = () => {
return; return;
} }
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter?.({ applyRecordFilter?.({
id: selectedFilter?.id ? selectedFilter.id : v4(), id: selectedFilter?.id ? selectedFilter.id : v4(),
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: convertFieldRatingValueToNumber(newValue), value: convertFieldRatingValueToNumber(newValue),
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: convertFieldRatingValueToNumber(newValue), displayValue: convertFieldRatingValueToNumber(newValue),
definition: filterDefinition,
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInDropdown.type,
),
label: fieldMetadataItemUsedInDropdown.label,
}); });
}} }}
/> />

View File

@ -1,12 +1,11 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { import {
formatFieldMetadataItemAsFilterDefinition, getFilterTypeFromFieldType,
getRelationObjectMetadataNameSingular, getRelationObjectMetadataNameSingular,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { ObjectFilterDropdownRecordPinnedItems } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordPinnedItems'; import { ObjectFilterDropdownRecordPinnedItems } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordPinnedItems';
import { CURRENT_WORKSPACE_MEMBER_SELECTABLE_ITEM_ID } from '@/object-record/object-filter-dropdown/constants/CurrentWorkspaceMemberSelectableItemId'; import { CURRENT_WORKSPACE_MEMBER_SELECTABLE_ITEM_ID } from '@/object-record/object-filter-dropdown/constants/CurrentWorkspaceMemberSelectableItemId';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState'; import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
@ -40,10 +39,6 @@ type ObjectFilterDropdownRecordSelectProps = {
export const ObjectFilterDropdownRecordSelect = ({ export const ObjectFilterDropdownRecordSelect = ({
viewComponentId, viewComponentId,
}: ObjectFilterDropdownRecordSelectProps) => { }: ObjectFilterDropdownRecordSelectProps) => {
const filterDefinitionUsedInDropdown = useRecoilComponentValueV2(
filterDefinitionUsedInDropdownComponentState,
);
const fieldMetadataItemUsedInFilterDropdown = useRecoilComponentValueV2( const fieldMetadataItemUsedInFilterDropdown = useRecoilComponentValueV2(
fieldMetadataItemUsedInDropdownComponentSelector, fieldMetadataItemUsedInDropdownComponentSelector,
); );
@ -182,10 +177,7 @@ export const ObjectFilterDropdownRecordSelect = ({
? `${selectedItemNames.length} ${objectLabelPlural.toLowerCase()}` ? `${selectedItemNames.length} ${objectLabelPlural.toLowerCase()}`
: selectedItemNames.join(', '); : selectedItemNames.join(', ');
if ( if (isDefined(selectedOperandInDropdown)) {
isDefined(filterDefinitionUsedInDropdown) &&
isDefined(selectedOperandInDropdown)
) {
const newFilterValue = const newFilterValue =
newSelectedRecordIds.length > 0 || newIsCurrentWorkspaceMemberSelected newSelectedRecordIds.length > 0 || newIsCurrentWorkspaceMemberSelected
? JSON.stringify({ ? JSON.stringify({
@ -204,13 +196,12 @@ export const ObjectFilterDropdownRecordSelect = ({
const filterId = viewFilter?.id ?? v4(); const filterId = viewFilter?.id ?? v4();
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInFilterDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ? selectedFilter.id : filterId, id: selectedFilter?.id ? selectedFilter.id : filterId,
definition: filterDefinition, type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInFilterDropdown.type,
),
label: fieldMetadataItemUsedInFilterDropdown.label,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: filterDisplayValue, displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id, fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,

View File

@ -1,7 +1,7 @@
import { useState } from 'react'; import { useState } from 'react';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useEmptyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useEmptyRecordFilter'; import { useEmptyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useEmptyRecordFilter';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
@ -130,13 +130,12 @@ export const ObjectFilterDropdownSourceSelect = ({
const filterId = viewFilter?.id ?? fieldId; const filterId = viewFilter?.id ?? fieldId;
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInFilterDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ? selectedFilter.id : filterId, id: selectedFilter?.id ? selectedFilter.id : filterId,
definition: filterDefinition, type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInFilterDropdown.type,
),
label: fieldMetadataItemUsedInFilterDropdown.label,
operand: selectedOperandInDropdown || ViewFilterOperand.Is, operand: selectedOperandInDropdown || ViewFilterOperand.Is,
displayValue: filterDisplayValue, displayValue: filterDisplayValue,
fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id, fieldMetadataId: fieldMetadataItemUsedInFilterDropdown.id,

View File

@ -1,6 +1,6 @@
import { ChangeEvent, useCallback, useState } from 'react'; import { ChangeEvent, useCallback, useState } from 'react';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector'; import { fieldMetadataItemUsedInDropdownComponentSelector } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemUsedInDropdownComponentSelector';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
@ -58,18 +58,17 @@ export const ObjectFilterDropdownTextSearchInput = () => {
onChange={(event: ChangeEvent<HTMLInputElement>) => { onChange={(event: ChangeEvent<HTMLInputElement>) => {
setObjectFilterDropdownSearchInput(event.target.value); setObjectFilterDropdownSearchInput(event.target.value);
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItemUsedInDropdown,
});
applyRecordFilter({ applyRecordFilter({
id: selectedFilter?.id ?? v4(), id: selectedFilter?.id ?? v4(),
fieldMetadataId: fieldMetadataItemUsedInDropdown.id, fieldMetadataId: fieldMetadataItemUsedInDropdown.id,
value: event.target.value, value: event.target.value,
operand: selectedOperandInDropdown, operand: selectedOperandInDropdown,
displayValue: event.target.value, displayValue: event.target.value,
definition: filterDefinition,
viewFilterGroupId: selectedFilter?.viewFilterGroupId, viewFilterGroupId: selectedFilter?.viewFilterGroupId,
type: getFilterTypeFromFieldType(
fieldMetadataItemUsedInDropdown.type,
),
label: fieldMetadataItemUsedInDropdown.label,
}); });
}} }}
/> />

View File

@ -1,9 +1,6 @@
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
@ -11,10 +8,6 @@ import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-sta
import { useEffect } from 'react'; import { useEffect } from 'react';
export const SingleEntityObjectFilterDropdownButtonEffect = () => { export const SingleEntityObjectFilterDropdownButtonEffect = () => {
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
);
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
); );
@ -28,13 +21,8 @@ export const SingleEntityObjectFilterDropdownButtonEffect = () => {
const firstFieldMetadataItem = filterableFieldMetadataItems[0]; const firstFieldMetadataItem = filterableFieldMetadataItems[0];
const firstFieldDefinition = formatFieldMetadataItemAsFilterDefinition({
field: firstFieldMetadataItem,
});
useEffect(() => { useEffect(() => {
setFieldMetadataItemIdUsedInDropdown(firstFieldMetadataItem.id); setFieldMetadataItemIdUsedInDropdown(firstFieldMetadataItem.id);
setFilterDefinitionUsedInDropdown(firstFieldDefinition);
const filterType = getFilterTypeFromFieldType(firstFieldMetadataItem.type); const filterType = getFilterTypeFromFieldType(firstFieldMetadataItem.type);
@ -43,8 +31,6 @@ export const SingleEntityObjectFilterDropdownButtonEffect = () => {
setSelectedOperandInDropdown(defaultOperand); setSelectedOperandInDropdown(defaultOperand);
}, [ }, [
firstFieldMetadataItem, firstFieldMetadataItem,
firstFieldDefinition,
setFilterDefinitionUsedInDropdown,
setSelectedOperandInDropdown, setSelectedOperandInDropdown,
setFieldMetadataItemIdUsedInDropdown, setFieldMetadataItemIdUsedInDropdown,
]); ]);

View File

@ -1,4 +1,4 @@
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState'; import { objectFilterDropdownFilterIsSelectedComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownFilterIsSelectedComponentState';
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState'; import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
@ -15,6 +15,12 @@ export const useResetFilterDropdown = (componentInstanceId?: string) => {
componentInstanceId, componentInstanceId,
); );
const fieldMetadataItemIdUsedInDropdownCallbackState =
useRecoilComponentCallbackStateV2(
fieldMetadataItemIdUsedInDropdownComponentState,
componentInstanceId,
);
const objectFilterDropdownSelectedRecordIdsCallbackState = const objectFilterDropdownSelectedRecordIdsCallbackState =
useRecoilComponentCallbackStateV2( useRecoilComponentCallbackStateV2(
objectFilterDropdownSelectedRecordIdsComponentState, objectFilterDropdownSelectedRecordIdsComponentState,
@ -26,12 +32,6 @@ export const useResetFilterDropdown = (componentInstanceId?: string) => {
componentInstanceId, componentInstanceId,
); );
const filterDefinitionUsedInDropdownCallbackState =
useRecoilComponentCallbackStateV2(
filterDefinitionUsedInDropdownComponentState,
componentInstanceId,
);
const selectedOperandInDropdownCallbackState = const selectedOperandInDropdownCallbackState =
useRecoilComponentCallbackStateV2( useRecoilComponentCallbackStateV2(
selectedOperandInDropdownComponentState, selectedOperandInDropdownComponentState,
@ -56,19 +56,19 @@ export const useResetFilterDropdown = (componentInstanceId?: string) => {
set(objectFilterDropdownSearchInputCallbackState, ''); set(objectFilterDropdownSearchInputCallbackState, '');
set(objectFilterDropdownSelectedRecordIdsCallbackState, []); set(objectFilterDropdownSelectedRecordIdsCallbackState, []);
set(selectedFilterCallbackState, undefined); set(selectedFilterCallbackState, undefined);
set(filterDefinitionUsedInDropdownCallbackState, null);
set(selectedOperandInDropdownCallbackState, null); set(selectedOperandInDropdownCallbackState, null);
set(objectFilterDropdownFilterIsSelectedCallbackState, false); set(objectFilterDropdownFilterIsSelectedCallbackState, false);
set(objectFilterDropdownIsSelectingCompositeFieldCallbackState, false); set(objectFilterDropdownIsSelectingCompositeFieldCallbackState, false);
set(fieldMetadataItemIdUsedInDropdownCallbackState, null);
}, },
[ [
filterDefinitionUsedInDropdownCallbackState,
objectFilterDropdownSearchInputCallbackState, objectFilterDropdownSearchInputCallbackState,
objectFilterDropdownSelectedRecordIdsCallbackState, objectFilterDropdownSelectedRecordIdsCallbackState,
selectedFilterCallbackState, selectedFilterCallbackState,
selectedOperandInDropdownCallbackState, selectedOperandInDropdownCallbackState,
objectFilterDropdownFilterIsSelectedCallbackState, objectFilterDropdownFilterIsSelectedCallbackState,
objectFilterDropdownIsSelectingCompositeFieldCallbackState, objectFilterDropdownIsSelectingCompositeFieldCallbackState,
fieldMetadataItemIdUsedInDropdownCallbackState,
], ],
); );

View File

@ -1,11 +1,12 @@
import { useGetFieldMetadataItemById } from '@/object-metadata/hooks/useGetFieldMetadataItemById';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState'; import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState'; import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue'; import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter'; import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
@ -16,19 +17,17 @@ import { isDefined } from 'twenty-shared';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
type SelectFilterParams = { type SelectFilterParams = {
filterDefinition: RecordFilterDefinition; fieldMetadataItemId: string;
}; };
export const useSelectFilterDefinitionUsedInDropdown = ( export const useSelectFilterUsedInDropdown = (componentInstanceId?: string) => {
componentInstanceId?: string, const setSelectedOperandInDropdown = useSetRecoilComponentStateV2(
) => { selectedOperandInDropdownComponentState,
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
componentInstanceId, componentInstanceId,
); );
const setSelectedOperandInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
selectedOperandInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
componentInstanceId, componentInstanceId,
); );
@ -51,26 +50,36 @@ export const useSelectFilterDefinitionUsedInDropdown = (
const { applyRecordFilter } = useApplyRecordFilter(componentInstanceId); const { applyRecordFilter } = useApplyRecordFilter(componentInstanceId);
const selectFilterDefinitionUsedInDropdown = ({ const { getFieldMetadataItemById } = useGetFieldMetadataItemById();
filterDefinition,
const selectFilterUsedInDropdown = ({
fieldMetadataItemId,
}: SelectFilterParams) => { }: SelectFilterParams) => {
setFilterDefinitionUsedInDropdown(filterDefinition); setFieldMetadataItemIdUsedInDropdown(fieldMetadataItemId);
const fieldMetadataItem = getFieldMetadataItemById(fieldMetadataItemId);
if (!isDefined(fieldMetadataItem)) {
return;
}
if ( if (
filterDefinition.type === 'RELATION' || fieldMetadataItem.type === 'RELATION' ||
filterDefinition.type === 'SELECT' fieldMetadataItem.type === 'SELECT'
) { ) {
setHotkeyScope(RelationPickerHotkeyScope.RelationPicker); setHotkeyScope(RelationPickerHotkeyScope.RelationPicker);
} }
const filterType = getFilterTypeFromFieldType(fieldMetadataItem.type);
const firstOperand = getRecordFilterOperands({ const firstOperand = getRecordFilterOperands({
filterType: filterDefinition.type, filterType,
})[0]; })[0];
setSelectedOperandInDropdown(firstOperand); setSelectedOperandInDropdown(firstOperand);
const { value, displayValue } = getInitialFilterValue( const { value, displayValue } = getInitialFilterValue(
filterDefinition.type, filterType,
firstOperand, firstOperand,
); );
@ -79,12 +88,13 @@ export const useSelectFilterDefinitionUsedInDropdown = (
if (isAdvancedFilter || value !== '') { if (isAdvancedFilter || value !== '') {
applyRecordFilter({ applyRecordFilter({
id: advancedFilterViewFilterId ?? v4(), id: advancedFilterViewFilterId ?? v4(),
fieldMetadataId: filterDefinition.fieldMetadataId, fieldMetadataId: fieldMetadataItem.id,
displayValue, displayValue,
operand: firstOperand, operand: firstOperand,
value, value,
definition: filterDefinition,
viewFilterGroupId: advancedFilterViewFilterGroupId, viewFilterGroupId: advancedFilterViewFilterGroupId,
type: filterType,
label: fieldMetadataItem.label,
}); });
} }
@ -92,6 +102,6 @@ export const useSelectFilterDefinitionUsedInDropdown = (
}; };
return { return {
selectFilterDefinitionUsedInDropdown, selectFilterUsedInDropdown,
}; };
}; };

View File

@ -1,10 +0,0 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const filterDefinitionUsedInDropdownComponentState =
createComponentStateV2<RecordFilterDefinition | null>({
key: 'filterDefinitionUsedInDropdownComponentState',
defaultValue: null,
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
});

View File

@ -1,10 +0,0 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const objectFilterDropdownFirstLevelFilterDefinitionComponentState =
createComponentStateV2<RecordFilterDefinition | null>({
key: 'objectFilterDropdownFirstLevelFilterDefinitionComponentState',
defaultValue: null,
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
});

View File

@ -1,11 +0,0 @@
import { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
export const isActorSourceCompositeFilter = (
filterDefinition: Pick<RecordFilterDefinition, 'compositeFieldName'>,
) => {
return (
filterDefinition.compositeFieldName ===
('source' satisfies keyof FieldActorValue)
);
};

View File

@ -5,6 +5,7 @@ import { currentRecordFiltersComponentState } from '@/object-record/record-filte
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FieldMetadataType } from '~/generated/graphql';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { useRemoveRecordFilter } from '../useRemoveRecordFilter'; import { useRemoveRecordFilter } from '../useRemoveRecordFilter';
import { useUpsertRecordFilter } from '../useUpsertRecordFilter'; import { useUpsertRecordFilter } from '../useUpsertRecordFilter';
@ -41,14 +42,8 @@ describe('useRemoveRecordFilter', () => {
value: 'test-value', value: 'test-value',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
displayValue: 'test-value', displayValue: 'test-value',
definition: {
type: 'TEXT',
fieldMetadataId: 'field-1',
label: 'Test Field',
iconName: 'IconText',
},
label: 'Test Field', label: 'Test Field',
type: 'TEXT', type: FieldMetadataType.TEXT,
}; };
// First add a filter // First add a filter
@ -92,14 +87,8 @@ describe('useRemoveRecordFilter', () => {
value: 'test-value', value: 'test-value',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
displayValue: 'test-value', displayValue: 'test-value',
definition: {
type: 'TEXT',
fieldMetadataId: 'field-1',
label: 'Test Field',
iconName: 'IconText',
},
label: 'Test Field', label: 'Test Field',
type: 'TEXT', type: FieldMetadataType.TEXT,
}; };
// Add a filter // Add a filter

View File

@ -5,6 +5,7 @@ import { currentRecordFiltersComponentState } from '@/object-record/record-filte
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FieldMetadataType } from '~/generated/graphql';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper'; import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { useUpsertRecordFilter } from '../useUpsertRecordFilter'; import { useUpsertRecordFilter } from '../useUpsertRecordFilter';
@ -35,14 +36,8 @@ describe('useUpsertRecordFilter', () => {
value: 'test-value', value: 'test-value',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
displayValue: 'test-value', displayValue: 'test-value',
definition: {
type: 'TEXT',
fieldMetadataId: 'field-1',
label: 'Test Field',
iconName: 'IconText',
},
label: 'Test Field', label: 'Test Field',
type: 'TEXT', type: FieldMetadataType.TEXT,
}; };
act(() => { act(() => {
@ -75,14 +70,8 @@ describe('useUpsertRecordFilter', () => {
value: 'initial-value', value: 'initial-value',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
displayValue: 'initial-value', displayValue: 'initial-value',
definition: {
type: 'TEXT',
fieldMetadataId: 'field-1',
label: 'Test Field',
iconName: 'IconText',
},
label: 'Test Field', label: 'Test Field',
type: 'TEXT', type: FieldMetadataType.TEXT,
}; };
const updatedFilter: RecordFilter = { const updatedFilter: RecordFilter = {
@ -91,14 +80,8 @@ describe('useUpsertRecordFilter', () => {
value: 'updated-value', value: 'updated-value',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
displayValue: 'updated-value', displayValue: 'updated-value',
definition: {
type: 'TEXT',
fieldMetadataId: 'field-1',
label: 'Test Field',
iconName: 'IconText',
},
label: 'Test Field', label: 'Test Field',
type: 'TEXT', type: FieldMetadataType.TEXT,
}; };
act(() => { act(() => {

View File

@ -1,23 +0,0 @@
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
import { useRecoilValue } from 'recoil';
export const useFilterDefinitionsFromFilterableFieldMetadataItems = () => {
const { objectMetadataItem } = useRecordIndexContextOrThrow();
const availableFieldMetadataItemsForFilter = useRecoilValue(
availableFieldMetadataItemsForFilterFamilySelector({
objectMetadataItemId: objectMetadataItem.id,
}),
);
const filterDefinitions = availableFieldMetadataItemsForFilter.map(
(fieldMetadataItem) =>
formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItem,
}),
);
return { filterDefinitions };
};

View File

@ -11,20 +11,12 @@ export const useUpsertRecordFilter = () => {
const upsertRecordFilter = useRecoilCallback( const upsertRecordFilter = useRecoilCallback(
({ set, snapshot }) => ({ set, snapshot }) =>
(filter: RecordFilter) => { (recordFilterToSet: RecordFilter) => {
const currentRecordFilters = getSnapshotValue( const currentRecordFilters = getSnapshotValue(
snapshot, snapshot,
currentRecordFiltersCallbackState, currentRecordFiltersCallbackState,
); );
// TODO: This is a temporary solution to ensure that the record filter is compatible with filter definitions
// Label and type will be set without definition
const recordFilterToSet: RecordFilter = {
...filter,
label: filter.definition.label,
type: filter.definition.type,
};
const foundRecordFilterInCurrentRecordFilters = const foundRecordFilterInCurrentRecordFilters =
currentRecordFilters.some( currentRecordFilters.some(
(existingFilter) => (existingFilter) =>

View File

@ -1,5 +1,4 @@
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType'; import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
export type RecordFilter = { export type RecordFilter = {
@ -7,12 +6,11 @@ export type RecordFilter = {
fieldMetadataId: string; fieldMetadataId: string;
value: string; value: string;
displayValue: string; displayValue: string;
type?: FilterableFieldType; type: FilterableFieldType;
viewFilterGroupId?: string; viewFilterGroupId?: string;
displayAvatarUrl?: string; displayAvatarUrl?: string;
operand: ViewFilterOperand; operand: ViewFilterOperand;
positionInViewFilterGroup?: number | null; positionInViewFilterGroup?: number | null;
definition: RecordFilterDefinition; label: string;
label?: string;
subFieldName?: string | null | undefined; subFieldName?: string | null | undefined;
}; };

View File

@ -1,9 +0,0 @@
import { FilterableFieldType } from './FilterableFieldType';
export type RecordFilterDefinition = {
fieldMetadataId: string;
label: string;
iconName: string;
type: FilterableFieldType;
compositeFieldName?: string;
};

View File

@ -3,6 +3,7 @@ import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordF
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies'; import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter'; import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FieldMetadataType } from '~/generated/graphql';
import { getCompaniesMock } from '~/testing/mock-data/companies'; import { getCompaniesMock } from '~/testing/mock-data/companies';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
@ -37,12 +38,6 @@ describe('computeViewRecordGqlOperationFilter', () => {
operand: RecordFilterOperand.Contains, operand: RecordFilterOperand.Contains,
type: 'TEXT', type: 'TEXT',
label: 'Name', label: 'Name',
definition: {
type: 'TEXT',
fieldMetadataId: companyMockNameFieldMetadataId?.id,
label: 'Name',
iconName: 'text',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -76,12 +71,8 @@ describe('computeViewRecordGqlOperationFilter', () => {
fieldMetadataId: companyMockNameFieldMetadataId?.id, fieldMetadataId: companyMockNameFieldMetadataId?.id,
displayValue: companiesMock[0].name, displayValue: companiesMock[0].name,
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
definition: { type: FieldMetadataType.TEXT,
type: 'TEXT', label: 'Name',
fieldMetadataId: companyMockNameFieldMetadataId?.id,
label: 'Name',
iconName: 'text',
},
}; };
const employeesFilter: RecordFilter = { const employeesFilter: RecordFilter = {
@ -90,12 +81,8 @@ describe('computeViewRecordGqlOperationFilter', () => {
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
displayValue: '1000', displayValue: '1000',
operand: ViewFilterOperand.GreaterThan, operand: ViewFilterOperand.GreaterThan,
definition: { type: FieldMetadataType.NUMBER,
type: 'NUMBER', label: 'Employees',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
label: 'Employees',
iconName: 'number',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -135,12 +122,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockAddressFieldMetadataId?.id, fieldMetadataId: companyMockAddressFieldMetadataId?.id,
displayValue: '123 Main St', displayValue: '123 Main St',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
definition: { type: FieldMetadataType.ADDRESS,
type: 'ADDRESS', label: 'Address',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
label: 'Address',
iconName: 'address',
},
}; };
const addressFilterDoesNotContain: RecordFilter = { const addressFilterDoesNotContain: RecordFilter = {
@ -149,12 +132,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockAddressFieldMetadataId?.id, fieldMetadataId: companyMockAddressFieldMetadataId?.id,
displayValue: '123 Main St', displayValue: '123 Main St',
operand: ViewFilterOperand.DoesNotContain, operand: ViewFilterOperand.DoesNotContain,
definition: { type: FieldMetadataType.ADDRESS,
type: 'ADDRESS', label: 'Address',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
label: 'Address',
iconName: 'address',
},
}; };
const addressFilterIsEmpty: RecordFilter = { const addressFilterIsEmpty: RecordFilter = {
@ -163,12 +142,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockAddressFieldMetadataId?.id, fieldMetadataId: companyMockAddressFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsEmpty, operand: ViewFilterOperand.IsEmpty,
definition: { type: FieldMetadataType.ADDRESS,
type: 'ADDRESS', label: 'Address',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
label: 'Address',
iconName: 'address',
},
}; };
const addressFilterIsNotEmpty: RecordFilter = { const addressFilterIsNotEmpty: RecordFilter = {
@ -177,12 +152,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockAddressFieldMetadataId?.id, fieldMetadataId: companyMockAddressFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { label: 'Address',
type: 'ADDRESS', type: FieldMetadataType.ADDRESS,
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
label: 'Address',
iconName: 'address',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -518,12 +489,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockPhonesFieldMetadataId?.id, fieldMetadataId: personMockPhonesFieldMetadataId?.id,
displayValue: '1234567890', displayValue: '1234567890',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
definition: { label: 'Phones',
type: 'PHONES', type: FieldMetadataType.PHONES,
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
label: 'Phones',
iconName: 'phone',
},
}; };
const phonesFilterDoesNotContain: RecordFilter = { const phonesFilterDoesNotContain: RecordFilter = {
@ -532,12 +499,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockPhonesFieldMetadataId?.id, fieldMetadataId: personMockPhonesFieldMetadataId?.id,
displayValue: '1234567890', displayValue: '1234567890',
operand: ViewFilterOperand.DoesNotContain, operand: ViewFilterOperand.DoesNotContain,
definition: { label: 'Phones',
type: 'PHONES', type: FieldMetadataType.PHONES,
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
label: 'Phones',
iconName: 'phone',
},
}; };
const phonesFilterIsEmpty: RecordFilter = { const phonesFilterIsEmpty: RecordFilter = {
@ -546,12 +509,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockPhonesFieldMetadataId?.id, fieldMetadataId: personMockPhonesFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsEmpty, operand: ViewFilterOperand.IsEmpty,
definition: { label: 'Phones',
type: 'PHONES', type: FieldMetadataType.PHONES,
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
label: 'Phones',
iconName: 'phone',
},
}; };
const phonesFilterIsNotEmpty: RecordFilter = { const phonesFilterIsNotEmpty: RecordFilter = {
@ -560,12 +519,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockPhonesFieldMetadataId?.id, fieldMetadataId: personMockPhonesFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { label: 'Phones',
type: 'PHONES', type: FieldMetadataType.PHONES,
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
label: 'Phones',
iconName: 'phone',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -668,12 +623,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockEmailFieldMetadataId?.id, fieldMetadataId: personMockEmailFieldMetadataId?.id,
displayValue: 'test@test.com', displayValue: 'test@test.com',
operand: ViewFilterOperand.Contains, operand: ViewFilterOperand.Contains,
definition: { label: 'Emails',
type: 'EMAILS', type: FieldMetadataType.EMAILS,
fieldMetadataId: personMockEmailFieldMetadataId?.id,
iconName: 'email',
label: 'Emails',
},
}; };
const emailsFilterDoesNotContain: RecordFilter = { const emailsFilterDoesNotContain: RecordFilter = {
@ -682,12 +633,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockEmailFieldMetadataId?.id, fieldMetadataId: personMockEmailFieldMetadataId?.id,
displayValue: 'test@test.com', displayValue: 'test@test.com',
operand: ViewFilterOperand.DoesNotContain, operand: ViewFilterOperand.DoesNotContain,
definition: { label: 'Emails',
type: 'EMAILS', type: FieldMetadataType.EMAILS,
fieldMetadataId: personMockEmailFieldMetadataId?.id,
label: 'Emails',
iconName: 'email',
},
}; };
const emailsFilterIsEmpty: RecordFilter = { const emailsFilterIsEmpty: RecordFilter = {
@ -696,12 +643,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockEmailFieldMetadataId?.id, fieldMetadataId: personMockEmailFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsEmpty, operand: ViewFilterOperand.IsEmpty,
definition: { label: 'Emails',
type: 'EMAILS', type: FieldMetadataType.EMAILS,
label: 'Emails',
iconName: 'email',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
},
}; };
const emailsFilterIsNotEmpty: RecordFilter = { const emailsFilterIsNotEmpty: RecordFilter = {
@ -710,12 +653,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: personMockEmailFieldMetadataId?.id, fieldMetadataId: personMockEmailFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { label: 'Emails',
type: 'EMAILS', type: FieldMetadataType.EMAILS,
label: 'Emails',
iconName: 'email',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -810,12 +749,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockDateFieldMetadataId?.id, fieldMetadataId: companyMockDateFieldMetadataId?.id,
displayValue: '2024-09-17T20:46:58.922Z', displayValue: '2024-09-17T20:46:58.922Z',
operand: ViewFilterOperand.IsAfter, operand: ViewFilterOperand.IsAfter,
definition: { label: 'Created At',
type: 'DATE_TIME', type: FieldMetadataType.DATE_TIME,
fieldMetadataId: companyMockDateFieldMetadataId?.id,
label: 'Created At',
iconName: 'date',
},
}; };
const dateFilterIsBefore: RecordFilter = { const dateFilterIsBefore: RecordFilter = {
@ -824,12 +759,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockDateFieldMetadataId?.id, fieldMetadataId: companyMockDateFieldMetadataId?.id,
displayValue: '2024-09-17T20:46:58.922Z', displayValue: '2024-09-17T20:46:58.922Z',
operand: ViewFilterOperand.IsBefore, operand: ViewFilterOperand.IsBefore,
definition: { label: 'Created At',
type: 'DATE_TIME', type: FieldMetadataType.DATE_TIME,
fieldMetadataId: companyMockDateFieldMetadataId?.id,
label: 'Created At',
iconName: 'date',
},
}; };
const dateFilterIs: RecordFilter = { const dateFilterIs: RecordFilter = {
@ -838,12 +769,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockDateFieldMetadataId?.id, fieldMetadataId: companyMockDateFieldMetadataId?.id,
displayValue: '2024-09-17T20:46:58.922Z', displayValue: '2024-09-17T20:46:58.922Z',
operand: ViewFilterOperand.Is, operand: ViewFilterOperand.Is,
definition: { label: 'Created At',
type: 'DATE_TIME', type: FieldMetadataType.DATE_TIME,
fieldMetadataId: companyMockDateFieldMetadataId?.id,
label: 'Created At',
iconName: 'date',
},
}; };
const dateFilterIsEmpty: RecordFilter = { const dateFilterIsEmpty: RecordFilter = {
@ -852,12 +779,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockDateFieldMetadataId?.id, fieldMetadataId: companyMockDateFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsEmpty, operand: ViewFilterOperand.IsEmpty,
definition: { label: 'Created At',
type: 'DATE_TIME', type: FieldMetadataType.DATE_TIME,
fieldMetadataId: companyMockDateFieldMetadataId?.id,
label: 'Created At',
iconName: 'date',
},
}; };
const dateFilterIsNotEmpty: RecordFilter = { const dateFilterIsNotEmpty: RecordFilter = {
@ -866,12 +789,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockDateFieldMetadataId?.id, fieldMetadataId: companyMockDateFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { label: 'Created At',
type: 'DATE_TIME', type: FieldMetadataType.DATE_TIME,
fieldMetadataId: companyMockDateFieldMetadataId?.id,
label: 'Created At',
iconName: 'date',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(
@ -941,12 +860,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
displayValue: '1000', displayValue: '1000',
operand: ViewFilterOperand.GreaterThan, operand: ViewFilterOperand.GreaterThan,
definition: { label: 'Employees',
type: 'NUMBER', type: FieldMetadataType.NUMBER,
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
label: 'Employees',
iconName: 'number',
},
}; };
const employeesFilterIsLessThan: RecordFilter = { const employeesFilterIsLessThan: RecordFilter = {
@ -955,12 +870,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
displayValue: '1000', displayValue: '1000',
operand: ViewFilterOperand.LessThan, operand: ViewFilterOperand.LessThan,
definition: { label: 'Employees',
type: 'NUMBER', type: FieldMetadataType.NUMBER,
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
label: 'Employees',
iconName: 'number',
},
}; };
const employeesFilterIsEmpty: RecordFilter = { const employeesFilterIsEmpty: RecordFilter = {
@ -969,12 +880,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsEmpty, operand: ViewFilterOperand.IsEmpty,
definition: { label: 'Employees',
type: 'NUMBER', type: FieldMetadataType.NUMBER,
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
label: 'Employees',
iconName: 'number',
},
}; };
const employeesFilterIsNotEmpty: RecordFilter = { const employeesFilterIsNotEmpty: RecordFilter = {
@ -983,12 +890,8 @@ describe('should work as expected for the different field types', () => {
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id, fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
displayValue: '', displayValue: '',
operand: ViewFilterOperand.IsNotEmpty, operand: ViewFilterOperand.IsNotEmpty,
definition: { label: 'Employees',
type: 'NUMBER', type: FieldMetadataType.NUMBER,
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
label: 'Employees',
iconName: 'number',
},
}; };
const result = computeViewRecordGqlOperationFilter( const result = computeViewRecordGqlOperationFilter(

View File

@ -280,7 +280,6 @@ export const computeFilterRecordGqlOperationFilter = ({
), ),
} as RatingFilter, } as RatingFilter,
}; };
default: default:
throw new Error( throw new Error(
`Unknown operand ${filter.operand} for ${filterType} filter`, `Unknown operand ${filter.operand} for ${filterType} filter`,

View File

@ -26,7 +26,7 @@ import { RecordIndexActionMenu } from '@/action-menu/components/RecordIndexActio
import { ContextStoreCurrentViewTypeEffect } from '@/context-store/components/ContextStoreCurrentViewTypeEffect'; import { ContextStoreCurrentViewTypeEffect } from '@/context-store/components/ContextStoreCurrentViewTypeEffect';
import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState'; import { contextStoreTargetedRecordsRuleComponentState } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType'; import { ContextStoreViewType } from '@/context-store/types/ContextStoreViewType';
import { useFilterDefinitionsFromFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterDefinitionsFromFilterableFieldMetadataItems'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetRecordGroup'; import { useSetRecordGroup } from '@/object-record/record-group/hooks/useSetRecordGroup';
import { RecordIndexFiltersToContextStoreEffect } from '@/object-record/record-index/components/RecordIndexFiltersToContextStoreEffect'; import { RecordIndexFiltersToContextStoreEffect } from '@/object-record/record-index/components/RecordIndexFiltersToContextStoreEffect';
import { RecordIndexTableContainerEffect } from '@/object-record/record-index/components/RecordIndexTableContainerEffect'; import { RecordIndexTableContainerEffect } from '@/object-record/record-index/components/RecordIndexTableContainerEffect';
@ -180,8 +180,8 @@ export const RecordIndexContainer = () => {
contextStoreTargetedRecordsRuleComponentState, contextStoreTargetedRecordsRuleComponentState,
); );
const { filterDefinitions } = const { filterableFieldMetadataItems } =
useFilterDefinitionsFromFilterableFieldMetadataItems(); useFilterableFieldMetadataItemsInRecordIndexContext();
const isCommandMenuV2Enabled = useIsFeatureEnabled( const isCommandMenuV2Enabled = useIsFeatureEnabled(
FeatureFlagKey.IsCommandMenuV2Enabled, FeatureFlagKey.IsCommandMenuV2Enabled,
@ -218,17 +218,23 @@ export const RecordIndexContainer = () => {
onViewGroupsChange(view.viewGroups); onViewGroupsChange(view.viewGroups);
setTableViewFilterGroups(view.viewFilterGroups ?? []); setTableViewFilterGroups(view.viewFilterGroups ?? []);
setTableFilters( setTableFilters(
mapViewFiltersToFilters(view.viewFilters, filterDefinitions), mapViewFiltersToFilters(
view.viewFilters,
filterableFieldMetadataItems,
),
); );
setRecordIndexFilters( setRecordIndexFilters(
mapViewFiltersToFilters(view.viewFilters, filterDefinitions), mapViewFiltersToFilters(
view.viewFilters,
filterableFieldMetadataItems,
),
); );
setRecordIndexViewFilterGroups(view.viewFilterGroups ?? []); setRecordIndexViewFilterGroups(view.viewFilterGroups ?? []);
setContextStoreTargetedRecordsRule((prev) => ({ setContextStoreTargetedRecordsRule((prev) => ({
...prev, ...prev,
filters: mapViewFiltersToFilters( filters: mapViewFiltersToFilters(
view.viewFilters, view.viewFilters,
filterDefinitions, filterableFieldMetadataItems,
), ),
})); }));
setTableSorts( setTableSorts(

View File

@ -6,6 +6,7 @@ import {
useExportFetchRecords, useExportFetchRecords,
} from '../useExportFetchRecords'; } from '../useExportFetchRecords';
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
import { useObjectOptionsForBoard } from '@/object-record/object-options-dropdown/hooks/useObjectOptionsForBoard'; import { useObjectOptionsForBoard } from '@/object-record/object-options-dropdown/hooks/useObjectOptionsForBoard';
import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState'; import { recordGroupFieldMetadataComponentState } from '@/object-record/record-group/states/recordGroupFieldMetadataComponentState';
import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2'; import { useRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentStateV2';
@ -13,7 +14,6 @@ import { ViewType } from '@/views/types/ViewType';
import { expect } from '@storybook/test'; import { expect } from '@storybook/test';
import { getJestMetadataAndApolloMocksAndActionMenuWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksAndContextStoreWrapper'; import { getJestMetadataAndApolloMocksAndActionMenuWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksAndContextStoreWrapper';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems'; import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
const mockPerson = { const mockPerson = {
__typename: 'Person', __typename: 'Person',
@ -155,7 +155,9 @@ describe('useRecordData', () => {
it('should call the callback function with kanban field included as column if view type is kanban', async () => { it('should call the callback function with kanban field included as column if view type is kanban', async () => {
const callback = jest.fn(); const callback = jest.fn();
mockFetchAllRecords.mockReturnValue([mockPerson]); mockFetchAllRecords.mockReturnValue([mockPerson]);
const { result } = renderHook( const { result } = renderHook(
() => { () => {
const [recordGroupFieldMetadata, setRecordGroupFieldMetadata] = const [recordGroupFieldMetadata, setRecordGroupFieldMetadata] =
@ -234,7 +236,7 @@ describe('useRecordData', () => {
displayAsRelativeDate: true, displayAsRelativeDate: true,
}, },
}, },
position: expect.any(Number), position: 10,
showLabel: undefined, showLabel: undefined,
size: 100, size: 100,
type: 'DATE_TIME', type: 'DATE_TIME',

View File

@ -5,19 +5,15 @@ import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/u
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector'; import { availableFieldMetadataItemsForFilterFamilySelector } from '@/object-metadata/states/availableFieldMetadataItemsForFilterFamilySelector';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType, import { useSelectFilterUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterUsedInDropdown';
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter'; import { useUpsertRecordFilter } from '@/object-record/record-filter/hooks/useUpsertRecordFilter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands'; import { getRecordFilterOperands } from '@/object-record/record-filter/utils/getRecordFilterOperands';
import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious'; import { useSetActiveDropdownFocusIdAndMemorizePrevious } from '@/ui/layout/dropdown/hooks/useSetFocusedDropdownIdAndMemorizePrevious';
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState'; import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState'; import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
@ -76,13 +72,8 @@ export const useHandleToggleColumnFilter = ({
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
const { selectFilterDefinitionUsedInDropdown } = const { selectFilterUsedInDropdown } =
useSelectFilterDefinitionUsedInDropdown(viewBarId); useSelectFilterUsedInDropdown(viewBarId);
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState,
viewBarId,
);
const handleToggleColumnFilter = useCallback( const handleToggleColumnFilter = useCallback(
async (fieldMetadataId: string) => { async (fieldMetadataId: string) => {
@ -110,14 +101,6 @@ export const useHandleToggleColumnFilter = ({
throw new Error('Field metadata item not found'); throw new Error('Field metadata item not found');
} }
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItem,
});
if (!isDefined(filterDefinition)) {
throw new Error('Filter definition not found');
}
const filterType = getFilterTypeFromFieldType(fieldMetadataItem.type); const filterType = getFilterTypeFromFieldType(fieldMetadataItem.type);
const availableOperandsForFilter = getRecordFilterOperands({ const availableOperandsForFilter = getRecordFilterOperands({
@ -131,7 +114,8 @@ export const useHandleToggleColumnFilter = ({
fieldMetadataId, fieldMetadataId,
operand: defaultOperand, operand: defaultOperand,
displayValue: '', displayValue: '',
definition: filterDefinition, label: fieldMetadataItem.label,
type: filterType,
value: '', value: '',
}; };
@ -139,8 +123,7 @@ export const useHandleToggleColumnFilter = ({
await upsertCombinedViewFilter(newFilter); await upsertCombinedViewFilter(newFilter);
selectFilterDefinitionUsedInDropdown({ filterDefinition }); selectFilterUsedInDropdown({ fieldMetadataItemId: fieldMetadataId });
setFieldMetadataItemIdUsedInDropdown(fieldMetadataId);
} }
openDropdown(existingViewFilter?.id ?? newFilterId); openDropdown(existingViewFilter?.id ?? newFilterId);
@ -149,11 +132,10 @@ export const useHandleToggleColumnFilter = ({
openDropdown, openDropdown,
columnDefinitions, columnDefinitions,
upsertCombinedViewFilter, upsertCombinedViewFilter,
selectFilterDefinitionUsedInDropdown, selectFilterUsedInDropdown,
currentViewWithCombinedFiltersAndSorts, currentViewWithCombinedFiltersAndSorts,
availableFieldMetadataItemsForFilter, availableFieldMetadataItemsForFilter,
upsertRecordFilter, upsertRecordFilter,
setFieldMetadataItemIdUsedInDropdown,
], ],
); );

View File

@ -64,12 +64,6 @@ export const useHandleToggleTrashColumnFilter = ({
displayValue: '', displayValue: '',
type: filterType, type: filterType,
label: `Deleted`, label: `Deleted`,
definition: {
label: `Deleted`,
iconName: 'IconTrash',
fieldMetadataId: trashFieldMetadata.id,
type: filterType,
},
value: '', value: '',
}; };

View File

@ -1,60 +0,0 @@
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
export const SIGN_IN_BACKGROUND_MOCK_FILTER_DEFINITIONS = [
{
fieldMetadataId: '20202020-5e4e-4007-a630-8a2617914889',
label: 'Domain Name',
iconName: 'IconLink',
type: 'LINKS',
},
{
fieldMetadataId: '20202020-7fbd-41ad-b64d-25a15ff62f04',
label: 'Employees',
iconName: 'IconUsers',
type: 'NUMBER',
},
{
fieldMetadataId: 'REPLACE_ME',
label: 'Name',
iconName: 'IconBuildingSkyscraper',
type: 'TEXT',
},
{
fieldMetadataId: '20202020-ad10-4117-a039-3f04b7a5f939',
label: 'Address',
iconName: 'IconMap',
type: 'ADDRESS',
},
{
fieldMetadataId: '20202020-0739-495d-8e70-c0807f6b2268',
label: 'Account Owner',
iconName: 'IconUserCircle',
relationObjectMetadataNamePlural: 'workspaceMembers',
relationObjectMetadataNameSingular: 'workspaceMember',
type: 'RELATION',
},
{
fieldMetadataId: '20202020-4dc2-47c9-bb15-6e6f19ba9e46',
label: 'Creation date',
iconName: 'IconCalendar',
type: 'DATE_TIME',
},
{
fieldMetadataId: '20202020-a61d-4b78-b998-3fd88b4f73a1',
label: 'Linkedin',
iconName: 'IconBrandLinkedin',
type: 'LINKS',
},
{
fieldMetadataId: '20202020-46e3-479a-b8f4-77137c74daa6',
label: 'X',
iconName: 'IconBrandX',
type: 'LINKS',
},
{
fieldMetadataId: '20202020-4a5a-466f-92d9-c3870d9502a9',
label: 'ARR',
iconName: 'IconMoneybag',
type: 'CURRENCY',
},
] as RecordFilterDefinition[];

View File

@ -1,8 +1,7 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState'; import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState'; import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState'; import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
@ -19,11 +18,6 @@ export const EditableFilterDropdownButtonEffect = ({
viewFilterDropdownId, viewFilterDropdownId,
viewFilter, viewFilter,
}: EditableFilterDropdownButtonEffectProps) => { }: EditableFilterDropdownButtonEffectProps) => {
const setFilterDefinitionUsedInDropdown = useSetRecoilComponentStateV2(
filterDefinitionUsedInDropdownComponentState,
viewFilterDropdownId,
);
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2( const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
fieldMetadataItemIdUsedInDropdownComponentState, fieldMetadataItemIdUsedInDropdownComponentState,
); );
@ -51,19 +45,11 @@ export const EditableFilterDropdownButtonEffect = ({
return; return;
} }
const filterDefinition = formatFieldMetadataItemAsFilterDefinition({ setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id);
field: fieldMetadataItem, setSelectedOperandInDropdown(viewFilter.operand);
}); setSelectedFilter(viewFilter);
if (isDefined(filterDefinition)) {
setFilterDefinitionUsedInDropdown(filterDefinition);
setFieldMetadataItemIdUsedInDropdown(filterDefinition.fieldMetadataId);
setSelectedOperandInDropdown(viewFilter.operand);
setSelectedFilter(viewFilter);
}
}, [ }, [
filterableFieldMetadataItems, filterableFieldMetadataItems,
setFilterDefinitionUsedInDropdown,
setFieldMetadataItemIdUsedInDropdown, setFieldMetadataItemIdUsedInDropdown,
viewFilter, viewFilter,
setSelectedOperandInDropdown, setSelectedOperandInDropdown,

View File

@ -1,4 +1,3 @@
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData';
@ -45,16 +44,12 @@ export const ViewBarRecordFilterEffect = () => {
if (isDataPrefetched && !hasInitializedCurrentRecordFilters) { if (isDataPrefetched && !hasInitializedCurrentRecordFilters) {
const currentView = views.find((view) => view.id === currentViewId); const currentView = views.find((view) => view.id === currentViewId);
const filterDefinitions = filterableFieldMetadataItems.map(
(fieldMetadataItem) =>
formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItem,
}),
);
if (isDefined(currentView)) { if (isDefined(currentView)) {
setCurrentRecordFilters( setCurrentRecordFilters(
mapViewFiltersToFilters(currentView.viewFilters, filterDefinitions), mapViewFiltersToFilters(
currentView.viewFilters,
filterableFieldMetadataItems,
),
); );
setHasInitializedCurrentRecordFilters(true); setHasInitializedCurrentRecordFilters(true);
} }

View File

@ -1,12 +1,8 @@
import { act, renderHook } from '@testing-library/react'; import { act, renderHook } from '@testing-library/react';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { currentViewIdComponentState } from '@/views/states/currentViewIdComponentState'; import { currentViewIdComponentState } from '@/views/states/currentViewIdComponentState';
@ -34,11 +30,6 @@ describe('useApplyCurrentViewFiltersToCurrentRecordFilters', () => {
const mockFieldMetadataItem = mockObjectMetadataItem.fields[0]; const mockFieldMetadataItem = mockObjectMetadataItem.fields[0];
const mockFilterDefinition: RecordFilterDefinition =
formatFieldMetadataItemAsFilterDefinition({
field: mockFieldMetadataItem,
});
const mockViewFilter: ViewFilter = { const mockViewFilter: ViewFilter = {
__typename: 'ViewFilter', __typename: 'ViewFilter',
id: 'filter-1', id: 'filter-1',
@ -48,7 +39,6 @@ describe('useApplyCurrentViewFiltersToCurrentRecordFilters', () => {
displayValue: mockFieldMetadataItem.label, displayValue: mockFieldMetadataItem.label,
viewFilterGroupId: 'group-1', viewFilterGroupId: 'group-1',
positionInViewFilterGroup: 0, positionInViewFilterGroup: 0,
definition: mockFilterDefinition,
}; };
const mockView = { const mockView = {
@ -108,8 +98,7 @@ describe('useApplyCurrentViewFiltersToCurrentRecordFilters', () => {
operand: mockViewFilter.operand, operand: mockViewFilter.operand,
viewFilterGroupId: mockViewFilter.viewFilterGroupId, viewFilterGroupId: mockViewFilter.viewFilterGroupId,
positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup, positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup,
definition: mockFilterDefinition, label: mockFieldMetadataItem.label,
label: mockViewFilter.displayValue,
type: getFilterTypeFromFieldType(mockFieldMetadataItem.type), type: getFilterTypeFromFieldType(mockFieldMetadataItem.type),
} satisfies RecordFilter, } satisfies RecordFilter,
]); ]);

View File

@ -1,12 +1,8 @@
import { act, renderHook } from '@testing-library/react'; import { act, renderHook } from '@testing-library/react';
import { import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
formatFieldMetadataItemAsFilterDefinition,
getFilterTypeFromFieldType,
} from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilter } from '@/views/types/ViewFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
@ -30,11 +26,6 @@ describe('useApplyViewFiltersToCurrentRecordFilters', () => {
const mockFieldMetadataItem = mockObjectMetadataItem.fields[0]; const mockFieldMetadataItem = mockObjectMetadataItem.fields[0];
const mockAvailableFilterDefinition: RecordFilterDefinition =
formatFieldMetadataItemAsFilterDefinition({
field: mockFieldMetadataItem,
});
const mockViewFilter: ViewFilter = { const mockViewFilter: ViewFilter = {
__typename: 'ViewFilter', __typename: 'ViewFilter',
id: 'filter-1', id: 'filter-1',
@ -44,7 +35,6 @@ describe('useApplyViewFiltersToCurrentRecordFilters', () => {
displayValue: mockFieldMetadataItem.label, displayValue: mockFieldMetadataItem.label,
viewFilterGroupId: 'group-1', viewFilterGroupId: 'group-1',
positionInViewFilterGroup: 0, positionInViewFilterGroup: 0,
definition: mockAvailableFilterDefinition,
}; };
it('should apply view filters to current record filters', () => { it('should apply view filters to current record filters', () => {
@ -82,8 +72,7 @@ describe('useApplyViewFiltersToCurrentRecordFilters', () => {
operand: mockViewFilter.operand, operand: mockViewFilter.operand,
viewFilterGroupId: mockViewFilter.viewFilterGroupId, viewFilterGroupId: mockViewFilter.viewFilterGroupId,
positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup, positionInViewFilterGroup: mockViewFilter.positionInViewFilterGroup,
definition: mockAvailableFilterDefinition, label: mockFieldMetadataItem.label,
label: mockViewFilter.displayValue,
type: getFilterTypeFromFieldType(mockFieldMetadataItem.type), type: getFilterTypeFromFieldType(mockFieldMetadataItem.type),
} satisfies RecordFilter, } satisfies RecordFilter,
]); ]);

View File

@ -10,7 +10,6 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier'; import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery'; import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
@ -18,7 +17,6 @@ import { ViewFilter } from '@/views/types/ViewFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { relationFilterValueSchemaObject } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; import { relationFilterValueSchemaObject } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
const filterQueryParamsSchema = z.object({ const filterQueryParamsSchema = z.object({
viewId: z.string().optional(), viewId: z.string().optional(),
@ -85,13 +83,6 @@ export const useViewFromQueryParams = () => {
if (!fieldMetadataItem) return null; if (!fieldMetadataItem) return null;
const filterDefinition =
formatFieldMetadataItemAsFilterDefinition({
field: fieldMetadataItem,
});
if (isUndefinedOrNull(filterDefinition)) return null;
const relationObjectMetadataNameSingular = const relationObjectMetadataNameSingular =
fieldMetadataItem.relationDefinition?.targetObjectMetadata fieldMetadataItem.relationDefinition?.targetObjectMetadata
?.nameSingular; ?.nameSingular;
@ -178,7 +169,6 @@ export const useViewFromQueryParams = () => {
value: filterValueAsString, value: filterValueAsString,
displayValue: displayValue:
relationRecordNames?.join(', ') ?? filterValueAsString, relationRecordNames?.join(', ') ?? filterValueAsString,
definition: filterDefinition,
persistAction: 'NONE', persistAction: 'NONE',
}; };
}, },

View File

@ -1,4 +1,4 @@
import { useFilterDefinitionsFromFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterDefinitionsFromFilterableFieldMetadataItems'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData'; import { usePrefetchedData } from '@/prefetch/hooks/usePrefetchedData';
import { PrefetchKey } from '@/prefetch/types/PrefetchKey'; import { PrefetchKey } from '@/prefetch/types/PrefetchKey';
@ -19,15 +19,18 @@ export const useApplyCurrentViewFiltersToCurrentRecordFilters = () => {
currentRecordFiltersComponentState, currentRecordFiltersComponentState,
); );
const { filterDefinitions } = const { filterableFieldMetadataItems } =
useFilterDefinitionsFromFilterableFieldMetadataItems(); useFilterableFieldMetadataItemsInRecordIndexContext();
const applyCurrentViewFiltersToCurrentRecordFilters = () => { const applyCurrentViewFiltersToCurrentRecordFilters = () => {
const currentView = views.find((view) => view.id === currentViewId); const currentView = views.find((view) => view.id === currentViewId);
if (isDefined(currentView)) { if (isDefined(currentView)) {
setCurrentRecordFilters( setCurrentRecordFilters(
mapViewFiltersToFilters(currentView.viewFilters, filterDefinitions), mapViewFiltersToFilters(
currentView.viewFilters,
filterableFieldMetadataItems,
),
); );
} }
}; };

View File

@ -1,4 +1,4 @@
import { useFilterDefinitionsFromFilterableFieldMetadataItems } from '@/object-record/record-filter/hooks/useFilterDefinitionsFromFilterableFieldMetadataItems'; import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState'; import { currentRecordFiltersComponentState } from '@/object-record/record-filter/states/currentRecordFiltersComponentState';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2'; import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilter } from '@/views/types/ViewFilter';
@ -9,15 +9,15 @@ export const useApplyViewFiltersToCurrentRecordFilters = () => {
currentRecordFiltersComponentState, currentRecordFiltersComponentState,
); );
const { filterDefinitions } = const { filterableFieldMetadataItems } =
useFilterDefinitionsFromFilterableFieldMetadataItems(); useFilterableFieldMetadataItemsInRecordIndexContext();
const applyViewFiltersToCurrentRecordFilters = ( const applyViewFiltersToCurrentRecordFilters = (
viewFilters: ViewFilter[], viewFilters: ViewFilter[],
) => { ) => {
const recordFiltersToApply = mapViewFiltersToFilters( const recordFiltersToApply = mapViewFiltersToFilters(
viewFilters, viewFilters,
filterDefinitions, filterableFieldMetadataItems,
); );
setCurrentRecordFilters(recordFiltersToApply); setCurrentRecordFilters(recordFiltersToApply);

View File

@ -3,8 +3,6 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies'; import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies';
import { useViewOrDefaultViewFromPrefetchedViews } from '@/views/hooks/useViewOrDefaultViewFromPrefetchedViews'; import { useViewOrDefaultViewFromPrefetchedViews } from '@/views/hooks/useViewOrDefaultViewFromPrefetchedViews';
import { getQueryVariablesFromView } from '@/views/utils/getQueryVariablesFromView'; import { getQueryVariablesFromView } from '@/views/utils/getQueryVariablesFromView';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey } from '~/generated/graphql';
export const useQueryVariablesFromActiveFieldsOfViewOrDefaultView = ({ export const useQueryVariablesFromActiveFieldsOfViewOrDefaultView = ({
objectMetadataItem, objectMetadataItem,
@ -22,17 +20,12 @@ export const useQueryVariablesFromActiveFieldsOfViewOrDefaultView = ({
objectMetadataItem, objectMetadataItem,
}); });
const isJsonFilterEnabled = useIsFeatureEnabled(
FeatureFlagKey.IsJsonFilterEnabled,
);
const { filterValueDependencies } = useFilterValueDependencies(); const { filterValueDependencies } = useFilterValueDependencies();
const { filter, orderBy } = getQueryVariablesFromView({ const { filter, orderBy } = getQueryVariablesFromView({
fieldMetadataItems: activeFieldMetadataItems, fieldMetadataItems: activeFieldMetadataItems,
objectMetadataItem, objectMetadataItem,
view, view,
isJsonFilterEnabled,
filterValueDependencies, filterValueDependencies,
}); });

View File

@ -1,4 +1,3 @@
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilterOperand } from './ViewFilterOperand'; import { ViewFilterOperand } from './ViewFilterOperand';
export type ViewFilter = { export type ViewFilter = {
@ -14,5 +13,4 @@ export type ViewFilter = {
viewId?: string; viewId?: string;
viewFilterGroupId?: string; viewFilterGroupId?: string;
positionInViewFilterGroup?: number | null; positionInViewFilterGroup?: number | null;
definition?: RecordFilterDefinition;
}; };

View File

@ -20,6 +20,15 @@ const baseDefinition = {
fieldName: 'fieldName', fieldName: 'fieldName',
}; };
const baseFieldMetadataItem = {
id: '05731f68-6e7a-4903-8374-c0b6a9063482',
createdAt: '2021-01-01',
updatedAt: '2021-01-01',
name: 'name',
label: 'Name',
type: FieldMetadataType.FULL_NAME,
};
describe('mapViewSortsToSorts', () => { describe('mapViewSortsToSorts', () => {
it('should map each ViewSort object to a corresponding Sort object', () => { it('should map each ViewSort object to a corresponding Sort object', () => {
const viewSorts: ViewSort[] = [ const viewSorts: ViewSort[] = [
@ -62,23 +71,12 @@ describe('mapViewFiltersToFilters', () => {
value: 'testValue', value: 'testValue',
displayValue: 'Test Display Value', displayValue: 'Test Display Value',
operand: ViewFilterOperand.Is, operand: ViewFilterOperand.Is,
definition: { label: baseFieldMetadataItem.label,
...baseDefinition, type: FieldMetadataType.FULL_NAME,
type: 'FULL_NAME',
},
label: baseDefinition.label,
type: 'FULL_NAME',
positionInViewFilterGroup: undefined,
viewFilterGroupId: undefined,
}, },
]; ];
expect( expect(
mapViewFiltersToFilters(viewFilters, [ mapViewFiltersToFilters(viewFilters, [baseFieldMetadataItem]),
{
...baseDefinition,
type: 'FULL_NAME',
},
]),
).toEqual(expectedFilters); ).toEqual(expectedFilters);
}); });
}); });

View File

@ -1,6 +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 { formatFieldMetadataItemsAsFilterDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions'; 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';
@ -15,13 +15,11 @@ export const getQueryVariablesFromView = ({
view, view,
fieldMetadataItems, fieldMetadataItems,
objectMetadataItem, objectMetadataItem,
isJsonFilterEnabled,
filterValueDependencies, filterValueDependencies,
}: { }: {
view: View | null | undefined; view: View | null | undefined;
fieldMetadataItems: FieldMetadataItem[]; fieldMetadataItems: FieldMetadataItem[];
objectMetadataItem: ObjectMetadataItem; objectMetadataItem: ObjectMetadataItem;
isJsonFilterEnabled: boolean;
filterValueDependencies: RecordFilterValueDependencies; filterValueDependencies: RecordFilterValueDependencies;
}) => { }) => {
if (!isDefined(view)) { if (!isDefined(view)) {
@ -33,18 +31,13 @@ export const getQueryVariablesFromView = ({
const { viewFilterGroups, viewFilters, viewSorts } = view; const { viewFilterGroups, viewFilters, viewSorts } = view;
const filterDefinitions = formatFieldMetadataItemsAsFilterDefinitions({
fields: fieldMetadataItems,
isJsonFilterEnabled,
});
const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({ const sortDefinitions = formatFieldMetadataItemsAsSortDefinitions({
fields: fieldMetadataItems, fields: fieldMetadataItems,
}); });
const filter = computeViewRecordGqlOperationFilter( const filter = computeViewRecordGqlOperationFilter(
filterValueDependencies, filterValueDependencies,
mapViewFiltersToFilters(viewFilters, filterDefinitions), mapViewFiltersToFilters(viewFilters, fieldMetadataItems),
objectMetadataItem?.fields ?? [], objectMetadataItem?.fields ?? [],
viewFilterGroups ?? [], viewFilterGroups ?? [],
); );

View File

@ -1,21 +1,31 @@
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { isDefined } from 'twenty-shared'; import { isDefined } from 'twenty-shared';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition'; import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { ViewFilter } from '../types/ViewFilter'; import { ViewFilter } from '../types/ViewFilter';
export const mapViewFiltersToFilters = ( export const mapViewFiltersToFilters = (
viewFilters: ViewFilter[], viewFilters: ViewFilter[],
availableFilterDefinitions: RecordFilterDefinition[], availableFieldMetadataItems: FieldMetadataItem[],
): RecordFilter[] => { ): RecordFilter[] => {
return viewFilters return viewFilters
.map((viewFilter) => { .map((viewFilter) => {
const availableFilterDefinition = availableFilterDefinitions.find( const availableFieldMetadataItem = availableFieldMetadataItems.find(
(filterDefinition) => (fieldMetadataItem) =>
filterDefinition.fieldMetadataId === viewFilter.fieldMetadataId, fieldMetadataItem.id === viewFilter.fieldMetadataId,
); );
if (!availableFilterDefinition) return null; if (!isDefined(availableFieldMetadataItem)) {
throw new Error(
`Field metadata item not found for view filter ${viewFilter.id} and field metadata id ${viewFilter.fieldMetadataId}`,
);
}
const filterType = getFilterTypeFromFieldType(
availableFieldMetadataItem.type,
);
return { return {
id: viewFilter.id, id: viewFilter.id,
@ -25,9 +35,8 @@ export const mapViewFiltersToFilters = (
operand: viewFilter.operand, operand: viewFilter.operand,
viewFilterGroupId: viewFilter.viewFilterGroupId, viewFilterGroupId: viewFilter.viewFilterGroupId,
positionInViewFilterGroup: viewFilter.positionInViewFilterGroup, positionInViewFilterGroup: viewFilter.positionInViewFilterGroup,
definition: viewFilter.definition ?? availableFilterDefinition, label: availableFieldMetadataItem.label,
label: viewFilter.definition?.label ?? availableFilterDefinition.label, type: filterType,
type: viewFilter.definition?.type ?? availableFilterDefinition.type,
}; };
}) })
.filter(isDefined); .filter(isDefined);