vxe-table 3.15.5 → 3.15.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/ar-EG.js +3 -2
  4. package/es/locale/lang/de-DE.js +3 -2
  5. package/es/locale/lang/en-US.js +2 -1
  6. package/es/locale/lang/es-ES.js +3 -2
  7. package/es/locale/lang/fr-FR.js +2 -1
  8. package/es/locale/lang/hu-HU.js +2 -1
  9. package/es/locale/lang/hy-AM.js +2 -1
  10. package/es/locale/lang/id-ID.js +2 -1
  11. package/es/locale/lang/it-IT.js +2 -1
  12. package/es/locale/lang/ja-JP.js +2 -1
  13. package/es/locale/lang/ko-KR.js +2 -1
  14. package/es/locale/lang/nb-NO.js +2 -1
  15. package/es/locale/lang/pt-BR.js +2 -1
  16. package/es/locale/lang/ru-RU.js +2 -1
  17. package/es/locale/lang/th-TH.js +2 -1
  18. package/es/locale/lang/ug-CN.js +2 -1
  19. package/es/locale/lang/uk-UA.js +2 -1
  20. package/es/locale/lang/vi-VN.js +2 -1
  21. package/es/locale/lang/zh-CHT.js +2 -1
  22. package/es/locale/lang/zh-CN.js +2 -1
  23. package/es/style.css +1 -1
  24. package/es/style.min.css +1 -1
  25. package/es/table/module/custom/mixin.js +62 -37
  26. package/es/table/module/custom/panel.js +7 -7
  27. package/es/table/module/export/mixin.js +13 -12
  28. package/es/table/module/keyboard/mixin.js +3 -2
  29. package/es/table/src/body.js +49 -16
  30. package/es/table/src/cell.js +137 -45
  31. package/es/table/src/column.js +2 -0
  32. package/es/table/src/columnInfo.js +1 -0
  33. package/es/table/src/methods.js +977 -495
  34. package/es/table/src/props.js +9 -7
  35. package/es/table/src/table.js +108 -35
  36. package/es/table/style.css +70 -40
  37. package/es/table/style.min.css +1 -1
  38. package/es/ui/index.js +13 -1
  39. package/es/ui/src/dom.js +3 -0
  40. package/es/ui/src/log.js +1 -1
  41. package/es/vxe-table/style.css +70 -40
  42. package/es/vxe-table/style.min.css +1 -1
  43. package/lib/index.css +1 -1
  44. package/lib/index.min.css +1 -1
  45. package/lib/index.umd.js +1729 -858
  46. package/lib/index.umd.min.js +1 -1
  47. package/lib/locale/lang/ar-EG.js +3 -2
  48. package/lib/locale/lang/ar-EG.min.js +1 -1
  49. package/lib/locale/lang/de-DE.js +3 -2
  50. package/lib/locale/lang/de-DE.min.js +1 -1
  51. package/lib/locale/lang/en-US.js +2 -1
  52. package/lib/locale/lang/en-US.min.js +1 -1
  53. package/lib/locale/lang/en-US.umd.js +2 -1
  54. package/lib/locale/lang/es-ES.js +3 -2
  55. package/lib/locale/lang/es-ES.min.js +1 -1
  56. package/lib/locale/lang/es-ES.umd.js +3 -2
  57. package/lib/locale/lang/fr-FR.js +2 -1
  58. package/lib/locale/lang/fr-FR.min.js +1 -1
  59. package/lib/locale/lang/hu-HU.js +2 -1
  60. package/lib/locale/lang/hu-HU.min.js +1 -1
  61. package/lib/locale/lang/hu-HU.umd.js +2 -1
  62. package/lib/locale/lang/hy-AM.js +2 -1
  63. package/lib/locale/lang/hy-AM.min.js +1 -1
  64. package/lib/locale/lang/id-ID.js +2 -1
  65. package/lib/locale/lang/id-ID.min.js +1 -1
  66. package/lib/locale/lang/it-IT.js +2 -1
  67. package/lib/locale/lang/it-IT.min.js +1 -1
  68. package/lib/locale/lang/ja-JP.js +2 -1
  69. package/lib/locale/lang/ja-JP.min.js +1 -1
  70. package/lib/locale/lang/ja-JP.umd.js +2 -1
  71. package/lib/locale/lang/ko-KR.js +2 -1
  72. package/lib/locale/lang/ko-KR.min.js +1 -1
  73. package/lib/locale/lang/ko-KR.umd.js +2 -1
  74. package/lib/locale/lang/nb-NO.js +2 -1
  75. package/lib/locale/lang/nb-NO.min.js +1 -1
  76. package/lib/locale/lang/pt-BR.js +2 -1
  77. package/lib/locale/lang/pt-BR.min.js +1 -1
  78. package/lib/locale/lang/pt-BR.umd.js +2 -1
  79. package/lib/locale/lang/ru-RU.js +2 -1
  80. package/lib/locale/lang/ru-RU.min.js +1 -1
  81. package/lib/locale/lang/ru-RU.umd.js +2 -1
  82. package/lib/locale/lang/th-TH.js +2 -1
  83. package/lib/locale/lang/th-TH.min.js +1 -1
  84. package/lib/locale/lang/ug-CN.js +2 -1
  85. package/lib/locale/lang/ug-CN.min.js +1 -1
  86. package/lib/locale/lang/uk-UA.js +2 -1
  87. package/lib/locale/lang/uk-UA.min.js +1 -1
  88. package/lib/locale/lang/uk-UA.umd.js +2 -1
  89. package/lib/locale/lang/vi-VN.js +2 -1
  90. package/lib/locale/lang/vi-VN.min.js +1 -1
  91. package/lib/locale/lang/zh-CHT.js +2 -1
  92. package/lib/locale/lang/zh-CHT.min.js +1 -1
  93. package/lib/locale/lang/zh-CHT.umd.js +2 -1
  94. package/lib/locale/lang/zh-CN.js +2 -1
  95. package/lib/locale/lang/zh-CN.min.js +1 -1
  96. package/lib/locale/lang/zh-CN.umd.js +2 -1
  97. package/lib/style.css +1 -1
  98. package/lib/style.min.css +1 -1
  99. package/lib/table/module/custom/mixin.js +74 -48
  100. package/lib/table/module/custom/mixin.min.js +1 -1
  101. package/lib/table/module/custom/panel.js +6 -2
  102. package/lib/table/module/custom/panel.min.js +1 -1
  103. package/lib/table/module/export/mixin.js +13 -5
  104. package/lib/table/module/export/mixin.min.js +1 -1
  105. package/lib/table/module/keyboard/mixin.js +2 -1
  106. package/lib/table/module/keyboard/mixin.min.js +1 -1
  107. package/lib/table/src/body.js +39 -15
  108. package/lib/table/src/body.min.js +1 -1
  109. package/lib/table/src/cell.js +157 -36
  110. package/lib/table/src/cell.min.js +1 -1
  111. package/lib/table/src/column.js +2 -0
  112. package/lib/table/src/column.min.js +1 -1
  113. package/lib/table/src/columnInfo.js +1 -0
  114. package/lib/table/src/columnInfo.min.js +1 -1
  115. package/lib/table/src/methods.js +1158 -562
  116. package/lib/table/src/methods.min.js +1 -1
  117. package/lib/table/src/props.js +9 -7
  118. package/lib/table/src/props.min.js +1 -1
  119. package/lib/table/src/table.js +104 -34
  120. package/lib/table/src/table.min.js +1 -1
  121. package/lib/table/style/style.css +70 -40
  122. package/lib/table/style/style.min.css +1 -1
  123. package/lib/ui/index.js +13 -1
  124. package/lib/ui/index.min.js +1 -1
  125. package/lib/ui/src/dom.js +4 -0
  126. package/lib/ui/src/dom.min.js +1 -1
  127. package/lib/ui/src/log.js +1 -1
  128. package/lib/ui/src/log.min.js +1 -1
  129. package/lib/vxe-table/style/style.css +70 -40
  130. package/lib/vxe-table/style/style.min.css +1 -1
  131. package/package.json +2 -2
  132. package/packages/locale/lang/ar-EG.ts +3 -2
  133. package/packages/locale/lang/de-DE.ts +3 -2
  134. package/packages/locale/lang/en-US.ts +2 -1
  135. package/packages/locale/lang/es-ES.ts +3 -2
  136. package/packages/locale/lang/fr-FR.ts +2 -1
  137. package/packages/locale/lang/hu-HU.ts +2 -1
  138. package/packages/locale/lang/hy-AM.ts +2 -1
  139. package/packages/locale/lang/id-ID.ts +2 -1
  140. package/packages/locale/lang/it-IT.ts +2 -1
  141. package/packages/locale/lang/ja-JP.ts +2 -1
  142. package/packages/locale/lang/ko-KR.ts +2 -1
  143. package/packages/locale/lang/nb-NO.ts +2 -1
  144. package/packages/locale/lang/pt-BR.ts +2 -1
  145. package/packages/locale/lang/ru-RU.ts +2 -1
  146. package/packages/locale/lang/th-TH.ts +2 -1
  147. package/packages/locale/lang/ug-CN.ts +2 -1
  148. package/packages/locale/lang/uk-UA.ts +2 -1
  149. package/packages/locale/lang/vi-VN.ts +2 -1
  150. package/packages/locale/lang/zh-CHT.ts +2 -1
  151. package/packages/locale/lang/zh-CN.ts +2 -1
  152. package/packages/table/module/custom/mixin.ts +85 -51
  153. package/packages/table/module/custom/panel.ts +8 -8
  154. package/packages/table/module/export/mixin.ts +19 -18
  155. package/packages/table/module/keyboard/mixin.ts +3 -2
  156. package/packages/table/src/body.ts +50 -17
  157. package/packages/table/src/cell.ts +136 -45
  158. package/packages/table/src/column.ts +2 -0
  159. package/packages/table/src/columnInfo.ts +1 -0
  160. package/packages/table/src/methods.ts +1010 -512
  161. package/packages/table/src/props.ts +9 -7
  162. package/packages/table/src/table.ts +122 -38
  163. package/packages/ui/index.ts +12 -0
  164. package/packages/ui/src/dom.ts +4 -0
  165. package/styles/components/table.scss +131 -92
  166. /package/es/{iconfont.1744880837792.ttf → iconfont.1745197894601.ttf} +0 -0
  167. /package/es/{iconfont.1744880837792.woff → iconfont.1745197894601.woff} +0 -0
  168. /package/es/{iconfont.1744880837792.woff2 → iconfont.1745197894601.woff2} +0 -0
  169. /package/lib/{iconfont.1744880837792.ttf → iconfont.1745197894601.ttf} +0 -0
  170. /package/lib/{iconfont.1744880837792.woff → iconfont.1745197894601.woff} +0 -0
  171. /package/lib/{iconfont.1744880837792.woff2 → iconfont.1745197894601.woff2} +0 -0
