@nokecy/qc-ui 1.1.21 → 1.1.23

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 (26) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +128 -8
  2. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.d.ts +2 -1
  3. package/dist/cjs/ag-grid-plus/context/useSchemeDataFlow.js +6 -5
  4. package/dist/cjs/ag-grid-plus/queryForm/AdvancedQueryBuilder.d.ts +10 -0
  5. package/dist/cjs/ag-grid-plus/queryForm/AdvancedQueryBuilder.js +547 -0
  6. package/dist/cjs/ag-grid-plus/queryForm/index.js +3 -6
  7. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +7 -2
  8. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +196 -4
  9. package/dist/cjs/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +36 -0
  10. package/dist/cjs/ag-grid-plus/utils.d.ts +6 -0
  11. package/dist/cjs/ag-grid-plus/utils.js +86 -1
  12. package/dist/cjs/formDesigner/FormDesigner.js +4 -2
  13. package/dist/esm/ag-grid-plus/ag-gridPlus.js +131 -11
  14. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.d.ts +2 -1
  15. package/dist/esm/ag-grid-plus/context/useSchemeDataFlow.js +6 -5
  16. package/dist/esm/ag-grid-plus/queryForm/AdvancedQueryBuilder.d.ts +10 -0
  17. package/dist/esm/ag-grid-plus/queryForm/AdvancedQueryBuilder.js +541 -0
  18. package/dist/esm/ag-grid-plus/queryForm/index.js +3 -6
  19. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +7 -2
  20. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +196 -4
  21. package/dist/esm/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +36 -0
  22. package/dist/esm/ag-grid-plus/utils.d.ts +6 -0
  23. package/dist/esm/ag-grid-plus/utils.js +85 -0
  24. package/dist/esm/formDesigner/FormDesigner.js +4 -2
  25. package/dist/umd/qc-ui.min.js +1 -1
  26. package/package.json +2 -2
@@ -20,6 +20,10 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
20
  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; }
21
21
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
22
22
  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); }
23
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
24
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
25
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
26
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
23
27
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
24
28
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
29
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
@@ -137,8 +141,10 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
137
141
  * 【重要】如果提供了 originalColumnDefs,会合并原始列定义中的所有属性
138
142
  * 这样可以保留 cellRenderer、valueFormatter、valueEnum 等自定义渲染属性
139
143
  *
144
+ * 【重要】会自动检测并追加代码中新增的列(在 originalColumnDefs 中存在但 flatConfig 中不存在的列)
145
+ *
140
146
  * @param flatConfig 扁平化配置数组
141
- * @param originalColumnDefs 原始列定义数组(可选),用于保留自定义属性
147
+ * @param originalColumnDefs 原始列定义数组(可选),用于保留自定义属性和检测新增列
142
148
  * @returns AG-Grid 列定义数组
143
149
  */
144
150
  function flatConfigToGridState(flatConfig, originalColumnDefs) {
@@ -173,6 +179,30 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
173
179
  return undefined;
174
180
  }
175
181
 
182
+ /**
183
+ * 递归收集所有列定义(包括分组内的列)
184
+ */
185
+ function collectAllColumns(defs) {
186
+ var columns = [];
187
+ var _iterator3 = _createForOfIteratorHelper(defs),
188
+ _step3;
189
+ try {
190
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
191
+ var def = _step3.value;
192
+ if ('children' in def && def.children) {
193
+ columns.push.apply(columns, _toConsumableArray(collectAllColumns(def.children)));
194
+ } else {
195
+ columns.push(def);
196
+ }
197
+ }
198
+ } catch (err) {
199
+ _iterator3.e(err);
200
+ } finally {
201
+ _iterator3.f();
202
+ }
203
+ return columns;
204
+ }
205
+
176
206
  /**
177
207
  * 递归构建树形结构
178
208
  */
@@ -227,7 +257,74 @@ function flatConfigToGridState(flatConfig, originalColumnDefs) {
227
257
  }
228
258
  });
229
259
  }
