@ant-design/pro-components 3.0.1-0 → 3.1.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/dist/pro-components.min.js +1 -1
  2. package/es/card/ProCard.js +4 -2
  3. package/es/card/components/Actions/style.d.ts +1 -1
  4. package/es/card/components/Card/index.js +8 -4
  5. package/es/card/components/Card/style.d.ts +1 -1
  6. package/es/card/components/CheckCard/index.d.ts +6 -0
  7. package/es/card/components/CheckCard/index.js +2 -1
  8. package/es/card/components/CheckCard/style.d.ts +1 -1
  9. package/es/card/components/Divider/style.d.ts +1 -1
  10. package/es/card/components/Loading/style.d.ts +1 -1
  11. package/es/card/components/Operation/style.d.ts +1 -1
  12. package/es/card/components/Statistic/style.d.ts +1 -1
  13. package/es/card/components/Statistic/style.js +2 -6
  14. package/es/card/components/StatisticCard/index.js +4 -2
  15. package/es/card/components/StatisticCard/style.d.ts +1 -1
  16. package/es/card/typing.d.ts +5 -0
  17. package/es/descriptions/index.js +2 -1
  18. package/es/field/ValueTypeToComponent.js +4 -4
  19. package/es/field/components/Cascader/index.d.ts +0 -1
  20. package/es/field/components/Checkbox/index.d.ts +0 -1
  21. package/es/field/components/ColorPicker/index.d.ts +1 -1
  22. package/es/field/components/Percent/util.d.ts +1 -1
  23. package/es/field/components/Radio/index.d.ts +0 -1
  24. package/es/field/components/Segmented/index.d.ts +0 -1
  25. package/es/field/components/Select/LightSelect/index.js +1 -2
  26. package/es/field/components/Select/SearchSelect/index.d.ts +6 -1
  27. package/es/field/components/Select/SearchSelect/index.js +101 -15
  28. package/es/field/components/Select/index.d.ts +0 -3
  29. package/es/field/components/Select/index.js +5 -3
  30. package/es/field/components/TreeSelect/index.d.ts +0 -1
  31. package/es/form/BaseForm/BaseForm.d.ts +3 -0
  32. package/es/form/BaseForm/BaseForm.js +9 -2
  33. package/es/form/BaseForm/LightWrapper/style.d.ts +1 -1
  34. package/es/form/components/Captcha/index.d.ts +8 -2
  35. package/es/form/components/Captcha/index.js +9 -1
  36. package/es/form/components/DatePicker/BaseDatePicker.js +20 -12
  37. package/es/form/components/DateRangePicker/BaseDateRanger.js +38 -13
  38. package/es/form/components/FormItem/Group/index.js +1 -1
  39. package/es/form/components/FormItem/Group/style.d.ts +1 -1
  40. package/es/form/components/List/index.d.ts +1 -1
  41. package/es/form/components/List/style.d.ts +1 -1
  42. package/es/form/components/SchemaForm/index.js +1 -2
  43. package/es/form/components/Text/index.js +4 -2
  44. package/es/form/components/UploadButton/index.d.ts +1 -1
  45. package/es/form/components/UploadButton/index.js +3 -3
  46. package/es/form/index.d.ts +1 -0
  47. package/es/form/layouts/DrawerForm/index.d.ts +1 -1
  48. package/es/form/layouts/DrawerForm/index.js +3 -2
  49. package/es/form/layouts/DrawerForm/style.d.ts +1 -1
  50. package/es/form/layouts/LightFilter/style.d.ts +1 -1
  51. package/es/form/layouts/LoginForm/index.d.ts +1 -1
  52. package/es/form/layouts/LoginForm/style.d.ts +1 -1
  53. package/es/form/layouts/LoginFormPage/index.d.ts +1 -1
  54. package/es/form/layouts/LoginFormPage/style.d.ts +1 -1
  55. package/es/form/layouts/ModalForm/index.js +2 -1
  56. package/es/form/layouts/ProForm/index.d.ts +1 -1
  57. package/es/form/layouts/QueryFilter/index.d.ts +2 -1
  58. package/es/form/layouts/QueryFilter/style.d.ts +1 -1
  59. package/es/form/layouts/StepsForm/index.js +15 -2
  60. package/es/form/layouts/StepsForm/style.d.ts +1 -1
  61. package/es/layout/components/AppsLogoComponents/index.js +3 -1
  62. package/es/layout/components/AppsLogoComponents/style/index.d.ts +1 -1
  63. package/es/layout/components/CollapsedIcon/style.d.ts +1 -1
  64. package/es/layout/components/FooterToolbar/style/index.d.ts +1 -1
  65. package/es/layout/components/FooterToolbar/style/stylish.d.ts +1 -1
  66. package/es/layout/components/GlobalFooter/index.d.ts +1 -1
  67. package/es/layout/components/GlobalFooter/style.d.ts +1 -1
  68. package/es/layout/components/GlobalHeader/rightContentStyle.d.ts +1 -1
  69. package/es/layout/components/GlobalHeader/style.d.ts +1 -1
  70. package/es/layout/components/GridContent/style.d.ts +1 -1
  71. package/es/layout/components/Header/style/header.d.ts +1 -1
  72. package/es/layout/components/Header/style/stylish.d.ts +1 -1
  73. package/es/layout/components/Help/ProHelpDrawer.d.ts +1 -1
  74. package/es/layout/components/Help/ProHelpDrawer.js +3 -1
  75. package/es/layout/components/Help/ProHelpPopover.js +1 -1
  76. package/es/layout/components/Help/style.d.ts +1 -1
  77. package/es/layout/components/PageContainer/style/index.d.ts +1 -1
  78. package/es/layout/components/PageContainer/style/stylish.d.ts +1 -1
  79. package/es/layout/components/PageHeader/style/index.d.ts +1 -1
  80. package/es/layout/components/SettingDrawer/index.js +2 -2
  81. package/es/layout/components/SettingDrawer/style/index.d.ts +1 -1
  82. package/es/layout/components/SiderMenu/BaseMenu.d.ts +1 -1
  83. package/es/layout/components/SiderMenu/BaseMenu.js +3 -3
  84. package/es/layout/components/SiderMenu/SiderMenu.js +8 -8
  85. package/es/layout/components/SiderMenu/index.js +11 -6
  86. package/es/layout/components/SiderMenu/style/index.d.ts +1 -1
  87. package/es/layout/components/SiderMenu/style/menu.d.ts +1 -1
  88. package/es/layout/components/SiderMenu/style/stylish.d.ts +1 -1
  89. package/es/layout/components/TopNavHeader/style.d.ts +1 -1
  90. package/es/layout/defaultSettings.d.ts +6 -0
  91. package/es/layout/style/index.d.ts +1 -1
  92. package/es/list/style/index.d.ts +1 -1
  93. package/es/provider/index.d.ts +1 -0
  94. package/es/provider/index.js +11 -6
  95. package/es/provider/useStyle/index.d.ts +2 -1
  96. package/es/provider/useStyle/index.js +20 -12
  97. package/es/table/Table.js +412 -280
  98. package/es/table/components/Alert/index.d.ts +1 -1
  99. package/es/table/components/Alert/style.d.ts +1 -1
  100. package/es/table/components/ColumnSetting/index.d.ts +1 -1
  101. package/es/table/components/ColumnSetting/index.js +15 -3
  102. package/es/table/components/ColumnSetting/style.d.ts +1 -1
  103. package/es/table/components/DragSortTable/index.d.ts +1 -1
  104. package/es/table/components/DragSortTable/style.d.ts +1 -1
  105. package/es/table/components/EditableTable/index.js +530 -197
  106. package/es/table/components/ListToolBar/style.d.ts +1 -1
  107. package/es/table/style/index.d.ts +1 -1
  108. package/es/table/typing.d.ts +37 -12
  109. package/es/table/useFetchData.js +8 -13
  110. package/es/table/utils/columnRender.d.ts +1 -1
  111. package/es/table/utils/genProColumnToColumn.d.ts +2 -2
  112. package/es/table/utils/genProColumnToColumn.js +5 -17
  113. package/es/table/utils/index.d.ts +60 -5
  114. package/es/table/utils/index.js +157 -18
  115. package/es/utils/components/DropdownFooter/style.d.ts +1 -1
  116. package/es/utils/components/FieldLabel/style.d.ts +1 -1
  117. package/es/utils/components/FilterDropdown/index.js +1 -1
  118. package/es/utils/components/FilterDropdown/style.d.ts +1 -1
  119. package/es/utils/components/InlineErrorFormItem/style.d.ts +1 -1
  120. package/es/utils/components/LabelIconTip/style.d.ts +1 -1
  121. package/es/utils/conversionMomentValue/index.js +14 -2
  122. package/es/utils/proFieldParsingText/index.js +1 -1
  123. package/es/utils/typing.d.ts +1 -1
  124. package/es/utils/useEditableArray/index.d.ts +3 -6
  125. package/es/utils/useEditableArray/index.js +562 -318
  126. package/es/utils/useEditableMap/index.js +82 -25
  127. package/es/utils/useMediaQuery/query.js +11 -5
  128. package/lib/card/ProCard.js +4 -2
  129. package/lib/card/components/Actions/style.d.ts +1 -1
  130. package/lib/card/components/Card/index.js +8 -4
  131. package/lib/card/components/Card/style.d.ts +1 -1
  132. package/lib/card/components/CheckCard/index.d.ts +6 -0
  133. package/lib/card/components/CheckCard/index.js +2 -1
  134. package/lib/card/components/CheckCard/style.d.ts +1 -1
  135. package/lib/card/components/Divider/style.d.ts +1 -1
  136. package/lib/card/components/Loading/style.d.ts +1 -1
  137. package/lib/card/components/Operation/style.d.ts +1 -1
  138. package/lib/card/components/Statistic/style.d.ts +1 -1
  139. package/lib/card/components/Statistic/style.js +2 -6
  140. package/lib/card/components/StatisticCard/index.js +4 -2
  141. package/lib/card/components/StatisticCard/style.d.ts +1 -1
  142. package/lib/card/typing.d.ts +5 -0
  143. package/lib/descriptions/index.js +2 -1
  144. package/lib/field/ValueTypeToComponent.js +4 -4
  145. package/lib/field/components/Cascader/index.d.ts +0 -1
  146. package/lib/field/components/Checkbox/index.d.ts +0 -1
  147. package/lib/field/components/ColorPicker/index.d.ts +1 -1
  148. package/lib/field/components/Percent/util.d.ts +1 -1
  149. package/lib/field/components/Radio/index.d.ts +0 -1
  150. package/lib/field/components/Segmented/index.d.ts +0 -1
  151. package/lib/field/components/Select/LightSelect/index.js +1 -2
  152. package/lib/field/components/Select/SearchSelect/index.d.ts +6 -1
  153. package/lib/field/components/Select/SearchSelect/index.js +101 -15
  154. package/lib/field/components/Select/index.d.ts +0 -3
  155. package/lib/field/components/Select/index.js +5 -3
  156. package/lib/field/components/TreeSelect/index.d.ts +0 -1
  157. package/lib/form/BaseForm/BaseForm.d.ts +3 -0
  158. package/lib/form/BaseForm/BaseForm.js +9 -2
  159. package/lib/form/BaseForm/LightWrapper/style.d.ts +1 -1
  160. package/lib/form/components/Captcha/index.d.ts +8 -2
  161. package/lib/form/components/Captcha/index.js +9 -1
  162. package/lib/form/components/DatePicker/BaseDatePicker.js +19 -11
  163. package/lib/form/components/DateRangePicker/BaseDateRanger.js +37 -12
  164. package/lib/form/components/Digit/DigitRange.d.ts +1 -1
  165. package/lib/form/components/FormItem/Group/index.js +1 -1
  166. package/lib/form/components/FormItem/Group/style.d.ts +1 -1
  167. package/lib/form/components/List/index.d.ts +1 -1
  168. package/lib/form/components/List/style.d.ts +1 -1
  169. package/lib/form/components/SchemaForm/index.js +1 -2
  170. package/lib/form/components/Text/index.js +4 -2
  171. package/lib/form/components/UploadButton/index.d.ts +1 -1
  172. package/lib/form/components/UploadButton/index.js +3 -3
  173. package/lib/form/index.d.ts +1 -0
  174. package/lib/form/layouts/DrawerForm/index.d.ts +1 -1
  175. package/lib/form/layouts/DrawerForm/index.js +3 -2
  176. package/lib/form/layouts/DrawerForm/style.d.ts +1 -1
  177. package/lib/form/layouts/LightFilter/style.d.ts +1 -1
  178. package/lib/form/layouts/LoginForm/index.d.ts +1 -1
  179. package/lib/form/layouts/LoginForm/style.d.ts +1 -1
  180. package/lib/form/layouts/LoginFormPage/index.d.ts +1 -1
  181. package/lib/form/layouts/LoginFormPage/style.d.ts +1 -1
  182. package/lib/form/layouts/ModalForm/index.js +2 -1
  183. package/lib/form/layouts/ProForm/index.d.ts +2 -2
  184. package/lib/form/layouts/QueryFilter/index.d.ts +2 -1
  185. package/lib/form/layouts/QueryFilter/style.d.ts +1 -1
  186. package/lib/form/layouts/StepsForm/index.js +15 -2
  187. package/lib/form/layouts/StepsForm/style.d.ts +1 -1
  188. package/lib/layout/components/AppsLogoComponents/index.js +3 -1
  189. package/lib/layout/components/AppsLogoComponents/style/index.d.ts +1 -1
  190. package/lib/layout/components/CollapsedIcon/style.d.ts +1 -1
  191. package/lib/layout/components/FooterToolbar/style/index.d.ts +1 -1
  192. package/lib/layout/components/FooterToolbar/style/stylish.d.ts +1 -1
  193. package/lib/layout/components/GlobalFooter/index.d.ts +1 -1
  194. package/lib/layout/components/GlobalFooter/style.d.ts +1 -1
  195. package/lib/layout/components/GlobalHeader/rightContentStyle.d.ts +1 -1
  196. package/lib/layout/components/GlobalHeader/style.d.ts +1 -1
  197. package/lib/layout/components/GridContent/style.d.ts +1 -1
  198. package/lib/layout/components/Header/style/header.d.ts +1 -1
  199. package/lib/layout/components/Header/style/stylish.d.ts +1 -1
  200. package/lib/layout/components/Help/ProHelpDrawer.d.ts +1 -1
  201. package/lib/layout/components/Help/ProHelpDrawer.js +3 -1
  202. package/lib/layout/components/Help/ProHelpPopover.js +1 -1
  203. package/lib/layout/components/Help/style.d.ts +1 -1
  204. package/lib/layout/components/PageContainer/style/index.d.ts +1 -1
  205. package/lib/layout/components/PageContainer/style/stylish.d.ts +1 -1
  206. package/lib/layout/components/PageHeader/style/index.d.ts +1 -1
  207. package/lib/layout/components/SettingDrawer/index.js +2 -2
  208. package/lib/layout/components/SettingDrawer/style/index.d.ts +1 -1
  209. package/lib/layout/components/SiderMenu/BaseMenu.d.ts +1 -1
  210. package/lib/layout/components/SiderMenu/BaseMenu.js +3 -3
  211. package/lib/layout/components/SiderMenu/SiderMenu.js +8 -8
  212. package/lib/layout/components/SiderMenu/index.js +11 -6
  213. package/lib/layout/components/SiderMenu/style/index.d.ts +1 -1
  214. package/lib/layout/components/SiderMenu/style/menu.d.ts +1 -1
  215. package/lib/layout/components/SiderMenu/style/stylish.d.ts +1 -1
  216. package/lib/layout/components/TopNavHeader/style.d.ts +1 -1
  217. package/lib/layout/defaultSettings.d.ts +6 -0
  218. package/lib/layout/style/index.d.ts +1 -1
  219. package/lib/list/style/index.d.ts +1 -1
  220. package/lib/provider/index.d.ts +1 -0
  221. package/lib/provider/index.js +11 -6
  222. package/lib/provider/useStyle/index.d.ts +2 -1
  223. package/lib/provider/useStyle/index.js +20 -12
  224. package/lib/table/Table.js +422 -290
  225. package/lib/table/components/Alert/index.d.ts +1 -1
  226. package/lib/table/components/Alert/style.d.ts +1 -1
  227. package/lib/table/components/ColumnSetting/index.d.ts +1 -1
  228. package/lib/table/components/ColumnSetting/index.js +15 -3
  229. package/lib/table/components/ColumnSetting/style.d.ts +1 -1
  230. package/lib/table/components/DragSortTable/index.d.ts +1 -1
  231. package/lib/table/components/DragSortTable/style.d.ts +1 -1
  232. package/lib/table/components/EditableTable/index.js +529 -196
  233. package/lib/table/components/ListToolBar/style.d.ts +1 -1
  234. package/lib/table/style/index.d.ts +1 -1
  235. package/lib/table/typing.d.ts +37 -12
  236. package/lib/table/useFetchData.js +8 -13
  237. package/lib/table/utils/columnRender.d.ts +1 -1
  238. package/lib/table/utils/genProColumnToColumn.d.ts +2 -2
  239. package/lib/table/utils/genProColumnToColumn.js +4 -16
  240. package/lib/table/utils/index.d.ts +60 -5
  241. package/lib/table/utils/index.js +159 -20
  242. package/lib/utils/components/DropdownFooter/style.d.ts +1 -1
  243. package/lib/utils/components/FieldLabel/style.d.ts +1 -1
  244. package/lib/utils/components/FilterDropdown/index.js +1 -1
  245. package/lib/utils/components/FilterDropdown/style.d.ts +1 -1
  246. package/lib/utils/components/InlineErrorFormItem/style.d.ts +1 -1
  247. package/lib/utils/components/LabelIconTip/style.d.ts +1 -1
  248. package/lib/utils/conversionMomentValue/index.js +14 -2
  249. package/lib/utils/proFieldParsingText/index.js +1 -1
  250. package/lib/utils/typing.d.ts +1 -1
  251. package/lib/utils/useEditableArray/index.d.ts +3 -6
  252. package/lib/utils/useEditableArray/index.js +568 -324
  253. package/lib/utils/useEditableMap/index.js +82 -25
  254. package/lib/utils/useMediaQuery/query.js +10 -4
  255. package/package.json +45 -45
