import { Button, message } from 'antd' import LeftMenu from './Components/LeftMenu' import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc' import { arrayMoveImmutable } from 'array-move' import type { ColumnsType } from 'antd/lib/table' import type { SortableContainerProps, SortEnd } from 'react-sortable-hoc' import { useRef, useState } from 'react' import { useRequest } from 'umi' import type { ProFormInstance } from '@ant-design/pro-form' import { addDataSourceItem, queryDataSource, updateDataSourceItem } from '@/services/api/schema' import { MenuOutlined, PlusOutlined } from '@ant-design/icons' import classNames from 'classnames' import { ModalForm, ProFormRadio, ProFormText } from '@ant-design/pro-form' import ProTable from '@ant-design/pro-table' import { ModalType } from '@/utils/enum' enum OptionModalType { ADD, UPDATE } const DragHandle = SortableHandle(() => ) const SortableItem = SortableElement((props: React.HTMLAttributes) => ( )) const SortableBody = SortableContainer((props: React.HTMLAttributes) => ( )) type iState = { menuData: API.DataSourceMenuItem[] activeID: Nullable current: API.DataSourceItem[] modalType: ModalType menuDataItems: API.DataSourceItem[] items: API.DataSourceItem[] } const Option = () => { const formRef = useRef(null) const [state, setState] = useState({ menuData: [], activeID: null, modalVisible: false, modalType: OptionModalType.ADD, menuDataItems: [], items: [], current: { ID: null, name: null, enable: true } }) console.log(state.menuDataItems) const { run: tryFetchList } = useRequest(queryDataSource, { onSuccess: (result: API.DataSourceMenuItem) => { setState({ ...state, menuData: result }) } }) const { run: tryAddDataSourceItem } = useRequest( (params: API.DataSourceItem) => addDataSourceItem(params), { manual: true, onSuccess: async () => { await tryFetchList() } } ) const { run: tryUpdateDataSourceItem } = useRequest( (params: API.DataSourceItem) => updateDataSourceItem(params), { manual: true, onSuccess: async () => { await tryFetchList() } } ) const onSelect = (key: string, node) => { setState({ ...state, activeID: key, menuDataItems: node.node.items }) } const columns: ColumnsType = [ { title: '排序', dataIndex: 'sort', width: 50, render: () => }, { title: '序号', dataIndex: 'num', width: 50, render: (num, record, index) => `${index + 1}` }, { title: '选项名称', dataIndex: 'name' }, { title: '状态', dataIndex: 'enable', render: text => (
{text ? '已启用' : '已停用'}
) }, { title: '操作', dataIndex: 'opreate', render: (_, record) => (
{ setTimeout(() => { formRef.current?.setFieldsValue({ ...record }) }, 80) setState({ ...state, modalType: ModalType.UPDATE, modalVisible: true, current: { ID: record.ID, name: record.name, enable: record.enable } }) }}> 编辑
) } ] const onSortEnd = ({ oldIndex, newIndex }: SortEnd) => { if (oldIndex !== newIndex) { const newData = arrayMoveImmutable(dataSource.slice(), oldIndex, newIndex).filter( (el: DataType) => !!el ) const newMenuData = menuData.map(item => { const newItem = { ...item } if (item.ID === state.activeID) { newItem.items = newData return newItem } return item }) setState({ ...state, menuData: newMenuData }) } } const DraggableContainer = (props: SortableContainerProps) => ( ) const DraggableBodyRow = ({ className, style, ...restProps }) => { const index = state.menuData .find(item => item.ID === state.activeID) ?.items.findIndex(x => x.index === restProps['data-row-key']) return } return (
tryFetchList()} />
columns={columns} search={false} dataSource={state.menuData.find(item => item.ID === state.activeID)?.items || []} rowKey="ID" toolbar={{ actions: [ ] }} components={{ body: { wrapper: DraggableContainer, row: DraggableBodyRow } }} /> { setState({ ...state, modalVisible: visible }) setTimeout(() => { if (!visible) formRef.current?.resetFields() }, 80) }} initialValues={{ enable: true }} onFinish={async values => { try { if (state.modalType === OptionModalType.ADD) { await tryAddDataSourceItem({ ...values, dataSourceID: state.activeID }) setState({ ...state, menuDataItems: state.menuData.find(i => i.ID === state.activeID)?.items }) } else { const newItemData = state.menuDataItems.map(item => { if (item.ID === state.current.ID) { const newItem = { ...values } return newItem } return item }) setState({ ...state, items: newItemData }) await tryUpdateDataSourceItem({ ID: state.activeID, items: newItemData }) } message.success(`${state.modalType === OptionModalType.ADD ? '新增' : '编辑'}成功`) return true } catch (error) { message.error(error) return false } }}>
) } export default Option