vxe-table 3.15.4 → 3.15.6

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 +979 -497
  34. package/es/table/src/props.js +9 -7
  35. package/es/table/src/table.js +108 -35
  36. package/es/table/style.css +71 -41
  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 +71 -41
  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 +1730 -860
  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 +1159 -564
  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 +71 -41
  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 +71 -41
  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 +1012 -514
  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 +133 -93
  166. /package/es/{iconfont.1744768256934.ttf → iconfont.1745197894601.ttf} +0 -0
  167. /package/es/{iconfont.1744768256934.woff → iconfont.1745197894601.woff} +0 -0
  168. /package/es/{iconfont.1744768256934.woff2 → iconfont.1745197894601.woff2} +0 -0
  169. /package/lib/{iconfont.1744768256934.ttf → iconfont.1745197894601.ttf} +0 -0
  170. /package/lib/{iconfont.1744768256934.woff → iconfont.1745197894601.woff} +0 -0
  171. /package/lib/{iconfont.1744768256934.woff2 → iconfont.1745197894601.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,275 @@ 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.insertRowMaps = {};
3147
+ internalData.removeRowMaps = {};
3148
+ const sYLoad = updateScrollYStatus($xeTable, fullData);
3149
+ reactData.isDragColMove = false;
3150
+ reactData.isDragRowMove = false;
3151
+ // 全量数据
3152
+ internalData.tableFullData = fullData;
3153
+ internalData.tableFullTreeData = isRGroup ? [] : treeData;
3154
+ internalData.tableFullGroupData = isRGroup ? treeData : [];
3155
+ // 缓存数据
3156
+ $xeTable.cacheRowMap(isReset);
3157
+ // 原始数据
3158
+ internalData.tableSynchData = datas;
3159
+ if (isReset) {
3160
+ internalData.isResizeCellHeight = false;
3161
+ }
3162
+ // 克隆原数据,用于显示编辑状态,与编辑值做对比
3163
+ if (keepSource) {
3164
+ $xeTable.cacheSourceMap(fullData);
3165
+ }
3166
+ if ($xeTable.clearCellAreas && props.mouseConfig) {
3167
+ $xeTable.clearCellAreas();
3168
+ $xeTable.clearCopyCellArea();
3169
+ }
3170
+ $xeTable.clearMergeCells();
3171
+ $xeTable.clearMergeFooterItems();
3172
+ $xeTable.handleTableData(true);
3173
+ $xeTable.updateFooter();
3174
+ $xeTable.handleUpdateBodyMerge();
3175
+ return $xeTable.$nextTick().then(() => {
3176
+ updateHeight($xeTable);
3177
+ updateStyle($xeTable);
3178
+ }).then(() => {
3179
+ computeScrollLoad($xeTable);
3180
+ }).then(() => {
3181
+ // 是否启用了虚拟滚动
3182
+ if (sYLoad) {
3183
+ scrollYStore.endIndex = scrollYStore.visibleSize;
3184
+ }
3185
+ if (sYLoad) {
3186
+ if (reactData.expandColumn && expandOpts.mode !== 'fixed') {
3187
+ (0, _log.errLog)('vxe.error.notConflictProp', ['column.type="expand', 'expand-config.mode="fixed"']);
3188
+ }
3189
+ // if (showOverflow) {
3190
+ // if (!rowOpts.height) {
3191
+ // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
3192
+ // if (errColumn) {
3193
+ // errLog('vxe.error.errProp', [`column[field="${errColumn.field}"].show-overflow=false`, 'show-overflow=true'])
3194
+ // }
3195
+ // }
3196
+ // }
3197
+ if (!(props.height || props.maxHeight)) {
3198
+ (0, _log.errLog)('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']);
3199
+ }
3200
+ // if (!props.showOverflow) {
3201
+ // warnLog('vxe.error.reqProp', ['table.show-overflow'])
3202
+ // }
3203
+ if (props.spanMethod) {
3204
+ (0, _log.errLog)('vxe.error.scrollErrProp', ['table.span-method']);
3205
+ }
3206
+ }
3207
+ handleReserveStatus($xeTable);
3208
+ $xeTable.checkSelectionStatus();
3209
+ return new Promise(resolve => {
3210
+ $xeTable.$nextTick().then(() => handleRecalculateLayout($xeTable, false)).then(() => {
3211
+ calcCellHeight($xeTable);
3212
+ updateRowOffsetTop($xeTable);
3213
+ return handleRecalculateLayout($xeTable, false);
3214
+ }).then(() => {
3215
+ let targetScrollLeft = lastScrollLeft;
3216
+ let targetScrollTop = lastScrollTop;
3217
+ const virtualXOpts = $xeTable.computeVirtualXOpts;
3218
+ const virtualYOpts = $xeTable.computeVirtualYOpts;
3219
+ // 是否在更新数据之后自动滚动重置滚动条
3220
+ if (virtualXOpts.scrollToLeftOnChange) {
3221
+ targetScrollLeft = 0;
3222
+ }
3223
+ if (virtualYOpts.scrollToTopOnChange) {
3224
+ targetScrollTop = 0;
3225
+ }
3226
+ reactData.isRowLoading = false;
3227
+ handleRecalculateLayout($xeTable, false);
3228
+ // 是否变更虚拟滚动
3229
+ if (oldScrollYLoad === sYLoad) {
3230
+ (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3231
+ resolve();
3232
+ });
3233
+ } else {
3234
+ setTimeout(() => {
3235
+ (0, _util.restoreScrollLocation)($xeTable, targetScrollLeft, targetScrollTop).then(() => {
3236
+ resolve();
3237
+ });
3238
+ });
3239
+ }
3240
+ });
3241
+ });
3242
+ });
3243
+ }
3244
+ /**
3245
+ * 处理数据加载默认行为
2494
3246
  * 默认执行一次,除非被重置
2495
3247
  */
