@nokecy/qc-ui 1.1.49 → 1.1.51
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/setting/ColumnSetting.js +2 -1
- package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +12 -0
- package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +50 -7
- package/dist/cjs/array-table/columnGroup.d.ts +39 -0
- package/dist/cjs/array-table/columnGroup.js +106 -0
- package/dist/cjs/array-table/index.js +14 -5
- package/dist/cjs/array-table/interface.d.ts +21 -2
- package/dist/cjs/array-table/utils.js +72 -7
- package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +3 -2
- package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +12 -0
- package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +46 -5
- package/dist/esm/array-table/columnGroup.d.ts +39 -0
- package/dist/esm/array-table/columnGroup.js +100 -0
- package/dist/esm/array-table/index.js +14 -5
- package/dist/esm/array-table/interface.d.ts +21 -2
- package/dist/esm/array-table/utils.js +74 -9
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +1 -1
|
@@ -305,7 +305,8 @@ var ColumnSetting = function ColumnSetting(_ref) {
|
|
|
305
305
|
// 【修复】修正 originalHeaderName,确保使用 initialColumnDefs 中的原始值
|
|
306
306
|
var config = fixOriginalHeaderName(currentScheme.columnConfig);
|
|
307
307
|
// 【修复】检测并追加代码中新增的列到配置末尾
|
|
308
|
-
|
|
308
|
+
// 只做查询条件的列不进列配置:方案里存过的剔除,也不当新增列追加 @author nokecy
|
|
309
|
+
config = mergeNewColumns((0, _columnGroupUtils.dropQueryOnlyItems)(config, originalColumnDefs), (0, _columnGroupUtils.excludeQueryOnlyColumns)(originalColumnDefs));
|
|
309
310
|
// 【修复】按 order 字段排序,确保配置弹窗显示的列顺序与保存时一致
|
|
310
311
|
config = _toConsumableArray(config).sort(function (a, b) {
|
|
311
312
|
return a.order - b.order;
|
|
@@ -8,6 +8,18 @@ import type { FlatColumnItem, OldColumnState } from './columnGroupTypes';
|
|
|
8
8
|
* 生成唯一 ID
|
|
9
9
|
*/
|
|
10
10
|
export declare const generateId: () => string;
|
|
11
|
+
/**
|
|
12
|
+
* 去掉只做查询条件的列(hideInTable),含分组内的
|
|
13
|
+
* 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
|
|
14
|
+
* @author nokecy
|
|
15
|
+
*/
|
|
16
|
+
export declare function excludeQueryOnlyColumns<T extends ColDef | ColGroupDef>(defs?: T[]): T[] | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* 从已存的列方案中去掉只做查询条件的列
|
|
19
|
+
* 旧版本方案会把它们当新增列存进去,还原时要按当前列定义剔除
|
|
20
|
+
* @author nokecy
|
|
21
|
+
*/
|
|
22
|
+
export declare function dropQueryOnlyItems(flatConfig: FlatColumnItem[], originalColumnDefs?: (ColDef | ColGroupDef)[]): FlatColumnItem[];
|
|
11
23
|
/**
|
|
12
24
|
* Grid State → 扁平化配置
|
|
13
25
|
* 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
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); }
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.checkIsLastChild = checkIsLastChild;
|
|
7
|
+
exports.dropQueryOnlyItems = dropQueryOnlyItems;
|
|
8
|
+
exports.excludeQueryOnlyColumns = excludeQueryOnlyColumns;
|
|
8
9
|
exports.findLastDescendantIndex = findLastDescendantIndex;
|
|
9
10
|
exports.flatConfigToColumnState = flatConfigToColumnState;
|
|
10
11
|
exports.flatConfigToGridState = flatConfigToGridState;
|
|
@@ -15,18 +16,19 @@ exports.migrateOldScheme = migrateOldScheme;
|
|
|
15
16
|
exports.reorderItems = reorderItems;
|
|
16
17
|
var _lodash = require("lodash");
|
|
17
18
|
var _logger = require("../utils/logger");
|
|
18
|
-
function
|
|
19
|
-
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; }
|
|
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
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
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); }
|
|
19
|
+
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
20
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
24
21
|
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
22
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
26
23
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
27
24
|
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; } } }; }
|
|
28
25
|
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); }
|
|
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; }
|
|
26
|
+
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; }
|
|
27
|
+
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; }
|
|
28
|
+
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; }
|
|
29
|
+
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; }
|
|
30
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
31
|
+
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); } /**
|
|
30
32
|
* 表头分组配置工具函数
|
|
31
33
|
* 负责 Grid State 与扁平化配置之间的转换
|
|
32
34
|
*/
|
|
@@ -37,6 +39,39 @@ var generateId = exports.generateId = function generateId() {
|
|
|
37
39
|
return (0, _lodash.uniqueId)('col_');
|
|
38
40
|
};
|
|
39
41
|
|
|
42
|
+
/**
|
|
43
|
+
* 去掉只做查询条件的列(hideInTable),含分组内的
|
|
44
|
+
* 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
|
|
45
|
+
* @author nokecy
|
|
46
|
+
*/
|
|
47
|
+
function excludeQueryOnlyColumns(defs) {
|
|
48
|
+
return defs === null || defs === void 0 ? void 0 : defs.filter(function (def) {
|
|
49
|
+
return !def.hideInTable;
|
|
50
|
+
}).map(function (def) {
|
|
51
|
+
return 'children' in def && def.children ? _objectSpread(_objectSpread({}, def), {}, {
|
|
52
|
+
children: excludeQueryOnlyColumns(def.children)
|
|
53
|
+
}) : def;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 从已存的列方案中去掉只做查询条件的列
|
|
59
|
+
* 旧版本方案会把它们当新增列存进去,还原时要按当前列定义剔除
|
|
60
|
+
* @author nokecy
|
|
61
|
+
*/
|
|
62
|
+
function dropQueryOnlyItems(flatConfig, originalColumnDefs) {
|
|
63
|
+
var queryOnlyFields = new Set();
|
|
64
|
+
var collect = function collect(defs) {
|
|
65
|
+
return defs.forEach(function (def) {
|
|
66
|
+
if ('children' in def && def.children) collect(def.children);else if (def.hideInTable && def.field) queryOnlyFields.add(def.field);
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
collect(originalColumnDefs !== null && originalColumnDefs !== void 0 ? originalColumnDefs : []);
|
|
70
|
+
return flatConfig.filter(function (item) {
|
|
71
|
+
return item.type !== 'column' || !item.field || !queryOnlyFields.has(item.field);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
40
75
|
/**
|
|
41
76
|
* Grid State → 扁平化配置
|
|
42
77
|
* 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
|
|
@@ -146,6 +181,10 @@ function gridStateToFlatConfig(columnDefs, originalColumnDefs) {
|
|
|
146
181
|
* @returns AG-Grid 列定义数组
|
|
147
182
|
*/
|
|
148
183
|
function flatConfigToGridState(flatConfig, originalColumnDefs) {
|
|
184
|
+
// 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
|
|
185
|
+
flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
|
|
186
|
+
originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
|
|
187
|
+
|
|
149
188
|
/**
|
|
150
189
|
* 从原始列定义中查找指定字段的列定义(支持递归查找分组内的列)
|
|
151
190
|
*/
|
|
@@ -463,6 +502,10 @@ function isOldSchemeData(data) {
|
|
|
463
502
|
* @returns AG-Grid columnState 数组
|
|
464
503
|
*/
|
|
465
504
|
function flatConfigToColumnState(flatConfig, originalColumnDefs) {
|
|
505
|
+
// 只做查询条件的列不进表格:方案里存过的剔除,也不当新增列补回 @author nokecy
|
|
506
|
+
flatConfig = dropQueryOnlyItems(flatConfig, originalColumnDefs);
|
|
507
|
+
originalColumnDefs = excludeQueryOnlyColumns(originalColumnDefs);
|
|
508
|
+
|
|
466
509
|
/**
|
|
467
510
|
* 递归收集所有列定义(包括分组内的列)
|
|
468
511
|
*/
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArrayTable 分组表头(多级表头)。
|
|
3
|
+
*
|
|
4
|
+
* 背景:schema 里的每个 ArrayTable.Column 被抽成「扁平」列定义(buildArrayTableColumns),
|
|
5
|
+
* 内部一批逻辑(懒挂载列识别、列方案还原、首列拖拽等)都按扁平列取值,不能改。
|
|
6
|
+
* 所以分组只在「交给 AG-Grid 的那一份 columnDefs」上做:
|
|
7
|
+
* 1. buildArrayTableColumns 生成列定义时,用 markHeaderGroup 把列声明的 headerGroup 记下来;
|
|
8
|
+
* 2. index.tsx 把扁平列定义交给 groupColumnDefs,得到含列组的 columnDefs 传给 AgGridReact。
|
|
9
|
+
*
|
|
10
|
+
* 分组名记在模块内的 WeakMap 里,不往 colDef 上塞自定义字段——AG-Grid 会把未知属性当作错误告警。
|
|
11
|
+
*
|
|
12
|
+
* 只支持一级分组;分组名相同但不相邻的列各自成组。
|
|
13
|
+
*
|
|
14
|
+
* @author nokecy
|
|
15
|
+
*/
|
|
16
|
+
import type { ColDef, ColGroupDef } from 'ag-grid-community';
|
|
17
|
+
/**
|
|
18
|
+
* 记下列定义所属的表头分组。
|
|
19
|
+
* headerGroup 不是非空字符串(没声明、空串、纯空白)时不做任何事,该列按无分组处理。
|
|
20
|
+
* 返回传入的 colDef 本身,方便链式使用。
|
|
21
|
+
*/
|
|
22
|
+
export declare const markHeaderGroup: <T extends object>(colDef: T, headerGroup: unknown) => T;
|
|
23
|
+
/**
|
|
24
|
+
* 把扁平列定义按「相邻且 headerGroup 相同」合并成 AG-Grid 列组。
|
|
25
|
+
*
|
|
26
|
+
* - 相邻同名的列 -> 一个 { headerName, groupId, children } 列组;
|
|
27
|
+
* - 同名但被别的列隔开 -> 各自成组,groupId 各不相同;
|
|
28
|
+
* - 没声明分组的列原样保留(同一个对象);
|
|
29
|
+
* - 一个分组也没有时直接返回传入的数组本身,没用到分组的表格行为零变化。
|
|
30
|
+
*
|
|
31
|
+
* groupId 由分组名派生(同名第 N 次出现追加 _N),同样的输入永远得到同样的 id:
|
|
32
|
+
* columnDefs 因别的原因重建时,AG-Grid 靠 groupId 认出还是那个列组,列组状态不丢。
|
|
33
|
+
*
|
|
34
|
+
* 有意不设 marryChildren:设了以后,任何打破组内相邻的列顺序(用户旧的扁平列方案、
|
|
35
|
+
* 列设置面板里跨组拖动的实时预览)都会被 AG-Grid 整体丢弃并报 error #39;不设则顺序照常生效,
|
|
36
|
+
* 组被隔开时表头显示成多段。
|
|
37
|
+
* openByDefault:列组默认展开(只对配了 columnGroupShow 的可折叠列组有意义)。
|
|
38
|
+
*/
|
|
39
|
+
export declare const groupColumnDefs: (colDefs: ColDef[]) => (ColDef | ColGroupDef)[];
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.markHeaderGroup = exports.groupColumnDefs = void 0;
|
|
7
|
+
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; } } }; }
|
|
8
|
+
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); }
|
|
9
|
+
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; }
|
|
10
|
+
/**
|
|
11
|
+
* ArrayTable 分组表头(多级表头)。
|
|
12
|
+
*
|
|
13
|
+
* 背景:schema 里的每个 ArrayTable.Column 被抽成「扁平」列定义(buildArrayTableColumns),
|
|
14
|
+
* 内部一批逻辑(懒挂载列识别、列方案还原、首列拖拽等)都按扁平列取值,不能改。
|
|
15
|
+
* 所以分组只在「交给 AG-Grid 的那一份 columnDefs」上做:
|
|
16
|
+
* 1. buildArrayTableColumns 生成列定义时,用 markHeaderGroup 把列声明的 headerGroup 记下来;
|
|
17
|
+
* 2. index.tsx 把扁平列定义交给 groupColumnDefs,得到含列组的 columnDefs 传给 AgGridReact。
|
|
18
|
+
*
|
|
19
|
+
* 分组名记在模块内的 WeakMap 里,不往 colDef 上塞自定义字段——AG-Grid 会把未知属性当作错误告警。
|
|
20
|
+
*
|
|
21
|
+
* 只支持一级分组;分组名相同但不相邻的列各自成组。
|
|
22
|
+
*
|
|
23
|
+
* @author nokecy
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** 列定义 -> 它在 schema 里声明的 headerGroup */
|
|
27
|
+
var headerGroupOf = new WeakMap();
|
|
28
|
+
|
|
29
|
+
/** 列组 id 前缀,与列方案里生成的 col_N 区分开 */
|
|
30
|
+
var GROUP_ID_PREFIX = 'arrayTableGroup_';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 记下列定义所属的表头分组。
|
|
34
|
+
* headerGroup 不是非空字符串(没声明、空串、纯空白)时不做任何事,该列按无分组处理。
|
|
35
|
+
* 返回传入的 colDef 本身,方便链式使用。
|
|
36
|
+
*/
|
|
37
|
+
var markHeaderGroup = exports.markHeaderGroup = function markHeaderGroup(colDef, headerGroup) {
|
|
38
|
+
if (typeof headerGroup === 'string' && headerGroup.trim() !== '') {
|
|
39
|
+
headerGroupOf.set(colDef, headerGroup);
|
|
40
|
+
}
|
|
41
|
+
return colDef;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 把扁平列定义按「相邻且 headerGroup 相同」合并成 AG-Grid 列组。
|
|
46
|
+
*
|
|
47
|
+
* - 相邻同名的列 -> 一个 { headerName, groupId, children } 列组;
|
|
48
|
+
* - 同名但被别的列隔开 -> 各自成组,groupId 各不相同;
|
|
49
|
+
* - 没声明分组的列原样保留(同一个对象);
|
|
50
|
+
* - 一个分组也没有时直接返回传入的数组本身,没用到分组的表格行为零变化。
|
|
51
|
+
*
|
|
52
|
+
* groupId 由分组名派生(同名第 N 次出现追加 _N),同样的输入永远得到同样的 id:
|
|
53
|
+
* columnDefs 因别的原因重建时,AG-Grid 靠 groupId 认出还是那个列组,列组状态不丢。
|
|
54
|
+
*
|
|
55
|
+
* 有意不设 marryChildren:设了以后,任何打破组内相邻的列顺序(用户旧的扁平列方案、
|
|
56
|
+
* 列设置面板里跨组拖动的实时预览)都会被 AG-Grid 整体丢弃并报 error #39;不设则顺序照常生效,
|
|
57
|
+
* 组被隔开时表头显示成多段。
|
|
58
|
+
* openByDefault:列组默认展开(只对配了 columnGroupShow 的可折叠列组有意义)。
|
|
59
|
+
*/
|
|
60
|
+
var groupColumnDefs = exports.groupColumnDefs = function groupColumnDefs(colDefs) {
|
|
61
|
+
if (!colDefs.some(function (colDef) {
|
|
62
|
+
return headerGroupOf.has(colDef);
|
|
63
|
+
})) return colDefs;
|
|
64
|
+
var usedGroupIds = new Set();
|
|
65
|
+
var makeGroupId = function makeGroupId(name) {
|
|
66
|
+
var id = "".concat(GROUP_ID_PREFIX).concat(name);
|
|
67
|
+
for (var n = 2; usedGroupIds.has(id); n++) {
|
|
68
|
+
id = "".concat(GROUP_ID_PREFIX).concat(name, "_").concat(n);
|
|
69
|
+
}
|
|
70
|
+
usedGroupIds.add(id);
|
|
71
|
+
return id;
|
|
72
|
+
};
|
|
73
|
+
var result = [];
|
|
74
|
+
var current = null;
|
|
75
|
+
var _iterator = _createForOfIteratorHelper(colDefs),
|
|
76
|
+
_step;
|
|
77
|
+
try {
|
|
78
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
79
|
+
var colDef = _step.value;
|
|
80
|
+
var name = headerGroupOf.get(colDef);
|
|
81
|
+
if (name === undefined) {
|
|
82
|
+
current = null;
|
|
83
|
+
result.push(colDef);
|
|
84
|
+
} else if (current && current.name === name) {
|
|
85
|
+
current.group.children.push(colDef);
|
|
86
|
+
} else {
|
|
87
|
+
var group = {
|
|
88
|
+
headerName: name,
|
|
89
|
+
groupId: makeGroupId(name),
|
|
90
|
+
openByDefault: true,
|
|
91
|
+
children: [colDef]
|
|
92
|
+
};
|
|
93
|
+
current = {
|
|
94
|
+
name: name,
|
|
95
|
+
group: group
|
|
96
|
+
};
|
|
97
|
+
result.push(group);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} catch (err) {
|
|
101
|
+
_iterator.e(err);
|
|
102
|
+
} finally {
|
|
103
|
+
_iterator.f();
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
};
|
|
@@ -10,6 +10,7 @@ var _agGridReact = require("ag-grid-react");
|
|
|
10
10
|
var _react2 = require("@formily/react");
|
|
11
11
|
var _uniqueId = _interopRequireDefault(require("lodash/uniqueId"));
|
|
12
12
|
var _utils = require("./utils");
|
|
13
|
+
var _columnGroup = require("./columnGroup");
|
|
13
14
|
var _hooks = require("./hooks");
|
|
14
15
|
var _arrayBase = _interopRequireDefault(require("./arrayBase"));
|
|
15
16
|
var _arrayAddBtn = _interopRequireDefault(require("./arrayAddBtn"));
|
|
@@ -82,14 +83,16 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
82
83
|
// 通过 JSON.stringify 比较内容,只有内容真正变化时才返回新引用
|
|
83
84
|
var sourcesKey = (0, _react.useMemo)(function () {
|
|
84
85
|
return JSON.stringify(rawSources.map(function (s) {
|
|
85
|
-
var _s$columnProps$header, _s$columnProps, _s$columnProps2;
|
|
86
|
+
var _s$columnProps$header, _s$columnProps, _s$columnProps2, _s$columnProps3;
|
|
86
87
|
return {
|
|
87
88
|
name: s.name,
|
|
88
89
|
display: s.display,
|
|
89
90
|
// 列标题可由 reactions 运行时改写,纳入 key 才能让 stableColumnDefs 跟着重建。
|
|
90
91
|
// 宽度/隐藏/固定由 applyColumnState(方案)管,故意不纳入,避免行编辑时列状态被重置。
|
|
91
92
|
// 可编辑性:带 x-reactions 的列在 buildArrayTableColumns 里已强制走 AgField 全树(尊重运行时 pattern),无需进 key。@author nokecy
|
|
92
|
-
headerName: (_s$columnProps$header = (_s$columnProps = s.columnProps) === null || _s$columnProps === void 0 ? void 0 : _s$columnProps.headerName) !== null && _s$columnProps$header !== void 0 ? _s$columnProps$header : (_s$columnProps2 = s.columnProps) === null || _s$columnProps2 === void 0 ? void 0 : _s$columnProps2.title
|
|
93
|
+
headerName: (_s$columnProps$header = (_s$columnProps = s.columnProps) === null || _s$columnProps === void 0 ? void 0 : _s$columnProps.headerName) !== null && _s$columnProps$header !== void 0 ? _s$columnProps$header : (_s$columnProps2 = s.columnProps) === null || _s$columnProps2 === void 0 ? void 0 : _s$columnProps2.title,
|
|
94
|
+
// 分组名变了列组结构就变,同样要重建。@author nokecy
|
|
95
|
+
headerGroup: (_s$columnProps3 = s.columnProps) === null || _s$columnProps3 === void 0 ? void 0 : _s$columnProps3.headerGroup
|
|
93
96
|
};
|
|
94
97
|
}));
|
|
95
98
|
}, [rawSources]);
|
|
@@ -150,6 +153,12 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
150
153
|
return cols;
|
|
151
154
|
}, [sources, props.onRowDrag]); // 移除 field 依赖,避免数据变化时重新计算
|
|
152
155
|
|
|
156
|
+
// 交给 AgGridReact 的列定义:按 x-component-props.headerGroup 把相邻同组的列合并成列组(多级表头)。
|
|
157
|
+
// stableColumnDefs 保持扁平,懒列识别、列方案还原等内部逻辑仍用它;只有喂给 AG-Grid 的这一份带分组。@author nokecy
|
|
158
|
+
var gridColumnDefs = (0, _react.useMemo)(function () {
|
|
159
|
+
return (0, _columnGroup.groupColumnDefs)(stableColumnDefs);
|
|
160
|
+
}, [stableColumnDefs]);
|
|
161
|
+
|
|
153
162
|
// 懒挂载:把激活态 Set 通过 AG-Grid context 暴露给 LazyAgField(引用稳定,原地 mutate)。@author nokecy
|
|
154
163
|
var gridContext = (0, _react.useMemo)(function () {
|
|
155
164
|
return {
|
|
@@ -226,8 +235,8 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
226
235
|
if (hasGroups) {
|
|
227
236
|
// 传入 stableColumnDefs 作为原始定义,保留 cellRenderer(AgField/LazyAgField)及其
|
|
228
237
|
// cellRendererParams——否则分组方案重建出的是裸列,单元格退化为纯文本、编辑失效。@author nokecy
|
|
229
|
-
var
|
|
230
|
-
gridApiState.setGridOption('columnDefs',
|
|
238
|
+
var _gridColumnDefs = (0, _columnGroupUtils.flatConfigToGridState)(currentScheme.columnConfig, stableColumnDefs);
|
|
239
|
+
gridApiState.setGridOption('columnDefs', _gridColumnDefs);
|
|
231
240
|
}
|
|
232
241
|
|
|
233
242
|
// 2. 应用列状态(列顺序、宽度、隐藏、固定等)
|
|
@@ -420,7 +429,7 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
420
429
|
,
|
|
421
430
|
rowHeight: 38,
|
|
422
431
|
pagination: false,
|
|
423
|
-
columnDefs:
|
|
432
|
+
columnDefs: gridColumnDefs,
|
|
424
433
|
rowData: dataSource
|
|
425
434
|
})), sources.map(function (column, key) {
|
|
426
435
|
//专门用来承接对Column的状态管理
|
|
@@ -3,9 +3,28 @@ import { FieldDisplayTypes, GeneralField } from "@formily/core";
|
|
|
3
3
|
import { Schema } from "@formily/json-schema";
|
|
4
4
|
import { AgGridReactProps } from "ag-grid-react";
|
|
5
5
|
import React from "react";
|
|
6
|
+
/**
|
|
7
|
+
* ArrayTable.Column 的 x-component-props 里 qc-ui 自己认的扩展属性;
|
|
8
|
+
* 其余属性(width、headerName、pinned 等)按 AG-Grid 列定义处理。
|
|
9
|
+
*
|
|
10
|
+
* @author nokecy
|
|
11
|
+
*/
|
|
12
|
+
interface ArrayTableColumnProps {
|
|
13
|
+
/**
|
|
14
|
+
* 表头分组名(多级表头,仅一级)。
|
|
15
|
+
* 相邻且 headerGroup 相同的列合并成一个列组,分组名作为组头;
|
|
16
|
+
* 同名但不相邻的列各自成组;不写则该列不分组。
|
|
17
|
+
*/
|
|
18
|
+
headerGroup?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 默认隐藏:为 true 时该列首次出现时是隐藏的,用户可在列设置里打开,列方案(applyColumnState)优先。
|
|
21
|
+
* 对应 AG-Grid 的 initialHide。注意 hide 在 ArrayTable 里不生效(状态归列方案管),要默认隐藏请用它。
|
|
22
|
+
*/
|
|
23
|
+
defaultHide?: boolean;
|
|
24
|
+
}
|
|
6
25
|
interface ObservableColumnSource {
|
|
7
26
|
field: GeneralField;
|
|
8
|
-
columnProps: any
|
|
27
|
+
columnProps: ArrayTableColumnProps & Record<string, any>;
|
|
9
28
|
schema: Schema;
|
|
10
29
|
display: FieldDisplayTypes;
|
|
11
30
|
name: string;
|
|
@@ -13,4 +32,4 @@ interface ObservableColumnSource {
|
|
|
13
32
|
type ComposedArrayTable = React.FC<React.PropsWithChildren<AgGridReactProps>> & ArrayBaseMixins & {
|
|
14
33
|
Column?: any;
|
|
15
34
|
};
|
|
16
|
-
export { ComposedArrayTable, ObservableColumnSource };
|
|
35
|
+
export { ComposedArrayTable, ObservableColumnSource, ArrayTableColumnProps };
|
|
@@ -9,9 +9,11 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
9
9
|
var _antd = require("antd");
|
|
10
10
|
var _react2 = require("@formily/react");
|
|
11
11
|
var _shared = require("@formily/shared");
|
|
12
|
+
var _jsonSchema = require("@formily/json-schema");
|
|
12
13
|
var _arrayBase = _interopRequireDefault(require("./arrayBase"));
|
|
13
14
|
var _readOnlyFormatters = require("./readOnlyFormatters");
|
|
14
|
-
var
|
|
15
|
+
var _columnGroup = require("./columnGroup");
|
|
16
|
+
var _excluded = ["hide", "sort", "sortIndex", "forceAgField", "headerGroup", "defaultHide"];
|
|
15
17
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
18
|
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; }
|
|
17
19
|
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; }
|
|
@@ -190,6 +192,56 @@ var resolveEmptyPlaceholder = function resolveEmptyPlaceholder(fieldSchema) {
|
|
|
190
192
|
return SELECT_LIKE.has(fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-component']) ? '请选择' : '请输入';
|
|
191
193
|
};
|
|
192
194
|
|
|
195
|
+
/** Formily 字段的四种 pattern;x-pattern 求出来不在其中,视为「求不出」 */
|
|
196
|
+
var CELL_PATTERNS = new Set(['editable', 'disabled', 'readOnly', 'readPretty']);
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 懒挂载格此刻的 pattern。
|
|
200
|
+
*
|
|
201
|
+
* 懒挂载不创建 Formily 字段,拿不到字段实例上求好的 pattern,只能按同一套规则自己求:
|
|
202
|
+
* 字段自己的 x-pattern 优先(表达式按本行本格的作用域求值,$self 只提供 path/index/value/form/parent/query),
|
|
203
|
+
* 没写则继承整表 pattern。表达式用到本格没有的能力、抛错或求出非法值时返回 undefined,
|
|
204
|
+
* 调用方按「可编辑」处理,保持原有提示。@author nokecy
|
|
205
|
+
*/
|
|
206
|
+
var resolveLazyCellPattern = function resolveLazyCellPattern(arrayField, record, dataKey, fieldSchema, scope) {
|
|
207
|
+
var own = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-pattern'];
|
|
208
|
+
if (own == null) return arrayField === null || arrayField === void 0 ? void 0 : arrayField.pattern;
|
|
209
|
+
if (typeof own !== 'string') return undefined;
|
|
210
|
+
if (CELL_PATTERNS.has(own)) return own;
|
|
211
|
+
var form = arrayField === null || arrayField === void 0 ? void 0 : arrayField.form;
|
|
212
|
+
if (!form || !dataKey) return undefined;
|
|
213
|
+
try {
|
|
214
|
+
var _arrayField$value$ind, _arrayField$value, _arrayField$value$ind2;
|
|
215
|
+
var index = (_arrayField$value$ind = (_arrayField$value = arrayField.value) === null || _arrayField$value === void 0 || (_arrayField$value$ind2 = _arrayField$value.indexOf) === null || _arrayField$value$ind2 === void 0 ? void 0 : _arrayField$value$ind2.call(_arrayField$value, record)) !== null && _arrayField$value$ind !== void 0 ? _arrayField$value$ind : -1;
|
|
216
|
+
// 与真字段一致:path 是数据路径(不含 void 容器),address 含 void 容器;表达式里 getValuesIn($self.path...) 靠前者
|
|
217
|
+
var path = arrayField.path.concat(index).concat(dataKey);
|
|
218
|
+
var address = arrayField.address.concat(index).concat(dataKey);
|
|
219
|
+
var self = {
|
|
220
|
+
path: path,
|
|
221
|
+
address: address,
|
|
222
|
+
index: index,
|
|
223
|
+
form: form,
|
|
224
|
+
parent: arrayField,
|
|
225
|
+
get value() {
|
|
226
|
+
return readByFieldPath(record, dataKey);
|
|
227
|
+
},
|
|
228
|
+
query: function query(pattern) {
|
|
229
|
+
return form.query(pattern);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
var result = _jsonSchema.Schema.shallowCompile(own, (0, _shared.lazyMerge)(scope !== null && scope !== void 0 ? scope : {}, {
|
|
233
|
+
$form: form,
|
|
234
|
+
$values: form.values,
|
|
235
|
+
$self: self,
|
|
236
|
+
$record: record,
|
|
237
|
+
$index: index
|
|
238
|
+
}));
|
|
239
|
+
return CELL_PATTERNS.has(result) ? result : undefined;
|
|
240
|
+
} catch (_unused) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
193
245
|
/**
|
|
194
246
|
* 懒挂载单元格渲染器(可编辑列)。
|
|
195
247
|
*
|
|
@@ -219,6 +271,7 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
|
|
|
219
271
|
// hook 必须在下面的条件 return 之前调用
|
|
220
272
|
var _theme$useToken = _antd.theme.useToken(),
|
|
221
273
|
token = _theme$useToken.token;
|
|
274
|
+
var scope = (0, _react2.useExpressionScope)();
|
|
222
275
|
var key = "".concat(node === null || node === void 0 ? void 0 : node.id, ":").concat(colDef === null || colDef === void 0 ? void 0 : colDef.field);
|
|
223
276
|
var activated = (record === null || record === void 0 ? void 0 : record._isNew) === true || (context === null || context === void 0 || (_context$activeCells = context.activeCells) === null || _context$activeCells === void 0 || (_context$activeCells$ = _context$activeCells.has) === null || _context$activeCells$ === void 0 ? void 0 : _context$activeCells$.call(_context$activeCells, key)) === true;
|
|
224
277
|
if (activated) {
|
|
@@ -245,7 +298,9 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
|
|
|
245
298
|
fieldSchema: fieldSchema
|
|
246
299
|
}) : liveValue == null ? '' : String(liveValue);
|
|
247
300
|
// 纯文本占满单元格,点击交给 AG-Grid onCellClicked 激活;样式尽量贴近 Editable 只读态避免点开跳动
|
|
248
|
-
|
|
301
|
+
// 只读态(readPretty/disabled/readOnly)的空格不出编辑提示,留空与只读快路径一致
|
|
302
|
+
var pattern = text === '' ? resolveLazyCellPattern(field, record, dataKey, fieldSchema, scope) : undefined;
|
|
303
|
+
if (text === '' && (pattern == null || pattern === 'editable')) {
|
|
249
304
|
// 空值:出淡灰 placeholder,让用户看得出这格能填(颜色取 antd 输入框 placeholder 的 token,自动跟随暗色主题)
|
|
250
305
|
return /*#__PURE__*/_react.default.createElement("span", {
|
|
251
306
|
className: "ag-array-table-lazy-placeholder",
|
|
@@ -368,6 +423,8 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
368
423
|
sort = columnProps.sort,
|
|
369
424
|
sortIndex = columnProps.sortIndex,
|
|
370
425
|
forceAgField = columnProps.forceAgField,
|
|
426
|
+
headerGroup = columnProps.headerGroup,
|
|
427
|
+
defaultHide = columnProps.defaultHide,
|
|
371
428
|
safeColumnProps = _objectWithoutProperties(columnProps, _excluded);
|
|
372
429
|
var base = _objectSpread(_objectSpread({}, safeColumnProps), {}, {
|
|
373
430
|
// 保留 width 作为列的初始宽度
|
|
@@ -375,7 +432,15 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
375
432
|
//@ts-ignore
|
|
376
433
|
headerName: columnProps.headerName || columnProps.title,
|
|
377
434
|
field: name
|
|
378
|
-
}
|
|
435
|
+
}, defaultHide === true ? {
|
|
436
|
+
initialHide: true
|
|
437
|
+
} : {});
|
|
438
|
+
|
|
439
|
+
// 记下分组名再输出列定义;真正合并成列组在 index.tsx 交给 AG-Grid 之前(groupColumnDefs)做,
|
|
440
|
+
// 这里产出的仍是扁平列定义。@author nokecy
|
|
441
|
+
var emit = function emit(colDef) {
|
|
442
|
+
return buf.concat((0, _columnGroup.markHeaderGroup)(colDef, headerGroup));
|
|
443
|
+
};
|
|
379
444
|
|
|
380
445
|
// 三分流渲染策略:@author nokecy
|
|
381
446
|
// ① 只读纯文本(永不可编辑):只读列 + 有格式化器 -> valueFormatter,不挂 Formily 树。
|
|
@@ -411,7 +476,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
411
476
|
// 读 AG-Grid 缓存值不刷新 → 反应式只读渲染。整表 readPretty(明细/详情页,数据 setValues 整体加载、
|
|
412
477
|
// 行引用整体替换、AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
|
|
413
478
|
if (arrayPattern !== 'readPretty') {
|
|
414
|
-
return
|
|
479
|
+
return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
|
|
415
480
|
valueGetter: valueGetter
|
|
416
481
|
} : {}), {}, {
|
|
417
482
|
cellRenderer: LazyReadOnlyText,
|
|
@@ -422,7 +487,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
422
487
|
}
|
|
423
488
|
}));
|
|
424
489
|
}
|
|
425
|
-
return
|
|
490
|
+
return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
|
|
426
491
|
valueGetter: valueGetter
|
|
427
492
|
} : {}), {}, {
|
|
428
493
|
// 显式清掉可能从 safeColumnProps 漏带的 cellRenderer(AG-Grid 中 renderer 优先级高于 formatter)
|
|
@@ -438,7 +503,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
438
503
|
|
|
439
504
|
// ② 可编辑懒挂载(排除单击直控的 Switch/Checkbox:须 eager 出真控件)
|
|
440
505
|
if (!readOnly && formatter && !hasReactions && !forceEager && !isInlineToggle && canFastPath) {
|
|
441
|
-
return
|
|
506
|
+
return emit(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
|
|
442
507
|
valueGetter: valueGetter
|
|
443
508
|
} : {}), {}, {
|
|
444
509
|
cellRenderer: LazyAgField,
|
|
@@ -455,7 +520,7 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
|
|
|
455
520
|
}
|
|
456
521
|
|
|
457
522
|
// ③ 兜底全树
|
|
458
|
-
return
|
|
523
|
+
return emit(_objectSpread(_objectSpread({}, base), {}, {
|
|
459
524
|
cellRendererParams: {
|
|
460
525
|
dataSource: dataSource,
|
|
461
526
|
schema: schema,
|
|
@@ -33,7 +33,7 @@ import { AgGridReact } from 'ag-grid-react';
|
|
|
33
33
|
import { agGridTheme } from "../theme";
|
|
34
34
|
import { localeText } from "../locale";
|
|
35
35
|
import { createForm, onFormInit } from '@formily/core';
|
|
36
|
-
import { gridStateToFlatConfig, flatConfigToGridState, flatConfigToColumnState, isOldSchemeData, migrateOldScheme, generateId } from "./columnGroupUtils";
|
|
36
|
+
import { gridStateToFlatConfig, flatConfigToGridState, flatConfigToColumnState, dropQueryOnlyItems, excludeQueryOnlyColumns, isOldSchemeData, migrateOldScheme, generateId } from "./columnGroupUtils";
|
|
37
37
|
import ColumnConfigTable from "./ColumnConfigTable";
|
|
38
38
|
import DraggableModal from "../../draggableModal";
|
|
39
39
|
import { useGridSchemes } from "../context/useSchemeManager";
|
|
@@ -298,7 +298,8 @@ var ColumnSetting = function ColumnSetting(_ref) {
|
|
|
298
298
|
// 【修复】修正 originalHeaderName,确保使用 initialColumnDefs 中的原始值
|
|
299
299
|
var config = fixOriginalHeaderName(currentScheme.columnConfig);
|
|
300
300
|
// 【修复】检测并追加代码中新增的列到配置末尾
|
|
301
|
-
|
|
301
|
+
// 只做查询条件的列不进列配置:方案里存过的剔除,也不当新增列追加 @author nokecy
|
|
302
|
+
config = mergeNewColumns(dropQueryOnlyItems(config, originalColumnDefs), excludeQueryOnlyColumns(originalColumnDefs));
|
|
302
303
|
// 【修复】按 order 字段排序,确保配置弹窗显示的列顺序与保存时一致
|
|
303
304
|
config = _toConsumableArray(config).sort(function (a, b) {
|
|
304
305
|
return a.order - b.order;
|
|
@@ -8,6 +8,18 @@ import type { FlatColumnItem, OldColumnState } from './columnGroupTypes';
|
|
|
8
8
|
* 生成唯一 ID
|
|
9
9
|
*/
|
|
10
10
|
export declare const generateId: () => string;
|
|
11
|
+
/**
|
|
12
|
+
* 去掉只做查询条件的列(hideInTable),含分组内的
|
|
13
|
+
* 这类列只进查询表单,不是表格列:列方案的还原、新增列检测都不能把它带进表格
|
|
14
|
+
* @author nokecy
|
|
15
|
+
*/
|
|
16
|
+
export declare function excludeQueryOnlyColumns<T extends ColDef | ColGroupDef>(defs?: T[]): T[] | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* 从已存的列方案中去掉只做查询条件的列
|
|
19
|
+
* 旧版本方案会把它们当新增列存进去,还原时要按当前列定义剔除
|
|
20
|
+
* @author nokecy
|
|
21
|
+
*/
|
|
22
|
+
export declare function dropQueryOnlyItems(flatConfig: FlatColumnItem[], originalColumnDefs?: (ColDef | ColGroupDef)[]): FlatColumnItem[];
|
|
11
23
|
/**
|
|
12
24
|
* Grid State → 扁平化配置
|
|
13
25
|
* 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
|