@ant-design/pro-utils
Version:
899 lines (880 loc) • 40.6 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
import _toArray from "@babel/runtime/helpers/esm/toArray";
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _typeof from "@babel/runtime/helpers/esm/typeof";
var _excluded = ["map_row_parentKey"],
_excluded2 = ["map_row_parentKey", "map_row_key"],
_excluded3 = ["map_row_key"];
/* eslint-disable react-hooks/exhaustive-deps */
import { LoadingOutlined } from '@ant-design/icons';
import { useIntl } from '@ant-design/pro-provider';
import { Form, Popconfirm, message } from 'antd';
import useLazyKVMap from "antd/es/table/hooks/useLazyKVMap";
import useMergedState from "rc-util/es/hooks/useMergedState";
import get from "rc-util/es/utils/get";
import set from "rc-util/es/utils/set";
import { noteOnce } from "rc-util/es/warning";
import React, { createRef, forwardRef, useContext, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
import { useDebounceFn, useRefFunction } from '..';
import { ProFormContext } from "../components/ProFormContext";
import { useDeepCompareEffectDebounce } from "../hooks/useDeepCompareEffect";
import { usePrevious } from "../hooks/usePrevious";
import { merge } from "../merge";
import { useMountMergeState } from "../useMountMergeState";
/**
* 兼容antd@4 和 antd@5 的warning
* @param messageStr
*/
import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
var warning = function warning(messageStr) {
// @ts-ignore
return (message.warn || message.warning)(messageStr);
};
export var recordKeyToString = function recordKeyToString(rowKey) {
if (Array.isArray(rowKey)) return rowKey.join(',');
return rowKey;
};
/**
* 使用map 来删除数据,性能一般 但是准确率比较高
*
* @param keyProps
* @param action
*/
export function editableRowByKey(keyProps, action) {
var _recordKeyToString;
var getRowKey = keyProps.getRowKey,
row = keyProps.row,
data = keyProps.data,
_keyProps$childrenCol = keyProps.childrenColumnName,
childrenColumnName = _keyProps$childrenCol === void 0 ? 'children' : _keyProps$childrenCol;
var key = (_recordKeyToString = recordKeyToString(keyProps.key)) === null || _recordKeyToString === void 0 ? void 0 : _recordKeyToString.toString();
var kvMap = new Map();
/**
* 打平这个数组
*
* @param records
* @param parentKey
*/
function dig(records, map_row_parentKey, map_row_index) {
records.forEach(function (record, index) {
var eachIndex = (map_row_index || 0) * 10 + index;
var recordKey = getRowKey(record, eachIndex).toString();
// children 取在前面方便拼的时候按照反顺序放回去
if (record && _typeof(record) === 'object' && childrenColumnName in record) {
dig(record[childrenColumnName] || [], recordKey, eachIndex);
}
var newRecord = _objectSpread(_objectSpread({}, record), {}, {
map_row_key: recordKey,
children: undefined,
map_row_parentKey: map_row_parentKey
});
delete newRecord.children;
if (!map_row_parentKey) {
delete newRecord.map_row_parentKey;
}
kvMap.set(recordKey, newRecord);
});
}
if (action === 'top') {
kvMap.set(key, _objectSpread(_objectSpread({}, kvMap.get(key)), row));
}
dig(data);
if (action === 'update') {
kvMap.set(key, _objectSpread(_objectSpread({}, kvMap.get(key)), row));
}
if (action === 'delete') {
kvMap.delete(key);
}
var fill = function fill(map) {
var kvArrayMap = new Map();
var kvSource = [];
var fillNewRecord = function fillNewRecord() {
var fillChildren = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
map.forEach(function (value) {
if (value.map_row_parentKey && !value.map_row_key) {
var map_row_parentKey = value.map_row_parentKey,
rest = _objectWithoutProperties(value, _excluded);
if (!kvArrayMap.has(map_row_parentKey)) {
kvArrayMap.set(map_row_parentKey, []);
}
if (fillChildren) {
var _kvArrayMap$get;
(_kvArrayMap$get = kvArrayMap.get(map_row_parentKey)) === null || _kvArrayMap$get === void 0 || _kvArrayMap$get.push(rest);
}
}
});
};
fillNewRecord(action === 'top');
map.forEach(function (value) {
if (value.map_row_parentKey && value.map_row_key) {
var _kvArrayMap$get2;
var map_row_parentKey = value.map_row_parentKey,
map_row_key = value.map_row_key,
rest = _objectWithoutProperties(value, _excluded2);
if (kvArrayMap.has(map_row_key)) {
rest[childrenColumnName] = kvArrayMap.get(map_row_key);
}
if (!kvArrayMap.has(map_row_parentKey)) {
kvArrayMap.set(map_row_parentKey, []);
}
(_kvArrayMap$get2 = kvArrayMap.get(map_row_parentKey)) === null || _kvArrayMap$get2 === void 0 || _kvArrayMap$get2.push(rest);
}
});
fillNewRecord(action === 'update');
map.forEach(function (value) {
if (!value.map_row_parentKey) {
var map_row_key = value.map_row_key,
rest = _objectWithoutProperties(value, _excluded3);
if (map_row_key && kvArrayMap.has(map_row_key)) {
var item = _objectSpread(_objectSpread({}, rest), {}, _defineProperty({}, childrenColumnName, kvArrayMap.get(map_row_key)));
kvSource.push(item);
return;
}
kvSource.push(rest);
}
});
return kvSource;
};
return fill(kvMap);
}
/**
* 保存按钮的dom
*
* @param ActionRenderConfig
*/
export function SaveEditableAction(_ref, ref) {
var recordKey = _ref.recordKey,
onSave = _ref.onSave,
row = _ref.row,
children = _ref.children,
newLineConfig = _ref.newLineConfig,
editorType = _ref.editorType,
tableName = _ref.tableName;
var context = useContext(ProFormContext);
var form = Form.useFormInstance();
var _useMountMergeState = useMountMergeState(false),
_useMountMergeState2 = _slicedToArray(_useMountMergeState, 2),
loading = _useMountMergeState2[0],
setLoading = _useMountMergeState2[1];
var save = useRefFunction( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var _context$getFieldForm, isMapEditor, namePath, fields, _recordKey, recordKeyPath, curValue, data, res;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
isMapEditor = editorType === 'Map'; // 为了兼容类型为 array 的 dataIndex,当 recordKey 是一个数组时,用于获取表单值的 key 只取第一项,
// 从表单中获取回来之后,再根据 namepath 获取具体的某个字段并设置
namePath = [tableName, Array.isArray(recordKey) ? recordKey[0] : recordKey].map(function (key) {
return key === null || key === void 0 ? void 0 : key.toString();
}).flat(1).filter(Boolean);
setLoading(true);
_context.next = 6;
return form.validateFields(namePath, {
recursive: true
});
case 6:
fields = (context === null || context === void 0 || (_context$getFieldForm = context.getFieldFormatValue) === null || _context$getFieldForm === void 0 ? void 0 : _context$getFieldForm.call(context, namePath)) || form.getFieldValue(namePath); // 处理 dataIndex 为数组的情况
if (Array.isArray(recordKey) && recordKey.length > 1) {
// 获取 namepath
_recordKey = _toArray(recordKey), recordKeyPath = _recordKey.slice(1); // 将目标值获取出来并设置到 fields 当中
curValue = get(fields, recordKeyPath);
set(fields, recordKeyPath, curValue);
}
data = isMapEditor ? set({}, namePath, fields) : fields; // 获取数据并保存
_context.next = 11;
return onSave === null || onSave === void 0 ? void 0 : onSave(recordKey,
// 如果是 map 模式,fields 就是一个值,所以需要set 到对象中
// 数据模式 fields 是一个对象,所以不需要
merge({}, row, data), row, newLineConfig);
case 11:
res = _context.sent;
setLoading(false);
return _context.abrupt("return", res);
case 16:
_context.prev = 16;
_context.t0 = _context["catch"](0);
// eslint-disable-next-line no-console
console.log(_context.t0);
setLoading(false);
throw _context.t0;
case 21:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 16]]);
})));
// 保存数据
useImperativeHandle(ref, function () {
return {
save: save
};
}, [save]);
return /*#__PURE__*/_jsxs("a", {
onClick: ( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(e) {
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
e.stopPropagation();
e.preventDefault();
_context2.prev = 2;
_context2.next = 5;
return save();
case 5:
_context2.next = 9;
break;
case 7:
_context2.prev = 7;
_context2.t0 = _context2["catch"](2);
case 9:
case "end":
return _context2.stop();
}
}, _callee2, null, [[2, 7]]);
}));
return function (_x) {
return _ref3.apply(this, arguments);
};
}()),
children: [loading ? /*#__PURE__*/_jsx(LoadingOutlined, {
style: {
marginInlineEnd: 8
}
}) : null, children || '保存']
}, "save");
}
/**
* 删除按钮 dom
*
* @param ActionRenderConfig
*/
export var DeleteEditableAction = function DeleteEditableAction(_ref4) {
var recordKey = _ref4.recordKey,
onDelete = _ref4.onDelete,
preEditRowRef = _ref4.preEditRowRef,
row = _ref4.row,
children = _ref4.children,
deletePopconfirmMessage = _ref4.deletePopconfirmMessage;
var _useMountMergeState3 = useMountMergeState(function () {
return false;
}),
_useMountMergeState4 = _slicedToArray(_useMountMergeState3, 2),
loading = _useMountMergeState4[0],
setLoading = _useMountMergeState4[1];
var _onConfirm = useRefFunction( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
var res;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_context3.prev = 0;
setLoading(true);
_context3.next = 4;
return onDelete === null || onDelete === void 0 ? void 0 : onDelete(recordKey, row);
case 4:
res = _context3.sent;
setLoading(false);
return _context3.abrupt("return", res);
case 9:
_context3.prev = 9;
_context3.t0 = _context3["catch"](0);
// eslint-disable-next-line no-console
console.log(_context3.t0);
setLoading(false);
return _context3.abrupt("return", null);
case 14:
_context3.prev = 14;
if (preEditRowRef) preEditRowRef.current = null;
return _context3.finish(14);
case 17:
case "end":
return _context3.stop();
}
}, _callee3, null, [[0, 9, 14, 17]]);
})));
return children !== false ? /*#__PURE__*/_jsx(Popconfirm, {
title: deletePopconfirmMessage,
onConfirm: function onConfirm() {
return _onConfirm();
},
children: /*#__PURE__*/_jsxs("a", {
children: [loading ? /*#__PURE__*/_jsx(LoadingOutlined, {
style: {
marginInlineEnd: 8
}
}) : null, children || '删除']
})
}, "delete") : null;
};
var CancelEditableAction = function CancelEditableAction(props) {
var recordKey = props.recordKey,
tableName = props.tableName,
newLineConfig = props.newLineConfig,
editorType = props.editorType,
onCancel = props.onCancel,
cancelEditable = props.cancelEditable,
row = props.row,
cancelText = props.cancelText,
preEditRowRef = props.preEditRowRef;
var context = useContext(ProFormContext);
var form = Form.useFormInstance();
return /*#__PURE__*/_jsx("a", {
onClick: ( /*#__PURE__*/function () {
var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(e) {
var _context$getFieldForm2;
var isMapEditor, namePath, fields, record, res, _props$onDelete;
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
e.stopPropagation();
e.preventDefault();
isMapEditor = editorType === 'Map';
namePath = [tableName, recordKey].flat(1).filter(Boolean);
fields = (context === null || context === void 0 || (_context$getFieldForm2 = context.getFieldFormatValue) === null || _context$getFieldForm2 === void 0 ? void 0 : _context$getFieldForm2.call(context, namePath)) || (form === null || form === void 0 ? void 0 : form.getFieldValue(namePath));
record = isMapEditor ? set({}, namePath, fields) : fields;
_context4.next = 8;
return onCancel === null || onCancel === void 0 ? void 0 : onCancel(recordKey, record, row, newLineConfig);
case 8:
res = _context4.sent;
_context4.next = 11;
return cancelEditable(recordKey);
case 11:
if (!((preEditRowRef === null || preEditRowRef === void 0 ? void 0 : preEditRowRef.current) !== null)) {
_context4.next = 15;
break;
}
form.setFieldsValue(set({}, namePath, preEditRowRef === null || preEditRowRef === void 0 ? void 0 : preEditRowRef.current));
_context4.next = 17;
break;
case 15:
_context4.next = 17;
return (_props$onDelete = props.onDelete) === null || _props$onDelete === void 0 ? void 0 : _props$onDelete.call(props, recordKey, row);
case 17:
if (preEditRowRef) preEditRowRef.current = null;
return _context4.abrupt("return", res);
case 19:
case "end":
return _context4.stop();
}
}, _callee4);
}));
return function (_x2) {
return _ref6.apply(this, arguments);
};
}()),
children: cancelText || '取消'
}, "cancel");
};
export function defaultActionRender(row, config) {
var recordKey = config.recordKey,
newLineConfig = config.newLineConfig,
saveText = config.saveText,
deleteText = config.deleteText;
var SaveEditableActionRef = /*#__PURE__*/forwardRef(SaveEditableAction);
var saveRef = /*#__PURE__*/createRef();
return {
save: /*#__PURE__*/_jsx(SaveEditableActionRef, _objectSpread(_objectSpread({}, config), {}, {
row: row,
ref: saveRef,
children: saveText
}), 'save' + recordKey),
saveRef: saveRef,
delete: (newLineConfig === null || newLineConfig === void 0 ? void 0 : newLineConfig.options.recordKey) !== recordKey ? /*#__PURE__*/_jsx(DeleteEditableAction, _objectSpread(_objectSpread({}, config), {}, {
row: row,
children: deleteText
}), 'delete' + recordKey) : undefined,
cancel: /*#__PURE__*/_jsx(CancelEditableAction, _objectSpread(_objectSpread({}, config), {}, {
row: row
}), 'cancel' + recordKey)
};
}
/**
* 一个方便的hooks 用于维护编辑的状态
*
* @param props
*/
export function useEditableArray(props) {
// Internationalization
var intl = useIntl();
/**
* 点击开始编辑之前的保存数据用的
*/
var preEditRowRef = useRef(null);
var _useState = useState(undefined),
_useState2 = _slicedToArray(_useState, 2),
newLineRecordCache = _useState2[0],
setNewLineRecordCache = _useState2[1];
var resetMapRef = function resetMapRef() {
var map = new Map();
//存在children时会覆盖Map的key,导致使用数组索引查找key错误
var loopGetKey = function loopGetKey(dataSource, parentKey) {
dataSource === null || dataSource === void 0 || dataSource.forEach(function (record, index) {
var _recordKeyToString2;
var key = parentKey === undefined || parentKey === null ? index.toString() : parentKey + '_' + index.toString();
map.set(key, recordKeyToString(props.getRowKey(record, -1)));
map.set((_recordKeyToString2 = recordKeyToString(props.getRowKey(record, -1))) === null || _recordKeyToString2 === void 0 ? void 0 : _recordKeyToString2.toString(), key);
if (props.childrenColumnName && record !== null && record !== void 0 && record[props.childrenColumnName]) {
loopGetKey(record[props.childrenColumnName], key);
}
});
};
loopGetKey(props.dataSource);
return map;
};
var initDataSourceKeyIndexMap = useMemo(function () {
return resetMapRef();
}, []);
var dataSourceKeyIndexMapRef = useRef(initDataSourceKeyIndexMap);
var newLineRecordRef = useRef(undefined);
useDeepCompareEffectDebounce(function () {
dataSourceKeyIndexMapRef.current = resetMapRef();
}, [props.dataSource]);
// 这里这么做是为了存上次的状态,不然每次存一下再拿
newLineRecordRef.current = newLineRecordCache;
var editableType = props.type || 'single';
var _useLazyKVMap = useLazyKVMap(props.dataSource, 'children', props.getRowKey),
_useLazyKVMap2 = _slicedToArray(_useLazyKVMap, 1),
getRecordByKey = _useLazyKVMap2[0];
var _useMergedState = useMergedState([], {
value: props.editableKeys,
onChange: props.onChange ? function (keys) {
var _props$onChange, _keys$filter, _keys$map$filter;
props === null || props === void 0 || (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, // 计算编辑的key
(_keys$filter = keys === null || keys === void 0 ? void 0 : keys.filter(function (key) {
return key !== undefined;
})) !== null && _keys$filter !== void 0 ? _keys$filter : [], // 计算编辑的行
(_keys$map$filter = keys === null || keys === void 0 ? void 0 : keys.map(function (key) {
return getRecordByKey(key);
}).filter(function (key) {
return key !== undefined;
})) !== null && _keys$map$filter !== void 0 ? _keys$map$filter : []);
} : undefined
}),
_useMergedState2 = _slicedToArray(_useMergedState, 2),
editableKeys = _useMergedState2[0],
setEditableRowKeys = _useMergedState2[1];
/** 一个用来标志的set 提供了方便的 api 来去重什么的 */
var editableKeysSet = useMemo(function () {
var keys = editableType === 'single' ? editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.slice(0, 1) : editableKeys;
return new Set(keys);
}, [(editableKeys || []).join(','), editableType]);
var editableKeysRef = usePrevious(editableKeys);
/** 这行是不是编辑状态 */
var isEditable = useRefFunction(function (row) {
var _props$getRowKey, _props$getRowKey$toSt, _props$getRowKey2, _props$getRowKey2$toS;
// 为了兼容一下name 模式的 indexKey,所以需要判断两次,一次是index,一次是没有 index 的
var recordKeyOrIndex = (_props$getRowKey = props.getRowKey(row, row.index)) === null || _props$getRowKey === void 0 || (_props$getRowKey$toSt = _props$getRowKey.toString) === null || _props$getRowKey$toSt === void 0 ? void 0 : _props$getRowKey$toSt.call(_props$getRowKey);
// 这里是不设置 index 的地方
var recordKey = (_props$getRowKey2 = props.getRowKey(row, -1)) === null || _props$getRowKey2 === void 0 || (_props$getRowKey2$toS = _props$getRowKey2.toString) === null || _props$getRowKey2$toS === void 0 ? void 0 : _props$getRowKey2$toS.call(_props$getRowKey2);
// 都转化为了字符串,不然 number 和 string
var stringEditableKeys = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.map(function (key) {
return key === null || key === void 0 ? void 0 : key.toString();
});
var stringEditableKeysRef = (editableKeysRef === null || editableKeysRef === void 0 ? void 0 : editableKeysRef.map(function (key) {
return key === null || key === void 0 ? void 0 : key.toString();
})) || [];
var preIsEditable = props.tableName && !!(stringEditableKeysRef !== null && stringEditableKeysRef !== void 0 && stringEditableKeysRef.includes(recordKey)) || !!(stringEditableKeysRef !== null && stringEditableKeysRef !== void 0 && stringEditableKeysRef.includes(recordKeyOrIndex));
return {
recordKey: recordKey,
isEditable: props.tableName && (stringEditableKeys === null || stringEditableKeys === void 0 ? void 0 : stringEditableKeys.includes(recordKey)) || (stringEditableKeys === null || stringEditableKeys === void 0 ? void 0 : stringEditableKeys.includes(recordKeyOrIndex)),
preIsEditable: preIsEditable
};
});
/**
* 进入编辑状态
*
* @param recordKey
*/
var startEditable = useRefFunction(function (recordKey, record) {
var _ref7, _props$dataSource;
// 如果是单行的话,不允许多行编辑
if (editableKeysSet.size > 0 && editableType === 'single' && props.onlyOneLineEditorAlertMessage !== false) {
warning(props.onlyOneLineEditorAlertMessage || intl.getMessage('editableTable.onlyOneLineEditor', '只能同时编辑一行'));
return false;
}
editableKeysSet.add(recordKey);
setEditableRowKeys(Array.from(editableKeysSet));
// 这里是为了存上次的状态,不然取消的时候就丢掉了
preEditRowRef.current = (_ref7 = record !== null && record !== void 0 ? record : (_props$dataSource = props.dataSource) === null || _props$dataSource === void 0 ? void 0 : _props$dataSource.find(function (recordData, index) {
return props.getRowKey(recordData, index) === recordKey;
})) !== null && _ref7 !== void 0 ? _ref7 : null;
return true;
});
/**
* 退出编辑状态
*
* @param recordKey
*/
var cancelEditable = useRefFunction( /*#__PURE__*/function () {
var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(recordKey, needReTry) {
var relayKey, key;
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
relayKey = recordKeyToString(recordKey).toString();
key = dataSourceKeyIndexMapRef.current.get(relayKey);
/** 如果没找到key,转化一下再去找 */
if (!(!editableKeysSet.has(relayKey) && key && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
_context5.next = 5;
break;
}
cancelEditable(key, false);
return _context5.abrupt("return");
case 5:
/** 如果这个是 new Line 直接删除 */
if (newLineRecordCache && newLineRecordCache.options.recordKey === recordKey) {
setNewLineRecordCache(undefined);
}
editableKeysSet.delete(relayKey);
editableKeysSet.delete(recordKeyToString(recordKey));
setEditableRowKeys(Array.from(editableKeysSet));
return _context5.abrupt("return", true);
case 10:
case "end":
return _context5.stop();
}
}, _callee5);
}));
return function (_x3, _x4) {
return _ref8.apply(this, arguments);
};
}());
var propsOnValuesChange = useDebounceFn( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
var _props$onValuesChange;
var _len,
rest,
_key,
_args6 = arguments;
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
for (_len = _args6.length, rest = new Array(_len), _key = 0; _key < _len; _key++) {
rest[_key] = _args6[_key];
}
//@ts-ignore
(_props$onValuesChange = props.onValuesChange) === null || _props$onValuesChange === void 0 || _props$onValuesChange.call.apply(_props$onValuesChange, [props].concat(rest));
case 2:
case "end":
return _context6.stop();
}
}, _callee6);
})), 64);
var onValuesChange = useRefFunction(function (value, values) {
var _Object$keys$pop;
if (!props.onValuesChange) {
return;
}
var dataSource = props.dataSource;
// 这里是把正在编辑中的所有表单数据都修改掉
// 不然会用 props 里面的 dataSource,数据只有正在编辑中的
// Object.keys(get(values, [props.tableName || ''].flat(1)) || values).forEach((recordKey) => {
editableKeys === null || editableKeys === void 0 || editableKeys.forEach(function (eachRecordKey) {
if ((newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.options.recordKey) === eachRecordKey) return;
var recordKey = eachRecordKey.toString();
// 如果数据在这个 form 中没有展示,也不显示
var editRow = get(values, [props.tableName || '', recordKey].flat(1).filter(function (key) {
return key || key === 0;
}));
if (!editRow) return;
dataSource = editableRowByKey({
data: dataSource,
getRowKey: props.getRowKey,
row: editRow,
key: recordKey,
childrenColumnName: props.childrenColumnName || 'children'
}, 'update');
});
var relayValue = value;
var recordKey = (_Object$keys$pop = Object.keys(relayValue || {}).pop()) === null || _Object$keys$pop === void 0 ? void 0 : _Object$keys$pop.toString();
//从form 和 cache 中取得数据
var newLineRecordData = _objectSpread(_objectSpread({}, newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.defaultValue), get(values, [props.tableName || '', recordKey.toString()].flat(1).filter(function (key) {
return key || key === 0;
})));
/** 如果已经在 dataSource 中存在了,直接 find */
var editRow = dataSourceKeyIndexMapRef.current.has(recordKeyToString(recordKey)) ? dataSource.find(function (item, index) {
var _props$getRowKey3;
var key = (_props$getRowKey3 = props.getRowKey(item, index)) === null || _props$getRowKey3 === void 0 ? void 0 : _props$getRowKey3.toString();
return key === recordKey;
}) : newLineRecordData;
propsOnValuesChange.run(editRow || newLineRecordData, dataSource);
});
var saveRefsMap = useRef(new Map());
useEffect(function () {
// 确保只保留编辑状态的,其它的都删除掉
saveRefsMap.current.forEach(function (ref, key) {
if (!editableKeysSet.has(key)) {
saveRefsMap.current.delete(key);
}
});
}, [saveRefsMap, editableKeysSet]);
/**
* 保存编辑行
*
* @param recordKey
* @param needReTry
*/
var saveEditable = useRefFunction( /*#__PURE__*/function () {
var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(recordKey, needReTry) {
var relayKey, key, saveRef, _saveRef$current;
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
relayKey = recordKeyToString(recordKey);
key = dataSourceKeyIndexMapRef.current.get(recordKey.toString());
/** 如果没找到key,转化一下再去找 */
if (!(!editableKeysSet.has(relayKey) && key && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
_context7.next = 6;
break;
}
_context7.next = 5;
return saveEditable(key, false);
case 5:
return _context7.abrupt("return", _context7.sent);
case 6:
saveRef = saveRefsMap.current.get(relayKey) || saveRefsMap.current.get(relayKey.toString());
_context7.prev = 7;
_context7.next = 10;
return saveRef === null || saveRef === void 0 || (_saveRef$current = saveRef.current) === null || _saveRef$current === void 0 ? void 0 : _saveRef$current.save();
case 10:
_context7.next = 15;
break;
case 12:
_context7.prev = 12;
_context7.t0 = _context7["catch"](7);
return _context7.abrupt("return", false);
case 15:
editableKeysSet.delete(relayKey);
editableKeysSet.delete(relayKey.toString());
setEditableRowKeys(Array.from(editableKeysSet));
return _context7.abrupt("return", true);
case 19:
case "end":
return _context7.stop();
}
}, _callee7, null, [[7, 12]]);
}));
return function (_x5, _x6) {
return _ref10.apply(this, arguments);
};
}());
/**
* 同时只能支持一行,取消之后数据消息,不会触发 dataSource
*
* @param row
* @param options
* @name 增加新的行
*/
var addEditRecord = useRefFunction(function (row, options) {
if (options !== null && options !== void 0 && options.parentKey && !dataSourceKeyIndexMapRef.current.has(recordKeyToString(options === null || options === void 0 ? void 0 : options.parentKey).toString())) {
console.warn("can't find record by key", options === null || options === void 0 ? void 0 : options.parentKey);
return false;
}
// 暂时不支持多行新增
if (newLineRecordRef.current && props.onlyAddOneLineAlertMessage !== false) {
warning(props.onlyAddOneLineAlertMessage || intl.getMessage('editableTable.onlyAddOneLine', '只能新增一行'));
return false;
}
// 如果是单行的话,不允许多行编辑
if (editableKeysSet.size > 0 && editableType === 'single' && props.onlyOneLineEditorAlertMessage !== false) {
warning(props.onlyOneLineEditorAlertMessage || intl.getMessage('editableTable.onlyOneLineEditor', '只能同时编辑一行'));
return false;
}
// 防止多次渲染
var recordKey = props.getRowKey(row, -1);
if (!recordKey && recordKey !== 0) {
noteOnce(!!recordKey, '请设置 recordCreatorProps.record 并返回一个唯一的key \n https://procomponents.ant.design/components/editable-table#editable-%E6%96%B0%E5%BB%BA%E8%A1%8C');
throw new Error('请设置 recordCreatorProps.record 并返回一个唯一的key');
}
editableKeysSet.add(recordKey);
setEditableRowKeys(Array.from(editableKeysSet));
// 如果是dataSource 新增模式的话,取消再开始编辑,
// 这样就可以把新增到 dataSource的数据进入编辑模式了
// [a,b,cache] => [a,b,c]
if ((options === null || options === void 0 ? void 0 : options.newRecordType) === 'dataSource' || props.tableName) {
var _recordKeyToString3;
var actionProps = {
data: props.dataSource,
getRowKey: props.getRowKey,
row: _objectSpread(_objectSpread({}, row), {}, {
map_row_parentKey: options !== null && options !== void 0 && options.parentKey ? (_recordKeyToString3 = recordKeyToString(options === null || options === void 0 ? void 0 : options.parentKey)) === null || _recordKeyToString3 === void 0 ? void 0 : _recordKeyToString3.toString() : undefined
}),
key: recordKey,
childrenColumnName: props.childrenColumnName || 'children'
};
props.setDataSource(editableRowByKey(actionProps, (options === null || options === void 0 ? void 0 : options.position) === 'top' ? 'top' : 'update'));
} else {
setNewLineRecordCache({
defaultValue: row,
options: _objectSpread(_objectSpread({}, options), {}, {
recordKey: recordKey
})
});
}
return true;
});
var saveText = (props === null || props === void 0 ? void 0 : props.saveText) || intl.getMessage('editableTable.action.save', '保存');
var deleteText = (props === null || props === void 0 ? void 0 : props.deleteText) || intl.getMessage('editableTable.action.delete', '删除');
var cancelText = (props === null || props === void 0 ? void 0 : props.cancelText) || intl.getMessage('editableTable.action.cancel', '取消');
var actionSaveRef = useRefFunction( /*#__PURE__*/function () {
var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(recordKey, editRow, originRow, newLine) {
var _props$onSave, _recordKeyToString4, _options$parentKey;
var res, _ref12, options, actionProps;
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
while (1) switch (_context8.prev = _context8.next) {
case 0:
_context8.next = 2;
return props === null || props === void 0 || (_props$onSave = props.onSave) === null || _props$onSave === void 0 ? void 0 : _props$onSave.call(props, recordKey, editRow, originRow, newLine);
case 2:
res = _context8.sent;
_context8.next = 5;
return cancelEditable(recordKey);
case 5:
_ref12 = newLine || newLineRecordRef.current || {}, options = _ref12.options;
if (!(!(options !== null && options !== void 0 && options.parentKey) && (options === null || options === void 0 ? void 0 : options.recordKey) === recordKey)) {
_context8.next = 9;
break;
}
if ((options === null || options === void 0 ? void 0 : options.position) === 'top') {
props.setDataSource([editRow].concat(_toConsumableArray(props.dataSource)));
} else {
props.setDataSource([].concat(_toConsumableArray(props.dataSource), [editRow]));
}
return _context8.abrupt("return", res);
case 9:
actionProps = {
data: props.dataSource,
getRowKey: props.getRowKey,
row: options ? _objectSpread(_objectSpread({}, editRow), {}, {
map_row_parentKey: (_recordKeyToString4 = recordKeyToString((_options$parentKey = options === null || options === void 0 ? void 0 : options.parentKey) !== null && _options$parentKey !== void 0 ? _options$parentKey : '')) === null || _recordKeyToString4 === void 0 ? void 0 : _recordKeyToString4.toString()
}) : editRow,
key: recordKey,
childrenColumnName: props.childrenColumnName || 'children'
};
props.setDataSource(editableRowByKey(actionProps, (options === null || options === void 0 ? void 0 : options.position) === 'top' ? 'top' : 'update'));
_context8.next = 13;
return cancelEditable(recordKey);
case 13:
return _context8.abrupt("return", res);
case 14:
case "end":
return _context8.stop();
}
}, _callee8);
}));
return function (_x7, _x8, _x9, _x10) {
return _ref11.apply(this, arguments);
};
}());
var actionDeleteRef = useRefFunction( /*#__PURE__*/function () {
var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(recordKey, editRow) {
var _props$onDelete2;
var actionProps, res;
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
while (1) switch (_context9.prev = _context9.next) {
case 0:
actionProps = {
data: props.dataSource,
getRowKey: props.getRowKey,
row: editRow,
key: recordKey,
childrenColumnName: props.childrenColumnName || 'children'
};
_context9.next = 3;
return props === null || props === void 0 || (_props$onDelete2 = props.onDelete) === null || _props$onDelete2 === void 0 ? void 0 : _props$onDelete2.call(props, recordKey, editRow);
case 3:
res = _context9.sent;
_context9.next = 6;
return cancelEditable(recordKey, false);
case 6:
props.setDataSource(editableRowByKey(actionProps, 'delete'));
return _context9.abrupt("return", res);
case 8:
case "end":
return _context9.stop();
}
}, _callee9);
}));
return function (_x11, _x12) {
return _ref13.apply(this, arguments);
};
}());
var actionCancelRef = useRefFunction( /*#__PURE__*/function () {
var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(recordKey, editRow, originRow, newLine) {
var _props$onCancel;
var res;
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
while (1) switch (_context10.prev = _context10.next) {
case 0:
_context10.next = 2;
return props === null || props === void 0 || (_props$onCancel = props.onCancel) === null || _props$onCancel === void 0 ? void 0 : _props$onCancel.call(props, recordKey, editRow, originRow, newLine);
case 2:
res = _context10.sent;
return _context10.abrupt("return", res);
case 4:
case "end":
return _context10.stop();
}
}, _callee10);
}));
return function (_x13, _x14, _x15, _x16) {
return _ref14.apply(this, arguments);
};
}());
// 如果传入了自定义的actionRender,使用useRefFunction以确保内部的事件处理函数可以访问最新的state
var existCustomActionRender = props.actionRender && typeof props.actionRender === 'function';
var customActionRender = existCustomActionRender ? props.actionRender : function () {};
var customActionRenderRef = useRefFunction(customActionRender);
var actionRender = function actionRender(row) {
var key = props.getRowKey(row, row.index);
var config = {
saveText: saveText,
cancelText: cancelText,
deleteText: deleteText,
addEditRecord: addEditRecord,
recordKey: key,
cancelEditable: cancelEditable,
index: row.index,
tableName: props.tableName,
newLineConfig: newLineRecordCache,
onCancel: actionCancelRef,
onDelete: actionDeleteRef,
onSave: actionSaveRef,
editableKeys: editableKeys,
setEditableRowKeys: setEditableRowKeys,
preEditRowRef: preEditRowRef,
deletePopconfirmMessage: props.deletePopconfirmMessage || "".concat(intl.getMessage('deleteThisLine', '删除此项'), "?")
};
var renderResult = defaultActionRender(row, config);
// 缓存一下saveRef
if (props.tableName) {
saveRefsMap.current.set(dataSourceKeyIndexMapRef.current.get(recordKeyToString(key)) || recordKeyToString(key), renderResult.saveRef);
} else {
saveRefsMap.current.set(recordKeyToString(key), renderResult.saveRef);
}
if (existCustomActionRender) return customActionRenderRef(row, config, {
save: renderResult.save,
delete: renderResult.delete,
cancel: renderResult.cancel
});
return [renderResult.save, renderResult.delete, renderResult.cancel];
};
return {
editableKeys: editableKeys,
setEditableRowKeys: setEditableRowKeys,
isEditable: isEditable,
actionRender: actionRender,
startEditable: startEditable,
cancelEditable: cancelEditable,
addEditRecord: addEditRecord,
saveEditable: saveEditable,
newLineRecord: newLineRecordCache,
preEditableKeys: editableKeysRef,
onValuesChange: onValuesChange,
getRealIndex: props.getRealIndex
};
}