2496
3248
  function handleLoadDefaults($xeTable) {
@@ -3246,16 +3998,23 @@ const Methods = {
3246
3998
  clearAll() {
3247
3999
  return (0, _util.clearTableAllStatus)(this);
3248
4000
  },
4001
+ handleUpdateRowGroup(groupFields) {
4002
+ const $xeTable = this;
4003
+ handleUpdateRowGroup($xeTable, groupFields);
4004
+ },
3249
4005
  /**
3250
4006
  * 同步 data 数据(即将废弃)
3251
4007
  * 如果用了该方法,那么组件将不再记录增删改的状态,只能自行实现对应逻辑
3252
4008
  * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到
3253
4009
  */
3254
4010
  syncData() {
4011
+ const $xeTable = this;
4012
+ const reactData = $xeTable;
4013
+ const internalData = $xeTable;
3255
4014
  (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));
4015
+ return $xeTable.$nextTick().then(() => {
4016
+ reactData.tableData = [];
4017
+ return $xeTable.$nextTick().then(() => loadTableData($xeTable, internalData.tableFullData, true));
3259
4018
  });
3260
4019
  },
3261
4020
  /**
@@ -3303,23 +4062,23 @@ const Methods = {
3303
4062
  // 是否进行数据处理
3304
4063
  if (force) {
3305
4064
  // 更新数据,处理筛选和排序
3306
- this.updateAfterFullData();
4065
+ updateAfterFullData($xeTable);
3307
4066
  // 如果为虚拟树,将树结构拍平
3308
4067
  fullList = handleVirtualTreeToList($xeTable);
3309
4068
  }
3310
4069
  const tableData = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
3311
4070
  const visibleDataRowIdMaps = {};
3312
4071
  tableData.forEach((row, $index) => {
3313
- const rowid = (0, _util.getRowid)(this, row);
4072
+ const rowid = (0, _util.getRowid)($xeTable, row);
3314
4073
  const rest = fullDataRowIdData[rowid];
3315
4074
  if (rest) {
3316
4075
  rest.$index = $index;
3317
4076
  }
3318
4077
  visibleDataRowIdMaps[rowid] = row;
3319
4078
  });
3320
- this.tableData = tableData;
4079
+ reactData.tableData = tableData;
3321
4080
  internalData.visibleDataRowIdData = visibleDataRowIdMaps;
3322
- return this.$nextTick();
4081
+ return $xeTable.$nextTick();
3323
4082
  },
3324
4083
  /**
3325
4084
  * 加载表格数据
@@ -3327,169 +4086,7 @@ const Methods = {
3327
4086
  */
3328
4087
  loadTableData(datas, isReset) {
3329
4088
  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
- });
4089
+ return loadTableData($xeTable, datas, isReset);
3493
4090
  },
