@jannie-shao/components-antd4
Version:
227 lines • 7.65 kB
JavaScript
import "antd/es/form/style";
import _Form from "antd/es/form";
import "antd/es/input/style";
import _Input from "antd/es/input";
import _extends from "@babel/runtime/helpers/extends";
import React, { useImperativeHandle, forwardRef } from 'react';
import { cloneDeep } from 'lodash';
import { PlusSquareOutlined } from '@ant-design/icons';
import Table from "../../../table";
import IconFont from "../../../icon-font";
import { rootPrefix } from "../../../style/config";
import { makerFun } from "../../maker/render-fun";
var prefix = rootPrefix + "-form-item";
var Item = /*#__PURE__*/forwardRef(function (props, ref) {
var maxKey = props.maxKey,
eleCount = props.eleCount,
operation = props.operation,
model = props.model,
data = props.data,
onChange = props.onChange;
var _ref = model.props || {},
_ref$disabled = _ref.disabled,
disabled = _ref$disabled === void 0 ? false : _ref$disabled,
max = _ref.max,
_ref$startIdx = _ref.startIdx,
startIdx = _ref$startIdx === void 0 ? 0 : _ref$startIdx,
_ref$snConfig = _ref.snConfig,
snConfig = _ref$snConfig === void 0 ? {} : _ref$snConfig,
_ref$showSN = _ref.showSN,
showSN = _ref$showSN === void 0 ? true : _ref$showSN,
_ref$useKeyAsSN = _ref.useKeyAsSN,
useKeyAsSN = _ref$useKeyAsSN === void 0 ? false : _ref$useKeyAsSN,
_ref$useOperation = _ref.useOperation,
useOperation = _ref$useOperation === void 0 ? true : _ref$useOperation,
opRender = _ref.opRender,
_ref$checkOpt = _ref.checkOpt,
checkOpt = _ref$checkOpt === void 0 ? function () {
return true;
} : _ref$checkOpt;
var _snConfig$snKey = snConfig.snKey,
snKey = _snConfig$snKey === void 0 ? 'sn' : _snConfig$snKey,
_snConfig$snLabel = snConfig.snLabel,
snLabel = _snConfig$snLabel === void 0 ? 'SN' : _snConfig$snLabel;
var _add = operation.add,
remove = operation.remove;
var getDefaultSN = function getDefaultSN(record) {
if (record === void 0) {
record = {};
}
return record[snKey] === undefined ? maxKey : record[snKey];
};
var handleAdd = function handleAdd(d) {
var _ref2;
if (d === void 0) {
d = {};
}
if (disabled) return;
if (max && eleCount.current >= max) return;
var defaultData = useKeyAsSN ? (_ref2 = {}, _ref2[snKey] = maxKey + 1, _ref2) : {};
var dataToAdd = _extends({}, d, defaultData);
_add(dataToAdd);
};
var handleRemove = function handleRemove(idx) {
remove(idx);
if (eleCount.current < 1) {
handleAdd();
}
};
var handleUpdateFields = function handleUpdateFields(idx, values) {
if (values === void 0) {
values = {};
}
if (disabled) return;
var dataNow = cloneDeep(data);
if (!dataNow[idx]) {
dataNow[idx] = {};
}
Object.keys(values).forEach(function (key) {
dataNow[idx][key] = values[key];
});
onChange && onChange(dataNow);
};
useImperativeHandle(ref, function () {
return _extends({}, operation, {
add: function add(d) {
if (d === void 0) {
d = {};
}
if (disabled) return;
if (max && eleCount.current >= max) return;
_add(d);
},
remove: handleRemove
});
});
return /*#__PURE__*/React.createElement("div", {
className: prefix + "-table"
}, /*#__PURE__*/React.createElement(Table, {
pagination: false,
dataSource: data.map(function (d, idx) {
return _extends({}, d, {
__rowKey__: "row:" + d[snKey] + ":" + idx
});
}),
rowKey: "__rowKey__",
columns: [].concat(showSN ? [{
title: snLabel,
dataIndex: snKey,
width: 62,
render: function render(_, record, idx) {
if (record === void 0) {
record = {};
}
if (!useKeyAsSN) {
return startIdx + idx;
}
return /*#__PURE__*/React.createElement(_Form.Item, {
key: [idx, snKey],
name: [idx, snKey],
fieldKey: [idx, snKey],
initialValue: getDefaultSN(record)
}, /*#__PURE__*/React.createElement(_Input, {
bordered: false,
style: {
color: 'rgba(0, 0, 0, 0.85)',
cursor: 'default'
},
disabled: true
}));
}
}] : [], model.items.map(function (item) {
var label = typeof item === 'string' ? item : item.label;
return {
title: label,
dataIndex: item.name,
render: function render(_, record, idx) {
if (record === void 0) {
record = {};
}
var sn = getDefaultSN(record);
var recordInfo = {
sn: sn,
record: record,
idx: idx,
dataSource: data
};
var updateFields = function updateFields(values) {
return handleUpdateFields(idx, values);
};
// 构造子组件
var itemNow = cloneDeep(item);
// 获取子组件的 props 并改造 onChange 事件
itemNow.props = typeof itemNow.props === 'function' ? itemNow.props(recordInfo) : itemNow.props || {};
itemNow.props.disabled = disabled || itemNow.props.disabled;
if (itemNow.props.onChange) {
itemNow.props.onChange = function () {
var _item$props;
for (var _len = arguments.length, arg = new Array(_len), _key = 0; _key < _len; _key++) {
arg[_key] = arguments[_key];
}
return (_item$props = item.props).onChange.apply(_item$props, [_extends({}, recordInfo, {
updateFields: updateFields
})].concat(arg));
};
}
return /*#__PURE__*/React.createElement(_Form.Item, _extends({}, item.formProps || {}, {
key: [idx, item.name],
name: [idx, item.name],
fieldKey: [idx, item.name]
}), typeof item.render === 'function' ? item.render(_extends({}, recordInfo, {
updateFields: updateFields
})) : makerFun(itemNow));
}
};
}), useOperation ? [{
title: 'Operation',
dataIndex: '__OPERATION',
render: function render(_, record, idx) {
if (record === void 0) {
record = {};
}
if (disabled) return /*#__PURE__*/React.createElement(React.Fragment, null);
var isLast = idx === data.length - 1 && !(max && data.length >= max);
var isOnly = idx === 0 && isLast;
var optConfig = {
record: record,
idx: idx,
maxKey: maxKey,
isLast: isLast,
isOnly: isOnly
};
var render = opRender ? opRender(optConfig, {
add: handleAdd,
remove: handleRemove
}) : null;
if (render) return render;
var opts = [];
if (!isOnly && checkOpt({
type: 'remove',
optConfig: optConfig
})) {
opts.push( /*#__PURE__*/React.createElement(IconFont.Delete, {
key: "remove",
onClick: function onClick() {
return handleRemove(idx);
},
className: prefix + "-table-operation"
}));
}
if (isLast && checkOpt({
type: 'add',
optConfig: optConfig
})) {
opts.push( /*#__PURE__*/React.createElement(PlusSquareOutlined, {
key: "add",
onClick: function onClick() {
return handleAdd();
},
className: prefix + "-table-operation"
}));
}
return opts;
}
}] : [])
}));
});
export default Item;