@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
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = void 0;
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
13
  var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
13
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
15
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
@@ -19,10 +20,11 @@ var _react = _interopRequireWildcard(require("react"));
19
20
  var _form = _interopRequireWildcard(require("../../../form"));
20
21
  var _provider = require("../../../provider");
21
22
  var _utils = require("../../../utils");
23
+ var _useEditableArray = require("../../../utils/useEditableArray");
22
24
  var _Table = _interopRequireDefault(require("../../Table"));
23
25
  var _jsxRuntime = require("react/jsx-runtime");
24
- var _excluded = ["onTableChange", "maxLength", "formItemProps", "recordCreatorProps", "rowKey", "controlled", "defaultValue", "onChange", "editableFormRef"],
25
- _excluded2 = ["record", "position", "creatorButtonText", "newRecordType", "parentKey", "style"];
26
+ var _excluded = ["record", "position", "creatorButtonText", "newRecordType", "parentKey", "style"],
27
+ _excluded2 = ["onTableChange", "maxLength", "formItemProps", "recordCreatorProps", "rowKey", "controlled", "defaultValue", "onChange", "editableFormRef"];
26
28
  var EditableTableActionContext = /*#__PURE__*/_react.default.createContext(undefined);
27
29
 
28
30
  /** 可编辑表格的按钮 */
