@nokecy/qc-ui 1.1.87 → 1.1.89

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 (98) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +151 -145
  2. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  3. package/dist/cjs/ag-grid-plus/interface.d.ts +8 -0
  4. package/dist/cjs/ag-grid-plus/queryForm/index.d.ts +4 -0
  5. package/dist/cjs/ag-grid-plus/queryForm/index.js +63 -53
  6. package/dist/cjs/ag-grid-plus/queryForm/queryColumns.d.ts +8 -0
  7. package/dist/cjs/ag-grid-plus/queryForm/queryColumns.js +52 -0
  8. package/dist/cjs/ag-grid-plus/queryForm/schemaKey.d.ts +15 -8
  9. package/dist/cjs/ag-grid-plus/queryForm/schemaKey.js +64 -12
  10. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.js +3 -0
  11. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +69 -106
  12. package/dist/cjs/ag-grid-plus/setting/QuerySchemeManager.js +3 -1
  13. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.d.ts +2 -0
  14. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +14 -0
  15. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +98 -110
  16. package/dist/cjs/ag-grid-plus/types.d.ts +6 -0
  17. package/dist/cjs/array-table/batchRemove.d.ts +36 -0
  18. package/dist/cjs/array-table/batchRemove.js +299 -0
  19. package/dist/cjs/array-table/cellFocusScope.js +44 -8
  20. package/dist/cjs/array-table/cellInteractionLock.d.ts +13 -0
  21. package/dist/cjs/array-table/cellInteractionLock.js +26 -0
  22. package/dist/cjs/array-table/hooks.d.ts +11 -6
  23. package/dist/cjs/array-table/hooks.js +138 -88
  24. package/dist/cjs/array-table/index.d.ts +8 -2
  25. package/dist/cjs/array-table/index.js +55 -32
  26. package/dist/cjs/array-table/indexColumn.d.ts +1 -1
  27. package/dist/cjs/array-table/indexColumn.js +3 -2
  28. package/dist/cjs/array-table/interface.d.ts +13 -1
  29. package/dist/cjs/array-table/preview.js +8 -0
  30. package/dist/cjs/array-table/readOnlyFormatters.d.ts +9 -1
  31. package/dist/cjs/array-table/readOnlyFormatters.js +41 -13
  32. package/dist/cjs/array-table/rowIdentity.d.ts +17 -0
  33. package/dist/cjs/array-table/rowIdentity.js +43 -0
  34. package/dist/cjs/array-table/sorting.d.ts +3 -0
  35. package/dist/cjs/array-table/sorting.js +46 -0
  36. package/dist/cjs/array-table/utils.js +146 -67
  37. package/dist/cjs/dialogSelect/index.d.ts +3 -0
  38. package/dist/cjs/dialogSelect/index.js +13 -3
  39. package/dist/cjs/editable/index.js +101 -139
  40. package/dist/cjs/index.d.ts +2 -2
  41. package/dist/cjs/index.js +14 -0
  42. package/dist/cjs/readPretty/arrayTable.js +29 -14
  43. package/dist/cjs/readPretty/formily.d.ts +1 -0
  44. package/dist/cjs/readPretty/formily.js +7 -0
  45. package/dist/cjs/readPretty/index.d.ts +1 -0
  46. package/dist/cjs/readPretty/index.js +7 -0
  47. package/dist/cjs/readPretty/schemaScope.d.ts +2 -0
  48. package/dist/cjs/readPretty/schemaScope.js +49 -0
  49. package/dist/esm/ag-grid-plus/ag-gridPlus.js +151 -145
  50. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  51. package/dist/esm/ag-grid-plus/interface.d.ts +8 -0
  52. package/dist/esm/ag-grid-plus/queryForm/index.d.ts +4 -0
  53. package/dist/esm/ag-grid-plus/queryForm/index.js +64 -55
  54. package/dist/esm/ag-grid-plus/queryForm/queryColumns.d.ts +8 -0
  55. package/dist/esm/ag-grid-plus/queryForm/queryColumns.js +46 -0
  56. package/dist/esm/ag-grid-plus/queryForm/schemaKey.d.ts +15 -8
  57. package/dist/esm/ag-grid-plus/queryForm/schemaKey.js +64 -12
  58. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.js +3 -0
  59. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +70 -107
  60. package/dist/esm/ag-grid-plus/setting/QuerySchemeManager.js +3 -1
  61. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.d.ts +2 -0
  62. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +14 -0
  63. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +95 -110
  64. package/dist/esm/ag-grid-plus/types.d.ts +6 -0
  65. package/dist/esm/array-table/batchRemove.d.ts +36 -0
  66. package/dist/esm/array-table/batchRemove.js +289 -0
  67. package/dist/esm/array-table/cellFocusScope.js +45 -9
  68. package/dist/esm/array-table/cellInteractionLock.d.ts +13 -0
  69. package/dist/esm/array-table/cellInteractionLock.js +21 -0
  70. package/dist/esm/array-table/hooks.d.ts +11 -6
  71. package/dist/esm/array-table/hooks.js +139 -89
  72. package/dist/esm/array-table/index.d.ts +8 -2
  73. package/dist/esm/array-table/index.js +55 -32
  74. package/dist/esm/array-table/indexColumn.d.ts +1 -1
  75. package/dist/esm/array-table/indexColumn.js +3 -2
  76. package/dist/esm/array-table/interface.d.ts +13 -1
  77. package/dist/esm/array-table/preview.js +8 -0
  78. package/dist/esm/array-table/readOnlyFormatters.d.ts +9 -1
  79. package/dist/esm/array-table/readOnlyFormatters.js +41 -12
  80. package/dist/esm/array-table/rowIdentity.d.ts +17 -0
  81. package/dist/esm/array-table/rowIdentity.js +37 -0
  82. package/dist/esm/array-table/sorting.d.ts +3 -0
  83. package/dist/esm/array-table/sorting.js +40 -0
  84. package/dist/esm/array-table/utils.js +147 -68
  85. package/dist/esm/dialogSelect/index.d.ts +3 -0
  86. package/dist/esm/dialogSelect/index.js +13 -3
  87. package/dist/esm/editable/index.js +102 -140
  88. package/dist/esm/index.d.ts +2 -2
  89. package/dist/esm/index.js +1 -1
  90. package/dist/esm/readPretty/arrayTable.js +30 -13
  91. package/dist/esm/readPretty/formily.d.ts +1 -0
  92. package/dist/esm/readPretty/formily.js +1 -0
  93. package/dist/esm/readPretty/index.d.ts +1 -0
  94. package/dist/esm/readPretty/index.js +1 -0
  95. package/dist/esm/readPretty/schemaScope.d.ts +2 -0
  96. package/dist/esm/readPretty/schemaScope.js +42 -0
  97. package/dist/umd/qc-ui.min.js +1 -1
  98. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "emptyState", "accessible", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType", "valueEnumContrast"];
