@nokecy/qc-ui 1.1.39 → 1.1.40
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/adapters/abpPagedApiAdapter.d.ts +8 -0
- package/dist/cjs/adapters/abpPagedApiAdapter.js +35 -0
- package/dist/cjs/adapters/index.d.ts +6 -0
- package/dist/cjs/adapters/index.js +12 -0
- package/dist/cjs/adapters/pagedApiAdapter.d.ts +25 -0
- package/dist/cjs/adapters/pagedApiAdapter.js +5 -0
- package/dist/cjs/ag-grid-plus/ag-gridPlus.js +51 -205
- package/dist/cjs/ag-grid-plus/context/gridContext.d.ts +3 -0
- package/dist/cjs/ag-grid-plus/context/queryFormContext.d.ts +20 -0
- package/dist/cjs/ag-grid-plus/context/queryFormContext.js +25 -0
- package/dist/cjs/ag-grid-plus/errors/ErrorBoundary.d.ts +1 -1
- package/dist/cjs/ag-grid-plus/hooks/index.d.ts +1 -3
- package/dist/cjs/ag-grid-plus/hooks/index.js +7 -39
- package/dist/cjs/ag-grid-plus/hooks/useRowId.d.ts +13 -0
- package/dist/cjs/ag-grid-plus/hooks/useRowId.js +57 -0
- package/dist/cjs/ag-grid-plus/interface.d.ts +9 -0
- package/dist/cjs/ag-grid-plus/setting/QuerySchemeManager.js +6 -6
- package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +2 -3
- package/dist/cjs/ag-grid-plus/types.d.ts +9 -0
- package/dist/cjs/ag-grid-plus/utils/aggregation.d.ts +17 -0
- package/dist/cjs/ag-grid-plus/utils/aggregation.js +101 -0
- package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +2 -2
- package/dist/cjs/ag-grid-plus/utils/entityExtensionColumns.d.ts +12 -3
- package/dist/cjs/ag-grid-plus/utils/entityExtensionColumns.js +20 -5
- package/dist/cjs/ag-grid-plus/utils/queryFormDerivation.d.ts +19 -0
- package/dist/cjs/ag-grid-plus/utils/queryFormDerivation.js +49 -0
- package/dist/cjs/ag-grid-plus/utils/requestParams.d.ts +15 -0
- package/dist/cjs/ag-grid-plus/utils/requestParams.js +31 -0
- package/dist/cjs/ag-grid-plus/utils/rowSelection.d.ts +9 -0
- package/dist/cjs/ag-grid-plus/utils/rowSelection.js +24 -0
- package/dist/cjs/ag-grid-plus/utils.js +2 -2
- package/dist/cjs/array-table/arrayBase.js +2 -0
- package/dist/cjs/array-table/utils.js +22 -4
- package/dist/cjs/components/RegexEditor/hooks/useRegexValidation.js +2 -3
- package/dist/cjs/components/RegexEditor/hooks/useTemplateManager.js +1 -0
- package/dist/cjs/components/RegexEditor/validation/types.d.ts +1 -3
- package/dist/cjs/components/RegexEditor/visualizer/astToRailroad.d.ts +0 -2
- package/dist/cjs/dashboard/dashboard/index.js +8 -11
- package/dist/cjs/dashboard/dashboard/utils.js +3 -6
- package/dist/cjs/dashboard/widget/index.js +3 -3
- package/dist/cjs/dashboard/widget/selector/index.js +5 -7
- package/dist/cjs/dashboard/widget/utils.js +3 -4
- package/dist/cjs/dialogSelect/index.d.ts +3 -0
- package/dist/cjs/dialogSelect/index.js +16 -13
- package/dist/cjs/generatedListPage/GeneratedListPage.js +20 -19
- package/dist/cjs/generatedListPage/_utils/toAbpPagedRequest.d.ts +15 -0
- package/dist/cjs/generatedListPage/_utils/toAbpPagedRequest.js +26 -0
- package/dist/cjs/generatedListPage/types.d.ts +3 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/standardFormDialog/types.d.ts +7 -0
- package/dist/cjs/standardFormDialog/useStandardFormSchema.d.ts +1 -1
- package/dist/cjs/standardFormDialog/withStandardForm.js +5 -4
- package/dist/esm/adapters/abpPagedApiAdapter.d.ts +8 -0
- package/dist/esm/adapters/abpPagedApiAdapter.js +29 -0
- package/dist/esm/adapters/index.d.ts +6 -0
- package/dist/esm/adapters/index.js +6 -0
- package/dist/esm/adapters/pagedApiAdapter.d.ts +25 -0
- package/dist/esm/adapters/pagedApiAdapter.js +1 -0
- package/dist/esm/ag-grid-plus/ag-gridPlus.js +49 -203
- package/dist/esm/ag-grid-plus/context/gridContext.d.ts +3 -0
- package/dist/esm/ag-grid-plus/context/queryFormContext.d.ts +20 -0
- package/dist/esm/ag-grid-plus/context/queryFormContext.js +19 -0
- package/dist/esm/ag-grid-plus/hooks/index.d.ts +1 -3
- package/dist/esm/ag-grid-plus/hooks/index.js +2 -6
- package/dist/esm/ag-grid-plus/hooks/useRowId.d.ts +13 -0
- package/dist/esm/ag-grid-plus/hooks/useRowId.js +52 -0
- package/dist/esm/ag-grid-plus/interface.d.ts +9 -0
- package/dist/esm/ag-grid-plus/setting/QuerySchemeManager.js +6 -6
- package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +7 -6
- package/dist/esm/ag-grid-plus/types.d.ts +9 -0
- package/dist/esm/ag-grid-plus/utils/aggregation.d.ts +17 -0
- package/dist/esm/ag-grid-plus/utils/aggregation.js +93 -0
- package/dist/esm/ag-grid-plus/utils/columnProcessors.js +2 -2
- package/dist/esm/ag-grid-plus/utils/entityExtensionColumns.d.ts +12 -3
- package/dist/esm/ag-grid-plus/utils/entityExtensionColumns.js +20 -5
- package/dist/esm/ag-grid-plus/utils/queryFormDerivation.d.ts +19 -0
- package/dist/esm/ag-grid-plus/utils/queryFormDerivation.js +42 -0
- package/dist/esm/ag-grid-plus/utils/requestParams.d.ts +15 -0
- package/dist/esm/ag-grid-plus/utils/requestParams.js +24 -0
- package/dist/esm/ag-grid-plus/utils/rowSelection.d.ts +9 -0
- package/dist/esm/ag-grid-plus/utils/rowSelection.js +18 -0
- package/dist/esm/ag-grid-plus/utils.js +2 -2
- package/dist/esm/array-table/arrayBase.js +2 -0
- package/dist/esm/array-table/utils.js +22 -4
- package/dist/esm/components/RegexEditor/hooks/useRegexValidation.js +2 -2
- package/dist/esm/components/RegexEditor/hooks/useTemplateManager.js +1 -0
- package/dist/esm/components/RegexEditor/validation/types.d.ts +0 -1
- package/dist/esm/components/RegexEditor/visualizer/astToRailroad.d.ts +0 -1
- package/dist/esm/dashboard/dashboard/index.js +8 -11
- package/dist/esm/dashboard/dashboard/utils.js +3 -2
- package/dist/esm/dashboard/widget/index.js +3 -3
- package/dist/esm/dashboard/widget/selector/index.js +5 -7
- package/dist/esm/dashboard/widget/utils.js +3 -3
- package/dist/esm/dialogSelect/index.d.ts +3 -0
- package/dist/esm/dialogSelect/index.js +16 -13
- package/dist/esm/generatedListPage/GeneratedListPage.js +20 -19
- package/dist/esm/generatedListPage/_utils/toAbpPagedRequest.d.ts +15 -0
- package/dist/esm/generatedListPage/_utils/toAbpPagedRequest.js +20 -0
- package/dist/esm/generatedListPage/types.d.ts +3 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/standardFormDialog/types.d.ts +7 -0
- package/dist/esm/standardFormDialog/withStandardForm.js +5 -4
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +52 -13
- package/dist/cjs/ag-grid-plus/hooks/useAgGridCalculation.d.ts +0 -88
- package/dist/cjs/ag-grid-plus/hooks/useAgGridCalculation.js +0 -224
- package/dist/cjs/ag-grid-plus/hooks/useAgGridData.d.ts +0 -91
- package/dist/cjs/ag-grid-plus/hooks/useAgGridData.js +0 -230
- package/dist/cjs/ag-grid-plus/hooks/useGridState.d.ts +0 -153
- package/dist/cjs/ag-grid-plus/hooks/useGridState.js +0 -258
- package/dist/esm/ag-grid-plus/hooks/useAgGridCalculation.d.ts +0 -88
- package/dist/esm/ag-grid-plus/hooks/useAgGridCalculation.js +0 -217
- package/dist/esm/ag-grid-plus/hooks/useAgGridData.d.ts +0 -91
- package/dist/esm/ag-grid-plus/hooks/useAgGridData.js +0 -225
- package/dist/esm/ag-grid-plus/hooks/useGridState.d.ts +0 -153
- package/dist/esm/ag-grid-plus/hooks/useGridState.js +0 -258
|
@@ -72,7 +72,9 @@ var withStandardForm = exports.withStandardForm = function withStandardForm(conf
|
|
|
72
72
|
_config$customHandler = config.customHandlers,
|
|
73
73
|
customHandlers = _config$customHandler === void 0 ? {} : _config$customHandler,
|
|
74
74
|
_config$customCompone = config.customComponents,
|
|
75
|
-
customComponents = _config$customCompone === void 0 ? {} : _config$customCompone
|
|
75
|
+
customComponents = _config$customCompone === void 0 ? {} : _config$customCompone,
|
|
76
|
+
_config$auditFields = config.auditFields,
|
|
77
|
+
auditFields = _config$auditFields === void 0 ? true : _config$auditFields;
|
|
76
78
|
|
|
77
79
|
// 验证配置
|
|
78
80
|
if (!externalSchema && !businessFields) {
|
|
@@ -97,8 +99,7 @@ var withStandardForm = exports.withStandardForm = function withStandardForm(conf
|
|
|
97
99
|
'x-component': 'Input',
|
|
98
100
|
'x-display': 'hidden'
|
|
99
101
|
}
|
|
100
|
-
}, businessFields),
|
|
101
|
-
// 审计字段(如果需要)
|
|
102
|
+
}, businessFields), auditFields !== false ? {
|
|
102
103
|
creationTime: {
|
|
103
104
|
type: 'string',
|
|
104
105
|
title: '创建时间',
|
|
@@ -121,7 +122,7 @@ var withStandardForm = exports.withStandardForm = function withStandardForm(conf
|
|
|
121
122
|
},
|
|
122
123
|
'x-display': 'hidden'
|
|
123
124
|
}
|
|
124
|
-
})
|
|
125
|
+
} : {})
|
|
125
126
|
};
|
|
126
127
|
|
|
127
128
|
// 表单布局配置(向后兼容)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PagedApiAdapter } from './pagedApiAdapter';
|
|
2
|
+
/**
|
|
3
|
+
* ABP 默认分页适配器。
|
|
4
|
+
* 请求映射为 { Filter, Sorting, SkipCount, MaxResultCount }(有 maxResultCount 时才带分页字段);
|
|
5
|
+
* 响应读取 { items, totalCount }。字节级复刻库内现有 ABP 行为。
|
|
6
|
+
* @author nokecy
|
|
7
|
+
*/
|
|
8
|
+
export declare const abpPagedApiAdapter: PagedApiAdapter;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ABP 默认分页适配器。
|
|
3
|
+
* 请求映射为 { Filter, Sorting, SkipCount, MaxResultCount }(有 maxResultCount 时才带分页字段);
|
|
4
|
+
* 响应读取 { items, totalCount }。字节级复刻库内现有 ABP 行为。
|
|
5
|
+
* @author nokecy
|
|
6
|
+
*/
|
|
7
|
+
export var abpPagedApiAdapter = {
|
|
8
|
+
toRequest: function toRequest(_ref) {
|
|
9
|
+
var skipCount = _ref.skipCount,
|
|
10
|
+
maxResultCount = _ref.maxResultCount,
|
|
11
|
+
filter = _ref.filter,
|
|
12
|
+
sorter = _ref.sorter;
|
|
13
|
+
var request = {
|
|
14
|
+
Filter: filter,
|
|
15
|
+
Sorting: sorter
|
|
16
|
+
};
|
|
17
|
+
if (maxResultCount != null) {
|
|
18
|
+
request.SkipCount = skipCount !== null && skipCount !== void 0 ? skipCount : 0;
|
|
19
|
+
request.MaxResultCount = maxResultCount;
|
|
20
|
+
}
|
|
21
|
+
return request;
|
|
22
|
+
},
|
|
23
|
+
getItems: function getItems(response) {
|
|
24
|
+
return (response === null || response === void 0 ? void 0 : response.items) || [];
|
|
25
|
+
},
|
|
26
|
+
getTotal: function getTotal(response) {
|
|
27
|
+
return (response === null || response === void 0 ? void 0 : response.totalCount) || 0;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 分页 API 适配器接口:把库内部的通用分页查询/响应,在"通用形状"与"具体后端形状"
|
|
3
|
+
* 之间转换。默认实现 abpPagedApiAdapter 保持现有 ABP 行为;非 ABP 后端可注入自定义实现。
|
|
4
|
+
* @author nokecy
|
|
5
|
+
*/
|
|
6
|
+
/** 通用分页查询参数(后端无关)。 */
|
|
7
|
+
export interface GenericPagedQuery {
|
|
8
|
+
/** 跳过条数(偏移量)。 */
|
|
9
|
+
skipCount?: number;
|
|
10
|
+
/** 取回条数(页大小)。 */
|
|
11
|
+
maxResultCount?: number;
|
|
12
|
+
/** 过滤表达式(已序列化为字符串)。 */
|
|
13
|
+
filter?: string;
|
|
14
|
+
/** 排序表达式,如 "name asc"。 */
|
|
15
|
+
sorter?: string;
|
|
16
|
+
}
|
|
17
|
+
/** 分页 API 适配器。 */
|
|
18
|
+
export interface PagedApiAdapter {
|
|
19
|
+
/** 通用查询 → 后端请求对象(透传给业务方的 list/request 函数)。 */
|
|
20
|
+
toRequest(query: GenericPagedQuery): Record<string, any>;
|
|
21
|
+
/** 后端响应 → 数据项数组。 */
|
|
22
|
+
getItems<T = any>(response: any): T[];
|
|
23
|
+
/** 后端响应 → 总条数。 */
|
|
24
|
+
getTotal(response: any): number;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import _sumBy from "lodash/sumBy";
|
|
2
|
-
import _isEqual from "lodash/isEqual";
|
|
3
|
-
import _uniqueId from "lodash/uniqueId";
|
|
4
|
-
import _isArray from "lodash/isArray";
|
|
5
1
|
var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType"];
|
|
6
2
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
3
|
+
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); }
|
|
7
4
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
8
5
|
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."); }
|
|
9
6
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
@@ -19,7 +16,6 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
19
16
|
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; }
|
|
20
17
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
21
18
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
22
|
-
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); }
|
|
23
19
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
24
20
|
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; }
|
|
25
21
|
import { ModuleRegistry } from 'ag-grid-community';
|
|
@@ -38,21 +34,28 @@ import FormRender from "./queryForm";
|
|
|
38
34
|
import ToolBar from "./toolBar";
|
|
39
35
|
import SettingItem from "./settingItem";
|
|
40
36
|
import { RedoOutlined, FilterOutlined } from '@ant-design/icons';
|
|
41
|
-
import { convertFilterModel,
|
|
37
|
+
import { convertFilterModel, dateTimeValueFormatter, dateValueFormatter, flatten, toTree } from "./utils";
|
|
42
38
|
import AdvancedQueryBuilder from "./queryForm/AdvancedQueryBuilder";
|
|
43
39
|
import { v4 as uuidv4 } from 'uuid';
|
|
44
40
|
import Setting from "./setting";
|
|
45
41
|
import { useGridPlusColumnState } from '.';
|
|
42
|
+
import { useRowId } from "./hooks/useRowId";
|
|
43
|
+
import _, { isArray } from 'lodash';
|
|
46
44
|
import CustomGroupCellRenderer from "./_utils/customGroupCellRenderer";
|
|
47
45
|
import processColumnGroups from "./_utils/processColumnGroups";
|
|
48
46
|
import flattenColumnState from "./_utils/processFormColumnState";
|
|
49
47
|
import { Select } from '@formily/antd-v5';
|
|
50
48
|
import { localeText } from "./locale";
|
|
51
49
|
import { GridPlusContext } from "./context/gridContext";
|
|
50
|
+
import { QueryFormContext } from "./context/queryFormContext";
|
|
52
51
|
import { useGridSchemes } from "./context/useSchemeManager";
|
|
53
52
|
import { useSchemeDataFlow } from "./context/useSchemeDataFlow";
|
|
54
53
|
import { extractItemsOrder, extractHiddenFields } from "./shared/utils/schemeDataMigration";
|
|
55
54
|
import { createSafeHtmlTemplate } from "./utils/sanitize";
|
|
55
|
+
import { computeAggregationRow } from "./utils/aggregation";
|
|
56
|
+
import { sortFormItemsByOrder, filterHiddenFormItems } from "./utils/queryFormDerivation";
|
|
57
|
+
import { filterVisibleSelectedRows } from "./utils/rowSelection";
|
|
58
|
+
import { buildFilterString, pageToSkipCount } from "./utils/requestParams";
|
|
56
59
|
import { GridPlusError, ErrorType, ErrorSeverity } from "./errors";
|
|
57
60
|
import { logger } from "./utils/logger";
|
|
58
61
|
import { getEntityExtensionColumns } from "./utils/entityExtensionColumns";
|
|
@@ -66,7 +69,7 @@ var getSort = function getSort(columnState) {
|
|
|
66
69
|
// 避免每次渲染序列化大对象,且 isEqual 差异早退、对 Date/undefined 比较语义正确 @author nokecy
|
|
67
70
|
function useDeepCompareStable(value) {
|
|
68
71
|
var ref = useRef(value);
|
|
69
|
-
if (!
|
|
72
|
+
if (!_.isEqual(ref.current, value)) {
|
|
70
73
|
ref.current = value;
|
|
71
74
|
}
|
|
72
75
|
return ref.current;
|
|
@@ -122,66 +125,8 @@ function AgGridPlus(props) {
|
|
|
122
125
|
var initialColumnDefsRef = useRef([]);
|
|
123
126
|
|
|
124
127
|
// 【新增】用于缓存每个数据对象的唯一 ID(降级方案)
|
|
125
|
-
var
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* 【新增】智能生成唯一行 ID 的降级函数
|
|
130
|
-
*
|
|
131
|
-
* 策略(按优先级):
|
|
132
|
-
* 1. 尝试常见 ID 字段:id, _id, key, uid, uuid
|
|
133
|
-
* - 支持基本类型:string, number
|
|
134
|
-
* - 支持对象类型:提取 value, id 属性
|
|
135
|
-
* 2. 如果对象在 WeakMap 中已有缓存,直接返回
|
|
136
|
-
* 3. 生成新的唯一 ID:grid-key-{counter}-{timestamp}
|
|
137
|
-
*
|
|
138
|
-
* @param data 行数据对象
|
|
139
|
-
* @returns 唯一的行 ID 字符串
|
|
140
|
-
*/
|
|
141
|
-
var generateUniqueRowId = useCallback(function (data) {
|
|
142
|
-
if (!data || _typeof(data) !== 'object') {
|
|
143
|
-
return "row-empty-".concat(rowIdCounterRef.current++);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// 1. 尝试常见 ID 字段
|
|
147
|
-
var commonIdFields = ['id', '_id', 'key', 'uid', 'uuid'];
|
|
148
|
-
for (var _i = 0, _commonIdFields = commonIdFields; _i < _commonIdFields.length; _i++) {
|
|
149
|
-
var field = _commonIdFields[_i];
|
|
150
|
-
var value = data[field];
|
|
151
|
-
if (value !== undefined && value !== null && value !== '') {
|
|
152
|
-
// 【修复】处理对象类型的 ID
|
|
153
|
-
var fieldId = void 0;
|
|
154
|
-
if (_typeof(value) === 'object' && value !== null) {
|
|
155
|
-
// 对象类型:尝试提取常见的 ID 属性
|
|
156
|
-
if (value.value !== undefined) {
|
|
157
|
-
fieldId = String(value.value);
|
|
158
|
-
} else if (value.id !== undefined) {
|
|
159
|
-
fieldId = String(value.id);
|
|
160
|
-
} else {
|
|
161
|
-
// 无法提取,使用 JSON 序列化 + 字段名
|
|
162
|
-
fieldId = "".concat(field, "-").concat(JSON.stringify(value));
|
|
163
|
-
}
|
|
164
|
-
} else {
|
|
165
|
-
// 基本类型:直接转换
|
|
166
|
-
fieldId = String(value);
|
|
167
|
-
}
|
|
168
|
-
return fieldId;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// 2. 检查 WeakMap 缓存
|
|
173
|
-
var cachedId = rowIdCacheRef.current.get(data);
|
|
174
|
-
if (cachedId) {
|
|
175
|
-
return cachedId;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// 3. 生成新的唯一 ID
|
|
179
|
-
var uniqueId = "".concat(gridKey || 'grid', "-row-").concat(rowIdCounterRef.current++, "-").concat(Date.now());
|
|
180
|
-
|
|
181
|
-
// 缓存到 WeakMap(对象被回收时自动清理)
|
|
182
|
-
rowIdCacheRef.current.set(data, uniqueId);
|
|
183
|
-
return uniqueId;
|
|
184
|
-
}, [gridKey]);
|
|
128
|
+
var _useRowId = useRowId(gridKey),
|
|
129
|
+
generateUniqueRowId = _useRowId.generateUniqueRowId;
|
|
185
130
|
var _useState = useState(false),
|
|
186
131
|
_useState2 = _slicedToArray(_useState, 2),
|
|
187
132
|
ready = _useState2[0],
|
|
@@ -742,24 +687,13 @@ function AgGridPlus(props) {
|
|
|
742
687
|
pagination: pagination
|
|
743
688
|
});
|
|
744
689
|
try {
|
|
745
|
-
// 处理高级查询模式
|
|
746
|
-
var filter;
|
|
747
|
-
if (queryFilter.__advancedMode__ && queryFilter.__rules__) {
|
|
748
|
-
// 高级模式:使用规则转换
|
|
749
|
-
filter = convertRulesToFilterString(queryFilter.__rules__, allColDefsRef.current);
|
|
750
|
-
logger.debug('高级模式 Filter', {
|
|
751
|
-
rules: queryFilter.__rules__,
|
|
752
|
-
filter: filter
|
|
753
|
-
});
|
|
754
|
-
} else {
|
|
755
|
-
// 简单模式:使用原有的转换逻辑
|
|
756
|
-
filter = convertFilterModel(queryFilter, allColDefsRef.current);
|
|
757
|
-
}
|
|
690
|
+
// 处理高级查询模式 / 简单模式的过滤字符串构建
|
|
691
|
+
var filter = buildFilterString(queryFilter, allColDefsRef.current);
|
|
758
692
|
var params = _objectSpread(_objectSpread({
|
|
759
693
|
filter: filter
|
|
760
694
|
}, stableGridParams), {}, {
|
|
761
695
|
current: pagination.current,
|
|
762
|
-
skipCount:
|
|
696
|
+
skipCount: pageToSkipCount(pagination.current, pagination.pageSize),
|
|
763
697
|
maxResultCount: pagination.pageSize,
|
|
764
698
|
sorter: getSort(stableSortColumn)
|
|
765
699
|
});
|
|
@@ -926,7 +860,7 @@ function AgGridPlus(props) {
|
|
|
926
860
|
}, [ready, formInitialized, stableQueryFilter, stableGridParams, pagination.current, pagination.pageSize, stableSortColumn]);
|
|
927
861
|
var handelgridPlusColumnState = function handelgridPlusColumnState(columnState) {
|
|
928
862
|
var cellMap = {};
|
|
929
|
-
if (
|
|
863
|
+
if (isArray(columnState)) {
|
|
930
864
|
columnState.forEach(function (item) {
|
|
931
865
|
if (item.field && (item.cellClass || item.suppressHeaderFilterButton !== undefined || item.groupName)) {
|
|
932
866
|
// 使用对象存储多个字段的值
|
|
@@ -995,21 +929,12 @@ function AgGridPlus(props) {
|
|
|
995
929
|
};
|
|
996
930
|
|
|
997
931
|
// 只保留既被选中又在当前显示的行
|
|
998
|
-
var visibleSelectedRows = allSelectedRows
|
|
999
|
-
return
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
context: null
|
|
1005
|
-
});
|
|
1006
|
-
var displayedRowId = getRowIdMethod({
|
|
1007
|
-
data: displayedRow,
|
|
1008
|
-
level: 0,
|
|
1009
|
-
api: apiRef.current,
|
|
1010
|
-
context: null
|
|
1011
|
-
});
|
|
1012
|
-
return selectedRowId && displayedRowId && selectedRowId === displayedRowId;
|
|
932
|
+
var visibleSelectedRows = filterVisibleSelectedRows(allSelectedRows, displayedRows, function (row) {
|
|
933
|
+
return getRowIdMethod({
|
|
934
|
+
data: row,
|
|
935
|
+
level: 0,
|
|
936
|
+
api: apiRef.current,
|
|
937
|
+
context: null
|
|
1013
938
|
});
|
|
1014
939
|
});
|
|
1015
940
|
onSelectedRowsChangeRef.current(visibleSelectedRows);
|
|
@@ -1024,82 +949,6 @@ function AgGridPlus(props) {
|
|
|
1024
949
|
setColumnCellClass(handelgridPlusColumnState(columnState));
|
|
1025
950
|
}
|
|
1026
951
|
};
|
|
1027
|
-
var isValidNumber = function isValidNumber(value) {
|
|
1028
|
-
return typeof value === 'number' && !isNaN(value);
|
|
1029
|
-
};
|
|
1030
|
-
var sumFun = function sumFun(field, displayedData) {
|
|
1031
|
-
return _sumBy(displayedData, function (cur) {
|
|
1032
|
-
if (cur && isValidNumber(cur[field])) {
|
|
1033
|
-
return cur[field];
|
|
1034
|
-
}
|
|
1035
|
-
return 0;
|
|
1036
|
-
});
|
|
1037
|
-
};
|
|
1038
|
-
var avgFun = function avgFun(field, displayedData) {
|
|
1039
|
-
// 修正:分子分母口径统一为「有效数字」,避免 count 误用数组(恒真)及除零得 NaN @author nokecy
|
|
1040
|
-
var validValues = displayedData.filter(function (cur) {
|
|
1041
|
-
return cur && isValidNumber(cur[field]);
|
|
1042
|
-
});
|
|
1043
|
-
if (validValues.length === 0) return 0;
|
|
1044
|
-
var sum = _sumBy(validValues, function (cur) {
|
|
1045
|
-
return cur[field];
|
|
1046
|
-
});
|
|
1047
|
-
return sum / validValues.length;
|
|
1048
|
-
};
|
|
1049
|
-
var standardDeviationFun = function standardDeviationFun(field, displayedData) {
|
|
1050
|
-
var validValues = displayedData.filter(function (cur) {
|
|
1051
|
-
return isValidNumber(cur[field]);
|
|
1052
|
-
});
|
|
1053
|
-
var count = validValues.length;
|
|
1054
|
-
if (count === 0) return 0;
|
|
1055
|
-
var mean = sumFun(field, displayedData) / count;
|
|
1056
|
-
var variance = _sumBy(displayedData, function (cur) {
|
|
1057
|
-
if (cur && cur[field] !== undefined && cur[field] !== null) {
|
|
1058
|
-
var diff = cur[field] - mean;
|
|
1059
|
-
return diff * diff;
|
|
1060
|
-
}
|
|
1061
|
-
return 0;
|
|
1062
|
-
}) / count;
|
|
1063
|
-
return Math.sqrt(variance);
|
|
1064
|
-
};
|
|
1065
|
-
var handelNumber = function handelNumber(value) {
|
|
1066
|
-
return (value / 1).toLocaleString(undefined, {
|
|
1067
|
-
minimumFractionDigits: 2,
|
|
1068
|
-
maximumFractionDigits: 2
|
|
1069
|
-
});
|
|
1070
|
-
};
|
|
1071
|
-
// sum 求和 avg 平均值 standardDeviation 标准差
|
|
1072
|
-
var calculatefun = function calculatefun(calcColFields, displayedData) {
|
|
1073
|
-
var calculateArrCopy = [];
|
|
1074
|
-
var calculateData = {
|
|
1075
|
-
id: _uniqueId()
|
|
1076
|
-
};
|
|
1077
|
-
calcColFields.forEach(function (i) {
|
|
1078
|
-
if (!i.cellRenderer) {
|
|
1079
|
-
switch (i.calculateType) {
|
|
1080
|
-
case "sum":
|
|
1081
|
-
var sumPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
|
|
1082
|
-
var sumValue = Number(sumFun(i.field, displayedData).toFixed(sumPrecision));
|
|
1083
|
-
calculateData[i.field] = i.formatWithCommas ? handelNumber(sumValue) : sumValue;
|
|
1084
|
-
break;
|
|
1085
|
-
case "avg":
|
|
1086
|
-
var avgPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
|
|
1087
|
-
calculateData[i.field] = Number(avgFun(i.field, displayedData).toFixed(avgPrecision));
|
|
1088
|
-
break;
|
|
1089
|
-
case "standardDeviation":
|
|
1090
|
-
var stdPrecision = typeof i.transactionAmount === 'number' ? i.transactionAmount : 2;
|
|
1091
|
-
calculateData[i.field] = Number(standardDeviationFun(i.field, displayedData).toFixed(stdPrecision));
|
|
1092
|
-
break;
|
|
1093
|
-
default:
|
|
1094
|
-
break;
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
});
|
|
1098
|
-
if (Object.keys(calculateData).length > 0) {
|
|
1099
|
-
calculateArrCopy.push(calculateData);
|
|
1100
|
-
}
|
|
1101
|
-
return calculateArrCopy;
|
|
1102
|
-
};
|
|
1103
952
|
var calculateSum = useCallback(function () {
|
|
1104
953
|
var displayedData = [];
|
|
1105
954
|
if (apiRef.current) {
|
|
@@ -1124,10 +973,10 @@ function AgGridPlus(props) {
|
|
|
1124
973
|
});
|
|
1125
974
|
if (calcColFields.length > 0) {
|
|
1126
975
|
var _apiRef$current5;
|
|
1127
|
-
var calculatedValues =
|
|
976
|
+
var calculatedValues = computeAggregationRow(calcColFields, displayedData);
|
|
1128
977
|
(_apiRef$current5 = apiRef.current) === null || _apiRef$current5 === void 0 || _apiRef$current5.setGridOption('pinnedBottomRowData', calculatedValues);
|
|
1129
978
|
}
|
|
1130
|
-
}, [allColDefs
|
|
979
|
+
}, [allColDefs]);
|
|
1131
980
|
var onFilterChanged = function onFilterChanged(event) {
|
|
1132
981
|
calculateSum();
|
|
1133
982
|
};
|
|
@@ -1209,36 +1058,22 @@ function AgGridPlus(props) {
|
|
|
1209
1058
|
var orderedFormItems = useMemo(function () {
|
|
1210
1059
|
// 从查询方案提取字段顺序
|
|
1211
1060
|
var itemsOrder = currentQueryScheme ? extractItemsOrder(currentQueryScheme) : queryItemsOrder;
|
|
1212
|
-
|
|
1213
|
-
return queryFormItems;
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
// 按照 itemsOrder 排序
|
|
1217
|
-
var ordered = _toConsumableArray(queryFormItems).sort(function (a, b) {
|
|
1218
|
-
var indexA = itemsOrder.indexOf(a.field);
|
|
1219
|
-
var indexB = itemsOrder.indexOf(b.field);
|
|
1220
|
-
if (indexA === -1 && indexB === -1) return 0;
|
|
1221
|
-
if (indexA === -1) return 1;
|
|
1222
|
-
if (indexB === -1) return -1;
|
|
1223
|
-
return indexA - indexB;
|
|
1224
|
-
});
|
|
1225
|
-
return ordered;
|
|
1061
|
+
return sortFormItemsByOrder(queryFormItems, itemsOrder);
|
|
1226
1062
|
}, [queryFormItems, currentQueryScheme, queryItemsOrder]);
|
|
1227
1063
|
|
|
1228
1064
|
// 根据方案的隐藏字段过滤表单项
|
|
1229
1065
|
var visibleFormItems = useMemo(function () {
|
|
1230
1066
|
// 从查询方案提取隐藏字段
|
|
1231
1067
|
var hiddenFields = currentQueryScheme ? extractHiddenFields(currentQueryScheme) : [];
|
|
1232
|
-
|
|
1233
|
-
return orderedFormItems;
|
|
1234
|
-
}
|
|
1235
|
-
return orderedFormItems.filter(function (item) {
|
|
1236
|
-
return !hiddenFields.includes(item.field);
|
|
1237
|
-
});
|
|
1068
|
+
return filterHiddenFormItems(orderedFormItems, hiddenFields);
|
|
1238
1069
|
}, [orderedFormItems, currentQueryScheme]);
|
|
1070
|
+
|
|
1071
|
+
// 依赖 rowData:数据刷新(翻页/查询)后需重算底部汇总行。
|
|
1072
|
+
// 原内联 calculatefun 每渲染重建使本 effect 每渲染都跑而隐式覆盖此触发;
|
|
1073
|
+
// 抽出后 calculateSum 变稳定,须显式依赖 rowData 以保持原行为。@author nokecy
|
|
1239
1074
|
useEffect(function () {
|
|
1240
1075
|
calculateSum();
|
|
1241
|
-
}, [calculateSum]);
|
|
1076
|
+
}, [calculateSum, rowData]);
|
|
1242
1077
|
var rowDataMemo = useMemo(function () {
|
|
1243
1078
|
// 【兼容】根据 useNativeTreeFilter 决定是否使用原生树形过滤
|
|
1244
1079
|
// - useNativeTreeFilter=true: 直接传入原始数据,由 AG-Grid 原生处理树形结构(支持列头过滤所有层级)
|
|
@@ -1251,7 +1086,9 @@ function AgGridPlus(props) {
|
|
|
1251
1086
|
var actionDom = toolBarRender && toolBarRender(apiRef.current, convertFilterModel(queryFilter, allColDefsRef.current), queryFilter, {
|
|
1252
1087
|
current: pagination.current,
|
|
1253
1088
|
skipCount: pagination.current == 1 ? 0 : (pagination.current - 1) * pagination.pageSize,
|
|
1254
|
-
maxResultCount: pagination.pageSize
|
|
1089
|
+
maxResultCount: pagination.pageSize,
|
|
1090
|
+
page: pagination.current,
|
|
1091
|
+
pageSize: pagination.pageSize
|
|
1255
1092
|
});
|
|
1256
1093
|
var autoGroupColumnDef = useMemo(function () {
|
|
1257
1094
|
var _props$autoGroupColum;
|
|
@@ -1260,7 +1097,17 @@ function AgGridPlus(props) {
|
|
|
1260
1097
|
});
|
|
1261
1098
|
}, [props.autoGroupColumnDef]);
|
|
1262
1099
|
|
|
1263
|
-
//
|
|
1100
|
+
// 查询表单上下文值:从 GridPlusContext 拆出,使查询表单的高频变化(顺序调整)
|
|
1101
|
+
// 不再触发 GridPlusContext 全量重渲染。@author nokecy
|
|
1102
|
+
var queryFormContextValue = useMemo(function () {
|
|
1103
|
+
return {
|
|
1104
|
+
queryFormItems: queryFormItems,
|
|
1105
|
+
currentQueryOrder: currentQueryScheme ? extractItemsOrder(currentQueryScheme) : queryItemsOrder,
|
|
1106
|
+
updateQueryOrder: setQueryItemsOrder
|
|
1107
|
+
};
|
|
1108
|
+
}, [queryFormItems, currentQueryScheme, queryItemsOrder]);
|
|
1109
|
+
|
|
1110
|
+
// 准备 GridPlusContext 的值(包含方案管理的完整 API;查询表单字段已移至 QueryFormContext)
|
|
1264
1111
|
var gridPlusContextValue = useMemo(function () {
|
|
1265
1112
|
return {
|
|
1266
1113
|
extensibleColumns: extensibleColumns,
|
|
@@ -1273,9 +1120,6 @@ function AgGridPlus(props) {
|
|
|
1273
1120
|
applyToGlobal: applyToGlobal,
|
|
1274
1121
|
resetCurrent: resetCurrent,
|
|
1275
1122
|
resetAll: resetAll,
|
|
1276
|
-
currentQueryOrder: currentQueryScheme ? extractItemsOrder(currentQueryScheme) : queryItemsOrder,
|
|
1277
|
-
updateQueryOrder: setQueryItemsOrder,
|
|
1278
|
-
queryFormItems: queryFormItems,
|
|
1279
1123
|
// ========== 方案管理 API(透传给子组件) ==========
|
|
1280
1124
|
columnSchemes: columnSchemes,
|
|
1281
1125
|
querySchemes: querySchemes,
|
|
@@ -1305,7 +1149,7 @@ function AgGridPlus(props) {
|
|
|
1305
1149
|
};
|
|
1306
1150
|
}, [extensibleColumns, gridPlusColumnState,
|
|
1307
1151
|
// ref.current 作依赖无效(变更不触发重渲染);依赖数据源 allColDefs,initialColumnDefs 随其首次计算填充 @author nokecy
|
|
1308
|
-
allColDefs, onSaveColumnState, applyToGlobal, resetCurrent, resetAll,
|
|
1152
|
+
allColDefs, onSaveColumnState, applyToGlobal, resetCurrent, resetAll,
|
|
1309
1153
|
// 方案管理依赖
|
|
1310
1154
|
columnSchemes, querySchemes, currentSchemes, schemesLoading, lastSyncTime, saveColumnScheme, deleteColumnScheme, saveQueryScheme, deleteQueryScheme, setCurrentColumnScheme, setCurrentQueryScheme, refreshSchemes, getColumnSchemes, getQuerySchemes, getCurrentScheme,
|
|
1311
1155
|
// 全局配置依赖
|
|
@@ -1316,6 +1160,8 @@ function AgGridPlus(props) {
|
|
|
1316
1160
|
hostEntityExtensions]);
|
|
1317
1161
|
return /*#__PURE__*/React.createElement(GridPlusContext.Provider, {
|
|
1318
1162
|
value: gridPlusContextValue
|
|
1163
|
+
}, /*#__PURE__*/React.createElement(QueryFormContext.Provider, {
|
|
1164
|
+
value: queryFormContextValue
|
|
1319
1165
|
}, /*#__PURE__*/React.createElement(Spin, {
|
|
1320
1166
|
spinning: loading,
|
|
1321
1167
|
wrapperClassName: "grid-spin"
|
|
@@ -1565,6 +1411,6 @@ function AgGridPlus(props) {
|
|
|
1565
1411
|
pageSizeOptions: props.pageSizeOptions || [10, 20, 50, 100, 200, 500, 1000, 10000],
|
|
1566
1412
|
hideOnSinglePage: false,
|
|
1567
1413
|
showQuickJumper: false
|
|
1568
|
-
}))))));
|
|
1414
|
+
})))))));
|
|
1569
1415
|
}
|
|
1570
1416
|
export default AgGridPlus;
|
|
@@ -129,14 +129,17 @@ export interface GridPlusContextValue extends SchemeManagementAPI {
|
|
|
129
129
|
resetAll: (gridKey: string) => void;
|
|
130
130
|
/**
|
|
131
131
|
* 查询表单项列表(用于查询方案管理器)
|
|
132
|
+
* @deprecated 已移至 QueryFormContext(useQueryForm);保留此声明仅为向后兼容,AgGridPlus 不再经本 Context 提供。
|
|
132
133
|
*/
|
|
133
134
|
queryFormItems?: any[];
|
|
134
135
|
/**
|
|
135
136
|
* 当前查询项顺序
|
|
137
|
+
* @deprecated 已移至 QueryFormContext(useQueryForm)。
|
|
136
138
|
*/
|
|
137
139
|
currentQueryOrder?: string[];
|
|
138
140
|
/**
|
|
139
141
|
* 更新查询项顺序
|
|
142
|
+
* @deprecated 已移至 QueryFormContext(useQueryForm)。
|
|
140
143
|
*/
|
|
141
144
|
updateQueryOrder?: (order: string[]) => void;
|
|
142
145
|
/**
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 查询表单上下文。
|
|
4
|
+
*
|
|
5
|
+
* 从 GridPlusContext 中拆出"查询表单"相关字段(查询项列表/顺序/更新函数),
|
|
6
|
+
* 使查询表单的高频变化(如拖动调整顺序)不再触发 GridPlusContext 全量重渲染。
|
|
7
|
+
* 当前仅 QuerySchemeManager 消费;由 AgGridPlus 内部 Provider 提供。
|
|
8
|
+
* @author nokecy
|
|
9
|
+
*/
|
|
10
|
+
export interface QueryFormContextValue {
|
|
11
|
+
/** 查询表单项列表(用于查询方案管理器) */
|
|
12
|
+
queryFormItems?: any[];
|
|
13
|
+
/** 当前查询项顺序 */
|
|
14
|
+
currentQueryOrder?: string[];
|
|
15
|
+
/** 更新查询项顺序 */
|
|
16
|
+
updateQueryOrder?: (order: string[]) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare const QueryFormContext: React.Context<QueryFormContextValue>;
|
|
19
|
+
/** 读取查询表单上下文。@author nokecy */
|
|
20
|
+
export declare const useQueryForm: () => QueryFormContextValue;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 查询表单上下文。
|
|
5
|
+
*
|
|
6
|
+
* 从 GridPlusContext 中拆出"查询表单"相关字段(查询项列表/顺序/更新函数),
|
|
7
|
+
* 使查询表单的高频变化(如拖动调整顺序)不再触发 GridPlusContext 全量重渲染。
|
|
8
|
+
* 当前仅 QuerySchemeManager 消费;由 AgGridPlus 内部 Provider 提供。
|
|
9
|
+
* @author nokecy
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export var QueryFormContext = /*#__PURE__*/React.createContext({
|
|
13
|
+
queryFormItems: []
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
/** 读取查询表单上下文。@author nokecy */
|
|
17
|
+
export var useQueryForm = function useQueryForm() {
|
|
18
|
+
return React.useContext(QueryFormContext);
|
|
19
|
+
};
|
|
@@ -2,9 +2,5 @@
|
|
|
2
2
|
* AG-Grid Plus Hooks
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export * from "./useGridState";
|
|
8
|
-
|
|
9
|
-
// 导出 useGridPlusColumnState (已存在)
|
|
10
|
-
export { useGridPlusColumnState } from "./useGridPlusColumnState";
|
|
5
|
+
export { useGridPlusColumnState } from "./useGridPlusColumnState";
|
|
6
|
+
export { useRowId } from "./useRowId";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行唯一 ID 生成 Hook(从 ag-gridPlus.tsx 抽出,逻辑原样)。
|
|
3
|
+
*
|
|
4
|
+
* 策略(按优先级):
|
|
5
|
+
* 1. 常见 ID 字段 id/_id/key/uid/uuid(基本类型直取;对象取 value 或 id 属性)
|
|
6
|
+
* 2. WeakMap 缓存命中
|
|
7
|
+
* 3. 生成 `${gridKey|grid}-row-{counter}-{timestamp}` 并缓存
|
|
8
|
+
*
|
|
9
|
+
* @author nokecy
|
|
10
|
+
*/
|
|
11
|
+
export declare function useRowId(gridKey?: string): {
|
|
12
|
+
generateUniqueRowId: (data: any) => string;
|
|
13
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
import { useCallback, useRef } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 行唯一 ID 生成 Hook(从 ag-gridPlus.tsx 抽出,逻辑原样)。
|
|
6
|
+
*
|
|
7
|
+
* 策略(按优先级):
|
|
8
|
+
* 1. 常见 ID 字段 id/_id/key/uid/uuid(基本类型直取;对象取 value 或 id 属性)
|
|
9
|
+
* 2. WeakMap 缓存命中
|
|
10
|
+
* 3. 生成 `${gridKey|grid}-row-{counter}-{timestamp}` 并缓存
|
|
11
|
+
*
|
|
12
|
+
* @author nokecy
|
|
13
|
+
*/
|
|
14
|
+
export function useRowId(gridKey) {
|
|
15
|
+
var rowIdCacheRef = useRef(new WeakMap());
|
|
16
|
+
var rowIdCounterRef = useRef(0);
|
|
17
|
+
var generateUniqueRowId = useCallback(function (data) {
|
|
18
|
+
if (!data || _typeof(data) !== 'object') {
|
|
19
|
+
return "row-empty-".concat(rowIdCounterRef.current++);
|
|
20
|
+
}
|
|
21
|
+
var commonIdFields = ['id', '_id', 'key', 'uid', 'uuid'];
|
|
22
|
+
for (var _i = 0, _commonIdFields = commonIdFields; _i < _commonIdFields.length; _i++) {
|
|
23
|
+
var field = _commonIdFields[_i];
|
|
24
|
+
var value = data[field];
|
|
25
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
26
|
+
var fieldId = void 0;
|
|
27
|
+
if (_typeof(value) === 'object' && value !== null) {
|
|
28
|
+
if (value.value !== undefined) {
|
|
29
|
+
fieldId = String(value.value);
|
|
30
|
+
} else if (value.id !== undefined) {
|
|
31
|
+
fieldId = String(value.id);
|
|
32
|
+
} else {
|
|
33
|
+
fieldId = "".concat(field, "-").concat(JSON.stringify(value));
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
fieldId = String(value);
|
|
37
|
+
}
|
|
38
|
+
return fieldId;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
var cachedId = rowIdCacheRef.current.get(data);
|
|
42
|
+
if (cachedId) {
|
|
43
|
+
return cachedId;
|
|
44
|
+
}
|
|
45
|
+
var uniqueId = "".concat(gridKey || 'grid', "-row-").concat(rowIdCounterRef.current++, "-").concat(Date.now());
|
|
46
|
+
rowIdCacheRef.current.set(data, uniqueId);
|
|
47
|
+
return uniqueId;
|
|
48
|
+
}, [gridKey]);
|
|
49
|
+
return {
|
|
50
|
+
generateUniqueRowId: generateUniqueRowId
|
|
51
|
+
};
|
|
52
|
+
}
|