vxe-table 3.14.0-beta.2 → 3.14.0-beta.21

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 (165) hide show
  1. package/es/grid/src/grid.js +78 -48
  2. package/es/locale/lang/ar-EG.js +7 -1
  3. package/es/locale/lang/de-DE.js +7 -1
  4. package/es/locale/lang/en-US.js +7 -1
  5. package/es/locale/lang/es-ES.js +7 -1
  6. package/es/locale/lang/fr-FR.js +7 -1
  7. package/es/locale/lang/hu-HU.js +7 -1
  8. package/es/locale/lang/hy-AM.js +7 -1
  9. package/es/locale/lang/id-ID.js +7 -1
  10. package/es/locale/lang/it-IT.js +7 -1
  11. package/es/locale/lang/ja-JP.js +7 -1
  12. package/es/locale/lang/ko-KR.js +7 -1
  13. package/es/locale/lang/nb-NO.js +7 -1
  14. package/es/locale/lang/pt-BR.js +7 -1
  15. package/es/locale/lang/ru-RU.js +7 -1
  16. package/es/locale/lang/th-TH.js +7 -1
  17. package/es/locale/lang/ug-CN.js +7 -1
  18. package/es/locale/lang/uk-UA.js +7 -1
  19. package/es/locale/lang/vi-VN.js +7 -1
  20. package/es/locale/lang/zh-CHT.js +7 -1
  21. package/es/locale/lang/zh-CN.js +7 -1
  22. package/es/style.css +1 -1
  23. package/es/table/module/edit/mixin.js +14 -9
  24. package/es/table/module/filter/panel.js +12 -2
  25. package/es/table/module/keyboard/mixin.js +86 -21
  26. package/es/table/module/validator/mixin.js +2 -2
  27. package/es/table/render/index.js +90 -59
  28. package/es/table/src/body.js +22 -17
  29. package/es/table/src/cell.js +25 -20
  30. package/es/table/src/footer.js +9 -4
  31. package/es/table/src/header.js +2 -2
  32. package/es/table/src/methods.js +942 -678
  33. package/es/table/src/props.js +4 -0
  34. package/es/table/src/table.js +74 -32
  35. package/es/table/src/util.js +65 -7
  36. package/es/ui/index.js +1 -1
  37. package/es/ui/src/log.js +1 -1
  38. package/helper/vetur/attributes.json +1 -1
  39. package/helper/vetur/tags.json +1 -1
  40. package/lib/grid/src/grid.js +85 -65
  41. package/lib/grid/src/grid.min.js +1 -1
  42. package/lib/index.umd.js +1641 -1076
  43. package/lib/index.umd.min.js +1 -1
  44. package/lib/locale/lang/ar-EG.js +7 -1
  45. package/lib/locale/lang/ar-EG.min.js +1 -1
  46. package/lib/locale/lang/de-DE.js +7 -1
  47. package/lib/locale/lang/de-DE.min.js +1 -1
  48. package/lib/locale/lang/en-US.js +7 -1
  49. package/lib/locale/lang/en-US.min.js +1 -1
  50. package/lib/locale/lang/en-US.umd.js +7 -1
  51. package/lib/locale/lang/es-ES.js +7 -1
  52. package/lib/locale/lang/es-ES.min.js +1 -1
  53. package/lib/locale/lang/es-ES.umd.js +7 -1
  54. package/lib/locale/lang/fr-FR.js +7 -1
  55. package/lib/locale/lang/fr-FR.min.js +1 -1
  56. package/lib/locale/lang/hu-HU.js +7 -1
  57. package/lib/locale/lang/hu-HU.min.js +1 -1
  58. package/lib/locale/lang/hu-HU.umd.js +7 -1
  59. package/lib/locale/lang/hy-AM.js +7 -1
  60. package/lib/locale/lang/hy-AM.min.js +1 -1
  61. package/lib/locale/lang/id-ID.js +7 -1
  62. package/lib/locale/lang/id-ID.min.js +1 -1
  63. package/lib/locale/lang/it-IT.js +7 -1
  64. package/lib/locale/lang/it-IT.min.js +1 -1
  65. package/lib/locale/lang/ja-JP.js +7 -1
  66. package/lib/locale/lang/ja-JP.min.js +1 -1
  67. package/lib/locale/lang/ja-JP.umd.js +7 -1
  68. package/lib/locale/lang/ko-KR.js +7 -1
  69. package/lib/locale/lang/ko-KR.min.js +1 -1
  70. package/lib/locale/lang/ko-KR.umd.js +7 -1
  71. package/lib/locale/lang/nb-NO.js +7 -1
  72. package/lib/locale/lang/nb-NO.min.js +1 -1
  73. package/lib/locale/lang/pt-BR.js +7 -1
  74. package/lib/locale/lang/pt-BR.min.js +1 -1
  75. package/lib/locale/lang/pt-BR.umd.js +7 -1
  76. package/lib/locale/lang/ru-RU.js +7 -1
  77. package/lib/locale/lang/ru-RU.min.js +1 -1
  78. package/lib/locale/lang/ru-RU.umd.js +7 -1
  79. package/lib/locale/lang/th-TH.js +7 -1
  80. package/lib/locale/lang/th-TH.min.js +1 -1
  81. package/lib/locale/lang/ug-CN.js +7 -1
  82. package/lib/locale/lang/ug-CN.min.js +1 -1
  83. package/lib/locale/lang/uk-UA.js +7 -1
  84. package/lib/locale/lang/uk-UA.min.js +1 -1
  85. package/lib/locale/lang/uk-UA.umd.js +7 -1
  86. package/lib/locale/lang/vi-VN.js +7 -1
  87. package/lib/locale/lang/vi-VN.min.js +1 -1
  88. package/lib/locale/lang/zh-CHT.js +7 -1
  89. package/lib/locale/lang/zh-CHT.min.js +1 -1
  90. package/lib/locale/lang/zh-CHT.umd.js +7 -1
  91. package/lib/locale/lang/zh-CN.js +7 -1
  92. package/lib/locale/lang/zh-CN.min.js +1 -1
  93. package/lib/locale/lang/zh-CN.umd.js +7 -1
  94. package/lib/style.css +1 -1
  95. package/lib/table/module/edit/mixin.js +16 -11
  96. package/lib/table/module/edit/mixin.min.js +1 -1
  97. package/lib/table/module/filter/panel.js +8 -2
  98. package/lib/table/module/filter/panel.min.js +1 -1
  99. package/lib/table/module/keyboard/mixin.js +89 -25
  100. package/lib/table/module/keyboard/mixin.min.js +1 -1
  101. package/lib/table/module/validator/mixin.js +3 -3
  102. package/lib/table/module/validator/mixin.min.js +1 -1
  103. package/lib/table/render/index.js +99 -64
  104. package/lib/table/render/index.min.js +1 -1
  105. package/lib/table/src/body.js +27 -17
  106. package/lib/table/src/body.min.js +1 -1
  107. package/lib/table/src/cell.js +37 -21
  108. package/lib/table/src/cell.min.js +1 -1
  109. package/lib/table/src/footer.js +9 -3
  110. package/lib/table/src/footer.min.js +1 -1
  111. package/lib/table/src/header.js +2 -1
  112. package/lib/table/src/header.min.js +1 -1
  113. package/lib/table/src/methods.js +1101 -798
  114. package/lib/table/src/methods.min.js +1 -1
  115. package/lib/table/src/props.js +4 -0
  116. package/lib/table/src/props.min.js +1 -1
  117. package/lib/table/src/table.js +79 -31
  118. package/lib/table/src/table.min.js +1 -1
  119. package/lib/table/src/util.js +72 -7
  120. package/lib/table/src/util.min.js +1 -1
  121. package/lib/ui/index.js +1 -1
  122. package/lib/ui/index.min.js +1 -1
  123. package/lib/ui/src/log.js +1 -1
  124. package/lib/ui/src/log.min.js +1 -1
  125. package/package.json +2 -2
  126. package/packages/grid/src/grid.ts +92 -57
  127. package/packages/locale/lang/ar-EG.ts +7 -1
  128. package/packages/locale/lang/de-DE.ts +7 -1
  129. package/packages/locale/lang/en-US.ts +7 -1
  130. package/packages/locale/lang/es-ES.ts +7 -1
  131. package/packages/locale/lang/fr-FR.ts +7 -1
  132. package/packages/locale/lang/hu-HU.ts +7 -1
  133. package/packages/locale/lang/hy-AM.ts +7 -1
  134. package/packages/locale/lang/id-ID.ts +7 -1
  135. package/packages/locale/lang/it-IT.ts +7 -1
  136. package/packages/locale/lang/ja-JP.ts +7 -1
  137. package/packages/locale/lang/ko-KR.ts +7 -1
  138. package/packages/locale/lang/nb-NO.ts +7 -1
  139. package/packages/locale/lang/pt-BR.ts +7 -1
  140. package/packages/locale/lang/ru-RU.ts +7 -1
  141. package/packages/locale/lang/th-TH.ts +7 -1
  142. package/packages/locale/lang/ug-CN.ts +7 -1
  143. package/packages/locale/lang/uk-UA.ts +7 -1
  144. package/packages/locale/lang/vi-VN.ts +7 -1
  145. package/packages/locale/lang/zh-CHT.ts +7 -1
  146. package/packages/locale/lang/zh-CN.ts +7 -1
  147. package/packages/table/module/edit/mixin.ts +17 -12
  148. package/packages/table/module/filter/panel.ts +12 -2
  149. package/packages/table/module/keyboard/mixin.ts +94 -27
  150. package/packages/table/module/validator/mixin.ts +2 -2
  151. package/packages/table/render/index.ts +89 -57
  152. package/packages/table/src/body.ts +21 -16
  153. package/packages/table/src/cell.ts +25 -20
  154. package/packages/table/src/footer.ts +9 -4
  155. package/packages/table/src/header.ts +2 -2
  156. package/packages/table/src/methods.ts +1035 -720
  157. package/packages/table/src/props.ts +16 -12
  158. package/packages/table/src/table.ts +87 -35
  159. package/packages/table/src/util.ts +73 -7
  160. /package/es/{iconfont.1741079977180.ttf → iconfont.1742437924038.ttf} +0 -0
  161. /package/es/{iconfont.1741079977180.woff → iconfont.1742437924038.woff} +0 -0
  162. /package/es/{iconfont.1741079977180.woff2 → iconfont.1742437924038.woff2} +0 -0
  163. /package/lib/{iconfont.1741079977180.ttf → iconfont.1742437924038.ttf} +0 -0
  164. /package/lib/{iconfont.1741079977180.woff → iconfont.1742437924038.woff} +0 -0
  165. /package/lib/{iconfont.1741079977180.woff2 → iconfont.1742437924038.woff2} +0 -0
@@ -3,10 +3,11 @@ import { browse, getTpImg, isPx, isScale, hasClass, addClass, removeClass, getEv
3
3
  import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue } from '../../ui/src/utils';
4
4
  import { VxeUI } from '../../ui';
5
5
  import Cell from './cell';
6
- import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, getRefElem } from './util';
6
+ import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, createHandleUpdateRowId, createHandleGetRowId, getRefElem } from './util';
7
7
  import { getSlotVNs } from '../../ui/src/vn';
8
8
  import { warnLog, errLog } from '../../ui/src/log';
9
9
  const { getConfig, getI18n, renderer, formats, interceptor, createEvent } = VxeUI;
10
+ const supportMaxRow = 5e6;
10
11
  const customStorageKey = 'VXE_CUSTOM_STORE';
11
12
  const maxYHeight = 5e6;
12
13
  const maxXWidth = 5e6;
@@ -218,7 +219,7 @@ function cacheColumnMap($xeTable) {
218
219
  }
219
220
  else {
220
221
  if ((storage && !type) || (columnOpts.drag && (isCrossDrag || isSelfToChildDrag))) {
221
- errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field`]);
222
+ errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field=?`]);
222
223
  }
223
224
  }