230
- return buildTree();
260
+ var result = buildTree();
261
+
262
+ // 【新增】检测并插入代码中新增的列到原始位置
263
+ // 场景:用户保存列配置后,开发者在代码中新增了列,这些列应该在其原始定义位置显示
264
+ if (originalColumnDefs && originalColumnDefs.length > 0) {
265
+ // 收集 flatConfig 中所有已存在的 field
266
+ var existingFields = new Set(flatConfig.filter(function (item) {
267
+ return item.type === 'column' && item.field;
268
+ }).map(function (item) {
269
+ return item.field;
270
+ }));
271
+
272
+ // 收集原始列定义中所有的列(保留顺序索引)
273
+ var allOriginalColumns = collectAllColumns(originalColumnDefs);
274
+
275
+ // 找出新增的列及其在原始定义中的索引
276
+ var newColumnsWithIndex = [];
277
+ allOriginalColumns.forEach(function (col, index) {
278
+ if (col.field && !existingFields.has(col.field)) {
279
+ newColumnsWithIndex.push({
280
+ col: col,
281
+ originalIndex: index
282
+ });
283
+ }
284
+ });
285
+ if (newColumnsWithIndex.length > 0) {
286
+ // 将新增列插入到正确位置(基于其在原始定义中的相对位置)
287
+ var _iterator4 = _createForOfIteratorHelper(newColumnsWithIndex),
288
+ _step4;
289
+ try {
290
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
291
+ var _step4$value = _step4.value,
292
+ col = _step4$value.col,
293
+ originalIndex = _step4$value.originalIndex;
294
+ var insertIndex = 0; // 默认插入到开头
295
+
296
+ // 从该列之前的列开始查找,找到第一个在 result 中存在的列
297
+ var _loop = function _loop() {
298
+ var prevCol = allOriginalColumns[i];
299
+ if (!prevCol.field) return 0; // continue
300
+
301
+ // 在 result 中找到这个前置列的位置
302
+ var prevIndexInResult = result.findIndex(function (r) {
303
+ return r.field === prevCol.field;
304
+ });
305
+ if (prevIndexInResult !== -1) {
306
+ insertIndex = prevIndexInResult + 1;
307
+ return 1; // break
308
+ }
309
+ },
310
+ _ret;
311
+ for (var i = originalIndex - 1; i >= 0; i--) {
312
+ _ret = _loop();
313
+ if (_ret === 0) continue;
314
+ if (_ret === 1) break;
315
+ }
316
+
317
+ // 在 insertIndex 位置插入新列
318
+ result.splice(insertIndex, 0, col);
319
+ }
320
+ } catch (err) {
321
+ _iterator4.e(err);
322
+ } finally {
323
+ _iterator4.f();
324
+ }
325
+ }
326
+ }
327
+ return result;
231
328
  }
232
329
 
233
330
  /**
@@ -355,11 +452,37 @@ function isOldSchemeData(data) {
355
452
  * 扁平化配置 → AG-Grid Column State
356
453
  * 将扁平化数组转换为 AG-Grid 的 columnState 格式,用于控制列的顺序和属性
357
454
  *
455
+ * 【重要】会自动检测并追加代码中新增的列(在 originalColumnDefs 中存在但 flatConfig 中不存在的列)
456
+ *
358
457
  * @param flatConfig 扁平化配置数组
458
+ * @param originalColumnDefs 原始列定义数组(可选),用于检测新增列
359
459
  * @returns AG-Grid columnState 数组
360
460
  */
