From 6ab9b79bf33d5abadd6d237ad91d43e505a7c029 Mon Sep 17 00:00:00 2001 From: Lucas Bordeau Date: Tue, 14 Jan 2025 15:21:05 +0100 Subject: [PATCH] Moving record filter related types, hooks and utils into record-filter module (#9604) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../hooks/useDeleteMultipleRecordsAction.tsx | 4 +- .../contextStoreFiltersComponentState.ts | 4 +- .../computeContextStoreFilters.test.ts | 8 +- .../utils/computeContextStoreFilters.ts | 8 +- ...atFieldMetadataItemsAsFilterDefinitions.ts | 8 +- .../AdvancedFilterAddFilterRuleSelect.tsx | 10 +- .../AdvancedFilterViewFilterOperandSelect.tsx | 4 +- .../components/AdvancedFilterButton.tsx | 6 +- .../components/GenericEntityFilterChip.tsx | 4 +- .../ObjectFilterDropdownBooleanSelect.tsx | 2 +- .../ObjectFilterDropdownDateInput.tsx | 2 +- .../ObjectFilterDropdownFilterSelect.tsx | 3 +- ...pdownFilterSelectCompositeFieldSubMenu.tsx | 13 +- ...jectFilterDropdownFilterSelectMenuItem.tsx | 14 +- .../ObjectFilterDropdownNumberInput.tsx | 2 +- .../ObjectFilterDropdownOperandDropdown.tsx | 1 + .../ObjectFilterDropdownOperandSelect.tsx | 8 +- .../ObjectFilterDropdownOptionSelect.tsx | 2 +- .../ObjectFilterDropdownRatingInput.tsx | 2 +- .../ObjectFilterDropdownRecordSelect.tsx | 2 +- .../ObjectFilterDropdownSourceSelect.tsx | 2 +- .../ObjectFilterDropdownTextSearchInput.tsx | 2 +- ...SingleEntityObjectFilterDropdownButton.tsx | 4 +- ...useSelectFilterDefinitionUsedInDropdown.ts | 15 +- ...vailableFilterDefinitionsComponentState.ts | 4 +- ...rDefinitionUsedInDropdownComponentState.ts | 4 +- ...irstLevelFilterDefinitionComponentState.ts | 4 +- ...rDropdownSubMenuFieldTypeComponentState.ts | 2 +- .../states/onFilterSelectComponentState.ts | 4 +- .../states/selectedFilterComponentState.ts | 4 +- .../types/FilterDefinitionByEntity.ts | 5 - .../types/FilterDraft.ts | 4 - .../types/FilterOperand.ts | 1 - .../getOperandsForFilterType.test.ts | 41 +++-- .../utils/getFilterableFieldTypeLabel.ts | 2 +- .../utils/getInitialFilterValue.ts | 18 +- .../utils/getOperandsForFilterType.ts | 95 ---------- .../utils/getSubMenuOptions.ts | 2 +- .../utils/isActorSourceCompositeFilter.ts | 4 +- .../hooks/useApplyRecordFilter.ts | 4 +- .../hooks/useFilterValueDependencies.ts | 4 +- .../types/CompositeFilterableFieldType.ts | 2 +- .../types/FilterValueDependencies.ts | 3 - .../types/FilterableFieldType.ts | 0 .../types/RecordFilter.ts} | 6 +- .../types/RecordFilterDefinition.ts} | 2 +- .../record-filter/types/RecordFilterDraft.ts | 4 + .../types/RecordFilterOperand.ts | 1 + .../types/RecordFilterValueDependencies.ts | 3 + ...omputeViewRecordGqlOperationFilter.test.ts | 54 +++--- .../computeViewRecordGqlOperationFilter.ts | 166 +++++++++--------- .../utils/getEmptyRecordGqlOperationFilter.ts | 4 +- ...FilterOperandsForRecordFilterDefinition.ts | 99 +++++++++++ .../hooks/useHandleToggleColumnFilter.ts | 9 +- .../hooks/useHandleToggleTrashColumnFilter.ts | 4 +- .../states/recordIndexFiltersState.ts | 4 +- .../states/tableFiltersComponentState.ts | 6 +- .../SignInBackgroundMockFilterDefinitions.ts | 4 +- .../views/components/EditableFilterChip.tsx | 4 +- .../EditableFilterDropdownButton.tsx | 17 +- .../views/components/VariantFilterChip.tsx | 4 +- .../src/modules/views/components/ViewBar.tsx | 3 +- .../views/components/ViewBarDetails.tsx | 4 +- .../views/components/ViewBarFilterEffect.tsx | 4 +- .../hooks/useUpsertCombinedViewFilters.ts | 4 +- ...vailableFilterDefinitionsComponentState.ts | 4 +- .../src/modules/views/types/ViewFilter.ts | 4 +- .../utils/__tests__/viewMapFunctions.test.ts | 4 +- .../views/utils/getQueryVariablesFromView.ts | 5 +- .../views/utils/mapViewFiltersToFilters.ts | 8 +- .../views/utils/shouldReplaceFilter.ts | 6 +- 71 files changed, 395 insertions(+), 379 deletions(-) delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinitionByEntity.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDraft.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterOperand.ts delete mode 100644 packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts rename packages/twenty-front/src/modules/object-record/{object-filter-dropdown => record-filter}/hooks/useApplyRecordFilter.ts (92%) rename packages/twenty-front/src/modules/object-record/{object-filter-dropdown => record-filter}/types/CompositeFilterableFieldType.ts (62%) delete mode 100644 packages/twenty-front/src/modules/object-record/record-filter/types/FilterValueDependencies.ts rename packages/twenty-front/src/modules/object-record/{object-filter-dropdown => record-filter}/types/FilterableFieldType.ts (100%) rename packages/twenty-front/src/modules/object-record/{object-filter-dropdown/types/Filter.ts => record-filter/types/RecordFilter.ts} (65%) rename packages/twenty-front/src/modules/object-record/{object-filter-dropdown/types/FilterDefinition.ts => record-filter/types/RecordFilterDefinition.ts} (90%) create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDraft.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterOperand.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterValueDependencies.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition.ts diff --git a/packages/twenty-front/src/modules/action-menu/actions/record-actions/multiple-records/hooks/useDeleteMultipleRecordsAction.tsx b/packages/twenty-front/src/modules/action-menu/actions/record-actions/multiple-records/hooks/useDeleteMultipleRecordsAction.tsx index dfcbb5350..1bd31b625 100644 --- a/packages/twenty-front/src/modules/action-menu/actions/record-actions/multiple-records/hooks/useDeleteMultipleRecordsAction.tsx +++ b/packages/twenty-front/src/modules/action-menu/actions/record-actions/multiple-records/hooks/useDeleteMultipleRecordsAction.tsx @@ -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({ diff --git a/packages/twenty-front/src/modules/context-store/states/contextStoreFiltersComponentState.ts b/packages/twenty-front/src/modules/context-store/states/contextStoreFiltersComponentState.ts index 97e628deb..8c0225df6 100644 --- a/packages/twenty-front/src/modules/context-store/states/contextStoreFiltersComponentState.ts +++ b/packages/twenty-front/src/modules/context-store/states/contextStoreFiltersComponentState.ts @@ -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: [], diff --git a/packages/twenty-front/src/modules/context-store/utils/__tests__/computeContextStoreFilters.test.ts b/packages/twenty-front/src/modules/context-store/utils/__tests__/computeContextStoreFilters.test.ts index af1fe4151..65f0ed024 100644 --- a/packages/twenty-front/src/modules/context-store/utils/__tests__/computeContextStoreFilters.test.ts +++ b/packages/twenty-front/src/modules/context-store/utils/__tests__/computeContextStoreFilters.test.ts @@ -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', diff --git a/packages/twenty-front/src/modules/context-store/utils/computeContextStoreFilters.ts b/packages/twenty-front/src/modules/context-store/utils/computeContextStoreFilters.ts index 91ede0aab..a86b7905f 100644 --- a/packages/twenty-front/src/modules/context-store/utils/computeContextStoreFilters.ts +++ b/packages/twenty-front/src/modules/context-store/utils/computeContextStoreFilters.ts @@ -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; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts index 92ea3e0d6..3ca3eba1f 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions.ts @@ -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; 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', diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx index 9dc5afd2f..abd71f5ac 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterAddFilterRuleSelect.tsx @@ -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: '', diff --git a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx index fe97ec335..eda1fe1c1 100644 --- a/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/advanced-filter/components/AdvancedFilterViewFilterOperandSelect.tsx @@ -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) { diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx index 542aed2e1..d7e2d8444 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/AdvancedFilterButton.tsx @@ -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: '', diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/GenericEntityFilterChip.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/GenericEntityFilterChip.tsx index 2815490a2..447608e8f 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/GenericEntityFilterChip.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/GenericEntityFilterChip.tsx @@ -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; }; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx index 1fb194eb2..6c7ac9243 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownBooleanSelect.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx index 3a443812c..5ddf33f6c 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownDateInput.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx index cedf0da9c..e865ef082 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelect.tsx @@ -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; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx index e3c938f56..5f1fa512d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectCompositeFieldSubMenu.tsx @@ -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(''); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx index c65b23011..6e5ef654d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownFilterSelectMenuItem.tsx @@ -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); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx index 6baf9b1c7..58f1bfc4c 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownNumberInput.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandDropdown.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandDropdown.tsx index 61295cbc2..ca453a903 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandDropdown.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandDropdown.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx index edf121677..8a29a12a9 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect.tsx @@ -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) => { diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx index 76e9ef3fb..cc888c61d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownOptionSelect.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx index 5026922e8..0a71e6cc9 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx index 11f3e5605..d8cdad553 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx index b6144584b..92b77bd08 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownSourceSelect.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx index e9a790271..b3977d230 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownTextSearchInput.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx index 8719d1bc7..1108d5a1d 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/SingleEntityObjectFilterDropdownButton.tsx @@ -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); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown.ts index 9134acfa8..dd076baf4 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/availableFilterDefinitionsComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/availableFilterDefinitionsComponentState.ts index 49d20cb08..52ae7db07 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/availableFilterDefinitionsComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/availableFilterDefinitionsComponentState.ts @@ -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: [], diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState.ts index dff9ad352..adcda1f21 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState.ts @@ -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({ + createComponentStateV2({ key: 'filterDefinitionUsedInDropdownComponentState', defaultValue: null, componentInstanceContext: ObjectFilterDropdownComponentInstanceContext, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState.ts index b686bb1bb..2e74b221b 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownFirstLevelFilterDefinitionComponentState.ts @@ -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({ + createComponentStateV2({ key: 'objectFilterDropdownFirstLevelFilterDefinitionComponentState', defaultValue: null, componentInstanceContext: ObjectFilterDropdownComponentInstanceContext, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState.ts index f00347b30..4bf9c12f4 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState.ts @@ -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 = diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/onFilterSelectComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/onFilterSelectComponentState.ts index 2efbd31db..9511acc13 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/onFilterSelectComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/onFilterSelectComponentState.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/selectedFilterComponentState.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/selectedFilterComponentState.ts index 543f47806..f1d207d45 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/selectedFilterComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/states/selectedFilterComponentState.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinitionByEntity.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinitionByEntity.ts deleted file mode 100644 index 4723227eb..000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinitionByEntity.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FilterDefinition } from './FilterDefinition'; - -export type FilterDefinitionByEntity = FilterDefinition & { - fieldMetadataId: keyof T; -}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDraft.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDraft.ts deleted file mode 100644 index d107b21d7..000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDraft.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; - -export type FilterDraft = Partial & - Omit; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterOperand.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterOperand.ts deleted file mode 100644 index d05acc2e0..000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterOperand.ts +++ /dev/null @@ -1 +0,0 @@ -export { ViewFilterOperand as FilterOperand } from '@/views/types/ViewFilterOperand'; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts index 023a229ed..b4f8b4597 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/__tests__/getOperandsForFilterType.test.ts @@ -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); }); }); diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts index 69f9334e0..ab73d2be5 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel.ts @@ -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 = ( diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts index 12c9ecb74..95f689b21 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getInitialFilterValue.ts @@ -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 | Record => { +): Pick | Record => { 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; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts deleted file mode 100644 index 5ddd7a374..000000000 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getOperandsForFilterType.ts +++ /dev/null @@ -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, -): 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 []; - } -}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts index 0c3bfb1fb..80b56f6c5 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/getSubMenuOptions.ts @@ -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) { diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts index e7296376e..bb6658fec 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter.ts @@ -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: Pick, ) => { return ( filterDefinition.compositeFieldName === diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useApplyRecordFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts similarity index 92% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useApplyRecordFilter.ts rename to packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts index cc19f836a..ad0edea7e 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/hooks/useApplyRecordFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useApplyRecordFilter.ts @@ -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( diff --git a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterValueDependencies.ts b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterValueDependencies.ts index e1f423041..cc1b8c6bd 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterValueDependencies.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/hooks/useFilterValueDependencies.ts @@ -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) ?? {}; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/CompositeFilterableFieldType.ts similarity index 62% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts rename to packages/twenty-front/src/modules/object-record/record-filter/types/CompositeFilterableFieldType.ts index 0bdf399fe..805742a30 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/CompositeFilterableFieldType.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/CompositeFilterableFieldType.ts @@ -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 & diff --git a/packages/twenty-front/src/modules/object-record/record-filter/types/FilterValueDependencies.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/FilterValueDependencies.ts deleted file mode 100644 index 0014490eb..000000000 --- a/packages/twenty-front/src/modules/object-record/record-filter/types/FilterValueDependencies.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface FilterValueDependencies { - currentWorkspaceMemberId?: string; -} diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterableFieldType.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/FilterableFieldType.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterableFieldType.ts rename to packages/twenty-front/src/modules/object-record/record-filter/types/FilterableFieldType.ts diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/Filter.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts similarity index 65% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/Filter.ts rename to packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts index 077fc1435..b993ea318 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/Filter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilter.ts @@ -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; }; diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDefinition.ts similarity index 90% rename from packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts rename to packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDefinition.ts index b516bbece..d549f1038 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/types/FilterDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDefinition.ts @@ -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; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDraft.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDraft.ts new file mode 100644 index 000000000..9f8df4258 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterDraft.ts @@ -0,0 +1,4 @@ +import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter'; + +export type FilterDraft = Partial & + Omit; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterOperand.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterOperand.ts new file mode 100644 index 000000000..110cb74f5 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterOperand.ts @@ -0,0 +1 @@ +export { ViewFilterOperand as RecordFilterOperand } from '@/views/types/ViewFilterOperand'; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterValueDependencies.ts b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterValueDependencies.ts new file mode 100644 index 000000000..d7a59fdbd --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/types/RecordFilterValueDependencies.ts @@ -0,0 +1,3 @@ +export interface RecordFilterValueDependencies { + currentWorkspaceMemberId?: string; +} diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/computeViewRecordGqlOperationFilter.test.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/computeViewRecordGqlOperationFilter.test.ts index 1c5c75d6a..e4b7b4985 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/computeViewRecordGqlOperationFilter.test.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/__tests__/computeViewRecordGqlOperationFilter.test.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts index 12a548404..6a96749f8 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts @@ -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[], ): 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[], viewFilterGroups: ViewFilterGroup[], currentViewFilterGroupId?: string, @@ -966,8 +966,8 @@ const computeViewFilterGroupRecordGqlOperationFilter = ( }; export const computeViewRecordGqlOperationFilter = ( - filterValueDependencies: FilterValueDependencies, - filters: Filter[], + filterValueDependencies: RecordFilterValueDependencies, + filters: RecordFilter[], fields: Pick[], viewFilterGroups: ViewFilterGroup[], ): RecordGqlOperationFilter => { diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter.ts index 5fb5a0946..cabfc67d7 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter.ts @@ -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, - definition: FilterDefinition, + definition: RecordFilterDefinition, ) => { let emptyRecordFilter: RecordGqlOperationFilter = {}; diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition.ts new file mode 100644 index 000000000..9effb7202 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition.ts @@ -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, +): 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 []; + } +}; diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts index ded8999d3..e573c4cfd 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleColumnFilter.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts index 157e06e14..4964a26e4 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/hooks/useHandleToggleTrashColumnFilter.ts @@ -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, diff --git a/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFiltersState.ts b/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFiltersState.ts index 6af604887..b60300f83 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFiltersState.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFiltersState.ts @@ -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({ +export const recordIndexFiltersState = createState({ key: 'recordIndexFiltersState', defaultValue: [], }); diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/tableFiltersComponentState.ts b/packages/twenty-front/src/modules/object-record/record-table/states/tableFiltersComponentState.ts index cc3848d4d..2f9a557bd 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/tableFiltersComponentState.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/tableFiltersComponentState.ts @@ -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({ +export const tableFiltersComponentState = createComponentStateV2< + RecordFilter[] +>({ key: 'tableFiltersComponentState', defaultValue: [], componentInstanceContext: RecordTableComponentInstanceContext, diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockFilterDefinitions.ts b/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockFilterDefinitions.ts index 92040bbb8..02f25c8b4 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockFilterDefinitions.ts +++ b/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockFilterDefinitions.ts @@ -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[]; diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterChip.tsx b/packages/twenty-front/src/modules/views/components/EditableFilterChip.tsx index 48324f5a5..09ff2ef4e 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableFilterChip.tsx @@ -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; }; diff --git a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx index 59a5a59cb..7f6769cb2 100644 --- a/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx +++ b/packages/twenty-front/src/modules/views/components/EditableFilterDropdownButton.tsx @@ -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); diff --git a/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx b/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx index 79834cb7d..feaa0a460 100644 --- a/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx +++ b/packages/twenty-front/src/modules/views/components/VariantFilterChip.tsx @@ -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; }; diff --git a/packages/twenty-front/src/modules/views/components/ViewBar.tsx b/packages/twenty-front/src/modules/views/components/ViewBar.tsx index 0f44b9496..00a80b918 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBar.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBar.tsx @@ -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'; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx index 724ed7d6c..3f9cfc17f 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx @@ -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} /> ))} diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx index 1af03e349..d30be6932 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx @@ -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); } diff --git a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts index bc4667e58..2417f29c6 100644 --- a/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts +++ b/packages/twenty-front/src/modules/views/hooks/useUpsertCombinedViewFilters.ts @@ -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, diff --git a/packages/twenty-front/src/modules/views/states/availableFilterDefinitionsComponentState.ts b/packages/twenty-front/src/modules/views/states/availableFilterDefinitionsComponentState.ts index 8259d19a6..3f534d2b0 100644 --- a/packages/twenty-front/src/modules/views/states/availableFilterDefinitionsComponentState.ts +++ b/packages/twenty-front/src/modules/views/states/availableFilterDefinitionsComponentState.ts @@ -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: [], diff --git a/packages/twenty-front/src/modules/views/types/ViewFilter.ts b/packages/twenty-front/src/modules/views/types/ViewFilter.ts index a44cab7ae..07688c88b 100644 --- a/packages/twenty-front/src/modules/views/types/ViewFilter.ts +++ b/packages/twenty-front/src/modules/views/types/ViewFilter.ts @@ -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; }; diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts index c191b799d..1ccbea8fe 100644 --- a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts +++ b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts @@ -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', diff --git a/packages/twenty-front/src/modules/views/utils/getQueryVariablesFromView.ts b/packages/twenty-front/src/modules/views/utils/getQueryVariablesFromView.ts index 75eb01302..2f3773df9 100644 --- a/packages/twenty-front/src/modules/views/utils/getQueryVariablesFromView.ts +++ b/packages/twenty-front/src/modules/views/utils/getQueryVariablesFromView.ts @@ -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 { diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts index 2551637a0..feff9e41d 100644 --- a/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts +++ b/packages/twenty-front/src/modules/views/utils/mapViewFiltersToFilters.ts @@ -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( diff --git a/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts b/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts index ac1830451..2e4d0f1c8 100644 --- a/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts +++ b/packages/twenty-front/src/modules/views/utils/shouldReplaceFilter.ts @@ -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, - newFilter: Pick, + oldFilter: Pick, + newFilter: Pick, ) => { const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);