@@ -18,7 +18,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
18
18
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
19
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
20
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
21
- var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
21
+ var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
22
22
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
23
23
  var _icons = require("@ant-design/icons");
24
24
  var _util = require("@rc-component/util");
@@ -34,7 +34,7 @@ var _merge = require("../merge");
34
34
  var _useMountMergeState5 = require("../useMountMergeState");
35
35
  var _jsxRuntime = require("react/jsx-runtime");
36
36
  var _excluded = ["map_row_parentKey"],
37
- _excluded2 = ["map_row_parentKey", "map_row_key"],
37
+ _excluded2 = ["map_row_parentKey", "map_row_key", "isNewRecord"],
38
38
  _excluded3 = ["map_row_key"];
39
39
  /* eslint-disable react-hooks/exhaustive-deps */
40
40
  var noteOnce = _util.warning.noteOnce;
@@ -50,11 +50,132 @@ var recordKeyToString = exports.recordKeyToString = function recordKeyToString(r
50
50
  if (Array.isArray(rowKey)) return rowKey.join(',');
51
51
  return rowKey;
52
52
  };
53
+ /**
54
+ * 扁平化记录树结构为 Map
55
+ */
56
+ function flattenRecordsToMap(records, getRowKey, childrenColumnName, parentKey, parentIndex) {
57
+ var kvMap = new Map();
58
+ records.forEach(function (record, index) {
59
+ var eachIndex = (parentIndex || 0) * 10 + index;
60
+ var recordKey = getRowKey(record, eachIndex).toString();
61
+ var hasChildren = record && (0, _typeof2.default)(record) === 'object' && childrenColumnName in record;
62
+ if (hasChildren) {
63
+ var children = record[childrenColumnName] || [];
64
+ var childrenMap = flattenRecordsToMap(children, getRowKey, childrenColumnName, recordKey, eachIndex);
65
+ childrenMap.forEach(function (value, key) {
66
+ return kvMap.set(key, value);
67
+ });
68
+ }
69
+ var newRecord = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, record), {}, {
70
+ map_row_key: recordKey,
71
+ map_row_parentKey: parentKey
72
+ });
73
+ delete newRecord.children;
74
+ if (!parentKey) {
75
+ delete newRecord.map_row_parentKey;
76
+ }
77
+ kvMap.set(recordKey, newRecord);
78
+ });
79
+ return kvMap;
80
+ }
81
+
82
+ /**
83
+ * 重建树结构
84
+ */
85
+ function rebuildTreeStructure(map, childrenColumnName, action) {
86
+ var childrenMap = new Map();
87
+ var result = [];
88
+ var addNewRecordToChildren = function addNewRecordToChildren(fillChildren) {
89
+ map.forEach(function (value) {
90
+ if (value.map_row_parentKey != null && !value.map_row_key) {
91
+ var map_row_parentKey = value.map_row_parentKey,
92
+ rest = (0, _objectWithoutProperties2.default)(value, _excluded);
93
+ var parentKeyStr = String(map_row_parentKey);
94
+ if (!childrenMap.has(parentKeyStr)) {
95
+ childrenMap.set(parentKeyStr, []);
96
+ }
97
+ if (fillChildren) {
98
+ var _childrenMap$get;
99
+ (_childrenMap$get = childrenMap.get(parentKeyStr)) === null || _childrenMap$get === void 0 || _childrenMap$get.push(rest);
100
+ }
101
+ }
102
+ });
103
+ };
104
+ addNewRecordToChildren(action === 'top');
105
+
106
+ // 第一步:将所有有 parentKey 的节点添加到 childrenMap
107
+ // 这一步不获取 children,只是添加节点到对应的父节点下
108
+ map.forEach(function (value) {
109
+ if (value.map_row_parentKey != null && value.map_row_key) {
110
+ var _ref = value,
111
+ map_row_parentKey = _ref.map_row_parentKey,
112
+ map_row_key = _ref.map_row_key,
113
+ isNewRecord = _ref.isNewRecord,
114
+ rest = (0, _objectWithoutProperties2.default)(_ref, _excluded2);
115
+ var _record = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, rest), {}, {
116
+ map_row_key: map_row_key
117
+ });
118
+ // 确保 parentKey 的类型转换与 flattenRecordsToMap 中的 recordKey 一致
119
+ // 在 flattenRecordsToMap 中,recordKey 被转换为字符串:getRowKey(record, eachIndex).toString()
120
+ // 所以这里也需要确保 parentKey 被转换为字符串,并且类型一致
121
+ var parentKeyStr = map_row_parentKey != null ? String(map_row_parentKey) : null;
122
+ if (!parentKeyStr) {
123
+ return;
124
+ }
125
+ if (!childrenMap.has(parentKeyStr)) {
126
+ childrenMap.set(parentKeyStr, []);
127
+ }
128
+
129
+ // 如果是新记录且 action 为 'top',添加到数组开头;否则添加到末尾
130
+ if (isNewRecord && action === 'top') {
131
+ var _childrenMap$get2;
132
+ (_childrenMap$get2 = childrenMap.get(parentKeyStr)) === null || _childrenMap$get2 === void 0 || _childrenMap$get2.unshift(_record);
133
+ } else {
134
+ var _childrenMap$get3;
135
+ (_childrenMap$get3 = childrenMap.get(parentKeyStr)) === null || _childrenMap$get3 === void 0 || _childrenMap$get3.push(_record);
136
+ }
137
+ }
138
+ });
139
+
140
+ // 第二步:为所有节点获取 children
141
+ // 这一步确保所有子节点都已经被添加到 childrenMap,所以可以正确获取 children
142
+ map.forEach(function (value) {
143
+ if (value.map_row_parentKey != null && value.map_row_key) {
144
+ var _ref2 = value,
145
+ map_row_parentKey = _ref2.map_row_parentKey,
146
+ map_row_key = _ref2.map_row_key;
147
+ var parentKeyStr = map_row_parentKey != null ? String(map_row_parentKey) : null;
148
+ if (!parentKeyStr) {
149
+ return;
150
+ }
151
+ var children = childrenMap.get(parentKeyStr);
152
+ if (children && children.length > 0) {
153
+ // 找到对应的 record 并添加 children
154
+ var recordIndex = children.findIndex(function (r) {
155
+ // 比较时需要确保类型一致
156
+ var recordKey = r.map_row_key || r.id;
157
+ return String(recordKey) === String(map_row_key);
158
+ });
159
+ if (recordIndex >= 0 && childrenMap.has(map_row_key)) {
160
+ children[recordIndex] = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, children[recordIndex]), {}, (0, _defineProperty2.default)({}, childrenColumnName, childrenMap.get(map_row_key)));
161
+ }
162
+ }
163
+ }
164
+ });
165
+ addNewRecordToChildren(action === 'update');
166
+ map.forEach(function (value) {
167
+ if (!value.map_row_parentKey) {
168
+ var map_row_key = value.map_row_key,
169
+ rest = (0, _objectWithoutProperties2.default)(value, _excluded3);
170
+ var _record2 = map_row_key && childrenMap.has(map_row_key) ? (0, _objectSpread4.default)((0, _objectSpread4.default)({}, rest), {}, (0, _defineProperty2.default)({}, childrenColumnName, childrenMap.get(map_row_key))) : rest;
171
+ result.push(_record2);
172
+ }
173
+ });
174
+ return result;
175
+ }
176
+
53
177
  /**
54
178
  * 使用map 来删除数据,性能一般 但是准确率比较高
55
- *
56
- * @param keyProps
57
- * @param action
58
179
  */
