"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

var _typeof = require("@babel/runtime/helpers/typeof");

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.EditableTable = EditableTable;
exports.default = void 0;

require("maycur-antd/lib/table/style/css");

var _table = _interopRequireDefault(require("maycur-antd/lib/table"));

var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));

var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));

var _react = _interopRequireWildcard(require("react"));

var _propTypes = _interopRequireDefault(require("prop-types"));

var _EditableCell = _interopRequireDefault(require("./tableMember/EditableCell"));

var _EditableFormRow = _interopRequireDefault(require("./tableMember/EditableFormRow"));

var _PopoverTip = _interopRequireDefault(require("../PopoverTip"));

var _RedStar = _interopRequireDefault(require("../RedStar"));

var _lodash = _interopRequireDefault(require("lodash"));

var _utils = _interopRequireDefault(require("../utils/utils"));

var _reactDom = require("react-dom");

var _excluded = ["value", "formFields", "privateProps"];

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

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 _objectSpread(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) { (0, _defineProperty2.default)(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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var prefix = _utils.default.prefixCls;

var calTotalWidth = function calTotalWidth() {
  var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  var width = 0;

  if (columns instanceof Array && columns.length > 0) {
    columns.forEach(function (col) {
      width = width + col.width;
    });
  }

  return width;
};

function HocEditableTable() {
  var option = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var FieldFood = option.FieldFood;
  var components = {
    body: {
      row: (0, _EditableFormRow.default)(FieldFood),
      cell: (0, _EditableCell.default)(FieldFood)
    }
  };

  var InnerTable = /*#__PURE__*/function (_Component) {
    (0, _inherits2.default)(InnerTable, _Component);

    var _super = _createSuper(InnerTable);

    function InnerTable(props) {
      var _this;

      (0, _classCallCheck2.default)(this, InnerTable);
      _this = _super.call(this, props);

      _this.updateRowForms = function (form) {
        _this.rowForms = _objectSpread(_objectSpread({}, _this.rowForms), form);
      };

      _this.setFieldsValue = function (rowKey, key, value) {
        if (_this.rowForms && _this.rowForms[rowKey]) {
          _this.rowForms[rowKey].setFieldsValue((0, _defineProperty2.default)({}, key, value));
        }
      };

      _this.tableValidation = function () {
        var validRowForms = _lodash.default.filter(_lodash.default.values(_this.rowForms), function (form) {
          return form;
        });

        var validations = _lodash.default.map(validRowForms, function (form) {
          return new Promise(function (resolve, reject) {
            form.validateFields(function (err, values) {
              if (!err) {
                resolve(true);
              } else {
                reject(err);
              }
            });
          });
        });

        return Promise.all(validations);
      };

      _this.handleRowChange = function (rowData, orgRowData) {
        if (_this.props.handleRowChange) {
          _this.props.handleRowChange(rowData, orgRowData);
        } else {
          var row = _objectSpread(_objectSpread({}, orgRowData), rowData);

          var _this$props = _this.props,
              rowKey = _this$props.rowKey,
              onChange = _this$props.onChange;
          var newData = (0, _toConsumableArray2.default)(_this.props.value);
          var index = newData.findIndex(function (item) {
            return row[rowKey] === item[rowKey];
          });

          if (index > -1) {
            newData.splice(index, 1, row);
            onChange && onChange(newData);
          }
        }
      };

      _this.onRow = function (rowData, index) {
        var _this$props2 = _this.props,
            formFields = _this$props2.formFields,
            rowKey = _this$props2.rowKey,
            genPreFormulas = _this$props2.genPreFormulas,
            _this$props2$brandNew = _this$props2.brandNewRowKeys,
            brandNewRowKeys = _this$props2$brandNew === void 0 ? [] : _this$props2$brandNew;
        var isNew = brandNewRowKeys.includes(rowData[rowKey]);
        return {
          rowKey: rowKey,
          formFields: formFields,
          index: index,
          rowsPublicProps: {
            isNew: isNew,
            tableRef: _this.tableDom,
            registerEvent: _this.registerEvent
          },
          genPreFormulas: genPreFormulas,
          formValue: rowData,
          updateRowForms: _this.updateRowForms,
          formChange: function formChange(formData) {
            return _this.handleRowChange(formData, rowData);
          }
        };
      };

      _this.formatColumnByField = function (field) {
        var _this$props3 = _this.props,
            setCustomWidth = _this$props3.setCustomWidth,
            _this$props3$lengthOf = _this$props3.lengthOfRowMerge,
            lengthOfRowMerge = _this$props3$lengthOf === void 0 ? 0 : _this$props3$lengthOf,
            _this$props3$mergeCol = _this$props3.mergeColmns,
            mergeColmns = _this$props3$mergeCol === void 0 ? [] : _this$props3$mergeCol;
        var _field$editable = field.editable,
            editable = _field$editable === void 0 ? true : _field$editable;
        return {
          field: field,
          title: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, field.property && field.property.required ? /*#__PURE__*/_react.default.createElement(_RedStar.default, null) : null, field.property && field.property.label, field.extraTitle ? field.extraTitle : null, field.property && field.property.assistedRemark && /*#__PURE__*/_react.default.createElement(_PopoverTip.default, {
            placement: 'top',
            content: field.property.assistedRemark
          })),
          width: setCustomWidth ? setCustomWidth(field) : field.width || 200,
          editable: editable,
          dataIndex: field.dataIndex || field.identifier,
          children: field.children,
          className: field.className,
          render: function render(value, row, index) {
            var _value = field.render ? field.render(value, row, index) : value;

            if (lengthOfRowMerge && mergeColmns.includes(field.identifier)) {
              return {
                children: _value,
                props: {
                  rowSpan: index % lengthOfRowMerge === 0 ? lengthOfRowMerge : 0
                }
              };
            } else {
              return _value;
            }
          }
        };
      };

      _this.generateColumns = function () {
        var _this$props4 = _this.props,
            addExtraColumns = _this$props4.addExtraColumns,
            _this$props4$formFiel = _this$props4.formFields,
            formFields = _this$props4$formFiel === void 0 ? [] : _this$props4$formFiel;

        var columns = [],
            _formFields = (0, _toConsumableArray2.default)(formFields);

        _formFields = addExtraColumns ? addExtraColumns(_formFields) : _formFields;

        _lodash.default.forEach(_formFields, function (field) {
          // if (field.property && field.property.isFieldHide) {
          //     return;
          // }
          var column = _this.formatColumnByField(field);

          columns.push(column);
        });

        return columns;
      };

      _this.getColumnsWithOnCell = function () {
        var _this$props5 = _this.props,
            privateProps = _this$props5.privateProps,
            rowsPrivateProps = _this$props5.rowsPrivateProps,
            _this$props5$publicPr = _this$props5.publicProps,
            publicProps = _this$props5$publicPr === void 0 ? {} : _this$props5$publicPr,
            rowKey = _this$props5.rowKey,
            readOnly = _this$props5.readOnly;

        var columns = _this.generateColumns();

        return columns.map(function (col, index) {
          if (!col.editable) {
            return col;
          }

          var _onCell = function onCell(record, col, rowIndex) {
            var _privateProps = {};
            var singlePrivateProps = {};

            if (rowsPrivateProps && rowsPrivateProps.length > 0) {
              var matcheDItem = _lodash.default.find(rowsPrivateProps, function (item) {
                return record[rowKey] === item.rowKey;
              });

              if (matcheDItem) {
                singlePrivateProps = matcheDItem.privateProps;
              }
            } else if (privateProps) {
              singlePrivateProps = privateProps;
            }

            for (var key in singlePrivateProps) {
              _privateProps[key] = _objectSpread(_objectSpread({}, singlePrivateProps[key]), {}, {
                dataRowKey: record[rowKey]
              });
            }

            return {
              record: record,
              readOnly: readOnly,
              rowIndex: rowIndex,
              handleRowChange: _this.handleRowChange,
              columnIndex: index,
              identifier: col.field.identifier,
              editable: col.editable,
              privateProps: _privateProps,
              publicProps: publicProps
            };
          };

          if (col.children) {
            col.children = col.children.map(function (child) {
              var subColumn = _this.formatColumnByField(child);

              return _objectSpread(_objectSpread({}, subColumn), {}, {
                onCell: function onCell(record) {
                  return _onCell(record, subColumn);
                }
              });
            });
          }

          return _objectSpread(_objectSpread({}, col), {}, {
            onCell: function onCell(record, rowIndex) {
              return _onCell(record, col, rowIndex);
            }
          });
        });
      };

      _this.registerEvent = function (cb) {
        _this.eventCbs.push(cb);
      };

      _this.doCallbacks = function () {
        _this.eventCbs.forEach(function (cb) {
          cb && cb();
        });
      };

      _this.state = {
        columns: []
      };
      _this.rowForms = {};
      _this.tableRef = /*#__PURE__*/(0, _react.createRef)();
      _this.eventCbs = [];
      return _this;
    }

    (0, _createClass2.default)(InnerTable, [{
      key: "componentDidMount",
      value: function componentDidMount() {
        this.tableDom = (0, _reactDom.findDOMNode)(this.tableRef.current);
        this.innerTableDom = this.tableDom.getElementsByClassName('ant-table-body') && this.tableDom.getElementsByClassName('ant-table-body')[0];
        this.innerTableDom && this.innerTableDom.addEventListener('scroll', this.doCallbacks);
      }
    }, {
      key: "componentWillUnmount",
      value: function componentWillUnmount() {
        this.innerTableDom && this.innerTableDom.removeEventListener('scroll', this.doCallbacks);
      }
    }, {
      key: "render",
      value: function render() {
        var _this$props6 = this.props,
            dataSource = _this$props6.value,
            formFields = _this$props6.formFields,
            privateProps = _this$props6.privateProps,
            restProps = (0, _objectWithoutProperties2.default)(_this$props6, _excluded);
        var columns = this.getColumnsWithOnCell();
        return /*#__PURE__*/_react.default.createElement(_table.default, (0, _extends2.default)({
          dataSource: dataSource,
          columns: columns,
          scroll: {
            x: dataSource && dataSource.length > 0 ? calTotalWidth(columns) : true
          }
        }, restProps, {
          components: components,
          className: "".concat(prefix, "-edit-table"),
          onRow: this.onRow,
          ref: this.tableRef
        }));
      }
    }]);
    return InnerTable;
  }(_react.Component);

  InnerTable.defaultProps = {
    pagination: false,
    rowKey: 'key',
    value: [],
    bordered: false,
    formFields: []
  };
  InnerTable.propTypes = {
    value: _propTypes.default.array,
    formFields: _propTypes.default.array
  };
  return InnerTable;
}
/** 
 * @author  卫蓉
 */


function EditableTable() {
  //用于欺骗react-styleguidist无法识别HOC组件，不是真实组件
  return /*#__PURE__*/_react.default.createElement("div", null);
}

var _default = HocEditableTable;
exports.default = _default;