mirror of
https://github.com/element-plus/element-plus.git
synced 2025-02-17 11:49:41 +08:00
fix(table): fix the filter panel of the table (#509)
This commit is contained in:
parent
498f327e0f
commit
66746333cb
@ -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
|
|
@ -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,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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%">
|
||||||
|
@ -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%">
|
||||||
|
@ -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%">
|
||||||
|
@ -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%">
|
||||||
|
Loading…
Reference in New Issue
Block a user