3494
4091
  /**
3495
4092
  * 重新加载数据,不会清空表格状态
@@ -3500,7 +4097,7 @@ const Methods = {
3500
4097
  const {
3501
4098
  initStatus
3502
4099
  } = this;
3503
- return this.loadTableData(datas, false).then(() => {
4100
+ return loadTableData($xeTable, datas, false).then(() => {
3504
4101
  this.inited = true;
3505
4102
  this.initStatus = true;
3506
4103
  if (!initStatus) {
@@ -3518,7 +4115,7 @@ const Methods = {
3518
4115
  return this.clearAll().then(() => {
3519
4116
  this.inited = true;
3520
4117
  this.initStatus = true;
3521
- return this.loadTableData(datas, true);
4118
+ return loadTableData($xeTable, datas, true);
3522
4119
  }).then(() => {
3523
4120
  handleLoadDefaults($xeTable);
3524
4121
  return this.recalculate();
@@ -3608,18 +4205,16 @@ const Methods = {
3608
4205
  const {
3609
4206
  treeConfig
3610
4207
  } = props;
4208
+ const {
4209
+ isRowGroupStatus
4210
+ } = reactData;
3611
4211
  const {
3612
4212
  fullAllDataRowIdData,
3613
4213
  tableFullData,
3614
4214
  tableFullTreeData,
4215
+ tableFullGroupData,
3615
4216
  treeExpandedMaps
3616
4217
  } = 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
4218
  const fullAllDataRowIdMaps = isReset ? {} : Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
3624
4219
  const fullDataRowIdMaps = {};
3625
4220
  const {
@@ -3657,6 +4252,12 @@ const Methods = {
3657
4252
  fullAllDataRowIdMaps[rowid] = rowRest;
3658
4253
  };
3659
4254
  if (treeConfig) {
4255
+ const treeOpts = $xeTable.computeTreeOpts;
4256
+ const {
4257
+ lazy
4258
+ } = treeOpts;
4259
+ const childrenField = treeOpts.children || treeOpts.childrenField;
4260
+ const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
3660
4261
  _xeUtils.default.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
3661
4262
  const rowid = handleUpdateRowId(row);
3662
4263
  if (treeConfig && lazy) {
@@ -3673,6 +4274,17 @@ const Methods = {
3673
4274
  }, {
3674
4275
  children: childrenField
3675
4276
  });
4277
+ } else if (isRowGroupStatus) {
4278
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
4279
+ const {
4280
+ mapChildrenField
4281
+ } = rowGroupOpts;
4282
+ _xeUtils.default.eachTree(tableFullGroupData, (row, index, items, path, parentRow, nodes) => {
4283
+ const rowid = handleUpdateRowId(row);
4284
+ handleRowCache(row, index, items, parentRow ? -1 : index, parentRow, rowid, nodes.length - 1, (0, _util.toTreePathSeq)(path));
4285
+ }, {
4286
+ children: mapChildrenField
4287
+ });
3676
4288
  } else {
3677
4289
  tableFullData.forEach((row, index, items) => {
3678
4290
  handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1);
@@ -4485,7 +5097,6 @@ const Methods = {
4485
5097
  const {
4486
5098
  tableFullData,
4487
5099
  afterFullData,
4488
- afterTreeFullData,
4489
5100
  tableFullTreeData,
4490
5101
  fullDataRowIdData,
4491
5102
  afterFullRowMaps,
@@ -4501,278 +5112,33 @@ const Methods = {
4501
5112
  checkField
4502
5113
  } = checkboxOpts;
4503
5114
  const childrenField = treeOpts.children || treeOpts.childrenField;
4504
- let rowList = [];
4505
- if (updateCheckboxFlag) {
4506
- if (checkField) {
4507
- if (treeConfig) {
4508
- const currTableData = isFull ? transform ? tableFullTreeData : tableFullData : transform ? afterTreeFullData : afterFullData;
4509
- rowList = _xeUtils.default.filterTree(currTableData, row => _xeUtils.default.get(row, checkField), {
4510
- children: transform ? mapChildrenField : childrenField
4511
- });
4512
- } else {
4513
- const currTableData = isFull ? tableFullData : afterFullData;
4514
- rowList = currTableData.filter(row => _xeUtils.default.get(row, checkField));
4515
- }
4516
- } else {
4517
- _xeUtils.default.each(selectCheckboxMaps, (row, rowid) => {
4518
- if (isFull) {
4519
- if (fullDataRowIdData[rowid]) {
4520
- rowList.push(fullDataRowIdData[rowid].row);
4521
- }
4522
- } else {
4523
- if (afterFullRowMaps[rowid]) {
4524
- rowList.push(afterFullRowMaps[rowid]);
4525
- }
4526
- }
4527
- });
4528
- }
4529
- }
4530
- return rowList;
4531
- },
4532
- /**
4533
- * 获取处理后全量的表格数据
4534
- * 如果存在筛选条件,继续处理
4535
- */
4536
- updateAfterFullData() {
4537
- const $xeTable = this;
4538
- const props = $xeTable;
4539
- const internalData = $xeTable;
4540
- const {
4541
- treeConfig
4542
- } = props;
4543
- const {
4544
- tableFullColumn,
4545
- tableFullData,
4546
- tableFullTreeData
4547
- } = internalData;
4548
- const filterOpts = $xeTable.computeFilterOpts;
4549
- const sortOpts = $xeTable.computeSortOpts;
4550
- const treeOpts = $xeTable.computeTreeOpts;
4551
- const childrenField = treeOpts.children || treeOpts.childrenField;
4552
- const {
4553
- transform,
4554
- rowField,
4555
- parentField,
4556
- mapChildrenField
4557
- } = treeOpts;
4558
- const {
4559
- isEvery,
4560
- remote: allRemoteFilter,
4561
- filterMethod: allFilterMethod
4562
- } = filterOpts;
4563
- const {
4564
- remote: allRemoteSort,
4565
- sortMethod: allSortMethod,
4566
- multiple: sortMultiple,
4567
- chronological
4568
- } = sortOpts;
4569
- let tableData = [];
4570
- let tableTree = [];
4571
- // 处理数据
4572
- if (!allRemoteFilter || !allRemoteSort) {
4573
- const filterColumns = [];
4574
- let orderColumns = [];
4575
- tableFullColumn.forEach(column => {
4576
- const {
4577
- field,
4578
- sortable,
4579
- order,
4580
- filters
4581
- } = column;
4582
- if (!allRemoteFilter && filters && filters.length) {
4583
- const valueList = [];
4584
- const itemList = [];
4585
- filters.forEach(item => {
4586
- if (item.checked) {
4587
- itemList.push(item);
4588
- valueList.push(item.value);
4589
- }
4590
- });
4591
- if (itemList.length) {
4592
- filterColumns.push({
4593
- column,
4594
- valueList,
4595
- itemList
4596
- });
4597
- }
4598
- }
4599
- if (!allRemoteSort && sortable && order) {
4600
- orderColumns.push({
4601
- column,
4602
- field,
4603
- property: field,
4604
- order: order,
4605
- sortTime: column.sortTime
4606
- });
4607
- }
4608
- });
4609
- if (sortMultiple && chronological && orderColumns.length > 1) {
4610
- orderColumns = _xeUtils.default.orderBy(orderColumns, 'sortTime');
4611
- }
4612
- // 处理筛选
4613
- // 支持单列、多列、组合筛选
4614
- if (!allRemoteFilter && filterColumns.length) {
4615
- const handleFilter = row => {
4616
- return filterColumns.every(({
4617
- column,
4618
- valueList,
4619
- itemList
4620
- }) => {
4621
- const {
4622
- filterMethod,
4623
- filterRender
4624
- } = column;
4625
- const compConf = (0, _utils.isEnableConf)(filterRender) ? renderer.get(filterRender.name) : null;
4626
- const compFilterMethod = compConf ? compConf.tableFilterMethod || compConf.filterMethod : null;
4627
- const tdFilterMethod = compConf ? compConf.tableFilterDefaultMethod || compConf.defaultTableFilterMethod || compConf.defaultFilterMethod : null;
4628
- const cellValue = (0, _util.getCellValue)(row, column);
4629
- if (filterMethod) {
4630
- return itemList.some(item => filterMethod({
4631
- value: item.value,
4632
- option: item,
4633
- cellValue,
4634
- row,
4635
- column,
4636
- $table: $xeTable
4637
- }));
4638
- } else if (compFilterMethod) {
4639
- return itemList.some(item => compFilterMethod({
4640
- value: item.value,
4641
- option: item,
4642
- cellValue,
4643
- row,
4644
- column,
4645
- $table: $xeTable
4646
- }));
4647
- } else if (allFilterMethod) {
4648
- return allFilterMethod({
4649
- options: itemList,
4650
- values: valueList,
4651
- cellValue,
4652
- row,
4653
- column
4654
- });
4655
- } else if (tdFilterMethod) {
4656
- return itemList.some(item => tdFilterMethod({
4657
- value: item.value,
4658
- option: item,
4659
- cellValue,
4660
- row,
4661
- column,
4662
- $table: $xeTable
4663
- }));
4664
- }
4665
- return valueList.indexOf(_xeUtils.default.get(row, column.field)) > -1;
4666
- });
4667
- };
4668
- if (treeConfig && transform) {
4669
- // 筛选虚拟树
4670
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, handleFilter, {
4671
- original: true,
4672
- isEvery,
4673
- children: mapChildrenField,
4674
- mapChildren: childrenField
5115
+ let rowList = [];
5116
+ if (updateCheckboxFlag) {
5117
+ if (checkField) {
5118
+ if (treeConfig) {
5119
+ const currTableData = isFull ? transform ? tableFullTreeData : tableFullData : transform ? tableFullTreeData : afterFullData;
5120
+ rowList = _xeUtils.default.filterTree(currTableData, row => _xeUtils.default.get(row, checkField), {
5121
+ children: transform ? mapChildrenField : childrenField
4675
5122
  });
4676
- tableData = tableTree;
4677
5123
  } else {
4678
- tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
4679
- tableTree = tableData;
5124
+ const currTableData = isFull ? tableFullData : afterFullData;
5125
+ rowList = currTableData.filter(row => _xeUtils.default.get(row, checkField));
4680
5126
  }
4681
5127
  } else {
4682
- if (treeConfig && transform) {
4683
- // 还原虚拟树
4684
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
4685
- original: true,
4686
- isEvery,
4687
- children: mapChildrenField,
4688
- mapChildren: childrenField
4689
- });
4690
- tableData = tableTree;
4691
- } else {
4692
- tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
4693
- tableTree = tableData;
4694
- }
4695
- }
4696
- // 处理排序(不能用于树形结构)
4697
- // 支持单列、多列、组合排序
4698
- if (!allRemoteSort && orderColumns.length) {
4699
- if (treeConfig && transform) {
4700
- // 虚拟树和列表一样,只能排序根级节点
4701
- if (allSortMethod) {
4702
- const sortRests = allSortMethod({
4703
- data: tableTree,
4704
- sortList: orderColumns,
4705
- $table: $xeTable
4706
- });
4707
- tableTree = _xeUtils.default.isArray(sortRests) ? sortRests : tableTree;
4708
- } else {
4709
- const treeList = _xeUtils.default.toTreeArray(tableTree, {
4710
- children: mapChildrenField
4711
- });
4712
- tableTree = _xeUtils.default.toArrayTree(_xeUtils.default.orderBy(treeList, orderColumns.map(({
4713
- column,
4714
- order
4715
- }) => [getOrderField($xeTable, column), order])), {
4716
- key: rowField,
4717
- parentKey: parentField,
4718
- children: childrenField,
4719
- mapChildren: mapChildrenField
4720
- });
4721
- }
4722
- tableData = tableTree;
4723
- } else {
4724
- if (allSortMethod) {
4725
- const sortRests = allSortMethod({
4726
- data: tableData,
4727
- sortList: orderColumns,
4728
- $table: $xeTable
4729
- });
4730
- tableData = _xeUtils.default.isArray(sortRests) ? sortRests : tableData;
5128
+ _xeUtils.default.each(selectCheckboxMaps, (row, rowid) => {
5129
+ if (isFull) {
5130
+ if (fullDataRowIdData[rowid]) {
5131
+ rowList.push(fullDataRowIdData[rowid].row);
5132
+ }
4731
5133
  } else {
4732
- // 兼容 v4
4733
- if (sortMultiple) {
4734
- tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
4735
- column,
4736
- order
4737
- }) => [getOrderField(this, column), order]));
4738
- } else {
4739
- const firstOrderColumn = orderColumns[0];
4740
- let sortByConfs;
4741
- // 已废弃,兼容 v2,在 v4 中废弃, sortBy 不能为数组
4742
- if (_xeUtils.default.isArray(firstOrderColumn.sortBy)) {
4743
- sortByConfs = firstOrderColumn.sortBy.map(item => [item, firstOrderColumn.order]);
4744
- }
4745
- tableData = _xeUtils.default.orderBy(tableData, sortByConfs || [firstOrderColumn].map(({
4746
- column,
4747
- order
4748
- }) => [getOrderField(this, column), order]));
5134
+ if (afterFullRowMaps[rowid]) {
5135
+ rowList.push(afterFullRowMaps[rowid]);
4749
5136
  }
4750
- tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
4751
- column,
4752
- order
4753
- }) => [getOrderField($xeTable, column), order]));
4754
5137
  }
4755
- tableTree = tableData;
4756
- }
4757
- }
4758
- } else {
4759
- if (treeConfig && transform) {
4760
- // 还原虚拟树
4761
- tableTree = _xeUtils.default.searchTree(tableFullTreeData, () => true, {
4762
- original: true,
4763
- isEvery,
4764
- children: treeOpts.mapChildrenField,
4765
- mapChildren: childrenField
4766
5138
  });
4767
- tableData = tableTree;
4768
- } else {
4769
- tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
4770
- tableTree = tableData;
4771
5139
  }
4772
5140
  }
