vxe-table 3.15.0 → 3.15.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.
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/module/filter/mixin.js +31 -6
- package/es/table/module/filter/panel.js +173 -142
- package/es/table/src/methods.js +38 -13
- package/es/table/src/table.js +1 -0
- package/es/table/src/util.js +2 -1
- package/es/table/style.css +18 -0
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +18 -0
- package/es/vxe-table/style.min.css +1 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +237 -145
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/module/filter/mixin.js +34 -5
- package/lib/table/module/filter/mixin.min.js +1 -1
- package/lib/table/module/filter/panel.js +153 -122
- package/lib/table/module/filter/panel.min.js +1 -1
- package/lib/table/src/methods.js +43 -13
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/table.js +1 -0
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +2 -1
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +18 -0
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +1 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-table/style/style.css +18 -0
- package/lib/vxe-table/style/style.min.css +1 -1
- package/package.json +2 -2
- package/packages/table/module/filter/mixin.ts +28 -6
- package/packages/table/module/filter/panel.ts +178 -143
- package/packages/table/src/methods.ts +38 -13
- package/packages/table/src/table.ts +1 -0
- package/packages/table/src/util.ts +2 -1
- package/styles/components/table-module/filter.scss +16 -0
- package/styles/components/table.scss +6 -1
- /package/es/{iconfont.1744252945243.ttf → iconfont.1744428010256.ttf} +0 -0
- /package/es/{iconfont.1744252945243.woff → iconfont.1744428010256.woff} +0 -0
- /package/es/{iconfont.1744252945243.woff2 → iconfont.1744428010256.woff2} +0 -0
- /package/lib/{iconfont.1744252945243.ttf → iconfont.1744428010256.ttf} +0 -0
- /package/lib/{iconfont.1744252945243.woff → iconfont.1744428010256.woff} +0 -0
- /package/lib/{iconfont.1744252945243.woff2 → iconfont.1744428010256.woff2} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import XEUtils from 'xe-utils'
|
|
2
2
|
import { VxeUI } from '../../../ui'
|
|
3
3
|
import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
|
|
4
|
-
import { toCssUnit, triggerEvent } from '../../../ui/src/dom'
|
|
4
|
+
import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom'
|
|
5
5
|
import { isEnableConf } from '../../../ui/src/utils'
|
|
6
6
|
|
|
7
7
|
import type { VxeTableConstructor, VxeTableDefines, TableReactData, TableInternalData } from '../../../../types'
|
|
@@ -75,6 +75,9 @@ export default {
|
|
|
75
75
|
filterStore.visible = false
|
|
76
76
|
} else {
|
|
77
77
|
const el = $xeTable.$refs.refElem as HTMLDivElement
|
|
78
|
+
const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
|
|
79
|
+
const filterOpts = $xeTable.computeFilterOpts
|
|
80
|
+
const { transfer } = filterOpts
|
|
78
81
|
const tableRect = el.getBoundingClientRect()
|
|
79
82
|
const btnElem = evnt.currentTarget as HTMLDivElement
|
|
80
83
|
const { filters, filterMultiple, filterRender } = column
|
|
@@ -111,18 +114,37 @@ export default {
|
|
|
111
114
|
return
|
|
112
115
|
}
|
|
113
116
|
const btnRect = btnElem.getBoundingClientRect()
|
|
114
|
-
const filterWidth = filterWrapperElem.offsetWidth
|
|
115
117
|
const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
|
|
116
118
|
const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
|
|
119
|
+
const filterWidth = filterWrapperElem.offsetWidth
|
|
117
120
|
const centerWidth = filterWidth / 2
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
121
|
+
let left = 0
|
|
122
|
+
let top = 0
|
|
123
|
+
let maxHeight = 0
|
|
124
|
+
if (transfer) {
|
|
125
|
+
left = btnRect.left - centerWidth + scrollLeft
|
|
126
|
+
top = btnRect.top + btnElem.clientHeight + scrollTop
|
|
127
|
+
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))
|
|
128
|
+
if (left < 16) {
|
|
129
|
+
left = 16
|
|
130
|
+
} else if (left > (visibleWidth - filterWidth - 16)) {
|
|
131
|
+
left = visibleWidth - filterWidth - 16
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
left = btnRect.left - tableRect.left - centerWidth
|
|
135
|
+
top = btnRect.top - tableRect.top + btnElem.clientHeight
|
|
136
|
+
maxHeight = Math.max(40, el.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
|
|
137
|
+
if (left < 1) {
|
|
138
|
+
left = 1
|
|
139
|
+
} else if (left > (el.clientWidth - filterWidth - 1)) {
|
|
140
|
+
left = el.clientWidth - filterWidth - 1
|
|
141
|
+
}
|
|
142
|
+
}
|
|
122
143
|
filterStore.style = {
|
|
123
144
|
top: toCssUnit(top),
|
|
124
145
|
left: toCssUnit(left)
|
|
125
146
|
}
|
|
147
|
+
// 判断面板不能大于表格高度
|
|
126
148
|
filterStore.maxHeight = maxHeight
|
|
127
149
|
})
|
|
128
150
|
}
|
|
@@ -5,183 +5,218 @@ import { CreateElement } from 'vue'
|
|
|
5
5
|
|
|
6
6
|
import type { VxeTableConstructor, VxeTablePrivateMethods, TableInternalData } from '../../../../types'
|
|
7
7
|
|
|
8
|
-
const { getI18n, getIcon, renderer } = VxeUI
|
|
8
|
+
const { getI18n, getIcon, renderer, globalMixins } = VxeUI
|
|
9
|
+
|
|
10
|
+
function renderOptions ($xeFilterPanel: any, h: CreateElement, filterRender: any, compConf: any) {
|
|
11
|
+
const props = $xeFilterPanel
|
|
12
|
+
const $xeTable = $xeFilterPanel.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
|
|
13
|
+
const tableInternalData = $xeTable as unknown as TableInternalData
|
|
14
|
+
|
|
15
|
+
const { filterStore } = props
|
|
16
|
+
const { column, multiple, maxHeight } = filterStore
|
|
17
|
+
const slots = column ? column.slots : null
|
|
18
|
+
const filterSlot = slots ? slots.filter : null
|
|
19
|
+
const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
|
|
20
|
+
const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null
|
|
21
|
+
if (filterSlot) {
|
|
22
|
+
return [
|
|
23
|
+
h('div', {
|
|
24
|
+
class: 'vxe-table--filter-template',
|
|
25
|
+
style: maxHeight
|
|
26
|
+
? {
|
|
27
|
+
maxHeight: `${maxHeight}px`
|
|
28
|
+
}
|
|
29
|
+
: {}
|
|
30
|
+
}, $xeTable.callSlot(filterSlot, params, h))
|
|
31
|
+
]
|
|
32
|
+
} else if (rtFilter) {
|
|
33
|
+
return [
|
|
34
|
+
h('div', {
|
|
35
|
+
class: 'vxe-table--filter-template',
|
|
36
|
+
style: maxHeight
|
|
37
|
+
? {
|
|
38
|
+
maxHeight: `${maxHeight}px`
|
|
39
|
+
}
|
|
40
|
+
: {}
|
|
41
|
+
}, getSlotVNs(rtFilter.call($xeTable, h, filterRender, params)))
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
const isAllChecked = multiple ? filterStore.isAllSelected : !filterStore.options.some((item: any) => item._checked)
|
|
45
|
+
const isAllIndeterminate = multiple && filterStore.isIndeterminate
|
|
46
|
+
return [
|
|
47
|
+
h('ul', {
|
|
48
|
+
class: 'vxe-table--filter-header'
|
|
49
|
+
}, [
|
|
50
|
+
h('li', {
|
|
51
|
+
class: ['vxe-table--filter-option', {
|
|
52
|
+
'is--checked': isAllChecked,
|
|
53
|
+
'is--indeterminate': isAllIndeterminate
|
|
54
|
+
}],
|
|
55
|
+
attrs: {
|
|
56
|
+
title: getI18n(multiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter')
|
|
57
|
+
},
|
|
58
|
+
on: {
|
|
59
|
+
click: (evnt: MouseEvent) => {
|
|
60
|
+
$xeFilterPanel.changeAllOption(evnt, !filterStore.isAllSelected)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}, (multiple
|
|
64
|
+
? [
|
|
65
|
+
h('span', {
|
|
66
|
+
class: ['vxe-checkbox--icon', isAllIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isAllChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
: []).concat([
|
|
70
|
+
h('span', {
|
|
71
|
+
class: 'vxe-checkbox--label'
|
|
72
|
+
}, getI18n('vxe.table.allFilter'))
|
|
73
|
+
]))
|
|
74
|
+
]),
|
|
75
|
+
h('ul', {
|
|
76
|
+
class: 'vxe-table--filter-body',
|
|
77
|
+
style: maxHeight
|
|
78
|
+
? {
|
|
79
|
+
maxHeight: `${maxHeight}px`
|
|
80
|
+
}
|
|
81
|
+
: {}
|
|
82
|
+
}, filterStore.options.map((item: any) => {
|
|
83
|
+
const isChecked = item._checked
|
|
84
|
+
const isIndeterminate = false
|
|
85
|
+
return h('li', {
|
|
86
|
+
class: ['vxe-table--filter-option', {
|
|
87
|
+
'is--checked': isChecked
|
|
88
|
+
}],
|
|
89
|
+
attrs: {
|
|
90
|
+
title: item.label
|
|
91
|
+
},
|
|
92
|
+
on: {
|
|
93
|
+
click: (evnt: MouseEvent) => {
|
|
94
|
+
$xeFilterPanel.changeOption(evnt, !item._checked, item)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, (multiple
|
|
98
|
+
? [
|
|
99
|
+
h('span', {
|
|
100
|
+
class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
: []).concat([
|
|
104
|
+
h('span', {
|
|
105
|
+
class: 'vxe-checkbox--label'
|
|
106
|
+
}, formatText(item.label, 1))
|
|
107
|
+
]))
|
|
108
|
+
}))
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function renderFooter ($xeFilterPanel: any, h: CreateElement) {
|
|
113
|
+
const props = $xeFilterPanel
|
|
114
|
+
const $xeTable = $xeFilterPanel.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
|
|
115
|
+
|
|
116
|
+
const { filterStore } = props
|
|
117
|
+
const { column, multiple } = filterStore
|
|
118
|
+
const filterOpts = $xeTable.computeFilterOpts
|
|
119
|
+
const hasCheckOption = $xeFilterPanel.computeHasCheckOption
|
|
120
|
+
const filterRender = column.filterRender
|
|
121
|
+
const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
122
|
+
const isDisabled = !hasCheckOption && !filterStore.isAllSelected && !filterStore.isIndeterminate
|
|
123
|
+
return multiple && (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : true)
|
|
124
|
+
? [
|
|
125
|
+
h('div', {
|
|
126
|
+
class: 'vxe-table--filter-footer'
|
|
127
|
+
}, [
|
|
128
|
+
h('button', {
|
|
129
|
+
class: {
|
|
130
|
+
'is--disabled': isDisabled
|
|
131
|
+
},
|
|
132
|
+
attrs: {
|
|
133
|
+
disabled: isDisabled
|
|
134
|
+
},
|
|
135
|
+
on: {
|
|
136
|
+
click: $xeFilterPanel.confirmFilter
|
|
137
|
+
}
|
|
138
|
+
}, filterOpts.confirmButtonText || getI18n('vxe.table.confirmFilter')),
|
|
139
|
+
h('button', {
|
|
140
|
+
on: {
|
|
141
|
+
click: $xeFilterPanel.resetFilter
|
|
142
|
+
}
|
|
143
|
+
}, filterOpts.resetButtonText || getI18n('vxe.table.resetFilter'))
|
|
144
|
+
])
|
|
145
|
+
]
|
|
146
|
+
: []
|
|
147
|
+
}
|
|
9
148
|
|
|
10
149
|
export default {
|
|
11
150
|
name: 'VxeTableFilterPanel',
|
|
151
|
+
mixins: [
|
|
152
|
+
globalMixins.sizeMixin
|
|
153
|
+
],
|
|
12
154
|
props: {
|
|
13
155
|
filterStore: Object
|
|
14
156
|
},
|
|
157
|
+
inject: {
|
|
158
|
+
$xeTable: {
|
|
159
|
+
default: null
|
|
160
|
+
}
|
|
161
|
+
},
|
|
15
162
|
computed: {
|
|
16
|
-
|
|
163
|
+
computeHasCheckOption () {
|
|
17
164
|
const { filterStore } = this
|
|
18
165
|
return filterStore && filterStore.options.some((option: any) => option.checked)
|
|
19
166
|
}
|
|
20
167
|
} as any,
|
|
168
|
+
mounted (this: any) {
|
|
169
|
+
const $xeFilterPanel = this
|
|
170
|
+
const $xeTable = $xeFilterPanel.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
|
|
171
|
+
const filterOpts = $xeTable.computeFilterOpts
|
|
172
|
+
const { transfer } = filterOpts
|
|
173
|
+
const el = this.$refs.refElem as HTMLDivElement
|
|
174
|
+
|
|
175
|
+
if (transfer && el) {
|
|
176
|
+
document.body.appendChild(el)
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
beforeDestroy (this: any) {
|
|
180
|
+
const el = this.$refs.refElem as HTMLDivElement
|
|
181
|
+
|
|
182
|
+
if (el && el.parentNode) {
|
|
183
|
+
el.parentNode.removeChild(el)
|
|
184
|
+
}
|
|
185
|
+
},
|
|
21
186
|
render (this: any, h: CreateElement) {
|
|
22
|
-
const $
|
|
23
|
-
const
|
|
187
|
+
const $xeFilterPanel = this
|
|
188
|
+
const props = $xeFilterPanel
|
|
189
|
+
const $xeTable = $xeFilterPanel.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
|
|
24
190
|
const tableInternalData = $xeTable as unknown as TableInternalData
|
|
25
191
|
|
|
26
|
-
const { filterStore } =
|
|
192
|
+
const { filterStore } = props
|
|
27
193
|
const { visible, multiple, column } = filterStore
|
|
28
194
|
const filterRender = column ? column.filterRender : null
|
|
29
195
|
const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
30
196
|
const filterClassName = compConf ? (compConf.tableFilterClassName || compConf.filterClassName) : ''
|
|
31
|
-
const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable })
|
|
197
|
+
const params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $xeFilterPanel, $table: $xeTable })
|
|
198
|
+
const tableProps = $xeTable
|
|
199
|
+
const vSize = $xeFilterPanel.computeSize
|
|
32
200
|
const filterOpts = $xeTable.computeFilterOpts
|
|
33
201
|
const { destroyOnClose } = filterOpts
|
|
34
202
|
return h('div', {
|
|
203
|
+
ref: 'refElem',
|
|
35
204
|
class: [
|
|
36
205
|
'vxe-table--filter-wrapper',
|
|
37
206
|
'filter--prevent-default',
|
|
38
207
|
compConf && compConf.className ? compConf.className : '',
|
|
39
208
|
getClass(filterClassName, params),
|
|
40
209
|
{
|
|
41
|
-
|
|
210
|
+
[`size--${vSize}`]: vSize,
|
|
211
|
+
'is--animat': tableProps.animat,
|
|
42
212
|
'is--multiple': multiple,
|
|
43
213
|
'is--active': visible
|
|
44
214
|
}
|
|
45
215
|
],
|
|
46
216
|
style: filterStore.style
|
|
47
|
-
}, filterStore.visible && (destroyOnClose ? visible : true) && column ?
|
|
217
|
+
}, filterStore.visible && (destroyOnClose ? visible : true) && column ? renderOptions($xeFilterPanel, h, filterRender, compConf).concat(renderFooter($xeFilterPanel, h)) : [])
|
|
48
218
|
},
|
|
49
219
|
methods: {
|
|
50
|
-
renderOptions (h: CreateElement, filterRender: any, compConf: any) {
|
|
51
|
-
const $panel = this
|
|
52
|
-
const $xeTable = this.$parent as VxeTableConstructor & VxeTablePrivateMethods
|
|
53
|
-
const tableInternalData = $xeTable as unknown as TableInternalData
|
|
54
|
-
|
|
55
|
-
const { filterStore } = this
|
|
56
|
-
const { column, multiple, maxHeight } = filterStore
|
|
57
|
-
const slots = column ? column.slots : null
|
|
58
|
-
const filterSlot = slots ? slots.filter : null
|
|
59
|
-
const params = Object.assign({}, tableInternalData._currFilterParams, { $panel, $table: $xeTable })
|
|
60
|
-
const rtFilter = compConf ? (compConf.renderTableFilter || compConf.renderFilter) : null
|
|
61
|
-
if (filterSlot) {
|
|
62
|
-
return [
|
|
63
|
-
h('div', {
|
|
64
|
-
class: 'vxe-table--filter-template',
|
|
65
|
-
style: maxHeight
|
|
66
|
-
? {
|
|
67
|
-
maxHeight: `${maxHeight}px`
|
|
68
|
-
}
|
|
69
|
-
: {}
|
|
70
|
-
}, $xeTable.callSlot(filterSlot, params, h))
|
|
71
|
-
]
|
|
72
|
-
} else if (rtFilter) {
|
|
73
|
-
return [
|
|
74
|
-
h('div', {
|
|
75
|
-
class: 'vxe-table--filter-template',
|
|
76
|
-
style: maxHeight
|
|
77
|
-
? {
|
|
78
|
-
maxHeight: `${maxHeight}px`
|
|
79
|
-
}
|
|
80
|
-
: {}
|
|
81
|
-
}, getSlotVNs(rtFilter.call($xeTable, h, filterRender, params)))
|
|
82
|
-
]
|
|
83
|
-
}
|
|
84
|
-
const isAllChecked = multiple ? filterStore.isAllSelected : !filterStore.options.some((item: any) => item._checked)
|
|
85
|
-
const isAllIndeterminate = multiple && filterStore.isIndeterminate
|
|
86
|
-
return [
|
|
87
|
-
h('ul', {
|
|
88
|
-
class: 'vxe-table--filter-header'
|
|
89
|
-
}, [
|
|
90
|
-
h('li', {
|
|
91
|
-
class: ['vxe-table--filter-option', {
|
|
92
|
-
'is--checked': isAllChecked,
|
|
93
|
-
'is--indeterminate': isAllIndeterminate
|
|
94
|
-
}],
|
|
95
|
-
attrs: {
|
|
96
|
-
title: getI18n(multiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter')
|
|
97
|
-
},
|
|
98
|
-
on: {
|
|
99
|
-
click: (evnt: MouseEvent) => {
|
|
100
|
-
this.changeAllOption(evnt, !filterStore.isAllSelected)
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}, (multiple
|
|
104
|
-
? [
|
|
105
|
-
h('span', {
|
|
106
|
-
class: ['vxe-checkbox--icon', isAllIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isAllChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
107
|
-
})
|
|
108
|
-
]
|
|
109
|
-
: []).concat([
|
|
110
|
-
h('span', {
|
|
111
|
-
class: 'vxe-checkbox--label'
|
|
112
|
-
}, getI18n('vxe.table.allFilter'))
|
|
113
|
-
]))
|
|
114
|
-
]),
|
|
115
|
-
h('ul', {
|
|
116
|
-
class: 'vxe-table--filter-body',
|
|
117
|
-
style: maxHeight
|
|
118
|
-
? {
|
|
119
|
-
maxHeight: `${maxHeight}px`
|
|
120
|
-
}
|
|
121
|
-
: {}
|
|
122
|
-
}, filterStore.options.map((item: any) => {
|
|
123
|
-
const isChecked = item._checked
|
|
124
|
-
const isIndeterminate = false
|
|
125
|
-
return h('li', {
|
|
126
|
-
class: ['vxe-table--filter-option', {
|
|
127
|
-
'is--checked': isChecked
|
|
128
|
-
}],
|
|
129
|
-
attrs: {
|
|
130
|
-
title: item.label
|
|
131
|
-
},
|
|
132
|
-
on: {
|
|
133
|
-
click: (evnt: MouseEvent) => {
|
|
134
|
-
this.changeOption(evnt, !item._checked, item)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}, (multiple
|
|
138
|
-
? [
|
|
139
|
-
h('span', {
|
|
140
|
-
class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : (isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED)]
|
|
141
|
-
})
|
|
142
|
-
]
|
|
143
|
-
: []).concat([
|
|
144
|
-
h('span', {
|
|
145
|
-
class: 'vxe-checkbox--label'
|
|
146
|
-
}, formatText(item.label, 1))
|
|
147
|
-
]))
|
|
148
|
-
}))
|
|
149
|
-
]
|
|
150
|
-
},
|
|
151
|
-
renderFooter (h: CreateElement) {
|
|
152
|
-
const $xeTable = this.$parent as VxeTableConstructor & VxeTablePrivateMethods
|
|
153
|
-
|
|
154
|
-
const { hasCheckOption, filterStore } = this
|
|
155
|
-
const { column, multiple } = filterStore
|
|
156
|
-
const filterOpts = $xeTable.computeFilterOpts
|
|
157
|
-
const filterRender = column.filterRender
|
|
158
|
-
const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
159
|
-
const isDisabled = !hasCheckOption && !filterStore.isAllSelected && !filterStore.isIndeterminate
|
|
160
|
-
return multiple && (compConf ? !(compConf.showTableFilterFooter === false || compConf.showFilterFooter === false || compConf.isFooter === false) : true)
|
|
161
|
-
? [
|
|
162
|
-
h('div', {
|
|
163
|
-
class: 'vxe-table--filter-footer'
|
|
164
|
-
}, [
|
|
165
|
-
h('button', {
|
|
166
|
-
class: {
|
|
167
|
-
'is--disabled': isDisabled
|
|
168
|
-
},
|
|
169
|
-
attrs: {
|
|
170
|
-
disabled: isDisabled
|
|
171
|
-
},
|
|
172
|
-
on: {
|
|
173
|
-
click: this.confirmFilter
|
|
174
|
-
}
|
|
175
|
-
}, filterOpts.confirmButtonText || getI18n('vxe.table.confirmFilter')),
|
|
176
|
-
h('button', {
|
|
177
|
-
on: {
|
|
178
|
-
click: this.resetFilter
|
|
179
|
-
}
|
|
180
|
-
}, filterOpts.resetButtonText || getI18n('vxe.table.resetFilter'))
|
|
181
|
-
])
|
|
182
|
-
]
|
|
183
|
-
: []
|
|
184
|
-
},
|
|
185
220
|
// 全部筛选事件
|
|
186
221
|
filterCheckAllEvent (evnt: any, value: any) {
|
|
187
222
|
const filterStore = this.filterStore
|
|
@@ -3014,7 +3014,12 @@ const Methods = {
|
|
|
3014
3014
|
$xeTable.checkSelectionStatus()
|
|
3015
3015
|
return new Promise<void>(resolve => {
|
|
3016
3016
|
this.$nextTick()
|
|
3017
|
-
.then(() => $xeTable
|
|
3017
|
+
.then(() => handleRecalculateLayout($xeTable, false))
|
|
3018
|
+
.then(() => {
|
|
3019
|
+
calcCellHeight($xeTable)
|
|
3020
|
+
updateRowOffsetTop($xeTable)
|
|
3021
|
+
return handleRecalculateLayout($xeTable, false)
|
|
3022
|
+
})
|
|
3018
3023
|
.then(() => {
|
|
3019
3024
|
let targetScrollLeft = lastScrollLeft
|
|
3020
3025
|
let targetScrollTop = lastScrollTop
|
|
@@ -3028,8 +3033,7 @@ const Methods = {
|
|
|
3028
3033
|
targetScrollTop = 0
|
|
3029
3034
|
}
|
|
3030
3035
|
reactData.isRowLoading = false
|
|
3031
|
-
|
|
3032
|
-
updateRowOffsetTop($xeTable)
|
|
3036
|
+
handleRecalculateLayout($xeTable, false)
|
|
3033
3037
|
// 是否变更虚拟滚动
|
|
3034
3038
|
if (oldScrollYLoad === sYLoad) {
|
|
3035
3039
|
restoreScrollLocation($xeTable, targetScrollLeft, targetScrollTop)
|
|
@@ -6654,6 +6658,10 @@ const Methods = {
|
|
|
6654
6658
|
const currentColumnOpts = $xeTable.computeCurrentColumnOpts
|
|
6655
6659
|
const beforeRowMethod = currentColumnOpts.beforeSelectMethod || columnOpts.currentMethod as any
|
|
6656
6660
|
const { column: newValue } = params
|
|
6661
|
+
const { trigger } = currentColumnOpts
|
|
6662
|
+
if (trigger === 'manual') {
|
|
6663
|
+
return
|
|
6664
|
+
}
|
|
6657
6665
|
const isChange = oldValue !== newValue
|
|
6658
6666
|
if (!beforeRowMethod || beforeRowMethod({ column: newValue, $table: $xeTable })) {
|
|
6659
6667
|
$xeTable.setCurrentColumn(newValue)
|
|
@@ -6673,6 +6681,10 @@ const Methods = {
|
|
|
6673
6681
|
const currentRowOpts = $xeTable.computeCurrentRowOpts
|
|
6674
6682
|
const beforeRowMethod = currentRowOpts.beforeSelectMethod || rowOpts.currentMethod as any
|
|
6675
6683
|
const { row: newValue } = params
|
|
6684
|
+
const { trigger } = currentRowOpts
|
|
6685
|
+
if (trigger === 'manual') {
|
|
6686
|
+
return
|
|
6687
|
+
}
|
|
6676
6688
|
const isChange = oldValue !== newValue
|
|
6677
6689
|
if (!beforeRowMethod || beforeRowMethod({ row: newValue, $table: $xeTable })) {
|
|
6678
6690
|
$xeTable.setCurrentRow(newValue)
|
|
@@ -8056,12 +8068,10 @@ const Methods = {
|
|
|
8056
8068
|
|
|
8057
8069
|
const { filterStore } = reactData
|
|
8058
8070
|
const { column, visible } = filterStore
|
|
8059
|
-
|
|
8060
|
-
|
|
8061
|
-
|
|
8062
|
-
|
|
8063
|
-
visible: false
|
|
8064
|
-
})
|
|
8071
|
+
filterStore.isAllSelected = false
|
|
8072
|
+
filterStore.isIndeterminate = false
|
|
8073
|
+
filterStore.options = []
|
|
8074
|
+
filterStore.visible = false
|
|
8065
8075
|
if (visible) {
|
|
8066
8076
|
$xeTable.dispatchEvent('filter-visible', {
|
|
8067
8077
|
column,
|
|
@@ -8443,10 +8453,10 @@ const Methods = {
|
|
|
8443
8453
|
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
8444
8454
|
const internalData = $xeTable as unknown as TableInternalData
|
|
8445
8455
|
|
|
8446
|
-
const { treeExpandLazyLoadedMaps } = internalData
|
|
8456
|
+
const { treeExpandLazyLoadedMaps, treeEATime } = internalData
|
|
8447
8457
|
const treeOpts = $xeTable.computeTreeOpts
|
|
8448
8458
|
const { row, column } = params
|
|
8449
|
-
const { lazy, trigger } = treeOpts
|
|
8459
|
+
const { lazy, trigger, accordion } = treeOpts
|
|
8450
8460
|
if (trigger === 'manual') {
|
|
8451
8461
|
return
|
|
8452
8462
|
}
|
|
@@ -8456,7 +8466,17 @@ const Methods = {
|
|
|
8456
8466
|
const expanded = !$xeTable.isTreeExpandByRow(row)
|
|
8457
8467
|
const columnIndex = $xeTable.getColumnIndex(column)
|
|
8458
8468
|
const $columnIndex = $xeTable.getVMColumnIndex(column)
|
|
8459
|
-
|
|
8469
|
+
if (treeEATime) {
|
|
8470
|
+
clearTimeout(treeEATime)
|
|
8471
|
+
}
|
|
8472
|
+
$xeTable.setTreeExpand(row, expanded).then(() => {
|
|
8473
|
+
if (accordion) {
|
|
8474
|
+
internalData.treeEATime = setTimeout(() => {
|
|
8475
|
+
internalData.treeEATime = undefined
|
|
8476
|
+
$xeTable.scrollToRow(row)
|
|
8477
|
+
}, 20)
|
|
8478
|
+
}
|
|
8479
|
+
})
|
|
8460
8480
|
$xeTable.dispatchEvent('toggle-tree-expand', { expanded, column, columnIndex, $columnIndex, row }, evnt)
|
|
8461
8481
|
}
|
|
8462
8482
|
},
|
|
@@ -8751,6 +8771,9 @@ const Methods = {
|
|
|
8751
8771
|
}
|
|
8752
8772
|
updateRowExpandStyle($xeTable)
|
|
8753
8773
|
checkLastSyncScroll($xeTable, isRollX, isRollY)
|
|
8774
|
+
if (isRollX) {
|
|
8775
|
+
$xeTable.closeFilter()
|
|
8776
|
+
}
|
|
8754
8777
|
if (rowOpts.isHover || highlightHoverRow) {
|
|
8755
8778
|
$xeTable.clearHoverRow()
|
|
8756
8779
|
}
|
|
@@ -9224,7 +9247,8 @@ const Methods = {
|
|
|
9224
9247
|
if (isScrollXBig && mouseOpts.area) {
|
|
9225
9248
|
errLog('vxe.error.notProp', ['mouse-config.area'])
|
|
9226
9249
|
}
|
|
9227
|
-
$xeTable
|
|
9250
|
+
calcScrollbar($xeTable)
|
|
9251
|
+
return $xeTable.$nextTick(() => {
|
|
9228
9252
|
updateStyle($xeTable)
|
|
9229
9253
|
})
|
|
9230
9254
|
}
|
|
@@ -9334,6 +9358,7 @@ const Methods = {
|
|
|
9334
9358
|
if (isScrollYBig && mouseOpts.area) {
|
|
9335
9359
|
errLog('vxe.error.notProp', ['mouse-config.area'])
|
|
9336
9360
|
}
|
|
9361
|
+
calcScrollbar($xeTable)
|
|
9337
9362
|
return $xeTable.$nextTick().then(() => {
|
|
9338
9363
|
updateStyle($xeTable)
|
|
9339
9364
|
})
|
|
@@ -332,7 +332,8 @@ export function getColReMinWidth (params: any) {
|
|
|
332
332
|
const lineOffsetSizes: Record<string, any> = {
|
|
333
333
|
mini: 3,
|
|
334
334
|
small: 2,
|
|
335
|
-
medium: 1
|
|
335
|
+
medium: 1,
|
|
336
|
+
large: 0
|
|
336
337
|
}
|
|
337
338
|
|
|
338
339
|
function 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
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|