@nokecy/qc-ui 1.1.87 → 1.1.88

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 +148 -144
  2. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  3. package/dist/cjs/ag-grid-plus/interface.d.ts +2 -0
  4. package/dist/cjs/ag-grid-plus/queryForm/index.d.ts +2 -0
  5. package/dist/cjs/ag-grid-plus/queryForm/index.js +47 -51
  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 +148 -144
  50. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.js +4 -4
  51. package/dist/esm/ag-grid-plus/interface.d.ts +2 -0
  52. package/dist/esm/ag-grid-plus/queryForm/index.d.ts +2 -0
  53. package/dist/esm/ag-grid-plus/queryForm/index.js +47 -52
  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
@@ -85,6 +85,7 @@ function useDeepCompareStable(value) {
85
85
  return ref.current;
86
86
  }
87
87
  function AgGridPlus(props) {
88
+ var _ref;
88
89
  var gridTheme = (0, _theme.useAgGridTheme)();
89
90
  var _theme$useToken = _antd.theme.useToken(),
90
91
  token = _theme$useToken.token; // 高级筛选入口跟随主题及客户主色。@author nokecy
@@ -236,35 +237,6 @@ function AgGridPlus(props) {
236
237
  _useState28 = _slicedToArray(_useState27, 2),
237
238
  advancedQueryRules = _useState28[0],
238
239
  setAdvancedQueryRules = _useState28[1];
239
-
240
- /**
241
- * 【P1 架构优化】使用单向数据流架构
242
- *
243
- * 数据流层次:
244
- * 1. Source of Truth: useSchemeDataFlow (Scheme State)
245
- * 2. Derived State: derivedColumnDefs/derivedColumnState (只读派生)
246
- * 3. UI State: Context State (仅用于 UI 交互)
247
- *
248
- * 优势:
249
- * - 清晰的数据流向(单向可追踪)
250
- * - 消除状态同步冲突(单一数据源)
251
- * - 架构清晰度 +60%,Bug -40%
252
- */
253
- var schemeDataFlow = (0, _useSchemeDataFlow.useSchemeDataFlow)(gridKey || '', allColDefsRef.current, {
254
- columnSchemes: columnSchemes,
255
- querySchemes: querySchemes,
256
- currentSchemes: currentSchemes
257
- });
258
-
259
- // 解构单向数据流的数据
260
- var currentColumnSchemes = schemeDataFlow.columnSchemes,
261
- currentColumnScheme = schemeDataFlow.currentColumnScheme,
262
- currentQuerySchemes = schemeDataFlow.querySchemes,
263
- currentQueryScheme = schemeDataFlow.currentQueryScheme,
264
- derivedColumnDefs = schemeDataFlow.derivedColumnDefs,
265
- derivedColumnState = schemeDataFlow.derivedColumnState,
266
- isUsingGlobalFallback = schemeDataFlow.isUsingGlobalFallback,
267
- isUsingGlobalQueryFallback = schemeDataFlow.isUsingGlobalQueryFallback;
268
240
  (0, _react.useImperativeHandle)(propsGridRef, function () {
269
241
  return gridRef.current;
270
242
  });
@@ -321,117 +293,6 @@ function AgGridPlus(props) {
321
293
 
322
294
  // 用于列类型推断的首行数据。为什么必须是 state 而不是 ref,见该 hook 的注释。@author nokecy
323
295
  var typeInferenceRow = (0, _useTypeInferenceRow.useTypeInferenceRow)(rowData);
324
-
325
- /**
326
- * 【P0 + P1 优化】使用派生状态应用方案(单向数据流)
327
- *
328
- * 优势:
329
- * 1. 使用已派生的状态,避免重复计算
330
- * 2. 单向数据流,状态同步更可靠
331
- * 3. 性能提升 67%,代码更清晰
332
- * 4. 使用 Promise 链和 requestAnimationFrame 解决竞态条件
333
- */
334
- (0, _react.useEffect)(function () {
335
- if (!gridKey || !apiRef.current) return;
336
-
337
- // 使用 Promise 链确保顺序执行,避免竞态条件
338
- var cancelled = false;
339
- Promise.resolve().then(function () {
340
- if (cancelled || !apiRef.current) return;
341
-
342
- // 1. 应用派生的列状态(使用 applyColumnState API)
343
- if (derivedColumnState && derivedColumnState.length > 0) {
344
- // 使用 applyColumnState 而不是 setGridOption("columnDefs")
345
- apiRef.current.applyColumnState({
346
- state: derivedColumnState,
347
- applyOrder: true // 应用列顺序
348
- });
349
- }
350
-
351
- // 2. 应用派生的列样式
352
- if (derivedColumnState) {
353
- setColumnCellClass(handelgridPlusColumnState(derivedColumnState));
354
- }
355
- }).then(function () {
356
- // 等待 Grid 状态稳定(使用 requestAnimationFrame 而非固定延迟)
357
- return new Promise(function (resolve) {
358
- if (cancelled) {
359
- resolve();
360
- return;
361
- }
362
- requestAnimationFrame(function () {
363
- // 双重 RAF 确保渲染完成
364
- requestAnimationFrame(function () {
365
- return resolve();
366
- });
367
- });
368
- });
369
- }).then(function () {
370
- if (cancelled || !apiRef.current) return;
371
-
372
- // 3. 应用过滤器(在列状态稳定后执行)
373
- if (currentColumnScheme !== null && currentColumnScheme !== void 0 && currentColumnScheme.filterModel) {
374
- apiRef.current.setFilterModel(currentColumnScheme.filterModel);
375
- }
376
- }).catch(function (error) {
377
- if (!cancelled) {
378
- console.error('[AgGridPlus] 应用方案失败:', error);
379
- _logger.logger.error('[AgGridPlus] 应用方案失败', error);
380
- }
381
- });
382
-
383
- // 清理函数:取消进行中的操作
384
- return function () {
385
- cancelled = true;
386
- };
387
- }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, derivedColumnState, ready // 添加 ready 依赖,确保 Grid 初始化完成后再应用方案
388
- ]);
389
-
390
- /**
391
- * 【新增】监听当前方案 ID 变化,当方案被删除时重置列状态
392
- *
393
- * 场景:
394
- * - 用户删除当前正在使用的方案
395
- * - currentColumnScheme?.id 从有值变为 null
396
- *
397
- * 行为:
398
- * - 重置列状态为初始状态(默认顺序、宽度等)
399
- * - 清除所有过滤器
400
- * - 清除列样式配置
401
- *
402
- * 优势:
403
- * - 符合单向数据流架构
404
- * - 适用于所有方案切换场景(删除/取消选择)
405
- * - 用户体验好,自动恢复到初始状态
406
- */
407
- var prevSchemeIdRef = (0, _react.useRef)(currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id);
408
- (0, _react.useEffect)(function () {
409
- if (!gridKey || !apiRef.current || !ready) return;
410
- var prevSchemeId = prevSchemeIdRef.current;
411
- var currentSchemeId = currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id;
412
-
413
- // 检测方案被删除:从有值变为 null/undefined
414
- if (prevSchemeId && !currentSchemeId) {
415
- Promise.resolve().then(function () {
416
- if (!apiRef.current) return;
417
-
418
- // 1. 重置列状态为初始状态
419
- apiRef.current.resetColumnState();
420
-
421
- // 2. 清除所有过滤器
422
- apiRef.current.setFilterModel(null);
423
-
424
- // 3. 清除列样式配置
425
- setColumnCellClass({});
426
- }).catch(function (error) {
427
- console.error('[AgGridPlus] 重置列状态失败:', error);
428
- _logger.logger.error('[AgGridPlus] 重置列状态失败', error);
429
- });
430
- }
431
-
432
- // 更新引用
433
- prevSchemeIdRef.current = currentSchemeId;
434
- }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, ready]);
435
296
  (0, _react.useEffect)(function () {
436
297
  setRowData(dataSource || propRowData || []);
437
298
  }, [dataSource, propRowData]);
@@ -570,6 +431,147 @@ function AgGridPlus(props) {
570
431
  return cols;
571
432
  }, [_react.default.Children.count(children), props.columnDefs, extensibleColumns, gridKey, entityType, hostEntityExtensions, typeInferenceRow, valueEnumContrast ? token.colorBgContainer : undefined]);
