in uui/components/filters/FiltersPanelItem.tsx [45:134]
function FiltersToolbarItemImpl(props: FiltersToolbarItemProps) {
const { maxCount = 2 } = props;
const isPickersType = props?.type === 'multiPicker' || props?.type === 'singlePicker';
const isMobileScreen = isMobile();
const popperModifiers: Modifier<any>[] = useMemo(() => {
const modifiers: Modifier<any>[] = [
{
name: 'offset',
options: { offset: isPickersType && isMobileScreen ? [0, 0] : [0, 6] },
},
];
if (isPickersType && isMobileScreen) {
modifiers.push({
name: 'resetTransform',
enabled: true,
phase: 'beforeWrite',
requires: ['computeStyles'],
fn: ({ state }) => {
state.styles.popper.transform = '';
},
});
}
return modifiers;
}, [isPickersType]);
const getDefaultPredicate = () => {
if (!props.predicates) {
return null;
}
return Object.keys(props.value || {})[0] || props.predicates.find((i) => i.isDefault)?.predicate || props.predicates?.[0].predicate;
};
const [isOpen, isOpenChange] = useState(props.autoFocus);
const [predicate, setPredicate] = useState(getDefaultPredicate());
const predicateName: string = React.useMemo(() => predicate && props.predicates.find((p) => p.predicate === predicate).name, [predicate]);
useEffect(() => {
if (props.predicates && Object.keys(props.value || {})[0] && Object.keys(props.value || {})[0] !== predicate) {
setPredicate(Object.keys(props.value || {})[0]);
}
}, [props.value]);
const onValueChange = useCallback(
(value: any) => {
if (props.predicates) {
props.onValueChange({ [props.field]: { [predicate]: value } });
} else {
props.onValueChange({ [props.field]: value });
}
},
[props.field, props.onValueChange],
);
const removeOnclickHandler = () => {
props.removeFilter(props.field);
};
const changePredicate = (val: FilterPredicateName) => {
const isInRange = (p: FilterPredicateName) => p === 'inRange' || p === 'notInRange';
if (props.type === 'numeric') {
let predicateValue = {
[props.field]: { [val]: getValue() },
};
if (isInRange(val) && !isInRange(predicate as FilterPredicateName)) {
// from simple predicate -> to Range
predicateValue = { [props.field]: { [val]: { from: null, to: null } } };
} else if (!isInRange(val) && isInRange(predicate as FilterPredicateName)) {
// from Range -> to simple predicate
predicateValue = { [props.field]: { [val]: null } };
}
props.onValueChange(predicateValue);
} else {
props.onValueChange({ [props.field]: { [val]: getValue() } });
}
setPredicate(val);
};
const renderHeader = (hideTitle: boolean) => (
<div className={ cx(css.header, isPickersType && (props.showSearch ?? css.withSearch)) }>
{props.predicates ? (
<MultiSwitch items={ props.predicates.map((i) => ({ id: i.predicate, caption: i.name })) } value={ predicate } onValueChange={ changePredicate } size="24" />
) : (
!hideTitle && (
<Text color="secondary" size="24" fontSize="14">
{props.title}
</Text>
)
)}