@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
@@ -8,6 +8,20 @@ import type { FlatColumnItem, OldColumnState } from './columnGroupTypes';
8
8
  * 生成唯一 ID
9
9
  */
10
10
  export declare const generateId: () => string;
11
+ /** 方案与 AG-Grid 使用相同的列标识规则。@author nokecy */
12
+ export declare function getColumnIdentity(column: {
13
+ colId?: string;
14
+ field?: string;
15
+ }): string | undefined;
16
+ /** 递归匹配业务列;仅对缺失标识的已存方案使用唯一原始标题恢复。@author nokecy */
17
+ export declare function findOriginalColumn(item: {
18
+ colId?: string;
19
+ field?: string;
20
+ originalHeaderName?: string;
21
+ headerName?: string;
22
+ }, definitions?: (ColDef | ColGroupDef)[]): ColDef | undefined;
23
+ /** 为列方案补齐业务列身份,保留用户的顺序、标题与布局设置。@author nokecy */
24
+ export declare function normalizeColumnConfig(items: FlatColumnItem[], definitions?: (ColDef | ColGroupDef)[]): FlatColumnItem[];
11
25
  /**
12
26
  * 去掉只做查询条件的列(hideInTable),含分组内的
13
27
  * 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
@@ -7,13 +7,16 @@ exports.checkIsLastChild = checkIsLastChild;
7
7
  exports.dropQueryOnlyItems = dropQueryOnlyItems;
8
8
  exports.excludeQueryOnlyColumns = excludeQueryOnlyColumns;
9
9
  exports.findLastDescendantIndex = findLastDescendantIndex;
10
+ exports.findOriginalColumn = findOriginalColumn;
10
11
  exports.flatConfigToColumnState = flatConfigToColumnState;
11
12
  exports.flatConfigToGridState = flatConfigToGridState;
12
13
  exports.generateId = void 0;
14
+ exports.getColumnIdentity = getColumnIdentity;
13
15
  exports.gridStateToFlatConfig = gridStateToFlatConfig;
14
16
  exports.isOldSchemeData = isOldSchemeData;
15
17
  exports.migrateOldScheme = migrateOldScheme;
16
18
  exports.normalizeCellAlign = normalizeCellAlign;
19
+ exports.normalizeColumnConfig = normalizeColumnConfig;
17
20
  exports.reorderItems = reorderItems;
18
21
  var _lodash = require("lodash");
19
22
  var _logger = require("../utils/logger");
@@ -40,6 +43,49 @@ var generateId = exports.generateId = function generateId() {
40
43
  return (0, _lodash.uniqueId)('col_');
41
44
  };
42
45
 
46
+ /** 方案与 AG-Grid 使用相同的列标识规则。@author nokecy */
47
+ function getColumnIdentity(column) {
48
+ return column.colId || column.field || undefined;
49
+ }
50
+
51
+ /** 递归匹配业务列;仅对缺失标识的已存方案使用唯一原始标题恢复。@author nokecy */
52
+ function findOriginalColumn(item, definitions) {
53
+ var columns = [];
54
+ var collect = function collect(defs) {
55
+ return defs.forEach(function (def) {
56
+ if ('children' in def && def.children) collect(def.children);else columns.push(def);
57
+ });
58
+ };
59
+ collect(definitions !== null && definitions !== void 0 ? definitions : []);
60
+ if (item.colId) return columns.find(function (column) {
61
+ return getColumnIdentity(column) === item.colId;
62
+ });
63
+ var title = item.originalHeaderName || item.headerName;
64
+ var candidates = item.field ? columns.filter(function (column) {
65
+ return column.field === item.field;
66
+ }) : columns.filter(function (column) {
67
+ return !!getColumnIdentity(column) && !!title && column.headerName === title;
68
+ });
69
+ if (candidates.length === 1) return candidates[0];
70
+ var named = candidates.filter(function (column) {
71
+ return !!title && column.headerName === title;
72
+ });
73
+ return named.length === 1 ? named[0] : undefined;
74
+ }
75
+
76
+ /** 为列方案补齐业务列身份,保留用户的顺序、标题与布局设置。@author nokecy */
77
+ function normalizeColumnConfig(items, definitions) {
78
+ return items.map(function (item) {
79
+ if (item.type !== 'column') return item;
80
+ var original = findOriginalColumn(item, definitions);
81
+ return original ? _objectSpread(_objectSpread({}, item), {}, {
82
+ colId: original.colId,
83
+ field: original.field,
84
+ originalHeaderName: original.headerName || item.originalHeaderName
85
+ }) : item;
86
+ });
87
+ }
88
+
43
89
  /**
44
90
  * 去掉只做查询条件的列(hideInTable),含分组内的
45
91
  * 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
@@ -64,12 +110,12 @@ function dropQueryOnlyItems(flatConfig, originalColumnDefs) {
64
110
  var queryOnlyFields = new Set();
65
111
  var collect = function collect(defs) {
66
112
  return defs.forEach(function (def) {
67
- if ('children' in def && def.children) collect(def.children);else if (def.hideInTable && def.field) queryOnlyFields.add(def.field);
113
+ if ('children' in def && def.children) collect(def.children);else if (def.hideInTable && getColumnIdentity(def)) queryOnlyFields.add(getColumnIdentity(def));
68
114
  });
69
115
  };
70
116
  collect(originalColumnDefs !== null && originalColumnDefs !== void 0 ? originalColumnDefs : []);
71
117
  return flatConfig.filter(function (item) {
72
- return item.type !== 'column' || !item.field || !queryOnlyFields.has(item.field);
118
+ return item.type !== 'column' || !getColumnIdentity(item) || !queryOnlyFields.has(getColumnIdentity(item));
73
119
  });
74
120
  }
75
121
 
@@ -85,37 +131,6 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
85
131
  var result = [];
86
132
  var order = 0;
87
133
 
88
- /**
89
- * 从原始列定义中查找指定字段的原始 headerName
90
- */
91
- function findOriginalHeaderName(field, defs) {
92
- if (!defs || !field) return undefined;
93
- var _iterator = _createForOfIteratorHelper(defs),
94
- _step;
95
- try {
96
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
97
- var def = _step.value;
98
- // 检查是否是分组
99
- if ('children' in def && def.children) {
100
- // 递归查找分组内的列
101
- var found = findOriginalHeaderName(field, def.children);
102
- if (found) return found;
103
- } else {
104
- // 检查是否是目标列
105
- var colDef = def;
106
- if (colDef.field === field) {
107
- return colDef.headerName;
108
- }
109
- }
110
- }
111
- } catch (err) {
112
- _iterator.e(err);
113
- } finally {
114
- _iterator.f();
115
- }
116
- return undefined;
117
- }
118
-
119
134
  /**
120
135
  * 递归遍历列定义树
121
136
  */
