Moving record filter related types, hooks and utils into record-filter module (#9604)

This PR is only moving and renaming types, hooks and utils to
record-filter module folder.

- Moved and renamed types from object filter modules to record filter…-
Moved and renamed types from object filter modules to record filter
module
- Moved useApplyRecordFilter to record filter module
- Renamed util getOperandsForFilterDefinition to
getRecordFilterOperandsForRecordFilterDefinition
This commit is contained in:
Lucas Bordeau
2025-01-14 15:21:05 +01:00
committed by GitHub
parent 508feb4e7e
commit 6ab9b79bf3
71 changed files with 395 additions and 379 deletions

View File

@ -8,8 +8,8 @@ import { DEFAULT_QUERY_PAGE_SIZE } from '@/object-record/constants/DefaultQueryP
import { DELETE_MAX_COUNT } from '@/object-record/constants/DeleteMaxCount';
import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords';
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
import { FilterOperand } from '@/object-record/object-filter-dropdown/types/FilterOperand';
import { useFilterValueDependencies } from '@/object-record/record-filter/hooks/useFilterValueDependencies';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -57,7 +57,7 @@ export const useDeleteMultipleRecordsAction: ActionHookWithObjectMetadataItem =
const isDeletedFilterActive = contextStoreFilters.some(
(filter) =>
filter.fieldMetadataId === deletedAtFieldMetadata?.id &&
filter.operand === FilterOperand.IsNotEmpty,
filter.operand === RecordFilterOperand.IsNotEmpty,
);
const { fetchAllRecords: fetchAllRecordIds } = useLazyFetchAllRecords({

View File

@ -1,9 +1,9 @@
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const contextStoreFiltersComponentState = createComponentStateV2<
Filter[]
RecordFilter[]
>({
key: 'contextStoreFiltersComponentState',
defaultValue: [],

View File

@ -1,7 +1,7 @@
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { expect } from '@storybook/test';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
@ -11,7 +11,7 @@ describe('computeContextStoreFilters', () => {
(item) => item.nameSingular === 'person',
)!;
const mockFilterValueDependencies: FilterValueDependencies = {
const mockFilterValueDependencies: RecordFilterValueDependencies = {
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
};
@ -42,7 +42,7 @@ describe('computeContextStoreFilters', () => {
excludedRecordIds: ['1', '2', '3'],
};
const contextStoreFilters: Filter[] = [
const contextStoreFilters: RecordFilter[] = [
{
id: 'name-filter',
variant: 'default',

View File

@ -1,16 +1,16 @@
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
export const computeContextStoreFilters = (
contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule,
contextStoreFilters: Filter[],
contextStoreFilters: RecordFilter[],
objectMetadataItem: ObjectMetadataItem,
filterValueDependencies: FilterValueDependencies,
filterValueDependencies: RecordFilterValueDependencies,
) => {
let queryFilter: RecordGqlOperationFilter | undefined;

View File

@ -1,4 +1,4 @@
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import {
FieldMetadataType,
RelationDefinitionType,
@ -12,7 +12,7 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
}: {
fields: Array<ObjectMetadataItem['fields'][0]>;
isJsonFilterEnabled: boolean;
}): FilterDefinition[] => {
}): RecordFilterDefinition[] => {
return fields.reduce((acc, field) => {
if (
field.type === FieldMetadataType.Relation &&
@ -49,14 +49,14 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
}
return [...acc, formatFieldMetadataItemAsFilterDefinition({ field })];
}, [] as FilterDefinition[]);
}, [] as RecordFilterDefinition[]);
};
export const formatFieldMetadataItemAsFilterDefinition = ({
field,
}: {
field: ObjectMetadataItem['fields'][0];
}): FilterDefinition => ({
}): RecordFilterDefinition => ({
fieldMetadataId: field.id,
label: field.label,
iconName: field.icon ?? 'Icon123',

View File

@ -1,6 +1,6 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
@ -81,7 +81,9 @@ export const AdvancedFilterAddFilterRuleSelect = ({
upsertCombinedViewFilter({
id: v4(),
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
operand: getRecordFilterOperandsForRecordFilterDefinition(
defaultFilterDefinition,
)[0],
definition: defaultFilterDefinition,
value: '',
displayValue: '',
@ -112,7 +114,9 @@ export const AdvancedFilterAddFilterRuleSelect = ({
upsertCombinedViewFilter({
id: v4(),
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
operand: getRecordFilterOperandsForRecordFilterDefinition(
defaultFilterDefinition,
)[0],
definition: defaultFilterDefinition,
value: '',
displayValue: '',

View File

@ -1,7 +1,7 @@
import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { getOperandLabel } from '@/object-record/object-filter-dropdown/utils/getOperandLabel';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { SelectControl } from '@/ui/input/components/SelectControl';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
@ -56,7 +56,7 @@ export const AdvancedFilterViewFilterOperandSelect = ({
};
const operandsForFilterType = isDefined(filter?.definition)
? getOperandsForFilterDefinition(filter.definition)
? getRecordFilterOperandsForRecordFilterDefinition(filter.definition)
: [];
if (isDisabled === true) {

View File

@ -1,7 +1,7 @@
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
@ -102,7 +102,9 @@ export const AdvancedFilterButton = () => {
upsertCombinedViewFilter({
id: v4(),
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
operand: getRecordFilterOperandsForRecordFilterDefinition(
defaultFilterDefinition,
)[0],
definition: defaultFilterDefinition,
value: '',
displayValue: '',

View File

@ -1,9 +1,9 @@
import { AvatarChip, IconComponent } from 'twenty-ui';
import { Filter } from '../types/Filter';
import { RecordFilter } from '../../record-filter/types/RecordFilter';
type GenericEntityFilterChipProps = {
filter: Filter;
filter: RecordFilter;
Icon?: IconComponent;
};

View File

@ -3,10 +3,10 @@ import styled from '@emotion/styled';
import { useEffect, useState } from 'react';
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { BooleanDisplay } from '@/ui/field/display/components/BooleanDisplay';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';

View File

@ -1,10 +1,10 @@
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { getRelativeDateDisplayValue } from '@/object-record/object-filter-dropdown/utils/getRelativeDateDisplayValue';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';

View File

@ -8,7 +8,7 @@ import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object
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 { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
@ -25,6 +25,7 @@ import { isDefined } from 'twenty-ui';
import { FeatureFlagKey } from '~/generated/graphql';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
export const StyledInput = styled.input`
background: transparent;
border: none;

View File

@ -1,5 +1,4 @@
import { useAdvancedFilterDropdown } from '@/object-record/advanced-filter/hooks/useAdvancedFilterDropdown';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
@ -9,11 +8,12 @@ import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/o
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { getCompositeSubFieldLabel } from '@/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel';
import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs';
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
@ -83,7 +83,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
advancedFilterViewFilterId,
);
const handleSelectFilter = (definition: FilterDefinition | null) => {
const handleSelectFilter = (definition: RecordFilterDefinition | null) => {
if (definition !== null) {
if (
isDefined(advancedFilterViewFilterId) &&
@ -91,7 +91,8 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
) {
closeAdvancedFilterDropdown();
const operand = getOperandsForFilterDefinition(definition)[0];
const operand =
getRecordFilterOperandsForRecordFilterDefinition(definition)[0];
const { value, displayValue } = getInitialFilterValue(
definition.type,
operand,
@ -111,7 +112,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
setFilterDefinitionUsedInDropdown(definition);
setSelectedOperandInDropdown(
getOperandsForFilterDefinition(definition)[0],
getRecordFilterOperandsForRecordFilterDefinition(definition)[0],
);
setObjectFilterDropdownSearchInput('');

View File

@ -7,11 +7,11 @@ import { objectFilterDropdownFirstLevelFilterDefinitionComponentState } from '@/
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { CompositeFilterableFieldType } from '@/object-record/object-filter-dropdown/types/CompositeFilterableFieldType';
import { CompositeFilterableFieldType } from '@/object-record/record-filter/types/CompositeFilterableFieldType';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { isCompositeField } from '@/object-record/object-filter-dropdown/utils/isCompositeField';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
@ -22,7 +22,7 @@ import { useRecoilValue } from 'recoil';
import { MenuItemSelect, useIcons } from 'twenty-ui';
export type ObjectFilterDropdownFilterSelectMenuItemProps = {
filterDefinition: FilterDefinition;
filterDefinition: RecordFilterDefinition;
};
export const ObjectFilterDropdownFilterSelectMenuItem = ({
@ -74,7 +74,7 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
);
const handleSelectFilterDefinition = (
availableFilterDefinition: FilterDefinition,
availableFilterDefinition: RecordFilterDefinition,
) => {
closeAdvancedFilterDropdown();
@ -90,7 +90,9 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
}
setSelectedOperandInDropdown(
getOperandsForFilterDefinition(availableFilterDefinition)[0],
getRecordFilterOperandsForRecordFilterDefinition(
availableFilterDefinition,
)[0],
);
setObjectFilterDropdownFilterIsSelected(true);

View File

@ -1,10 +1,10 @@
import { ChangeEvent, useCallback, useState } from 'react';
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';

View File

@ -4,6 +4,7 @@ import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenu
import { ObjectFilterDropdownOperandSelect } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';

View File

@ -1,10 +1,10 @@
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -13,8 +13,8 @@ import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import styled from '@emotion/styled';
import { MenuItem } from 'twenty-ui';
import { isDefined } from '~/utils/isDefined';
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { getOperandLabel } from '../utils/getOperandLabel';
import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType';
const StyledDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)`
background-color: ${({ theme }) => theme.background.primary};
@ -39,7 +39,9 @@ export const ObjectFilterDropdownOperandSelect = () => {
const { closeDropdown } = useDropdown();
const operandsForFilterType = isDefined(filterDefinitionUsedInDropdown)
? getOperandsForFilterDefinition(filterDefinitionUsedInDropdown)
? getRecordFilterOperandsForRecordFilterDefinition(
filterDefinitionUsedInDropdown,
)
: [];
const handleOperandChange = (newOperand: ViewFilterOperand) => {

View File

@ -13,12 +13,12 @@ import { SelectableList } from '@/ui/layout/selectable-list/components/Selectabl
import { useSelectableListStates } from '@/ui/layout/selectable-list/hooks/internal/useSelectableListStates';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { MenuItem, MenuItemMultiSelect } from 'twenty-ui';

View File

@ -1,10 +1,10 @@
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues';
import { FieldRatingValue } from '@/object-record/record-field/types/FieldMetadata';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RatingInput } from '@/ui/field/input/components/RatingInput';
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';

View File

@ -4,12 +4,12 @@ import { v4 } from 'uuid';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
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 { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect';

View File

@ -1,7 +1,6 @@
import { useState } from 'react';
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { useEmptyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useEmptyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
@ -9,6 +8,7 @@ import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-re
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { getActorSourceMultiSelectOptions } from '@/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
import { SelectableItem } from '@/object-record/select/types/SelectableItem';

View File

@ -1,11 +1,11 @@
import { ChangeEvent, useCallback, useState } from 'react';
import { v4 } from 'uuid';
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';

View File

@ -15,7 +15,7 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object-
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType';
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { GenericEntityFilterChip } from './GenericEntityFilterChip';
import { ObjectFilterDropdownRecordSelect } from './ObjectFilterDropdownRecordSelect';
import { ObjectFilterDropdownSearchInput } from './ObjectFilterDropdownSearchInput';
@ -47,7 +47,7 @@ export const SingleEntityObjectFilterDropdownButton = ({
React.useEffect(() => {
setFilterDefinitionUsedInDropdown(availableFilterDefinition);
const defaultOperand = getOperandsForFilterDefinition(
const defaultOperand = getRecordFilterOperandsForRecordFilterDefinition(
availableFilterDefinition,
)[0];
setSelectedOperandInDropdown(defaultOperand);

View File

@ -1,12 +1,12 @@
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
import { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
@ -15,7 +15,7 @@ import { isDefined } from 'twenty-ui';
import { v4 } from 'uuid';
type SelectFilterParams = {
filterDefinition: FilterDefinition;
filterDefinition: RecordFilterDefinition;
};
export const useSelectFilterDefinitionUsedInDropdown = (
@ -63,12 +63,12 @@ export const useSelectFilterDefinitionUsedInDropdown = (
}
setSelectedOperandInDropdown(
getOperandsForFilterDefinition(filterDefinition)[0],
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
);
const { value, displayValue } = getInitialFilterValue(
filterDefinition.type,
getOperandsForFilterDefinition(filterDefinition)[0],
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
);
const isAdvancedFilter = isDefined(advancedFilterViewFilterId);
@ -78,7 +78,8 @@ export const useSelectFilterDefinitionUsedInDropdown = (
id: advancedFilterViewFilterId ?? v4(),
fieldMetadataId: filterDefinition.fieldMetadataId,
displayValue,
operand: getOperandsForFilterDefinition(filterDefinition)[0],
operand:
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
value,
definition: filterDefinition,
viewFilterGroupId: advancedFilterViewFilterGroupId,

View File

@ -1,9 +1,9 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const availableFilterDefinitionsComponentState = createComponentStateV2<
FilterDefinition[]
RecordFilterDefinition[]
>({
key: 'availableFilterDefinitionsComponentState',
defaultValue: [],

View File

@ -1,9 +1,9 @@
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';
import { FilterDefinition } from '../types/FilterDefinition';
export const filterDefinitionUsedInDropdownComponentState =
createComponentStateV2<FilterDefinition | null>({
createComponentStateV2<RecordFilterDefinition | null>({
key: 'filterDefinitionUsedInDropdownComponentState',
defaultValue: null,
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,

View File

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

View File

@ -1,5 +1,5 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { CompositeFilterableFieldType } from '@/object-record/object-filter-dropdown/types/CompositeFilterableFieldType';
import { CompositeFilterableFieldType } from '@/object-record/record-filter/types/CompositeFilterableFieldType';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const objectFilterDropdownSubMenuFieldTypeComponentState =

View File

@ -1,9 +1,9 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
import { Filter } from '../types/Filter';
import { RecordFilter } from '../../record-filter/types/RecordFilter';
export const onFilterSelectComponentState = createComponentStateV2<
((filter: Filter | null) => void) | undefined
((filter: RecordFilter | null) => void) | undefined
>({
key: 'onFilterSelectComponentState',
defaultValue: undefined,

View File

@ -1,9 +1,9 @@
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
import { Filter } from '../types/Filter';
import { RecordFilter } from '../../record-filter/types/RecordFilter';
export const selectedFilterComponentState = createComponentStateV2<
Filter | undefined | null
RecordFilter | undefined | null
>({
key: 'selectedFilterComponentState',
defaultValue: undefined,

View File

@ -1,5 +0,0 @@
import { FilterDefinition } from './FilterDefinition';
export type FilterDefinitionByEntity<T> = FilterDefinition & {
fieldMetadataId: keyof T;
};

View File

@ -1,4 +0,0 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
export type FilterDraft = Partial<Filter> &
Omit<Filter, 'fieldMetadataId' | 'operand' | 'definition'>;

View File

@ -1 +0,0 @@
export { ViewFilterOperand as FilterOperand } from '@/views/types/ViewFilterOperand';

View File

@ -1,36 +1,35 @@
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
import { getOperandsForFilterDefinition } from '../getOperandsForFilterType';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
describe('getOperandsForFilterType', () => {
const emptyOperands = [
ViewFilterOperand.IsEmpty,
ViewFilterOperand.IsNotEmpty,
RecordFilterOperand.IsEmpty,
RecordFilterOperand.IsNotEmpty,
];
const containsOperands = [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
];
const numberOperands = [
ViewFilterOperand.GreaterThan,
ViewFilterOperand.LessThan,
RecordFilterOperand.GreaterThan,
RecordFilterOperand.LessThan,
];
const dateOperands = [
ViewFilterOperand.Is,
ViewFilterOperand.IsRelative,
ViewFilterOperand.IsInPast,
ViewFilterOperand.IsInFuture,
ViewFilterOperand.IsToday,
ViewFilterOperand.IsBefore,
ViewFilterOperand.IsAfter,
RecordFilterOperand.Is,
RecordFilterOperand.IsRelative,
RecordFilterOperand.IsInPast,
RecordFilterOperand.IsInFuture,
RecordFilterOperand.IsToday,
RecordFilterOperand.IsBefore,
RecordFilterOperand.IsAfter,
];
const relationOperand = [ViewFilterOperand.Is, ViewFilterOperand.IsNot];
const relationOperand = [RecordFilterOperand.Is, RecordFilterOperand.IsNot];
const testCases = [
['TEXT', [...containsOperands, ...emptyOperands]],
@ -50,9 +49,9 @@ describe('getOperandsForFilterType', () => {
testCases.forEach(([filterType, expectedOperands]) => {
it(`should return correct operands for FilterType.${filterType}`, () => {
const result = getOperandsForFilterDefinition({
const result = getRecordFilterOperandsForRecordFilterDefinition({
type: filterType as FilterableFieldType,
} as FilterDefinition);
} as RecordFilterDefinition);
expect(result).toEqual(expectedOperands);
});
});

View File

@ -1,4 +1,4 @@
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs';
export const getFilterableFieldTypeLabel = (

View File

@ -1,21 +1,21 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { z } from 'zod';
export const getInitialFilterValue = (
newType: FilterableFieldType,
newOperand: ViewFilterOperand,
newOperand: RecordFilterOperand,
oldValue?: string,
oldDisplayValue?: string,
): Pick<Filter, 'value' | 'displayValue'> | Record<string, never> => {
): Pick<RecordFilter, 'value' | 'displayValue'> | Record<string, never> => {
switch (newType) {
case 'DATE':
case 'DATE_TIME': {
const activeDatePickerOperands = [
ViewFilterOperand.IsBefore,
ViewFilterOperand.Is,
ViewFilterOperand.IsAfter,
RecordFilterOperand.IsBefore,
RecordFilterOperand.Is,
RecordFilterOperand.IsAfter,
];
if (activeDatePickerOperands.includes(newOperand)) {
@ -29,7 +29,7 @@ export const getInitialFilterValue = (
return { value, displayValue };
}
if (newOperand === ViewFilterOperand.IsRelative) {
if (newOperand === RecordFilterOperand.IsRelative) {
return { value: '', displayValue: '' };
}
break;

View File

@ -1,95 +0,0 @@
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
export const getOperandsForFilterDefinition = (
filterDefinition: Pick<FilterDefinition, 'type' | 'compositeFieldName'>,
): ViewFilterOperand[] => {
const emptyOperands = [
ViewFilterOperand.IsEmpty,
ViewFilterOperand.IsNotEmpty,
];
const relationOperands = [ViewFilterOperand.Is, ViewFilterOperand.IsNot];
switch (filterDefinition.type) {
case 'TEXT':
case 'EMAILS':
case 'FULL_NAME':
case 'ADDRESS':
case 'LINKS':
case 'PHONES':
return [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'CURRENCY':
case 'NUMBER':
return [
ViewFilterOperand.GreaterThan,
ViewFilterOperand.LessThan,
...emptyOperands,
];
case 'RAW_JSON':
return [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'DATE_TIME':
case 'DATE':
return [
ViewFilterOperand.Is,
ViewFilterOperand.IsRelative,
ViewFilterOperand.IsInPast,
ViewFilterOperand.IsInFuture,
ViewFilterOperand.IsToday,
ViewFilterOperand.IsBefore,
ViewFilterOperand.IsAfter,
...emptyOperands,
];
case 'RATING':
return [
ViewFilterOperand.Is,
ViewFilterOperand.GreaterThan,
ViewFilterOperand.LessThan,
...emptyOperands,
];
case 'RELATION':
return [...relationOperands, ...emptyOperands];
case 'MULTI_SELECT':
return [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'SELECT':
return [ViewFilterOperand.Is, ViewFilterOperand.IsNot, ...emptyOperands];
case 'ACTOR': {
if (isActorSourceCompositeFilter(filterDefinition)) {
return [
ViewFilterOperand.Is,
ViewFilterOperand.IsNot,
...emptyOperands,
];
}
return [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
...emptyOperands,
];
}
case 'ARRAY':
return [
ViewFilterOperand.Contains,
ViewFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'BOOLEAN':
return [ViewFilterOperand.Is];
default:
return [];
}
};

View File

@ -1,4 +1,4 @@
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
export const getSubMenuOptions = (subMenu: FilterableFieldType | null) => {
switch (subMenu) {

View File

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

View File

@ -1,6 +1,6 @@
import { onFilterSelectComponentState } from '@/object-record/object-filter-dropdown/states/onFilterSelectComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
@ -21,7 +21,7 @@ export const useApplyRecordFilter = (componentInstanceId?: string) => {
const applyRecordFilter = useRecoilCallback(
({ set, snapshot }) =>
(filter: Filter | null) => {
(filter: RecordFilter | null) => {
set(selectedFilterCallbackState, filter);
const onFilterSelect = getSnapshotValue(

View File

@ -1,9 +1,9 @@
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { useRecoilValue } from 'recoil';
export const useFilterValueDependencies = (): {
filterValueDependencies: FilterValueDependencies;
filterValueDependencies: RecordFilterValueDependencies;
} => {
const { id: currentWorkspaceMemberId } =
useRecoilValue(currentWorkspaceMemberState) ?? {};

View File

@ -1,4 +1,4 @@
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType';
export type CompositeFilterableFieldType = FilterableFieldType &

View File

@ -1,3 +0,0 @@
export interface FilterValueDependencies {
currentWorkspaceMemberId?: string;
}

View File

@ -1,7 +1,7 @@
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { FilterDefinition } from './FilterDefinition';
export type Filter = {
export type RecordFilter = {
id: string;
variant?: 'default' | 'danger';
fieldMetadataId: string;
@ -11,5 +11,5 @@ export type Filter = {
displayAvatarUrl?: string;
operand: ViewFilterOperand;
positionInViewFilterGroup?: number | null;
definition: FilterDefinition;
definition: RecordFilterDefinition;
};

View File

@ -2,7 +2,7 @@ import { IconComponent } from 'twenty-ui';
import { FilterableFieldType } from './FilterableFieldType';
export type FilterDefinition = {
export type RecordFilterDefinition = {
fieldMetadataId: string;
label: string;
iconName: string;

View File

@ -0,0 +1,4 @@
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
export type FilterDraft = Partial<RecordFilter> &
Omit<RecordFilter, 'fieldMetadataId' | 'operand' | 'definition'>;

View File

@ -0,0 +1 @@
export { ViewFilterOperand as RecordFilterOperand } from '@/views/types/ViewFilterOperand';

View File

@ -0,0 +1,3 @@
export interface RecordFilterValueDependencies {
currentWorkspaceMemberId?: string;
}

View File

@ -1,5 +1,5 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { getCompaniesMock } from '~/testing/mock-data/companies';
@ -15,7 +15,7 @@ const personMockObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
)!;
const mockFilterValueDependencies: FilterValueDependencies = {
const mockFilterValueDependencies: RecordFilterValueDependencies = {
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
};
@ -28,7 +28,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
(field) => field.name === 'name',
);
const nameFilter: Filter = {
const nameFilter: RecordFilter = {
id: 'company-name-filter',
value: companiesMock[0].name,
fieldMetadataId: companyMockNameFieldMetadataId?.id,
@ -67,7 +67,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
(field) => field.name === 'employees',
);
const nameFilter: Filter = {
const nameFilter: RecordFilter = {
id: 'company-name-filter',
value: companiesMock[0].name,
fieldMetadataId: companyMockNameFieldMetadataId?.id,
@ -81,7 +81,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
},
};
const employeesFilter: Filter = {
const employeesFilter: RecordFilter = {
id: 'company-employees-filter',
value: '1000',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
@ -126,7 +126,7 @@ describe('should work as expected for the different field types', () => {
(field) => field.name === 'address',
);
const addressFilterContains: Filter = {
const addressFilterContains: RecordFilter = {
id: 'company-address-filter-contains',
value: '123 Main St',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
@ -140,7 +140,7 @@ describe('should work as expected for the different field types', () => {
},
};
const addressFilterDoesNotContain: Filter = {
const addressFilterDoesNotContain: RecordFilter = {
id: 'company-address-filter-does-not-contain',
value: '123 Main St',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
@ -154,7 +154,7 @@ describe('should work as expected for the different field types', () => {
},
};
const addressFilterIsEmpty: Filter = {
const addressFilterIsEmpty: RecordFilter = {
id: 'company-address-filter-is-empty',
value: '',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
@ -168,7 +168,7 @@ describe('should work as expected for the different field types', () => {
},
};
const addressFilterIsNotEmpty: Filter = {
const addressFilterIsNotEmpty: RecordFilter = {
id: 'company-address-filter-is-not-empty',
value: '',
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
@ -509,7 +509,7 @@ describe('should work as expected for the different field types', () => {
(field) => field.name === 'phones',
);
const phonesFilterContains: Filter = {
const phonesFilterContains: RecordFilter = {
id: 'person-phones-filter-contains',
value: '1234567890',
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
@ -523,7 +523,7 @@ describe('should work as expected for the different field types', () => {
},
};
const phonesFilterDoesNotContain: Filter = {
const phonesFilterDoesNotContain: RecordFilter = {
id: 'person-phones-filter-does-not-contain',
value: '1234567890',
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
@ -537,7 +537,7 @@ describe('should work as expected for the different field types', () => {
},
};
const phonesFilterIsEmpty: Filter = {
const phonesFilterIsEmpty: RecordFilter = {
id: 'person-phones-filter-is-empty',
value: '',
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
@ -551,7 +551,7 @@ describe('should work as expected for the different field types', () => {
},
};
const phonesFilterIsNotEmpty: Filter = {
const phonesFilterIsNotEmpty: RecordFilter = {
id: 'person-phones-filter-is-not-empty',
value: '',
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
@ -659,7 +659,7 @@ describe('should work as expected for the different field types', () => {
(field) => field.name === 'emails',
);
const emailsFilterContains: Filter = {
const emailsFilterContains: RecordFilter = {
id: 'person-emails-filter-contains',
value: 'test@test.com',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
@ -673,7 +673,7 @@ describe('should work as expected for the different field types', () => {
},
};
const emailsFilterDoesNotContain: Filter = {
const emailsFilterDoesNotContain: RecordFilter = {
id: 'person-emails-filter-does-not-contain',
value: 'test@test.com',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
@ -687,7 +687,7 @@ describe('should work as expected for the different field types', () => {
},
};
const emailsFilterIsEmpty: Filter = {
const emailsFilterIsEmpty: RecordFilter = {
id: 'person-emails-filter-is-empty',
value: '',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
@ -701,7 +701,7 @@ describe('should work as expected for the different field types', () => {
},
};
const emailsFilterIsNotEmpty: Filter = {
const emailsFilterIsNotEmpty: RecordFilter = {
id: 'person-emails-filter-is-not-empty',
value: '',
fieldMetadataId: personMockEmailFieldMetadataId?.id,
@ -801,7 +801,7 @@ describe('should work as expected for the different field types', () => {
(field) => field.name === 'createdAt',
);
const dateFilterIsAfter: Filter = {
const dateFilterIsAfter: RecordFilter = {
id: 'company-date-filter-is-after',
value: '2024-09-17T20:46:58.922Z',
fieldMetadataId: companyMockDateFieldMetadataId?.id,
@ -815,7 +815,7 @@ describe('should work as expected for the different field types', () => {
},
};
const dateFilterIsBefore: Filter = {
const dateFilterIsBefore: RecordFilter = {
id: 'company-date-filter-is-before',
value: '2024-09-17T20:46:58.922Z',
fieldMetadataId: companyMockDateFieldMetadataId?.id,
@ -829,7 +829,7 @@ describe('should work as expected for the different field types', () => {
},
};
const dateFilterIs: Filter = {
const dateFilterIs: RecordFilter = {
id: 'company-date-filter-is',
value: '2024-09-17T20:46:58.922Z',
fieldMetadataId: companyMockDateFieldMetadataId?.id,
@ -843,7 +843,7 @@ describe('should work as expected for the different field types', () => {
},
};
const dateFilterIsEmpty: Filter = {
const dateFilterIsEmpty: RecordFilter = {
id: 'company-date-filter-is-empty',
value: '',
fieldMetadataId: companyMockDateFieldMetadataId?.id,
@ -857,7 +857,7 @@ describe('should work as expected for the different field types', () => {
},
};
const dateFilterIsNotEmpty: Filter = {
const dateFilterIsNotEmpty: RecordFilter = {
id: 'company-date-filter-is-not-empty',
value: '',
fieldMetadataId: companyMockDateFieldMetadataId?.id,
@ -932,7 +932,7 @@ describe('should work as expected for the different field types', () => {
(field) => field.name === 'employees',
);
const employeesFilterIsGreaterThan: Filter = {
const employeesFilterIsGreaterThan: RecordFilter = {
id: 'company-employees-filter-is-greater-than',
value: '1000',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
@ -946,7 +946,7 @@ describe('should work as expected for the different field types', () => {
},
};
const employeesFilterIsLessThan: Filter = {
const employeesFilterIsLessThan: RecordFilter = {
id: 'company-employees-filter-is-less-than',
value: '1000',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
@ -960,7 +960,7 @@ describe('should work as expected for the different field types', () => {
},
};
const employeesFilterIsEmpty: Filter = {
const employeesFilterIsEmpty: RecordFilter = {
id: 'company-employees-filter-is-empty',
value: '',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
@ -974,7 +974,7 @@ describe('should work as expected for the different field types', () => {
},
};
const employeesFilterIsNotEmpty: Filter = {
const employeesFilterIsNotEmpty: RecordFilter = {
id: 'company-employees-filter-is-not-empty',
value: '',
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,

View File

@ -18,7 +18,6 @@ import {
SelectFilter,
StringFilter,
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { Field } from '~/generated/graphql';
import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields';
import { isDefined } from '~/utils/isDefined';
@ -28,8 +27,9 @@ import {
convertLessThanRatingToArrayOfRatingValues,
convertRatingToRatingValue,
} from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { getEmptyRecordGqlOperationFilter } from '@/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter';
import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
@ -41,8 +41,8 @@ import { endOfDay, roundToNearestMinutes, startOfDay } from 'date-fns';
import { z } from 'zod';
const computeFilterRecordGqlOperationFilter = (
filterValueDependencies: FilterValueDependencies,
filter: Filter,
filterValueDependencies: RecordFilterValueDependencies,
filter: RecordFilter,
fields: Pick<Field, 'id' | 'name'>[],
): RecordGqlOperationFilter | undefined => {
const correspondingField = fields.find(
@ -54,11 +54,11 @@ const computeFilterRecordGqlOperationFilter = (
const isCompositeFieldFiter = isNonEmptyString(compositeFieldName);
const isEmptyOperand = [
ViewFilterOperand.IsEmpty,
ViewFilterOperand.IsNotEmpty,
ViewFilterOperand.IsInPast,
ViewFilterOperand.IsInFuture,
ViewFilterOperand.IsToday,
RecordFilterOperand.IsEmpty,
RecordFilterOperand.IsNotEmpty,
RecordFilterOperand.IsInPast,
RecordFilterOperand.IsInFuture,
RecordFilterOperand.IsToday,
].includes(filter.operand);
if (!correspondingField) {
@ -74,13 +74,13 @@ const computeFilterRecordGqlOperationFilter = (
switch (filter.definition.type) {
case 'TEXT':
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
[correspondingField.name]: {
ilike: `%${filter.value}%`,
} as StringFilter,
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
not: {
[correspondingField.name]: {
@ -88,8 +88,8 @@ const computeFilterRecordGqlOperationFilter = (
} as StringFilter,
},
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -102,13 +102,13 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'RAW_JSON':
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
[correspondingField.name]: {
like: `%${filter.value}%`,
} as RawJsonFilter,
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
not: {
[correspondingField.name]: {
@ -116,8 +116,8 @@ const computeFilterRecordGqlOperationFilter = (
} as RawJsonFilter,
},
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -136,36 +136,36 @@ const computeFilterRecordGqlOperationFilter = (
resolvedFilterValue instanceof Date ? resolvedFilterValue : now;
switch (filter.operand) {
case ViewFilterOperand.IsAfter: {
case RecordFilterOperand.IsAfter: {
return {
[correspondingField.name]: {
gt: date.toISOString(),
} as DateFilter,
};
}
case ViewFilterOperand.IsBefore: {
case RecordFilterOperand.IsBefore: {
return {
[correspondingField.name]: {
lt: date.toISOString(),
} as DateFilter,
};
}
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty: {
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty: {
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
filter.definition,
);
}
case ViewFilterOperand.IsRelative: {
case RecordFilterOperand.IsRelative: {
const dateRange = z
.object({ start: z.date(), end: z.date() })
.safeParse(resolvedFilterValue).data;
const defaultDateRange = resolveDateViewFilterValue({
value: 'PAST_1_DAY',
operand: ViewFilterOperand.IsRelative,
operand: RecordFilterOperand.IsRelative,
});
if (!defaultDateRange) {
@ -189,7 +189,7 @@ const computeFilterRecordGqlOperationFilter = (
],
};
}
case ViewFilterOperand.Is: {
case RecordFilterOperand.Is: {
const isValid = resolvedFilterValue instanceof Date;
const date = isValid ? resolvedFilterValue : now;
@ -208,19 +208,19 @@ const computeFilterRecordGqlOperationFilter = (
],
};
}
case ViewFilterOperand.IsInPast:
case RecordFilterOperand.IsInPast:
return {
[correspondingField.name]: {
lte: now.toISOString(),
} as DateFilter,
};
case ViewFilterOperand.IsInFuture:
case RecordFilterOperand.IsInFuture:
return {
[correspondingField.name]: {
gte: now.toISOString(),
} as DateFilter,
};
case ViewFilterOperand.IsToday: {
case RecordFilterOperand.IsToday: {
return {
and: [
{
@ -244,13 +244,13 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'RATING':
switch (filter.operand) {
case ViewFilterOperand.Is:
case RecordFilterOperand.Is:
return {
[correspondingField.name]: {
eq: convertRatingToRatingValue(parseFloat(filter.value)),
} as RatingFilter,
};
case ViewFilterOperand.GreaterThan:
case RecordFilterOperand.GreaterThan:
return {
[correspondingField.name]: {
in: convertGreaterThanRatingToArrayOfRatingValues(
@ -258,7 +258,7 @@ const computeFilterRecordGqlOperationFilter = (
),
} as RatingFilter,
};
case ViewFilterOperand.LessThan:
case RecordFilterOperand.LessThan:
return {
[correspondingField.name]: {
in: convertLessThanRatingToArrayOfRatingValues(
@ -266,8 +266,8 @@ const computeFilterRecordGqlOperationFilter = (
),
} as RatingFilter,
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -280,20 +280,20 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'NUMBER':
switch (filter.operand) {
case ViewFilterOperand.GreaterThan:
case RecordFilterOperand.GreaterThan:
return {
[correspondingField.name]: {
gte: parseFloat(filter.value),
} as FloatFilter,
};
case ViewFilterOperand.LessThan:
case RecordFilterOperand.LessThan:
return {
[correspondingField.name]: {
lte: parseFloat(filter.value),
} as FloatFilter,
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -325,13 +325,13 @@ const computeFilterRecordGqlOperationFilter = (
if (recordIds.length === 0) return;
switch (filter.operand) {
case ViewFilterOperand.Is:
case RecordFilterOperand.Is:
return {
[correspondingField.name + 'Id']: {
in: recordIds,
} as RelationFilter,
};
case ViewFilterOperand.IsNot: {
case RecordFilterOperand.IsNot: {
if (recordIds.length === 0) return;
return {
or: [
@ -357,8 +357,8 @@ const computeFilterRecordGqlOperationFilter = (
}
} else {
switch (filter.operand) {
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -373,20 +373,20 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'CURRENCY':
switch (filter.operand) {
case ViewFilterOperand.GreaterThan:
case RecordFilterOperand.GreaterThan:
return {
[correspondingField.name]: {
amountMicros: { gte: parseFloat(filter.value) * 1000000 },
} as CurrencyFilter,
};
case ViewFilterOperand.LessThan:
case RecordFilterOperand.LessThan:
return {
[correspondingField.name]: {
amountMicros: { lte: parseFloat(filter.value) * 1000000 },
} as CurrencyFilter,
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -405,7 +405,7 @@ const computeFilterRecordGqlOperationFilter = (
);
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
if (!isCompositeFieldFiter) {
return {
or: linksFilters,
@ -419,7 +419,7 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
if (!isCompositeFieldFiter) {
return {
and: linksFilters.map((filter) => {
@ -439,8 +439,8 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -459,7 +459,7 @@ const computeFilterRecordGqlOperationFilter = (
['firstName', 'lastName'],
);
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
if (!isCompositeFieldFiter) {
return {
or: fullNameFilters,
@ -473,7 +473,7 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
if (!isCompositeFieldFiter) {
return {
and: fullNameFilters.map((filter) => {
@ -493,8 +493,8 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -508,7 +508,7 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'ADDRESS':
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
if (!isCompositeFieldFiter) {
return {
or: [
@ -565,7 +565,7 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
if (!isCompositeFieldFiter) {
return {
and: [
@ -609,8 +609,8 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -635,13 +635,13 @@ const computeFilterRecordGqlOperationFilter = (
if (options.length === 0) return;
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
[correspondingField.name]: {
containsAny: options,
} as MultiSelectFilter,
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
or: [
{
@ -682,13 +682,13 @@ const computeFilterRecordGqlOperationFilter = (
if (options.length === 0) return;
switch (filter.operand) {
case ViewFilterOperand.Is:
case RecordFilterOperand.Is:
return {
[correspondingField.name]: {
in: options,
} as SelectFilter,
};
case ViewFilterOperand.IsNot:
case RecordFilterOperand.IsNot:
return {
not: {
[correspondingField.name]: {
@ -704,13 +704,13 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'ARRAY': {
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
[correspondingField.name]: {
containsIlike: `%${filter.value}%`,
} as ArrayFilter,
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
not: {
[correspondingField.name]: {
@ -718,8 +718,8 @@ const computeFilterRecordGqlOperationFilter = (
} as ArrayFilter,
},
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -734,7 +734,7 @@ const computeFilterRecordGqlOperationFilter = (
// TODO: fix this with a new composite field in ViewFilter entity
case 'ACTOR': {
switch (filter.operand) {
case ViewFilterOperand.Is: {
case RecordFilterOperand.Is: {
const parsedRecordIds = JSON.parse(filter.value) as string[];
return {
@ -745,7 +745,7 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.IsNot: {
case RecordFilterOperand.IsNot: {
const parsedRecordIds = JSON.parse(filter.value) as string[];
if (parsedRecordIds.length === 0) return;
@ -760,7 +760,7 @@ const computeFilterRecordGqlOperationFilter = (
},
};
}
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
or: [
{
@ -772,7 +772,7 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
and: [
{
@ -786,8 +786,8 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -801,7 +801,7 @@ const computeFilterRecordGqlOperationFilter = (
}
case 'EMAILS':
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
or: [
{
@ -813,7 +813,7 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
and: [
{
@ -827,8 +827,8 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -843,7 +843,7 @@ const computeFilterRecordGqlOperationFilter = (
const filterValue = filter.value.replace(/[^0-9]/g, '');
switch (filter.operand) {
case ViewFilterOperand.Contains:
case RecordFilterOperand.Contains:
return {
or: [
{
@ -855,7 +855,7 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.DoesNotContain:
case RecordFilterOperand.DoesNotContain:
return {
and: [
{
@ -869,8 +869,8 @@ const computeFilterRecordGqlOperationFilter = (
},
],
};
case ViewFilterOperand.IsEmpty:
case ViewFilterOperand.IsNotEmpty:
case RecordFilterOperand.IsEmpty:
case RecordFilterOperand.IsNotEmpty:
return getEmptyRecordGqlOperationFilter(
filter.operand,
correspondingField,
@ -895,8 +895,8 @@ const computeFilterRecordGqlOperationFilter = (
};
const computeViewFilterGroupRecordGqlOperationFilter = (
filterValueDependencies: FilterValueDependencies,
filters: Filter[],
filterValueDependencies: RecordFilterValueDependencies,
filters: RecordFilter[],
fields: Pick<Field, 'id' | 'name'>[],
viewFilterGroups: ViewFilterGroup[],
currentViewFilterGroupId?: string,
@ -966,8 +966,8 @@ const computeViewFilterGroupRecordGqlOperationFilter = (
};
export const computeViewRecordGqlOperationFilter = (
filterValueDependencies: FilterValueDependencies,
filters: Filter[],
filterValueDependencies: RecordFilterValueDependencies,
filters: RecordFilter[],
fields: Pick<Field, 'id' | 'name'>[],
viewFilterGroups: ViewFilterGroup[],
): RecordGqlOperationFilter => {

View File

@ -15,7 +15,7 @@ import {
StringFilter,
URLFilter,
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { isNonEmptyString } from '@sniptt/guards';
import { Field } from '~/generated/graphql';
@ -24,7 +24,7 @@ import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateIL
export const getEmptyRecordGqlOperationFilter = (
operand: ViewFilterOperand,
correspondingField: Pick<Field, 'id' | 'name'>,
definition: FilterDefinition,
definition: RecordFilterDefinition,
) => {
let emptyRecordFilter: RecordGqlOperationFilter = {};

View File

@ -0,0 +1,99 @@
import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilterOperand as RecordFilterOperand } from '@/views/types/ViewFilterOperand';
export const getRecordFilterOperandsForRecordFilterDefinition = (
filterDefinition: Pick<RecordFilterDefinition, 'type' | 'compositeFieldName'>,
): RecordFilterOperand[] => {
const emptyOperands = [
RecordFilterOperand.IsEmpty,
RecordFilterOperand.IsNotEmpty,
];
const relationOperands = [RecordFilterOperand.Is, RecordFilterOperand.IsNot];
switch (filterDefinition.type) {
case 'TEXT':
case 'EMAILS':
case 'FULL_NAME':
case 'ADDRESS':
case 'LINKS':
case 'PHONES':
return [
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'CURRENCY':
case 'NUMBER':
return [
RecordFilterOperand.GreaterThan,
RecordFilterOperand.LessThan,
...emptyOperands,
];
case 'RAW_JSON':
return [
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'DATE_TIME':
case 'DATE':
return [
RecordFilterOperand.Is,
RecordFilterOperand.IsRelative,
RecordFilterOperand.IsInPast,
RecordFilterOperand.IsInFuture,
RecordFilterOperand.IsToday,
RecordFilterOperand.IsBefore,
RecordFilterOperand.IsAfter,
...emptyOperands,
];
case 'RATING':
return [
RecordFilterOperand.Is,
RecordFilterOperand.GreaterThan,
RecordFilterOperand.LessThan,
...emptyOperands,
];
case 'RELATION':
return [...relationOperands, ...emptyOperands];
case 'MULTI_SELECT':
return [
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'SELECT':
return [
RecordFilterOperand.Is,
RecordFilterOperand.IsNot,
...emptyOperands,
];
case 'ACTOR': {
if (isActorSourceCompositeFilter(filterDefinition)) {
return [
RecordFilterOperand.Is,
RecordFilterOperand.IsNot,
...emptyOperands,
];
}
return [
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
...emptyOperands,
];
}
case 'ARRAY':
return [
RecordFilterOperand.Contains,
RecordFilterOperand.DoesNotContain,
...emptyOperands,
];
case 'BOOLEAN':
return [RecordFilterOperand.Is];
default:
return [];
}
};

View File

@ -4,8 +4,9 @@ import { v4 } from 'uuid';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { getOperandsForFilterDefinition } from '@/object-record/object-filter-dropdown/utils/getOperandsForFilterType';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { getRecordFilterOperandsForRecordFilterDefinition } from '@/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
import { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
@ -79,11 +80,11 @@ export const useHandleToggleColumnFilter = ({
}
const availableOperandsForFilter =
getOperandsForFilterDefinition(filterDefinition);
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition);
const defaultOperand = availableOperandsForFilter[0];
const newFilter: Filter = {
const newFilter: RecordFilter = {
id: newFilterId,
fieldMetadataId,
operand: defaultOperand,

View File

@ -4,7 +4,7 @@ import { v4 } from 'uuid';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
@ -54,7 +54,7 @@ export const useHandleToggleTrashColumnFilter = ({
correspondingColumnDefinition?.type,
);
const newFilter: Filter = {
const newFilter: RecordFilter = {
id: v4(),
variant: 'danger',
fieldMetadataId: trashFieldMetadata.id,

View File

@ -1,8 +1,8 @@
import { createState } from '@ui/utilities/state/utils/createState';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
export const recordIndexFiltersState = createState<Filter[]>({
export const recordIndexFiltersState = createState<RecordFilter[]>({
key: 'recordIndexFiltersState',
defaultValue: [],
});

View File

@ -1,8 +1,10 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
export const tableFiltersComponentState = createComponentStateV2<Filter[]>({
export const tableFiltersComponentState = createComponentStateV2<
RecordFilter[]
>({
key: 'tableFiltersComponentState',
defaultValue: [],
componentInstanceContext: RecordTableComponentInstanceContext,

View File

@ -1,4 +1,4 @@
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
export const SIGN_IN_BACKGROUND_MOCK_FILTER_DEFINITIONS = [
{
@ -57,4 +57,4 @@ export const SIGN_IN_BACKGROUND_MOCK_FILTER_DEFINITIONS = [
iconName: 'IconMoneybag',
type: 'CURRENCY',
},
] as FilterDefinition[];
] as RecordFilterDefinition[];

View File

@ -1,11 +1,11 @@
import { useIcons } from 'twenty-ui';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { getOperandLabelShort } from '@/object-record/object-filter-dropdown/utils/getOperandLabel';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
type EditableFilterChipProps = {
viewFilter: Filter;
viewFilter: RecordFilter;
onRemove: () => void;
};

View File

@ -1,18 +1,17 @@
import { useCallback, useEffect } from 'react';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterOperand } from '@/object-record/object-filter-dropdown/types/FilterOperand';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { EditableFilterChip } from '@/views/components/EditableFilterChip';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { ObjectFilterOperandSelectAndInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterOperandSelectAndInput';
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
@ -20,7 +19,7 @@ import { isDefined } from '~/utils/isDefined';
type EditableFilterDropdownButtonProps = {
viewFilterDropdownId: string;
viewFilter: Filter;
viewFilter: RecordFilter;
hotkeyScope: HotkeyScope;
};
@ -85,11 +84,11 @@ export const EditableFilterDropdownButton = ({
if (
!value &&
![
FilterOperand.IsEmpty,
FilterOperand.IsNotEmpty,
ViewFilterOperand.IsInPast,
ViewFilterOperand.IsInFuture,
ViewFilterOperand.IsToday,
RecordFilterOperand.IsEmpty,
RecordFilterOperand.IsNotEmpty,
RecordFilterOperand.IsInPast,
RecordFilterOperand.IsInFuture,
RecordFilterOperand.IsToday,
].includes(operand)
) {
deleteCombinedViewFilter(fieldId);

View File

@ -1,14 +1,14 @@
import { useIcons } from 'twenty-ui';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
import { useParams } from 'react-router-dom';
type VariantFilterChipProps = {
viewFilter: Filter;
viewFilter: RecordFilter;
viewBarId: string;
};

View File

@ -2,8 +2,8 @@ import { ReactNode } from 'react';
import { useParams } from 'react-router-dom';
import { ObjectFilterDropdownButton } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { ObjectSortDropdownButton } from '@/object-record/object-sort-dropdown/components/ObjectSortDropdownButton';
import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading';
import { TopBar } from '@/ui/layout/top-bar/components/TopBar';
import { QueryParamsFiltersEffect } from '@/views/components/QueryParamsFiltersEffect';
@ -18,6 +18,7 @@ import { ViewPickerDropdown } from '@/views/view-picker/components/ViewPickerDro
import { ViewsHotkeyScope } from '../types/ViewsHotkeyScope';
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
import { VIEW_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ViewSortDropdownId';
import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext';
import { ViewEventContext } from '@/views/events/contexts/ViewEventContext';

View File

@ -4,7 +4,7 @@ import { ReactNode, useMemo } from 'react';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { AddObjectFilterFromDetailsButton } from '@/object-record/object-filter-dropdown/components/AddObjectFilterFromDetailsButton';
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
@ -199,7 +199,7 @@ export const ViewBarDetails = ({
// Why key defition is already present in the Filter type and added on the fly here with mapViewFiltersToFilters ?
// Also as filter is spread into viewFilter, definition is present
// FixMe: Ugly hack to make it work
viewFilter={viewFilter as unknown as Filter}
viewFilter={viewFilter as unknown as RecordFilter}
viewBarId={viewBarId}
/>
))}

View File

@ -1,7 +1,7 @@
import { isNonEmptyString } from '@sniptt/guards';
import { useEffect } from 'react';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
@ -62,7 +62,7 @@ export const ViewBarFilterEffect = ({
if (isDefined(availableFilterDefinitions)) {
setAvailableFilterDefinitions(availableFilterDefinitions);
}
setOnFilterSelect(() => (filter: Filter | null) => {
setOnFilterSelect(() => (filter: RecordFilter | null) => {
if (isDefined(filter)) {
upsertCombinedViewFilter(filter);
}

View File

@ -1,6 +1,6 @@
import { useRecoilCallback } from 'recoil';
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
import { useGetViewFromCache } from '@/views/hooks/useGetViewFromCache';
@ -33,7 +33,7 @@ export const useUpsertCombinedViewFilters = (viewBarComponentId?: string) => {
const upsertCombinedViewFilter = useRecoilCallback(
({ snapshot, set }) =>
async (upsertedFilter: Filter) => {
async (upsertedFilter: RecordFilter) => {
const currentViewId = getSnapshotValue(
snapshot,
currentViewIdCallbackState,

View File

@ -1,9 +1,9 @@
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
export const availableFilterDefinitionsComponentState = createComponentStateV2<
FilterDefinition[]
RecordFilterDefinition[]
>({
key: 'availableFilterDefinitionsComponentState',
defaultValue: [],

View File

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

View File

@ -1,6 +1,6 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { Sort } from '@/object-record/object-sort-dropdown/types/Sort';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
import { ViewField } from '@/views/types/ViewField';
import { ViewFilter } from '@/views/types/ViewFilter';
@ -54,7 +54,7 @@ describe('mapViewFiltersToFilters', () => {
operand: ViewFilterOperand.Is,
},
];
const expectedFilters: Filter[] = [
const expectedFilters: RecordFilter[] = [
{
id: 'id',
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',

View File

@ -3,7 +3,8 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { formatFieldMetadataItemsAsFilterDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
import { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
import { View } from '@/views/types/View';
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
@ -21,7 +22,7 @@ export const getQueryVariablesFromView = ({
fieldMetadataItems: FieldMetadataItem[];
objectMetadataItem: ObjectMetadataItem;
isJsonFilterEnabled: boolean;
filterValueDependencies: FilterValueDependencies;
filterValueDependencies: RecordFilterValueDependencies;
}) => {
if (!isDefined(view)) {
return {

View File

@ -1,13 +1,13 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { isDefined } from '~/utils/isDefined';
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
import { ViewFilter } from '../types/ViewFilter';
export const mapViewFiltersToFilters = (
viewFilters: ViewFilter[],
availableFilterDefinitions: FilterDefinition[],
): Filter[] => {
availableFilterDefinitions: RecordFilterDefinition[],
): RecordFilter[] => {
return viewFilters
.map((viewFilter) => {
const availableFilterDefinition = availableFilterDefinitions.find(

View File

@ -1,9 +1,9 @@
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
import { isDefined } from 'twenty-ui';
export const shouldReplaceFilter = (
oldFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
newFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
oldFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
newFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
) => {
const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);