59
180
  function editableRowByKey(keyProps, action) {
60
181
  var _recordKeyToString;
@@ -64,95 +185,25 @@ function editableRowByKey(keyProps, action) {
64
185
  _keyProps$childrenCol = keyProps.childrenColumnName,
65
186
  childrenColumnName = _keyProps$childrenCol === void 0 ? 'children' : _keyProps$childrenCol;
66
187
  var key = (_recordKeyToString = recordKeyToString(keyProps.key)) === null || _recordKeyToString === void 0 ? void 0 : _recordKeyToString.toString();
67
- var kvMap = new Map();
68
-
69
- /**
70
- * 打平这个数组
71
- *
72
- * @param records
73
- * @param parentKey
74
- */
75
- function dig(records, map_row_parentKey, map_row_index) {
76
- records.forEach(function (record, index) {
77
- var eachIndex = (map_row_index || 0) * 10 + index;
78
- var recordKey = getRowKey(record, eachIndex).toString();
79
- // children 取在前面方便拼的时候按照反顺序放回去
80
- if (record && (0, _typeof2.default)(record) === 'object' && childrenColumnName in record) {
81
- dig(record[childrenColumnName] || [], recordKey, eachIndex);
82
- }
83
- var newRecord = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, record), {}, {
84
- map_row_key: recordKey,
85
- children: undefined,
86
- map_row_parentKey: map_row_parentKey
87
- });
88
- delete newRecord.children;
89
- if (!map_row_parentKey) {
90
- delete newRecord.map_row_parentKey;
91
- }
92
- kvMap.set(recordKey, newRecord);
93
- });
94
- }
95
- if (action === 'top') {
96
- kvMap.set(key, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, kvMap.get(key)), row));
97
- }
98
- dig(data);
99
- if (action === 'update') {
100
- kvMap.set(key, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, kvMap.get(key)), row));
101
- }
188
+ var kvMap = flattenRecordsToMap(data, getRowKey, childrenColumnName);
102
189
  if (action === 'delete') {
103
190
  kvMap.delete(key);
191
+ } else if (action === 'top' || action === 'update') {
192
+ var existingRecord = kvMap.get(key);
193
+ if (existingRecord) {
194
+ kvMap.set(key, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, existingRecord), row));
195
+ } else {
196
+ // 如果记录不存在,创建一个新记录(用于新增场景)
197
+ // 保留 map_row_parentKey 以便正确处理嵌套子节点
198
+ // 添加标记以便在 rebuildTreeStructure 中识别新记录
199
+ kvMap.set(key, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, row), {}, {
200
+ map_row_key: key,
201
+ map_row_parentKey: row.map_row_parentKey,
202
+ isNewRecord: true
203
+ }));
204
+ }
104
205
  }
105
- var fill = function fill(map) {
106
- var kvArrayMap = new Map();
107
- var kvSource = [];
108
- var fillNewRecord = function fillNewRecord() {
109
- var fillChildren = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
110
- map.forEach(function (value) {
111
- if (value.map_row_parentKey && !value.map_row_key) {
112
- var map_row_parentKey = value.map_row_parentKey,
113
- rest = (0, _objectWithoutProperties2.default)(value, _excluded);
114
- if (!kvArrayMap.has(map_row_parentKey)) {
115
- kvArrayMap.set(map_row_parentKey, []);
116
- }
117
- if (fillChildren) {
118
- var _kvArrayMap$get;
119
- (_kvArrayMap$get = kvArrayMap.get(map_row_parentKey)) === null || _kvArrayMap$get === void 0 || _kvArrayMap$get.push(rest);
120
- }
121
- }
122
- });
123
- };
124
- fillNewRecord(action === 'top');
125
- map.forEach(function (value) {
126
- if (value.map_row_parentKey && value.map_row_key) {
127
- var _kvArrayMap$get2;
128
- var map_row_parentKey = value.map_row_parentKey,
129
- map_row_key = value.map_row_key,
130
- rest = (0, _objectWithoutProperties2.default)(value, _excluded2);
131
- if (kvArrayMap.has(map_row_key)) {
132
- rest[childrenColumnName] = kvArrayMap.get(map_row_key);
133
- }
134
- if (!kvArrayMap.has(map_row_parentKey)) {
135
- kvArrayMap.set(map_row_parentKey, []);
136
- }
137
- (_kvArrayMap$get2 = kvArrayMap.get(map_row_parentKey)) === null || _kvArrayMap$get2 === void 0 || _kvArrayMap$get2.push(rest);
138
- }
139
- });
140
- fillNewRecord(action === 'update');
141
- map.forEach(function (value) {
142
- if (!value.map_row_parentKey) {
143
- var map_row_key = value.map_row_key,
144
- rest = (0, _objectWithoutProperties2.default)(value, _excluded3);
145
- if (map_row_key && kvArrayMap.has(map_row_key)) {
146
- var item = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, rest), {}, (0, _defineProperty2.default)({}, childrenColumnName, kvArrayMap.get(map_row_key)));
147
- kvSource.push(item);
148
- return;
149
- }
150
- kvSource.push(rest);
151
- }
152
- });
153
- return kvSource;
154
- };
155
- return fill(kvMap);
206
+ return rebuildTreeStructure(kvMap, childrenColumnName, action);
156
207
  }
157
208
 
158
209
  /**
@@ -160,14 +211,14 @@ function editableRowByKey(keyProps, action) {
160
211
  *
161
212
  * @param ActionRenderConfig
162
213
  */
