UNPKG

@antdp/edit-table

Version:

基于antd封装的组件

246 lines (237 loc) 6.96 kB
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose"; var _excluded = ["columns", "dataSource", "onBeforeSave", "onSave", "rowKey", "optIsFirst", "optConfig", "isOptDelete", "initValue", "onValuesChange", "isAdd", "onErr", "multiple", "onBeforeAdd", "isOpt", "addBtnProps", "store"]; import React, { useState } from 'react'; import { Table, Button, message } from 'antd'; import { useStore } from './Store'; export { default as Store } from "./Store"; import Tr, { EditForms } from './Tr'; import Td, { EditableCellItem } from './Td'; import Operation from './Operation'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; var EditableTable = (props, ref) => { var { columns, dataSource = [], onBeforeSave, onSave, rowKey = 'id', optIsFirst = false, optConfig = {}, isOptDelete = false, initValue = {}, onValuesChange, isAdd, onErr, multiple = false, onBeforeAdd, isOpt = true, addBtnProps = {}, store } = props, rest = _objectWithoutPropertiesLoose(props, _excluded); var [formsRef] = useStore(store); var [editingKey, setEditingKey] = useState([]); var [newAdd, setNewAdd] = React.useState([]); /** editingKey 和 newAdd 移出 id */ var removeKey = id => { setEditingKey(arr => arr.filter(k => "" + k !== "" + id)); setNewAdd(arr => arr.filter(k => "" + k !== "" + id)); }; /** 获取行 所有编辑字段 */ var fields = React.useMemo(() => { return columns.filter(item => { return item.editable; }).map(item => item.dataIndex); }, [columns]); /** 重置 某个表单 */ var restForm = function restForm(key, obj) { if (obj === void 0) { obj = {}; } var stores = formsRef.getStore(); if (stores["" + key]) { stores["" + key].setFieldsValue(obj); } }; /** 获取某个表单 */ var getForm = id => { var stores = formsRef.getStore(); return stores["" + id]; }; /** 判断是否编辑 */ var isEditing = record => editingKey.includes("" + record[rowKey]); /** 判断是否是新增的 */ var isAddEdit = record => newAdd.includes("" + record[rowKey]); /** 新增 */ var add = () => { // 新增之前的调用方法 if (onBeforeAdd && !onBeforeAdd()) { return; } if (newAdd.length === 1 && !multiple) { message.warning('只能新增一行'); return; } if (editingKey.length === 1 && !multiple) { message.warning('只能编辑一行'); return; } var id = (new Date().getTime() * Math.round(10)).toString(); var newItem = _extends({}, initValue || {}, { [rowKey]: id }); var list = dataSource.concat([newItem]); setEditingKey(arr => arr.concat([id])); setNewAdd(arr => arr.concat([id])); onSave && onSave(list, newItem); }; /** 编辑 */ var edit = record => { var obj = _extends({}, record); restForm(record[rowKey], obj); setEditingKey(arr => arr.concat(["" + record[rowKey]])); }; /** 取消编辑 */ var cancel = id => { removeKey(id); restForm(id, {}); }; /** 删除行 */ var onDelete = (id, rowItem, index) => { var list = dataSource.filter(item => "" + item[rowKey] !== "" + id); removeKey(id); onSave && onSave(list, rowItem, rowItem, index); }; /** 保存 */ var save = /*#__PURE__*/function () { var _ref = _asyncToGenerator(function* (key, record, indx) { try { var row = yield getForm(key).validateFields(); if (onBeforeSave && !onBeforeSave(row, record, indx)) { return; } var newData = [...dataSource]; var index = newData.findIndex(item => "" + key === "" + item[rowKey]); if (index > -1) { var item = newData[index]; newData.splice(index, 1, _extends({}, item, row)); } else { newData.push(row); } onSave && onSave(newData, row, record, indx); removeKey(key); getForm(key).resetFields(fields); } catch (errInfo) { onErr && onErr(errInfo); } }); return function save(_x, _x2, _x3) { return _ref.apply(this, arguments); }; }(); /** 操作列配置 */ var operation = isOpt && Operation({ optConfig, isEditing, isAddEdit, save, isOptDelete, cancel, onDelete, edit, newAdd, editingKey, rowKey, multiple }) || []; var optColumns = optIsFirst ? operation.concat(columns) : columns.concat(operation); var mergedColumns = optColumns.map(col => { if (!col.editable) { return col; } return _extends({}, col, { onCell: record => ({ record, multiple, rowKey, dataIndex: col.dataIndex, title: col.title, editing: isEditing(record), inputNode: col.inputNode, rules: col.rules || [], itemAttr: col.itemAttr, type: col.type, attr: col.attr, tip: col.tip, tipAttr: col.tipAttr, isList: col.isList, listAttr: col.listAttr }) }); }); // 表单值更新 表单更新值适用单个 不使用多个 var onChange = (id, form, value, allValue) => { if (onValuesChange) { var list = dataSource.map(item => { if ("" + id === "" + item[rowKey]) { return _extends({}, item, allValue); } return _extends({}, item); }); onValuesChange(list, value, allValue, id, form); } }; React.useImperativeHandle(ref, () => ({ save, onDelete, edit, cancel, add, isEditing, editingKey, newAdd, forms: formsRef })); return /*#__PURE__*/_jsx(React.Fragment, { children: /*#__PURE__*/_jsxs(EditForms.Provider, { value: { formsRef, onValuesChange: onChange, dataSource, rowKey }, children: [/*#__PURE__*/_jsx(Table, _extends({ size: "small", bordered: true }, rest, { components: { body: { row: Tr, cell: Td } }, rowKey: rowKey, dataSource: dataSource, columns: mergedColumns, rowClassName: "editable-row", pagination: false })), isAdd && /*#__PURE__*/_jsx(Button, _extends({ type: "dashed", block: true, children: "\u6DFB\u52A0\u4E00\u884C\u6570\u636E" }, addBtnProps || {}, { style: _extends({ marginTop: 10 }, (addBtnProps || {}).style || {}), onClick: add }))] }) }); }; var InitEditTable = /*#__PURE__*/React.forwardRef(EditableTable); var EditorTable = InitEditTable; EditorTable.useStore = useStore; EditorTable.Item = EditableCellItem; export default EditorTable;