UNPKG

tntd

Version:

tntd是基于 TNT Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。

497 lines (495 loc) 18.7 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = WarpArrayInput; var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep")); var _sum2 = _interopRequireDefault(require("lodash/sum")); var _set2 = _interopRequireDefault(require("lodash/set")); var _isFunction2 = _interopRequireDefault(require("lodash/isFunction")); var _isArray2 = _interopRequireDefault(require("lodash/isArray")); var _get2 = _interopRequireDefault(require("lodash/get")); var _core = require("@dnd-kit/core"); var _modifiers = require("@dnd-kit/modifiers"); var _sortable = require("@dnd-kit/sortable"); var _utilities = require("@dnd-kit/utilities"); var _LocaleReceiver = _interopRequireDefault(require("antd/lib/locale-provider/LocaleReceiver")); var _react = _interopRequireWildcard(require("react")); var _button = _interopRequireDefault(require("../button")); var _col = _interopRequireDefault(require("../col")); var _icon = _interopRequireDefault(require("../icon")); var _row = _interopRequireDefault(require("../row")); var _table = _interopRequireDefault(require("../table")); var _tooltip = _interopRequireDefault(require("../tooltip")); require("./index.less"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } 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 _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } 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."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var Column = _table["default"].Column; var RowContext = _react["default"].createContext({}); var key = 1; function DragHandle() { var _useContext = (0, _react.useContext)(RowContext), setActivatorNodeRef = _useContext.setActivatorNodeRef, listeners = _useContext.listeners; return _react["default"].createElement(_button["default"], Object.assign({ className: "drag-btn", type: "tertiary", size: "small", icon: "drag", ref: setActivatorNodeRef }, listeners)); } function BodyRow(props) { var _useSortable = (0, _sortable.useSortable)({ id: props['data-row-key'] }), attributes = _useSortable.attributes, listeners = _useSortable.listeners, setNodeRef = _useSortable.setNodeRef, setActivatorNodeRef = _useSortable.setActivatorNodeRef, transform = _useSortable.transform, transition = _useSortable.transition, isDragging = _useSortable.isDragging; var style = Object.assign(Object.assign(Object.assign({}, props.style), { transform: _utilities.CSS.Translate.toString(transform), transition: transition }), isDragging ? { position: 'relative', zIndex: 9999 } : {}); var contextValue = (0, _react.useMemo)(function () { return { setActivatorNodeRef: setActivatorNodeRef, listeners: listeners }; }, [setActivatorNodeRef, listeners]); return _react["default"].createElement(RowContext.Provider, { value: contextValue }, _react["default"].createElement("tr", Object.assign({}, props, { ref: setNodeRef, style: style }, attributes))); } function ArrayInput(_ref) { var children = _ref.children, defaultValue = _ref.defaultValue, value = _ref.value, onChange = _ref.onChange, _ref$mode = _ref.mode, mode = _ref$mode === void 0 ? 'list' : _ref$mode, _ref$drag = _ref.drag, drag = _ref$drag === void 0 ? false : _ref$drag, _ref$gutter = _ref.gutter, gutter = _ref$gutter === void 0 ? 10 : _ref$gutter, _ref$require = _ref.require, require = _ref$require === void 0 ? false : _ref$require, errorMap = _ref.errorMap, _ref$deleteTip = _ref.deleteTip, deleteTip = _ref$deleteTip === void 0 ? '' : _ref$deleteTip, _ref$plusTip = _ref.plusTip, plusTip = _ref$plusTip === void 0 ? '' : _ref$plusTip, addText = _ref.addText, locale = _ref.locale, _ref$xProps = _ref.xProps, xProps = _ref$xProps === void 0 ? {} : _ref$xProps, _ref$defaultAddData = _ref.defaultAddData, defaultAddData = _ref$defaultAddData === void 0 ? {} : _ref$defaultAddData, renderAction = _ref.renderAction, _ref$actionWidth = _ref.actionWidth, actionWidth = _ref$actionWidth === void 0 ? 80 : _ref$actionWidth, _ref$disabled = _ref.disabled, disabled = _ref$disabled === void 0 ? false : _ref$disabled; if (!(0, _isFunction2["default"])(children)) { throw new Error(locale.error); } if (addText === undefined) { addText = locale === null || locale === void 0 ? void 0 : locale.add; } var _useState = (0, _react.useState)(value || defaultValue), _useState2 = _slicedToArray(_useState, 2), _value = _useState2[0], setValue = _useState2[1]; (0, _react.useEffect)(function () { var newValue = value; // 如果数组没有key if (Array.isArray(value) && value.some(function (obj) { return !obj.key; })) { newValue = value.map(function (obj) { return Object.assign(Object.assign({}, obj), { key: obj.key || key++ }); }); _onChange(newValue); } else { setValue(newValue); } }, [value]); var _onChange = (0, _react.useCallback)(function (value) { if (onChange) { onChange(value); } else { setValue(value); } }, []); var inValue = _value || []; if (require && inValue.length === 0) { inValue = [{ key: key++ }]; } var changeValue = function changeValue(index, name, value) { inValue[index] = Object.assign(Object.assign({}, inValue[index]), _defineProperty({}, name, value)); _onChange(_toConsumableArray(inValue)); }; var onAdd = function onAdd(index) { var newData = Object.assign(Object.assign({}, (0, _cloneDeep2["default"])(defaultAddData)), { key: key++ }); if (index === undefined) { _onChange([].concat(_toConsumableArray(inValue), [newData])); } else { inValue.splice(index + 1, 0, newData); _onChange(_toConsumableArray(inValue)); } }; var onDelete = function onDelete(i) { inValue.splice(i, 1); _onChange(_toConsumableArray(inValue)); }; var onDragEnd = function onDragEnd(_ref2) { var active = _ref2.active, over = _ref2.over; if (active.id !== (over === null || over === void 0 ? void 0 : over.id)) { _onChange(function (prevState) { var activeIndex = prevState.findIndex(function (record) { return record.key === (active === null || active === void 0 ? void 0 : active.id); }); var overIndex = prevState.findIndex(function (record) { return record.key === (over === null || over === void 0 ? void 0 : over.id); }); return (0, _sortable.arrayMove)(prevState, activeIndex, overIndex); }); } }; if (mode === 'list') { return _react["default"].createElement("div", { className: "tntd-array-input" }, inValue.map(function (item, index) { var fields = children(item, index); if (!(0, _isArray2["default"])(fields)) { fields = (0, _get2["default"])(fields, 'props.children', []); } var actionSpan = 24 - (0, _sum2["default"])(fields.map(function (f) { return (0, _get2["default"])(f, 'props.span', 4); })) % 24; return _react["default"].createElement(_row["default"], { gutter: gutter, key: index, className: "tntd-array-input-item" }, fields.map(function (field, i) { if (!(0, _react.isValidElement)(field)) { return field ? _react["default"].createElement(_col["default"], { span: 4, key: i }, field) : ''; } var _a = field === null || field === void 0 ? void 0 : field.props, name = _a.name, _a$span = _a.span, span = _a$span === void 0 ? 4 : _a$span, fieldChange = _a.onChange, other = __rest(_a, ["name", "span", "onChange"]); var isError = errorMap ? errorMap["".concat(index, "-").concat(name)] : ''; return _react["default"].createElement(_col["default"], { span: span, key: i }, _react["default"].createElement("div", { className: !isError ? 'tntd-array-input-hide-error' : '' }, _react["default"].cloneElement(field, Object.assign({ value: item[name] || undefined, onChange: function onChange(e) { fieldChange && fieldChange(e, index, changeValue); var newValue = e.target ? e.target.value : e; changeValue(index, name, newValue); }, disabled: disabled }, other))), isError && _react["default"].createElement("div", { className: "ant-form-item-explain-error" }, isError)); }), !disabled && _react["default"].createElement(_col["default"], { span: actionSpan }, _react["default"].createElement("span", { className: "tntd-array-input-action" }, renderAction ? renderAction(item, index, onDelete, onAdd) : _react["default"].createElement(_react["default"].Fragment, null, deleteTip ? _react["default"].createElement(_tooltip["default"], { title: deleteTip }, _react["default"].createElement("span", { onClick: function onClick() { return onDelete(index); } }, _react["default"].createElement(_icon["default"], { type: "delete" }))) : _react["default"].createElement("span", { onClick: function onClick() { return onDelete(index); } }, _react["default"].createElement(_icon["default"], { type: "delete" })))))); }), !disabled && _react["default"].createElement(_button["default"], { type: "link", onClick: function onClick() { return onAdd(); } }, _react["default"].createElement(_icon["default"], { type: "plus" }), addText)); } else { var fields = children({}, 0); if (!(0, _isArray2["default"])(fields)) { fields = (0, _get2["default"])(fields, 'props.children', []); } var dataSource = inValue.map(function (value, index) { var fields = children(value, index); var back = { key: value.key }; fields.forEach(function (field) { var _a; var name = (_a = field === null || field === void 0 ? void 0 : field.props) === null || _a === void 0 ? void 0 : _a.name; name && (0, _set2["default"])(back, name, field); }); return back; }); return _react["default"].createElement("div", { className: "tntd-array-input" }, _react["default"].createElement(_core.DndContext, { modifiers: [_modifiers.restrictToVerticalAxis], onDragEnd: onDragEnd }, _react["default"].createElement(_sortable.SortableContext, { items: dataSource.map(function (i) { return i.key; }), strategy: _sortable.verticalListSortingStrategy }, _react["default"].createElement(_table["default"], Object.assign({ dataSource: dataSource, pagination: false, components: { body: { row: BodyRow } }, bordered: true }, xProps), drag && _react["default"].createElement(Column, { key: "dragger", dataIndex: "dragger", width: 60, render: function render() { return _react["default"].createElement(DragHandle, null); } }), fields.map(function (field) { var _ref3 = (field === null || field === void 0 ? void 0 : field.props) || {}, name = _ref3.name, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 160 : _ref3$width, title = _ref3.title; return _react["default"].createElement(Column, { key: name, dataIndex: name, title: title, width: width, render: function render(field, row, index) { if (!(0, _react.isValidElement)(field)) { return field; } var _field$props = field.props, name = _field$props.name, fieldChange = _field$props.onChange; var isError = errorMap ? errorMap["".concat(index, "-").concat(name)] : ''; return _react["default"].createElement("div", { className: !isError ? 'tntd-array-input-hide-error' : '' }, _react["default"].cloneElement(field, { value: inValue[index][name] || undefined, onChange: function onChange(e) { fieldChange && fieldChange(e, index, changeValue); var newValue = e.target ? e.target.value : e; changeValue(index, name, newValue), disabled; } }), isError && _react["default"].createElement("div", { className: "ant-form-item-explain-error" }, isError)); } }); }), !disabled && _react["default"].createElement(Column, { key: "action", dataIndex: "action", title: locale.action, width: actionWidth, className: "tntd-array-input-action", render: function render(text, row, index) { if (renderAction) { return renderAction(row, index, onDelete, onAdd); } return _react["default"].createElement(_react["default"].Fragment, null, deleteTip ? _react["default"].createElement(_tooltip["default"], { title: deleteTip }, _react["default"].createElement("span", { onClick: function onClick() { return onDelete(index); } }, _react["default"].createElement(_icon["default"], { type: "delete" }))) : _react["default"].createElement("span", { onClick: function onClick() { return onDelete(index); } }, _react["default"].createElement(_icon["default"], { type: "delete" }))); } })))), !disabled && _react["default"].createElement(_button["default"], { type: "dashed", block: true, className: "mt10", onClick: function onClick() { return onAdd(); } }, _react["default"].createElement(_icon["default"], { type: "plus" }), addText)); } } function WarpArrayInput(props) { return _react["default"].createElement(_LocaleReceiver["default"], { componentName: "ArrayInput" }, function (locale) { return _react["default"].createElement(ArrayInput, Object.assign({}, props, { locale: locale })); }); }