4773
- internalData.afterFullData = tableData;
4774
- internalData.afterTreeFullData = tableTree;
4775
- updateAfterDataIndex($xeTable);
5141
+ return rowList;
4776
5142
  },
4777
5143
  /**
4778
5144
  * 预编译
@@ -5156,6 +5522,7 @@ const Methods = {
5156
5522
  const storeData = getCustomStorageMap(tableId);
5157
5523
  if (restoreStore) {
5158
5524
  return Promise.resolve(restoreStore({
5525
+ $table: $xeTable,
5159
5526
  id: tableId,
5160
5527
  type: 'restore',
5161
5528
  storeData
@@ -5231,6 +5598,7 @@ const Methods = {
5231
5598
  resizableData[colKey] = column.renderWidth;
5232
5599
  }
5233
5600
  if (isCustomVisible && (!checkMethod || checkMethod({
5601
+ $table: $xeTable,
5234
5602
  column
5235
5603
  }))) {
5236
5604
  if (!column.visible && column.defaultVisible) {
@@ -5291,6 +5659,7 @@ const Methods = {
5291
5659
  } : this.getCustomStoreData();
5292
5660
  if (updateStore) {
5293
5661
  return updateStore({
5662
+ $table: $xeTable,
5294
5663
  id: tableId,
5295
5664
  type,
5296
5665
  storeData
@@ -6284,8 +6653,7 @@ const Methods = {
6284
6653
  const hasDeleteKey = keyCode === 46;
6285
6654
  const isF2 = keyCode === 113;
6286
6655
  const isContextMenu = keyCode === 93;
6287
- const hasMetaKey = evnt.metaKey;
6288
- const hasCtrlKey = evnt.ctrlKey;
6656
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
6289
6657
  const hasShiftKey = evnt.shiftKey;
6290
6658
  const hasAltKey = evnt.altKey;
6291
6659
  const operArrow = isLeftArrow || isUpArrow || isRightArrow || isDwArrow;
@@ -6351,7 +6719,7 @@ const Methods = {
6351
6719
  enterMethod
6352
6720
  } = keyboardOpts;
6353
6721
  // 退出选中
6354
- if (hasCtrlKey) {
6722
+ if (isControlKey) {
6355
6723
  // 如果是激活编辑状态,则取消编辑
6356
6724
  if (actived.row) {
6357
6725
  const params = actived.args;
@@ -6526,7 +6894,7 @@ const Methods = {
6526
6894
  };
6527
6895
  $xeTable.setTreeExpand(parentRow, false).then(() => $xeTable.scrollToRow(parentRow)).then(() => $xeTable.triggerCurrentRowEvent(evnt, params));
6528
6896
  }
6529
- } 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)) {
6897
+ } 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)) {
6530
6898
  const {
6531
6899
  editMethod
6532
6900
  } = keyboardOpts;
@@ -6976,9 +7344,13 @@ const Methods = {
6976
7344
  const {
6977
7345
  treeConfig
6978
7346
  } = props;
7347
+ const {
7348
+ isRowGroupStatus
7349
+ } = reactData;
6979
7350
  const {
6980
7351
  selectCheckboxMaps
6981
7352
  } = internalData;
7353
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
6982
7354
  const treeOpts = $xeTable.computeTreeOpts;
6983
7355
  const {
6984
7356
  transform,
@@ -6998,10 +7370,11 @@ const Methods = {
6998
7370
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
6999
7371
  if (checkField) {
7000
7372
  // 树结构
7001
- if (treeConfig && !checkStrictly) {
7373
+ if ((treeConfig || isRowGroupStatus) && !checkStrictly) {
7002
7374
  // 更新子节点状态
7003
7375
  _xeUtils.default.eachTree(rows, row => {
7004
7376
  if (isForce || !checkMethod || checkMethod({
7377
+ $table: $xeTable,
7005
7378
  row
7006
7379
  })) {
7007
7380
  _xeUtils.default.set(row, checkField, checked);
@@ -7019,6 +7392,7 @@ const Methods = {
7019
7392
  // 列表
7020
7393
  rows.forEach(row => {
7021
7394
  if (isForce || !checkMethod || checkMethod({
7395
+ $table: $xeTable,
7022
7396
  row
7023
7397
  })) {
7024
7398
  _xeUtils.default.set(row, checkField, checked);
@@ -7029,32 +7403,58 @@ const Methods = {
7029
7403
  return;
7030
7404
  }
7031
7405
  // 树结构
7032
- if (treeConfig && !checkStrictly) {
7033
- // 更新子节点状态
7034
- _xeUtils.default.eachTree(rows, row => {
7035
- const rowid = handleGetRowId(row);
7036
- if (isForce || !checkMethod || checkMethod({
7037
- row
7038
- })) {
7039
- if (checked) {
7040
- selectCheckboxMaps[rowid] = row;
7041
- } else {
7042
- if (selectCheckboxMaps[rowid]) {
7043
- delete selectCheckboxMaps[rowid];
7406
+ if (!checkStrictly) {
7407
+ if (isRowGroupStatus) {
7408
+ // 更新行分组节点状态
7409
+ _xeUtils.default.eachTree(rows, row => {
7410
+ const rowid = handleGetRowId(row);
7411
+ if (isForce || !checkMethod || checkMethod({
7412
+ $table: $xeTable,
7413
+ row
7414
+ })) {
7415
+ if (checked) {
7416
+ selectCheckboxMaps[rowid] = row;
7417
+ } else {
7418
+ if (selectCheckboxMaps[rowid]) {
7419
+ delete selectCheckboxMaps[rowid];
7420
+ }
7044
7421
  }
7422
+ handleCheckboxReserveRow($xeTable, row, checked);
7045
7423
  }
7046
- handleCheckboxReserveRow($xeTable, row, checked);
7047
- }
7048
- }, {
7049
- children: transform ? mapChildrenField : childrenField
7050
- });
7051
- reactData.updateCheckboxFlag++;
7052
- return;
7424
+ }, {
7425
+ children: rowGroupOpts.mapChildrenField
7426
+ });
7427
+ reactData.updateCheckboxFlag++;
7428
+ return;
7429
+ } else if (treeConfig) {
7430
+ // 更新子节点状态
7431
+ _xeUtils.default.eachTree(rows, row => {
7432
+ const rowid = handleGetRowId(row);
7433
+ if (isForce || !checkMethod || checkMethod({
7434
+ $table: $xeTable,
7435
+ row
7436
+ })) {
7437
+ if (checked) {
7438
+ selectCheckboxMaps[rowid] = row;
7439
+ } else {
7440
+ if (selectCheckboxMaps[rowid]) {
7441
+ delete selectCheckboxMaps[rowid];
7442
+ }
7443
+ }
7444
+ handleCheckboxReserveRow($xeTable, row, checked);
7445
+ }
7446
+ }, {
7447
+ children: transform ? mapChildrenField : childrenField
7448
+ });
7449
+ reactData.updateCheckboxFlag++;
7450
+ return;
7451
+ }
7053
7452
  }
7054
7453
  // 列表
7055
7454
  rows.forEach(row => {
7056
7455
  const rowid = handleGetRowId(row);
7057
7456
  if (isForce || !checkMethod || checkMethod({
7457
+ $table: $xeTable,
7058
7458
  row
7059
7459
  })) {
7060
7460
  if (checked) {
@@ -7114,10 +7514,17 @@ const Methods = {
7114
7514
  triggerCheckRowEvent(evnt, params, checked) {
7115
7515
  const $xeTable = this;
7116
7516
  const props = $xeTable;
7517
+ const reactData = $xeTable;
7117
7518
  const internalData = $xeTable;
7519
+ const {
7520
+ treeConfig
7521
+ } = props;
7118
7522
  const {
7119
7523
  row
7120
7524
  } = params;
7525
+ const {
7526
+ isRowGroupStatus
7527
+ } = reactData;
7121
7528
  const {
7122
7529
  afterFullData
7123
7530
  } = internalData;
@@ -7130,7 +7537,7 @@ const Methods = {
7130
7537
  return;
7131
7538
  }
7132
7539
  evnt.stopPropagation();
7133
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
7540
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !(treeConfig || isRowGroupStatus)) {
7134
7541
  const checkboxRecords = $xeTable.getCheckboxRecords();
7135
7542
  if (checkboxRecords.length) {
7136
7543
  const firstRow = checkboxRecords[0];
@@ -7150,6 +7557,7 @@ const Methods = {
7150
7557
  }
7151
7558
  }
7152
7559
  if (!checkMethod || checkMethod({
7560
+ $table: $xeTable,
7153
7561
  row
7154
7562
  })) {
7155
7563
  $xeTable.handleBatchSelectRows([row], checked);
@@ -7197,14 +7605,16 @@ const Methods = {
7197
7605
  treeConfig
7198
7606
  } = props;
7199
7607
  const {
7608
+ isRowGroupStatus
7609
+ } = reactData;
7610
+ const {
7611
+ afterTreeFullData,
7612
+ afterGroupFullData,
7200
7613
  selectCheckboxMaps,
7201
7614
  treeIndeterminateRowMaps
7202
7615
  } = internalData;
7616
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7203
7617
  const treeOpts = $xeTable.computeTreeOpts;
7204
- const {
7205
- transform,
7206
- mapChildrenField
7207
- } = treeOpts;
7208
7618
  const childrenField = treeOpts.children || treeOpts.childrenField;
7209
7619
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7210
7620
  const {
@@ -7212,29 +7622,47 @@ const Methods = {
7212
7622
  checkStrictly,
7213
7623
  checkMethod
7214
7624
  } = checkboxOpts;
7215
- const {
7216
- afterTreeFullData
7217
- } = internalData;
7218
7625
  if (checkStrictly) {
7219
7626
  return;
7220
7627
  }
7221
- // 树结构
7222
- if (treeConfig) {
7628
+ if (isRowGroupStatus || treeConfig) {
7223
7629
  const {
7224
7630
  handleGetRowId
7225
7631
  } = (0, _util.createHandleGetRowId)($xeTable);
7226
7632
  const childRowMaps = {};
7227
7633
  const childRowList = [];
7228
- _xeUtils.default.eachTree(afterTreeFullData, row => {
7229
- const rowid = handleGetRowId(row);
7230
- const childList = row[transform ? mapChildrenField : childrenField];
7231
- if (childList && childList.length && !childRowMaps[rowid]) {
7232
- childRowMaps[rowid] = 1;
7233
- childRowList.unshift([row, rowid, childList]);
7634
+ if (isRowGroupStatus) {
7635
+ // 行分组
7636
+ const mapChildrenField = rowGroupOpts.mapChildrenField;
7637
+ if (mapChildrenField) {
7638
+ _xeUtils.default.eachTree(afterGroupFullData, row => {
7639
+ const rowid = handleGetRowId(row);
7640
+ const childList = row[mapChildrenField];
7641
+ if (childList && childList.length && !childRowMaps[rowid]) {
7642
+ childRowMaps[rowid] = 1;
7643
+ childRowList.unshift([row, rowid, childList]);
7644
+ }
7645
+ }, {
7646
+ children: mapChildrenField
7647
+ });
7234
7648
  }
7235
- }, {
7236
- children: transform ? mapChildrenField : childrenField
7237
- });
7649
+ } else if (treeConfig) {
7650
+ // 树结构
7651
+ const {
7652
+ transform,
7653
+ mapChildrenField
7654
+ } = treeOpts;
7655
+ _xeUtils.default.eachTree(afterTreeFullData, row => {
7656
+ const rowid = handleGetRowId(row);
7657
+ const childList = row[transform ? mapChildrenField : childrenField];
7658
+ if (childList && childList.length && !childRowMaps[rowid]) {
7659
+ childRowMaps[rowid] = 1;
7660
+ childRowList.unshift([row, rowid, childList]);
7661
+ }
7662
+ }, {
7663
+ children: transform ? mapChildrenField : childrenField
7664
+ });
7665
+ }
7238
7666
  childRowList.forEach(vals => {
7239
7667
  const row = vals[0];
7240
7668
  const rowid = vals[1];
@@ -7246,6 +7674,7 @@ const Methods = {
7246
7674
  const childRowid = handleGetRowId(item);
7247
7675
  const isSelect = checkField ? _xeUtils.default.get(item, checkField) : selectCheckboxMaps[childRowid];
7248
7676
  if (checkMethod({
7677
+ $table: $xeTable,
7249
7678
  row: item
7250
7679
  })) {
7251
7680
  if (isSelect) {
@@ -7309,9 +7738,13 @@ const Methods = {
7309
7738
  const {
7310
7739
  treeConfig
7311
7740
  } = props;
7741
+ const {
7742
+ isRowGroupStatus
7743
+ } = reactData;
7312
7744
  const {
7313
7745
  afterFullData,
7314
7746
  afterTreeFullData,
7747
+ afterGroupFullData,
7315
7748
  checkboxReserveRowMap,
7316
7749
  selectCheckboxMaps,
7317
7750
  treeIndeterminateRowMaps
@@ -7328,11 +7761,12 @@ const Methods = {
7328
7761
  let sLen = 0; // 已选
7329
7762
  let hLen = 0; // 半选
7330
7763
  let vLen = 0; // 有效行
7331
- const rootList = treeConfig ? afterTreeFullData : afterFullData;
7764
+ const rootList = treeConfig ? afterTreeFullData : isRowGroupStatus ? afterGroupFullData : afterFullData;
7332
7765
  rootList.forEach(checkMethod ? row => {
7333
7766
  const childRowid = handleGetRowId(row);
7334
7767
  const selected = checkField ? _xeUtils.default.get(row, checkField) : selectCheckboxMaps[childRowid];
7335
7768
  if (checkMethod({
7769
+ $table: $xeTable,
7336
7770
  row
7337
7771
  })) {
7338
7772
  if (selected) {
@@ -7921,6 +8355,7 @@ const Methods = {
7921
8355
  const radioOpts = $xeTable.computeRadioOpts;
7922
8356
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7923
8357
  const keyboardOpts = $xeTable.computeKeyboardOpts;
8358
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7924
8359
  const rowOpts = $xeTable.computeRowOpts;
7925
8360
  const columnOpts = $xeTable.computeColumnOpts;
7926
8361
  const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
@@ -7934,7 +8369,8 @@ const Methods = {
7934
8369
  } = params;
7935
8370
  const {
7936
8371
  type,
7937
- treeNode
8372
+ treeNode,
8373
+ rowGroupNode
7938
8374
  } = column;
7939
8375
  const isRadioType = type === 'radio';
7940
8376
  const isCheckboxType = type === 'checkbox';
@@ -7942,8 +8378,9 @@ const Methods = {
7942
8378
  const cell = evnt.currentTarget;
7943
8379
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
7944
8380
  const triggerCheckbox = isCheckboxType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--checkbox').flag;
7945
- const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-tree--btn-wrapper').flag;
8381
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
7946
8382
  const triggerExpandNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-table--expanded').flag;
8383
+ const triggerRowGroupNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-row-group--node-btn').flag;
7947
8384
  params = Object.assign({
7948
8385
  cell,
7949
8386
  triggerRadio,
@@ -7960,11 +8397,15 @@ const Methods = {
7960
8397
  if (treeOpts.trigger === 'row' || treeNode && treeOpts.trigger === 'cell') {
7961
8398
  $xeTable.triggerTreeExpandEvent(evnt, params);
7962
8399
  }
8400
+ // 如果是行分组
8401
+ if (rowGroupOpts.trigger === 'row' || rowGroupNode && rowGroupOpts.trigger === 'cell') {
8402
+ $xeTable.triggerRowGroupExpandEvent(evnt, params);
8403
+ }
7963
8404
  }
7964
8405
  // 如果点击了树节点
7965
8406
  if (!triggerTreeNode) {
7966
- if (!triggerExpandNode) {
7967
- // 如果是高亮行
8407
+ if (!triggerExpandNode && !triggerRowGroupNode) {
8408
+ // 如果是当前行
7968
8409
  if (rowOpts.isCurrent || highlightCurrentRow) {
7969
8410
  if (!triggerCheckbox && !triggerRadio) {
7970
8411
  $xeTable.triggerCurrentRowEvent(evnt, params);
@@ -8230,7 +8671,7 @@ const Methods = {
8230
8671
  const triggerInput = cell && cell.tagName && cell.tagName.toLowerCase() === 'input';
8231
8672
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
8232
8673
  const triggerCheckbox = isCheckboxType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--checkbox').flag;
8233
- const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-tree--btn-wrapper').flag;
8674
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
8234
8675
  const triggerExpandNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-table--expanded').flag;
8235
8676
  let isColDragCell = false;
8236
8677
  if (rowOpts.drag) {
@@ -8547,7 +8988,7 @@ const Methods = {
8547
8988
  evnt.preventDefault();
8548
8989
  return;
8549
8990
  }
8550
- const hasCtrlKey = evnt.ctrlKey;
8991
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8551
8992
  const trEl = evnt.currentTarget;
8552
8993
  const rowid = trEl.getAttribute('rowid') || '';
8553
8994
  const rest = fullAllDataRowIdData[rowid];
@@ -8561,10 +9002,10 @@ const Methods = {
8561
9002
  } = reactData;
8562
9003
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y;
8563
9004
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom';
8564
- internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && hasCtrlKey);
9005
+ internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && isControlKey);
8565
9006
  internalData.prevDragRow = row;
8566
9007
  internalData.prevDragPos = dragPos;
8567
- if ($xeTable.eqRow(dragRow, row) || hasCtrlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded || !isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level)) {
9008
+ if ($xeTable.eqRow(dragRow, row) || isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded || !isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level)) {
8568
9009
  showDropTip($xeTable, evnt, trEl, null, false, dragPos);
8569
9010
  return;
8570
9011
  }
@@ -8863,7 +9304,7 @@ const Methods = {
8863
9304
  evnt.preventDefault();
8864
9305
  return;
8865
9306
  }
8866
- const hasCtrlKey = evnt.ctrlKey;
9307
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8867
9308
  const thEl = evnt.currentTarget;
8868
9309
  const colid = thEl.getAttribute('colid');
8869
9310
  const column = $xeTable.getColumnById(colid);
@@ -8874,7 +9315,7 @@ const Methods = {
8874
9315
  } = evnt;
8875
9316
  const offsetX = clientX - thEl.getBoundingClientRect().x;
8876
9317
  const dragPos = offsetX < thEl.clientWidth / 2 ? 'left' : 'right';
8877
- internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && hasCtrlKey);
9318
+ internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && isControlKey);
8878
9319
  internalData.prevDragCol = column;
8879
9320
  internalData.prevDragPos = dragPos;
8880
9321
  if (column.fixed || dragCol && dragCol.id === column.id || !isCrossDrag && (isPeerDrag ? dragCol.parentId !== column.parentId : column.parentId)) {
@@ -9337,7 +9778,7 @@ const Methods = {
9337
9778
  const reactData = $xeTable;
9338
9779
  const internalData = $xeTable;
9339
9780
  const {
9340
- expandColumn: column
9781
+ expandColumn
9341
9782
  } = reactData;
9342
9783
  const {
9343
9784
  rowExpandLazyLoadedMaps
@@ -9357,12 +9798,12 @@ const Methods = {
9357
9798
  const rowid = (0, _util.getRowid)($xeTable, row);
9358
9799
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
9359
9800
  const expanded = !$xeTable.isRowExpandByRow(row);
9360
- const columnIndex = $xeTable.getColumnIndex(column);
9361
- const $columnIndex = $xeTable.getVMColumnIndex(column);
9801
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9802
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9362
9803
  $xeTable.setRowExpand(row, expanded);
9363
9804
  $xeTable.dispatchEvent('toggle-row-expand', {
9364
9805
  expanded,
9365
- column,
9806
+ column: expandColumn,
9366
9807
  columnIndex,
9367
9808
  $columnIndex,
9368
9809
  row,
@@ -9431,8 +9872,8 @@ const Methods = {
9431
9872
  toggleMethod
9432
9873
  } = expandOpts;
9433
9874
  const lazyRests = [];
9434
- const columnIndex = $xeTable.getColumnIndex(expandColumn);
9435
- const $columnIndex = $xeTable.getVMColumnIndex(expandColumn);
9875
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9876
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9436
9877
  if (rows) {
9437
9878
  if (!_xeUtils.default.isArray(rows)) {
9438
9879
  rows = [rows];
@@ -9556,6 +9997,104 @@ const Methods = {
9556
9997
  });
9557
9998
  return rest;
9558
9999
  },
10000
+ setRowGroups(fieldOrColumns) {
10001
+ const $xeTable = this;
10002
+ const props = $xeTable;
10003
+ const internalData = $xeTable;
10004
+ const {
10005
+ rowGroupConfig
10006
+ } = props;
10007
+ if (!rowGroupConfig) {
10008
+ (0, _log.errLog)('vxe.error.reqProp', ['row-group-config']);
10009
+ return $xeTable.$nextTick();
10010
+ }
10011
+ if (fieldOrColumns) {
10012
+ handleUpdateRowGroup($xeTable, (_xeUtils.default.isArray(fieldOrColumns) ? fieldOrColumns : [fieldOrColumns]).map(fieldOrColumn => {
10013
+ return _xeUtils.default.isString(fieldOrColumn) ? fieldOrColumn : fieldOrColumn.field;
10014
+ }));
10015
+ return loadTableData($xeTable, internalData.tableSynchData, true);
10016
+ }
10017
+ return $xeTable.$nextTick();
10018
+ },
10019
+ clearRowGroups() {
10020
+ const $xeTable = this;
10021
+ const props = $xeTable;
10022
+ const internalData = $xeTable;
10023
+ const {
10024
+ rowGroupConfig
10025
+ } = props;
10026
+ if (!rowGroupConfig) {
10027
+ (0, _log.errLog)('vxe.error.reqProp', ['row-group-config']);
10028
+ return $xeTable.$nextTick();
10029
+ }
10030
+ handleUpdateRowGroup($xeTable, []);
10031
+ return loadTableData($xeTable, internalData.tableSynchData, true);
10032
+ },
10033
+ isRowGroupRecord(row) {
10034
+ const $xeTable = this;
10035
+ const reactData = $xeTable;
10036
+ const {
10037
+ isRowGroupStatus
10038
+ } = reactData;
10039
+ return isRowGroupStatus && row.isAggregate;
10040
+ },
10041
+ isRowGroupExpandByRow(row) {
10042
+ const $xeTable = this;
10043
+ const reactData = $xeTable;
10044
+ const internalData = $xeTable;
10045
+ const {
10046
+ rowGroupExpandedFlag
10047
+ } = reactData;
10048
+ const {
10049
+ rowGroupExpandedMaps
10050
+ } = internalData;
10051
+ return !!rowGroupExpandedFlag && !!rowGroupExpandedMaps[(0, _util.getRowid)($xeTable, row)];
10052
+ },
10053
+ setRowGroupExpand(rows, expanded) {
10054
+ const $xeTable = this;
10055
+ if (rows) {
10056
+ if (!_xeUtils.default.isArray(rows)) {
10057
+ rows = [rows];
10058
+ }
10059
+ return handleRowGroupVirtualExpand($xeTable, rows, expanded);
10060
+ }
10061
+ return $xeTable.$nextTick();
10062
+ },
10063
+ setAllRowGroupExpand(expanded) {
10064
+ const $xeTable = this;
10065
+ const reactData = $xeTable;
10066
+ const internalData = $xeTable;
10067
+ const {
10068
+ tableFullGroupData
10069
+ } = internalData;
10070
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
10071
+ const {
10072
+ mapChildrenField
10073
+ } = rowGroupOpts;
10074
+ const rgExpandedMaps = {};
10075
+ if (expanded && mapChildrenField) {
10076
+ _xeUtils.default.eachTree(tableFullGroupData, row => {
10077
+ if (row[mapChildrenField] && row[mapChildrenField].length) {
10078
+ rgExpandedMaps[(0, _util.getRowid)($xeTable, row)] = row;
10079
+ }
10080
+ }, {
10081
+ children: mapChildrenField
10082
+ });
10083
+ }
10084
+ internalData.rowGroupExpandedMaps = rgExpandedMaps;
10085
+ handleVirtualTreeToList($xeTable);
10086
+ reactData.rowGroupExpandedFlag++;
10087
+ return $xeTable.handleTableData();
10088
+ },
10089
+ clearRowGroupExpand() {
10090
+ const $xeTable = this;
10091
+ const reactData = $xeTable;
10092
+ const internalData = $xeTable;
10093
+ internalData.rowGroupExpandedMaps = {};
10094
+ handleVirtualTreeToList($xeTable);
10095
+ reactData.rowGroupExpandedFlag++;
10096
+ return $xeTable.handleTableData();
10097
+ },
9559
10098
  getTreeExpandRecords() {
9560
10099
  const $xeTable = this;
9561
10100
  const internalData = $xeTable;
@@ -9623,11 +10162,11 @@ const Methods = {
9623
10162
  });
9624
10163
  }
9625
10164
  internalData.treeExpandedMaps = {};
9626
- reactData.treeExpandedFlag++;
9627
10165
  if (transform) {
9628
10166
  handleVirtualTreeToList($xeTable);
9629
- return $xeTable.handleTableData();
10167
+ $xeTable.handleTableData();
9630
10168
  }
10169
+ reactData.treeExpandedFlag++;
9631
10170
  return $xeTable.$nextTick();
9632
10171
  },
9633
10172
  /**
@@ -9636,6 +10175,7 @@ const Methods = {
9636
10175
  */