1
+ var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "onQueryValuesChange", "emptyState", "accessible", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType", "valueEnumContrast"];
2
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
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); }
4
4
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
@@ -77,6 +77,7 @@ function useDeepCompareStable(value) {
77
77
  return ref.current;
78
78
  }
79
79
  function AgGridPlus(props) {
80
+ var _ref;
80
81
  var gridTheme = useAgGridTheme();
81
82
  var _theme$useToken = theme.useToken(),
82
83
  token = _theme$useToken.token; // 高级筛选入口跟随主题及客户主色。@author nokecy
@@ -100,6 +101,7 @@ function AgGridPlus(props) {
100
101
  overlayNoRowsTemplateText = props.overlayNoRowsTemplateText,
101
102
  queryDefaultRows = props.queryDefaultRows,
102
103
  onSelectedRowsChange = props.onSelectedRowsChange,
104
+ onQueryValuesChange = props.onQueryValuesChange,
103
105
  emptyState = props.emptyState,
104
106
  _props$accessible = props.accessible,
105
107
  accessible = _props$accessible === void 0 ? true : _props$accessible,
@@ -228,35 +230,6 @@ function AgGridPlus(props) {
228
230
  _useState28 = _slicedToArray(_useState27, 2),
229
231
  advancedQueryRules = _useState28[0],
230
232
  setAdvancedQueryRules = _useState28[1];
231
-
232
- /**
233
- * 【P1 架构优化】使用单向数据流架构
234
- *
235
- * 数据流层次:
236
- * 1. Source of Truth: useSchemeDataFlow (Scheme State)
237
- * 2. Derived State: derivedColumnDefs/derivedColumnState (只读派生)
238
- * 3. UI State: Context State (仅用于 UI 交互)
239
- *
240
- * 优势:
241
- * - 清晰的数据流向(单向可追踪)
242
- * - 消除状态同步冲突(单一数据源)
243
- * - 架构清晰度 +60%,Bug -40%
244
- */
245
- var schemeDataFlow = useSchemeDataFlow(gridKey || '', allColDefsRef.current, {
246
- columnSchemes: columnSchemes,
247
- querySchemes: querySchemes,
248
- currentSchemes: currentSchemes
249
- });
250
-
251
- // 解构单向数据流的数据
252
- var currentColumnSchemes = schemeDataFlow.columnSchemes,
253
- currentColumnScheme = schemeDataFlow.currentColumnScheme,
254
- currentQuerySchemes = schemeDataFlow.querySchemes,
255
- currentQueryScheme = schemeDataFlow.currentQueryScheme,
256
- derivedColumnDefs = schemeDataFlow.derivedColumnDefs,
257
- derivedColumnState = schemeDataFlow.derivedColumnState,
258
- isUsingGlobalFallback = schemeDataFlow.isUsingGlobalFallback,
259
- isUsingGlobalQueryFallback = schemeDataFlow.isUsingGlobalQueryFallback;
260
233
  useImperativeHandle(propsGridRef, function () {
261
234
  return gridRef.current;
262
235
  });
@@ -313,117 +286,6 @@ function AgGridPlus(props) {
313
286
 
314
287
  // 用于列类型推断的首行数据。为什么必须是 state 而不是 ref,见该 hook 的注释。@author nokecy
315
288
  var typeInferenceRow = useTypeInferenceRow(rowData);
316
-
317
- /**
318
- * 【P0 + P1 优化】使用派生状态应用方案(单向数据流)
319
- *
320
- * 优势:
321
- * 1. 使用已派生的状态,避免重复计算
322
- * 2. 单向数据流,状态同步更可靠
323
- * 3. 性能提升 67%,代码更清晰
324
- * 4. 使用 Promise 链和 requestAnimationFrame 解决竞态条件
325
- */
326
- useEffect(function () {
327
- if (!gridKey || !apiRef.current) return;
328
-
329
- // 使用 Promise 链确保顺序执行,避免竞态条件
330
- var cancelled = false;
331
- Promise.resolve().then(function () {
332
- if (cancelled || !apiRef.current) return;
333
-
334
- // 1. 应用派生的列状态(使用 applyColumnState API)
335
- if (derivedColumnState && derivedColumnState.length > 0) {
336
- // 使用 applyColumnState 而不是 setGridOption("columnDefs")
337
- apiRef.current.applyColumnState({
338
- state: derivedColumnState,
339
- applyOrder: true // 应用列顺序
340
- });
341
- }
342
-
343
- // 2. 应用派生的列样式
344
- if (derivedColumnState) {
345
- setColumnCellClass(handelgridPlusColumnState(derivedColumnState));
346
- }
347
- }).then(function () {
348
- // 等待 Grid 状态稳定(使用 requestAnimationFrame 而非固定延迟)
349
- return new Promise(function (resolve) {
350
- if (cancelled) {
351
- resolve();
352
- return;
353
- }
354
- requestAnimationFrame(function () {
355
- // 双重 RAF 确保渲染完成
356
- requestAnimationFrame(function () {
357
- return resolve();
358
- });
359
- });
360
- });
361
- }).then(function () {
362
- if (cancelled || !apiRef.current) return;
363
-
364
- // 3. 应用过滤器(在列状态稳定后执行)
365
- if (currentColumnScheme !== null && currentColumnScheme !== void 0 && currentColumnScheme.filterModel) {
366
- apiRef.current.setFilterModel(currentColumnScheme.filterModel);
367
- }
368
- }).catch(function (error) {
369
- if (!cancelled) {
370
- console.error('[AgGridPlus] 应用方案失败:', error);
371
- logger.error('[AgGridPlus] 应用方案失败', error);
372
- }
373
- });
374
-
375
- // 清理函数:取消进行中的操作
376
- return function () {
377
- cancelled = true;
378
- };
379
- }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, derivedColumnState, ready // 添加 ready 依赖,确保 Grid 初始化完成后再应用方案
380
- ]);
381
-
382
- /**
383
- * 【新增】监听当前方案 ID 变化,当方案被删除时重置列状态
384
- *
385
- * 场景:
386
- * - 用户删除当前正在使用的方案
387
- * - currentColumnScheme?.id 从有值变为 null
388
- *
389
- * 行为:
390
- * - 重置列状态为初始状态(默认顺序、宽度等)
391
- * - 清除所有过滤器
392
- * - 清除列样式配置
393
- *
394
- * 优势:
395
- * - 符合单向数据流架构
396
- * - 适用于所有方案切换场景(删除/取消选择)
397
- * - 用户体验好,自动恢复到初始状态
398
- */
399
- var prevSchemeIdRef = useRef(currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id);
400
- useEffect(function () {
401
- if (!gridKey || !apiRef.current || !ready) return;
402
- var prevSchemeId = prevSchemeIdRef.current;
403
- var currentSchemeId = currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id;
404
-
405
- // 检测方案被删除:从有值变为 null/undefined
406
- if (prevSchemeId && !currentSchemeId) {
407
- Promise.resolve().then(function () {
408
- if (!apiRef.current) return;
409
-
410
- // 1. 重置列状态为初始状态
411
- apiRef.current.resetColumnState();
412
-
413
- // 2. 清除所有过滤器
414
- apiRef.current.setFilterModel(null);
415
-
416
- // 3. 清除列样式配置
417
- setColumnCellClass({});
418
- }).catch(function (error) {
419
- console.error('[AgGridPlus] 重置列状态失败:', error);
420
- logger.error('[AgGridPlus] 重置列状态失败', error);
421
- });
422
- }
423
-
424
- // 更新引用
425
- prevSchemeIdRef.current = currentSchemeId;
426
- }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, ready]);
427
289
  useEffect(function () {
428
290
  setRowData(dataSource || propRowData || []);
429
291
  }, [dataSource, propRowData]);
@@ -562,6 +424,147 @@ function AgGridPlus(props) {
562
424
  return cols;
563
425
  }, [React.Children.count(children), props.columnDefs, extensibleColumns, gridKey, entityType, hostEntityExtensions, typeInferenceRow, valueEnumContrast ? token.colorBgContainer : undefined]);
564
426
 
427
+ // 方案派生依赖本轮源码列,避免读取尚未更新的 ref 快照。@author nokecy
428
+ /**
429
+ * 【P1 架构优化】使用单向数据流架构
430
+ *
431
+ * 数据流层次:
432
+ * 1. Source of Truth: useSchemeDataFlow (Scheme State)
433
+ * 2. Derived State: derivedColumnDefs/derivedColumnState (只读派生)
434
+ * 3. UI State: Context State (仅用于 UI 交互)
435
+ *
436
+ * 优势:
437
+ * - 清晰的数据流向(单向可追踪)
438
+ * - 消除状态同步冲突(单一数据源)
439
+ * - 架构清晰度 +60%,Bug -40%
440
+ */
441
+ var schemeDataFlow = useSchemeDataFlow(gridKey || '', allColDefs, {
442
+ columnSchemes: columnSchemes,
443
+ querySchemes: querySchemes,
444
+ currentSchemes: currentSchemes
445
+ });
446
+
447
+ // 解构单向数据流的数据
448
+ var currentColumnSchemes = schemeDataFlow.columnSchemes,
449
+ currentColumnScheme = schemeDataFlow.currentColumnScheme,
450
+ currentQuerySchemes = schemeDataFlow.querySchemes,
451
+ currentQueryScheme = schemeDataFlow.currentQueryScheme,
452
+ derivedColumnDefs = schemeDataFlow.derivedColumnDefs,
453
+ derivedColumnState = schemeDataFlow.derivedColumnState,
454
+ isUsingGlobalFallback = schemeDataFlow.isUsingGlobalFallback,
455
+ isUsingGlobalQueryFallback = schemeDataFlow.isUsingGlobalQueryFallback;
456
+
457
+ /**
458
+ * 【P0 + P1 优化】使用派生状态应用方案(单向数据流)
459
+ *
460
+ * 优势:
461
+ * 1. 使用已派生的状态,避免重复计算
462
+ * 2. 单向数据流,状态同步更可靠
463
+ * 3. 性能提升 67%,代码更清晰
464
+ * 4. 使用 Promise 链和 requestAnimationFrame 解决竞态条件
465
+ */
466
+ useEffect(function () {
467
+ if (!gridKey || !apiRef.current) return;
468
+
469
+ // 使用 Promise 链确保顺序执行,避免竞态条件
470
+ var cancelled = false;
471
+ Promise.resolve().then(function () {
472
+ if (cancelled || !apiRef.current) return;
473
+
474
+ // 1. 应用派生的列状态(使用 applyColumnState API)
475
+ if (derivedColumnState && derivedColumnState.length > 0) {
476
+ // 使用 applyColumnState 而不是 setGridOption("columnDefs")
477
+ apiRef.current.applyColumnState({
478
+ state: derivedColumnState,
479
+ applyOrder: true // 应用列顺序
480
+ });
481
+ }
482
+
483
+ // 2. 应用派生的列样式
484
+ if (derivedColumnState) {
485
+ setColumnCellClass(handelgridPlusColumnState(derivedColumnState));
486
+ }
487
+ }).then(function () {
488
+ // 等待 Grid 状态稳定(使用 requestAnimationFrame 而非固定延迟)
489
+ return new Promise(function (resolve) {
490
+ if (cancelled) {
491
+ resolve();
492
+ return;
493
+ }
494
+ requestAnimationFrame(function () {
495
+ // 双重 RAF 确保渲染完成
496
+ requestAnimationFrame(function () {
497
+ return resolve();
498
+ });
499
+ });
500
+ });
501
+ }).then(function () {
502
+ if (cancelled || !apiRef.current) return;
503
+
504
+ // 3. 应用过滤器(在列状态稳定后执行)
505
+ if (currentColumnScheme !== null && currentColumnScheme !== void 0 && currentColumnScheme.filterModel) {
506
+ apiRef.current.setFilterModel(currentColumnScheme.filterModel);
507
+ }
508
+ }).catch(function (error) {
509
+ if (!cancelled) {
510
+ console.error('[AgGridPlus] 应用方案失败:', error);
511
+ logger.error('[AgGridPlus] 应用方案失败', error);
512
+ }
513
+ });
514
+
515
+ // 清理函数:取消进行中的操作
516
+ return function () {
517
+ cancelled = true;
518
+ };
519
+ }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, derivedColumnState, ready // 添加 ready 依赖,确保 Grid 初始化完成后再应用方案
520
+ ]);
521
+
522
+ /**
523
+ * 【新增】监听当前方案 ID 变化,当方案被删除时重置列状态
524
+ *
525
+ * 场景:
526
+ * - 用户删除当前正在使用的方案
527
+ * - currentColumnScheme?.id 从有值变为 null
528
+ *
529
+ * 行为:
530
+ * - 重置列状态为初始状态(默认顺序、宽度等)
531
+ * - 清除所有过滤器
532
+ * - 清除列样式配置
533
+ *
534
+ * 优势:
535
+ * - 符合单向数据流架构
536
+ * - 适用于所有方案切换场景(删除/取消选择)
537
+ * - 用户体验好,自动恢复到初始状态
538
+ */
539
+ var prevSchemeIdRef = useRef(currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id);
540
+ useEffect(function () {
541
+ if (!gridKey || !apiRef.current || !ready) return;
542
+ var prevSchemeId = prevSchemeIdRef.current;
543
+ var currentSchemeId = currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id;
544
+
545
+ // 检测方案被删除:从有值变为 null/undefined
546
+ if (prevSchemeId && !currentSchemeId) {
547
+ Promise.resolve().then(function () {
548
+ if (!apiRef.current) return;
549
+
550
+ // 1. 重置列状态为初始状态
551
+ apiRef.current.resetColumnState();
552
+
553
+ // 2. 清除所有过滤器
554
+ apiRef.current.setFilterModel(null);
555
+
556
+ // 3. 清除列样式配置
557
+ setColumnCellClass({});
558
+ }).catch(function (error) {
559
+ console.error('[AgGridPlus] 重置列状态失败:', error);
560
+ logger.error('[AgGridPlus] 重置列状态失败', error);
561
+ });
562
+ }
563
+
564
+ // 更新引用
565
+ prevSchemeIdRef.current = currentSchemeId;
566
+ }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, ready]);
567
+
565
568
  // 稳定化 gridParams 和 sortColumn 的引用(深比较,内容不变即复用旧引用)
