@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.
- package/dist/cjs/ag-grid-plus/ag-gridPlus.js +128 -8
- package/dist/cjs/ag-grid-plus/queryForm/AdvancedQueryBuilder.d.ts +10 -0
- package/dist/cjs/ag-grid-plus/queryForm/AdvancedQueryBuilder.js +547 -0
- package/dist/cjs/ag-grid-plus/queryForm/index.js +3 -6
- package/dist/cjs/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +36 -0
- package/dist/cjs/ag-grid-plus/utils.d.ts +5 -0
- package/dist/cjs/ag-grid-plus/utils.js +101 -2
- package/dist/esm/ag-grid-plus/ag-gridPlus.js +131 -11
- package/dist/esm/ag-grid-plus/queryForm/AdvancedQueryBuilder.d.ts +10 -0
- package/dist/esm/ag-grid-plus/queryForm/AdvancedQueryBuilder.js +541 -0
- package/dist/esm/ag-grid-plus/queryForm/index.js +3 -6
- package/dist/esm/ag-grid-plus/shared/storage/schemeStorageAdapter.d.ts +36 -0
- package/dist/esm/ag-grid-plus/utils.d.ts +5 -0
- package/dist/esm/ag-grid-plus/utils.js +101 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +3 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
1186
|
-
|
|
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
|
-
|
|
1192
|
-
|
|
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;
|