163
- function SaveEditableAction(_ref, ref) {
164
- var recordKey = _ref.recordKey,
165
- onSave = _ref.onSave,
166
- row = _ref.row,
167
- children = _ref.children,
168
- newLineConfig = _ref.newLineConfig,
169
- editorType = _ref.editorType,
170
- tableName = _ref.tableName;
214
+ function SaveEditableAction(_ref3, ref) {
215
+ var recordKey = _ref3.recordKey,
216
+ onSave = _ref3.onSave,
217
+ row = _ref3.row,
218
+ children = _ref3.children,
219
+ newLineConfig = _ref3.newLineConfig,
220
+ editorType = _ref3.editorType,
221
+ tableName = _ref3.tableName;
171
222
  var context = (0, _react.useContext)(_ProFormContext.ProFormContext);
172
223
  var form = _antd.Form.useFormInstance();
173
224
  var _useMountMergeState = (0, _useMountMergeState5.useMountMergeState)(false),
@@ -186,11 +237,24 @@ function SaveEditableAction(_ref, ref) {
186
237
  return key === null || key === void 0 ? void 0 : key.toString();
187
238
  }).flat(1).filter(Boolean);
188
239
  setLoading(true);
189
- _context.next = 6;
240
+ _context.prev = 4;
241
+ _context.next = 7;
190
242
  return form.validateFields(namePath, {
191
243
  recursive: true
192
244
  });
193
- case 6:
245
+ case 7:
246
+ _context.next = 13;
247
+ break;
248
+ case 9:
249
+ _context.prev = 9;
250
+ _context.t0 = _context["catch"](4);
251
+ setLoading(false);
252
+ // 重新抛出验证错误,让表单显示错误信息
253
+ // validateFields 抛出错误时,表单会自动设置错误状态并显示错误
254
+ // 错误对象包含 errorFields,表单会根据这些字段显示错误
255
+ // 确保错误被正确传播,这样表单可以正确显示验证错误
256
+ throw _context.t0;
257
+ case 13:
194
258
  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 为数组的情况
195
259
  if (Array.isArray(recordKey) && recordKey.length > 1) {
196
260
  // 获取 namepath
@@ -199,25 +263,25 @@ function SaveEditableAction(_ref, ref) {
199
263
  (0, _util.set)(fields, recordKeyPath, curValue);
200
264
  }
201
265
  data = isMapEditor ? (0, _util.set)({}, namePath, fields) : fields; // 获取数据并保存
202
- _context.next = 11;
266
+ _context.next = 18;
203
267
  return onSave === null || onSave === void 0 ? void 0 : onSave(recordKey,
204
268
  // 如果是 map 模式,fields 就是一个值,所以需要set 到对象中
205
269
  // 数据模式 fields 是一个对象,所以不需要
206
270
  (0, _merge.merge)({}, row, data), row, newLineConfig);
207
- case 11:
271
+ case 18:
208
272
  res = _context.sent;
209
273
  setLoading(false);
210
274
  return _context.abrupt("return", res);
211
- case 16:
212
- _context.prev = 16;
213
- _context.t0 = _context["catch"](0);
275
+ case 23:
276
+ _context.prev = 23;
277
+ _context.t1 = _context["catch"](0);
214
278
  setLoading(false);
215
- throw _context.t0;
216
- case 20:
279
+ throw _context.t1;
280
+ case 27:
217
281
  case "end":
218
282
  return _context.stop();
219
283
  }
220
- }, _callee, null, [[0, 16]]);
284
+ }, _callee, null, [[0, 23], [4, 9]]);
221
285
  })));
222
286
 
223
287
  // 保存数据
@@ -228,7 +292,7 @@ function SaveEditableAction(_ref, ref) {
228
292
  }, [save]);
