UNPKG

sula-components

Version:
586 lines (487 loc) 16.4 kB
import React, { useState, useRef, useContext, useEffect } from 'react'; import { Popconfirm, Button, Table, Form, Input } from 'antd'; import { DeleteOutlined } from '@ant-design/icons'; import { omit } from 'lodash'; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var EditableContext = React.createContext({}); var EditableRow = function EditableRow(_ref) { var index = _ref.index, props = _objectWithoutProperties(_ref, ["index"]); var _Form$useForm = Form.useForm(), _Form$useForm2 = _slicedToArray(_Form$useForm, 1), form = _Form$useForm2[0]; return React.createElement(Form, { form: form, component: false }, React.createElement(EditableContext.Provider, { value: form }, React.createElement("tr", Object.assign({}, props)))); }; var EditableCell = function EditableCell(_ref2) { var title = _ref2.title, editable = _ref2.editable, children = _ref2.children, dataIndex = _ref2.dataIndex, record = _ref2.record, handleSave = _ref2.handleSave, isRequired = _ref2.isRequired, restProps = _objectWithoutProperties(_ref2, ["title", "editable", "children", "dataIndex", "record", "handleSave", "isRequired"]); var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), editing = _useState2[0], setEditing = _useState2[1]; var inputRef = useRef(); var form = useContext(EditableContext); var useDidMount = function useDidMount(fn) { return useEffect(function () { return fn && fn(); }, []); }; useDidMount(function () { dataIndex && form.setFieldsValue(_defineProperty({}, dataIndex, record[dataIndex])); }); var save = /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { var values; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return form.validateFields(); case 3: values = _context.sent; handleSave(_objectSpread2(_objectSpread2({}, record), values)); _context.next = 10; break; case 7: _context.prev = 7; _context.t0 = _context["catch"](0); console.log('Save failed:', _context.t0); case 10: case "end": return _context.stop(); } } }, _callee, null, [[0, 7]]); })); return function save() { return _ref3.apply(this, arguments); }; }(); var childNode = children; childNode = editable ? React.createElement(Form.Item, { style: { margin: 0 }, name: dataIndex, rules: [isRequired ? { required: true, message: "".concat(title, " is required.") } : {}] }, React.createElement(Input, { ref: inputRef, onPressEnter: save, onBlur: save })) : React.createElement("div", { className: "editable-cell-value-wrap", style: { paddingRight: 24 } }, children); return React.createElement("td", Object.assign({}, restProps), childNode); }; var EditableTable = /*#__PURE__*/function (_React$Component) { _inherits(EditableTable, _React$Component); var _super = _createSuper(EditableTable); function EditableTable(props) { var _this; _classCallCheck(this, EditableTable); _this = _super.call(this, props); _this.handleDelete = function (key) { var onChange = _this.props.onChange; var dataSource = _toConsumableArray(_this.state.dataSource); var newData = dataSource.filter(function (item) { return item.key !== key; }); _this.setState({ dataSource: newData }); onChange(newData.map(function (item) { return omit(item, ['key']); })); }; _this.handleAdd = function () { var _this$props = _this.props, columns = _this$props.columns, onChange = _this$props.onChange; var _this$state = _this.state, count = _this$state.count, dataSource = _this$state.dataSource; var newData = {}; columns.forEach(function (value, index, array) { newData[value.dataIndex] = ''; }); newData.key = "".concat(count + 1); _this.setState({ dataSource: [].concat(_toConsumableArray(dataSource), [newData]), count: count + 1 }); onChange([].concat(_toConsumableArray(dataSource), [newData]).map(function (item) { return omit(item, ['key']); })); }; _this.handleSave = function (row) { var onChange = _this.props.onChange; var newData = _toConsumableArray(_this.state.dataSource); var index = newData.findIndex(function (item) { return row.key === item.key; }); var item = newData[index]; newData.splice(index, 1, _objectSpread2(_objectSpread2({}, item), row)); _this.setState({ dataSource: newData }); onChange(newData.map(function (item) { return omit(item, ['key']); })); }; _this.columns = !props.disabled ? [].concat(_toConsumableArray(props.columns), [{ title: props.formatMessage && props.formatMessage({ id: 'sula-component.edit-table.action' }) ? props.formatMessage({ id: 'sula-component.edit-table.action' }) : '操作', width: '30', dataIndex: 'operation', render: function render(undefined$1, record) { return _this.state.dataSource.length >= 1 ? React.createElement(Popconfirm, { title: "Sure to delete?", onConfirm: function onConfirm() { return _this.handleDelete(record.key); } }, React.createElement("a", null, React.createElement(DeleteOutlined, null))) : null; } }]) || [] : props.columns; _this.state = { dataSource: [], count: 0 }; return _this; } _createClass(EditableTable, [{ key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { if (nextProps.value) { this.setState({ dataSource: nextProps.value.map(function (item, index) { return _objectSpread2(_objectSpread2({}, item), {}, { key: index + 1 }); }), total: nextProps.value.length }); } } }, { key: "render", value: function render() { var _this2 = this; var dataSource = this.state.dataSource; var _this$props2 = this.props, disabled = _this$props2.disabled, addNode = _this$props2.addNode, formatMessage = _this$props2.formatMessage, restProps = _objectWithoutProperties(_this$props2, ["disabled", "addNode", "formatMessage"]); var components = { body: { row: EditableRow, cell: EditableCell } }; var columns = this.columns.map(function (col) { if (!col.editable) { return col; } return _objectSpread2(_objectSpread2({}, col), {}, { onCell: function onCell(record) { return { record: record, editable: col.editable && !disabled, dataIndex: col.dataIndex, title: col.title, handleSave: _this2.handleSave, isRequired: col.isRequired }; } }); }); return React.createElement("div", null, React.createElement("div", { style: { display: disabled ? 'none' : 'block', height: '48px' } }, addNode ? React.createElement("span", { onClick: this.handleAdd }, addNode) : React.createElement(Button, { onClick: this.handleAdd, type: "primary", style: { marginBottom: 16 } }, formatMessage && formatMessage({ id: 'sula-component.edit-table.addRow' }) ? formatMessage({ id: 'sula-component.edit-table.addRow' }) : '添加一行')), React.createElement(Table, Object.assign({}, restProps, { components: components, rowClassName: function rowClassName() { return 'editable-row'; }, bordered: true, dataSource: dataSource, columns: columns, rowKey: "key" }))); } }]); return EditableTable; }(React.Component); export { EditableTable as EditTable };