vxe-table 4.1.0 → 4.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +1 -0
  2. package/README.zh-TW.md +1 -0
  3. package/es/edit/src/hook.js +2 -2
  4. package/es/export/src/hook.js +24 -0
  5. package/es/export/src/util.js +20 -8
  6. package/es/footer/src/footer.js +4 -4
  7. package/es/form/src/form.js +13 -6
  8. package/es/form/src/render.js +4 -4
  9. package/es/grid/src/grid.js +48 -1
  10. package/es/header/src/header.js +7 -5
  11. package/es/select/src/select.js +5 -5
  12. package/es/table/src/body.js +18 -14
  13. package/es/table/src/cell.js +70 -54
  14. package/es/table/src/props.js +4 -1
  15. package/es/table/src/table.js +208 -97
  16. package/es/v-x-e-table/src/conf.js +2 -3
  17. package/es/validator/src/hook.js +12 -5
  18. package/helper/vetur/attributes.json +16 -8
  19. package/helper/vetur/tags.json +2 -0
  20. package/lib/edit/src/hook.js +2 -2
  21. package/lib/edit/src/hook.min.js +1 -1
  22. package/lib/export/src/hook.js +28 -0
  23. package/lib/export/src/hook.min.js +1 -1
  24. package/lib/export/src/util.js +21 -7
  25. package/lib/export/src/util.min.js +1 -1
  26. package/lib/footer/src/footer.js +4 -4
  27. package/lib/footer/src/footer.min.js +1 -1
  28. package/lib/form/src/form.js +23 -6
  29. package/lib/form/src/form.min.js +1 -1
  30. package/lib/form/src/render.js +4 -4
  31. package/lib/form/src/render.min.js +1 -1
  32. package/lib/grid/src/grid.js +56 -1
  33. package/lib/grid/src/grid.min.js +1 -1
  34. package/lib/header/src/header.js +7 -5
  35. package/lib/header/src/header.min.js +1 -1
  36. package/lib/index.umd.js +536 -220
  37. package/lib/index.umd.min.js +1 -1
  38. package/lib/select/src/select.js +5 -5
  39. package/lib/table/src/body.js +18 -14
  40. package/lib/table/src/body.min.js +1 -1
  41. package/lib/table/src/cell.js +92 -35
  42. package/lib/table/src/cell.min.js +1 -1
  43. package/lib/table/src/props.js +4 -1
  44. package/lib/table/src/props.min.js +1 -1
  45. package/lib/table/src/table.js +265 -133
  46. package/lib/table/src/table.min.js +1 -1
  47. package/lib/v-x-e-table/src/conf.js +2 -3
  48. package/lib/v-x-e-table/src/conf.min.js +1 -1
  49. package/lib/validator/src/hook.js +12 -5
  50. package/lib/validator/src/hook.min.js +1 -1
  51. package/package.json +2 -2
  52. package/packages/edit/src/hook.ts +2 -2
  53. package/packages/export/src/hook.ts +24 -0
  54. package/packages/export/src/util.ts +17 -5
  55. package/packages/footer/src/footer.ts +4 -4
  56. package/packages/form/src/form.ts +10 -6
  57. package/packages/form/src/render.ts +4 -4
  58. package/packages/grid/src/grid.ts +48 -1
  59. package/packages/header/src/header.ts +7 -5
  60. package/packages/select/src/select.ts +5 -5
  61. package/packages/table/src/body.ts +18 -14
  62. package/packages/table/src/cell.ts +77 -44
  63. package/packages/table/src/props.ts +4 -1
  64. package/packages/table/src/table.ts +211 -96
  65. package/packages/v-x-e-table/src/conf.ts +2 -3
  66. package/packages/validator/src/hook.ts +9 -5
  67. package/types/column.d.ts +5 -1
  68. package/types/form-item.d.ts +5 -1
  69. package/types/form.d.ts +5 -1
  70. package/types/modal.d.ts +4 -5
  71. package/types/table.d.ts +49 -14
  72. package/types/validator.d.ts +5 -1
