vxe-table 4.13.0 → 4.13.2

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 (57) hide show
  1. package/es/grid/src/grid.js +0 -1
  2. package/es/index.css +1 -1
  3. package/es/index.min.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/module/filter/hook.js +32 -7
  7. package/es/table/module/filter/panel.js +47 -20
  8. package/es/table/module/menu/hook.js +1 -1
  9. package/es/table/src/table.js +40 -16
  10. package/es/table/src/util.js +2 -1
  11. package/es/table/style.css +18 -0
  12. package/es/table/style.min.css +1 -1
  13. package/es/ui/index.js +1 -1
  14. package/es/ui/src/log.js +1 -1
  15. package/es/vxe-table/style.css +18 -0
  16. package/es/vxe-table/style.min.css +1 -1
  17. package/lib/grid/src/grid.js +0 -1
  18. package/lib/grid/src/grid.min.js +1 -1
  19. package/lib/index.css +1 -1
  20. package/lib/index.min.css +1 -1
  21. package/lib/index.umd.js +87 -30
  22. package/lib/index.umd.min.js +1 -1
  23. package/lib/style.css +1 -1
  24. package/lib/style.min.css +1 -1
  25. package/lib/table/module/filter/hook.js +35 -6
  26. package/lib/table/module/filter/hook.min.js +1 -1
  27. package/lib/table/module/filter/panel.js +37 -8
  28. package/lib/table/module/filter/panel.min.js +1 -1
  29. package/lib/table/module/menu/hook.js +1 -1
  30. package/lib/table/module/menu/hook.min.js +1 -1
  31. package/lib/table/src/table.js +863 -12305
  32. package/lib/table/src/table.min.js +1 -1
  33. package/lib/table/src/util.js +2 -1
  34. package/lib/table/src/util.min.js +1 -1
  35. package/lib/table/style/style.css +18 -0
  36. package/lib/table/style/style.min.css +1 -1
  37. package/lib/ui/index.js +1 -1
  38. package/lib/ui/index.min.js +1 -1
  39. package/lib/ui/src/log.js +1 -1
  40. package/lib/ui/src/log.min.js +1 -1
  41. package/lib/vxe-table/style/style.css +18 -0
  42. package/lib/vxe-table/style/style.min.css +1 -1
  43. package/package.json +2 -2
  44. package/packages/grid/src/grid.ts +0 -1
  45. package/packages/table/module/filter/hook.ts +29 -7
  46. package/packages/table/module/filter/panel.ts +52 -20
  47. package/packages/table/module/menu/hook.ts +1 -1
  48. package/packages/table/src/table.ts +41 -17
  49. package/packages/table/src/util.ts +2 -1
  50. package/styles/components/table-module/filter.scss +16 -0
  51. package/styles/components/table.scss +6 -1
  52. /package/es/{iconfont.1744252965278.ttf → iconfont.1744427547299.ttf} +0 -0
  53. /package/es/{iconfont.1744252965278.woff → iconfont.1744427547299.woff} +0 -0
  54. /package/es/{iconfont.1744252965278.woff2 → iconfont.1744427547299.woff2} +0 -0
  55. /package/lib/{iconfont.1744252965278.ttf → iconfont.1744427547299.ttf} +0 -0
  56. /package/lib/{iconfont.1744252965278.woff → iconfont.1744427547299.woff} +0 -0
  57. /package/lib/{iconfont.1744252965278.woff2 → iconfont.1744427547299.woff2} +0 -0
@@ -2,7 +2,7 @@ import { nextTick } from 'vue';
2
2
  import XEUtils from 'xe-utils';
3
3
  import { VxeUI } from '../../../ui';
4
4
  import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util';
5
- import { toCssUnit, triggerEvent } from '../../../ui/src/dom';
5
+ import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom';
6
6
  import { isEnableConf } from '../../../ui/src/utils';
7
7
  const { renderer, hooks } = VxeUI;
8
8
  const tableFilterMethodKeys = ['openFilter', 'setFilter', 'clearFilter', 'saveFilterPanel', 'resetFilterPanel', 'getCheckedFilters', 'updateFilterOptionStatus'];