224
225
  if (!hasFixed && fixed) {
@@ -317,9 +318,10 @@ function updateAfterListIndex($xeTable) {
317
318
  const internalData = $xeTable;
318
319
  const { treeConfig } = props;
319
320
  const { afterFullData, fullDataRowIdData, fullAllDataRowIdData } = internalData;
321
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
320
322
  const fullMaps = {};
321
323
  afterFullData.forEach((row, index) => {
322
- const rowid = getRowid($xeTable, row);
324
+ const rowid = handleGetRowId(row);
323
325
  const rowRest = fullAllDataRowIdData[rowid];
324
326
  const seq = index + 1;
325
327
  if (rowRest) {
@@ -351,8 +353,9 @@ function updateAfterDataIndex($xeTable) {
351
353
  const childrenField = treeOpts.children || treeOpts.childrenField;
352
354
  const fullMaps = {};
353
355
  if (treeConfig) {
356
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
354
357
  XEUtils.eachTree(afterTreeFullData, (row, index, items, path) => {
355
- const rowid = getRowid($xeTable, row);
358
+ const rowid = handleGetRowId(row);
356
359
  const rowRest = fullAllDataRowIdData[rowid];
357
360
  const seq = path.map((num, i) => i % 2 === 0 ? (Number(num) + 1) : '.').join('');
358
361
  if (rowRest) {
@@ -379,19 +382,18 @@ function updateAfterDataIndex($xeTable) {
379
382
  */
380
383
  function handleVirtualTreeToList($xeTable) {
381
384
  const props = $xeTable;
382
- const reactData = $xeTable;
383
385
  const internalData = $xeTable;
384
386
  const { treeConfig } = props;
385
- const { treeExpandedMaps } = reactData;
386
- const { fullAllDataRowIdData } = internalData;
387
+ const { fullAllDataRowIdData, treeExpandedMaps } = internalData;
387
388
  const treeOpts = $xeTable.computeTreeOpts;
388
389
  const childrenField = treeOpts.children || treeOpts.childrenField;
389
390
  if (treeConfig && treeOpts.transform) {
391
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
390
392
  const fullData = [];
391
393
  const expandMaps = {};
392
394
  XEUtils.eachTree(internalData.afterTreeFullData, (row, index, items, path, parentRow) => {
393
- const rowid = getRowid($xeTable, row);
394
- const parentRowid = getRowid($xeTable, parentRow);
395
+ const rowid = handleGetRowId(row);
396
+ const parentRowid = handleGetRowId(parentRow);
395
397
  if (!parentRow || (expandMaps[parentRowid] && treeExpandedMaps[parentRowid])) {
396
398
  const rowRest = fullAllDataRowIdData[rowid];
397
399
  if (rowRest) {
@@ -750,6 +752,25 @@ function updateStyle($xeTable) {
750
752
  }
751
753
  return $xeTable.$nextTick();
752
754
  }
755
+ function checkValidate($xeTable, type) {
756
+ if ($xeTable.triggerValidate) {
757
+ return $xeTable.triggerValidate(type);
758
+ }
759
+ return $xeTable.$nextTick();
760
+ }
761
+ /**
762
+ * 当单元格发生改变时
763
+ * 如果存在规则,则校验
764
+ */
765
+ function handleChangeCell($xeTable, evnt, params) {
766
+ checkValidate($xeTable, 'blur')
767
+ .catch((e) => e)
768
+ .then(() => {
769
+ $xeTable.handleEdit(params, evnt)
770
+ .then(() => checkValidate($xeTable, 'change'))
771
+ .catch((e) => e);
772
+ });
773
+ }
753
774
  function handleRadioReserveRow($xeTable, row) {
754
775
  const internalData = $xeTable;
755
776
  const radioOpts = $xeTable.computeRadioOpts;
@@ -794,12 +815,13 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
794
815
  const reactData = $xeTable;
795
816
  const internalData = $xeTable;
796
817
  const { treeConfig } = props;
797
- const { selectCheckboxMaps } = reactData;
798
- const { afterFullData, checkboxReserveRowMap } = internalData;
818
+ const { afterFullData, checkboxReserveRowMap, selectCheckboxMaps } = internalData;
799
819
  const treeOpts = $xeTable.computeTreeOpts;
800
820
  const childrenField = treeOpts.children || treeOpts.childrenField;
801
821
  const checkboxOpts = $xeTable.computeCheckboxOpts;
802
822
  const { checkField, reserve, checkMethod } = checkboxOpts;
823
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
824
+ // indeterminateField 仅支持读取
803
825
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
804
826
  const selectRowMaps = {};
805
827
  /**
@@ -810,7 +832,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
810
832
  const checkValFn = (row) => {
811
833
  if (isForce || (!checkMethod || checkMethod({ row }))) {
812
834
  if (checked) {
813
- selectRowMaps[getRowid($xeTable, row)] = row;
835
+ selectRowMaps[handleGetRowId(row)] = row;
814
836
  }
815
837
  XEUtils.set(row, checkField, checked);
816
838
  }
@@ -840,7 +862,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
840
862
  */
841
863
  XEUtils.eachTree(afterFullData, (row) => {
842
864
  if (isForce || (!checkMethod || checkMethod({ row }))) {
843
- selectRowMaps[getRowid($xeTable, row)] = row;
865
+ const rowid = handleGetRowId(row);
866
+ selectRowMaps[rowid] = row;
844
867
  }
845
868
  }, { children: childrenField });
846
869
  }
@@ -851,7 +874,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
851
874
  */
852
875
  if (!isForce && checkMethod) {
853
876
  XEUtils.eachTree(afterFullData, (row) => {
854
- const rowid = getRowid($xeTable, row);
877
+ const rowid = handleGetRowId(row);
855
878
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
856
879
  selectRowMaps[rowid] = row;
857
880
  }
@@ -868,7 +891,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
868
891
  */
869
892
  if (!isForce && checkMethod) {
870
893
  afterFullData.forEach((row) => {
871
- const rowid = getRowid($xeTable, row);
894
+ const rowid = handleGetRowId(row);
872
895
  if (selectCheckboxMaps[rowid] || checkMethod({ row })) {
873
896
  selectRowMaps[rowid] = row;
874
897
  }
@@ -876,7 +899,8 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
876
899
  }
877
900
  else {
878
901
  afterFullData.forEach(row => {
879
- selectRowMaps[getRowid($xeTable, row)] = row;
902
+ const rowid = handleGetRowId(row);
903
+ selectRowMaps[rowid] = row;
880
904
  });
881
905
  }
882
906
  }
@@ -888,7 +912,7 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
888
912
  */
889
913
  if (!isForce && checkMethod) {
890
914
  afterFullData.forEach((row) => {
891
- const rowid = getRowid($xeTable, row);
915
+ const rowid = handleGetRowId(row);
892
916
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
893
917
  selectRowMaps[rowid] = row;
894
918
  }
@@ -907,10 +931,10 @@ function handleCheckedAllCheckboxRow($xeTable, checked, isForce) {
907
931
  afterFullData.forEach((row) => handleCheckboxReserveRow($xeTable, row, false));
908
932
  }
909
933
  }
910
- reactData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
934
+ reactData.updateCheckboxFlag++;
935
+ internalData.selectCheckboxMaps = checkField ? {} : selectRowMaps;
911
936
  reactData.isAllSelected = checked;
912
937
  reactData.isIndeterminate = false;
913
- reactData.treeIndeterminateMaps = {};
914
938
  internalData.treeIndeterminateRowMaps = {};
915
939
  $xeTable.checkSelectionStatus();
916
940
  return $xeTable.$nextTick();
@@ -921,8 +945,8 @@ function handleReserveStatus($xeTable) {
921
945
  const reactData = $xeTable;
922
946
  const internalData = $xeTable;
923
947
  const { treeConfig } = props;
924
- const { expandColumn, currentRow, selectCheckboxMaps, selectRadioRow, rowExpandedMaps, treeExpandedMaps } = reactData;
925
- const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow } = internalData;
948
+ const { expandColumn, currentRow, selectRadioRow } = reactData;
949
+ const { fullDataRowIdData, fullAllDataRowIdData, radioReserveRow, selectCheckboxMaps, treeExpandedMaps, rowExpandedMaps } = internalData;
926
950
  const expandOpts = $xeTable.computeExpandOpts;
927
951
  const treeOpts = $xeTable.computeTreeOpts;
928
952
  const radioOpts = $xeTable.computeRadioOpts;
@@ -939,7 +963,8 @@ function handleReserveStatus($xeTable) {
939
963
  }
940
964
  }
941
965
  // 复选框
942
- reactData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
966
+ internalData.selectCheckboxMaps = getRecoverRowMaps($xeTable, selectCheckboxMaps); // 刷新多选行状态
967
+ reactData.updateCheckboxFlag++;
943
968
  // 还原保留选中状态
944
969
  if (checkboxOpts.reserve) {
945
970
  handleCheckedCheckboxRow($xeTable, handleReserveRow($xeTable, internalData.checkboxReserveRowMap), true, true);
@@ -948,17 +973,161 @@ function handleReserveStatus($xeTable) {
948
973
  reactData.currentRow = null; // 刷新当前行状态
949
974
  }
950
975
  // 行展开
951
- reactData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
976
+ internalData.rowExpandedMaps = expandColumn ? getRecoverRowMaps($xeTable, rowExpandedMaps) : {}; // 刷新行展开状态
977
+ reactData.rowExpandedFlag++;
952
978
  // 还原保留状态
953
979
  if (expandColumn && expandOpts.reserve) {
954
980
  $xeTable.setRowExpand(handleReserveRow($xeTable, internalData.rowExpandedReserveRowMap), true);
955
981
  }
956
982
  // 树展开
957
- reactData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
983
+ internalData.treeExpandedMaps = treeConfig ? getRecoverRowMaps($xeTable, treeExpandedMaps) : {}; // 刷新树展开状态
984
+ reactData.treeExpandedFlag++;
958
985
  if (treeConfig && treeOpts.reserve) {
959
986
  $xeTable.setTreeExpand(handleReserveRow($xeTable, internalData.treeExpandedReserveRowMap), true);
960
987
  }
961
988
  }
989
+ /**
990
+ * 处理默认展开树节点
991
+ */
992
+ const handleDefaultTreeExpand = ($xeTable) => {
993
+ const props = $xeTable;
994
+ const internalData = $xeTable;
995
+ const { treeConfig } = props;
996
+ if (treeConfig) {
997
+ const { tableFullData } = internalData;
998
+ const treeOpts = $xeTable.computeTreeOpts;
999
+ const { expandAll, expandRowKeys } = treeOpts;
1000
+ const childrenField = treeOpts.children || treeOpts.childrenField;
1001
+ if (expandAll) {
1002
+ $xeTable.setAllTreeExpand(true);
1003
+ }
1004
+ else if (expandRowKeys) {
1005
+ const defExpandeds = [];
1006
+ const rowkey = getRowkey($xeTable);
1007
+ expandRowKeys.forEach((rowid) => {
1008
+ const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
1009
+ if (matchObj) {
1010
+ defExpandeds.push(matchObj.item);
1011
+ }
1012
+ });
1013
+ $xeTable.setTreeExpand(defExpandeds, true);
1014
+ }
1015
+ }
1016
+ };
1017
+ const handleAsyncTreeExpandChilds = ($xeTable, row) => {
1018
+ const reactData = $xeTable;
1019
+ const internalData = $xeTable;
1020
+ const treeOpts = $xeTable.computeTreeOpts;
1021
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
1022
+ const { transform, loadMethod } = treeOpts;
1023
+ const { checkStrictly } = checkboxOpts;
1024
+ return new Promise(resolve => {
1025
+ if (loadMethod) {
1026
+ const { fullAllDataRowIdData, treeExpandLazyLoadedMaps } = internalData;
1027
+ const rowid = getRowid($xeTable, row);
1028
+ const rowRest = fullAllDataRowIdData[rowid];
1029
+ treeExpandLazyLoadedMaps[rowid] = row;
1030
+ Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
1031
+ if (rowRest) {
1032
+ rowRest.treeLoaded = true;
1033
+ }
1034
+ if (treeExpandLazyLoadedMaps[rowid]) {
1035
+ delete treeExpandLazyLoadedMaps[rowid];
1036
+ }
1037
+ if (!XEUtils.isArray(childRecords)) {
1038
+ childRecords = [];
1039
+ }
1040
+ if (childRecords) {
1041
+ return $xeTable.loadTreeChildren(row, childRecords).then(childRows => {
1042
+ const { treeExpandedMaps } = internalData;
1043
+ if (childRows.length && !treeExpandedMaps[rowid]) {
1044
+ treeExpandedMaps[rowid] = row;
1045
+ }
1046
+ reactData.treeExpandedFlag++;
1047
+ // 如果当前节点已选中,则展开后子节点也被选中
1048
+ if (!checkStrictly && $xeTable.isCheckedByCheckboxRow(row)) {
1049
+ handleCheckedCheckboxRow($xeTable, childRows, true);
1050
+ }
1051
+ return $xeTable.$nextTick().then(() => {
1052
+ if (transform) {
1053
+ $xeTable.handleTableData();
1054
+ updateAfterDataIndex($xeTable);
1055
+ return $xeTable.$nextTick();
1056
+ }
1057
+ });
1058
+ });
1059
+ }
1060
+ }).catch(() => {
1061
+ const { treeExpandLazyLoadedMaps } = internalData;
1062
+ if (rowRest) {
1063
+ rowRest.treeLoaded = false;
1064
+ }
1065
+ if (treeExpandLazyLoadedMaps[rowid]) {
1066
+ delete treeExpandLazyLoadedMaps[rowid];
1067
+ }
1068
+ }).finally(() => {
1069
+ reactData.treeExpandedFlag++;
1070
+ $xeTable.$nextTick().then(() => $xeTable.recalculate()).then(() => resolve());
1071
+ });
1072
+ }
1073
+ else {
1074
+ resolve();
1075
+ }
1076
+ });
1077
+ };
1078
+ const handleTreeExpandReserve = ($xeTable, row, expanded) => {
1079
+ const internalData = $xeTable;
1080
+ const { treeExpandedReserveRowMap } = internalData;
1081
+ const treeOpts = $xeTable.computeTreeOpts;
1082
+ if (treeOpts.reserve) {
1083
+ const rowid = getRowid($xeTable, row);
1084
+ if (expanded) {
1085
+ treeExpandedReserveRowMap[rowid] = row;
1086
+ }
1087
+ else if (treeExpandedReserveRowMap[rowid]) {
1088
+ delete treeExpandedReserveRowMap[rowid];
1089
+ }
1090
+ }
1091
+ };
1092
+ const handleAsyncRowExpand = ($xeTable, row) => {
1093
+ const reactData = $xeTable;
1094
+ const internalData = $xeTable;
1095
+ return new Promise(resolve => {
1096
+ const expandOpts = $xeTable.computeExpandOpts;
1097
+ const { loadMethod } = expandOpts;
1098
+ if (loadMethod) {
1099
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
1100
+ const rowid = getRowid($xeTable, row);
1101
+ const rowRest = fullAllDataRowIdData[rowid];
1102
+ rowExpandLazyLoadedMaps[rowid] = row;
1103
+ loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
1104
+ const { rowExpandedMaps } = internalData;
1105
+ if (rowRest) {
1106
+ rowRest.expandLoaded = true;
1107
+ }
1108
+ rowExpandedMaps[rowid] = row;
1109
+ reactData.rowExpandedFlag++;
1110
+ }).catch(() => {
1111
+ if (rowRest) {
1112
+ rowRest.expandLoaded = false;
1113
+ }
1114
+ }).finally(() => {
1115
+ const { rowExpandLazyLoadedMaps } = internalData;
1116
+ if (rowExpandLazyLoadedMaps[rowid]) {
1117
+ delete rowExpandLazyLoadedMaps[rowid];
1118
+ }
1119
+ reactData.rowExpandedFlag++;
1120
+ $xeTable.$nextTick()
1121
+ .then(() => $xeTable.recalculate())
1122
+ .then(() => $xeTable.updateCellAreas())
1123
+ .then(() => resolve());
1124
+ });
1125
+ }
1126
+ else {
1127
+ resolve();
1128
+ }
1129
+ });
1130
+ };
962
1131
  function calcVarRowHeightConfig($xeTable, sizeKey, sizeEl) {
963
1132
  const reactData = $xeTable;
964
1133
  const { rowHeightStore } = reactData;
@@ -1021,12 +1190,13 @@ function handleVirtualYVisible($xeTable) {
1021
1190
  visibleSize = Math.ceil(clientHeight / defaultRowHeight) + 1;
1022
1191
  }
1023
1192
  else {
1193
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1024
1194
  let leftIndex = 0;
1025
1195
  let rightIndex = afterFullData.length;
1026
1196
  while (leftIndex < rightIndex) {
1027
1197
  const rIndex = Math.floor((leftIndex + rightIndex) / 2);
1028
1198
  const row = afterFullData[rIndex];
1029
- const rowid = getRowid($xeTable, row);
1199
+ const rowid = handleGetRowId(row);
1030
1200
  const rowRest = fullAllDataRowIdData[rowid] || {};
1031
1201
  if (rowRest.oTop <= startTop) {
1032
1202
  leftIndex = rIndex + 1;
@@ -1038,7 +1208,7 @@ function handleVirtualYVisible($xeTable) {
1038
1208
  toVisibleIndex = Math.max(0, leftIndex < afterFullData.length ? leftIndex - 2 : 0);
1039
1209
  for (let rIndex = toVisibleIndex, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
1040
1210
  const row = afterFullData[rIndex];
1041
- const rowid = getRowid($xeTable, row);
1211
+ const rowid = handleGetRowId(row);
1042
1212
  const rowRest = fullAllDataRowIdData[rowid] || {};
1043
1213
  visibleSize++;
1044
1214
  if (rowRest.oTop > endTop || visibleSize >= 100) {
@@ -1068,9 +1238,12 @@ function calculateMergerOffsetIndex(list, offsetItem, type) {
1068
1238
  }
1069
1239
  }
1070
1240
  }
1071
- function setMerges(_vm, merges, mList, rowList) {
1241
+ function setMerges($xeTable, merges, mList, rowList) {
1242
+ const props = $xeTable;
1243
+ const internalData = $xeTable;
1072
1244
  if (merges) {
1073
- const { treeConfig, visibleColumn } = _vm;
1245
+ const { treeConfig } = props;
1246
+ const { visibleColumn } = internalData;
1074
1247
  if (!XEUtils.isArray(merges)) {
1075
1248
  merges = [merges];
1076
1249
  }
@@ -1116,10 +1289,13 @@ function setMerges(_vm, merges, mList, rowList) {
1116
1289
  });
1117
1290
  }
1118
1291
  }
1119
- function removeMerges(_vm, merges, mList, rowList) {
1292
+ function removeMerges($xeTable, merges, mList, rowList) {
1293
+ const props = $xeTable;
1294
+ const internalData = $xeTable;
1120
1295
  const rest = [];
1121
1296
  if (merges) {
1122
- const { treeConfig, visibleColumn } = _vm;
1297
+ const { treeConfig } = props;
1298
+ const { visibleColumn } = internalData;
1123
1299
  if (!XEUtils.isArray(merges)) {
1124
1300
  merges = [merges];
1125
1301
  }
@@ -1326,8 +1502,9 @@ const calcCellHeight = ($xeTable) => {
1326
1502
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
1327
1503
  const el = $xeTable.$refs.refElem;
1328
1504
  if (!isAllOverflow && scrollYLoad && el) {
1505
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1329
1506
  tableData.forEach(row => {
1330
- const rowid = getRowid($xeTable, row);
1507
+ const rowid = handleGetRowId(row);
1331
1508
  const rowRest = fullAllDataRowIdData[rowid];
1332
1509
  if (rowRest) {
1333
1510
  const height = calcCellAutoHeight(rowRest, el);
@@ -1974,6 +2151,35 @@ function loadScrollYData($xeTable) {
1974
2151
  }
1975
2152
  }
1976
2153
  }
2154
+ const createGetRowCacheProp = (prop) => {
2155
+ return function (row) {
2156
+ const $xeTable = this;
2157
+ const internalData = $xeTable;
2158
+ const { fullAllDataRowIdData } = internalData;
2159
+ if (row) {
2160
+ const rowid = getRowid($xeTable, row);
2161
+ const rowRest = fullAllDataRowIdData[rowid];
2162
+ if (rowRest) {
2163
+ return rowRest[prop];
2164
+ }
2165
+ }
2166
+ return -1;
2167
+ };
2168
+ };
2169
+ const createGetColumnCacheProp = (prop) => {
2170
+ return function (column) {
2171
+ const $xeTable = this;
2172
+ const internalData = $xeTable;
2173
+ const { fullColumnIdData } = internalData;
2174
+ if (column) {
2175
+ const colRest = fullColumnIdData[column.id];
2176
+ if (colRest) {
2177
+ return colRest[prop];
2178
+ }
2179
+ }
2180
+ return -1;
2181
+ };
2182
+ };
1977
2183
  function lazyScrollXData($xeTable) {
1978
2184
  const internalData = $xeTable;
1979
2185
  const { lxTimeout, lxRunTime, scrollXStore } = internalData;
@@ -2131,7 +2337,7 @@ function calcCellWidth($xeTable) {
2131
2337
  }
2132
2338
  function handleUpdateColResize($xeTable, evnt, params) {
2133
2339
  $xeTable.analyColumnWidth();
2134
- $xeTable.recalculate(true).then(() => {
2340
+ $xeTable.recalculate().then(() => {
2135
2341
  $xeTable.saveCustomStore('update:width');
2136
2342
  $xeTable.updateCellAreas();
2137
2343
  $xeTable.dispatchEvent('column-resizable-change', params, evnt);
@@ -2143,7 +2349,7 @@ function handleUpdateColResize($xeTable, evnt, params) {
2143
2349
  function handleUpdateRowResize($xeTable, evnt, params) {
2144
2350
  const reactData = $xeTable;
2145
2351
  reactData.resizeHeightFlag++;
2146
- $xeTable.recalculate(true).then(() => {
2352
+ $xeTable.recalculate().then(() => {
2147
2353
  $xeTable.updateCellAreas();
2148
2354
  $xeTable.dispatchEvent('row-resizable-change', params, evnt);
2149
2355
  setTimeout(() => $xeTable.recalculate(true), 300);
@@ -2164,16 +2370,17 @@ function updateColumnOffsetLeft($xeTable) {
2164
2370
  function updateRowOffsetTop($xeTable) {
2165
2371
  const reactData = $xeTable;
2166
2372
  const internalData = $xeTable;
2167
- const { expandColumn, rowExpandedMaps } = reactData;
2168
- const { afterFullData, fullAllDataRowIdData } = internalData;
2373
+ const { expandColumn } = reactData;
2374
+ const { afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
2169
2375
  const expandOpts = $xeTable.computeExpandOpts;
2170
2376
  const rowOpts = $xeTable.computeRowOpts;
2171
2377
  const cellOpts = $xeTable.computeCellOpts;
2172
2378
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2379
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
2173
2380
  let offsetTop = 0;
2174
2381
  for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2175
2382
  const row = afterFullData[rIndex];
2176
- const rowid = getRowid($xeTable, row);
2383
+ const rowid = handleGetRowId(row);
2177
2384
  const rowRest = fullAllDataRowIdData[rowid] || {};
2178
2385
  rowRest.oTop = offsetTop;
2179
2386
  offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
@@ -2186,47 +2393,43 @@ function updateRowOffsetTop($xeTable) {
2186
2393
  function updateRowExpandStyle($xeTable) {
2187
2394
  const reactData = $xeTable;
2188
2395
  const internalData = $xeTable;
2189
- const { expandColumn, scrollYLoad, rowExpandedMaps } = reactData;
2396
+ const { expandColumn, scrollYLoad, scrollYTop, isScrollYBig } = reactData;
2190
2397
  const expandOpts = $xeTable.computeExpandOpts;
2191
2398
  const rowOpts = $xeTable.computeRowOpts;
2192
2399
  const cellOpts = $xeTable.computeCellOpts;
2193
2400
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
2194
2401
  const { mode } = expandOpts;
2195
2402
  if (expandColumn && mode === 'fixed') {
2196
- const { elemStore, afterFullData, fullAllDataRowIdData } = internalData;
2403
+ const { elemStore, fullAllDataRowIdData } = internalData;
2197
2404
  const rowExpandEl = $xeTable.$refs.refRowExpandElem;
2198
2405
  const bodyScrollElem = getRefElem(elemStore['main-body-scroll']);
2199
2406
  if (rowExpandEl && bodyScrollElem) {
2200
2407
  let isUpdateHeight = false;
2201
- if (scrollYLoad) {
2202
- let offsetTop = 0;
2203
- for (let rIndex = 0, rLen = afterFullData.length; rIndex < rLen; rIndex++) {
2204
- const row = afterFullData[rIndex];
2205
- const rowid = getRowid($xeTable, row);
2206
- const rowRest = fullAllDataRowIdData[rowid] || {};
2207
- rowRest.oTop = offsetTop;
2208
- offsetTop += rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight;
2209
- // 是否展开行
2210
- if (expandColumn && rowExpandedMaps[rowid]) {
2211
- offsetTop += rowRest.expandHeight || expandOpts.height || 0;
2212
- }
2213
- }
2214
- }
2215
2408
  XEUtils.arrayEach(rowExpandEl.children, reEl => {
2216
2409
  const expandEl = reEl;
2217
2410
  const rowid = expandEl.getAttribute('rowid') || '';
2218
2411
  const rowRest = fullAllDataRowIdData[rowid];
2219
2412
  if (rowRest) {
2220
2413
  const expandHeight = expandEl.offsetHeight + 1;
2414
+ const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2415
+ let offsetTop = 0;
2221
2416
  if (scrollYLoad) {
2222
- expandEl.style.top = toCssUnit(rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight));
2417
+ if (isScrollYBig && trEl) {
2418
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2419
+ }
2420
+ else {
2421
+ offsetTop = rowRest.oTop + (rowRest.resizeHeight || cellOpts.height || rowOpts.height || rowRest.height || defaultRowHeight);
2422
+ }
2223
2423
  }
2224
2424
  else {
2225
- const trEl = bodyScrollElem.querySelector(`.vxe-body--row[rowid="${rowid}"]`);
2226
2425
  if (trEl) {
2227
- expandEl.style.top = toCssUnit(trEl.offsetTop + trEl.offsetHeight);
2426
+ offsetTop = trEl.offsetTop + trEl.offsetHeight;
2228
2427
  }
2229
2428
  }
2429
+ if (isScrollYBig) {
2430
+ offsetTop += scrollYTop;
2431
+ }
2432
+ expandEl.style.top = toCssUnit(offsetTop);
2230
2433
  if (!isUpdateHeight) {
2231
2434
  if (rowRest.expandHeight !== expandHeight) {
2232
2435
  isUpdateHeight = true;
@@ -2237,6 +2440,9 @@ function updateRowExpandStyle($xeTable) {
2237
2440
  });
2238
2441
  if (isUpdateHeight) {
2239
2442
  reactData.rowExpandHeightFlag++;
2443
+ $xeTable.$nextTick(() => {
2444
+ updateRowOffsetTop($xeTable);
2445
+ });
2240
2446
  }
2241
2447
  }
2242
2448
  }
@@ -2263,6 +2469,10 @@ const Methods = {
2263
2469
  }
2264
2470
  return [];
2265
2471
  },
2472
+ getEl() {
2473
+ const $xeTable = this;
2474
+ return $xeTable.$refs.refElem;
2475
+ },
2266
2476
  /**
2267
2477
  * 获取父容器元素
2268
2478
  */
@@ -2274,10 +2484,26 @@ const Methods = {
2274
2484
  * 获取父容器的高度
2275
2485
  */
2276
2486
  getParentHeight() {
2277
- const { $el, $xegrid, height } = this;
2278
- const parentElem = $el.parentNode;
2279
- const parentPaddingSize = height === '100%' || height === 'auto' ? getPaddingTopBottomSize(parentElem) : 0;
2280
- return Math.floor($xegrid ? $xegrid.getParentHeight() : XEUtils.toNumber(getComputedStyle(parentElem).height) - parentPaddingSize);
2487
+ const $xeTable = this;
2488
+ const $xeGrid = $xeTable.$xeGrid;
2489
+ const props = $xeTable;
2490
+ const { height } = props;
2491
+ const el = $xeTable.$refs.refElem;
2492
+ if (el) {
2493
+ const parentElem = el.parentNode;
2494
+ const parentPaddingSize = height === '100%' || height === 'auto' ? getPaddingTopBottomSize(parentElem) : 0;
2495
+ let parentWrapperHeight = 0;
2496
+ if (parentElem) {
2497
+ if ($xeGrid && hasClass(parentElem, 'vxe-grid--table-wrapper')) {
2498
+ parentWrapperHeight = $xeGrid.getParentHeight();
2499
+ }
2500
+ else {
2501
+ parentWrapperHeight = parentElem.clientHeight;
2502
+ }
2503
+ }
2504
+ return Math.floor(parentWrapperHeight - parentPaddingSize);
2505
+ }
2506
+ return 0;
2281
2507
  },
2282
2508
  /**
2283
2509
  * 获取需要排除的高度
@@ -2365,6 +2591,9 @@ const Methods = {
2365
2591
  const childrenField = treeOpts.children || treeOpts.childrenField;
2366
2592
  let treeData = [];
2367
2593
  let fullData = datas ? datas.slice(0) : [];
2594
+ if (fullData.length > supportMaxRow) {
2595
+ errLog('vxe.error.errMaxRow', [supportMaxRow]);
2596
+ }
2368
2597
  if (treeConfig) {
2369
2598
  // 树结构自动转换
2370
2599
  if (treeOpts.transform) {
@@ -2459,7 +2688,7 @@ const Methods = {
2459
2688
  // warnLog('vxe.error.reqProp', ['table.show-overflow'])
2460
2689
  // }
2461
2690
  if (this.spanMethod) {
2462
- warnLog('vxe.error.scrollErrProp', ['table.span-method']);
2691
+ errLog('vxe.error.scrollErrProp', ['table.span-method']);
2463
2692
  }
2464
2693
  }
2465
2694
  handleReserveStatus($xeTable);
@@ -2607,35 +2836,16 @@ const Methods = {
2607
2836
  const reactData = $xeTable;
2608
2837
  const internalData = $xeTable;
2609
2838
  const { treeConfig } = props;
2610
- const { treeExpandedMaps } = reactData;
2611
- const { fullAllDataRowIdData, tableFullData, tableFullTreeData } = internalData;
2839
+ const { fullAllDataRowIdData, tableFullData, tableFullTreeData, treeExpandedMaps } = internalData;
2612
2840
  const treeOpts = $xeTable.computeTreeOpts;
2613
2841
  const childrenField = treeOpts.children || treeOpts.childrenField;
2614
2842
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
2615
- const rowkey = getRowkey($xeTable);
2843
+ const { lazy } = treeOpts;
2616
2844
  const fullAllDataRowIdMaps = Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
2617
2845
  const fullDataRowIdMaps = {};
2618
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
2619
- const handleRow = (row, index, items, path, parentRow, nodes) => {
2620
- let rowid = getRowid($xeTable, row);
2621
- const seq = treeConfig && path ? toTreePathSeq(path) : index + 1;
2622
- const level = nodes ? nodes.length - 1 : 0;
2623
- if (eqEmptyValue(rowid)) {
2624
- rowid = getRowUniqueId();
2625
- XEUtils.set(row, rowkey, rowid);
2626
- }
2627
- if (treeConfig && treeOpts.lazy) {
2628
- const treeExpRest = treeExpandedMaps[rowid];
2629
- if (row[hasChildField] && XEUtils.isUndefined(row[childrenField])) {
2630
- row[childrenField] = null;
2631
- }
2632
- if (treeExpRest) {
2633
- if (!row[childrenField] || !row[childrenField].length) {
2634
- delete treeTempExpandedMaps[rowid];
2635
- }
2636
- }
2637
- }
2638
- let rowRest = fullAllDataRowIdData[rowid];
2846
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2847
+ const handleRowCache = (row, index, items, currIndex, parentRow, rowid, level, seq) => {
2848
+ let rowRest = fullAllDataRowIdMaps[rowid];
2639
2849
  if (!rowRest) {
2640
2850
  rowRest = { row, rowid, seq, index: -1, _index: -1, $index: -1, treeIndex: index, items, parent: parentRow, level, height: 0, resizeHeight: 0, oTop: 0, expandHeight: 0 };
2641
2851
  }
@@ -2645,35 +2855,48 @@ const Methods = {
2645
2855
  rowRest.items = items;
2646
2856
  rowRest.parent = parentRow;
2647
2857
  rowRest.level = level;
2648
- rowRest.index = treeConfig && parentRow ? -1 : index;
2858
+ rowRest.index = currIndex;
2859
+ rowRest.treeIndex = index;
2649
2860
  fullDataRowIdMaps[rowid] = rowRest;
2650
2861
  fullAllDataRowIdMaps[rowid] = rowRest;
2651
2862
  };
2652
2863
  if (treeConfig) {
2653
- XEUtils.eachTree(tableFullTreeData, handleRow, { children: childrenField });
2864
+ XEUtils.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
2865
+ const rowid = handleUpdateRowId(row);
2866
+ if (treeConfig && lazy) {
2867
+ if (row[hasChildField] && row[childrenField] === undefined) {
2868
+ row[childrenField] = null;
2869
+ }
2870
+ if (treeExpandedMaps[rowid]) {
2871
+ if (!row[childrenField] || !row[childrenField].length) {
2872
+ delete treeExpandedMaps[rowid];
2873
+ }
2874
+ }
2875
+ }
2876
+ handleRowCache(row, index, items, parentRow ? -1 : index, parentRow, rowid, nodes.length - 1, toTreePathSeq(path));
2877
+ }, { children: childrenField });
2654
2878
  }
2655
2879
  else {
2656
- tableFullData.forEach(handleRow);
2880
+ tableFullData.forEach((row, index, items) => {
2881
+ handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1);
2882
+ });
2657
2883
  }
2658
2884
  internalData.fullDataRowIdData = fullDataRowIdMaps;
2659
2885
  internalData.fullAllDataRowIdData = fullAllDataRowIdMaps;
2660
- reactData.treeExpandedMaps = treeTempExpandedMaps;
2886
+ reactData.treeExpandedFlag++;
2661
2887
  },
2662
2888
  cacheSourceMap(fullData) {
2663
- let { treeConfig, treeOpts, sourceDataRowIdData } = this;
2889
+ const $xeTable = this;
2890
+ const props = $xeTable;
2891
+ const internalData = $xeTable;
2892
+ const { treeConfig } = props;
2893
+ const treeOpts = $xeTable.computeTreeOpts;
2664
2894
  const sourceData = XEUtils.clone(fullData, true);
2665
- const rowkey = getRowkey(this);
2666
- sourceDataRowIdData = this.sourceDataRowIdData = {};
2895
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2896
+ const sourceRowIdData = {};
2667
2897
  const handleSourceRow = (row) => {
2668
- let rowid = getRowid(this, row);
2669
- if (eqEmptyValue(rowid)) {
2670
- rowid = getRowUniqueId();
2671
- XEUtils.set(row, rowkey, rowid);
2672
- }
2673
- sourceDataRowIdData[rowid] = {
2674
- row,
2675
- rowid
2676
- };
2898
+ const rowid = handleUpdateRowId(row);
2899
+ sourceRowIdData[rowid] = row;
2677
2900
  };
2678
2901
  // 源数据缓存
2679
2902
  if (treeConfig) {
@@ -2683,7 +2906,8 @@ const Methods = {
2683
2906
  else {
2684
2907
  sourceData.forEach(handleSourceRow);
2685
2908
  }
2686
- this.tableSourceData = sourceData;
2909
+ internalData.sourceDataRowIdData = sourceRowIdData;
2910
+ internalData.tableSourceData = sourceData;
2687
2911
  },
2688
2912
  getParams() {
2689
2913
  return this.params;
@@ -2770,47 +2994,22 @@ const Methods = {
2770
2994
  * 根据 row 获取序号
2771
2995
  * @param {Row} row 行对象
2772
2996
  */
2773
- getRowSeq(row) {
2774
- const { fullAllDataRowIdData } = this;
2775
- if (row) {
2776
- const rowid = getRowid(this, row);
2777
- const rest = fullAllDataRowIdData[rowid];
2778
- if (rest) {
2779
- return rest.seq;
2780
- }
2781
- }
2782
- return -1;
2783
- },
2997
+ getRowSeq: createGetRowCacheProp('seq'),
2784
2998
  /**
2785
2999
  * 根据 row 获取相对于 data 中的索引
2786
3000
  * @param {Row} row 行对象
2787
3001
  */
2788
- getRowIndex(row) {
2789
- const { fullAllDataRowIdData } = this;
2790
- if (row) {
2791
- const rowid = getRowid(this, row);
2792
- const rest = fullAllDataRowIdData[rowid];
2793
- if (rest) {
2794
- return rest.index;
2795
- }
2796
- }
2797
- return -1;
2798
- },
3002
+ getRowIndex: createGetRowCacheProp('index'),
2799
3003
  /**
2800
3004
  * 根据 row 获取相对于当前数据中的索引
2801
3005
  * @param {Row} row 行对象
2802
3006
  */
2803
- getVTRowIndex(row) {
2804
- const { fullAllDataRowIdData } = this;
2805
- if (row) {
2806
- const rowid = getRowid(this, row);
2807
- const rest = fullAllDataRowIdData[rowid];
2808
- if (rest) {
2809
- return rest._index;
2810
- }
2811
- }
2812
- return -1;
2813
- },
3007
+ getVTRowIndex: createGetRowCacheProp('_index'),
3008
+ /**
3009
+ * 根据 row 获取渲染中的虚拟索引
3010
+ * @param {Row} row 行对象
3011
+ */
3012
+ getVMRowIndex: createGetRowCacheProp('$index'),
2814
3013
  // 在 v3 中废弃
2815
3014
  _getRowIndex(row) {
2816
3015
  if (process.env.NODE_ENV === 'development') {
@@ -2818,21 +3017,6 @@ const Methods = {
2818
3017
  }
2819
3018
  return this.getVTRowIndex(row);
2820
3019
  },
2821
- /**
2822
- * 根据 row 获取渲染中的虚拟索引
2823
- * @param {Row} row 行对象
2824
- */
2825
- getVMRowIndex(row) {
2826
- const { fullAllDataRowIdData } = this;
2827
- if (row) {
2828
- const rowid = getRowid(this, row);
2829
- const rest = fullAllDataRowIdData[rowid];
2830
- if (rest) {
2831
- return rest.$index;
2832
- }
2833
- }
2834
- return -1;
2835
- },
2836
3020
  // 在 v3 中废弃
2837
3021
  $getRowIndex(row) {
2838
3022
  if (process.env.NODE_ENV === 'development') {
@@ -2844,30 +3028,17 @@ const Methods = {
2844
3028
  * 根据 column 获取相对于 columns 中的索引
2845
3029
  * @param {ColumnInfo} column 列配置
2846
3030
  */
2847
- getColumnIndex(column) {
2848
- const { fullColumnIdData } = this;
2849
- if (column) {
2850
- const rest = fullColumnIdData[column.id];
2851
- if (rest) {
2852
- return rest.index;
2853
- }
2854
- }
2855
- return -1;
2856
- },
3031
+ getColumnIndex: createGetColumnCacheProp('index'),
2857
3032
  /**
2858
3033
  * 根据 column 获取相对于当前表格列中的索引
2859
3034
  * @param {ColumnInfo} column 列配置
2860
3035
  */
2861
- getVTColumnIndex(column) {
2862
- const { fullColumnIdData } = this;
2863
- if (column) {
2864
- const rest = fullColumnIdData[column.id];
2865
- if (rest) {
2866
- return rest._index;
2867
- }
2868
- }
2869
- return -1;
2870
- },
3036
+ getVTColumnIndex: createGetColumnCacheProp('_index'),
3037
+ /**
3038
+ * 根据 column 获取渲染中的虚拟索引
3039
+ * @param {ColumnInfo} column 列配置
3040
+ */
3041
+ getVMColumnIndex: createGetColumnCacheProp('$index'),
2871
3042
  // 在 v3 中废弃
2872
3043
  _getColumnIndex(column) {
2873
3044
  if (process.env.NODE_ENV === 'development') {
@@ -2875,20 +3046,6 @@ const Methods = {
2875
3046
  }
2876
3047
  return this.getVTColumnIndex(column);
2877
3048
  },
2878
- /**
2879
- * 根据 column 获取渲染中的虚拟索引
2880
- * @param {ColumnInfo} column 列配置
2881
- */
2882
- getVMColumnIndex(column) {
2883
- const { fullColumnIdData } = this;
2884
- if (column) {
2885
- const rest = fullColumnIdData[column.id];
2886
- if (rest) {
2887
- return rest.$index;
2888
- }
2889
- }
2890
- return -1;
2891
- },
2892
3049
  // 在 v3 中废弃
2893
3050
  $getColumnIndex(column) {
2894
3051
  if (process.env.NODE_ENV === 'development') {
@@ -2982,12 +3139,15 @@ const Methods = {
2982
3139
  const reactData = $xeTable;
2983
3140
  const internalData = $xeTable;
2984
3141
  const { keepSource, treeConfig } = props;
2985
- const { fullAllDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData;
3142
+ const { editStore } = reactData;
3143
+ const { fullAllDataRowIdData, fullDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData;
3144
+ const removeTempMaps = Object.assign({}, editStore.removeMaps);
2986
3145
  const treeOpts = $xeTable.computeTreeOpts;
2987
3146
  const { transform } = treeOpts;
3147
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
2988
3148
  if (!keepSource) {
2989
3149
  if (process.env.NODE_ENV === 'development') {
2990
- warnLog('vxe.error.reqProp', ['keep-source']);
3150
+ errLog('vxe.error.reqProp', ['keep-source']);
2991
3151
  }
2992
3152
  return $xeTable.$nextTick();
2993
3153
  }
@@ -3002,23 +3162,24 @@ const Methods = {
3002
3162
  }
3003
3163
  let reDelFlag = false;
3004
3164
  if (targetRows.length) {
3005
- targetRows.forEach((row) => {
3006
- if (!$xeTable.isInsertByRow(row)) {
3007
- const rowid = getRowid($xeTable, row);
3008
- const oRow = sourceDataRowIdData[rowid];
3009
- if (oRow && row) {
3010
- if (field) {
3011
- XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true));
3012
- }
3013
- else {
3014
- XEUtils.destructuring(row, XEUtils.clone(oRow, true));
3015
- }
3016
- if ($xeTable.isRemoveByRow(row)) {
3017
- const rowRest = fullAllDataRowIdData[rowid];
3018
- if (rowRest) {
3019
- const reRow = rowRest.row;
3020
- tableFullData.unshift(reRow);
3021
- afterFullData.unshift(reRow);
3165
+ targetRows.forEach((item) => {
3166
+ const rowid = handleGetRowId(item);
3167
+ const rowRest = fullAllDataRowIdData[rowid];
3168
+ if (rowRest) {
3169
+ const row = rowRest.row;
3170
+ if (!$xeTable.isInsertByRow(row)) {
3171
+ const oRow = sourceDataRowIdData[rowid];
3172
+ if (oRow && row) {
3173
+ if (field) {
3174
+ XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true));
3175
+ }
3176
+ else {
3177
+ XEUtils.destructuring(row, XEUtils.clone(oRow, true));
3178
+ }
3179
+ if (!fullDataRowIdData[rowid] && $xeTable.isRemoveByRow(row)) {
3180
+ delete removeTempMaps[rowid];
3181
+ tableFullData.unshift(row);
3182
+ afterFullData.unshift(row);
3022
3183
  reDelFlag = true;
3023
3184
  }
3024
3185
  }
@@ -3028,6 +3189,7 @@ const Methods = {
3028
3189
  }
3029
3190
  if (rows) {
3030
3191
  if (reDelFlag) {
3192
+ editStore.removeMaps = removeTempMaps;
3031
3193
  $xeTable.updateFooter();
3032
3194
  $xeTable.cacheRowMap(false);
3033
3195
  $xeTable.handleTableData(treeConfig && transform);
@@ -3190,20 +3352,25 @@ const Methods = {
3190
3352
  },
3191
3353
  /**
3192
3354
  * 检查行或列数据是否发生改变
3193
- * @param {Row} row 行对象
3355
+ * @param {Row} rowOrId 行对象
3194
3356
  * @param {String} field 字段名
3195
3357
  */
3196
- isUpdateByRow(row, field) {
3197
- const { tableFullColumn, keepSource, sourceDataRowIdData, fullDataRowIdData } = this;
3358
+ isUpdateByRow(rowOrId, field) {
3359
+ const $xeTable = this;
3360
+ const props = $xeTable;
3361
+ const internalData = $xeTable;
3362
+ const { keepSource } = props;
3363
+ const { tableFullColumn, fullDataRowIdData, sourceDataRowIdData } = internalData;
3198
3364
  if (keepSource) {
3199
- const rowid = getRowid(this, row);
3365
+ const rowid = XEUtils.isString(rowOrId) || XEUtils.isNumber(rowOrId) ? rowOrId : getRowid($xeTable, rowOrId);
3366
+ const rowRest = fullDataRowIdData[rowid];
3200
3367
  // 新增的数据不需要检测
3201
- if (!fullDataRowIdData[rowid]) {
3368
+ if (!rowRest) {
3202
3369
  return false;
3203
3370
  }
3204
- const oldRest = sourceDataRowIdData[rowid];
3205
- if (oldRest) {
3206
- const oRow = oldRest.row;
3371
+ const row = rowRest.row;
3372
+ const oRow = sourceDataRowIdData[rowid];
3373
+ if (oRow) {
3207
3374
  if (arguments.length > 1) {
3208
3375
  return !eqCellValue(oRow, row, field);
3209
3376
  }
@@ -3265,6 +3432,99 @@ const Methods = {
3265
3432
  tableColumn: this.tableColumn.slice(0)
3266
3433
  };
3267
3434
  },
3435
+ /**
3436
+ * 移动列到指定列的位置
3437
+ * @param fieldOrColumn
3438
+ * @param targetFieldOrColumn
3439
+ * @param options
3440
+ */
3441
+ moveColumnTo(fieldOrColumn, targetFieldOrColumn, options) {
3442
+ const $xeTable = this;
3443
+ const internalData = $xeTable;
3444
+ const { fullColumnIdData, visibleColumn } = internalData;
3445
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options);
3446
+ const dragCol = handleFieldOrColumn($xeTable, fieldOrColumn);
3447
+ let prevDragCol = null;
3448
+ const colRest = dragCol ? fullColumnIdData[dragCol.id] : null;
3449
+ let defPos = 'left';
3450
+ if (XEUtils.isNumber(targetFieldOrColumn)) {
3451
+ if (colRest && targetFieldOrColumn) {
3452
+ let currList = colRest.items;
3453
+ let offsetIndex = colRest._index + targetFieldOrColumn;
3454
+ if (isCrossDrag) {
3455
+ currList = visibleColumn;
3456
+ offsetIndex = colRest._index + targetFieldOrColumn;
3457
+ }
3458
+ if (offsetIndex > 0 && offsetIndex < currList.length - 1) {
3459
+ prevDragCol = currList[offsetIndex];
3460
+ }
3461
+ if (targetFieldOrColumn > 0) {
3462
+ defPos = 'right';
3463
+ }
3464
+ }
3465
+ }
3466
+ else {
3467
+ prevDragCol = handleFieldOrColumn($xeTable, targetFieldOrColumn);
3468
+ const targetColRest = prevDragCol ? fullColumnIdData[prevDragCol.id] : null;
3469
+ if (colRest && targetColRest) {
3470
+ if (targetColRest._index > colRest._index) {
3471
+ defPos = 'right';
3472
+ }
3473
+ }
3474
+ }
3475
+ return $xeTable.handleColDragSwapEvent(null, true, dragCol, prevDragCol, dragPos || defPos, dragToChild === true);
3476
+ },
3477
+ /**
3478
+ * 移动行到指定行的位置
3479
+ * @param rowidOrRow
3480
+ * @param targetRowidOrRow
3481
+ * @param options
3482
+ */
3483
+ moveRowTo(rowidOrRow, targetRowidOrRow, options) {
3484
+ const $xeTable = this;
3485
+ const props = $xeTable;
3486
+ const internalData = $xeTable;
3487
+ const { treeConfig } = props;
3488
+ const { fullAllDataRowIdData, afterFullData } = internalData;
3489
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options);
3490
+ const treeOpts = $xeTable.computeTreeOpts;
3491
+ const dragRow = handleRowidOrRow($xeTable, rowidOrRow);
3492
+ let prevDragRow = null;
3493
+ let defPos = 'top';
3494
+ const rowRest = dragRow ? fullAllDataRowIdData[getRowid($xeTable, dragRow)] : null;
3495
+ if (XEUtils.isNumber(targetRowidOrRow)) {
3496
+ if (rowRest && targetRowidOrRow) {
3497
+ let currList = afterFullData;
3498
+ let offsetIndex = rowRest._index + targetRowidOrRow;
3499
+ if (treeConfig) {
3500
+ currList = rowRest.items;
3501
+ if (treeOpts.transform) {
3502
+ offsetIndex = rowRest.treeIndex + targetRowidOrRow;
3503
+ if (isCrossDrag) {
3504
+ currList = afterFullData;
3505
+ offsetIndex = rowRest._index + targetRowidOrRow;
3506
+ }
3507
+ }
3508
+ }
3509
+ if (offsetIndex >= 0 && offsetIndex <= currList.length - 1) {
3510
+ prevDragRow = currList[offsetIndex];
3511
+ }
3512
+ if (targetRowidOrRow > 0) {
3513
+ defPos = 'bottom';
3514
+ }
3515
+ }
3516
+ }
3517
+ else {
3518
+ prevDragRow = handleRowidOrRow($xeTable, targetRowidOrRow);
3519
+ const targetRowRest = prevDragRow ? fullAllDataRowIdData[getRowid($xeTable, prevDragRow)] : null;
3520
+ if (rowRest && targetRowRest) {
3521
+ if (targetRowRest._index > rowRest._index) {
3522
+ defPos = 'bottom';
3523
+ }
3524
+ }
3525
+ }
3526
+ return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true);
3527
+ },
3268
3528
  /**
3269
3529
  * 获取表格的全量列
3270
3530
  */
@@ -3285,22 +3545,28 @@ const Methods = {
3285
3545
  * 用于多选行,获取已选中的数据
3286
3546
  */
3287
3547
  getCheckboxRecords(isFull) {
3288
- const { tableFullData, afterFullData, treeConfig, treeOpts, checkboxOpts, tableFullTreeData, afterTreeFullData, afterFullRowMaps } = this;
3548
+ const $xeTable = this;
3549
+ const props = $xeTable;
3550
+ const internalData = $xeTable;
3551
+ const { treeConfig } = props;
3552
+ const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps, selectCheckboxMaps } = internalData;
3553
+ const treeOpts = $xeTable.computeTreeOpts;
3554
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
3289
3555
  const { transform, mapChildrenField } = treeOpts;
3290
3556
  const { checkField } = checkboxOpts;
3291
3557
  const childrenField = treeOpts.children || treeOpts.childrenField;
3292
- const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
3293
3558
  let rowList = [];
3294
3559
  if (checkField) {
3295
3560
  if (treeConfig) {
3561
+ const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
3296
3562
  rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField });
3297
3563
  }
3298
3564
  else {
3565
+ const currTableData = isFull ? tableFullData : afterFullData;
3299
3566
  rowList = currTableData.filter((row) => XEUtils.get(row, checkField));
3300
3567
  }
3301
3568
  }
3302
3569
  else {
3303
- const { selectCheckboxMaps, fullDataRowIdData } = this;
3304
3570
  XEUtils.each(selectCheckboxMaps, (row, rowid) => {
3305
3571
  if (isFull) {
3306
3572
  if (fullDataRowIdData[rowid]) {
@@ -3616,6 +3882,7 @@ const Methods = {
3616
3882
  * 默认执行一次,除非被重置
3617
3883
  */
3618
3884
  handleLoadDefaults() {
3885
+ const $xeTable = this;
3619
3886
  if (this.checkboxConfig) {
3620
3887
  this.handleDefaultSelectionChecked();
3621
3888
  }
@@ -3626,7 +3893,7 @@ const Methods = {
3626
3893
  this.handleDefaultRowExpand();
3627
3894
  }
3628
3895
  if (this.treeConfig) {
3629
- this.handleDefaultTreeExpand();
3896
+ handleDefaultTreeExpand($xeTable);
3630
3897
  }
3631
3898
  if (this.mergeCells) {
3632
3899
  this.handleDefaultMergeCells();
@@ -3885,8 +4152,19 @@ const Methods = {
3885
4152
  }
3886
4153
  },
3887
4154
  getCustomStoreData() {
3888
- const { id, customOpts, collectColumn } = this;
3889
- const { checkMethod } = customOpts;
4155
+ const $xeTable = this;
4156
+ const props = $xeTable;
4157
+ const internalData = $xeTable;
4158
+ const { id } = props;
4159
+ const customOpts = $xeTable.computeCustomOpts;
4160
+ const { collectColumn } = internalData;
4161
+ const { storage, checkMethod } = customOpts;
4162
+ const isAllCustom = storage === true;
4163
+ const storageOpts = isAllCustom ? {} : Object.assign({}, storage || {});
4164
+ const isCustomResizable = isAllCustom || storageOpts.resizable;
4165
+ const isCustomVisible = isAllCustom || storageOpts.visible;
4166
+ const isCustomFixed = isAllCustom || storageOpts.fixed;
4167
+ const isCustomSort = isAllCustom || storageOpts.sort;
3890
4168
  const resizableData = {};
3891
4169
  const sortData = {};
3892
4170
  const visibleData = {};
@@ -3903,47 +4181,37 @@ const Methods = {
3903
4181
  }
3904
4182
  let hasResizable = 0;
3905
4183
  let hasSort = 0;
3906
- let hasFixedt = 0;
4184
+ let hasFixed = 0;
3907
4185
  let hasVisible = 0;
3908
4186
  XEUtils.eachTree(collectColumn, (column, index, items, path, parentColumn) => {
4187
+ const colKey = column.getKey();
4188
+ if (!colKey) {
4189
+ errLog('vxe.error.reqProp', [`${column.getTitle() || column.type || ''} -> column.field=?`]);
4190
+ return;
4191
+ }
3909
4192
  // 只支持一级
3910
4193
  if (!parentColumn) {
3911
- collectColumn.forEach((column) => {
3912
- const colKey = column.getKey();
3913
- if (colKey) {
3914
- hasSort = 1;
3915
- sortData[colKey] = column.renderSortNumber;
3916
- }
3917
- });
3918
- if (column.fixed !== column.defaultFixed) {
3919
- const colKey = column.getKey();
3920
- if (colKey) {
3921
- hasFixedt = 1;
3922
- fixedData[colKey] = column.fixed;
3923
- }
4194
+ if (isCustomSort) {
4195
+ hasSort = 1;
4196
+ sortData[colKey] = column.renderSortNumber;
3924
4197
  }
3925
- }
3926
- if (column.resizeWidth) {
3927
- const colKey = column.getKey();
3928
- if (colKey) {
3929
- hasResizable = 1;
3930
- resizableData[colKey] = column.renderWidth;
4198
+ if (isCustomFixed && column.fixed !== column.defaultFixed) {
4199
+ hasFixed = 1;
4200
+ fixedData[colKey] = column.fixed;
3931
4201
  }
3932
4202
  }
3933
- if (!checkMethod || checkMethod({ column })) {
4203
+ if (isCustomResizable && column.resizeWidth) {
4204
+ hasResizable = 1;
4205
+ resizableData[colKey] = column.renderWidth;
4206
+ }
4207
+ if (isCustomVisible && (!checkMethod || checkMethod({ column }))) {
3934
4208
  if (!column.visible && column.defaultVisible) {
3935
- const colKey = column.getKey();
3936
- if (colKey) {
3937
- hasVisible = 1;
3938
- visibleData[colKey] = false;
3939
- }
4209
+ hasVisible = 1;
4210
+ visibleData[colKey] = false;
3940
4211
  }
3941
4212
  else if (column.visible && !column.defaultVisible) {
3942
- const colKey = column.getKey();
3943
- if (colKey) {
3944
- hasVisible = 1;
3945
- visibleData[colKey] = true;
3946
- }
4213
+ hasVisible = 1;
4214
+ visibleData[colKey] = true;
3947
4215
  }
3948
4216
  }
3949
4217
  });
@@ -3953,7 +4221,7 @@ const Methods = {
3953
4221
  if (hasSort) {
3954
4222
  storeData.sortData = sortData;
3955
4223
  }
3956
- if (hasFixedt) {
4224
+ if (hasFixed) {
3957
4225
  storeData.fixedData = fixedData;
3958
4226
  }
3959
4227
  if (hasVisible) {
@@ -4441,12 +4709,13 @@ const Methods = {
4441
4709
  const $xeTable = this;
4442
4710
  const internalData = $xeTable;
4443
4711
  const { fullAllDataRowIdData, afterFullData } = internalData;
4712
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4444
4713
  const rowOpts = $xeTable.computeRowOpts;
4445
4714
  const cellOpts = $xeTable.computeCellOpts;
4446
4715
  const defaultRowHeight = $xeTable.computeDefaultRowHeight;
4447
4716
  const rest = {};
4448
4717
  afterFullData.forEach(row => {
4449
- const rowid = getRowid($xeTable, row);
4718
+ const rowid = handleGetRowId(row);
4450
4719
  const rowRest = fullAllDataRowIdData[rowid];
4451
4720
  if (rowRest) {
4452
4721
  const resizeHeight = rowRest.resizeHeight;
@@ -4473,8 +4742,9 @@ const Methods = {
4473
4742
  rHeight = Math.floor(rHeight * bodyHeight);
4474
4743
  }
4475
4744
  if (rHeight) {
4745
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
4476
4746
  rows.forEach(row => {
4477
- const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : getRowid($xeTable, row);
4747
+ const rowid = XEUtils.isString(row) || XEUtils.isNumber(row) ? row : handleGetRowId(row);
4478
4748
  const rowRest = fullAllDataRowIdData[rowid];
4479
4749
  if (rowRest) {
4480
4750
  rowRest.resizeHeight = rHeight;
@@ -4626,8 +4896,22 @@ const Methods = {
4626
4896
  }
4627
4897
  }
4628
4898
  // 兼容老版本
4629
- let rest;
4630
- if (!evntList.some(func => func(Object.assign({ $grid: this.$xegrid, $table: this, $event: evnt }, args)) === false)) {
4899
+ let rest = null;
4900
+ let isStop = false;
4901
+ for (let i = 0; i < evntList.length; i++) {
4902
+ const func = evntList[i];
4903
+ const fnRest = func(Object.assign({ $grid: this.$xegrid, $table: this, $event: evnt }, args));
4904
+ if (fnRest === false) {
4905
+ isStop = true;
4906
+ break;
4907
+ }
4908
+ else if (fnRest && fnRest.status === false) {
4909
+ rest = fnRest.result;
4910
+ isStop = true;
4911
+ break;
4912
+ }
4913
+ }
4914
+ if (!isStop) {
4631
4915
  if (next) {
4632
4916
  rest = next();
4633
4917
  }
@@ -4821,7 +5105,8 @@ const Methods = {
4821
5105
  if (this.isActivated) {
4822
5106
  this.preventEvent(evnt, 'event.keydown', null, () => {
4823
5107
  const { afterFullData } = internalData;
4824
- const { filterStore, isCtxMenu, ctxMenuStore, editStore, editOpts, editConfig, mouseConfig, mouseOpts, keyboardConfig, keyboardOpts, treeConfig, treeOpts, highlightCurrentRow, currentRow, bodyCtxMenu, rowOpts } = this;
5108
+ const { filterStore, isCtxMenu, ctxMenuStore, editStore, editOpts, editConfig, mouseConfig, mouseOpts, keyboardConfig, keyboardOpts, treeConfig, treeOpts, highlightCurrentRow, highlightCurrentColumn, currentRow, bodyCtxMenu, rowOpts } = this;
5109
+ const columnOpts = $xeTable.computeColumnOpts;
4825
5110
  const { selected, actived } = editStore;
4826
5111
  const { keyCode } = evnt;
4827
5112
  const hasBackspaceKey = keyCode === 8;
@@ -4975,11 +5260,15 @@ const Methods = {
4975
5260
  if (!isEditStatus) {
4976
5261
  // 如果按下了方向键
4977
5262
  if (selected.row && selected.column) {
4978
- this.moveSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
5263
+ $xeTable.moveSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
5264
+ }
5265
+ // 当前行按键上下移动
5266
+ if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
5267
+ $xeTable.moveCurrentRow(isUpArrow, isDwArrow, evnt);
4979
5268
  }
4980
- else if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
4981
- // 当前行按键上下移动
4982
- this.moveCurrentRow(isUpArrow, isDwArrow, evnt);
5269
+ // 当前行按键左右移动
5270
+ if ((isLeftArrow || isRightArrow) && (columnOpts.isCurrent || highlightCurrentColumn)) {
5271
+ $xeTable.moveCurrentColumn(isLeftArrow, isRightArrow, evnt);
4983
5272
  }
4984
5273
  }
4985
5274
  }
@@ -5302,11 +5591,15 @@ const Methods = {
5302
5591
  * 获取复选框半选状态的行数据
5303
5592
  */
5304
5593
  getCheckboxIndeterminateRecords(isFull) {
5305
- const { treeConfig, treeIndeterminateMaps, fullDataRowIdData } = this;
5594
+ const $xeTable = this;
5595
+ const props = $xeTable;
5596
+ const internalData = $xeTable;
5597
+ const { treeConfig } = props;
5598
+ const { fullDataRowIdData, treeIndeterminateRowMaps } = internalData;
5306
5599
  if (treeConfig) {
5307
5600
  const fullRest = [];
5308
5601
  const defRest = [];
5309
- XEUtils.each(treeIndeterminateMaps, (item, rowid) => {
5602
+ XEUtils.each(treeIndeterminateRowMaps, (item, rowid) => {
5310
5603
  if (item) {
5311
5604
  fullRest.push(item);
5312
5605
  if (fullDataRowIdData[rowid]) {
@@ -5376,20 +5669,22 @@ const Methods = {
5376
5669
  isCheckedByCheckboxRow(row) {
5377
5670
  const $xeTable = this;
5378
5671
  const reactData = $xeTable;
5379
- const { selectCheckboxMaps } = reactData;
5672
+ const internalData = $xeTable;
5673
+ const { updateCheckboxFlag } = reactData;
5674
+ const { selectCheckboxMaps } = internalData;
5380
5675
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5381
5676
  const { checkField } = checkboxOpts;
5382
5677
  if (checkField) {
5383
5678
  return XEUtils.get(row, checkField);
5384
5679
  }
5385
- return !!selectCheckboxMaps[getRowid($xeTable, row)];
5680
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[getRowid($xeTable, row)];
5386
5681
  },
5387
5682
  isCheckedByCheckboxRowKey(rowid) {
5388
5683
  const $xeTable = this;
5389
5684
  const reactData = $xeTable;
5390
5685
  const internalData = $xeTable;
5391
- const { selectCheckboxMaps } = reactData;
5392
- const { fullAllDataRowIdData } = internalData;
5686
+ const { updateCheckboxFlag } = reactData;
5687
+ const { fullAllDataRowIdData, selectCheckboxMaps } = internalData;
5393
5688
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5394
5689
  const { checkField } = checkboxOpts;
5395
5690
  if (checkField) {
@@ -5399,19 +5694,19 @@ const Methods = {
5399
5694
  }
5400
5695
  return false;
5401
5696
  }
5402
- return !!selectCheckboxMaps[rowid];
5697
+ return !!updateCheckboxFlag && !!selectCheckboxMaps[rowid];
5403
5698
  },
5404
5699
  isIndeterminateByCheckboxRow(row) {
5405
5700
  const $xeTable = this;
5406
- const reactData = $xeTable;
5407
- const { treeIndeterminateMaps } = reactData;
5408
- return !!treeIndeterminateMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5701
+ const internalData = $xeTable;
5702
+ const { treeIndeterminateRowMaps } = internalData;
5703
+ return !!treeIndeterminateRowMaps[getRowid($xeTable, row)] && !$xeTable.isCheckedByCheckboxRow(row);
5409
5704
  },
5410
5705
  isIndeterminateByCheckboxRowKey(rowid) {
5411
5706
  const $xeTable = this;
5412
- const reactData = $xeTable;
5413
- const { treeIndeterminateMaps } = reactData;
5414
- return !!treeIndeterminateMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5707
+ const internalData = $xeTable;
5708
+ const { treeIndeterminateRowMaps } = internalData;
5709
+ return !!treeIndeterminateRowMaps[rowid] && !$xeTable.isCheckedByCheckboxRowKey(rowid);
5415
5710
  },
5416
5711
  /**
5417
5712
  * 切换选中
@@ -5421,14 +5716,16 @@ const Methods = {
5421
5716
  const $xeTable = this;
5422
5717
  const props = $xeTable;
5423
5718
  const reactData = $xeTable;
5719
+ const internalData = $xeTable;
5424
5720
  const { treeConfig } = props;
5425
- const { selectCheckboxMaps } = reactData;
5426
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5721
+ const { selectCheckboxMaps } = internalData;
5427
5722
  const treeOpts = $xeTable.computeTreeOpts;
5428
5723
  const { transform, mapChildrenField } = treeOpts;
5429
5724
  const childrenField = treeOpts.children || treeOpts.childrenField;
5430
5725
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5431
5726
  const { checkField, checkStrictly, checkMethod } = checkboxOpts;
5727
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5728
+ // indeterminateField 仅支持读取
5432
5729
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
5433
5730
  if (checkField) {
5434
5731
  // 树结构
@@ -5443,59 +5740,57 @@ const Methods = {
5443
5740
  handleCheckboxReserveRow($xeTable, row, checked);
5444
5741
  }
5445
5742
  }, { children: transform ? mapChildrenField : childrenField });
5446
- reactData.selectCheckboxMaps = selectRowMaps;
5743
+ reactData.updateCheckboxFlag++;
5447
5744
  return;
5448
5745
  }
5449
- else {
5450
- // 列表
5451
- rows.forEach(row => {
5452
- if (isForce || (!checkMethod || checkMethod({ row }))) {
5453
- XEUtils.set(row, checkField, checked);
5454
- handleCheckboxReserveRow($xeTable, row, checked);
5455
- }
5456
- });
5457
- }
5458
- reactData.selectCheckboxMaps = selectRowMaps;
5746
+ // 列表
5747
+ rows.forEach(row => {
5748
+ if (isForce || (!checkMethod || checkMethod({ row }))) {
5749
+ XEUtils.set(row, checkField, checked);
5750
+ handleCheckboxReserveRow($xeTable, row, checked);
5751
+ }
5752
+ });
5753
+ reactData.updateCheckboxFlag++;
5459
5754
  return;
5460
5755
  }
5461
5756
  // 树结构
5462
5757
  if (treeConfig && !checkStrictly) {
5463
5758
  // 更新子节点状态
5464
5759
  XEUtils.eachTree(rows, (row) => {
5465
- const rowid = getRowid($xeTable, row);
5760
+ const rowid = handleGetRowId(row);
5466
5761
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5467
5762
  if (checked) {
5468
- selectRowMaps[rowid] = row;
5763
+ selectCheckboxMaps[rowid] = row;
5469
5764
  }
5470
5765
  else {
5471
- if (selectRowMaps[rowid]) {
5472
- delete selectRowMaps[rowid];
5766
+ if (selectCheckboxMaps[rowid]) {
5767
+ delete selectCheckboxMaps[rowid];
5473
5768
  }
5474
5769
  }
5475
5770
  handleCheckboxReserveRow($xeTable, row, checked);
5476
5771
  }
5477
5772
  }, { children: transform ? mapChildrenField : childrenField });
5478
- reactData.selectCheckboxMaps = selectRowMaps;
5773
+ reactData.updateCheckboxFlag++;
5479
5774
  return;
5480
5775
  }
5481
5776
  // 列表
5482
5777
  rows.forEach(row => {
5483
- const rowid = getRowid($xeTable, row);
5778
+ const rowid = handleGetRowId(row);
5484
5779
  if (isForce || (!checkMethod || checkMethod({ row }))) {
5485
5780
  if (checked) {
5486
- if (!selectRowMaps[rowid]) {
5487
- selectRowMaps[rowid] = row;
5781
+ if (!selectCheckboxMaps[rowid]) {
5782
+ selectCheckboxMaps[rowid] = row;
5488
5783
  }
5489
5784
  }
5490
5785
  else {
5491
- if (selectRowMaps[rowid]) {
5492
- delete selectRowMaps[rowid];
5786
+ if (selectCheckboxMaps[rowid]) {
5787
+ delete selectCheckboxMaps[rowid];
5493
5788
  }
5494
5789
  }
5495
5790
  handleCheckboxReserveRow($xeTable, row, checked);
5791
+ reactData.updateCheckboxFlag++;
5496
5792
  }
5497
5793
  });
5498
- reactData.selectCheckboxMaps = selectRowMaps;
5499
5794
  },
5500
5795
  /**
5501
5796
  * 即将移除
@@ -5506,7 +5801,10 @@ const Methods = {
5506
5801
  $xeTable.handleBatchSelectRows([row], checked, isForce);
5507
5802
  },
5508
5803
  handleToggleCheckRowEvent(evnt, params) {
5509
- const { selectCheckboxMaps, checkboxOpts } = this;
5804
+ const $xeTable = this;
5805
+ const internalData = $xeTable;
5806
+ const { selectCheckboxMaps } = internalData;
5807
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5510
5808
  const { checkField, trigger } = checkboxOpts;
5511
5809
  const { row } = params;
5512
5810
  if (trigger === 'manual') {
@@ -5517,47 +5815,52 @@ const Methods = {
5517
5815
  checked = !XEUtils.get(row, checkField);
5518
5816
  }
5519
5817
  else {
5520
- checked = !selectCheckboxMaps[getRowid(this, row)];
5818
+ checked = !selectCheckboxMaps[getRowid($xeTable, row)];
5521
5819
  }
5522
5820
  if (evnt) {
5523
- this.triggerCheckRowEvent(evnt, params, checked);
5821
+ $xeTable.triggerCheckRowEvent(evnt, params, checked);
5524
5822
  }
5525
5823
  else {
5526
- this.handleSelectRow(params, checked);
5527
- this.checkSelectionStatus();
5824
+ $xeTable.handleBatchSelectRows([row], checked);
5825
+ $xeTable.checkSelectionStatus();
5528
5826
  }
5529
5827
  },
5530
5828
  triggerCheckRowEvent(evnt, params, checked) {
5531
5829
  const $xeTable = this;
5532
- const { checkboxOpts, afterFullData } = this;
5533
- const { checkMethod, trigger } = checkboxOpts;
5830
+ const props = $xeTable;
5831
+ const internalData = $xeTable;
5534
5832
  const { row } = params;
5833
+ const { afterFullData } = internalData;
5834
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5835
+ const { checkMethod, trigger } = checkboxOpts;
5535
5836
  if (trigger === 'manual') {
5536
5837
  return;
5537
5838
  }
5538
5839
  evnt.stopPropagation();
5539
- if (checkboxOpts.isShiftKey && evnt.shiftKey && !this.treeConfig) {
5540
- const checkboxRecords = this.getCheckboxRecords();
5840
+ if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
5841
+ const checkboxRecords = $xeTable.getCheckboxRecords();
5541
5842
  if (checkboxRecords.length) {
5542
5843
  const firstRow = checkboxRecords[0];
5543
- const _rowIndex = this.getVTRowIndex(row);
5544
- const _firstRowIndex = this.getVTRowIndex(firstRow);
5844
+ const _rowIndex = $xeTable.getVTRowIndex(row);
5845
+ const _firstRowIndex = $xeTable.getVTRowIndex(firstRow);
5545
5846
  if (_rowIndex !== _firstRowIndex) {
5546
- this.setAllCheckboxRow(false);
5847
+ $xeTable.setAllCheckboxRow(false);
5547
5848
  const rangeRows = _rowIndex < _firstRowIndex ? afterFullData.slice(_rowIndex, _firstRowIndex + 1) : afterFullData.slice(_firstRowIndex, _rowIndex + 1);
5548
- handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5549
- this.emitEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5849
+ $xeTable.$nextTick(() => {
5850
+ handleCheckedCheckboxRow($xeTable, rangeRows, true, false);
5851
+ });
5852
+ $xeTable.dispatchEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt);
5550
5853
  return;
5551
5854
  }
5552
5855
  }
5553
5856
  }
5554
5857
  if (!checkMethod || checkMethod({ row })) {
5555
- this.handleSelectRow(params, checked);
5556
- this.checkSelectionStatus();
5557
- this.emitEvent('checkbox-change', Object.assign({
5558
- records: this.getCheckboxRecords(),
5559
- reserves: this.getCheckboxReserveRecords(),
5560
- indeterminates: this.getCheckboxIndeterminateRecords(),
5858
+ $xeTable.handleBatchSelectRows([row], checked);
5859
+ $xeTable.checkSelectionStatus();
5860
+ $xeTable.dispatchEvent('checkbox-change', Object.assign({
5861
+ records: () => $xeTable.getCheckboxRecords(),
5862
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
5863
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5561
5864
  checked
5562
5865
  }, params), evnt);
5563
5866
  }
@@ -5567,7 +5870,9 @@ const Methods = {
5567
5870
  */
5568
5871
  toggleCheckboxRow(row) {
5569
5872
  const $xeTable = this;
5570
- const { selectCheckboxMaps, checkboxOpts } = this;
5873
+ const internalData = $xeTable;
5874
+ const { selectCheckboxMaps } = internalData;
5875
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
5571
5876
  const { checkField } = checkboxOpts;
5572
5877
  const checked = checkField ? !XEUtils.get(row, checkField) : !selectCheckboxMaps[getRowid($xeTable, row)];
5573
5878
  $xeTable.handleBatchSelectRows([row], checked, true);
@@ -5588,9 +5893,7 @@ const Methods = {
5588
5893
  const reactData = $xeTable;
5589
5894
  const internalData = $xeTable;
5590
5895
  const { treeConfig } = props;
5591
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
5592
- const selectRowMaps = Object.assign({}, selectCheckboxMaps);
5593
- const halfRowMaps = Object.assign({}, treeIndeterminateMaps);
5896
+ const { selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5594
5897
  const treeOpts = $xeTable.computeTreeOpts;
5595
5898
  const { transform, mapChildrenField } = treeOpts;
5596
5899
  const childrenField = treeOpts.children || treeOpts.childrenField;
@@ -5602,10 +5905,11 @@ const Methods = {
5602
5905
  }
5603
5906
  // 树结构
5604
5907
  if (treeConfig) {
5908
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5605
5909
  const childRowMaps = {};
5606
5910
  const childRowList = [];
5607
5911
  XEUtils.eachTree(afterTreeFullData, (row) => {
5608
- const rowid = getRowid($xeTable, row);
5912
+ const rowid = handleGetRowId(row);
5609
5913
  const childList = row[transform ? mapChildrenField : childrenField];
5610
5914
  if (childList && childList.length && !childRowMaps[rowid]) {
5611
5915
  childRowMaps[rowid] = 1;
@@ -5621,13 +5925,13 @@ const Methods = {
5621
5925
  let vLen = 0; // 有效行
5622
5926
  childList.forEach(checkMethod
5623
5927
  ? (item) => {
5624
- const childRowid = getRowid($xeTable, item);
5625
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5928
+ const childRowid = handleGetRowId(item);
5929
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5626
5930
  if (checkMethod({ row: item })) {
5627
5931
  if (isSelect) {
5628
5932
  sLen++;
5629
5933
  }
5630
- else if (halfRowMaps[childRowid]) {
5934
+ else if (treeIndeterminateRowMaps[childRowid]) {
5631
5935
  hLen++;
5632
5936
  }
5633
5937
  vLen++;
@@ -5636,18 +5940,18 @@ const Methods = {
5636
5940
  if (isSelect) {
5637
5941
  sLen++;
5638
5942
  }
5639
- else if (halfRowMaps[childRowid]) {
5943
+ else if (treeIndeterminateRowMaps[childRowid]) {
5640
5944
  hLen++;
5641
5945
  }
5642
5946
  }
5643
5947
  }
5644
5948
  : item => {
5645
- const childRowid = getRowid($xeTable, item);
5646
- const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid];
5949
+ const childRowid = handleGetRowId(item);
5950
+ const isSelect = checkField ? XEUtils.get(item, checkField) : selectCheckboxMaps[childRowid];
5647
5951
  if (isSelect) {
5648
5952
  sLen++;
5649
5953
  }
5650
- else if (halfRowMaps[childRowid]) {
5954
+ else if (treeIndeterminateRowMaps[childRowid]) {
5651
5955
  hLen++;
5652
5956
  }
5653
5957
  vLen++;
@@ -5659,31 +5963,30 @@ const Methods = {
5659
5963
  }
5660
5964
  if (isSelected) {
5661
5965
  if (!checkField) {
5662
- selectRowMaps[rowid] = row;
5966
+ selectCheckboxMaps[rowid] = row;
5663
5967
  }
5664
- if (halfRowMaps[rowid]) {
5665
- delete halfRowMaps[rowid];
5968
+ if (treeIndeterminateRowMaps[rowid]) {
5969
+ delete treeIndeterminateRowMaps[rowid];
5666
5970
  }
5667
5971
  }
5668
5972
  else {
5669
5973
  if (!checkField) {
5670
- if (selectRowMaps[rowid]) {
5671
- delete selectRowMaps[rowid];
5974
+ if (selectCheckboxMaps[rowid]) {
5975
+ delete selectCheckboxMaps[rowid];
5672
5976
  }
5673
5977
  }
5674
5978
  if (halfSelect) {
5675
- halfRowMaps[rowid] = row;
5979
+ treeIndeterminateRowMaps[rowid] = row;
5676
5980
  }
5677
5981
  else {
5678
- if (halfRowMaps[rowid]) {
5679
- delete halfRowMaps[rowid];
5982
+ if (treeIndeterminateRowMaps[rowid]) {
5983
+ delete treeIndeterminateRowMaps[rowid];
5680
5984
  }
5681
5985
  }
5682
5986
  }
5683
5987
  });
5684
5988
  }
5685
- reactData.selectCheckboxMaps = selectRowMaps;
5686
- reactData.treeIndeterminateMaps = halfRowMaps;
5989
+ reactData.updateCheckboxFlag++;
5687
5990
  },
5688
5991
  updateAllCheckboxStatus() {
5689
5992
  const $xeTable = this;
@@ -5691,23 +5994,23 @@ const Methods = {
5691
5994
  const reactData = $xeTable;
5692
5995
  const internalData = $xeTable;
5693
5996
  const { treeConfig } = props;
5694
- const { selectCheckboxMaps, treeIndeterminateMaps } = reactData;
5997
+ const { afterFullData, afterTreeFullData, checkboxReserveRowMap, selectCheckboxMaps, treeIndeterminateRowMaps } = internalData;
5695
5998
  const checkboxOpts = $xeTable.computeCheckboxOpts;
5696
5999
  const { checkField, checkMethod, showReserveStatus } = checkboxOpts;
5697
- const { afterFullData, afterTreeFullData, checkboxReserveRowMap } = internalData;
6000
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5698
6001
  let sLen = 0; // 已选
5699
6002
  let hLen = 0; // 半选
5700
6003
  let vLen = 0; // 有效行
5701
6004
  const rootList = (treeConfig ? afterTreeFullData : afterFullData);
5702
6005
  rootList.forEach(checkMethod
5703
6006
  ? row => {
5704
- const childRowid = getRowid($xeTable, row);
6007
+ const childRowid = handleGetRowId(row);
5705
6008
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5706
6009
  if (checkMethod({ row })) {
5707
6010
  if (selected) {
5708
6011
  sLen++;
5709
6012
  }
5710
- else if (treeIndeterminateMaps[childRowid]) {
6013
+ else if (treeIndeterminateRowMaps[childRowid]) {
5711
6014
  hLen++;
5712
6015
  }
5713
6016
  vLen++;
@@ -5716,18 +6019,18 @@ const Methods = {
5716
6019
  if (selected) {
5717
6020
  sLen++;
5718
6021
  }
5719
- else if (treeIndeterminateMaps[childRowid]) {
6022
+ else if (treeIndeterminateRowMaps[childRowid]) {
5720
6023
  hLen++;
5721
6024
  }
5722
6025
  }
5723
6026
  }
5724
6027
  : row => {
5725
- const childRowid = getRowid($xeTable, row);
6028
+ const childRowid = handleGetRowId(row);
5726
6029
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid];
5727
6030
  if (selected) {
5728
6031
  sLen++;
5729
6032
  }
5730
- else if (treeIndeterminateMaps[childRowid]) {
6033
+ else if (treeIndeterminateRowMaps[childRowid]) {
5731
6034
  hLen++;
5732
6035
  }
5733
6036
  vLen++;
@@ -5784,19 +6087,26 @@ const Methods = {
5784
6087
  * 获取复选框保留选中的行
5785
6088
  */
5786
6089
  getCheckboxReserveRecords(isFull) {
5787
- const { fullDataRowIdData, afterFullData, checkboxReserveRowMap, checkboxOpts, treeConfig, treeOpts } = this;
6090
+ const $xeTable = this;
6091
+ const props = $xeTable;
6092
+ const internalData = $xeTable;
6093
+ const { treeConfig } = props;
6094
+ const { afterFullData, fullDataRowIdData, checkboxReserveRowMap } = internalData;
6095
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6096
+ const treeOpts = $xeTable.computeTreeOpts;
5788
6097
  const childrenField = treeOpts.children || treeOpts.childrenField;
5789
6098
  const reserveSelection = [];
5790
6099
  if (checkboxOpts.reserve) {
6100
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
5791
6101
  const afterFullIdMaps = {};
5792
6102
  if (treeConfig) {
5793
6103
  XEUtils.eachTree(afterFullData, row => {
5794
- afterFullIdMaps[getRowid(this, row)] = 1;
6104
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5795
6105
  }, { children: childrenField });
5796
6106
  }
5797
6107
  else {
5798
6108
  afterFullData.forEach((row) => {
5799
- afterFullIdMaps[getRowid(this, row)] = 1;
6109
+ afterFullIdMaps[handleGetRowId(row)] = 1;
5800
6110
  });
5801
6111
  }
5802
6112
  XEUtils.each(checkboxReserveRowMap, (oldRow, oldRowid) => {
@@ -5837,9 +6147,9 @@ const Methods = {
5837
6147
  handleCheckedAllCheckboxRow($xeTable, value);
5838
6148
  if (evnt) {
5839
6149
  $xeTable.dispatchEvent('checkbox-all', {
5840
- records: $xeTable.getCheckboxRecords(),
5841
- reserves: $xeTable.getCheckboxReserveRecords(),
5842
- indeterminates: $xeTable.getCheckboxIndeterminateRecords(),
6150
+ records: () => $xeTable.getCheckboxRecords(),
6151
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
6152
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
5843
6153
  checked: value
5844
6154
  }, evnt);
5845
6155
  }
@@ -5871,9 +6181,17 @@ const Methods = {
5871
6181
  * 清空行为不管是否被禁用还是保留记录,都将彻底清空选中状态
5872
6182
  */
5873
6183
  clearCheckboxRow() {
5874
- const { tableFullData, treeConfig, treeOpts, checkboxOpts } = this;
5875
- const { checkField, reserve } = checkboxOpts;
6184
+ const $xeTable = this;
6185
+ const props = $xeTable;
6186
+ const reactData = $xeTable;
6187
+ const internalData = $xeTable;
6188
+ const { treeConfig } = props;
6189
+ const { tableFullData } = internalData;
6190
+ const treeOpts = $xeTable.computeTreeOpts;
5876
6191
  const childrenField = treeOpts.children || treeOpts.childrenField;
6192
+ const checkboxOpts = $xeTable.computeCheckboxOpts;
6193
+ const { checkField, reserve } = checkboxOpts;
6194
+ // indeterminateField 仅支持读取
5877
6195
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField;
5878
6196
  if (checkField) {
5879
6197
  const handleClearChecked = (item) => {
@@ -5892,10 +6210,11 @@ const Methods = {
5892
6210
  if (reserve) {
5893
6211
  tableFullData.forEach((row) => this.handleCheckboxReserveRow(row, false));
5894
6212
  }
5895
- this.isAllSelected = false;
5896
- this.isIndeterminate = false;
5897
- this.selectCheckboxMaps = {};
5898
- this.treeIndeterminateMaps = {};
6213
+ reactData.isAllSelected = false;
6214
+ reactData.isIndeterminate = false;
6215
+ internalData.selectCheckboxMaps = {};
6216
+ internalData.treeIndeterminateRowMaps = {};
6217
+ reactData.updateCheckboxFlag++;
5899
6218
  return this.$nextTick();
5900
6219
  },
5901
6220
  /**
@@ -6092,10 +6411,12 @@ const Methods = {
6092
6411
  },
6093
6412
  triggerHeaderCellClickEvent(evnt, params) {
6094
6413
  const $xeTable = this;
6414
+ const props = $xeTable;
6095
6415
  const internalData = $xeTable;
6096
6416
  const { _lastResizeTime } = internalData;
6097
6417
  const sortOpts = $xeTable.computeSortOpts;
6098
6418
  const columnOpts = $xeTable.computeColumnOpts;
6419
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6099
6420
  const { column } = params;
6100
6421
  const cell = evnt.currentTarget;
6101
6422
  const triggerResizable = _lastResizeTime && _lastResizeTime > Date.now() - 300;
@@ -6105,7 +6426,7 @@ const Methods = {
6105
6426
  $xeTable.triggerSortEvent(evnt, column, getNextSortOrder($xeTable, column));
6106
6427
  }
6107
6428
  $xeTable.dispatchEvent('header-cell-click', Object.assign({ triggerResizable, triggerSort, triggerFilter, cell }, params), evnt);
6108
- if (columnOpts.isCurrent || $xeTable.highlightCurrentColumn) {
6429
+ if ((columnOpts.isCurrent || props.highlightCurrentColumn) && (!currentColumnOpts.trigger || ['header', 'default'].includes(currentColumnOpts.trigger))) {
6109
6430
  $xeTable.triggerCurrentColumnEvent(evnt, params);
6110
6431
  }
6111
6432
  return $xeTable.$nextTick();
@@ -6121,13 +6442,23 @@ const Methods = {
6121
6442
  * @param {ColumnInfo} fieldOrColumn 列配置
6122
6443
  */
6123
6444
  setCurrentColumn(fieldOrColumn) {
6124
- const column = handleFieldOrColumn(this, fieldOrColumn);
6445
+ const $xeTable = this;
6446
+ const props = $xeTable;
6447
+ const reactData = $xeTable;
6448
+ const { mouseConfig } = props;
6449
+ const mouseOpts = $xeTable.computeMouseOpts;
6450
+ const isMouseSelected = mouseConfig && mouseOpts.selected;
6451
+ const column = handleFieldOrColumn($xeTable, fieldOrColumn);
6125
6452
  if (column) {
6126
- // this.clearCurrentRow()
6127
- this.clearCurrentColumn();
6128
- this.currentColumn = column;
6453
+ $xeTable.clearCurrentColumn();
6454
+ reactData.currentColumn = column;
6129
6455
  }
6130
- return this.$nextTick();
6456
+ return $xeTable.$nextTick().then(() => {
6457
+ // 更新状选中态
6458
+ if (isMouseSelected) {
6459
+ $xeTable.addCellSelectedClass();
6460
+ }
6461
+ });
6131
6462
  },
6132
6463
  /**
6133
6464
  * 用于当前列,手动清空当前高亮的状态
@@ -6136,25 +6467,6 @@ const Methods = {
6136
6467
  this.currentColumn = null;
6137
6468
  return this.$nextTick();
6138
6469
  },
6139
- checkValidate(type) {
6140
- if (this.triggerValidate) {
6141
- return this.triggerValidate(type);
6142
- }
6143
- return this.$nextTick();
6144
- },
6145
- /**
6146
- * 当单元格发生改变时
6147
- * 如果存在规则,则校验
6148
- */
6149
- handleChangeCell(evnt, params) {
6150
- this.checkValidate('blur')
6151
- .catch((e) => e)
6152
- .then(() => {
6153
- this.handleEdit(params, evnt)
6154
- .then(() => this.checkValidate('change'))
6155
- .catch((e) => e);
6156
- });
6157
- },
6158
6470
  /**
6159
6471
  * 列点击事件
6160
6472
  * 如果是单击模式,则激活为编辑状态
@@ -6164,7 +6476,7 @@ const Methods = {
6164
6476
  const $xeTable = this;
6165
6477
  const props = $xeTable;
6166
6478
  const reactData = $xeTable;
6167
- const { highlightCurrentRow, editConfig } = props;
6479
+ const { highlightCurrentRow, highlightCurrentColumn, editConfig } = props;
6168
6480
  const { editStore, isDragResize } = reactData;
6169
6481
  if (isDragResize) {
6170
6482
  return;
@@ -6176,6 +6488,8 @@ const Methods = {
6176
6488
  const checkboxOpts = $xeTable.computeCheckboxOpts;
6177
6489
  const keyboardOpts = $xeTable.computeKeyboardOpts;
6178
6490
  const rowOpts = $xeTable.computeRowOpts;
6491
+ const columnOpts = $xeTable.computeColumnOpts;
6492
+ const currentColumnOpts = $xeTable.computeCurrentColumnOpts;
6179
6493
  const { actived, focused } = editStore;
6180
6494
  const { row, column } = params;
6181
6495
  const { type, treeNode } = column;
@@ -6191,11 +6505,11 @@ const Methods = {
6191
6505
  if (!triggerCheckbox && !triggerRadio) {
6192
6506
  // 如果是展开行
6193
6507
  if (!triggerExpandNode && (expandOpts.trigger === 'row' || (isExpandType && expandOpts.trigger === 'cell'))) {
6194
- this.triggerRowExpandEvent(evnt, params);
6508
+ $xeTable.triggerRowExpandEvent(evnt, params);
6195
6509
  }
6196
6510
  // 如果是树形表格
6197
6511
  if ((treeOpts.trigger === 'row' || (treeNode && treeOpts.trigger === 'cell'))) {
6198
- this.triggerTreeExpandEvent(evnt, params);
6512
+ $xeTable.triggerTreeExpandEvent(evnt, params);
6199
6513
  }
6200
6514
  }
6201
6515
  // 如果点击了树节点
@@ -6204,16 +6518,22 @@ const Methods = {
6204
6518
  // 如果是高亮行
6205
6519
  if (rowOpts.isCurrent || highlightCurrentRow) {
6206
6520
  if (!triggerCheckbox && !triggerRadio) {
6207
- this.triggerCurrentRowEvent(evnt, params);
6521
+ $xeTable.triggerCurrentRowEvent(evnt, params);
6522
+ }
6523
+ }
6524
+ // 如果是当前列
6525
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && (!currentColumnOpts.trigger || ['cell', 'default'].includes(currentColumnOpts.trigger))) {
6526
+ if (!triggerCheckbox && !triggerRadio) {
6527
+ $xeTable.triggerCurrentColumnEvent(evnt, params);
6208
6528
  }
6209
6529
  }
6210
6530
  // 如果是单选框
6211
6531
  if (!triggerRadio && (radioOpts.trigger === 'row' || (isRadioType && radioOpts.trigger === 'cell'))) {
6212
- this.triggerRadioRowEvent(evnt, params);
6532
+ $xeTable.triggerRadioRowEvent(evnt, params);
6213
6533
  }
6214
6534
  // 如果是复选框
6215
6535
  if (!triggerCheckbox && (checkboxOpts.trigger === 'row' || (isCheckboxType && checkboxOpts.trigger === 'cell'))) {
6216
- this.handleToggleCheckRowEvent(evnt, params);
6536
+ $xeTable.handleToggleCheckRowEvent(evnt, params);
6217
6537
  }
6218
6538
  }
6219
6539
  // 如果设置了单元格选中功能,则不会使用点击事件去处理(只能支持双击模式)
@@ -6225,16 +6545,16 @@ const Methods = {
6225
6545
  }
6226
6546
  if (editOpts.trigger === 'manual') {
6227
6547
  if (actived.args && actived.row === row && column !== actived.column) {
6228
- this.handleChangeCell(evnt, params);
6548
+ handleChangeCell($xeTable, evnt, params);
6229
6549
  }
6230
6550
  }
6231
6551
  else if (!actived.args || row !== actived.row || column !== actived.column) {
6232
6552
  if (editOpts.trigger === 'click') {
6233
- this.handleChangeCell(evnt, params);
6553
+ handleChangeCell($xeTable, evnt, params);
6234
6554
  }
6235
6555
  else if (editOpts.trigger === 'dblclick') {
6236
6556
  if (editOpts.mode === 'row' && actived.row === row) {
6237
- this.handleChangeCell(evnt, params);
6557
+ handleChangeCell($xeTable, evnt, params);
6238
6558
  }
6239
6559
  }
6240
6560
  }
@@ -6255,7 +6575,7 @@ const Methods = {
6255
6575
  }
6256
6576
  }
6257
6577
  }
6258
- this.emitEvent('cell-click', params, evnt);
6578
+ $xeTable.dispatchEvent('cell-click', params, evnt);
6259
6579
  },
6260
6580
  /**
6261
6581
  * 列双击点击事件
@@ -6277,17 +6597,17 @@ const Methods = {
6277
6597
  if (isEnableConf(editConfig) && editOpts.trigger === 'dblclick') {
6278
6598
  if (!actived.args || evnt.currentTarget !== actived.args.cell) {
6279
6599
  if (editOpts.mode === 'row') {
6280
- this.checkValidate('blur')
6600
+ checkValidate($xeTable, 'blur')
6281
6601
  .catch((e) => e)
6282
6602
  .then(() => {
6283
6603
  this.handleEdit(params, evnt)
6284
- .then(() => this.checkValidate('change'))
6604
+ .then(() => checkValidate($xeTable, 'change'))
6285
6605
  .catch((e) => e);
6286
6606
  });
6287
6607
  }
6288
6608
  else if (editOpts.mode === 'cell') {
6289
6609
  this.handleEdit(params, evnt)
6290
- .then(() => this.checkValidate('change'))
6610
+ .then(() => checkValidate($xeTable, 'change'))
6291
6611
  .catch((e) => e);
6292
6612
  }
6293
6613
  }
@@ -6473,14 +6793,16 @@ const Methods = {
6473
6793
  const internalData = $xeTable;
6474
6794
  const { treeConfig, dragConfig } = props;
6475
6795
  const rowDragOpts = $xeTable.computeRowDragOpts;
6476
- const { fullAllDataRowIdData } = internalData;
6796
+ const { afterFullData, tableFullData, fullAllDataRowIdData } = internalData;
6477
6797
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, dragEndMethod, dragToChildMethod } = rowDragOpts;
6478
6798
  const treeOpts = $xeTable.computeTreeOpts;
6479
6799
  const { transform, rowField, mapChildrenField, parentField } = treeOpts;
6480
6800
  const childrenField = treeOpts.children || treeOpts.childrenField;
6481
- const { afterFullData, tableFullData } = internalData;
6482
6801
  const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
6483
6802
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
6803
+ const errRest = {
6804
+ status: false
6805
+ };
6484
6806
  if (prevDragRow && dragRow) {
6485
6807
  // 判断是否有拖动
6486
6808
  if (prevDragRow !== dragRow) {
@@ -6495,7 +6817,7 @@ const Methods = {
6495
6817
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
6496
6818
  return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
6497
6819
  if (!status) {
6498
- return;
6820
+ return errRest;
6499
6821
  }
6500
6822
  let oafIndex = -1;
6501
6823
  let nafIndex = -1;
@@ -6520,12 +6842,12 @@ const Methods = {
6520
6842
  if (isPeerDrag && !isCrossDrag) {
6521
6843
  if (oldRest.row[parentField] !== newRest.row[parentField]) {
6522
6844
  // 非同级
6523
- return;
6845
+ return errRest;
6524
6846
  }
6525
6847
  }
6526
6848
  else {
6527
6849
  if (!isCrossDrag) {
6528
- return;
6850
+ return errRest;
6529
6851
  }
6530
6852
  if (oldAllMaps[newRowid]) {
6531
6853
  isSelfToChildStatus = true;
@@ -6536,7 +6858,7 @@ const Methods = {
6536
6858
  content: getI18n('vxe.error.treeDragChild')
6537
6859
  });
6538
6860
  }
6539
- return;
6861
+ return errRest;
6540
6862
  }
6541
6863
  }
6542
6864
  }
@@ -6544,13 +6866,13 @@ const Methods = {
6544
6866
  else if (oldLevel) {
6545
6867
  // 子到根
6546
6868
  if (!isCrossDrag) {
6547
- return;
6869
+ return errRest;
6548
6870
  }
6549
6871
  }
6550
6872
  else if (newLevel) {
6551
6873
  // 根到子
6552
6874
  if (!isCrossDrag) {
6553
- return;
6875
+ return errRest;
6554
6876
  }
6555
6877
  if (oldAllMaps[newRowid]) {
6556
6878
  isSelfToChildStatus = true;
@@ -6561,7 +6883,7 @@ const Methods = {
6561
6883
  content: getI18n('vxe.error.treeDragChild')
6562
6884
  });
6563
6885
  }
6564
- return;
6886
+ return errRest;
6565
6887
  }
6566
6888
  }
6567
6889
  }
@@ -6621,27 +6943,34 @@ const Methods = {
6621
6943
  if (reactData.scrollYLoad) {
6622
6944
  $xeTable.updateScrollYSpace();
6623
6945
  }
6624
- $xeTable.$nextTick().then(() => {
6946
+ if (evnt) {
6947
+ $xeTable.dispatchEvent('row-dragend', {
6948
+ oldRow: dragRow,
6949
+ newRow: prevDragRow,
6950
+ dragRow,
6951
+ dragPos: prevDragPos,
6952
+ dragToChild: isDragToChildFlag,
6953
+ offsetIndex: dragOffsetIndex,
6954
+ _index: {
6955
+ newIndex: nafIndex,
6956
+ oldIndex: oafIndex
6957
+ }
6958
+ }, evnt);
6959
+ }
6960
+ return $xeTable.$nextTick().then(() => {
6625
6961
  $xeTable.updateCellAreas();
6626
6962
  $xeTable.recalculate();
6963
+ }).then(() => {
6964
+ return {
6965
+ status: true
6966
+ };
6627
6967
  });
6628
- $xeTable.dispatchEvent('row-dragend', {
6629
- oldRow: dragRow,
6630
- newRow: prevDragRow,
6631
- dragRow,
6632
- dragPos: prevDragPos,
6633
- dragToChild: isDragToChildFlag,
6634
- offsetIndex: dragOffsetIndex,
6635
- _index: {
6636
- newIndex: nafIndex,
6637
- oldIndex: oafIndex
6638
- }
6639
- }, evnt);
6640
6968
  }).catch(() => {
6969
+ return errRest;
6641
6970
  });
6642
6971
  }
6643
6972
  }
6644
- return Promise.resolve();
6973
+ return Promise.resolve(errRest);
6645
6974
  },
6646
6975
  handleRowDragDragendEvent(evnt) {
6647
6976
  const $xeTable = this;
@@ -6786,6 +7115,9 @@ const Methods = {
6786
7115
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, isToChildDrag, dragEndMethod, dragToChildMethod } = columnDragOpts;
6787
7116
  const { collectColumn } = internalData;
6788
7117
  const dragOffsetIndex = prevDragPos === 'right' ? 1 : 0;
7118
+ const errRest = {
7119
+ status: false
7120
+ };
6789
7121
  if (prevDragCol && dragCol) {
6790
7122
  // 判断是否有拖动
6791
7123
  if (prevDragCol !== dragCol) {
@@ -6802,7 +7134,7 @@ const Methods = {
6802
7134
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
6803
7135
  return Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
6804
7136
  if (!status) {
6805
- return;
7137
+ return errRest;
6806
7138
  }
6807
7139
  let oafIndex = -1;
6808
7140
  let nafIndex = -1;
@@ -6816,12 +7148,12 @@ const Methods = {
6816
7148
  if (isPeerDrag && !isCrossDrag) {
6817
7149
  if (dragColumn.parentId !== newColumn.parentId) {
6818
7150
  // 非同级
6819
- return;
7151
+ return errRest;
6820
7152
  }
6821
7153
  }
6822
7154
  else {
6823
7155
  if (!isCrossDrag) {
6824
- return;
7156
+ return errRest;
6825
7157
  }
6826
7158
  if (oldAllMaps[newColumn.id]) {
6827
7159
  isSelfToChildStatus = true;
@@ -6832,7 +7164,7 @@ const Methods = {
6832
7164
  content: getI18n('vxe.error.treeDragChild')
6833
7165
  });
6834
7166
  }
6835
- return;
7167
+ return errRest;
6836
7168
  }
6837
7169
  }
6838
7170
  }
@@ -6840,13 +7172,13 @@ const Methods = {
6840
7172
  else if (dragColumn.parentId) {
6841
7173
  // 子到根
6842
7174
  if (!isCrossDrag) {
6843
- return;
7175
+ return errRest;
6844
7176
  }
6845
7177
  }
6846
7178
  else if (newColumn.parentId) {
6847
7179
  // 根到子
6848
7180
  if (!isCrossDrag) {
6849
- return;
7181
+ return errRest;
6850
7182
  }
6851
7183
  if (oldAllMaps[newColumn.id]) {
6852
7184
  isSelfToChildStatus = true;
@@ -6857,7 +7189,7 @@ const Methods = {
6857
7189
  content: getI18n('vxe.error.treeDragChild')
6858
7190
  });
6859
7191
  }
6860
- return;
7192
+ return errRest;
6861
7193
  }
6862
7194
  }
6863
7195
  }
@@ -6918,26 +7250,32 @@ const Methods = {
6918
7250
  $xeTable.clearCopyCellArea();
6919
7251
  }
6920
7252
  }
6921
- $xeTable.dispatchEvent('column-dragend', {
6922
- oldColumn: dragColumn,
6923
- newColumn,
6924
- dragColumn,
6925
- dragPos: prevDragPos,
6926
- dragToChild: isDragToChildFlag,
6927
- offsetIndex: dragOffsetIndex,
6928
- _index: {
6929
- newIndex: nafIndex,
6930
- oldIndex: oafIndex
6931
- }
6932
- }, evnt);
7253
+ if (evnt) {
7254
+ $xeTable.dispatchEvent('column-dragend', {
7255
+ oldColumn: dragColumn,
7256
+ newColumn,
7257
+ dragColumn,
7258
+ dragPos: prevDragPos,
7259
+ dragToChild: isDragToChildFlag,
7260
+ offsetIndex: dragOffsetIndex,
7261
+ _index: {
7262
+ newIndex: nafIndex,
7263
+ oldIndex: oafIndex
7264
+ }
7265
+ }, evnt);
7266
+ }
6933
7267
  if (isSyncColumn) {
6934
7268
  $xeTable.handleColDragSwapColumn();
6935
7269
  }
7270
+ return {
7271
+ status: true
7272
+ };
6936
7273
  }).catch(() => {
7274
+ return errRest;
6937
7275
  });
6938
7276
  }
6939
7277
  }
6940
- return Promise.resolve();
7278
+ return Promise.resolve(errRest);
6941
7279
  },
6942
7280
  handleHeaderCellDragDragendEvent(evnt) {
6943
7281
  const $xeTable = this;
@@ -7063,48 +7401,52 @@ const Methods = {
7063
7401
  setPendingRow(rows, status) {
7064
7402
  const $xeTable = this;
7065
7403
  const reactData = $xeTable;
7066
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7404
+ const internalData = $xeTable;
7405
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7406
+ const { pendingRowMaps } = internalData;
7067
7407
  if (rows && !XEUtils.isArray(rows)) {
7068
7408
  rows = [rows];
7069
7409
  }
7070
7410
  if (status) {
7071
7411
  rows.forEach((row) => {
7072
- const rowid = getRowid($xeTable, row);
7073
- if (rowid && !pendingMaps[rowid]) {
7074
- pendingMaps[rowid] = row;
7412
+ const rowid = handleGetRowId(row);
7413
+ if (rowid && !pendingRowMaps[rowid]) {
7414
+ pendingRowMaps[rowid] = row;
7075
7415
  }
7076
7416
  });
7077
7417
  }
7078
7418
  else {
7079
7419
  rows.forEach((row) => {
7080
- const rowid = getRowid($xeTable, row);
7081
- if (rowid && pendingMaps[rowid]) {
7082
- delete pendingMaps[rowid];
7420
+ const rowid = handleGetRowId(row);
7421
+ if (rowid && pendingRowMaps[rowid]) {
7422
+ delete pendingRowMaps[rowid];
7083
7423
  }
7084
7424
  });
7085
7425
  }
7086
- reactData.pendingRowMaps = pendingMaps;
7426
+ reactData.pendingRowFlag++;
7087
7427
  return $xeTable.$nextTick();
7088
7428
  },
7089
7429
  togglePendingRow(rows) {
7090
7430
  const $xeTable = this;
7091
7431
  const reactData = $xeTable;
7092
- const pendingMaps = Object.assign({}, reactData.pendingRowMaps);
7432
+ const internalData = $xeTable;
7433
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7434
+ const { pendingRowMaps } = internalData;
7093
7435
  if (rows && !XEUtils.isArray(rows)) {
7094
7436
  rows = [rows];
7095
7437
  }
7096
7438
  rows.forEach((row) => {
7097
- const rowid = getRowid($xeTable, row);
7439
+ const rowid = handleGetRowId(row);
7098
7440
  if (rowid) {
7099
- if (pendingMaps[rowid]) {
7100
- delete pendingMaps[rowid];
7441
+ if (pendingRowMaps[rowid]) {
7442
+ delete pendingRowMaps[rowid];
7101
7443
  }
7102
7444
  else {
7103
- pendingMaps[rowid] = row;
7445
+ pendingRowMaps[rowid] = row;
7104
7446
  }
7105
7447
  }
7106
7448
  });
7107
- reactData.pendingRowMaps = pendingMaps;
7449
+ reactData.pendingRowFlag++;
7108
7450
  return $xeTable.$nextTick();
7109
7451
  },
7110
7452
  hasPendingByRow(row) {
@@ -7120,10 +7462,8 @@ const Methods = {
7120
7462
  },
7121
7463
  getPendingRecords() {
7122
7464
  const $xeTable = this;
7123
- const reactData = $xeTable;
7124
7465
  const internalData = $xeTable;
7125
- const { pendingRowMaps } = reactData;
7126
- const { fullAllDataRowIdData } = internalData;
7466
+ const { fullAllDataRowIdData, pendingRowMaps } = internalData;
7127
7467
  const insertRecords = [];
7128
7468
  XEUtils.each(pendingRowMaps, (row, rowid) => {
7129
7469
  if (fullAllDataRowIdData[rowid]) {
@@ -7133,8 +7473,12 @@ const Methods = {
7133
7473
  return insertRecords;
7134
7474
  },
7135
7475
  clearPendingRow() {
7136
- this.pendingRowMaps = {};
7137
- return this.$nextTick();
7476
+ const $xeTable = this;
7477
+ const reactData = $xeTable;
7478
+ const internalData = $xeTable;
7479
+ internalData.pendingRowMaps = {};
7480
+ reactData.pendingRowFlag++;
7481
+ return $xeTable.$nextTick();
7138
7482
  },
7139
7483
  sort(sortConfs, sortOrder) {
7140
7484
  const $xeTable = this;
@@ -7285,7 +7629,9 @@ const Methods = {
7285
7629
  * @param {Event} evnt 事件
7286
7630
  */
7287
7631
  closeFilter() {
7288
- const { filterStore } = this;
7632
+ const $xeTable = this;
7633
+ const reactData = $xeTable;
7634
+ const { filterStore } = reactData;
7289
7635
  const { column, visible } = filterStore;
7290
7636
  Object.assign(filterStore, {
7291
7637
  isAllSelected: false,
@@ -7294,9 +7640,15 @@ const Methods = {
7294
7640
  visible: false
7295
7641
  });
7296
7642
  if (visible) {
7297
- this.emitEvent('filter-visible', { column, field: column.field, property: column.field, filterList: this.getCheckedFilters(), visible: false }, null);
7643
+ $xeTable.dispatchEvent('filter-visible', {
7644
+ column,
7645
+ field: column.field,
7646
+ property: column.field,
7647
+ filterList: () => $xeTable.getCheckedFilters(),
7648
+ visible: false
7649
+ }, null);
7298
7650
  }
7299
- return this.$nextTick();
7651
+ return $xeTable.$nextTick();
7300
7652
  },
7301
7653
  /**
7302
7654
  * 判断指定列是否为筛选状态,如果为空则判断所有列
@@ -7327,17 +7679,16 @@ const Methods = {
7327
7679
  const $xeTable = this;
7328
7680
  const reactData = $xeTable;
7329
7681
  const internalData = $xeTable;
7330
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7331
- const { fullAllDataRowIdData } = internalData;
7682
+ const { fullAllDataRowIdData, rowExpandLazyLoadedMaps } = internalData;
7332
7683
  const expandOpts = $xeTable.computeExpandOpts;
7333
7684
  const { lazy } = expandOpts;
7334
7685
  const rowid = getRowid($xeTable, row);
7335
7686
  const rowRest = fullAllDataRowIdData[rowid];
7336
7687
  if (lazy && rowRest) {
7337
7688
  rowRest.expandLoaded = false;
7338
- delete rExpandLazyLoadedMaps[rowid];
7689
+ delete rowExpandLazyLoadedMaps[rowid];
7339
7690
  }
7340
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7691
+ reactData.rowExpandedFlag++;
7341
7692
  return $xeTable.$nextTick();
7342
7693
  },
7343
7694
  /**
@@ -7345,14 +7696,17 @@ const Methods = {
7345
7696
  * @param {Row} row 行对象
7346
7697
  */
7347
7698
  reloadRowExpand(row) {
7348
- const { expandOpts, rowExpandLazyLoadedMaps } = this;
7699
+ const $xeTable = this;
7700
+ const internalData = $xeTable;
7701
+ const { rowExpandLazyLoadedMaps } = internalData;
7702
+ const expandOpts = $xeTable.computeExpandOpts;
7349
7703
  const { lazy } = expandOpts;
7350
7704
  const rowid = getRowid(this, row);
7351
7705
  if (lazy && !rowExpandLazyLoadedMaps[rowid]) {
7352
- this.clearRowExpandLoaded(row)
7353
- .then(() => this.handleAsyncRowExpand(row));
7706
+ $xeTable.clearRowExpandLoaded(row)
7707
+ .then(() => handleAsyncRowExpand($xeTable, row));
7354
7708
  }
7355
- return this.$nextTick();
7709
+ return $xeTable.$nextTick();
7356
7710
  },
7357
7711
  reloadExpandContent(row) {
7358
7712
  if (process.env.NODE_ENV === 'development') {
@@ -7365,20 +7719,33 @@ const Methods = {
7365
7719
  * 展开行事件
7366
7720
  */
7367
7721
  triggerRowExpandEvent(evnt, params) {
7368
- const { expandOpts, rowExpandLazyLoadedMaps, expandColumn: column } = this;
7722
+ const $xeTable = this;
7723
+ const reactData = $xeTable;
7724
+ const internalData = $xeTable;
7725
+ const { expandColumn: column } = reactData;
7726
+ const { rowExpandLazyLoadedMaps } = internalData;
7727
+ const expandOpts = $xeTable.computeExpandOpts;
7369
7728
  const { row } = params;
7370
7729
  const { lazy, trigger } = expandOpts;
7371
7730
  if (trigger === 'manual') {
7372
7731
  return;
7373
7732
  }
7374
7733
  evnt.stopPropagation();
7375
- const rowid = getRowid(this, row);
7734
+ const rowid = getRowid($xeTable, row);
7376
7735
  if (!lazy || !rowExpandLazyLoadedMaps[rowid]) {
7377
- const expanded = !this.isRowExpandByRow(row);
7378
- const columnIndex = this.getColumnIndex(column);
7379
- const $columnIndex = this.getVMColumnIndex(column);
7380
- this.setRowExpand(row, expanded);
7381
- this.emitEvent('toggle-row-expand', { expanded, column, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) }, evnt);
7736
+ const expanded = !$xeTable.isRowExpandByRow(row);
7737
+ const columnIndex = $xeTable.getColumnIndex(column);
7738
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
7739
+ $xeTable.setRowExpand(row, expanded);
7740
+ $xeTable.dispatchEvent('toggle-row-expand', {
7741
+ expanded,
7742
+ column,
7743
+ columnIndex,
7744
+ $columnIndex,
7745
+ row,
7746
+ rowIndex: $xeTable.getRowIndex(row),
7747
+ $rowIndex: $xeTable.getVMRowIndex(row)
7748
+ }, evnt);
7382
7749
  }
7383
7750
  },
7384
7751
  /**
@@ -7424,48 +7791,6 @@ const Methods = {
7424
7791
  }
7425
7792
  return this.setRowExpand(expandedRows, expanded);
7426
7793
  },
7427
- handleAsyncRowExpand(row) {
7428
- const $xeTable = this;
7429
- const reactData = $xeTable;
7430
- const internalData = $xeTable;
7431
- return new Promise(resolve => {
7432
- const { expandOpts } = this;
7433
- const { loadMethod } = expandOpts;
7434
- if (loadMethod) {
7435
- const { fullAllDataRowIdData } = internalData;
7436
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7437
- const rowid = getRowid($xeTable, row);
7438
- const rowRest = fullAllDataRowIdData[rowid];
7439
- rExpandLazyLoadedMaps[rowid] = row;
7440
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7441
- loadMethod({ $table: $xeTable, row, rowIndex: $xeTable.getRowIndex(row), $rowIndex: $xeTable.getVMRowIndex(row) }).then(() => {
7442
- const rExpandedMaps = Object.assign({}, reactData.rowExpandedMaps);
7443
- if (rowRest) {
7444
- rowRest.expandLoaded = true;
7445
- }
7446
- rExpandedMaps[rowid] = row;
7447
- reactData.rowExpandedMaps = rExpandedMaps;
7448
- }).catch(() => {
7449
- if (rowRest) {
7450
- rowRest.expandLoaded = false;
7451
- }
7452
- }).finally(() => {
7453
- const rExpandLazyLoadedMaps = Object.assign({}, reactData.rowExpandLazyLoadedMaps);
7454
- if (rExpandLazyLoadedMaps[rowid]) {
7455
- delete rExpandLazyLoadedMaps[rowid];
7456
- }
7457
- reactData.rowExpandLazyLoadedMaps = rExpandLazyLoadedMaps;
7458
- $xeTable.$nextTick()
7459
- .then(() => $xeTable.recalculate())
7460
- .then(() => $xeTable.updateCellAreas())
7461
- .then(() => resolve());
7462
- });
7463
- }
7464
- else {
7465
- resolve();
7466
- }
7467
- });
7468
- },
7469
7794
  /**
7470
7795
  * 设置展开行,二个参数设置这一行展开与否
7471
7796
  * 支持单行
@@ -7475,8 +7800,12 @@ const Methods = {
7475
7800
  */
7476
7801
  setRowExpand(rows, expanded) {
7477
7802
  const $xeTable = this;
7478
- const { rowExpandedMaps, fullAllDataRowIdData, rowExpandLazyLoadedMaps, expandOpts, expandColumn } = this;
7479
- let rExpandedMaps = Object.assign({}, rowExpandedMaps);
7803
+ const reactData = $xeTable;
7804
+ const internalData = $xeTable;
7805
+ const { expandColumn } = reactData;
7806
+ let { fullAllDataRowIdData, rowExpandedMaps, rowExpandLazyLoadedMaps } = internalData;
7807
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
7808
+ const expandOpts = $xeTable.computeExpandOpts;
7480
7809
  const { reserve, lazy, accordion, toggleMethod } = expandOpts;
7481
7810
  const lazyRests = [];
7482
7811
  const columnIndex = $xeTable.getColumnIndex(expandColumn);
@@ -7487,30 +7816,31 @@ const Methods = {
7487
7816
  }
7488
7817
  if (accordion) {
7489
7818
  // 只能同时展开一个
7490
- rExpandedMaps = {};
7819
+ rowExpandedMaps = {};
7820
+ internalData.rowExpandedMaps = rowExpandedMaps;
7491
7821
  rows = rows.slice(rows.length - 1, rows.length);
7492
7822
  }
7493
- const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7823
+ const validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: expandColumn, columnIndex, $columnIndex, row, rowIndex: this.getRowIndex(row), $rowIndex: this.getVMRowIndex(row) })) : rows;
7494
7824
  if (expanded) {
7495
7825
  validRows.forEach((row) => {
7496
- const rowid = getRowid(this, row);
7497
- if (!rExpandedMaps[rowid]) {
7826
+ const rowid = handleGetRowId(row);
7827
+ if (!rowExpandedMaps[rowid]) {
7498
7828
  const rowRest = fullAllDataRowIdData[rowid];
7499
7829
  const isLoad = lazy && !rowRest.expandLoaded && !rowExpandLazyLoadedMaps[rowid];
7500
7830
  if (isLoad) {
7501
- lazyRests.push(this.handleAsyncRowExpand(row));
7831
+ lazyRests.push(handleAsyncRowExpand($xeTable, row));
7502
7832
  }
7503
7833
  else {
7504
- rExpandedMaps[rowid] = row;
7834
+ rowExpandedMaps[rowid] = row;
7505
7835
  }
7506
7836
  }
7507
7837
  });
7508
7838
  }
7509
7839
  else {
7510
7840
  validRows.forEach((item) => {
7511
- const rowid = getRowid(this, item);
7512
- if (rExpandedMaps[rowid]) {
7513
- delete rExpandedMaps[rowid];
7841
+ const rowid = handleGetRowId(item);
7842
+ if (rowExpandedMaps[rowid]) {
7843
+ delete rowExpandedMaps[rowid];
7514
7844
  }
7515
7845
  });
7516
7846
  }
@@ -7518,7 +7848,7 @@ const Methods = {
7518
7848
  validRows.forEach((row) => handleRowExpandReserve($xeTable, row, expanded));
7519
7849
  }
7520
7850
  }
7521
- this.rowExpandedMaps = rExpandedMaps;
7851
+ reactData.rowExpandedFlag++;
7522
7852
  return Promise.all(lazyRests)
7523
7853
  .then(() => $xeTable.$nextTick())
7524
7854
  .then(() => $xeTable.recalculate(true))
@@ -7534,9 +7864,13 @@ const Methods = {
7534
7864
  * @param {Row} row 行对象
7535
7865
  */
7536
7866
  isRowExpandByRow(row) {
7537
- const { rowExpandedMaps } = this;
7867
+ const $xeTable = this;
7868
+ const reactData = $xeTable;
7869
+ const internalData = $xeTable;
7870
+ const { rowExpandedFlag } = reactData;
7871
+ const { rowExpandedMaps } = internalData;
7538
7872
  const rowid = getRowid(this, row);
7539
- return !!rowExpandedMaps[rowid];
7873
+ return !!rowExpandedFlag && !!rowExpandedMaps[rowid];
7540
7874
  },
7541
7875
  isExpandByRow(row) {
7542
7876
  if (process.env.NODE_ENV === 'development') {
@@ -7556,7 +7890,8 @@ const Methods = {
7556
7890
  const expandOpts = $xeTable.computeExpandOpts;
7557
7891
  const { reserve } = expandOpts;
7558
7892
  const expList = $xeTable.getRowExpandRecords();
7559
- reactData.rowExpandedMaps = {};
7893
+ internalData.rowExpandedMaps = {};
7894
+ reactData.rowExpandedFlag++;
7560
7895
  if (reserve) {
7561
7896
  tableFullData.forEach((row) => handleRowExpandReserve($xeTable, row, false));
7562
7897
  }
@@ -7576,8 +7911,10 @@ const Methods = {
7576
7911
  return this.$nextTick();
7577
7912
  },
7578
7913
  getRowExpandRecords() {
7914
+ const $xeTable = this;
7915
+ const internalData = $xeTable;
7579
7916
  const rest = [];
7580
- XEUtils.each(this.rowExpandedMaps, item => {
7917
+ XEUtils.each(internalData.rowExpandedMaps, item => {
7581
7918
  if (item) {
7582
7919
  rest.push(item);
7583
7920
  }
@@ -7585,8 +7922,10 @@ const Methods = {
7585
7922
  return rest;
7586
7923
  },
7587
7924
  getTreeExpandRecords() {
7925
+ const $xeTable = this;
7926
+ const internalData = $xeTable;
7588
7927
  const rest = [];
7589
- XEUtils.each(this.treeExpandedMaps, item => {
7928
+ XEUtils.each(internalData.treeExpandedMaps, item => {
7590
7929
  if (item) {
7591
7930
  rest.push(item);
7592
7931
  }
@@ -7619,12 +7958,10 @@ const Methods = {
7619
7958
  const $xeTable = this;
7620
7959
  const reactData = $xeTable;
7621
7960
  const internalData = $xeTable;
7622
- const { fullAllDataRowIdData } = internalData;
7961
+ const { fullAllDataRowIdData, treeExpandedMaps } = internalData;
7623
7962
  const treeOpts = $xeTable.computeTreeOpts;
7624
7963
  const { transform } = treeOpts;
7625
- let tExpandedMaps = {};
7626
7964
  if (rows) {
7627
- tExpandedMaps = Object.assign({}, reactData.treeExpandedMaps);
7628
7965
  if (!XEUtils.isArray(rows)) {
7629
7966
  rows = [rows];
7630
7967
  }
@@ -7633,8 +7970,8 @@ const Methods = {
7633
7970
  const rowRest = fullAllDataRowIdData[rowid];
7634
7971
  if (rowRest) {
7635
7972
  rowRest.treeLoaded = false;
7636
- if (tExpandedMaps[rowid]) {
7637
- delete tExpandedMaps[rowid];
7973
+ if (treeExpandedMaps[rowid]) {
7974
+ delete treeExpandedMaps[rowid];
7638
7975
  }
7639
7976
  }
7640
7977
  });
@@ -7644,7 +7981,8 @@ const Methods = {
7644
7981
  rowRest.treeLoaded = false;
7645
7982
  });
7646
7983
  }
7647
- reactData.treeExpandedMaps = {};
7984
+ internalData.treeExpandedMaps = {};
7985
+ reactData.treeExpandedFlag++;
7648
7986
  if (transform) {
7649
7987
  handleVirtualTreeToList($xeTable);
7650
7988
  return $xeTable.handleTableData();
@@ -7657,36 +7995,42 @@ const Methods = {
7657
7995
  */
7658
7996
  reloadTreeExpand(row) {
7659
7997
  const $xeTable = this;
7660
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
7998
+ const internalData = $xeTable;
7999
+ const { treeExpandLazyLoadedMaps } = internalData;
8000
+ const treeOpts = $xeTable.computeTreeOpts;
7661
8001
  const { transform, lazy } = treeOpts;
7662
8002
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7663
- const rowid = getRowid(this, row);
8003
+ const rowid = getRowid($xeTable, row);
7664
8004
  if (lazy && row[hasChildField] && !treeExpandLazyLoadedMaps[rowid]) {
7665
- return this.clearTreeExpandLoaded(row).then(() => {
7666
- return this.handleAsyncTreeExpandChilds(row);
8005
+ return $xeTable.clearTreeExpandLoaded(row).then(() => {
8006
+ return handleAsyncTreeExpandChilds($xeTable, row);
7667
8007
  }).then(() => {
7668
8008
  if (transform) {
7669
8009
  handleVirtualTreeToList($xeTable);
7670
- return this.handleTableData();
8010
+ return $xeTable.handleTableData();
7671
8011
  }
7672
8012
  }).then(() => {
7673
- return this.recalculate();
8013
+ return $xeTable.recalculate();
7674
8014
  });
7675
8015
  }
7676
- return this.$nextTick();
8016
+ return $xeTable.$nextTick();
7677
8017
  },
7678
8018
  reloadTreeChilds(row) {
8019
+ const $xeTable = this;
7679
8020
  if (process.env.NODE_ENV === 'development') {
7680
8021
  warnLog('vxe.error.delFunc', ['reloadTreeChilds', 'reloadTreeExpand']);
7681
8022
  }
7682
8023
  // 即将废弃
7683
- return this.reloadTreeExpand(row);
8024
+ return $xeTable.reloadTreeExpand(row);
7684
8025
  },
7685
8026
  /**
7686
8027
  * 展开树节点事件
7687
8028
  */
7688
8029
  triggerTreeExpandEvent(evnt, params) {
7689
- const { treeOpts, treeExpandLazyLoadedMaps } = this;
8030
+ const $xeTable = this;
8031
+ const internalData = $xeTable;
8032
+ const { treeExpandLazyLoadedMaps } = internalData;
8033
+ const treeOpts = $xeTable.computeTreeOpts;
7690
8034
  const { row, column } = params;
7691
8035
  const { lazy, trigger } = treeOpts;
7692
8036
  if (trigger === 'manual') {
@@ -7695,11 +8039,11 @@ const Methods = {
7695
8039
  evnt.stopPropagation();
7696
8040
  const rowid = getRowid(this, row);
7697
8041
  if (!lazy || !treeExpandLazyLoadedMaps[rowid]) {
7698
- const expanded = !this.isTreeExpandByRow(row);
7699
- const columnIndex = this.getColumnIndex(column);
7700
- const $columnIndex = this.getVMColumnIndex(column);
7701
- this.setTreeExpand(row, expanded);
7702
- this.emitEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
8042
+ const expanded = !$xeTable.isTreeExpandByRow(row);
8043
+ const columnIndex = $xeTable.getColumnIndex(column);
8044
+ const $columnIndex = $xeTable.getVMColumnIndex(column);
8045
+ $xeTable.setTreeExpand(row, expanded);
8046
+ $xeTable.dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
7703
8047
  }
7704
8048
  },
7705
8049
  /**
@@ -7708,87 +8052,6 @@ const Methods = {
7708
8052
  toggleTreeExpand(row) {
7709
8053
  return this.setTreeExpand(row, !this.isTreeExpandByRow(row));
7710
8054
  },
7711
- /**
7712
- * 处理默认展开树节点
7713
- */
7714
- handleDefaultTreeExpand() {
7715
- const { treeConfig, treeOpts, tableFullData } = this;
7716
- if (treeConfig) {
7717
- const { expandAll, expandRowKeys } = treeOpts;
7718
- const childrenField = treeOpts.children || treeOpts.childrenField;
7719
- if (expandAll) {
7720
- this.setAllTreeExpand(true);
7721
- }
7722
- else if (expandRowKeys) {
7723
- const defExpandeds = [];
7724
- const rowkey = getRowkey(this);
7725
- expandRowKeys.forEach((rowid) => {
7726
- const matchObj = XEUtils.findTree(tableFullData, item => rowid === XEUtils.get(item, rowkey), { children: childrenField });
7727
- if (matchObj) {
7728
- defExpandeds.push(matchObj.item);
7729
- }
7730
- });
7731
- this.setTreeExpand(defExpandeds, true);
7732
- }
7733
- }
7734
- },
7735
- handleAsyncTreeExpandChilds(row) {
7736
- const $xeTable = this;
7737
- const { treeOpts, checkboxOpts } = this;
7738
- const { transform, loadMethod } = treeOpts;
7739
- const { checkStrictly } = checkboxOpts;
7740
- return new Promise(resolve => {
7741
- if (loadMethod) {
7742
- const { treeExpandLazyLoadedMaps, fullAllDataRowIdData } = this;
7743
- const rowid = getRowid($xeTable, row);
7744
- const rowRest = fullAllDataRowIdData[rowid];
7745
- treeExpandLazyLoadedMaps[rowid] = row;
7746
- Promise.resolve(loadMethod({ $table: $xeTable, row })).then((childRecords) => {
7747
- if (rowRest) {
7748
- rowRest.treeLoaded = true;
7749
- }
7750
- if (treeExpandLazyLoadedMaps[rowid]) {
7751
- delete treeExpandLazyLoadedMaps[rowid];
7752
- }
7753
- if (!XEUtils.isArray(childRecords)) {
7754
- childRecords = [];
7755
- }
7756
- if (childRecords) {
7757
- return this.loadTreeChildren(row, childRecords).then((childRows) => {
7758
- const { treeExpandedMaps } = this;
7759
- if (childRows.length && !treeExpandedMaps[rowid]) {
7760
- treeExpandedMaps[rowid] = row;
7761
- }
7762
- // 如果当前节点已选中,则展开后子节点也被选中
7763
- if (!checkStrictly && this.isCheckedByCheckboxRow(row)) {
7764
- handleCheckedCheckboxRow($xeTable, childRows, true);
7765
- }
7766
- return this.$nextTick().then(() => {
7767
- if (transform) {
7768
- this.handleTableData();
7769
- updateAfterDataIndex($xeTable);
7770
- return this.$nextTick();
7771
- }
7772
- });
7773
- });
7774
- }
7775
- }).catch(() => {
7776
- const { treeExpandLazyLoadedMaps } = this;
7777
- if (rowRest) {
7778
- rowRest.treeLoaded = false;
7779
- }
7780
- if (treeExpandLazyLoadedMaps[rowid]) {
7781
- delete treeExpandLazyLoadedMaps[rowid];
7782
- }
7783
- }).finally(() => {
7784
- this.$nextTick().then(() => this.recalculate()).then(() => resolve());
7785
- });
7786
- }
7787
- else {
7788
- resolve();
7789
- }
7790
- });
7791
- },
7792
8055
  /**
7793
8056
  * 设置所有树节点的展开与否
7794
8057
  * @param {Boolean} expanded 是否展开
@@ -7813,42 +8076,47 @@ const Methods = {
7813
8076
  * @returns
7814
8077
  */
7815
8078
  handleBaseTreeExpand(rows, expanded) {
7816
- const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeOpts, treeExpandLazyLoadedMaps, treeNodeColumn } = this;
8079
+ const $xeTable = this;
8080
+ const reactData = $xeTable;
8081
+ const internalData = $xeTable;
8082
+ const { treeNodeColumn } = reactData;
8083
+ const { fullAllDataRowIdData, tableFullData, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
8084
+ const treeOpts = $xeTable.computeTreeOpts;
7817
8085
  const { reserve, lazy, accordion, toggleMethod } = treeOpts;
7818
- const treeTempExpandedMaps = Object.assign({}, treeExpandedMaps);
7819
8086
  const childrenField = treeOpts.children || treeOpts.childrenField;
7820
8087
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
7821
8088
  const result = [];
7822
- const columnIndex = this.getColumnIndex(treeNodeColumn);
7823
- const $columnIndex = this.getVMColumnIndex(treeNodeColumn);
7824
- let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
8089
+ const columnIndex = $xeTable.getColumnIndex(treeNodeColumn);
8090
+ const $columnIndex = $xeTable.getVMColumnIndex(treeNodeColumn);
8091
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
8092
+ let validRows = toggleMethod ? rows.filter((row) => toggleMethod({ $table: $xeTable, expanded, column: treeNodeColumn, columnIndex, $columnIndex, row })) : rows;
7825
8093
  if (accordion) {
7826
8094
  validRows = validRows.length ? [validRows[validRows.length - 1]] : [];
7827
8095
  // 同一级只能展开一个
7828
8096
  const matchObj = XEUtils.findTree(tableFullData, item => item === validRows[0], { children: childrenField });
7829
8097
  if (matchObj) {
7830
8098
  matchObj.items.forEach(item => {
7831
- const rowid = getRowid(this, item);
7832
- if (treeTempExpandedMaps[rowid]) {
7833
- delete treeTempExpandedMaps[rowid];
8099
+ const rowid = handleGetRowId(item);
8100
+ if (treeExpandedMaps[rowid]) {
8101
+ delete treeExpandedMaps[rowid];
7834
8102
  }
7835
8103
  });
7836
8104
  }
7837
8105
  }
7838
8106
  if (expanded) {
7839
8107
  validRows.forEach((row) => {
7840
- const rowid = getRowid(this, row);
7841
- if (!treeTempExpandedMaps[rowid]) {
8108
+ const rowid = handleGetRowId(row);
8109
+ if (!treeExpandedMaps[rowid]) {
7842
8110
  const rowRest = fullAllDataRowIdData[rowid];
7843
8111
  if (rowRest) {
7844
8112
  const isLoad = lazy && row[hasChildField] && !rowRest.treeLoaded && !treeExpandLazyLoadedMaps[rowid];
7845
8113
  // 是否使用懒加载
7846
8114
  if (isLoad) {
7847
- result.push(this.handleAsyncTreeExpandChilds(row));
8115
+ result.push(handleAsyncTreeExpandChilds($xeTable, row));
7848
8116
  }
7849
8117
  else {
7850
8118
  if (row[childrenField] && row[childrenField].length) {
7851
- treeTempExpandedMaps[rowid] = row;
8119
+ treeExpandedMaps[rowid] = row;
7852
8120
  }
7853
8121
  }
7854
8122
  }
@@ -7857,18 +8125,18 @@ const Methods = {
7857
8125
  }
7858
8126
  else {
7859
8127
  validRows.forEach((item) => {
7860
- const rowid = getRowid(this, item);
7861
- if (treeTempExpandedMaps[rowid]) {
7862
- delete treeTempExpandedMaps[rowid];
8128
+ const rowid = handleGetRowId(item);
8129
+ if (treeExpandedMaps[rowid]) {
8130
+ delete treeExpandedMaps[rowid];
7863
8131
  }
7864
8132
  });
7865
8133
  }
7866
8134
  if (reserve) {
7867
- validRows.forEach((row) => this.handleTreeExpandReserve(row, expanded));
8135
+ validRows.forEach((row) => handleTreeExpandReserve($xeTable, row, expanded));
7868
8136
  }
7869
- this.treeExpandedMaps = treeTempExpandedMaps;
8137
+ reactData.treeExpandedFlag++;
7870
8138
  return Promise.all(result).then(() => {
7871
- return this.recalculate();
8139
+ return $xeTable.recalculate();
7872
8140
  });
7873
8141
  },
7874
8142
  /**
@@ -7922,30 +8190,38 @@ const Methods = {
7922
8190
  * @param {Row} row 行对象
7923
8191
  */
7924
8192
  isTreeExpandByRow(row) {
7925
- const { treeExpandedMaps } = this;
7926
- return !!treeExpandedMaps[getRowid(this, row)];
8193
+ const $xeTable = this;
8194
+ const reactData = $xeTable;
8195
+ const internalData = $xeTable;
8196
+ const { treeExpandedFlag } = reactData;
8197
+ const { treeExpandedMaps } = internalData;
8198
+ return !!treeExpandedFlag && !!treeExpandedMaps[getRowid($xeTable, row)];
7927
8199
  },
7928
8200
  /**
7929
8201
  * 手动清空树形节点的展开状态,数据会恢复成未展开的状态
7930
8202
  */
7931
8203
  clearTreeExpand() {
7932
8204
  const $xeTable = this;
7933
- const { treeOpts, tableFullData } = this;
7934
- const { transform, reserve } = treeOpts;
8205
+ const reactData = $xeTable;
8206
+ const internalData = $xeTable;
8207
+ const { tableFullTreeData } = internalData;
8208
+ const treeOpts = $xeTable.computeTreeOpts;
7935
8209
  const childrenField = treeOpts.children || treeOpts.childrenField;
7936
- const expList = this.getTreeExpandRecords();
7937
- this.treeExpandedMaps = {};
8210
+ const { transform, reserve } = treeOpts;
8211
+ const expList = $xeTable.getTreeExpandRecords();
8212
+ internalData.treeExpandedMaps = {};
8213
+ reactData.treeExpandedFlag++;
7938
8214
  if (reserve) {
7939
- XEUtils.eachTree(tableFullData, row => this.handleTreeExpandReserve(row, false), { children: childrenField });
8215
+ XEUtils.eachTree(tableFullTreeData, row => handleTreeExpandReserve($xeTable, row, false), { children: childrenField });
7940
8216
  }
7941
- return this.handleTableData().then(() => {
8217
+ return $xeTable.handleTableData().then(() => {
7942
8218
  if (transform) {
7943
8219
  handleVirtualTreeToList($xeTable);
7944
- return this.handleTableData();
8220
+ return $xeTable.handleTableData();
7945
8221
  }
7946
8222
  }).then(() => {
7947
8223
  if (expList.length) {
7948
- this.recalculate();
8224
+ $xeTable.recalculate();
7949
8225
  }
7950
8226
  });
7951
8227
  },
@@ -7953,18 +8229,6 @@ const Methods = {
7953
8229
  this.treeExpandedReserveRowMap = {};
7954
8230
  return this.$nextTick();
7955
8231
  },
7956
- handleTreeExpandReserve(row, expanded) {
7957
- const { treeExpandedReserveRowMap, treeOpts } = this;
7958
- if (treeOpts.reserve) {
7959
- const rowid = getRowid(this, row);
7960
- if (expanded) {
7961
- treeExpandedReserveRowMap[rowid] = row;
7962
- }
7963
- else if (treeExpandedReserveRowMap[rowid]) {
7964
- delete treeExpandedReserveRowMap[rowid];
7965
- }
7966
- }
7967
- },
7968
8232
  /**
7969
8233
  * 获取表格的滚动状态
7970
8234
  */
@@ -8282,10 +8546,10 @@ const Methods = {
8282
8546
  return;
8283
8547
  }
8284
8548
  const { highlightHoverRow } = tableProps;
8285
- const { scrollXLoad, scrollYLoad } = reactData;
8549
+ const { scrollXLoad, scrollYLoad, expandColumn } = reactData;
8286
8550
  const leftFixedWidth = $xeTable.computeLeftFixedWidth;
8287
8551
  const rightFixedWidth = $xeTable.computeRightFixedWidth;
8288
- if (!(scrollYLoad || leftFixedWidth || rightFixedWidth)) {
8552
+ if (!(scrollYLoad || leftFixedWidth || rightFixedWidth || expandColumn)) {
8289
8553
  return;
8290
8554
  }
8291
8555
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData;
@@ -8537,8 +8801,8 @@ const Methods = {
8537
8801
  const $xeTable = this;
8538
8802
  const reactData = $xeTable;
8539
8803
  const internalData = $xeTable;
8540
- const { isAllOverflow, scrollYLoad, expandColumn, rowExpandedMaps } = reactData;
8541
- const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData } = internalData;
8804
+ const { isAllOverflow, scrollYLoad, expandColumn } = reactData;
8805
+ const { scrollYStore, elemStore, isResizeCellHeight, afterFullData, fullAllDataRowIdData, rowExpandedMaps } = internalData;
8542
8806
  const { startIndex } = scrollYStore;
8543
8807
  const expandOpts = $xeTable.computeExpandOpts;
8544
8808
  const rowOpts = $xeTable.computeRowOpts;
@@ -8865,7 +9129,7 @@ const Methods = {
8865
9129
  if (this.footerSpanMethod) {
8866
9130
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
8867
9131
  }
8868
- setMerges(this, merges, this.mergeFooterList, null);
9132
+ setMerges(this, merges, this.mergeFooterList);
8869
9133
  return this.$nextTick().then(() => {
8870
9134
  this.updateCellAreas();
8871
9135
  return updateStyle($xeTable);