@nokecy/qc-ui-components 2.0.0-beta.0 → 2.0.0-beta.1

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 (243) hide show
  1. package/dist/cjs/ConfirmPro/index.d.ts +12 -9
  2. package/dist/cjs/ConfirmPro/index.js +11 -34
  3. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +422 -156
  4. package/dist/cjs/ag-grid-plus/context/gridContext.d.ts +12 -1
  5. package/dist/cjs/ag-grid-plus/context/queryFormContext.d.ts +2 -0
  6. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.js +8 -0
  7. package/dist/cjs/ag-grid-plus/density.d.ts +25 -0
  8. package/dist/cjs/ag-grid-plus/density.js +52 -0
  9. package/dist/cjs/ag-grid-plus/index.less +36 -0
  10. package/dist/cjs/ag-grid-plus/interface.d.ts +58 -1
  11. package/dist/cjs/ag-grid-plus/interface.js +1 -1
  12. package/dist/cjs/ag-grid-plus/queryForm/index.d.ts +11 -0
  13. package/dist/cjs/ag-grid-plus/queryForm/index.js +62 -10
  14. package/dist/cjs/ag-grid-plus/queryForm/queryForm.d.ts +10 -0
  15. package/dist/cjs/ag-grid-plus/queryForm/queryForm.js +63 -26
  16. package/dist/cjs/ag-grid-plus/queryForm/queryValues.d.ts +9 -0
  17. package/dist/cjs/ag-grid-plus/queryForm/queryValues.js +61 -0
  18. package/dist/cjs/ag-grid-plus/rowColors.d.ts +12 -0
  19. package/dist/cjs/ag-grid-plus/rowColors.js +58 -0
  20. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.d.ts +5 -0
  21. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.js +14 -5
  22. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +108 -76
  23. package/dist/cjs/ag-grid-plus/setting/QuerySchemeManager.js +10 -9
  24. package/dist/cjs/ag-grid-plus/setting/autoColumnMemory.d.ts +37 -0
  25. package/dist/cjs/ag-grid-plus/setting/autoColumnMemory.js +206 -0
  26. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +2 -0
  27. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +19 -1
  28. package/dist/cjs/ag-grid-plus/setting/index.js +5 -14
  29. package/dist/cjs/ag-grid-plus/settingItem/index.d.ts +11 -1
  30. package/dist/cjs/ag-grid-plus/settingItem/index.js +34 -12
  31. package/dist/cjs/ag-grid-plus/shared/EmptyIllustration.d.ts +16 -0
  32. package/dist/cjs/ag-grid-plus/shared/EmptyIllustration.js +87 -0
  33. package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.js +9 -1
  34. package/dist/cjs/ag-grid-plus/shared/SkeletonOverlay.d.ts +11 -0
  35. package/dist/cjs/ag-grid-plus/shared/SkeletonOverlay.js +40 -0
  36. package/dist/cjs/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +1 -1
  37. package/dist/cjs/ag-grid-plus/theme.d.ts +7 -1
  38. package/dist/cjs/ag-grid-plus/theme.js +31 -6
  39. package/dist/cjs/ag-grid-plus/toolBar/OverflowActions.d.ts +16 -0
  40. package/dist/cjs/ag-grid-plus/toolBar/OverflowActions.js +128 -0
  41. package/dist/cjs/ag-grid-plus/toolBar/index.d.ts +3 -1
  42. package/dist/cjs/ag-grid-plus/toolBar/index.js +43 -35
  43. package/dist/cjs/ag-grid-plus/toolBar/leftContent.d.ts +2 -2
  44. package/dist/cjs/ag-grid-plus/toolBar/leftContent.js +2 -2
  45. package/dist/cjs/ag-grid-plus/toolBar/overflow.d.ts +20 -0
  46. package/dist/cjs/ag-grid-plus/toolBar/overflow.js +48 -0
  47. package/dist/cjs/ag-grid-plus/toolBar/style.js +71 -15
  48. package/dist/cjs/ag-grid-plus/types.d.ts +6 -0
  49. package/dist/cjs/ag-grid-plus/utils/agGridCompat.js +12 -3
  50. package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +3 -0
  51. package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +13 -2
  52. package/dist/cjs/ag-grid-plus/utils/constants.d.ts +3 -2
  53. package/dist/cjs/ag-grid-plus/utils/constants.js +3 -2
  54. package/dist/cjs/ag-grid-plus/utils/crossPageSelection.d.ts +21 -0
  55. package/dist/cjs/ag-grid-plus/utils/crossPageSelection.js +58 -0
  56. package/dist/cjs/ag-grid-plus/utils/emptyState.d.ts +2 -0
  57. package/dist/cjs/ag-grid-plus/utils/emptyState.js +9 -5
  58. package/dist/cjs/ag-grid-plus/utils/listKeyboard.d.ts +24 -0
  59. package/dist/cjs/ag-grid-plus/utils/listKeyboard.js +83 -0
  60. package/dist/cjs/ag-grid-plus/utils/pagination.d.ts +26 -0
  61. package/dist/cjs/ag-grid-plus/utils/pagination.js +69 -0
  62. package/dist/cjs/ag-grid-plus/utils/queryDispatch.d.ts +7 -0
  63. package/dist/cjs/ag-grid-plus/utils/queryDispatch.js +17 -0
  64. package/dist/cjs/ag-grid-plus/utils/statusPill.d.ts +25 -0
  65. package/dist/cjs/ag-grid-plus/utils/statusPill.js +196 -0
  66. package/dist/cjs/ag-grid-plus/utils/valueEnumColor.d.ts +6 -1
  67. package/dist/cjs/ag-grid-plus/utils/valueEnumColor.js +13 -9
  68. package/dist/cjs/ag-grid-plus/utils/valueFormat.d.ts +19 -0
  69. package/dist/cjs/ag-grid-plus/utils/valueFormat.js +73 -0
  70. package/dist/cjs/ag-grid-plus/utils.js +3 -2
  71. package/dist/cjs/array-table/arrayAddBtn.d.ts +1 -0
  72. package/dist/cjs/array-table/arrayAddBtn.js +2 -2
  73. package/dist/cjs/array-table/autoHeight.d.ts +18 -0
  74. package/dist/cjs/array-table/autoHeight.js +30 -0
  75. package/dist/cjs/array-table/batchRemove.d.ts +2 -2
  76. package/dist/cjs/array-table/cellEditorMarker.d.ts +18 -0
  77. package/dist/cjs/array-table/cellEditorMarker.js +92 -0
  78. package/dist/cjs/array-table/errorLocator.d.ts +29 -0
  79. package/dist/cjs/array-table/errorLocator.js +101 -0
  80. package/dist/cjs/array-table/hooks.d.ts +52 -4
  81. package/dist/cjs/array-table/hooks.js +251 -18
  82. package/dist/cjs/array-table/index.d.ts +6 -0
  83. package/dist/cjs/array-table/index.js +167 -23
  84. package/dist/cjs/array-table/interface.d.ts +22 -0
  85. package/dist/cjs/array-table/preview.js +39 -5
  86. package/dist/cjs/array-table/rowFeedback.d.ts +2 -2
  87. package/dist/cjs/array-table/rowFeedback.js +8 -8
  88. package/dist/cjs/array-table/summary.d.ts +25 -0
  89. package/dist/cjs/array-table/summary.js +70 -0
  90. package/dist/cjs/array-table/theme.d.ts +35 -5
  91. package/dist/cjs/array-table/theme.js +49 -12
  92. package/dist/cjs/array-table/title.d.ts +3 -0
  93. package/dist/cjs/array-table/title.js +29 -0
  94. package/dist/cjs/array-table/utils.d.ts +2 -1
  95. package/dist/cjs/array-table/utils.js +94 -23
  96. package/dist/cjs/card/pro-card/Card/useLegacyItems.d.ts +1 -1
  97. package/dist/cjs/dateCellEditor/DateCellEditor.d.ts +5 -0
  98. package/dist/cjs/dateCellEditor/DateCellEditor.js +42 -17
  99. package/dist/cjs/deleteConfirm/index.d.ts +14 -0
  100. package/dist/cjs/deleteConfirm/index.js +73 -12
  101. package/dist/cjs/dialogSelect/index.d.ts +19 -0
  102. package/dist/cjs/dialogSelect/index.js +189 -15
  103. package/dist/cjs/dialogSelect/index.less +18 -0
  104. package/dist/cjs/documentPage/documentPage.d.ts +6 -3
  105. package/dist/cjs/documentPage/documentPage.js +23 -8
  106. package/dist/cjs/documentPage/index.d.ts +2 -0
  107. package/dist/cjs/documentPage/index.js +19 -0
  108. package/dist/cjs/documentPage/leaveGuard.d.ts +31 -0
  109. package/dist/cjs/documentPage/leaveGuard.js +91 -0
  110. package/dist/cjs/draggableModal/index.d.ts +24 -1
  111. package/dist/cjs/draggableModal/index.js +36 -6
  112. package/dist/cjs/fullScreenAlert/index.less +10 -10
  113. package/dist/cjs/index.d.ts +2 -0
  114. package/dist/cjs/index.js +15 -0
  115. package/dist/cjs/readPretty/arrayTable.js +5 -1
  116. package/dist/cjs/scanCollect/ScanFeedbackInput.d.ts +26 -0
  117. package/dist/cjs/scanCollect/ScanFeedbackInput.js +113 -0
  118. package/dist/cjs/scanCollect/index.d.ts +4 -0
  119. package/dist/cjs/scanCollect/index.js +14 -0
  120. package/dist/cjs/scanCollect/scanSound.d.ts +15 -0
  121. package/dist/cjs/scanCollect/scanSound.js +91 -0
  122. package/dist/esm/ConfirmPro/index.d.ts +12 -9
  123. package/dist/esm/ConfirmPro/index.js +11 -34
  124. package/dist/esm/ag-grid-plus/ag-gridPlus.js +423 -156
  125. package/dist/esm/ag-grid-plus/context/gridContext.d.ts +12 -1
  126. package/dist/esm/ag-grid-plus/context/queryFormContext.d.ts +2 -0
  127. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.js +8 -0
  128. package/dist/esm/ag-grid-plus/density.d.ts +25 -0
  129. package/dist/esm/ag-grid-plus/density.js +45 -0
  130. package/dist/esm/ag-grid-plus/index.less +36 -0
  131. package/dist/esm/ag-grid-plus/interface.d.ts +58 -1
  132. package/dist/esm/ag-grid-plus/interface.js +2 -0
  133. package/dist/esm/ag-grid-plus/queryForm/index.d.ts +11 -0
  134. package/dist/esm/ag-grid-plus/queryForm/index.js +62 -10
  135. package/dist/esm/ag-grid-plus/queryForm/queryForm.d.ts +10 -0
  136. package/dist/esm/ag-grid-plus/queryForm/queryForm.js +64 -26
  137. package/dist/esm/ag-grid-plus/queryForm/queryValues.d.ts +9 -0
  138. package/dist/esm/ag-grid-plus/queryForm/queryValues.js +54 -0
  139. package/dist/esm/ag-grid-plus/rowColors.d.ts +12 -0
  140. package/dist/esm/ag-grid-plus/rowColors.js +50 -0
  141. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.d.ts +5 -0
  142. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.js +14 -5
  143. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +110 -78
  144. package/dist/esm/ag-grid-plus/setting/QuerySchemeManager.js +10 -9
  145. package/dist/esm/ag-grid-plus/setting/autoColumnMemory.d.ts +37 -0
  146. package/dist/esm/ag-grid-plus/setting/autoColumnMemory.js +198 -0
  147. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +2 -0
  148. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +18 -1
  149. package/dist/esm/ag-grid-plus/setting/index.js +6 -15
  150. package/dist/esm/ag-grid-plus/settingItem/index.d.ts +11 -1
  151. package/dist/esm/ag-grid-plus/settingItem/index.js +35 -13
  152. package/dist/esm/ag-grid-plus/shared/EmptyIllustration.d.ts +16 -0
  153. package/dist/esm/ag-grid-plus/shared/EmptyIllustration.js +82 -0
  154. package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.js +9 -1
  155. package/dist/esm/ag-grid-plus/shared/SkeletonOverlay.d.ts +11 -0
  156. package/dist/esm/ag-grid-plus/shared/SkeletonOverlay.js +34 -0
  157. package/dist/esm/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +1 -1
  158. package/dist/esm/ag-grid-plus/theme.d.ts +7 -1
  159. package/dist/esm/ag-grid-plus/theme.js +31 -6
  160. package/dist/esm/ag-grid-plus/toolBar/OverflowActions.d.ts +16 -0
  161. package/dist/esm/ag-grid-plus/toolBar/OverflowActions.js +120 -0
  162. package/dist/esm/ag-grid-plus/toolBar/index.d.ts +3 -1
  163. package/dist/esm/ag-grid-plus/toolBar/index.js +43 -35
  164. package/dist/esm/ag-grid-plus/toolBar/leftContent.d.ts +2 -2
  165. package/dist/esm/ag-grid-plus/toolBar/leftContent.js +2 -2
  166. package/dist/esm/ag-grid-plus/toolBar/overflow.d.ts +20 -0
  167. package/dist/esm/ag-grid-plus/toolBar/overflow.js +41 -0
  168. package/dist/esm/ag-grid-plus/toolBar/style.js +71 -15
  169. package/dist/esm/ag-grid-plus/types.d.ts +6 -0
  170. package/dist/esm/ag-grid-plus/utils/agGridCompat.js +12 -3
  171. package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +3 -0
  172. package/dist/esm/ag-grid-plus/utils/columnProcessors.js +14 -3
  173. package/dist/esm/ag-grid-plus/utils/constants.d.ts +3 -2
  174. package/dist/esm/ag-grid-plus/utils/constants.js +3 -2
  175. package/dist/esm/ag-grid-plus/utils/crossPageSelection.d.ts +21 -0
  176. package/dist/esm/ag-grid-plus/utils/crossPageSelection.js +52 -0
  177. package/dist/esm/ag-grid-plus/utils/emptyState.d.ts +2 -0
  178. package/dist/esm/ag-grid-plus/utils/emptyState.js +9 -5
  179. package/dist/esm/ag-grid-plus/utils/listKeyboard.d.ts +24 -0
  180. package/dist/esm/ag-grid-plus/utils/listKeyboard.js +77 -0
  181. package/dist/esm/ag-grid-plus/utils/pagination.d.ts +26 -0
  182. package/dist/esm/ag-grid-plus/utils/pagination.js +60 -0
  183. package/dist/esm/ag-grid-plus/utils/queryDispatch.d.ts +7 -0
  184. package/dist/esm/ag-grid-plus/utils/queryDispatch.js +11 -0
  185. package/dist/esm/ag-grid-plus/utils/statusPill.d.ts +25 -0
  186. package/dist/esm/ag-grid-plus/utils/statusPill.js +192 -0
  187. package/dist/esm/ag-grid-plus/utils/valueEnumColor.d.ts +6 -1
  188. package/dist/esm/ag-grid-plus/utils/valueEnumColor.js +12 -8
  189. package/dist/esm/ag-grid-plus/utils/valueFormat.d.ts +19 -0
  190. package/dist/esm/ag-grid-plus/utils/valueFormat.js +63 -0
  191. package/dist/esm/ag-grid-plus/utils.js +3 -2
  192. package/dist/esm/array-table/arrayAddBtn.d.ts +1 -0
  193. package/dist/esm/array-table/arrayAddBtn.js +1 -1
  194. package/dist/esm/array-table/autoHeight.d.ts +18 -0
  195. package/dist/esm/array-table/autoHeight.js +25 -0
  196. package/dist/esm/array-table/batchRemove.d.ts +2 -2
  197. package/dist/esm/array-table/cellEditorMarker.d.ts +18 -0
  198. package/dist/esm/array-table/cellEditorMarker.js +84 -0
  199. package/dist/esm/array-table/errorLocator.d.ts +29 -0
  200. package/dist/esm/array-table/errorLocator.js +95 -0
  201. package/dist/esm/array-table/hooks.d.ts +52 -4
  202. package/dist/esm/array-table/hooks.js +251 -17
  203. package/dist/esm/array-table/index.d.ts +6 -0
  204. package/dist/esm/array-table/index.js +170 -25
  205. package/dist/esm/array-table/interface.d.ts +22 -0
  206. package/dist/esm/array-table/preview.js +43 -7
  207. package/dist/esm/array-table/rowFeedback.d.ts +2 -2
  208. package/dist/esm/array-table/rowFeedback.js +8 -8
  209. package/dist/esm/array-table/summary.d.ts +25 -0
  210. package/dist/esm/array-table/summary.js +66 -0
  211. package/dist/esm/array-table/theme.d.ts +35 -5
  212. package/dist/esm/array-table/theme.js +47 -12
  213. package/dist/esm/array-table/title.d.ts +3 -0
  214. package/dist/esm/array-table/title.js +24 -0
  215. package/dist/esm/array-table/utils.d.ts +2 -1
  216. package/dist/esm/array-table/utils.js +93 -22
  217. package/dist/esm/card/pro-card/Card/useLegacyItems.d.ts +1 -1
  218. package/dist/esm/dateCellEditor/DateCellEditor.d.ts +5 -0
  219. package/dist/esm/dateCellEditor/DateCellEditor.js +42 -17
  220. package/dist/esm/deleteConfirm/index.d.ts +14 -0
  221. package/dist/esm/deleteConfirm/index.js +72 -12
  222. package/dist/esm/dialogSelect/index.d.ts +19 -0
  223. package/dist/esm/dialogSelect/index.js +190 -16
  224. package/dist/esm/dialogSelect/index.less +18 -0
  225. package/dist/esm/documentPage/documentPage.d.ts +6 -3
  226. package/dist/esm/documentPage/documentPage.js +23 -8
  227. package/dist/esm/documentPage/index.d.ts +2 -0
  228. package/dist/esm/documentPage/index.js +1 -0
  229. package/dist/esm/documentPage/leaveGuard.d.ts +31 -0
  230. package/dist/esm/documentPage/leaveGuard.js +86 -0
  231. package/dist/esm/draggableModal/index.d.ts +24 -1
  232. package/dist/esm/draggableModal/index.js +35 -5
  233. package/dist/esm/fullScreenAlert/index.less +10 -10
  234. package/dist/esm/index.d.ts +2 -0
  235. package/dist/esm/index.js +1 -0
  236. package/dist/esm/readPretty/arrayTable.js +6 -2
  237. package/dist/esm/scanCollect/ScanFeedbackInput.d.ts +26 -0
  238. package/dist/esm/scanCollect/ScanFeedbackInput.js +107 -0
  239. package/dist/esm/scanCollect/index.d.ts +4 -0
  240. package/dist/esm/scanCollect/index.js +2 -0
  241. package/dist/esm/scanCollect/scanSound.d.ts +15 -0
  242. package/dist/esm/scanCollect/scanSound.js +84 -0
  243. package/package.json +2 -2
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createArrayTableErrorLocator = void 0;
7
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
9
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
11
+ /** ArrayTable 的一列:AG-Grid 列 id 与它承载的内层数据字段名(Column key 与字段名可能不同,如设计器形态)。 */
12
+
13
+ /**
14
+ * 提交校验失败时 ArrayTable 的错误定位器(注册到 adapters 的 form-error-focus,见 registerErrorLocator)。
15
+ *
16
+ * 错误格可能不在 DOM 里(行被虚拟化、懒挂载格卸回了文本),按 DOM 找不到,所以按 Formily 的错误列表定位:
17
+ * 取表内最靠前的(先行后列,行按当前显示顺序、列按当前列序),ensureIndexVisible / ensureColumnVisible 滚到位,
18
+ * 再激活该格并聚焦输入。@author nokecy
19
+ */
20
+ var createArrayTableErrorLocator = exports.createArrayTableErrorLocator = function createArrayTableErrorLocator(deps) {
21
+ return function (form, root) {
22
+ var _api$isDestroyed, _api$getAllDisplayedC, _api$getAllDisplayedC2, _first$feedback$messa, _first$feedback$addre;
23
+ var field = deps.field;
24
+ var container = deps.getContainer();
25
+ var api = deps.getApi();
26
+ if (!container || !api || (_api$isDestroyed = api.isDestroyed) !== null && _api$isDestroyed !== void 0 && _api$isDestroyed.call(api) || field.form !== form || !root.contains(container)) return undefined;
27
+ var rows = Array.isArray(field.value) ? field.value : [];
28
+ var baseLength = field.path.length;
29
+ var displayed = ((_api$getAllDisplayedC = (_api$getAllDisplayedC2 = api.getAllDisplayedColumns) === null || _api$getAllDisplayedC2 === void 0 ? void 0 : _api$getAllDisplayedC2.call(api)) !== null && _api$getAllDisplayedC !== void 0 ? _api$getAllDisplayedC : []).map(function (c) {
30
+ return c.getColId();
31
+ });
32
+ var columns = deps.getColumns();
33
+ var candidates = [];
34
+ var _iterator = _createForOfIteratorHelper(form.queryFeedbacks({
35
+ type: 'error',
36
+ address: "".concat(field.address.toString(), ".*")
37
+ })),
38
+ _step;
39
+ try {
40
+ var _loop = function _loop() {
41
+ var _feedback$path, _feedback$address, _columns$find, _api$getRowNode;
42
+ var feedback = _step.value;
43
+ var segments = String((_feedback$path = feedback.path) !== null && _feedback$path !== void 0 ? _feedback$path : '').split('.');
44
+ var dataIndex = Number(segments[baseLength]);
45
+ var row = rows[dataIndex];
46
+ if (!Number.isInteger(dataIndex) || row == null || _typeof(row) !== 'object') return 0; // continue
47
+ var dataName = segments.slice(baseLength + 1).join('.');
48
+ // 地址里含 Column 的 void 段(`items.2.column1.qty`),先按内层字段名匹配,其次按 Column key。
49
+ var addressSegments = String((_feedback$address = feedback.address) !== null && _feedback$address !== void 0 ? _feedback$address : '').split('.');
50
+ var column = (_columns$find = columns.find(function (c) {
51
+ return c.dataName === dataName;
52
+ })) !== null && _columns$find !== void 0 ? _columns$find : columns.find(function (c) {
53
+ return addressSegments.includes(c.colId);
54
+ });
55
+ if (!column) return 0; // continue
56
+ var node = (_api$getRowNode = api.getRowNode) === null || _api$getRowNode === void 0 ? void 0 : _api$getRowNode.call(api, deps.getRowId(row));
57
+ var rowIndex = node === null || node === void 0 ? void 0 : node.rowIndex;
58
+ // 行被过滤掉了(不在显示列表里)无法定位。
59
+ if (typeof rowIndex !== 'number') return 0; // continue
60
+ var colOrder = displayed.indexOf(column.colId);
61
+ candidates.push({
62
+ rowOrder: rowIndex,
63
+ colOrder: colOrder < 0 ? Number.MAX_SAFE_INTEGER : colOrder,
64
+ rowIndex: rowIndex,
65
+ colId: column.colId,
66
+ feedback: feedback,
67
+ title: column.title
68
+ });
69
+ },
70
+ _ret;
71
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
72
+ _ret = _loop();
73
+ if (_ret === 0) continue;
74
+ }
75
+ } catch (err) {
76
+ _iterator.e(err);
77
+ } finally {
78
+ _iterator.f();
79
+ }
80
+ if (candidates.length === 0) return undefined;
81
+ candidates.sort(function (a, b) {
82
+ return a.rowOrder - b.rowOrder || a.colOrder - b.colOrder;
83
+ });
84
+ var first = candidates[0];
85
+ var reason = (_first$feedback$messa = first.feedback.messages) === null || _first$feedback$messa === void 0 ? void 0 : _first$feedback$messa[0];
86
+ var location = {
87
+ container: container,
88
+ addressPrefix: field.address.toString(),
89
+ address: (_first$feedback$addre = first.feedback.address) === null || _first$feedback$addre === void 0 ? void 0 : _first$feedback$addre.toString(),
90
+ title: first.title,
91
+ reason: typeof reason === 'string' ? reason : undefined,
92
+ reveal: function reveal() {
93
+ return deps.focus({
94
+ rowIndex: first.rowIndex,
95
+ colId: first.colId
96
+ });
97
+ }
98
+ };
99
+ return location;
100
+ };
101
+ };
@@ -7,16 +7,23 @@ type CellFocusRequest = {
7
7
  };