@@ -67,6 +67,9 @@ hooks.add('tableFilterModule', {
67
67
  }
68
68
  else {
69
69
  const el = refElem.value;
70
+ const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode();
71
+ const filterOpts = computeFilterOpts.value;
72
+ const { transfer } = filterOpts;
70
73
  const tableRect = el.getBoundingClientRect();
71
74
  const btnElem = evnt.currentTarget;
72
75
  const { filters, filterMultiple, filterRender } = column;
@@ -98,23 +101,45 @@ hooks.add('tableFilterModule', {
98
101
  return;
99
102
  }
100
103
  const tableFilter = refTableFilter.value;
101
- const filterWrapperElem = tableFilter ? tableFilter.$el : null;
104
+ const filterWrapperElem = tableFilter ? tableFilter.getRefMaps().refElem.value : null;
102
105
  if (!filterWrapperElem) {
103
106
  return;
104
107
  }
105
108
  const btnRect = btnElem.getBoundingClientRect();
106
- const filterWidth = filterWrapperElem.offsetWidth;
107
109
  const filterHeadElem = filterWrapperElem.querySelector('.vxe-table--filter-header');
108
110
  const filterFootElem = filterWrapperElem.querySelector('.vxe-table--filter-footer');
111
+ const filterWidth = filterWrapperElem.offsetWidth;
109
112
  const centerWidth = filterWidth / 2;
110
- const left = btnRect.left - tableRect.left - centerWidth;
111
- const top = btnRect.top - tableRect.top + btnElem.clientHeight;
112
- // 判断面板不能大于表格高度
113
- const maxHeight = Math.max(40, el.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14);
113
+ let left = 0;
114
+ let top = 0;
115
+ let maxHeight = 0;
116
+ if (transfer) {
117
+ left = btnRect.left - centerWidth + scrollLeft;
118
+ top = btnRect.top + btnElem.clientHeight + scrollTop;
119
+ maxHeight = Math.min(Math.max(tableRect.height, Math.floor(visibleHeight / 2)), Math.max(80, visibleHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 28));
120
+ if (left < 16) {
121
+ left = 16;
122
+ }
123
+ else if (left > (visibleWidth - filterWidth - 16)) {
124
+ left = visibleWidth - filterWidth - 16;
125
+ }
126
+ }
127
+ else {
128
+ left = btnRect.left - tableRect.left - centerWidth;
129
+ top = btnRect.top - tableRect.top + btnElem.clientHeight;
130
+ maxHeight = Math.max(40, el.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14);
131
+ if (left < 1) {
132
+ left = 1;
133
+ }
134
+ else if (left > (el.clientWidth - filterWidth - 1)) {
135
+ left = el.clientWidth - filterWidth - 1;
136
+ }
137
+ }
114
138
  filterStore.style = {
115
139
  top: toCssUnit(top),
116
140
  left: toCssUnit(left)
117
141
  };
142
+ // 判断面板不能大于表格高度
118
143
  filterStore.maxHeight = maxHeight;
119
144
  });
120
145
  }
@@ -1,18 +1,30 @@
1
- import { defineComponent, h, computed, inject } from 'vue';
1
+ import { defineComponent, h, ref, computed, inject, Teleport } from 'vue';
2
2
  import { VxeUI } from '../../../ui';
3
3
  import { formatText, isEnableConf } from '../../../ui/src/utils';
4
4
  import { getPropClass } from '../../../ui/src/dom';
5
5
  import { getSlotVNs } from '../../../ui/src/vn';
6
+ import XEUtils from 'xe-utils';
6
7
  const { getI18n, getIcon, renderer } = VxeUI;
