e-virt-table 1.2.34 → 1.3.0

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 (52) hide show
  1. package/dist/index.cjs.js +5 -5
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.es.js +1772 -1165
  4. package/dist/index.es.js.map +1 -1
  5. package/dist/index.umd.js +5 -5
  6. package/dist/index.umd.js.map +1 -1
  7. package/dist/lib/Cell.js +1 -1
  8. package/dist/lib/Cell.js.map +1 -1
  9. package/dist/lib/CellHeader.d.ts +2 -1
  10. package/dist/lib/CellHeader.js +27 -9
  11. package/dist/lib/CellHeader.js.map +1 -1
  12. package/dist/lib/Config.d.ts +17 -1
  13. package/dist/lib/Config.js +72 -1
  14. package/dist/lib/Config.js.map +1 -1
  15. package/dist/lib/Context.d.ts +5 -0
  16. package/dist/lib/Context.js +25 -0
  17. package/dist/lib/Context.js.map +1 -1
  18. package/dist/lib/ContextMenu.d.ts +3 -5
  19. package/dist/lib/ContextMenu.js +172 -88
  20. package/dist/lib/ContextMenu.js.map +1 -1
  21. package/dist/lib/DOMTreeMenu.d.ts +44 -0
  22. package/dist/lib/DOMTreeMenu.js +348 -0
  23. package/dist/lib/DOMTreeMenu.js.map +1 -0
  24. package/dist/lib/Database.d.ts +13 -3
  25. package/dist/lib/Database.js +138 -24
  26. package/dist/lib/Database.js.map +1 -1
  27. package/dist/lib/EVirtTable.d.ts +6 -1
  28. package/dist/lib/EVirtTable.js +10 -2
  29. package/dist/lib/EVirtTable.js.map +1 -1
  30. package/dist/lib/EventBrowser.js +10 -0
  31. package/dist/lib/EventBrowser.js.map +1 -1
  32. package/dist/lib/EventTable.d.ts +1 -0
  33. package/dist/lib/EventTable.js +32 -0
  34. package/dist/lib/EventTable.js.map +1 -1
  35. package/dist/lib/Header.d.ts +11 -0
  36. package/dist/lib/Header.js +236 -14
  37. package/dist/lib/Header.js.map +1 -1
  38. package/dist/lib/Icons.d.ts +7 -1
  39. package/dist/lib/Icons.js +3 -1
  40. package/dist/lib/Icons.js.map +1 -1
  41. package/dist/lib/Selector.js +27 -16
  42. package/dist/lib/Selector.js.map +1 -1
  43. package/dist/lib/Tooltip.js +19 -0
  44. package/dist/lib/Tooltip.js.map +1 -1
  45. package/dist/lib/TreeUtil.d.ts +18 -0
  46. package/dist/lib/TreeUtil.js +85 -0
  47. package/dist/lib/TreeUtil.js.map +1 -0
  48. package/dist/lib/types.d.ts +21 -3
  49. package/dist/lib/util.d.ts +4 -2
  50. package/dist/lib/util.js +44 -8
  51. package/dist/lib/util.js.map +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1,348 @@
