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
 
8
8
  import type { TableFilterMethods, TableFilterPrivateMethods } from '../../../../types'
@@ -76,6 +76,9 @@ hooks.add('tableFilterModule', {
76
76
  filterStore.visible = false
77
77
  } else {
78
78
  const el = refElem.value
79
+ const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
80
+ const filterOpts = computeFilterOpts.value
81
+ const { transfer } = filterOpts
79
82
  const tableRect = el.getBoundingClientRect()
80
83
  const btnElem = evnt.currentTarget as HTMLDivElement
81
84
  const { filters, filterMultiple, filterRender } = column
@@ -107,23 +110,42 @@ hooks.add('tableFilterModule', {
107
110
  return
108
111
  }
109
112
  const tableFilter = refTableFilter.value
110
- const filterWrapperElem = tableFilter ? tableFilter.$el as HTMLDivElement : null
113
+ const filterWrapperElem = tableFilter ? tableFilter.getRefMaps().refElem.value as HTMLDivElement : null
111
114
  if (!filterWrapperElem) {
112
115
  return
113
116
  }
114
117
  const btnRect = btnElem.getBoundingClientRect()
115
- const filterWidth = filterWrapperElem.offsetWidth
116
118
  const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
117
119
  const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
120
+ const filterWidth = filterWrapperElem.offsetWidth
118
121
  const centerWidth = filterWidth / 2
119
- const left = btnRect.left - tableRect.left - centerWidth
120
- const top = btnRect.top - tableRect.top + btnElem.clientHeight
121
- // 判断面板不能大于表格高度
122
- const maxHeight = Math.max(40, el.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
122
+ let left = 0
123
+ let top = 0
124
+ let maxHeight = 0
125
+ if (transfer) {
126
+ left = btnRect.left - centerWidth + scrollLeft
127
+ top = btnRect.top + btnElem.clientHeight + scrollTop
128
+ 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))
129
+ if (left < 16) {
130
+ left = 16
131
+ } else if (left > (visibleWidth - filterWidth - 16)) {
132
+ left = visibleWidth - filterWidth - 16
133
+ }
134
+ } else {
135
+ left = btnRect.left - tableRect.left - centerWidth
136
+ top = btnRect.top - tableRect.top + btnElem.clientHeight
137
+ maxHeight = Math.max(40, el.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
138
+ if (left < 1) {
139
+ left = 1
140
+ } else if (left > (el.clientWidth - filterWidth - 1)) {
141
+ left = el.clientWidth - filterWidth - 1
142
+ }
143
+ }
123
144
  filterStore.style = {
124
145
  top: toCssUnit(top),
125
146
  left: toCssUnit(left)
126
147
  }
148
+ // 判断面板不能大于表格高度
127
149
  filterStore.maxHeight = maxHeight
128
150
  })
129
151
  }
@@ -1,8 +1,9 @@
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
 
7
8
  import type { VxeTableConstructor, VxeTableMethods, VxeTablePrivateMethods } from '../../../../types'
8
9
 