572
433
 
434
+ // 方案派生依赖本轮源码列,避免读取尚未更新的 ref 快照。@author nokecy
435
+ /**
436
+ * 【P1 架构优化】使用单向数据流架构
437
+ *
438
+ * 数据流层次:
439
+ * 1. Source of Truth: useSchemeDataFlow (Scheme State)
440
+ * 2. Derived State: derivedColumnDefs/derivedColumnState (只读派生)
441
+ * 3. UI State: Context State (仅用于 UI 交互)
442
+ *
443
+ * 优势:
444
+ * - 清晰的数据流向(单向可追踪)
445
+ * - 消除状态同步冲突(单一数据源)
446
+ * - 架构清晰度 +60%,Bug -40%
447
+ */
448
+ var schemeDataFlow = (0, _useSchemeDataFlow.useSchemeDataFlow)(gridKey || '', allColDefs, {
449
+ columnSchemes: columnSchemes,
450
+ querySchemes: querySchemes,
451
+ currentSchemes: currentSchemes
452
+ });
453
+
454
+ // 解构单向数据流的数据
455
+ var currentColumnSchemes = schemeDataFlow.columnSchemes,
456
+ currentColumnScheme = schemeDataFlow.currentColumnScheme,
457
+ currentQuerySchemes = schemeDataFlow.querySchemes,
458
+ currentQueryScheme = schemeDataFlow.currentQueryScheme,
459
+ derivedColumnDefs = schemeDataFlow.derivedColumnDefs,
460
+ derivedColumnState = schemeDataFlow.derivedColumnState,
461
+ isUsingGlobalFallback = schemeDataFlow.isUsingGlobalFallback,
462
+ isUsingGlobalQueryFallback = schemeDataFlow.isUsingGlobalQueryFallback;
463
+
464
+ /**
465
+ * 【P0 + P1 优化】使用派生状态应用方案(单向数据流)
466
+ *
467
+ * 优势:
468
+ * 1. 使用已派生的状态,避免重复计算
469
+ * 2. 单向数据流,状态同步更可靠
470
+ * 3. 性能提升 67%,代码更清晰
471
+ * 4. 使用 Promise 链和 requestAnimationFrame 解决竞态条件
472
+ */
473
+ (0, _react.useEffect)(function () {
474
+ if (!gridKey || !apiRef.current) return;
475
+
476
+ // 使用 Promise 链确保顺序执行,避免竞态条件
477
+ var cancelled = false;
478
+ Promise.resolve().then(function () {
479
+ if (cancelled || !apiRef.current) return;
480
+
481
+ // 1. 应用派生的列状态(使用 applyColumnState API)
482
+ if (derivedColumnState && derivedColumnState.length > 0) {
483
+ // 使用 applyColumnState 而不是 setGridOption("columnDefs")
484
+ apiRef.current.applyColumnState({
485
+ state: derivedColumnState,
486
+ applyOrder: true // 应用列顺序
487
+ });
488
+ }
489
+
490
+ // 2. 应用派生的列样式
491
+ if (derivedColumnState) {
492
+ setColumnCellClass(handelgridPlusColumnState(derivedColumnState));
493
+ }
494
+ }).then(function () {
495
+ // 等待 Grid 状态稳定(使用 requestAnimationFrame 而非固定延迟)
496
+ return new Promise(function (resolve) {
497
+ if (cancelled) {
498
+ resolve();
499
+ return;
500
+ }
501
+ requestAnimationFrame(function () {
502
+ // 双重 RAF 确保渲染完成
503
+ requestAnimationFrame(function () {
504
+ return resolve();
505
+ });
506
+ });
507
+ });
508
+ }).then(function () {
509
+ if (cancelled || !apiRef.current) return;
510
+
511
+ // 3. 应用过滤器(在列状态稳定后执行)
512
+ if (currentColumnScheme !== null && currentColumnScheme !== void 0 && currentColumnScheme.filterModel) {
513
+ apiRef.current.setFilterModel(currentColumnScheme.filterModel);
514
+ }
515
+ }).catch(function (error) {
516
+ if (!cancelled) {
517
+ console.error('[AgGridPlus] 应用方案失败:', error);
518
+ _logger.logger.error('[AgGridPlus] 应用方案失败', error);
519
+ }
520
+ });
521
+
522
+ // 清理函数:取消进行中的操作
523
+ return function () {
524
+ cancelled = true;
525
+ };
526
+ }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, derivedColumnState, ready // 添加 ready 依赖,确保 Grid 初始化完成后再应用方案
527
+ ]);
528
+
529
+ /**
530
+ * 【新增】监听当前方案 ID 变化,当方案被删除时重置列状态
531
+ *
532
+ * 场景:
533
+ * - 用户删除当前正在使用的方案
534
+ * - currentColumnScheme?.id 从有值变为 null
535
+ *
536
+ * 行为:
537
+ * - 重置列状态为初始状态(默认顺序、宽度等)
538
+ * - 清除所有过滤器
539
+ * - 清除列样式配置
540
+ *
541
+ * 优势:
542
+ * - 符合单向数据流架构
543
+ * - 适用于所有方案切换场景(删除/取消选择)
544
+ * - 用户体验好,自动恢复到初始状态
545
+ */
546
+ var prevSchemeIdRef = (0, _react.useRef)(currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id);
547
+ (0, _react.useEffect)(function () {
548
+ if (!gridKey || !apiRef.current || !ready) return;
549
+ var prevSchemeId = prevSchemeIdRef.current;
550
+ var currentSchemeId = currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id;
551
+
552
+ // 检测方案被删除:从有值变为 null/undefined
553
+ if (prevSchemeId && !currentSchemeId) {
554
+ Promise.resolve().then(function () {
555
+ if (!apiRef.current) return;
556
+
557
+ // 1. 重置列状态为初始状态
558
+ apiRef.current.resetColumnState();
559
+
560
+ // 2. 清除所有过滤器
561
+ apiRef.current.setFilterModel(null);
562
+
563
+ // 3. 清除列样式配置
564
+ setColumnCellClass({});
565
+ }).catch(function (error) {
566
+ console.error('[AgGridPlus] 重置列状态失败:', error);
567
+ _logger.logger.error('[AgGridPlus] 重置列状态失败', error);
568
+ });
569
+ }
570
+
571
+ // 更新引用
572
+ prevSchemeIdRef.current = currentSchemeId;
573
+ }, [gridKey, currentColumnScheme === null || currentColumnScheme === void 0 ? void 0 : currentColumnScheme.id, ready]);
574
+
573
575
  // 稳定化 gridParams 和 sortColumn 的引用(深比较,内容不变即复用旧引用)