9637
10176
  reloadTreeExpand(row) {
9638
10177
  const $xeTable = this;
10178
+ const reactData = $xeTable;
9639
10179
  const internalData = $xeTable;
9640
10180
  const {
9641
10181
  treeExpandLazyLoadedMaps
@@ -9653,8 +10193,9 @@ const Methods = {
9653
10193
  }).then(() => {
9654
10194
  if (transform) {
9655
10195
  handleVirtualTreeToList($xeTable);
9656
- return $xeTable.handleTableData();
10196
+ $xeTable.handleTableData();
9657
10197
  }
10198
+ reactData.treeExpandedFlag++;
9658
10199
  }).then(() => {
9659
10200
  return $xeTable.recalculate();
9660
10201
  });
@@ -9669,6 +10210,40 @@ const Methods = {
9669
10210
  // 即将废弃
9670
10211
  return $xeTable.reloadTreeExpand(row);
9671
10212
  },
10213
+ /**
10214
+ * 行分组事件
10215
+ */
10216
+ triggerRowGroupExpandEvent(evnt, params) {
10217
+ const $xeTable = this;
10218
+ const internalData = $xeTable;
10219
+ const {
10220
+ rowGroupExpandedMaps
10221
+ } = internalData;
10222
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
10223
+ const {
10224
+ row,
10225
+ column
10226
+ } = params;
10227
+ const {
10228
+ trigger
10229
+ } = rowGroupOpts;
10230
+ if (trigger === 'manual') {
10231
+ return;
10232
+ }
10233
+ evnt.stopPropagation();
10234
+ const rowid = (0, _util.getRowid)($xeTable, row);
10235
+ const expanded = !rowGroupExpandedMaps[rowid];
10236
+ const columnIndex = $xeTable.getColumnIndex(column);
10237
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
10238
+ $xeTable.setRowGroupExpand(row, expanded);
10239
+ $xeTable.dispatchEvent('toggle-row-group-expand', {
10240
+ expanded,
10241
+ column,
10242
+ columnIndex,
10243
+ $columnIndex,
10244
+ row
10245
+ }, evnt);
10246
+ },
9672
10247
  /**
9673
10248
  * 展开树节点事件
9674
10249
  */
@@ -9729,11 +10304,15 @@ const Methods = {
9729
10304
  * @param {Boolean} expanded 是否展开
9730
10305
  */
9731
10306
  setAllTreeExpand(expanded) {
10307
+ const $xeTable = this;
10308
+ const reactData = $xeTable;
10309
+ const internalData = $xeTable;
9732
10310
  const {
9733
- tableFullData,
9734
- treeOpts
9735
- } = this;
10311
+ tableFullData
10312
+ } = internalData;
10313
+ const treeOpts = $xeTable.computeTreeOpts;
9736
10314
  const {
10315
+ transform,
9737
10316
  lazy
9738
10317
  } = treeOpts;
9739
10318
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -9746,7 +10325,13 @@ const Methods = {
9746
10325
  }, {
9747
10326
  children: childrenField
9748
10327
  });
9749
- return this.setTreeExpand(expandeds, expanded);
10328
+ return $xeTable.setTreeExpand(expandeds, expanded).then(() => {
10329
+ if (transform) {
10330
+ handleVirtualTreeToList($xeTable);
10331
+ reactData.treeExpandedFlag++;
10332
+ return $xeTable.recalculate();
10333
+ }
10334
+ });
9750
10335
  },
