/* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-return */ import * as React from 'react'; import { Input, Icon, Checkbox } from 'cn-next'; import './style/index.scss'; import { Obj, ICnColumn } from 'src/type'; import { useControlValue } from './hooks'; import { debounce, isDef, isFunction, isString } from './util'; interface Iitem extends Obj { label?: string; value?: string; [labelKey: string]: any; children: Iitem[]; } export interface IListFilter { list: Iitem[]; value: string[]; defaultValue: string[]; onChange: (value: string[]) => void; openKeys: string[]; defaultOpenKeys: string[]; onChangeOpenKeys: (value: string[]) => void; labelKey?: string; valueKey?: string; className?: string; searchClassName?: string; style?: React.CSSProperties; searchStyle?: React.CSSProperties; searchTransform?: (str: string) => string; column: ICnColumn; } export default function ListFilter(props: IListFilter) { const { list, labelKey, valueKey, className, style, searchStyle, searchTransform, column, } = props; const [search, setSearch] = React.useState(''); const onChangeSearch = debounce( (val: string) => { setSearch(val); }, 500, false, ); const allValue = React.useMemo(() => getAllValue(list, valueKey), [list]); const filterList = React.useMemo( () => getFilterList( list, isFunction(searchTransform) ? searchTransform(search) : search, labelKey, ), [list, search, labelKey], ); // console.log(allValue, 'allValue'); const [value, setValue] = useControlValue(props as unknown as Obj, { defaultValuePropName: 'defaultValue', valuePropName: 'value', changePropName: 'onChange', defaultValue: [], }); // console.log(value, 'value'); const filterValue = React.useMemo(() => { return ( filterList?.filter((item) => { return value.includes(item.id); }) || [] ); }, [filterList, value]); const [openKeys, setOpenKeys] = useControlValue(props as unknown as Obj, { defaultValuePropName: 'defaultOpenKeys', valuePropName: 'openKeys', changePropName: 'onChangeOpenKeys', defaultValue: [], }); const valueMap = React.useMemo((): any => { return Array.isArray(value) ? value.reduce( (ret, next) => ({ ...ret, [next]: true, }), {}, ) : {}; }, [value]); const openKeysMap = React.useMemo((): any => { return Array.isArray(openKeys) ? openKeys.reduce( (ret, next) => ({ ...ret, [next]: true, }), {}, ) : {}; }, [openKeys]); const onChange = (changeValue: string, checked: boolean) => { const ret = Array.isArray(value) ? [...value] : []; if (checked && !valueMap[changeValue]) { ret.push(changeValue); setValue(ret); } else if (!checked && valueMap[changeValue]) { const valueSet = new Set(ret); valueSet.delete(changeValue); setValue(Array.from(valueSet)); } }; const onChangeOpenKeys = (changeOpenKey: string, isOpen: boolean) => { const ret = Array.isArray(openKeys) ? [...openKeys] : []; if (isOpen && !openKeysMap[changeOpenKey]) { ret.push(changeOpenKey); setOpenKeys(ret); } else if (!isOpen && openKeysMap[changeOpenKey]) { const valueSet = new Set(ret); valueSet.delete(changeOpenKey); setOpenKeys(Array.from(valueSet)); } }; const onCheckAll = (checked: boolean) => { setValue(checked ? [...allValue] : []); }; const onCheckAllFilterValue = (checked: boolean) => { const filterValueList = filterList?.map((item) => item.id); if (checked) { setValue([...value, ...filterValueList]); } else { setValue(allValue.filter((item) => filterList.includes(item))); } }; // @ts-ignore function renderList(list: Iitem[], level: number = 1) { return Array.isArray(list) ? list.map( ( item: Iitem = { children: [], }, index = 1, ) => ( <>