fix(table): fix the filter panel of the table (#509)

This commit is contained in:
justwiner 2020-10-30 11:28:45 +08:00 committed by GitHub
parent 498f327e0f
commit 66746333cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 68 additions and 114 deletions

View File

@ -1,35 +0,0 @@
import isServer from '@element-plus/utils/isServer'
const dropdowns = []
!isServer && document.addEventListener('click', function (event: Event) {
dropdowns.forEach(function (dropdown) {
const target = event.target
if (!dropdown || !dropdown.$el) return
if (target === dropdown.$el || dropdown.$el.contains(target)) {
return
}
dropdown.handleOutsideClick && dropdown.handleOutsideClick(event)
})
})
function useDropdown(instance) {
const open = () => {
if (instance) {
dropdowns.push(instance)
}
}
const close = () => {
const index = dropdowns.indexOf(instance)
if (index !== -1) {
dropdowns.splice(instance, 1)
}
}
return {
open,
close,
}
}
export default useDropdown

View File

@ -1,78 +1,76 @@
<template> <template>
<el-popper <el-popper
ref="tooltip" ref="tooltip"
v-model:visible="tooltipVisible"
:offset="0" :offset="0"
:placement="placement" :placement="placement"
:show-arrow="false" :show-arrow="false"
:trigger="['click']" trigger="click"
:visible="tooltipVisible"
effect="light" effect="light"
popper-class="el-table-filter el-table-filter-padding" popper-class="el-table-filter el-table-filter-padding"
> >
<template #default> <template #default>
<div v-click-outside="handleOutsideClick"> <div v-if="multiple">
<div v-if="multiple"> <div class="el-table-filter__content">
<div class="el-table-filter__content"> <el-scrollbar
<el-scrollbar :native="false"
:native="false" :noresize="true"
:noresize="true" wrap-class="el-table-filter__wrap"
wrap-class="el-table-filter__wrap" >
<el-checkbox-group
v-model="filteredValue"
class="el-table-filter__checkbox-group"
> >
<el-checkbox-group <el-checkbox
v-model="filteredValue" v-for="filter in filters"
class="el-table-filter__checkbox-group" :key="filter.value"
:label="filter.value"
> >
<el-checkbox {{ filter.text }}
v-for="filter in filters" </el-checkbox>
:key="filter.value" </el-checkbox-group>
:label="filter.value" </el-scrollbar>
>
{{ filter.text }}
</el-checkbox>
</el-checkbox-group>
</el-scrollbar>
</div>
<div class="el-table-filter__bottom">
<button
:class="{ 'is-disabled': filteredValue.length === 0 }"
:disabled="filteredValue.length === 0"
type
@click="handleConfirm"
>
{{ t('el.table.confirmFilter') }}
</button>
<button type @click="handleReset">
{{ t('el.table.resetFilter') }}
</button>
</div>
</div> </div>
<ul v-else class="el-table-filter__list"> <div class="el-table-filter__bottom">
<li <button
:class="{ :class="{ 'is-disabled': filteredValue.length === 0 }"
'is-active': filterValue === undefined || filterValue === null, :disabled="filteredValue.length === 0"
}" type
class="el-table-filter__list-item" @click="handleConfirm"
@click="handleSelect(null)"
> >
{{ t('el.table.clearFilter') }} {{ t('el.table.confirmFilter') }}
</li> </button>
<li <button type @click="handleReset">
v-for="filter in filters" {{ t('el.table.resetFilter') }}
:key="filter.value" </button>
:class="{ 'is-active': isActive(filter) }" </div>
:label="filter.value"
class="el-table-filter__list-item"
@click="handleSelect(filter.value)"
>
{{ filter.text }}
</li>
</ul>
</div> </div>
<ul v-else class="el-table-filter__list">
<li
:class="{
'is-active': filterValue === undefined || filterValue === null,
}"
class="el-table-filter__list-item"
@click="handleSelect(null)"
>
{{ t('el.table.clearFilter') }}
</li>
<li
v-for="filter in filters"
:key="filter.value"
:class="{ 'is-active': isActive(filter) }"
:label="filter.value"
class="el-table-filter__list-item"
@click="handleSelect(filter.value)"
>
{{ filter.text }}
</li>
</ul>
</template> </template>
<template #trigger> <template #trigger>
<span <span
class="el-table__column-filter-trigger el-none-outline" class="el-table__column-filter-trigger el-none-outline"
@click="tooltipVisible = true" @click="showFilterPanel"
> >
<i <i
:class="[ :class="[
@ -88,8 +86,6 @@
<script lang='ts'> <script lang='ts'>
import { Popper as ElPopper } from '@element-plus/popper' import { Popper as ElPopper } from '@element-plus/popper'
import { t } from '@element-plus/locale' import { t } from '@element-plus/locale'
import { ClickOutside } from '@element-plus/directives'
import useDropdown from './dropdown'
import { Checkbox as ElCheckbox, CheckboxGroup as ElCheckboxGroup } from '@element-plus/checkbox' import { Checkbox as ElCheckbox, CheckboxGroup as ElCheckboxGroup } from '@element-plus/checkbox'
import { Scrollbar as ElScrollbar } from '@element-plus/scrollbar' import { Scrollbar as ElScrollbar } from '@element-plus/scrollbar'
import { import {
@ -104,18 +100,12 @@ import { Store, TableColumnCtx, TableHeader } from './table'
export default { export default {
name: 'ElTableFilterPanel', name: 'ElTableFilterPanel',
directives: {
ClickOutside,
},
components: { components: {
ElCheckbox, ElCheckbox,
ElCheckboxGroup, ElCheckboxGroup,
ElScrollbar, ElScrollbar,
ElPopper, ElPopper,
}, },
props: { props: {
placement: { placement: {
type: String, type: String,
@ -138,7 +128,6 @@ export default {
parent.filterPanels.value[props.column.id] = instance parent.filterPanels.value[props.column.id] = instance
} }
const tooltipVisible = ref(false) const tooltipVisible = ref(false)
const { open, close } = useDropdown(instance)
const filters = computed(() => { const filters = computed(() => {
return props.column && props.column.filters return props.column && props.column.filters
@ -179,21 +168,23 @@ export default {
return filter.value === filterValue.value return filter.value === filterValue.value
} }
const handleOutsideClick = () => { const hidden = () => {
setTimeout(() => { tooltipVisible.value = false
tooltipVisible.value = false }
}, 16) const showFilterPanel = (e: MouseEvent) => {
e.stopPropagation()
tooltipVisible.value = true
} }
const handleConfirm = () => { const handleConfirm = () => {
confirmFilter(filteredValue.value) confirmFilter(filteredValue.value)
handleOutsideClick() hidden()
} }
const handleReset = () => { const handleReset = () => {
filteredValue.value = [] filteredValue.value = []
confirmFilter(filteredValue.value) confirmFilter(filteredValue.value)
handleOutsideClick() hidden()
} }
const handleSelect = (_filterValue?: string | string[]) => { const handleSelect = (_filterValue?: string | string[]) => {
@ -203,7 +194,7 @@ export default {
} else { } else {
confirmFilter([]) confirmFilter([])
} }
handleOutsideClick() hidden()
} }
const confirmFilter = (filteredValue: unknown[]) => { const confirmFilter = (filteredValue: unknown[]) => {
@ -220,11 +211,6 @@ export default {
if (props.column) { if (props.column) {
props.upDataColumn('filterOpened', value) props.upDataColumn('filterOpened', value)
} }
if (value) {
open()
} else {
close()
}
}, },
{ {
immediate: true, immediate: true,
@ -232,7 +218,6 @@ export default {
) )
return { return {
tooltipVisible, tooltipVisible,
handleOutsideClick,
multiple, multiple,
filteredValue, filteredValue,
filterValue, filterValue,
@ -242,6 +227,7 @@ export default {
handleSelect, handleSelect,
isActive, isActive,
t, t,
showFilterPanel,
} }
}, },
} }

View File

@ -18,7 +18,6 @@ function useEvent(props: TableHeaderProps, emit) {
} else if (column.filterable && !column.sortable) { } else if (column.filterable && !column.sortable) {
handleFilterClick(event) handleFilterClick(event)
} }
parent.emit('header-click', column, event) parent.emit('header-click', column, event)
} }

View File

@ -996,6 +996,7 @@ Filter the table to find desired data.
<el-button @click="resetDateFilter">reset date filter</el-button> <el-button @click="resetDateFilter">reset date filter</el-button>
<el-button @click="clearFilter">reset all filters</el-button> <el-button @click="clearFilter">reset all filters</el-button>
<el-table <el-table
row-key="date"
ref="filterTable" ref="filterTable"
:data="tableData" :data="tableData"
style="width: 100%"> style="width: 100%">

View File

@ -996,6 +996,7 @@ Filtra la tabla para encontrar la información que necesita.
<el-button @click="resetDateFilter">清除日期过滤器</el-button> <el-button @click="resetDateFilter">清除日期过滤器</el-button>
<el-button @click="clearFilter">清除所有过滤器</el-button> <el-button @click="clearFilter">清除所有过滤器</el-button>
<el-table <el-table
row-key="date"
ref="filterTable" ref="filterTable"
:data="tableData" :data="tableData"
style="width: 100%"> style="width: 100%">

View File

@ -996,6 +996,7 @@ Vous pouvez filtrer la table pour obtenir rapidement les lignes désirées.
<el-button @click="resetDateFilter">Effacer le filtre date</el-button> <el-button @click="resetDateFilter">Effacer le filtre date</el-button>
<el-button @click="clearFilter">Effacer tout les filtres</el-button> <el-button @click="clearFilter">Effacer tout les filtres</el-button>
<el-table <el-table
row-key="date"
ref="filterTable" ref="filterTable"
:data="tableData" :data="tableData"
style="width: 100%"> style="width: 100%">

View File

@ -996,6 +996,7 @@
<el-button @click="resetDateFilter">清除日期过滤器</el-button> <el-button @click="resetDateFilter">清除日期过滤器</el-button>
<el-button @click="clearFilter">清除所有过滤器</el-button> <el-button @click="clearFilter">清除所有过滤器</el-button>
<el-table <el-table
row-key="date"
ref="filterTable" ref="filterTable"
:data="tableData" :data="tableData"
style="width: 100%"> style="width: 100%">