vxe-table 3.21.1 → 3.21.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 (186) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/ar-EG.js +6 -2
  4. package/es/locale/lang/de-DE.js +6 -2
  5. package/es/locale/lang/en-US.js +6 -2
  6. package/es/locale/lang/es-ES.js +6 -2
  7. package/es/locale/lang/fr-FR.js +6 -2
  8. package/es/locale/lang/hu-HU.js +6 -2
  9. package/es/locale/lang/hy-AM.js +6 -2
  10. package/es/locale/lang/id-ID.js +6 -2
  11. package/es/locale/lang/it-IT.js +6 -2
  12. package/es/locale/lang/ja-JP.js +6 -2
  13. package/es/locale/lang/ko-KR.js +6 -2
  14. package/es/locale/lang/ms-MY.js +6 -2
  15. package/es/locale/lang/nb-NO.js +6 -2
  16. package/es/locale/lang/pt-BR.js +6 -2
  17. package/es/locale/lang/ru-RU.js +6 -2
  18. package/es/locale/lang/th-TH.js +6 -2
  19. package/es/locale/lang/ug-CN.js +6 -2
  20. package/es/locale/lang/uk-UA.js +6 -2
  21. package/es/locale/lang/uz-UZ.js +6 -2
  22. package/es/locale/lang/vi-VN.js +6 -2
  23. package/es/locale/lang/zh-CHT.js +6 -2
  24. package/es/locale/lang/zh-CN.js +6 -2
  25. package/es/style.css +1 -1
  26. package/es/style.min.css +1 -1
  27. package/es/table/module/custom/panel.js +29 -22
  28. package/es/table/module/export/export-panel.js +29 -16
  29. package/es/table/module/export/mixin.js +121 -26
  30. package/es/table/module/menu/mixin.js +3 -2
  31. package/es/table/module/validator/mixin.js +4 -4
  32. package/es/table/src/cell.js +1 -1
  33. package/es/table/src/column.js +2 -0
  34. package/es/table/src/columnInfo.js +1 -0
  35. package/es/table/src/methods.js +82 -31
  36. package/es/table/src/table.js +16 -0
  37. package/es/table/src/util.js +3 -1
  38. package/es/table/style.css +1 -1
  39. package/es/table/style.min.css +1 -1
  40. package/es/ui/index.js +1 -1
  41. package/es/ui/src/log.js +1 -1
  42. package/es/vxe-table/style.css +1 -1
  43. package/es/vxe-table/style.min.css +1 -1
  44. package/lib/index.css +1 -1
  45. package/lib/index.min.css +1 -1
  46. package/lib/index.umd.js +235 -75
  47. package/lib/index.umd.min.js +1 -1
  48. package/lib/locale/lang/ar-EG.js +6 -2
  49. package/lib/locale/lang/ar-EG.min.js +1 -1
  50. package/lib/locale/lang/ar-EG.umd.js +6 -2
  51. package/lib/locale/lang/de-DE.js +6 -2
  52. package/lib/locale/lang/de-DE.min.js +1 -1
  53. package/lib/locale/lang/de-DE.umd.js +6 -2
  54. package/lib/locale/lang/en-US.js +6 -2
  55. package/lib/locale/lang/en-US.min.js +1 -1
  56. package/lib/locale/lang/en-US.umd.js +6 -2
  57. package/lib/locale/lang/es-ES.js +6 -2
  58. package/lib/locale/lang/es-ES.min.js +1 -1
  59. package/lib/locale/lang/es-ES.umd.js +6 -2
  60. package/lib/locale/lang/fr-FR.js +6 -2
  61. package/lib/locale/lang/fr-FR.min.js +1 -1
  62. package/lib/locale/lang/fr-FR.umd.js +6 -2
  63. package/lib/locale/lang/hu-HU.js +6 -2
  64. package/lib/locale/lang/hu-HU.min.js +1 -1
  65. package/lib/locale/lang/hu-HU.umd.js +6 -2
  66. package/lib/locale/lang/hy-AM.js +6 -2
  67. package/lib/locale/lang/hy-AM.min.js +1 -1
  68. package/lib/locale/lang/hy-AM.umd.js +6 -2
  69. package/lib/locale/lang/id-ID.js +6 -2
  70. package/lib/locale/lang/id-ID.min.js +1 -1
  71. package/lib/locale/lang/id-ID.umd.js +6 -2
  72. package/lib/locale/lang/it-IT.js +6 -2
  73. package/lib/locale/lang/it-IT.min.js +1 -1
  74. package/lib/locale/lang/it-IT.umd.js +6 -2
  75. package/lib/locale/lang/ja-JP.js +6 -2
  76. package/lib/locale/lang/ja-JP.min.js +1 -1
  77. package/lib/locale/lang/ja-JP.umd.js +6 -2
  78. package/lib/locale/lang/ko-KR.js +6 -2
  79. package/lib/locale/lang/ko-KR.min.js +1 -1
  80. package/lib/locale/lang/ko-KR.umd.js +6 -2
  81. package/lib/locale/lang/ms-MY.js +6 -2
  82. package/lib/locale/lang/ms-MY.min.js +1 -1
  83. package/lib/locale/lang/ms-MY.umd.js +6 -2
  84. package/lib/locale/lang/nb-NO.js +6 -2
  85. package/lib/locale/lang/nb-NO.min.js +1 -1
  86. package/lib/locale/lang/nb-NO.umd.js +6 -2
  87. package/lib/locale/lang/pt-BR.js +6 -2
  88. package/lib/locale/lang/pt-BR.min.js +1 -1
  89. package/lib/locale/lang/pt-BR.umd.js +6 -2
  90. package/lib/locale/lang/ru-RU.js +6 -2
  91. package/lib/locale/lang/ru-RU.min.js +1 -1
  92. package/lib/locale/lang/ru-RU.umd.js +6 -2
  93. package/lib/locale/lang/th-TH.js +6 -2
  94. package/lib/locale/lang/th-TH.min.js +1 -1
  95. package/lib/locale/lang/th-TH.umd.js +6 -2
  96. package/lib/locale/lang/ug-CN.js +6 -2
  97. package/lib/locale/lang/ug-CN.min.js +1 -1
  98. package/lib/locale/lang/ug-CN.umd.js +6 -2
  99. package/lib/locale/lang/uk-UA.js +6 -2
  100. package/lib/locale/lang/uk-UA.min.js +1 -1
  101. package/lib/locale/lang/uk-UA.umd.js +6 -2
  102. package/lib/locale/lang/uz-UZ.js +6 -2
  103. package/lib/locale/lang/uz-UZ.min.js +1 -1
  104. package/lib/locale/lang/uz-UZ.umd.js +6 -2
  105. package/lib/locale/lang/vi-VN.js +6 -2
  106. package/lib/locale/lang/vi-VN.min.js +1 -1
  107. package/lib/locale/lang/vi-VN.umd.js +6 -2
  108. package/lib/locale/lang/zh-CHT.js +6 -2
  109. package/lib/locale/lang/zh-CHT.min.js +1 -1
  110. package/lib/locale/lang/zh-CHT.umd.js +6 -2
  111. package/lib/locale/lang/zh-CN.js +6 -2
  112. package/lib/locale/lang/zh-CN.min.js +1 -1
  113. package/lib/locale/lang/zh-CN.umd.js +6 -2
  114. package/lib/style.css +1 -1
  115. package/lib/style.min.css +1 -1
  116. package/lib/table/module/custom/panel.js +30 -21
  117. package/lib/table/module/custom/panel.min.js +1 -1
  118. package/lib/table/module/export/export-panel.js +26 -13
  119. package/lib/table/module/export/export-panel.min.js +1 -1
  120. package/lib/table/module/export/mixin.js +139 -27
  121. package/lib/table/module/export/mixin.min.js +1 -1
  122. package/lib/table/module/menu/mixin.js +3 -2
  123. package/lib/table/module/menu/mixin.min.js +1 -1
  124. package/lib/table/module/validator/mixin.js +4 -4
  125. package/lib/table/module/validator/mixin.min.js +1 -1
  126. package/lib/table/src/cell.js +1 -1
  127. package/lib/table/src/cell.min.js +1 -1
  128. package/lib/table/src/column.js +2 -0
  129. package/lib/table/src/column.min.js +1 -1
  130. package/lib/table/src/columnInfo.js +1 -0
  131. package/lib/table/src/columnInfo.min.js +1 -1
  132. package/lib/table/src/methods.js +2 -2
  133. package/lib/table/src/methods.min.js +1 -1
  134. package/lib/table/src/table.js +16 -0
  135. package/lib/table/src/table.min.js +1 -1
  136. package/lib/table/src/util.js +3 -1
  137. package/lib/table/src/util.min.js +1 -1
  138. package/lib/table/style/style.css +1 -1
  139. package/lib/table/style/style.min.css +1 -1
  140. package/lib/ui/index.js +1 -1
  141. package/lib/ui/index.min.js +1 -1
  142. package/lib/ui/src/log.js +1 -1
  143. package/lib/ui/src/log.min.js +1 -1
  144. package/lib/vxe-table/style/style.css +1 -1
  145. package/lib/vxe-table/style/style.min.css +1 -1
  146. package/package.json +2 -2
  147. package/packages/locale/lang/ar-EG.ts +6 -2
  148. package/packages/locale/lang/de-DE.ts +6 -2
  149. package/packages/locale/lang/en-US.ts +6 -2
  150. package/packages/locale/lang/es-ES.ts +6 -2
  151. package/packages/locale/lang/fr-FR.ts +6 -2
  152. package/packages/locale/lang/hu-HU.ts +6 -2
  153. package/packages/locale/lang/hy-AM.ts +6 -2
  154. package/packages/locale/lang/id-ID.ts +6 -2
  155. package/packages/locale/lang/it-IT.ts +6 -2
  156. package/packages/locale/lang/ja-JP.ts +6 -2
  157. package/packages/locale/lang/ko-KR.ts +6 -2
  158. package/packages/locale/lang/ms-MY.ts +6 -2
  159. package/packages/locale/lang/nb-NO.ts +6 -2
  160. package/packages/locale/lang/pt-BR.ts +6 -2
  161. package/packages/locale/lang/ru-RU.ts +6 -2
  162. package/packages/locale/lang/th-TH.ts +6 -2
  163. package/packages/locale/lang/ug-CN.ts +6 -2
  164. package/packages/locale/lang/uk-UA.ts +6 -2
  165. package/packages/locale/lang/uz-UZ.ts +6 -2
  166. package/packages/locale/lang/vi-VN.ts +6 -2
  167. package/packages/locale/lang/zh-CHT.ts +6 -2
  168. package/packages/locale/lang/zh-CN.ts +6 -2
  169. package/packages/table/module/custom/panel.ts +30 -23
  170. package/packages/table/module/export/export-panel.ts +29 -17
  171. package/packages/table/module/export/mixin.ts +122 -27
  172. package/packages/table/module/menu/mixin.ts +3 -2
  173. package/packages/table/module/validator/mixin.ts +4 -4
  174. package/packages/table/src/cell.ts +1 -1
  175. package/packages/table/src/column.ts +2 -0
  176. package/packages/table/src/columnInfo.ts +1 -0
  177. package/packages/table/src/methods.ts +82 -31
  178. package/packages/table/src/table.ts +18 -0
  179. package/packages/table/src/util.ts +3 -1
  180. package/styles/components/table-module/export.scss +1 -1
  181. /package/es/{iconfont.1779447236462.ttf → iconfont.1779843521280.ttf} +0 -0
  182. /package/es/{iconfont.1779447236462.woff → iconfont.1779843521280.woff} +0 -0
  183. /package/es/{iconfont.1779447236462.woff2 → iconfont.1779843521280.woff2} +0 -0
  184. /package/lib/{iconfont.1779447236462.ttf → iconfont.1779843521280.ttf} +0 -0
  185. /package/lib/{iconfont.1779447236462.woff → iconfont.1779843521280.woff} +0 -0
  186. /package/lib/{iconfont.1779447236462.woff2 → iconfont.1779843521280.woff2} +0 -0
