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 { DELETE_MAX_COUNT } from '@/object-record/constants/DeleteMaxCount';
|
||||||
import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords';
|
import { useDeleteManyRecords } from '@/object-record/hooks/useDeleteManyRecords';
|
||||||
import { useLazyFetchAllRecords } from '@/object-record/hooks/useLazyFetchAllRecords';
|
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 { 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 { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable';
|
||||||
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
|
import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -57,7 +57,7 @@ export const useDeleteMultipleRecordsAction: ActionHookWithObjectMetadataItem =
|
|||||||
const isDeletedFilterActive = contextStoreFilters.some(
|
const isDeletedFilterActive = contextStoreFilters.some(
|
||||||
(filter) =>
|
(filter) =>
|
||||||
filter.fieldMetadataId === deletedAtFieldMetadata?.id &&
|
filter.fieldMetadataId === deletedAtFieldMetadata?.id &&
|
||||||
filter.operand === FilterOperand.IsNotEmpty,
|
filter.operand === RecordFilterOperand.IsNotEmpty,
|
||||||
);
|
);
|
||||||
|
|
||||||
const { fetchAllRecords: fetchAllRecordIds } = useLazyFetchAllRecords({
|
const { fetchAllRecords: fetchAllRecordIds } = useLazyFetchAllRecords({
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ContextStoreComponentInstanceContext } from '@/context-store/states/contexts/ContextStoreComponentInstanceContext';
|
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';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const contextStoreFiltersComponentState = createComponentStateV2<
|
export const contextStoreFiltersComponentState = createComponentStateV2<
|
||||||
Filter[]
|
RecordFilter[]
|
||||||
>({
|
>({
|
||||||
key: 'contextStoreFiltersComponentState',
|
key: 'contextStoreFiltersComponentState',
|
||||||
defaultValue: [],
|
defaultValue: [],
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
||||||
import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters';
|
import { computeContextStoreFilters } from '@/context-store/utils/computeContextStoreFilters';
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
|
import { RecordFilterValueDependencies } from '@/object-record/record-filter/types/RecordFilterValueDependencies';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
import { expect } from '@storybook/test';
|
import { expect } from '@storybook/test';
|
||||||
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
|
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
|
||||||
@ -11,7 +11,7 @@ describe('computeContextStoreFilters', () => {
|
|||||||
(item) => item.nameSingular === 'person',
|
(item) => item.nameSingular === 'person',
|
||||||
)!;
|
)!;
|
||||||
|
|
||||||
const mockFilterValueDependencies: FilterValueDependencies = {
|
const mockFilterValueDependencies: RecordFilterValueDependencies = {
|
||||||
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
|
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ describe('computeContextStoreFilters', () => {
|
|||||||
excludedRecordIds: ['1', '2', '3'],
|
excludedRecordIds: ['1', '2', '3'],
|
||||||
};
|
};
|
||||||
|
|
||||||
const contextStoreFilters: Filter[] = [
|
const contextStoreFilters: RecordFilter[] = [
|
||||||
{
|
{
|
||||||
id: 'name-filter',
|
id: 'name-filter',
|
||||||
variant: 'default',
|
variant: 'default',
|
||||||
|
|||||||
@ -1,16 +1,16 @@
|
|||||||
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
import { ContextStoreTargetedRecordsRule } from '@/context-store/states/contextStoreTargetedRecordsRuleComponentState';
|
||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
import { RecordGqlOperationFilter } from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
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 { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
||||||
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
|
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
|
||||||
|
|
||||||
export const computeContextStoreFilters = (
|
export const computeContextStoreFilters = (
|
||||||
contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule,
|
contextStoreTargetedRecordsRule: ContextStoreTargetedRecordsRule,
|
||||||
contextStoreFilters: Filter[],
|
contextStoreFilters: RecordFilter[],
|
||||||
objectMetadataItem: ObjectMetadataItem,
|
objectMetadataItem: ObjectMetadataItem,
|
||||||
filterValueDependencies: FilterValueDependencies,
|
filterValueDependencies: RecordFilterValueDependencies,
|
||||||
) => {
|
) => {
|
||||||
let queryFilter: RecordGqlOperationFilter | undefined;
|
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 {
|
import {
|
||||||
FieldMetadataType,
|
FieldMetadataType,
|
||||||
RelationDefinitionType,
|
RelationDefinitionType,
|
||||||
@ -12,7 +12,7 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
|
|||||||
}: {
|
}: {
|
||||||
fields: Array<ObjectMetadataItem['fields'][0]>;
|
fields: Array<ObjectMetadataItem['fields'][0]>;
|
||||||
isJsonFilterEnabled: boolean;
|
isJsonFilterEnabled: boolean;
|
||||||
}): FilterDefinition[] => {
|
}): RecordFilterDefinition[] => {
|
||||||
return fields.reduce((acc, field) => {
|
return fields.reduce((acc, field) => {
|
||||||
if (
|
if (
|
||||||
field.type === FieldMetadataType.Relation &&
|
field.type === FieldMetadataType.Relation &&
|
||||||
@ -49,14 +49,14 @@ export const formatFieldMetadataItemsAsFilterDefinitions = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [...acc, formatFieldMetadataItemAsFilterDefinition({ field })];
|
return [...acc, formatFieldMetadataItemAsFilterDefinition({ field })];
|
||||||
}, [] as FilterDefinition[]);
|
}, [] as RecordFilterDefinition[]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const formatFieldMetadataItemAsFilterDefinition = ({
|
export const formatFieldMetadataItemAsFilterDefinition = ({
|
||||||
field,
|
field,
|
||||||
}: {
|
}: {
|
||||||
field: ObjectMetadataItem['fields'][0];
|
field: ObjectMetadataItem['fields'][0];
|
||||||
}): FilterDefinition => ({
|
}): RecordFilterDefinition => ({
|
||||||
fieldMetadataId: field.id,
|
fieldMetadataId: field.id,
|
||||||
label: field.label,
|
label: field.label,
|
||||||
iconName: field.icon ?? 'Icon123',
|
iconName: field.icon ?? 'Icon123',
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
|
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
|
||||||
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
|
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 { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
@ -81,7 +81,9 @@ export const AdvancedFilterAddFilterRuleSelect = ({
|
|||||||
upsertCombinedViewFilter({
|
upsertCombinedViewFilter({
|
||||||
id: v4(),
|
id: v4(),
|
||||||
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
||||||
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
|
operand: getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
|
defaultFilterDefinition,
|
||||||
|
)[0],
|
||||||
definition: defaultFilterDefinition,
|
definition: defaultFilterDefinition,
|
||||||
value: '',
|
value: '',
|
||||||
displayValue: '',
|
displayValue: '',
|
||||||
@ -112,7 +114,9 @@ export const AdvancedFilterAddFilterRuleSelect = ({
|
|||||||
upsertCombinedViewFilter({
|
upsertCombinedViewFilter({
|
||||||
id: v4(),
|
id: v4(),
|
||||||
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
||||||
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
|
operand: getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
|
defaultFilterDefinition,
|
||||||
|
)[0],
|
||||||
definition: defaultFilterDefinition,
|
definition: defaultFilterDefinition,
|
||||||
value: '',
|
value: '',
|
||||||
displayValue: '',
|
displayValue: '',
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter';
|
import { useCurrentViewFilter } from '@/object-record/advanced-filter/hooks/useCurrentViewFilter';
|
||||||
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
||||||
import { getOperandLabel } from '@/object-record/object-filter-dropdown/utils/getOperandLabel';
|
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 { SelectControl } from '@/ui/input/components/SelectControl';
|
||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
@ -56,7 +56,7 @@ export const AdvancedFilterViewFilterOperandSelect = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const operandsForFilterType = isDefined(filter?.definition)
|
const operandsForFilterType = isDefined(filter?.definition)
|
||||||
? getOperandsForFilterDefinition(filter.definition)
|
? getRecordFilterOperandsForRecordFilterDefinition(filter.definition)
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
if (isDisabled === true) {
|
if (isDisabled === true) {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
|
import { useObjectMetadataItemById } from '@/object-metadata/hooks/useObjectMetadataItemById';
|
||||||
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
|
import { useUpsertCombinedViewFilterGroup } from '@/object-record/advanced-filter/hooks/useUpsertCombinedViewFilterGroup';
|
||||||
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
|
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
|
||||||
import { 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 { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
|
import { ADVANCED_FILTER_DROPDOWN_ID } from '@/views/constants/AdvancedFilterDropdownId';
|
||||||
@ -102,7 +102,9 @@ export const AdvancedFilterButton = () => {
|
|||||||
upsertCombinedViewFilter({
|
upsertCombinedViewFilter({
|
||||||
id: v4(),
|
id: v4(),
|
||||||
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
fieldMetadataId: defaultFilterDefinition.fieldMetadataId,
|
||||||
operand: getOperandsForFilterDefinition(defaultFilterDefinition)[0],
|
operand: getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
|
defaultFilterDefinition,
|
||||||
|
)[0],
|
||||||
definition: defaultFilterDefinition,
|
definition: defaultFilterDefinition,
|
||||||
value: '',
|
value: '',
|
||||||
displayValue: '',
|
displayValue: '',
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { AvatarChip, IconComponent } from 'twenty-ui';
|
import { AvatarChip, IconComponent } from 'twenty-ui';
|
||||||
|
|
||||||
import { Filter } from '../types/Filter';
|
import { RecordFilter } from '../../record-filter/types/RecordFilter';
|
||||||
|
|
||||||
type GenericEntityFilterChipProps = {
|
type GenericEntityFilterChipProps = {
|
||||||
filter: Filter;
|
filter: RecordFilter;
|
||||||
Icon?: IconComponent;
|
Icon?: IconComponent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -3,10 +3,10 @@ import styled from '@emotion/styled';
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
|
||||||
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { BooleanDisplay } from '@/ui/field/display/components/BooleanDisplay';
|
import { BooleanDisplay } from '@/ui/field/display/components/BooleanDisplay';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
import { getRelativeDateDisplayValue } from '@/object-record/object-filter-dropdown/utils/getRelativeDateDisplayValue';
|
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 { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import { ObjectFilterDropdownFilterSelectMenuItem } from '@/object-record/object
|
|||||||
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
|
import { OBJECT_FILTER_DROPDOWN_ID } from '@/object-record/object-filter-dropdown/constants/ObjectFilterDropdownId';
|
||||||
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
|
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
|
|
||||||
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
|
import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext';
|
||||||
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
import { hiddenTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/hiddenTableColumnsComponentSelector';
|
||||||
import { visibleTableColumnsComponentSelector } from '@/object-record/record-table/states/selectors/visibleTableColumnsComponentSelector';
|
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 { FeatureFlagKey } from '~/generated/graphql';
|
||||||
|
|
||||||
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
|
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`
|
export const StyledInput = styled.input`
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border: none;
|
border: none;
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { useAdvancedFilterDropdown } from '@/object-record/advanced-filter/hooks/useAdvancedFilterDropdown';
|
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 { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
|
||||||
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
|
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { 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 { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
|
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
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 { getCompositeSubFieldLabel } from '@/object-record/object-filter-dropdown/utils/getCompositeSubFieldLabel';
|
||||||
import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel';
|
import { getFilterableFieldTypeLabel } from '@/object-record/object-filter-dropdown/utils/getFilterableFieldTypeLabel';
|
||||||
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
||||||
import { 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 { SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsCompositeFieldTypeConfigs';
|
||||||
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
|
import { DropdownMenuHeader } from '@/ui/layout/dropdown/components/DropdownMenuHeader';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
@ -83,7 +83,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
|
|||||||
advancedFilterViewFilterId,
|
advancedFilterViewFilterId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSelectFilter = (definition: FilterDefinition | null) => {
|
const handleSelectFilter = (definition: RecordFilterDefinition | null) => {
|
||||||
if (definition !== null) {
|
if (definition !== null) {
|
||||||
if (
|
if (
|
||||||
isDefined(advancedFilterViewFilterId) &&
|
isDefined(advancedFilterViewFilterId) &&
|
||||||
@ -91,7 +91,8 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
|
|||||||
) {
|
) {
|
||||||
closeAdvancedFilterDropdown();
|
closeAdvancedFilterDropdown();
|
||||||
|
|
||||||
const operand = getOperandsForFilterDefinition(definition)[0];
|
const operand =
|
||||||
|
getRecordFilterOperandsForRecordFilterDefinition(definition)[0];
|
||||||
const { value, displayValue } = getInitialFilterValue(
|
const { value, displayValue } = getInitialFilterValue(
|
||||||
definition.type,
|
definition.type,
|
||||||
operand,
|
operand,
|
||||||
@ -111,7 +112,7 @@ export const ObjectFilterDropdownFilterSelectCompositeFieldSubMenu = () => {
|
|||||||
setFilterDefinitionUsedInDropdown(definition);
|
setFilterDefinitionUsedInDropdown(definition);
|
||||||
|
|
||||||
setSelectedOperandInDropdown(
|
setSelectedOperandInDropdown(
|
||||||
getOperandsForFilterDefinition(definition)[0],
|
getRecordFilterOperandsForRecordFilterDefinition(definition)[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
setObjectFilterDropdownSearchInput('');
|
setObjectFilterDropdownSearchInput('');
|
||||||
|
|||||||
@ -7,11 +7,11 @@ import { objectFilterDropdownFirstLevelFilterDefinitionComponentState } from '@/
|
|||||||
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
|
import { objectFilterDropdownIsSelectingCompositeFieldComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownIsSelectingCompositeFieldComponentState';
|
||||||
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
|
import { objectFilterDropdownSubMenuFieldTypeComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSubMenuFieldTypeComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
import { 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 { 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 { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
@ -22,7 +22,7 @@ import { useRecoilValue } from 'recoil';
|
|||||||
import { MenuItemSelect, useIcons } from 'twenty-ui';
|
import { MenuItemSelect, useIcons } from 'twenty-ui';
|
||||||
|
|
||||||
export type ObjectFilterDropdownFilterSelectMenuItemProps = {
|
export type ObjectFilterDropdownFilterSelectMenuItemProps = {
|
||||||
filterDefinition: FilterDefinition;
|
filterDefinition: RecordFilterDefinition;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ObjectFilterDropdownFilterSelectMenuItem = ({
|
export const ObjectFilterDropdownFilterSelectMenuItem = ({
|
||||||
@ -74,7 +74,7 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const handleSelectFilterDefinition = (
|
const handleSelectFilterDefinition = (
|
||||||
availableFilterDefinition: FilterDefinition,
|
availableFilterDefinition: RecordFilterDefinition,
|
||||||
) => {
|
) => {
|
||||||
closeAdvancedFilterDropdown();
|
closeAdvancedFilterDropdown();
|
||||||
|
|
||||||
@ -90,7 +90,9 @@ export const ObjectFilterDropdownFilterSelectMenuItem = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSelectedOperandInDropdown(
|
setSelectedOperandInDropdown(
|
||||||
getOperandsForFilterDefinition(availableFilterDefinition)[0],
|
getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
|
availableFilterDefinition,
|
||||||
|
)[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
setObjectFilterDropdownFilterIsSelected(true);
|
setObjectFilterDropdownFilterIsSelected(true);
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { ChangeEvent, useCallback, useState } from 'react';
|
import { ChangeEvent, useCallback, useState } from 'react';
|
||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
|
||||||
import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput';
|
import { DropdownMenuInput } from '@/ui/layout/dropdown/components/DropdownMenuInput';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
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 { ObjectFilterDropdownOperandSelect } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownOperandSelect';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
|
||||||
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
|
import { FiltersHotkeyScope } from '@/object-record/object-filter-dropdown/types/FiltersHotkeyScope';
|
||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
import { getInitialFilterValue } from '@/object-record/object-filter-dropdown/utils/getInitialFilterValue';
|
||||||
|
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
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 styled from '@emotion/styled';
|
||||||
import { MenuItem } from 'twenty-ui';
|
import { MenuItem } from 'twenty-ui';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
|
||||||
import { getOperandLabel } from '../utils/getOperandLabel';
|
import { getOperandLabel } from '../utils/getOperandLabel';
|
||||||
import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType';
|
|
||||||
|
|
||||||
const StyledDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)`
|
const StyledDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)`
|
||||||
background-color: ${({ theme }) => theme.background.primary};
|
background-color: ${({ theme }) => theme.background.primary};
|
||||||
@ -39,7 +39,9 @@ export const ObjectFilterDropdownOperandSelect = () => {
|
|||||||
const { closeDropdown } = useDropdown();
|
const { closeDropdown } = useDropdown();
|
||||||
|
|
||||||
const operandsForFilterType = isDefined(filterDefinitionUsedInDropdown)
|
const operandsForFilterType = isDefined(filterDefinitionUsedInDropdown)
|
||||||
? getOperandsForFilterDefinition(filterDefinitionUsedInDropdown)
|
? getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
|
filterDefinitionUsedInDropdown,
|
||||||
|
)
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
const handleOperandChange = (newOperand: ViewFilterOperand) => {
|
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 { useSelectableListStates } from '@/ui/layout/selectable-list/hooks/internal/useSelectableListStates';
|
||||||
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
|
||||||
|
|
||||||
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
|
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState';
|
import { objectFilterDropdownSelectedOptionValuesComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedOptionValuesComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
|
||||||
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
|
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { MenuItem, MenuItemMultiSelect } from 'twenty-ui';
|
import { MenuItem, MenuItemMultiSelect } from 'twenty-ui';
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues';
|
import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues';
|
||||||
import { FieldRatingValue } from '@/object-record/record-field/types/FieldMetadata';
|
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 { RatingInput } from '@/ui/field/input/components/RatingInput';
|
||||||
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
|
|||||||
@ -4,12 +4,12 @@ import { v4 } from 'uuid';
|
|||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { ObjectFilterDropdownRecordPinnedItems } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordPinnedItems';
|
import { ObjectFilterDropdownRecordPinnedItems } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordPinnedItems';
|
||||||
import { CURRENT_WORKSPACE_MEMBER_SELECTABLE_ITEM_ID } from '@/object-record/object-filter-dropdown/constants/CurrentWorkspaceMemberSelectableItemId';
|
import { CURRENT_WORKSPACE_MEMBER_SELECTABLE_ITEM_ID } from '@/object-record/object-filter-dropdown/constants/CurrentWorkspaceMemberSelectableItemId';
|
||||||
import { useApplyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useApplyRecordFilter';
|
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState';
|
import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSelectedRecordIdsComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
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 { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
|
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
|
||||||
import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect';
|
import { useRecordsForSelect } from '@/object-record/select/hooks/useRecordsForSelect';
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { v4 } from 'uuid';
|
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 { useEmptyRecordFilter } from '@/object-record/object-filter-dropdown/hooks/useEmptyRecordFilter';
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
@ -9,6 +8,7 @@ import { objectFilterDropdownSelectedRecordIdsComponentState } from '@/object-re
|
|||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
import { getActorSourceMultiSelectOptions } from '@/object-record/object-filter-dropdown/utils/getActorSourceMultiSelectOptions';
|
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 { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
|
import { MultipleSelectDropdown } from '@/object-record/select/components/MultipleSelectDropdown';
|
||||||
import { SelectableItem } from '@/object-record/select/types/SelectableItem';
|
import { SelectableItem } from '@/object-record/select/types/SelectableItem';
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { ChangeEvent, useCallback, useState } from 'react';
|
import { ChangeEvent, useCallback, useState } from 'react';
|
||||||
import { v4 } from 'uuid';
|
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 { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
import { useApplyRecordFilter } from '@/object-record/record-filter/hooks/useApplyRecordFilter';
|
||||||
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
import { DropdownMenuSearchInput } from '@/ui/layout/dropdown/components/DropdownMenuSearchInput';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { selectedOperandInDropdownComponentState } from '@/object-record/object-
|
|||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
||||||
import { getOperandsForFilterDefinition } from '../utils/getOperandsForFilterType';
|
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
|
||||||
import { GenericEntityFilterChip } from './GenericEntityFilterChip';
|
import { GenericEntityFilterChip } from './GenericEntityFilterChip';
|
||||||
import { ObjectFilterDropdownRecordSelect } from './ObjectFilterDropdownRecordSelect';
|
import { ObjectFilterDropdownRecordSelect } from './ObjectFilterDropdownRecordSelect';
|
||||||
import { ObjectFilterDropdownSearchInput } from './ObjectFilterDropdownSearchInput';
|
import { ObjectFilterDropdownSearchInput } from './ObjectFilterDropdownSearchInput';
|
||||||
@ -47,7 +47,7 @@ export const SingleEntityObjectFilterDropdownButton = ({
|
|||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
setFilterDefinitionUsedInDropdown(availableFilterDefinition);
|
setFilterDefinitionUsedInDropdown(availableFilterDefinition);
|
||||||
const defaultOperand = getOperandsForFilterDefinition(
|
const defaultOperand = getRecordFilterOperandsForRecordFilterDefinition(
|
||||||
availableFilterDefinition,
|
availableFilterDefinition,
|
||||||
)[0];
|
)[0];
|
||||||
setSelectedOperandInDropdown(defaultOperand);
|
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 { advancedFilterViewFilterGroupIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterGroupIdComponentState';
|
||||||
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
|
import { advancedFilterViewFilterIdComponentState } from '@/object-record/object-filter-dropdown/states/advancedFilterViewFilterIdComponentState';
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
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 { 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 { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
@ -15,7 +15,7 @@ import { isDefined } from 'twenty-ui';
|
|||||||
import { v4 } from 'uuid';
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
type SelectFilterParams = {
|
type SelectFilterParams = {
|
||||||
filterDefinition: FilterDefinition;
|
filterDefinition: RecordFilterDefinition;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useSelectFilterDefinitionUsedInDropdown = (
|
export const useSelectFilterDefinitionUsedInDropdown = (
|
||||||
@ -63,12 +63,12 @@ export const useSelectFilterDefinitionUsedInDropdown = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSelectedOperandInDropdown(
|
setSelectedOperandInDropdown(
|
||||||
getOperandsForFilterDefinition(filterDefinition)[0],
|
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
const { value, displayValue } = getInitialFilterValue(
|
const { value, displayValue } = getInitialFilterValue(
|
||||||
filterDefinition.type,
|
filterDefinition.type,
|
||||||
getOperandsForFilterDefinition(filterDefinition)[0],
|
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
|
||||||
);
|
);
|
||||||
|
|
||||||
const isAdvancedFilter = isDefined(advancedFilterViewFilterId);
|
const isAdvancedFilter = isDefined(advancedFilterViewFilterId);
|
||||||
@ -78,7 +78,8 @@ export const useSelectFilterDefinitionUsedInDropdown = (
|
|||||||
id: advancedFilterViewFilterId ?? v4(),
|
id: advancedFilterViewFilterId ?? v4(),
|
||||||
fieldMetadataId: filterDefinition.fieldMetadataId,
|
fieldMetadataId: filterDefinition.fieldMetadataId,
|
||||||
displayValue,
|
displayValue,
|
||||||
operand: getOperandsForFilterDefinition(filterDefinition)[0],
|
operand:
|
||||||
|
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition)[0],
|
||||||
value,
|
value,
|
||||||
definition: filterDefinition,
|
definition: filterDefinition,
|
||||||
viewFilterGroupId: advancedFilterViewFilterGroupId,
|
viewFilterGroupId: advancedFilterViewFilterGroupId,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
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';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const availableFilterDefinitionsComponentState = createComponentStateV2<
|
export const availableFilterDefinitionsComponentState = createComponentStateV2<
|
||||||
FilterDefinition[]
|
RecordFilterDefinition[]
|
||||||
>({
|
>({
|
||||||
key: 'availableFilterDefinitionsComponentState',
|
key: 'availableFilterDefinitionsComponentState',
|
||||||
defaultValue: [],
|
defaultValue: [],
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
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 { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
import { FilterDefinition } from '../types/FilterDefinition';
|
|
||||||
|
|
||||||
export const filterDefinitionUsedInDropdownComponentState =
|
export const filterDefinitionUsedInDropdownComponentState =
|
||||||
createComponentStateV2<FilterDefinition | null>({
|
createComponentStateV2<RecordFilterDefinition | null>({
|
||||||
key: 'filterDefinitionUsedInDropdownComponentState',
|
key: 'filterDefinitionUsedInDropdownComponentState',
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
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';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const objectFilterDropdownFirstLevelFilterDefinitionComponentState =
|
export const objectFilterDropdownFirstLevelFilterDefinitionComponentState =
|
||||||
createComponentStateV2<FilterDefinition | null>({
|
createComponentStateV2<RecordFilterDefinition | null>({
|
||||||
key: 'objectFilterDropdownFirstLevelFilterDefinitionComponentState',
|
key: 'objectFilterDropdownFirstLevelFilterDefinitionComponentState',
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
componentInstanceContext: ObjectFilterDropdownComponentInstanceContext,
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
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';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const objectFilterDropdownSubMenuFieldTypeComponentState =
|
export const objectFilterDropdownSubMenuFieldTypeComponentState =
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
||||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
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<
|
export const onFilterSelectComponentState = createComponentStateV2<
|
||||||
((filter: Filter | null) => void) | undefined
|
((filter: RecordFilter | null) => void) | undefined
|
||||||
>({
|
>({
|
||||||
key: 'onFilterSelectComponentState',
|
key: 'onFilterSelectComponentState',
|
||||||
defaultValue: undefined,
|
defaultValue: undefined,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
||||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
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<
|
export const selectedFilterComponentState = createComponentStateV2<
|
||||||
Filter | undefined | null
|
RecordFilter | undefined | null
|
||||||
>({
|
>({
|
||||||
key: 'selectedFilterComponentState',
|
key: 'selectedFilterComponentState',
|
||||||
defaultValue: undefined,
|
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 { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
|
||||||
|
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
|
||||||
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
|
import { getRecordFilterOperandsForRecordFilterDefinition } from '../../../record-filter/utils/getRecordFilterOperandsForRecordFilterDefinition';
|
||||||
import { getOperandsForFilterDefinition } from '../getOperandsForFilterType';
|
|
||||||
|
|
||||||
describe('getOperandsForFilterType', () => {
|
describe('getOperandsForFilterType', () => {
|
||||||
const emptyOperands = [
|
const emptyOperands = [
|
||||||
ViewFilterOperand.IsEmpty,
|
RecordFilterOperand.IsEmpty,
|
||||||
ViewFilterOperand.IsNotEmpty,
|
RecordFilterOperand.IsNotEmpty,
|
||||||
];
|
];
|
||||||
|
|
||||||
const containsOperands = [
|
const containsOperands = [
|
||||||
ViewFilterOperand.Contains,
|
RecordFilterOperand.Contains,
|
||||||
ViewFilterOperand.DoesNotContain,
|
RecordFilterOperand.DoesNotContain,
|
||||||
];
|
];
|
||||||
|
|
||||||
const numberOperands = [
|
const numberOperands = [
|
||||||
ViewFilterOperand.GreaterThan,
|
RecordFilterOperand.GreaterThan,
|
||||||
ViewFilterOperand.LessThan,
|
RecordFilterOperand.LessThan,
|
||||||
];
|
];
|
||||||
|
|
||||||
const dateOperands = [
|
const dateOperands = [
|
||||||
ViewFilterOperand.Is,
|
RecordFilterOperand.Is,
|
||||||
ViewFilterOperand.IsRelative,
|
RecordFilterOperand.IsRelative,
|
||||||
ViewFilterOperand.IsInPast,
|
RecordFilterOperand.IsInPast,
|
||||||
ViewFilterOperand.IsInFuture,
|
RecordFilterOperand.IsInFuture,
|
||||||
ViewFilterOperand.IsToday,
|
RecordFilterOperand.IsToday,
|
||||||
ViewFilterOperand.IsBefore,
|
RecordFilterOperand.IsBefore,
|
||||||
ViewFilterOperand.IsAfter,
|
RecordFilterOperand.IsAfter,
|
||||||
];
|
];
|
||||||
|
|
||||||
const relationOperand = [ViewFilterOperand.Is, ViewFilterOperand.IsNot];
|
const relationOperand = [RecordFilterOperand.Is, RecordFilterOperand.IsNot];
|
||||||
|
|
||||||
const testCases = [
|
const testCases = [
|
||||||
['TEXT', [...containsOperands, ...emptyOperands]],
|
['TEXT', [...containsOperands, ...emptyOperands]],
|
||||||
@ -50,9 +49,9 @@ describe('getOperandsForFilterType', () => {
|
|||||||
|
|
||||||
testCases.forEach(([filterType, expectedOperands]) => {
|
testCases.forEach(([filterType, expectedOperands]) => {
|
||||||
it(`should return correct operands for FilterType.${filterType}`, () => {
|
it(`should return correct operands for FilterType.${filterType}`, () => {
|
||||||
const result = getOperandsForFilterDefinition({
|
const result = getRecordFilterOperandsForRecordFilterDefinition({
|
||||||
type: filterType as FilterableFieldType,
|
type: filterType as FilterableFieldType,
|
||||||
} as FilterDefinition);
|
} as RecordFilterDefinition);
|
||||||
expect(result).toEqual(expectedOperands);
|
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';
|
import { SETTINGS_FIELD_TYPE_CONFIGS } from '@/settings/data-model/constants/SettingsFieldTypeConfigs';
|
||||||
|
|
||||||
export const getFilterableFieldTypeLabel = (
|
export const getFilterableFieldTypeLabel = (
|
||||||
|
|||||||
@ -1,21 +1,21 @@
|
|||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { FilterableFieldType } from '@/object-record/record-filter/types/FilterableFieldType';
|
||||||
import { FilterableFieldType } from '@/object-record/object-filter-dropdown/types/FilterableFieldType';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
export const getInitialFilterValue = (
|
export const getInitialFilterValue = (
|
||||||
newType: FilterableFieldType,
|
newType: FilterableFieldType,
|
||||||
newOperand: ViewFilterOperand,
|
newOperand: RecordFilterOperand,
|
||||||
oldValue?: string,
|
oldValue?: string,
|
||||||
oldDisplayValue?: string,
|
oldDisplayValue?: string,
|
||||||
): Pick<Filter, 'value' | 'displayValue'> | Record<string, never> => {
|
): Pick<RecordFilter, 'value' | 'displayValue'> | Record<string, never> => {
|
||||||
switch (newType) {
|
switch (newType) {
|
||||||
case 'DATE':
|
case 'DATE':
|
||||||
case 'DATE_TIME': {
|
case 'DATE_TIME': {
|
||||||
const activeDatePickerOperands = [
|
const activeDatePickerOperands = [
|
||||||
ViewFilterOperand.IsBefore,
|
RecordFilterOperand.IsBefore,
|
||||||
ViewFilterOperand.Is,
|
RecordFilterOperand.Is,
|
||||||
ViewFilterOperand.IsAfter,
|
RecordFilterOperand.IsAfter,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (activeDatePickerOperands.includes(newOperand)) {
|
if (activeDatePickerOperands.includes(newOperand)) {
|
||||||
@ -29,7 +29,7 @@ export const getInitialFilterValue = (
|
|||||||
return { value, displayValue };
|
return { value, displayValue };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newOperand === ViewFilterOperand.IsRelative) {
|
if (newOperand === RecordFilterOperand.IsRelative) {
|
||||||
return { value: '', displayValue: '' };
|
return { value: '', displayValue: '' };
|
||||||
}
|
}
|
||||||
break;
|
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) => {
|
export const getSubMenuOptions = (subMenu: FilterableFieldType | null) => {
|
||||||
switch (subMenu) {
|
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 { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||||
|
|
||||||
export const isActorSourceCompositeFilter = (
|
export const isActorSourceCompositeFilter = (
|
||||||
filterDefinition: Pick<FilterDefinition, 'compositeFieldName'>,
|
filterDefinition: Pick<RecordFilterDefinition, 'compositeFieldName'>,
|
||||||
) => {
|
) => {
|
||||||
return (
|
return (
|
||||||
filterDefinition.compositeFieldName ===
|
filterDefinition.compositeFieldName ===
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { onFilterSelectComponentState } from '@/object-record/object-filter-dropdown/states/onFilterSelectComponentState';
|
import { onFilterSelectComponentState } from '@/object-record/object-filter-dropdown/states/onFilterSelectComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
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 { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
||||||
@ -21,7 +21,7 @@ export const useApplyRecordFilter = (componentInstanceId?: string) => {
|
|||||||
|
|
||||||
const applyRecordFilter = useRecoilCallback(
|
const applyRecordFilter = useRecoilCallback(
|
||||||
({ set, snapshot }) =>
|
({ set, snapshot }) =>
|
||||||
(filter: Filter | null) => {
|
(filter: RecordFilter | null) => {
|
||||||
set(selectedFilterCallbackState, filter);
|
set(selectedFilterCallbackState, filter);
|
||||||
|
|
||||||
const onFilterSelect = getSnapshotValue(
|
const onFilterSelect = getSnapshotValue(
|
||||||
@ -1,9 +1,9 @@
|
|||||||
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
|
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';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
export const useFilterValueDependencies = (): {
|
export const useFilterValueDependencies = (): {
|
||||||
filterValueDependencies: FilterValueDependencies;
|
filterValueDependencies: RecordFilterValueDependencies;
|
||||||
} => {
|
} => {
|
||||||
const { id: currentWorkspaceMemberId } =
|
const { id: currentWorkspaceMemberId } =
|
||||||
useRecoilValue(currentWorkspaceMemberState) ?? {};
|
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';
|
import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType';
|
||||||
|
|
||||||
export type CompositeFilterableFieldType = FilterableFieldType &
|
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 { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
import { FilterDefinition } from './FilterDefinition';
|
|
||||||
|
|
||||||
export type Filter = {
|
export type RecordFilter = {
|
||||||
id: string;
|
id: string;
|
||||||
variant?: 'default' | 'danger';
|
variant?: 'default' | 'danger';
|
||||||
fieldMetadataId: string;
|
fieldMetadataId: string;
|
||||||
@ -11,5 +11,5 @@ export type Filter = {
|
|||||||
displayAvatarUrl?: string;
|
displayAvatarUrl?: string;
|
||||||
operand: ViewFilterOperand;
|
operand: ViewFilterOperand;
|
||||||
positionInViewFilterGroup?: number | null;
|
positionInViewFilterGroup?: number | null;
|
||||||
definition: FilterDefinition;
|
definition: RecordFilterDefinition;
|
||||||
};
|
};
|
||||||
@ -2,7 +2,7 @@ import { IconComponent } from 'twenty-ui';
|
|||||||
|
|
||||||
import { FilterableFieldType } from './FilterableFieldType';
|
import { FilterableFieldType } from './FilterableFieldType';
|
||||||
|
|
||||||
export type FilterDefinition = {
|
export type RecordFilterDefinition = {
|
||||||
fieldMetadataId: string;
|
fieldMetadataId: string;
|
||||||
label: string;
|
label: string;
|
||||||
iconName: 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 { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
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 { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
import { getCompaniesMock } from '~/testing/mock-data/companies';
|
import { getCompaniesMock } from '~/testing/mock-data/companies';
|
||||||
@ -15,7 +15,7 @@ const personMockObjectMetadataItem = generatedMockObjectMetadataItems.find(
|
|||||||
(item) => item.nameSingular === 'person',
|
(item) => item.nameSingular === 'person',
|
||||||
)!;
|
)!;
|
||||||
|
|
||||||
const mockFilterValueDependencies: FilterValueDependencies = {
|
const mockFilterValueDependencies: RecordFilterValueDependencies = {
|
||||||
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
|
currentWorkspaceMemberId: '32219445-f587-4c40-b2b1-6d3205ed96da',
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
|
|||||||
(field) => field.name === 'name',
|
(field) => field.name === 'name',
|
||||||
);
|
);
|
||||||
|
|
||||||
const nameFilter: Filter = {
|
const nameFilter: RecordFilter = {
|
||||||
id: 'company-name-filter',
|
id: 'company-name-filter',
|
||||||
value: companiesMock[0].name,
|
value: companiesMock[0].name,
|
||||||
fieldMetadataId: companyMockNameFieldMetadataId?.id,
|
fieldMetadataId: companyMockNameFieldMetadataId?.id,
|
||||||
@ -67,7 +67,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
|
|||||||
(field) => field.name === 'employees',
|
(field) => field.name === 'employees',
|
||||||
);
|
);
|
||||||
|
|
||||||
const nameFilter: Filter = {
|
const nameFilter: RecordFilter = {
|
||||||
id: 'company-name-filter',
|
id: 'company-name-filter',
|
||||||
value: companiesMock[0].name,
|
value: companiesMock[0].name,
|
||||||
fieldMetadataId: companyMockNameFieldMetadataId?.id,
|
fieldMetadataId: companyMockNameFieldMetadataId?.id,
|
||||||
@ -81,7 +81,7 @@ describe('computeViewRecordGqlOperationFilter', () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const employeesFilter: Filter = {
|
const employeesFilter: RecordFilter = {
|
||||||
id: 'company-employees-filter',
|
id: 'company-employees-filter',
|
||||||
value: '1000',
|
value: '1000',
|
||||||
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
||||||
@ -126,7 +126,7 @@ describe('should work as expected for the different field types', () => {
|
|||||||
(field) => field.name === 'address',
|
(field) => field.name === 'address',
|
||||||
);
|
);
|
||||||
|
|
||||||
const addressFilterContains: Filter = {
|
const addressFilterContains: RecordFilter = {
|
||||||
id: 'company-address-filter-contains',
|
id: 'company-address-filter-contains',
|
||||||
value: '123 Main St',
|
value: '123 Main St',
|
||||||
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
|
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',
|
id: 'company-address-filter-does-not-contain',
|
||||||
value: '123 Main St',
|
value: '123 Main St',
|
||||||
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
|
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',
|
id: 'company-address-filter-is-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
|
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',
|
id: 'company-address-filter-is-not-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
|
fieldMetadataId: companyMockAddressFieldMetadataId?.id,
|
||||||
@ -509,7 +509,7 @@ describe('should work as expected for the different field types', () => {
|
|||||||
(field) => field.name === 'phones',
|
(field) => field.name === 'phones',
|
||||||
);
|
);
|
||||||
|
|
||||||
const phonesFilterContains: Filter = {
|
const phonesFilterContains: RecordFilter = {
|
||||||
id: 'person-phones-filter-contains',
|
id: 'person-phones-filter-contains',
|
||||||
value: '1234567890',
|
value: '1234567890',
|
||||||
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
|
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',
|
id: 'person-phones-filter-does-not-contain',
|
||||||
value: '1234567890',
|
value: '1234567890',
|
||||||
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
|
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',
|
id: 'person-phones-filter-is-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
|
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',
|
id: 'person-phones-filter-is-not-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
|
fieldMetadataId: personMockPhonesFieldMetadataId?.id,
|
||||||
@ -659,7 +659,7 @@ describe('should work as expected for the different field types', () => {
|
|||||||
(field) => field.name === 'emails',
|
(field) => field.name === 'emails',
|
||||||
);
|
);
|
||||||
|
|
||||||
const emailsFilterContains: Filter = {
|
const emailsFilterContains: RecordFilter = {
|
||||||
id: 'person-emails-filter-contains',
|
id: 'person-emails-filter-contains',
|
||||||
value: 'test@test.com',
|
value: 'test@test.com',
|
||||||
fieldMetadataId: personMockEmailFieldMetadataId?.id,
|
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',
|
id: 'person-emails-filter-does-not-contain',
|
||||||
value: 'test@test.com',
|
value: 'test@test.com',
|
||||||
fieldMetadataId: personMockEmailFieldMetadataId?.id,
|
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',
|
id: 'person-emails-filter-is-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: personMockEmailFieldMetadataId?.id,
|
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',
|
id: 'person-emails-filter-is-not-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: personMockEmailFieldMetadataId?.id,
|
fieldMetadataId: personMockEmailFieldMetadataId?.id,
|
||||||
@ -801,7 +801,7 @@ describe('should work as expected for the different field types', () => {
|
|||||||
(field) => field.name === 'createdAt',
|
(field) => field.name === 'createdAt',
|
||||||
);
|
);
|
||||||
|
|
||||||
const dateFilterIsAfter: Filter = {
|
const dateFilterIsAfter: RecordFilter = {
|
||||||
id: 'company-date-filter-is-after',
|
id: 'company-date-filter-is-after',
|
||||||
value: '2024-09-17T20:46:58.922Z',
|
value: '2024-09-17T20:46:58.922Z',
|
||||||
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
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',
|
id: 'company-date-filter-is-before',
|
||||||
value: '2024-09-17T20:46:58.922Z',
|
value: '2024-09-17T20:46:58.922Z',
|
||||||
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
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',
|
id: 'company-date-filter-is',
|
||||||
value: '2024-09-17T20:46:58.922Z',
|
value: '2024-09-17T20:46:58.922Z',
|
||||||
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
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',
|
id: 'company-date-filter-is-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
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',
|
id: 'company-date-filter-is-not-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
fieldMetadataId: companyMockDateFieldMetadataId?.id,
|
||||||
@ -932,7 +932,7 @@ describe('should work as expected for the different field types', () => {
|
|||||||
(field) => field.name === 'employees',
|
(field) => field.name === 'employees',
|
||||||
);
|
);
|
||||||
|
|
||||||
const employeesFilterIsGreaterThan: Filter = {
|
const employeesFilterIsGreaterThan: RecordFilter = {
|
||||||
id: 'company-employees-filter-is-greater-than',
|
id: 'company-employees-filter-is-greater-than',
|
||||||
value: '1000',
|
value: '1000',
|
||||||
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
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',
|
id: 'company-employees-filter-is-less-than',
|
||||||
value: '1000',
|
value: '1000',
|
||||||
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
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',
|
id: 'company-employees-filter-is-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
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',
|
id: 'company-employees-filter-is-not-empty',
|
||||||
value: '',
|
value: '',
|
||||||
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
fieldMetadataId: companyMockEmployeesFieldMetadataId?.id,
|
||||||
|
|||||||
@ -18,7 +18,6 @@ import {
|
|||||||
SelectFilter,
|
SelectFilter,
|
||||||
StringFilter,
|
StringFilter,
|
||||||
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
|
||||||
import { Field } from '~/generated/graphql';
|
import { Field } from '~/generated/graphql';
|
||||||
import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields';
|
import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateILikeFiltersForCompositeFields';
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
@ -28,8 +27,9 @@ import {
|
|||||||
convertLessThanRatingToArrayOfRatingValues,
|
convertLessThanRatingToArrayOfRatingValues,
|
||||||
convertRatingToRatingValue,
|
convertRatingToRatingValue,
|
||||||
} from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput';
|
} from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownRatingInput';
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { FilterValueDependencies } from '@/object-record/record-filter/types/FilterValueDependencies';
|
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 { getEmptyRecordGqlOperationFilter } from '@/object-record/record-filter/utils/getEmptyRecordGqlOperationFilter';
|
||||||
import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
|
import { ViewFilterGroup } from '@/views/types/ViewFilterGroup';
|
||||||
import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
|
import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator';
|
||||||
@ -41,8 +41,8 @@ import { endOfDay, roundToNearestMinutes, startOfDay } from 'date-fns';
|
|||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
const computeFilterRecordGqlOperationFilter = (
|
const computeFilterRecordGqlOperationFilter = (
|
||||||
filterValueDependencies: FilterValueDependencies,
|
filterValueDependencies: RecordFilterValueDependencies,
|
||||||
filter: Filter,
|
filter: RecordFilter,
|
||||||
fields: Pick<Field, 'id' | 'name'>[],
|
fields: Pick<Field, 'id' | 'name'>[],
|
||||||
): RecordGqlOperationFilter | undefined => {
|
): RecordGqlOperationFilter | undefined => {
|
||||||
const correspondingField = fields.find(
|
const correspondingField = fields.find(
|
||||||
@ -54,11 +54,11 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
const isCompositeFieldFiter = isNonEmptyString(compositeFieldName);
|
const isCompositeFieldFiter = isNonEmptyString(compositeFieldName);
|
||||||
|
|
||||||
const isEmptyOperand = [
|
const isEmptyOperand = [
|
||||||
ViewFilterOperand.IsEmpty,
|
RecordFilterOperand.IsEmpty,
|
||||||
ViewFilterOperand.IsNotEmpty,
|
RecordFilterOperand.IsNotEmpty,
|
||||||
ViewFilterOperand.IsInPast,
|
RecordFilterOperand.IsInPast,
|
||||||
ViewFilterOperand.IsInFuture,
|
RecordFilterOperand.IsInFuture,
|
||||||
ViewFilterOperand.IsToday,
|
RecordFilterOperand.IsToday,
|
||||||
].includes(filter.operand);
|
].includes(filter.operand);
|
||||||
|
|
||||||
if (!correspondingField) {
|
if (!correspondingField) {
|
||||||
@ -74,13 +74,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
switch (filter.definition.type) {
|
switch (filter.definition.type) {
|
||||||
case 'TEXT':
|
case 'TEXT':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
ilike: `%${filter.value}%`,
|
ilike: `%${filter.value}%`,
|
||||||
} as StringFilter,
|
} as StringFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
not: {
|
not: {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
@ -88,8 +88,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
} as StringFilter,
|
} as StringFilter,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -102,13 +102,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'RAW_JSON':
|
case 'RAW_JSON':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
like: `%${filter.value}%`,
|
like: `%${filter.value}%`,
|
||||||
} as RawJsonFilter,
|
} as RawJsonFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
not: {
|
not: {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
@ -116,8 +116,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
} as RawJsonFilter,
|
} as RawJsonFilter,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -136,36 +136,36 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
resolvedFilterValue instanceof Date ? resolvedFilterValue : now;
|
resolvedFilterValue instanceof Date ? resolvedFilterValue : now;
|
||||||
|
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.IsAfter: {
|
case RecordFilterOperand.IsAfter: {
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
gt: date.toISOString(),
|
gt: date.toISOString(),
|
||||||
} as DateFilter,
|
} as DateFilter,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsBefore: {
|
case RecordFilterOperand.IsBefore: {
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
lt: date.toISOString(),
|
lt: date.toISOString(),
|
||||||
} as DateFilter,
|
} as DateFilter,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty: {
|
case RecordFilterOperand.IsNotEmpty: {
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
filter.definition,
|
filter.definition,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsRelative: {
|
case RecordFilterOperand.IsRelative: {
|
||||||
const dateRange = z
|
const dateRange = z
|
||||||
.object({ start: z.date(), end: z.date() })
|
.object({ start: z.date(), end: z.date() })
|
||||||
.safeParse(resolvedFilterValue).data;
|
.safeParse(resolvedFilterValue).data;
|
||||||
|
|
||||||
const defaultDateRange = resolveDateViewFilterValue({
|
const defaultDateRange = resolveDateViewFilterValue({
|
||||||
value: 'PAST_1_DAY',
|
value: 'PAST_1_DAY',
|
||||||
operand: ViewFilterOperand.IsRelative,
|
operand: RecordFilterOperand.IsRelative,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!defaultDateRange) {
|
if (!defaultDateRange) {
|
||||||
@ -189,7 +189,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.Is: {
|
case RecordFilterOperand.Is: {
|
||||||
const isValid = resolvedFilterValue instanceof Date;
|
const isValid = resolvedFilterValue instanceof Date;
|
||||||
const date = isValid ? resolvedFilterValue : now;
|
const date = isValid ? resolvedFilterValue : now;
|
||||||
|
|
||||||
@ -208,19 +208,19 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsInPast:
|
case RecordFilterOperand.IsInPast:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
lte: now.toISOString(),
|
lte: now.toISOString(),
|
||||||
} as DateFilter,
|
} as DateFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsInFuture:
|
case RecordFilterOperand.IsInFuture:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
gte: now.toISOString(),
|
gte: now.toISOString(),
|
||||||
} as DateFilter,
|
} as DateFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsToday: {
|
case RecordFilterOperand.IsToday: {
|
||||||
return {
|
return {
|
||||||
and: [
|
and: [
|
||||||
{
|
{
|
||||||
@ -244,13 +244,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'RATING':
|
case 'RATING':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Is:
|
case RecordFilterOperand.Is:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
eq: convertRatingToRatingValue(parseFloat(filter.value)),
|
eq: convertRatingToRatingValue(parseFloat(filter.value)),
|
||||||
} as RatingFilter,
|
} as RatingFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.GreaterThan:
|
case RecordFilterOperand.GreaterThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
in: convertGreaterThanRatingToArrayOfRatingValues(
|
in: convertGreaterThanRatingToArrayOfRatingValues(
|
||||||
@ -258,7 +258,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
),
|
),
|
||||||
} as RatingFilter,
|
} as RatingFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.LessThan:
|
case RecordFilterOperand.LessThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
in: convertLessThanRatingToArrayOfRatingValues(
|
in: convertLessThanRatingToArrayOfRatingValues(
|
||||||
@ -266,8 +266,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
),
|
),
|
||||||
} as RatingFilter,
|
} as RatingFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -280,20 +280,20 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'NUMBER':
|
case 'NUMBER':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.GreaterThan:
|
case RecordFilterOperand.GreaterThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
gte: parseFloat(filter.value),
|
gte: parseFloat(filter.value),
|
||||||
} as FloatFilter,
|
} as FloatFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.LessThan:
|
case RecordFilterOperand.LessThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
lte: parseFloat(filter.value),
|
lte: parseFloat(filter.value),
|
||||||
} as FloatFilter,
|
} as FloatFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -325,13 +325,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
|
|
||||||
if (recordIds.length === 0) return;
|
if (recordIds.length === 0) return;
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Is:
|
case RecordFilterOperand.Is:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name + 'Id']: {
|
[correspondingField.name + 'Id']: {
|
||||||
in: recordIds,
|
in: recordIds,
|
||||||
} as RelationFilter,
|
} as RelationFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsNot: {
|
case RecordFilterOperand.IsNot: {
|
||||||
if (recordIds.length === 0) return;
|
if (recordIds.length === 0) return;
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
@ -357,8 +357,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -373,20 +373,20 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'CURRENCY':
|
case 'CURRENCY':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.GreaterThan:
|
case RecordFilterOperand.GreaterThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
amountMicros: { gte: parseFloat(filter.value) * 1000000 },
|
amountMicros: { gte: parseFloat(filter.value) * 1000000 },
|
||||||
} as CurrencyFilter,
|
} as CurrencyFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.LessThan:
|
case RecordFilterOperand.LessThan:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
amountMicros: { lte: parseFloat(filter.value) * 1000000 },
|
amountMicros: { lte: parseFloat(filter.value) * 1000000 },
|
||||||
} as CurrencyFilter,
|
} as CurrencyFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -405,7 +405,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
);
|
);
|
||||||
|
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
or: linksFilters,
|
or: linksFilters,
|
||||||
@ -419,7 +419,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
and: linksFilters.map((filter) => {
|
and: linksFilters.map((filter) => {
|
||||||
@ -439,8 +439,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -459,7 +459,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
['firstName', 'lastName'],
|
['firstName', 'lastName'],
|
||||||
);
|
);
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
or: fullNameFilters,
|
or: fullNameFilters,
|
||||||
@ -473,7 +473,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
and: fullNameFilters.map((filter) => {
|
and: fullNameFilters.map((filter) => {
|
||||||
@ -493,8 +493,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -508,7 +508,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'ADDRESS':
|
case 'ADDRESS':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
@ -565,7 +565,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
if (!isCompositeFieldFiter) {
|
if (!isCompositeFieldFiter) {
|
||||||
return {
|
return {
|
||||||
and: [
|
and: [
|
||||||
@ -609,8 +609,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -635,13 +635,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
if (options.length === 0) return;
|
if (options.length === 0) return;
|
||||||
|
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
containsAny: options,
|
containsAny: options,
|
||||||
} as MultiSelectFilter,
|
} as MultiSelectFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
{
|
{
|
||||||
@ -682,13 +682,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
if (options.length === 0) return;
|
if (options.length === 0) return;
|
||||||
|
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Is:
|
case RecordFilterOperand.Is:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
in: options,
|
in: options,
|
||||||
} as SelectFilter,
|
} as SelectFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsNot:
|
case RecordFilterOperand.IsNot:
|
||||||
return {
|
return {
|
||||||
not: {
|
not: {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
@ -704,13 +704,13 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'ARRAY': {
|
case 'ARRAY': {
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
containsIlike: `%${filter.value}%`,
|
containsIlike: `%${filter.value}%`,
|
||||||
} as ArrayFilter,
|
} as ArrayFilter,
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
not: {
|
not: {
|
||||||
[correspondingField.name]: {
|
[correspondingField.name]: {
|
||||||
@ -718,8 +718,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
} as ArrayFilter,
|
} as ArrayFilter,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -734,7 +734,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
// TODO: fix this with a new composite field in ViewFilter entity
|
// TODO: fix this with a new composite field in ViewFilter entity
|
||||||
case 'ACTOR': {
|
case 'ACTOR': {
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Is: {
|
case RecordFilterOperand.Is: {
|
||||||
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -745,7 +745,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.IsNot: {
|
case RecordFilterOperand.IsNot: {
|
||||||
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
const parsedRecordIds = JSON.parse(filter.value) as string[];
|
||||||
|
|
||||||
if (parsedRecordIds.length === 0) return;
|
if (parsedRecordIds.length === 0) return;
|
||||||
@ -760,7 +760,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
{
|
{
|
||||||
@ -772,7 +772,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
and: [
|
and: [
|
||||||
{
|
{
|
||||||
@ -786,8 +786,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -801,7 +801,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
}
|
}
|
||||||
case 'EMAILS':
|
case 'EMAILS':
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
{
|
{
|
||||||
@ -813,7 +813,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
and: [
|
and: [
|
||||||
{
|
{
|
||||||
@ -827,8 +827,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -843,7 +843,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
const filterValue = filter.value.replace(/[^0-9]/g, '');
|
const filterValue = filter.value.replace(/[^0-9]/g, '');
|
||||||
|
|
||||||
switch (filter.operand) {
|
switch (filter.operand) {
|
||||||
case ViewFilterOperand.Contains:
|
case RecordFilterOperand.Contains:
|
||||||
return {
|
return {
|
||||||
or: [
|
or: [
|
||||||
{
|
{
|
||||||
@ -855,7 +855,7 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.DoesNotContain:
|
case RecordFilterOperand.DoesNotContain:
|
||||||
return {
|
return {
|
||||||
and: [
|
and: [
|
||||||
{
|
{
|
||||||
@ -869,8 +869,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
case ViewFilterOperand.IsEmpty:
|
case RecordFilterOperand.IsEmpty:
|
||||||
case ViewFilterOperand.IsNotEmpty:
|
case RecordFilterOperand.IsNotEmpty:
|
||||||
return getEmptyRecordGqlOperationFilter(
|
return getEmptyRecordGqlOperationFilter(
|
||||||
filter.operand,
|
filter.operand,
|
||||||
correspondingField,
|
correspondingField,
|
||||||
@ -895,8 +895,8 @@ const computeFilterRecordGqlOperationFilter = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
const computeViewFilterGroupRecordGqlOperationFilter = (
|
const computeViewFilterGroupRecordGqlOperationFilter = (
|
||||||
filterValueDependencies: FilterValueDependencies,
|
filterValueDependencies: RecordFilterValueDependencies,
|
||||||
filters: Filter[],
|
filters: RecordFilter[],
|
||||||
fields: Pick<Field, 'id' | 'name'>[],
|
fields: Pick<Field, 'id' | 'name'>[],
|
||||||
viewFilterGroups: ViewFilterGroup[],
|
viewFilterGroups: ViewFilterGroup[],
|
||||||
currentViewFilterGroupId?: string,
|
currentViewFilterGroupId?: string,
|
||||||
@ -966,8 +966,8 @@ const computeViewFilterGroupRecordGqlOperationFilter = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const computeViewRecordGqlOperationFilter = (
|
export const computeViewRecordGqlOperationFilter = (
|
||||||
filterValueDependencies: FilterValueDependencies,
|
filterValueDependencies: RecordFilterValueDependencies,
|
||||||
filters: Filter[],
|
filters: RecordFilter[],
|
||||||
fields: Pick<Field, 'id' | 'name'>[],
|
fields: Pick<Field, 'id' | 'name'>[],
|
||||||
viewFilterGroups: ViewFilterGroup[],
|
viewFilterGroups: ViewFilterGroup[],
|
||||||
): RecordGqlOperationFilter => {
|
): RecordGqlOperationFilter => {
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import {
|
|||||||
StringFilter,
|
StringFilter,
|
||||||
URLFilter,
|
URLFilter,
|
||||||
} from '@/object-record/graphql/types/RecordGqlOperationFilter';
|
} 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 { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { Field } from '~/generated/graphql';
|
import { Field } from '~/generated/graphql';
|
||||||
@ -24,7 +24,7 @@ import { generateILikeFiltersForCompositeFields } from '~/utils/array/generateIL
|
|||||||
export const getEmptyRecordGqlOperationFilter = (
|
export const getEmptyRecordGqlOperationFilter = (
|
||||||
operand: ViewFilterOperand,
|
operand: ViewFilterOperand,
|
||||||
correspondingField: Pick<Field, 'id' | 'name'>,
|
correspondingField: Pick<Field, 'id' | 'name'>,
|
||||||
definition: FilterDefinition,
|
definition: RecordFilterDefinition,
|
||||||
) => {
|
) => {
|
||||||
let emptyRecordFilter: RecordGqlOperationFilter = {};
|
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 { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { useSelectFilterDefinitionUsedInDropdown } from '@/object-record/object-filter-dropdown/hooks/useSelectFilterDefinitionUsedInDropdown';
|
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 { isDropdownOpenComponentState } from '@/ui/layout/dropdown/states/isDropdownOpenComponentState';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
import { extractComponentState } from '@/ui/utilities/state/component-state/utils/extractComponentState';
|
||||||
@ -79,11 +80,11 @@ export const useHandleToggleColumnFilter = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const availableOperandsForFilter =
|
const availableOperandsForFilter =
|
||||||
getOperandsForFilterDefinition(filterDefinition);
|
getRecordFilterOperandsForRecordFilterDefinition(filterDefinition);
|
||||||
|
|
||||||
const defaultOperand = availableOperandsForFilter[0];
|
const defaultOperand = availableOperandsForFilter[0];
|
||||||
|
|
||||||
const newFilter: Filter = {
|
const newFilter: RecordFilter = {
|
||||||
id: newFilterId,
|
id: newFilterId,
|
||||||
fieldMetadataId,
|
fieldMetadataId,
|
||||||
operand: defaultOperand,
|
operand: defaultOperand,
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { v4 } from 'uuid';
|
|||||||
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { getFilterTypeFromFieldType } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
|
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 { isSoftDeleteFilterActiveComponentState } from '@/object-record/record-table/states/isSoftDeleteFilterActiveComponentState';
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters';
|
||||||
@ -54,7 +54,7 @@ export const useHandleToggleTrashColumnFilter = ({
|
|||||||
correspondingColumnDefinition?.type,
|
correspondingColumnDefinition?.type,
|
||||||
);
|
);
|
||||||
|
|
||||||
const newFilter: Filter = {
|
const newFilter: RecordFilter = {
|
||||||
id: v4(),
|
id: v4(),
|
||||||
variant: 'danger',
|
variant: 'danger',
|
||||||
fieldMetadataId: trashFieldMetadata.id,
|
fieldMetadataId: trashFieldMetadata.id,
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { createState } from '@ui/utilities/state/utils/createState';
|
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',
|
key: 'recordIndexFiltersState',
|
||||||
defaultValue: [],
|
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 { RecordTableComponentInstanceContext } from '@/object-record/record-table/states/context/RecordTableComponentInstanceContext';
|
||||||
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
import { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
|
|
||||||
export const tableFiltersComponentState = createComponentStateV2<Filter[]>({
|
export const tableFiltersComponentState = createComponentStateV2<
|
||||||
|
RecordFilter[]
|
||||||
|
>({
|
||||||
key: 'tableFiltersComponentState',
|
key: 'tableFiltersComponentState',
|
||||||
defaultValue: [],
|
defaultValue: [],
|
||||||
componentInstanceContext: RecordTableComponentInstanceContext,
|
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 = [
|
export const SIGN_IN_BACKGROUND_MOCK_FILTER_DEFINITIONS = [
|
||||||
{
|
{
|
||||||
@ -57,4 +57,4 @@ export const SIGN_IN_BACKGROUND_MOCK_FILTER_DEFINITIONS = [
|
|||||||
iconName: 'IconMoneybag',
|
iconName: 'IconMoneybag',
|
||||||
type: 'CURRENCY',
|
type: 'CURRENCY',
|
||||||
},
|
},
|
||||||
] as FilterDefinition[];
|
] as RecordFilterDefinition[];
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { useIcons } from 'twenty-ui';
|
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 { getOperandLabelShort } from '@/object-record/object-filter-dropdown/utils/getOperandLabel';
|
||||||
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
|
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
|
||||||
|
|
||||||
type EditableFilterChipProps = {
|
type EditableFilterChipProps = {
|
||||||
viewFilter: Filter;
|
viewFilter: RecordFilter;
|
||||||
onRemove: () => void;
|
onRemove: () => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +1,17 @@
|
|||||||
import { useCallback, useEffect } from 'react';
|
import { useCallback, useEffect } from 'react';
|
||||||
|
|
||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { FilterOperand } from '@/object-record/object-filter-dropdown/types/FilterOperand';
|
|
||||||
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
|
||||||
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown';
|
||||||
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope';
|
||||||
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { EditableFilterChip } from '@/views/components/EditableFilterChip';
|
import { EditableFilterChip } from '@/views/components/EditableFilterChip';
|
||||||
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
|
|
||||||
|
|
||||||
import { ObjectFilterOperandSelectAndInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterOperandSelectAndInput';
|
import { ObjectFilterOperandSelectAndInput } from '@/object-record/object-filter-dropdown/components/ObjectFilterOperandSelectAndInput';
|
||||||
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
import { filterDefinitionUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/filterDefinitionUsedInDropdownComponentState';
|
||||||
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
import { selectedFilterComponentState } from '@/object-record/object-filter-dropdown/states/selectedFilterComponentState';
|
||||||
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
import { selectedOperandInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/selectedOperandInDropdownComponentState';
|
||||||
|
import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordFilterOperand';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
||||||
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState';
|
||||||
@ -20,7 +19,7 @@ import { isDefined } from '~/utils/isDefined';
|
|||||||
|
|
||||||
type EditableFilterDropdownButtonProps = {
|
type EditableFilterDropdownButtonProps = {
|
||||||
viewFilterDropdownId: string;
|
viewFilterDropdownId: string;
|
||||||
viewFilter: Filter;
|
viewFilter: RecordFilter;
|
||||||
hotkeyScope: HotkeyScope;
|
hotkeyScope: HotkeyScope;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -85,11 +84,11 @@ export const EditableFilterDropdownButton = ({
|
|||||||
if (
|
if (
|
||||||
!value &&
|
!value &&
|
||||||
![
|
![
|
||||||
FilterOperand.IsEmpty,
|
RecordFilterOperand.IsEmpty,
|
||||||
FilterOperand.IsNotEmpty,
|
RecordFilterOperand.IsNotEmpty,
|
||||||
ViewFilterOperand.IsInPast,
|
RecordFilterOperand.IsInPast,
|
||||||
ViewFilterOperand.IsInFuture,
|
RecordFilterOperand.IsInFuture,
|
||||||
ViewFilterOperand.IsToday,
|
RecordFilterOperand.IsToday,
|
||||||
].includes(operand)
|
].includes(operand)
|
||||||
) {
|
) {
|
||||||
deleteCombinedViewFilter(fieldId);
|
deleteCombinedViewFilter(fieldId);
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
import { useIcons } from 'twenty-ui';
|
import { useIcons } from 'twenty-ui';
|
||||||
|
|
||||||
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
|
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 { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
|
||||||
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
|
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
|
||||||
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
import { useDeleteCombinedViewFilters } from '@/views/hooks/useDeleteCombinedViewFilters';
|
||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
|
|
||||||
type VariantFilterChipProps = {
|
type VariantFilterChipProps = {
|
||||||
viewFilter: Filter;
|
viewFilter: RecordFilter;
|
||||||
viewBarId: string;
|
viewBarId: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@ import { ReactNode } from 'react';
|
|||||||
import { useParams } from 'react-router-dom';
|
import { useParams } from 'react-router-dom';
|
||||||
|
|
||||||
import { ObjectFilterDropdownButton } from '@/object-record/object-filter-dropdown/components/ObjectFilterDropdownButton';
|
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 { ObjectSortDropdownButton } from '@/object-record/object-sort-dropdown/components/ObjectSortDropdownButton';
|
||||||
|
|
||||||
import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading';
|
import { useIsPrefetchLoading } from '@/prefetch/hooks/useIsPrefetchLoading';
|
||||||
import { TopBar } from '@/ui/layout/top-bar/components/TopBar';
|
import { TopBar } from '@/ui/layout/top-bar/components/TopBar';
|
||||||
import { QueryParamsFiltersEffect } from '@/views/components/QueryParamsFiltersEffect';
|
import { QueryParamsFiltersEffect } from '@/views/components/QueryParamsFiltersEffect';
|
||||||
@ -18,6 +18,7 @@ import { ViewPickerDropdown } from '@/views/view-picker/components/ViewPickerDro
|
|||||||
|
|
||||||
import { ViewsHotkeyScope } from '../types/ViewsHotkeyScope';
|
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 { VIEW_SORT_DROPDOWN_ID } from '@/object-record/object-sort-dropdown/constants/ViewSortDropdownId';
|
||||||
import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext';
|
import { ObjectSortDropdownComponentInstanceContext } from '@/object-record/object-sort-dropdown/states/context/ObjectSortDropdownComponentInstanceContext';
|
||||||
import { ViewEventContext } from '@/views/events/contexts/ViewEventContext';
|
import { ViewEventContext } from '@/views/events/contexts/ViewEventContext';
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { ReactNode, useMemo } from 'react';
|
|||||||
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
|
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
|
||||||
import { AddObjectFilterFromDetailsButton } from '@/object-record/object-filter-dropdown/components/AddObjectFilterFromDetailsButton';
|
import { AddObjectFilterFromDetailsButton } from '@/object-record/object-filter-dropdown/components/AddObjectFilterFromDetailsButton';
|
||||||
import { ObjectFilterDropdownComponentInstanceContext } from '@/object-record/object-filter-dropdown/states/contexts/ObjectFilterDropdownComponentInstanceContext';
|
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 { useHandleToggleTrashColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleTrashColumnFilter';
|
||||||
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
|
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
|
||||||
import { useRecoilComponentFamilyValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentFamilyValueV2';
|
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 ?
|
// 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
|
// Also as filter is spread into viewFilter, definition is present
|
||||||
// FixMe: Ugly hack to make it work
|
// FixMe: Ugly hack to make it work
|
||||||
viewFilter={viewFilter as unknown as Filter}
|
viewFilter={viewFilter as unknown as RecordFilter}
|
||||||
viewBarId={viewBarId}
|
viewBarId={viewBarId}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { isNonEmptyString } from '@sniptt/guards';
|
import { isNonEmptyString } from '@sniptt/guards';
|
||||||
import { useEffect } from 'react';
|
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 { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ export const ViewBarFilterEffect = ({
|
|||||||
if (isDefined(availableFilterDefinitions)) {
|
if (isDefined(availableFilterDefinitions)) {
|
||||||
setAvailableFilterDefinitions(availableFilterDefinitions);
|
setAvailableFilterDefinitions(availableFilterDefinitions);
|
||||||
}
|
}
|
||||||
setOnFilterSelect(() => (filter: Filter | null) => {
|
setOnFilterSelect(() => (filter: RecordFilter | null) => {
|
||||||
if (isDefined(filter)) {
|
if (isDefined(filter)) {
|
||||||
upsertCombinedViewFilter(filter);
|
upsertCombinedViewFilter(filter);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useRecoilCallback } from 'recoil';
|
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 { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue';
|
||||||
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
import { useRecoilComponentCallbackStateV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentCallbackStateV2';
|
||||||
import { useGetViewFromCache } from '@/views/hooks/useGetViewFromCache';
|
import { useGetViewFromCache } from '@/views/hooks/useGetViewFromCache';
|
||||||
@ -33,7 +33,7 @@ export const useUpsertCombinedViewFilters = (viewBarComponentId?: string) => {
|
|||||||
|
|
||||||
const upsertCombinedViewFilter = useRecoilCallback(
|
const upsertCombinedViewFilter = useRecoilCallback(
|
||||||
({ snapshot, set }) =>
|
({ snapshot, set }) =>
|
||||||
async (upsertedFilter: Filter) => {
|
async (upsertedFilter: RecordFilter) => {
|
||||||
const currentViewId = getSnapshotValue(
|
const currentViewId = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
currentViewIdCallbackState,
|
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 { createComponentStateV2 } from '@/ui/utilities/state/component-state/utils/createComponentStateV2';
|
||||||
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
|
import { ViewComponentInstanceContext } from '@/views/states/contexts/ViewComponentInstanceContext';
|
||||||
|
|
||||||
export const availableFilterDefinitionsComponentState = createComponentStateV2<
|
export const availableFilterDefinitionsComponentState = createComponentStateV2<
|
||||||
FilterDefinition[]
|
RecordFilterDefinition[]
|
||||||
>({
|
>({
|
||||||
key: 'availableFilterDefinitionsComponentState',
|
key: 'availableFilterDefinitionsComponentState',
|
||||||
defaultValue: [],
|
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';
|
import { ViewFilterOperand } from './ViewFilterOperand';
|
||||||
|
|
||||||
export type ViewFilter = {
|
export type ViewFilter = {
|
||||||
@ -14,5 +14,5 @@ export type ViewFilter = {
|
|||||||
viewId?: string;
|
viewId?: string;
|
||||||
viewFilterGroupId?: string;
|
viewFilterGroupId?: string;
|
||||||
positionInViewFilterGroup?: number | null;
|
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 { Sort } from '@/object-record/object-sort-dropdown/types/Sort';
|
||||||
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
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 { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { ViewField } from '@/views/types/ViewField';
|
import { ViewField } from '@/views/types/ViewField';
|
||||||
import { ViewFilter } from '@/views/types/ViewFilter';
|
import { ViewFilter } from '@/views/types/ViewFilter';
|
||||||
@ -54,7 +54,7 @@ describe('mapViewFiltersToFilters', () => {
|
|||||||
operand: ViewFilterOperand.Is,
|
operand: ViewFilterOperand.Is,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const expectedFilters: Filter[] = [
|
const expectedFilters: RecordFilter[] = [
|
||||||
{
|
{
|
||||||
id: 'id',
|
id: 'id',
|
||||||
fieldMetadataId: '05731f68-6e7a-4903-8374-c0b6a9063482',
|
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 { formatFieldMetadataItemsAsFilterDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
|
||||||
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
|
import { formatFieldMetadataItemsAsSortDefinitions } from '@/object-metadata/utils/formatFieldMetadataItemsAsSortDefinitions';
|
||||||
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
|
||||||
import { 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 { computeViewRecordGqlOperationFilter } from '@/object-record/record-filter/utils/computeViewRecordGqlOperationFilter';
|
||||||
import { View } from '@/views/types/View';
|
import { View } from '@/views/types/View';
|
||||||
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
|
import { mapViewFiltersToFilters } from '@/views/utils/mapViewFiltersToFilters';
|
||||||
@ -21,7 +22,7 @@ export const getQueryVariablesFromView = ({
|
|||||||
fieldMetadataItems: FieldMetadataItem[];
|
fieldMetadataItems: FieldMetadataItem[];
|
||||||
objectMetadataItem: ObjectMetadataItem;
|
objectMetadataItem: ObjectMetadataItem;
|
||||||
isJsonFilterEnabled: boolean;
|
isJsonFilterEnabled: boolean;
|
||||||
filterValueDependencies: FilterValueDependencies;
|
filterValueDependencies: RecordFilterValueDependencies;
|
||||||
}) => {
|
}) => {
|
||||||
if (!isDefined(view)) {
|
if (!isDefined(view)) {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
import { Filter } from '@/object-record/object-filter-dropdown/types/Filter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { FilterDefinition } from '@/object-record/object-filter-dropdown/types/FilterDefinition';
|
|
||||||
import { isDefined } from '~/utils/isDefined';
|
import { isDefined } from '~/utils/isDefined';
|
||||||
|
|
||||||
|
import { RecordFilterDefinition } from '@/object-record/record-filter/types/RecordFilterDefinition';
|
||||||
import { ViewFilter } from '../types/ViewFilter';
|
import { ViewFilter } from '../types/ViewFilter';
|
||||||
|
|
||||||
export const mapViewFiltersToFilters = (
|
export const mapViewFiltersToFilters = (
|
||||||
viewFilters: ViewFilter[],
|
viewFilters: ViewFilter[],
|
||||||
availableFilterDefinitions: FilterDefinition[],
|
availableFilterDefinitions: RecordFilterDefinition[],
|
||||||
): Filter[] => {
|
): RecordFilter[] => {
|
||||||
return viewFilters
|
return viewFilters
|
||||||
.map((viewFilter) => {
|
.map((viewFilter) => {
|
||||||
const availableFilterDefinition = availableFilterDefinitions.find(
|
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';
|
import { isDefined } from 'twenty-ui';
|
||||||
|
|
||||||
export const shouldReplaceFilter = (
|
export const shouldReplaceFilter = (
|
||||||
oldFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
oldFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||||
newFilter: Pick<Filter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
newFilter: Pick<RecordFilter, 'id' | 'fieldMetadataId' | 'viewFilterGroupId'>,
|
||||||
) => {
|
) => {
|
||||||
const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);
|
const isNewFilterAdvancedFilter = isDefined(newFilter.viewFilterGroupId);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user