vxe-table 3.20.4 → 3.20.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.
- package/LICENSE +20 -20
- package/README.md +106 -106
- package/es/grid/style.css +4 -0
- package/es/grid/style.min.css +1 -1
- package/es/index.css +1 -1
- package/es/index.esm.js +1 -2
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/src/methods.js +51 -22
- package/es/table/src/table.js +36 -0
- package/es/table/src/util.js +3 -4
- package/es/table/style.css +48 -18
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +1 -1
- package/es/vxe-grid/style.css +4 -0
- package/es/vxe-grid/style.min.css +1 -1
- package/es/vxe-table/style.css +48 -18
- package/lib/grid/style/style.css +4 -0
- package/lib/grid/style/style.min.css +1 -1
- package/lib/index.common.js +1 -2
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +3252 -1877
- package/lib/index.umd.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/src/methods.js +4 -3
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/table.js +44 -0
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +4 -6
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +48 -18
- 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/v-x-e-table/index.js +1 -2
- package/lib/v-x-e-table/index.min.js +1 -1
- package/lib/vxe-colgroup/index.js +1 -2
- package/lib/vxe-colgroup/index.min.js +1 -1
- package/lib/vxe-column/index.js +1 -2
- package/lib/vxe-column/index.min.js +1 -1
- package/lib/vxe-grid/index.js +1 -2
- package/lib/vxe-grid/index.min.js +1 -1
- package/lib/vxe-grid/style/style.css +4 -0
- package/lib/vxe-grid/style/style.min.css +1 -1
- package/lib/vxe-table/index.js +1 -2
- package/lib/vxe-table/index.min.js +1 -1
- package/lib/vxe-table/style/style.css +48 -18
- package/lib/vxe-toolbar/index.js +1 -2
- package/lib/vxe-toolbar/index.min.js +1 -1
- package/lib/vxe-ui/index.js +1 -2
- package/lib/vxe-ui/index.min.js +1 -1
- package/lib/vxe-v-x-e-table/index.js +1 -2
- package/lib/vxe-v-x-e-table/index.min.js +1 -1
- package/package.json +93 -93
- package/packages/colgroup/index.ts +22 -22
- package/packages/column/index.ts +22 -22
- package/packages/components.ts +42 -42
- package/packages/grid/index.ts +22 -22
- package/packages/grid/src/grid.ts +1935 -1935
- package/packages/index.ts +4 -4
- package/packages/locale/lang/ar-EG.ts +832 -832
- package/packages/locale/lang/de-DE.ts +832 -832
- package/packages/locale/lang/en-US.ts +832 -832
- package/packages/locale/lang/es-ES.ts +832 -832
- package/packages/locale/lang/fr-FR.ts +832 -832
- package/packages/locale/lang/hu-HU.ts +832 -832
- package/packages/locale/lang/hy-AM.ts +832 -832
- package/packages/locale/lang/id-ID.ts +832 -832
- package/packages/locale/lang/it-IT.ts +832 -832
- package/packages/locale/lang/ja-JP.ts +832 -832
- package/packages/locale/lang/ko-KR.ts +832 -832
- package/packages/locale/lang/ms-MY.ts +832 -832
- package/packages/locale/lang/nb-NO.ts +832 -832
- package/packages/locale/lang/pt-BR.ts +832 -832
- package/packages/locale/lang/ru-RU.ts +832 -832
- package/packages/locale/lang/th-TH.ts +832 -832
- package/packages/locale/lang/ug-CN.ts +832 -832
- package/packages/locale/lang/uk-UA.ts +832 -832
- package/packages/locale/lang/uz-UZ.ts +832 -832
- package/packages/locale/lang/vi-VN.ts +832 -832
- package/packages/locale/lang/zh-CHT.ts +832 -832
- package/packages/locale/lang/zh-CN.ts +832 -832
- package/packages/locale/lang/zh-HK.ts +3 -3
- package/packages/locale/lang/zh-MO.ts +3 -3
- package/packages/locale/lang/zh-TC.ts +3 -3
- package/packages/locale/lang/zh-TW.ts +3 -3
- package/packages/table/index.ts +49 -49
- package/packages/table/module/custom/mixin.ts +369 -369
- package/packages/table/module/custom/panel.ts +1461 -1461
- package/packages/table/module/edit/mixin.ts +1123 -1123
- package/packages/table/module/export/export-panel.ts +658 -658
- package/packages/table/module/export/import-panel.ts +319 -319
- package/packages/table/module/export/mixin.ts +1693 -1693
- package/packages/table/module/export/util.ts +24 -24
- package/packages/table/module/filter/mixin.ts +507 -507
- package/packages/table/module/filter/panel.ts +329 -329
- package/packages/table/module/keyboard/mixin.ts +513 -513
- package/packages/table/module/menu/mixin.ts +329 -329
- package/packages/table/module/menu/panel.ts +212 -212
- package/packages/table/module/validator/mixin.ts +626 -626
- package/packages/table/render/index.ts +1456 -1456
- package/packages/table/src/body.ts +969 -969
- package/packages/table/src/cell.ts +1285 -1285
- package/packages/table/src/column.ts +205 -205
- package/packages/table/src/columnInfo.ts +228 -228
- package/packages/table/src/footer.ts +388 -388
- package/packages/table/src/group.ts +51 -51
- package/packages/table/src/header.ts +602 -602
- package/packages/table/src/methods.ts +12939 -12912
- package/packages/table/src/props.ts +311 -311
- package/packages/table/src/store.ts +15 -15
- package/packages/table/src/table.ts +2502 -2460
- package/packages/table/src/util.ts +1012 -1012
- package/packages/toolbar/index.ts +18 -18
- package/packages/toolbar/src/toolbar.ts +856 -856
- package/packages/ui/index.ts +530 -530
- package/packages/ui/src/anime.ts +52 -52
- package/packages/ui/src/comp.ts +3 -3
- package/packages/ui/src/dom.ts +236 -236
- package/packages/ui/src/log.ts +8 -8
- package/packages/ui/src/utils.ts +56 -56
- package/packages/ui/src/vn.ts +65 -65
- package/packages/v-x-e-table/index.ts +4 -4
- package/styles/all.scss +7 -7
- package/styles/base.scss +16 -16
- package/styles/components/grid.scss +89 -85
- package/styles/components/icon.scss +225 -225
- package/styles/components/old-icon.scss +715 -715
- package/styles/components/table-module/all.scss +6 -6
- package/styles/components/table-module/custom.scss +527 -527
- package/styles/components/table-module/export.scss +130 -130
- package/styles/components/table-module/filter.scss +130 -130
- package/styles/components/table-module/menu.scss +81 -81
- package/styles/components/table.scss +2679 -2679
- package/styles/components/toolbar.scss +119 -119
- package/styles/default.scss +2 -2
- package/styles/helpers/baseMixin.scss +95 -95
- package/styles/index.scss +3 -3
- package/styles/modules.scss +5 -5
- package/styles/theme/base.scss +93 -93
- package/styles/theme/dark.scss +49 -49
- package/styles/theme/light.scss +44 -44
- package/styles/variable.scss +43 -43
- package/types/all.d.ts +53 -53
- package/types/index.d.ts +4 -4
- /package/es/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
- /package/es/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
- /package/es/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
- /package/lib/{iconfont.1773644050430.ttf → iconfont.1773972972913.ttf} +0 -0
- /package/lib/{iconfont.1773644050430.woff → iconfont.1773972972913.woff} +0 -0
- /package/lib/{iconfont.1773644050430.woff2 → iconfont.1773972972913.woff2} +0 -0
|
@@ -1,507 +1,507 @@
|
|
|
1
|
-
import XEUtils from 'xe-utils'
|
|
2
|
-
import { VxeUI } from '../../../ui'
|
|
3
|
-
import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
|
|
4
|
-
import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom'
|
|
5
|
-
import { isEnableConf } from '../../../ui/src/utils'
|
|
6
|
-
|
|
7
|
-
import type { VxeTableConstructor, VxeTableDefines, TableReactData, TableInternalData, VxeColumnPropTypes, VxeTablePrivateMethods } from '../../../../types'
|
|
8
|
-
|
|
9
|
-
const { renderer } = VxeUI
|
|
10
|
-
|
|
11
|
-
const sourceType = 'table'
|
|
12
|
-
|
|
13
|
-
export default {
|
|
14
|
-
methods: {
|
|
15
|
-
/**
|
|
16
|
-
* 手动弹出筛选面板
|
|
17
|
-
* @param column
|
|
18
|
-
*/
|
|
19
|
-
_openFilter (fieldOrColumn: any) {
|
|
20
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
21
|
-
const $xeGrid = $xeTable.$xeGrid
|
|
22
|
-
const $xeGantt = $xeTable.$xeGantt
|
|
23
|
-
|
|
24
|
-
const column = handleFieldOrColumn(this, fieldOrColumn)
|
|
25
|
-
if (column && column.filters) {
|
|
26
|
-
const { elemStore } = this
|
|
27
|
-
const { fixed, filters } = column
|
|
28
|
-
return $xeTable.scrollToColumn(column).then(() => {
|
|
29
|
-
const headerWrapperElem = (elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper']) as HTMLElement
|
|
30
|
-
if (headerWrapperElem) {
|
|
31
|
-
const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
|
|
32
|
-
if (filterBtnElem) {
|
|
33
|
-
triggerEvent(filterBtnElem, 'click')
|
|
34
|
-
} else {
|
|
35
|
-
const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
|
|
36
|
-
if (colEl) {
|
|
37
|
-
let firstFilterOption: VxeTableDefines.FilterOption | null = null
|
|
38
|
-
if (filters) {
|
|
39
|
-
firstFilterOption = filters[0] as VxeTableDefines.FilterOption
|
|
40
|
-
}
|
|
41
|
-
const params = {
|
|
42
|
-
$table: $xeTable,
|
|
43
|
-
$grid: $xeGrid,
|
|
44
|
-
$gantt: $xeGantt,
|
|
45
|
-
$rowIndex: -1,
|
|
46
|
-
column,
|
|
47
|
-
columnIndex: $xeTable.getColumnIndex(column),
|
|
48
|
-
$columnIndex: $xeTable.getVMColumnIndex(column),
|
|
49
|
-
_columnIndex: $xeTable.getVTColumnIndex(column),
|
|
50
|
-
firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
|
|
51
|
-
fixed,
|
|
52
|
-
source: sourceType,
|
|
53
|
-
type: 'header'
|
|
54
|
-
// isHidden
|
|
55
|
-
// hasFilter
|
|
56
|
-
}
|
|
57
|
-
$xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
})
|
|
62
|
-
}
|
|
63
|
-
return $xeTable.$nextTick()
|
|
64
|
-
},
|
|
65
|
-
/**
|
|
66
|
-
* 修改筛选条件列表
|
|
67
|
-
* @param {ColumnInfo} fieldOrColumn 列
|
|
68
|
-
* @param {Array} options 选项
|
|
69
|
-
*/
|
|
70
|
-
_setFilter (fieldOrColumn: any, options: any, isUpdate: any) {
|
|
71
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
72
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
73
|
-
|
|
74
|
-
const { filterStore } = reactData
|
|
75
|
-
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
76
|
-
if (column && column.filters) {
|
|
77
|
-
column.filters = toFilters(options || [], column.id)
|
|
78
|
-
if (isUpdate) {
|
|
79
|
-
return $xeTable.handleColumnConfirmFilter(column, null)
|
|
80
|
-
} else {
|
|
81
|
-
if (filterStore.visible) {
|
|
82
|
-
$xeTable.handleFilterOptions(column)
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return $xeTable.$nextTick()
|
|
87
|
-
},
|
|
88
|
-
checkFilterOptions () {
|
|
89
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
90
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
91
|
-
|
|
92
|
-
const { filterStore } = reactData
|
|
93
|
-
const { column } = filterStore
|
|
94
|
-
if (column) {
|
|
95
|
-
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
96
|
-
filterStore.isAllSelected = filterOptions.every((item) => item._checked)
|
|
97
|
-
filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
handleOpenFilterColumn (evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
|
|
101
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
102
|
-
const $xeGrid = $xeTable.$xeGrid
|
|
103
|
-
const $xeGantt = $xeTable.$xeGantt
|
|
104
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
105
|
-
const internalData = $xeTable as unknown as TableInternalData
|
|
106
|
-
const $xeGGWrapper = $xeGrid || $xeGantt
|
|
107
|
-
|
|
108
|
-
const { initStore, filterStore } = reactData
|
|
109
|
-
const { elemStore } = internalData
|
|
110
|
-
if (filterStore.column === column && filterStore.visible) {
|
|
111
|
-
filterStore.visible = false
|
|
112
|
-
} else {
|
|
113
|
-
const tableEl = $xeTable.$refs.refElem as HTMLDivElement
|
|
114
|
-
const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
|
|
115
|
-
const filterOpts = $xeTable.computeFilterOpts
|
|
116
|
-
const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
|
|
117
|
-
const currEl = btnEl || colEl
|
|
118
|
-
const tableRect = tableEl.getBoundingClientRect()
|
|
119
|
-
const filterRender = column ? column.filterRender : null
|
|
120
|
-
const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
121
|
-
$xeTable.handleFilterOptions(column)
|
|
122
|
-
internalData._currFilterParams = params
|
|
123
|
-
filterStore.style = null
|
|
124
|
-
filterStore.visible = true
|
|
125
|
-
initStore.filter = true
|
|
126
|
-
$xeTable.$nextTick(() => {
|
|
127
|
-
const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
|
|
128
|
-
if (!headerScrollElem) {
|
|
129
|
-
return
|
|
130
|
-
}
|
|
131
|
-
const tableFilter = $xeTable.$refs.refTableFilter
|
|
132
|
-
const filterWrapperElem = tableFilter ? (tableFilter as any).$el as HTMLDivElement : null
|
|
133
|
-
if (!filterWrapperElem) {
|
|
134
|
-
return
|
|
135
|
-
}
|
|
136
|
-
const btnRect = currEl.getBoundingClientRect()
|
|
137
|
-
const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
|
|
138
|
-
const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
|
|
139
|
-
const filterWidth = filterWrapperElem.offsetWidth
|
|
140
|
-
const centerWidth = filterWidth / 2
|
|
141
|
-
let left = 0
|
|
142
|
-
let top = 0
|
|
143
|
-
let maxHeight = 0
|
|
144
|
-
if (transfer) {
|
|
145
|
-
left = btnRect.left - centerWidth + scrollLeft
|
|
146
|
-
top = btnRect.top + currEl.clientHeight + scrollTop
|
|
147
|
-
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))
|
|
148
|
-
if (left < 16) {
|
|
149
|
-
left = 16
|
|
150
|
-
} else if (left > (visibleWidth - filterWidth - 16)) {
|
|
151
|
-
left = visibleWidth - filterWidth - 16
|
|
152
|
-
}
|
|
153
|
-
} else {
|
|
154
|
-
left = btnRect.left - tableRect.left - centerWidth
|
|
155
|
-
top = btnRect.top - tableRect.top + currEl.clientHeight
|
|
156
|
-
maxHeight = Math.max(40, tableEl.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
|
|
157
|
-
if (left < 1) {
|
|
158
|
-
left = 1
|
|
159
|
-
} else if (left > (tableEl.clientWidth - filterWidth - 1)) {
|
|
160
|
-
left = tableEl.clientWidth - filterWidth - 1
|
|
161
|
-
}
|
|
162
|
-
if ($xeGGWrapper) {
|
|
163
|
-
const wrapperEl = $xeGGWrapper.$refs.refElem as HTMLDivElement
|
|
164
|
-
if (wrapperEl) {
|
|
165
|
-
const wrapperRect = wrapperEl.getBoundingClientRect()
|
|
166
|
-
top += tableRect.top - wrapperRect.top
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const fStys: Record<string, any> = {
|
|
171
|
-
top: toCssUnit(top),
|
|
172
|
-
left: toCssUnit(left)
|
|
173
|
-
}
|
|
174
|
-
if (zIndex) {
|
|
175
|
-
fStys.zIndex = zIndex
|
|
176
|
-
}
|
|
177
|
-
filterStore.style = fStys
|
|
178
|
-
// 筛选面板是自适应表格高度
|
|
179
|
-
if (compConf ? !compConf.tableFilterAutoHeight : false) {
|
|
180
|
-
maxHeight = 0
|
|
181
|
-
} else {
|
|
182
|
-
if (customMaxHeight) {
|
|
183
|
-
maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// 判断面板不能大于表格高度
|
|
187
|
-
filterStore.maxHeight = maxHeight
|
|
188
|
-
})
|
|
189
|
-
}
|
|
190
|
-
$xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
|
|
191
|
-
},
|
|
192
|
-
/**
|
|
193
|
-
* 点击筛选事件
|
|
194
|
-
* 当筛选图标被点击时触发
|
|
195
|
-
* 更新选项是否全部状态
|
|
196
|
-
* 打开筛选面板
|
|
197
|
-
* @param {Event} evnt 事件
|
|
198
|
-
* @param {ColumnInfo} column 列配置
|
|
199
|
-
* @param {Object} params 参数
|
|
200
|
-
*/
|
|
201
|
-
triggerFilterEvent (evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params: any) {
|
|
202
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
203
|
-
const internalData = $xeTable as unknown as TableInternalData
|
|
204
|
-
|
|
205
|
-
const { elemStore } = internalData
|
|
206
|
-
const { fixed } = column
|
|
207
|
-
const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
|
|
208
|
-
const btnElem = evnt.currentTarget as HTMLDivElement
|
|
209
|
-
const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
|
|
210
|
-
$xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
|
|
211
|
-
},
|
|
212
|
-
// (单选)筛选发生改变
|
|
213
|
-
handleFilterChangeRadioOption (evnt: Event, checked: boolean, item: any) {
|
|
214
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
215
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
216
|
-
|
|
217
|
-
const { filterStore } = reactData
|
|
218
|
-
const { column } = filterStore
|
|
219
|
-
if (column) {
|
|
220
|
-
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
221
|
-
filterOptions.forEach((option) => {
|
|
222
|
-
option._checked = false
|
|
223
|
-
})
|
|
224
|
-
item._checked = checked
|
|
225
|
-
$xeTable.checkFilterOptions()
|
|
226
|
-
$xeTable.handleFilterConfirmFilter(evnt, column)
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
// (多选)筛选发生改变
|
|
230
|
-
handleFilterChangeMultipleOption (evnt: Event, checked: boolean, item: any) {
|
|
231
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
232
|
-
|
|
233
|
-
item._checked = checked
|
|
234
|
-
$xeTable.checkFilterOptions()
|
|
235
|
-
},
|
|
236
|
-
// 筛选发生改变
|
|
237
|
-
handleFilterChangeOption (evnt: Event, checked: boolean, item: any) {
|
|
238
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
239
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
240
|
-
const internalData = $xeTable as unknown as TableInternalData
|
|
241
|
-
|
|
242
|
-
const { filterStore } = reactData
|
|
243
|
-
const { fullColumnIdData } = internalData
|
|
244
|
-
let column = filterStore.column
|
|
245
|
-
if (!column) {
|
|
246
|
-
const colRest = fullColumnIdData[item._colId]
|
|
247
|
-
if (colRest) {
|
|
248
|
-
column = colRest.column
|
|
249
|
-
filterStore.column = column
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
if (column) {
|
|
253
|
-
if (column.filterMultiple) {
|
|
254
|
-
$xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
|
|
255
|
-
} else {
|
|
256
|
-
$xeTable.handleFilterChangeRadioOption(evnt, checked, item)
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
},
|
|
260
|
-
// 确认筛选
|
|
261
|
-
handleFilterConfirmFilter (evnt: Event | null, column: VxeTableDefines.ColumnInfo) {
|
|
262
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
263
|
-
|
|
264
|
-
if (column) {
|
|
265
|
-
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
266
|
-
filterOptions.forEach((option) => {
|
|
267
|
-
option.checked = option._checked
|
|
268
|
-
})
|
|
269
|
-
$xeTable.confirmFilterEvent(evnt, column)
|
|
270
|
-
}
|
|
271
|
-
},
|
|
272
|
-
_saveFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
273
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
274
|
-
|
|
275
|
-
if (fieldOrColumn) {
|
|
276
|
-
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
277
|
-
$xeTable.handleFilterConfirmFilter(null, column)
|
|
278
|
-
}
|
|
279
|
-
return $xeTable.$nextTick()
|
|
280
|
-
},
|
|
281
|
-
_saveFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
282
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
283
|
-
|
|
284
|
-
if (fieldOrColumn) {
|
|
285
|
-
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
286
|
-
$xeTable.handleFilterConfirmFilter(evnt, column)
|
|
287
|
-
}
|
|
288
|
-
return $xeTable.$nextTick()
|
|
289
|
-
},
|
|
290
|
-
_resetFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
291
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
292
|
-
|
|
293
|
-
if (fieldOrColumn) {
|
|
294
|
-
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
295
|
-
$xeTable.handleFilterResetFilter(null, column)
|
|
296
|
-
}
|
|
297
|
-
return $xeTable.$nextTick()
|
|
298
|
-
},
|
|
299
|
-
_resetFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
300
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
301
|
-
|
|
302
|
-
if (fieldOrColumn) {
|
|
303
|
-
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
304
|
-
$xeTable.handleFilterResetFilter(evnt, column)
|
|
305
|
-
}
|
|
306
|
-
return $xeTable.$nextTick()
|
|
307
|
-
},
|
|
308
|
-
_saveFilterPanel () {
|
|
309
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
310
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
311
|
-
|
|
312
|
-
const { filterStore } = reactData
|
|
313
|
-
$xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
|
|
314
|
-
return $xeTable.$nextTick()
|
|
315
|
-
},
|
|
316
|
-
_saveFilterPanelByEvent (evnt: Event) {
|
|
317
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
318
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
319
|
-
|
|
320
|
-
const { filterStore } = reactData
|
|
321
|
-
$xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
|
|
322
|
-
return $xeTable.$nextTick()
|
|
323
|
-
},
|
|
324
|
-
_resetFilterPanel () {
|
|
325
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
326
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
327
|
-
|
|
328
|
-
const { filterStore } = reactData
|
|
329
|
-
$xeTable.handleFilterResetFilter(null, filterStore.column || null)
|
|
330
|
-
return $xeTable.$nextTick()
|
|
331
|
-
},
|
|
332
|
-
_resetFilterPanelByEvent (evnt: Event) {
|
|
333
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
334
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
335
|
-
|
|
336
|
-
const { filterStore } = reactData
|
|
337
|
-
$xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
|
|
338
|
-
return $xeTable.$nextTick()
|
|
339
|
-
},
|
|
340
|
-
_getCheckedFilters () {
|
|
341
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
342
|
-
const internalData = $xeTable as unknown as TableInternalData
|
|
343
|
-
|
|
344
|
-
const { tableFullColumn } = internalData
|
|
345
|
-
const filterList: VxeTableDefines.FilterCheckedParams[] = []
|
|
346
|
-
tableFullColumn.forEach((column) => {
|
|
347
|
-
const { field, filters } = column
|
|
348
|
-
const filterOptions = filters || []
|
|
349
|
-
const valueList: any[] = []
|
|
350
|
-
const dataList: any[] = []
|
|
351
|
-
if (filterOptions) {
|
|
352
|
-
filterOptions.forEach((item) => {
|
|
353
|
-
if (item.checked) {
|
|
354
|
-
valueList.push(item.value)
|
|
355
|
-
dataList.push(item.data)
|
|
356
|
-
}
|
|
357
|
-
})
|
|
358
|
-
if (valueList.length) {
|
|
359
|
-
filterList.push({ column, field, property: field, values: valueList, datas: dataList })
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
})
|
|
363
|
-
return filterList
|
|
364
|
-
},
|
|
365
|
-
handleColumnConfirmFilter (column: VxeTableDefines.ColumnInfo, evnt: Event | null) {
|
|
366
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
367
|
-
const props = $xeTable
|
|
368
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
369
|
-
|
|
370
|
-
const { mouseConfig } = props
|
|
371
|
-
const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
|
|
372
|
-
const filterOpts = $xeTable.computeFilterOpts
|
|
373
|
-
const mouseOpts = $xeTable.computeMouseOpts
|
|
374
|
-
const { field, filters } = column
|
|
375
|
-
const filterOptions = filters || []
|
|
376
|
-
const values: any[] = []
|
|
377
|
-
const datas: any[] = []
|
|
378
|
-
filterOptions.forEach((item) => {
|
|
379
|
-
if (item.checked) {
|
|
380
|
-
values.push(item.value)
|
|
381
|
-
datas.push(item.data)
|
|
382
|
-
}
|
|
383
|
-
})
|
|
384
|
-
const filterList = $xeTable.getCheckedFilters()
|
|
385
|
-
const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
|
|
386
|
-
// 如果是服务端筛选,则跳过本地筛选处理
|
|
387
|
-
if (!filterOpts.remote) {
|
|
388
|
-
$xeTable.handleTableData(true)
|
|
389
|
-
$xeTable.checkSelectionStatus()
|
|
390
|
-
}
|
|
391
|
-
if (mouseConfig && mouseOpts.area && $xeTable.handleFilterEvent) {
|
|
392
|
-
$xeTable.handleFilterEvent(evnt as Event, params)
|
|
393
|
-
}
|
|
394
|
-
if (evnt) {
|
|
395
|
-
$xeTable.dispatchEvent('filter-change', params, evnt)
|
|
396
|
-
}
|
|
397
|
-
$xeTable.closeFilter()
|
|
398
|
-
return $xeTable.updateFooter().then(() => {
|
|
399
|
-
const { scrollXLoad, scrollYLoad } = reactData
|
|
400
|
-
if ((oldScrollXLoad || scrollXLoad) || (oldScrollYLoad || scrollYLoad)) {
|
|
401
|
-
if ((oldScrollXLoad || scrollXLoad)) {
|
|
402
|
-
$xeTable.updateScrollXSpace()
|
|
403
|
-
}
|
|
404
|
-
if ((oldScrollYLoad || scrollYLoad)) {
|
|
405
|
-
$xeTable.updateScrollYSpace()
|
|
406
|
-
}
|
|
407
|
-
return $xeTable.refreshScroll()
|
|
408
|
-
}
|
|
409
|
-
}).then(() => {
|
|
410
|
-
$xeTable.updateCellAreas()
|
|
411
|
-
return $xeTable.recalculate(true)
|
|
412
|
-
}).then(() => {
|
|
413
|
-
// 存在滚动行为未结束情况
|
|
414
|
-
setTimeout(() => $xeTable.recalculate(), 50)
|
|
415
|
-
})
|
|
416
|
-
},
|
|
417
|
-
/**
|
|
418
|
-
* 确认筛选
|
|
419
|
-
* 当筛选面板中的确定按钮被按下时触发
|
|
420
|
-
*/
|
|
421
|
-
confirmFilterEvent (evnt: Event, column: VxeTableDefines.ColumnInfo) {
|
|
422
|
-
const $xeTable = this
|
|
423
|
-
|
|
424
|
-
if (column) {
|
|
425
|
-
$xeTable.handleColumnConfirmFilter(column, evnt)
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
|
-
handleClearFilter (column: any) {
|
|
429
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
430
|
-
|
|
431
|
-
if (column) {
|
|
432
|
-
const { filters, filterRender } = column
|
|
433
|
-
if (filters) {
|
|
434
|
-
const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
435
|
-
const filterResetMethod = column.filterResetMethod || (compConf ? (compConf.tableFilterResetMethod || compConf.filterResetMethod) : null)
|
|
436
|
-
filters.forEach((item: any) => {
|
|
437
|
-
item._checked = false
|
|
438
|
-
item.checked = false
|
|
439
|
-
if (!filterResetMethod) {
|
|
440
|
-
item.data = XEUtils.clone(item.resetValue, true)
|
|
441
|
-
}
|
|
442
|
-
})
|
|
443
|
-
if (filterResetMethod) {
|
|
444
|
-
filterResetMethod({ options: filters, column, $table: $xeTable })
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
},
|
|
449
|
-
/**
|
|
450
|
-
* 重置筛选
|
|
451
|
-
* 当筛选面板中的重置按钮被按下时触发
|
|
452
|
-
* @param {Event} evnt 事件
|
|
453
|
-
*/
|
|
454
|
-
handleFilterResetFilter (evnt: Event, column: VxeTableDefines.ColumnInfo) {
|
|
455
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
456
|
-
|
|
457
|
-
if (column) {
|
|
458
|
-
$xeTable.handleClearFilter(column)
|
|
459
|
-
$xeTable.confirmFilterEvent(evnt, column)
|
|
460
|
-
if (evnt) {
|
|
461
|
-
$xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
},
|
|
465
|
-
/**
|
|
466
|
-
* 清空指定列的筛选条件
|
|
467
|
-
* 如果为空则清空所有列的筛选条件
|
|
468
|
-
* @param {String} fieldOrColumn 列
|
|
469
|
-
*/
|
|
470
|
-
_clearFilter (fieldOrColumn: string | VxeTableDefines.ColumnInfo<any> | null | undefined) {
|
|
471
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
472
|
-
const reactData = $xeTable as unknown as TableReactData
|
|
473
|
-
const internalData = $xeTable as unknown as TableInternalData
|
|
474
|
-
|
|
475
|
-
const { filterStore } = reactData
|
|
476
|
-
const { tableFullColumn } = internalData
|
|
477
|
-
let column
|
|
478
|
-
if (fieldOrColumn) {
|
|
479
|
-
column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
480
|
-
if (column) {
|
|
481
|
-
$xeTable.handleClearFilter(column)
|
|
482
|
-
}
|
|
483
|
-
} else {
|
|
484
|
-
tableFullColumn.forEach($xeTable.handleClearFilter)
|
|
485
|
-
}
|
|
486
|
-
if (!fieldOrColumn || column !== filterStore.column) {
|
|
487
|
-
Object.assign(filterStore, {
|
|
488
|
-
isAllSelected: false,
|
|
489
|
-
isIndeterminate: false,
|
|
490
|
-
style: null,
|
|
491
|
-
options: [],
|
|
492
|
-
column: null,
|
|
493
|
-
multiple: false,
|
|
494
|
-
visible: false
|
|
495
|
-
})
|
|
496
|
-
}
|
|
497
|
-
return $xeTable.updateData()
|
|
498
|
-
},
|
|
499
|
-
_updateFilterOptionStatus (item: any, checked: boolean) {
|
|
500
|
-
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
501
|
-
|
|
502
|
-
item._checked = checked
|
|
503
|
-
item.checked = checked
|
|
504
|
-
return $xeTable.$nextTick()
|
|
505
|
-
}
|
|
506
|
-
} as any
|
|
507
|
-
}
|
|
1
|
+
import XEUtils from 'xe-utils'
|
|
2
|
+
import { VxeUI } from '../../../ui'
|
|
3
|
+
import { toFilters, handleFieldOrColumn, getRefElem } from '../../src/util'
|
|
4
|
+
import { toCssUnit, triggerEvent, getDomNode } from '../../../ui/src/dom'
|
|
5
|
+
import { isEnableConf } from '../../../ui/src/utils'
|
|
6
|
+
|
|
7
|
+
import type { VxeTableConstructor, VxeTableDefines, TableReactData, TableInternalData, VxeColumnPropTypes, VxeTablePrivateMethods } from '../../../../types'
|
|
8
|
+
|
|
9
|
+
const { renderer } = VxeUI
|
|
10
|
+
|
|
11
|
+
const sourceType = 'table'
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
methods: {
|
|
15
|
+
/**
|
|
16
|
+
* 手动弹出筛选面板
|
|
17
|
+
* @param column
|
|
18
|
+
*/
|
|
19
|
+
_openFilter (fieldOrColumn: any) {
|
|
20
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
21
|
+
const $xeGrid = $xeTable.$xeGrid
|
|
22
|
+
const $xeGantt = $xeTable.$xeGantt
|
|
23
|
+
|
|
24
|
+
const column = handleFieldOrColumn(this, fieldOrColumn)
|
|
25
|
+
if (column && column.filters) {
|
|
26
|
+
const { elemStore } = this
|
|
27
|
+
const { fixed, filters } = column
|
|
28
|
+
return $xeTable.scrollToColumn(column).then(() => {
|
|
29
|
+
const headerWrapperElem = (elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper']) as HTMLElement
|
|
30
|
+
if (headerWrapperElem) {
|
|
31
|
+
const filterBtnElem = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id} .vxe-cell--filter`)
|
|
32
|
+
if (filterBtnElem) {
|
|
33
|
+
triggerEvent(filterBtnElem, 'click')
|
|
34
|
+
} else {
|
|
35
|
+
const colEl = headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`)
|
|
36
|
+
if (colEl) {
|
|
37
|
+
let firstFilterOption: VxeTableDefines.FilterOption | null = null
|
|
38
|
+
if (filters) {
|
|
39
|
+
firstFilterOption = filters[0] as VxeTableDefines.FilterOption
|
|
40
|
+
}
|
|
41
|
+
const params = {
|
|
42
|
+
$table: $xeTable,
|
|
43
|
+
$grid: $xeGrid,
|
|
44
|
+
$gantt: $xeGantt,
|
|
45
|
+
$rowIndex: -1,
|
|
46
|
+
column,
|
|
47
|
+
columnIndex: $xeTable.getColumnIndex(column),
|
|
48
|
+
$columnIndex: $xeTable.getVMColumnIndex(column),
|
|
49
|
+
_columnIndex: $xeTable.getVTColumnIndex(column),
|
|
50
|
+
firstFilterOption: firstFilterOption as VxeTableDefines.FilterOption,
|
|
51
|
+
fixed,
|
|
52
|
+
source: sourceType,
|
|
53
|
+
type: 'header'
|
|
54
|
+
// isHidden
|
|
55
|
+
// hasFilter
|
|
56
|
+
}
|
|
57
|
+
$xeTable.handleOpenFilterColumn(new Event('click'), null, colEl, column, params)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
return $xeTable.$nextTick()
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* 修改筛选条件列表
|
|
67
|
+
* @param {ColumnInfo} fieldOrColumn 列
|
|
68
|
+
* @param {Array} options 选项
|
|
69
|
+
*/
|
|
70
|
+
_setFilter (fieldOrColumn: any, options: any, isUpdate: any) {
|
|
71
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
72
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
73
|
+
|
|
74
|
+
const { filterStore } = reactData
|
|
75
|
+
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
76
|
+
if (column && column.filters) {
|
|
77
|
+
column.filters = toFilters(options || [], column.id)
|
|
78
|
+
if (isUpdate) {
|
|
79
|
+
return $xeTable.handleColumnConfirmFilter(column, null)
|
|
80
|
+
} else {
|
|
81
|
+
if (filterStore.visible) {
|
|
82
|
+
$xeTable.handleFilterOptions(column)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return $xeTable.$nextTick()
|
|
87
|
+
},
|
|
88
|
+
checkFilterOptions () {
|
|
89
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
90
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
91
|
+
|
|
92
|
+
const { filterStore } = reactData
|
|
93
|
+
const { column } = filterStore
|
|
94
|
+
if (column) {
|
|
95
|
+
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
96
|
+
filterStore.isAllSelected = filterOptions.every((item) => item._checked)
|
|
97
|
+
filterStore.isIndeterminate = !filterStore.isAllSelected && filterOptions.some((item) => item._checked)
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
handleOpenFilterColumn (evnt: MouseEvent, btnEl: HTMLDivElement | null, colEl: HTMLDivElement, column: VxeTableDefines.ColumnInfo, params: any) {
|
|
101
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
102
|
+
const $xeGrid = $xeTable.$xeGrid
|
|
103
|
+
const $xeGantt = $xeTable.$xeGantt
|
|
104
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
105
|
+
const internalData = $xeTable as unknown as TableInternalData
|
|
106
|
+
const $xeGGWrapper = $xeGrid || $xeGantt
|
|
107
|
+
|
|
108
|
+
const { initStore, filterStore } = reactData
|
|
109
|
+
const { elemStore } = internalData
|
|
110
|
+
if (filterStore.column === column && filterStore.visible) {
|
|
111
|
+
filterStore.visible = false
|
|
112
|
+
} else {
|
|
113
|
+
const tableEl = $xeTable.$refs.refElem as HTMLDivElement
|
|
114
|
+
const { scrollTop, scrollLeft, visibleHeight, visibleWidth } = getDomNode()
|
|
115
|
+
const filterOpts = $xeTable.computeFilterOpts
|
|
116
|
+
const { maxHeight: customMaxHeight, transfer, zIndex } = filterOpts
|
|
117
|
+
const currEl = btnEl || colEl
|
|
118
|
+
const tableRect = tableEl.getBoundingClientRect()
|
|
119
|
+
const filterRender = column ? column.filterRender : null
|
|
120
|
+
const compConf = filterRender && isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
121
|
+
$xeTable.handleFilterOptions(column)
|
|
122
|
+
internalData._currFilterParams = params
|
|
123
|
+
filterStore.style = null
|
|
124
|
+
filterStore.visible = true
|
|
125
|
+
initStore.filter = true
|
|
126
|
+
$xeTable.$nextTick(() => {
|
|
127
|
+
const headerScrollElem = getRefElem(elemStore['main-header-scroll'])
|
|
128
|
+
if (!headerScrollElem) {
|
|
129
|
+
return
|
|
130
|
+
}
|
|
131
|
+
const tableFilter = $xeTable.$refs.refTableFilter
|
|
132
|
+
const filterWrapperElem = tableFilter ? (tableFilter as any).$el as HTMLDivElement : null
|
|
133
|
+
if (!filterWrapperElem) {
|
|
134
|
+
return
|
|
135
|
+
}
|
|
136
|
+
const btnRect = currEl.getBoundingClientRect()
|
|
137
|
+
const filterHeadElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-header')
|
|
138
|
+
const filterFootElem = filterWrapperElem.querySelector<HTMLDivElement>('.vxe-table--filter-footer')
|
|
139
|
+
const filterWidth = filterWrapperElem.offsetWidth
|
|
140
|
+
const centerWidth = filterWidth / 2
|
|
141
|
+
let left = 0
|
|
142
|
+
let top = 0
|
|
143
|
+
let maxHeight = 0
|
|
144
|
+
if (transfer) {
|
|
145
|
+
left = btnRect.left - centerWidth + scrollLeft
|
|
146
|
+
top = btnRect.top + currEl.clientHeight + scrollTop
|
|
147
|
+
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))
|
|
148
|
+
if (left < 16) {
|
|
149
|
+
left = 16
|
|
150
|
+
} else if (left > (visibleWidth - filterWidth - 16)) {
|
|
151
|
+
left = visibleWidth - filterWidth - 16
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
left = btnRect.left - tableRect.left - centerWidth
|
|
155
|
+
top = btnRect.top - tableRect.top + currEl.clientHeight
|
|
156
|
+
maxHeight = Math.max(40, tableEl.clientHeight - top - (filterHeadElem ? filterHeadElem.clientHeight : 0) - (filterFootElem ? filterFootElem.clientHeight : 0) - 14)
|
|
157
|
+
if (left < 1) {
|
|
158
|
+
left = 1
|
|
159
|
+
} else if (left > (tableEl.clientWidth - filterWidth - 1)) {
|
|
160
|
+
left = tableEl.clientWidth - filterWidth - 1
|
|
161
|
+
}
|
|
162
|
+
if ($xeGGWrapper) {
|
|
163
|
+
const wrapperEl = $xeGGWrapper.$refs.refElem as HTMLDivElement
|
|
164
|
+
if (wrapperEl) {
|
|
165
|
+
const wrapperRect = wrapperEl.getBoundingClientRect()
|
|
166
|
+
top += tableRect.top - wrapperRect.top
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const fStys: Record<string, any> = {
|
|
171
|
+
top: toCssUnit(top),
|
|
172
|
+
left: toCssUnit(left)
|
|
173
|
+
}
|
|
174
|
+
if (zIndex) {
|
|
175
|
+
fStys.zIndex = zIndex
|
|
176
|
+
}
|
|
177
|
+
filterStore.style = fStys
|
|
178
|
+
// 筛选面板是自适应表格高度
|
|
179
|
+
if (compConf ? !compConf.tableFilterAutoHeight : false) {
|
|
180
|
+
maxHeight = 0
|
|
181
|
+
} else {
|
|
182
|
+
if (customMaxHeight) {
|
|
183
|
+
maxHeight = customMaxHeight > maxHeight ? maxHeight : customMaxHeight
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 判断面板不能大于表格高度
|
|
187
|
+
filterStore.maxHeight = maxHeight
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
$xeTable.dispatchEvent('filter-visible', { column, field: column.field, property: column.field, filterList: $xeTable.getCheckedFilters(), visible: filterStore.visible }, evnt)
|
|
191
|
+
},
|
|
192
|
+
/**
|
|
193
|
+
* 点击筛选事件
|
|
194
|
+
* 当筛选图标被点击时触发
|
|
195
|
+
* 更新选项是否全部状态
|
|
196
|
+
* 打开筛选面板
|
|
197
|
+
* @param {Event} evnt 事件
|
|
198
|
+
* @param {ColumnInfo} column 列配置
|
|
199
|
+
* @param {Object} params 参数
|
|
200
|
+
*/
|
|
201
|
+
triggerFilterEvent (evnt: MouseEvent, column: VxeTableDefines.ColumnInfo, params: any) {
|
|
202
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
203
|
+
const internalData = $xeTable as unknown as TableInternalData
|
|
204
|
+
|
|
205
|
+
const { elemStore } = internalData
|
|
206
|
+
const { fixed } = column
|
|
207
|
+
const headerWrapperElem = getRefElem(elemStore[`${fixed || 'main'}-header-wrapper`] || elemStore['main-header-wrapper'])
|
|
208
|
+
const btnElem = evnt.currentTarget as HTMLDivElement
|
|
209
|
+
const colEl = headerWrapperElem ? headerWrapperElem.querySelector<HTMLElement>(`.vxe-header--column.${column.id}`) : null
|
|
210
|
+
$xeTable.handleOpenFilterColumn(evnt, btnElem, colEl || btnElem, column, params)
|
|
211
|
+
},
|
|
212
|
+
// (单选)筛选发生改变
|
|
213
|
+
handleFilterChangeRadioOption (evnt: Event, checked: boolean, item: any) {
|
|
214
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
215
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
216
|
+
|
|
217
|
+
const { filterStore } = reactData
|
|
218
|
+
const { column } = filterStore
|
|
219
|
+
if (column) {
|
|
220
|
+
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
221
|
+
filterOptions.forEach((option) => {
|
|
222
|
+
option._checked = false
|
|
223
|
+
})
|
|
224
|
+
item._checked = checked
|
|
225
|
+
$xeTable.checkFilterOptions()
|
|
226
|
+
$xeTable.handleFilterConfirmFilter(evnt, column)
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
// (多选)筛选发生改变
|
|
230
|
+
handleFilterChangeMultipleOption (evnt: Event, checked: boolean, item: any) {
|
|
231
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
232
|
+
|
|
233
|
+
item._checked = checked
|
|
234
|
+
$xeTable.checkFilterOptions()
|
|
235
|
+
},
|
|
236
|
+
// 筛选发生改变
|
|
237
|
+
handleFilterChangeOption (evnt: Event, checked: boolean, item: any) {
|
|
238
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
239
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
240
|
+
const internalData = $xeTable as unknown as TableInternalData
|
|
241
|
+
|
|
242
|
+
const { filterStore } = reactData
|
|
243
|
+
const { fullColumnIdData } = internalData
|
|
244
|
+
let column = filterStore.column
|
|
245
|
+
if (!column) {
|
|
246
|
+
const colRest = fullColumnIdData[item._colId]
|
|
247
|
+
if (colRest) {
|
|
248
|
+
column = colRest.column
|
|
249
|
+
filterStore.column = column
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (column) {
|
|
253
|
+
if (column.filterMultiple) {
|
|
254
|
+
$xeTable.handleFilterChangeMultipleOption(evnt, checked, item)
|
|
255
|
+
} else {
|
|
256
|
+
$xeTable.handleFilterChangeRadioOption(evnt, checked, item)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
// 确认筛选
|
|
261
|
+
handleFilterConfirmFilter (evnt: Event | null, column: VxeTableDefines.ColumnInfo) {
|
|
262
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
263
|
+
|
|
264
|
+
if (column) {
|
|
265
|
+
const filterOptions = (column.filters || []) as VxeTableDefines.FilterOption[]
|
|
266
|
+
filterOptions.forEach((option) => {
|
|
267
|
+
option.checked = option._checked
|
|
268
|
+
})
|
|
269
|
+
$xeTable.confirmFilterEvent(evnt, column)
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
_saveFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
273
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
274
|
+
|
|
275
|
+
if (fieldOrColumn) {
|
|
276
|
+
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
277
|
+
$xeTable.handleFilterConfirmFilter(null, column)
|
|
278
|
+
}
|
|
279
|
+
return $xeTable.$nextTick()
|
|
280
|
+
},
|
|
281
|
+
_saveFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
282
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
283
|
+
|
|
284
|
+
if (fieldOrColumn) {
|
|
285
|
+
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
286
|
+
$xeTable.handleFilterConfirmFilter(evnt, column)
|
|
287
|
+
}
|
|
288
|
+
return $xeTable.$nextTick()
|
|
289
|
+
},
|
|
290
|
+
_resetFilter (fieldOrColumn?: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
291
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
292
|
+
|
|
293
|
+
if (fieldOrColumn) {
|
|
294
|
+
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
295
|
+
$xeTable.handleFilterResetFilter(null, column)
|
|
296
|
+
}
|
|
297
|
+
return $xeTable.$nextTick()
|
|
298
|
+
},
|
|
299
|
+
_resetFilterByEvent (evnt: Event, fieldOrColumn: VxeColumnPropTypes.Field | VxeTableDefines.ColumnInfo | null) {
|
|
300
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
301
|
+
|
|
302
|
+
if (fieldOrColumn) {
|
|
303
|
+
const column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
304
|
+
$xeTable.handleFilterResetFilter(evnt, column)
|
|
305
|
+
}
|
|
306
|
+
return $xeTable.$nextTick()
|
|
307
|
+
},
|
|
308
|
+
_saveFilterPanel () {
|
|
309
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
310
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
311
|
+
|
|
312
|
+
const { filterStore } = reactData
|
|
313
|
+
$xeTable.handleFilterConfirmFilter(null, filterStore.column || null)
|
|
314
|
+
return $xeTable.$nextTick()
|
|
315
|
+
},
|
|
316
|
+
_saveFilterPanelByEvent (evnt: Event) {
|
|
317
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
318
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
319
|
+
|
|
320
|
+
const { filterStore } = reactData
|
|
321
|
+
$xeTable.handleFilterConfirmFilter(evnt, filterStore.column || null)
|
|
322
|
+
return $xeTable.$nextTick()
|
|
323
|
+
},
|
|
324
|
+
_resetFilterPanel () {
|
|
325
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
326
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
327
|
+
|
|
328
|
+
const { filterStore } = reactData
|
|
329
|
+
$xeTable.handleFilterResetFilter(null, filterStore.column || null)
|
|
330
|
+
return $xeTable.$nextTick()
|
|
331
|
+
},
|
|
332
|
+
_resetFilterPanelByEvent (evnt: Event) {
|
|
333
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
334
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
335
|
+
|
|
336
|
+
const { filterStore } = reactData
|
|
337
|
+
$xeTable.handleFilterResetFilter(evnt, filterStore.column || null)
|
|
338
|
+
return $xeTable.$nextTick()
|
|
339
|
+
},
|
|
340
|
+
_getCheckedFilters () {
|
|
341
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
342
|
+
const internalData = $xeTable as unknown as TableInternalData
|
|
343
|
+
|
|
344
|
+
const { tableFullColumn } = internalData
|
|
345
|
+
const filterList: VxeTableDefines.FilterCheckedParams[] = []
|
|
346
|
+
tableFullColumn.forEach((column) => {
|
|
347
|
+
const { field, filters } = column
|
|
348
|
+
const filterOptions = filters || []
|
|
349
|
+
const valueList: any[] = []
|
|
350
|
+
const dataList: any[] = []
|
|
351
|
+
if (filterOptions) {
|
|
352
|
+
filterOptions.forEach((item) => {
|
|
353
|
+
if (item.checked) {
|
|
354
|
+
valueList.push(item.value)
|
|
355
|
+
dataList.push(item.data)
|
|
356
|
+
}
|
|
357
|
+
})
|
|
358
|
+
if (valueList.length) {
|
|
359
|
+
filterList.push({ column, field, property: field, values: valueList, datas: dataList })
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
})
|
|
363
|
+
return filterList
|
|
364
|
+
},
|
|
365
|
+
handleColumnConfirmFilter (column: VxeTableDefines.ColumnInfo, evnt: Event | null) {
|
|
366
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
367
|
+
const props = $xeTable
|
|
368
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
369
|
+
|
|
370
|
+
const { mouseConfig } = props
|
|
371
|
+
const { scrollXLoad: oldScrollXLoad, scrollYLoad: oldScrollYLoad } = reactData
|
|
372
|
+
const filterOpts = $xeTable.computeFilterOpts
|
|
373
|
+
const mouseOpts = $xeTable.computeMouseOpts
|
|
374
|
+
const { field, filters } = column
|
|
375
|
+
const filterOptions = filters || []
|
|
376
|
+
const values: any[] = []
|
|
377
|
+
const datas: any[] = []
|
|
378
|
+
filterOptions.forEach((item) => {
|
|
379
|
+
if (item.checked) {
|
|
380
|
+
values.push(item.value)
|
|
381
|
+
datas.push(item.data)
|
|
382
|
+
}
|
|
383
|
+
})
|
|
384
|
+
const filterList = $xeTable.getCheckedFilters()
|
|
385
|
+
const params = { $table: $xeTable, $event: evnt as Event, column, field, property: field, values, datas, filters: filterList, filterList }
|
|
386
|
+
// 如果是服务端筛选,则跳过本地筛选处理
|
|
387
|
+
if (!filterOpts.remote) {
|
|
388
|
+
$xeTable.handleTableData(true)
|
|
389
|
+
$xeTable.checkSelectionStatus()
|
|
390
|
+
}
|
|
391
|
+
if (mouseConfig && mouseOpts.area && $xeTable.handleFilterEvent) {
|
|
392
|
+
$xeTable.handleFilterEvent(evnt as Event, params)
|
|
393
|
+
}
|
|
394
|
+
if (evnt) {
|
|
395
|
+
$xeTable.dispatchEvent('filter-change', params, evnt)
|
|
396
|
+
}
|
|
397
|
+
$xeTable.closeFilter()
|
|
398
|
+
return $xeTable.updateFooter().then(() => {
|
|
399
|
+
const { scrollXLoad, scrollYLoad } = reactData
|
|
400
|
+
if ((oldScrollXLoad || scrollXLoad) || (oldScrollYLoad || scrollYLoad)) {
|
|
401
|
+
if ((oldScrollXLoad || scrollXLoad)) {
|
|
402
|
+
$xeTable.updateScrollXSpace()
|
|
403
|
+
}
|
|
404
|
+
if ((oldScrollYLoad || scrollYLoad)) {
|
|
405
|
+
$xeTable.updateScrollYSpace()
|
|
406
|
+
}
|
|
407
|
+
return $xeTable.refreshScroll()
|
|
408
|
+
}
|
|
409
|
+
}).then(() => {
|
|
410
|
+
$xeTable.updateCellAreas()
|
|
411
|
+
return $xeTable.recalculate(true)
|
|
412
|
+
}).then(() => {
|
|
413
|
+
// 存在滚动行为未结束情况
|
|
414
|
+
setTimeout(() => $xeTable.recalculate(), 50)
|
|
415
|
+
})
|
|
416
|
+
},
|
|
417
|
+
/**
|
|
418
|
+
* 确认筛选
|
|
419
|
+
* 当筛选面板中的确定按钮被按下时触发
|
|
420
|
+
*/
|
|
421
|
+
confirmFilterEvent (evnt: Event, column: VxeTableDefines.ColumnInfo) {
|
|
422
|
+
const $xeTable = this
|
|
423
|
+
|
|
424
|
+
if (column) {
|
|
425
|
+
$xeTable.handleColumnConfirmFilter(column, evnt)
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
handleClearFilter (column: any) {
|
|
429
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
430
|
+
|
|
431
|
+
if (column) {
|
|
432
|
+
const { filters, filterRender } = column
|
|
433
|
+
if (filters) {
|
|
434
|
+
const compConf = isEnableConf(filterRender) ? renderer.get(filterRender.name) : null
|
|
435
|
+
const filterResetMethod = column.filterResetMethod || (compConf ? (compConf.tableFilterResetMethod || compConf.filterResetMethod) : null)
|
|
436
|
+
filters.forEach((item: any) => {
|
|
437
|
+
item._checked = false
|
|
438
|
+
item.checked = false
|
|
439
|
+
if (!filterResetMethod) {
|
|
440
|
+
item.data = XEUtils.clone(item.resetValue, true)
|
|
441
|
+
}
|
|
442
|
+
})
|
|
443
|
+
if (filterResetMethod) {
|
|
444
|
+
filterResetMethod({ options: filters, column, $table: $xeTable })
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
/**
|
|
450
|
+
* 重置筛选
|
|
451
|
+
* 当筛选面板中的重置按钮被按下时触发
|
|
452
|
+
* @param {Event} evnt 事件
|
|
453
|
+
*/
|
|
454
|
+
handleFilterResetFilter (evnt: Event, column: VxeTableDefines.ColumnInfo) {
|
|
455
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
456
|
+
|
|
457
|
+
if (column) {
|
|
458
|
+
$xeTable.handleClearFilter(column)
|
|
459
|
+
$xeTable.confirmFilterEvent(evnt, column)
|
|
460
|
+
if (evnt) {
|
|
461
|
+
$xeTable.dispatchEvent('clear-filter', { filterList: [] }, evnt)
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
/**
|
|
466
|
+
* 清空指定列的筛选条件
|
|
467
|
+
* 如果为空则清空所有列的筛选条件
|
|
468
|
+
* @param {String} fieldOrColumn 列
|
|
469
|
+
*/
|
|
470
|
+
_clearFilter (fieldOrColumn: string | VxeTableDefines.ColumnInfo<any> | null | undefined) {
|
|
471
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
472
|
+
const reactData = $xeTable as unknown as TableReactData
|
|
473
|
+
const internalData = $xeTable as unknown as TableInternalData
|
|
474
|
+
|
|
475
|
+
const { filterStore } = reactData
|
|
476
|
+
const { tableFullColumn } = internalData
|
|
477
|
+
let column
|
|
478
|
+
if (fieldOrColumn) {
|
|
479
|
+
column = handleFieldOrColumn($xeTable, fieldOrColumn)
|
|
480
|
+
if (column) {
|
|
481
|
+
$xeTable.handleClearFilter(column)
|
|
482
|
+
}
|
|
483
|
+
} else {
|
|
484
|
+
tableFullColumn.forEach($xeTable.handleClearFilter)
|
|
485
|
+
}
|
|
486
|
+
if (!fieldOrColumn || column !== filterStore.column) {
|
|
487
|
+
Object.assign(filterStore, {
|
|
488
|
+
isAllSelected: false,
|
|
489
|
+
isIndeterminate: false,
|
|
490
|
+
style: null,
|
|
491
|
+
options: [],
|
|
492
|
+
column: null,
|
|
493
|
+
multiple: false,
|
|
494
|
+
visible: false
|
|
495
|
+
})
|
|
496
|
+
}
|
|
497
|
+
return $xeTable.updateData()
|
|
498
|
+
},
|
|
499
|
+
_updateFilterOptionStatus (item: any, checked: boolean) {
|
|
500
|
+
const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
|
|
501
|
+
|
|
502
|
+
item._checked = checked
|
|
503
|
+
item.checked = checked
|
|
504
|
+
return $xeTable.$nextTick()
|
|
505
|
+
}
|
|
506
|
+
} as any
|
|
507
|
+
}
|