@@ -140,10 +155,11 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
140
155
  // 递归处理子节点
141
156
  traverse(item.children, level + 1, groupId);
142
157
  } else {
158
+ var _findOriginalColumn;
143
159
  // 这是一个列节点
144
160
  var _headerName = item.headerName || item.field || '未命名列';
145
161
  // 从原始列定义中获取 originalHeaderName,如果没有则使用当前 headerName
146
- var originalHeaderName = item.field ? findOriginalHeaderName(item.field, originalColumnDefs) || _headerName : _headerName;
162
+ var originalHeaderName = ((_findOriginalColumn = findOriginalColumn(item, originalColumnDefs)) === null || _findOriginalColumn === void 0 ? void 0 : _findOriginalColumn.headerName) || _headerName;
147
163
  result.push({
148
164
  id: generateId(),
149
165
  type: 'column',
@@ -151,6 +167,7 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
151
167
  level: level,
152
168
  order: order++,
153
169
  field: item.field,
170
+ colId: item.colId,
154
171
  headerName: _headerName,
155
172
  originalHeaderName: originalHeaderName,
156
173
  // 从原始定义获取,或使用当前值
@@ -183,50 +200,19 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
183
200
  */
184
201
  function flatConfigToGridState(flatConfig, originalColumnDefs) {
185
202
  // 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
186
- flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
203
+ flatConfig = dropQueryOnlyItems(normalizeColumnConfig(flatConfig, originalColumnDefs), originalColumnDefs);
187
204
  originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
188
205
 
189
- /**
190
- * 从原始列定义中查找指定字段的列定义(支持递归查找分组内的列)
191
- */
192
- function findOriginalColDef(field, defs) {
193
- if (!defs) return undefined;
194
- var _iterator2 = _createForOfIteratorHelper(defs),
195
- _step2;
196
- try {
197
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
198
- var def = _step2.value;
199
- // 检查是否是分组
200
- if ('children' in def && def.children) {
201
- // 递归查找分组内的列
202
- var found = findOriginalColDef(field, def.children);
203
- if (found) return found;
204
- } else {
205
- // 检查是否是目标列(使用类型守卫)
206
- var colDef = def;
207
- if (colDef.field === field) {
208
- return colDef;
209
- }
210
- }
211
- }
212
- } catch (err) {
213
- _iterator2.e(err);
214
- } finally {
215
- _iterator2.f();
216
- }
217
- return undefined;
218
- }
219
-
220
206
  /**
221
207
  * 递归收集所有列定义(包括分组内的列)
222
208
  */
223
209
  function collectAllColumns(defs) {
224
210
  var columns = [];
225
- var _iterator3 = _createForOfIteratorHelper(defs),
226
- _step3;
211
+ var _iterator = _createForOfIteratorHelper(defs),
212
+ _step;
227
213
  try {
228
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
229
- var def = _step3.value;
214
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
215
+ var def = _step.value;
230
216
  if ('children' in def && def.children) {
231
217
  columns.push.apply(columns, _toConsumableArray(collectAllColumns(def.children)));
232
218
  } else {
@@ -234,9 +220,9 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
234
220
  }
235
221
  }
236
222
  } catch (err) {
237
- _iterator3.e(err);
223
+ _iterator.e(err);
238
224
  } finally {
239
- _iterator3.f();
225
+ _iterator.f();
240
226
  }
241
227
  return columns;
242
228
  }
@@ -264,7 +250,7 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
264
250
  } else {
265
251
  // 构建列节点
266
252
  // 查找原始列定义
267
- var originalDef = item.field ? findOriginalColDef(item.field, originalColumnDefs) : undefined;
253
+ var originalDef = findOriginalColumn(item, originalColumnDefs);
268
254
 
269
255
  // 如果找到原始列定义,合并所有属性
270
256
  if (originalDef) {
@@ -284,6 +270,7 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
284
270
  // 如果没有找到原始定义,使用基本属性
285
271
  return {
286
272
  field: item.field,
273
+ colId: item.colId,
287
274
  headerName: item.headerName,
288
275
  width: item.width,
289
276
  hide: item.hide,
@@ -302,9 +289,9 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
302
289
  if (originalColumnDefs && originalColumnDefs.length > 0) {
303
290
  // 收集 flatConfig 中所有已存在的 field
304
291
  var existingFields = new Set(flatConfig.filter(function (item) {
305
- return item.type === 'column' && item.field;
292
+ return item.type === 'column' && getColumnIdentity(item);
306
293
  }).map(function (item) {
307
- return item.field;
294
+ return getColumnIdentity(item);
308
295
  }));
309
296
 
310
297
  // 收集原始列定义中所有的列(保留顺序索引)
@@ -313,7 +300,7 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
313
300
  // 找出新增的列及其在原始定义中的索引
314
301
  var newColumnsWithIndex = [];
315
302
  allOriginalColumns.forEach(function (col, index) {
316
- if (col.field && !existingFields.has(col.field)) {
303
+ if (getColumnIdentity(col) && !existingFields.has(getColumnIdentity(col))) {
317
304
  newColumnsWithIndex.push({
318
305
  col: col,
319
306
  originalIndex: index
@@ -328,23 +315,23 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
328
315
  });
329
316
 
330
317
  // 将新增列插入到正确位置(基于其在原始定义中的相对位置)
331
- var _iterator4 = _createForOfIteratorHelper(newColumnsWithIndex),
332
- _step4;
318
+ var _iterator2 = _createForOfIteratorHelper(newColumnsWithIndex),
319
+ _step2;
333
320
  try {
334
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
335
- var _step4$value = _step4.value,
336
- col = _step4$value.col,
337
- originalIndex = _step4$value.originalIndex;
321
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
322
+ var _step2$value = _step2.value,
323
+ col = _step2$value.col,
324
+ originalIndex = _step2$value.originalIndex;
338
325
  var insertIndex = 0; // 默认插入到开头
339
326
 
340
327
  // 从该列之前的列开始查找,找到第一个在 result 中存在的列
341
328
  var _loop = function _loop() {
342
329
  var prevCol = allOriginalColumns[i];
343
- if (!prevCol.field) return 0; // continue
330
+ if (!getColumnIdentity(prevCol)) return 0; // continue
344
331
 
345
332
  // 在 result 中找到这个前置列的位置
346
333
  var prevIndexInResult = result.findIndex(function (r) {
347
- return r.field === prevCol.field;
334
+ return getColumnIdentity(r) === getColumnIdentity(prevCol);
348
335
  });
349
336
  if (prevIndexInResult !== -1) {
350
337
  insertIndex = prevIndexInResult + 1;
@@ -362,9 +349,9 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
362
349
  result.splice(insertIndex, 0, col);
363
350
  }
364
351
  } catch (err) {
365
- _iterator4.e(err);
352
+ _iterator2.e(err);
366
353
  } finally {
367
- _iterator4.f();
354
+ _iterator2.f();
368
355
  }
369
356
  }
370
357
  }
@@ -409,6 +396,7 @@ function migrateOldScheme(oldState) {
409
396
  level: col.groupName ? 1 : 0,
410
397
  order: order++,
411
398
  field: col.field,
399
+ colId: col.colId,
412
400
  headerName: col.headerName,
413
401
  width: col.width,
414
402
  hide: col.hide,
@@ -504,7 +492,7 @@ function isOldSchemeData(data) {
504
492
  */
505
493
  function flatConfigToColumnState(flatConfig, originalColumnDefs) {
506
494
  // 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
507
- flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
495
+ flatConfig = dropQueryOnlyItems(normalizeColumnConfig(flatConfig, originalColumnDefs), originalColumnDefs);
508
496
  originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
509
497
 
510
498
  /**
@@ -512,11 +500,11 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
512
500
  */
513
501
  function collectAllColumns(defs) {
514
502
  var columns = [];
515
- var _iterator5 = _createForOfIteratorHelper(defs),
516
- _step5;
503
+ var _iterator3 = _createForOfIteratorHelper(defs),
504
+ _step3;
517
505
  try {
518
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
519
- var def = _step5.value;
506
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
507
+ var def = _step3.value;
520
508
  if ('children' in def && def.children) {
521
509
  columns.push.apply(columns, _toConsumableArray(collectAllColumns(def.children)));
522
510
  } else {
@@ -524,9 +512,9 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
524
512
  }
525
513
  }
526
514
  } catch (err) {
527
- _iterator5.e(err);
515
+ _iterator3.e(err);
528
516
  } finally {
529
- _iterator5.f();
517
+ _iterator3.f();
530
518
  }
531
519
  return columns;
532
520
  }
@@ -534,14 +522,14 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
534
522
  return item.type === 'column';
535
523
  }) // 只处理列节点,分组不在 columnState 中
536
524
  .filter(function (item) {
537
- return item.field;
538
- }) // 【修复】过滤掉没有 field 的列,防止 colId 为 undefined
525
+ return getColumnIdentity(item);
526
+ }) // 控件列可只有 colId。@author nokecy
539
527
  .sort(function (a, b) {
540
528
  return a.order - b.order;
541
529
  }) // 按 order 字段排序
542
530
  .map(function (item) {
543
531
  var state = {
544
- colId: item.field // 使用 field 作为 colId
532
+ colId: getColumnIdentity(item)
545
533
  };
546
534
 
547
535
  // 只设置有值的属性,undefined 表示不改变该属性
@@ -560,9 +548,9 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
560
548
  if (originalColumnDefs && originalColumnDefs.length > 0) {
561
549
  // 收集 flatConfig 中所有已存在的 field
562
550
  var existingFields = new Set(flatConfig.filter(function (item) {
563
- return item.type === 'column' && item.field;
551
+ return item.type === 'column' && getColumnIdentity(item);
564
552
  }).map(function (item) {
565
- return item.field;
553
+ return getColumnIdentity(item);
566
554
  }));
567
555
 
568
556
  // 收集原始列定义中所有的列(保留顺序索引)
@@ -571,7 +559,7 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
571
559
  // 找出新增的列及其在原始定义中的索引
572
560
  var newColumnsWithIndex = [];
573
561
  allOriginalColumns.forEach(function (col, index) {
574
- if (col.field && !existingFields.has(col.field)) {
562
+ if (getColumnIdentity(col) && !existingFields.has(getColumnIdentity(col))) {
575
563
  newColumnsWithIndex.push({
576
564
  col: col,
577
565
  originalIndex: index
@@ -586,23 +574,23 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
586
574
  });
587
575
 
588
576
  // 将新增列插入到正确位置(基于其在原始定义中的相对位置)
589
- var _iterator6 = _createForOfIteratorHelper(newColumnsWithIndex),
590
- _step6;
577
+ var _iterator4 = _createForOfIteratorHelper(newColumnsWithIndex),
578
+ _step4;
591
579
  try {
592
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
593
- var _step6$value = _step6.value,
594
- col = _step6$value.col,
595
- originalIndex = _step6$value.originalIndex;
580
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
581
+ var _step4$value = _step4.value,
582
+ col = _step4$value.col,
583
+ originalIndex = _step4$value.originalIndex;
596
584
  var insertIndex = 0; // 默认插入到开头
597
585
 
598
586
  // 从该列之前的列开始查找,找到第一个在 result 中存在的列
599
587
  var _loop2 = function _loop2() {
600
588
  var prevCol = allOriginalColumns[i];
601
- if (!prevCol.field) return 0; // continue
589
+ if (!getColumnIdentity(prevCol)) return 0; // continue
602
590
 
603
591
  // 在 result 中找到这个前置列的位置
604
592
  var prevIndexInResult = result.findIndex(function (r) {
605
- return r.colId === prevCol.field;
593
+ return r.colId === getColumnIdentity(prevCol);
606
594
  });
607
595
  if (prevIndexInResult !== -1) {
608
596
  insertIndex = prevIndexInResult + 1;
@@ -618,14 +606,14 @@ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
618
606
 
619
607
  // 在 insertIndex 位置插入新列状态
620
608
  result.splice(insertIndex, 0, {
621
- colId: col.field
609
+ colId: getColumnIdentity(col)
622
610
  // 新增列使用默认状态,不设置 hide/width 等
623
611
  });
624
612
  }
625
613
  } catch (err) {
626
- _iterator6.e(err);
614
+ _iterator4.e(err);
627
615
  } finally {
628
- _iterator6.f();
616
+ _iterator4.f();
629
617
  }
630
618
  }
631
619
  }
@@ -128,6 +128,8 @@ export interface ExtendedColDef extends ColDef {
128
128
  hideInSearch?: boolean;
129
129
  /** 查询字段名 (不同于显示字段) */
130
130
  queryField?: string;
131
+ /** 查询区独立标题;优先于列方案中的表头名称。@author nokecy */
132
+ searchTitle?: string;
131
133
  /** 是否文本缩略显示并使用 tooltip */
132
134
  ellipsis?: boolean;
133
135
  /** 枚举值配置 */
@@ -142,6 +144,8 @@ export interface ExtendedColDef extends ColDef {
142
144
  searchComponent?: ReactNode | ((props: any) => JSX.Element);
143
145
  /** 搜索组件属性 */
144
146
  searchComponentProps?: any;
147
+ /** 查询组件的枚举数据源。@author nokecy */
148
+ enum?: any[];
145
149
  /** 搜索表单排序顺序 */
146
150
  searchSort?: number;
147
151
  /** 列计算类型 */
@@ -208,6 +212,8 @@ export interface QueryFormItem {
208
212
  field: string;
209
213
  /** 表头名称 */
210
214
  headerName: string;
215
+ /** 查询区独立标题。@author nokecy */
216
+ searchTitle?: string;
211
217
  /** 排序顺序 */
212
218
  order: number;
213
219
  /** 是否精确查询 */
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import type { ArrayField } from '@formily/core';
3
+ import type { GridApi, IRowNode, SelectionChangedEvent } from 'ag-grid-community';
4
+ import type { ArrayTableProps, ObservableColumnSource } from './interface';
5
+ /** 标准删除控件在行内的字段路径与静态约束。@author nokecy */
6
+ export type RemovalAction = {
7
+ path: string[];
8
+ schemas: any[];
9
+ column: ObservableColumnSource;
10
+ };
11
+ /** 收集标准删除入口,保留列级显隐约束,不把其他业务按钮当成删除。@author nokecy */
12
+ export declare function collectRemovalActions(sources: ObservableColumnSource[]): RemovalAction[];
13
+ /**
14
+ * 与行内删除共用字段的运行时权限;未挂载的普通行采用静态规则。
15
+ * 含动态权限且尚未求值的行保持不可删除,避免绕过业务禁用条件。@author nokecy
16
+ */
17
+ export declare function findRemovalAction(field: ArrayField, index: number, actions: RemovalAction[]): RemovalAction | undefined;
18
+ /**
19
+ * 把选择时的稳定行标识转换为当前表单索引;确认前全部复核,倒序删除保持数组地址正确。
20
+ * 返回 false 表示所选行已删除或变为不可删除,整个批次不执行。@author nokecy
21
+ */
22
+ export declare function removeSelectedRows(field: ArrayField, ids: string[], actions: RemovalAction[], getId: (row: any) => string, onRemove?: (index: number) => void, event?: React.MouseEvent): boolean;
23
+ /** 公共明细表格的勾选及批量删除,沿用业务行权限、行标识与删除通知。@author nokecy */
24
+ export declare function useArrayTableBatchRemove(field: ArrayField, sources: ObservableColumnSource[], props: ArrayTableProps, apiRef: React.MutableRefObject<GridApi | undefined>, getId: (row: any) => string): {
25
+ rowSelection: "multiple" | "single" | import("ag-grid-community/dist/types/src/entities/gridOptions").SingleRowSelectionOptions<any, any> | import("ag-grid-community/dist/types/src/entities/gridOptions").MultiRowSelectionOptions<any, any> | {
26
+ isRowSelectable: (node: IRowNode) => boolean;
27
+ headerCheckbox?: boolean | undefined;
28
+ selectAll?: "filtered" | undefined;
29
+ mode: "singleRow" | "multiRow";
30
+ checkboxes: boolean;
31
+ enableClickSelection: boolean;
32
+ } | undefined;
33
+ selectionColumnDef: import("ag-grid-community").SelectionColumnDef | undefined;
34
+ onSelectionChanged: (event: SelectionChangedEvent) => void;
35
+ toolbar: React.JSX.Element;
36
+ };