vxe-table 3.15.5 → 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 +977 -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 +1729 -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 +1158 -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 +1010 -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.1745197894601.ttf} +0 -0
  167. /package/es/{iconfont.1744880837792.woff → iconfont.1745197894601.woff} +0 -0
  168. /package/es/{iconfont.1744880837792.woff2 → iconfont.1745197894601.woff2} +0 -0
  169. /package/lib/{iconfont.1744880837792.ttf → iconfont.1745197894601.ttf} +0 -0
  170. /package/lib/{iconfont.1744880837792.woff → iconfont.1745197894601.woff} +0 -0
  171. /package/lib/{iconfont.1744880837792.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);
@@ -4501,277 +5113,32 @@ const Methods = {
4501
5113
  } = checkboxOpts;
4502
5114
  const childrenField = treeOpts.children || treeOpts.childrenField;
4503
5115
  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
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
4674
5122
  });
4675
- tableData = tableTree;
4676
5123
  } else {
4677
- tableData = treeConfig ? tableFullTreeData.filter(handleFilter) : tableFullData.filter(handleFilter);
4678
- tableTree = tableData;
5124
+ const currTableData = isFull ? tableFullData : afterFullData;
5125
+ rowList = currTableData.filter(row => _xeUtils.default.get(row, checkField));
4679
5126
  }
4680
5127
  } 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;
5128
+ _xeUtils.default.each(selectCheckboxMaps, (row, rowid) => {
5129
+ if (isFull) {
5130
+ if (fullDataRowIdData[rowid]) {
5131
+ rowList.push(fullDataRowIdData[rowid].row);
5132
+ }
4730
5133
  } 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]));
5134
+ if (afterFullRowMaps[rowid]) {
5135
+ rowList.push(afterFullRowMaps[rowid]);
4748
5136
  }
4749
- tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(({
4750
- column,
4751
- order
4752
- }) => [getOrderField($xeTable, column), order]));
4753
5137
  }
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
5138
  });
4766
- tableData = tableTree;
4767
- } else {
4768
- tableData = treeConfig ? tableFullTreeData.slice(0) : tableFullData.slice(0);
4769
- tableTree = tableData;
4770
5139
  }
4771
5140
  }
4772
- internalData.afterFullData = tableData;
4773
- internalData.afterTreeFullData = tableTree;
4774
- updateAfterDataIndex($xeTable);
5141
+ return rowList;
4775
5142
  },
