Moving record filter related types, hooks and utils into record-filter module (#9604)
This PR is only moving and renaming types, hooks and utils to record-filter module folder. - Moved and renamed types from object filter modules to record filter…- Moved and renamed types from object filter modules to record filter module - Moved useApplyRecordFilter to record filter module - Renamed util getOperandsForFilterDefinition to getRecordFilterOperandsForRecordFilterDefinition
This commit is contained in:
@ -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({
|
||||
|
||||
@ -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: [],
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
import {
|
||||
FieldMetadataType,
|
||||
RelationDefinitionType,
|
||||
@ -12,7 +12,7 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
|
||||
}: {
|
||||
fields: Array<ObjectMetadataItem['fields'][0]>;
|
||||
isJsonFilterEnabled: boolean;
|
||||
}): FilterDefinition[] => {
|
||||
}): RecordFilterDefinition[] => {
|
||||
return fields.reduce((acc, field) => {
|
||||
if (
|
||||
field.type === FieldMetadataType.Relation &&
|
||||
@ -49,14 +49,14 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
|
||||
}
|
||||
|
||||
return [...acc, formatFieldMetadataItemAsFilterDefinition({ field })];
|
||||
}, [] as FilterDefinition[]);
|
||||
}, [] as RecordFilterDefinition[]);
|
||||
};
|
||||
|
||||
export const formatFieldMetadataItemAsFilterDefinition = ({
|
||||
field,
|
||||
}: {
|
||||
field: ObjectMetadataItem['fields'][0];
|
||||
}): FilterDefinition => ({
|
||||
}): RecordFilterDefinition => ({
|
||||
fieldMetadataId: field.id,
|
||||
label: field.label,
|
||||
iconName: field.icon ?? 'Icon123',
|
||||
|
||||
@ -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: '',
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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: '',
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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('');
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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';
|
||||
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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: [],
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||
import { FilterDefinition } from '../types/FilterDefinition';
|
||||
|
||||
export const filterDefinitionUsedInDropdownComponentState =
|
||||
createComponentStateV2<FilterDefinition | null>({
|
||||
createComponentStateV2<RecordFilterDefinition | null>({
|
||||
key: 'filterDefinitionUsedInDropdownComponentState',
|
||||
defaultValue: null,
|
||||
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||
|
||||
export const objectFilterDropdownFirstLevelFilterDefinitionComponentState =
|
||||
createComponentStateV2<FilterDefinition | null>({
|
||||
createComponentStateV2<RecordFilterDefinition | null>({
|
||||
key: 'objectFilterDropdownFirstLevelFilterDefinitionComponentState',
|
||||
defaultValue: null,
|
||||
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
import { FilterDefinition } from './FilterDefinition';
|
||||
|
||||
export type FilterDefinitionByEntity<T> = FilterDefinition & {
|
||||
fieldMetadataId: keyof T;
|
||||
};
|
||||
@ -1,4 +0,0 @@
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
|
||||
export type FilterDraft = Partial<Filter> &
|
||||
Omit<Filter, 'fieldMetadataId' | 'operand' | 'definition'>;
|
||||
@ -1 +0,0 @@
|
||||
export { ViewFilterOperand as FilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@ -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 = (
|
||||
|
||||
@ -1,21 +1,21 @@
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
|
||||
import { z } from 'zod';
|
||||
|
||||
export const getInitialFilterValue = (
|
||||
newType: FilterableFieldType,
|
||||
newOperand: ViewFilterOperand,
|
||||
newOperand: RecordFilterOperand,
|
||||
oldValue?: string,
|
||||
oldDisplayValue?: string,
|
||||
): Pick<Filter, 'value' | 'displayValue'> | Record<string, never> => {
|
||||
): Pick<RecordFilter, 'value' | 'displayValue'> | Record<string, never> => {
|
||||
switch (newType) {
|
||||
case 'DATE':
|
||||
case 'DATE_TIME': {
|
||||
const activeDatePickerOperands = [
|
||||
ViewFilterOperand.IsBefore,
|
||||
ViewFilterOperand.Is,
|
||||
ViewFilterOperand.IsAfter,
|
||||
RecordFilterOperand.IsBefore,
|
||||
RecordFilterOperand.Is,
|
||||
RecordFilterOperand.IsAfter,
|
||||
];
|
||||
|
||||
if (activeDatePickerOperands.includes(newOperand)) {
|
||||
@ -29,7 +29,7 @@ export const getInitialFilterValue = (
|
||||
return { value, displayValue };
|
||||
}
|
||||
|
||||
if (newOperand === ViewFilterOperand.IsRelative) {
|
||||
if (newOperand === RecordFilterOperand.IsRelative) {
|
||||
return { value: '', displayValue: '' };
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1,95 +0,0 @@
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
|
||||
export const getOperandsForFilterDefinition = (
|
||||
filterDefinition: Pick<FilterDefinition, 'type' | 'compositeFieldName'>,
|
||||
): ViewFilterOperand[] => {
|
||||
const emptyOperands = [
|
||||
ViewFilterOperand.IsEmpty,
|
||||
ViewFilterOperand.IsNotEmpty,
|
||||
];
|
||||
|
||||
const relationOperands = [ViewFilterOperand.Is, ViewFilterOperand.IsNot];
|
||||
|
||||
switch (filterDefinition.type) {
|
||||
case 'TEXT':
|
||||
case 'EMAILS':
|
||||
case 'FULL_NAME':
|
||||
case 'ADDRESS':
|
||||
case 'LINKS':
|
||||
case 'PHONES':
|
||||
return [
|
||||
ViewFilterOperand.Contains,
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'CURRENCY':
|
||||
case 'NUMBER':
|
||||
return [
|
||||
ViewFilterOperand.GreaterThan,
|
||||
ViewFilterOperand.LessThan,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RAW_JSON':
|
||||
return [
|
||||
ViewFilterOperand.Contains,
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'DATE_TIME':
|
||||
case 'DATE':
|
||||
return [
|
||||
ViewFilterOperand.Is,
|
||||
ViewFilterOperand.IsRelative,
|
||||
ViewFilterOperand.IsInPast,
|
||||
ViewFilterOperand.IsInFuture,
|
||||
ViewFilterOperand.IsToday,
|
||||
ViewFilterOperand.IsBefore,
|
||||
ViewFilterOperand.IsAfter,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RATING':
|
||||
return [
|
||||
ViewFilterOperand.Is,
|
||||
ViewFilterOperand.GreaterThan,
|
||||
ViewFilterOperand.LessThan,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RELATION':
|
||||
return [...relationOperands, ...emptyOperands];
|
||||
case 'MULTI_SELECT':
|
||||
return [
|
||||
ViewFilterOperand.Contains,
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'SELECT':
|
||||
return [ViewFilterOperand.Is, ViewFilterOperand.IsNot, ...emptyOperands];
|
||||
case 'ACTOR': {
|
||||
if (isActorSourceCompositeFilter(filterDefinition)) {
|
||||
return [
|
||||
ViewFilterOperand.Is,
|
||||
ViewFilterOperand.IsNot,
|
||||
...emptyOperands,
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
ViewFilterOperand.Contains,
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
}
|
||||
case 'ARRAY':
|
||||
return [
|
||||
ViewFilterOperand.Contains,
|
||||
ViewFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'BOOLEAN':
|
||||
return [ViewFilterOperand.Is];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
};
|
||||
@ -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) {
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
|
||||
export const isActorSourceCompositeFilter = (
|
||||
filterDefinition: Pick<FilterDefinition, 'compositeFieldName'>,
|
||||
filterDefinition: Pick<RecordFilterDefinition, 'compositeFieldName'>,
|
||||
) => {
|
||||
return (
|
||||
filterDefinition.compositeFieldName ===
|
||||
|
||||
@ -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(
|
||||
@ -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) ?? {};
|
||||
|
||||
@ -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 &
|
||||
@ -1,3 +0,0 @@
|
||||
export interface FilterValueDependencies {
|
||||
currentWorkspaceMemberId?: string;
|
||||
}
|
||||
@ -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;
|
||||
};
|
||||
@ -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;
|
||||
@ -0,0 +1,4 @@
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
|
||||
export type FilterDraft = Partial<RecordFilter> &
|
||||
Omit<RecordFilter, 'fieldMetadataId' | 'operand' | 'definition'>;
|
||||
@ -0,0 +1 @@
|
||||
export { ViewFilterOperand as RecordFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
@ -0,0 +1,3 @@
|
||||
export interface RecordFilterValueDependencies {
|
||||
currentWorkspaceMemberId?: string;
|
||||
}
|
||||
@ -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,
|
||||
|
||||
@ -18,7 +18,6 @@ import {
|
||||
SelectFilter,
|
||||
StringFilter,
|
||||
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
import { Field } from '~/generated/graphql';
|
||||
import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
@ -28,8 +27,9 @@ import {
|
||||
convertLessThanRatingToArrayOfRatingValues,
|
||||
convertRatingToRatingValue,
|
||||
} from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput';
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
|
||||
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
|
||||
import { getEmptyRecordGqlOperationFilter } from '@/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter';
|
||||
import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
|
||||
import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
|
||||
@ -41,8 +41,8 @@ import { endOfDay, roundToNearestMinutes, startOfDay } from 'date-fns';
|
||||
import { z } from 'zod';
|
||||
|
||||
const computeFilterRecordGqlOperationFilter = (
|
||||
filterValueDependencies: FilterValueDependencies,
|
||||
filter: Filter,
|
||||
filterValueDependencies: RecordFilterValueDependencies,
|
||||
filter: RecordFilter,
|
||||
fields: Pick<Field, 'id' | 'name'>[],
|
||||
): RecordGqlOperationFilter | undefined => {
|
||||
const correspondingField = fields.find(
|
||||
@ -54,11 +54,11 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
const isCompositeFieldFiter = isNonEmptyString(compositeFieldName);
|
||||
|
||||
const isEmptyOperand = [
|
||||
ViewFilterOperand.IsEmpty,
|
||||
ViewFilterOperand.IsNotEmpty,
|
||||
ViewFilterOperand.IsInPast,
|
||||
ViewFilterOperand.IsInFuture,
|
||||
ViewFilterOperand.IsToday,
|
||||
RecordFilterOperand.IsEmpty,
|
||||
RecordFilterOperand.IsNotEmpty,
|
||||
RecordFilterOperand.IsInPast,
|
||||
RecordFilterOperand.IsInFuture,
|
||||
RecordFilterOperand.IsToday,
|
||||
].includes(filter.operand);
|
||||
|
||||
if (!correspondingField) {
|
||||
@ -74,13 +74,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
switch (filter.definition.type) {
|
||||
case 'TEXT':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
ilike: `%${filter.value}%`,
|
||||
} as StringFilter,
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
not: {
|
||||
[correspondingField.name]: {
|
||||
@ -88,8 +88,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
} as StringFilter,
|
||||
},
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -102,13 +102,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'RAW_JSON':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
like: `%${filter.value}%`,
|
||||
} as RawJsonFilter,
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
not: {
|
||||
[correspondingField.name]: {
|
||||
@ -116,8 +116,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
} as RawJsonFilter,
|
||||
},
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -136,36 +136,36 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
resolvedFilterValue instanceof Date ? resolvedFilterValue : now;
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.IsAfter: {
|
||||
case RecordFilterOperand.IsAfter: {
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
gt: date.toISOString(),
|
||||
} as DateFilter,
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsBefore: {
|
||||
case RecordFilterOperand.IsBefore: {
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
lt: date.toISOString(),
|
||||
} as DateFilter,
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty: {
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty: {
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
filter.definition,
|
||||
);
|
||||
}
|
||||
case ViewFilterOperand.IsRelative: {
|
||||
case RecordFilterOperand.IsRelative: {
|
||||
const dateRange = z
|
||||
.object({ start: z.date(), end: z.date() })
|
||||
.safeParse(resolvedFilterValue).data;
|
||||
|
||||
const defaultDateRange = resolveDateViewFilterValue({
|
||||
value: 'PAST_1_DAY',
|
||||
operand: ViewFilterOperand.IsRelative,
|
||||
operand: RecordFilterOperand.IsRelative,
|
||||
});
|
||||
|
||||
if (!defaultDateRange) {
|
||||
@ -189,7 +189,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
],
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.Is: {
|
||||
case RecordFilterOperand.Is: {
|
||||
const isValid = resolvedFilterValue instanceof Date;
|
||||
const date = isValid ? resolvedFilterValue : now;
|
||||
|
||||
@ -208,19 +208,19 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
],
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsInPast:
|
||||
case RecordFilterOperand.IsInPast:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
lte: now.toISOString(),
|
||||
} as DateFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsInFuture:
|
||||
case RecordFilterOperand.IsInFuture:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
gte: now.toISOString(),
|
||||
} as DateFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsToday: {
|
||||
case RecordFilterOperand.IsToday: {
|
||||
return {
|
||||
and: [
|
||||
{
|
||||
@ -244,13 +244,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'RATING':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Is:
|
||||
case RecordFilterOperand.Is:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
eq: convertRatingToRatingValue(parseFloat(filter.value)),
|
||||
} as RatingFilter,
|
||||
};
|
||||
case ViewFilterOperand.GreaterThan:
|
||||
case RecordFilterOperand.GreaterThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
in: convertGreaterThanRatingToArrayOfRatingValues(
|
||||
@ -258,7 +258,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
),
|
||||
} as RatingFilter,
|
||||
};
|
||||
case ViewFilterOperand.LessThan:
|
||||
case RecordFilterOperand.LessThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
in: convertLessThanRatingToArrayOfRatingValues(
|
||||
@ -266,8 +266,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
),
|
||||
} as RatingFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -280,20 +280,20 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'NUMBER':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.GreaterThan:
|
||||
case RecordFilterOperand.GreaterThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
gte: parseFloat(filter.value),
|
||||
} as FloatFilter,
|
||||
};
|
||||
case ViewFilterOperand.LessThan:
|
||||
case RecordFilterOperand.LessThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
lte: parseFloat(filter.value),
|
||||
} as FloatFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -325,13 +325,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
|
||||
if (recordIds.length === 0) return;
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Is:
|
||||
case RecordFilterOperand.Is:
|
||||
return {
|
||||
[correspondingField.name + 'Id']: {
|
||||
in: recordIds,
|
||||
} as RelationFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsNot: {
|
||||
case RecordFilterOperand.IsNot: {
|
||||
if (recordIds.length === 0) return;
|
||||
return {
|
||||
or: [
|
||||
@ -357,8 +357,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
} else {
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -373,20 +373,20 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'CURRENCY':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.GreaterThan:
|
||||
case RecordFilterOperand.GreaterThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
amountMicros: { gte: parseFloat(filter.value) * 1000000 },
|
||||
} as CurrencyFilter,
|
||||
};
|
||||
case ViewFilterOperand.LessThan:
|
||||
case RecordFilterOperand.LessThan:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
amountMicros: { lte: parseFloat(filter.value) * 1000000 },
|
||||
} as CurrencyFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -405,7 +405,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
);
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
or: linksFilters,
|
||||
@ -419,7 +419,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
and: linksFilters.map((filter) => {
|
||||
@ -439,8 +439,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -459,7 +459,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
['firstName', 'lastName'],
|
||||
);
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
or: fullNameFilters,
|
||||
@ -473,7 +473,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
and: fullNameFilters.map((filter) => {
|
||||
@ -493,8 +493,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -508,7 +508,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'ADDRESS':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
or: [
|
||||
@ -565,7 +565,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
if (!isCompositeFieldFiter) {
|
||||
return {
|
||||
and: [
|
||||
@ -609,8 +609,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -635,13 +635,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
if (options.length === 0) return;
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
containsAny: options,
|
||||
} as MultiSelectFilter,
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
or: [
|
||||
{
|
||||
@ -682,13 +682,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
if (options.length === 0) return;
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Is:
|
||||
case RecordFilterOperand.Is:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
in: options,
|
||||
} as SelectFilter,
|
||||
};
|
||||
case ViewFilterOperand.IsNot:
|
||||
case RecordFilterOperand.IsNot:
|
||||
return {
|
||||
not: {
|
||||
[correspondingField.name]: {
|
||||
@ -704,13 +704,13 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'ARRAY': {
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
[correspondingField.name]: {
|
||||
containsIlike: `%${filter.value}%`,
|
||||
} as ArrayFilter,
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
not: {
|
||||
[correspondingField.name]: {
|
||||
@ -718,8 +718,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
} as ArrayFilter,
|
||||
},
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -734,7 +734,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
// TODO: fix this with a new composite field in ViewFilter entity
|
||||
case 'ACTOR': {
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Is: {
|
||||
case RecordFilterOperand.Is: {
|
||||
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
||||
|
||||
return {
|
||||
@ -745,7 +745,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.IsNot: {
|
||||
case RecordFilterOperand.IsNot: {
|
||||
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
||||
|
||||
if (parsedRecordIds.length === 0) return;
|
||||
@ -760,7 +760,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
};
|
||||
}
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
or: [
|
||||
{
|
||||
@ -772,7 +772,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
and: [
|
||||
{
|
||||
@ -786,8 +786,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -801,7 +801,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
}
|
||||
case 'EMAILS':
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
or: [
|
||||
{
|
||||
@ -813,7 +813,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
and: [
|
||||
{
|
||||
@ -827,8 +827,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -843,7 +843,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
const filterValue = filter.value.replace(/[^0-9]/g, '');
|
||||
|
||||
switch (filter.operand) {
|
||||
case ViewFilterOperand.Contains:
|
||||
case RecordFilterOperand.Contains:
|
||||
return {
|
||||
or: [
|
||||
{
|
||||
@ -855,7 +855,7 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.DoesNotContain:
|
||||
case RecordFilterOperand.DoesNotContain:
|
||||
return {
|
||||
and: [
|
||||
{
|
||||
@ -869,8 +869,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
},
|
||||
],
|
||||
};
|
||||
case ViewFilterOperand.IsEmpty:
|
||||
case ViewFilterOperand.IsNotEmpty:
|
||||
case RecordFilterOperand.IsEmpty:
|
||||
case RecordFilterOperand.IsNotEmpty:
|
||||
return getEmptyRecordGqlOperationFilter(
|
||||
filter.operand,
|
||||
correspondingField,
|
||||
@ -895,8 +895,8 @@ const computeFilterRecordGqlOperationFilter = (
|
||||
};
|
||||
|
||||
const computeViewFilterGroupRecordGqlOperationFilter = (
|
||||
filterValueDependencies: FilterValueDependencies,
|
||||
filters: Filter[],
|
||||
filterValueDependencies: RecordFilterValueDependencies,
|
||||
filters: RecordFilter[],
|
||||
fields: Pick<Field, 'id' | 'name'>[],
|
||||
viewFilterGroups: ViewFilterGroup[],
|
||||
currentViewFilterGroupId?: string,
|
||||
@ -966,8 +966,8 @@ const computeViewFilterGroupRecordGqlOperationFilter = (
|
||||
};
|
||||
|
||||
export const computeViewRecordGqlOperationFilter = (
|
||||
filterValueDependencies: FilterValueDependencies,
|
||||
filters: Filter[],
|
||||
filterValueDependencies: RecordFilterValueDependencies,
|
||||
filters: RecordFilter[],
|
||||
fields: Pick<Field, 'id' | 'name'>[],
|
||||
viewFilterGroups: ViewFilterGroup[],
|
||||
): RecordGqlOperationFilter => {
|
||||
|
||||
@ -15,7 +15,7 @@ import {
|
||||
StringFilter,
|
||||
URLFilter,
|
||||
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
import { isNonEmptyString } from '@sniptt/guards';
|
||||
import { Field } from '~/generated/graphql';
|
||||
@ -24,7 +24,7 @@ import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateIL
|
||||
export const getEmptyRecordGqlOperationFilter = (
|
||||
operand: ViewFilterOperand,
|
||||
correspondingField: Pick<Field, 'id' | 'name'>,
|
||||
definition: FilterDefinition,
|
||||
definition: RecordFilterDefinition,
|
||||
) => {
|
||||
let emptyRecordFilter: RecordGqlOperationFilter = {};
|
||||
|
||||
|
||||
@ -0,0 +1,99 @@
|
||||
import { isActorSourceCompositeFilter } from '@/object-record/object-filter-dropdown/utils/isActorSourceCompositeFilter';
|
||||
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||
import { ViewFilterOperand as RecordFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||
|
||||
export const getRecordFilterOperandsForRecordFilterDefinition = (
|
||||
filterDefinition: Pick<RecordFilterDefinition, 'type' | 'compositeFieldName'>,
|
||||
): RecordFilterOperand[] => {
|
||||
const emptyOperands = [
|
||||
RecordFilterOperand.IsEmpty,
|
||||
RecordFilterOperand.IsNotEmpty,
|
||||
];
|
||||
|
||||
const relationOperands = [RecordFilterOperand.Is, RecordFilterOperand.IsNot];
|
||||
|
||||
switch (filterDefinition.type) {
|
||||
case 'TEXT':
|
||||
case 'EMAILS':
|
||||
case 'FULL_NAME':
|
||||
case 'ADDRESS':
|
||||
case 'LINKS':
|
||||
case 'PHONES':
|
||||
return [
|
||||
RecordFilterOperand.Contains,
|
||||
RecordFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'CURRENCY':
|
||||
case 'NUMBER':
|
||||
return [
|
||||
RecordFilterOperand.GreaterThan,
|
||||
RecordFilterOperand.LessThan,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RAW_JSON':
|
||||
return [
|
||||
RecordFilterOperand.Contains,
|
||||
RecordFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'DATE_TIME':
|
||||
case 'DATE':
|
||||
return [
|
||||
RecordFilterOperand.Is,
|
||||
RecordFilterOperand.IsRelative,
|
||||
RecordFilterOperand.IsInPast,
|
||||
RecordFilterOperand.IsInFuture,
|
||||
RecordFilterOperand.IsToday,
|
||||
RecordFilterOperand.IsBefore,
|
||||
RecordFilterOperand.IsAfter,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RATING':
|
||||
return [
|
||||
RecordFilterOperand.Is,
|
||||
RecordFilterOperand.GreaterThan,
|
||||
RecordFilterOperand.LessThan,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'RELATION':
|
||||
return [...relationOperands, ...emptyOperands];
|
||||
case 'MULTI_SELECT':
|
||||
return [
|
||||
RecordFilterOperand.Contains,
|
||||
RecordFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'SELECT':
|
||||
return [
|
||||
RecordFilterOperand.Is,
|
||||
RecordFilterOperand.IsNot,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'ACTOR': {
|
||||
if (isActorSourceCompositeFilter(filterDefinition)) {
|
||||
return [
|
||||
RecordFilterOperand.Is,
|
||||
RecordFilterOperand.IsNot,
|
||||
...emptyOperands,
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
RecordFilterOperand.Contains,
|
||||
RecordFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
}
|
||||
case 'ARRAY':
|
||||
return [
|
||||
RecordFilterOperand.Contains,
|
||||
RecordFilterOperand.DoesNotContain,
|
||||
...emptyOperands,
|
||||
];
|
||||
case 'BOOLEAN':
|
||||
return [RecordFilterOperand.Is];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
};
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import { createState } from '@ui/utilities/state/utils/createState';
|
||||
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
|
||||
export const recordIndexFiltersState = createState<Filter[]>({
|
||||
export const recordIndexFiltersState = createState<RecordFilter[]>({
|
||||
key: 'recordIndexFiltersState',
|
||||
defaultValue: [],
|
||||
});
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
import { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||
|
||||
export const tableFiltersComponentState = createComponentStateV2<Filter[]>({
|
||||
export const tableFiltersComponentState = createComponentStateV2<
|
||||
RecordFilter[]
|
||||
>({
|
||||
key: 'tableFiltersComponentState',
|
||||
defaultValue: [],
|
||||
componentInstanceContext: RecordTableComponentInstanceContext,
|
||||
|
||||
@ -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[];
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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}
|
||||
/>
|
||||
))}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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: [],
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||
import { isDefined } from 'twenty-ui';
|
||||
|
||||
export const shouldReplaceFilter = (
|
||||
oldFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||
newFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||
oldFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||
newFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||
) => {
|
||||
const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user