@@ -36,7 +38,7 @@ function RecordCreator(props) {
36
38
  return /*#__PURE__*/_react.default.cloneElement(children, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, children.props), {}, {
37
39
  onClick: function () {
38
40
  var _onClick = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(e) {
39
- var _children$props$onCli, _children$props, _actionRef$current;
41
+ var _children$props$onCli, _children$props;
40
42
  var isOk;
41
43
  return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
42
44
  while (1) switch (_context.prev = _context.next) {
@@ -51,11 +53,13 @@ function RecordCreator(props) {
51
53
  }
52
54
  return _context.abrupt("return");
53
55
  case 5:
54
- actionRef === null || actionRef === void 0 || (_actionRef$current = actionRef.current) === null || _actionRef$current === void 0 || _actionRef$current.addEditRecord(record, {
55
- position: position,
56
- newRecordType: newRecordType,
57
- parentKey: parentKey
58
- });
56
+ if (actionRef !== null && actionRef !== void 0 && actionRef.current) {
57
+ actionRef.current.addEditRecord(record, {
58
+ position: position,
59
+ newRecordType: newRecordType,
60
+ parentKey: parentKey
61
+ });
62
+ }
59
63
  case 6:
60
64
  case "end":
61
65
  return _context.stop();
@@ -70,13 +74,195 @@ function RecordCreator(props) {
70
74
  }));
71
75
  }
72
76
 
77
+ /**
78
+ * 处理嵌套行的新增
79
+ */
80
+ function handleNestedRowInsert(baseData, defaultValue, newLineOptions, getRowKey, childrenColumnName) {
81
+ var _recordKeyToString;
82
+ if (!newLineOptions.recordKey) {
83
+ return baseData;
84
+ }
85
+ var actionProps = {
86
+ data: baseData,
87
+ getRowKey: getRowKey,
88
+ row: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultValue), {}, {
89
+ map_row_parentKey: (_recordKeyToString = (0, _useEditableArray.recordKeyToString)(newLineOptions.parentKey)) === null || _recordKeyToString === void 0 ? void 0 : _recordKeyToString.toString()
90
+ }),
91
+ key: newLineOptions.recordKey,
92
+ childrenColumnName: childrenColumnName
93
+ };
94
+ return (0, _useEditableArray.editableRowByKey)(actionProps, newLineOptions.position === 'top' ? 'top' : 'update');
95
+ }
96
+
97
+ /**
98
+ * 处理分页场景下的新增
99
+ */
100
+ function handlePaginationInsert(baseData, defaultValue, pageConfig) {
101
+ if (pageConfig.pageSize > baseData.length) {
102
+ return [].concat((0, _toConsumableArray2.default)(baseData), [defaultValue]);
103
+ }
104
+ var insertIndex = pageConfig.current * pageConfig.pageSize - 1;
105
+ var result = (0, _toConsumableArray2.default)(baseData);
106
+ result.splice(insertIndex, 0, defaultValue);
107
+ return result;
108
+ }
109
+ function useEditableDataSource(_ref) {
110
+ var actionDataSource = _ref.actionDataSource,
111
+ editableUtils = _ref.editableUtils,
112
+ pagination = _ref.pagination,
113
+ getRowKey = _ref.getRowKey,
114
+ childrenColumnName = _ref.childrenColumnName;
115
+ return (0, _react.useMemo)(function () {
116
+ var newLineConfig = editableUtils === null || editableUtils === void 0 ? void 0 : editableUtils.newLineRecord;
117
+ var baseData = Array.isArray(actionDataSource) ? (0, _toConsumableArray2.default)(actionDataSource) : [];
118
+ if (!(newLineConfig !== null && newLineConfig !== void 0 && newLineConfig.defaultValue)) {
119
+ return baseData;
120
+ }
121
+ var newLineOptions = newLineConfig.options,
122
+ defaultValue = newLineConfig.defaultValue;
123
+ if (newLineOptions !== null && newLineOptions !== void 0 && newLineOptions.parentKey) {
124
+ return handleNestedRowInsert(baseData, defaultValue, newLineOptions, getRowKey, childrenColumnName || 'children');
125
+ }
126
+ if ((newLineOptions === null || newLineOptions === void 0 ? void 0 : newLineOptions.position) === 'top') {
127
+ return [defaultValue].concat((0, _toConsumableArray2.default)(baseData));
128
+ }
129
+ var pageConfig = pagination && (0, _typeof2.default)(pagination) === 'object' ? pagination : undefined;
130
+ if (pageConfig !== null && pageConfig !== void 0 && pageConfig.current && pageConfig !== null && pageConfig !== void 0 && pageConfig.pageSize) {
131
+ return handlePaginationInsert(baseData, defaultValue, pageConfig);
132
+ }
133
+ return [].concat((0, _toConsumableArray2.default)(baseData), [defaultValue]);
134
+ }, [actionDataSource, childrenColumnName, editableUtils === null || editableUtils === void 0 ? void 0 : editableUtils.newLineRecord, getRowKey, pagination]);
135
+ }
136
+
137
+ /**
138
+ * 检查是否应该显示创建按钮
139
+ */
140
+ function shouldShowCreatorButton(maxLength, valueLength, recordCreatorProps) {
141
+ if (typeof maxLength === 'number' && maxLength <= valueLength) {
142
+ return false;
143
+ }
144
+ return recordCreatorProps !== false;
145
+ }
146
+
147
+ /**
148
+ * 创建按钮 DOM
149
+ */
150
+ function createButtonDom(recordCreatorProps, value, intl) {
151
+ var record = recordCreatorProps.record,
152
+ position = recordCreatorProps.position,
153
+ creatorButtonText = recordCreatorProps.creatorButtonText,
154
+ newRecordType = recordCreatorProps.newRecordType,
155
+ parentKey = recordCreatorProps.parentKey,
156
+ style = recordCreatorProps.style,
157
+ restButtonProps = (0, _objectWithoutProperties2.default)(recordCreatorProps, _excluded);
158
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(RecordCreator, {
159
+ record: (0, _utils.runFunction)(record, value === null || value === void 0 ? void 0 : value.length, value) || {},
160
+ position: position,
161
+ parentKey: (0, _utils.runFunction)(parentKey, value === null || value === void 0 ? void 0 : value.length, value),
162
+ newRecordType: newRecordType,
163
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Button, (0, _objectSpread2.default)((0, _objectSpread2.default)({
164
+ type: "dashed",
165
+ style: (0, _objectSpread2.default)({
166
+ display: 'block',
167
+ margin: '10px 0',
168
+ width: '100%'
169
+ }, style),
170
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.PlusOutlined, {})
171
+ }, restButtonProps), {}, {
172
+ children: creatorButtonText || intl.getMessage('editableTable.action.add', '添加一行数据')
173
+ }))
174
+ });
175
+ }
176
+
177
+ /**
178
+ * 创建顶部按钮的渲染属性
179
+ */
180
+ function createTopButtonProps(creatorButtonDom, columnsLength) {
181
+ return {
182
+ components: {
183
+ header: {
184
+ wrapper: function wrapper(_ref2) {
185
+ var className = _ref2.className,
186
+ children = _ref2.children;
187
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("thead", {
188
+ className: className,
189
+ children: [children, /*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
190
+ style: {
191
+ position: 'relative'
192
+ },
193
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
194
+ colSpan: 0,
195
+ style: {
196
+ visibility: 'hidden'
197
+ },
198
+ children: creatorButtonDom
199
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
200
+ style: {
201
+ position: 'absolute',
202
+ left: 0,
203
+ width: '100%'
204
+ },
205
+ colSpan: columnsLength,
206
+ children: creatorButtonDom
207
+ })]
208
+ })]
209
+ });
210
+ }
211
+ }
212
+ }
213
+ };
214
+ }
215
+
216
+ /**
217
+ * 创建底部按钮的渲染属性
218
+ */
219
+ function createBottomButtonProps(creatorButtonDom, _tableViewRender) {
220
+ return {
221
+ tableViewRender: function tableViewRender(_, dom) {
222
+ var _tableViewRender2;
223
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
224
+ children: [(_tableViewRender2 = _tableViewRender === null || _tableViewRender === void 0 ? void 0 : _tableViewRender(_, dom)) !== null && _tableViewRender2 !== void 0 ? _tableViewRender2 : dom, creatorButtonDom]
225
+ });
226
+ }
227
+ };
228
+ }
229
+ function useCreatorButton(_ref3) {
230
+ var recordCreatorProps = _ref3.recordCreatorProps,
231
+ maxLength = _ref3.maxLength,
232
+ value = _ref3.value,
233
+ intl = _ref3.intl,
234
+ isTop = _ref3.isTop,
235
+ columnsLength = _ref3.columnsLength,
236
+ tableViewRender = _ref3.tableViewRender;
237
+ var creatorButtonDom = (0, _react.useMemo)(function () {
238
+ if (!shouldShowCreatorButton(maxLength, (value === null || value === void 0 ? void 0 : value.length) || 0, recordCreatorProps)) {
239
+ return false;
240
+ }
241
+ if (!recordCreatorProps) {
242
+ return false;
243
+ }
244
+ return createButtonDom(recordCreatorProps, value, intl);
245
+ // eslint-disable-next-line react-hooks/exhaustive-deps
246
+ }, [maxLength, recordCreatorProps, value === null || value === void 0 ? void 0 : value.length, intl]);
247
+ var buttonRenderProps = (0, _react.useMemo)(function () {
248
+ if (!creatorButtonDom) {
249
+ return {};
250
+ }
251
+ return isTop ? createTopButtonProps(creatorButtonDom, columnsLength) : createBottomButtonProps(creatorButtonDom, tableViewRender);
252
+ }, [columnsLength, creatorButtonDom, isTop, tableViewRender]);
253
+ return {
254
+ creatorButtonDom: creatorButtonDom,
255
+ buttonRenderProps: buttonRenderProps
256
+ };
257
+ }
258
+
73
259
  /**
74
260
  * 可以直接放到 Form 中的可编辑表格
75
261
  * A React component that is used to create a table.
76
262
  * @param props
77
263
  */
78
264
  function EditableTable(props) {
79
- var _props$editable2, _props$editable4;
265
+ var _props$editable2, _rest$columns;
80
266
  var intl = (0, _provider.useIntl)();
81
267
  var onTableChange = props.onTableChange,
82
268
  maxLength = props.maxLength,
@@ -87,20 +273,40 @@ function EditableTable(props) {
87
273
  defaultValue = props.defaultValue,
88
274
  onChange = props.onChange,
89
275
  editableFormRef = props.editableFormRef,
90
- rest = (0, _objectWithoutProperties2.default)(props, _excluded);
276
+ rest = (0, _objectWithoutProperties2.default)(props, _excluded2);
91
277
  var preData = (0, _react.useRef)(undefined);
92
278
  var actionRef = (0, _react.useRef)();
93
279
  var formRef = (0, _react.useRef)();
280
+ var form = _antd.Form.useFormInstance();
94
281
 
95
282
  // 设置 ref
96
283
  (0, _react.useImperativeHandle)(rest.actionRef, function () {
97
284
  return actionRef.current;
98
285
  }, [actionRef.current]);
99
- var _useMergedState = (0, _util.useMergedState)(function () {
100
- return props.value || defaultValue || [];
101
- }, {
286
+
287
+ // name 模式下,如果没有传递 value prop,尝试从表单值中获取初始值
288
+ var getInitialValue = function getInitialValue() {
289
+ if (props.value) {
290
+ return props.value;
291
+ }
292
+ if (defaultValue) {
293
+ return defaultValue;
294
+ }
295
+ // 如果使用了 name 且没有 value,尝试从表单获取初始值
296
+ if (props.name && form) {
297
+ var namePath = [props.name].flat(1).filter(Boolean);
298
+ var formValue = form.getFieldValue(namePath);
299
+ if (Array.isArray(formValue)) {
300
+ return formValue;
301
+ }
302
+ }
303
+ return [];
304
+ };
305
+ var _useMergedState = (0, _util.useMergedState)(getInitialValue, {
102
306
  value: props.value,
103
- onChange: props.onChange
307
+ // 在非受控模式下,onChange 应该在 onDataSourceChange 中触发
308
+ // 这样可以确保数据已经正确更新
309
+ onChange: props.controlled ? props.onChange : undefined
104
310
  }),
105
311
  _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
106
312
  value = _useMergedState2[0],
@@ -115,207 +321,305 @@ function EditableTable(props) {
115
321
  }, [rowKey]);
116
322
 
117
323
  /**
118
- * 根据不同的情况返回不同的 rowKey
119
- * @param finlayRowKey
120
- * @returns string | number
324
+ * 创建编辑 keys 的 Set,用于快速查找
121
325
  */
122
- var coverRowKey = (0, _utils.useRefFunction)(function (finlayRowKey) {
123
- /**
124
- * 如果是 prop.name 的模式,就需要把行号转化成具体的rowKey。
125
- */
126
- if (typeof finlayRowKey === 'number' && !props.name) {
127
- if (finlayRowKey >= value.length) return finlayRowKey;
128
- var rowData = value && value[finlayRowKey];
129
- return getRowKey === null || getRowKey === void 0 ? void 0 : getRowKey(rowData, finlayRowKey);
326
+ var createEditingKeysSet = (0, _utils.useRefFunction)(function (editingKeys) {
327
+ return new Set((editingKeys || []).map(function (key) {
328
+ return String(key);
329
+ }));
330
+ });
331
+
332
+ /**
333
+ * 同步表单值,排除正在编辑的行
334
+ */
335
+ var syncFormValuesExcludingEditing = (0, _utils.useRefFunction)(function (dataSource, editingKeysSet, namePath) {
336
+ if (!formRef.current) return;
337
+ try {
338
+ if (namePath && namePath.length > 0) {
339
+ // name 模式:需要保留正在编辑的行
340
+ var currentFormValues = formRef.current.getFieldsValue() || {};
341
+ var currentList = (0, _util.get)(currentFormValues, namePath);
342
+ if (currentList && Array.isArray(currentList)) {
343
+ // 构建新的表单值,保留正在编辑的行
344
+ // 使用 Map 优化查找性能,将 O(n²) 降低到 O(n)
345
+ var currentListMap = new Map();
346
+ currentList.forEach(function (item, idx) {
347
+ var key = getRowKey(item, idx);
348
+ currentListMap.set(String(key), item);
349
+ });
350
+ var newList = dataSource.map(function (item, index) {
351
+ var key = getRowKey(item, index);
352
+ var keyStr = String(key);
353
+
354
+ // 如果该行正在编辑,保留表单中的值
355
+ if (editingKeysSet.has(keyStr)) {
356
+ return currentListMap.get(keyStr) || item;
357
+ }
358
+ return item;
359
+ });
360
+ var newValue = (0, _util.set)({}, namePath, newList);
361
+ formRef.current.setFieldsValue(newValue);
362
+ } else {
363
+ var _newValue = (0, _util.set)({}, namePath, dataSource);
364
+ formRef.current.setFieldsValue(_newValue);
365
+ }
366
+ } else {
367
+ // 非 name 模式:直接设置值
368
+ var formValues = {};
369
+ dataSource.forEach(function (current, index) {
370
+ var key = getRowKey(current, index);
371
+ var keyStr = String(key);
372
+ if (!editingKeysSet.has(keyStr)) {
373
+ formValues[keyStr] = current;
374
+ }
375
+ });
376
+ if (Object.keys(formValues).length > 0) {
377
+ formRef.current.setFieldsValue(formValues);
378
+ }
379
+ }
380
+ } catch (error) {
381
+ console.warn('Failed to sync form values:', error);
130
382
  }
383
+ });
131
384
 
132
- /**
133
- * 如果是 prop.name 的模式,就直接返回行号
134
- */
135
- if ((typeof finlayRowKey === 'string' || finlayRowKey >= value.length) && props.name) {
385
+ /**
386
+ * 将数字索引转换为实际的 rowKey(非 name 模式)
387
+ */
388
+ var convertIndexToRowKey = (0, _utils.useRefFunction)(function (index) {
389
+ var _value$length;
390
+ var dataLength = (_value$length = value === null || value === void 0 ? void 0 : value.length) !== null && _value$length !== void 0 ? _value$length : 0;
391
+ if (index >= dataLength) return index;
392
+ var rowData = value === null || value === void 0 ? void 0 : value[index];
393
+ return getRowKey === null || getRowKey === void 0 ? void 0 : getRowKey(rowData, index);
394
+ });
395
+
396
+ /**
397
+ * 将 rowKey 转换为数字索引(name 模式)
398
+ */
399
+ var convertRowKeyToIndex = (0, _utils.useRefFunction)(function (rowKey) {
400
+ var _value$length2;
401
+ var dataLength = (_value$length2 = value === null || value === void 0 ? void 0 : value.length) !== null && _value$length2 !== void 0 ? _value$length2 : 0;
402
+ if (typeof rowKey === 'string' || rowKey >= dataLength) {
136
403
  var _rowIndex = value.findIndex(function (item, index) {
137
404
  var _getRowKey;
138
- return (getRowKey === null || getRowKey === void 0 || (_getRowKey = getRowKey(item, index)) === null || _getRowKey === void 0 ? void 0 : _getRowKey.toString()) === (finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString());
405
+ return (getRowKey === null || getRowKey === void 0 || (_getRowKey = getRowKey(item, index)) === null || _getRowKey === void 0 ? void 0 : _getRowKey.toString()) === (rowKey === null || rowKey === void 0 ? void 0 : rowKey.toString());
139
406
  });
140
407
  if (_rowIndex !== -1) return _rowIndex;
141
408
  }
409
+ return rowKey;
410
+ });
411
+
412
+ /**
413
+ * 根据不同的情况返回不同的 rowKey
414
+ */
415
+ var coverRowKey = (0, _utils.useRefFunction)(function (finlayRowKey) {
416
+ if (typeof finlayRowKey === 'number' && !props.name) {
417
+ return convertIndexToRowKey(finlayRowKey);
418
+ }
419
+ if (props.name) {
420
+ return convertRowKeyToIndex(finlayRowKey);
421
+ }
142
422
  return finlayRowKey;
143
423
  });
144
424
 
145
- // 设置 editableFormRef
146
- (0, _react.useImperativeHandle)(editableFormRef, function () {
147
- /**
148
- * 获取一行数据的
149
- * @param rowIndex
150
- * @returns T | undefined
151
- */
152
- var getRowData = function getRowData(rowIndex) {
153
- var _finlayRowKey$toStrin, _formRef$current;
154
- if (rowIndex == undefined) {
155
- throw new Error('rowIndex is required');
156
- }
157
- var finlayRowKey = coverRowKey(rowIndex);
158
- var rowKeyName = [props.name, (_finlayRowKey$toStrin = finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString()) !== null && _finlayRowKey$toStrin !== void 0 ? _finlayRowKey$toStrin : ''].flat(1).filter(Boolean);
159
- return (_formRef$current = formRef.current) === null || _formRef$current === void 0 ? void 0 : _formRef$current.getFieldValue(rowKeyName);
160
- };
425
+ /**
426
+ * 构建表单字段路径
427
+ */
428
+ var buildFormFieldPath = (0, _utils.useRefFunction)(function (rowKey) {
429
+ var _rowKey$toString;
430
+ return [props.name, (_rowKey$toString = rowKey === null || rowKey === void 0 ? void 0 : rowKey.toString()) !== null && _rowKey$toString !== void 0 ? _rowKey$toString : ''].flat(1).filter(Boolean);
431
+ });
432
+
433
+ /**
434
+ * 获取一行数据
435
+ */
436
+ var getRowData = (0, _utils.useRefFunction)(function (rowIndex) {
437
+ var _formRef$current;
438
+ if (rowIndex == null) {
439
+ throw new Error('rowIndex is required');
440
+ }
441
+ var finlayRowKey = coverRowKey(rowIndex);
442
+ var rowKeyName = buildFormFieldPath(finlayRowKey);
443
+ return (_formRef$current = formRef.current) === null || _formRef$current === void 0 ? void 0 : _formRef$current.getFieldValue(rowKeyName);
444
+ });
161
445
 
162
- /**
163
- * 获取整个 table 的数据
164
- * @returns T[] | undefined
165
- */
166
- var getRowsData = function getRowsData() {
167
- var _formRef$current3;
168
- var rowKeyName = [props.name].flat(1).filter(Boolean);
169
- if (Array.isArray(rowKeyName) && rowKeyName.length === 0) {
170
- var _formRef$current2;
171
- var rowData = (_formRef$current2 = formRef.current) === null || _formRef$current2 === void 0 ? void 0 : _formRef$current2.getFieldsValue();
172
- if (Array.isArray(rowData)) return rowData;
173
- return Object.keys(rowData).map(function (key) {
174
- return rowData[key];
446
+ /**
447
+ * 获取整个表格的数据
448
+ */
449
+ var getRowsData = (0, _utils.useRefFunction)(function () {
450
+ var _formRef$current3;
451
+ var rowKeyName = [props.name].flat(1).filter(Boolean);
452
+ if (Array.isArray(rowKeyName) && rowKeyName.length === 0) {
453
+ var _formRef$current2;
454
+ var rowData = (_formRef$current2 = formRef.current) === null || _formRef$current2 === void 0 ? void 0 : _formRef$current2.getFieldsValue();
455
+ if (Array.isArray(rowData)) return rowData;
456
+ return Object.keys(rowData).map(function (key) {
457
+ return rowData[key];
458
+ });
459
+ }
460
+ return (_formRef$current3 = formRef.current) === null || _formRef$current3 === void 0 ? void 0 : _formRef$current3.getFieldValue(rowKeyName);
461
+ });
462
+
463
+ /**
464
+ * 设置一行数据
465
+ */
466
+ var setRowData = (0, _utils.useRefFunction)(function (rowIndex, data) {
467
+ if (rowIndex == null) {
468
+ throw new Error('rowIndex is required');
469
+ }
470
+ var finlayRowKey = coverRowKey(rowIndex);
471
+ var rowKeyName = buildFormFieldPath(finlayRowKey);
472
+ var currentRowData = getRowData(rowIndex);
473
+ var newRowData = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, currentRowData), data || {});
474
+
475
+ // 在 name 模式下,需要更新整个数组
476
+ if (props.name) {
477
+ var _formRef$current4;
478
+ var tableName = [props.name].flat(1).filter(Boolean);
479
+ // 优先从 value prop 获取数据(受控模式),否则从表单值获取
480
+ var currentTableData = props.value || ((_formRef$current4 = formRef.current) === null || _formRef$current4 === void 0 ? void 0 : _formRef$current4.getFieldValue(tableName));
481
+ if (Array.isArray(currentTableData)) {
482
+ // 找到要更新的行的索引
483
+ var rowIndexToUpdate = typeof finlayRowKey === 'number' ? finlayRowKey : currentTableData.findIndex(function (row, index) {
484
+ var rowKey = getRowKey === null || getRowKey === void 0 ? void 0 : getRowKey(row, index);
485
+ return rowKey === finlayRowKey || (rowKey === null || rowKey === void 0 ? void 0 : rowKey.toString()) === (finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString());
175
486
  });
487
+ if (rowIndexToUpdate >= 0 && rowIndexToUpdate < currentTableData.length) {
488
+ var _formRef$current5;
489
+ // 更新数组中的对应行
490
+ var updatedTableData = (0, _toConsumableArray2.default)(currentTableData);
491
+ updatedTableData[rowIndexToUpdate] = newRowData;
492
+
493
+ // 设置整个数组,使用 set 来构建正确的路径
494
+ // 使用与 syncFormValuesExcludingEditing 相同的路径格式(数组路径)
495
+ // 这样可以确保 getFieldValue 能正确获取值
496
+ var updateValues = (0, _util.set)({}, tableName, updatedTableData);
497
+ (_formRef$current5 = formRef.current) === null || _formRef$current5 === void 0 || _formRef$current5.setFieldsValue(updateValues);
498
+
499
+ // 在受控模式下,触发 onChange
500
+ if (props.controlled && props.onChange) {
501
+ props.onChange(updatedTableData);
502
+ }
503
+ }
504
+ } else {
505
+ var _formRef$current6;
506
+ // 如果当前没有数据,直接设置单个字段
507
+ var _updateValues = (0, _util.set)({}, rowKeyName, newRowData);
508
+ (_formRef$current6 = formRef.current) === null || _formRef$current6 === void 0 || _formRef$current6.setFieldsValue(_updateValues);
176
509
  }
177
- return (_formRef$current3 = formRef.current) === null || _formRef$current3 === void 0 ? void 0 : _formRef$current3.getFieldValue(rowKeyName);
178
- };
510
+ } else {
511
+ var _formRef$current7;
512
+ // 非 name 模式下,直接设置单个字段
513
+ var _updateValues2 = (0, _util.set)({}, rowKeyName, newRowData);
514
+ (_formRef$current7 = formRef.current) === null || _formRef$current7 === void 0 || _formRef$current7.setFieldsValue(_updateValues2);
515
+ }
516
+ return true;
517
+ });
518
+
519
+ // 设置 editableFormRef
520
+ (0, _react.useImperativeHandle)(editableFormRef, function () {
179
521
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formRef.current), {}, {
180
522
  getRowData: getRowData,
181
523
  getRowsData: getRowsData,
182
- /**
183
- * 设置一行的数据,会将数据进行简单的 merge
184
- * @param rowIndex
185
- * @param data
186
- * @returns void
187
- */
188
- setRowData: function setRowData(rowIndex, data) {
189
- var _finlayRowKey$toStrin2, _formRef$current4;
190
- if (rowIndex == undefined) {
191
- throw new Error('rowIndex is required');
524
+ setRowData: setRowData
525
+ });
526
+ }, [coverRowKey, props.name, getRowData, getRowsData, setRowData]);
527
+
528
+ /**
529
+ * 受控模式下同步表单值
530
+ * 在受控模式下,即使正在编辑的行也要同步更新,因为数据由外部完全控制
531
+ * 使用深度比较优化性能,避免频繁的序列化操作
532
+ * 注意:只有当 value 明确传递时才同步,避免覆盖表单中的初始值
533
+ */
534
+ (0, _utils.useDeepCompareEffect)(function () {
535
+ if (!props.controlled || !formRef.current) return;
536
+
537
+ // 在受控模式下,只有当 value 明确传递时才同步
538
+ // 避免在 value 为 undefined 时覆盖表单中的初始值
539
+ if (value === undefined) return;
540
+
541
+ // 在受控模式下,同步所有值(包括正在编辑的行)
542
+ // 因为数据由外部完全控制,应该同步更新
543
+ try {
544
+ if (props.name) {
545
+ // name 模式:直接设置整个数组
546
+ var namePath = [props.name].flat(1);
547
+ var newValue = (0, _util.set)({}, namePath, value);
548
+ formRef.current.setFieldsValue(newValue);
549
+ } else {
550
+ // 非 name 模式:直接设置值
551
+ var formValues = {};
552
+ value.forEach(function (item, index) {
553
+ var key = getRowKey(item, index);
554
+ var keyStr = String(key);
555
+ formValues[keyStr] = item;
556
+ });
557
+ if (Object.keys(formValues).length > 0) {
558
+ formRef.current.setFieldsValue(formValues);
192
559
  }
193
- var finlayRowKey = coverRowKey(rowIndex);
194
- var rowKeyName = [props.name, (_finlayRowKey$toStrin2 = finlayRowKey === null || finlayRowKey === void 0 ? void 0 : finlayRowKey.toString()) !== null && _finlayRowKey$toStrin2 !== void 0 ? _finlayRowKey$toStrin2 : ''].flat(1).filter(Boolean);
195
- var newRowData = Object.assign({}, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, getRowData(rowIndex)), data || {}));
196
- var updateValues = (0, _util.set)({}, rowKeyName, newRowData);
197
- (_formRef$current4 = formRef.current) === null || _formRef$current4 === void 0 || _formRef$current4.setFieldsValue(updateValues);
198
- return true;
199
560
  }
200
- });
201
- }, [coverRowKey, props.name, formRef.current]);
202
- (0, _react.useEffect)(function () {
203
- if (!props.controlled) return;
204
- (value || []).forEach(function (current, index) {
205
- var _formRef$current5;
206
- (_formRef$current5 = formRef.current) === null || _formRef$current5 === void 0 || _formRef$current5.setFieldsValue((0, _defineProperty2.default)({}, "".concat(getRowKey(current, index)), current));
207
- }, {});
208
- // eslint-disable-next-line react-hooks/exhaustive-deps
209
- }, [(0, _utils.stringify)(value), props.controlled]);
561
+ } catch (error) {
562
+ console.warn('Failed to sync form values in controlled mode:', error);
563
+ }
564
+ }, [value, props.controlled, props.name, getRowKey]);
565
+
566
+ /**
567
+ * 同步表单实例引用
568
+ * 只在 name 模式下且 form 存在时更新
569
+ */
210
570
  (0, _react.useEffect)(function () {
211
- if (props.name) {
212
- var _props$editable;
213
- formRef.current = props === null || props === void 0 || (_props$editable = props.editable) === null || _props$editable === void 0 ? void 0 : _props$editable.form;
571
+ var _props$editable;
572
+ if (props.name && props !== null && props !== void 0 && (_props$editable = props.editable) !== null && _props$editable !== void 0 && _props$editable.form) {
573
+ formRef.current = props.editable.form;
214
574
  }
215
575
  }, [(_props$editable2 = props.editable) === null || _props$editable2 === void 0 ? void 0 : _props$editable2.form, props.name]);
216
- var _ref = recordCreatorProps || {},
217
- record = _ref.record,
218
- position = _ref.position,
219
- creatorButtonText = _ref.creatorButtonText,
220
- newRecordType = _ref.newRecordType,
221
- parentKey = _ref.parentKey,
222
- style = _ref.style,
223
- restButtonProps = (0, _objectWithoutProperties2.default)(_ref, _excluded2);
576
+ var _ref4 = recordCreatorProps || {},
577
+ position = _ref4.position;
224
578
  var isTop = position === 'top';
225
- var creatorButtonDom = (0, _react.useMemo)(function () {
226
- if (typeof maxLength === 'number' && maxLength <= (value === null || value === void 0 ? void 0 : value.length)) {
227
- return false;
228
- }
229
- return recordCreatorProps !== false && /*#__PURE__*/(0, _jsxRuntime.jsx)(RecordCreator, {
230
- record: (0, _utils.runFunction)(record, value === null || value === void 0 ? void 0 : value.length, value) || {},
231
- position: position,
232
- parentKey: (0, _utils.runFunction)(parentKey, value === null || value === void 0 ? void 0 : value.length, value),
233
- newRecordType: newRecordType,
234
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Button, (0, _objectSpread2.default)((0, _objectSpread2.default)({
235
- type: "dashed",
236
- style: (0, _objectSpread2.default)({
237
- display: 'block',
238
- margin: '10px 0',
239
- width: '100%'
240
- }, style),
241
- icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.PlusOutlined, {})
242
- }, restButtonProps), {}, {
243
- children: creatorButtonText || intl.getMessage('editableTable.action.add', '添加一行数据')
244
- }))
245
- });
246
- // eslint-disable-next-line react-hooks/exhaustive-deps
247
- }, [recordCreatorProps, maxLength, value === null || value === void 0 ? void 0 : value.length]);
248
- var buttonRenderProps = (0, _react.useMemo)(function () {
249
- if (!creatorButtonDom) {
250
- return {};
251
- }
252
- if (isTop) {
253
- return {
254
- components: {
255
- header: {
256
- wrapper: function wrapper(_ref2) {
257
- var _rest$columns;
258
- var className = _ref2.className,
259
- children = _ref2.children;
260
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("thead", {
261
- className: className,
262
- children: [children, /*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
263
- style: {
264
- position: 'relative'
265
- },
266
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
267
- colSpan: 0,
268
- style: {
269
- visibility: 'hidden'
270
- },
271
- children: creatorButtonDom
272
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
273
- style: {
274
- position: 'absolute',
275
- left: 0,
276
- width: '100%'
277
- },
278
- colSpan: (_rest$columns = rest.columns) === null || _rest$columns === void 0 ? void 0 : _rest$columns.length,
279
- children: creatorButtonDom
280
- })]
281
- })]
282
- });
283
- }
284
- }
285
- }
286
- };
287
- }
288
- return {
289
- tableViewRender: function tableViewRender(_, dom) {
290
- var _props$tableViewRende, _props$tableViewRende2;
291
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
292
- children: [(_props$tableViewRende = (_props$tableViewRende2 = props.tableViewRender) === null || _props$tableViewRende2 === void 0 ? void 0 : _props$tableViewRende2.call(props, _, dom)) !== null && _props$tableViewRende !== void 0 ? _props$tableViewRende : dom, creatorButtonDom]
293
- });
294
- }
295
- };
296
- // eslint-disable-next-line react-hooks/exhaustive-deps
297
- }, [isTop, creatorButtonDom]);
298
- var editableProps = (0, _objectSpread2.default)({}, props.editable);
579
+ var _useCreatorButton = useCreatorButton({
580
+ recordCreatorProps: recordCreatorProps,
581
+ maxLength: maxLength,
582
+ value: value,
583
+ intl: intl,
584
+ isTop: isTop,
585
+ columnsLength: (_rest$columns = rest.columns) === null || _rest$columns === void 0 ? void 0 : _rest$columns.length,
586
+ tableViewRender: props.tableViewRender
587
+ }),
588
+ creatorButtonDom = _useCreatorButton.creatorButtonDom,
589
+ buttonRenderProps = _useCreatorButton.buttonRenderProps;
299
590
 
300
591
  /**
301
- * 防止闭包的onchange
302
- *
303
- * >>>>>>为了性能好辛苦
592
+ * 处理值变化回调
593
+ * 注意:受控模式下不调用 onChange,避免循环更新
594
+ * onChange 应该由外部控制,而不是在内部触发
304
595
  */
305
- var newOnValueChange = (0, _utils.useRefFunction)(function (r, dataSource) {
596
+ var handleValuesChange = (0, _utils.useRefFunction)(function (r, dataSource) {
306
597
  var _props$editable3, _props$editable3$onVa, _props$onValuesChange;
307
598
  (_props$editable3 = props.editable) === null || _props$editable3 === void 0 || (_props$editable3$onVa = _props$editable3.onValuesChange) === null || _props$editable3$onVa === void 0 || _props$editable3$onVa.call(_props$editable3, r, dataSource);
308
599
  (_props$onValuesChange = props.onValuesChange) === null || _props$onValuesChange === void 0 || _props$onValuesChange.call(props, dataSource, r);
309
- if (props.controlled) {
310
- var _props$onChange;
311
- props === null || props === void 0 || (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, dataSource);
600
+
601
+ // 在受控模式下,当表单值变化时也应该触发 onChange
602
+ // 这样外部可以同步更新 value,实现真正的受控
603
+ if (props.controlled && props !== null && props !== void 0 && props.onChange) {
604
+ props.onChange(dataSource);
312
605
  }
606
+ // 非受控模式下,onChange 应该在 onDataSourceChange 中触发
607
+ // 这样可以确保数据已经正确更新
313
608
  });
314
- if (props !== null && props !== void 0 && props.onValuesChange || (_props$editable4 = props.editable) !== null && _props$editable4 !== void 0 && _props$editable4.onValuesChange ||
315
- // 受控模式需要触发 onchange
316
- props.controlled && props !== null && props !== void 0 && props.onChange) {
317
- editableProps.onValuesChange = newOnValueChange;
318
- }
609
+
610
+ /**
611
+ * 构建可编辑属性
612
+ * 使用 useMemo 优化性能,避免不必要的重新创建
613
+ */
614
+ var editableProps = (0, _react.useMemo)(function () {
615
+ var _props$editable4;
616
+ var baseProps = (0, _objectSpread2.default)({}, props.editable);
617
+ var hasOnValuesChange = Boolean(props === null || props === void 0 ? void 0 : props.onValuesChange) || Boolean((_props$editable4 = props.editable) === null || _props$editable4 === void 0 ? void 0 : _props$editable4.onValuesChange) || Boolean(props.controlled && (props === null || props === void 0 ? void 0 : props.onChange));
618
+ if (hasOnValuesChange) {
619
+ baseProps.onValuesChange = handleValuesChange;
620
+ }
621
+ return baseProps;
622
+ }, [props.editable, props.onValuesChange, props.controlled, props.onChange, handleValuesChange]);
319
623
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
320
624
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(EditableTableActionContext.Provider, {
321
625
  value: actionRef,
@@ -336,34 +640,63 @@ function EditableTable(props) {
336
640
  }),
337
641
  dataSource: value,
338
642
  onDataSourceChange: function onDataSourceChange(dataSource) {
643
+ // setValue 会触发 onChange,但我们需要确保数据已经正确更新
644
+ // 所以先设置数据,然后手动触发 onChange
339
645
  setValue(dataSource);
646
+
340
647
  /**
341
- * 如果是top,需要重新设置一下 form,不然会导致 id 相同数据混淆
648
+ * 如果是 name 模式,需要同步表单值
649
+ * 避免表单值和数据源不一致
650
+ * 注意:不会覆盖正在编辑的行
342
651
  */
343
- if (props.name && position === 'top') {
344
- var _formRef$current6;
345
- var newValue = (0, _util.set)({}, [props.name].flat(1).filter(Boolean), dataSource);
346
- (_formRef$current6 = formRef.current) === null || _formRef$current6 === void 0 || _formRef$current6.setFieldsValue(newValue);
652
+ if (props.name && formRef.current) {
653
+ var _props$editable5;
654
+ var editingKeys = (_props$editable5 = props.editable) === null || _props$editable5 === void 0 ? void 0 : _props$editable5.editableKeys;
655
+ var editingKeysSet = createEditingKeysSet(editingKeys);
656
+ var namePath = [props.name].flat(1).filter(Boolean);
657
+ syncFormValuesExcludingEditing(dataSource, editingKeysSet, namePath);
658
+ }
659
+
660
+ // 在非受控模式下,通过 onDataSourceChange 触发 onChange
661
+ // 这样可以确保数据已经正确更新
662
+ if (!props.controlled && props.onChange) {
663
+ props.onChange(dataSource);
347
664
  }
348
665
  }
349
666
  }))
350
667
  }), props.name ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_form.ProFormDependency, {
351
668
  name: [props.name],
352
669
  children: function children(changeValue) {
353
- var _props$editable5, _props$editable5$onVa;
670
+ // 初始化 preData
354
671
  if (!preData.current) {
355
672
  preData.current = value;
356
673
  return null;
357
674
  }
358
- var list = (0, _util.get)(changeValue, [props.name].flat(1));
359
- var changeItem = list === null || list === void 0 ? void 0 : list.find(function (item, index) {
675
+ var namePath = [props.name].flat(1);
676
+ var list = (0, _util.get)(changeValue, namePath);
677
+
678
+ // 添加空值检查,避免后续操作出错
679
+ if (!list || !Array.isArray(list)) {
680
+ preData.current = value;
681
+ return null;
682
+ }
683
+
684
+ // 在更新 preData 之前找到变化的项
685
+ // 使用 findIndex 可以同时获取变化的项和索引
686
+ var changeIndex = list.findIndex(function (item, index) {
360
687
  var _preData$current;
361
688
  return !(0, _utils.isDeepEqualReact)(item, (_preData$current = preData.current) === null || _preData$current === void 0 ? void 0 : _preData$current[index]);
362
689
  });
690
+
691
+ // 只有在找到变化项时才触发回调
692
+ if (changeIndex !== -1) {
693
+ var _props$editable6, _props$editable6$onVa;
694
+ var changeItem = list[changeIndex];
695
+ props === null || props === void 0 || (_props$editable6 = props.editable) === null || _props$editable6 === void 0 || (_props$editable6$onVa = _props$editable6.onValuesChange) === null || _props$editable6$onVa === void 0 || _props$editable6$onVa.call(_props$editable6, changeItem, list);
696
+ }
697
+
698
+ // 在找到 changeItem 之后再更新 preData,确保后续比较正确
363
699
  preData.current = value;
364
- if (!changeItem) return null;
365
- // 如果不存在 preData 说明是初始化,此时不需要触发 onValuesChange
366
- props === null || props === void 0 || (_props$editable5 = props.editable) === null || _props$editable5 === void 0 || (_props$editable5$onVa = _props$editable5.onValuesChange) === null || _props$editable5$onVa === void 0 || _props$editable5$onVa.call(_props$editable5, changeItem, list);
367
700
  return null;
368
701
  }
369
702
  }) : null]