import React, { useCallback, useRef, useState, useEffect } from 'react'; import { Button, message, Modal, Table, Tag, Space, Typography, Tooltip, Input, } from 'antd'; import { EditOutlined, DeleteOutlined, SyncOutlined, CheckCircleOutlined, StopOutlined, } from '@ant-design/icons'; import config from '@/utils/config'; import { PageContainer } from '@ant-design/pro-layout'; import { request } from '@/utils/http'; import EnvModal from './modal'; import EditNameModal from './editNameModal'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import './index.less'; import { getTableScroll } from '@/utils/index'; const { Text } = Typography; const { Search } = Input; enum Status { '已启用', '已禁用', } enum StatusColor { 'success', 'error', } enum OperationName { '启用', '禁用', } enum OperationPath { 'enable', 'disable', } const type = 'DragableBodyRow'; const DragableBodyRow = ({ index, moveRow, className, style, ...restProps }: any) => { const ref = useRef(); const [{ isOver, dropClassName }, drop] = useDrop({ accept: type, collect: (monitor) => { const { index: dragIndex } = (monitor.getItem() as any) || {}; if (dragIndex === index) { return {}; } return { isOver: monitor.isOver(), dropClassName: dragIndex < index ? ' drop-over-downward' : ' drop-over-upward', }; }, drop: (item: any) => { moveRow(item.index, index); }, }); const [, drag] = useDrag({ type, item: { index }, collect: (monitor) => ({ isDragging: monitor.isDragging(), }), }); drop(drag(ref)); return ( ); }; const Env = ({ headerStyle, isPhone, theme }: any) => { const columns: any = [ { title: '序号', align: 'center' as const, width: 50, render: (text: string, record: any, index: number) => { return {index + 1} ; }, }, { title: '名称', dataIndex: 'name', key: 'name', align: 'center' as const, sorter: (a: any, b: any) => a.name.localeCompare(b.name), }, { title: '值', dataIndex: 'value', key: 'value', align: 'center' as const, width: '44%', ellipsis: { showTitle: false, }, render: (text: string, record: any) => { return ( {text} ); }, }, { title: '备注', dataIndex: 'remarks', key: 'remarks', align: 'center' as const, }, { title: '状态', key: 'status', dataIndex: 'status', align: 'center' as const, width: 70, filters: [ { text: '已启用', value: 0, }, { text: '已禁用', value: 1, }, ], onFilter: (value: number, record: any) => record.status === value, render: (text: string, record: any, index: number) => { return ( {Status[record.status]} ); }, }, { title: '操作', key: 'action', width: 100, align: 'center' as const, render: (text: string, record: any, index: number) => { const isPc = !isPhone; return ( editEnv(record, index)}> enabledOrDisabledEnv(record, index)}> {record.status === Status.已禁用 ? ( ) : ( )} deleteEnv(record, index)}> ); }, }, ]; const [value, setValue] = useState([]); const [loading, setLoading] = useState(true); const [isModalVisible, setIsModalVisible] = useState(false); const [isEditNameModalVisible, setIsEditNameModalVisible] = useState(false); const [editedEnv, setEditedEnv] = useState(); const [selectedRowIds, setSelectedRowIds] = useState([]); const [searchText, setSearchText] = useState(''); const [tableScrollHeight, setTableScrollHeight] = useState(); const getEnvs = () => { setLoading(true); request .get(`${config.apiPrefix}envs?searchValue=${searchText}`) .then((data: any) => { setValue(data.data); }) .finally(() => setLoading(false)); }; const enabledOrDisabledEnv = (record: any, index: number) => { Modal.confirm({ title: `确认${record.status === Status.已禁用 ? '启用' : '禁用'}`, content: ( <> 确认{record.status === Status.已禁用 ? '启用' : '禁用'} Env{' '} {record.value} {' '} 吗 ), onOk() { request .put( `${config.apiPrefix}envs/${ record.status === Status.已禁用 ? 'enable' : 'disable' }`, { data: [record._id], }, ) .then((data: any) => { if (data.code === 200) { message.success( `${record.status === Status.已禁用 ? '启用' : '禁用'}成功`, ); const newStatus = record.status === Status.已禁用 ? Status.已启用 : Status.已禁用; const result = [...value]; result.splice(index, 1, { ...record, status: newStatus, }); setValue(result); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const addEnv = () => { setEditedEnv(null as any); setIsModalVisible(true); }; const editEnv = (record: any, index: number) => { setEditedEnv(record); setIsModalVisible(true); }; const deleteEnv = (record: any, index: number) => { Modal.confirm({ title: '确认删除', content: ( <> 确认删除变量{' '} {record.name}: {record.value} {' '} 吗 ), onOk() { request .delete(`${config.apiPrefix}envs`, { data: [record._id] }) .then((data: any) => { if (data.code === 200) { message.success('删除成功'); const result = [...value]; result.splice(index, 1); setValue(result); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const handleCancel = (env?: any[]) => { setIsModalVisible(false); env && handleEnv(env); }; const handleEditNameCancel = (env?: any[]) => { setIsEditNameModalVisible(false); getEnvs(); }; const handleEnv = (env: any) => { const result = [...value]; const index = value.findIndex((x) => x._id === env._id); if (index === -1) { env = Array.isArray(env) ? env : [env]; result.push(...env); } else { result.splice(index, 1, { ...env, }); } setValue(result); }; const components = { body: { row: DragableBodyRow, }, }; const moveRow = useCallback( (dragIndex, hoverIndex) => { if (dragIndex === hoverIndex) { return; } const dragRow = value[dragIndex]; request .put(`${config.apiPrefix}envs/${dragRow._id}/move`, { data: { fromIndex: dragIndex, toIndex: hoverIndex }, }) .then((data: any) => { if (data.code === 200) { const newData = [...value]; newData.splice(dragIndex, 1); newData.splice(hoverIndex, 0, { ...dragRow, ...data.data }); setValue([...newData]); } else { message.error(data); } }); }, [value], ); const onSelectChange = (selectedIds: any[]) => { setSelectedRowIds(selectedIds); setTimeout(() => { if (selectedRowIds.length === 0 || selectedIds.length === 0) { const offset = isPhone ? 40 : 0; setTableScrollHeight(getTableScroll({ extraHeight: 127 }) - offset); } }); }; const rowSelection = { selectedRowIds, onChange: onSelectChange, }; const delEnvs = () => { Modal.confirm({ title: '确认删除', content: <>确认删除选中的变量吗, onOk() { request .delete(`${config.apiPrefix}envs`, { data: selectedRowIds }) .then((data: any) => { if (data.code === 200) { message.success('批量删除成功'); setSelectedRowIds([]); getEnvs(); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const operateEnvs = (operationStatus: number) => { Modal.confirm({ title: `确认${OperationName[operationStatus]}`, content: <>确认{OperationName[operationStatus]}选中的变量吗, onOk() { request .put(`${config.apiPrefix}envs/${OperationPath[operationStatus]}`, { data: selectedRowIds, }) .then((data: any) => { if (data.code === 200) { getEnvs(); } else { message.error(data); } }); }, onCancel() { console.log('Cancel'); }, }); }; const modifyName = () => { setIsEditNameModalVisible(true); }; const onSearch = (value: string) => { setSearchText(value.trim()); }; useEffect(() => { getEnvs(); }, [searchText]); useEffect(() => { const offset = isPhone ? 40 : 0; setTableScrollHeight(getTableScroll({ extraHeight: 127 }) - offset); }, []); return ( , , ]} header={{ style: headerStyle, }} > {selectedRowIds.length > 0 && (
已选择 {selectedRowIds?.length}
)} { return { index, moveRow, } as any; }} /> ); }; export default Env;