(dropdownVisibleInitValue);
useEffect(() => {
if (typeof filterDropdownVisible !== 'undefined') {
setDropdownVisible(filterDropdownVisible);
}
}, [filterDropdownVisible]);
useEffect(() => {
setTempFilteredValue(filteredValue);
}, [filteredValue]);
const confirm: RenderFilterDropdownProps['confirm'] = (props = {}) => {
const newFilteredValue = props?.filteredValue || tempFilteredValue;
if (!isEqual(newFilteredValue, filteredValue)) {
onSelect({ filteredValue: newFilteredValue });
}
if (props.closeDropdown) {
setDropdownVisible(false);
}
};
const clear: RenderFilterDropdownProps['clear'] = (props: { closeDropdown?: boolean } = {}) => {
setTempFilteredValue([]);
onSelect({ filteredValue: [] });
if (props.closeDropdown) {
setDropdownVisible(false);
}
};
const close: RenderFilterDropdownProps['close'] = () => {
setDropdownVisible(false);
};
const handleFilterDropdownVisibleChange = (visible: boolean) => {
if (isCustomDropdownVisible) {
setDropdownVisible(visible);
}
onFilterDropdownVisibleChange(visible);
};
const renderFilterDropdownProps: RenderFilterDropdownProps = {
tempFilteredValue,
setTempFilteredValue,
confirm,
clear,
close
};
const finalCls = cls(`${prefixCls}-column-filter`, {
on: Array.isArray(filteredValue) && filteredValue.length,
});
let iconElem;
if (typeof filterIcon === 'function') {
iconElem = filterIcon(Array.isArray(filteredValue) && filteredValue.length > 0);
} else if (isValidElement(filterIcon)) {
iconElem = filterIcon;
} else {
iconElem = (
{'\u200b'/* ZWSP(zero-width space) */}
);
}
const renderProps = {
...props,
...filterDropdownProps,
...renderFilterDropdownProps,
filterDropdownVisible: isFilterDropdownVisibleControlled ? filterDropdownVisible : dropdownVisible,
onFilterDropdownVisibleChange: handleFilterDropdownVisibleChange,
};
filterDropdown = React.isValidElement(filterDropdown) ?
filterDropdown :
renderDropdown(renderProps, iconElem);
return filterDropdown;
}
export interface ColumnFilterProps extends Omit {
prefixCls?: string;
filteredValue?: any[];
filterIcon?: FilterIcon;
filterDropdown?: React.ReactElement;
filterDropdownProps?: FilterDropdownProps;
filters?: Filter[]
}
export interface RenderDropdownProps extends FilterDropdownProps, RenderFilterDropdownProps {
filterMultiple?: boolean;
filters?: Filter[];
filteredValue?: any[];
filterDropdownVisible?: boolean;
onSelect?: (data: OnSelectData) => void;
onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
renderFilterDropdown?: (props?: RenderFilterDropdownProps) => React.ReactNode;
renderFilterDropdownItem?: RenderFilterDropdownItem
}
export interface FilterDropdownProps extends Omit {}
export interface OnSelectData {
value?: any;
/** only this value is used now */
filteredValue: any;
included?: boolean;
domEvent?: React.MouseEvent
}
export interface RenderFilterDropdownProps {
/** temporary filteredValue */
tempFilteredValue: any[];
/** set temporary filteredValue */
setTempFilteredValue: (tempFilteredValue: any[]) => void;
/** set tempFilteredValue to filteredValue. You can also pass filteredValue to directly set the filteredValue */
confirm: (props?: { closeDropdown?: boolean; filteredValue?: any[] }) => void;
/** clear tempFilteredValue and filteredValue */
clear: (props?: { closeDropdown?: boolean }) => void;
/** close dropdown */
close: () => void;
/** column filters */
filters?: RenderDropdownProps['filters']
}