361
- function flatConfigToColumnState(flatConfig) {
362
- return flatConfig.filter(function (item) {
461
+ function flatConfigToColumnState(flatConfig, originalColumnDefs) {
462
+ /**
463
+ * 递归收集所有列定义(包括分组内的列)
464
+ */
465
+ function collectAllColumns(defs) {
466
+ var columns = [];
467
+ var _iterator5 = _createForOfIteratorHelper(defs),
468
+ _step5;
469
+ try {
470
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
471
+ var def = _step5.value;
472
+ if ('children' in def && def.children) {
473
+ columns.push.apply(columns, _toConsumableArray(collectAllColumns(def.children)));
474
+ } else {
475
+ columns.push(def);
476
+ }
477
+ }
478
+ } catch (err) {
479
+ _iterator5.e(err);
480
+ } finally {
481
+ _iterator5.f();
482
+ }
483
+ return columns;
484
+ }
485
+ var result = flatConfig.filter(function (item) {
363
486
  return item.type === 'column';
364
487
  }) // 只处理列节点,分组不在 columnState 中
365
488
  .filter(function (item) {
@@ -384,4 +507,73 @@ function flatConfigToColumnState(flatConfig) {
384
507
  }
385
508
  return state;
386
509
  });
510
+
511
+ // 【新增】检测并插入代码中新增的列到原始位置
512
+ if (originalColumnDefs && originalColumnDefs.length > 0) {
513
+ // 收集 flatConfig 中所有已存在的 field
514
+ var existingFields = new Set(flatConfig.filter(function (item) {
515
+ return item.type === 'column' && item.field;
516
+ }).map(function (item) {
517
+ return item.field;
518
+ }));
519
+
520
+ // 收集原始列定义中所有的列(保留顺序索引)
521
+ var allOriginalColumns = collectAllColumns(originalColumnDefs);
522
+
523
+ // 找出新增的列及其在原始定义中的索引
524
+ var newColumnsWithIndex = [];
525
+ allOriginalColumns.forEach(function (col, index) {
526
+ if (col.field && !existingFields.has(col.field)) {
527
+ newColumnsWithIndex.push({
528
+ col: col,
529
+ originalIndex: index
530
+ });
531
+ }
532
+ });
533
+ if (newColumnsWithIndex.length > 0) {
534
+ // 将新增列插入到正确位置(基于其在原始定义中的相对位置)
535
+ var _iterator6 = _createForOfIteratorHelper(newColumnsWithIndex),
536
+ _step6;
537
+ try {
538
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
539
+ var _step6$value = _step6.value,
540
+ col = _step6$value.col,
541
+ originalIndex = _step6$value.originalIndex;
542
+ var insertIndex = 0; // 默认插入到开头
543
+
544
+ // 从该列之前的列开始查找,找到第一个在 result 中存在的列
545
+ var _loop2 = function _loop2() {
546
+ var prevCol = allOriginalColumns[i];
547
+ if (!prevCol.field) return 0; // continue
548
+
549
+ // 在 result 中找到这个前置列的位置
550
+ var prevIndexInResult = result.findIndex(function (r) {
551
+ return r.colId === prevCol.field;
552
+ });
553
+ if (prevIndexInResult !== -1) {
554
+ insertIndex = prevIndexInResult + 1;
555
+ return 1; // break
556
+ }
557
+ },
558
+ _ret2;
559
+ for (var i = originalIndex - 1; i >= 0; i--) {
560
+ _ret2 = _loop2();
561
+ if (_ret2 === 0) continue;
562
+ if (_ret2 === 1) break;
563
+ }
564
+
565
+ // 在 insertIndex 位置插入新列状态
566
+ result.splice(insertIndex, 0, {
567
+ colId: col.field
568
+ // 新增列使用默认状态,不设置 hide/width 等
569
+ });
570
+ }
571
+ } catch (err) {
572
+ _iterator6.e(err);
573
+ } finally {
574
+ _iterator6.f();
575
+ }
576
+ }
577
+ }
578
+ return result;
387
579
  }
@@ -8,6 +8,38 @@ export interface QueryItem {
8
8
  /** 是否隐藏 */
9
9
  hidden?: boolean;
10
10
  }
11
+ /**
12
+ * 逻辑操作符 // P0
13
+ */
14
+ export type LogicOperator = 'AND' | 'OR';
15
+ /**
16
+ * 查询规则操作符 // P0
17
+ */
18
+ export type RuleOperator = '=' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'startsWith' | 'endsWith' | 'isEmpty' | 'isNotEmpty' | 'between';
19
+ /**
20
+ * 单条查询规则 // P0
21
+ */
22
+ export interface QueryRule {
23
+ /** 规则ID */
24
+ id: string;
25
+ /** 字段名 */
26
+ field: string;
27
+ /** 操作符 */
28
+ operator: string;
29
+ /** 值 */
30
+ value: any;
31
+ }
32
+ /**
33
+ * 查询规则组 // P0
34
+ */
35
+ export interface QueryRuleGroup {
36
+ /** 组ID */
37
+ id: string;
38
+ /** 逻辑连接符 */
39
+ logic: LogicOperator;
40
+ /** 子规则或子组 */
41
+ children: (QueryRule | QueryRuleGroup)[];
42
+ }
11
43
  /**
12
44
  * 查询配置结构
13
45
  */
@@ -16,6 +48,10 @@ export interface QueryConfig {
16
48
  items: QueryItem[];
17
49
  /** 查询表单默认值 */
18
50
  defaultValues?: Record<string, any>;
51
+ /** 查询模式: simple(简单表单) | advanced(高级组合器) // P0 */
52
+ mode?: 'simple' | 'advanced';
53
+ /** 高级模式下的规则树 // P0 */
54
+ rules?: QueryRuleGroup;
19
55
  }
20
56
  /**
21
57
  * 查询方案
@@ -1,5 +1,11 @@
1
1
  import { ValueFormatterParams } from 'ag-grid-community';
2
2
  import { AgGridColumnPropsClone } from './interface';
3
+ /**
4
+ * 将高级查询规则转换为后端 Filter 字符串
5
+ * 注意: 目前为了保持兼容性,只能尽量将 OR 转换为后端支持的格式(如 A=1|A=2),
6
+ * 复杂的嵌套 OR 可能需要后端升级支持。当前策略是尽力转换。
7
+ */
8
+ export declare const convertRulesToFilterString: (ruleGroup: any, colDefs: any[]) => string;
3
9
  declare const convertFilterModel: (filterModel: any, colDefs: AgGridColumnPropsClone[]) => string;
4
10
  declare const convertSortModel: (sortModel: any[]) => string;
5
11
  declare const dateValueFormatter: (params: ValueFormatterParams) => string;
@@ -4,7 +4,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.toTree = exports.flattenTreeDeep = exports.flatten = exports.dateValueFormatter = exports.dateTimeValueFormatter = exports.convertSortModel = exports.convertFilterModel = void 0;
7
+ exports.toTree = exports.flattenTreeDeep = exports.flatten = exports.dateValueFormatter = exports.dateTimeValueFormatter = exports.convertSortModel = exports.convertRulesToFilterString = exports.convertFilterModel = void 0;
8
8
  var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
9
9
  var _dayjs = _interopRequireDefault(require("dayjs"));
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -22,6 +22,91 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
22
22
  var esc = function esc(v) {
23
23
  return v.replace(/([(),|,\\]|\/i)/g, '\\$1');
24
24
  };
25
+
26
+ // --- Query Builder Logic Helpers (P0) ---
27
+
28
+ /**
29
+ * 将高级查询规则转换为后端 Filter 字符串
30
+ * 注意: 目前为了保持兼容性,只能尽量将 OR 转换为后端支持的格式(如 A=1|A=2),
31
+ * 复杂的嵌套 OR 可能需要后端升级支持。当前策略是尽力转换。
32
+ */
33
+ var convertRulesToFilterString = exports.convertRulesToFilterString = function convertRulesToFilterString(ruleGroup, colDefs) {
34
+ if (!ruleGroup || !ruleGroup.children || ruleGroup.children.length === 0) {
35
+ return "";
36
+ }
37
+ var processGroup = function processGroup(group) {
38
+ var results = [];
39
+ var isAnd = group.logic === 'AND';
40
+ group.children.forEach(function (child) {
41
+ if (child.logic) {
42
+ // Nested Group
43
+ var childFilters = processGroup(child);
44
+ if (childFilters.length > 0) {
45
+ // 简单的嵌套处理,如果顶层是 AND,子组也是 AND,则展开
46
+ // 如果逻辑不一致,目前简单的 Filter String 可能无法完美表达 ((A=1) AND (B=2)) OR (C=3)
47
+ // 现在的降级策略:如果是 OR 组,尝试用逗号分隔(但标准是 AND 用逗号)
48
+ // TODO: 确认后端是否支持 SQL-like filter string。
49
+ // 假设目前只处理最简单的:平铺的 AND
50
+ results.push.apply(results, _toConsumableArray(childFilters)); // 暂时打平
51
+ }
52
+ } else {
53
+ // Rule
54
+ var colDef = colDefs.find(function (c) {
55
+ return c.field === child.field;
56
+ });
57
+ var filter = getRuleFilter(child, colDef);
58
+ if (filter) {
59
+ results.push(filter);
60
+ }
61
+ }
62
+ });
63
+ return results;
64
+ };
65
+
66
+ // 目前为了兼容性,强制打平输出。高级功能的完整支持依赖后端。
67
+ // 这里我们把所有规则都视为可以通过 convertFilterModel 处理的单元
68
+ var filters = processGroup(ruleGroup);
69
+ return filters.join(",");
70
+ };
71
+ var getRuleFilter = function getRuleFilter(rule, colDef) {
72
+ var field = rule.field,
73
+ operator = rule.operator,
74
+ value = rule.value;
75
+ if (value === undefined || value === null || value === "") return "";
76
+ var objectKey = field;
77
+
78
+ // 根据操作符构造查询串
79
+ switch (operator) {
80
+ case '=':
81
+ return "".concat(objectKey, " = ").concat(value);
82
+ case '!=':
83
+ return "".concat(objectKey, " != ").concat(value);
84
+ case '>':
85
+ return "".concat(objectKey, " > ").concat(value);
86
+ case '>=':
87
+ return "".concat(objectKey, " >= ").concat(value);
88
+ case '<':
89
+ return "".concat(objectKey, " < ").concat(value);
90
+ case '<=':
91
+ return "".concat(objectKey, " <= ").concat(value);
92
+ case 'contains':
93
+ return "".concat(objectKey, " =* ").concat(esc(value));
94
+ case 'startsWith':
95
+ return "".concat(objectKey, " ^ ").concat(esc(value));
96
+ case 'endsWith':
97
+ // 后端可能不支持 endWith 语法,暂用 =*
98
+ return "".concat(objectKey, " =* ").concat(esc(value));
99
+ case 'between':
100
+ if (Array.isArray(value)) {
101
+ // 复用现有的 range 逻辑
102
+ return getFilter(objectKey, value, colDef);
103
+ }
104
+ return "";
105
+ default:
106
+ // 默认回退到标准处理
107
+ return getFilter(objectKey, value, colDef);
108
+ }
109
+ };
25
110
  var getFilter = function getFilter(objectKey, value, colDef) {
26
111
  if (typeof value === 'string') {
27
112
  return value && value != "" ? "".concat(objectKey, " ").concat(colDef !== null && colDef !== void 0 && colDef.exactQuery ? '^' : "=*", " ").concat(esc(value)) : "";
@@ -63,8 +63,10 @@ var FormDesigner = function FormDesigner(props) {
63
63
  var getComponents = function getComponents() {
64
64
  var components = {};
65
65
  businessComponents.map(function (x) {
66
- if (!x.Behavior) {}
67
- components[x.Behavior[0].name] = x;
66
+ var _x$Behavior;
67
+ if ((_x$Behavior = x.Behavior) !== null && _x$Behavior !== void 0 && (_x$Behavior = _x$Behavior[0]) !== null && _x$Behavior !== void 0 && _x$Behavior.name) {
68
+ components[x.Behavior[0].name] = x;
69
+ }
68
70
  });
69
71
  return components;
70
72
  };
@@ -23,7 +23,7 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
23
23
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
24
24
  import { ModuleRegistry } from 'ag-grid-community';
25
25
  import { AgGridReact } from 'ag-grid-react';
26
- import { Spin, Pagination, Card, Tag, Typography } from 'antd';
26
+ import { Spin, Pagination, Card, Tag, Typography, Popover, Badge, Button } from 'antd';
27
27
  import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
28
28
  import { AllEnterpriseModule } from "ag-grid-enterprise";
29
29
 
@@ -36,8 +36,10 @@ import "./index.less";
36
36
  import FormRender from "./queryForm";
37
37
  import ToolBar from "./toolBar";
38
38
  import SettingItem from "./settingItem";
39
- import { RedoOutlined } from '@ant-design/icons';
40
- import { convertFilterModel, dateTimeValueFormatter, dateValueFormatter, flatten, toTree } from "./utils";
39
+ import { RedoOutlined, FilterOutlined } from '@ant-design/icons';
40
+ import { convertFilterModel, convertRulesToFilterString, dateTimeValueFormatter, dateValueFormatter, flatten, toTree } from "./utils";
41
+ import AdvancedQueryBuilder from "./queryForm/AdvancedQueryBuilder";
42
+ import { v4 as uuidv4 } from 'uuid';
41
43
  import Setting from "./setting";
42
44
  import { useGridPlusColumnState } from '.';
43
45
  import CustomGroupCellRenderer from "./_utils/customGroupCellRenderer";
@@ -218,6 +220,23 @@ function AgGridPlus(props) {
218
220
  queryItemsOrder = _useState18[0],
219
221
  setQueryItemsOrder = _useState18[1];
220
222
 
223
+ // 高级查询状态
224
+ var _useState19 = useState(false),
225
+ _useState20 = _slicedToArray(_useState19, 2),
226
+ advancedPopoverOpen = _useState20[0],
227
+ setAdvancedPopoverOpen = _useState20[1];
228
+ var createEmptyRuleGroup = function createEmptyRuleGroup() {
229
+ return {
230
+ id: uuidv4(),
231
+ logic: 'AND',
232
+ children: []
233
+ };
234
+ };
235
+ var _useState21 = useState(createEmptyRuleGroup),
236
+ _useState22 = _slicedToArray(_useState21, 2),
237
+ advancedQueryRules = _useState22[0],
238
+ setAdvancedQueryRules = _useState22[1];
239
+
221
240
  /**
222
241
  * 【P1 架构优化】使用单向数据流架构
223
242
  *
@@ -676,7 +695,19 @@ function AgGridPlus(props) {
676
695
  pagination: pagination
677
696
  });
678
697
  try {
679
- var filter = convertFilterModel(queryFilter, allColDefsRef.current);
698
+ // 处理高级查询模式
699
+ var filter;
700
+ if (queryFilter.__advancedMode__ && queryFilter.__rules__) {
701
+ // 高级模式:使用规则转换
702
+ filter = convertRulesToFilterString(queryFilter.__rules__, allColDefsRef.current);
703
+ logger.debug('高级模式 Filter', {
704
+ rules: queryFilter.__rules__,
705
+ filter: filter
706
+ });
707
+ } else {
708
+ // 简单模式:使用原有的转换逻辑
709
+ filter = convertFilterModel(queryFilter, allColDefsRef.current);
710
+ }
680
711
  var params = _objectSpread(_objectSpread({
681
712
  filter: filter
682
713
  }, stableGridParams), {}, {
@@ -1181,16 +1212,33 @@ function AgGridPlus(props) {
1181
1212
  defaultExpand: defaultSearchExpand,
1182
1213
  gridApi: apiRef.current,
1183
1214
  onQuery: function onQuery(formValues) {
1215
+ // 优先使用高级搜索:如果存在高级搜索条件,忽略简单查询
1216
+ if (advancedQueryRules.children.length > 0) {
1217
+ var filter = {
1218
+ __advancedMode__: true,
1219
+ __rules__: advancedQueryRules
1220
+ };
1221
+ setQueryFilter(filter);
1222
+ if (pagination.current !== 1) {
1223
+ setPagination(function (prev) {
1224
+ return _objectSpread(_objectSpread({}, prev), {}, {
1225
+ current: 1
1226
+ });
1227
+ });
1228
+ }
1229
+ onRequest && onRequest(filter);
1230
+ return;
1231
+ }
1184
1232
  setQueryFilter(_objectSpread({}, formValues));
1185
- setPagination(function (prev) {
1186
- if (prev.current !== 1) {
1233
+ // 始终使用传入的 formValues 发起请求
1234
+ if (pagination.current !== 1) {
1235
+ setPagination(function (prev) {
1187
1236
  return _objectSpread(_objectSpread({}, prev), {}, {
1188
1237
  current: 1
1189
1238
  });
1190
- }
1191
- onRequest && onRequest(formValues);
1192
- return prev;
1193
- });
1239
+ });
1240
+ }
1241
+ onRequest && onRequest(formValues);
1194
1242
  },
1195
1243
  onInit: function onInit(defaultValues) {
1196
1244
  setQueryFilter(defaultValues);
@@ -1228,7 +1276,79 @@ function AgGridPlus(props) {
1228
1276
  gridKey: gridKey,
1229
1277
  gridApi: apiRef.current,
1230
1278
  onSaveColumnState: onColumnStateChanged
1231
- })]
1279
+ }),
1280
+ /*#__PURE__*/
1281
+ // 高级搜索(图标风格,位于设置右边)
1282
+ React.createElement(Popover, {
1283
+ key: "advanced-search-setting",
1284
+ content: /*#__PURE__*/React.createElement("div", {
1285
+ style: {
1286
+ width: 600,
1287
+ maxHeight: 400,
1288
+ overflow: 'auto'
1289
+ }
1290
+ }, /*#__PURE__*/React.createElement(AdvancedQueryBuilder, {
1291
+ rootGroup: advancedQueryRules,
1292
+ onChange: setAdvancedQueryRules,
1293
+ colDefs: allColDefs
1294
+ }), /*#__PURE__*/React.createElement("div", {
1295
+ style: {
1296
+ marginTop: 12,
1297
+ textAlign: 'right',
1298
+ borderTop: '1px solid #f0f0f0',
1299
+ paddingTop: 12
1300
+ }
1301
+ }, /*#__PURE__*/React.createElement(Button, {
1302
+ size: "small",
1303
+ onClick: function onClick() {
1304
+ setAdvancedQueryRules(createEmptyRuleGroup());
1305
+ setQueryFilter({});
1306
+ onRequest && onRequest({});
1307
+ setAdvancedPopoverOpen(false);
1308
+ },
1309
+ style: {
1310
+ marginRight: 8
1311
+ }
1312
+ }, "\u91CD\u7F6E"), /*#__PURE__*/React.createElement(Button, {
1313
+ size: "small",
1314
+ type: "primary",
1315
+ onClick: function onClick() {
1316
+ var filter = {
1317
+ __advancedMode__: true,
1318
+ __rules__: advancedQueryRules
1319
+ };
1320
+ setQueryFilter(filter);
1321
+ if (pagination.current !== 1) {
1322
+ setPagination(function (prev) {
1323
+ return _objectSpread(_objectSpread({}, prev), {}, {
1324
+ current: 1
1325
+ });
1326
+ });
1327
+ }
1328
+ onRequest && onRequest(filter);
1329
+ setAdvancedPopoverOpen(false);
1330
+ }
1331
+ }, "\u67E5\u8BE2"))),
1332
+ title: "\u9AD8\u7EA7\u641C\u7D22",
1333
+ trigger: "click",
1334
+ open: advancedPopoverOpen,
1335
+ onOpenChange: setAdvancedPopoverOpen,
1336
+ placement: "bottomRight",
1337
+ overlayStyle: {
1338
+ maxWidth: 'none'
1339
+ }
1340
+ }, /*#__PURE__*/React.createElement(Badge, {
1341
+ count: advancedQueryRules.children.length,
1342
+ size: "small",
1343
+ offset: [-2, 2]
1344
+ }, /*#__PURE__*/React.createElement("div", {
1345
+ style: {
1346
+ margin: "0 4px",
1347
+ color: advancedQueryRules.children.length > 0 ? '#1890ff' : '#000',
1348
+ fontSize: 16,
1349
+ cursor: "pointer"
1350
+ }
1351
+ }, /*#__PURE__*/React.createElement(FilterOutlined, null))))]
1232
1352
  }), /*#__PURE__*/React.createElement(AgGridReact, _extends({
1233
1353
  theme: agGridTheme
1234
1354
  }, rest, {
@@ -48,9 +48,10 @@ export declare function useDerivedGridState(currentScheme: ColumnScheme | undefi
48
48
  * 派生层 - 计算列样式状态(只读派生)
49
49
  *
50
50
  * @param currentScheme - 当前列方案
51
+ * @param allColDefs - 原始列定义(用于检测新增列)
51
52
  * @returns 派生的列状态配置
52
53
  */
53
- export declare function useDerivedColumnState(currentScheme: ColumnScheme | undefined): any;
54
+ export declare function useDerivedColumnState(currentScheme: ColumnScheme | undefined, allColDefs: ExtendedColDef[]): any;
54
55
  /**
55
56
  * 统一的方案数据流 Hook(组合版)
56
57
  *
@@ -91,9 +91,10 @@ export function useDerivedGridState(currentScheme, allColDefs) {
91
91
  * 派生层 - 计算列样式状态(只读派生)
92
92
  *
93
93
  * @param currentScheme - 当前列方案
94
+ * @param allColDefs - 原始列定义(用于检测新增列)
94
95
  * @returns 派生的列状态配置
95
96
  */
96
- export function useDerivedColumnState(currentScheme) {
97
+ export function useDerivedColumnState(currentScheme, allColDefs) {
97
98
  return useMemo(function () {
98
99
  if (!(currentScheme !== null && currentScheme !== void 0 && currentScheme.columnConfig)) {
99
100
  return null;
@@ -102,15 +103,15 @@ export function useDerivedColumnState(currentScheme) {
102
103
  var _require2 = require("../setting/columnGroupUtils"),
103
104
  flatConfigToColumnState = _require2.flatConfigToColumnState;
104
105
 
105
- // 转换列状态
106
- var result = flatConfigToColumnState(currentScheme.columnConfig);
106
+ // 转换列状态,传入原始列定义以检测新增列
107
+ var result = flatConfigToColumnState(currentScheme.columnConfig, allColDefs);
107
108
  return result;
108
109
  } catch (error) {
109
110
  console.error('[useDerivedColumnState] 转换失败:', error);
110
111
  return null;
111
112
  }
112
113
  }, [// 使用 scheme.id 作为依赖
113
- currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id]);
114
+ currentScheme === null || currentScheme === void 0 ? void 0 : currentScheme.id, allColDefs]);
114
115
  }
115
116
 
116
117
  /**
@@ -144,7 +145,7 @@ export function useSchemeDataFlow(gridKey, allColDefs, schemeData) {
144
145
 
145
146
  // 2. 派生层(Derived State)
146
147
  var derivedColumnDefs = useDerivedGridState(schemeSource.currentColumnScheme, allColDefs);
147
- var derivedColumnState = useDerivedColumnState(schemeSource.currentColumnScheme);
148
+ var derivedColumnState = useDerivedColumnState(schemeSource.currentColumnScheme, allColDefs);
148
149
  return _objectSpread(_objectSpread({}, schemeSource), {}, {
149
150
  // 派生状态(只读)
150
151
  derivedColumnDefs: derivedColumnDefs,
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { QueryRuleGroup } from '../shared/storage/schemeStorageAdapter';
3
+ import { ExtendedColDef } from '../types';
4
+ interface AdvancedQueryBuilderProps {
5
+ rootGroup: QueryRuleGroup;
6
+ onChange: (group: QueryRuleGroup) => void;
7
+ colDefs: ExtendedColDef[];
8
+ }
9
+ declare const AdvancedQueryBuilder: React.FC<AdvancedQueryBuilderProps>;
10
+ export default AdvancedQueryBuilder;