9751
10336
  /**
9752
10337
  * 设置展开树形节点,二个参数设置这一行展开与否
@@ -9812,7 +10397,6 @@ const Methods = {
9812
10397
  } = treeOpts;
9813
10398
  const expList = $xeTable.getTreeExpandRecords();
9814
10399
  internalData.treeExpandedMaps = {};
9815
- reactData.treeExpandedFlag++;
9816
10400
  if (reserve) {
9817
10401
  _xeUtils.default.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), {
9818
10402
  children: childrenField
@@ -9821,8 +10405,9 @@ const Methods = {
9821
10405
  return $xeTable.handleTableData().then(() => {
9822
10406
  if (transform) {
9823
10407
  handleVirtualTreeToList($xeTable);
9824
- return $xeTable.handleTableData();
10408
+ $xeTable.handleTableData();
9825
10409
  }
10410
+ reactData.treeExpandedFlag++;
9826
10411
  }).then(() => {
9827
10412
  if (expList.length) {
9828
10413
  $xeTable.recalculate();
@@ -10713,27 +11298,37 @@ const Methods = {
10713
11298
  * @param {Row} row 行对象
10714
11299
  */
10715
11300
  scrollToTreeRow(row) {
11301
+ const $xeTable = this;
11302
+ const props = $xeTable;
11303
+ const reactData = $xeTable;
11304
+ const internalData = $xeTable;
10716
11305
  const {
10717
- tableFullData,
10718
- treeConfig,
10719
- treeOpts
10720
- } = this;
10721
- const childrenField = treeOpts.children || treeOpts.childrenField;
11306
+ treeConfig
11307
+ } = props;
11308
+ const {
11309
+ isRowGroupStatus
11310
+ } = reactData;
11311
+ const {
11312
+ tableFullData
11313
+ } = internalData;
10722
11314
  const rests = [];