@@ -301,6 +301,7 @@ var _default = (0, _vue.defineComponent)({
301
301
  treeExpandedReserveRowMap: {},
302
302
  // 完整数据、条件处理后
303
303
  tableFullData: [],
304
+ treeFullData: [],
304
305
  afterFullData: [],
305
306
  tableSynchData: [],
306
307
  tableSourceData: [],
@@ -362,7 +363,10 @@ var _default = (0, _vue.defineComponent)({
362
363
  };
363
364
  });
364
365
  var computeColumnOpts = (0, _vue.computed)(function () {
365
- return Object.assign({}, props.columnConfig);
366
+ return Object.assign({}, _conf.default.table.columnConfig, props.columnConfig);
367
+ });
368
+ var computeRowOpts = (0, _vue.computed)(function () {
369
+ return Object.assign({}, _conf.default.table.rowConfig, props.rowConfig);
366
370
  });
367
371
  var computeResizableOpts = (0, _vue.computed)(function () {
368
372
  return Object.assign({}, _conf.default.table.resizableConfig, props.resizableConfig);
@@ -559,6 +563,8 @@ var _default = (0, _vue.defineComponent)({
559
563
  computeValidOpts: computeValidOpts,
560
564
  computeSXOpts: computeSXOpts,
561
565
  computeSYOpts: computeSYOpts,
566
+ computeColumnOpts: computeColumnOpts,
567
+ computeRowOpts: computeRowOpts,
562
568
  computeResizableOpts: computeResizableOpts,
563
569
  computeSeqOpts: computeSeqOpts,
564
570
  computeRadioOpts: computeRadioOpts,
@@ -1312,7 +1318,8 @@ var _default = (0, _vue.defineComponent)({
1312
1318
  $index: -1,
1313
1319
  _index: _index,
1314
1320
  items: [],
1315
- parent: null
1321
+ parent: null,
1322
+ level: 0
1316
1323
  };
1317
1324
  }
1318
1325
  });
@@ -1624,7 +1631,7 @@ var _default = (0, _vue.defineComponent)({
1624
1631
  var tWidth = tableWidth; // 如果是使用优化模式
1625
1632
 
1626
1633
  if (fixedType) {
1627
- if (scrollXLoad || scrollYLoad || (allColumnOverflow ? isAllOverflow : allColumnOverflow)) {
1634
+ if (scrollYLoad || (allColumnOverflow ? isAllOverflow : allColumnOverflow)) {
1628
1635
  if (!mergeList.length && !spanMethod && !(keyboardConfig && keyboardOpts.isMerge)) {
1629
1636
  tableColumn = fixedColumn;
1630
1637
  } else {
@@ -1725,16 +1732,10 @@ var _default = (0, _vue.defineComponent)({
1725
1732
  var showTitle = cellOverflow === 'title';
1726
1733
  var showTooltip = cellOverflow === true || cellOverflow === 'tooltip';
1727
1734
  var hasEllipsis_1 = showTitle || showTooltip || showEllipsis;
1728
- var listElem = elemStore[name + "-" + layout + "-list"]; // 滚动的渲染不支持动态行高
1735
+ var listElem = elemStore[name + "-" + layout + "-list"]; // 纵向虚拟滚动不支持动态行高
1729
1736
 
1730
- if (layout === 'header' || layout === 'footer') {
1731
- if (scrollXLoad && !hasEllipsis_1) {
1732
- hasEllipsis_1 = true;
1733
- }
1734
- } else {
1735
- if ((scrollXLoad || scrollYLoad) && !hasEllipsis_1) {
1736
- hasEllipsis_1 = true;
1737
- }
1737
+ if (scrollYLoad && !hasEllipsis_1) {
1738
+ hasEllipsis_1 = true;
1738
1739
  }
1739
1740
 
1740
1741
  if (listElem) {
@@ -2060,7 +2061,7 @@ var _default = (0, _vue.defineComponent)({
2060
2061
  }
2061
2062
 
2062
2063
  if (childRecords) {
2063
- tableMethods.loadChildren(row, childRecords).then(function (childRows) {
2064
+ tableMethods.loadTreeChildren(row, childRecords).then(function (childRows) {
2064
2065
  if (childRows.length && $xetable.findRowIndexOf(treeExpandeds, row) === -1) {
2065
2066
  treeExpandeds.push(row);
2066
2067
  } // 如果当前节点已选中,则展开后子节点也被选中
@@ -2221,50 +2222,67 @@ var _default = (0, _vue.defineComponent)({
2221
2222
  scrollXStore = internalData.scrollXStore,
2222
2223
  lastScrollLeft = internalData.lastScrollLeft,
2223
2224
  lastScrollTop = internalData.lastScrollTop;
2224
- var sYOpts = computeSYOpts.value;
2225
2225
  var treeOpts = computeTreeOpts.value;
2226
+ var transform = treeOpts.transform;
2227
+ var treeData = [];
2228
+ var fullData = datas ? datas.slice(0) : [];
2226
2229
 
2227
- if (treeConfig && treeOpts.transform) {
2228
- if (process.env.NODE_ENV === 'development') {
2229
- if (!treeOpts.rowtKey) {
2230
- (0, _utils.errLog)('vxe.error.reqProp', ['table.tree-config.rowtKey']);
2231
- }
2230
+ if (treeConfig) {
2231
+ if (transform) {
2232
+ // 树结构自动转换
2233
+ if (process.env.NODE_ENV === 'development') {
2234
+ if (!treeOpts.rowField) {
2235
+ (0, _utils.errLog)('vxe.error.reqProp', ['tree-config.rowField']);
2236
+ }
2232
2237
 
2233
- if (!treeOpts.parentKey) {
2234
- (0, _utils.errLog)('vxe.error.reqProp', ['table.tree-config.parentKey']);
2238
+ if (!treeOpts.parentField) {
2239
+ (0, _utils.errLog)('vxe.error.reqProp', ['tree-config.parentField']);
2240
+ }
2241
+
2242
+ if (!treeOpts.children) {
2243
+ (0, _utils.errLog)('vxe.error.reqProp', ['tree-config.children']);
2244
+ }
2245
+
2246
+ fullData.forEach(function (row) {
2247
+ if (row[treeOpts.children] && row[treeOpts.children].length) {
2248
+ (0, _utils.warnLog)('vxe.error.errConflicts', ['tree-config.transform', "row." + treeOpts.children]);
2249
+ }
2250
+ });
2235
2251
  }
2236
- }
2237
2252
 
2238
- datas = _xeUtils.default.toArrayTree(datas, {
2239
- key: treeOpts.rowtKey,
2240
- parentKey: treeOpts.parentKey,
2241
- children: treeOpts.children
2242
- });
2253
+ treeData = _xeUtils.default.toArrayTree(fullData, {
2254
+ key: treeOpts.rowField,
2255
+ parentKey: treeOpts.parentField,
2256
+ children: treeOpts.children
2257
+ });
2258
+ fullData = treeData.slice(0);
2259
+ } else {
2260
+ treeData = fullData.slice(0);
2261
+ }
2243
2262
  }
2244
2263
 
2245
- var tableFullData = datas ? datas.slice(0) : [];
2246
- var scrollYLoad = !treeConfig && !!sYOpts.enabled && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length;
2247
2264
  scrollYStore.startIndex = 0;
2248
2265
  scrollYStore.endIndex = 1;
2249
2266
  scrollXStore.startIndex = 0;
2250
2267
  scrollXStore.endIndex = 1;
2251
2268
  editStore.insertList = [];
2252
- editStore.removeList = []; // 全量数据
2269
+ editStore.removeList = [];
2270
+ var sYLoad = updateScrollYStatus(fullData);
2271
+ reactData.scrollYLoad = sYLoad; // 全量数据
2253
2272
 
2254
- internalData.tableFullData = tableFullData; // 缓存数据
2273
+ internalData.tableFullData = fullData;
2274
+ internalData.treeFullData = treeData; // 缓存数据
2255
2275
 
2256
- tablePrivateMethods.updateCache(true); // 原始数据
2276
+ tablePrivateMethods.cacheRowMap(true); // 原始数据
2257
2277
 
2258
- internalData.tableSynchData = datas;
2278
+ internalData.tableSynchData = datas; // 克隆原数据,用于显示编辑状态,与编辑值做对比
2259
2279
 
2260
2280
  if (keepSource) {
2261
- internalData.tableSourceData = _xeUtils.default.clone(tableFullData, true);
2281
+ internalData.tableSourceData = _xeUtils.default.clone(fullData, true);
2262
2282
  }
2263
2283
 
2264
- reactData.scrollYLoad = scrollYLoad;
2265
-
2266
2284
  if (process.env.NODE_ENV === 'development') {
2267
- if (scrollYLoad) {
2285
+ if (sYLoad) {
2268
2286
  if (!(props.height || props.maxHeight)) {
2269
2287
  (0, _utils.errLog)('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']);
2270
2288
  }
@@ -2294,8 +2312,8 @@ var _default = (0, _vue.defineComponent)({
2294
2312
  }).then(function () {
2295
2313
  computeScrollLoad();
2296
2314
  }).then(function () {
2297
- // 是否加载了数据
2298
- if (scrollYLoad) {
2315
+ // 是否启用了虚拟滚动
2316
+ if (sYLoad) {
2299
2317
  scrollYStore.endIndex = scrollYStore.visibleSize;
2300
2318
  }
2301
2319
 
@@ -2306,7 +2324,7 @@ var _default = (0, _vue.defineComponent)({
2306
2324
  return tableMethods.recalculate();
2307
2325
  }).then(function () {
2308
2326
  // 是否变更虚拟滚动
2309
- if (oldScrollYLoad === scrollYLoad) {
2327
+ if (oldScrollYLoad === sYLoad) {
2310
2328
  (0, _util.restoreScrollLocation)($xetable, lastScrollLeft, lastScrollTop).then(resolve);
2311
2329
  } else {
2312
2330
  setTimeout(function () {
@@ -2575,6 +2593,136 @@ var _default = (0, _vue.defineComponent)({
2575
2593
  return tableMethods.recalculate();
2576
2594
  });
2577
2595
  };
2596
+
2597
+ var updateScrollYStatus = function updateScrollYStatus(fullData) {
2598
+ var treeConfig = props.treeConfig;
2599
+ var sYOpts = computeSYOpts.value;
2600
+ var treeOpts = computeTreeOpts.value;
2601
+ var transform = treeOpts.transform;
2602
+ var scrollYLoad = (transform || !treeConfig) && !!sYOpts.enabled && sYOpts.gt > -1 && sYOpts.gt < fullData.length;
2603
+ reactData.scrollYLoad = scrollYLoad;
2604
+ return scrollYLoad;
2605
+ };
2606
+
2607
+ var updateVirtualTreeData = function updateVirtualTreeData() {
2608
+ var oldScrollYLoad = reactData.scrollYLoad,
2609
+ treeExpandeds = reactData.treeExpandeds;
2610
+ var treeFullData = internalData.treeFullData;
2611
+ var treeOpts = computeTreeOpts.value;
2612
+ var fullData = [];
2613
+
2614
+ _xeUtils.default.eachTree(treeFullData, function (row, index, items, path, parent) {
2615
+ if (!parent || $xetable.findRowIndexOf(treeExpandeds, parent) > -1) {
2616
+ fullData.push(row);
2617
+ }
2618
+ }, treeOpts);
2619
+
2620
+ var scrollYLoad = updateScrollYStatus(fullData);
2621
+ internalData.tableFullData = scrollYLoad ? fullData : treeFullData;
2622
+
2623
+ if (scrollYLoad || oldScrollYLoad !== scrollYLoad) {
2624
+ return tablePrivateMethods.handleTableData(true).then(function () {
2625
+ return tableMethods.recalculate();
2626
+ });
2627
+ }
2628
+
2629
+ return (0, _vue.nextTick)();
2630
+ };
2631
+ /**
2632
+ * 展开与收起树节点
2633
+ * @param rows
2634
+ * @param expanded
2635
+ * @returns
2636
+ */
2637
+
2638
+
2639
+ var handleBaseTreeExpand = function handleBaseTreeExpand(rows, expanded) {
2640
+ var treeExpandeds = reactData.treeExpandeds,
2641
+ treeLazyLoadeds = reactData.treeLazyLoadeds,
2642
+ treeNodeColumn = reactData.treeNodeColumn;
2643
+ var fullAllDataRowIdData = internalData.fullAllDataRowIdData,
2644
+ tableFullData = internalData.tableFullData;
2645
+ var treeOpts = computeTreeOpts.value;
2646
+ var reserve = treeOpts.reserve,
2647
+ lazy = treeOpts.lazy,
2648
+ hasChild = treeOpts.hasChild,
2649
+ children = treeOpts.children,
2650
+ accordion = treeOpts.accordion,
2651
+ toggleMethod = treeOpts.toggleMethod;
2652
+ var result = [];
2653
+ var columnIndex = tableMethods.getColumnIndex(treeNodeColumn);
2654
+ var $columnIndex = tableMethods.getVMColumnIndex(treeNodeColumn);
2655
+ var validRows = toggleMethod ? rows.filter(function (row) {
2656
+ return toggleMethod({
2657
+ $table: $xetable,
2658
+ expanded: expanded,
2659
+ column: treeNodeColumn,
2660
+ columnIndex: columnIndex,
2661
+ $columnIndex: $columnIndex,
2662
+ row: row
2663
+ });
2664
+ }) : rows;
2665
+
2666
+ if (accordion) {
2667
+ validRows = validRows.length ? [validRows[validRows.length - 1]] : []; // 同一级只能展开一个
2668
+
2669
+ var matchObj_1 = _xeUtils.default.findTree(tableFullData, function (item) {
2670
+ return item === validRows[0];
2671
+ }, treeOpts);
2672
+
2673
+ if (matchObj_1) {
2674
+ _xeUtils.default.remove(treeExpandeds, function (item) {
2675
+ return matchObj_1.items.indexOf(item) > -1;
2676
+ });
2677
+ }
2678
+ }
2679
+
2680
+ if (expanded) {
2681
+ validRows.forEach(function (row) {
2682
+ if ($xetable.findRowIndexOf(treeExpandeds, row) === -1) {
2683
+ var rest = fullAllDataRowIdData[(0, _util.getRowid)($xetable, row)];
2684
+ var isLoad = lazy && row[hasChild] && !rest.treeLoaded && $xetable.findRowIndexOf(treeLazyLoadeds, row) === -1; // 是否使用懒加载
2685
+
2686
+ if (isLoad) {
2687
+ result.push(handleAsyncTreeExpandChilds(row));
2688
+ } else {
2689
+ if (row[children] && row[children].length) {
2690
+ treeExpandeds.push(row);
2691
+ }
2692
+ }
2693
+ }
2694
+ });
2695
+ } else {
2696
+ _xeUtils.default.remove(treeExpandeds, function (row) {
2697
+ return $xetable.findRowIndexOf(validRows, row) > -1;
2698
+ });
2699
+ }
2700
+
2701
+ if (reserve) {
2702
+ validRows.forEach(function (row) {
2703
+ return handleTreeExpandReserve(row, expanded);
2704
+ });
2705
+ }
2706
+
2707
+ return Promise.all(result).then(function () {
2708
+ return tableMethods.recalculate();
2709
+ });
2710
+ };
2711
+ /**
2712
+ * 虚拟树的展开与收起
2713
+ * @param rows
2714
+ * @param expanded
2715
+ * @returns
2716
+ */
2717
+
2718
+
2719
+ var handleVirtualTreeExpand = function handleVirtualTreeExpand(rows, expanded) {
2720
+ return handleBaseTreeExpand(rows, expanded).then(function () {
2721
+ return updateVirtualTreeData();
2722
+ }).then(function () {
2723
+ return tableMethods.recalculate();
2724
+ });
2725
+ };
2578
2726
  /**
2579
2727
  * 纵向 Y 可视渲染处理
2580
2728
  */
@@ -2724,7 +2872,7 @@ var _default = (0, _vue.defineComponent)({
2724
2872
  _xeUtils.default.clear(row, undefined);
2725
2873
 
2726
2874
  Object.assign(row, tablePrivateMethods.defineField(Object.assign({}, record)));
2727
- tablePrivateMethods.updateCache(true);
2875
+ tablePrivateMethods.cacheRowMap(true);
2728
2876
  } else {
2729
2877
  _xeUtils.default.destructuring(oRow, _xeUtils.default.clone(row, true));
2730
2878
  }
@@ -2744,15 +2892,16 @@ var _default = (0, _vue.defineComponent)({
2744
2892
  /**
2745
2893
  * 用于树结构,给行数据加载子节点
2746
2894
  */
2747
- loadChildren: function loadChildren(row, childRecords) {
2895
+ loadTreeChildren: function loadTreeChildren(row, childRecords) {
2896
+ var keepSource = props.keepSource;
2897
+ var tableSourceData = internalData.tableSourceData,
2898
+ fullDataRowIdData = internalData.fullDataRowIdData,
2899
+ fullAllDataRowIdData = internalData.fullAllDataRowIdData;
2900
+ var treeOpts = computeTreeOpts.value;
2901
+ var children = treeOpts.children;
2902
+ var rest = fullAllDataRowIdData[(0, _util.getRowid)($xetable, row)];
2903
+ var parentLevel = rest ? rest.level : 0;
2748
2904
  return tableMethods.createData(childRecords).then(function (rows) {
2749
- var keepSource = props.keepSource;
2750
- var fullDataRowIdData = internalData.fullDataRowIdData,
2751
- fullAllDataRowIdData = internalData.fullAllDataRowIdData;
2752
- var tableSourceData = internalData.tableSourceData;
2753
- var treeOpts = computeTreeOpts.value;
2754
- var children = treeOpts.children;
2755
-
2756
2905
  if (keepSource) {
2757
2906
  var rowid_1 = (0, _util.getRowid)($xetable, row);
2758
2907
 
@@ -2765,7 +2914,7 @@ var _default = (0, _vue.defineComponent)({
2765
2914
  }
2766
2915
  }
2767
2916
 
2768
- _xeUtils.default.eachTree(rows, function (childRow, index, items, path, parent) {
2917
+ _xeUtils.default.eachTree(rows, function (childRow, index, items, path, parent, nodes) {
2769
2918
  var rowid = (0, _util.getRowid)($xetable, childRow);
2770
2919
  var rest = {
2771
2920
  row: childRow,
@@ -2774,7 +2923,8 @@ var _default = (0, _vue.defineComponent)({
2774
2923
  _index: -1,
2775
2924
  $index: -1,
2776
2925
  items: items,
2777
- parent: parent
2926
+ parent: parent,
2927
+ level: parentLevel + nodes.length
2778
2928
  };
2779
2929
  fullDataRowIdData[rowid] = rest;
2780
2930
  fullAllDataRowIdData[rowid] = rest;
@@ -4120,10 +4270,10 @@ var _default = (0, _vue.defineComponent)({
4120
4270
  },
4121
4271
 
4122
4272
  /**
4123
- * 重新加载展开行的内容
4273
+ * 重新懒加载展开行,并展开内容
4124
4274
  * @param {Row} row 行对象
4125
4275
  */
4126
- reloadExpandContent: function reloadExpandContent(row) {
4276
+ reloadRowExpand: function reloadRowExpand(row) {
4127
4277
  var expandLazyLoadeds = reactData.expandLazyLoadeds;
4128
4278
  var expandOpts = computeExpandOpts.value;
4129
4279
  var lazy = expandOpts.lazy;
@@ -4136,6 +4286,14 @@ var _default = (0, _vue.defineComponent)({
4136
4286
 
4137
4287
  return (0, _vue.nextTick)();
4138
4288
  },
4289
+ reloadExpandContent: function reloadExpandContent(row) {
4290
+ if (process.env.NODE_ENV === 'development') {
4291
+ (0, _utils.warnLog)('vxe.error.delFunc', ['reloadExpandContent', 'reloadRowExpand']);
4292
+ } // 即将废弃
4293
+
4294
+
4295
+ return tableMethods.reloadRowExpand(row);
4296
+ },
4139
4297
 
4140
4298
  /**
4141
4299
  * 切换展开行
@@ -4301,23 +4459,38 @@ var _default = (0, _vue.defineComponent)({
4301
4459
  },
4302
4460
 
4303
4461
  /**
4304
- * 重新加载树的子节点
4462
+ * 重新懒加载树节点,并展开该节点
4305
4463
  * @param {Row} row 行对象
4306
4464
  */
4307
- reloadTreeChilds: function reloadTreeChilds(row) {
4465
+ reloadTreeExpand: function reloadTreeExpand(row) {
4308
4466
  var treeLazyLoadeds = reactData.treeLazyLoadeds;
4309
4467
  var treeOpts = computeTreeOpts.value;
4310
- var lazy = treeOpts.lazy,
4468
+ var transform = treeOpts.transform,
4469
+ lazy = treeOpts.lazy,
4311
4470
  hasChild = treeOpts.hasChild;
4312
4471
 
4313
4472
  if (lazy && row[hasChild] && $xetable.findRowIndexOf(treeLazyLoadeds, row) === -1) {
4314
4473
  tableMethods.clearTreeExpandLoaded(row).then(function () {
4315
4474
  return handleAsyncTreeExpandChilds(row);
4475
+ }).then(function () {
4476
+ if (transform) {
4477
+ return updateVirtualTreeData();
4478
+ }
4479
+ }).then(function () {
4480
+ return tableMethods.recalculate();
4316
4481
  });
4317
4482
  }
4318
4483
 
4319
4484
  return (0, _vue.nextTick)();
4320
4485
  },
4486
+ reloadTreeChilds: function reloadTreeChilds(row) {
4487
+ if (process.env.NODE_ENV === 'development') {
4488
+ (0, _utils.warnLog)('vxe.error.delFunc', ['reloadTreeChilds', 'reloadTreeExpand']);
4489
+ } // 即将废弃
4490
+
4491
+
4492
+ return tableMethods.reloadTreeExpand(row);
4493
+ },
4321
4494
 
4322
4495
  /**
4323
4496
  * 切换/展开树节点
@@ -4356,21 +4529,8 @@ var _default = (0, _vue.defineComponent)({
4356
4529
  * @param {Boolean} expanded 是否展开
4357
4530
  */
4358
4531
  setTreeExpand: function setTreeExpand(rows, expanded) {
4359
- var treeExpandeds = reactData.treeExpandeds,
4360
- treeLazyLoadeds = reactData.treeLazyLoadeds,
4361
- treeNodeColumn = reactData.treeNodeColumn;
4362
- var fullAllDataRowIdData = internalData.fullAllDataRowIdData,
4363
- tableFullData = internalData.tableFullData;
4364
4532
  var treeOpts = computeTreeOpts.value;
4365
- var reserve = treeOpts.reserve,
4366
- lazy = treeOpts.lazy,
4367
- hasChild = treeOpts.hasChild,
4368
- children = treeOpts.children,
4369
- accordion = treeOpts.accordion,
4370
- toggleMethod = treeOpts.toggleMethod;
4371
- var result = [];
4372
- var columnIndex = tableMethods.getColumnIndex(treeNodeColumn);
4373
- var $columnIndex = tableMethods.getVMColumnIndex(treeNodeColumn);
4533
+ var transform = treeOpts.transform;
4374
4534
 
4375
4535
  if (rows) {
4376
4536
  if (!_xeUtils.default.isArray(rows)) {
@@ -4378,61 +4538,12 @@ var _default = (0, _vue.defineComponent)({
4378
4538
  }
4379
4539
 
4380
4540
  if (rows.length) {
4381
- var validRows_2 = toggleMethod ? rows.filter(function (row) {
4382
- return toggleMethod({
4383
- $table: $xetable,
4384
- expanded: expanded,
4385
- column: treeNodeColumn,
4386
- columnIndex: columnIndex,
4387
- $columnIndex: $columnIndex,
4388
- row: row
4389
- });
4390
- }) : rows;
4391
-
4392
- if (accordion) {
4393
- validRows_2 = validRows_2.length ? [validRows_2[validRows_2.length - 1]] : []; // 同一级只能展开一个
4394
-
4395
- var matchObj_1 = _xeUtils.default.findTree(tableFullData, function (item) {
4396
- return item === validRows_2[0];
4397
- }, treeOpts);
4398
-
4399
- if (matchObj_1) {
4400
- _xeUtils.default.remove(treeExpandeds, function (item) {
4401
- return matchObj_1.items.indexOf(item) > -1;
4402
- });
4403
- }
4404
- }
4405
-
4406
- if (expanded) {
4407
- validRows_2.forEach(function (row) {
4408
- if ($xetable.findRowIndexOf(treeExpandeds, row) === -1) {
4409
- var rest = fullAllDataRowIdData[(0, _util.getRowid)($xetable, row)];
4410
- var isLoad = lazy && row[hasChild] && !rest.treeLoaded && $xetable.findRowIndexOf(treeLazyLoadeds, row) === -1; // 是否使用懒加载
4411
-
4412
- if (isLoad) {
4413
- result.push(handleAsyncTreeExpandChilds(row));
4414
- } else {
4415
- if (row[children] && row[children].length) {
4416
- treeExpandeds.push(row);
4417
- }
4418
- }
4419
- }
4420
- });
4541
+ // 如果为虚拟树
4542
+ if (transform) {
4543
+ return handleVirtualTreeExpand(rows, expanded);
4421
4544
  } else {
4422
- _xeUtils.default.remove(treeExpandeds, function (row) {
4423
- return $xetable.findRowIndexOf(validRows_2, row) > -1;
4424
- });
4545
+ return handleBaseTreeExpand(rows, expanded);
4425
4546
  }
4426
-
4427
- if (reserve) {
4428
- validRows_2.forEach(function (row) {
4429
- return handleTreeExpandReserve(row, expanded);
4430
- });
4431
- }
4432
-
4433
- return Promise.all(result).then(function () {
4434
- return tableMethods.recalculate();
4435
- });
4436
4547
  }
4437
4548
  }
4438
4549
 
@@ -4453,19 +4564,19 @@ var _default = (0, _vue.defineComponent)({
4453
4564
  */
4454
4565
  clearTreeExpand: function clearTreeExpand() {
4455
4566
  var treeExpandeds = reactData.treeExpandeds;
4456
- var tableFullData = internalData.tableFullData;
4567
+ var treeFullData = internalData.treeFullData;
4457
4568
  var treeOpts = computeTreeOpts.value;
4458
4569
  var reserve = treeOpts.reserve;
4459
4570
  var isExists = treeExpandeds.length;
4460
4571
  reactData.treeExpandeds = [];
4461
4572
 
4462
4573
  if (reserve) {
4463
- _xeUtils.default.eachTree(tableFullData, function (row) {
4574
+ _xeUtils.default.eachTree(treeFullData, function (row) {
4464
4575
  return handleTreeExpandReserve(row, false);
4465
4576
  }, treeOpts);
4466
4577
  }
4467
4578
 
4468
- return (0, _vue.nextTick)().then(function () {
4579
+ return updateVirtualTreeData().then(function () {
4469
4580
  if (isExists) {
4470
4581
  tableMethods.recalculate();
4471
4582
  }
@@ -5452,16 +5563,17 @@ var _default = (0, _vue.defineComponent)({
5452
5563
  * 更新数据行的 Map
5453
5564
  * 牺牲数据组装的耗时,用来换取使用过程中的流畅
5454
5565
  */
5455
- updateCache: function updateCache(isSource) {
5566
+ cacheRowMap: function cacheRowMap(isSource) {
5456
5567
  var treeConfig = props.treeConfig;
5457
5568
  var treeOpts = computeTreeOpts.value;
5458
5569
  var fullDataRowIdData = internalData.fullDataRowIdData,
5459
5570
  fullAllDataRowIdData = internalData.fullAllDataRowIdData,
5460
- tableFullData = internalData.tableFullData;
5571
+ tableFullData = internalData.tableFullData,
5572
+ treeFullData = internalData.treeFullData;
5461
5573
  var rowkey = (0, _util.getRowkey)($xetable);
5462
5574
  var isLazy = treeConfig && treeOpts.lazy;
5463
5575
 
5464
- var handleCache = function handleCache(row, index, items, path, parent) {
5576
+ var handleCache = function handleCache(row, index, items, path, parent, nodes) {
5465
5577
  var rowid = (0, _util.getRowid)($xetable, row);
5466
5578
 
5467
5579
  if ((0, _utils.eqEmptyValue)(rowid)) {
@@ -5481,7 +5593,8 @@ var _default = (0, _vue.defineComponent)({
5481
5593
  _index: -1,
5482
5594
  $index: -1,
5483
5595
  items: items,
5484
- parent: parent
5596
+ parent: parent,
5597
+ level: nodes ? nodes.length - 1 : 0
5485
5598
  };
5486
5599
 
5487
5600
  if (isSource) {
@@ -5498,7 +5611,7 @@ var _default = (0, _vue.defineComponent)({
5498
5611
  fullAllDataRowIdData = internalData.fullAllDataRowIdData = {};
5499
5612
 
5500
5613
  if (treeConfig) {
5501
- _xeUtils.default.eachTree(tableFullData, handleCache, treeOpts);
5614
+ _xeUtils.default.eachTree(treeFullData, handleCache, treeOpts);
5502
5615
  } else {
5503
5616
  tableFullData.forEach(handleCache);
5504
5617
  }
@@ -5900,10 +6013,10 @@ var _default = (0, _vue.defineComponent)({
5900
6013
  var column = params.column;
5901
6014
  var titleHelp = column.titleHelp;
5902
6015
 
5903
- if (titleHelp.message) {
6016
+ if (titleHelp.content || titleHelp.message) {
5904
6017
  var tooltipStore = internalData.tooltipStore;
5905
6018
  var $tooltip = refTooltip.value;
5906
- var content = (0, _utils.getFuncText)(titleHelp.message);
6019
+ var content = (0, _utils.getFuncText)(titleHelp.content || titleHelp.message);
5907
6020
  handleTargetEnterEvent();
5908
6021
  tooltipStore.visible = true;
5909
6022
 
@@ -6648,6 +6761,20 @@ var _default = (0, _vue.defineComponent)({
6648
6761
  return false;
6649
6762
  }
6650
6763
  };
6764
+
6765
+ if (process.env.NODE_ENV === 'development') {
6766
+ 'openExport,openPrint,exportData,openImport,importData,saveFile,readFile,importByFile,print'.split(',').forEach(function (name) {
6767
+ $xetable[name] = function () {
6768
+ (0, _utils.errLog)('vxe.error.reqModule', ['Export']);
6769
+ };
6770
+ });
6771
+ 'clearValidate,fullValidate,validate'.split(',').forEach(function (name) {
6772
+ $xetable[name] = function () {
6773
+ (0, _utils.errLog)('vxe.error.reqModule', ['Validator']);
6774
+ };
6775
+ });
6776
+ }
6777
+
6651
6778
  Object.assign($xetable, tableMethods, tablePrivateMethods);
6652
6779
  /**
6653
6780
  * 渲染浮固定列
@@ -6911,6 +7038,7 @@ var _default = (0, _vue.defineComponent)({
6911
7038
  if (process.env.NODE_ENV === 'development') {
6912
7039
  var customOpts = computeCustomOpts.value;
6913
7040
  var mouseOpts = computeMouseOpts.value;
7041
+ var rowOpts = computeRowOpts.value;
6914
7042
 
6915
7043
  if (!props.id && props.customConfig && (customOpts.storage === true || customOpts.storage && customOpts.storage.resizable || customOpts.storage && customOpts.storage.visible)) {
6916
7044
  (0, _utils.errLog)('vxe.error.reqProp', ['id']);
@@ -6920,6 +7048,10 @@ var _default = (0, _vue.defineComponent)({
6920
7048
  (0, _utils.errLog)('vxe.error.noTree', ['checkbox-config.range']);
6921
7049
  }
6922
7050
 
7051
+ if (rowOpts.height && !props.showOverflow) {
7052
+ (0, _utils.warnLog)('vxe.error.notProp', ['table.show-overflow']);
7053
+ }
7054
+
6923
7055
  if (!$xetable.handleUpdateCellAreas) {
6924
7056
  if (props.clipConfig) {
6925
7057
  (0, _utils.warnLog)('vxe.error.notProp', ['clip-config']);