e-virt-table 0.0.3

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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/index.cjs.js +14 -0
  4. package/dist/index.cjs.js.map +1 -0
  5. package/dist/index.es.js +5422 -0
  6. package/dist/index.es.js.map +1 -0
  7. package/dist/index.umd.js +14 -0
  8. package/dist/index.umd.js.map +1 -0
  9. package/dist/lib/Autofill.d.ts +20 -0
  10. package/dist/lib/Autofill.js +185 -0
  11. package/dist/lib/Autofill.js.map +1 -0
  12. package/dist/lib/BaseCell.d.ts +22 -0
  13. package/dist/lib/BaseCell.js +111 -0
  14. package/dist/lib/BaseCell.js.map +1 -0
  15. package/dist/lib/Body.d.ts +29 -0
  16. package/dist/lib/Body.js +382 -0
  17. package/dist/lib/Body.js.map +1 -0
  18. package/dist/lib/Cell.d.ts +101 -0
  19. package/dist/lib/Cell.js +943 -0
  20. package/dist/lib/Cell.js.map +1 -0
  21. package/dist/lib/CellHeader.d.ts +64 -0
  22. package/dist/lib/CellHeader.js +355 -0
  23. package/dist/lib/CellHeader.js.map +1 -0
  24. package/dist/lib/Config.d.ts +106 -0
  25. package/dist/lib/Config.js +617 -0
  26. package/dist/lib/Config.js.map +1 -0
  27. package/dist/lib/Context.d.ts +123 -0
  28. package/dist/lib/Context.js +419 -0
  29. package/dist/lib/Context.js.map +1 -0
  30. package/dist/lib/Database.d.ts +228 -0
  31. package/dist/lib/Database.js +931 -0
  32. package/dist/lib/Database.js.map +1 -0
  33. package/dist/lib/EVirtTable.d.ts +61 -0
  34. package/dist/lib/EVirtTable.js +321 -0
  35. package/dist/lib/EVirtTable.js.map +1 -0
  36. package/dist/lib/Editor.d.ts +16 -0
  37. package/dist/lib/Editor.js +251 -0
  38. package/dist/lib/Editor.js.map +1 -0
  39. package/dist/lib/Empty.d.ts +7 -0
  40. package/dist/lib/Empty.js +45 -0
  41. package/dist/lib/Empty.js.map +1 -0
  42. package/dist/lib/EventBrowser.d.ts +17 -0
  43. package/dist/lib/EventBrowser.js +79 -0
  44. package/dist/lib/EventBrowser.js.map +1 -0
  45. package/dist/lib/EventBus.d.ts +12 -0
  46. package/dist/lib/EventBus.js +58 -0
  47. package/dist/lib/EventBus.js.map +1 -0
  48. package/dist/lib/EventTable.d.ts +26 -0
  49. package/dist/lib/EventTable.js +358 -0
  50. package/dist/lib/EventTable.js.map +1 -0
  51. package/dist/lib/Footer.d.ts +17 -0
  52. package/dist/lib/Footer.js +138 -0
  53. package/dist/lib/Footer.js.map +1 -0
  54. package/dist/lib/Header.d.ts +37 -0
  55. package/dist/lib/Header.js +482 -0
  56. package/dist/lib/Header.js.map +1 -0
  57. package/dist/lib/History.d.ts +27 -0
  58. package/dist/lib/History.js +106 -0
  59. package/dist/lib/History.js.map +1 -0
  60. package/dist/lib/Icons.d.ts +15 -0
  61. package/dist/lib/Icons.js +145 -0
  62. package/dist/lib/Icons.js.map +1 -0
  63. package/dist/lib/Overlayer.d.ts +10 -0
  64. package/dist/lib/Overlayer.js +267 -0
  65. package/dist/lib/Overlayer.js.map +1 -0
  66. package/dist/lib/Paint.d.ts +65 -0
  67. package/dist/lib/Paint.js +223 -0
  68. package/dist/lib/Paint.js.map +1 -0
  69. package/dist/lib/Row.d.ts +22 -0
  70. package/dist/lib/Row.js +125 -0
  71. package/dist/lib/Row.js.map +1 -0
  72. package/dist/lib/Scroller.d.ts +20 -0
  73. package/dist/lib/Scroller.js +448 -0
  74. package/dist/lib/Scroller.js.map +1 -0
  75. package/dist/lib/Selector.d.ts +38 -0
  76. package/dist/lib/Selector.js +532 -0
  77. package/dist/lib/Selector.js.map +1 -0
  78. package/dist/lib/Tooltip.d.ts +13 -0
  79. package/dist/lib/Tooltip.js +204 -0
  80. package/dist/lib/Tooltip.js.map +1 -0
  81. package/dist/lib/index.d.ts +3 -0
  82. package/dist/lib/index.js +4 -0
  83. package/dist/lib/index.js.map +1 -0
  84. package/dist/lib/types.d.ts +160 -0
  85. package/dist/lib/types.js +2 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/dist/lib/util.d.ts +15 -0
  88. package/dist/lib/util.js +113 -0
  89. package/dist/lib/util.js.map +1 -0
  90. package/package.json +37 -0