566
569
  var stableGridParams = useDeepCompareStable(gridParams);
567
570
  var stableSortColumn = useDeepCompareStable(sortColumn);
@@ -1010,10 +1013,11 @@ function AgGridPlus(props) {
1010
1013
 
1011
1014
  // 构建查询表单项(带 order 属性)
1012
1015
  var queryFormItems = useMemo(function () {
1013
- var _allColDefs$filter;
1014
- var items = (allColDefs === null || allColDefs === void 0 || (_allColDefs$filter = allColDefs.filter(function (col) {
1016
+ var _flattenColumnState;
1017
+ // 查询方案按叶列排序和隐藏,分组本身不作为查询字段。@author nokecy
1018
+ var items = ((_flattenColumnState = flattenColumnState(allColDefs)) === null || _flattenColumnState === void 0 || (_flattenColumnState = _flattenColumnState.filter(function (col) {
1015
1019
  return col.filter !== false && !col.hideInSearch;
1016
- })) === null || _allColDefs$filter === void 0 ? void 0 : _allColDefs$filter.map(function (col) {
1020
+ })) === null || _flattenColumnState === void 0 ? void 0 : _flattenColumnState.map(function (col) {
1017
1021
  var _col$queryField, _col$searchSort;
1018
1022
  return _objectSpread({
1019
1023
  field: (_col$queryField = col.queryField) !== null && _col$queryField !== void 0 ? _col$queryField : col.field,
@@ -1145,10 +1149,12 @@ function AgGridPlus(props) {
1145
1149
  }
1146
1150
  }, search == false ? null : /*#__PURE__*/React.createElement(FormRender, {
1147
1151
  colDefs: flattenColumnState(visibleFormItems),
1152
+ effectiveColDefs: flattenColumnState(colDefs),
1148
1153
  defaultRows: queryDefaultRows,
1149
- columnStates: columnState || [],
1154
+ columnStates: (_ref = derivedColumnState !== null && derivedColumnState !== void 0 ? derivedColumnState : columnState) !== null && _ref !== void 0 ? _ref : [],
1150
1155
  defaultExpand: defaultSearchExpand,
1151
1156
  gridApi: apiRef.current,
1157
+ onValuesChange: onQueryValuesChange,
1152
1158
  onQuery: function onQuery(formValues) {
1153
1159
  // 优先使用高级搜索:如果存在高级搜索条件,忽略简单查询
1154
1160
  if (advancedQueryRules.children.length > 0) {
@@ -171,8 +171,8 @@ export function useDerivedGridState(currentScheme, allColDefs) {
171
171
  console.error('[useDerivedGridState] 转换失败:', error);
172
172
  return null;
173
173
  }
174
- }, [// 使用 scheme.id 作为依赖,避免深度对象比较
175
- currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, allColDefs]);
174
+ }, [// 同一方案的内容修改也要重新派生,保持表格与查询区使用相同快照。@author nokecy
175
+ currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.columnConfig, allColDefs]);
176
176
  }
177
177
 
178
178
  /**
@@ -207,8 +207,8 @@ export function useDerivedColumnState(currentScheme, allColDefs) {
207
207
  console.error('[useDerivedColumnState] 转换失败:', error);
208
208
  return null;
209
209
  }
210
- }, [// 使用 scheme.id 作为依赖
211
- currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, allColDefs]);
210
+ }, [// 同一方案保存后 columnConfig 会更新,不能只比较方案 ID。@author nokecy
211
+ currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.columnConfig, allColDefs]);
212
212
  }
213
213
 
214
214
  /**
@@ -85,6 +85,12 @@ interface GridProps extends AgGridReactProps {
85
85
  * 选中行变化回调函数
86
86
  */
87
87
  onSelectedRowsChange?: (selectedRows: any[]) => void;
88
+ /**
89
+ * 查询区条件值变化时回调(输入、默认值落位、重置都会触发),参数为当前条件快照,以查询字段名为键。
90
+ * 只通知、不发起查询;宿主可据此与上次查询用的条件比较,提示「条件已变更,请查询」。
91
+ * @author nokecy
92
+ */
93
+ onQueryValuesChange?: (values: Record<string, any>) => void;
88
94
  /**
89
95
  * 错误处理回调函数
90
96
  * 当组件发生错误时调用,可用于自定义错误处理逻辑
@@ -144,6 +150,8 @@ interface AgGridColumnPropsClone extends ColDef {
144
150
  hideInTable?: boolean;
145
151
  hideInSearch?: boolean;
146
152
  queryField?: string;
153
+ /** 查询区独立标题;优先于列方案中的表头名称。@author nokecy */
154
+ searchTitle?: string;
147
155
  /**
148
156
  * 是否文本缩略显示,并使用tooltip
149
157
  */
@@ -5,10 +5,14 @@ declare const FormRender: (props: {
5
5
  className?: any;
6
6
  gridApi?: GridApi<any> | undefined;
7
7
  colDefs: ColDef[];
8
+ /** 与表格同轮渲染的生效列定义快照。@author nokecy */
9
+ effectiveColDefs?: ColDef<any, any>[] | undefined;
8
10
  columnStates: ColumnState[];
9
11
  defaultExpand?: Boolean | undefined;
10
12
  defaultRows?: number | undefined;
11
13
  onQuery: (formValue: any) => void;
12
14
  onInit?: ((defaultValues: any) => void) | undefined;
15
+ /** 查询条件值变化(输入、默认值落位、重置)时回调,参数为当前条件快照;不触发查询。@author nokecy */
16
+ onValuesChange?: ((values: Record<string, any>) => void) | undefined;
13
17
  }) => React.JSX.Element;
14
18
  export default FormRender;
@@ -11,27 +11,29 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
11
11
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
12
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
13
  import { DatePicker, FormButtonGroup, FormGrid, FormItem, Form, Input, Select, Submit } from '@formily/antd-v5'; // @author nokecy
14
- import { createForm } from '@formily/core';
15
- import { onFieldInit } from '@formily/core';
14
+ import { createForm, LifeCycleTypes } from '@formily/core';
16
15
  import { createSchemaField } from '@formily/react';
17
16
  import { Button, theme } from 'antd';
18
17
  import classNames from 'classnames';
19
18
  import React, { useEffect, useMemo, useRef, useState } from 'react';
20
19
  import QueryForm from "./queryForm";
21
20
  import { queryFormSchemaKey } from "./schemaKey";
21
+ import { resolveQueryColumns } from "./queryColumns";
22
22
  import BoolSelect from "../_utils/boolSelect";
23
23
  import "./index.less";
24
24
  var FormRender = function FormRender(props) {
25
25
  var className = props.className,
26
- gridApi = props.gridApi,
27
26
  colDefs = props.colDefs,
27
+ _props$effectiveColDe = props.effectiveColDefs,
28
+ effectiveColDefs = _props$effectiveColDe === void 0 ? colDefs : _props$effectiveColDe,
28
29
  columnStates = props.columnStates,
29
30
  onQuery = props.onQuery,
30
31
  _props$defaultRows = props.defaultRows,
31
32
  defaultRows = _props$defaultRows === void 0 ? 1 : _props$defaultRows;
32
33
  var _theme$useToken = theme.useToken(),
33
34
  token = _theme$useToken.token; // 筛选区跟随宿主主题。@author nokecy
34
-
35
+ var queryColumns = resolveQueryColumns(colDefs, effectiveColDefs, columnStates);
36
+ var schemaKey = queryFormSchemaKey(undefined, queryColumns);
35
37
  var _useState = useState({
36
38
  type: 'object',
37
39
  properties: {}
@@ -39,25 +41,25 @@ var FormRender = function FormRender(props) {
39
41
  _useState2 = _slicedToArray(_useState, 2),
40
42
  schema = _useState2[0],
41
43
  setSchema = _useState2[1];
44
+
45
+ // 表单与 SchemaField 实例保持稳定,元数据更新不清空已输入的查询值。@author nokecy
42
46
  var form = useMemo(function () {
43
- return createForm({
44
- effects: function effects() {
45
- return [onFieldInit('queryForm', function (field) {
46
- field.query('queryForm').take(function (node) {
47
- node.setComponentProps({
48
- onReset: onReset,
49
- defaultExpand: props.defaultExpand
50
- });
51
- });
52
- })];
53
- }
54
- });
47
+ return createForm();
55
48
  }, []);
56
49
 
57
- // 【修复】移除此处的 onInit 调用
58
- // 原因:此时 schema 尚未设置,form.values 为空,默认值还未应用
59
- // 改为在下方 schema 设置完成后调用 onInit
60
-
50
+ // 条件变化只通知宿主(如提示「条件已变更」),回调走 ref,宿主每次渲染传新函数也不重复订阅。@author nokecy
51
+ var onValuesChangeRef = useRef(props.onValuesChange);
52
+ onValuesChangeRef.current = props.onValuesChange;
53
+ useEffect(function () {
54
+ var id = form.subscribe(function (_ref) {
55
+ var _onValuesChangeRef$cu;
56
+ var type = _ref.type;
57
+ if (type === LifeCycleTypes.ON_FORM_VALUES_CHANGE) (_onValuesChangeRef$cu = onValuesChangeRef.current) === null || _onValuesChangeRef$cu === void 0 || _onValuesChangeRef$cu.call(onValuesChangeRef, _objectSpread({}, form.values));
58
+ });
59
+ return function () {
60
+ return form.unsubscribe(id);
61
+ };
62
+ }, [form]);
61
63
  var SchemaField = useMemo(function () {
62
64
  return createSchemaField({
63
65
  components: {
@@ -73,7 +75,7 @@ var FormRender = function FormRender(props) {
73
75
  BoolSelect: BoolSelect
74
76
  }
75
77
  });
76
- }, [schema]);
78
+ }, []);
77
79
  var onSubmit = function onSubmit() {
78
80
  onQuery && onQuery(form.values);
79
81
  };
@@ -113,47 +115,31 @@ var FormRender = function FormRender(props) {
113
115
  return component ? component : "Input";
114
116
  }
115
117
  };
116
- var getSchema = function getSchema(reset) {
117
- var _columns, _columns2;
118
+ var getSchema = function getSchema() {
118
119
  var rootSchema = {
119
120
  type: 'object',
120
121
  properties: {}
121
122
  };
122
- if (!columnStates) {
123
- return rootSchema;
124
- }
125
123
  var gridSchema = {
126
124
  type: 'void',
127
125
  "name": 'queryForm',
128
126
  "x-component": 'QueryForm',
129
127
  properties: {},
130
128
  "x-component-props": {
131
- defaultRows: defaultRows // 在这里添加defaultRows参数
129
+ defaultRows: defaultRows,
130
+ defaultExpand: props.defaultExpand,
131
+ onReset: onReset
132
132
  }
133
133
  };
134
- var columns = colDefs === null || colDefs === void 0 ? void 0 : colDefs.map(function (colDef) {
135
- var _searchComponentProps;
136
- var state = columnStates.find(function (x) {
137
- return x.colId == colDef.field;
138
- });
139
- var columnDefs = gridApi === null || gridApi === void 0 ? void 0 : gridApi.getColumnDef(colDef.field);
140
- // 查询组件属性(下拉选项)以本次传入的列为准:AG Grid 在本副作用之后才应用新 columnDefs,此刻取到的还是上一版。@author nokecy
141
- return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, colDef), columnDefs), state), {}, {
142
- searchComponentProps: (_searchComponentProps = colDef.searchComponentProps) !== null && _searchComponentProps !== void 0 ? _searchComponentProps : columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.searchComponentProps
143
- });
144
- });
145
- columns = columns ? (_columns = columns) === null || _columns === void 0 ? void 0 : _columns.filter(function (i) {
146
- return (i === null || i === void 0 ? void 0 : i.visible) != false && !(i !== null && i !== void 0 && i.hide) && !(i !== null && i !== void 0 && i.hideInSearch) || (i === null || i === void 0 ? void 0 : i.hideInTable);
147
- }) : [];
148
- columns.map(function (col) {
149
- var _colDef$queryField;
134
+ queryColumns.forEach(function (col) {
135
+ var _colDef$queryField, _colDef$searchTitle;
150
136
  var colDef = col;
151
137
  var name = (_colDef$queryField = colDef.queryField) !== null && _colDef$queryField !== void 0 ? _colDef$queryField : colDef.field;
152
- var headerName = colDef.headerName;
138
+ var headerName = (_colDef$searchTitle = colDef.searchTitle) !== null && _colDef$searchTitle !== void 0 ? _colDef$searchTitle : colDef.headerName;
153
139
  //表单自定义组件
154
140
  var component = getComponent(colDef);
155
141
  if (colDef.filter != false) {
156
- var _colDef$searchCompone, _colDef$searchCompone2, _colDef$searchCompone3;
142
+ var _colDef$searchCompone, _colDef$searchCompone2, _colDef$searchCompone3, _colDef$searchCompone4;
157
143
  // 为多选下拉框添加maxTagCount配置
158
144
  var componentProps = _objectSpread({
159
145
  placeholder: "\u8BF7\u8F93\u5165".concat(headerName),
@@ -175,7 +161,7 @@ var FormRender = function FormRender(props) {
175
161
  type: 'string',
176
162
  title: headerName,
177
163
  required: (colDef === null || colDef === void 0 || (_colDef$searchCompone = colDef.searchComponentProps) === null || _colDef$searchCompone === void 0 ? void 0 : _colDef$searchCompone.required) || false,
178
- default: (colDef === null || colDef === void 0 || (_colDef$searchCompone2 = colDef.searchComponentProps) === null || _colDef$searchCompone2 === void 0 ? void 0 : _colDef$searchCompone2.default) || (colDef === null || colDef === void 0 || (_colDef$searchCompone3 = colDef.searchComponentProps) === null || _colDef$searchCompone3 === void 0 ? void 0 : _colDef$searchCompone3.defaultValue),
164
+ default: (_colDef$searchCompone2 = colDef === null || colDef === void 0 || (_colDef$searchCompone3 = colDef.searchComponentProps) === null || _colDef$searchCompone3 === void 0 ? void 0 : _colDef$searchCompone3.default) !== null && _colDef$searchCompone2 !== void 0 ? _colDef$searchCompone2 : colDef === null || colDef === void 0 || (_colDef$searchCompone4 = colDef.searchComponentProps) === null || _colDef$searchCompone4 === void 0 ? void 0 : _colDef$searchCompone4.defaultValue,
179
165
  enum: colDef === null || colDef === void 0 ? void 0 : colDef.enum,
180
166
  "x-component": component,
181
167
  "x-component-props": componentProps,
@@ -190,7 +176,7 @@ var FormRender = function FormRender(props) {
190
176
  });
191
177
  ///@ts-ignore
192
178
  rootSchema.properties["queryForm"] = gridSchema;
193
- if (!((_columns2 = columns) !== null && _columns2 !== void 0 && _columns2.length)) {
179
+ if (!queryColumns.length) {
194
180
  ///@ts-ignore
195
181
  delete rootSchema.properties["queryForm"];
196
182
  }
@@ -199,18 +185,40 @@ var FormRender = function FormRender(props) {
199
185
 
200
186
  // 【新增】用于追踪是否已完成首次初始化
201
187
  var initializedRef = useRef(false);
188
+ var previousFieldsRef = useRef([]);
202
189
  useEffect(function () {
203
190
  var _new_schema$propertie, _new_schema$propertie2;
204
- var new_schema = getSchema(onReset);
191
+ var new_schema = getSchema();
192
+ var fieldSchemas = (_new_schema$propertie = (_new_schema$propertie2 = new_schema.properties) === null || _new_schema$propertie2 === void 0 || (_new_schema$propertie2 = _new_schema$propertie2.queryForm) === null || _new_schema$propertie2 === void 0 ? void 0 : _new_schema$propertie2.properties) !== null && _new_schema$propertie !== void 0 ? _new_schema$propertie : {};
193
+ // 移除失效查询项的字段图和值,避免界面已经移除却仍提交旧筛选。@author nokecy
194
+ previousFieldsRef.current.filter(function (name) {
195
+ return !(name in fieldSchemas);
196
+ }).forEach(function (name) {
197
+ form.clearFormGraph(name);
198
+ form.deleteValuesIn(name);
199
+ form.deleteInitialValuesIn(name);
200
+ });
201
+ previousFieldsRef.current = Object.keys(fieldSchemas);
205
202
  setSchema(new_schema);
206
- // Formily 只在字段首次创建时读取 schema:已有查询项要把新标题、组件属性(如下拉选项)写回字段。@author nokecy
207
- Object.entries((_new_schema$propertie = (_new_schema$propertie2 = new_schema.properties) === null || _new_schema$propertie2 === void 0 || (_new_schema$propertie2 = _new_schema$propertie2.queryForm) === null || _new_schema$propertie2 === void 0 ? void 0 : _new_schema$propertie2.properties) !== null && _new_schema$propertie !== void 0 ? _new_schema$propertie : {}).forEach(function (_ref) {
208
- var _ref2 = _slicedToArray(_ref, 2),
209
- name = _ref2[0],
210
- fieldSchema = _ref2[1];
203
+ // 已有字段同步元数据,不触碰仍有效字段的查询值,也不触发查询。@author nokecy
204
+ Object.entries(fieldSchemas).forEach(function (_ref2) {
205
+ var _ref3 = _slicedToArray(_ref2, 2),
206
+ name = _ref3[0],
207
+ fieldSchema = _ref3[1];
211
208
  form.query(name).take(function (field) {
209
+ var _fieldSchema$enum;
212
210
  field.title = fieldSchema.title;
213
- field.setComponentProps(fieldSchema['x-component-props']);
211
+ field.required = fieldSchema.required;
212
+ // Select 会把 dataSource 映射为 options;仅配置 options 时也同步该数据源。@author nokecy
213
+ field.dataSource = (_fieldSchema$enum = fieldSchema.enum) !== null && _fieldSchema$enum !== void 0 ? _fieldSchema$enum : fieldSchema['x-component-props'].options;
214
+ field.component = [fieldSchema['x-component'], fieldSchema['x-component-props']];
215
+ });
216
+ });
217
+ form.query('queryForm').take(function (field) {
218
+ return field.setComponentProps({
219
+ defaultRows: defaultRows,
220
+ defaultExpand: props.defaultExpand,
221
+ onReset: onReset
214
222
  });
215
223
  });
216
224
 
@@ -225,7 +233,7 @@ var FormRender = function FormRender(props) {
225
233
  }, 0);
226
234
  });
227
235
  }
228
- }, [queryFormSchemaKey(columnStates, colDefs)]);
236
+ }, [schemaKey, defaultRows, props.defaultExpand]);
229
237
  return /*#__PURE__*/React.createElement("div", {
230
238
  className: classNames(className, "ag-grid-table-search ag-grid-table-search-query-filter"),
231
239
  style: {
@@ -234,6 +242,7 @@ var FormRender = function FormRender(props) {
234
242
  }, /*#__PURE__*/React.createElement(Form, {
235
243
  form: form,
236
244
  labelWidth: 100,
245
+ labelWrap: true,
237
246
  feedbackLayout: "none",
238
247
  onAutoSubmit: onSubmit
239
248
  }, /*#__PURE__*/React.createElement(SchemaField, {
@@ -0,0 +1,8 @@
1
+ import type { ColumnState } from 'ag-grid-community';
2
+ import type { ExtendedColDef } from '../types';
3
+ /**
4
+ * 从同一轮渲染的列定义快照派生查询项,不在副作用中读取 AG Grid 的上一轮定义。
5
+ * 表头名称跟随生效列方案;查询专用元数据和独立标题由页面声明。
6
+ * @author nokecy
7
+ */
8
+ export declare const resolveQueryColumns: (sourceColumns: readonly ExtendedColDef[], effectiveColumns: readonly ExtendedColDef[], columnStates: readonly ColumnState[]) => ExtendedColDef[];