fix: Display multipicker on Created By source filter (#10543)
fix: #9674 When the selected filter is Is and the field type is ACTOR, we now show ObjectFilterDropdownSourceSelect instead of a text input. This ensures proper selection for actor-based filters. Also previously, when a user changed the selected option, all default values were getting wiped out so i have made some changes in updatedSelectedItems Loom video: https://www.loom.com/share/8b80a78d5e8c4a5192d69cab96f0c838?sid=5bd76fff-7cd4-4e3c-8c48-d1c9e4e95651 --------- Co-authored-by: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Co-authored-by: prastoin <paul@twenty.com> Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
@ -73,6 +73,7 @@ export const ObjectFilterDropdownOperandSelect = () => {
|
|||||||
value: '',
|
value: '',
|
||||||
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
|
type: getFilterTypeFromFieldType(fieldMetadataItemUsedInDropdown.type),
|
||||||
label: fieldMetadataItemUsedInDropdown.label,
|
label: fieldMetadataItemUsedInDropdown.label,
|
||||||
|
subFieldName: subFieldNameUsedInDropdown,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -100,6 +101,7 @@ export const ObjectFilterDropdownOperandSelect = () => {
|
|||||||
value,
|
value,
|
||||||
type: filterType,
|
type: filterType,
|
||||||
label: fieldMetadataItemUsedInDropdown.label,
|
label: fieldMetadataItemUsedInDropdown.label,
|
||||||
|
subFieldName: subFieldNameUsedInDropdown,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,28 +12,26 @@ import { RecordFilterOperand } from '@/object-record/record-filter/types/RecordF
|
|||||||
import { EditableFilterDropdownButtonEffect } from '@/views/components/EditableFilterDropdownButtonEffect';
|
import { EditableFilterDropdownButtonEffect } from '@/views/components/EditableFilterDropdownButtonEffect';
|
||||||
|
|
||||||
type EditableFilterDropdownButtonProps = {
|
type EditableFilterDropdownButtonProps = {
|
||||||
viewFilterDropdownId: string;
|
recordFilter: RecordFilter;
|
||||||
viewFilter: RecordFilter;
|
|
||||||
hotkeyScope: HotkeyScope;
|
hotkeyScope: HotkeyScope;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const EditableFilterDropdownButton = ({
|
export const EditableFilterDropdownButton = ({
|
||||||
viewFilterDropdownId,
|
recordFilter,
|
||||||
viewFilter,
|
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
}: EditableFilterDropdownButtonProps) => {
|
}: EditableFilterDropdownButtonProps) => {
|
||||||
const { closeDropdown } = useDropdown(viewFilterDropdownId);
|
const { closeDropdown } = useDropdown(recordFilter.id);
|
||||||
|
|
||||||
const { removeRecordFilter } = useRemoveRecordFilter();
|
const { removeRecordFilter } = useRemoveRecordFilter();
|
||||||
|
|
||||||
const handleRemove = () => {
|
const handleRemove = () => {
|
||||||
closeDropdown();
|
closeDropdown();
|
||||||
|
|
||||||
removeRecordFilter({ recordFilterId: viewFilter.id });
|
removeRecordFilter({ recordFilterId: recordFilter.id });
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDropdownClickOutside = useCallback(() => {
|
const handleDropdownClickOutside = useCallback(() => {
|
||||||
const { value, operand } = viewFilter;
|
const { value, operand } = recordFilter;
|
||||||
if (
|
if (
|
||||||
!value &&
|
!value &&
|
||||||
![
|
![
|
||||||
@ -44,24 +42,24 @@ export const EditableFilterDropdownButton = ({
|
|||||||
RecordFilterOperand.IsToday,
|
RecordFilterOperand.IsToday,
|
||||||
].includes(operand)
|
].includes(operand)
|
||||||
) {
|
) {
|
||||||
removeRecordFilter({ recordFilterId: viewFilter.id });
|
removeRecordFilter({ recordFilterId: recordFilter.id });
|
||||||
}
|
}
|
||||||
}, [viewFilter, removeRecordFilter]);
|
}, [recordFilter, removeRecordFilter]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<EditableFilterDropdownButtonEffect
|
<EditableFilterDropdownButtonEffect recordFilter={recordFilter} />
|
||||||
viewFilterDropdownId={viewFilterDropdownId}
|
|
||||||
viewFilter={viewFilter}
|
|
||||||
/>
|
|
||||||
<Dropdown
|
<Dropdown
|
||||||
dropdownId={viewFilterDropdownId}
|
dropdownId={recordFilter.id}
|
||||||
clickableComponent={
|
clickableComponent={
|
||||||
<EditableFilterChip viewFilter={viewFilter} onRemove={handleRemove} />
|
<EditableFilterChip
|
||||||
|
viewFilter={recordFilter}
|
||||||
|
onRemove={handleRemove}
|
||||||
|
/>
|
||||||
}
|
}
|
||||||
dropdownComponents={
|
dropdownComponents={
|
||||||
<ObjectFilterOperandSelectAndInput
|
<ObjectFilterOperandSelectAndInput
|
||||||
filterDropdownId={viewFilterDropdownId}
|
filterDropdownId={recordFilter.id}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
dropdownHotkeyScope={hotkeyScope}
|
dropdownHotkeyScope={hotkeyScope}
|
||||||
|
|||||||
@ -2,21 +2,21 @@ import { useEffect } from 'react';
|
|||||||
|
|
||||||
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
|
import { fieldMetadataItemIdUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/fieldMetadataItemIdUsedInDropdownComponentState';
|
||||||
|
|
||||||
|
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 { subFieldNameUsedInDropdownComponentState } from '@/object-record/object-filter-dropdown/states/subFieldNameUsedInDropdownComponentState';
|
||||||
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
|
import { useFilterableFieldMetadataItemsInRecordIndexContext } from '@/object-record/record-filter/hooks/useFilterableFieldMetadataItemsInRecordIndexContext';
|
||||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
||||||
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
import { useSetRecoilComponentStateV2 } from '@/ui/utilities/state/component-state/hooks/useSetRecoilComponentStateV2';
|
||||||
import { isDefined } from 'twenty-shared/utils';
|
import { isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
type EditableFilterDropdownButtonEffectProps = {
|
type EditableFilterDropdownButtonEffectProps = {
|
||||||
viewFilterDropdownId: string;
|
recordFilter: RecordFilter;
|
||||||
viewFilter: RecordFilter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const EditableFilterDropdownButtonEffect = ({
|
export const EditableFilterDropdownButtonEffect = ({
|
||||||
viewFilterDropdownId,
|
recordFilter,
|
||||||
viewFilter,
|
|
||||||
}: EditableFilterDropdownButtonEffectProps) => {
|
}: EditableFilterDropdownButtonEffectProps) => {
|
||||||
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
|
const setFieldMetadataItemIdUsedInDropdown = useSetRecoilComponentStateV2(
|
||||||
fieldMetadataItemIdUsedInDropdownComponentState,
|
fieldMetadataItemIdUsedInDropdownComponentState,
|
||||||
@ -24,12 +24,22 @@ export const EditableFilterDropdownButtonEffect = ({
|
|||||||
|
|
||||||
const setSelectedOperandInDropdown = useSetRecoilComponentStateV2(
|
const setSelectedOperandInDropdown = useSetRecoilComponentStateV2(
|
||||||
selectedOperandInDropdownComponentState,
|
selectedOperandInDropdownComponentState,
|
||||||
viewFilterDropdownId,
|
recordFilter.id,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setSubFieldNameUsedInDropdown = useSetRecoilComponentStateV2(
|
||||||
|
subFieldNameUsedInDropdownComponentState,
|
||||||
|
recordFilter.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
const setSelectedFilter = useSetRecoilComponentStateV2(
|
const setSelectedFilter = useSetRecoilComponentStateV2(
|
||||||
selectedFilterComponentState,
|
selectedFilterComponentState,
|
||||||
viewFilterDropdownId,
|
recordFilter.id,
|
||||||
|
);
|
||||||
|
|
||||||
|
const setObjectFilterDropdownSelectedRecordIds = useSetRecoilComponentStateV2(
|
||||||
|
objectFilterDropdownSelectedRecordIdsComponentState,
|
||||||
|
recordFilter.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
const { filterableFieldMetadataItems } =
|
const { filterableFieldMetadataItems } =
|
||||||
@ -38,7 +48,7 @@ export const EditableFilterDropdownButtonEffect = ({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fieldMetadataItem = filterableFieldMetadataItems.find(
|
const fieldMetadataItem = filterableFieldMetadataItems.find(
|
||||||
(fieldMetadataItem) =>
|
(fieldMetadataItem) =>
|
||||||
fieldMetadataItem.id === viewFilter.fieldMetadataId,
|
fieldMetadataItem.id === recordFilter.fieldMetadataId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!isDefined(fieldMetadataItem)) {
|
if (!isDefined(fieldMetadataItem)) {
|
||||||
@ -46,15 +56,25 @@ export const EditableFilterDropdownButtonEffect = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id);
|
setFieldMetadataItemIdUsedInDropdown(fieldMetadataItem.id);
|
||||||
setSelectedOperandInDropdown(viewFilter.operand);
|
setSelectedOperandInDropdown(recordFilter.operand);
|
||||||
setSelectedFilter(viewFilter);
|
setSelectedFilter(recordFilter);
|
||||||
|
setSubFieldNameUsedInDropdown(recordFilter.subFieldName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const selectedOptions = JSON.parse(recordFilter.value);
|
||||||
|
|
||||||
|
setObjectFilterDropdownSelectedRecordIds(selectedOptions);
|
||||||
|
} catch {
|
||||||
|
setObjectFilterDropdownSelectedRecordIds([]);
|
||||||
|
}
|
||||||
}, [
|
}, [
|
||||||
filterableFieldMetadataItems,
|
filterableFieldMetadataItems,
|
||||||
setFieldMetadataItemIdUsedInDropdown,
|
setFieldMetadataItemIdUsedInDropdown,
|
||||||
viewFilter,
|
recordFilter,
|
||||||
setSelectedOperandInDropdown,
|
setSelectedOperandInDropdown,
|
||||||
setSelectedFilter,
|
setSelectedFilter,
|
||||||
viewFilterDropdownId,
|
setSubFieldNameUsedInDropdown,
|
||||||
|
setObjectFilterDropdownSelectedRecordIds,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -1,35 +0,0 @@
|
|||||||
import { useIcons } from 'twenty-ui';
|
|
||||||
|
|
||||||
import { useFieldMetadataItemById } from '@/object-metadata/hooks/useFieldMetadataItemById';
|
|
||||||
import { useRemoveRecordFilter } from '@/object-record/record-filter/hooks/useRemoveRecordFilter';
|
|
||||||
import { RecordFilter } from '@/object-record/record-filter/types/RecordFilter';
|
|
||||||
import { SortOrFilterChip } from '@/views/components/SortOrFilterChip';
|
|
||||||
|
|
||||||
type RecordFilterChipProps = {
|
|
||||||
recordFilter: RecordFilter;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const RecordFilterChip = ({ recordFilter }: RecordFilterChipProps) => {
|
|
||||||
const { fieldMetadataItem } = useFieldMetadataItemById(
|
|
||||||
recordFilter.fieldMetadataId,
|
|
||||||
);
|
|
||||||
|
|
||||||
const { removeRecordFilter } = useRemoveRecordFilter();
|
|
||||||
|
|
||||||
const { getIcon } = useIcons();
|
|
||||||
|
|
||||||
const FieldMetadataItemIcon = getIcon(fieldMetadataItem.icon);
|
|
||||||
|
|
||||||
const handleRemoveClick = () => {
|
|
||||||
removeRecordFilter({ recordFilterId: recordFilter.id });
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SortOrFilterChip
|
|
||||||
testId={recordFilter.fieldMetadataId}
|
|
||||||
labelValue={recordFilter.label ?? ''}
|
|
||||||
Icon={FieldMetadataItemIcon}
|
|
||||||
onRemove={handleRemoveClick}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -233,11 +233,10 @@ export const ViewBarDetails = ({
|
|||||||
<DropdownScope dropdownScopeId={recordFilter.id}>
|
<DropdownScope dropdownScopeId={recordFilter.id}>
|
||||||
<ViewBarFilterEffect filterDropdownId={recordFilter.id} />
|
<ViewBarFilterEffect filterDropdownId={recordFilter.id} />
|
||||||
<EditableFilterDropdownButton
|
<EditableFilterDropdownButton
|
||||||
viewFilter={recordFilter}
|
recordFilter={recordFilter}
|
||||||
hotkeyScope={{
|
hotkeyScope={{
|
||||||
scope: recordFilter.id,
|
scope: recordFilter.id,
|
||||||
}}
|
}}
|
||||||
viewFilterDropdownId={recordFilter.id}
|
|
||||||
/>
|
/>
|
||||||
</DropdownScope>
|
</DropdownScope>
|
||||||
</ObjectFilterDropdownComponentInstanceContext.Provider>
|
</ObjectFilterDropdownComponentInstanceContext.Provider>
|
||||||
|
|||||||
Reference in New Issue
Block a user