@nokecy/qc-ui 1.1.22 → 1.1.24

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.
@@ -4,9 +4,10 @@ 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
+ var _gridifyClient = require("gridify-client");
10
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
13
  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; }
@@ -19,8 +20,106 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
19
20
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
20
21
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
21
22
  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; }
23
+ // Gridify 值转义函数
22
24
  var esc = function esc(v) {
23
- return v.replace(/([(),|,\\]|\/i)/g, '\\$1');
25
+ return String(v).replace(/([(),|,\\]|\/i)/g, '\\$1');
26
+ };
27
+
28
+ /**
29
+ * 将高级查询规则转换为后端 Gridify Filter 字符串
30
+ * 使用 gridify-client 库确保安全性和兼容性
31
+ */
32
+ var convertRulesToFilterString = exports.convertRulesToFilterString = function convertRulesToFilterString(ruleGroup, colDefs) {
33
+ if (!ruleGroup || !ruleGroup.children || ruleGroup.children.length === 0) {
34
+ return "";
35
+ }
36
+ var mapOperator = function mapOperator(op) {
37
+ switch (op) {
38
+ case '=':
39
+ return _gridifyClient.ConditionalOperator.Equal;
40
+ case '!=':
41
+ return _gridifyClient.ConditionalOperator.NotEqual;
42
+ case '>':
43
+ return _gridifyClient.ConditionalOperator.GreaterThan;
44
+ case '>=':
45
+ return _gridifyClient.ConditionalOperator.GreaterThanOrEqual;
46
+ case '<':
47
+ return _gridifyClient.ConditionalOperator.LessThan;
48
+ case '<=':
49
+ return _gridifyClient.ConditionalOperator.LessThanOrEqual;
50
+ case 'contains':
51
+ return _gridifyClient.ConditionalOperator.Contains;
52
+ case 'startsWith':
53
+ return _gridifyClient.ConditionalOperator.StartsWith;
54
+ case 'endsWith':
55
+ return _gridifyClient.ConditionalOperator.EndsWith;
56
+ default:
57
+ return _gridifyClient.ConditionalOperator.Equal;
58
+ }
59
+ };
60
+ var processItem = function processItem(builder, item, isFirst) {
61
+ if (item.logic) {
62
+ // 嵌套组
63
+ builder.startGroup();
64
+ processGroup(builder, item);
65
+ builder.endGroup();
66
+ } else {
67
+ // 单条规则
68
+ if (item.value === undefined || item.value === null || item.value === '') {
69
+ return;
70
+ }
71
+
72
+ // 处理特殊操作符
73
+ if (item.operator === 'isEmpty') {
74
+ builder.addCondition(item.field, _gridifyClient.ConditionalOperator.Equal, '');
75
+ } else if (item.operator === 'isNotEmpty') {
76
+ builder.addCondition(item.field, _gridifyClient.ConditionalOperator.NotEqual, '');
77
+ } else if (item.operator === 'between' && Array.isArray(item.value)) {
78
+ // between 操作符需要拆成两个条件
79
+ if (item.value[0] !== null && item.value[0] !== undefined) {
80
+ builder.addCondition(item.field, _gridifyClient.ConditionalOperator.GreaterThanOrEqual, item.value[0], undefined, true);
81
+ }
82
+ if (item.value[1] !== null && item.value[1] !== undefined) {
83
+ if (item.value[0] !== null && item.value[0] !== undefined) {
84
+ builder.and();
85
+ }
86
+ builder.addCondition(item.field, _gridifyClient.ConditionalOperator.LessThanOrEqual, item.value[1], undefined, true);
87
+ }
88
+ } else {
89
+ var gridifyOp = mapOperator(item.operator);
90
+ // escapeValue = true 确保特殊字符(如 / , | ( ) \)被正确转义
91
+ builder.addCondition(item.field, gridifyOp, item.value, undefined, true);
92
+ }
93
+ }
94
+ };
95
+ var processGroup = function processGroup(builder, group) {
96
+ var validChildren = group.children.filter(function (child) {
97
+ if (child.logic) return true;
98
+ return child.value !== undefined && child.value !== null && child.value !== '';
99
+ });
100
+ validChildren.forEach(function (child, index) {
101
+ if (index > 0) {
102
+ // 根据组逻辑添加连接符
103
+ if (group.logic === 'OR') {
104
+ builder.or(true); // true = optional, 避免无效表达式
105
+ } else {
106
+ builder.and(true);
107
+ }
108
+ }
109
+ processItem(builder, child, index === 0);
110
+ });
111
+ };
112
+ try {
113
+ var builder = new _gridifyClient.GridifyQueryBuilder({
114
+ allowEmptyGroups: true
115
+ });
116
+ processGroup(builder, ruleGroup);
117
+ var query = builder.build();
118
+ return query.filter || "";
119
+ } catch (e) {
120
+ console.error('Failed to build Gridify filter:', e);
121
+ return "";
122
+ }
24
123
  };
25
124
  var getFilter = function getFilter(objectKey, value, colDef) {
26
125
  if (typeof value === 'string') {
@@ -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, {
@@ -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;