@@ -393,7 +393,7 @@ export default {
393
393
  const { immediate } = customOpts;
394
394
  const trEl = evnt.currentTarget;
395
395
  const columnDragOpts = $xeTable.computeColumnDragOpts;
396
- const { isCrossDrag, isSelfToChildDrag, isToChildDrag, dragEndMethod } = columnDragOpts;
396
+ const { isCrossDrag, isPeerDrag, isSelfToChildDrag, isToChildDrag, dragEndMethod } = columnDragOpts;
397
397
  const { dragCol } = customPanelReactData;
398
398
  const { prevDragCol, prevDragGroupField, prevDragAggFnColid, prevDragPos, prevDragToChild } = customPanelInternalData;
399
399
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
@@ -431,20 +431,28 @@ export default {
431
431
  if (immediate) {
432
432
  if (dragColumn.parentId && newColumn.parentId) {
433
433
  // 子到子
434
- if (!isCrossDrag) {
435
- return;
434
+ if (isPeerDrag && !isCrossDrag) {
435
+ if (dragColumn.parentId !== newColumn.parentId) {
436
+ // 非同级
437
+ return;
438
+ }
436
439
  }
437
- if (oldAllMaps[newColumn.id]) {
438
- isSelfToChildStatus = true;
439
- if (!(isCrossDrag && isSelfToChildDrag)) {
440
- if (VxeUI.modal) {
441
- VxeUI.modal.message({
442
- status: 'error',
443
- content: getI18n('vxe.error.treeDragChild')
444
- });
445
- }
440
+ else {
441
+ if (!isCrossDrag) {
446
442
  return;
447
443
  }
444
+ if (oldAllMaps[newColumn.id]) {
445
+ isSelfToChildStatus = true;
446
+ if (!(isCrossDrag && isSelfToChildDrag)) {
447
+ if (VxeUI.modal) {
448
+ VxeUI.modal.message({
449
+ status: 'error',
450
+ content: getI18n('vxe.error.treeDragChild')
451
+ });
452
+ }
453
+ return;
454
+ }
455
+ }
448
456
  }
449
457
  }
450
458
  else if (dragColumn.parentId) {
@@ -576,7 +584,7 @@ export default {
576
584
  const customOpts = $xeTable.computeCustomOpts;
577
585
  const { showSortDragButton, allowSort, immediate } = customOpts;
578
586
  const columnDragOpts = $xeTable.computeColumnDragOpts;
579
- const { isCrossDrag, isToChildDrag } = columnDragOpts;
587
+ const { isCrossDrag, isPeerDrag, isToChildDrag } = columnDragOpts;
580
588
  const optEl = evnt.currentTarget;
581
589
  const isControlKey = hasControlKey(evnt);
582
590
  const colid = optEl.getAttribute('colid');
@@ -584,16 +592,16 @@ export default {
584
592
  customPanelInternalData.prevDragGroupField = null;
585
593
  customPanelInternalData.prevDragAggFnColid = null;
586
594
  // 是否移入有效列
587
- if (column && (isCrossDrag || column.level === 1)) {
595
+ if (column && (isCrossDrag || isPeerDrag || column.level === 1)) {
588
596
  evnt.preventDefault();
589
597
  const offsetY = evnt.clientY - optEl.getBoundingClientRect().y;
590
598
  const dragPos = offsetY < optEl.clientHeight / 2 ? 'top' : 'bottom';
591
599
  if (!dragCol ||
592
600
  !(showSortDragButton && allowSort) ||
593
601
  (dragCol && dragCol.id === column.id) ||
594
- (!isCrossDrag && column.level > 1) ||
602
+ (!isCrossDrag && (isPeerDrag ? dragCol.parentId !== column.parentId : column.level > 1)) ||
595
603
  (!immediate && column.level > 1) ||
596
- (!isCrossDrag && dragCol.level > 1) ||
604
+ (!isCrossDrag && (isPeerDrag ? dragCol.parentId !== column.parentId : dragCol.level > 1)) ||
597
605
  (!immediate && dragCol.level > 1)) {
598
606
  showDropTip($xeTableCustomPanel, evnt, optEl, false, dragPos);
599
607
  return;
@@ -747,13 +755,12 @@ export default {
747
755
  const { treeConfig, rowGroupConfig, aggregateConfig } = tableProps;
748
756
  const { isCustomStatus, customColumnList, isCustomDragStatus } = tableReactData;
749
757
  const customOpts = $xeTable.computeCustomOpts;
750
- const { immediate } = customOpts;
751
758
  const columnDragOpts = $xeTable.computeColumnDragOpts;
752
759
  const { popupStyle } = customStore;
753
- const { checkMethod, visibleMethod, allowVisible, allowSort, allowFixed, allowGroup, allowValues, trigger, placement, showSortDragButton, showSortMoveButton, showSortPutButton } = customOpts;
760
+ const { immediate, checkMethod, visibleMethod, allowVisible, allowSort, allowFixed, allowGroup, allowValues, trigger, placement, showSortDragButton, showSortMoveButton, showSortPutButton } = customOpts;
754
761
  const isMaxFixedColumn = $xeTable.computeIsMaxFixedColumn;
755
762
  const vSize = $xeTable.computeSize;
756
- const { isCrossDrag } = columnDragOpts;
763
+ const { isCrossDrag, isPeerDrag } = columnDragOpts;
757
764
  const slots = customOpts.slots || {};
758
765
  const headerSlot = slots.header;
759
766
  const topSlot = slots.top;
@@ -787,7 +794,7 @@ export default {
787
794
  const colTitle = formatText(column.getTitle(), 1);
788
795
  const isDisabled = checkMethod ? !checkMethod({ $table: $xeTable, column }) : false;
789
796
  const isHidden = !isChecked;
790
- const showSortBtn = ((isCrossDrag ? immediate : false) || column.level === 1);
797
+ const showSortBtn = (isCrossDrag || isPeerDrag ? immediate : false) || column.level === 1;
791
798
  colVNs.push(h('li', {
792
799
  key: column.id,
793
800
  attrs: {
@@ -1150,7 +1157,7 @@ export default {
1150
1157
  const modalOpts = Object.assign({}, modalOptions);
1151
1158
  const drawerOpts = Object.assign({}, drawerOptions);
1152
1159
  const isMaxFixedColumn = $xeTable.computeIsMaxFixedColumn;
1153
- const { isCrossDrag } = columnDragOpts;
1160
+ const { isCrossDrag, isPeerDrag } = columnDragOpts;
1154
1161
  const slots = customOpts.slots || {};
1155
1162
  const headerSlot = slots.header;
1156
1163
  const topSlot = slots.top;
@@ -1197,7 +1204,7 @@ export default {
1197
1204
  const isColGroup = column.children && column.children.length;
1198
1205
  const isDisabled = checkMethod ? !checkMethod({ $table: $xeTable, column }) : false;
1199
1206
  const isHidden = !isChecked;
1200
- const showSortBtn = ((isCrossDrag ? immediate : false) || column.level === 1);
1207
+ const showSortBtn = (isCrossDrag || isPeerDrag ? immediate : false) || column.level === 1;
1201
1208
  trVNs.push(h('tr', {
1202
1209
  key: column.id,
1203
1210
  attrs: {
@@ -210,7 +210,7 @@ export default {
210
210
  const $xeGantt = $xeTable.$xeGantt;
211
211
  const { defaultOptions, storeData } = props;
212
212
  const { isAll: isAllChecked, isIndeterminate: isAllIndeterminate } = reactData;
213
- const { hasTree, hasMerge, isPrint, hasColgroup, columns } = storeData;
213
+ const { hasTree, hasRowGroup, hasMerge, isPrint, hasColgroup, columns } = storeData;
214
214
  const { isHeader } = defaultOptions;
215
215
  const colVNs = [];
216
216
  const checkedAll = $xeExportPanel.computeCheckedAll;
@@ -459,6 +459,19 @@ export default {
459
459
  }
460
460
  }
461
461
  }),
462
+ h('vxe-checkbox', {
463
+ props: {
464
+ value: defaultOptions.isFooter,
465
+ disabled: !storeData.hasFooter,
466
+ title: getI18n('vxe.export.expFooterTitle'),
467
+ content: getI18n('vxe.export.expOptFooter')
468
+ },
469
+ on: {
470
+ input(value) {
471
+ defaultOptions.isFooter = value;
472
+ }
473
+ }
474
+ }),
462
475
  h('vxe-checkbox', {
463
476
  props: {
464
477
  value: isHeader ? defaultOptions.isTitle : false,
@@ -529,34 +542,34 @@ export default {
529
542
  defaultOptions.useStyle = value;
530
543
  }
531
544
  }
532
- }),
545
+ })
546
+ ]),
547
+ h('div', {
548
+ class: 'vxe-table-export--panel-option-row'
549
+ }, [
533
550
  h('vxe-checkbox', {
534
551
  props: {
535
- value: hasTree ? defaultOptions.isAllExpand : false,
552
+ value: hasTree ? defaultOptions.isTreeAllExpanded : false,
536
553
  disabled: hasEmptyData || !hasTree,
537
- title: getI18n('vxe.export.expAllExpandTitle'),
538
- content: getI18n('vxe.export.expOptAllExpand')
554
+ title: getI18n('vxe.export.expTreeAllExpandTitle'),
555
+ content: getI18n('vxe.export.expOptTreeAllExpand')
539
556
  },
540
557
  on: {
541
558
  input(value) {
542
- defaultOptions.isAllExpand = value;
559
+ defaultOptions.isTreeAllExpanded = value;
543
560
  }
544
561
  }
545
- })
546
- ]),
547
- h('div', {
548
- class: 'vxe-table-export--panel-option-row'
549
- }, [
562
+ }),
550
563
  h('vxe-checkbox', {
551
564
  props: {
552
- value: defaultOptions.isFooter,
553
- disabled: !storeData.hasFooter,
554
- title: getI18n('vxe.export.expFooterTitle'),
555
- content: getI18n('vxe.export.expOptFooter')
565
+ value: hasRowGroup ? defaultOptions.isRowGroupAllExpanded : false,
566
+ disabled: hasEmptyData || !hasRowGroup,
567
+ title: getI18n('vxe.export.expRowGroupAllExpandTitle'),
568
+ content: getI18n('vxe.export.expOptRowGroupAllExpand')
556
569
  },
557
570
  on: {
558
571
  input(value) {
559
- defaultOptions.isFooter = value;
572
+ defaultOptions.isRowGroupAllExpanded = value;
560
573
  }
561
574
  }
562
575
  })
@@ -9,11 +9,6 @@ const { getI18n, renderer } = VxeUI;
9
9
  let htmlCellElem;
10
10
  const csvBOM = '\ufeff';
11
11
  const enterSymbol = '\r\n';
12
- function hasTreeChildren($xeTable, row) {
13
- const treeOpts = $xeTable.computeTreeOpts;
14
- const childrenField = treeOpts.children || treeOpts.childrenField;
15
- return row[childrenField] && row[childrenField].length;
16
- }
17
12
  function getSeq($xeTable, cellValue, row, $rowIndex, column, $columnIndex) {
18
13
  const seqOpts = $xeTable.computeSeqOpts;
19
14
  const seqMd = seqOpts.seqMethod || column.seqMethod;
@@ -52,32 +47,121 @@ const toStringValue = (cellValue) => {
52
47
  };
53
48
  function getBodyLabelData($xeTable, opts, columns, datas) {
54
49
  const props = $xeTable;
55
- const { isAllExpand, mode } = opts;
50
+ const reactData = $xeTable;
51
+ const { isTreeAllExpanded, isRowGroupAllExpanded, mode } = opts;
56
52
  const { treeConfig } = props;
53
+ const { isRowGroupStatus } = reactData;
57
54
  const radioOpts = $xeTable.computeRadioOpts;
58
55
  const checkboxOpts = $xeTable.computeCheckboxOpts;
59
56
  const treeOpts = $xeTable.computeTreeOpts;
60
57
  const columnOpts = $xeTable.computeColumnOpts;
58
+ const aggregateOpts = $xeTable.computeAggregateOpts;
61
59
  if (!htmlCellElem) {
62
60
  htmlCellElem = document.createElement('div');
63
61
  }
62
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
63
+ if (isRowGroupStatus) {
64
+ // 如果是数据分组
65
+ // 如果是数据分组
66
+ const { mapChildrenField } = aggregateOpts;
67
+ const rest = [];
68
+ const expandMaps = {};
69
+ const useMaps = {};
70
+ XEUtils.eachTree(datas, (item, $rowIndex, items, path, parentItem, nodes) => {
71
+ const row = item._row || item;
72
+ const rowid = handleGetRowId(row);
73
+ if (useMaps[rowid]) {
74
+ return;
75
+ }
76
+ const parentRow = parentItem && parentItem._row ? parentItem._row : parentItem;
77
+ const pRowid = parentRow ? handleGetRowId(parentRow) : '';
78
+ if ((isRowGroupAllExpanded || !parentRow || (expandMaps[pRowid] && $xeTable.isRowExpandByRow(parentRow)))) {
79
+ const hasRowChild = mapChildrenField && row[mapChildrenField] && row[mapChildrenField].length;
80
+ const item = {
81
+ _row: row,
82
+ _level: nodes.length - 1,
83
+ _hasChild: hasRowChild,
84
+ _expand: hasRowChild && $xeTable.isRowExpandByRow(row)
85
+ };
86
+ columns.forEach((column, $columnIndex) => {
87
+ let cellValue = '';
88
+ const renderOpts = column.editRender || column.cellRender;
89
+ let bodyExportMethod = column.exportMethod || columnOpts.exportMethod;
90
+ if (!bodyExportMethod && renderOpts && renderOpts.name) {
91
+ const compConf = renderer.get(renderOpts.name);
92
+ if (compConf) {
93
+ bodyExportMethod = compConf.tableExportMethod || compConf.exportMethod;
94
+ }
95
+ }
96
+ if (!bodyExportMethod) {
97
+ bodyExportMethod = columnOpts.exportMethod;
98
+ }
99
+ if (bodyExportMethod) {
100
+ cellValue = bodyExportMethod({ $table: $xeTable, row, column, options: opts });
101
+ }
102
+ else {
103
+ switch (column.type) {
104
+ case 'seq': {
105
+ const seqVal = path.map((num, i) => i % 2 === 0 ? (Number(num) + 1) : '.').join('');
106
+ cellValue = mode === 'all' ? seqVal : getSeq($xeTable, seqVal, row, $rowIndex, column, $columnIndex);
107
+ break;
108
+ }
109
+ case 'checkbox':
110
+ cellValue = toBooleanValue($xeTable.isCheckedByCheckboxRow(row));
111
+ item._checkboxLabel = checkboxOpts.labelField ? XEUtils.get(row, checkboxOpts.labelField) : '';
112
+ item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ $table: $xeTable, row });
113
+ break;
114
+ case 'radio':
115
+ cellValue = toBooleanValue($xeTable.isCheckedByRadioRow(row));
116
+ item._radioLabel = radioOpts.labelField ? XEUtils.get(row, radioOpts.labelField) : '';
117
+ item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ $table: $xeTable, row });
118
+ break;
119
+ default:
120
+ if (opts.original) {
121
+ cellValue = getCellValue(row, column);
122
+ }
123
+ else {
124
+ cellValue = $xeTable.getCellLabel(row, column);
125
+ if (column.type === 'html') {
126
+ htmlCellElem.innerHTML = cellValue;
127
+ cellValue = htmlCellElem.innerText.trim();
128
+ }
129
+ else {
130
+ const cell = $xeTable.getCellElement(row, column);
131
+ if (cell && !hasClass(cell, 'is--progress')) {
132
+ cellValue = cell.innerText.trim();
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ item[column.id] = toStringValue(cellValue);
139
+ });
140
+ useMaps[rowid] = true;
141
+ if (pRowid) {
142
+ expandMaps[pRowid] = true;
143
+ }
144
+ rest.push(Object.assign(item, row));
145
+ }
146
+ }, { children: mapChildrenField });
147
+ return rest;
148
+ }
64
149
  if (treeConfig) {
65
150
  const childrenField = treeOpts.children || treeOpts.childrenField;
66
- // 如果是树表格只允许导出数据源
151
+ // 如果是树结构
67
152
  const rest = [];
68
153
  const expandMaps = {};
69
154
  const useMaps = {};
70
- const { handleGetRowId } = createHandleGetRowId($xeTable);
71
- XEUtils.eachTree(datas, (item, $rowIndex, items, path, parent, nodes) => {
155
+ XEUtils.eachTree(datas, (item, $rowIndex, items, path, parentItem, nodes) => {
72
156
  const row = item._row || item;
73
157
  const rowid = handleGetRowId(row);
74
158
  if (useMaps[rowid]) {
75
159
  return;
76
160
  }
77
- const parentRow = parent && parent._row ? parent._row : parent;
161
+ const parentRow = parentItem && parentItem._row ? parentItem._row : parentItem;
78
162
  const pRowid = parentRow ? handleGetRowId(parentRow) : '';
79
- if ((isAllExpand || !parentRow || (expandMaps[pRowid] && $xeTable.isTreeExpandByRow(parentRow)))) {
80
- const hasRowChild = hasTreeChildren($xeTable, row);
163
+ if ((isTreeAllExpanded || !parentRow || (expandMaps[pRowid] && $xeTable.isTreeExpandByRow(parentRow)))) {
164
+ const hasRowChild = row[childrenField] && row[childrenField].length;
81
165
  const item = {
82
166
  _row: row,
83
167
  _level: nodes.length - 1,
@@ -937,10 +1021,11 @@ function handleExportAndPrint($xeTable, options, isPrint) {
937
1021
  const $xeGantt = $xeTable.$xeGantt;
938
1022
  const $xeGGWrapper = $xeGrid || $xeGantt;
939
1023
  const { treeConfig, showHeader, showFooter } = props;
940
- const { initStore, isGroup, footerTableData, exportStore, exportParams } = reactData;
1024
+ const { initStore, isGroup, rowGroupList, footerTableData, exportStore, exportParams } = reactData;
941
1025
  const { collectColumn, mergeBodyList, mergeFooterList } = internalData;
942
1026
  const exportOpts = $xeTable.computeExportOpts;
943
- const hasTree = treeConfig;
1027
+ const hasTree = !!treeConfig;
1028
+ const hasRowGroup = rowGroupList.length > 0;
944
1029
  const customOpts = $xeTable.computeCustomOpts;
945
1030
  const selectRecords = $xeTable.getCheckboxRecords();
946
1031
  const proxyOpts = $xeGGWrapper ? $xeGGWrapper.computeProxyOpts : {};
@@ -957,6 +1042,11 @@ function handleExportAndPrint($xeTable, options, isPrint) {
957
1042
  current: 'current',
958
1043
  modes: (proxyOpts.ajax && proxyOpts.ajax.queryAll ? ['all'] : []).concat(['current', 'selected', 'empty'])
959
1044
  }, options);
1045
+ // 已废弃,参数 isAllExpand
1046
+ if (XEUtils.isBoolean(defOpts.isAllExpand)) {
1047
+ warnLog('vxe.error.delProp', ['isAllExpand', 'isTreeAllExpanded']);
1048
+ defOpts.isTreeAllExpanded = defOpts.isAllExpand;
1049
+ }
960
1050
  const types = defOpts.types || XEUtils.keys(exportOpts._typeMaps);
961
1051
  const modes = defOpts.modes || [];
962
1052
  const checkMethod = customOpts.checkMethod;
@@ -999,17 +1089,16 @@ function handleExportAndPrint($xeTable, options, isPrint) {
999
1089
  column.disabled = (parent && parent.disabled) || (checkMethod ? !checkMethod({ $table: $xeTable, column }) : false);
1000
1090
  });
1001
1091
  // 更新条件
1002
- Object.assign(exportStore, {
1003
- columns: exportColumns,
1004
- typeList,
1005
- modeList,
1006
- hasFooter,
1007
- hasMerge,
1008
- hasTree,
1009
- isPrint,
1010
- hasColgroup: isGroup,
1011
- visible: true
1012
- });
1092
+ exportStore.columns = exportColumns;
1093
+ exportStore.typeList = typeList;
1094
+ exportStore.modeList = modeList;
1095
+ exportStore.hasFooter = hasFooter;
1096
+ exportStore.hasMerge = hasMerge;
1097
+ exportStore.hasTree = hasTree;
1098
+ exportStore.hasRowGroup = hasRowGroup;
1099
+ exportStore.isPrint = !!isPrint;
1100
+ exportStore.hasColgroup = isGroup;
1101
+ exportStore.visible = true;
1013
1102
  // 默认参数
1014
1103
  Object.assign(exportParams, {
1015
1104
  mode: selectRecords.length ? 'selected' : 'current'
@@ -1142,7 +1231,8 @@ export default {
1142
1231
  // filename: '',
1143
1232
  // sheetName: '',
1144
1233
  // original: false,
1145
- // isAllExpand: false,
1234
+ // isTreeAllExpanded: false,
1235
+ // isRowGroupAllExpanded: false,
1146
1236
  // data: null,
1147
1237
  // remote: false,
1148
1238
  // dataFilterMethod: null,
@@ -1152,6 +1242,11 @@ export default {
1152
1242
  // beforeExportMethod: null,
1153
1243
  // afterExportMethod: null
1154
1244
  }, exportOpts, options);
1245
+ // 已废弃,参数 isAllExpand
1246
+ if (XEUtils.isBoolean(opts.isAllExpand)) {
1247
+ warnLog('vxe.error.delProp', ['isAllExpand', 'isTreeAllExpanded']);
1248
+ opts.isTreeAllExpanded = opts.isAllExpand;
1249
+ }
1155
1250
  let { filename, sheetName, type, mode, columns, original, columnFilterMethod, beforeExportMethod, includeFields, excludeFields } = opts;
1156
1251
  let groups = [];
1157
1252
  const selectRecords = $xeTable.getCheckboxRecords();
@@ -309,8 +309,9 @@ export default {
309
309
  if (!menu.loading && !menu.disabled && (menu.code || !menu.children || !menu.children.length)) {
310
310
  const gMenuOpts = menus.get(menu.code);
311
311
  const params = Object.assign({}, internalData._currMenuParams, { menu, $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, $event: evnt });
312
- if (gMenuOpts && gMenuOpts.menuMethod) {
313
- gMenuOpts.menuMethod(params, evnt);
312
+ const tmMethod = gMenuOpts ? (gMenuOpts.tableMenuMethod || gMenuOpts.menuMethod) : null;
313
+ if (tmMethod) {
314
+ tmMethod(params, evnt);
314
315
  }
315
316
  // 在 v4 中废弃事件 context-menu-click
316
317
  if ($xeTable.$listeners['context-menu-click']) {
@@ -378,9 +378,9 @@ export default {
378
378
  },
379
379
  hasCellRules(type, row, column) {
380
380
  const { editRules } = this;
381
- const { property } = column;
382
- if (property && editRules) {
383
- const rules = XEUtils.get(editRules, property);
381
+ const { field } = column;
382
+ if (field && editRules) {
383
+ const rules = column.rules ? column.rules : XEUtils.get(editRules, field);
384
384
  return rules && XEUtils.find(rules, rule => type === 'all' || !rule.trigger || type === rule.trigger);
385
385
  }
386
386
  return false;
@@ -408,7 +408,7 @@ export default {
408
408
  const errorRules = [];
409
409
  const syncValidList = [];
410
410
  if (field && editRules) {
411
- const rules = XEUtils.get(editRules, field);
411
+ const rules = column.rules ? column.rules : XEUtils.get(editRules, field);
412
412
  if (rules) {
413
413
  const cellValue = XEUtils.isUndefined(val) ? XEUtils.get(row, field) : val;
414
414
  rules.forEach((rule) => {
@@ -1110,7 +1110,7 @@ export const Cell = {
1110
1110
  const editRenderOpts = isEnableEdit && isEnableConf(editRender) ? editRender : null;
1111
1111
  let isRequired = false;
1112
1112
  if (editRules) {
1113
- const columnRules = XEUtils.get(editRules, column.field);
1113
+ const columnRules = column.rules ? column.rules : XEUtils.get(editRules, column.field);
1114
1114
  if (columnRules) {
1115
1115
  isRequired = columnRules.some((rule) => rule.required);
1116
1116
  }
@@ -99,6 +99,8 @@ export const columnProps = {
99
99
  filterRender: Object,
100
100
  // 是否显示浮动筛选
101
101
  floatingFilters: Object,
102
+ // 列的校验规则
103
+ rules: Array,
102
104
  // 设置为分组节点
103
105
  rowGroupNode: Boolean,
104
106
  // 设置为树节点
@@ -108,6 +108,7 @@ export class ColumnInfo {
108
108
  filterRecoverMethod: _vm.filterRecoverMethod,
109
109
  filterRender: filterRender,
110
110
  floatingFilters: _vm.floatingFilters,
111
+ rules: _vm.rules,
111
112
  rowGroupNode: _vm.rowGroupNode,
112
113
  treeNode: _vm.treeNode,
113
114
  dragSort: _vm.dragSort,
@@ -3191,12 +3191,12 @@ function updateGroupData($xeTable) {
3191
3191
  handleeGroupSummary($xeTable, aggList);
3192
3192
  }
3193
3193
  }
3194
- function handleGroupData($xeTable, list, rowGroups) {
3194
+ function handleGroupData($xeTable, list, rowGroups, isCombinedField) {
3195
3195
  let fullData = list;
3196
3196
  let treeData = list;
3197
3197
  if (rowGroups) {
3198
3198
  const aggregateOpts = $xeTable.computeAggregateOpts;
3199
- const { rowField, parentField, childrenField, mapChildrenField } = aggregateOpts;
3199
+ const { rowField, parentField, separator, childrenField, mapChildrenField } = aggregateOpts;
3200
3200
  const rowOpts = $xeTable.computeRowOpts;
3201
3201
  const checkboxOpts = $xeTable.computeCheckboxOpts;
3202
3202
  const { checkField } = checkboxOpts;
@@ -3208,11 +3208,26 @@ function handleGroupData($xeTable, list, rowGroups) {
3208
3208
  const groupField = rgItem.field;
3209
3209
  const groupColumn = $xeTable.getColumnByField(groupField);
3210
3210
  const groupMaps = {};
3211
+ const groupCombinedMaps = {};
3211
3212
  const aggList = [];
3212
3213
  const rowkey = getRowkey($xeTable);
3213
3214
  list.forEach((row) => {
3214
3215
  const cellValue = groupColumn ? $xeTable.getCellLabel(row, groupColumn) : XEUtils.get(row, groupField);
3215
- const groupValue = XEUtils.eqNull(cellValue) ? '' : cellValue;
3216
+ let groupValue = XEUtils.eqNull(cellValue) ? '' : cellValue;
3217
+ if (isCombinedField) {
3218
+ const groupVals = [groupValue];
3219
+ rowGroups.slice(1).forEach(ogItem => {
3220
+ const ogField = ogItem.field;
3221
+ const ogColumn = $xeTable.getColumnByField(ogField);
3222
+ const ocValue = ogColumn ? $xeTable.getCellLabel(row, ogColumn) : XEUtils.get(row, ogField);
3223
+ const ogValue = XEUtils.eqNull(ocValue) ? '' : ocValue;
3224
+ groupValue += (separator || ' / ') + ogValue;
3225
+ groupVals.push(ogValue);
3226
+ });
3227
+ if (!groupCombinedMaps[groupValue]) {
3228
+ groupCombinedMaps[groupValue] = groupVals;
3229
+ }
3230
+ }
3216
3231
  let childList = groupMaps[groupValue];
3217
3232
  if (!childList) {
3218
3233
  childList = [];
@@ -3223,33 +3238,62 @@ function handleGroupData($xeTable, list, rowGroups) {
3223
3238
  }
3224
3239
  childList.push(row);
3225
3240
  });
3226
- XEUtils.objectEach(groupMaps, (childList, groupValue) => {
3227
- const { fullData: childFullData, treeData: childTreeData } = handleGroupData($xeTable, childList, rowGroups.slice(1));
3228
- const aggRow = {
3229
- isAggregate: true,
3230
- aggData: {},
3231
- groupContent: groupValue,
3232
- groupField,
3233
- childCount: 0,
3234
- [rowField]: getRowUniqueId(),
3235
- [parentField]: null,
3236
- [childrenField]: childTreeData,
3237
- [mapChildrenField]: childTreeData
3238
- };
3239
- aggRow[rowkey] = createRowId(rowOpts, aggRow, rowkey);
3240
- if (checkField) {
3241
- aggRow[checkField] = false;
3242
- }
3243
- if (indeterminateField) {
3244
- aggRow[indeterminateField] = false;
3245
- }
3246
- aggList.push(aggRow);
3247
- treeData.push(aggRow);
3248
- fullData.push(aggRow);
3249
- if (childFullData.length) {
3250
- fullData.push(...childFullData);
3251
- }
3252
- });
3241
+ if (isCombinedField) {
3242
+ XEUtils.objectEach(groupMaps, (childList, groupValue) => {
3243
+ const aggRow = {
3244
+ isAggregate: true,
3245
+ aggData: {},
3246
+ groupContent: groupValue,
3247
+ groupCombineds: groupCombinedMaps[groupValue],
3248
+ groupField,
3249
+ childCount: 0,
3250
+ [rowField]: getRowUniqueId(),
3251
+ [parentField]: null,
3252
+ [childrenField]: childList,
3253
+ [mapChildrenField]: childList
3254
+ };
3255
+ aggRow[rowkey] = createRowId(rowOpts, aggRow, rowkey);
3256
+ if (checkField) {
3257
+ aggRow[checkField] = false;
3258
+ }
3259
+ if (indeterminateField) {
3260
+ aggRow[indeterminateField] = false;
3261
+ }
3262
+ aggList.push(aggRow);
3263
+ treeData.push(aggRow);
3264
+ fullData.push(aggRow);
3265
+ });
3266
+ }
3267
+ else {
3268
+ XEUtils.objectEach(groupMaps, (childList, groupValue) => {
3269
+ const { fullData: childFullData, treeData: childTreeData } = handleGroupData($xeTable, childList, rowGroups.slice(1));
3270
+ const aggRow = {
3271
+ isAggregate: true,
3272
+ aggData: {},
3273
+ groupContent: groupValue,
3274
+ groupCombineds: [],
3275
+ groupField,
3276
+ childCount: 0,
3277
+ [rowField]: getRowUniqueId(),
3278
+ [parentField]: null,
3279
+ [childrenField]: childTreeData,
3280
+ [mapChildrenField]: childTreeData
3281
+ };
3282
+ aggRow[rowkey] = createRowId(rowOpts, aggRow, rowkey);
3283
+ if (checkField) {
3284
+ aggRow[checkField] = false;
3285
+ }
3286
+ if (indeterminateField) {
3287
+ aggRow[indeterminateField] = false;
3288
+ }
3289
+ aggList.push(aggRow);
3290
+ treeData.push(aggRow);
3291
+ fullData.push(aggRow);
3292
+ if (childFullData.length) {
3293
+ fullData.push(...childFullData);
3294
+ }
3295
+ });
3296
+ }
3253
3297
  handleeGroupSummary($xeTable, aggList);
3254
3298
  }
3255
3299
  }
@@ -3258,6 +3302,13 @@ function handleGroupData($xeTable, list, rowGroups) {
3258
3302
  fullData
3259
3303
  };
3260
3304
  }
3305
+ function initGroupData($xeTable, list, rowGroups) {
3306
+ const aggregateOpts = $xeTable.computeAggregateOpts;
3307
+ const { mode } = aggregateOpts;
3308
+ const isCombinedField = mode === 'combined';
3309
+ const groupRest = handleGroupData($xeTable, list, rowGroups, isCombinedField);
3310
+ return groupRest;
3311
+ }
3261
3312
  /**
3262
3313
  * 加载表格数据
3263
3314
  * @param {Array} datas 数据
@@ -3324,7 +3375,7 @@ function loadTableData($xeTable, datas, isReload, isReset) {
3324
3375
  }
3325
3376
  }
3326
3377
  else if ((aggregateConfig || rowGroupConfig) && rowGroupList.length) {
3327
- const groupRest = handleGroupData($xeTable, fullData, rowGroupList);
3378
+ const groupRest = initGroupData($xeTable, fullData, rowGroupList);
3328
3379
  treeData = groupRest.treeData;
3329
3380
  fullData = groupRest.fullData;
3330
3381
  isRGroup = true;