1
+ import { computePosition, autoUpdate, flip, shift, offset } from '@floating-ui/dom';
2
+ import { expandSvg } from './Icons';
3
+ export class DOMTreeMenu {
4
+ constructor(container, menuData = [], options = {}) {
5
+ Object.defineProperty(this, "container", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: void 0
10
+ });
11
+ Object.defineProperty(this, "menuData", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: void 0
16
+ });
17
+ Object.defineProperty(this, "onClick", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ Object.defineProperty(this, "activeSubmenus", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: new Set()
28
+ });
29
+ Object.defineProperty(this, "boundMouseEnterHandler", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: void 0
34
+ });
35
+ Object.defineProperty(this, "boundMouseLeaveHandler", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: void 0
40
+ });
41
+ Object.defineProperty(this, "boundClickHandler", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: void 0
46
+ });
47
+ this.container = container;
48
+ this.menuData = menuData;
49
+ this.onClick = options.onClick;
50
+ // 绑定事件处理器
51
+ this.boundMouseEnterHandler = (e) => this.handleMouseEvent(e, 'enter');
52
+ this.boundMouseLeaveHandler = (e) => this.handleMouseEvent(e, 'leave');
53
+ this.boundClickHandler = (e) => this.handleClick(e);
54
+ this.createMenu();
55
+ this.bindEvents();
56
+ }
57
+ createMenu() {
58
+ this.container.className = 'e-virt-table-main-menu';
59
+ // 确保菜单可见
60
+ this.container.style.display = 'block';
61
+ const mainMenu = document.createDocumentFragment();
62
+ this.menuData.forEach((item) => {
63
+ mainMenu.appendChild(this.createMenuItem(item));
64
+ });
65
+ this.container.appendChild(mainMenu);
66
+ }
67
+ createMenuItem(item, isSubmenu = false) {
68
+ const menuItem = this.createElement('div', isSubmenu ? 'e-virt-table-submenu-item' : 'e-virt-table-menu-item');
69
+ menuItem.setAttribute(isSubmenu ? 'data-submenu' : 'data-menu', item.value);
70
+ if (item.disabled)
71
+ menuItem.classList.add('disabled');
72
+ const contentContainer = this.createElement('div', 'menu-item-content');
73
+ if (item.icon) {
74
+ const iconContainer = this.createElement('span', 'menu-item-icon');
75
+ iconContainer.innerHTML = item.icon;
76
+ contentContainer.appendChild(iconContainer);
77
+ }
78
+ else {
79
+ contentContainer.classList.add('menu-item-no-icon');
80
+ }
81
+ const textSpan = this.createElement('span', 'menu-item-text');
82
+ textSpan.textContent = item.label;
83
+ contentContainer.appendChild(textSpan);
84
+ menuItem.appendChild(contentContainer);
85
+ if (item.children?.length) {
86
+ const arrowContainer = this.createElement('span', 'e-virt-table-menu-arrow');
87
+ arrowContainer.innerHTML = expandSvg;
88
+ menuItem.appendChild(arrowContainer);
89
+ const submenu = this.createSubmenu(item.children);
90
+ menuItem._submenu = submenu;
91
+ this.container.appendChild(submenu);
92
+ }
93
+ return menuItem;
94
+ }
95
+ createSubmenu(submenuData) {
96
+ const submenu = this.createElement('div', 'e-virt-table-submenu');
97
+ submenuData.forEach((item) => {
98
+ submenu.appendChild(this.createMenuItem(item, true));
99
+ });
100
+ return submenu;
101
+ }
102
+ createElement(tagName, className = '') {
103
+ const element = document.createElement(tagName);
104
+ if (className)
105
+ element.className = className;
106
+ return element;
107
+ }
108
+ bindEvents() {
109
+ this.container.addEventListener('mouseenter', this.boundMouseEnterHandler, true);
110
+ this.container.addEventListener('mouseleave', this.boundMouseLeaveHandler, true);
111
+ this.container.addEventListener('click', this.boundClickHandler);
112
+ }
113
+ handleMouseEvent(e, type) {
114
+ // 阻止事件冒泡,防止触发外部的鼠标事件
115
+ e.stopPropagation();
116
+ const target = e.target;
117
+ const menuItem = target.closest('.e-virt-table-menu-item, .e-virt-table-submenu-item');
118
+ if (menuItem &&
119
+ (this.container.contains(menuItem) || menuItem.classList.contains('e-virt-table-submenu-item'))) {
120
+ if (type === 'enter') {
121
+ this.handleHover(menuItem);
122
+ }
123
+ else {
124
+ this.handleLeave(menuItem);
125
+ }
126
+ }
127
+ }
128
+ handleHover(menuItem) {
129
+ if (menuItem.classList.contains('e-virt-table-menu-item')) {
130
+ this.container
131
+ .querySelectorAll('.e-virt-table-menu-item')
132
+ .forEach((item) => item.classList.remove('active'));
133
+ if (!menuItem.classList.contains('disabled')) {
134
+ menuItem.classList.add('active');
135
+ }
136
+ }
137
+ const submenu = menuItem._submenu || menuItem.querySelector('.e-virt-table-submenu');
138
+ if (submenu) {
139
+ this.showSubmenu(menuItem, submenu);
140
+ }
141
+ }
142
+ handleLeave(menuItem) {
143
+ const submenu = menuItem._submenu || menuItem.querySelector('.e-virt-table-submenu');
144
+ setTimeout(() => {
145
+ const submenuEl = submenu;
146
+ if (submenuEl && !submenuEl.matches(':hover') && !menuItem.matches(':hover')) {
147
+ this.hideSubmenu(submenuEl);
148
+ if (menuItem.classList.contains('e-virt-table-menu-item')) {
149
+ menuItem.classList.remove('active');
150
+ }
151
+ }
152
+ }, 150);
153
+ }
154
+ async showSubmenu(trigger, submenu) {
155
+ if (this.activeSubmenus.has(submenu))
156
+ return;
157
+ this.activeSubmenus.add(submenu);
158
+ submenu.classList.add('show');
159
+ const cleanup = autoUpdate(trigger, submenu, async () => {
160
+ const { x, y } = await computePosition(trigger, submenu, {
161
+ placement: 'right-start',
162
+ middleware: [offset(8), flip(), shift({ padding: 8 })],
163
+ });
164
+ Object.assign(submenu.style, {
165
+ left: `${x}px`,
166
+ top: `${y}px`,
167
+ });
168
+ });
169
+ submenu._cleanup = cleanup;
170
+ }
171
+ hideSubmenu(submenu) {
172
+ if (!this.activeSubmenus.has(submenu))
173
+ return;
174
+ this.activeSubmenus.delete(submenu);
175
+ submenu.classList.remove('show');
176
+ this.hideAllChildSubmenus(submenu);
177
+ const menuElement = submenu;
178
+ if (menuElement._cleanup) {
179
+ menuElement._cleanup();
180
+ delete menuElement._cleanup;
181
+ }
182
+ }
183
+ hideAllChildSubmenus(parentSubmenu) {
184
+ const childMenuItems = parentSubmenu.querySelectorAll('.e-virt-table-submenu-item');
185
+ childMenuItems.forEach((menuItem) => {
186
+ if (menuItem._submenu) {
187
+ const childSubmenu = menuItem._submenu;
188
+ if (this.activeSubmenus.has(childSubmenu)) {
189
+ this.activeSubmenus.delete(childSubmenu);
190
+ childSubmenu.classList.remove('show');
191
+ const menuElement = childSubmenu;
192
+ if (menuElement._cleanup) {
193
+ menuElement._cleanup();
194
+ delete menuElement._cleanup;
195
+ }
196
+ this.hideAllChildSubmenus(childSubmenu);
197
+ }
198
+ }
199
+ });
200
+ }
201
+ handleClick(e) {
202
+ // 阻止事件冒泡,防止触发外部的点击事件
203
+ e.stopPropagation();
204
+ const menuItem = e.target.closest('.e-virt-table-menu-item, .e-virt-table-submenu-item');
205
+ if (!menuItem)
206
+ return;
207
+ if (menuItem.classList.contains('disabled'))
208
+ return;
209
+ // 如果点击的是有子菜单的菜单项,先显示子菜单
210
+ if (menuItem.classList.contains('e-virt-table-menu-item')) {
211
+ const submenu = menuItem._submenu || menuItem.querySelector('.e-virt-table-submenu');
212
+ if (submenu) {
213
+ this.showSubmenu(menuItem, submenu);
214
+ return; // 不执行点击回调,只是显示子菜单
215
+ }
216
+ }
217
+ const menuValue = menuItem.getAttribute('data-menu') || menuItem?.getAttribute('data-submenu');
218
+ const itemData = this.findMenuItem(menuValue || '');
219
+ if (itemData) {
220
+ if (itemData.event) {
221
+ itemData.event(e, this.hide.bind(this));
222
+ }
223
+ if (this.onClick) {
224
+ this.onClick(itemData, menuValue || '');
225
+ }
226
+ }
227
+ }
228
+ findMenuItem(value, items = this.menuData) {
229
+ for (const item of items) {
230
+ if (item.value === value)
231
+ return item;
232
+ if (item.children) {
233
+ const found = this.findMenuItem(value, item.children);
234
+ if (found)
235
+ return found;
236
+ }
237
+ }
238
+ return null;
239
+ }
240
+ positionMenu(e) {
241
+ const virtualReference = {
242
+ getBoundingClientRect: () => ({
243
+ width: 0,
244
+ height: 0,
245
+ top: e.clientY,
246
+ left: e.clientX,
247
+ right: e.clientX,
248
+ bottom: e.clientY,
249
+ x: e.clientX,
250
+ y: e.clientY,
251
+ }),
252
+ contextElement: document.body,
253
+ };
254
+ autoUpdate(virtualReference, this.container, () => {
255
+ computePosition(virtualReference, this.container, {
256
+ placement: 'right-start',
257
+ middleware: [offset(), shift(), flip()],
258
+ }).then(({ x, y }) => {
259
+ if (this.container) {
260
+ Object.assign(this.container.style, {
261
+ left: `${x}px`,
262
+ top: `${y}px`,
263
+ });
264
+ }
265
+ });
266
+ });
267
+ }
268
+ hide() {
269
+ // 隐藏菜单
270
+ this.cleanupAllSubmenus(this.container);
271
+ this.container.style.display = 'none';
272
+ }
273
+ destroy() {
274
+ // 移除事件监听器
275
+ this.container.removeEventListener('mouseenter', this.boundMouseEnterHandler, true);
276
+ this.container.removeEventListener('mouseleave', this.boundMouseLeaveHandler, true);
277
+ this.container.removeEventListener('click', this.boundClickHandler);
278
+ // 递归清理所有子菜单
279
+ this.cleanupAllSubmenus(this.container);
280
+ // 隐藏菜单
281
+ this.container.style.display = 'none';
282
+ // 清理容器
283
+ this.container.replaceChildren();
284
+ }
285
+ /**
286
+ * 删除指定值的菜单项
287
+ * @param value 要删除的菜单项的值
288
+ * @returns 是否成功删除
289
+ */
290
+ removeMenuItem(value) {
291
+ // 查找要删除的菜单项
292
+ const menuItem = this.container.querySelector(`[data-menu="${value}"]`);
293
+ if (!menuItem) {
294
+ return false;
295
+ }
296
+ // 如果菜单项有子菜单,先清理子菜单
297
+ const submenu = menuItem.querySelector('.e-virt-table-submenu');
298
+ if (submenu) {
299
+ this.cleanupSubmenuRecursively(submenu);
300
+ }
301
+ // 从 DOM 中移除菜单项
302
+ menuItem.remove();
303
+ return true;
304
+ }
305
+ /**
306
+ * 删除指定值的子菜单项
307
+ * @param value 要删除的子菜单项的值
308
+ * @returns 是否成功删除
309
+ */
310
+ removeSubMenuItem(value) {
311
+ // 查找要删除的子菜单项
312
+ const subMenuItem = this.container.querySelector(`[data-submenu="${value}"]`);
313
+ if (!subMenuItem) {
314
+ return false;
315
+ }
316
+ // 从 DOM 中移除子菜单项
317
+ subMenuItem.remove();
318
+ return true;
319
+ }
320
+ cleanupAllSubmenus(container) {
321
+ // 清理所有菜单项的子菜单
322
+ const menuItems = container.querySelectorAll('.e-virt-table-menu-item');
323
+ menuItems.forEach((menuItem) => {
324
+ if (menuItem._submenu) {
325
+ this.cleanupSubmenuRecursively(menuItem._submenu);
326
+ menuItem._submenu = undefined;
327
+ }
328
+ });
329
+ }
330
+ cleanupSubmenuRecursively(submenu) {
331
+ // 清理当前子菜单的清理函数
332
+ const menuElement = submenu;
333
+ if (menuElement._cleanup) {
334
+ menuElement._cleanup();
335
+ delete menuElement._cleanup;
336
+ }
337
+ // 递归清理子菜单中的子菜单
338
+ const childMenuItems = submenu.querySelectorAll('.e-virt-table-submenu-item');
339
+ childMenuItems.forEach((menuItem) => {
340
+ if (menuItem._submenu) {
341
+ this.cleanupSubmenuRecursively(menuItem._submenu);
342
+ }
343
+ });
344
+ // 从 DOM 中移除子菜单
345
+ submenu.remove();
346
+ }
347
+ }
348
+ //# sourceMappingURL=DOMTreeMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DOMTreeMenu.js","sourceRoot":"","sources":["../../src/DOMTreeMenu.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type CellHeader from './CellHeader';
2
2
  import { ValidateResult } from './Validator';
