vxe-table 3.15.5 → 3.15.7

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 (171) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/ar-EG.js +3 -2
  4. package/es/locale/lang/de-DE.js +3 -2
  5. package/es/locale/lang/en-US.js +2 -1
  6. package/es/locale/lang/es-ES.js +3 -2
  7. package/es/locale/lang/fr-FR.js +2 -1
  8. package/es/locale/lang/hu-HU.js +2 -1
  9. package/es/locale/lang/hy-AM.js +2 -1
  10. package/es/locale/lang/id-ID.js +2 -1
  11. package/es/locale/lang/it-IT.js +2 -1
  12. package/es/locale/lang/ja-JP.js +2 -1
  13. package/es/locale/lang/ko-KR.js +2 -1
  14. package/es/locale/lang/nb-NO.js +2 -1
  15. package/es/locale/lang/pt-BR.js +2 -1
  16. package/es/locale/lang/ru-RU.js +2 -1
  17. package/es/locale/lang/th-TH.js +2 -1
  18. package/es/locale/lang/ug-CN.js +2 -1
  19. package/es/locale/lang/uk-UA.js +2 -1
  20. package/es/locale/lang/vi-VN.js +2 -1
  21. package/es/locale/lang/zh-CHT.js +2 -1
  22. package/es/locale/lang/zh-CN.js +2 -1
  23. package/es/style.css +1 -1
  24. package/es/style.min.css +1 -1
  25. package/es/table/module/custom/mixin.js +62 -37
  26. package/es/table/module/custom/panel.js +7 -7
  27. package/es/table/module/export/mixin.js +13 -12
  28. package/es/table/module/keyboard/mixin.js +3 -2
  29. package/es/table/src/body.js +49 -16
  30. package/es/table/src/cell.js +137 -45
  31. package/es/table/src/column.js +2 -0
  32. package/es/table/src/columnInfo.js +1 -0
  33. package/es/table/src/methods.js +983 -495
  34. package/es/table/src/props.js +9 -7
  35. package/es/table/src/table.js +108 -35
  36. package/es/table/style.css +70 -40
  37. package/es/table/style.min.css +1 -1
  38. package/es/ui/index.js +13 -1
  39. package/es/ui/src/dom.js +3 -0
  40. package/es/ui/src/log.js +1 -1
  41. package/es/vxe-table/style.css +70 -40
  42. package/es/vxe-table/style.min.css +1 -1
  43. package/lib/index.css +1 -1
  44. package/lib/index.min.css +1 -1
  45. package/lib/index.umd.js +1735 -858
  46. package/lib/index.umd.min.js +1 -1
  47. package/lib/locale/lang/ar-EG.js +3 -2
  48. package/lib/locale/lang/ar-EG.min.js +1 -1
  49. package/lib/locale/lang/de-DE.js +3 -2
  50. package/lib/locale/lang/de-DE.min.js +1 -1
  51. package/lib/locale/lang/en-US.js +2 -1
  52. package/lib/locale/lang/en-US.min.js +1 -1
  53. package/lib/locale/lang/en-US.umd.js +2 -1
  54. package/lib/locale/lang/es-ES.js +3 -2
  55. package/lib/locale/lang/es-ES.min.js +1 -1
  56. package/lib/locale/lang/es-ES.umd.js +3 -2
  57. package/lib/locale/lang/fr-FR.js +2 -1
  58. package/lib/locale/lang/fr-FR.min.js +1 -1
  59. package/lib/locale/lang/hu-HU.js +2 -1
  60. package/lib/locale/lang/hu-HU.min.js +1 -1
  61. package/lib/locale/lang/hu-HU.umd.js +2 -1
  62. package/lib/locale/lang/hy-AM.js +2 -1
  63. package/lib/locale/lang/hy-AM.min.js +1 -1
  64. package/lib/locale/lang/id-ID.js +2 -1
  65. package/lib/locale/lang/id-ID.min.js +1 -1
  66. package/lib/locale/lang/it-IT.js +2 -1
  67. package/lib/locale/lang/it-IT.min.js +1 -1
  68. package/lib/locale/lang/ja-JP.js +2 -1
  69. package/lib/locale/lang/ja-JP.min.js +1 -1
  70. package/lib/locale/lang/ja-JP.umd.js +2 -1
  71. package/lib/locale/lang/ko-KR.js +2 -1
  72. package/lib/locale/lang/ko-KR.min.js +1 -1
  73. package/lib/locale/lang/ko-KR.umd.js +2 -1
  74. package/lib/locale/lang/nb-NO.js +2 -1
  75. package/lib/locale/lang/nb-NO.min.js +1 -1
  76. package/lib/locale/lang/pt-BR.js +2 -1
  77. package/lib/locale/lang/pt-BR.min.js +1 -1
  78. package/lib/locale/lang/pt-BR.umd.js +2 -1
  79. package/lib/locale/lang/ru-RU.js +2 -1
  80. package/lib/locale/lang/ru-RU.min.js +1 -1
  81. package/lib/locale/lang/ru-RU.umd.js +2 -1
  82. package/lib/locale/lang/th-TH.js +2 -1
  83. package/lib/locale/lang/th-TH.min.js +1 -1
  84. package/lib/locale/lang/ug-CN.js +2 -1
  85. package/lib/locale/lang/ug-CN.min.js +1 -1
  86. package/lib/locale/lang/uk-UA.js +2 -1
  87. package/lib/locale/lang/uk-UA.min.js +1 -1
  88. package/lib/locale/lang/uk-UA.umd.js +2 -1
  89. package/lib/locale/lang/vi-VN.js +2 -1
  90. package/lib/locale/lang/vi-VN.min.js +1 -1
  91. package/lib/locale/lang/zh-CHT.js +2 -1
  92. package/lib/locale/lang/zh-CHT.min.js +1 -1
  93. package/lib/locale/lang/zh-CHT.umd.js +2 -1
  94. package/lib/locale/lang/zh-CN.js +2 -1
  95. package/lib/locale/lang/zh-CN.min.js +1 -1
  96. package/lib/locale/lang/zh-CN.umd.js +2 -1
  97. package/lib/style.css +1 -1
  98. package/lib/style.min.css +1 -1
  99. package/lib/table/module/custom/mixin.js +74 -48
  100. package/lib/table/module/custom/mixin.min.js +1 -1
  101. package/lib/table/module/custom/panel.js +6 -2
  102. package/lib/table/module/custom/panel.min.js +1 -1
  103. package/lib/table/module/export/mixin.js +13 -5
  104. package/lib/table/module/export/mixin.min.js +1 -1
  105. package/lib/table/module/keyboard/mixin.js +2 -1
  106. package/lib/table/module/keyboard/mixin.min.js +1 -1
  107. package/lib/table/src/body.js +39 -15
  108. package/lib/table/src/body.min.js +1 -1
  109. package/lib/table/src/cell.js +157 -36
  110. package/lib/table/src/cell.min.js +1 -1
  111. package/lib/table/src/column.js +2 -0
  112. package/lib/table/src/column.min.js +1 -1
  113. package/lib/table/src/columnInfo.js +1 -0
  114. package/lib/table/src/columnInfo.min.js +1 -1
  115. package/lib/table/src/methods.js +1164 -562
  116. package/lib/table/src/methods.min.js +1 -1
  117. package/lib/table/src/props.js +9 -7
  118. package/lib/table/src/props.min.js +1 -1
  119. package/lib/table/src/table.js +104 -34
  120. package/lib/table/src/table.min.js +1 -1
  121. package/lib/table/style/style.css +70 -40
  122. package/lib/table/style/style.min.css +1 -1
  123. package/lib/ui/index.js +13 -1
  124. package/lib/ui/index.min.js +1 -1
  125. package/lib/ui/src/dom.js +4 -0
  126. package/lib/ui/src/dom.min.js +1 -1
  127. package/lib/ui/src/log.js +1 -1
  128. package/lib/ui/src/log.min.js +1 -1
  129. package/lib/vxe-table/style/style.css +70 -40
  130. package/lib/vxe-table/style/style.min.css +1 -1
  131. package/package.json +2 -2
  132. package/packages/locale/lang/ar-EG.ts +3 -2
  133. package/packages/locale/lang/de-DE.ts +3 -2
  134. package/packages/locale/lang/en-US.ts +2 -1
  135. package/packages/locale/lang/es-ES.ts +3 -2
  136. package/packages/locale/lang/fr-FR.ts +2 -1
  137. package/packages/locale/lang/hu-HU.ts +2 -1
  138. package/packages/locale/lang/hy-AM.ts +2 -1
  139. package/packages/locale/lang/id-ID.ts +2 -1
  140. package/packages/locale/lang/it-IT.ts +2 -1
  141. package/packages/locale/lang/ja-JP.ts +2 -1
  142. package/packages/locale/lang/ko-KR.ts +2 -1
  143. package/packages/locale/lang/nb-NO.ts +2 -1
  144. package/packages/locale/lang/pt-BR.ts +2 -1
  145. package/packages/locale/lang/ru-RU.ts +2 -1
  146. package/packages/locale/lang/th-TH.ts +2 -1
  147. package/packages/locale/lang/ug-CN.ts +2 -1
  148. package/packages/locale/lang/uk-UA.ts +2 -1
  149. package/packages/locale/lang/vi-VN.ts +2 -1
  150. package/packages/locale/lang/zh-CHT.ts +2 -1
  151. package/packages/locale/lang/zh-CN.ts +2 -1
  152. package/packages/table/module/custom/mixin.ts +85 -51
  153. package/packages/table/module/custom/panel.ts +8 -8
  154. package/packages/table/module/export/mixin.ts +19 -18
  155. package/packages/table/module/keyboard/mixin.ts +3 -2
  156. package/packages/table/src/body.ts +50 -17
  157. package/packages/table/src/cell.ts +136 -45
  158. package/packages/table/src/column.ts +2 -0
  159. package/packages/table/src/columnInfo.ts +1 -0
  160. package/packages/table/src/methods.ts +1016 -512
  161. package/packages/table/src/props.ts +9 -7
  162. package/packages/table/src/table.ts +122 -38
  163. package/packages/ui/index.ts +12 -0
  164. package/packages/ui/src/dom.ts +4 -0
  165. package/styles/components/table.scss +131 -92
  166. /package/es/{iconfont.1744880837792.ttf → iconfont.1745290222894.ttf} +0 -0
  167. /package/es/{iconfont.1744880837792.woff → iconfont.1745290222894.woff} +0 -0
  168. /package/es/{iconfont.1744880837792.woff2 → iconfont.1745290222894.woff2} +0 -0
  169. /package/lib/{iconfont.1744880837792.ttf → iconfont.1745290222894.ttf} +0 -0
  170. /package/lib/{iconfont.1744880837792.woff → iconfont.1745290222894.woff} +0 -0
  171. /package/lib/{iconfont.1744880837792.woff2 → iconfont.1745290222894.woff2} +0 -0