8
8
  type BeginCellFocusRequest = (resolveCell: () => Element | null | undefined, isTargetCurrent?: () => boolean) => CellFocusRequest;
9
9
  /** 单元格聚焦;已获得焦点的控件保留用户光标,等待挂载的请求可被新操作取消。@author nokecy */
10
- export declare const useCellFocus: () => {
11
- focusInputInCell: (cell: Element, isTargetCurrent?: () => boolean) => void;
12
- scheduleCellFocus: (resolveCell: () => Element | null | undefined, delay: number, isTargetCurrent?: () => boolean) => void;
10
+ export type CellFocusSource = 'keyboard' | 'pointer' | 'pointer-activated';
11
+ /**
12
+ * @param options.openDateOnKeyboard 键盘到达日期格时是否自动展开面板,默认 false:与演示一致——
13
+ * 鼠标点击由 antd 自己展开,键盘到达保持收起、直接键入覆盖。传 true 才在键盘落焦那一次展开。
14
+ */
15
+ export declare const useCellFocus: (options?: {
16
+ openDateOnKeyboard?: boolean | undefined;
17
+ }) => {
18
+ focusInputInCell: (cell: Element, isTargetCurrent?: () => boolean, source?: CellFocusSource) => void;
19
+ scheduleCellFocus: (resolveCell: () => Element | null | undefined, delay: number, isTargetCurrent?: () => boolean, source?: CellFocusSource) => void;
13
20
  beginFocusRequest: BeginCellFocusRequest;
14
21
  };
15
22
  /**
16
23
  * 键盘导航 Hook
17
24
  * 处理方向键在表格单元格间的导航
18
25
  */
19
- export declare const useKeyboardNavigation: (ref: RefObject<any>, dataSource: any[], focusInputInCell: (cell: Element, isTargetCurrent?: () => boolean) => void, activateCell?: ((api: GridApi, node: any, colId: string) => boolean) | undefined, beginSharedFocusRequest?: BeginCellFocusRequest) => {
26
+ export declare const useKeyboardNavigation: (ref: RefObject<any>, dataSource: any[], focusInputInCell: (cell: Element, isTargetCurrent?: () => boolean, source?: CellFocusSource) => void, activateCell?: ((api: GridApi, node: any, colId: string) => boolean) | undefined, beginSharedFocusRequest?: BeginCellFocusRequest, isTabFocusDeferred?: () => boolean) => {
20
27
  handleCellKeyDown: (event: any) => void;
21
28
  };
22
29
  /**
@@ -43,4 +50,45 @@ export declare const isNativeInputKey: (event: KeyboardEvent) => boolean;
43
50
  export declare const suppressNativeInputKeys: ({ event }: {
44
51
  event: KeyboardEvent;
45
52
  }) => boolean;
53
+ type GridCellFocusParams = {
54
+ api: GridApi;
55
+ root: RefObject<HTMLElement | null | undefined>;
56
+ rowIndex: number;
57
+ colId: string;
58
+ beginFocusRequest: BeginCellFocusRequest;
59
+ focusInputInCell: (cell: Element, isTargetCurrent?: () => boolean, source?: CellFocusSource) => void;
60
+ activateCell?: (api: GridApi, node: any, colId: string) => boolean;
61
+ /** 列不在可视区时也滚到可见(横向滚动),错误定位用 */
62
+ ensureColumnVisible?: boolean;
63
+ };
64
+ /**
65
+ * 行已在行模型里:滚到可见、设焦点格、必要时激活懒挂载格,等格子渲染出来后把焦点落进输入控件。
66
+ * 行进入模型后 DOM 还要再渲染一拍(懒挂载格还要挂载),所以分多次轮询,直到格子出现;
67
+ * 返回的 Promise 在落焦完成(返回获得焦点的控件)、或请求被用户操作取消 / 超时(返回 undefined)时结束。@author nokecy
68
+ */
69
+ export declare const focusGridCell: (params: GridCellFocusParams) => Promise<HTMLElement | undefined>;
70
+ export type PendingAddedRowFocus = {
71
+ rowId: string;
72
+ colId: string;
73
+ };
74
+ /**
75
+ * 新增行进入 AG-Grid 行模型之后,把焦点落到它的首个可编辑格。
76
+ *
77
+ * 新行是 field.push 之后经 React 重渲、rowData 更新才进入行模型的,push 当下 getDisplayedRowAtIndex 还取不到它,
78
+ * 所以由 onRowDataUpdated 调用本函数;行模型里还没有该行时返回 false,调用方保留待办等下一次。@author nokecy
79
+ */
80
+ export declare const focusAddedRow: (params: Omit<GridCellFocusParams, "colId" | "rowIndex"> & {
81
+ pending: PendingAddedRowFocus;
82
+ }) => boolean;
83
+ /**
84
+ * AG-Grid `tabToNextCell`:跳过序号列/勾选列;末行末格再按 Tab 时,传了 `onTabPastEnd` 就由它新增一行并落焦,
85
+ * 否则保持默认(焦点离开表格)。返回值语义见 AG-Grid:位置=去那格,true=留在原格,false=交浏览器。@author nokecy
86
+ */
87
+ export declare const createTabToNextCell: (onTabPastEnd?: () => void) => (params: any) => any;
88
+ /**
89
+ * Esc 放弃本格修改(规范 §7.6.3):Formily 受控值是实时写入的,没有「进入时的值」,
90
+ * 所以在输入框获得焦点时记下当时的文本,Esc 时用原生 setter + input 事件写回,值照常经 Formily 回流。
91
+ * 下拉/日期等自带 Esc 语义的控件不处理。@author nokecy
92
+ */
93
+ export declare const useCellEscapeRevert: (ref: RefObject<HTMLElement | null | undefined>) => void;
46
94
  export {};
@@ -1,10 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.useRowDrag = exports.useKeyboardNavigation = exports.useCellFocus = exports.suppressNativeInputKeys = exports.isNativeInputKey = void 0;
7
+ exports.useRowDrag = exports.useKeyboardNavigation = exports.useCellFocus = exports.useCellEscapeRevert = exports.suppressNativeInputKeys = exports.isNativeInputKey = exports.focusGridCell = exports.focusAddedRow = exports.createTabToNextCell = void 0;
7
8
  var _react = require("react");
9
+ var _indexColumn = require("./indexColumn");
10
+ var _excluded = ["pending"];
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
13
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
15
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
8
18
  // setSelectionRange 仅 textarea 与 text/search/url/tel/password 类型 input 支持;
9
19
  // checkbox/number/date 等调用会抛 InvalidStateError,故用白名单守卫。@author nokecy
10
20
  var supportsSelectionRange = function supportsSelectionRange(el) {
@@ -72,13 +82,43 @@ var useCellFocusRequests = function useCellFocusRequests() {
72
82
  };
73
83
 
74
84
  /** 单元格聚焦;已获得焦点的控件保留用户光标,等待挂载的请求可被新操作取消。@author nokecy */
85
+
86
+ /**
87
+ * 鼠标点击刚把懒挂载格挂成真控件后,补一次展开。
88
+ * 点击落在纯文本上,控件是点击之后才挂载的,antd 根本没收到这次点击,所以要自己补:
89
+ * Select 在 mousedown 上切换展开(已展开则不动,避免补成关闭),DatePicker 在 click 上展开。@author nokecy
90
+ */
91
+ var openFreshlyMountedControl = function openFreshlyMountedControl(input) {
92
+ if (input.closest('.ant-picker')) {
93
+ input.click();
94
+ return;
95
+ }
96
+ var select = input.closest('.ant-select');
97
+ if (select && !select.classList.contains('ant-select-open')) {
98
+ input.dispatchEvent(new MouseEvent('mousedown', {
99
+ bubbles: true,
100
+ cancelable: true
101
+ }));
102
+ }
103
+ };
104
+
105
+ /**
106
+ * @param options.openDateOnKeyboard 键盘到达日期格时是否自动展开面板,默认 false:与演示一致——
107
+ * 鼠标点击由 antd 自己展开,键盘到达保持收起、直接键入覆盖。传 true 才在键盘落焦那一次展开。
108
+ */
75
109
  var useCellFocus = exports.useCellFocus = function useCellFocus() {
110
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
76
111
  var beginFocusRequest = useCellFocusRequests();
112
+ var openDateOnKeyboard = options.openDateOnKeyboard === true;
113
+ var openDateRef = (0, _react.useRef)(openDateOnKeyboard);
114
+ openDateRef.current = openDateOnKeyboard;
115
+ /** source 是一次性的来源提示,只作用于这一次落焦;鼠标来源与已聚焦的格不会触发展开。 */
77
116
  var focusInputInCell = (0, _react.useCallback)(function (cell) {
78
117
  var _ref, _cell$querySelector;
79
118
  var isTargetCurrent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
80
119
  return true;
81
120
  };
121
+ var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'pointer';
82
122
  var row = cell.closest('.ag-row');
83
123
  var rowId = row === null || row === void 0 ? void 0 : row.getAttribute('row-id');
84
124
  var rowIndex = row === null || row === void 0 ? void 0 : row.getAttribute('row-index');
@@ -93,10 +133,15 @@ var useCellFocus = exports.useCellFocus = function useCellFocus() {
93
133
  if (!(element !== null && element !== void 0 && element.isConnected) || !cell.contains(element) || !request.isCurrent()) return;
94
134
  if (document.activeElement === element) return;
95
135
  element.focus();
96
- // 同步设置首次进入的光标,避免延迟任务覆盖用户随后选择的文字。@author nokecy
136
+ // 懒挂载格的鼠标点击落在纯文本上,antd 没收到点击,挂载后补展开一次(只在刚挂载的那一次,
137
+ // 已聚焦的格在上面直接返回,再点不会重复触发);键盘到达保持收起,openDateOnKeyboard 才在日期格展开。
138
+ if (document.activeElement === element) {
139
+ if (source === 'pointer-activated') openFreshlyMountedControl(element);else if (source === 'keyboard' && openDateRef.current && element.closest('.ant-picker')) element.click();
140
+ }
141
+ // 首次进入全选(规范 §7.6.3:键入即覆盖,不是追加);同步设置,避免延迟任务覆盖用户随后选择的文字。
142
+ // 已聚焦的输入框在上面直接返回,所以用户点出来的光标/选区不会被改动。@author nokecy
97
143
  if (document.activeElement === element && element.matches('input, textarea') && supportsSelectionRange(element)) {
98
- var input = element;
99
- input.setSelectionRange(input.value.length, input.value.length);
144
+ element.select();
100
145
  }
101
146
  };
102
147
  var active = document.activeElement;
@@ -121,11 +166,11 @@ var useCellFocus = exports.useCellFocus = function useCellFocus() {
121
166
  }
122
167
  focusElement((_ref = (_cell$querySelector = cell.querySelector(selector)) !== null && _cell$querySelector !== void 0 ? _cell$querySelector : cell.querySelector('input:not([disabled]), textarea:not([disabled]), [contenteditable="true"], [tabindex]:not([disabled])')) !== null && _ref !== void 0 ? _ref : cell);
123
168
  }, [beginFocusRequest]);
124
- var scheduleCellFocus = (0, _react.useCallback)(function (resolveCell, delay, isTargetCurrent) {
169
+ var scheduleCellFocus = (0, _react.useCallback)(function (resolveCell, delay, isTargetCurrent, source) {
125
170
  var request = beginFocusRequest(resolveCell, isTargetCurrent);
126
171
  request.schedule(function () {
127
172
  var cell = resolveCell();
128
- if (cell !== null && cell !== void 0 && cell.isConnected) focusInputInCell(cell, isTargetCurrent);
173
+ if (cell !== null && cell !== void 0 && cell.isConnected) focusInputInCell(cell, isTargetCurrent, source);
129
174
  }, delay);
130
175
  }, [beginFocusRequest, focusInputInCell]);
131
176
  return {
@@ -139,7 +184,7 @@ var useCellFocus = exports.useCellFocus = function useCellFocus() {
139
184
  * 键盘导航 Hook
140
185
  * 处理方向键在表格单元格间的导航
141
186
  */
142
- var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboardNavigation(ref, dataSource, focusInputInCell, activateCell, beginSharedFocusRequest) {
187
+ var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboardNavigation(ref, dataSource, focusInputInCell, activateCell, beginSharedFocusRequest, isTabFocusDeferred) {
143
188
  var beginLocalFocusRequest = useCellFocusRequests(!beginSharedFocusRequest);
144
189
  var beginFocusRequest = beginSharedFocusRequest !== null && beginSharedFocusRequest !== void 0 ? beginSharedFocusRequest : beginLocalFocusRequest;
145
190
  var handleCellKeyDown = (0, _react.useCallback)(function (event) {
@@ -153,6 +198,31 @@ var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboard
153
198
  // 判定用 keydown 当时记下的(见 suppressNativeInputKeys);没记过(不是 AG-Grid 触发的)才现算。
154
199
  if ((_nativeKeyDecisions$g = nativeKeyDecisions.get(keyEvent)) !== null && _nativeKeyDecisions$g !== void 0 ? _nativeKeyDecisions$g : isNativeInputKey(keyEvent)) return;
155
200
 
201
+ // Tab / Enter 由 AG-Grid 自己换格,但它只聚焦单元格 div,输入框拿不到焦点、键入无效:
202
+ // 等 AG-Grid 换完格再把焦点落进新格的输入框(并全选)。方向键走下面自己的导航。@author nokecy
203
+ if ((keyEvent.key === 'Tab' || keyEvent.key === 'Enter') && !keyEvent.ctrlKey && !keyEvent.altKey && !keyEvent.metaKey) {
204
+ if (keyEvent.key === 'Tab' && isTabFocusDeferred !== null && isTabFocusDeferred !== void 0 && isTabFocusDeferred()) return;
205
+ var resolveFocused = function resolveFocused() {
206
+ var _api$getFocusedCell, _ref$current$querySel, _ref$current;
207
+ var focused = (_api$getFocusedCell = api.getFocusedCell) === null || _api$getFocusedCell === void 0 ? void 0 : _api$getFocusedCell.call(api);
208
+ if (!focused) return null;
209
+ return (_ref$current$querySel = (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector(".ag-row[row-index=\"".concat(focused.rowIndex, "\"] .ag-cell[col-id=\"").concat(focused.column.getColId(), "\"]"))) !== null && _ref$current$querySel !== void 0 ? _ref$current$querySel : null;
210
+ };
211
+ var request = beginFocusRequest(resolveFocused);
212
+ request.schedule(function () {
213
+ var _api$getFocusedCell2, _api$getDisplayedRowA;
214
+ // 懒挂载格先激活挂树,再给挂载留出时间。
215
+ var focused = (_api$getFocusedCell2 = api.getFocusedCell) === null || _api$getFocusedCell2 === void 0 ? void 0 : _api$getFocusedCell2.call(api);
216
+ var focusedNode = focused ? (_api$getDisplayedRowA = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA === void 0 ? void 0 : _api$getDisplayedRowA.call(api, focused.rowIndex) : undefined;
217
+ var justActivated = !!(activateCell && focused && focusedNode && activateCell(api, focusedNode, focused.column.getColId()));
218
+ request.schedule(function () {
219
+ var cell = resolveFocused();
220
+ if (cell !== null && cell !== void 0 && cell.isConnected) focusInputInCell(cell, undefined, 'keyboard');
221
+ }, justActivated ? 150 : 10);
222
+ }, 10);
223
+ return;
224
+ }
225
+
156
226
  // 处理上下左右键导航
157
227
  if (keyEvent.key === 'ArrowDown' || keyEvent.key === 'ArrowUp' || keyEvent.key === 'ArrowLeft' || keyEvent.key === 'ArrowRight') {
158
228
  var currentRowIndex = node.rowIndex;
@@ -194,17 +264,17 @@ var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboard
194
264
  // 检查目标位置是否有效
195
265
  var isValidTarget = keyEvent.key === 'ArrowLeft' || keyEvent.key === 'ArrowRight' || targetRowIndex >= 0 && targetRowIndex < dataSource.length;
196
266
  if (isValidTarget) {
197
- var _api$getDisplayedRowA;
198
- var targetNode = (_api$getDisplayedRowA = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA === void 0 ? void 0 : _api$getDisplayedRowA.call(api, targetRowIndex);
267
+ var _api$getDisplayedRowA2;
268
+ var targetNode = (_api$getDisplayedRowA2 = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA2 === void 0 ? void 0 : _api$getDisplayedRowA2.call(api, targetRowIndex);
199
269
  var navigated = false;
200
270
  var resolveTarget = function resolveTarget() {
201
- var _ref$current;
202
- return (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector(".ag-row[row-index=\"".concat(targetRowIndex, "\"] .ag-cell[col-id=\"").concat(targetColId, "\"]"));
271
+ var _ref$current2;
272
+ return (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.querySelector(".ag-row[row-index=\"".concat(targetRowIndex, "\"] .ag-cell[col-id=\"").concat(targetColId, "\"]"));
203
273
  };
204
274
  var _isTargetCurrent = function _isTargetCurrent() {
205
- var _ref$current2, _api$isDestroyed, _api$getDisplayedRowA2;
206
- if (!((_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.isConnected) || (_api$isDestroyed = api.isDestroyed) !== null && _api$isDestroyed !== void 0 && _api$isDestroyed.call(api)) return false;
207
- if (targetNode && ((_api$getDisplayedRowA2 = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA2 === void 0 ? void 0 : _api$getDisplayedRowA2.call(api, targetRowIndex)) !== targetNode) return false;
275
+ var _ref$current3, _api$isDestroyed, _api$getDisplayedRowA3;
276
+ if (!((_ref$current3 = ref.current) !== null && _ref$current3 !== void 0 && _ref$current3.isConnected) || (_api$isDestroyed = api.isDestroyed) !== null && _api$isDestroyed !== void 0 && _api$isDestroyed.call(api)) return false;
277
+ if (targetNode && ((_api$getDisplayedRowA3 = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA3 === void 0 ? void 0 : _api$getDisplayedRowA3.call(api, targetRowIndex)) !== targetNode) return false;
208
278
  if (navigated && api.getFocusedCell) {
209
279
  var _focused$column;
210
280
  var focused = api.getFocusedCell();
@@ -212,9 +282,9 @@ var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboard
212
282
  }
213
283
  return true;
214
284
  };
215
- var request = beginFocusRequest(resolveTarget, _isTargetCurrent);
285
+ var _request = beginFocusRequest(resolveTarget, _isTargetCurrent);
216
286
  // 延迟执行以确保当前编辑完成
217
- request.schedule(function () {
287
+ _request.schedule(function () {
218
288
  api.setFocusedCell(targetRowIndex, targetColId);
219
289
  navigated = true;
220
290
 
@@ -226,10 +296,10 @@ var useKeyboardNavigation = exports.useKeyboardNavigation = function useKeyboard
226
296
  // 不使用原生startEditingCell,而是手动触发编辑状态
227
297
  // v33 themeQuartz 容器不再有 .ag-theme-alpine 类;且行虚拟化下 DOM 顺序与 rowIndex 不一致,
228
298
  // 改为直接在 ref 容器内按 row-index + col-id 属性定位目标单元格 @author nokecy
229
- request.schedule(function () {
299
+ _request.schedule(function () {
230
300
  var targetCell = resolveTarget();
231
301
  if (targetCell !== null && targetCell !== void 0 && targetCell.isConnected) {
232
- focusInputInCell(targetCell, _isTargetCurrent);
302
+ focusInputInCell(targetCell, _isTargetCurrent, 'keyboard');
233
303
  }
234
304
  }, 150);
235
305
  }, 10);
@@ -293,6 +363,8 @@ var isNativeInputKey = exports.isNativeInputKey = function isNativeInputKey(even
293
363
  var key = event.key;
294
364
  if (event.isComposing) return true;
295
365
  if ((event.ctrlKey || event.metaKey) && key.toLowerCase() === 'a') return true;
366
+ // 复制/剪切/粘贴交给输入框的原生行为:AG-Grid 不应拦走单元格内输入框的 Ctrl/Cmd+C/X/V(允许粘贴,规范 §11)。
367
+ if ((event.ctrlKey || event.metaKey) && !event.altKey && ['c', 'x', 'v'].includes(key.toLowerCase())) return true;
296
368
  if (key === 'Home' || key === 'End') return true;
297
369
  if (!key.startsWith('Arrow')) return false;
298
370
  if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) return true;
@@ -323,4 +395,165 @@ var suppressNativeInputKeys = exports.suppressNativeInputKeys = function suppres
323
395
  var native = isNativeInputKey(event);
324
396
  nativeKeyDecisions.set(event, native);
325
397
  return native;
398
+ };
399
+ /**
400
+ * 行已在行模型里:滚到可见、设焦点格、必要时激活懒挂载格,等格子渲染出来后把焦点落进输入控件。
401
+ * 行进入模型后 DOM 还要再渲染一拍(懒挂载格还要挂载),所以分多次轮询,直到格子出现;
402
+ * 返回的 Promise 在落焦完成(返回获得焦点的控件)、或请求被用户操作取消 / 超时(返回 undefined)时结束。@author nokecy
403
+ */
404
+ var focusGridCell = exports.focusGridCell = function focusGridCell(params) {
405
+ var _api$getDisplayedRowA4, _api$isDestroyed2, _api$ensureIndexVisib, _api$ensureColumnVisi;
406
+ var api = params.api,
407
+ root = params.root,
408
+ rowIndex = params.rowIndex,
409
+ colId = params.colId,
410
+ beginFocusRequest = params.beginFocusRequest,
411
+ focusInputInCell = params.focusInputInCell,
412
+ activateCell = params.activateCell;
413
+ var node = (_api$getDisplayedRowA4 = api.getDisplayedRowAtIndex) === null || _api$getDisplayedRowA4 === void 0 ? void 0 : _api$getDisplayedRowA4.call(api, rowIndex);
414
+ if (!node || (_api$isDestroyed2 = api.isDestroyed) !== null && _api$isDestroyed2 !== void 0 && _api$isDestroyed2.call(api)) return Promise.resolve(undefined);
415
+ var resolveCell = function resolveCell() {
416
+ var _root$current;
417
+ return (_root$current = root.current) === null || _root$current === void 0 ? void 0 : _root$current.querySelector(".ag-row[row-index=\"".concat(rowIndex, "\"] .ag-cell[col-id=\"").concat(colId, "\"]"));
418
+ };
419
+ var isTargetCurrent = function isTargetCurrent() {
420
+ var _root$current2, _api$isDestroyed3, _api$getFocusedCell3;
421
+ if (!((_root$current2 = root.current) !== null && _root$current2 !== void 0 && _root$current2.isConnected) || (_api$isDestroyed3 = api.isDestroyed) !== null && _api$isDestroyed3 !== void 0 && _api$isDestroyed3.call(api)) return false;
422
+ var focused = (_api$getFocusedCell3 = api.getFocusedCell) === null || _api$getFocusedCell3 === void 0 ? void 0 : _api$getFocusedCell3.call(api);
423
+ return !focused || focused.rowIndex === rowIndex && focused.column.getColId() === colId;
424
+ };
425
+ var request = beginFocusRequest(resolveCell, isTargetCurrent);
426
+ (_api$ensureIndexVisib = api.ensureIndexVisible) === null || _api$ensureIndexVisib === void 0 || _api$ensureIndexVisib.call(api, rowIndex);
427
+ if (params.ensureColumnVisible) (_api$ensureColumnVisi = api.ensureColumnVisible) === null || _api$ensureColumnVisi === void 0 || _api$ensureColumnVisi.call(api, colId);
428
+ api.setFocusedCell(rowIndex, colId);
429
+ var activated = activateCell ? activateCell(api, node, colId) : false;
430
+ return new Promise(function (resolve) {
431
+ var attempt = function attempt(remaining) {
432
+ if (!request.isCurrent()) return resolve(undefined);
433
+ var cell = resolveCell();
434
+ if (cell !== null && cell !== void 0 && cell.isConnected) {
435
+ focusInputInCell(cell, isTargetCurrent, 'keyboard');
436
+ var active = document.activeElement;
437
+ return resolve(active instanceof HTMLElement && cell.contains(active) ? active : undefined);
438
+ }
439
+ if (remaining <= 0) return resolve(undefined);
440
+ setTimeout(function () {
441
+ return attempt(remaining - 1);
442
+ }, 50);
443
+ };
444
+ setTimeout(function () {
445
+ return attempt(8);
446
+ }, activated ? 150 : 30);
447
+ });
448
+ };
449
+
450
+ // 按行 id 记录:排序时新行的显示行号与数据下标不一致,落焦必须取行节点的显示行号。
451
+
452
+ /**
453
+ * 新增行进入 AG-Grid 行模型之后,把焦点落到它的首个可编辑格。
454
+ *
455
+ * 新行是 field.push 之后经 React 重渲、rowData 更新才进入行模型的,push 当下 getDisplayedRowAtIndex 还取不到它,
456
+ * 所以由 onRowDataUpdated 调用本函数;行模型里还没有该行时返回 false,调用方保留待办等下一次。@author nokecy
457
+ */
458
+ var focusAddedRow = exports.focusAddedRow = function focusAddedRow(params) {
459
+ var _rest$api$isDestroyed, _rest$api, _rest$api$getRowNode, _rest$api2;
460
+ var pending = params.pending,
461
+ rest = _objectWithoutProperties(params, _excluded);
462
+ if ((_rest$api$isDestroyed = (_rest$api = rest.api).isDestroyed) !== null && _rest$api$isDestroyed !== void 0 && _rest$api$isDestroyed.call(_rest$api)) return true;
463
+ var rowIndex = (_rest$api$getRowNode = (_rest$api2 = rest.api).getRowNode) === null || _rest$api$getRowNode === void 0 || (_rest$api$getRowNode = _rest$api$getRowNode.call(_rest$api2, pending.rowId)) === null || _rest$api$getRowNode === void 0 ? void 0 : _rest$api$getRowNode.rowIndex;
464
+ if (typeof rowIndex !== 'number') return false;
465
+ void focusGridCell(_objectSpread(_objectSpread({}, rest), {}, {
466
+ rowIndex: rowIndex,
467
+ colId: pending.colId
468
+ }));
469
+ return true;
470
+ };
471
+
472
+ /** 不应被 Tab 停留的列:默认序号列与勾选列(规范 §7.6.3:Tab 只在可编辑格之间移动)。@author nokecy */
473
+ var isTabSkippedColumn = function isTabSkippedColumn(colId) {
474
+ return colId === _indexColumn.ARRAY_TABLE_INDEX_FIELD || colId === 'ag-Grid-SelectionColumn';
475
+ };
476
+
477
+ /**
478
+ * AG-Grid `tabToNextCell`:跳过序号列/勾选列;末行末格再按 Tab 时,传了 `onTabPastEnd` 就由它新增一行并落焦,
479
+ * 否则保持默认(焦点离开表格)。返回值语义见 AG-Grid:位置=去那格,true=留在原格,false=交浏览器。@author nokecy
480
+ */
481
+ var createTabToNextCell = exports.createTabToNextCell = function createTabToNextCell(onTabPastEnd) {
482
+ return function (params) {
483
+ var _params$api$getAllDis, _params$api$getAllDis2, _params$api, _params$api$getDispla, _params$api$getDispla2, _params$api2;
484
+ var columns = (_params$api$getAllDis = (_params$api$getAllDis2 = (_params$api = params.api).getAllDisplayedColumns) === null || _params$api$getAllDis2 === void 0 ? void 0 : _params$api$getAllDis2.call(_params$api)) !== null && _params$api$getAllDis !== void 0 ? _params$api$getAllDis : [];
485
+ var step = params.backwards ? -1 : 1;
486
+ var rowCount = (_params$api$getDispla = (_params$api$getDispla2 = (_params$api2 = params.api).getDisplayedRowCount) === null || _params$api$getDispla2 === void 0 ? void 0 : _params$api$getDispla2.call(_params$api2)) !== null && _params$api$getDispla !== void 0 ? _params$api$getDispla : 0;
487
+ var next = params.nextCellPosition;
488
+ var prev = params.previousCellPosition;
489
+ // AG-Grid 在行首/行尾会折到相邻行;统一在这里按列序重新找下一个可停留的格。
490
+ if (next && isTabSkippedColumn(next.column.getColId())) {
491
+ var rowIndex = next.rowIndex;
492
+ var colIndex = columns.indexOf(next.column) + step;
493
+ for (;;) {
494
+ if (colIndex < 0 || colIndex >= columns.length) {
495
+ rowIndex += step;
496
+ if (rowIndex < 0 || rowIndex >= rowCount) {
497
+ next = null;
498
+ break;
499
+ }
500
+ colIndex = step > 0 ? 0 : columns.length - 1;
501
+ continue;
502
+ }
503
+ if (!isTabSkippedColumn(columns[colIndex].getColId())) {
504
+ next = _objectSpread(_objectSpread({}, next), {}, {
505
+ rowIndex: rowIndex,
506
+ column: columns[colIndex]
507
+ });
508
+ break;
509
+ }
510
+ colIndex += step;
511
+ }
512
+ }
513
+ if (next) return next;
514
+ // 没有下一格:前进方向且正处在最后一格 -> 新增行
515
+ if (!params.backwards && onTabPastEnd && prev && prev.rowIndex === rowCount - 1) {
516
+ onTabPastEnd();
517
+ return true;
518
+ }
519
+ return false;
520
+ };
521
+ };
522
+
523
+ /**
524
+ * Esc 放弃本格修改(规范 §7.6.3):Formily 受控值是实时写入的,没有「进入时的值」,
525
+ * 所以在输入框获得焦点时记下当时的文本,Esc 时用原生 setter + input 事件写回,值照常经 Formily 回流。
526
+ * 下拉/日期等自带 Esc 语义的控件不处理。@author nokecy
527
+ */
528
+ var useCellEscapeRevert = exports.useCellEscapeRevert = function useCellEscapeRevert(ref) {
529
+ (0, _react.useEffect)(function () {
530
+ var root = ref.current;
531
+ if (!root) return;
532
+ var snapshots = new WeakMap();
533
+ var isPlainInput = function isPlainInput(el) {
534
+ return el instanceof HTMLInputElement && !el.readOnly && !el.disabled && !el.closest('.ant-select, .ant-picker') && /^(text|search|url|tel|number)$/i.test(el.type || 'text');
535
+ };
536
+ var onFocusIn = function onFocusIn(event) {
537
+ if (isPlainInput(event.target)) snapshots.set(event.target, event.target.value);
538
+ };
539
+ var onKeyDown = function onKeyDown(event) {
540
+ var _Object$getOwnPropert;
541
+ if (event.key !== 'Escape' || event.isComposing || !isPlainInput(event.target)) return;
542
+ var snapshot = snapshots.get(event.target);
543
+ if (snapshot === undefined || snapshot === event.target.value) return;
544
+ var setter = (_Object$getOwnPropert = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')) === null || _Object$getOwnPropert === void 0 ? void 0 : _Object$getOwnPropert.set;
545
+ setter === null || setter === void 0 || setter.call(event.target, snapshot);
546
+ event.target.dispatchEvent(new Event('input', {
547
+ bubbles: true
548
+ }));
549
+ event.target.select();
550
+ event.stopPropagation();
551
+ };
552
+ root.addEventListener('focusin', onFocusIn);
553
+ root.addEventListener('keydown', onKeyDown, true);
554
+ return function () {
555
+ root.removeEventListener('focusin', onFocusIn);
556
+ root.removeEventListener('keydown', onKeyDown, true);
557
+ };
558
+ }, [ref]);
326
559
  };
@@ -2,12 +2,18 @@ import React from "react";
2
2
  import { AgGridReactProps } from "ag-grid-react";
3
3
  declare const _default: React.ForwardRefExoticComponent<Partial<AgGridReactProps<any> & {
4
4
  height?: string | number | undefined;
5
+ minRows?: number | undefined;
6
+ maxRows?: number | undefined;
5
7
  gridKey: string;
8
+ title?: React.ReactNode;
6
9
  onRowDrag?: boolean | undefined;
7
10
  disabled?: boolean | undefined;
8
11
  batchRemove?: boolean | undefined;
9
12
  onRemove?: ((index: number) => void) | undefined;
10
13
  fixedColumnsMaxRatio?: number | undefined;
14
+ tabAddsRow?: boolean | undefined;
15
+ openDateOnKeyboard?: boolean | undefined;
16
+ summary?: import("./summary").ArrayTableSummary | undefined;
11
17
  } & {
12
18
  children?: React.ReactNode;
13
19
  }> & React.RefAttributes<any>>;