3
3
  import type Context from './Context';
4
- import type { ChangeItem, Column, FilterMethod, Position, EVirtTableOptions, SpanInfo, HistoryAction } from './types';
4
+ import type { ChangeItem, Column, FilterMethod, Position, EVirtTableOptions, SpanInfo, HistoryAction, CustomHeader, Fixed } from './types';
5
5
  import Cell from './Cell';
6
6
  export default class Database {
7
7
  private ctx;
@@ -21,6 +21,8 @@ export default class Database {
21
21
  private validationErrorMap;
22
22
  private itemRowKeyMap;
23
23
  private bufferData;
24
+ private originalColumns;
25
+ private customHeader;
24
26
  overlayerAutoHeightMap: Map<string, number>;
25
27
  private bufferCheckState;
26
28
  private sumHeight;
@@ -58,8 +60,8 @@ export default class Database {
58
60
  * @returns 获取转化平铺数据
59
61
  */
60
62
  getAllRowsData(): any[];
61
- private filterColumns;
62
- getColumns(): Column[];
63
+ private generateColumns;
64
+ getColumns(): any[];
63
65
  setColumns(columns: Column[]): void;
64
66
  setData(data: any[]): void;
65
67
  /**
@@ -301,4 +303,12 @@ export default class Database {
301
303
  setOverlayerAutoHeightMap(map: Map<string, number>): void;
302
304
  getOverlayerAutoHeightMap(): Map<string, number>;
303
305
  getOverlayerAutoHeight(rowIndex: number, colIndex: number): number;
306
+ setCustomHeader(customHeader: CustomHeader, ignoreEmit?: boolean): void;
307
+ resetCustomHeader(): void;
308
+ getCustomHeader(): CustomHeader;
309
+ setCustomHeaderResizableData(key: string, width: number): void;
310
+ setCustomHeaderHideData(keys: string[], hide: boolean): void;
311
+ setCustomHeaderFixedData(keys: string[], fixed: Fixed | ''): void;
312
+ setOriginalColumns(columns: Column[]): void;
313
+ clearCustomHeaderInvalidValues(columns: Column[]): CustomHeader;
304
314
  }
@@ -1,5 +1,5 @@
1
1
  import Validator from './Validator';
2
- import { generateShortUUID, toLeaf, compareDates } from './util';
2
+ import { generateShortUUID, toLeaf, compareDates, deepClone } from './util';
3
3
  import Cell from './Cell';
4
4
  export default class Database {
5
5
  constructor(ctx, options) {
@@ -105,6 +105,23 @@ export default class Database {
105
105
  writable: true,
106
106
  value: []
107
107
  });
108
+ Object.defineProperty(this, "originalColumns", {
109
+ enumerable: true,
110
+ configurable: true,
111
+ writable: true,
112
+ value: []
113
+ });
114
+ Object.defineProperty(this, "customHeader", {
115
+ enumerable: true,
116
+ configurable: true,
117
+ writable: true,
118
+ value: {
119
+ fixedData: {},
120
+ sortData: {},
121
+ hideData: {},
122
+ resizableData: {},
123
+ }
124
+ });
108
125
  Object.defineProperty(this, "overlayerAutoHeightMap", {
109
126
  enumerable: true,
110
127
  configurable: true,
@@ -151,6 +168,7 @@ export default class Database {
151
168
  this.data = data;
152
169
  this.footerData = footerData;
153
170
  this.columns = columns;
171
+ this.originalColumns = deepClone(columns);
154
172
  this.init();
155
173
  }
156
174
  // 初始化默认不忽略清空改变值和校验map
@@ -328,24 +346,34 @@ export default class Database {
328
346
  recursiveData(this.data);
329
347
  return list;
330
348
  }
331
- filterColumns(columns) {
332
- return columns.reduce((acc, column) => {
333
- // 检查当前列的 hide 属性
334
- const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;
335
- // 如果当前列不应该隐藏,则添加到结果中
336
- if (!shouldHide) {
337
- const newColumn = { ...column }; // 复制当前列
338
- // 递归处理子列
339
- if (newColumn.children && Array.isArray(newColumn.children)) {
340
- newColumn.children = this.filterColumns(newColumn.children);
349
+ generateColumns(columns) {
350
+ const _generateColumns = (columns) => {
351
+ return columns.map((column) => {
352
+ if (column.children && Array.isArray(column.children)) {
353
+ column.children = _generateColumns(column.children);
341
354
  }
342
- acc.push(newColumn);
343
- }
344
- return acc;
345
- }, []);
355
+ const dataMap = {
356
+ hide: this.customHeader?.hideData?.[column.key],
357
+ fixed: this.customHeader?.fixedData?.[column.key],
358
+ sort: this.customHeader?.sortData?.[column.key],
359
+ width: this.customHeader?.resizableData?.[column.key],
360
+ };
361
+ const obj = {};
362
+ for (const [key, value] of Object.entries(dataMap)) {
363
+ if (value !== undefined)
364
+ obj[key] = value;
365
+ }
366
+ return {
367
+ ...column,
368
+ ...obj,
369
+ };
370
+ });
371
+ };
372
+ return _generateColumns(columns);
346
373
  }
347
374
  getColumns() {
348
- return this.filterColumns(this.columns);
375
+ const _columns = deepClone(this.columns);
376
+ return this.generateColumns(_columns);
349
377
  }
350
378
  setColumns(columns) {
351
379
  this.columns = columns;
@@ -951,31 +979,31 @@ export default class Database {
951
979
  // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选
952
980
  // 父项选中的情况点击清空父项选择和所有子项选择,其他情况点击父项,勾选父项和所有子项选择(递归)
953
981
  if (treeState.checked && !treeState.indeterminate) {
954
- // 如果已全选,则取消选中
955
- this.setRowSelection(rowKey, false, false);
956
982
  // 递归取消所有子项
957
983
  this.clearTreeSelectionRecursive(rowKey);
984
+ // 如果已全选,则取消选中
985
+ this.setRowSelection(rowKey, false, false);
958
986
  }
959
987
  else {
960
- // 如果未选中或半选,则选中
961
- this.setRowSelection(rowKey, true, false);
962
988
  // 递归选中所有子项
963
989
  this.selectTreeSelectionRecursive(rowKey);
990
+ // 如果未选中或半选,则选中
991
+ this.setRowSelection(rowKey, true, false);
964
992
  }
965
993
  }
966
994
  else if (mode === 'cautious') {
967
995
  // cautious模式:交互上相同,但是半选是不算在数据里面的
968
996
  if (treeState.checked && !treeState.indeterminate) {
969
- // 如果已全选,则取消选中
970
- this.setRowSelection(rowKey, false, false);
971
997
  // 递归取消所有子项
972
998
  this.clearTreeSelectionRecursive(rowKey);
999
+ // 如果已全选,则取消选中
1000
+ this.setRowSelection(rowKey, false, false);
973
1001
  }
974
1002
  else {
975
- // 如果未选中或半选,则选中
976
- this.setRowSelection(rowKey, true, false);
977
1003
  // 递归选中所有子项
978
1004
  this.selectTreeSelectionRecursive(rowKey);
1005
+ // 如果未选中或半选,则选中
1006
+ this.setRowSelection(rowKey, true, false);
979
1007
  }
980
1008
  }
981
1009
  else if (mode === 'strictly') {
@@ -1821,5 +1849,91 @@ export default class Database {
1821
1849
  const height = this.overlayerAutoHeightMap.get(key) || 0;
1822
1850
  return height;
1823
1851
  }
1852
+ setCustomHeader(customHeader, ignoreEmit = false) {
1853
+ ['fixedData', 'sortData', 'hideData', 'resizableData'].forEach((key) => {
1854
+ const value = customHeader[key];
1855
+ if (value !== undefined) {
1856
+ this.customHeader[key] = value;
1857
+ }
1858
+ });
1859
+ if (!ignoreEmit) {
1860
+ const obj = this.clearCustomHeaderInvalidValues(this.originalColumns);
1861
+ this.ctx.emit('customHeaderChange', obj);
1862
+ }
1863
+ }
1864
+ resetCustomHeader() {
1865
+ this.customHeader = {};
1866
+ this.columns = this.originalColumns;
1867
+ this.init(false);
1868
+ this.ctx.emit('resetHeader');
1869
+ this.ctx.emit('customHeaderChange', this.customHeader);
1870
+ }
1871
+ getCustomHeader() {
1872
+ return this.customHeader;
1873
+ }
1874
+ setCustomHeaderResizableData(key, width) {
1875
+ // 统一设置方法
1876
+ let { resizableData = {} } = this.customHeader;
1877
+ resizableData[key] = width;
1878
+ this.setCustomHeader({
1879
+ resizableData,
1880
+ });
1881
+ }
1882
+ setCustomHeaderHideData(keys, hide) {
1883
+ let { hideData = {} } = this.customHeader;
1884
+ keys.forEach((key) => {
1885
+ hideData[key] = hide;
1886
+ });
1887
+ this.setCustomHeader({
1888
+ hideData,
1889
+ });
1890
+ this.init(false);
1891
+ this.ctx.emit('resetHeader');
1892
+ }
1893
+ setCustomHeaderFixedData(keys, fixed) {
1894
+ let { fixedData = {} } = this.customHeader;
1895
+ keys.forEach((key) => {
1896
+ fixedData[key] = fixed;
1897
+ });
1898
+ this.setCustomHeader({
1899
+ fixedData,
1900
+ });
1901
+ this.init(false);
1902
+ this.ctx.emit('resetHeader');
1903
+ }
1904
+ setOriginalColumns(columns) {
1905
+ this.originalColumns = columns;
1906
+ }
1907
+ // 递归处理
1908
+ clearCustomHeaderInvalidValues(columns) {
1909
+ const clearCustomHeaderInvalidValues = (columns, customHeader = {}) => {
1910
+ columns.forEach((column) => {
1911
+ if (column.children && column.children.length > 0) {
1912
+ clearCustomHeaderInvalidValues(column.children, customHeader);
1913
+ }
1914
+ // 用一个小的 helper 函数,减少重复代码
1915
+ const assignIfDifferent = (field, columnValue) => {
1916
+ const value = this.customHeader[field]?.[column.key];
1917
+ if (value !== undefined && value !== columnValue) {
1918
+ if (!customHeader[field]) {
1919
+ customHeader[field] = {};
1920
+ }
1921
+ customHeader[field][column.key] = value;
1922
+ // 如果固定源数据为空,则删除
1923
+ if (field === 'fixedData' && !value && !columnValue) {
1924
+ delete customHeader[field]?.[column.key];
1925
+ }
1926
+ }
1927
+ };
1928
+ assignIfDifferent('fixedData', column.fixed);
1929
+ assignIfDifferent('sortData', column.sort);
1930
+ assignIfDifferent('hideData', column.hide);
1931
+ assignIfDifferent('resizableData', column.width);
1932
+ });
1933
+ };
1934
+ let obj = {};
1935
+ clearCustomHeaderInvalidValues(columns, obj);
1936
+ return obj;
1937
+ }
1824
1938
  }
1825
1939
  //# sourceMappingURL=Database.js.map