@@ -214,6 +214,7 @@ function restoreCustomStorage($xeTable) {
214
214
  const storeData = getCustomStorageMap(tableId);
215
215
  if (restoreStore) {
216
216
  return Promise.resolve(restoreStore({
217
+ $table: $xeTable,
217
218
  id: tableId,
218
219
  type: 'restore',
219
220
  storeData
@@ -257,6 +258,7 @@ function cacheColumnMap($xeTable) {
257
258
  const rowOpts = $xeTable.computeRowOpts;
258
259
  const isGroup = collectColumn.some(_utils.hasChildrenList);
259
260
  let isAllOverflow = !!props.showOverflow;
261
+ let rowGroupColumn;
260
262
  let expandColumn;
261
263
  let treeNodeColumn;
262
264
  let checkboxColumn;
@@ -269,7 +271,8 @@ function cacheColumnMap($xeTable) {
269
271
  field,
270
272
  fixed,
271
273
  type,
272
- treeNode
274
+ treeNode,
275
+ rowGroupNode
273
276
  } = column;
274
277
  const rest = {
275
278
  $index: -1,
@@ -305,7 +308,16 @@ function cacheColumnMap($xeTable) {
305
308
  if (!treeNodeColumn) {
306
309
  treeNodeColumn = column;
307
310
  }
308
- } else if (type === 'expand') {
311
+ }
312
+ if (rowGroupNode) {
313
+ if (treeNodeColumn) {
314
+ (0, _log.warnLog)('vxe.error.colRepet', ['row-group-node', rowGroupNode]);
315
+ }
316
+ if (!rowGroupColumn) {
317
+ rowGroupColumn = column;
318
+ }
319
+ }
320
+ if (type === 'expand') {
309
321
  if (expandColumn) {
310
322
  (0, _log.warnLog)('vxe.error.colRepet', ['type', type]);
311
323
  }
@@ -356,6 +368,7 @@ function cacheColumnMap($xeTable) {
356
368
  }
357
369
  }
358
370
  reactData.isGroup = isGroup;
371
+ reactData.rowGroupColumn = rowGroupColumn;
359
372
  reactData.treeNodeColumn = treeNodeColumn;
360
373
  reactData.expandColumn = expandColumn;
361
374
  reactData.isAllOverflow = isAllOverflow;
@@ -392,7 +405,7 @@ function handleBaseTreeExpand($xeTable, rows, expanded) {
392
405
  } = reactData;
393
406
  const {
394
407
  fullAllDataRowIdData,
395
- tableFullData,
408
+ tableFullTreeData,
396
409
  treeExpandedMaps,
397
410
  treeExpandLazyLoadedMaps
398
411
  } = internalData;
@@ -422,7 +435,7 @@ function handleBaseTreeExpand($xeTable, rows, expanded) {
422
435
  if (accordion) {
423
436
  validRows = validRows.length ? [validRows[validRows.length - 1]] : [];
424
437
  // 同一级只能展开一个
425
- const matchObj = _xeUtils.default.findTree(tableFullData, item => item === validRows[0], {
438
+ const matchObj = _xeUtils.default.findTree(tableFullTreeData, item => item === validRows[0], {
426
439
  children: childrenField
427
440
  });
428
441
  if (matchObj) {
@@ -475,9 +488,96 @@ function handleBaseTreeExpand($xeTable, rows, expanded) {
475
488
  * @returns
476
489
  */
477
490
  function handleVirtualTreeExpand($xeTable, rows, expanded) {
491
+ const reactData = $xeTable;
478
492
  return handleBaseTreeExpand($xeTable, rows, expanded).then(() => {
479
493
  handleVirtualTreeToList($xeTable);
480
494
  $xeTable.handleTableData();
495
+ reactData.treeExpandedFlag++;
496
+ updateAfterDataIndex($xeTable);
497
+ return $xeTable.$nextTick();
498
+ }).then(() => {
499
+ return $xeTable.recalculate(true);
500
+ }).then(() => {
501
+ setTimeout(() => {
502
+ $xeTable.updateCellAreas();
503
+ }, 30);
504
+ });
505
+ }
506
+ /**
507
+ * 展开与收起行分组节点
508
+ * @param rows
509
+ * @param expanded
510
+ * @returns
511
+ */
512
+ function handleRowGroupBaseExpand($xeTable, rows, expanded) {
513
+ const reactData = $xeTable;
514
+ const internalData = $xeTable;
515
+ const {
516
+ fullAllDataRowIdData,
517
+ tableFullGroupData,
518
+ rowGroupExpandedMaps
519
+ } = internalData;
520
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
521
+ const {
522
+ mapChildrenField,
523
+ accordion
524
+ } = rowGroupOpts;
525
+ const {
526
+ handleGetRowId
527
+ } = (0, _util.createHandleGetRowId)($xeTable);
528
+ let validRows = rows;
529
+ if (mapChildrenField) {
530
+ if (accordion) {
531
+ validRows = validRows.length ? [validRows[validRows.length - 1]] : [];
532
+ // 同一级只能展开一个
533
+ const matchObj = _xeUtils.default.findTree(tableFullGroupData, item => (0, _util.getRowid)($xeTable, item) === (0, _util.getRowid)($xeTable, validRows[0]), {
534
+ children: mapChildrenField
535
+ });
536
+ if (matchObj) {
537
+ matchObj.items.forEach(item => {
538
+ const rowid = handleGetRowId(item);
539
+ if (rowGroupExpandedMaps[rowid]) {
540
+ delete rowGroupExpandedMaps[rowid];
541
+ }
542
+ });
543
+ }
544
+ }
545
+ if (expanded) {
546
+ validRows.forEach(row => {
547
+ const rowid = handleGetRowId(row);
548
+ if (!rowGroupExpandedMaps[rowid]) {
549
+ const rowRest = fullAllDataRowIdData[rowid];
550
+ if (rowRest) {
551
+ if (row[mapChildrenField] && row[mapChildrenField].length) {
552
+ rowGroupExpandedMaps[rowid] = row;
553
+ }
554
+ }
555
+ }
556
+ });
557
+ } else {
558
+ validRows.forEach(item => {
559
+ const rowid = handleGetRowId(item);
560
+ if (rowGroupExpandedMaps[rowid]) {
561
+ delete rowGroupExpandedMaps[rowid];
562
+ }
563
+ });
564
+ }
565
+ }
566
+ reactData.rowGroupExpandedFlag++;
567
+ return $xeTable.recalculate();
568
+ }
569
+ /**
570
+ * 行分组的展开与收起
571
+ * @param rows
572
+ * @param expanded
573
+ * @returns
574
+ */
575
+ function handleRowGroupVirtualExpand($xeTable, rows, expanded) {
576
+ const reactData = $xeTable;
577
+ return handleRowGroupBaseExpand($xeTable, rows, expanded).then(() => {
578
+ handleVirtualTreeToList($xeTable);
579
+ $xeTable.handleTableData();
580
+ reactData.rowGroupExpandedFlag++;
481
581
  updateAfterDataIndex($xeTable);
482
582
  return $xeTable.$nextTick();
483
583
  }).then(() => {
@@ -599,27 +699,33 @@ function updateAfterDataIndex($xeTable) {
599
699
  }
600
700
  }
601
701
  /**
602
- * 如果为虚拟树,将树结构拍平
702
+ * 如果为虚拟树、行分组、则将树结构拍平
603
703
  * @returns
604
704
  */
605
705
  function handleVirtualTreeToList($xeTable) {
606
706
  const props = $xeTable;
707
+ const reactData = $xeTable;
607
708
  const internalData = $xeTable;
608
709
  const {
609
710
  treeConfig
610
711
  } = props;
712
+ const {
713
+ isRowGroupStatus
714
+ } = reactData;
611
715
  const {
612
716
  fullAllDataRowIdData,
613
- treeExpandedMaps
717
+ treeExpandedMaps,
718
+ rowGroupExpandedMaps
614
719
  } = internalData;
720
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
615
721
  const treeOpts = $xeTable.computeTreeOpts;
616
- const childrenField = treeOpts.children || treeOpts.childrenField;
722
+ const {
723
+ handleGetRowId
724
+ } = (0, _util.createHandleGetRowId)($xeTable);
725
+ const fullData = [];
726
+ const expandMaps = {};
617
727
  if (treeConfig && treeOpts.transform) {
618
- const {
619
- handleGetRowId
620
- } = (0, _util.createHandleGetRowId)($xeTable);
621
- const fullData = [];
622
- const expandMaps = {};
728
+ const childrenField = treeOpts.children || treeOpts.childrenField;
623
729
  _xeUtils.default.eachTree(internalData.afterTreeFullData, (row, index, items, path, parentRow) => {
624
730
  const rowid = handleGetRowId(row);
625
731
  const parentRowid = handleGetRowId(parentRow);
@@ -637,9 +743,336 @@ function handleVirtualTreeToList($xeTable) {
637
743
  internalData.afterFullData = fullData;
638
744
  updateScrollYStatus($xeTable, fullData);
639
745
  return fullData;
746
+ } else if (isRowGroupStatus) {
747
+ const {
748
+ childrenField
749
+ } = rowGroupOpts;
750
+ _xeUtils.default.eachTree(internalData.afterGroupFullData, (row, index, items, path, parentRow) => {
751
+ const rowid = handleGetRowId(row);
752
+ const parentRowid = handleGetRowId(parentRow);
753
+ if (!parentRow || expandMaps[parentRowid] && rowGroupExpandedMaps[parentRowid]) {
754
+ const rowRest = fullAllDataRowIdData[rowid];
755
+ if (rowRest) {
756
+ rowRest._index = fullData.length;
757
+ }
758
+ expandMaps[rowid] = 1;
759
+ fullData.push(row);
760
+ }
761
+ }, {
762
+ children: childrenField
763
+ });
764
+ internalData.afterFullData = fullData;
765
+ updateScrollYStatus($xeTable, fullData);
766
+ return fullData;
640
767
  }
641
768
  return internalData.afterFullData;
642
769
  }
770
+ /**
771
+ * 编译处理后全量的表格数据
772
+ * 如果存在筛选条件,继续处理
773
+ */
774
+ function updateAfterFullData($xeTable) {
775
+ const props = $xeTable;
776
+ const reactData = $xeTable;
777
+ const internalData = $xeTable;
778
+ const {
779
+ treeConfig
780
+ } = props;
781
+ const {
782
+ isRowGroupStatus
783
+ } = reactData;
784
+ const {
785
+ tableFullColumn,
786
+ tableFullData,
787
+ tableFullTreeData,
788
+ tableFullGroupData
789
+ } = internalData;
790
+ const filterOpts = $xeTable.computeFilterOpts;
791
+ const sortOpts = $xeTable.computeSortOpts;
792
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
793
+ const treeOpts = $xeTable.computeTreeOpts;
794
+ const childrenField = treeOpts.children || treeOpts.childrenField;
795
+ const {
796
+ transform,
797
+ rowField,
798
+ parentField,
799
+ mapChildrenField
800
+ } = treeOpts;
801
+ const {
802
+ isEvery,
803
+ remote: allRemoteFilter,
804
+ filterMethod: allFilterMethod
805
+ } = filterOpts;
806
+ const {
807
+ remote: allRemoteSort,
808
+ sortMethod: allSortMethod,
809
+ multiple: sortMultiple,
810
+ chronological
811
+ } = sortOpts;
812
+ let tableData = [];
813
+ let tableTree = [];
814
+ // 处理数据
815
+ if (!allRemoteFilter || !allRemoteSort) {
816
+ const filterColumns = [];
817
+ let orderColumns = [];
818
+ tableFullColumn.forEach(column => {
819
+ const {
820
+ field,
821
+ sortable,
822
+ order,
823
+ filters
824
+ } = column;
825
+ if (!allRemoteFilter && filters && filters.length) {
826
+ const valueList = [];
827
+ const itemList = [];
828
+ filters.forEach(item => {
829
+ if (item.checked) {
830
+ itemList.push(item);
831
+ valueList.push(item.value);
832
+ }
833
+ });
834
+ if (itemList.length) {
835
+ filterColumns.push({
836
+ column,
837
+ valueList,
838
+ itemList
839
+ });
840
+ }
841
+ }
842
+ if (!allRemoteSort && sortable && order) {
843
+ orderColumns.push({
844
+ column,
845
+ field,
846
+ property: field,
847
+ order: order,
848
+ sortTime: column.sortTime
849
+ });
850
+ }
851
+ });
852
+ if (sortMultiple && chronological && orderColumns.length > 1) {
853
+ orderColumns = _xeUtils.default.orderBy(orderColumns, 'sortTime');
854
+ }
855
+ // 处理筛选
856
+ // 支持单列、多列、组合筛选
857
+ if (!allRemoteFilter && filterColumns.length) {
858
+ const handleFilter = row => {
859
+ return filterColumns.every(({
860
+ column,
861
+ valueList,
862
+ itemList
863
+ }) => {
864
+ const {
865
+ filterMethod,
866
+ filterRender
867
+ } = column;
868
+ const compConf = (0, _utils.isEnableConf)(filterRender) ? renderer.get(filterRender.name) : null;
869
+ const compFilterMethod = compConf ? compConf.tableFilterMethod || compConf.filterMethod : null;
870
+ const tdFilterMethod = compConf ? compConf.tableFilterDefaultMethod || compConf.defaultTableFilterMethod || compConf.defaultFilterMethod : null;
871
+ const cellValue = (0, _util.getCellValue)(row, column);
872
+ if (filterMethod) {
873
+ return itemList.some(item => filterMethod({
874
+ value: item.value,
875
+ option: item,
876
+ cellValue,
877
+ row,
878
+ column,
879
+ $table: $xeTable
880
+ }));
881
+ } else if (compFilterMethod) {
882
+ return itemList.some(item => compFilterMethod({
883
+ value: item.value,
884
+ option: item,
885
+ cellValue,
886
+ row,
887
+ column,
888
+ $table: $xeTable
889
+ }));
890
+ } else if (allFilterMethod) {
891
+ return allFilterMethod({
892
+ $table: $xeTable,
893
+ options: itemList,
894
+ values: valueList,
895
+ cellValue,
896
+ row,
897
+ column
898
+ });
899
+ } else if (tdFilterMethod) {
900
+ return itemList.some(item => tdFilterMethod({
901
+ value: item.value,
902
+ option: item,
903
+ cellValue,
904
+ row,
905
+ column,
906
+ $table: $xeTable
907
+ }));
908
+ }
909
+ return valueList.indexOf(_xeUtils.default.get(row, column.field)) > -1;
910
+ });
911
+ };
912
+ if (isRowGroupStatus) {
913
+ // 行分组
914
+ tableTree = _xeUtils.default.searchTree(tableFullGroupData, handleFilter, {
915
+ original: true,
916
+ isEvery: true,
917
+ children: rowGroupOpts.mapChildrenField,
918
+ mapChildren: rowGroupOpts.childrenField
919
+ });
920
+ tableData = tableTree;
921
+ } else if (treeConfig && transform) {
922
+ // 筛选虚拟树
923
+ tableTree = _xeUtils.default.searchTree(tableFullTreeData, handleFilter, {
924
+ original: true,
925
+ isEvery,
926
+ children: mapChildrenField,
927
+ mapChildren: childrenField
928
+ });
929
+ tableData = tableTree;
930
+ } else {
931
+ tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
932
+ tableTree = tableData;
933
+ }
934
+ } else {
935
+ if (isRowGroupStatus) {
936
+ // 还原行分组
937
+ tableTree = _xeUtils.default.searchTree(tableFullGroupData, () => true, {
938
+ original: true,
939
+ isEvery: true,
940
+ children: rowGroupOpts.mapChildrenField,
941
+ mapChildren: rowGroupOpts.childrenField
942
+ });
943
+ tableData = tableTree;
944
+ } else if (treeConfig && transform) {
945
+ // 还原虚拟树
946
+ tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
947
+ original: true,
948
+ isEvery,
949
+ children: mapChildrenField,
950
+ mapChildren: childrenField
951
+ });
952
+ tableData = tableTree;
953
+ } else {
954
+ tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
955
+ tableTree = tableData;
956
+ }
957
+ }
958
+ // 处理排序
959
+ // 支持单列、多列、组合排序
960
+ if (!allRemoteSort && orderColumns.length) {
961
+ if (isRowGroupStatus) {
962
+ // 行分组的排序
963
+ if (allSortMethod) {
964
+ const sortRests = allSortMethod({
965
+ data: tableTree,
966
+ sortList: orderColumns,
967
+ $table: $xeTable
968
+ });
969
+ tableTree = _xeUtils.default.isArray(sortRests) ? sortRests : tableTree;
970
+ } else {
971
+ const treeList = _xeUtils.default.toTreeArray(tableTree, {
972
+ key: rowGroupOpts.rowField,
973
+ parentKey: rowGroupOpts.parentField,
974
+ children: rowGroupOpts.mapChildrenField
975
+ });
976
+ tableTree = _xeUtils.default.toArrayTree(_xeUtils.default.orderBy(treeList, orderColumns.map(({
977
+ column,
978
+ order
979
+ }) => [getOrderField($xeTable, column), order])), {
980
+ key: rowGroupOpts.rowField,
981
+ parentKey: rowGroupOpts.parentField,
982
+ children: rowGroupOpts.childrenField,
983
+ mapChildren: rowGroupOpts.mapChildrenField
984
+ });
985
+ }
986
+ tableData = tableTree;
987
+ } else if (treeConfig && transform) {
988
+ // 虚拟树的排序
989
+ if (allSortMethod) {
990
+ const sortRests = allSortMethod({
991
+ data: tableTree,
992
+ sortList: orderColumns,
993
+ $table: $xeTable
994
+ });
995
+ tableTree = _xeUtils.default.isArray(sortRests) ? sortRests : tableTree;
996
+ } else {
997
+ const treeList = _xeUtils.default.toTreeArray(tableTree, {
998
+ children: mapChildrenField
999
+ });
1000
+ tableTree = _xeUtils.default.toArrayTree(_xeUtils.default.orderBy(treeList, orderColumns.map(({
1001
+ column,
1002
+ order
1003
+ }) => [getOrderField($xeTable, column), order])), {
1004
+ key: rowField,
1005
+ parentKey: parentField,
1006
+ children: childrenField,
1007
+ mapChildren: mapChildrenField
1008
+ });
1009
+ }
1010
+ tableData = tableTree;
1011
+ } else {
1012
+ if (allSortMethod) {
1013
+ const sortRests = allSortMethod({
1014
+ data: tableData,
1015
+ sortList: orderColumns,
1016
+ $table: $xeTable
1017
+ });
1018
+ tableData = _xeUtils.default.isArray(sortRests) ? sortRests : tableData;
1019
+ } else {
1020
+ // 兼容 v4
1021
+ if (sortMultiple) {
1022
+ tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
1023
+ column,
1024
+ order
1025
+ }) => [getOrderField($xeTable, column), order]));
1026
+ } else {
1027
+ const firstOrderColumn = orderColumns[0];
1028
+ let sortByConfs;
1029
+ // 已废弃,兼容 v2,在 v4 中废弃, sortBy 不能为数组
1030
+ if (_xeUtils.default.isArray(firstOrderColumn.sortBy)) {
1031
+ sortByConfs = firstOrderColumn.sortBy.map(item => [item, firstOrderColumn.order]);
1032
+ }
1033
+ tableData = _xeUtils.default.orderBy(tableData, sortByConfs || [firstOrderColumn].map(({
1034
+ column,
1035
+ order
1036
+ }) => [getOrderField($xeTable, column), order]));
1037
+ }
1038
+ tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
1039
+ column,
1040
+ order
1041
+ }) => [getOrderField($xeTable, column), order]));
1042
+ }
1043
+ tableTree = tableData;
1044
+ }
1045
+ }
1046
+ } else {
1047
+ if (isRowGroupStatus) {
1048
+ // 还原行分组
1049
+ // 还原虚拟树
1050
+ tableTree = _xeUtils.default.searchTree(tableFullGroupData, () => true, {
1051
+ original: true,
1052
+ isEvery: true,
1053
+ children: rowGroupOpts.mapChildrenField,
1054
+ mapChildren: rowGroupOpts.childrenField
1055
+ });
1056
+ tableData = tableTree;
1057
+ } else if (treeConfig && transform) {
1058
+ // 还原虚拟树
1059
+ tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
1060
+ original: true,
1061
+ isEvery,
1062
+ children: mapChildrenField,
1063
+ mapChildren: childrenField
1064
+ });
1065
+ tableData = tableTree;
1066
+ } else {
1067
+ tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
1068
+ tableTree = tableData;
1069
+ }
1070
+ }
1071
+ internalData.afterFullData = tableData;
1072
+ internalData.afterTreeFullData = tableTree;
1073
+ internalData.afterGroupFullData = tableTree;
1074
+ updateAfterDataIndex($xeTable);
1075
+ }
643
1076
  function updateStyle($xeTable) {
644
1077
  const props = $xeTable;
645
1078
  const reactData = $xeTable;
@@ -1098,6 +1531,7 @@ function handleCheckedRadioRow($xeTable, row, isForce) {
1098
1531
  checkMethod
1099
1532
  } = radioOpts;
1100
1533
  if (row && (isForce || !checkMethod || checkMethod({
1534
+ $table: $xeTable,
1101
1535
  row
1102
1536
  }))) {
1103
1537
  reactData.selectRadioRow = row;
@@ -1120,12 +1554,18 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1120
1554
  const {
1121
1555
  treeConfig
1122
1556
  } = props;
1557
+ const {
1558
+ isRowGroupStatus
1559
+ } = reactData;
1123
1560
  const {
1124
1561
  afterFullData,
1562
+ afterTreeFullData,
1563
+ afterGroupFullData,
1125
1564
  checkboxReserveRowMap,
1126
1565
  selectCheckboxMaps
1127
1566
  } = internalData;
1128
1567
  const treeOpts = $xeTable.computeTreeOpts;
1568
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
1129
1569
  const childrenField = treeOpts.children || treeOpts.childrenField;
1130
1570
  const checkboxOpts = $xeTable.computeCheckboxOpts;
1131
1571
  const {
@@ -1140,12 +1580,13 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1140
1580
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
1141
1581
  const selectRowMaps = {};
1142
1582
  /**
1143
- * 绑定属性方式(高性能,有污染)
1583
+ * 绑定属性方式(有污染)
1144
1584
  * 必须在行数据存在对应的属性,否则将不响应
1145
1585
  */
1146
1586
  if (checkField) {
1147
1587
  const checkValFn = row => {
1148
1588
  if (isForce || !checkMethod || checkMethod({
1589
+ $table: $xeTable,
1149
1590
  row
1150
1591
  })) {
1151
1592
  if (checked) {
@@ -1153,13 +1594,13 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1153
1594
  }
1154
1595
  _xeUtils.default.set(row, checkField, checked);
1155
1596
  }
1156
- if (treeConfig && indeterminateField) {
1597
+ if ((treeConfig || isRowGroupStatus) && indeterminateField) {
1157
1598
  _xeUtils.default.set(row, indeterminateField, false);
1158
1599
  }
1159
1600
  };
1160
1601
  // 如果存在选中方法
1161
1602
  // 如果方法成立,则更新值,否则忽略该数据
1162
- if (treeConfig) {
1603
+ if (treeConfig || isRowGroupStatus) {
1163
1604
  _xeUtils.default.eachTree(afterFullData, checkValFn, {
1164
1605
  children: childrenField
1165
1606
  });
@@ -1168,17 +1609,54 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1168
1609
  }
1169
1610
  } else {
1170
1611
  /**
1171
- * 默认方式(低性能,无污染)
1172
- * 无需任何属性,直接绑定
1173
- */
1174
- if (treeConfig) {
1612
+ * 默认方式(无污染)
1613
+ * 无需任何属性,直接绑定
1614
+ */
1615
+ if (isRowGroupStatus) {
1175
1616
  if (checked) {
1176
1617
  /**
1177
- * 如果是树勾选
1178
- * 如果方法成立,则添加到临时集合中
1179
- */
1180
- _xeUtils.default.eachTree(afterFullData, row => {
1618
+ * 如果是行分组勾选
1619
+ * 如果方法成立,则添加到临时集合中
1620
+ */
1621
+ _xeUtils.default.eachTree(afterGroupFullData, row => {
1181
1622
  if (isForce || !checkMethod || checkMethod({
1623
+ $table: $xeTable,
1624
+ row
1625
+ })) {
1626
+ const rowid = handleGetRowId(row);
1627
+ selectRowMaps[rowid] = row;
1628
+ }
1629
+ }, {
1630
+ children: rowGroupOpts.mapChildrenField
1631
+ });
1632
+ } else {
1633
+ /**
1634
+ * 如果是树取消
1635
+ * 如果方法成立,则不添加到临时集合中
1636
+ */
1637
+ if (!isForce && checkMethod) {
1638
+ _xeUtils.default.eachTree(afterGroupFullData, row => {
1639
+ const rowid = handleGetRowId(row);
1640
+ if (checkMethod({
1641
+ $table: $xeTable,
1642
+ row
1643
+ }) ? false : selectCheckboxMaps[rowid]) {
1644
+ selectRowMaps[rowid] = row;
1645
+ }
1646
+ }, {
1647
+ children: rowGroupOpts.mapChildrenField
1648
+ });
1649
+ }
1650
+ }
1651
+ } else if (treeConfig) {
1652
+ if (checked) {
1653
+ /**
1654
+ * 如果是树勾选
1655
+ * 如果方法成立,则添加到临时集合中
1656
+ */
1657
+ _xeUtils.default.eachTree(afterTreeFullData, row => {
1658
+ if (isForce || !checkMethod || checkMethod({
1659
+ $table: $xeTable,
1182
1660
  row
1183
1661
  })) {
1184
1662
  const rowid = handleGetRowId(row);
@@ -1189,15 +1667,16 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1189
1667
  });
1190
1668
  } else {
1191
1669
  /**
1192
- * 如果是树取消
1193
- * 如果方法成立,则不添加到临时集合中
1194
- */
1670
+ * 如果是树取消
1671
+ * 如果方法成立,则不添加到临时集合中
1672
+ */
1195
1673
  if (!isForce && checkMethod) {
1196
- _xeUtils.default.eachTree(afterFullData, row => {
1674
+ _xeUtils.default.eachTree(afterTreeFullData, row => {
1197
1675
  const rowid = handleGetRowId(row);
1198
1676
  if (checkMethod({
1677
+ $table: $xeTable,
1199
1678
  row
1200
- }) ? 0 : selectCheckboxMaps[rowid]) {
1679
+ }) ? false : selectCheckboxMaps[rowid]) {
1201
1680
  selectRowMaps[rowid] = row;
1202
1681
  }
1203
1682
  }, {
@@ -1208,14 +1687,15 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1208
1687
  } else {
1209
1688
  if (checked) {
1210
1689
  /**
1211
- * 如果是行勾选
1212
- * 如果存在选中方法且成立或者本身已勾选,则添加到临时集合中
1213
- * 如果不存在选中方法,则添加所有数据到临时集合中
1214
- */
1690
+ * 如果是行勾选
1691
+ * 如果存在选中方法且成立或者本身已勾选,则添加到临时集合中
1692
+ * 如果不存在选中方法,则添加所有数据到临时集合中
1693
+ */
1215
1694
  if (!isForce && checkMethod) {
1216
1695
  afterFullData.forEach(row => {
1217
1696
  const rowid = handleGetRowId(row);
1218
1697
  if (selectCheckboxMaps[rowid] || checkMethod({
1698
+ $table: $xeTable,
1219
1699
  row
1220
1700
  })) {
1221
1701
  selectRowMaps[rowid] = row;
@@ -1229,16 +1709,17 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
1229
1709
  }
1230
1710
  } else {
1231
1711
  /**
1232
- * 如果是行取消
1233
- * 如果方法成立,则不添加到临时集合中;如果方法不成立则判断当前是否已勾选,如果已被勾选则添加到新集合中
1234
- * 如果不存在选中方法,无需处理,临时集合默认为空
1235
- */
1712
+ * 如果是行取消
1713
+ * 如果方法成立,则不添加到临时集合中;如果方法不成立则判断当前是否已勾选,如果已被勾选则添加到新集合中
1714
+ * 如果不存在选中方法,无需处理,临时集合默认为空
1715
+ */
1236
1716
  if (!isForce && checkMethod) {
1237
1717
  afterFullData.forEach(row => {
1238
1718
  const rowid = handleGetRowId(row);
1239
1719
  if (checkMethod({
1720
+ $table: $xeTable,
1240
1721
  row
1241
- }) ? 0 : selectCheckboxMaps[rowid]) {
1722
+ }) ? false : selectCheckboxMaps[rowid]) {
1242
1723
  selectRowMaps[rowid] = row;
1243
1724
  }
1244
1725
  });
@@ -2113,9 +2594,11 @@ function updateRowDropTipContent($xeTable, tdEl) {
2113
2594
  const rTooltipMethod = tooltipMethod || (dragConfig ? dragConfig.rowTooltipMethod : null);
2114
2595
  let tipContent = '';
2115
2596
  if (rTooltipMethod) {
2116
- tipContent = `${rTooltipMethod({
2597
+ const rtParams = {
2598
+ $table: $xeTable,
2117
2599
  row: dragRow
2118
- }) || ''}`;
2600
+ };
2601
+ tipContent = `${rTooltipMethod(rtParams) || ''}`;
2119
2602
  } else {
2120
2603
  tipContent = getI18n('vxe.table.dragTip', [tdEl.textContent || '']);
2121
2604
  }
@@ -2155,9 +2638,11 @@ function updateColDropTipContent($xeTable, tdEl) {
2155
2638
  } = columnDragOpts;
2156
2639
  let tipContent = '';
2157
2640
  if (tooltipMethod) {
2158
- tipContent = `${tooltipMethod({
2641
+ const dtParams = {
2642
+ $table: $xeTable,
2159
2643
  column: dragCol
2160
- }) || ''}`;
2644
+ };
2645
+ tipContent = `${tooltipMethod(dtParams) || ''}`;
2161
2646
  } else {
2162
2647
  tipContent = getI18n('vxe.table.dragTip', [tdEl.textContent || '']);
2163
2648
  }
@@ -2489,8 +2974,281 @@ function handleRecalculateLayout($xeTable, reFull) {
2489
2974
  }
2490
2975
  });
2491
2976
  }
2492
- /**
2493
- * 处理数据加载默认行为
2977
+ const handleUpdateRowGroup = ($xeTable, groupFields) => {
2978
+ const reactData = $xeTable;
2979
+ reactData.rowGroupList = groupFields ? (_xeUtils.default.isArray(groupFields) ? groupFields : [groupFields]).map(field => {
2980
+ return {
2981
+ field
2982
+ };
2983
+ }) : [];
2984
+ };
2985
+ function handleGroupData($xeTable, list, rowGroups) {
2986
+ let fullData = list;
2987
+ let treeData = list;
2988
+ if (rowGroups) {
2989
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
2990
+ const {
2991
+ rowField,
2992
+ parentField,
2993
+ childrenField,
2994
+ mapChildrenField
2995
+ } = rowGroupOpts;
2996
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
2997
+ const {
2998
+ checkField
2999
+ } = checkboxOpts;
3000
+ const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
3001
+ const rgItem = rowGroups[0];
3002
+ if (rgItem && rowField && parentField && childrenField && mapChildrenField) {
3003
+ fullData = [];
3004
+ treeData = [];
3005
+ const groupField = rgItem.field;
3006
+ const groupColumn = $xeTable.getColumnByField(groupField);
3007
+ const groupMaps = {};
3008
+ const rowkey = (0, _util.getRowkey)($xeTable);
3009
+ list.forEach(row => {
3010
+ const cellValue = groupColumn ? $xeTable.getCellLabel(row, groupColumn) : _xeUtils.default.get(row, groupField);
3011
+ const groupValue = _xeUtils.default.eqNull(cellValue) ? '' : cellValue;
3012
+ let childList = groupMaps[groupValue];
3013
+ if (!childList) {
3014
+ childList = [];
3015
+ groupMaps[groupValue] = childList;
3016
+ }
3017
+ if (row.isAggregate) {
3018
+ row.isAggregate = undefined;
3019
+ }
3020
+ childList.push(row);
3021
+ });
3022
+ _xeUtils.default.objectEach(groupMaps, (childList, groupValue) => {
3023
+ const {
3024
+ fullData: childFullData,
3025
+ treeData: childTreeData
3026
+ } = handleGroupData($xeTable, childList, rowGroups.slice(1));
3027
+ const groupRow = {
3028
+ isAggregate: true,
3029
+ groupContent: groupValue,
3030
+ groupField,
3031
+ [rowField]: (0, _util.getRowUniqueId)(),
3032
+ [parentField]: null,
3033
+ [rowkey]: (0, _util.getRowUniqueId)(),
3034
+ [childrenField]: childTreeData,
3035
+ [mapChildrenField]: childTreeData
3036
+ };
3037
+ if (checkField) {
3038
+ groupRow[checkField] = false;
3039
+ }
3040
+ if (indeterminateField) {
3041
+ groupRow[indeterminateField] = false;
3042
+ }
3043
+ treeData.push(groupRow);
3044
+ fullData.push(groupRow);
3045
+ if (childFullData.length) {
3046
+ fullData.push(...childFullData);
3047
+ }
3048
+ });
3049
+ }
3050
+ }
3051
+ return {
3052
+ treeData,
3053
+ fullData
3054
+ };
3055
+ }
3056
+ /**
3057
+ * 加载表格数据
3058
+ * @param {Array} datas 数据
3059
+ */
3060
+ function loadTableData($xeTable, datas, isReset) {
3061
+ const props = $xeTable;
3062
+ const reactData = $xeTable;
3063
+ const internalData = $xeTable;
3064
+ const {
3065
+ keepSource,
3066
+ treeConfig,
3067
+ rowGroupConfig
3068
+ } = props;
3069
+ const {
3070
+ rowGroupList,
3071
+ scrollYLoad: oldScrollYLoad
3072
+ } = reactData;
3073
+ const {
3074
+ scrollYStore,
3075
+ scrollXStore,
3076
+ lastScrollLeft,
3077
+ lastScrollTop
3078
+ } = internalData;
3079
+ const rowOpts = $xeTable.computeRowOpts;
3080
+ const treeOpts = $xeTable.computeTreeOpts;
3081
+ const expandOpts = $xeTable.computeExpandOpts;
3082
+ const {
3083
+ transform
3084
+ } = treeOpts;
3085
+ const childrenField = treeOpts.children || treeOpts.childrenField;
3086
+ let treeData = [];
3087
+ let fullData = datas ? datas.slice(0) : []; // 转为响应式数据
3088
+ if (fullData.length > supportMaxRow) {
3089
+ (0, _log.errLog)('vxe.error.errMaxRow', [supportMaxRow]);
3090
+ }
3091
+ if (treeConfig && rowGroupList.length) {
3092
+ (0, _log.errLog)('vxe.error.noTree', ['row-group-config']);
3093
+ return $xeTable.$nextTick();
3094
+ }
3095
+ if (rowOpts.drag && rowGroupList.length) {
3096
+ (0, _log.errLog)('vxe.error.errConflicts', ['row-config.drag', 'row-group-config']);
3097
+ return $xeTable.$nextTick();
3098
+ }
3099
+ let isRGroup = false;
3100
+ if (treeConfig) {
3101
+ if (transform) {
3102
+ // 树结构自动转换
3103
+ if (!treeOpts.rowField) {
3104
+ (0, _log.errLog)('vxe.error.reqProp', ['tree-config.rowField']);
3105
+ }
3106
+ if (!treeOpts.parentField) {
3107
+ (0, _log.errLog)('vxe.error.reqProp', ['tree-config.parentField']);
3108
+ }
3109
+ if (!childrenField) {
3110
+ (0, _log.errLog)('vxe.error.reqProp', ['tree-config.childrenField']);
3111
+ }
3112
+ if (!treeOpts.mapChildrenField) {
3113
+ (0, _log.errLog)('vxe.error.reqProp', ['tree-config.mapChildrenField']);
3114
+ }
3115
+ if (childrenField === treeOpts.mapChildrenField) {
3116
+ (0, _log.errLog)('vxe.error.errConflicts', ['tree-config.childrenField', 'tree-config.mapChildrenField']);
3117
+ }
3118
+ // fullData.forEach(row => {
3119
+ // if (row[treeOpts.children] && row[treeOpts.children].length) {
3120
+ // warnLog('vxe.error.errConflicts', ['tree-config.transform', `row.${treeOpts.children}`])
3121
+ // }
3122
+ // })
3123
+ treeData = _xeUtils.default.toArrayTree(fullData, {
3124
+ key: treeOpts.rowField,
3125
+ parentKey: treeOpts.parentField,
3126
+ children: childrenField,
3127
+ mapChildren: treeOpts.mapChildrenField
3128
+ });
3129
+ fullData = treeData.slice(0);
3130
+ } else {
3131
+ treeData = fullData.slice(0);
3132
+ }
3133
+ } else if (rowGroupConfig && rowGroupList.length) {
3134
+ const groupRest = handleGroupData($xeTable, fullData, rowGroupList);
3135
+ treeData = groupRest.treeData;
3136
+ fullData = groupRest.fullData;
3137
+ isRGroup = true;
3138
+ }
3139
+ reactData.isRowGroupStatus = isRGroup;
3140
+ scrollYStore.startIndex = 0;
3141
+ scrollYStore.endIndex = 1;
3142
+ scrollXStore.startIndex = 0;
3143
+ scrollXStore.endIndex = 1;
3144
+ reactData.isRowLoading = true;
3145
+ reactData.scrollVMLoading = false;
3146
+ internalData.treeExpandedMaps = {};
3147
+ reactData.treeExpandedFlag++;
3148
+ internalData.rowExpandedMaps = {};
3149
+ reactData.rowExpandedFlag++;
3150
+ internalData.insertRowMaps = {};
3151
+ reactData.insertRowFlag++;
3152
+ internalData.removeRowMaps = {};
3153
+ reactData.removeRowFlag++;
3154
+ const sYLoad = updateScrollYStatus($xeTable, fullData);
3155
+ reactData.isDragColMove = false;
3156
+ reactData.isDragRowMove = false;
3157
+ // 全量数据
3158
+ internalData.tableFullData = fullData;
3159
+ internalData.tableFullTreeData = isRGroup ? [] : treeData;
3160
+ internalData.tableFullGroupData = isRGroup ? treeData : [];
3161
+ // 缓存数据
3162
+ $xeTable.cacheRowMap(isReset);
3163
+ // 原始数据
3164
+ internalData.tableSynchData = datas;
3165
+ if (isReset) {
3166
+ internalData.isResizeCellHeight = false;
3167
+ }
3168
+ // 克隆原数据,用于显示编辑状态,与编辑值做对比
3169
+ if (keepSource) {
3170
+ $xeTable.cacheSourceMap(fullData);
3171
+ }
3172
+ if ($xeTable.clearCellAreas && props.mouseConfig) {
3173
+ $xeTable.clearCellAreas();
3174
+ $xeTable.clearCopyCellArea();
3175
+ }
3176
+ $xeTable.clearMergeCells();
3177
+ $xeTable.clearMergeFooterItems();
3178
+ $xeTable.handleTableData(true);
3179
+ $xeTable.updateFooter();
3180
+ $xeTable.handleUpdateBodyMerge();
3181
+ return $xeTable.$nextTick().then(() => {
3182
+ updateHeight($xeTable);
3183
+ updateStyle($xeTable);
3184
+ }).then(() => {
3185
+ computeScrollLoad($xeTable);
3186
+ }).then(() => {
3187
+ // 是否启用了虚拟滚动
3188
+ if (sYLoad) {
3189
+ scrollYStore.endIndex = scrollYStore.visibleSize;
3190
+ }
3191
+ if (sYLoad) {
3192
+ if (reactData.expandColumn && expandOpts.mode !== 'fixed') {
3193
+ (0, _log.errLog)('vxe.error.notConflictProp', ['column.type="expand', 'expand-config.mode="fixed"']);
3194
+ }
3195
+ // if (showOverflow) {
3196
+ // if (!rowOpts.height) {
3197
+ // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
3198
+ // if (errColumn) {
3199
+ // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
3200
+ // }
3201
+ // }
3202
+ // }
3203
+ if (!(props.height || props.maxHeight)) {
3204
+ (0, _log.errLog)('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']);
3205
+ }
3206
+ // if (!props.showOverflow) {
3207
+ // warnLog('vxe.error.reqProp', ['table.show-overflow'])
3208
+ // }
3209
+ if (props.spanMethod) {
3210
+ (0, _log.errLog)('vxe.error.scrollErrProp', ['table.span-method']);
3211
+ }
3212
+ }
3213
+ handleReserveStatus($xeTable);
3214
+ $xeTable.checkSelectionStatus();
3215
+ return new Promise(resolve => {
3216
+ $xeTable.$nextTick().then(() => handleRecalculateLayout($xeTable, false)).then(() => {
3217
+ calcCellHeight($xeTable);
3218
+ updateRowOffsetTop($xeTable);
3219
+ return handleRecalculateLayout($xeTable, false);
3220
+ }).then(() => {
3221
+ let targetScrollLeft = lastScrollLeft;
3222
+ let targetScrollTop = lastScrollTop;
3223
+ const virtualXOpts = $xeTable.computeVirtualXOpts;
3224
+ const virtualYOpts = $xeTable.computeVirtualYOpts;
3225
+ // 是否在更新数据之后自动滚动重置滚动条
3226
+ if (virtualXOpts.scrollToLeftOnChange) {
3227
+ targetScrollLeft = 0;
3228
+ }
3229
+ if (virtualYOpts.scrollToTopOnChange) {
3230
+ targetScrollTop = 0;
3231
+ }
3232
+ reactData.isRowLoading = false;
3233
+ handleRecalculateLayout($xeTable, false);
3234
+ // 是否变更虚拟滚动
3235
+ if (oldScrollYLoad === sYLoad) {
3236
+ (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3237
+ resolve();
3238
+ });
3239
+ } else {
3240
+ setTimeout(() => {
3241
+ (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3242
+ resolve();
3243
+ });
3244
+ });
3245
+ }
3246
+ });
3247
+ });
3248
+ });
3249
+ }
3250
+ /**
3251
+ * 处理数据加载默认行为
2494
3252
  * 默认执行一次,除非被重置
2495
3253
  */
2496
3254
  function handleLoadDefaults($xeTable) {
@@ -3246,16 +4004,23 @@ const Methods = {
3246
4004
  clearAll() {
3247
4005
  return (0, _util.clearTableAllStatus)(this);
3248
4006
  },
4007
+ handleUpdateRowGroup(groupFields) {
4008
+ const $xeTable = this;
4009
+ handleUpdateRowGroup($xeTable, groupFields);
4010
+ },
3249
4011
  /**
3250
4012
  * 同步 data 数据(即将废弃)
3251
4013
  * 如果用了该方法,那么组件将不再记录增删改的状态,只能自行实现对应逻辑
3252
4014
  * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到
3253
4015
  */
3254
4016
  syncData() {
4017
+ const $xeTable = this;
4018
+ const reactData = $xeTable;
4019
+ const internalData = $xeTable;
3255
4020
  (0, _log.errLog)('vxe.error.delFunc', ['syncData', 'getData']);
3256
- return this.$nextTick().then(() => {
3257
- this.tableData = [];
3258
- return this.$nextTick().then(() => this.loadTableData(this.tableFullData, true));
4021
+ return $xeTable.$nextTick().then(() => {
4022
+ reactData.tableData = [];
4023
+ return $xeTable.$nextTick().then(() => loadTableData($xeTable, internalData.tableFullData, true));
3259
4024
  });
3260
4025
  },
3261
4026
  /**
@@ -3303,23 +4068,23 @@ const Methods = {
3303
4068
  // 是否进行数据处理
3304
4069
  if (force) {
3305
4070
  // 更新数据,处理筛选和排序
3306
- this.updateAfterFullData();
4071
+ updateAfterFullData($xeTable);
3307
4072
  // 如果为虚拟树,将树结构拍平
3308
4073
  fullList = handleVirtualTreeToList($xeTable);
3309
4074
  }
3310
4075
  const tableData = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
3311
4076
  const visibleDataRowIdMaps = {};
3312
4077
  tableData.forEach((row, $index) => {
3313
- const rowid = (0, _util.getRowid)(this, row);
4078
+ const rowid = (0, _util.getRowid)($xeTable, row);
3314
4079
  const rest = fullDataRowIdData[rowid];
3315
4080
  if (rest) {
3316
4081
  rest.$index = $index;
3317
4082
  }
3318
4083
  visibleDataRowIdMaps[rowid] = row;
3319
4084
  });
3320
- this.tableData = tableData;
4085
+ reactData.tableData = tableData;
3321
4086
  internalData.visibleDataRowIdData = visibleDataRowIdMaps;
3322
- return this.$nextTick();
4087
+ return $xeTable.$nextTick();
3323
4088
  },
3324
4089
  /**
3325
4090
  * 加载表格数据
@@ -3327,169 +4092,7 @@ const Methods = {
3327
4092
  */
3328
4093
  loadTableData(datas, isReset) {
3329
4094
  const $xeTable = this;
3330
- const props = $xeTable;
3331
- const reactData = $xeTable;
3332
- const internalData = $xeTable;
3333
- const {
3334
- keepSource,
3335
- treeConfig
3336
- } = props;
3337
- const {
3338
- scrollYLoad: oldScrollYLoad
3339
- } = reactData;
3340
- const {
3341
- scrollYStore,
3342
- scrollXStore,
3343
- lastScrollLeft,
3344
- lastScrollTop
3345
- } = internalData;
3346
- const treeOpts = $xeTable.computeTreeOpts;
3347
- const expandOpts = $xeTable.computeExpandOpts;
3348
- const {
3349
- transform
3350
- } = treeOpts;
3351
- const childrenField = treeOpts.children || treeOpts.childrenField;
3352
- let treeData = [];
3353
- let fullData = datas ? datas.slice(0) : [];
3354
- if (fullData.length > supportMaxRow) {
3355
- (0, _log.errLog)('vxe.error.errMaxRow', [supportMaxRow]);
3356
- }
3357
- if (treeConfig) {
3358
- // 树结构自动转换
3359
- if (transform) {
3360
- if (!treeOpts.rowField) {
3361
- (0, _log.errLog)('vxe.error.reqProp', ['table.tree-config.rowField']);
3362
- }
3363
- if (!treeOpts.parentField) {
3364
- (0, _log.errLog)('vxe.error.reqProp', ['table.tree-config.parentField']);
3365
- }
3366
- if (!childrenField) {
3367
- (0, _log.errLog)('vxe.error.reqProp', ['tree-config.childrenField']);
3368
- }
3369
- if (!treeOpts.mapChildrenField) {
3370
- (0, _log.errLog)('vxe.error.reqProp', ['tree-config.mapChildrenField']);
3371
- }
3372
- if (childrenField === treeOpts.mapChildrenField) {
3373
- (0, _log.errLog)('vxe.error.errConflicts', ['tree-config.childrenField', 'tree-config.mapChildrenField']);
3374
- }
3375
- // fullData.forEach(row => {
3376
- // if (row[childrenField] && row[childrenField].length) {
3377
- // warnLog('vxe.error.errConflicts', ['tree-config.transform', `row.${childrenField}`])
3378
- // }
3379
- // })
3380
- treeData = _xeUtils.default.toArrayTree(fullData, {
3381
- key: treeOpts.rowField,
3382
- parentKey: treeOpts.parentField,
3383
- children: childrenField,
3384
- mapChildren: treeOpts.mapChildrenField
3385
- });
3386
- fullData = treeData.slice(0);
3387
- } else {
3388
- treeData = fullData.slice(0);
3389
- }
3390
- }
3391
- scrollYStore.startIndex = 0;
3392
- scrollYStore.endIndex = 1;
3393
- scrollXStore.startIndex = 0;
3394
- scrollXStore.endIndex = 1;
3395
- reactData.isRowLoading = true;
3396
- reactData.scrollVMLoading = false;
3397
- internalData.insertRowMaps = {};
3398
- internalData.removeRowMaps = {};
3399
- const sYLoad = updateScrollYStatus($xeTable, fullData);
3400
- reactData.isDragColMove = false;
3401
- reactData.isDragRowMove = false;
3402
- // 全量数据
3403
- internalData.tableFullData = fullData;
3404
- internalData.tableFullTreeData = treeData;
3405
- // 缓存数据
3406
- $xeTable.cacheRowMap(isReset);
3407
- // 原始数据
3408
- internalData.tableSynchData = datas;
3409
- if (isReset) {
3410
- internalData.isResizeCellHeight = false;
3411
- }
3412
- // 克隆原数据,用于显示编辑状态,与编辑值做对比
3413
- if (keepSource) {
3414
- $xeTable.cacheSourceMap(fullData);
3415
- }
3416
- if ($xeTable.clearCellAreas && props.mouseConfig) {
3417
- $xeTable.clearCellAreas();
3418
- $xeTable.clearCopyCellArea();
3419
- }
3420
- $xeTable.clearMergeCells();
3421
- $xeTable.clearMergeFooterItems();
3422
- $xeTable.handleTableData(true);
3423
- $xeTable.updateFooter();
3424
- $xeTable.handleUpdateBodyMerge();
3425
- return $xeTable.$nextTick().then(() => {
3426
- updateHeight($xeTable);
3427
- updateStyle($xeTable);
3428
- }).then(() => {
3429
- computeScrollLoad($xeTable);
3430
- }).then(() => {
3431
- // 是否启用了虚拟滚动
3432
- if (sYLoad) {
3433
- scrollYStore.endIndex = scrollYStore.visibleSize;
3434
- }
3435
- if (sYLoad) {
3436
- if (reactData.expandColumn && expandOpts.mode !== 'fixed') {
3437
- (0, _log.errLog)('vxe.error.notConflictProp', ['column.type="expand', 'expand-config.mode="fixed"']);
3438
- }
3439
- // if (showOverflow) {
3440
- // if (!rowOpts.height) {
3441
- // const errColumn = internalData.tableFullColumn.find((column: any) => column.showOverflow === false)
3442
- // if (errColumn) {
3443
- // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
3444
- // }
3445
- // }
3446
- // }
3447
- if (!(props.height || props.maxHeight)) {
3448
- (0, _log.errLog)('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']);
3449
- }
3450
- // if (!props.showOverflow) {
3451
- // warnLog('vxe.error.reqProp', ['table.show-overflow'])
3452
- // }
3453
- if (props.spanMethod) {
3454
- (0, _log.errLog)('vxe.error.scrollErrProp', ['table.span-method']);
3455
- }
3456
- }
3457
- handleReserveStatus($xeTable);
3458
- $xeTable.checkSelectionStatus();
3459
- return new Promise(resolve => {
3460
- this.$nextTick().then(() => handleRecalculateLayout($xeTable, false)).then(() => {
3461
- calcCellHeight($xeTable);
3462
- updateRowOffsetTop($xeTable);
3463
- return handleRecalculateLayout($xeTable, false);
3464
- }).then(() => {
3465
- let targetScrollLeft = lastScrollLeft;
3466
- let targetScrollTop = lastScrollTop;
3467
- const virtualXOpts = $xeTable.computeVirtualXOpts;
3468
- const virtualYOpts = $xeTable.computeVirtualYOpts;
3469
- // 是否在更新数据之后自动滚动重置滚动条
3470
- if (virtualXOpts.scrollToLeftOnChange) {
3471
- targetScrollLeft = 0;
3472
- }
3473
- if (virtualYOpts.scrollToTopOnChange) {
3474
- targetScrollTop = 0;
3475
- }
3476
- reactData.isRowLoading = false;
3477
- handleRecalculateLayout($xeTable, false);
3478
- // 是否变更虚拟滚动
3479
- if (oldScrollYLoad === sYLoad) {
3480
- (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3481
- resolve();
3482
- });
3483
- } else {
3484
- setTimeout(() => {
3485
- (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3486
- resolve();
3487
- });
3488
- });
3489
- }
3490
- });
3491
- });
3492
- });
4095
+ return loadTableData($xeTable, datas, isReset);
3493
4096
  },
3494
4097
  /**
3495
4098
  * 重新加载数据,不会清空表格状态
@@ -3500,7 +4103,7 @@ const Methods = {
3500
4103
  const {
3501
4104
  initStatus
3502
4105
  } = this;
3503
- return this.loadTableData(datas, false).then(() => {
4106
+ return loadTableData($xeTable, datas, false).then(() => {
3504
4107
  this.inited = true;
3505
4108
  this.initStatus = true;
3506
4109
  if (!initStatus) {
@@ -3518,7 +4121,7 @@ const Methods = {
3518
4121
  return this.clearAll().then(() => {
3519
4122
  this.inited = true;
3520
4123
  this.initStatus = true;
3521
- return this.loadTableData(datas, true);
4124
+ return loadTableData($xeTable, datas, true);
3522
4125
  }).then(() => {
3523
4126
  handleLoadDefaults($xeTable);
3524
4127
  return this.recalculate();
@@ -3608,18 +4211,16 @@ const Methods = {
3608
4211
  const {
3609
4212
  treeConfig
3610
4213
  } = props;
4214
+ const {
4215
+ isRowGroupStatus
4216
+ } = reactData;
3611
4217
  const {
3612
4218
  fullAllDataRowIdData,
3613
4219
  tableFullData,
3614
4220
  tableFullTreeData,
4221
+ tableFullGroupData,
3615
4222
  treeExpandedMaps
3616
4223
  } = internalData;
3617
- const treeOpts = $xeTable.computeTreeOpts;
3618
- const childrenField = treeOpts.children || treeOpts.childrenField;
3619
- const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
3620
- const {
3621
- lazy
3622
- } = treeOpts;
3623
4224
  const fullAllDataRowIdMaps = isReset ? {} : Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
3624
4225
  const fullDataRowIdMaps = {};
3625
4226
  const {
@@ -3657,6 +4258,12 @@ const Methods = {
3657
4258
  fullAllDataRowIdMaps[rowid] = rowRest;
3658
4259
  };
3659
4260
  if (treeConfig) {
4261
+ const treeOpts = $xeTable.computeTreeOpts;
4262
+ const {
4263
+ lazy
4264
+ } = treeOpts;
4265
+ const childrenField = treeOpts.children || treeOpts.childrenField;
4266
+ const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
3660
4267
  _xeUtils.default.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
3661
4268
  const rowid = handleUpdateRowId(row);
3662
4269
  if (treeConfig && lazy) {
@@ -3673,6 +4280,17 @@ const Methods = {
3673
4280
  }, {
3674
4281
  children: childrenField
3675
4282
  });
4283
+ } else if (isRowGroupStatus) {
4284
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
4285
+ const {
4286
+ mapChildrenField
4287
+ } = rowGroupOpts;
4288
+ _xeUtils.default.eachTree(tableFullGroupData, (row, index, items, path, parentRow, nodes) => {
4289
+ const rowid = handleUpdateRowId(row);
4290
+ handleRowCache(row, index, items, parentRow ? -1 : index, parentRow, rowid, nodes.length - 1, (0, _util.toTreePathSeq)(path));
4291
+ }, {
4292
+ children: mapChildrenField
4293
+ });
3676
4294
  } else {
3677
4295
  tableFullData.forEach((row, index, items) => {
3678
4296
  handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1);
@@ -4501,277 +5119,32 @@ const Methods = {
4501
5119
  } = checkboxOpts;
4502
5120
  const childrenField = treeOpts.children || treeOpts.childrenField;
4503
5121
  let rowList = [];
4504
- if (updateCheckboxFlag) {
4505
- if (checkField) {
4506
- if (treeConfig) {
4507
- const currTableData = isFull ? transform ? tableFullTreeData : tableFullData : transform ? tableFullTreeData : afterFullData;
4508
- rowList = _xeUtils.default.filterTree(currTableData, row => _xeUtils.default.get(row, checkField), {
4509
- children: transform ? mapChildrenField : childrenField
4510
- });
4511
- } else {
4512
- const currTableData = isFull ? tableFullData : afterFullData;
4513
- rowList = currTableData.filter(row => _xeUtils.default.get(row, checkField));
4514
- }
4515
- } else {
4516
- _xeUtils.default.each(selectCheckboxMaps, (row, rowid) => {
4517
- if (isFull) {
4518
- if (fullDataRowIdData[rowid]) {
4519
- rowList.push(fullDataRowIdData[rowid].row);
4520
- }
4521
- } else {
4522
- if (afterFullRowMaps[rowid]) {
4523
- rowList.push(afterFullRowMaps[rowid]);
4524
- }
4525
- }
4526
- });
4527
- }
4528
- }
4529
- return rowList;
4530
- },
4531
- /**
4532
- * 获取处理后全量的表格数据
4533
- * 如果存在筛选条件,继续处理
4534
- */
4535
- updateAfterFullData() {
4536
- const $xeTable = this;
4537
- const props = $xeTable;
4538
- const internalData = $xeTable;
4539
- const {
4540
- treeConfig
4541
- } = props;
4542
- const {
4543
- tableFullColumn,
4544
- tableFullData,
4545
- tableFullTreeData
4546
- } = internalData;
4547
- const filterOpts = $xeTable.computeFilterOpts;
4548
- const sortOpts = $xeTable.computeSortOpts;
4549
- const treeOpts = $xeTable.computeTreeOpts;
4550
- const childrenField = treeOpts.children || treeOpts.childrenField;
4551
- const {
4552
- transform,
4553
- rowField,
4554
- parentField,
4555
- mapChildrenField
4556
- } = treeOpts;
4557
- const {
4558
- isEvery,
4559
- remote: allRemoteFilter,
4560
- filterMethod: allFilterMethod
4561
- } = filterOpts;
4562
- const {
4563
- remote: allRemoteSort,
4564
- sortMethod: allSortMethod,
4565
- multiple: sortMultiple,
4566
- chronological
4567
- } = sortOpts;
4568
- let tableData = [];
4569
- let tableTree = [];
4570
- // 处理数据
4571
- if (!allRemoteFilter || !allRemoteSort) {
4572
- const filterColumns = [];
4573
- let orderColumns = [];
4574
- tableFullColumn.forEach(column => {
4575
- const {
4576
- field,
4577
- sortable,
4578
- order,
4579
- filters
4580
- } = column;
4581
- if (!allRemoteFilter && filters && filters.length) {
4582
- const valueList = [];
4583
- const itemList = [];
4584
- filters.forEach(item => {
4585
- if (item.checked) {
4586
- itemList.push(item);
4587
- valueList.push(item.value);
4588
- }
4589
- });
4590
- if (itemList.length) {
4591
- filterColumns.push({
4592
- column,
4593
- valueList,
4594
- itemList
4595
- });
4596
- }
4597
- }
4598
- if (!allRemoteSort && sortable && order) {
4599
- orderColumns.push({
4600
- column,
4601
- field,
4602
- property: field,
4603
- order: order,
4604
- sortTime: column.sortTime
4605
- });
4606
- }
4607
- });
4608
- if (sortMultiple && chronological && orderColumns.length > 1) {
4609
- orderColumns = _xeUtils.default.orderBy(orderColumns, 'sortTime');
4610
- }
4611
- // 处理筛选
4612
- // 支持单列、多列、组合筛选
4613
- if (!allRemoteFilter && filterColumns.length) {
4614
- const handleFilter = row => {
4615
- return filterColumns.every(({
4616
- column,
4617
- valueList,
4618
- itemList
4619
- }) => {
4620
- const {
4621
- filterMethod,
4622
- filterRender
4623
- } = column;
4624
- const compConf = (0, _utils.isEnableConf)(filterRender) ? renderer.get(filterRender.name) : null;
4625
- const compFilterMethod = compConf ? compConf.tableFilterMethod || compConf.filterMethod : null;
4626
- const tdFilterMethod = compConf ? compConf.tableFilterDefaultMethod || compConf.defaultTableFilterMethod || compConf.defaultFilterMethod : null;
4627
- const cellValue = (0, _util.getCellValue)(row, column);
4628
- if (filterMethod) {
4629
- return itemList.some(item => filterMethod({
4630
- value: item.value,
4631
- option: item,
4632
- cellValue,
4633
- row,
4634
- column,
4635
- $table: $xeTable
4636
- }));
4637
- } else if (compFilterMethod) {
4638
- return itemList.some(item => compFilterMethod({
4639
- value: item.value,
4640
- option: item,
4641
- cellValue,
4642
- row,
4643
- column,
4644
- $table: $xeTable
4645
- }));
4646
- } else if (allFilterMethod) {
4647
- return allFilterMethod({
4648
- options: itemList,
4649
- values: valueList,
4650
- cellValue,
4651
- row,
4652
- column
4653
- });
4654
- } else if (tdFilterMethod) {
4655
- return itemList.some(item => tdFilterMethod({
4656
- value: item.value,
4657
- option: item,
4658
- cellValue,
4659
- row,
4660
- column,
4661
- $table: $xeTable
4662
- }));
4663
- }
4664
- return valueList.indexOf(_xeUtils.default.get(row, column.field)) > -1;
4665
- });
4666
- };
4667
- if (treeConfig && transform) {
4668
- // 筛选虚拟树
4669
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, handleFilter, {
4670
- original: true,
4671
- isEvery,
4672
- children: mapChildrenField,
4673
- mapChildren: childrenField
5122
+ if (updateCheckboxFlag) {
5123
+ if (checkField) {
5124
+ if (treeConfig) {
5125
+ const currTableData = isFull ? transform ? tableFullTreeData : tableFullData : transform ? tableFullTreeData : afterFullData;
5126
+ rowList = _xeUtils.default.filterTree(currTableData, row => _xeUtils.default.get(row, checkField), {
5127
+ children: transform ? mapChildrenField : childrenField
4674
5128
  });
4675
- tableData = tableTree;
4676
5129
  } else {
4677
- tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
4678
- tableTree = tableData;
5130
+ const currTableData = isFull ? tableFullData : afterFullData;
5131
+ rowList = currTableData.filter(row => _xeUtils.default.get(row, checkField));
4679
5132
  }
4680
5133
  } else {
4681
- if (treeConfig && transform) {
4682
- // 还原虚拟树
4683
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
4684
- original: true,
4685
- isEvery,
4686
- children: mapChildrenField,
4687
- mapChildren: childrenField
4688
- });
4689
- tableData = tableTree;
4690
- } else {
4691
- tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
4692
- tableTree = tableData;
4693
- }
4694
- }
4695
- // 处理排序(不能用于树形结构)
4696
- // 支持单列、多列、组合排序
4697
- if (!allRemoteSort && orderColumns.length) {
4698
- if (treeConfig && transform) {
4699
- // 虚拟树和列表一样,只能排序根级节点
4700
- if (allSortMethod) {
4701
- const sortRests = allSortMethod({
4702
- data: tableTree,
4703
- sortList: orderColumns,
4704
- $table: $xeTable
4705
- });
4706
- tableTree = _xeUtils.default.isArray(sortRests) ? sortRests : tableTree;
4707
- } else {
4708
- const treeList = _xeUtils.default.toTreeArray(tableTree, {
4709
- children: mapChildrenField
4710
- });
4711
- tableTree = _xeUtils.default.toArrayTree(_xeUtils.default.orderBy(treeList, orderColumns.map(({
4712
- column,
4713
- order
4714
- }) => [getOrderField($xeTable, column), order])), {
4715
- key: rowField,
4716
- parentKey: parentField,
4717
- children: childrenField,
4718
- mapChildren: mapChildrenField
4719
- });
4720
- }
4721
- tableData = tableTree;
4722
- } else {
4723
- if (allSortMethod) {
4724
- const sortRests = allSortMethod({
4725
- data: tableData,
4726
- sortList: orderColumns,
4727
- $table: $xeTable
4728
- });
4729
- tableData = _xeUtils.default.isArray(sortRests) ? sortRests : tableData;
5134
+ _xeUtils.default.each(selectCheckboxMaps, (row, rowid) => {
5135
+ if (isFull) {
5136
+ if (fullDataRowIdData[rowid]) {
5137
+ rowList.push(fullDataRowIdData[rowid].row);
5138
+ }
4730
5139
  } else {
4731
- // 兼容 v4
4732
- if (sortMultiple) {
4733
- tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
4734
- column,
4735
- order
4736
- }) => [getOrderField(this, column), order]));
4737
- } else {
4738
- const firstOrderColumn = orderColumns[0];
4739
- let sortByConfs;
4740
- // 已废弃,兼容 v2,在 v4 中废弃, sortBy 不能为数组
4741
- if (_xeUtils.default.isArray(firstOrderColumn.sortBy)) {
4742
- sortByConfs = firstOrderColumn.sortBy.map(item => [item, firstOrderColumn.order]);
4743
- }
4744
- tableData = _xeUtils.default.orderBy(tableData, sortByConfs || [firstOrderColumn].map(({
4745
- column,
4746
- order
4747
- }) => [getOrderField(this, column), order]));
5140
+ if (afterFullRowMaps[rowid]) {
5141
+ rowList.push(afterFullRowMaps[rowid]);
4748
5142
  }
4749
- tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
4750
- column,
4751
- order
4752
- }) => [getOrderField($xeTable, column), order]));
4753
5143
  }
4754
- tableTree = tableData;
4755
- }
4756
- }
4757
- } else {
4758
- if (treeConfig && transform) {
4759
- // 还原虚拟树
4760
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
4761
- original: true,
4762
- isEvery,
4763
- children: treeOpts.mapChildrenField,
4764
- mapChildren: childrenField
4765
5144
  });
4766
- tableData = tableTree;
4767
- } else {
4768
- tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
4769
- tableTree = tableData;
4770
5145
  }
4771
5146
  }
4772
- internalData.afterFullData = tableData;
4773
- internalData.afterTreeFullData = tableTree;
4774
- updateAfterDataIndex($xeTable);
5147
+ return rowList;
4775
5148
  },
4776
5149
  /**
4777
5150
  * 预编译
@@ -5155,6 +5528,7 @@ const Methods = {
5155
5528
  const storeData = getCustomStorageMap(tableId);
5156
5529
  if (restoreStore) {
5157
5530
  return Promise.resolve(restoreStore({
5531
+ $table: $xeTable,
5158
5532
  id: tableId,
5159
5533
  type: 'restore',
5160
5534
  storeData
@@ -5230,6 +5604,7 @@ const Methods = {
5230
5604
  resizableData[colKey] = column.renderWidth;
5231
5605
  }
5232
5606
  if (isCustomVisible && (!checkMethod || checkMethod({
5607
+ $table: $xeTable,
5233
5608
  column
5234
5609
  }))) {
5235
5610
  if (!column.visible && column.defaultVisible) {
@@ -5290,6 +5665,7 @@ const Methods = {
5290
5665
  } : this.getCustomStoreData();
5291
5666
  if (updateStore) {
5292
5667
  return updateStore({
5668
+ $table: $xeTable,
5293
5669
  id: tableId,
5294
5670
  type,
5295
5671
  storeData
@@ -6283,8 +6659,7 @@ const Methods = {
6283
6659
  const hasDeleteKey = keyCode === 46;
6284
6660
  const isF2 = keyCode === 113;
6285
6661
  const isContextMenu = keyCode === 93;
6286
- const hasMetaKey = evnt.metaKey;
6287
- const hasCtrlKey = evnt.ctrlKey;
6662
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
6288
6663
  const hasShiftKey = evnt.shiftKey;
6289
6664
  const hasAltKey = evnt.altKey;
6290
6665
  const operArrow = isLeftArrow || isUpArrow || isRightArrow || isDwArrow;
@@ -6350,7 +6725,7 @@ const Methods = {
6350
6725
  enterMethod
6351
6726
  } = keyboardOpts;
6352
6727
  // 退出选中
6353
- if (hasCtrlKey) {
6728
+ if (isControlKey) {
6354
6729
  // 如果是激活编辑状态,则取消编辑
6355
6730
  if (actived.row) {
6356
6731
  const params = actived.args;
@@ -6525,7 +6900,7 @@ const Methods = {
6525
6900
  };
6526
6901
  $xeTable.setTreeExpand(parentRow, false).then(() => $xeTable.scrollToRow(parentRow)).then(() => $xeTable.triggerCurrentRowEvent(evnt, params));
6527
6902
  }
6528
- } else if (keyboardConfig && keyboardOpts.isEdit && !hasCtrlKey && !hasMetaKey && (isSpacebar || keyCode >= 48 && keyCode <= 57 || keyCode >= 65 && keyCode <= 90 || keyCode >= 96 && keyCode <= 111 || keyCode >= 186 && keyCode <= 192 || keyCode >= 219 && keyCode <= 222)) {
6903
+ } else if (keyboardConfig && keyboardOpts.isEdit && !isControlKey && (isSpacebar || keyCode >= 48 && keyCode <= 57 || keyCode >= 65 && keyCode <= 90 || keyCode >= 96 && keyCode <= 111 || keyCode >= 186 && keyCode <= 192 || keyCode >= 219 && keyCode <= 222)) {
6529
6904
  const {
6530
6905
  editMethod
6531
6906
  } = keyboardOpts;
@@ -6975,9 +7350,13 @@ const Methods = {
6975
7350
  const {
6976
7351
  treeConfig
6977
7352
  } = props;
7353
+ const {
7354
+ isRowGroupStatus
7355
+ } = reactData;
6978
7356
  const {
6979
7357
  selectCheckboxMaps
6980
7358
  } = internalData;
7359
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
6981
7360
  const treeOpts = $xeTable.computeTreeOpts;
6982
7361
  const {
6983
7362
  transform,
@@ -6997,10 +7376,11 @@ const Methods = {
6997
7376
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
6998
7377
  if (checkField) {
6999
7378
  // 树结构
7000
- if (treeConfig && !checkStrictly) {
7379
+ if ((treeConfig || isRowGroupStatus) && !checkStrictly) {
7001
7380
  // 更新子节点状态
7002
7381
  _xeUtils.default.eachTree(rows, row => {
7003
7382
  if (isForce || !checkMethod || checkMethod({
7383
+ $table: $xeTable,
7004
7384
  row
7005
7385
  })) {
7006
7386
  _xeUtils.default.set(row, checkField, checked);
@@ -7018,6 +7398,7 @@ const Methods = {
7018
7398
  // 列表
7019
7399
  rows.forEach(row => {
7020
7400
  if (isForce || !checkMethod || checkMethod({
7401
+ $table: $xeTable,
7021
7402
  row
7022
7403
  })) {
7023
7404
  _xeUtils.default.set(row, checkField, checked);
@@ -7028,32 +7409,58 @@ const Methods = {
7028
7409
  return;
7029
7410
  }
7030
7411
  // 树结构
7031
- if (treeConfig && !checkStrictly) {
7032
- // 更新子节点状态
7033
- _xeUtils.default.eachTree(rows, row => {
7034
- const rowid = handleGetRowId(row);
7035
- if (isForce || !checkMethod || checkMethod({
7036
- row
7037
- })) {
7038
- if (checked) {
7039
- selectCheckboxMaps[rowid] = row;
7040
- } else {
7041
- if (selectCheckboxMaps[rowid]) {
7042
- delete selectCheckboxMaps[rowid];
7412
+ if (!checkStrictly) {
7413
+ if (isRowGroupStatus) {
7414
+ // 更新行分组节点状态
7415
+ _xeUtils.default.eachTree(rows, row => {
7416
+ const rowid = handleGetRowId(row);
7417
+ if (isForce || !checkMethod || checkMethod({
7418
+ $table: $xeTable,
7419
+ row
7420
+ })) {
7421
+ if (checked) {
7422
+ selectCheckboxMaps[rowid] = row;
7423
+ } else {
7424
+ if (selectCheckboxMaps[rowid]) {
7425
+ delete selectCheckboxMaps[rowid];
7426
+ }
7043
7427
  }
7428
+ handleCheckboxReserveRow($xeTable, row, checked);
7044
7429
  }
7045
- handleCheckboxReserveRow($xeTable, row, checked);
7046
- }
7047
- }, {
7048
- children: transform ? mapChildrenField : childrenField
7049
- });
7050
- reactData.updateCheckboxFlag++;
7051
- return;
7430
+ }, {
7431
+ children: rowGroupOpts.mapChildrenField
7432
+ });
7433
+ reactData.updateCheckboxFlag++;
7434
+ return;
7435
+ } else if (treeConfig) {
7436
+ // 更新子节点状态
7437
+ _xeUtils.default.eachTree(rows, row => {
7438
+ const rowid = handleGetRowId(row);
7439
+ if (isForce || !checkMethod || checkMethod({
7440
+ $table: $xeTable,
7441
+ row
7442
+ })) {
7443
+ if (checked) {
7444
+ selectCheckboxMaps[rowid] = row;
7445
+ } else {
7446
+ if (selectCheckboxMaps[rowid]) {
7447
+ delete selectCheckboxMaps[rowid];
7448
+ }
7449
+ }
7450
+ handleCheckboxReserveRow($xeTable, row, checked);
7451
+ }
7452
+ }, {
7453
+ children: transform ? mapChildrenField : childrenField
7454
+ });
7455
+ reactData.updateCheckboxFlag++;
7456
+ return;
7457
+ }
7052
7458
  }
7053
7459
  // 列表
7054
7460
  rows.forEach(row => {
7055
7461
  const rowid = handleGetRowId(row);
7056
7462
  if (isForce || !checkMethod || checkMethod({
7463
+ $table: $xeTable,
7057
7464
  row
7058
7465
  })) {
7059
7466
  if (checked) {
@@ -7113,10 +7520,17 @@ const Methods = {
7113
7520
  triggerCheckRowEvent(evnt, params, checked) {
7114
7521
  const $xeTable = this;
7115
7522
  const props = $xeTable;
7523
+ const reactData = $xeTable;
7116
7524
  const internalData = $xeTable;
7525
+ const {
7526
+ treeConfig
7527
+ } = props;
7117
7528
  const {
7118
7529
  row
7119
7530
  } = params;
7531
+ const {
7532
+ isRowGroupStatus
7533
+ } = reactData;
7120
7534
  const {
7121
7535
  afterFullData
7122
7536
  } = internalData;
@@ -7129,7 +7543,7 @@ const Methods = {
7129
7543
  return;
7130
7544
  }
7131
7545
  evnt.stopPropagation();
7132
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
7546
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !(treeConfig || isRowGroupStatus)) {
7133
7547
  const checkboxRecords = $xeTable.getCheckboxRecords();
7134
7548
  if (checkboxRecords.length) {
7135
7549
  const firstRow = checkboxRecords[0];
@@ -7149,6 +7563,7 @@ const Methods = {
7149
7563
  }
7150
7564
  }
7151
7565
  if (!checkMethod || checkMethod({
7566
+ $table: $xeTable,
7152
7567
  row
7153
7568
  })) {
7154
7569
  $xeTable.handleBatchSelectRows([row], checked);
@@ -7196,14 +7611,16 @@ const Methods = {
7196
7611
  treeConfig
7197
7612
  } = props;
7198
7613
  const {
7614
+ isRowGroupStatus
7615
+ } = reactData;
7616
+ const {
7617
+ afterTreeFullData,
7618
+ afterGroupFullData,
7199
7619
  selectCheckboxMaps,
7200
7620
  treeIndeterminateRowMaps
7201
7621
  } = internalData;
7622
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7202
7623
  const treeOpts = $xeTable.computeTreeOpts;
7203
- const {
7204
- transform,
7205
- mapChildrenField
7206
- } = treeOpts;
7207
7624
  const childrenField = treeOpts.children || treeOpts.childrenField;
7208
7625
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7209
7626
  const {
@@ -7211,29 +7628,47 @@ const Methods = {
7211
7628
  checkStrictly,
7212
7629
  checkMethod
7213
7630
  } = checkboxOpts;
7214
- const {
7215
- afterTreeFullData
7216
- } = internalData;
7217
7631
  if (checkStrictly) {
7218
7632
  return;
7219
7633
  }
7220
- // 树结构
7221
- if (treeConfig) {
7634
+ if (isRowGroupStatus || treeConfig) {
7222
7635
  const {
7223
7636
  handleGetRowId
7224
7637
  } = (0, _util.createHandleGetRowId)($xeTable);
7225
7638
  const childRowMaps = {};
7226
7639
  const childRowList = [];
7227
- _xeUtils.default.eachTree(afterTreeFullData, row => {
7228
- const rowid = handleGetRowId(row);
7229
- const childList = row[transform ? mapChildrenField : childrenField];
7230
- if (childList && childList.length && !childRowMaps[rowid]) {
7231
- childRowMaps[rowid] = 1;
7232
- childRowList.unshift([row, rowid, childList]);
7640
+ if (isRowGroupStatus) {
7641
+ // 行分组
7642
+ const mapChildrenField = rowGroupOpts.mapChildrenField;
7643
+ if (mapChildrenField) {
7644
+ _xeUtils.default.eachTree(afterGroupFullData, row => {
7645
+ const rowid = handleGetRowId(row);
7646
+ const childList = row[mapChildrenField];
7647
+ if (childList && childList.length && !childRowMaps[rowid]) {
7648
+ childRowMaps[rowid] = 1;
7649
+ childRowList.unshift([row, rowid, childList]);
7650
+ }
7651
+ }, {
7652
+ children: mapChildrenField
7653
+ });
7233
7654
  }
7234
- }, {
7235
- children: transform ? mapChildrenField : childrenField
7236
- });
7655
+ } else if (treeConfig) {
7656
+ // 树结构
7657
+ const {
7658
+ transform,
7659
+ mapChildrenField
7660
+ } = treeOpts;
7661
+ _xeUtils.default.eachTree(afterTreeFullData, row => {
7662
+ const rowid = handleGetRowId(row);
7663
+ const childList = row[transform ? mapChildrenField : childrenField];
7664
+ if (childList && childList.length && !childRowMaps[rowid]) {
7665
+ childRowMaps[rowid] = 1;
7666
+ childRowList.unshift([row, rowid, childList]);
7667
+ }
7668
+ }, {
7669
+ children: transform ? mapChildrenField : childrenField
7670
+ });
7671
+ }
7237
7672
  childRowList.forEach(vals => {
7238
7673
  const row = vals[0];
7239
7674
  const rowid = vals[1];
@@ -7245,6 +7680,7 @@ const Methods = {
7245
7680
  const childRowid = handleGetRowId(item);
7246
7681
  const isSelect = checkField ? _xeUtils.default.get(item, checkField) : selectCheckboxMaps[childRowid];
7247
7682
  if (checkMethod({
7683
+ $table: $xeTable,
7248
7684
  row: item
7249
7685
  })) {
7250
7686
  if (isSelect) {
@@ -7308,9 +7744,13 @@ const Methods = {
7308
7744
  const {
7309
7745
  treeConfig
7310
7746
  } = props;
7747
+ const {
7748
+ isRowGroupStatus
7749
+ } = reactData;
7311
7750
  const {
7312
7751
  afterFullData,
7313
7752
  afterTreeFullData,
7753
+ afterGroupFullData,
7314
7754
  checkboxReserveRowMap,
7315
7755
  selectCheckboxMaps,
7316
7756
  treeIndeterminateRowMaps
@@ -7327,11 +7767,12 @@ const Methods = {
7327
7767
  let sLen = 0; // 已选
7328
7768
  let hLen = 0; // 半选
7329
7769
  let vLen = 0; // 有效行
7330
- const rootList = treeConfig ? afterTreeFullData : afterFullData;
7770
+ const rootList = treeConfig ? afterTreeFullData : isRowGroupStatus ? afterGroupFullData : afterFullData;
7331
7771
  rootList.forEach(checkMethod ? row => {
7332
7772
  const childRowid = handleGetRowId(row);
7333
7773
  const selected = checkField ? _xeUtils.default.get(row, checkField) : selectCheckboxMaps[childRowid];
7334
7774
  if (checkMethod({
7775
+ $table: $xeTable,
7335
7776
  row
7336
7777
  })) {
7337
7778
  if (selected) {
@@ -7920,6 +8361,7 @@ const Methods = {
7920
8361
  const radioOpts = $xeTable.computeRadioOpts;
7921
8362
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7922
8363
  const keyboardOpts = $xeTable.computeKeyboardOpts;
8364
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7923
8365
  const rowOpts = $xeTable.computeRowOpts;
7924
8366
  const columnOpts = $xeTable.computeColumnOpts;
7925
8367
  const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
@@ -7933,7 +8375,8 @@ const Methods = {
7933
8375
  } = params;
7934
8376
  const {
7935
8377
  type,
7936
- treeNode
8378
+ treeNode,
8379
+ rowGroupNode
7937
8380
  } = column;
7938
8381
  const isRadioType = type === 'radio';
7939
8382
  const isCheckboxType = type === 'checkbox';
@@ -7941,8 +8384,9 @@ const Methods = {
7941
8384
  const cell = evnt.currentTarget;
7942
8385
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
7943
8386
  const triggerCheckbox = isCheckboxType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--checkbox').flag;
7944
- const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-tree--btn-wrapper').flag;
8387
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
7945
8388
  const triggerExpandNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-table--expanded').flag;
8389
+ const triggerRowGroupNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-row-group--node-btn').flag;
7946
8390
  params = Object.assign({
7947
8391
  cell,
7948
8392
  triggerRadio,
@@ -7959,11 +8403,15 @@ const Methods = {
7959
8403
  if (treeOpts.trigger === 'row' || treeNode && treeOpts.trigger === 'cell') {
7960
8404
  $xeTable.triggerTreeExpandEvent(evnt, params);
7961
8405
  }
8406
+ // 如果是行分组
8407
+ if (rowGroupOpts.trigger === 'row' || rowGroupNode && rowGroupOpts.trigger === 'cell') {
8408
+ $xeTable.triggerRowGroupExpandEvent(evnt, params);
8409
+ }
7962
8410
  }
7963
8411
  // 如果点击了树节点
7964
8412
  if (!triggerTreeNode) {
7965
- if (!triggerExpandNode) {
7966
- // 如果是高亮行
8413
+ if (!triggerExpandNode && !triggerRowGroupNode) {
8414
+ // 如果是当前行
7967
8415
  if (rowOpts.isCurrent || highlightCurrentRow) {
7968
8416
  if (!triggerCheckbox && !triggerRadio) {
7969
8417
  $xeTable.triggerCurrentRowEvent(evnt, params);
@@ -8229,7 +8677,7 @@ const Methods = {
8229
8677
  const triggerInput = cell && cell.tagName && cell.tagName.toLowerCase() === 'input';
8230
8678
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
8231
8679
  const triggerCheckbox = isCheckboxType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--checkbox').flag;
8232
- const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-tree--btn-wrapper').flag;
8680
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
8233
8681
  const triggerExpandNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-table--expanded').flag;
8234
8682
  let isColDragCell = false;
8235
8683
  if (rowOpts.drag) {
@@ -8546,7 +8994,7 @@ const Methods = {
8546
8994
  evnt.preventDefault();
8547
8995
  return;
8548
8996
  }
8549
- const hasCtrlKey = evnt.ctrlKey;
8997
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8550
8998
  const trEl = evnt.currentTarget;
8551
8999
  const rowid = trEl.getAttribute('rowid') || '';
8552
9000
  const rest = fullAllDataRowIdData[rowid];
@@ -8560,10 +9008,10 @@ const Methods = {
8560
9008
  } = reactData;
8561
9009
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y;
8562
9010
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom';
8563
- internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && hasCtrlKey);
9011
+ internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && isControlKey);
8564
9012
  internalData.prevDragRow = row;
8565
9013
  internalData.prevDragPos = dragPos;
8566
- if ($xeTable.eqRow(dragRow, row) || hasCtrlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded || !isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level)) {
9014
+ if ($xeTable.eqRow(dragRow, row) || isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded || !isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level)) {
8567
9015
  showDropTip($xeTable, evnt, trEl, null, false, dragPos);
8568
9016
  return;
8569
9017
  }
@@ -8862,7 +9310,7 @@ const Methods = {
8862
9310
  evnt.preventDefault();
8863
9311
  return;
8864
9312
  }
8865
- const hasCtrlKey = evnt.ctrlKey;
9313
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8866
9314
  const thEl = evnt.currentTarget;
8867
9315
  const colid = thEl.getAttribute('colid');
8868
9316
  const column = $xeTable.getColumnById(colid);
@@ -8873,7 +9321,7 @@ const Methods = {
8873
9321
  } = evnt;
8874
9322
  const offsetX = clientX - thEl.getBoundingClientRect().x;
8875
9323
  const dragPos = offsetX < thEl.clientWidth / 2 ? 'left' : 'right';
8876
- internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && hasCtrlKey);
9324
+ internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && isControlKey);
8877
9325
  internalData.prevDragCol = column;
8878
9326
  internalData.prevDragPos = dragPos;
8879
9327
  if (column.fixed || dragCol && dragCol.id === column.id || !isCrossDrag && (isPeerDrag ? dragCol.parentId !== column.parentId : column.parentId)) {
@@ -9336,7 +9784,7 @@ const Methods = {
9336
9784
  const reactData = $xeTable;
9337
9785
  const internalData = $xeTable;
9338
9786
  const {
9339
- expandColumn: column
9787
+ expandColumn
9340
9788
  } = reactData;
9341
9789
  const {
9342
9790
  rowExpandLazyLoadedMaps
@@ -9356,12 +9804,12 @@ const Methods = {
9356
9804
  const rowid = (0, _util.getRowid)($xeTable, row);
9357
9805
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
9358
9806
  const expanded = !$xeTable.isRowExpandByRow(row);
9359
- const columnIndex = $xeTable.getColumnIndex(column);
9360
- const $columnIndex = $xeTable.getVMColumnIndex(column);
9807
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9808
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9361
9809
  $xeTable.setRowExpand(row, expanded);
9362
9810
  $xeTable.dispatchEvent('toggle-row-expand', {
9363
9811
  expanded,
9364
- column,
9812
+ column: expandColumn,
9365
9813
  columnIndex,
9366
9814
  $columnIndex,
9367
9815
  row,
@@ -9430,8 +9878,8 @@ const Methods = {
9430
9878
  toggleMethod
9431
9879
  } = expandOpts;
9432
9880
  const lazyRests = [];
9433
- const columnIndex = $xeTable.getColumnIndex(expandColumn);
9434
- const $columnIndex = $xeTable.getVMColumnIndex(expandColumn);
9881
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9882
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9435
9883
  if (rows) {
9436
9884
  if (!_xeUtils.default.isArray(rows)) {
9437
9885
  rows = [rows];
@@ -9555,6 +10003,104 @@ const Methods = {
9555
10003
  });
9556
10004
  return rest;
9557
10005
  },
10006
+ setRowGroups(fieldOrColumns) {
10007
+ const $xeTable = this;
10008
+ const props = $xeTable;
10009
+ const internalData = $xeTable;
10010
+ const {
10011
+ rowGroupConfig
10012
+ } = props;
10013
+ if (!rowGroupConfig) {
10014
+ (0, _log.errLog)('vxe.error.reqProp', ['row-group-config']);
10015
+ return $xeTable.$nextTick();
10016
+ }
10017
+ if (fieldOrColumns) {
10018
+ handleUpdateRowGroup($xeTable, (_xeUtils.default.isArray(fieldOrColumns) ? fieldOrColumns : [fieldOrColumns]).map(fieldOrColumn => {
10019
+ return _xeUtils.default.isString(fieldOrColumn) ? fieldOrColumn : fieldOrColumn.field;
10020
+ }));
10021
+ return loadTableData($xeTable, internalData.tableSynchData, true);
10022
+ }
10023
+ return $xeTable.$nextTick();
10024
+ },
10025
+ clearRowGroups() {
10026
+ const $xeTable = this;
10027
+ const props = $xeTable;
10028
+ const internalData = $xeTable;
10029
+ const {
10030
+ rowGroupConfig
10031
+ } = props;
10032
+ if (!rowGroupConfig) {
10033
+ (0, _log.errLog)('vxe.error.reqProp', ['row-group-config']);
10034
+ return $xeTable.$nextTick();
10035
+ }
10036
+ handleUpdateRowGroup($xeTable, []);
10037
+ return loadTableData($xeTable, internalData.tableSynchData, true);
10038
+ },
10039
+ isRowGroupRecord(row) {
10040
+ const $xeTable = this;
10041
+ const reactData = $xeTable;
10042
+ const {
10043
+ isRowGroupStatus
10044
+ } = reactData;
10045
+ return isRowGroupStatus && row.isAggregate;
10046
+ },
10047
+ isRowGroupExpandByRow(row) {
10048
+ const $xeTable = this;
10049
+ const reactData = $xeTable;
10050
+ const internalData = $xeTable;
10051
+ const {
10052
+ rowGroupExpandedFlag
10053
+ } = reactData;
10054
+ const {
10055
+ rowGroupExpandedMaps
10056
+ } = internalData;
10057
+ return !!rowGroupExpandedFlag && !!rowGroupExpandedMaps[(0, _util.getRowid)($xeTable, row)];
10058
+ },
10059
+ setRowGroupExpand(rows, expanded) {
10060
+ const $xeTable = this;
10061
+ if (rows) {
10062
+ if (!_xeUtils.default.isArray(rows)) {
10063
+ rows = [rows];
10064
+ }
10065
+ return handleRowGroupVirtualExpand($xeTable, rows, expanded);
10066
+ }
10067
+ return $xeTable.$nextTick();
10068
+ },
10069
+ setAllRowGroupExpand(expanded) {
10070
+ const $xeTable = this;
10071
+ const reactData = $xeTable;
10072
+ const internalData = $xeTable;
10073
+ const {
10074
+ tableFullGroupData
10075
+ } = internalData;
10076
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
10077
+ const {
10078
+ mapChildrenField
10079
+ } = rowGroupOpts;
10080
+ const rgExpandedMaps = {};
10081
+ if (expanded && mapChildrenField) {
10082
+ _xeUtils.default.eachTree(tableFullGroupData, row => {
10083
+ if (row[mapChildrenField] && row[mapChildrenField].length) {
10084
+ rgExpandedMaps[(0, _util.getRowid)($xeTable, row)] = row;
10085
+ }
10086
+ }, {
10087
+ children: mapChildrenField
10088
+ });
10089
+ }
10090
+ internalData.rowGroupExpandedMaps = rgExpandedMaps;
10091
+ handleVirtualTreeToList($xeTable);
10092
+ reactData.rowGroupExpandedFlag++;
10093
+ return $xeTable.handleTableData();
10094
+ },
10095
+ clearRowGroupExpand() {
10096
+ const $xeTable = this;
10097
+ const reactData = $xeTable;
10098
+ const internalData = $xeTable;
10099
+ internalData.rowGroupExpandedMaps = {};
10100
+ handleVirtualTreeToList($xeTable);
10101
+ reactData.rowGroupExpandedFlag++;
10102
+ return $xeTable.handleTableData();
10103
+ },
9558
10104
  getTreeExpandRecords() {
9559
10105
  const $xeTable = this;
9560
10106
  const internalData = $xeTable;
@@ -9622,11 +10168,11 @@ const Methods = {
9622
10168
  });
9623
10169
  }
9624
10170
  internalData.treeExpandedMaps = {};
9625
- reactData.treeExpandedFlag++;
9626
10171
  if (transform) {
9627
10172
  handleVirtualTreeToList($xeTable);
9628
- return $xeTable.handleTableData();
10173
+ $xeTable.handleTableData();
9629
10174
  }
10175
+ reactData.treeExpandedFlag++;
9630
10176
  return $xeTable.$nextTick();
9631
10177
  },
9632
10178
  /**
@@ -9635,6 +10181,7 @@ const Methods = {
9635
10181
  */
9636
10182
  reloadTreeExpand(row) {
9637
10183
  const $xeTable = this;
10184
+ const reactData = $xeTable;
9638
10185
  const internalData = $xeTable;
9639
10186
  const {
9640
10187
  treeExpandLazyLoadedMaps
@@ -9652,8 +10199,9 @@ const Methods = {
9652
10199
  }).then(() => {
9653
10200
  if (transform) {
9654
10201
  handleVirtualTreeToList($xeTable);
9655
- return $xeTable.handleTableData();
10202
+ $xeTable.handleTableData();
9656
10203
  }
10204
+ reactData.treeExpandedFlag++;
9657
10205
  }).then(() => {
9658
10206
  return $xeTable.recalculate();
9659
10207
  });
@@ -9668,6 +10216,40 @@ const Methods = {
9668
10216
  // 即将废弃
9669
10217
  return $xeTable.reloadTreeExpand(row);
9670
10218
  },
10219
+ /**
10220
+ * 行分组事件
10221
+ */
10222
+ triggerRowGroupExpandEvent(evnt, params) {
10223
+ const $xeTable = this;
10224
+ const internalData = $xeTable;
10225
+ const {
10226
+ rowGroupExpandedMaps
10227
+ } = internalData;
10228
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
10229
+ const {
10230
+ row,
10231
+ column
10232
+ } = params;
10233
+ const {
10234
+ trigger
10235
+ } = rowGroupOpts;
10236
+ if (trigger === 'manual') {
10237
+ return;
10238
+ }
10239
+ evnt.stopPropagation();
10240
+ const rowid = (0, _util.getRowid)($xeTable, row);
10241
+ const expanded = !rowGroupExpandedMaps[rowid];
10242
+ const columnIndex = $xeTable.getColumnIndex(column);
10243
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
10244
+ $xeTable.setRowGroupExpand(row, expanded);
10245
+ $xeTable.dispatchEvent('toggle-row-group-expand', {
10246
+ expanded,
10247
+ column,
10248
+ columnIndex,
10249
+ $columnIndex,
10250
+ row
10251
+ }, evnt);
10252
+ },
9671
10253
  /**
9672
10254
  * 展开树节点事件
9673
10255
  */
@@ -9728,11 +10310,15 @@ const Methods = {
9728
10310
  * @param {Boolean} expanded 是否展开
9729
10311
  */
9730
10312
  setAllTreeExpand(expanded) {
10313
+ const $xeTable = this;
10314
+ const reactData = $xeTable;
10315
+ const internalData = $xeTable;
9731
10316
  const {
9732
- tableFullData,
9733
- treeOpts
9734
- } = this;
10317
+ tableFullData
10318
+ } = internalData;
10319
+ const treeOpts = $xeTable.computeTreeOpts;
9735
10320
  const {
10321
+ transform,
9736
10322
  lazy
9737
10323
  } = treeOpts;
9738
10324
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -9745,7 +10331,13 @@ const Methods = {
9745
10331
  }, {
9746
10332
  children: childrenField
9747
10333
  });
9748
- return this.setTreeExpand(expandeds, expanded);
10334
+ return $xeTable.setTreeExpand(expandeds, expanded).then(() => {
10335
+ if (transform) {
10336
+ handleVirtualTreeToList($xeTable);
10337
+ reactData.treeExpandedFlag++;
10338
+ return $xeTable.recalculate();
10339
+ }
10340
+ });
9749
10341
  },
9750
10342
  /**
9751
10343
  * 设置展开树形节点,二个参数设置这一行展开与否
@@ -9811,7 +10403,6 @@ const Methods = {
9811
10403
  } = treeOpts;
9812
10404
  const expList = $xeTable.getTreeExpandRecords();
9813
10405
  internalData.treeExpandedMaps = {};
9814
- reactData.treeExpandedFlag++;
9815
10406
  if (reserve) {
9816
10407
  _xeUtils.default.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), {
9817
10408
  children: childrenField
@@ -9820,8 +10411,9 @@ const Methods = {
9820
10411
  return $xeTable.handleTableData().then(() => {
9821
10412
  if (transform) {
9822
10413
  handleVirtualTreeToList($xeTable);
9823
- return $xeTable.handleTableData();
10414
+ $xeTable.handleTableData();
9824
10415
  }
10416
+ reactData.treeExpandedFlag++;
9825
10417
  }).then(() => {
9826
10418
  if (expList.length) {
9827
10419
  $xeTable.recalculate();
@@ -10712,27 +11304,37 @@ const Methods = {
10712
11304
  * @param {Row} row 行对象
10713
11305
  */
10714
11306
  scrollToTreeRow(row) {
11307
+ const $xeTable = this;
11308
+ const props = $xeTable;
11309
+ const reactData = $xeTable;
11310
+ const internalData = $xeTable;
10715
11311
  const {
10716
- tableFullData,
10717
- treeConfig,
10718
- treeOpts
10719
- } = this;
10720
- const childrenField = treeOpts.children || treeOpts.childrenField;
11312
+ treeConfig
11313
+ } = props;
11314
+ const {
11315
+ isRowGroupStatus
11316
+ } = reactData;
11317
+ const {
11318
+ tableFullData
11319
+ } = internalData;
10721
11320
  const rests = [];
10722
- if (treeConfig) {
10723
- const matchObj = _xeUtils.default.findTree(tableFullData, item => item === row, {
10724
- children: childrenField
11321
+ if (treeConfig || isRowGroupStatus) {
11322
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
11323
+ const treeOpts = $xeTable.computeTreeOpts;
11324
+ const childrenField = treeOpts.children || treeOpts.childrenField;
11325
+ const matchObj = _xeUtils.default.findTree(tableFullData, item => $xeTable.eqRow(item, row), {
11326
+ children: isRowGroupStatus ? rowGroupOpts.mapChildrenField : childrenField
10725
11327
  });
10726
11328
  if (matchObj) {
10727
11329
  const nodes = matchObj.nodes;
10728
11330
  nodes.forEach((row, index) => {
10729
- if (index < nodes.length - 1 && !this.isTreeExpandByRow(row)) {
10730
- rests.push(this.setTreeExpand(row, true));
11331
+ if (index < nodes.length - 1 && !$xeTable.isTreeExpandByRow(row)) {
11332
+ rests.push($xeTable.setTreeExpand(row, true));
10731
11333
  }
10732
11334
  });
10733
11335
  }
10734
11336
  }
10735
- return Promise.all(rests).then(() => (0, _util.rowToVisible)(this, row));
11337
+ return Promise.all(rests).then(() => (0, _util.rowToVisible)($xeTable, row));
10736
11338
  },
10737
11339
  /**
10738
11340
  * 手动清除滚动相关信息,还原到初始状态