574
576
  var stableGridParams = useDeepCompareStable(gridParams);
575
577
  var stableSortColumn = useDeepCompareStable(sortColumn);
@@ -1018,10 +1020,11 @@ function AgGridPlus(props) {
1018
1020
 
1019
1021
  // 构建查询表单项(带 order 属性)
1020
1022
  var queryFormItems = (0, _react.useMemo)(function () {
1021
- var _allColDefs$filter;
1022
- var items = (allColDefs === null || allColDefs === void 0 || (_allColDefs$filter = allColDefs.filter(function (col) {
1023
+ var _flattenColumnState;
1024
+ // 查询方案按叶列排序和隐藏,分组本身不作为查询字段。@author nokecy
1025
+ var items = ((_flattenColumnState = (0, _processFormColumnState.default)(allColDefs)) === null || _flattenColumnState === void 0 || (_flattenColumnState = _flattenColumnState.filter(function (col) {
1023
1026
  return col.filter !== false && !col.hideInSearch;
1024
- })) === null || _allColDefs$filter === void 0 ? void 0 : _allColDefs$filter.map(function (col) {
1027
+ })) === null || _flattenColumnState === void 0 ? void 0 : _flattenColumnState.map(function (col) {
1025
1028
  var _col$queryField, _col$searchSort;
1026
1029
  return _objectSpread({
1027
1030
  field: (_col$queryField = col.queryField) !== null && _col$queryField !== void 0 ? _col$queryField : col.field,
@@ -1153,8 +1156,9 @@ function AgGridPlus(props) {
1153
1156
  }
1154
1157
  }, search == false ? null : /*#__PURE__*/_react.default.createElement(_queryForm.default, {
1155
1158
  colDefs: (0, _processFormColumnState.default)(visibleFormItems),
1159
+ effectiveColDefs: (0, _processFormColumnState.default)(colDefs),
1156
1160
  defaultRows: queryDefaultRows,
1157
- columnStates: columnState || [],
1161
+ columnStates: (_ref = derivedColumnState !== null && derivedColumnState !== void 0 ? derivedColumnState : columnState) !== null && _ref !== void 0 ? _ref : [],
1158
1162
  defaultExpand: defaultSearchExpand,
1159
1163
  gridApi: apiRef.current,
1160
1164
  onQuery: function onQuery(formValues) {
@@ -179,8 +179,8 @@ function useDerivedGridState(currentScheme, allColDefs) {
179
179
  console.error('[useDerivedGridState] 转换失败:', error);
180
180
  return null;
181
181
  }
182
- }, [// 使用 scheme.id 作为依赖,避免深度对象比较
183
- currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, allColDefs]);
182
+ }, [// 同一方案的内容修改也要重新派生,保持表格与查询区使用相同快照。@author nokecy
183
+ currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.columnConfig, allColDefs]);
184
184
  }
185
185
 
186
186
  /**
@@ -215,8 +215,8 @@ function useDerivedColumnState(currentScheme, allColDefs) {
215
215
  console.error('[useDerivedColumnState] 转换失败:', error);
216
216
  return null;
217
217
  }
218
- }, [// 使用 scheme.id 作为依赖
219
- currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, allColDefs]);
218
+ }, [// 同一方案保存后 columnConfig 会更新,不能只比较方案 ID。@author nokecy
219
+ currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.columnConfig, allColDefs]);
220
220
  }
221
221
 
222
222
  /**
@@ -144,6 +144,8 @@ interface AgGridColumnPropsClone extends ColDef {
144
144
  hideInTable?: boolean;
145
145
  hideInSearch?: boolean;
146
146
  queryField?: string;
147
+ /** 查询区独立标题;优先于列方案中的表头名称。@author nokecy */
148
+ searchTitle?: string;
147
149
  /**
148
150
  * 是否文本缩略显示,并使用tooltip
149
151
  */
@@ -5,6 +5,8 @@ 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;
@@ -13,6 +13,7 @@ var _classnames = _interopRequireDefault(require("classnames"));
13
13
  var _react2 = _interopRequireWildcard(require("react"));
14
14
  var _queryForm = _interopRequireDefault(require("./queryForm"));
15
15
  var _schemaKey = require("./schemaKey");
16
+ var _queryColumns = require("./queryColumns");
16
17
  var _boolSelect = _interopRequireDefault(require("../_utils/boolSelect"));
17
18
  require("./index.less");
18
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -31,15 +32,17 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
31
32
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // @author nokecy
32
33
  var FormRender = function FormRender(props) {
33
34
  var className = props.className,
34
- gridApi = props.gridApi,
35
35
  colDefs = props.colDefs,
36
+ _props$effectiveColDe = props.effectiveColDefs,
37
+ effectiveColDefs = _props$effectiveColDe === void 0 ? colDefs : _props$effectiveColDe,
36
38
  columnStates = props.columnStates,
37
39
  onQuery = props.onQuery,
38
40
  _props$defaultRows = props.defaultRows,
39
41
  defaultRows = _props$defaultRows === void 0 ? 1 : _props$defaultRows;
40
42
  var _theme$useToken = _antd.theme.useToken(),
41
43
  token = _theme$useToken.token; // 筛选区跟随宿主主题。@author nokecy
42
-
44
+ var queryColumns = (0, _queryColumns.resolveQueryColumns)(colDefs, effectiveColDefs, columnStates);
45
+ var schemaKey = (0, _schemaKey.queryFormSchemaKey)(undefined, queryColumns);
43
46
  var _useState = (0, _react2.useState)({
44
47
  type: 'object',
45
48
  properties: {}
@@ -47,25 +50,11 @@ var FormRender = function FormRender(props) {
47
50
  _useState2 = _slicedToArray(_useState, 2),
48
51
  schema = _useState2[0],
49
52
  setSchema = _useState2[1];
53
+
54
+ // 表单与 SchemaField 实例保持稳定,元数据更新不清空已输入的查询值。@author nokecy
50
55
  var form = (0, _react2.useMemo)(function () {
51
- return (0, _core.createForm)({
52
- effects: function effects() {
53
- return [(0, _core.onFieldInit)('queryForm', function (field) {
54
- field.query('queryForm').take(function (node) {
55
- node.setComponentProps({
56
- onReset: onReset,
57
- defaultExpand: props.defaultExpand
58
- });
59
- });
60
- })];
61
- }
62
- });
56
+ return (0, _core.createForm)();
63
57
  }, []);
64
-
65
- // 【修复】移除此处的 onInit 调用
66
- // 原因:此时 schema 尚未设置,form.values 为空,默认值还未应用
67
- // 改为在下方 schema 设置完成后调用 onInit
68
-
69
58
  var SchemaField = (0, _react2.useMemo)(function () {
70
59
  return (0, _react.createSchemaField)({
71
60
  components: {
@@ -81,7 +70,7 @@ var FormRender = function FormRender(props) {
81
70
  BoolSelect: _boolSelect.default
82
71
  }
83
72
  });
84
- }, [schema]);
73
+ }, []);
85
74
  var onSubmit = function onSubmit() {
86
75
  onQuery && onQuery(form.values);
87
76
  };
@@ -121,47 +110,31 @@ var FormRender = function FormRender(props) {
121
110
  return component ? component : "Input";
122
111
  }
123
112
  };
124
- var getSchema = function getSchema(reset) {
125
- var _columns, _columns2;
113
+ var getSchema = function getSchema() {
126
114
  var rootSchema = {
127
115
  type: 'object',
128
116
  properties: {}
129
117
  };
130
- if (!columnStates) {
131
- return rootSchema;
132
- }
133
118
  var gridSchema = {
134
119
  type: 'void',
135
120
  "name": 'queryForm',
136
121
  "x-component": 'QueryForm',
137
122
  properties: {},
138
123
  "x-component-props": {
139
- defaultRows: defaultRows // 在这里添加defaultRows参数
124
+ defaultRows: defaultRows,
125
+ defaultExpand: props.defaultExpand,
126
+ onReset: onReset
140
127
  }
141
128
  };
142
- var columns = colDefs === null || colDefs === void 0 ? void 0 : colDefs.map(function (colDef) {
143
- var _searchComponentProps;
144
- var state = columnStates.find(function (x) {
145
- return x.colId == colDef.field;
146
- });
147
- var columnDefs = gridApi === null || gridApi === void 0 ? void 0 : gridApi.getColumnDef(colDef.field);
148
- // 查询组件属性(下拉选项)以本次传入的列为准:AG Grid 在本副作用之后才应用新 columnDefs,此刻取到的还是上一版。@author nokecy
149
- return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, colDef), columnDefs), state), {}, {
150
- searchComponentProps: (_searchComponentProps = colDef.searchComponentProps) !== null && _searchComponentProps !== void 0 ? _searchComponentProps : columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.searchComponentProps
151
- });
152
- });
153
- columns = columns ? (_columns = columns) === null || _columns === void 0 ? void 0 : _columns.filter(function (i) {
154
- 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);
155
- }) : [];
156
- columns.map(function (col) {
157
- var _colDef$queryField;
129
+ queryColumns.forEach(function (col) {
130
+ var _colDef$queryField, _colDef$searchTitle;
158
131
  var colDef = col;
159
132
  var name = (_colDef$queryField = colDef.queryField) !== null && _colDef$queryField !== void 0 ? _colDef$queryField : colDef.field;
160
- var headerName = colDef.headerName;
133
+ var headerName = (_colDef$searchTitle = colDef.searchTitle) !== null && _colDef$searchTitle !== void 0 ? _colDef$searchTitle : colDef.headerName;
161
134
  //表单自定义组件
162
135
  var component = getComponent(colDef);
163
136
  if (colDef.filter != false) {
164
- var _colDef$searchCompone, _colDef$searchCompone2, _colDef$searchCompone3;
137
+ var _colDef$searchCompone, _colDef$searchCompone2, _colDef$searchCompone3, _colDef$searchCompone4;
165
138
  // 为多选下拉框添加maxTagCount配置
166
139
  var componentProps = _objectSpread({
167
140
  placeholder: "\u8BF7\u8F93\u5165".concat(headerName),
@@ -183,7 +156,7 @@ var FormRender = function FormRender(props) {
183
156
  type: 'string',
184
157
  title: headerName,
185
158
  required: (colDef === null || colDef === void 0 || (_colDef$searchCompone = colDef.searchComponentProps) === null || _colDef$searchCompone === void 0 ? void 0 : _colDef$searchCompone.required) || false,
186
- 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),
159
+ 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,
187
160
  enum: colDef === null || colDef === void 0 ? void 0 : colDef.enum,
188
161
  "x-component": component,
189
162
  "x-component-props": componentProps,
@@ -198,7 +171,7 @@ var FormRender = function FormRender(props) {
198
171
  });
199
172
  ///@ts-ignore
200
173
  rootSchema.properties["queryForm"] = gridSchema;
201
- if (!((_columns2 = columns) !== null && _columns2 !== void 0 && _columns2.length)) {
174
+ if (!queryColumns.length) {
202
175
  ///@ts-ignore
203
176
  delete rootSchema.properties["queryForm"];
204
177
  }
@@ -207,18 +180,40 @@ var FormRender = function FormRender(props) {
207
180
 
208
181
  // 【新增】用于追踪是否已完成首次初始化
209
182
  var initializedRef = (0, _react2.useRef)(false);
183
+ var previousFieldsRef = (0, _react2.useRef)([]);
210
184
  (0, _react2.useEffect)(function () {
211
185
  var _new_schema$propertie, _new_schema$propertie2;
212
- var new_schema = getSchema(onReset);
186
+ var new_schema = getSchema();
187
+ 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 : {};
188
+ // 移除失效查询项的字段图和值,避免界面已经移除却仍提交旧筛选。@author nokecy
189
+ previousFieldsRef.current.filter(function (name) {
190
+ return !(name in fieldSchemas);
191
+ }).forEach(function (name) {
192
+ form.clearFormGraph(name);
193
+ form.deleteValuesIn(name);
194
+ form.deleteInitialValuesIn(name);
195
+ });
196
+ previousFieldsRef.current = Object.keys(fieldSchemas);
213
197
  setSchema(new_schema);
214
- // Formily 只在字段首次创建时读取 schema:已有查询项要把新标题、组件属性(如下拉选项)写回字段。@author nokecy
215
- 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) {
198
+ // 已有字段同步元数据,不触碰仍有效字段的查询值,也不触发查询。@author nokecy
199
+ Object.entries(fieldSchemas).forEach(function (_ref) {
216
200
  var _ref2 = _slicedToArray(_ref, 2),
217
201
  name = _ref2[0],
218
202
  fieldSchema = _ref2[1];
219
203
  form.query(name).take(function (field) {
204
+ var _fieldSchema$enum;
220
205
  field.title = fieldSchema.title;
221
- field.setComponentProps(fieldSchema['x-component-props']);
206
+ field.required = fieldSchema.required;
207
+ // Select 会把 dataSource 映射为 options;仅配置 options 时也同步该数据源。@author nokecy
208
+ field.dataSource = (_fieldSchema$enum = fieldSchema.enum) !== null && _fieldSchema$enum !== void 0 ? _fieldSchema$enum : fieldSchema['x-component-props'].options;
209
+ field.component = [fieldSchema['x-component'], fieldSchema['x-component-props']];
210
+ });
211
+ });
212
+ form.query('queryForm').take(function (field) {
213
+ return field.setComponentProps({
214
+ defaultRows: defaultRows,
215
+ defaultExpand: props.defaultExpand,
216
+ onReset: onReset
222
217
  });
223
218
  });
224
219
 
@@ -233,7 +228,7 @@ var FormRender = function FormRender(props) {
233
228
  }, 0);
234
229
  });
235
230
  }
236
- }, [(0, _schemaKey.queryFormSchemaKey)(columnStates, colDefs)]);
231
+ }, [schemaKey, defaultRows, props.defaultExpand]);
237
232
  return /*#__PURE__*/_react2.default.createElement("div", {
238
233
  className: (0, _classnames.default)(className, "ag-grid-table-search ag-grid-table-search-query-filter"),
239
234
  style: {
@@ -242,6 +237,7 @@ var FormRender = function FormRender(props) {
242
237
  }, /*#__PURE__*/_react2.default.createElement(_antdV.Form, {
243
238
  form: form,
244
239
  labelWidth: 100,
240
+ labelWrap: true,
245
241
  feedbackLayout: "none",
246
242
  onAutoSubmit: onSubmit
247
243
  }, /*#__PURE__*/_react2.default.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[];
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolveQueryColumns = 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 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; }
9
+ 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; }
10
+ 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; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
12
+ 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); }
13
+ /**
14
+ * 从同一轮渲染的列定义快照派生查询项,不在副作用中读取 AG Grid 的上一轮定义。
15
+ * 表头名称跟随生效列方案;查询专用元数据和独立标题由页面声明。
16
+ * @author nokecy
17
+ */
18
+ var resolveQueryColumns = exports.resolveQueryColumns = function resolveQueryColumns(sourceColumns, effectiveColumns, columnStates) {
19
+ var effectiveById = new Map();
20
+ effectiveColumns.forEach(function (column) {
21
+ if (column.colId) effectiveById.set(column.colId, column);
22
+ if (column.field) effectiveById.set(column.field, column);
23
+ });
24
+ var stateById = new Map(columnStates.map(function (state) {
25
+ return [state.colId, state];
26
+ }));
27
+ return sourceColumns.map(function (source) {
28
+ var _source$colId, _ref, _state$hide, _effective$headerName;
29
+ var columnId = (_source$colId = source.colId) !== null && _source$colId !== void 0 ? _source$colId : source.field;
30
+ var effective = columnId ? effectiveById.get(columnId) : undefined;
31
+ var state = columnId ? stateById.get(columnId) : undefined;
32
+ return _objectSpread(_objectSpread(_objectSpread({}, source), effective), {}, {
33
+ // 查询只使用列状态的显隐;null 表示沿用生效列定义。@author nokecy
34
+ hide: (_ref = (_state$hide = state === null || state === void 0 ? void 0 : state.hide) !== null && _state$hide !== void 0 ? _state$hide : effective === null || effective === void 0 ? void 0 : effective.hide) !== null && _ref !== void 0 ? _ref : source.hide,
35
+ // 查询元数据不从持久表格方案反向覆盖源码。@author nokecy
36
+ field: source.field,
37
+ queryField: source.queryField,
38
+ headerName: (_effective$headerName = effective === null || effective === void 0 ? void 0 : effective.headerName) !== null && _effective$headerName !== void 0 ? _effective$headerName : source.headerName,
39
+ searchTitle: source.searchTitle,
40
+ hideInSearch: source.hideInSearch,
41
+ hideInTable: source.hideInTable,
42
+ filter: source.filter,
43
+ type: source.type,
44
+ enum: source.enum,
45
+ searchComponent: source.searchComponent,
46
+ searchComponentProps: source.searchComponentProps
47
+ });
48
+ }).filter(function (column) {
49
+ var _column$queryField;
50
+ return Boolean((_column$queryField = column.queryField) !== null && _column$queryField !== void 0 ? _column$queryField : column.field) && column.filter !== false && !column.hideInSearch && (column.hideInTable || column.visible !== false && !column.hide);
51
+ });
52
+ };