229
293
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
230
294
  onClick: ( /*#__PURE__*/function () {
231
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee2(e) {
295
+ var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee2(e) {
232
296
  return (0, _regeneratorRuntime2.default)().wrap(function _callee2$(_context2) {
233
297
  while (1) switch (_context2.prev = _context2.next) {
234
298
  case 0:
@@ -250,7 +314,7 @@ function SaveEditableAction(_ref, ref) {
250
314
  }, _callee2, null, [[2, 7]]);
251
315
  }));
252
316
  return function (_x) {
253
- return _ref3.apply(this, arguments);
317
+ return _ref5.apply(this, arguments);
254
318
  };
255
319
  }()),
256
320
  children: [loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.LoadingOutlined, {
@@ -265,20 +329,20 @@ function SaveEditableAction(_ref, ref) {
265
329
  *
266
330
  * @param ActionRenderConfig
267
331
  */
268
- var DeleteEditableAction = exports.DeleteEditableAction = function DeleteEditableAction(_ref4) {
269
- var recordKey = _ref4.recordKey,
270
- onDelete = _ref4.onDelete,
271
- preEditRowRef = _ref4.preEditRowRef,
272
- row = _ref4.row,
273
- children = _ref4.children,
274
- deletePopconfirmMessage = _ref4.deletePopconfirmMessage;
332
+ var DeleteEditableAction = exports.DeleteEditableAction = function DeleteEditableAction(_ref6) {
333
+ var recordKey = _ref6.recordKey,
334
+ onDelete = _ref6.onDelete,
335
+ preEditRowRef = _ref6.preEditRowRef,
336
+ row = _ref6.row,
337
+ children = _ref6.children,
338
+ deletePopconfirmMessage = _ref6.deletePopconfirmMessage;
275
339
  var _useMountMergeState3 = (0, _useMountMergeState5.useMountMergeState)(function () {
276
340
  return false;
277
341
  }),
278
342
  _useMountMergeState4 = (0, _slicedToArray2.default)(_useMountMergeState3, 2),
279
343
  loading = _useMountMergeState4[0],
280
344
  setLoading = _useMountMergeState4[1];
281
- var _onConfirm = (0, _.useRefFunction)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee3() {
345
+ var onConfirm = (0, _.useRefFunction)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee3() {
282
346
  var res;
283
347
  return (0, _regeneratorRuntime2.default)().wrap(function _callee3$(_context3) {
284
348
  while (1) switch (_context3.prev = _context3.next) {
@@ -290,26 +354,34 @@ var DeleteEditableAction = exports.DeleteEditableAction = function DeleteEditabl
290
354
  case 4:
291
355
  res = _context3.sent;
292
356
  setLoading(false);
357
+ // 如果返回 false,阻止删除操作
358
+ if (!(res === false)) {
359
+ _context3.next = 8;
360
+ break;
361
+ }
362
+ return _context3.abrupt("return", false);
363
+ case 8:
293
364
  return _context3.abrupt("return", res);
294
- case 9:
295
- _context3.prev = 9;
365
+ case 11:
366
+ _context3.prev = 11;
296
367
  _context3.t0 = _context3["catch"](0);
297
368
  setLoading(false);
298
369
  return _context3.abrupt("return", null);
299
- case 13:
300
- _context3.prev = 13;
370
+ case 15:
371
+ _context3.prev = 15;
301
372
  if (preEditRowRef) preEditRowRef.current = null;
302
- return _context3.finish(13);
303
- case 16:
373
+ return _context3.finish(15);
374
+ case 18:
304
375
  case "end":
305
376
  return _context3.stop();
306
377
  }
307
- }, _callee3, null, [[0, 9, 13, 16]]);
378
+ }, _callee3, null, [[0, 11, 15, 18]]);
308
379
  })));
309
380
  return children !== false ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Popconfirm, {
310
- title: deletePopconfirmMessage,
311
- onConfirm: function onConfirm() {
312
- return _onConfirm();
381
+ title: deletePopconfirmMessage || '确定要删除这条记录吗?',
382
+ onConfirm: onConfirm,
383
+ getPopupContainer: function getPopupContainer(triggerNode) {
384
+ return triggerNode.parentElement || document.body;
313
385
  },
314
386
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
315
387
  children: [loading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.LoadingOutlined, {
@@ -334,7 +406,7 @@ var CancelEditableAction = function CancelEditableAction(props) {
334
406
  var form = _antd.Form.useFormInstance();
335
407
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
336
408
  onClick: ( /*#__PURE__*/function () {
337
- var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee4(e) {
409
+ var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee4(e) {
338
410
  var _context$getFieldForm2;
339
411
  var isMapEditor, namePath, fields, record, res, _props$onDelete;
340
412
  return (0, _regeneratorRuntime2.default)().wrap(function _callee4$(_context4) {
@@ -373,7 +445,7 @@ var CancelEditableAction = function CancelEditableAction(props) {
373
445
  }, _callee4);
374
446
  }));
375
447
  return function (_x2) {
376
- return _ref6.apply(this, arguments);
448
+ return _ref8.apply(this, arguments);
377
449
  };
378
450
  }()),
379
451
  children: cancelText || '取消'
@@ -387,17 +459,17 @@ function defaultActionRender(row, config) {
387
459
  var SaveEditableActionRef = /*#__PURE__*/(0, _react.forwardRef)(SaveEditableAction);
388
460
  var saveRef = /*#__PURE__*/(0, _react.createRef)();
389
461
  return {
390
- save: /*#__PURE__*/(0, _jsxRuntime.jsx)(SaveEditableActionRef, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, config), {}, {
462
+ save: /*#__PURE__*/(0, _jsxRuntime.jsx)(SaveEditableActionRef, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, config), {}, {
391
463
  row: row,
392
464
  ref: saveRef,
393
465
  children: saveText
394
466
  }), 'save' + recordKey),
395
467
  saveRef: saveRef,
396
- delete: (newLineConfig === null || newLineConfig === void 0 ? void 0 : newLineConfig.options.recordKey) !== recordKey ? /*#__PURE__*/(0, _jsxRuntime.jsx)(DeleteEditableAction, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, config), {}, {
468
+ delete: (newLineConfig === null || newLineConfig === void 0 ? void 0 : newLineConfig.options.recordKey) !== recordKey ? /*#__PURE__*/(0, _jsxRuntime.jsx)(DeleteEditableAction, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, config), {}, {
397
469
  row: row,
398
470
  children: deleteText
399
471
  }), 'delete' + recordKey) : undefined,
400
- cancel: /*#__PURE__*/(0, _jsxRuntime.jsx)(CancelEditableAction, (0, _objectSpread3.default)((0, _objectSpread3.default)({}, config), {}, {
472
+ cancel: /*#__PURE__*/(0, _jsxRuntime.jsx)(CancelEditableAction, (0, _objectSpread4.default)((0, _objectSpread4.default)({}, config), {}, {
401
473
  row: row
402
474
  }), 'cancel' + recordKey)
403
475
  };
@@ -420,30 +492,39 @@ function useEditableArray(props) {
420
492
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
421
493
  newLineRecordCache = _useState2[0],
422
494
  setNewLineRecordCache = _useState2[1];
423
- var resetMapRef = function resetMapRef() {
495
+
496
+ /**
497
+ * 构建数据源 key 索引映射表
498
+ */
499
+ var buildDataSourceKeyIndexMap = (0, _.useRefFunction)(function () {
424
500
  var map = new Map();
425
- //存在children时会覆盖Map的key,导致使用数组索引查找key错误
426
- var loopGetKey = function loopGetKey(dataSource, parentKey) {
427
- dataSource === null || dataSource === void 0 || dataSource.forEach(function (record, index) {
428
- var _recordKeyToString2;
429
- var key = parentKey === undefined || parentKey === null ? index.toString() : parentKey + '_' + index.toString();
430
- map.set(key, recordKeyToString(props.getRowKey(record, -1)));
431
- map.set((_recordKeyToString2 = recordKeyToString(props.getRowKey(record, -1))) === null || _recordKeyToString2 === void 0 ? void 0 : _recordKeyToString2.toString(), key);
432
- if (props.childrenColumnName && record !== null && record !== void 0 && record[props.childrenColumnName]) {
433
- loopGetKey(record[props.childrenColumnName], key);
501
+ var traverseRecords = function traverseRecords(records, parentKey) {
502
+ records === null || records === void 0 || records.forEach(function (record, index) {
503
+ var indexKey = parentKey == null ? index.toString() : "".concat(parentKey, "_").concat(index);
504
+ var recordKey = recordKeyToString(props.getRowKey(record, -1));
505
+
506
+ // 如果 recordKey 是 undefined 或 null,跳过
507
+ if (recordKey == null) {
508
+ return;
509
+ }
510
+ map.set(indexKey, recordKey);
511
+ map.set(recordKey.toString(), indexKey);
512
+ var children = props.childrenColumnName && (record === null || record === void 0 ? void 0 : record[props.childrenColumnName]);
513
+ if (children) {
514
+ traverseRecords(children, indexKey);
434
515
  }
435
516
  });
436
517
  };
437
- loopGetKey(props.dataSource);
518
+ traverseRecords(props.dataSource);
438
519
  return map;
439
- };
520
+ });
440
521
  var initDataSourceKeyIndexMap = (0, _react.useMemo)(function () {
441
- return resetMapRef();
522
+ return buildDataSourceKeyIndexMap();
442
523
  }, []);
443
524
  var dataSourceKeyIndexMapRef = (0, _react.useRef)(initDataSourceKeyIndexMap);
444
525
  var newLineRecordRef = (0, _react.useRef)(undefined);
445
526
  (0, _useDeepCompareEffect.useDeepCompareEffectDebounce)(function () {
446
- dataSourceKeyIndexMapRef.current = resetMapRef();
527
+ dataSourceKeyIndexMapRef.current = buildDataSourceKeyIndexMap();
447
528
  }, [props.dataSource]);
448
529
 
449
530
  // 这里这么做是为了存上次的状态,不然每次存一下再拿
@@ -470,96 +551,205 @@ function useEditableArray(props) {
470
551
  _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
471
552
  editableKeys = _useMergedState2[0],
472
553
  setEditableRowKeys = _useMergedState2[1];
473
-
474
- /** 一个用来标志的set 提供了方便的 api 来去重什么的 */
475
- var editableKeysSet = (0, _react.useMemo)(function () {
476
- var keys = editableType === 'single' ? editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.slice(0, 1) : editableKeys;
477
- return new Set(keys);
478
- }, [(editableKeys || []).join(','), editableType]);
479
554
  var editableKeysRef = (0, _usePrevious.usePrevious)(editableKeys);
480
555
 
556
+ /**
557
+ * 检查 key 是否在编辑列表中
558
+ */
559
+ var checkKeyInEditableList = (0, _.useRefFunction)(function (key, keysList) {
560
+ return keysList.includes(key);
561
+ });
562
+
481
563
  /** 这行是不是编辑状态 */
482
564
  var isEditable = (0, _.useRefFunction)(function (row) {
483
- var _props$getRowKey, _props$getRowKey$toSt, _props$getRowKey2, _props$getRowKey2$toS;
484
- // 为了兼容一下name 模式的 indexKey,所以需要判断两次,一次是index,一次是没有 index
485
- 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);
486
- // 这里是不设置 index 的地方
487
- 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);
488
-
489
- // 都转化为了字符串,不然 number 和 string
490
- var stringEditableKeys = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.map(function (key) {
565
+ var _props$getRowKey, _props$getRowKey2;
566
+ var recordKeyWithIndex = (_props$getRowKey = props.getRowKey(row, row.index)) === null || _props$getRowKey === void 0 ? void 0 : _props$getRowKey.toString();
567
+ var recordKey = (_props$getRowKey2 = props.getRowKey(row, -1)) === null || _props$getRowKey2 === void 0 ? void 0 : _props$getRowKey2.toString();
568
+ var stringEditableKeys = (editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.map(function (key) {
491
569
  return key === null || key === void 0 ? void 0 : key.toString();
492
- });
570
+ })) || [];
493
571
  var stringEditableKeysRef = (editableKeysRef === null || editableKeysRef === void 0 ? void 0 : editableKeysRef.map(function (key) {
494
572
  return key === null || key === void 0 ? void 0 : key.toString();
495
573
  })) || [];
496
- var preIsEditable = props.tableName && !!(stringEditableKeysRef !== null && stringEditableKeysRef !== void 0 && stringEditableKeysRef.includes(recordKey)) || !!(stringEditableKeysRef !== null && stringEditableKeysRef !== void 0 && stringEditableKeysRef.includes(recordKeyOrIndex));
574
+ var preIsEditable = checkKeyInEditableList(recordKey, stringEditableKeysRef) || checkKeyInEditableList(recordKeyWithIndex, stringEditableKeysRef);
497
575
  return {
498
576
  recordKey: recordKey,
499
- isEditable: props.tableName && (stringEditableKeys === null || stringEditableKeys === void 0 ? void 0 : stringEditableKeys.includes(recordKey)) || (stringEditableKeys === null || stringEditableKeys === void 0 ? void 0 : stringEditableKeys.includes(recordKeyOrIndex)),
577
+ isEditable: checkKeyInEditableList(recordKey, stringEditableKeys) || checkKeyInEditableList(recordKeyWithIndex, stringEditableKeys),
500
578
  preIsEditable: preIsEditable
501
579
  };
502
580
  });
503
581
 
504
582
  /**
505
- * 进入编辑状态
506
- *
507
- * @param recordKey
583
+ * 验证是否可以开始编辑
508
584
  */
509
- var startEditable = (0, _.useRefFunction)(function (recordKey, record) {
510
- var _ref7, _props$dataSource;
511
- // 如果是单行的话,不允许多行编辑
512
- if (editableKeysSet.size > 0 && editableType === 'single' && props.onlyOneLineEditorAlertMessage !== false) {
585
+ var validateCanStartEdit = (0, _.useRefFunction)(function () {
586
+ var hasEditableKeys = editableKeys && editableKeys.length > 0;
587
+ if (hasEditableKeys && editableType === 'single' && props.onlyOneLineEditorAlertMessage !== false) {
513
588
  warning(props.onlyOneLineEditorAlertMessage || intl.getMessage('editableTable.onlyOneLineEditor', '只能同时编辑一行'));
514
589
  return false;
515
590
  }
516
- editableKeysSet.add(recordKey);
517
- setEditableRowKeys(Array.from(editableKeysSet));
591
+ return true;
592
+ });
518
593
 
519
- // 这里是为了存上次的状态,不然取消的时候就丢掉了
520
- 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) {
594
+ /**
595
+ * 查找记录
596
+ */
597
+ var findRecordByKey = (0, _.useRefFunction)(function (recordKey) {
598
+ var _props$dataSource$fin, _props$dataSource;
599
+ return (_props$dataSource$fin = (_props$dataSource = props.dataSource) === null || _props$dataSource === void 0 ? void 0 : _props$dataSource.find(function (recordData, index) {
521
600
  return props.getRowKey(recordData, index) === recordKey;
522
- })) !== null && _ref7 !== void 0 ? _ref7 : null;
601
+ })) !== null && _props$dataSource$fin !== void 0 ? _props$dataSource$fin : null;
602
+ });
603
+
604
+ /**
605
+ * 进入编辑状态
606
+ */
607
+ var startEditable = (0, _.useRefFunction)(function (recordKey, record) {
608
+ var _ref9;
609
+ if (!validateCanStartEdit()) {
610
+ return false;
611
+ }
612
+ var isAlreadyEditable = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.some(function (key) {
613
+ return key === recordKey || (key === null || key === void 0 ? void 0 : key.toString()) === (recordKey === null || recordKey === void 0 ? void 0 : recordKey.toString());
614
+ });
615
+ if (!isAlreadyEditable) {
616
+ var newKeys = editableKeys ? [].concat((0, _toConsumableArray2.default)(editableKeys), [recordKey]) : [recordKey];
617
+ setEditableRowKeys(newKeys);
618
+ }
619
+ preEditRowRef.current = (_ref9 = record !== null && record !== void 0 ? record : findRecordByKey(recordKey)) !== null && _ref9 !== void 0 ? _ref9 : null;
523
620
  return true;
524
621
  });
525
622
 
623
+ /**
624
+ * 清理编辑状态
625
+ */
626
+ var clearEditableState = (0, _.useRefFunction)(function (recordKey) {
627
+ var _editableKeys$filter;
628
+ var relayKey = recordKeyToString(recordKey);
629
+ var relayKeyStr = relayKey != null ? relayKey.toString() : null;
630
+ if (relayKeyStr == null) {
631
+ return;
632
+ }
633
+ var newKeys = (_editableKeys$filter = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.filter(function (key) {
634
+ return (key === null || key === void 0 ? void 0 : key.toString()) !== relayKeyStr && key !== relayKey;
635
+ })) !== null && _editableKeys$filter !== void 0 ? _editableKeys$filter : [];
636
+ setEditableRowKeys(newKeys);
637
+ });
638
+
526
639
  /**
527
640
  * 退出编辑状态
528
- *
529
- * @param recordKey
530
641
  */
531
642
  var cancelEditable = (0, _.useRefFunction)( /*#__PURE__*/function () {
532
- var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee5(recordKey, needReTry) {
533
- var relayKey, key;
643
+ var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee5(recordKey, needReTry) {
644
+ var relayKey, relayKeyStr, mappedKey, isInEditableSet, _newLineRecordCache$o, keyForFind, _record3, _originRow, cacheRecordKey, cacheKey, cacheKeyStr, _newLineConfig, _recordKeyToString2, _cacheRecordKey, _cacheKeyStr, originRow, _props$formProps, formRef, _form, namePath, _recordKeyToString3, recordKeyStr;
534
645
  return (0, _regeneratorRuntime2.default)().wrap(function _callee5$(_context5) {
535
646
  while (1) switch (_context5.prev = _context5.next) {
536
647
  case 0:
537
- relayKey = recordKeyToString(recordKey).toString();
538
- key = dataSourceKeyIndexMapRef.current.get(relayKey);
539
- /** 如果没找到key,转化一下再去找 */
540
- if (!(!editableKeysSet.has(relayKey) && key && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
541
- _context5.next = 5;
648
+ relayKey = recordKeyToString(recordKey);
649
+ relayKeyStr = relayKey != null ? relayKey.toString() : null;
650
+ mappedKey = relayKeyStr != null ? dataSourceKeyIndexMapRef.current.get(relayKeyStr) : undefined;
651
+ isInEditableSet = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.some(function (key) {
652
+ if (relayKeyStr == null) return false;
653
+ return (key === null || key === void 0 ? void 0 : key.toString()) === relayKeyStr || key === relayKey;
654
+ });
655
+ if (!(!isInEditableSet && mappedKey && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
656
+ _context5.next = 8;
657
+ break;
658
+ }
659
+ _context5.next = 7;
660
+ return cancelEditable(mappedKey, false);
661
+ case 7:
662
+ return _context5.abrupt("return", _context5.sent);
663
+ case 8:
664
+ if (!(props.onCancel && isInEditableSet)) {
665
+ _context5.next = 24;
542
666
  break;
543
667
  }
544
- cancelEditable(key, false);
545
- return _context5.abrupt("return");
546
- case 5:
547
- /** 如果这个是 new Line 直接删除 */
548
- if (newLineRecordCache && newLineRecordCache.options.recordKey === recordKey) {
549
- setNewLineRecordCache(undefined);
668
+ keyForFind = Array.isArray(recordKey) ? recordKey[0] : recordKey;
669
+ _record3 = findRecordByKey(keyForFind);
670
+ _originRow = preEditRowRef.current; // 比较 recordKey 时需要考虑类型转换
671
+ // newLineRecordCache.options.recordKey addEditRecord 时设置的 recordKey
672
+ // recordKey cancelEditable 的参数,需要确保它们匹配
673
+ cacheRecordKey = newLineRecordCache === null || newLineRecordCache === void 0 || (_newLineRecordCache$o = newLineRecordCache.options) === null || _newLineRecordCache$o === void 0 ? void 0 : _newLineRecordCache$o.recordKey;
674
+ cacheKey = cacheRecordKey != null ? recordKeyToString(cacheRecordKey) : null;
675
+ cacheKeyStr = cacheKey != null ? cacheKey.toString() : null; // 检查 newLineRecordCache 是否匹配当前的 recordKey
676
+ _newLineConfig = newLineRecordCache != null && cacheRecordKey != null && (cacheRecordKey === recordKey || cacheKeyStr != null && relayKeyStr != null && cacheKeyStr === relayKeyStr || (cacheRecordKey === null || cacheRecordKey === void 0 ? void 0 : cacheRecordKey.toString()) === (recordKey === null || recordKey === void 0 ? void 0 : recordKey.toString()) || String(cacheRecordKey) === String(recordKey)) ? newLineRecordCache : undefined; // 调用 onCancel,即使找不到记录(新行编辑场景)
677
+ // 对于新行编辑,record 可能为 null,但 newLineConfig 应该包含 defaultValue
678
+ _context5.prev = 16;
679
+ _context5.next = 19;
680
+ return props.onCancel(recordKey, _record3 || (_newLineConfig === null || _newLineConfig === void 0 ? void 0 : _newLineConfig.defaultValue) || {}, _originRow || _record3 || (_newLineConfig === null || _newLineConfig === void 0 ? void 0 : _newLineConfig.defaultValue) || {}, _newLineConfig);
681
+ case 19:
682
+ _context5.next = 24;
683
+ break;
684
+ case 21:
685
+ _context5.prev = 21;
686
+ _context5.t0 = _context5["catch"](16);
687
+ // 如果 onCancel 抛出异常,仍然继续清理状态
688
+ console.error('onCancel error:', _context5.t0);
689
+ case 24:
690
+ // 清理 newLineRecordCache,需要比较 recordKey(考虑类型转换)
691
+ if (newLineRecordCache) {
692
+ _cacheRecordKey = newLineRecordCache.options.recordKey; // 重用之前计算的 relayKeyStr
693
+ _cacheKeyStr = _cacheRecordKey != null ? (_recordKeyToString2 = recordKeyToString(_cacheRecordKey)) === null || _recordKeyToString2 === void 0 ? void 0 : _recordKeyToString2.toString() : null;
694
+ if (_cacheRecordKey === recordKey || _cacheKeyStr != null && relayKeyStr != null && _cacheKeyStr === relayKeyStr || (_cacheRecordKey === null || _cacheRecordKey === void 0 ? void 0 : _cacheRecordKey.toString()) === (recordKey === null || recordKey === void 0 ? void 0 : recordKey.toString()) || String(_cacheRecordKey) === String(recordKey)) {
695
+ setNewLineRecordCache(undefined);
696
+ }
697
+ }
698
+
699
+ // 先清理 preEditRowRef 并重置表单字段,然后再清除编辑状态
700
+ // 这样在清除编辑状态前,表单字段已经被清除,表格重新渲染时就不会显示输入框
701
+ originRow = preEditRowRef.current;
702
+ if (originRow && props.getRowKey(originRow, -1) === recordKey && isInEditableSet) {
703
+ try {
704
+ // 尝试通过 formProps.formRef 访问 form
705
+ formRef = (_props$formProps = props.formProps) === null || _props$formProps === void 0 ? void 0 : _props$formProps.formRef;
706
+ _form = (formRef === null || formRef === void 0 ? void 0 : formRef.current) || props.form;
707
+ if (_form) {
708
+ if (props.tableName) {
709
+ // name 模式:重置为原始值
710
+ namePath = [props.tableName, recordKey].flat(1).filter(Boolean);
711
+ _form.setFieldsValue((0, _util.set)({}, namePath, originRow));
712
+ } else {
713
+ // 非 name 模式:清除该行的所有表单字段
714
+ // 在非 name 模式下,表单字段路径是 [recordKey, columnDataIndex]
715
+ // 如 [624748504, 'title'],需要清除所有以 recordKey 开头的字段
716
+ recordKeyStr = (_recordKeyToString3 = recordKeyToString(recordKey)) === null || _recordKeyToString3 === void 0 ? void 0 : _recordKeyToString3.toString();
717
+ if (recordKeyStr) {
718
+ try {
719
+ // 在非 name 模式下,表单字段以嵌套对象的形式存储
720
+ // 比如 { '624748504': { 'title': 'value', 'state': 'value' } }
721
+ // 需要清除整个嵌套对象
722
+ // 先使用 resetFields 清除字段状态
723
+ _form.resetFields([[recordKeyStr]]);
724
+
725
+ // 然后使用 setFieldsValue 清除字段值
726
+ // 这样可以确保字段被完全清除,表格重新渲染时不会显示输入框
727
+ _form.setFieldsValue((0, _defineProperty2.default)({}, recordKeyStr, undefined));
728
+ } catch (error) {
729
+ // 如果清除失败,忽略错误
730
+ console.warn('Failed to clear form fields in cancelEditable:', error);
731
+ }
732
+ }
733
+ }
734
+ }
735
+ } catch (error) {
736
+ // 如果访问 form 失败,忽略错误
737
+ console.warn('Failed to reset form fields in cancelEditable:', error);
738
+ }
739
+ preEditRowRef.current = null;
550
740
  }
551
- editableKeysSet.delete(relayKey);
552
- editableKeysSet.delete(recordKeyToString(recordKey));
553
- setEditableRowKeys(Array.from(editableKeysSet));
741
+
742
+ // 最后清除编辑状态,这样表格会重新渲染,输入框会消失
743
+ clearEditableState(recordKey);
554
744
  return _context5.abrupt("return", true);
555
- case 10:
745
+ case 29:
556
746
  case "end":
557
747
  return _context5.stop();
558
748
  }
559
- }, _callee5);
749
+ }, _callee5, null, [[16, 21]]);
560
750
  }));
561
751
  return function (_x3, _x4) {
562
- return _ref8.apply(this, arguments);
752
+ return _ref10.apply(this, arguments);
563
753
  };
564
754
  }());
565
755
  var propsOnValuesChange = (0, _.useDebounceFn)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee6() {
@@ -582,149 +772,199 @@ function useEditableArray(props) {
582
772
  }
583
773
  }, _callee6);
584
774
  })), 64);
585
- var onValuesChange = (0, _.useRefFunction)(function (value, values) {
586
- var _Object$keys$pop;
587
- if (!props.onValuesChange) {
588
- return;
589
- }
590
- var dataSource = props.dataSource;
591
775
 
592
- // 这里是把正在编辑中的所有表单数据都修改掉
593
- // 不然会用 props 里面的 dataSource,数据只有正在编辑中的
594
- // Object.keys(get(values, [props.tableName || ''].flat(1)) || values).forEach((recordKey) => {
776
+ /**
777
+ * 构建表单字段路径
778
+ */
779
+ var buildFormFieldPath = (0, _.useRefFunction)(function (recordKey) {
780
+ return [props.tableName || '', recordKey].flat(1).filter(function (key) {
781
+ return key || key === 0;
782
+ });
783
+ });
784
+
785
+ /**
786
+ * 更新数据源中的编辑行
787
+ */
788
+ var updateDataSourceWithEditableRows = (0, _.useRefFunction)(function (dataSource, values) {
789
+ var updatedDataSource = dataSource;
595
790
  editableKeys === null || editableKeys === void 0 || editableKeys.forEach(function (eachRecordKey) {
596
- if ((newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.options.recordKey) === eachRecordKey) return;
791
+ if ((newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.options.recordKey) === eachRecordKey) {
792
+ return;
793
+ }
597
794
  var recordKey = eachRecordKey.toString();
598
- // 如果数据在这个 form 中没有展示,也不显示
599
- var editRow = (0, _util.get)(values, [props.tableName || '', recordKey].flat(1).filter(function (key) {
600
- return key || key === 0;
601
- }));
602
- if (!editRow) return;
603
- dataSource = editableRowByKey({
604
- data: dataSource,
795
+ var fieldPath = buildFormFieldPath(recordKey);
796
+ var editRow = (0, _util.get)(values, fieldPath);
797
+ if (!editRow) {
798
+ return;
799
+ }
800
+ updatedDataSource = editableRowByKey({
801
+ data: updatedDataSource,
605
802
  getRowKey: props.getRowKey,
606
803
  row: editRow,
607
804
  key: recordKey,
608
805
  childrenColumnName: props.childrenColumnName || 'children'
609
806
  }, 'update');
610
807
  });
611
- var relayValue = value;
612
- var recordKey = (_Object$keys$pop = Object.keys(relayValue || {}).pop()) === null || _Object$keys$pop === void 0 ? void 0 : _Object$keys$pop.toString();
808
+ return updatedDataSource;
809
+ });
613
810
 
614
- //从form 和 cache 中取得数据
615
- var newLineRecordData = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.defaultValue), (0, _util.get)(values, [props.tableName || '', recordKey.toString()].flat(1).filter(function (key) {
616
- return key || key === 0;
617
- })));
618
-
619
- /** 如果已经在 dataSource 中存在了,直接 find */
620
- var editRow = dataSourceKeyIndexMapRef.current.has(recordKeyToString(recordKey)) ? dataSource.find(function (item, index) {
621
- var _props$getRowKey3;
622
- var key = (_props$getRowKey3 = props.getRowKey(item, index)) === null || _props$getRowKey3 === void 0 ? void 0 : _props$getRowKey3.toString();
623
- return key === recordKey;
624
- }) : newLineRecordData;
625
- propsOnValuesChange.run(editRow || newLineRecordData, dataSource);
811
+ /**
812
+ * 获取当前编辑的行数据
813
+ */
814
+ var getCurrentEditRow = (0, _.useRefFunction)(function (value, values, dataSource) {
815
+ var _valueKeys$pop;
816
+ var valueKeys = Object.keys(value || {});
817
+ if (valueKeys.length === 0) {
818
+ return (newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.defaultValue) || {};
819
+ }
820
+ var recordKey = ((_valueKeys$pop = valueKeys.pop()) === null || _valueKeys$pop === void 0 ? void 0 : _valueKeys$pop.toString()) || '';
821
+ if (!recordKey) {
822
+ return (newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.defaultValue) || {};
823
+ }
824
+ var fieldPath = buildFormFieldPath(recordKey);
825
+ var newLineRecordData = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, newLineRecordCache === null || newLineRecordCache === void 0 ? void 0 : newLineRecordCache.defaultValue), (0, _util.get)(values, fieldPath));
826
+ var existsInDataSource = dataSourceKeyIndexMapRef.current.has(recordKeyToString(recordKey));
827
+ if (existsInDataSource) {
828
+ var foundRow = dataSource.find(function (item, index) {
829
+ var _props$getRowKey3;
830
+ var key = (_props$getRowKey3 = props.getRowKey(item, index)) === null || _props$getRowKey3 === void 0 ? void 0 : _props$getRowKey3.toString();
831
+ return key === recordKey;
832
+ });
833
+ return foundRow || newLineRecordData;
834
+ }
835
+ return newLineRecordData;
836
+ });
837
+ var onValuesChange = (0, _.useRefFunction)(function (value, values) {
838
+ if (!props.onValuesChange) {
839
+ return;
840
+ }
841
+ var updatedDataSource = updateDataSourceWithEditableRows(props.dataSource, values);
842
+ var editRow = getCurrentEditRow(value, values, updatedDataSource);
843
+ propsOnValuesChange.run(editRow, updatedDataSource);
626
844
  });
627
845
  var saveRefsMap = (0, _react.useRef)(new Map());
628
846
  (0, _react.useEffect)(function () {
629
- // 确保只保留编辑状态的,其它的都删除掉
847
+ var _editableKeys$map;
848
+ var editableKeysSet = new Set((_editableKeys$map = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.map(function (key) {
849
+ return key === null || key === void 0 ? void 0 : key.toString();
850
+ })) !== null && _editableKeys$map !== void 0 ? _editableKeys$map : []);
630
851
  saveRefsMap.current.forEach(function (ref, key) {
631
- if (!editableKeysSet.has(key)) {
852
+ if (!editableKeysSet.has(key === null || key === void 0 ? void 0 : key.toString())) {
632
853
  saveRefsMap.current.delete(key);
633
854
  }
634
855
  });
635
- }, [saveRefsMap, editableKeysSet]);
856
+ }, [editableKeys]);
857
+
858
+ /**
859
+ * 获取保存引用
860
+ */
861
+ var getSaveRef = (0, _.useRefFunction)(function (recordKey) {
862
+ var relayKey = recordKeyToString(recordKey);
863
+ return saveRefsMap.current.get(relayKey) || saveRefsMap.current.get(relayKey.toString());
864
+ });
865
+
636
866
  /**
637
867
  * 保存编辑行
638
- *
639
- * @param recordKey
640
- * @param needReTry
641
868
  */
642
869
  var saveEditable = (0, _.useRefFunction)( /*#__PURE__*/function () {
643
- var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee7(recordKey, needReTry) {
644
- var relayKey, key, saveRef, _saveRef$current;
870
+ var _ref12 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee7(recordKey, needReTry) {
871
+ var relayKey, relayKeyStr, mappedKey, isInEditableSet, saveRef;
645
872
  return (0, _regeneratorRuntime2.default)().wrap(function _callee7$(_context7) {
646
873
  while (1) switch (_context7.prev = _context7.next) {
647
874
  case 0:
648
875
  relayKey = recordKeyToString(recordKey);
649
- key = dataSourceKeyIndexMapRef.current.get(recordKey.toString());
650
- /** 如果没找到key,转化一下再去找 */
651
- if (!(!editableKeysSet.has(relayKey) && key && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
652
- _context7.next = 6;
876
+ relayKeyStr = relayKey.toString();
877
+ mappedKey = dataSourceKeyIndexMapRef.current.get(relayKeyStr);
878
+ isInEditableSet = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.some(function (key) {
879
+ return (key === null || key === void 0 ? void 0 : key.toString()) === relayKeyStr || key === relayKey;
880
+ });
881
+ if (!(!isInEditableSet && mappedKey && (needReTry !== null && needReTry !== void 0 ? needReTry : true) && props.tableName)) {
882
+ _context7.next = 8;
653
883
  break;
654
884
  }
655
- _context7.next = 5;
656
- return saveEditable(key, false);
657
- case 5:
885
+ _context7.next = 7;
886
+ return saveEditable(mappedKey, false);
887
+ case 7:
658
888
  return _context7.abrupt("return", _context7.sent);
659
- case 6:
660
- saveRef = saveRefsMap.current.get(relayKey) || saveRefsMap.current.get(relayKey.toString());
661
- _context7.prev = 7;
662
- _context7.next = 10;
663
- return saveRef === null || saveRef === void 0 || (_saveRef$current = saveRef.current) === null || _saveRef$current === void 0 ? void 0 : _saveRef$current.save();
664
- case 10:
665
- _context7.next = 15;
666
- break;
667
- case 12:
668
- _context7.prev = 12;
669
- _context7.t0 = _context7["catch"](7);
889
+ case 8:
890
+ saveRef = getSaveRef(recordKey);
891
+ if (saveRef !== null && saveRef !== void 0 && saveRef.current) {
892
+ _context7.next = 11;
893
+ break;
894
+ }
670
895
  return _context7.abrupt("return", false);
671
- case 15:
672
- editableKeysSet.delete(relayKey);
673
- editableKeysSet.delete(relayKey.toString());
674
- setEditableRowKeys(Array.from(editableKeysSet));
896
+ case 11:
897
+ _context7.next = 13;
898
+ return saveRef.current.save();
899
+ case 13:
900
+ clearEditableState(recordKey);
675
901
  return _context7.abrupt("return", true);
676
- case 19:
902
+ case 15:
677
903
  case "end":
678
904
  return _context7.stop();
679
905
  }
680
- }, _callee7, null, [[7, 12]]);
906
+ }, _callee7);
681
907
  }));
682
908
  return function (_x5, _x6) {
683
- return _ref10.apply(this, arguments);
909
+ return _ref12.apply(this, arguments);
684
910
  };
685
911
  }());
686
912
 
687
913
  /**
688
- * 同时只能支持一行,取消之后数据消息,不会触发 dataSource
689
- *
690
- * @param row
691
- * @param options
692
- * @name 增加新的行
914
+ * 验证是否可以新增记录
693
915
  */
694
- var addEditRecord = (0, _.useRefFunction)(function (row, options) {
916
+ var validateCanAddRecord = (0, _.useRefFunction)(function (options) {
695
917
  if (options !== null && options !== void 0 && options.parentKey && !dataSourceKeyIndexMapRef.current.has(recordKeyToString(options === null || options === void 0 ? void 0 : options.parentKey).toString())) {
696
918
  console.warn("can't find record by key", options === null || options === void 0 ? void 0 : options.parentKey);
697
919
  return false;
698
920
  }
699
- // 暂时不支持多行新增
700
921
  if (newLineRecordRef.current && props.onlyAddOneLineAlertMessage !== false) {
701
922
  warning(props.onlyAddOneLineAlertMessage || intl.getMessage('editableTable.onlyAddOneLine', '只能新增一行'));
702
923
  return false;
703
924
  }
704
- // 如果是单行的话,不允许多行编辑
705
- if (editableKeysSet.size > 0 && editableType === 'single' && props.onlyOneLineEditorAlertMessage !== false) {
706
- warning(props.onlyOneLineEditorAlertMessage || intl.getMessage('editableTable.onlyOneLineEditor', '只能同时编辑一行'));
925
+ if (!validateCanStartEdit()) {
707
926
  return false;
708
927
  }
709
- // 防止多次渲染
710
- var recordKey = props.getRowKey(row, -1);
711
- if (!recordKey && recordKey !== 0) {
712
- noteOnce(!!recordKey, '请设置 recordCreatorProps.record 并返回一个唯一的key \n https://procomponents.ant.design/components/editable-table#editable-%E6%96%B0%E5%BB%BA%E8%A1%8C');
928
+ return true;
929
+ });
930
+
931
+ /**
932
+ * 验证记录 key 是否有效
933
+ */
934
+ var validateRecordKey = (0, _.useRefFunction)(function (recordKey) {
935
+ if (recordKey == null && recordKey !== 0 && recordKey !== '') {
936
+ noteOnce(false, '请设置 recordCreatorProps.record 并返回一个唯一的key \n https://procomponents.ant.design/components/editable-table#editable-%E6%96%B0%E5%BB%BA%E8%A1%8C');
713
937
  throw new Error('请设置 recordCreatorProps.record 并返回一个唯一的key');
714
938
  }
715
- editableKeysSet.add(recordKey);
716
- setEditableRowKeys(Array.from(editableKeysSet));
717
-
718
- // 如果是dataSource 新增模式的话,取消再开始编辑,
719
- // 这样就可以把新增到 dataSource的数据进入编辑模式了
720
- // [a,b,cache] => [a,b,c]
721
- if ((options === null || options === void 0 ? void 0 : options.newRecordType) === 'dataSource' || props.tableName) {
722
- var _recordKeyToString3;
939
+ });
940
+
941
+ /**
942
+ * 增加新的行
943
+ */
944
+ var addEditRecord = (0, _.useRefFunction)(function (row, options) {
945
+ if (!validateCanAddRecord(options)) {
946
+ return false;
947
+ }
948
+ var recordKey = props.getRowKey(row, -1);
949
+ validateRecordKey(recordKey);
950
+ var isAlreadyEditable = editableKeys === null || editableKeys === void 0 ? void 0 : editableKeys.some(function (key) {
951
+ return key === recordKey || (key === null || key === void 0 ? void 0 : key.toString()) === (recordKey === null || recordKey === void 0 ? void 0 : recordKey.toString());
952
+ });
953
+ if (!isAlreadyEditable) {
954
+ var newKeys = editableKeys ? [].concat((0, _toConsumableArray2.default)(editableKeys), [recordKey]) : [recordKey];
955
+ setEditableRowKeys(newKeys);
956
+ }
957
+
958
+ // 处理 parentKey:如果是函数,调用它
959
+ var parentKeyValue = typeof (options === null || options === void 0 ? void 0 : options.parentKey) === 'function' ? options.parentKey() : options === null || options === void 0 ? void 0 : options.parentKey;
960
+ var isDataSourceMode = (options === null || options === void 0 ? void 0 : options.newRecordType) === 'dataSource' || props.tableName && (options === null || options === void 0 ? void 0 : options.newRecordType) !== 'cache';
961
+ if (isDataSourceMode) {
962
+ var _recordKeyToString4;
723
963
  var actionProps = {
724
964
  data: props.dataSource,
725
965
  getRowKey: props.getRowKey,
726
- row: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, row), {}, {
727
- 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
966
+ row: (0, _objectSpread4.default)((0, _objectSpread4.default)({}, row), {}, {
967
+ map_row_parentKey: parentKeyValue ? (_recordKeyToString4 = recordKeyToString(parentKeyValue)) === null || _recordKeyToString4 === void 0 ? void 0 : _recordKeyToString4.toString() : undefined
728
968
  }),
729
969
  key: recordKey,
730
970
  childrenColumnName: props.childrenColumnName || 'children'
@@ -733,7 +973,8 @@ function useEditableArray(props) {
733
973
  } else {
734
974
  setNewLineRecordCache({
735
975
  defaultValue: row,
736
- options: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, options), {}, {
976
+ options: (0, _objectSpread4.default)((0, _objectSpread4.default)({}, options), {}, {
977
+ parentKey: parentKeyValue,
737
978
  recordKey: recordKey
738
979
  })
739
980
  });
@@ -744,9 +985,9 @@ function useEditableArray(props) {
744
985
  var deleteText = (props === null || props === void 0 ? void 0 : props.deleteText) || intl.getMessage('editableTable.action.delete', '删除');
745
986
  var cancelText = (props === null || props === void 0 ? void 0 : props.cancelText) || intl.getMessage('editableTable.action.cancel', '取消');
746
987
  var actionSaveRef = (0, _.useRefFunction)( /*#__PURE__*/function () {
747
- var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee8(recordKey, editRow, originRow, newLine) {
748
- var _props$onSave, _recordKeyToString4, _options$parentKey;
749
- var res, _ref12, options, actionProps;
988
+ var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee8(recordKey, editRow, originRow, newLine) {
989
+ var _props$onSave;
990
+ var res, _ref14, options, isNewLine, _recordKeyToString5, _options$parentKey, actionProps;
750
991
  return (0, _regeneratorRuntime2.default)().wrap(function _callee8$(_context8) {
751
992
  while (1) switch (_context8.prev = _context8.next) {
752
993
  case 0:
@@ -754,47 +995,44 @@ function useEditableArray(props) {
754
995
  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);
755
996
  case 2:
756
997
  res = _context8.sent;
757
- _context8.next = 5;
758
- return cancelEditable(recordKey);
759
- case 5:
760
- _ref12 = newLine || newLineRecordRef.current || {}, options = _ref12.options;
761
- if (!(!(options !== null && options !== void 0 && options.parentKey) && (options === null || options === void 0 ? void 0 : options.recordKey) === recordKey)) {
762
- _context8.next = 9;
763
- break;
764
- }
765
- if ((options === null || options === void 0 ? void 0 : options.position) === 'top') {
766
- props.setDataSource([editRow].concat((0, _toConsumableArray2.default)(props.dataSource)));
998
+ _ref14 = newLine || newLineRecordRef.current || {}, options = _ref14.options;
999
+ isNewLine = !(options !== null && options !== void 0 && options.parentKey) && (options === null || options === void 0 ? void 0 : options.recordKey) === recordKey;
1000
+ if (isNewLine) {
1001
+ if ((options === null || options === void 0 ? void 0 : options.position) === 'top') {
1002
+ props.setDataSource([editRow].concat((0, _toConsumableArray2.default)(props.dataSource)));
1003
+ } else {
1004
+ props.setDataSource([].concat((0, _toConsumableArray2.default)(props.dataSource), [editRow]));
1005
+ }
767
1006
  } else {
768
- props.setDataSource([].concat((0, _toConsumableArray2.default)(props.dataSource), [editRow]));
1007
+ actionProps = {
1008
+ data: props.dataSource,
1009
+ getRowKey: props.getRowKey,
1010
+ row: options ? (0, _objectSpread4.default)((0, _objectSpread4.default)({}, editRow), {}, {
1011
+ map_row_parentKey: (_recordKeyToString5 = recordKeyToString((_options$parentKey = options === null || options === void 0 ? void 0 : options.parentKey) !== null && _options$parentKey !== void 0 ? _options$parentKey : '')) === null || _recordKeyToString5 === void 0 ? void 0 : _recordKeyToString5.toString()
1012
+ }) : editRow,
1013
+ key: recordKey,
1014
+ childrenColumnName: props.childrenColumnName || 'children'
1015
+ };
1016
+ props.setDataSource(editableRowByKey(actionProps, (options === null || options === void 0 ? void 0 : options.position) === 'top' ? 'top' : 'update'));
769
1017
  }
770
- return _context8.abrupt("return", res);
771
- case 9:
772
- actionProps = {
773
- data: props.dataSource,
774
- getRowKey: props.getRowKey,
775
- row: options ? (0, _objectSpread3.default)((0, _objectSpread3.default)({}, editRow), {}, {
776
- 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()
777
- }) : editRow,
778
- key: recordKey,
779
- childrenColumnName: props.childrenColumnName || 'children'
780
- };
781
- props.setDataSource(editableRowByKey(actionProps, (options === null || options === void 0 ? void 0 : options.position) === 'top' ? 'top' : 'update'));
782
- _context8.next = 13;
1018
+
1019
+ // 保存时解除编辑模式,统一在这里调用一次
1020
+ _context8.next = 8;
783
1021
  return cancelEditable(recordKey);
784
- case 13:
1022
+ case 8:
785
1023
  return _context8.abrupt("return", res);
786
- case 14:
1024
+ case 9:
787
1025
  case "end":
788
1026
  return _context8.stop();
789
1027
  }
790
1028
  }, _callee8);
791
1029
  }));
792
1030
  return function (_x7, _x8, _x9, _x10) {
793
- return _ref11.apply(this, arguments);
1031
+ return _ref13.apply(this, arguments);
794
1032
  };
795
1033
  }());
796
1034
  var actionDeleteRef = (0, _.useRefFunction)( /*#__PURE__*/function () {
797
- var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee9(recordKey, editRow) {
1035
+ var _ref15 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee9(recordKey, editRow) {
798
1036
  var _props$onDelete2;
799
1037
  var actionProps, res;
800
1038
  return (0, _regeneratorRuntime2.default)().wrap(function _callee9$(_context9) {
@@ -811,23 +1049,29 @@ function useEditableArray(props) {
811
1049
  return props === null || props === void 0 || (_props$onDelete2 = props.onDelete) === null || _props$onDelete2 === void 0 ? void 0 : _props$onDelete2.call(props, recordKey, editRow);
812
1050
  case 3:
813
1051
  res = _context9.sent;
814
- _context9.next = 6;
815
- return cancelEditable(recordKey, false);
1052
+ if (!(res === false)) {
1053
+ _context9.next = 6;
1054
+ break;
1055
+ }
1056
+ return _context9.abrupt("return", false);
816
1057
  case 6:
1058
+ _context9.next = 8;
1059
+ return cancelEditable(recordKey, false);
1060
+ case 8:
817
1061
  props.setDataSource(editableRowByKey(actionProps, 'delete'));
818
1062
  return _context9.abrupt("return", res);
819
- case 8:
1063
+ case 10:
820
1064
  case "end":
821
1065
  return _context9.stop();
822
1066
  }
823
1067
  }, _callee9);
824
1068
  }));
825
1069
  return function (_x11, _x12) {
826
- return _ref13.apply(this, arguments);
1070
+ return _ref15.apply(this, arguments);
827
1071
  };
828
1072
  }());
829
1073
  var actionCancelRef = (0, _.useRefFunction)( /*#__PURE__*/function () {
830
- var _ref14 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee10(recordKey, editRow, originRow, newLine) {
1074
+ var _ref16 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee10(recordKey, editRow, originRow, newLine) {
831
1075
  var _props$onCancel;
832
1076
  var res;
833
1077
  return (0, _regeneratorRuntime2.default)().wrap(function _callee10$(_context10) {
@@ -845,7 +1089,7 @@ function useEditableArray(props) {
845
1089
  }, _callee10);
846
1090
  }));
847
1091
  return function (_x13, _x14, _x15, _x16) {
848
- return _ref14.apply(this, arguments);
1092
+ return _ref16.apply(this, arguments);
849
1093
  };
850
1094
  }());
851
1095