@nokecy/qc-ui 1.0.82 → 1.0.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cjs/ag-grid-plus/_utils/processColumnGroups.d.ts +9 -0
  2. package/dist/cjs/ag-grid-plus/_utils/processColumnGroups.js +43 -0
  3. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +252 -121
  4. package/dist/cjs/ag-grid-plus/querySchemes/components/QuerySchemesManager.js +19 -9
  5. package/dist/cjs/ag-grid-plus/querySchemes/hooks/useQuerySchemes.js +25 -3
  6. package/dist/cjs/ag-grid-plus/schemes/components/SchemeSelector.d.ts +1 -1
  7. package/dist/cjs/ag-grid-plus/schemes/components/SchemeSelector.js +1 -1
  8. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.js +60 -14
  9. package/dist/cjs/ag-grid-plus/schemes/storage/localStorageAdapter.js +12 -26
  10. package/dist/cjs/ag-grid-plus/schemes/types.d.ts +8 -5
  11. package/dist/cjs/ag-grid-plus/schemes/utils/validator.js +14 -18
  12. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.d.ts +16 -0
  13. package/dist/cjs/ag-grid-plus/setting/ColumnConfigForm.js +348 -0
  14. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.d.ts +20 -0
  15. package/dist/cjs/ag-grid-plus/setting/ColumnConfigTable.js +940 -0
  16. package/dist/cjs/ag-grid-plus/setting/ColumnSetting.js +208 -248
  17. package/dist/cjs/ag-grid-plus/setting/MoveNodeModal.d.ts +15 -0
  18. package/dist/cjs/ag-grid-plus/setting/MoveNodeModal.js +160 -0
  19. package/dist/cjs/ag-grid-plus/setting/NameColumnRenderer.d.ts +18 -0
  20. package/dist/cjs/ag-grid-plus/setting/NameColumnRenderer.js +94 -0
  21. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.d.ts +59 -0
  22. package/dist/cjs/ag-grid-plus/setting/columnGroupTypes.js +5 -0
  23. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.d.ts +75 -0
  24. package/dist/cjs/ag-grid-plus/setting/columnGroupUtils.js +281 -0
  25. package/dist/cjs/ag-grid-plus/setting/index.d.ts +2 -1
  26. package/dist/cjs/ag-grid-plus/setting/index.js +4 -2
  27. package/dist/cjs/ag-grid-plus/storage/SchemeSyncManager.d.ts +2 -1
  28. package/dist/cjs/ag-grid-plus/storage/SchemeSyncManager.js +11 -8
  29. package/dist/cjs/ag-grid-plus/types.d.ts +2 -0
  30. package/dist/cjs/array-table/index.js +30 -118
  31. package/dist/cjs/draggableModal/index.d.ts +1 -1
  32. package/dist/cjs/draggableModal/index.js +253 -25
  33. package/dist/cjs/draggableModal/style.less +185 -12
  34. package/dist/esm/ag-grid-plus/_utils/processColumnGroups.d.ts +9 -0
  35. package/dist/esm/ag-grid-plus/_utils/processColumnGroups.js +44 -0
  36. package/dist/esm/ag-grid-plus/ag-gridPlus.js +252 -121
  37. package/dist/esm/ag-grid-plus/querySchemes/components/QuerySchemesManager.js +19 -10
  38. package/dist/esm/ag-grid-plus/querySchemes/hooks/useQuerySchemes.js +25 -3
  39. package/dist/esm/ag-grid-plus/schemes/components/SchemeSelector.d.ts +1 -1
  40. package/dist/esm/ag-grid-plus/schemes/components/SchemeSelector.js +1 -1
  41. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.js +60 -14
  42. package/dist/esm/ag-grid-plus/schemes/storage/localStorageAdapter.js +13 -27
  43. package/dist/esm/ag-grid-plus/schemes/types.d.ts +8 -5
  44. package/dist/esm/ag-grid-plus/schemes/utils/validator.js +14 -18
  45. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.d.ts +16 -0
  46. package/dist/esm/ag-grid-plus/setting/ColumnConfigForm.js +338 -0
  47. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.d.ts +20 -0
  48. package/dist/esm/ag-grid-plus/setting/ColumnConfigTable.js +932 -0
  49. package/dist/esm/ag-grid-plus/setting/ColumnSetting.js +207 -247
  50. package/dist/esm/ag-grid-plus/setting/MoveNodeModal.d.ts +15 -0
  51. package/dist/esm/ag-grid-plus/setting/MoveNodeModal.js +150 -0
  52. package/dist/esm/ag-grid-plus/setting/NameColumnRenderer.d.ts +18 -0
  53. package/dist/esm/ag-grid-plus/setting/NameColumnRenderer.js +87 -0
  54. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.d.ts +59 -0
  55. package/dist/esm/ag-grid-plus/setting/columnGroupTypes.js +1 -0
  56. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.d.ts +75 -0
  57. package/dist/esm/ag-grid-plus/setting/columnGroupUtils.js +265 -0
  58. package/dist/esm/ag-grid-plus/setting/index.d.ts +2 -1
  59. package/dist/esm/ag-grid-plus/setting/index.js +4 -2
  60. package/dist/esm/ag-grid-plus/storage/SchemeSyncManager.d.ts +2 -1
  61. package/dist/esm/ag-grid-plus/storage/SchemeSyncManager.js +11 -8
  62. package/dist/esm/ag-grid-plus/types.d.ts +2 -0
  63. package/dist/esm/array-table/index.js +31 -119
  64. package/dist/esm/draggableModal/index.d.ts +1 -1
  65. package/dist/esm/draggableModal/index.js +254 -27
  66. package/dist/esm/draggableModal/style.less +185 -12
  67. package/dist/umd/qc-ui.min.css +1 -1
  68. package/dist/umd/qc-ui.min.js +1 -1
  69. package/package.json +1 -1
  70. package/dist/cjs/ag-grid-plus/gridManager/index.d.ts +0 -7
  71. package/dist/cjs/ag-grid-plus/gridManager/index.js +0 -40
  72. package/dist/cjs/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.d.ts +0 -7
  73. package/dist/cjs/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.js +0 -32
  74. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.d.ts +0 -7
  75. package/dist/cjs/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.js +0 -32
  76. package/dist/cjs/ag-grid-plus/setting/diySetting/index.d.ts +0 -10
  77. package/dist/cjs/ag-grid-plus/setting/diySetting/index.js +0 -268
  78. package/dist/esm/ag-grid-plus/gridManager/index.d.ts +0 -7
  79. package/dist/esm/ag-grid-plus/gridManager/index.js +0 -35
  80. package/dist/esm/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.d.ts +0 -7
  81. package/dist/esm/ag-grid-plus/querySchemes/hooks/useQuerySchemes.refactored.js +0 -27
  82. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.d.ts +0 -7
  83. package/dist/esm/ag-grid-plus/schemes/hooks/useColumnSchemes.refactored.js +0 -27
  84. package/dist/esm/ag-grid-plus/setting/diySetting/index.d.ts +0 -10
  85. package/dist/esm/ag-grid-plus/setting/diySetting/index.js +0 -259
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 移动节点弹窗组件
3
+ * 用于选择目标父节点,支持移动到根级别或其他分组下
4
+ */
5
+
6
+ import React, { useMemo } from 'react';
7
+ import { Modal, Tree, message } from 'antd';
8
+ import { FolderOutlined, FileOutlined } from '@ant-design/icons';
9
+ import DraggableModal from "../../draggableModal";
10
+ var MoveNodeModal = function MoveNodeModal(_ref) {
11
+ var visible = _ref.visible,
12
+ currentNode = _ref.currentNode,
13
+ allItems = _ref.allItems,
14
+ onCancel = _ref.onCancel,
15
+ onConfirm = _ref.onConfirm;
16
+ /**
17
+ * 将扁平数据转换为 Tree 结构
18
+ */
19
+ var treeData = useMemo(function () {
20
+ if (!currentNode) return [];
21
+
22
+ // 构建节点Map
23
+ var nodeMap = new Map();
24
+ var rootNodes = [];
25
+
26
+ // 添加"根级别"选项
27
+ var rootOption = {
28
+ key: '__ROOT__',
29
+ title: '📌 移动到根级别',
30
+ selectable: true,
31
+ children: []
32
+ };
33
+
34
+ // 过滤掉当前节点及其所有后代节点
35
+ var getDescendantIds = function getDescendantIds(nodeId) {
36
+ var descendants = new Set([nodeId]);
37
+ var findDescendants = function findDescendants(id) {
38
+ allItems.forEach(function (item) {
39
+ if (item.parentId === id) {
40
+ descendants.add(item.id);
41
+ findDescendants(item.id);
42
+ }
43
+ });
44
+ };
45
+ findDescendants(nodeId);
46
+ return descendants;
47
+ };
48
+ var excludedIds = getDescendantIds(currentNode.id);
49
+ var validItems = allItems.filter(function (item) {
50
+ return !excludedIds.has(item.id);
51
+ });
52
+
53
+ // 第一遍:创建所有节点
54
+ validItems.forEach(function (item) {
55
+ var icon = item.type === 'group' ? /*#__PURE__*/React.createElement(FolderOutlined, null) : /*#__PURE__*/React.createElement(FileOutlined, null);
56
+
57
+ // 只有分组节点可选择(作为父节点)
58
+ var selectable = item.type === 'group';
59
+ nodeMap.set(item.id, {
60
+ key: item.id,
61
+ title: item.headerName,
62
+ icon: icon,
63
+ selectable: selectable,
64
+ children: [],
65
+ disabled: !selectable // 列节点禁用选择
66
+ });
67
+ });
68
+
69
+ // 第二遍:构建树形结构
70
+ validItems.forEach(function (item) {
71
+ var node = nodeMap.get(item.id);
72
+ if (!node) return;
73
+ if (!item.parentId) {
74
+ // 根级别的分组节点添加到rootOption的children中
75
+ if (item.type === 'group') {
76
+ rootOption.children.push(node);
77
+ }
78
+ } else {
79
+ var parent = nodeMap.get(item.parentId);
80
+ if (parent) {
81
+ parent.children.push(node);
82
+ }
83
+ }
84
+ });
85
+
86
+ // 始终返回rootOption
87
+ return [rootOption];
88
+ }, [currentNode, allItems]);
89
+
90
+ /**
91
+ * 处理选择节点
92
+ */
93
+ var handleSelect = function handleSelect(selectedKeys) {
94
+ if (selectedKeys.length === 0) return;
95
+ var selectedKey = selectedKeys[0];
96
+
97
+ // 特殊处理:选择"根级别"
98
+ if (selectedKey === '__ROOT__') {
99
+ Modal.confirm({
100
+ title: '确认移动',
101
+ content: "\u786E\u5B9A\u8981\u5C06\"".concat(currentNode === null || currentNode === void 0 ? void 0 : currentNode.headerName, "\"\u79FB\u52A8\u5230\u6839\u7EA7\u522B\u5417?"),
102
+ onOk: function onOk() {
103
+ onConfirm(undefined); // undefined 表示移动到根级别
104
+ }
105
+ });
106
+ return;
107
+ }
108
+
109
+ // 查找目标节点
110
+ var targetNode = allItems.find(function (item) {
111
+ return item.id === selectedKey;
112
+ });
113
+ if (!targetNode) {
114
+ message.error('未找到目标节点');
115
+ return;
116
+ }
117
+
118
+ // 确认对话框
119
+ Modal.confirm({
120
+ title: '确认移动',
121
+ content: "\u786E\u5B9A\u8981\u5C06\"".concat(currentNode === null || currentNode === void 0 ? void 0 : currentNode.headerName, "\"\u79FB\u52A8\u5230\"").concat(targetNode.headerName, "\"\u4E0B\u5417?"),
122
+ onOk: function onOk() {
123
+ onConfirm(selectedKey);
124
+ }
125
+ });
126
+ };
127
+ return /*#__PURE__*/React.createElement(DraggableModal, {
128
+ title: "\u79FB\u52A8\u8282\u70B9: ".concat((currentNode === null || currentNode === void 0 ? void 0 : currentNode.headerName) || ''),
129
+ open: visible,
130
+ onCancel: onCancel,
131
+ footer: null,
132
+ width: 500
133
+ }, /*#__PURE__*/React.createElement("div", {
134
+ style: {
135
+ marginBottom: 16,
136
+ color: '#666'
137
+ }
138
+ }, "\u8BF7\u9009\u62E9\u76EE\u6807\u7236\u8282\u70B9(\u53EA\u80FD\u9009\u62E9\u5206\u7EC4\u8282\u70B9):"), /*#__PURE__*/React.createElement(Tree, {
139
+ showIcon: true,
140
+ defaultExpandAll: true,
141
+ treeData: treeData,
142
+ onSelect: handleSelect,
143
+ selectable: true,
144
+ style: {
145
+ maxHeight: 400,
146
+ overflow: 'auto'
147
+ }
148
+ }));
149
+ };
150
+ export default MoveNodeModal;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 名称列渲染组件
3
+ * 用于在 ArrayTable 中展示带缩进的树形结构
4
+ */
5
+ import React from 'react';
6
+ import type { FlatColumnItem } from './columnGroupTypes';
7
+ interface NameColumnRendererProps {
8
+ value: string;
9
+ record: FlatColumnItem;
10
+ onChange: (value: string) => void;
11
+ allItems: FlatColumnItem[];
12
+ }
13
+ /**
14
+ * 名称列渲染组件
15
+ * 显示节点类型图标、层级缩进和可编辑的名称
16
+ */
17
+ declare const NameColumnRenderer: React.FC<NameColumnRendererProps>;
18
+ export default NameColumnRenderer;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * 名称列渲染组件
3
+ * 用于在 ArrayTable 中展示带缩进的树形结构
4
+ */
5
+
6
+ import React from 'react';
7
+ import { Input, Tag } from 'antd';
8
+ import { FolderOutlined, FileOutlined } from '@ant-design/icons';
9
+ /**
10
+ * 名称列渲染组件
11
+ * 显示节点类型图标、层级缩进和可编辑的名称
12
+ */
13
+ var NameColumnRenderer = function NameColumnRenderer(_ref) {
14
+ var value = _ref.value,
15
+ record = _ref.record,
16
+ _onChange = _ref.onChange,
17
+ allItems = _ref.allItems;
18
+ var type = record.type,
19
+ level = record.level,
20
+ _isNew = record._isNew;
21
+
22
+ // 计算缩进(每层 20px)
23
+ var indent = level * 20;
24
+
25
+ // 获取缩进符号
26
+ var getIndentSymbol = function getIndentSymbol() {
27
+ var _siblings;
28
+ if (level === 0) return '';
29
+
30
+ // 检查是否是父节点的最后一个子节点
31
+ var siblings = allItems.filter(function (item) {
32
+ return item.parentId === record.parentId;
33
+ });
34
+ var isLast = ((_siblings = siblings[siblings.length - 1]) === null || _siblings === void 0 ? void 0 : _siblings.id) === record.id;
35
+ return isLast ? '└─ ' : '├─ ';
36
+ };
37
+
38
+ // 节点类型图标
39
+ var NodeIcon = type === 'group' ? /*#__PURE__*/React.createElement(FolderOutlined, {
40
+ style: {
41
+ color: '#1890ff',
42
+ fontSize: 14
43
+ }
44
+ }) : /*#__PURE__*/React.createElement(FileOutlined, {
45
+ style: {
46
+ color: '#52c41a',
47
+ fontSize: 14
48
+ }
49
+ });
50
+ return /*#__PURE__*/React.createElement("div", {
51
+ style: {
52
+ paddingLeft: indent,
53
+ display: 'flex',
54
+ alignItems: 'center',
55
+ gap: 8
56
+ }
57
+ }, level > 0 && /*#__PURE__*/React.createElement("span", {
58
+ style: {
59
+ color: '#999',
60
+ fontFamily: 'monospace',
61
+ fontSize: 12,
62
+ flexShrink: 0
63
+ }
64
+ }, getIndentSymbol()), /*#__PURE__*/React.createElement("span", {
65
+ style: {
66
+ flexShrink: 0
67
+ }
68
+ }, NodeIcon), /*#__PURE__*/React.createElement(Tag, {
69
+ color: type === 'group' ? 'blue' : 'green',
70
+ style: {
71
+ margin: 0,
72
+ flexShrink: 0
73
+ }
74
+ }, type === 'group' ? '分组' : '列'), /*#__PURE__*/React.createElement(Input, {
75
+ value: value,
76
+ onChange: function onChange(e) {
77
+ return _onChange(e.target.value);
78
+ },
79
+ bordered: false,
80
+ placeholder: type === 'group' ? '请输入分组名称' : '请输入列名称',
81
+ style: {
82
+ flex: 1,
83
+ background: _isNew ? '#fff7e6' : 'transparent' // 新添加的节点高亮
84
+ }
85
+ }));
86
+ };
87
+ export default NameColumnRenderer;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * 表头分组配置类型定义
3
+ * 支持 AG-Grid 的单层和多层表头分组
4
+ */
5
+ /**
6
+ * 扁平化列配置项
7
+ * 用于 UI 展示和编辑,通过 parentId 和 level 维护层级关系
8
+ */
9
+ export interface FlatColumnItem {
10
+ /** 唯一标识 */
11
+ id: string;
12
+ /** 节点类型 */
13
+ type: 'group' | 'column';
14
+ /** 父节点 ID,undefined 表示根级别 */
15
+ parentId?: string;
16
+ /** 层级深度,0 为根级别 */
17
+ level: number;
18
+ /** 排序序号,用于维护节点顺序 */
19
+ order: number;
20
+ /** 显示名称 */
21
+ headerName: string;
22
+ /** AG-Grid 分组标识(仅分组类型) */
23
+ groupId?: string;
24
+ /** 子列是否必须保持一起(仅分组类型) */
25
+ marryChildren?: boolean;
26
+ /** 列字段名(仅列类型) */
27
+ field?: string;
28
+ /** 列宽 */
29
+ width?: number;
30
+ /** 是否隐藏 */
31
+ hide?: boolean;
32
+ /** 固定位置 */
33
+ pinned?: 'left' | 'right' | 'notPinned';
34
+ /** 单元格样式类 */
35
+ cellClass?: string;
36
+ /** 是否占满剩余空间 */
37
+ flex?: number;
38
+ /** 是否显示列过滤按钮 */
39
+ suppressHeaderFilterButton?: boolean;
40
+ /** 是否新添加的节点(用于高亮显示) */
41
+ _isNew?: boolean;
42
+ /** 分组是否折叠(仅分组类型,临时状态不持久化) */
43
+ _collapsed?: boolean;
44
+ }
45
+ /**
46
+ * 旧版本列配置(用于数据迁移)
47
+ */
48
+ export interface OldColumnState {
49
+ field: string;
50
+ headerName: string;
51
+ groupName?: string;
52
+ width?: number;
53
+ hide?: boolean;
54
+ pinned?: string;
55
+ cellClass?: string;
56
+ flex?: number;
57
+ suppressHeaderFilterButton?: boolean;
58
+ [key: string]: any;
59
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 表头分组配置工具函数
3
+ * 负责 Grid State 与扁平化配置之间的转换
4
+ */
5
+ import { ColDef, ColGroupDef } from 'ag-grid-community';
6
+ import type { FlatColumnItem, OldColumnState } from './columnGroupTypes';
7
+ /**
8
+ * 生成唯一 ID
9
+ */
10
+ export declare const generateId: () => string;
11
+ /**
12
+ * Grid State → 扁平化配置
13
+ * 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
14
+ *
15
+ * @param columnDefs AG-Grid 列定义数组
16
+ * @returns 扁平化配置数组
17
+ */
18
+ export declare function gridStateToFlatConfig(columnDefs: (ColDef | ColGroupDef)[]): FlatColumnItem[];
19
+ /**
20
+ * 扁平化配置 → Grid State
21
+ * 将扁平化数组重建为 AG-Grid 的树形结构
22
+ *
23
+ * @param flatConfig 扁平化配置数组
24
+ * @returns AG-Grid 列定义数组
25
+ */
26
+ export declare function flatConfigToGridState(flatConfig: FlatColumnItem[]): (ColDef | ColGroupDef)[];
27
+ /**
28
+ * 旧版本数据迁移
29
+ * 将旧的 { groupName } 结构迁移为新的树形结构
30
+ *
31
+ * @param oldState 旧版本列配置数组
32
+ * @returns 扁平化配置数组
33
+ */
34
+ export declare function migrateOldScheme(oldState: OldColumnState[]): FlatColumnItem[];
35
+ /**
36
+ * 查找节点的所有后代节点的最后一个索引
37
+ * 用于在正确位置插入新子节点
38
+ *
39
+ * @param items 扁平化配置数组
40
+ * @param parentId 父节点 ID
41
+ * @returns 最后一个后代节点的索引,如果没有后代则返回父节点索引
42
+ */
43
+ export declare function findLastDescendantIndex(items: FlatColumnItem[], parentId: string): number;
44
+ /**
45
+ * 检查节点是否是其父节点的最后一个子节点
46
+ * 用于渲染缩进符号(├─ 或 └─)
47
+ *
48
+ * @param items 扁平化配置数组
49
+ * @param item 当前节点
50
+ * @returns 是否是最后一个子节点
51
+ */
52
+ export declare function checkIsLastChild(items: FlatColumnItem[], item: FlatColumnItem): boolean;
53
+ /**
54
+ * 重新计算所有节点的 order
55
+ * 确保 order 连续且与数组索引一致
56
+ *
57
+ * @param items 扁平化配置数组
58
+ */
59
+ export declare function reorderItems(items: FlatColumnItem[]): void;
60
+ /**
61
+ * 检查是否包含旧版本的 groupName 字段
62
+ * 用于判断是否需要数据迁移
63
+ *
64
+ * @param data 列配置数据
65
+ * @returns 是否是旧版本数据
66
+ */
67
+ export declare function isOldSchemeData(data: any[]): boolean;
68
+ /**
69
+ * 扁平化配置 → AG-Grid Column State
70
+ * 将扁平化数组转换为 AG-Grid 的 columnState 格式,用于控制列的顺序和属性
71
+ *
72
+ * @param flatConfig 扁平化配置数组
73
+ * @returns AG-Grid columnState 数组
74
+ */
75
+ export declare function flatConfigToColumnState(flatConfig: FlatColumnItem[]): any[];
@@ -0,0 +1,265 @@
1
+ import _uniqueId from "lodash/uniqueId";
2
+ /**
3
+ * 表头分组配置工具函数
4
+ * 负责 Grid State 与扁平化配置之间的转换
5
+ */
6
+ /**
7
+ * 生成唯一 ID
8
+ */
9
+ export var generateId = function generateId() {
10
+ return _uniqueId('col_');
11
+ };
12
+
13
+ /**
14
+ * Grid State → 扁平化配置
15
+ * 将 AG-Grid 的树形结构转换为扁平化数组,用于 UI 展示和编辑
16
+ *
17
+ * @param columnDefs AG-Grid 列定义数组
18
+ * @returns 扁平化配置数组
19
+ */
20
+ export function gridStateToFlatConfig(columnDefs) {
21
+ var result = [];
22
+ var order = 0;
23
+
24
+ /**
25
+ * 递归遍历列定义树
26
+ */
27
+ function traverse(items, level, parentId) {
28
+ items.forEach(function (item) {
29
+ if (item.children && item.children.length > 0) {
30
+ // 这是一个分组节点
31
+ var groupId = generateId();
32
+ result.push({
33
+ id: groupId,
34
+ type: 'group',
35
+ parentId: parentId,
36
+ level: level,
37
+ order: order++,
38
+ headerName: item.headerName || '未命名分组',
39
+ groupId: item.groupId || item.field || generateId(),
40
+ marryChildren: item.marryChildren
41
+ });
42
+ // 递归处理子节点
43
+ traverse(item.children, level + 1, groupId);
44
+ } else {
45
+ // 这是一个列节点
46
+ result.push({
47
+ id: generateId(),
48
+ type: 'column',
49
+ parentId: parentId,
50
+ level: level,
51
+ order: order++,
52
+ field: item.field,
53
+ headerName: item.headerName || item.field || '未命名列',
54
+ width: item.width,
55
+ hide: item.hide,
56
+ pinned: item.pinned === null ? 'notPinned' : item.pinned,
57
+ cellClass: item.cellClass,
58
+ flex: item.flex,
59
+ suppressHeaderFilterButton: item.suppressHeaderFilterButton
60
+ });
61
+ }
62
+ });
63
+ }
64
+ traverse(columnDefs, 0);
65
+ return result;
66
+ }
67
+
68
+ /**
69
+ * 扁平化配置 → Grid State
70
+ * 将扁平化数组重建为 AG-Grid 的树形结构
71
+ *
72
+ * @param flatConfig 扁平化配置数组
73
+ * @returns AG-Grid 列定义数组
74
+ */
75
+ export function flatConfigToGridState(flatConfig) {
76
+ /**
77
+ * 递归构建树形结构
78
+ */
79
+ function buildTree(parentId) {
80
+ var children = flatConfig.filter(function (item) {
81
+ return item.parentId === parentId;
82
+ }).sort(function (a, b) {
83
+ return a.order - b.order;
84
+ });
85
+ return children.map(function (item) {
86
+ if (item.type === 'group') {
87
+ // 构建分组节点
88
+ return {
89
+ headerName: item.headerName,
90
+ groupId: item.groupId,
91
+ field: "".concat(item.groupId, "_header"),
92
+ // AG-Grid 要求有 field
93
+ marryChildren: item.marryChildren !== undefined ? item.marryChildren : true,
94
+ children: buildTree(item.id) // 递归构建子节点
95
+ };
96
+ } else {
97
+ // 构建列节点
98
+ return {
99
+ field: item.field,
100
+ headerName: item.headerName,
101
+ width: item.width,
102
+ hide: item.hide,
103
+ pinned: item.pinned === 'notPinned' ? null : item.pinned,
104
+ cellClass: item.cellClass,
105
+ flex: item.flex,
106
+ suppressHeaderFilterButton: item.suppressHeaderFilterButton
107
+ };
108
+ }
109
+ });
110
+ }
111
+ return buildTree();
112
+ }
113
+
114
+ /**
115
+ * 旧版本数据迁移
116
+ * 将旧的 { groupName } 结构迁移为新的树形结构
117
+ *
118
+ * @param oldState 旧版本列配置数组
119
+ * @returns 扁平化配置数组
120
+ */
121
+ export function migrateOldScheme(oldState) {
122
+ var groups = new Map();
123
+ var result = [];
124
+ var order = 0;
125
+
126
+ // 第一遍:创建所有分组节点
127
+ oldState.forEach(function (col) {
128
+ if (col.groupName && !groups.has(col.groupName)) {
129
+ var groupId = generateId();
130
+ groups.set(col.groupName, groupId);
131
+ result.push({
132
+ id: groupId,
133
+ type: 'group',
134
+ level: 0,
135
+ order: order++,
136
+ headerName: col.groupName,
137
+ groupId: groupId
138
+ });
139
+ }
140
+ });
141
+
142
+ // 第二遍:创建所有列节点
143
+ oldState.forEach(function (col) {
144
+ var parentId = col.groupName ? groups.get(col.groupName) : undefined;
145
+ result.push({
146
+ id: generateId(),
147
+ type: 'column',
148
+ parentId: parentId,
149
+ level: col.groupName ? 1 : 0,
150
+ order: order++,
151
+ field: col.field,
152
+ headerName: col.headerName,
153
+ width: col.width,
154
+ hide: col.hide,
155
+ pinned: col.pinned === null ? 'notPinned' : col.pinned,
156
+ cellClass: col.cellClass,
157
+ flex: col.flex,
158
+ suppressHeaderFilterButton: col.suppressHeaderFilterButton
159
+ });
160
+ });
161
+ return result;
162
+ }
163
+
164
+ /**
165
+ * 查找节点的所有后代节点的最后一个索引
166
+ * 用于在正确位置插入新子节点
167
+ *
168
+ * @param items 扁平化配置数组
169
+ * @param parentId 父节点 ID
170
+ * @returns 最后一个后代节点的索引,如果没有后代则返回父节点索引
171
+ */
172
+ export function findLastDescendantIndex(items, parentId) {
173
+ var parentIndex = items.findIndex(function (item) {
174
+ return item.id === parentId;
175
+ });
176
+ if (parentIndex === -1) return -1;
177
+ var lastIndex = parentIndex;
178
+
179
+ // 从父节点之后开始查找
180
+ for (var i = parentIndex + 1; i < items.length; i++) {
181
+ var item = items[i];
182
+ // 检查是否是后代节点(通过 level 判断)
183
+ if (item.level <= items[parentIndex].level) {
184
+ // 遇到同级或更高级别的节点,说明后代节点已结束
185
+ break;
186
+ }
187
+ lastIndex = i;
188
+ }
189
+ return lastIndex;
190
+ }
191
+
192
+ /**
193
+ * 检查节点是否是其父节点的最后一个子节点
194
+ * 用于渲染缩进符号(├─ 或 └─)
195
+ *
196
+ * @param items 扁平化配置数组
197
+ * @param item 当前节点
198
+ * @returns 是否是最后一个子节点
199
+ */
200
+ export function checkIsLastChild(items, item) {
201
+ if (!item.parentId) return false;
202
+ var siblings = items.filter(function (i) {
203
+ return i.parentId === item.parentId;
204
+ });
205
+ if (siblings.length === 0) return false;
206
+ var lastSibling = siblings[siblings.length - 1];
207
+ return lastSibling.id === item.id;
208
+ }
209
+
210
+ /**
211
+ * 重新计算所有节点的 order
212
+ * 确保 order 连续且与数组索引一致
213
+ *
214
+ * @param items 扁平化配置数组
215
+ */
216
+ export function reorderItems(items) {
217
+ items.forEach(function (item, index) {
218
+ item.order = index;
219
+ });
220
+ }
221
+
222
+ /**
223
+ * 检查是否包含旧版本的 groupName 字段
224
+ * 用于判断是否需要数据迁移
225
+ *
226
+ * @param data 列配置数据
227
+ * @returns 是否是旧版本数据
228
+ */
229
+ export function isOldSchemeData(data) {
230
+ return data.some(function (item) {
231
+ return item.groupName !== undefined && item.type === undefined;
232
+ });
233
+ }
234
+
235
+ /**
236
+ * 扁平化配置 → AG-Grid Column State
237
+ * 将扁平化数组转换为 AG-Grid 的 columnState 格式,用于控制列的顺序和属性
238
+ *
239
+ * @param flatConfig 扁平化配置数组
240
+ * @returns AG-Grid columnState 数组
241
+ */
242
+ export function flatConfigToColumnState(flatConfig) {
243
+ return flatConfig.filter(function (item) {
244
+ return item.type === 'column';
245
+ }) // 只处理列节点,分组不在 columnState 中
246
+ .sort(function (a, b) {
247
+ return a.order - b.order;
248
+ }) // 按 order 字段排序
249
+ .map(function (item) {
250
+ var state = {
251
+ colId: item.field // 使用 field 作为 colId
252
+ };
253
+
254
+ // 只设置有值的属性,undefined 表示不改变该属性
255
+ if (item.width !== undefined) state.width = item.width;
256
+ if (item.hide !== undefined) state.hide = item.hide;
257
+ if (item.flex !== undefined) state.flex = item.flex;
258
+
259
+ // pinned 特殊处理:'notPinned' -> null
260
+ if (item.pinned !== undefined) {
261
+ state.pinned = item.pinned === 'notPinned' ? null : item.pinned;
262
+ }
263
+ return state;
264
+ });
265
+ }
@@ -5,6 +5,7 @@ declare const Setting: (props: {
5
5
  gridApi?: GridApi<any> | undefined;
6
6
  gridApiState?: GridApi<any> | undefined;
7
7
  type?: string | undefined;
8
- onSaveColumnState: (state: any) => void;
8
+ onSaveColumnState?: ((state: any) => void) | undefined;
9
+ schemeManager?: any;
9
10
  }) => React.JSX.Element | null;
10
11
  export default Setting;
@@ -16,7 +16,8 @@ var Setting = function Setting(props) {
16
16
  gridApiState = props.gridApiState,
17
17
  onSaveColumnState = props.onSaveColumnState;
18
18
  var gridPlusContext = useContext(GridPlusContext);
19
- var schemeManager = gridPlusContext === null || gridPlusContext === void 0 ? void 0 : gridPlusContext.schemeManager;
19
+ // 优先使用外部传入的 schemeManager,否则使用 Context 中的
20
+ var schemeManager = props.schemeManager || (gridPlusContext === null || gridPlusContext === void 0 ? void 0 : gridPlusContext.schemeManager);
20
21
  var querySchemeManager = gridPlusContext === null || gridPlusContext === void 0 ? void 0 : gridPlusContext.querySchemeManager;
21
22
  var currentQueryOrder = (gridPlusContext === null || gridPlusContext === void 0 ? void 0 : gridPlusContext.currentQueryOrder) || [];
22
23
  var updateQueryOrder = gridPlusContext === null || gridPlusContext === void 0 ? void 0 : gridPlusContext.updateQueryOrder;
@@ -76,7 +77,8 @@ var Setting = function Setting(props) {
76
77
  onClose: function onClose() {
77
78
  return setColumnSettingVisible(false);
78
79
  },
79
- onSaveColumnState: onSaveColumnState,
80
+ onSaveColumnState: onSaveColumnState || function () {} // 保留兼容性,但 formArrayTable 不再使用
81
+ ,
80
82
  schemeManager: schemeManager,
81
83
  type: props.type
82
84
  }), querySchemeManager && gridApi && updateQueryOrder && /*#__PURE__*/React.createElement(QuerySchemesManager, {
@@ -116,7 +116,8 @@ export declare class SchemeSyncManager {
116
116
  private applyServerVersion;
117
117
  /**
118
118
  * 反序列化从后端接收的方案数据
119
- * 将 columnState 和 itemsOrder 从 JSON 字符串转换为数组
119
+ * 将 columnState(后端字段) 映射为 columnConfig 并从 JSON 字符串转换为数组
120
+ * 将 itemsOrder 从 JSON 字符串转换为数组
120
121
  */
121
122
  private deserializeSchemesData;
122
123
  /**