4776
5143
  /**
4777
5144
  * 预编译
@@ -5155,6 +5522,7 @@ const Methods = {
5155
5522
  const storeData = getCustomStorageMap(tableId);
5156
5523
  if (restoreStore) {
5157
5524
  return Promise.resolve(restoreStore({
5525
+ $table: $xeTable,
5158
5526
  id: tableId,
5159
5527
  type: 'restore',
5160
5528
  storeData
@@ -5230,6 +5598,7 @@ const Methods = {
5230
5598
  resizableData[colKey] = column.renderWidth;
5231
5599
  }
5232
5600
  if (isCustomVisible && (!checkMethod || checkMethod({
5601
+ $table: $xeTable,
5233
5602
  column
5234
5603
  }))) {
5235
5604
  if (!column.visible && column.defaultVisible) {
@@ -5290,6 +5659,7 @@ const Methods = {
5290
5659
  } : this.getCustomStoreData();
5291
5660
  if (updateStore) {
5292
5661
  return updateStore({
5662
+ $table: $xeTable,
5293
5663
  id: tableId,
5294
5664
  type,
5295
5665
  storeData
@@ -6283,8 +6653,7 @@ const Methods = {
6283
6653
  const hasDeleteKey = keyCode === 46;
6284
6654
  const isF2 = keyCode === 113;
6285
6655
  const isContextMenu = keyCode === 93;
6286
- const hasMetaKey = evnt.metaKey;
6287
- const hasCtrlKey = evnt.ctrlKey;
6656
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
6288
6657
  const hasShiftKey = evnt.shiftKey;
6289
6658
  const hasAltKey = evnt.altKey;
6290
6659
  const operArrow = isLeftArrow || isUpArrow || isRightArrow || isDwArrow;
@@ -6350,7 +6719,7 @@ const Methods = {
6350
6719
  enterMethod
6351
6720
  } = keyboardOpts;
6352
6721
  // 退出选中
6353
- if (hasCtrlKey) {
6722
+ if (isControlKey) {
6354
6723
  // 如果是激活编辑状态,则取消编辑
6355
6724
  if (actived.row) {
6356
6725
  const params = actived.args;
@@ -6525,7 +6894,7 @@ const Methods = {
6525
6894
  };
6526
6895
  $xeTable.setTreeExpand(parentRow, false).then(() => $xeTable.scrollToRow(parentRow)).then(() => $xeTable.triggerCurrentRowEvent(evnt, params));
6527
6896
  }
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)) {
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)) {
6529
6898
  const {
6530
6899
  editMethod
6531
6900
  } = keyboardOpts;
@@ -6975,9 +7344,13 @@ const Methods = {
6975
7344
  const {
6976
7345
  treeConfig
6977
7346
  } = props;
7347
+ const {
7348
+ isRowGroupStatus
7349
+ } = reactData;
6978
7350
  const {
6979
7351
  selectCheckboxMaps
6980
7352
  } = internalData;
7353
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
6981
7354
  const treeOpts = $xeTable.computeTreeOpts;
6982
7355
  const {
6983
7356
  transform,
@@ -6997,10 +7370,11 @@ const Methods = {
6997
7370
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
6998
7371
  if (checkField) {
6999
7372
  // 树结构
7000
- if (treeConfig && !checkStrictly) {
7373
+ if ((treeConfig || isRowGroupStatus) && !checkStrictly) {
7001
7374
  // 更新子节点状态
7002
7375
  _xeUtils.default.eachTree(rows, row => {
7003
7376
  if (isForce || !checkMethod || checkMethod({
7377
+ $table: $xeTable,
7004
7378
  row
7005
7379
  })) {
7006
7380
  _xeUtils.default.set(row, checkField, checked);
@@ -7018,6 +7392,7 @@ const Methods = {
7018
7392
  // 列表
7019
7393
  rows.forEach(row => {
7020
7394
  if (isForce || !checkMethod || checkMethod({
7395
+ $table: $xeTable,
7021
7396
  row
7022
7397
  })) {
7023
7398
  _xeUtils.default.set(row, checkField, checked);
@@ -7028,32 +7403,58 @@ const Methods = {
7028
7403
  return;
7029
7404
  }
7030
7405
  // 树结构
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];
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
+ }
7043
7421
  }
7422
+ handleCheckboxReserveRow($xeTable, row, checked);
7044
7423
  }
7045
- handleCheckboxReserveRow($xeTable, row, checked);
7046
- }
7047
- }, {
7048
- children: transform ? mapChildrenField : childrenField
7049
- });
7050
- reactData.updateCheckboxFlag++;
7051
- 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
+ }
7052
7452
  }
7053
7453
  // 列表
7054
7454
  rows.forEach(row => {
7055
7455
  const rowid = handleGetRowId(row);
7056
7456
  if (isForce || !checkMethod || checkMethod({
7457
+ $table: $xeTable,
7057
7458
  row
7058
7459
  })) {
7059
7460
  if (checked) {
@@ -7113,10 +7514,17 @@ const Methods = {
7113
7514
  triggerCheckRowEvent(evnt, params, checked) {
7114
7515
  const $xeTable = this;
7115
7516
  const props = $xeTable;
7517
+ const reactData = $xeTable;
7116
7518
  const internalData = $xeTable;
7519
+ const {
7520
+ treeConfig
7521
+ } = props;
7117
7522
  const {
7118
7523
  row
7119
7524
  } = params;
7525
+ const {
7526
+ isRowGroupStatus
7527
+ } = reactData;
7120
7528
  const {
7121
7529
  afterFullData
7122
7530
  } = internalData;
@@ -7129,7 +7537,7 @@ const Methods = {
7129
7537
  return;
7130
7538
  }
7131
7539
  evnt.stopPropagation();
7132
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
7540
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !(treeConfig || isRowGroupStatus)) {
7133
7541
  const checkboxRecords = $xeTable.getCheckboxRecords();
7134
7542
  if (checkboxRecords.length) {
7135
7543
  const firstRow = checkboxRecords[0];
@@ -7149,6 +7557,7 @@ const Methods = {
7149
7557
  }
7150
7558
  }
7151
7559
  if (!checkMethod || checkMethod({
7560
+ $table: $xeTable,
7152
7561
  row
7153
7562
  })) {
7154
7563
  $xeTable.handleBatchSelectRows([row], checked);
@@ -7196,14 +7605,16 @@ const Methods = {
7196
7605
  treeConfig
7197
7606
  } = props;
7198
7607
  const {
7608
+ isRowGroupStatus
7609
+ } = reactData;
7610
+ const {
7611
+ afterTreeFullData,
7612
+ afterGroupFullData,
7199
7613
  selectCheckboxMaps,
7200
7614
  treeIndeterminateRowMaps
7201
7615
  } = internalData;
7616
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7202
7617
  const treeOpts = $xeTable.computeTreeOpts;
7203
- const {
7204
- transform,
7205
- mapChildrenField
7206
- } = treeOpts;
7207
7618
  const childrenField = treeOpts.children || treeOpts.childrenField;
7208
7619
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7209
7620
  const {
@@ -7211,29 +7622,47 @@ const Methods = {
7211
7622
  checkStrictly,
7212
7623
  checkMethod
7213
7624
  } = checkboxOpts;
7214
- const {
7215
- afterTreeFullData
7216
- } = internalData;
7217
7625
  if (checkStrictly) {
7218
7626
  return;
7219
7627
  }
7220
- // 树结构
7221
- if (treeConfig) {
7628
+ if (isRowGroupStatus || treeConfig) {
7222
7629
  const {
7223
7630
  handleGetRowId
7224
7631
  } = (0, _util.createHandleGetRowId)($xeTable);
7225
7632
  const childRowMaps = {};
7226
7633
  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]);
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
+ });
7233
7648
  }
7234
- }, {
7235
- children: transform ? mapChildrenField : childrenField
7236
- });
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
+ }
7237
7666
  childRowList.forEach(vals => {
7238
7667
  const row = vals[0];
7239
7668
  const rowid = vals[1];
@@ -7245,6 +7674,7 @@ const Methods = {
7245
7674
  const childRowid = handleGetRowId(item);
7246
7675
  const isSelect = checkField ? _xeUtils.default.get(item, checkField) : selectCheckboxMaps[childRowid];
7247
7676
  if (checkMethod({
7677
+ $table: $xeTable,
7248
7678
  row: item
7249
7679
  })) {
7250
7680
  if (isSelect) {
@@ -7308,9 +7738,13 @@ const Methods = {
7308
7738
  const {
7309
7739
  treeConfig
7310
7740
  } = props;
7741
+ const {
7742
+ isRowGroupStatus
7743
+ } = reactData;
7311
7744
  const {
7312
7745
  afterFullData,
7313
7746
  afterTreeFullData,
7747
+ afterGroupFullData,
7314
7748
  checkboxReserveRowMap,
7315
7749
  selectCheckboxMaps,
7316
7750
  treeIndeterminateRowMaps
@@ -7327,11 +7761,12 @@ const Methods = {
7327
7761
  let sLen = 0; // 已选
7328
7762
  let hLen = 0; // 半选
7329
7763
  let vLen = 0; // 有效行
7330
- const rootList = treeConfig ? afterTreeFullData : afterFullData;
7764
+ const rootList = treeConfig ? afterTreeFullData : isRowGroupStatus ? afterGroupFullData : afterFullData;
7331
7765
  rootList.forEach(checkMethod ? row => {
7332
7766
  const childRowid = handleGetRowId(row);
7333
7767
  const selected = checkField ? _xeUtils.default.get(row, checkField) : selectCheckboxMaps[childRowid];
7334
7768
  if (checkMethod({
7769
+ $table: $xeTable,
7335
7770
  row
7336
7771
  })) {
7337
7772
  if (selected) {
@@ -7920,6 +8355,7 @@ const Methods = {
7920
8355
  const radioOpts = $xeTable.computeRadioOpts;
7921
8356
  const checkboxOpts = $xeTable.computeCheckboxOpts;
7922
8357
  const keyboardOpts = $xeTable.computeKeyboardOpts;
8358
+ const rowGroupOpts = $xeTable.computeRowGroupOpts;
7923
8359
  const rowOpts = $xeTable.computeRowOpts;
7924
8360
  const columnOpts = $xeTable.computeColumnOpts;
7925
8361
  const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
@@ -7933,7 +8369,8 @@ const Methods = {
7933
8369
  } = params;
7934
8370
  const {
7935
8371
  type,
7936
- treeNode
8372
+ treeNode,
8373
+ rowGroupNode
7937
8374
  } = column;
7938
8375
  const isRadioType = type === 'radio';
7939
8376
  const isCheckboxType = type === 'checkbox';
@@ -7941,8 +8378,9 @@ const Methods = {
7941
8378
  const cell = evnt.currentTarget;
7942
8379
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
7943
8380
  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;
8381
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
7945
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;
7946
8384
  params = Object.assign({
7947
8385
  cell,
7948
8386
  triggerRadio,
@@ -7959,11 +8397,15 @@ const Methods = {
7959
8397
  if (treeOpts.trigger === 'row' || treeNode && treeOpts.trigger === 'cell') {
7960
8398
  $xeTable.triggerTreeExpandEvent(evnt, params);
7961
8399
  }
8400
+ // 如果是行分组
8401
+ if (rowGroupOpts.trigger === 'row' || rowGroupNode && rowGroupOpts.trigger === 'cell') {
8402
+ $xeTable.triggerRowGroupExpandEvent(evnt, params);
8403
+ }
7962
8404
  }
7963
8405
  // 如果点击了树节点
7964
8406
  if (!triggerTreeNode) {
7965
- if (!triggerExpandNode) {
7966
- // 如果是高亮行
8407
+ if (!triggerExpandNode && !triggerRowGroupNode) {
8408
+ // 如果是当前行
7967
8409
  if (rowOpts.isCurrent || highlightCurrentRow) {
7968
8410
  if (!triggerCheckbox && !triggerRadio) {
7969
8411
  $xeTable.triggerCurrentRowEvent(evnt, params);
@@ -8229,7 +8671,7 @@ const Methods = {
8229
8671
  const triggerInput = cell && cell.tagName && cell.tagName.toLowerCase() === 'input';
8230
8672
  const triggerRadio = isRadioType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--radio').flag;
8231
8673
  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;
8674
+ const triggerTreeNode = treeNode && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-cell--tree-btn').flag;
8233
8675
  const triggerExpandNode = isExpandType && (0, _dom.getEventTargetNode)(evnt, cell, 'vxe-table--expanded').flag;
8234
8676
  let isColDragCell = false;
8235
8677
  if (rowOpts.drag) {
@@ -8546,7 +8988,7 @@ const Methods = {
8546
8988
  evnt.preventDefault();
8547
8989
  return;
8548
8990
  }
8549
- const hasCtrlKey = evnt.ctrlKey;
8991
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8550
8992
  const trEl = evnt.currentTarget;
8551
8993
  const rowid = trEl.getAttribute('rowid') || '';
8552
8994
  const rest = fullAllDataRowIdData[rowid];
@@ -8560,10 +9002,10 @@ const Methods = {
8560
9002
  } = reactData;
8561
9003
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y;
8562
9004
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom';
8563
- internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && hasCtrlKey);
9005
+ internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && isControlKey);
8564
9006
  internalData.prevDragRow = row;
8565
9007
  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)) {
9008
+ if ($xeTable.eqRow(dragRow, row) || isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded || !isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level)) {
8567
9009
  showDropTip($xeTable, evnt, trEl, null, false, dragPos);
8568
9010
  return;
8569
9011
  }
@@ -8862,7 +9304,7 @@ const Methods = {
8862
9304
  evnt.preventDefault();
8863
9305
  return;
8864
9306
  }
8865
- const hasCtrlKey = evnt.ctrlKey;
9307
+ const isControlKey = (0, _dom.hasControlKey)(evnt);
8866
9308
  const thEl = evnt.currentTarget;
8867
9309
  const colid = thEl.getAttribute('colid');
8868
9310
  const column = $xeTable.getColumnById(colid);
@@ -8873,7 +9315,7 @@ const Methods = {
8873
9315
  } = evnt;
8874
9316
  const offsetX = clientX - thEl.getBoundingClientRect().x;
8875
9317
  const dragPos = offsetX < thEl.clientWidth / 2 ? 'left' : 'right';
8876
- internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && hasCtrlKey);
9318
+ internalData.prevDragToChild = !!(isCrossDrag && isToChildDrag && isControlKey);
8877
9319
  internalData.prevDragCol = column;
8878
9320
  internalData.prevDragPos = dragPos;
8879
9321
  if (column.fixed || dragCol && dragCol.id === column.id || !isCrossDrag && (isPeerDrag ? dragCol.parentId !== column.parentId : column.parentId)) {
@@ -9336,7 +9778,7 @@ const Methods = {
9336
9778
  const reactData = $xeTable;
9337
9779
  const internalData = $xeTable;
9338
9780
  const {
9339
- expandColumn: column
9781
+ expandColumn
9340
9782
  } = reactData;
9341
9783
  const {
9342
9784
  rowExpandLazyLoadedMaps
@@ -9356,12 +9798,12 @@ const Methods = {
9356
9798
  const rowid = (0, _util.getRowid)($xeTable, row);
9357
9799
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
9358
9800
  const expanded = !$xeTable.isRowExpandByRow(row);
9359
- const columnIndex = $xeTable.getColumnIndex(column);
9360
- const $columnIndex = $xeTable.getVMColumnIndex(column);
9801
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9802
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9361
9803
  $xeTable.setRowExpand(row, expanded);
9362
9804
  $xeTable.dispatchEvent('toggle-row-expand', {
9363
9805
  expanded,
9364
- column,
9806
+ column: expandColumn,
9365
9807
  columnIndex,
9366
9808
  $columnIndex,
9367
9809
  row,
@@ -9430,8 +9872,8 @@ const Methods = {
9430
9872
  toggleMethod
9431
9873
  } = expandOpts;
9432
9874
  const lazyRests = [];
9433
- const columnIndex = $xeTable.getColumnIndex(expandColumn);
9434
- const $columnIndex = $xeTable.getVMColumnIndex(expandColumn);
9875
+ const columnIndex = expandColumn ? $xeTable.getColumnIndex(expandColumn) : -1;
9876
+ const $columnIndex = expandColumn ? $xeTable.getVMColumnIndex(expandColumn) : -1;
9435
9877
  if (rows) {
9436
9878
  if (!_xeUtils.default.isArray(rows)) {
9437
9879
  rows = [rows];
@@ -9555,6 +9997,104 @@ const Methods = {
9555
9997
  });
9556
9998
  return rest;
9557
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
+ },
9558
10098
  getTreeExpandRecords() {
9559
10099
  const $xeTable = this;
9560
10100
  const internalData = $xeTable;
@@ -9622,11 +10162,11 @@ const Methods = {
9622
10162
  });
9623
10163
  }
9624
10164
  internalData.treeExpandedMaps = {};
9625
- reactData.treeExpandedFlag++;
9626
10165
  if (transform) {
9627
10166
  handleVirtualTreeToList($xeTable);
9628
- return $xeTable.handleTableData();
10167
+ $xeTable.handleTableData();
9629
10168
  }
10169
+ reactData.treeExpandedFlag++;
9630
10170
  return $xeTable.$nextTick();
9631
10171
  },
9632
10172
  /**
@@ -9635,6 +10175,7 @@ const Methods = {
9635
10175
  */