7
8
  export default defineComponent({
8
9
  name: 'VxeTableFilterPanel',
9
10
  props: {
10
11
  filterStore: Object
11
12
  },
12
- setup(props) {
13
+ setup(props, context) {
14
+ const xID = XEUtils.uniqueId();
13
15
  const $xeTable = inject('$xeTable', {});
14
16
  const { reactData: tableReactData, internalData: tableInternalData, getComputeMaps } = $xeTable;
15
17
  const { computeFilterOpts } = getComputeMaps();
18
+ const refElem = ref();
19
+ const refMaps = {
20
+ refElem
21
+ };
22
+ const $xeFilterPanel = {
23
+ xID,
24
+ props,
25
+ context,
26
+ getRefMaps: () => refMaps
27
+ };
16
28
  const computeHasCheckOption = computed(() => {
17
29
  const { filterStore } = props;
18
30
  return filterStore && filterStore.options.some((option) => option.checked);
@@ -66,7 +78,7 @@ export default defineComponent({
66
78
  /*************************
67
79
  * Publish methods
68
80
  *************************/
69
- const $panel = {
81
+ const filterPanelMethods = {
70
82
  changeRadioOption,
71
83
  changeMultipleOption,
72
84
  changeAllOption,
@@ -74,12 +86,13 @@ export default defineComponent({
74
86
  confirmFilter,
75
87
  resetFilter
76
88
  };
89
+ Object.assign($xeFilterPanel, filterPanelMethods);
77
90
  const renderOptions = (filterRender, compConf) => {
78
91
  const { filterStore } = props;
79
92
  const { column, multiple, maxHeight } = filterStore;
80
93
  const slots = column ? column.slots : null;
81
94
  const filterSlot = slots ? slots.filter : null;
82
- const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable });
95
+ const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable });
83
96
  const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null;
84
97
  if (filterSlot) {
85
98
  return [
@@ -198,23 +211,37 @@ export default defineComponent({
198
211
  const filterRender = column ? column.filterRender : null;
199
212
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null;
200
213
  const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : '';
201
- const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable });
214
+ const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable });
215
+ const tableProps = $xeTable.props;
216
+ const { computeSize } = $xeTable.getComputeMaps();
217
+ const vSize = computeSize.value;
202
218
  const filterOpts = computeFilterOpts.value;
203
- const { destroyOnClose } = filterOpts;
204
- return h('div', {
205
- class: [
206
- 'vxe-table--filter-wrapper',
207
- 'filter--prevent-default',
208
- getPropClass(filterClassName, params),
209
- {
210
- 'is--animat': $xeTable.props.animat,
211
- 'is--multiple': multiple,
212
- 'is--active': visible
213
- }
214
- ],
215
- style: filterStore.style
216
- }, initStore.filter && (destroyOnClose ? visible : true) && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : []);
219
+ const { transfer, destroyOnClose } = filterOpts;
220
+ return h(Teleport, {
221
+ to: 'body',
222
+ disabled: !transfer
223
+ }, [
224
+ h('div', {
225
+ ref: refElem,
226
+ class: [
227
+ 'vxe-table--filter-wrapper',
228
+ 'filter--prevent-default',
229
+ getPropClass(filterClassName, params),
230
+ {
231
+ [`size--${vSize}`]: vSize,
232
+ 'is--animat': tableProps.animat,
233
+ 'is--multiple': multiple,
234
+ 'is--active': visible
235
+ }
236
+ ],
237
+ style: filterStore.style
238
+ }, initStore.filter && (destroyOnClose ? visible : true) && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : [])
239
+ ]);
217
240
  };
218
- return renderVN;
241
+ $xeFilterPanel.renderVN = renderVN;
242
+ return $xeFilterPanel;
243
+ },
244
+ render() {
245
+ return this.renderVN();
219
246
  }
220
247
  });
@@ -225,7 +225,7 @@ hooks.add('tableMenuModule', {
225
225
  }
226
226
  }
227
227
  }
228
- if (tableFilter && !getEventTargetNode(evnt, tableFilter.$el).flag) {
228
+ if (tableFilter && !getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value).flag) {
229
229
  $xeTable.closeFilter();
230
230
  }
231
231
  menuMethods.closeMenu();
@@ -237,6 +237,7 @@ export default defineComponent({
237
237
  mergeBodyFlag: 1,
238
238
  mergeFootFlag: 1,
239
239
  rowHeightStore: {
240
+ large: 52,
240
241
  default: 48,
241
242
  medium: 44,
242
243
  small: 40,
@@ -2832,7 +2833,12 @@ export default defineComponent({
2832
2833
  $xeTable.checkSelectionStatus();
2833
2834
  return new Promise(resolve => {
2834
2835
  nextTick()
2835
- .then(() => $xeTable.recalculate())
2836
+ .then(() => handleRecalculateLayout(false))
2837
+ .then(() => {
2838
+ calcCellHeight();
2839
+ updateRowOffsetTop();
2840
+ return handleRecalculateLayout(false);
2841
+ })
2836
2842
  .then(() => {
2837
2843
  let targetScrollLeft = lastScrollLeft;
2838
2844
  let targetScrollTop = lastScrollTop;
@@ -2846,8 +2852,7 @@ export default defineComponent({
2846
2852
  targetScrollTop = 0;
2847
2853
  }
2848
2854
  reactData.isRowLoading = false;
2849
- calcCellHeight();
2850
- updateRowOffsetTop();
2855
+ handleRecalculateLayout(false);
2851
2856
  // 是否变更虚拟滚动
2852
2857
  if (oldScrollYLoad === sYLoad) {
2853
2858
  restoreScrollLocation($xeTable, targetScrollLeft, targetScrollTop)
@@ -5276,12 +5281,10 @@ export default defineComponent({
5276
5281
  closeFilter() {
5277
5282
  const { filterStore } = reactData;
5278
5283
  const { column, visible } = filterStore;
5279
- Object.assign(filterStore, {
5280
- isAllSelected: false,
5281
- isIndeterminate: false,
5282
- options: [],
5283
- visible: false
5284
- });
5284
+ filterStore.isAllSelected = false;
5285
+ filterStore.isIndeterminate = false;
5286
+ filterStore.options = [];
5287
+ filterStore.visible = false;
5285
5288
  if (visible) {
5286
5289
  dispatchEvent('filter-visible', {
5287
5290
  column,
@@ -6037,7 +6040,7 @@ export default defineComponent({
6037
6040
  if (getEventTargetNode(evnt, el, 'vxe-cell--filter').flag) {
6038
6041
  // 如果点击了筛选按钮
6039
6042
  }
6040
- else if (getEventTargetNode(evnt, tableFilter.$el).flag) {
6043
+ else if (getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value).flag) {
6041
6044
  // 如果点击筛选容器
6042
6045
  }
6043
6046
  else {
@@ -8132,6 +8135,10 @@ export default defineComponent({
8132
8135
  const currentColumnOpts = computeCurrentColumnOpts.value;
8133
8136
  const beforeRowMethod = currentColumnOpts.beforeSelectMethod || columnOpts.currentMethod;
8134
8137
  const { column: newValue } = params;
8138
+ const { trigger } = currentColumnOpts;
8139
+ if (trigger === 'manual') {
8140
+ return;
8141
+ }
8135
8142
  const isChange = oldValue !== newValue;
8136
8143
  if (!beforeRowMethod || beforeRowMethod({ column: newValue, $table: $xeTable })) {
8137
8144
  $xeTable.setCurrentColumn(newValue);
@@ -8149,6 +8156,10 @@ export default defineComponent({
8149
8156
  const currentRowOpts = computeCurrentRowOpts.value;
8150
8157
  const beforeRowMethod = currentRowOpts.beforeSelectMethod || rowOpts.currentMethod;
8151
8158
  const { row: newValue } = params;
8159
+ const { trigger } = currentRowOpts;
8160
+ if (trigger === 'manual') {
8161
+ return;
8162
+ }
8152
8163
  const isChange = oldValue !== newValue;
8153
8164
  if (!beforeRowMethod || beforeRowMethod({ row: newValue, $table: $xeTable })) {
8154
8165
  $xeTable.setCurrentRow(newValue);
@@ -8196,10 +8207,10 @@ export default defineComponent({
8196
8207
  * 展开树节点事件
8197
8208
  */
8198
8209
  triggerTreeExpandEvent(evnt, params) {
8199
- const { treeExpandLazyLoadedMaps } = internalData;
8210
+ const { treeExpandLazyLoadedMaps, treeEATime } = internalData;
8200
8211
  const treeOpts = computeTreeOpts.value;
8201
8212
  const { row, column } = params;
8202
- const { lazy, trigger } = treeOpts;
8213
+ const { lazy, trigger, accordion } = treeOpts;
8203
8214
  if (trigger === 'manual') {
8204
8215
  return;
8205
8216
  }
@@ -8209,7 +8220,17 @@ export default defineComponent({
8209
8220
  const expanded = !$xeTable.isTreeExpandByRow(row);
8210
8221
  const columnIndex = $xeTable.getColumnIndex(column);
8211
8222
  const $columnIndex = $xeTable.getVMColumnIndex(column);
8212
- $xeTable.setTreeExpand(row, expanded);
8223
+ if (treeEATime) {
8224
+ clearTimeout(treeEATime);
8225
+ }
8226
+ $xeTable.setTreeExpand(row, expanded).then(() => {
8227
+ if (accordion) {
8228
+ internalData.treeEATime = setTimeout(() => {
8229
+ internalData.treeEATime = undefined;
8230
+ $xeTable.scrollToRow(row);
8231
+ }, 20);
8232
+ }
8233
+ });
8213
8234
  dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt);
8214
8235
  }
8215
8236
  },
@@ -9011,6 +9032,9 @@ export default defineComponent({
9011
9032
  direction }, params);
9012
9033
  updateRowExpandStyle();
9013
9034
  checkLastSyncScroll(isRollX, isRollY);
9035
+ if (isRollX) {
9036
+ $xeTable.closeFilter();
9037
+ }
9014
9038
  if (rowOpts.isHover || highlightHoverRow) {
9015
9039
  $xeTable.clearHoverRow();
9016
9040
  }
@@ -9456,7 +9480,8 @@ export default defineComponent({
9456
9480
  if (isScrollXBig && mouseOpts.area) {
9457
9481
  errLog('vxe.error.notProp', ['mouse-config.area']);
9458
9482
  }
9459
- nextTick(() => {
9483
+ calcScrollbar();
9484
+ return nextTick().then(() => {
9460
9485
  updateStyle();
9461
9486
  });
9462
9487
  }
@@ -9553,6 +9578,7 @@ export default defineComponent({
9553
9578
  if (isScrollYBig && mouseOpts.area) {
9554
9579
  errLog('vxe.error.notProp', ['mouse-config.area']);
9555
9580
  }
9581
+ calcScrollbar();
9556
9582
  return nextTick().then(() => {
9557
9583
  updateStyle();
9558
9584
  });
@@ -10432,8 +10458,6 @@ export default defineComponent({
10432
10458
  if (columnOpts.drag || rowOpts.drag || customOpts.allowSort) {
10433
10459
  initTpImg();
10434
10460
  }
10435
- ;
10436
- window.aa = $xeTable;
10437
10461
  nextTick(() => {
10438
10462
  const { data, exportConfig, importConfig, treeConfig, showOverflow, highlightCurrentRow, highlightCurrentColumn } = props;
10439
10463
  const { scrollXStore, scrollYStore } = internalData;
@@ -351,7 +351,8 @@ export function getRootColumn($xeTable, column) {
351
351
  const lineOffsetSizes = {
352
352
  mini: 3,
353
353
  small: 2,
354
- medium: 1
354
+ medium: 1,
355
+ large: 0
355
356
  };
356
357
  const countTreeExpand = (prevRow, params) => {
357
358
  let count = 1;
@@ -1467,9 +1467,11 @@
1467
1467
  position: absolute;
1468
1468
  top: 0;
1469
1469
  min-width: 100px;
1470
+ font-size: var(--vxe-ui-font-size-default);
1470
1471
  border-radius: var(--vxe-ui-border-radius);
1471
1472
  background-color: var(--vxe-ui-layout-background-color);
1472
1473
  border: 1px solid var(--vxe-ui-base-popup-border-color);
1474
+ color: var(--vxe-ui-font-color);
1473
1475
  box-shadow: var(--vxe-ui-base-popup-box-shadow);
1474
1476
  z-index: 10;
1475
1477
  }
@@ -1579,6 +1581,16 @@
1579
1581
  vertical-align: middle;
1580
1582
  }
1581
1583
 
1584
+ .vxe-table--filter-wrapper.size--medium {
1585
+ font-size: var(--vxe-ui-font-size-medium);
1586
+ }
1587
+ .vxe-table--filter-wrapper.size--small {
1588
+ font-size: var(--vxe-ui-font-size-small);
1589
+ }
1590
+ .vxe-table--filter-wrapper.size--mini {
1591
+ font-size: var(--vxe-ui-font-size-mini);
1592
+ }
1593
+
1582
1594
  .vxe-table--context-menu-wrapper {
1583
1595
  display: none;
1584
1596
  }
@@ -2997,6 +3009,9 @@
2997
3009
  user-select: none;
2998
3010
  cursor: pointer;
2999
3011
  }
3012
+ .vxe-table--render-default .vxe-tree--btn-wrapper > i {
3013
+ background-color: var(--vxe-ui-layout-background-color);
3014
+ }
3000
3015
  .vxe-table--render-default .vxe-tree--node-btn {
3001
3016
  display: block;
3002
3017
  color: var(--vxe-ui-font-lighten-color);
@@ -3017,6 +3032,9 @@
3017
3032
  .vxe-table--render-default .vxe-body--column.col--cs-height, .vxe-table--render-default .vxe-body--column.col--rs-height, .vxe-table--render-default .vxe-body--column.col--auto-height {
3018
3033
  overflow: hidden;
3019
3034
  }
3035
+ .vxe-table--render-default .vxe-body--column.col--cs-height.col--tree-node, .vxe-table--render-default .vxe-body--column.col--rs-height.col--tree-node, .vxe-table--render-default .vxe-body--column.col--auto-height.col--tree-node {
3036
+ overflow: unset;
3037
+ }
3020
3038
  .vxe-table--render-default .vxe-body--column.col--cs-height > .vxe-cell, .vxe-table--render-default .vxe-body--column.col--rs-height > .vxe-cell, .vxe-table--render-default .vxe-body--column.col--auto-height > .vxe-cell {
3021
3039
  overflow: hidden;
3022
3040
  }