From 544148eddae96db824423cd059ebecb9d13c392e Mon Sep 17 00:00:00 2001 From: xusd <330628789@qq.com> Date: Thu, 19 Jun 2025 20:52:50 +0800 Subject: [PATCH] fix:市平台项目更新 --- src/components/SelectObjModal/selectJudge.jsx | 332 ++++++++++++++++++++++++++++-------------------------- 1 files changed, 173 insertions(+), 159 deletions(-) diff --git a/src/components/SelectObjModal/selectJudge.jsx b/src/components/SelectObjModal/selectJudge.jsx index 6f05a89..50b2db3 100644 --- a/src/components/SelectObjModal/selectJudge.jsx +++ b/src/components/SelectObjModal/selectJudge.jsx @@ -10,7 +10,7 @@ // 获取法官数据 function getDataApi(searchData) { - return $$.ax.request({ url: 'ctUserole/listJudge', type: 'get', data: searchData, service: 'cust' }); + return $$.ax.request({ url: 'ctUserole/listJudge', type: 'get', data: searchData, service: 'cust' }); } /** @@ -22,94 +22,99 @@ * onOk, // 点击确定的回调 */ const SelectObjModal = ({ visible = false, courtId, checkKeys = [], nameStr, isCheckbox = false, searchData = {}, onClose, onOk }) => { - const [data, setData] = useState([]); + const [data, setData] = useState([]); - const [checkedKeys, setCheckedKeys] = useState({ keys: [], items: [] }); + const [checkedKeys, setCheckedKeys] = useState({ keys: [], items: [] }); - const [expandedKeys, setExpandedKeys] = useState([]); + const [expandedKeys, setExpandedKeys] = useState([]); - const [searchValue, setSearchValue] = useState(''); + const [searchValue, setSearchValue] = useState(''); - const [autoExpandParent, setAutoExpandParent] = useState(true); + const [autoExpandParent, setAutoExpandParent] = useState(true); - const [dataList, setDataList] = useState([]); + const [dataList, setDataList] = useState([]); - // tree复选框选择 - function handleCheck(checkedKeys, e) { - if (!isCheckbox && checkedKeys.checked.length > 1) { - $$.info({ type: 'warning', content: '当前选择只可单选' }); - return; - } - let checkedNodes = e.checkedNodes; - checkedNodes.forEach((x) => delete x.children); - setCheckedKeys({ keys: checkedKeys.checked, items: checkedNodes }); - } + // tree复选框选择 + function handleCheck(checkedKeys, e) { + if (!isCheckbox && checkedKeys.checked.length > 1) { + $$.info({ type: 'warning', content: '当前选择只可单选' }); + return; + } + let checkedNodes = e.checkedNodes; + checkedNodes.forEach((x) => delete x.children); + setCheckedKeys({ keys: checkedKeys.checked, items: checkedNodes }); + } - // 删除选项 - function handleDelete(t) { - checkedKeys.keys.splice(t, 1); - checkedKeys.items.splice(t, 1); - setCheckedKeys({ ...checkedKeys }); - } + // 删除选项 + function handleDelete(t) { + checkedKeys.keys.splice(t, 1); + checkedKeys.items.splice(t, 1); + setCheckedKeys({ ...checkedKeys }); + } - // 搜索 - useEffect(() => { - if (!visible) return; - const arr = []; - const generateList = (data) => { - for (let i = 0; i < data.length; i++) { - const node = data[i]; - const { value, label } = node; - arr.push({ value, label }); - if (node.children) { - generateList(node.children); - } - } - }; - generateList(data); - setDataList(arr); - handleSearch('', arr); - }, [data]); - + // 搜索 + useEffect(() => { + if (!visible) return; + const arr = []; + const generateList = (data) => { + for (let i = 0; i < data.length; i++) { + const node = data[i]; + const { value, label } = node; + arr.push({ value, label }); + if (node.children) { + generateList(node.children); + } + } + }; + generateList(data); + setDataList(arr); + handleSearch('', arr); + }, [data]); - const getParentKey = (key, tree) => { - let parentKey; - for (let i = 0; i < tree.length; i++) { - const node = tree[i]; - if (node.children) { - if (node.children.some((item) => item.value === key)) { - parentKey = node.value; - } else if (getParentKey(key, node.children)) { - parentKey = getParentKey(key, node.children); - } - } - } - return parentKey; - }; + const getParentKey = (key, tree) => { + let parentKey; + for (let i = 0; i < tree.length; i++) { + const node = tree[i]; + if (node.children) { + if (node.children.some((item) => item.value === key)) { + parentKey = node.value; + } else if (getParentKey(key, node.children)) { + parentKey = getParentKey(key, node.children); + } + } + } + return parentKey; + }; - function handleSearch(value, dataList) { + function handleSearch(value, dataList) { + console.log('value, dataList', value, dataList); + const newExpandedKeys = dataList + .map((item) => { + if (item.label.indexOf(value) > -1) { + return getParentKey(item.value, data); + } + return null; + }) + .filter((item, i, self) => item && self.indexOf(item) === i); - console.log('value, dataList', value, dataList); - const newExpandedKeys = dataList - .map((item) => { - if (item.label.indexOf(value) > -1) { - return getParentKey(item.value, data); - } - return null; - }) - .filter((item, i, self) => item && self.indexOf(item) === i); - - console.log('newExpandedKeys', newExpandedKeys); - setExpandedKeys(newExpandedKeys); - setSearchValue(value); - setAutoExpandParent(true); - } + console.log('newExpandedKeys', newExpandedKeys); + setExpandedKeys(newExpandedKeys); + setSearchValue(value); + setAutoExpandParent(true); + } const treeData = useMemo(() => { - const loop = (data) => - data.map((item) => { + const loop = (data) => { + const copiedData = JSON.parse(JSON.stringify(data)); + return copiedData.map((item, idx) => { const strTitle = item.label; const index = strTitle.indexOf(searchValue); + + // 只保留包含 searchValue 的项 + if (index <= -1 && !item.children) { + return null; // 返回 null 表示不包含在最终结果中 + } + const beforeStr = strTitle.substring(0, index); const afterStr = strTitle.slice(index + searchValue.length); const label = @@ -122,113 +127,122 @@ ) : ( <span>{strTitle}</span> ); + if (item.children) { + const filteredChildren = loop(item.children).filter(Boolean); // 递归处理子项并过滤掉 null return { label, name: strTitle, value: item.value, checkable: item.checkable, - children: loop(item.children), + children: filteredChildren.length > 0 ? filteredChildren : undefined, }; } + return { label, name: strTitle, checkable: item.checkable, value: item.value, }; - }); - // data = data.filter(i => i.label?.indexOf(searchValue) > -1); - // console.log('data.filter',data.filter(i => i.label?.indexOf(searchValue) > -1)); - console.log('loop(data)', loop(data)); + }).filter(Boolean); // 过滤掉 null + }; return loop(data); - }, [searchValue, data]); + useEffect(() => { + if (!visible) return; + // 获取数据 + async function getData() { + global.setSpinning(true); + const res = await getDataApi({ courtId }); + global.setSpinning(false); + if (res.type) { + setData(res.data || []); + } + } + if (checkKeys.length !== 0) { + let keys = []; + checkKeys.forEach((x) => keys.push(x.value)); + setCheckedKeys({ keys, items: checkKeys }); + } else { + setCheckedKeys({ keys: [], items: [] }); + } + getData(); + }, [visible]); - useEffect(() => { - if (!visible) return; - // 获取数据 - async function getData() { - global.setSpinning(true); - const res = await getDataApi({ courtId }); - global.setSpinning(false); - if (res.type) { - setData(res.data || []); - } - } - if (checkKeys.length !== 0) { - let keys = []; - checkKeys.forEach((x) => keys.push(x.value)); - setCheckedKeys({ keys, items: checkKeys }); - } else { - setCheckedKeys({ keys: [], items: [] }); - } - getData(); - }, [visible]); - - return ( - <MyModal visible={!!visible} title={`选择${nameStr}`} width={560} footer={false} onCancel={onClose}> - <div className="selectObjModal-main"> - <div className="selectObjModal-left"> - <div className="selectObjModal-left-search"> - <Search placeholder={`查询${nameStr}名称`} onChange={(e) => handleSearch(e.target.value, dataList)} /> - </div> - <div className="selectObjModal-left-main"> - {data.length > 0 ? ( - <Tree - checkable - checkStrictly - defaultExpandAll - onExpand={(newExpandedKeys) => { - setExpandedKeys(newExpandedKeys); - setAutoExpandParent(false); - }} - expandedKeys={expandedKeys} - autoExpandParent={autoExpandParent} - selectable={false} - onCheck={(checkedKeys, e) => handleCheck(checkedKeys, e)} - checkedKeys={checkedKeys.keys} - treeData={treeData} - fieldNames={{ title: 'label', key: 'value' }} - /> - ) : ( - $$.MyEmpty() - )} - </div> - </div> - <div className="selectObjModal-right"> - {checkedKeys.items.map((x, t) => ( - <div className="selectObjModal-right-item" key={x.value}> - <span className="selectObjModal-right-item-name">{x.label}</span> - <CloseOutlined onClick={() => handleDelete(t)} className="selectObjModal-right-item-icon" /> - </div> - ))} - {checkedKeys.items.length === 0 && <div className="selectObjModal-none">{$$.MyEmpty({ description: '尚未选择' + nameStr })}</div>} - </div> - </div> - <div className="selectObjModal-footer"> - <div>已选中:{checkedKeys.keys.length}人</div> - <Space size="middle"> - <Button onClick={onClose}>取消</Button> - <Button type="primary" onClick={() => onOk && onOk(checkedKeys)}> - 确定 - </Button> - </Space> - </div> - </MyModal> - ); + return ( + <MyModal visible={!!visible} title={`选择${nameStr}`} width={560} footer={false} onCancel={onClose}> + <div className="selectObjModal-main"> + <div className="selectObjModal-left"> + <div className="selectObjModal-left-search"> + <Search + placeholder={`查询${nameStr}名称`} + onSearch={(e) => { + // handleSearch('', dataList) + if (!e) { + handleSearch('', dataList); + } else { + handleSearch(e, dataList); + } + }} + /> + </div> + <div className="selectObjModal-left-main"> + {data.length > 0 ? ( + <Tree + checkable + checkStrictly + defaultExpandAll + onExpand={(newExpandedKeys) => { + setExpandedKeys(newExpandedKeys); + setAutoExpandParent(false); + }} + expandedKeys={expandedKeys} + autoExpandParent={autoExpandParent} + selectable={false} + onCheck={(checkedKeys, e) => handleCheck(checkedKeys, e)} + checkedKeys={checkedKeys.keys} + treeData={treeData} + fieldNames={{ title: 'label', key: 'value' }} + /> + ) : ( + $$.MyEmpty() + )} + </div> + </div> + <div className="selectObjModal-right"> + {checkedKeys.items.map((x, t) => ( + <div className="selectObjModal-right-item" key={x.value}> + <span className="selectObjModal-right-item-name">{x.label}</span> + <CloseOutlined onClick={() => handleDelete(t)} className="selectObjModal-right-item-icon" /> + </div> + ))} + {checkedKeys.items.length === 0 && <div className="selectObjModal-none">{$$.MyEmpty({ description: '尚未选择' + nameStr })}</div>} + </div> + </div> + <div className="selectObjModal-footer"> + <div>已选中:{checkedKeys.keys.length}人</div> + <Space size="middle"> + <Button onClick={onClose}>取消</Button> + <Button type="primary" onClick={() => onOk && onOk(checkedKeys)}> + 确定 + </Button> + </Space> + </div> + </MyModal> + ); }; SelectObjModal.propTypes = { - visible: PropTypes.any, - checkKeys: PropTypes.array, - type: PropTypes.string, - isCheckbox: PropTypes.bool, - searchData: PropTypes.object, - onClose: PropTypes.func, - onOk: PropTypes.func, + visible: PropTypes.any, + checkKeys: PropTypes.array, + type: PropTypes.string, + isCheckbox: PropTypes.bool, + searchData: PropTypes.object, + onClose: PropTypes.func, + onOk: PropTypes.func, }; export default SelectObjModal; -- Gitblit v1.8.0