import { Space, TreeSelect } from 'antd'; import type { TreeSelectProps } from 'antd'; import Level from '../CustomTree/Level'; import { useOptionLevel, useRelation } from '../CustomTree/hooks'; import { memo, useEffect, useMemo, useRef } from 'react'; import { useIntl } from 'umi'; import { findFromTree, formatPostData } from '../utils'; interface CustomTreeSelectProps extends TreeSelectProps { width?: string | number; isHaveLevel?: boolean; } const CustomTreeSelect = (props: CustomTreeSelectProps) => { const { formatMessage } = useIntl(); const checkedValue = useRef([]); const { width, isHaveLevel = false, treeData, onChange, fieldNames, ...otherProps } = props; const key = fieldNames?.value || 'value'; const { expandedKeys, setDefaultExpandAll, onExpand, defaultExpandAll } = useOptionLevel({ treeData, key, }); const { checkStrictly, setCheckStrictly, getRemain } = useRelation({ key, id: key, }); const formatTreeDate = useMemo(() => { // @ts-ignore return formatPostData(treeData, (item) => { return { ...item, // children: item.children, }; }); }, [treeData]); useEffect(() => { if (checkedValue?.current?.join() !== props.value?.join()) { setCheckStrictly(false); } }, [props.value]); return ( { const remain = getRemain( { checked: val?.map((item) => item.value) }, { checked: extra.checked, node: findFromTree(formatTreeDate, { [key]: extra.triggerValue }), }, ); checkedValue.current = remain; // @ts-ignore onChange?.(remain); }} treeDefaultExpandAll={true} dropdownRender={(menu) => { return ( <> {isHaveLevel ? ( setDefaultExpandAll(!defaultExpandAll)}> {defaultExpandAll ? formatMessage({ id: 'component.CustomTreeSelect.ExpandAll.true' }) : formatMessage({ id: 'component.CustomTreeSelect.ExpandAll.false' })} ) : null} {menu} ); }} treeData={treeData} fieldNames={fieldNames} {...otherProps} /> ); }; export default memo(CustomTreeSelect);