@@ -0,0 +1,931 @@
1
+ import Schema from 'async-validator';
2
+ import { generateShortUUID } from './util';
3
+ export default class Database {
4
+ constructor(ctx, options) {
5
+ Object.defineProperty(this, "loading", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: false
10
+ });
11
+ Object.defineProperty(this, "ctx", {
12
+ enumerable: true,
13
+ configurable: true,
14
+ writable: true,
15
+ value: void 0
16
+ });
17
+ Object.defineProperty(this, "data", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ Object.defineProperty(this, "columns", {
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true,
27
+ value: void 0
28
+ });
29
+ Object.defineProperty(this, "footerData", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: []
34
+ });
35
+ Object.defineProperty(this, "rowKeyMap", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: new Map()
40
+ });
41
+ Object.defineProperty(this, "colIndexKeyMap", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: new Map()
46
+ });
47
+ Object.defineProperty(this, "headerMap", {
48
+ enumerable: true,
49
+ configurable: true,
50
+ writable: true,
51
+ value: new Map()
52
+ });
53
+ Object.defineProperty(this, "rowIndexRowKeyMap", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: new Map()
58
+ });
59
+ Object.defineProperty(this, "checkboxKeyMap", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: new Map()
64
+ });
65
+ Object.defineProperty(this, "originalDataMap", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: new Map()
70
+ });
71
+ Object.defineProperty(this, "changedDataMap", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: new Map()
76
+ });
77
+ Object.defineProperty(this, "validationErrorMap", {
78
+ enumerable: true,
79
+ configurable: true,
80
+ writable: true,
81
+ value: new Map()
82
+ });
83
+ Object.defineProperty(this, "itemRowKeyMap", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: new WeakMap()
88
+ });
89
+ Object.defineProperty(this, "bufferData", {
90
+ enumerable: true,
91
+ configurable: true,
92
+ writable: true,
93
+ value: []
94
+ });
95
+ Object.defineProperty(this, "sumHeight", {
96
+ enumerable: true,
97
+ configurable: true,
98
+ writable: true,
99
+ value: 0
100
+ });
101
+ Object.defineProperty(this, "filterMethod", {
102
+ enumerable: true,
103
+ configurable: true,
104
+ writable: true,
105
+ value: void 0
106
+ });
107
+ Object.defineProperty(this, "positions", {
108
+ enumerable: true,
109
+ configurable: true,
110
+ writable: true,
111
+ value: []
112
+ }); //虚拟滚动位置
113
+ this.ctx = ctx;
114
+ const { data = [], columns = [], footerData = [] } = options;
115
+ this.data = data;
116
+ this.footerData = footerData;
117
+ this.columns = columns;
118
+ this.setLoading(true);
119
+ this.init();
120
+ }
121
+ init() {
122
+ this.clearBufferData();
123
+ this.rowKeyMap.clear();
124
+ this.checkboxKeyMap.clear();
125
+ this.colIndexKeyMap.clear();
126
+ this.rowIndexRowKeyMap.clear();
127
+ this.originalDataMap.clear();
128
+ this.changedDataMap.clear();
129
+ this.validationErrorMap.clear();
130
+ this.itemRowKeyMap = new WeakMap();
131
+ this.initData(this.data);
132
+ }
133
+ /**
134
+ * 清除缓存数据
135
+ */
136
+ clearBufferData() {
137
+ this.bufferData = [];
138
+ }
139
+ /**
140
+ * 初始化数据
141
+ * @param dataList
142
+ * @param level
143
+ */
144
+ initData(dataList, level = 0) {
145
+ dataList.forEach((item, index) => {
146
+ let hasChildren = false;
147
+ if (Array.isArray(item.children)) {
148
+ hasChildren = true;
149
+ this.initData(item.children, level + 1);
150
+ }
151
+ const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;
152
+ const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey
153
+ const rowKey = _rowKey !== undefined && _rowKey !== null ? _rowKey : generateShortUUID();
154
+ this.itemRowKeyMap.set(item, rowKey);
155
+ const height = item._height || CELL_HEIGHT;
156
+ const readonly = item._readonly;
157
+ let selectable = true;
158
+ if (typeof SELECTABLE_METHOD === 'function') {
159
+ const selectableMethod = SELECTABLE_METHOD;
160
+ selectable = selectableMethod;
161
+ }
162
+ // 存储checkboxKey,处理合并单元格选中
163
+ if (CHECKBOX_KEY) {
164
+ const checkboxKey = item[CHECKBOX_KEY];
165
+ if (this.checkboxKeyMap.has(checkboxKey)) {
166
+ const checkboxKeys = this.checkboxKeyMap.get(checkboxKey);
167
+ checkboxKeys.push(rowKey);
168
+ this.checkboxKeyMap.set(checkboxKey, checkboxKeys);
169
+ }
170
+ else {
171
+ this.checkboxKeyMap.set(checkboxKey, [rowKey]);
172
+ }
173
+ }
174
+ this.rowKeyMap.set(rowKey, {
175
+ readonly,
176
+ index,
177
+ rowIndex: index,
178
+ level,
179
+ height,
180
+ check: false,
181
+ selectable,
182
+ expand: DEFAULT_EXPAND_ALL,
183
+ expandLazy: false,
184
+ hasChildren,
185
+ expandLoading: false,
186
+ item,
187
+ });
188
+ });
189
+ }
190
+ /**
191
+ *
192
+ * @param rowKey 设置Row高度
193
+ * @param height
194
+ */
195
+ setRowHeight(rowIndex, height) {
196
+ const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
197
+ const row = this.rowKeyMap.get(rowKey);
198
+ row.height = height;
199
+ row.item._height = height;
200
+ this.clearBufferData(); // 清除缓存数据
201
+ }
202
+ /**
203
+ *
204
+ * @returns 获取转化平铺数据
205
+ */
206
+ getAllRowsData() {
207
+ let list = [];
208
+ const recursiveData = (data) => {
209
+ data.forEach((item) => {
210
+ list.push(item);
211
+ if (Array.isArray(item.children)) {
212
+ recursiveData(item.children);
213
+ }
214
+ });
215
+ };
216
+ recursiveData(this.data);
217
+ return list;
218
+ }
219
+ getColumns() {
220
+ return this.columns;
221
+ }
222
+ setColumns(columns) {
223
+ this.columns = columns;
224
+ this.clearBufferData();
225
+ }
226
+ setData(data) {
227
+ this.data = data;
228
+ if (this.columns.length) {
229
+ this.init();
230
+ }
231
+ }
232
+ /**
233
+ * 统一转化数据,给画body使用,包括过滤树状等,统一入口
234
+ * @returns
235
+ */
236
+ getData() {
237
+ if (this.bufferData.length > 0) {
238
+ return {
239
+ data: this.bufferData,
240
+ sumHeight: this.sumHeight,
241
+ positions: this.positions,
242
+ };
243
+ }
244
+ let list = [];
245
+ let rowIndex = 0;
246
+ this.sumHeight = 0;
247
+ this.positions = [];
248
+ const recursiveData = (data) => {
249
+ data.forEach((item) => {
250
+ list.push(item);
251
+ const rowKey = this.itemRowKeyMap.get(item);
252
+ const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);
253
+ const top = this.sumHeight;
254
+ this.sumHeight += height;
255
+ this.rowIndexRowKeyMap.set(rowIndex, rowKey);
256
+ this.positions.push({
257
+ top,
258
+ height,
259
+ bottom: this.sumHeight,
260
+ });
261
+ rowIndex += 1;
262
+ if (expand && hasChildren) {
263
+ recursiveData(item.children);
264
+ }
265
+ });
266
+ };
267
+ this.rowIndexRowKeyMap.clear();
268
+ let _data = this.data;
269
+ if (typeof this.filterMethod === 'function') {
270
+ _data = this.filterMethod(_data);
271
+ }
272
+ recursiveData(_data);
273
+ this.bufferData = list;
274
+ return {
275
+ data: list,
276
+ sumHeight: this.sumHeight,
277
+ positions: this.positions,
278
+ };
279
+ }
280
+ setFooterData(data) {
281
+ this.footerData = data;
282
+ }
283
+ getFooterData() {
284
+ return this.footerData;
285
+ }
286
+ /**
287
+ * 设置过滤方法
288
+ */
289
+ setFilterMethod(filterMethod) {
290
+ this.filterMethod = filterMethod;
291
+ }
292
+ /**
293
+ * 清空过滤方法
294
+ */
295
+ clearFilterMethod() {
296
+ this.filterMethod = undefined;
297
+ }
298
+ /**
299
+ * 根据rowKey,控制指定展开行
300
+ * @param rowKey
301
+ * @param expand
302
+ */
303
+ expandItem(rowKey, expand = false) {
304
+ const row = this.rowKeyMap.get(rowKey);
305
+ row.expand = expand;
306
+ this.clearBufferData(); // 清除缓存数据
307
+ this.ctx.emit('draw');
308
+ }
309
+ expandAll(expand) {
310
+ this.rowKeyMap.forEach((row) => {
311
+ row.expand = expand;
312
+ });
313
+ this.clearBufferData(); // 清除缓存数据
314
+ this.ctx.emit('draw');
315
+ }
316
+ expandLoading(rowKey, loading = false) {
317
+ const row = this.rowKeyMap.get(rowKey);
318
+ row.expandLoading = loading;
319
+ this.clearBufferData(); // 清除缓存数据
320
+ this.ctx.emit('draw');
321
+ }
322
+ setExpandChildren(rowKey, children) {
323
+ const row = this.rowKeyMap.get(rowKey);
324
+ row.expand = true;
325
+ row.expandLazy = true;
326
+ row.item.children = children;
327
+ this.initData(row.item.children, row.level + 1);
328
+ this.clearBufferData(); // 清除缓存数据
329
+ }
330
+ getIsExpandLoading(rowKey) {
331
+ const row = this.rowKeyMap.get(rowKey);
332
+ return row.expandLoading;
333
+ }
334
+ getIsExpandLazy(rowKey) {
335
+ const row = this.rowKeyMap.get(rowKey);
336
+ return row.expandLazy;
337
+ }
338
+ /**
339
+ * 根据rowKey获取是否展开
340
+ * @param rowKey
341
+ * @returns
342
+ */
343
+ getIsExpand(rowKey) {
344
+ const row = this.rowKeyMap.get(rowKey);
345
+ return row.expand;
346
+ }
347
+ /**
348
+ * 根据rowKey获取行数据
349
+ * @param rowKey
350
+ * @returns
351
+ */
352
+ getRowForRowKey(rowKey) {
353
+ return this.rowKeyMap.get(rowKey);
354
+ }
355
+ /**
356
+ * 根据rowIndex获取rowKey
357
+ * @param rowKey
358
+ * @returns
359
+ */
360
+ getRowKeyForRowIndex(rowIndex) {
361
+ return this.rowIndexRowKeyMap.get(rowIndex);
362
+ }
363
+ getRowKeyByItem(item) {
364
+ return this.itemRowKeyMap.get(item);
365
+ }
366
+ getRowIndexForRowKey(rowKey) {
367
+ return this.rowKeyMap.get(rowKey).index;
368
+ }
369
+ /**
370
+ * 根据rowIndex和colIndex获取单元格数据
371
+ * @param rowIndex
372
+ * @param colIndex
373
+ * @returns
374
+ */
375
+ getItemValueForRowIndexAndColIndex(rowIndex, colIndex) {
376
+ const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);
377
+ if (!has) {
378
+ return null;
379
+ }
380
+ const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
381
+ const key = this.colIndexKeyMap.get(colIndex);
382
+ return {
383
+ rowKey,
384
+ key,
385
+ value: this.getItemValue(rowKey, key),
386
+ };
387
+ }
388
+ /**
389
+ * 根据rowKey和key获取单元格数据
390
+ * @param rowKey
391
+ * @param key
392
+ * @returns
393
+ */
394
+ getItemValue(rowKey, key) {
395
+ const row = this.rowKeyMap.get(rowKey);
396
+ if (row && row.item) {
397
+ if (row.item[key] === undefined) {
398
+ return null;
399
+ }
400
+ return row.item[key];
401
+ }
402
+ return null;
403
+ }
404
+ /**
405
+ * 批量设置数据
406
+ * @param list
407
+ * @param history
408
+ * @returns
409
+ */
410
+ batchSetItemValue(list, history = false) {
411
+ let changeList = [];
412
+ const rowKeyList = new Set();
413
+ list.forEach((data) => {
414
+ const { value, rowKey, key } = data;
415
+ const { oldValue, newValue } = this.setItemValue(rowKey, key, value);
416
+ rowKeyList.add(rowKey);
417
+ changeList.push({
418
+ rowKey,
419
+ key,
420
+ oldValue,
421
+ newValue,
422
+ });
423
+ });
424
+ // 触发change事件
425
+ let rows = [];
426
+ const _changeList = changeList.map((item) => {
427
+ const row = this.ctx.database.getRowDataItemForRowKey(item.rowKey);
428
+ return {
429
+ rowKey: item.rowKey,
430
+ key: item.key,
431
+ value: item.newValue,
432
+ row,
433
+ };
434
+ });
435
+ rowKeyList.forEach((rowKey) => {
436
+ rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));
437
+ });
438
+ this.ctx.emit('change', _changeList, rows);
439
+ // 推历史记录
440
+ if (history) {
441
+ this.ctx.history.pushState({
442
+ changeList,
443
+ scrollX: this.ctx.scrollX,
444
+ scrollY: this.ctx.scrollY,
445
+ type: 'multiple',
446
+ });
447
+ }
448
+ return changeList;
449
+ }
450
+ /**
451
+ *设置单一数据
452
+ * @param rowKey
453
+ * @param key
454
+ * @param value
455
+ * @param history 是否添加历史记录
456
+ * @param reDraw 是否刷新重绘
457
+ * @param isEditor 是否是编辑器
458
+ * @returns
459
+ */
460
+ setItemValue(rowKey, key, value, history = false, reDraw = false, isEditor = false) {
461
+ // 异常情况
462
+ if (!this.rowKeyMap.has(rowKey)) {
463
+ return {};
464
+ }
465
+ const { item } = this.rowKeyMap.get(rowKey);
466
+ let oldValue = item[key];
467
+ // 只读返回旧值
468
+ if (this.ctx.database.getReadonly(rowKey, key)) {
469
+ return {
470
+ oldValue,
471
+ newValue: oldValue,
472
+ };
473
+ }
474
+ // 处理对象
475
+ if (item[key] !== null && typeof item[key] === 'object') {
476
+ oldValue = JSON.parse(JSON.stringify(item[key]));
477
+ }
478
+ const changeKey = `${rowKey}_${key}`;
479
+ // 设置原始值,只设置一次
480
+ if (!this.originalDataMap.has(changeKey)) {
481
+ this.originalDataMap.set(changeKey, oldValue);
482
+ }
483
+ this.changedDataMap.set(changeKey, value);
484
+ item[key] = value;
485
+ // 是否是否是编辑器进来的
486
+ if (isEditor) {
487
+ const row = this.ctx.database.getRowDataItemForRowKey(rowKey);
488
+ const changeItem = {
489
+ rowKey,
490
+ key,
491
+ value,
492
+ row,
493
+ };
494
+ this.ctx.emit('change', [changeItem], [row]);
495
+ this.ctx.emit('editChange', {
496
+ rowKey,
497
+ key,
498
+ oldValue,
499
+ value,
500
+ originalValue: this.originalDataMap.get(changeKey),
501
+ row,
502
+ });
503
+ }
504
+ // 迭代改变值事件,有改变一次值就触发,包括批量的
505
+ if (this.ctx.hasEvent('iterationChange')) {
506
+ this.ctx.emit('iterationChange', {
507
+ rowKey,
508
+ key,
509
+ oldValue,
510
+ value,
511
+ originalValue: this.originalDataMap.get(changeKey),
512
+ row: this.ctx.database.getRowDataItemForRowKey(rowKey),
513
+ });
514
+ }
515
+ // 添加历史记录
516
+ if (history) {
517
+ this.ctx.history.pushState({
518
+ type: 'single',
519
+ scrollX: this.ctx.scrollX,
520
+ scrollY: this.ctx.scrollY,
521
+ changeList: [
522
+ {
523
+ rowKey,
524
+ key,
525
+ oldValue,
526
+ newValue: value,
527
+ },
528
+ ],
529
+ });
530
+ }
531
+ // 重绘
532
+ if (reDraw) {
533
+ this.ctx.emit('draw');
534
+ }
535
+ return {
536
+ oldValue,
537
+ newValue: value,
538
+ };
539
+ }
540
+ /**
541
+ * 根据rowKey 获取行数据
542
+ * @param rowKey
543
+ * @returns
544
+ */
545
+ getRowDataItemForRowKey(rowKey) {
546
+ if (!this.rowKeyMap.has(rowKey)) {
547
+ return {};
548
+ }
549
+ const { item } = this.rowKeyMap.get(rowKey);
550
+ return item;
551
+ }
552
+ /**
553
+ *
554
+ * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key
555
+ * @param check
556
+ */
557
+ setRowSelectionByCheckboxKey(rowKey, check) {
558
+ const { CHECKBOX_KEY } = this.ctx.config;
559
+ if (CHECKBOX_KEY) {
560
+ if (!this.rowKeyMap.has(rowKey)) {
561
+ return false;
562
+ }
563
+ const { item } = this.rowKeyMap.get(rowKey);
564
+ const checkboxKey = item[CHECKBOX_KEY];
565
+ if (this.checkboxKeyMap.has(checkboxKey)) {
566
+ const rowKeys = this.checkboxKeyMap.get(checkboxKey);
567
+ rowKeys.forEach((rowKey) => {
568
+ const row = this.rowKeyMap.get(rowKey);
569
+ row.check = check;
570
+ });
571
+ }
572
+ }
573
+ }
574
+ /**
575
+ * 根据rowKey 取反选中
576
+ * @param rowKey
577
+ */
578
+ toggleRowSelection(rowKey) {
579
+ const row = this.rowKeyMap.get(rowKey);
580
+ row.check = !row.check;
581
+ this.setRowSelectionByCheckboxKey(rowKey, row.check);
582
+ this.ctx.emit('toggleRowSelection', row);
583
+ const rows = this.getSelectionRows();
584
+ this.ctx.emit('selectionChange', rows);
585
+ this.ctx.emit('draw');
586
+ }
587
+ /**
588
+ * 根据rowKey 设置选中状态
589
+ * @param rowKey
590
+ */
591
+ setRowSelection(rowKey, check) {
592
+ const row = this.rowKeyMap.get(rowKey);
593
+ row.check = check;
594
+ this.setRowSelectionByCheckboxKey(rowKey, row.check);
595
+ const rows = this.getSelectionRows();
596
+ this.ctx.emit('setRowSelection', rows);
597
+ this.ctx.emit('draw');
598
+ }
599
+ getSelectionRows() {
600
+ let rows = [];
601
+ this.rowKeyMap.forEach((row) => {
602
+ if (row.check) {
603
+ rows.push(row.item);
604
+ }
605
+ });
606
+ return rows;
607
+ }
608
+ /**
609
+ * 根据rowKey 获取选中状态
610
+ * @param rowKey
611
+ */
612
+ getRowSelection(rowKey) {
613
+ const { check } = this.rowKeyMap.get(rowKey);
614
+ return check;
615
+ }
616
+ /**
617
+ * 根据rowKey 获取选中状态
618
+ * @param rowKey
619
+ */
620
+ getRowSelectable(rowKey) {
621
+ const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);
622
+ if (typeof selectable === 'function') {
623
+ return selectable({
624
+ row: item,
625
+ rowIndex,
626
+ });
627
+ }
628
+ return selectable;
629
+ }
630
+ /**
631
+ * 全选
632
+ * @param rowKey
633
+ */
634
+ toggleAllSelection() {
635
+ this.rowKeyMap.forEach((row) => {
636
+ const _selectable = row.selectable;
637
+ if (typeof _selectable === 'function') {
638
+ const selectable = _selectable({
639
+ row: row.item,
640
+ rowIndex: row.rowIndex,
641
+ });
642
+ if (selectable) {
643
+ row.check = true;
644
+ }
645
+ }
646
+ else {
647
+ if (_selectable) {
648
+ row.check = true;
649
+ }
650
+ }
651
+ });
652
+ const rows = this.getSelectionRows();
653
+ this.ctx.emit('toggleAllSelection', rows);
654
+ this.ctx.emit('selectionChange', rows);
655
+ this.ctx.emit('draw');
656
+ }
657
+ /**
658
+ * 清除选中
659
+ * @param rowKey
660
+ */
661
+ clearSelection() {
662
+ this.rowKeyMap.forEach((row) => {
663
+ const _selectable = row.selectable;
664
+ if (typeof _selectable === 'function') {
665
+ const selectable = _selectable({
666
+ row: row.item,
667
+ rowIndex: row.rowIndex,
668
+ });
669
+ if (selectable) {
670
+ row.check = false;
671
+ }
672
+ }
673
+ else {
674
+ if (_selectable) {
675
+ row.check = false;
676
+ }
677
+ }
678
+ });
679
+ const rows = this.getSelectionRows();
680
+ this.ctx.emit('clearSelection');
681
+ this.ctx.emit('selectionChange', rows);
682
+ this.ctx.emit('draw');
683
+ }
684
+ /**
685
+ * 获取选中状态,表头用
686
+ * @param rowKey
687
+ */
688
+ getCheckedState() {
689
+ let total = 0;
690
+ let totalChecked = 0;
691
+ let totalSelectable = 0;
692
+ this.rowKeyMap.forEach((row) => {
693
+ total += 1;
694
+ if (row.check) {
695
+ totalChecked += 1;
696
+ }
697
+ const _selectable = row.selectable;
698
+ if (typeof _selectable === 'function') {
699
+ const selectable = _selectable({
700
+ row: row.item,
701
+ rowIndex: row.rowIndex,
702
+ });
703
+ if (selectable) {
704
+ totalSelectable += 1;
705
+ }
706
+ }
707
+ else {
708
+ if (_selectable) {
709
+ totalSelectable += 1;
710
+ }
711
+ }
712
+ });
713
+ const indeterminate = totalSelectable && totalSelectable > totalChecked && totalChecked > 0;
714
+ const selectable = totalSelectable !== 0;
715
+ const check = totalSelectable && totalSelectable === totalChecked;
716
+ return {
717
+ check,
718
+ indeterminate,
719
+ selectable,
720
+ };
721
+ }
722
+ /**
723
+ * 更新列索引
724
+ * @param list 表头末级列表
725
+ */
726
+ updateColIndexKeyMap(list = []) {
727
+ this.colIndexKeyMap.clear();
728
+ list.forEach((column) => {
729
+ this.colIndexKeyMap.set(column.colIndex, column.key);
730
+ });
731
+ }
732
+ /**
733
+ * 获取以改变数据
734
+ */
735
+ getChangedData() {
736
+ let list = [];
737
+ this.changedDataMap.forEach((value, key) => {
738
+ const originalValue = this.originalDataMap.get(key);
739
+ const rowKey = key.split('_')[0];
740
+ const colKey = key.split('_')[1];
741
+ if (originalValue !== value) {
742
+ list.push({
743
+ rowKey,
744
+ colKey,
745
+ originalValue,
746
+ row: this.rowKeyMap.get(rowKey),
747
+ value,
748
+ });
749
+ }
750
+ });
751
+ return list;
752
+ }
753
+ getChangedRows() {
754
+ const rowKeyList = new Set();
755
+ this.changedDataMap.forEach((value, key) => {
756
+ const originalValue = this.originalDataMap.get(key);
757
+ const rowKey = key.split('_')[0];
758
+ if (originalValue !== value) {
759
+ rowKeyList.add(rowKey);
760
+ }
761
+ });
762
+ let rows = [];
763
+ rowKeyList.forEach((rowKey) => {
764
+ rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));
765
+ });
766
+ return rows;
767
+ }
768
+ /**
769
+ * 获取改变值是否已经改变
770
+ * @param rowKey
771
+ * @param key
772
+ * @returns
773
+ */
774
+ isHasChangedData(rowKey, key) {
775
+ const changedKey = `${rowKey}_${key}`;
776
+ if (!this.changedDataMap.has(changedKey)) {
777
+ return false;
778
+ }
779
+ const originalValue = this.originalDataMap.get(changedKey);
780
+ const changedValue = this.changedDataMap.get(changedKey);
781
+ return originalValue !== changedValue;
782
+ }
783
+ getPositionForRowIndex(rowIndex) {
784
+ if (rowIndex < this.positions.length) {
785
+ return this.positions[rowIndex];
786
+ }
787
+ return {
788
+ height: 0,
789
+ top: 0,
790
+ bottom: 0,
791
+ };
792
+ }
793
+ setHeader(key, cellHeader) {
794
+ if (!key) {
795
+ return false;
796
+ }
797
+ this.headerMap.set(key, cellHeader);
798
+ return true;
799
+ }
800
+ getReadonly(rowKey, key) {
801
+ const row = this.rowKeyMap.get(rowKey);
802
+ const colHeader = this.headerMap.get(key);
803
+ const rowReadonly = row?.readonly;
804
+ const colReadonly = colHeader?.readonly;
805
+ const { CELL_READONLY_METHOD } = this.ctx.config;
806
+ // 自定义只读
807
+ if (typeof CELL_READONLY_METHOD === 'function') {
808
+ const cellReadonlyMethod = CELL_READONLY_METHOD;
809
+ const readonly = cellReadonlyMethod({
810
+ row: row.item,
811
+ rowIndex: row.rowIndex,
812
+ colIndex: colHeader.colIndex,
813
+ column: colHeader.column,
814
+ value: this.getItemValue(rowKey, key),
815
+ });
816
+ if (readonly !== undefined) {
817
+ return readonly;
818
+ }
819
+ }
820
+ return colReadonly || rowReadonly;
821
+ }
822
+ clearValidate() {
823
+ this.validationErrorMap.clear();
824
+ }
825
+ getValidator(rowKey, key) {
826
+ return new Promise((resolve) => {
827
+ const row = this.rowKeyMap.get(rowKey);
828
+ const colHeader = this.headerMap.get(key);
829
+ const { CELL_RULES_METHOD } = this.ctx.config;
830
+ const column = colHeader.column;
831
+ let rules = column.rules;
832
+ // 自定义只读
833
+ if (typeof CELL_RULES_METHOD === 'function') {
834
+ const cellRulesMethod = CELL_RULES_METHOD;
835
+ const _rules = cellRulesMethod({
836
+ row: row.item,
837
+ rowIndex: row.rowIndex,
838
+ colIndex: colHeader.colIndex,
839
+ column,
840
+ value: this.getItemValue(rowKey, key),
841
+ });
842
+ if (_rules) {
843
+ rules = _rules;
844
+ }
845
+ }
846
+ if (rules) {
847
+ let descriptor = {};
848
+ let data = {};
849
+ data[key] = this.getItemValue(rowKey, key);
850
+ if (Array.isArray(rules) && rules.length) {
851
+ const _rules = rules.map((item) => {
852
+ return {
853
+ ...item,
854
+ row: row.item,
855
+ column,
856
+ rowIndex: row.rowIndex,
857
+ colIndex: colHeader.colIndex,
858
+ };
859
+ });
860
+ descriptor[key] = _rules;
861
+ }
862
+ else {
863
+ descriptor[key] = {
864
+ ...rules,
865
+ row: row.item,
866
+ column,
867
+ rowIndex: row.rowIndex,
868
+ colIndex: colHeader.colIndex,
869
+ };
870
+ }
871
+ const validator = new Schema(descriptor);
872
+ validator
873
+ .validate(data)
874
+ .then(() => {
875
+ this.setValidationError(rowKey, key, []);
876
+ resolve([]);
877
+ })
878
+ .catch(({ errors }) => {
879
+ const _errors = errors.map((error) => ({
880
+ ...error,
881
+ column,
882
+ key,
883
+ row: row.item,
884
+ rowKey,
885
+ }));
886
+ this.setValidationError(rowKey, key, _errors);
887
+ resolve(_errors);
888
+ });
889
+ }
890
+ else {
891
+ resolve([]);
892
+ }
893
+ });
894
+ }
895
+ getHeightByRowIndexRowSpan(rowIndex, rowSpan) {
896
+ let sumHeight = 0;
897
+ for (let i = 0; i < rowSpan; i++) {
898
+ const position = this.positions[rowIndex + i];
899
+ if (position) {
900
+ sumHeight += position.height;
901
+ }
902
+ }
903
+ return sumHeight;
904
+ }
905
+ setLoading(loading) {
906
+ this.loading = loading;
907
+ this.ctx.emit('loadingChange', loading);
908
+ }
909
+ getLoading() {
910
+ return this.loading;
911
+ }
912
+ setValidationErrorByRowIndex(rowIndex, key, message) {
913
+ const rowKey = this.rowIndexRowKeyMap.get(rowIndex);
914
+ const _key = `${rowKey}_${key}`;
915
+ const errors = [
916
+ {
917
+ message,
918
+ },
919
+ ];
920
+ this.validationErrorMap.set(_key, errors);
921
+ }
922
+ setValidationError(rowKey, key, errors) {
923
+ const _key = `${rowKey}_${key}`;
924
+ this.validationErrorMap.set(_key, errors);
925
+ }
926
+ getValidationError(rowKey, key) {
927
+ const _key = `${rowKey}_${key}`;
928
+ return this.validationErrorMap.get(_key) || [];
929
+ }
930
+ }
931
+ //# sourceMappingURL=Database.js.map