9636
10176
  reloadTreeExpand(row) {
9637
10177
  const $xeTable = this;
10178
+ const reactData = $xeTable;
9638
10179
  const internalData = $xeTable;
9639
10180
  const {
9640
10181
  treeExpandLazyLoadedMaps
@@ -9652,8 +10193,9 @@ const Methods = {
9652
10193
  }).then(() => {
9653
10194
  if (transform) {
9654
10195
  handleVirtualTreeToList($xeTable);
9655
- return $xeTable.handleTableData();
10196
+ $xeTable.handleTableData();
9656
10197
  }
10198
+ reactData.treeExpandedFlag++;
9657
10199
  }).then(() => {
9658
10200
  return $xeTable.recalculate();
9659
10201
  });
@@ -9668,6 +10210,40 @@ const Methods = {
9668
10210
  // 即将废弃
9669
10211
  return $xeTable.reloadTreeExpand(row);
9670
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
+ },
9671
10247
  /**
9672
10248
  * 展开树节点事件
9673
10249
  */
@@ -9728,11 +10304,15 @@ const Methods = {
9728
10304
  * @param {Boolean} expanded 是否展开
9729
10305
  */
9730
10306
  setAllTreeExpand(expanded) {
10307
+ const $xeTable = this;
10308
+ const reactData = $xeTable;
10309
+ const internalData = $xeTable;
9731
10310
  const {
9732
- tableFullData,
9733
- treeOpts
9734
- } = this;
10311
+ tableFullData
10312
+ } = internalData;
10313
+ const treeOpts = $xeTable.computeTreeOpts;
9735
10314
  const {
10315
+ transform,
9736
10316
  lazy
9737
10317
  } = treeOpts;
9738
10318
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -9745,7 +10325,13 @@ const Methods = {
9745
10325
  }, {
9746
10326
  children: childrenField
9747
10327
  });
9748
- 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
+ });
9749
10335
  },
