import { DeleteOutlined, FormOutlined, PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons' import { ModalForm, ProFormText } from '@ant-design/pro-form' import { useRequest } from '@umijs/max' import type { ProFormInstance } from '@ant-design/pro-form' import { Button, Input, message, Popconfirm, Tree } from 'antd' import type { DirectoryTreeProps } from 'antd/lib/tree' import { addDataSource, delDataSourceID, updateDataSourceItem } from '@/services/api/schema' import { useRef, useState } from 'react' import '@/pages/Permission/FrontRole/components/RoleLeftMenu/index.less' const { DirectoryTree } = Tree type LeftMenuProps = { onSelect: (key: string) => void defaultActiveID: string options: API.DataSourceMenuItem[] initFn: () => Promise } const LeftMenu: React.FC = ({ onSelect, defaultActiveID, options, showDelIcon, initFn }) => { const [activeID, setActiveID] = useState>(null) const formRef = useRef(null) const handleOnSelect: DirectoryTreeProps['onSelect'] = (keys, node) => { // console.log('Trigger Select', node) onSelect?.(keys[0], node) } const { run: tryUpdateDataSourceItem } = useRequest( (params: Partial) => updateDataSourceItem(params), { manual: true, onSuccess: () => { message.success('修改成功') initFn() } } ) const { run: tryAddDataSource } = useRequest((params: API.CreateRoleParams) => addDataSource(params), { manual: true, onSuccess: () => { initFn() } }) const { run: tryDelRole } = useRequest((ID: string) => delDataSourceID({ ID }), { manual: true, onSuccess: () => { message.success('删除成功') initFn() } }) const handleOnFocus = async ( e: React.FocusEvent | React.KeyboardEvent, oldTitle: string, ID: string ) => { const val = e.currentTarget.value || e.currentTarget.nodeValue if (val !== oldTitle) { await tryUpdateDataSourceItem({ ID, name: val }) } setActiveID(null) } const renderTreeNode = tree => { return tree.map((item: API.DataSourceMenuItem & { title: string; key: string }) => { const newItem = { ...item, title: (
{item.ID === activeID ? ( handleOnFocus(e, item.name, item.ID)} onPressEnter={e => handleOnFocus(e, item.name, item.ID)} /> ) : (
{item.name}
)}
setActiveID(item.ID)} /> {item.ID === defaultActiveID ? ( tryDelRole(item.ID)} icon={}> { !showDelIcon && message.warning('该数据源已绑定子项,不允许删除') }} /> ) : null}
) } if (newItem.children?.length) { newItem.children = renderTreeNode(newItem.items) } return newItem }) } const virtualHeigh = document.getElementById('role-list')?.clientHeight return (
数据源列表
!visible && formRef.current?.resetFields()} isKeyPressSubmit labelCol={{ span: 5 }} trigger={ } onFinish={async values => { await tryAddDataSource(values) message.success('添加成功') return true }}> {/* */}
{options.length ? ( ({ title: item.name, key: item.ID, ...item })))} height={virtualHeigh - 32} defaultSelectedKeys={[options[0]?.ID]} onSelect={handleOnSelect} showIcon={false} defaultExpandAll /> ) : null}
) } export default LeftMenu