@@ -1,4 +1,20 @@
1
1
  import XEUtils from 'xe-utils';
2
+ function calcMaxHeight($xeTable) {
3
+ const reactData = $xeTable;
4
+ const { customStore } = reactData;
5
+ const el = $xeTable.$refs.refElem;
6
+ // 判断面板不能大于表格高度
7
+ let tableHeight = 0;
8
+ if (el) {
9
+ tableHeight = el.clientHeight - 28;
10
+ }
11
+ customStore.maxHeight = Math.max(88, tableHeight);
12
+ }
13
+ function emitCustomEvent($xeTable, type, evnt) {
14
+ const $xeGrid = $xeTable.$xeGrid;
15
+ const comp = $xeGrid || $xeTable;
16
+ comp.dispatchEvent('custom', { type }, evnt);
17
+ }
2
18
  export default {
3
19
  methods: {
4
20
  _openCustom() {
@@ -9,18 +25,21 @@ export default {
9
25
  initStore.custom = true;
10
26
  $xeTable.handleUpdateCustomColumn();
11
27
  $xeTable.checkCustomStatus();
12
- $xeTable.calcMaxHeight();
13
- return this.$nextTick().then(() => this.calcMaxHeight());
28
+ calcMaxHeight($xeTable);
29
+ return $xeTable.$nextTick().then(() => calcMaxHeight($xeTable));
14
30
  },
15
31
  _closeCustom() {
16
- const { customStore, customOpts } = this;
32
+ const $xeTable = this;
33
+ const reactData = $xeTable;
34
+ const { customStore } = reactData;
35
+ const customOpts = $xeTable.computeCustomOpts;
17
36
  if (customStore.visible) {
18
37
  customStore.visible = false;
19
38
  if (!customOpts.immediate) {
20
- this.handleCustom();
39
+ $xeTable.handleCustom();
21
40
  }
22
41
  }
23
- return this.$nextTick();
42
+ return $xeTable.$nextTick();
24
43
  },
25
44
  _saveCustom() {
26
45
  const $xeTable = this;
@@ -62,8 +81,10 @@ export default {
62
81
  },
63
82
  _cancelCustom() {
64
83
  const $xeTable = this;
65
- const { customStore, customOpts, customColumnList } = $xeTable;
84
+ const reactData = $xeTable;
85
+ const { customColumnList, customStore } = reactData;
66
86
  const { oldSortMaps, oldFixedMaps, oldVisibleMaps } = customStore;
87
+ const customOpts = $xeTable.computeCustomOpts;
67
88
  const { allowVisible, allowSort, allowFixed, allowResizable } = customOpts;
68
89
  XEUtils.eachTree(customColumnList, column => {
69
90
  const colid = column.getKey();
@@ -90,7 +111,8 @@ export default {
90
111
  const $xeTable = this;
91
112
  const reactData = $xeTable;
92
113
  const internalData = $xeTable;
93
- const { collectColumn, customOpts } = internalData;
114
+ const { collectColumn } = internalData;
115
+ const customOpts = $xeTable.computeCustomOpts;
94
116
  const { checkMethod } = customOpts;
95
117
  const opts = Object.assign({
96
118
  visible: true,
@@ -108,7 +130,7 @@ export default {
108
130
  if (opts.sort) {
109
131
  column.renderSortNumber = column.sortNumber;
110
132
  }
111
- if (!checkMethod || checkMethod({ column })) {
133
+ if (!checkMethod || checkMethod({ $table: $xeTable, column })) {
112
134
  column.visible = column.defaultVisible;
113
135
  }
114
136
  column.renderResizeWidth = column.renderWidth;
@@ -125,16 +147,17 @@ export default {
125
147
  _setCustomAllCheckbox(checked) {
126
148
  const $xeTable = this;
127
149
  const reactData = $xeTable;
128
- const { customStore } = this;
129
- const { customColumnList, customOpts } = this;
150
+ const { customStore } = reactData;
151
+ const { customColumnList } = reactData;
152
+ const customOpts = $xeTable.computeCustomOpts;
130
153
  const { checkMethod, visibleMethod } = customOpts;
131
154
  const isAll = !!checked;
132
155
  if (customOpts.immediate) {
133
156
  XEUtils.eachTree(customColumnList, (column) => {
134
- if (visibleMethod && !visibleMethod({ column })) {
157
+ if (visibleMethod && !visibleMethod({ $table: $xeTable, column })) {
135
158
  return;
136
159
  }
137
- if (checkMethod && !checkMethod({ column })) {
160
+ if (checkMethod && !checkMethod({ $table: $xeTable, column })) {
138
161
  return;
139
162
  }
140
163
  column.visible = isAll;
@@ -148,10 +171,10 @@ export default {
148
171
  }
149
172
  else {
150
173
  XEUtils.eachTree(customColumnList, (column) => {
151
- if (visibleMethod && !visibleMethod({ column })) {
174
+ if (visibleMethod && !visibleMethod({ $table: $xeTable, column })) {
152
175
  return;
153
176
  }
154
- if (checkMethod && !checkMethod({ column })) {
177
+ if (checkMethod && !checkMethod({ $table: $xeTable, column })) {
155
178
  return;
156
179
  }
157
180
  column.renderVisible = isAll;
@@ -161,54 +184,56 @@ export default {
161
184
  }
162
185
  $xeTable.checkCustomStatus();
163
186
  },
164
- calcMaxHeight() {
165
- const { $el, customStore } = this;
166
- // 判断面板不能大于表格高度
167
- let tableHeight = 0;
168
- if ($el) {
169
- tableHeight = $el.clientHeight - 28;
170
- }
171
- customStore.maxHeight = Math.max(88, tableHeight);
172
- },
173
187
  checkCustomStatus() {
174
- const { customStore, collectColumn, customOpts } = this;
188
+ const $xeTable = this;
189
+ const reactData = $xeTable;
190
+ const internalData = $xeTable;
191
+ const { customStore } = reactData;
192
+ const { collectColumn } = internalData;
193
+ const customOpts = $xeTable.computeCustomOpts;
175
194
  const { checkMethod } = customOpts;
176
- customStore.isAll = collectColumn.every((column) => (checkMethod ? !checkMethod({ column }) : false) || column.renderVisible);
177
- customStore.isIndeterminate = !customStore.isAll && collectColumn.some((column) => (!checkMethod || checkMethod({ column })) && (column.renderVisible || column.halfVisible));
195
+ customStore.isAll = collectColumn.every((column) => (checkMethod ? !checkMethod({ $table: $xeTable, column }) : false) || column.renderVisible);
196
+ customStore.isIndeterminate = !customStore.isAll && collectColumn.some((column) => (!checkMethod || checkMethod({ $table: $xeTable, column })) && (column.renderVisible || column.halfVisible));
178
197
  },
179
198
  emitCustomEvent(type, evnt) {
180
199
  const $xeTable = this;
181
200
  const $xeGrid = $xeTable.$xeGrid;
182
201
  const comp = $xeGrid || $xeTable;
183
- comp.$emit('custom', { type, $table: $xeTable, $grid: $xeGrid, $event: evnt });
202
+ comp.dispatchEvent('custom', { type }, evnt);
184
203
  },
185
204
  triggerCustomEvent(evnt) {
186
- const { customStore } = this;
205
+ const $xeTable = this;
206
+ const reactData = $xeTable;
207
+ const { customStore } = reactData;
187
208
  if (customStore.visible) {
188
209
  this.closeCustom();
189
- this.emitCustomEvent('close', evnt);
210
+ emitCustomEvent($xeTable, 'close', evnt);
190
211
  }
191
212
  else {
192
213
  customStore.btnEl = evnt.target;
193
214
  this.openCustom();
194
- this.emitCustomEvent('open', evnt);
215
+ emitCustomEvent($xeTable, 'open', evnt);
195
216
  }
196
217
  },
197
218
  customOpenEvent(evnt) {
198
- const { customStore } = this;
199
- if (!customStore.visible) {
219
+ const $xeTable = this;
220
+ const reactData = $xeTable;
221
+ const { customStore } = reactData;
222
+ if (customStore.visible) {
200
223
  customStore.activeBtn = true;
201
224
  customStore.btnEl = evnt.target;
202
- this.openCustom();
203
- this.emitCustomEvent('open', evnt);
225
+ $xeTable.openCustom();
226
+ emitCustomEvent($xeTable, 'open', evnt);
204
227
  }
205
228
  },
206
229
  customCloseEvent(evnt) {
207
- const { customStore } = this;
230
+ const $xeTable = this;
231
+ const reactData = $xeTable;
232
+ const { customStore } = reactData;
208
233
  if (customStore.visible) {
209
234
  customStore.activeBtn = false;
210
- this.closeCustom();
211
- this.emitCustomEvent('close', evnt);
235
+ $xeTable.closeCustom();
236
+ emitCustomEvent($xeTable, 'close', evnt);
212
237
  }
213
238
  },
214
239
  handleUpdateCustomColumn() {
@@ -1,6 +1,6 @@
1
1
  import { VxeUI } from '../../../ui';
2
2
  import { formatText } from '../../../ui/src/utils';
3
- import { getTpImg, addClass, removeClass } from '../../../ui/src/dom';
3
+ import { getTpImg, addClass, removeClass, hasControlKey } from '../../../ui/src/dom';
4
4
  import { errLog } from '../../../ui/src/log';
5
5
  import XEUtils from 'xe-utils';
6
6
  const { getI18n, getIcon, renderEmptyElement } = VxeUI;
@@ -123,13 +123,13 @@ const renderSimplePanel = (h, _vm) => {
123
123
  isCustomStatus
124
124
  };
125
125
  XEUtils.eachTree(customColumnList, (column, index, items, path, parent) => {
126
- const isVisible = visibleMethod ? visibleMethod({ column }) : true;
126
+ const isVisible = visibleMethod ? visibleMethod({ $table: $xeTable, column }) : true;
127
127
  if (isVisible) {
128
128
  const isChecked = column.renderVisible;
129
129
  const isIndeterminate = column.halfVisible;
130
130
  const isColGroup = column.children && column.children.length;
131
131
  const colTitle = formatText(column.getTitle(), 1);
132
- const isDisabled = checkMethod ? !checkMethod({ column }) : false;
132
+ const isDisabled = checkMethod ? !checkMethod({ $table: $xeTable, column }) : false;
133
133
  const isHidden = !isChecked;
134
134
  colVNs.push(h('li', {
135
135
  key: column.id,
@@ -426,7 +426,7 @@ const renderPopupPanel = (h, _vm) => {
426
426
  isCustomStatus
427
427
  };
428
428
  XEUtils.eachTree(customColumnList, (column, index, items, path, parent) => {
429
- const isVisible = visibleMethod ? visibleMethod({ column }) : true;
429
+ const isVisible = visibleMethod ? visibleMethod({ $table: $xeTable, column }) : true;
430
430
  if (isVisible) {
431
431
  // 默认继承调整宽度
432
432
  let customMinWidth = 0;
@@ -450,7 +450,7 @@ const renderPopupPanel = (h, _vm) => {
450
450
  const isIndeterminate = column.halfVisible;
451
451
  const colTitle = formatText(column.getTitle(), 1);
452
452
  const isColGroup = column.children && column.children.length;
453
- const isDisabled = checkMethod ? !checkMethod({ column }) : false;
453
+ const isDisabled = checkMethod ? !checkMethod({ $table: $xeTable, column }) : false;
454
454
  const isHidden = !isChecked;
455
455
  trVNs.push(h('tr', {
456
456
  key: column.id,
@@ -1230,7 +1230,7 @@ export default {
1230
1230
  const columnDragOpts = $xeTable.computeColumnDragOpts;
1231
1231
  const { isCrossDrag, isToChildDrag } = columnDragOpts;
1232
1232
  const optEl = evnt.currentTarget;
1233
- const hasCtrlKey = evnt.ctrlKey;
1233
+ const isControlKey = hasControlKey(evnt);
1234
1234
  const colid = optEl.getAttribute('colid');
1235
1235
  const column = $xeTable.getColumnById(colid);
1236
1236
  // 是否移入有效列
@@ -1245,7 +1245,7 @@ export default {
1245
1245
  showDropTip(this, evnt, optEl, false, dragPos);
1246
1246
  return;
1247
1247
  }
1248
- this.prevDragToChild = !!((isCrossDrag && isToChildDrag) && hasCtrlKey && immediate);
1248
+ this.prevDragToChild = !!((isCrossDrag && isToChildDrag) && isControlKey && immediate);
1249
1249
  this.prevDragCol = column;
1250
1250
  this.prevDragPos = dragPos;
1251
1251
  showDropTip(this, evnt, optEl, true, dragPos);
@@ -22,6 +22,7 @@ function getSeq($xeTable, cellValue, row, $rowIndex, column, $columnIndex) {
22
22
  const seqMethod = seqOpts.seqMethod || column.seqMethod;
23
23
  if (seqMethod) {
24
24
  return seqMethod({
25
+ $table: $xeTable,
25
26
  row,
26
27
  rowIndex: $xeTable.getRowIndex(row),
27
28
  $rowIndex,
@@ -103,12 +104,12 @@ function getBodyLabelData($xeTable, opts, columns, datas) {
103
104
  case 'checkbox':
104
105
  cellValue = toBooleanValue($xeTable.isCheckedByCheckboxRow(row));
105
106
  item._checkboxLabel = checkboxOpts.labelField ? XEUtils.get(row, checkboxOpts.labelField) : '';
106
- item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ row });
107
+ item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ $table: $xeTable, row });
107
108
  break;
108
109
  case 'radio':
109
110
  cellValue = toBooleanValue($xeTable.isCheckedByRadioRow(row));
110
111
  item._radioLabel = radioOpts.labelField ? XEUtils.get(row, radioOpts.labelField) : '';
111
- item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ row });
112
+ item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ $table: $xeTable, row });
112
113
  break;
113
114
  default:
114
115
  if (opts.original) {
@@ -164,12 +165,12 @@ function getBodyLabelData($xeTable, opts, columns, datas) {
164
165
  case 'checkbox':
165
166
  cellValue = toBooleanValue($xeTable.isCheckedByCheckboxRow(row));
166
167
  item._checkboxLabel = checkboxOpts.labelField ? XEUtils.get(row, checkboxOpts.labelField) : '';
167
- item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ row });
168
+ item._checkboxDisabled = checkboxOpts.checkMethod && !checkboxOpts.checkMethod({ $table: $xeTable, row });
168
169
  break;
169
170
  case 'radio':
170
171
  cellValue = toBooleanValue($xeTable.isCheckedByRadioRow(row));
171
172
  item._radioLabel = radioOpts.labelField ? XEUtils.get(row, radioOpts.labelField) : '';
172
- item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ row });
173
+ item._radioDisabled = radioOpts.checkMethod && !radioOpts.checkMethod({ $table: $xeTable, row });
173
174
  break;
174
175
  default:
175
176
  if (opts.original) {
@@ -199,7 +200,7 @@ function getExportData($xeTable, opts) {
199
200
  const { columns, dataFilterMethod } = opts;
200
201
  let datas = opts.data;
201
202
  if (dataFilterMethod) {
202
- datas = datas.filter((row, index) => dataFilterMethod({ row, $rowIndex: index }));
203
+ datas = datas.filter((row, index) => dataFilterMethod({ $table: $xeTable, row, $rowIndex: index }));
203
204
  }
204
205
  return getBodyLabelData($xeTable, opts, columns, datas);
205
206
  }
@@ -234,9 +235,9 @@ function getFooterCellValue($xeTable, opts, row, column) {
234
235
  }
235
236
  return XEUtils.get(row, column.field);
236
237
  }
237
- function getFooterData(opts, footerTableData) {
238
+ function getFooterData($xeTable, opts, footerTableData) {
238
239
  const { footerFilterMethod } = opts;
239
- return footerFilterMethod ? footerTableData.filter((items, index) => footerFilterMethod({ items, $rowIndex: index })) : footerTableData;
240
+ return footerFilterMethod ? footerTableData.filter((items, index) => footerFilterMethod({ $table: $xeTable, items, $rowIndex: index })) : footerTableData;
240
241
  }
241
242
  function getCsvCellTypeLabel(column, cellValue) {
242
243
  if (cellValue) {
@@ -277,7 +278,7 @@ function toCsv($xeTable, opts, columns, datas) {
277
278
  });
278
279
  if (opts.isFooter) {
279
280
  const { footerTableData } = reactData;
280
- const footers = getFooterData(opts, footerTableData);
281
+ const footers = getFooterData($xeTable, opts, footerTableData);
281
282
  footers.forEach((row) => {
282
283
  content += columns.map(column => toTxtCellLabel(getFooterCellValue($xeTable, opts, row, column))).join(',') + enterSymbol;
283
284
  });
@@ -295,7 +296,7 @@ function toTxt($xeTable, opts, columns, datas) {
295
296
  });
296
297
  if (opts.isFooter) {
297
298
  const { footerTableData } = reactData;
298
- const footers = getFooterData(opts, footerTableData);
299
+ const footers = getFooterData($xeTable, opts, footerTableData);
299
300
  footers.forEach((row) => {
300
301
  content += columns.map(column => toTxtCellLabel(getFooterCellValue($xeTable, opts, row, column))).join('\t') + enterSymbol;
301
302
  });
@@ -458,7 +459,7 @@ function toHtml($xeTable, opts, columns, datas) {
458
459
  }
459
460
  if (isFooter) {
460
461
  const { footerTableData } = reactData;
461
- const footers = getFooterData(opts, footerTableData);
462
+ const footers = getFooterData($xeTable, opts, footerTableData);
462
463
  if (footers.length) {
463
464
  tables.push('<tfoot>');
464
465
  footers.forEach((row) => {
@@ -509,7 +510,7 @@ function toXML($xeTable, opts, columns, datas) {
509
510
  });
510
511
  if (opts.isFooter) {
511
512
  const { footerTableData } = reactData;
512
- const footers = getFooterData(opts, footerTableData);
513
+ const footers = getFooterData($xeTable, opts, footerTableData);
513
514
  footers.forEach((row) => {
514
515
  xml += `<Row>${columns.map(column => `<Cell><Data ss:Type="String">${getFooterCellValue($xeTable, opts, row, column)}</Data></Cell>`).join('')}</Row>`;
515
516
  });
@@ -1066,7 +1067,7 @@ function handleExportAndPrint($xeTable, options, isPrint) {
1066
1067
  }
1067
1068
  column.checked = isChecked;
1068
1069
  column.halfChecked = false;
1069
- column.disabled = (parent && parent.disabled) || (checkMethod ? !checkMethod({ column }) : false);
1070
+ column.disabled = (parent && parent.disabled) || (checkMethod ? !checkMethod({ $table: $xeTable, column }) : false);
1070
1071
  });
1071
1072
  // 更新条件
1072
1073
  Object.assign(exportStore, {
@@ -1,6 +1,6 @@
1
1
  import XEUtils from 'xe-utils';
2
2
  import { getRefElem } from '../../src/util';
3
- import { hasClass, getAbsolutePos, addClass, removeClass } from '../../../ui/src/dom';
3
+ import { hasClass, getAbsolutePos, addClass, removeClass, hasControlKey } from '../../../ui/src/dom';
4
4
  const browseObj = XEUtils.browse();
5
5
  function getTargetOffset(target, container) {
6
6
  let offsetTop = 0;
@@ -446,8 +446,9 @@ export default {
446
446
  const rangeRows = getCheckboxRangeRows(this, evnt, params, trElem, trRect, offsetClientTop, offsetTop < marginSize ? -rangeHeight : rangeHeight);
447
447
  // 至少滑动 10px 才能有效匹配
448
448
  if (rangeHeight > 10 && rangeRows.length !== lastRangeRows.length) {
449
+ const isControlKey = hasControlKey(evnt);
449
450
  lastRangeRows = rangeRows;
450
- if (evnt.ctrlKey) {
451
+ if (isControlKey) {
451
452
  rangeRows.forEach((row) => {
452
453
  $xeTable.handleBatchSelectRows([row], selectRecords.indexOf(row) === -1);
453
454
  });
@@ -14,8 +14,7 @@ const isVMScrollProcess = ($xeTable) => {
14
14
  const { lastScrollTime, isDragResize } = tableReactData;
15
15
  return !!(isDragResize || (lastScrollTime && Date.now() < lastScrollTime + delayHover));
16
16
  };
17
- function renderLine(h, _vm, rowid, params, cellHeight) {
18
- const $xeTable = _vm.$parent;
17
+ function renderLine(h, $xeTable, rowid, params, cellHeight) {
19
18
  const tableProps = $xeTable;
20
19
  const tableInternalData = $xeTable;
21
20
  const { row, column } = params;
@@ -56,8 +55,7 @@ function renderLine(h, _vm, rowid, params, cellHeight) {
56
55
  /**
57
56
  * 渲染列
58
57
  */
59
- function renderTdColumn(h, _vm, seq, rowid, fixedType, isOptimizeMode, rowLevel, row, rowIndex, $rowIndex, _rowIndex, column, $columnIndex, columns, items) {
60
- const $xeTable = _vm.$parent;
58
+ function renderTdColumn(h, $xeTable, seq, rowid, fixedType, isOptimizeMode, rowLevel, row, rowIndex, $rowIndex, _rowIndex, column, $columnIndex, columns, items) {
61
59
  const tableProps = $xeTable;
62
60
  const tableReactData = $xeTable;
63
61
  const tableInternalData = $xeTable;
@@ -281,7 +279,7 @@ function renderTdColumn(h, _vm, seq, rowid, fixedType, isOptimizeMode, rowLevel,
281
279
  }
282
280
  else {
283
281
  // 渲染单元格
284
- tdVNs.push(...renderLine(h, _vm, rowid, cellParams, cellHeight), h('div', {
282
+ tdVNs.push(...renderLine(h, $xeTable, rowid, cellParams, cellHeight), h('div', {
285
283
  key: 'tc',
286
284
  class: ['vxe-cell', {
287
285
  'c--title': showTitle,
@@ -401,9 +399,10 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
401
399
  const tableProps = $xeTable;
402
400
  const tableReactData = $xeTable;
403
401
  const tableInternalData = $xeTable;
402
+ const $xeGrid = $xeTable.$xeGrid;
404
403
  const { stripe, rowKey, highlightHoverRow, rowClassName, rowStyle, editConfig, treeConfig } = tableProps;
405
- const { hasFixedColumn, treeExpandedFlag, isColLoading, scrollXLoad, scrollYLoad, isAllOverflow, rowExpandedFlag, expandColumn, selectRadioRow, pendingRowFlag, isDragColMove, rowExpandHeightFlag } = tableReactData;
406
- const { fullAllDataRowIdData, treeExpandedMaps, pendingRowMaps, rowExpandedMaps } = tableInternalData;
404
+ const { hasFixedColumn, treeExpandedFlag, isColLoading, scrollXLoad, scrollYLoad, isAllOverflow, rowExpandedFlag, expandColumn, selectRadioRow, pendingRowFlag, isDragColMove, rowExpandHeightFlag, isRowGroupStatus } = tableReactData;
405
+ const { fullAllDataRowIdData, fullColumnIdData, treeExpandedMaps, pendingRowMaps, rowExpandedMaps } = tableInternalData;
407
406
  const checkboxOpts = $xeTable.computeCheckboxOpts;
408
407
  const radioOpts = $xeTable.computeRadioOpts;
409
408
  const treeOpts = $xeTable.computeTreeOpts;
@@ -415,6 +414,7 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
415
414
  const childrenField = treeOpts.children || treeOpts.childrenField;
416
415
  const rows = [];
417
416
  const { handleGetRowId } = createHandleGetRowId($xeTable);
417
+ const isDeepRow = treeConfig || isRowGroupStatus;
418
418
  tableData.forEach((row, $rowIndex) => {
419
419
  const trOn = {};
420
420
  const rowid = handleGetRowId(row);
@@ -423,6 +423,7 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
423
423
  let rowLevel = 0;
424
424
  let seq = -1;
425
425
  let _rowIndex = -1;
426
+ const hasRowGroupAggregate = isRowGroupStatus && row.isAggregate;
426
427
  // 当前行事件
427
428
  if (rowOpts.isHover || highlightHoverRow) {
428
429
  trOn.mouseenter = (evnt) => {
@@ -440,7 +441,7 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
440
441
  }
441
442
  if (rowRest) {
442
443
  rowLevel = rowRest.level;
443
- if (treeConfig && transform && seqMode === 'increasing') {
444
+ if (hasRowGroupAggregate || (treeConfig && transform && seqMode === 'increasing')) {
444
445
  seq = rowRest._index + 1;
445
446
  }
446
447
  else {
@@ -465,14 +466,14 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
465
466
  isExpandTree = !!treeExpandedFlag && rowChildren && rowChildren.length > 0 && !!treeExpandedMaps[rowid];
466
467
  }
467
468
  // 拖拽行事件
468
- if (rowOpts.drag && (!treeConfig || transform)) {
469
+ if (rowOpts.drag && !isRowGroupStatus && (!treeConfig || transform)) {
469
470
  trOn.dragstart = $xeTable.handleRowDragDragstartEvent;
470
471
  trOn.dragend = $xeTable.handleRowDragDragendEvent;
471
472
  trOn.dragover = $xeTable.handleRowDragDragoverEvent;
472
473
  }
473
474
  const trClass = [
474
475
  'vxe-body--row',
475
- treeConfig ? `row--level-${rowLevel}` : '',
476
+ isDeepRow ? `row--level-${rowLevel}` : '',
476
477
  {
477
478
  'row--stripe': stripe && (_rowIndex + 1) % 2 === 0,
478
479
  'is--new': isNewRow,
@@ -481,12 +482,13 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
481
482
  'row--new': isNewRow && (editOpts.showStatus || editOpts.showInsertStatus),
482
483
  'row--radio': radioOpts.highlight && selectRadioRow === row,
483
484
  'row--checked': checkboxOpts.highlight && $xeTable.isCheckedByCheckboxRow(row),
484
- 'row--pending': !!pendingRowFlag && !!pendingRowMaps[rowid]
485
+ 'row--pending': !!pendingRowFlag && !!pendingRowMaps[rowid],
486
+ 'row--group': hasRowGroupAggregate
485
487
  },
486
488
  rowClassName ? (XEUtils.isFunction(rowClassName) ? rowClassName(params) : rowClassName) : ''
487
489
  ];
488
490
  const tdVNs = tableColumn.map((column, $columnIndex) => {
489
- return renderTdColumn(h, _vm, seq, rowid, fixedType, isOptimizeMode, rowLevel, row, rowIndex, $rowIndex, _rowIndex, column, $columnIndex, tableColumn, tableData);
491
+ return renderTdColumn(h, $xeTable, seq, rowid, fixedType, isOptimizeMode, rowLevel, row, rowIndex, $rowIndex, _rowIndex, column, $columnIndex, tableColumn, tableData);
490
492
  });
491
493
  rows.push(!isColLoading && (columnOpts.drag && columnDragOpts.animation)
492
494
  ? h('transition-group', {
@@ -499,7 +501,7 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
499
501
  rowid
500
502
  },
501
503
  style: rowStyle ? (XEUtils.isFunction(rowStyle) ? rowStyle(params) : rowStyle) : undefined,
502
- key: rowKey || scrollXLoad || scrollYLoad || rowOpts.useKey || rowOpts.drag || columnOpts.drag || treeConfig ? rowid : $rowIndex,
504
+ key: rowKey || scrollXLoad || scrollYLoad || rowOpts.useKey || rowOpts.drag || columnOpts.drag || isRowGroupStatus || treeConfig ? rowid : $rowIndex,
503
505
  nativeOn: trOn
504
506
  }, tdVNs)
505
507
  : h('tr', {
@@ -508,7 +510,7 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
508
510
  rowid
509
511
  },
510
512
  style: rowStyle ? (XEUtils.isFunction(rowStyle) ? rowStyle(params) : rowStyle) : undefined,
511
- key: rowKey || scrollXLoad || scrollYLoad || rowOpts.useKey || rowOpts.drag || columnOpts.drag || treeConfig ? rowid : $rowIndex,
513
+ key: rowKey || scrollXLoad || scrollYLoad || rowOpts.useKey || rowOpts.drag || columnOpts.drag || isRowGroupStatus || treeConfig ? rowid : $rowIndex,
512
514
  on: trOn
513
515
  }, tdVNs));
514
516
  // 如果行被展开了
@@ -542,9 +544,40 @@ function renderRows(h, _vm, fixedType, isOptimizeMode, tableData, tableColumn) {
542
544
  if (treeConfig) {
543
545
  cellStyle.paddingLeft = `${(rowLevel * treeOpts.indent) + 30}px`;
544
546
  }
545
- const { showOverflow } = expandColumn;
547
+ const { showOverflow } = expandColumn || {};
548
+ const colid = expandColumn.id;
549
+ const colRest = fullColumnIdData[colid] || {};
546
550
  const hasEllipsis = (XEUtils.isUndefined(showOverflow) || XEUtils.isNull(showOverflow)) ? isAllOverflow : showOverflow;
547
- const expandParams = { $table: $xeTable, seq, column: expandColumn, fixed: fixedType, type: renderType, level: rowLevel, row, rowIndex, $rowIndex, _rowIndex };
551
+ let columnIndex = -1;
552
+ let $columnIndex = -1;
553
+ let _columnIndex = -1;
554
+ if (colRest) {
555
+ columnIndex = colRest.index;
556
+ $columnIndex = colRest.$index;
557
+ _columnIndex = colRest._index;
558
+ }
559
+ const expandParams = {
560
+ $grid: $xeGrid,
561
+ $table: $xeTable,
562
+ seq,
563
+ column: expandColumn,
564
+ columnIndex,
565
+ $columnIndex,
566
+ _columnIndex,
567
+ fixed: fixedType,
568
+ type: renderType,
569
+ level: rowLevel,
570
+ row,
571
+ rowid,
572
+ rowIndex,
573
+ $rowIndex,
574
+ _rowIndex,
575
+ isHidden: false,
576
+ isEdit: false,
577
+ visibleData: [],
578
+ data: [],
579
+ items: []
580
+ };
548
581
  rows.push(h('tr', {
549
582
  class: ['vxe-body--expanded-row', {
550
583
  'is--padding': padding