/* eslint-disable react/display-name */ import React, { useState } from 'react'; import { Table, Input, InputNumber, Popconfirm, Form, Typography, Button, message, Select } from 'knowdesign'; import { IconFont } from '@knowdesign/icons'; import './style/edit-table.less'; import { CheckOutlined, CloseOutlined, PlusSquareOutlined } from '@ant-design/icons'; const EditableCell = ({ editing, dataIndex, title, inputType, placeholder, record, index, children, options, ...restProps }: any) => { const inputNode = inputType === 'number' ? ( ) : inputType === 'select' ? ( ); return ( {editing ? ( {inputNode} ) : ( children )} ); }; const EditTable = React.forwardRef((props: any, ref: any) => { const { colCustomConfigs } = props; const [form] = Form.useForm(); const [data, setData] = useState([]); const [editingKey, setEditingKey] = useState(0); const isEditing = (record: any) => record.editKey === editingKey; const getTableData = () => { return data; }; const resetTable = () => { setData([]); }; React.useImperativeHandle(ref, () => ({ getTableData, resetTable, })); const edit = (record: any) => { form.setFieldsValue({ key: '', value: '', ...record, }); setEditingKey(record.editKey); }; const deleteRow = (record: any) => { const _data = data.filter((item) => item.editKey !== record.editKey); setData(_data); }; const cancel = (record: any) => { if (record.key === '') { const _data = data.filter((item) => item.editKey !== record.editKey); setData(_data); } setEditingKey(0); }; const add = () => { if (editingKey !== 0) { message.error('请先保存当前编辑项'); return; } form.resetFields(); const editKey = data.length ? data[data.length - 1].editKey + 1 : 1; setData([...data, { key: '', value: '', editKey }]); setEditingKey(editKey); }; const save = async (editKey: number) => { try { const row = await form.validateFields(); const newData = [...data]; const index = newData.findIndex((item) => editKey === item.editKey); if (index > -1) { const item = newData[index]; newData.splice(index, 1, { ...item, ...row }); setData(newData); setEditingKey(0); } else { newData.push(row); setData(newData); setEditingKey(0); } } catch (errInfo) { console.log('Validate Failed:', errInfo); } }; const columns = [ { title: 'key', dataIndex: 'key', width: 40, editable: true, }, { title: 'value', dataIndex: 'value', width: 40, editable: true, }, { title: '', dataIndex: 'operation', width: 20, className: 'no-padding', render: (text: any, record: any) => { const editable = isEditing(record); return editable ? ( save(record.editKey)} style={{ marginRight: 8, }} > {/* cancel(record)}> */} cancel(record)} /> {/* */} ) : ( <> edit(record)} > deleteRow(record)}> ); }, }, ]; const mergedColumns = columns.map((col, index) => { if (!col.editable) { return col; } return { ...col, onCell: (record: any) => Object.assign( { record, inputType: 'text', dataIndex: col.dataIndex, title: col.title, editing: isEditing(record), }, colCustomConfigs?.[index] ), title: colCustomConfigs?.[index]?.title || col.title, }; }); return (
); }); export default EditTable;