10723
- if (treeConfig) {
10724
- const matchObj = _xeUtils.default.findTree(tableFullData, item => item === row, {
10725
- children: childrenField
11315
+ if (treeConfig || isRowGroupStatus) {
11316
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
11317
+ const treeOpts = $xeTable.computeTreeOpts;
11318
+ const childrenField = treeOpts.children || treeOpts.childrenField;
11319
+ const matchObj = _xeUtils.default.findTree(tableFullData, item => $xeTable.eqRow(item, row), {
11320
+ children: isRowGroupStatus ? rowGroupOpts.mapChildrenField : childrenField
10726
11321
  });
10727
11322
  if (matchObj) {
10728
11323
  const nodes = matchObj.nodes;
10729
11324
  nodes.forEach((row, index) => {
10730
- if (index < nodes.length - 1 && !this.isTreeExpandByRow(row)) {
10731
- rests.push(this.setTreeExpand(row, true));
11325
+ if (index < nodes.length - 1 && !$xeTable.isTreeExpandByRow(row)) {
11326
+ rests.push($xeTable.setTreeExpand(row, true));
10732
11327
  }
10733
11328
  });
10734
11329
  }
10735
11330
  }
10736
- return Promise.all(rests).then(() => (0, _util.rowToVisible)(this, row));
11331
+ return Promise.all(rests).then(() => (0, _util.rowToVisible)($xeTable, row));
10737
11332
  },
10738
11333
  /**
10739
11334
  * 手动清除滚动相关信息,还原到初始状态