9750
10336
  /**
9751
10337
  * 设置展开树形节点,二个参数设置这一行展开与否
@@ -9811,7 +10397,6 @@ const Methods = {
9811
10397
  } = treeOpts;
9812
10398
  const expList = $xeTable.getTreeExpandRecords();
9813
10399
  internalData.treeExpandedMaps = {};
9814
- reactData.treeExpandedFlag++;
9815
10400
  if (reserve) {
9816
10401
  _xeUtils.default.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), {
9817
10402
  children: childrenField
@@ -9820,8 +10405,9 @@ const Methods = {
9820
10405
  return $xeTable.handleTableData().then(() => {
9821
10406
  if (transform) {
9822
10407
  handleVirtualTreeToList($xeTable);
9823
- return $xeTable.handleTableData();
10408
+ $xeTable.handleTableData();
9824
10409
  }
10410
+ reactData.treeExpandedFlag++;
9825
10411
  }).then(() => {
9826
10412
  if (expList.length) {
9827
10413
  $xeTable.recalculate();
@@ -10712,27 +11298,37 @@ const Methods = {
10712
11298
  * @param {Row} row 行对象
10713
11299
  */
10714
11300
  scrollToTreeRow(row) {
11301
+ const $xeTable = this;
11302
+ const props = $xeTable;
11303
+ const reactData = $xeTable;
11304
+ const internalData = $xeTable;
10715
11305
  const {
10716
- tableFullData,
10717
- treeConfig,
10718
- treeOpts
10719
- } = this;
10720
- const childrenField = treeOpts.children || treeOpts.childrenField;
11306
+ treeConfig
11307
+ } = props;
11308
+ const {
11309
+ isRowGroupStatus
11310
+ } = reactData;
11311
+ const {
11312
+ tableFullData
11313
+ } = internalData;
10721
11314
  const rests = [];
10722
- if (treeConfig) {
10723
- const matchObj = _xeUtils.default.findTree(tableFullData, item => item === row, {
10724
- 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
10725
11321
  });
10726
11322
  if (matchObj) {
10727
11323
  const nodes = matchObj.nodes;
10728
11324
  nodes.forEach((row, index) => {
10729
- if (index < nodes.length - 1 && !this.isTreeExpandByRow(row)) {
10730
- rests.push(this.setTreeExpand(row, true));
11325
+ if (index < nodes.length - 1 && !$xeTable.isTreeExpandByRow(row)) {
11326
+ rests.push($xeTable.setTreeExpand(row, true));
10731
11327
  }
10732
11328
  });
10733
11329
  }
10734
11330
  }
10735
- return Promise.all(rests).then(() => (0, _util.rowToVisible)(this, row));
11331
+ return Promise.all(rests).then(() => (0, _util.rowToVisible)($xeTable, row));
10736
11332
  },
10737
11333
  /**
10738
11334
  * 手动清除滚动相关信息,还原到初始状态