@@ -13,11 +14,26 @@ export default defineComponent({
13
14
  props: {
14
15
  filterStore: Object as any
15
16
  },
16
- setup (props) {
17
+ setup (props, context) {
18
+ const xID = XEUtils.uniqueId()
19
+
17
20
  const $xeTable = inject('$xeTable', {} as VxeTableConstructor & VxeTableMethods & VxeTablePrivateMethods)
18
21
  const { reactData: tableReactData, internalData: tableInternalData, getComputeMaps } = $xeTable
19
22
  const { computeFilterOpts } = getComputeMaps()
20
23
 
24
+ const refElem = ref<HTMLDivElement>()
25
+
26
+ const refMaps = {
27
+ refElem
28
+ }
29
+
30
+ const $xeFilterPanel: any = {
31
+ xID,
32
+ props,
33
+ context,
34
+ getRefMaps: () => refMaps
35
+ }
36
+
21
37
  const computeHasCheckOption = computed(() => {
22
38
  const { filterStore } = props
23
39
  return filterStore && filterStore.options.some((option: any) => option.checked)
@@ -78,7 +94,7 @@ export default defineComponent({
78
94
  * Publish methods
79
95
  *************************/
80
96
 
81
- const $panel = {
97
+ const filterPanelMethods = {
82
98
  changeRadioOption,
83
99
  changeMultipleOption,
84
100
  changeAllOption,
@@ -86,13 +102,14 @@ export default defineComponent({
86
102
  confirmFilter,
87
103
  resetFilter
88
104
  }
105
+ Object.assign($xeFilterPanel, filterPanelMethods)
89
106
 
90
107
  const renderOptions = (filterRender: any, compConf: any) => {
91
108
  const { filterStore } = props
92
109
  const { column, multiple, maxHeight } = filterStore
93
110
  const slots = column ? column.slots : null
94
111
  const filterSlot = slots ? slots.filter : null
95
- const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable })
112
+ const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
96
113
  const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null
97
114
  if (filterSlot) {
98
115
  return [
@@ -212,24 +229,39 @@ export default defineComponent({
212
229
  const filterRender = column ? column.filterRender : null
213
230
  const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
214
231
  const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : ''
215
- const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable })
232
+ const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
233
+ const tableProps = $xeTable.props
234
+ const { computeSize } = $xeTable.getComputeMaps()
235
+ const vSize = computeSize.value
216
236
  const filterOpts = computeFilterOpts.value
217
- const { destroyOnClose } = filterOpts
218
- return h('div', {
219
- class: [
220
- 'vxe-table--filter-wrapper',
221
- 'filter--prevent-default',
222
- getPropClass(filterClassName, params),
223
- {
224
- 'is--animat': $xeTable.props.animat,
225
- 'is--multiple': multiple,
226
- 'is--active': visible
227
- }
228
- ],
229
- style: filterStore.style
230
- }, initStore.filter && (destroyOnClose ? visible : true) && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : [])
237
+ const { transfer, destroyOnClose } = filterOpts
238
+ return h(Teleport, {
239
+ to: 'body',
240
+ disabled: !transfer
241
+ }, [
242
+ h('div', {
243
+ ref: refElem,
244
+ class: [
245
+ 'vxe-table--filter-wrapper',
246
+ 'filter--prevent-default',
247
+ getPropClass(filterClassName, params),
248
+ {
249
+ [`size--${vSize}`]: vSize,
250
+ 'is--animat': tableProps.animat,
251
+ 'is--multiple': multiple,
252
+ 'is--active': visible
253
+ }
254
+ ],
255
+ style: filterStore.style
256
+ }, initStore.filter && (destroyOnClose ? visible : true) && column ? renderOptions(filterRender, compConf).concat(renderFooters()) : [])
257
+ ])
231
258
  }
232
259
 
233
- return renderVN
260
+ $xeFilterPanel.renderVN = renderVN
261
+
262
+ return $xeFilterPanel
263
+ },
264
+ render () {
265
+ return this.renderVN()
234
266
  }
235
267
  })
@@ -224,7 +224,7 @@ hooks.add('tableMenuModule', {
224
224
  }
225
225
  }
226
226
  }
227
- if (tableFilter && !getEventTargetNode(evnt, tableFilter.$el).flag) {
227
+ if (tableFilter && !getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value).flag) {
228
228
  $xeTable.closeFilter()
229
229
  }
230
230
  menuMethods.closeMenu()
@@ -251,6 +251,7 @@ export default defineComponent({
251
251
  mergeFootFlag: 1,
252
252
 
253
253
  rowHeightStore: {
254
+ large: 52,
254
255
  default: 48,
255
256
  medium: 44,
256
257
  small: 40,
@@ -401,7 +402,7 @@ export default defineComponent({
401
402
  const refCommTooltip = ref() as Ref<VxeTooltipInstance>
402
403
  const refValidTooltip = ref() as Ref<VxeTooltipInstance>
403
404
  const refTableMenu = ref() as Ref<any>
404
- const refTableFilter = ref() as Ref<ComponentPublicInstance>
405
+ const refTableFilter = ref() as Ref<any>
405
406
  const refTableCustom = ref() as Ref<ComponentPublicInstance>
406
407
 
407
408
  const refTableViewportElem = ref<HTMLDivElement>()
@@ -2974,7 +2975,12 @@ export default defineComponent({
2974
2975
  $xeTable.checkSelectionStatus()
2975
2976
  return new Promise<void>(resolve => {
2976
2977
  nextTick()
2977
- .then(() => $xeTable.recalculate())
2978
+ .then(() => handleRecalculateLayout(false))
2979
+ .then(() => {
2980
+ calcCellHeight()
2981
+ updateRowOffsetTop()
2982
+ return handleRecalculateLayout(false)
2983
+ })
2978
2984
  .then(() => {
2979
2985
  let targetScrollLeft = lastScrollLeft
2980
2986
  let targetScrollTop = lastScrollTop
@@ -2988,8 +2994,7 @@ export default defineComponent({
2988
2994
  targetScrollTop = 0
2989
2995
  }
2990
2996
  reactData.isRowLoading = false
2991
- calcCellHeight()
2992
- updateRowOffsetTop()
2997
+ handleRecalculateLayout(false)
2993
2998
  // 是否变更虚拟滚动
2994
2999
  if (oldScrollYLoad === sYLoad) {
2995
3000
  restoreScrollLocation($xeTable, targetScrollLeft, targetScrollTop)
@@ -5419,12 +5424,10 @@ export default defineComponent({
5419
5424
  closeFilter () {
5420
5425
  const { filterStore } = reactData
5421
5426
  const { column, visible } = filterStore
5422
- Object.assign(filterStore, {
5423
- isAllSelected: false,
5424
- isIndeterminate: false,
5425
- options: [],
5426
- visible: false
5427
- })
5427
+ filterStore.isAllSelected = false
5428
+ filterStore.isIndeterminate = false
5429
+ filterStore.options = []
5430
+ filterStore.visible = false
5428
5431
  if (visible) {
5429
5432
  dispatchEvent('filter-visible', {
5430
5433
  column,
@@ -6177,7 +6180,7 @@ export default defineComponent({
6177
6180
  if (tableFilter) {
6178
6181
  if (getEventTargetNode(evnt, el, 'vxe-cell--filter').flag) {
6179
6182
  // 如果点击了筛选按钮
6180
- } else if (getEventTargetNode(evnt, tableFilter.$el as HTMLDivElement).flag) {
6183
+ } else if (getEventTargetNode(evnt, tableFilter.getRefMaps().refElem.value as HTMLDivElement).flag) {
6181
6184
  // 如果点击筛选容器
6182
6185
  } else {
6183
6186
  if (!getEventTargetNode(evnt, document.body, 'vxe-table--ignore-clear').flag) {
@@ -8242,6 +8245,10 @@ export default defineComponent({
8242
8245
  const currentColumnOpts = computeCurrentColumnOpts.value
8243
8246
  const beforeRowMethod = currentColumnOpts.beforeSelectMethod || columnOpts.currentMethod as any
8244
8247
  const { column: newValue } = params
8248
+ const { trigger } = currentColumnOpts
8249
+ if (trigger === 'manual') {
8250
+ return
8251
+ }
8245
8252
  const isChange = oldValue !== newValue
8246
8253
  if (!beforeRowMethod || beforeRowMethod({ column: newValue, $table: $xeTable })) {
8247
8254
  $xeTable.setCurrentColumn(newValue)
@@ -8258,6 +8265,10 @@ export default defineComponent({
8258
8265
  const currentRowOpts = computeCurrentRowOpts.value
8259
8266
  const beforeRowMethod = currentRowOpts.beforeSelectMethod || rowOpts.currentMethod as any
8260
8267
  const { row: newValue } = params
8268
+ const { trigger } = currentRowOpts
8269
+ if (trigger === 'manual') {
8270
+ return
8271
+ }
8261
8272
  const isChange = oldValue !== newValue
8262
8273
  if (!beforeRowMethod || beforeRowMethod({ row: newValue, $table: $xeTable })) {
8263
8274
  $xeTable.setCurrentRow(newValue)
@@ -8304,10 +8315,10 @@ export default defineComponent({
8304
8315
  * 展开树节点事件
8305
8316
  */
8306
8317
  triggerTreeExpandEvent (evnt, params) {
8307
- const { treeExpandLazyLoadedMaps } = internalData
8318
+ const { treeExpandLazyLoadedMaps, treeEATime } = internalData
8308
8319
  const treeOpts = computeTreeOpts.value
8309
8320
  const { row, column } = params
8310
- const { lazy, trigger } = treeOpts
8321
+ const { lazy, trigger, accordion } = treeOpts
8311
8322
  if (trigger === 'manual') {
8312
8323
  return
8313
8324
  }
@@ -8317,7 +8328,17 @@ export default defineComponent({
8317
8328
  const expanded = !$xeTable.isTreeExpandByRow(row)
8318
8329
  const columnIndex = $xeTable.getColumnIndex(column)
8319
8330
  const $columnIndex = $xeTable.getVMColumnIndex(column)
8320
- $xeTable.setTreeExpand(row, expanded)
8331
+ if (treeEATime) {
8332
+ clearTimeout(treeEATime)
8333
+ }
8334
+ $xeTable.setTreeExpand(row, expanded).then(() => {
8335
+ if (accordion) {
8336
+ internalData.treeEATime = setTimeout(() => {
8337
+ internalData.treeEATime = undefined
8338
+ $xeTable.scrollToRow(row)
8339
+ }, 20)
8340
+ }
8341
+ })
8321
8342
  dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt)
8322
8343
  }
8323
8344
  },
@@ -9141,6 +9162,9 @@ export default defineComponent({
9141
9162
  }
9142
9163
  updateRowExpandStyle()
9143
9164
  checkLastSyncScroll(isRollX, isRollY)
9165
+ if (isRollX) {
9166
+ $xeTable.closeFilter()
9167
+ }
9144
9168
  if (rowOpts.isHover || highlightHoverRow) {
9145
9169
  $xeTable.clearHoverRow()
9146
9170
  }
@@ -9481,7 +9505,6 @@ export default defineComponent({
9481
9505
  }
9482
9506
  const isRollX = scrollLeft !== lastScrollLeft
9483
9507
  const isRollY = true
9484
-
9485
9508
  internalData.inVirtualScroll = true
9486
9509
  setScrollTop(bodyScrollElem, scrollTop)
9487
9510
  setScrollTop(leftScrollElem, scrollTop)
@@ -9592,7 +9615,8 @@ export default defineComponent({
9592
9615
  if (isScrollXBig && mouseOpts.area) {
9593
9616
  errLog('vxe.error.notProp', ['mouse-config.area'])
9594
9617
  }
9595
- nextTick(() => {
9618
+ calcScrollbar()
9619
+ return nextTick().then(() => {
9596
9620
  updateStyle()
9597
9621
  })
9598
9622
  }
@@ -9688,6 +9712,7 @@ export default defineComponent({
9688
9712
  if (isScrollYBig && mouseOpts.area) {
9689
9713
  errLog('vxe.error.notProp', ['mouse-config.area'])
9690
9714
  }
9715
+ calcScrollbar()
9691
9716
  return nextTick().then(() => {
9692
9717
  updateStyle()
9693
9718
  })
@@ -10600,7 +10625,6 @@ export default defineComponent({
10600
10625
  initTpImg()
10601
10626
  }
10602
10627
 
10603
- ;(window as any).aa = $xeTable
10604
10628
  nextTick(() => {
10605
10629
  const { data, exportConfig, importConfig, treeConfig, showOverflow, highlightCurrentRow, highlightCurrentColumn } = props
10606
10630
  const { scrollXStore, scrollYStore } = internalData
@@ -407,7 +407,8 @@ export function getRootColumn ($xeTable: VxeTableConstructor & VxeTablePrivateMe
407
407
  const lineOffsetSizes = {
408
408
  mini: 3,
409
409
  small: 2,
410
- medium: 1
410
+ medium: 1,
411
+ large: 0
411
412
  }
412
413
 
413
414
  const countTreeExpand = (prevRow: any, params: VxeTableDefines.CellRenderBodyParams) => {
@@ -33,9 +33,11 @@
33
33
  position: absolute;
34
34
  top: 0;
35
35
  min-width: 100px;
36
+ font-size: var(--vxe-ui-font-size-default);
36
37
  border-radius: var(--vxe-ui-border-radius);
37
38
  background-color: var(--vxe-ui-layout-background-color);
38
39
  border: 1px solid var(--vxe-ui-base-popup-border-color);
40
+ color: var(--vxe-ui-font-color);
39
41
  box-shadow: var(--vxe-ui-base-popup-box-shadow);
40
42
  z-index: 10;
41
43
  &:not(.is--multiple) {
@@ -110,3 +112,17 @@
110
112
  .vxe-table--filter-option {
111
113
  @include baseMixin.createCheckboxIcon();
112
114
  }
115
+
116
+
117
+
118
+ .vxe-table--filter-wrapper {
119
+ &.size--medium {
120
+ font-size: var(--vxe-ui-font-size-medium);
121
+ }
122
+ &.size--small {
123
+ font-size: var(--vxe-ui-font-size-small);
124
+ }
125
+ &.size--mini {
126
+ font-size: var(--vxe-ui-font-size-mini);
127
+ }
128
+ }
@@ -1617,10 +1617,12 @@
1617
1617
  height: 1em;
1618
1618
  text-align: center;
1619
1619
  transform: translateY(-50%);
1620
- // background-color: var(--vxe-ui-layout-background-color);
1621
1620
  z-index: 1;
1622
1621
  user-select: none;
1623
1622
  cursor: pointer;
1623
+ & > i {
1624
+ background-color: var(--vxe-ui-layout-background-color);
1625
+ }
1624
1626
  }
1625
1627
  .vxe-tree--node-btn {
1626
1628
  display: block;
@@ -1650,6 +1652,9 @@
1650
1652
  &.col--rs-height,
1651
1653
  &.col--auto-height {
1652
1654
  overflow: hidden;
1655
+ &.col--tree-node {
1656
+ overflow: unset;
1657
+ }
1653
1658
  & > .vxe-cell {
1654
1659
  overflow: hidden;
1655
1660
  }