| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <template>
- <transition name="el-zoom-in-top">
- <div
- class="el-table-filter"
- v-if="multiple"
- v-clickoutside="handleOutsideClick"
- v-show="showPopper">
- <div class="el-table-filter__content">
- <el-scrollbar wrap-class="el-table-filter__wrap">
- <el-checkbox-group class="el-table-filter__checkbox-group" v-model="filteredValue">
- <el-checkbox
- v-for="filter in filters"
- :key="filter.value"
- :label="filter.value">{{ filter.text }}</el-checkbox>
- </el-checkbox-group>
- </el-scrollbar>
- </div>
- <div class="el-table-filter__bottom">
- <button @click="handleConfirm"
- :class="{ 'is-disabled': filteredValue.length === 0 }"
- :disabled="filteredValue.length === 0">{{ t('el.table.confirmFilter') }}</button>
- <button @click="handleReset">{{ t('el.table.resetFilter') }}</button>
- </div>
- </div>
- <div
- class="el-table-filter"
- v-else
- v-clickoutside="handleOutsideClick"
- v-show="showPopper">
- <ul class="el-table-filter__list">
- <li class="el-table-filter__list-item"
- :class="{ 'is-active': filterValue === undefined || filterValue === null }"
- @click="handleSelect(null)">{{ t('el.table.clearFilter') }}</li>
- <li class="el-table-filter__list-item"
- v-for="filter in filters"
- :label="filter.value"
- :key="filter.value"
- :class="{ 'is-active': isActive(filter) }"
- @click="handleSelect(filter.value)" >{{ filter.text }}</li>
- </ul>
- </div>
- </transition>
- </template>
- <script type="text/babel">
- import Popper from 'element-ui/src/utils/vue-popper';
- import { PopupManager } from 'element-ui/src/utils/popup';
- import Locale from 'element-ui/src/mixins/locale';
- import Clickoutside from 'element-ui/src/utils/clickoutside';
- import Dropdown from './dropdown';
- import ElCheckbox from 'element-ui/packages/checkbox';
- import ElCheckboxGroup from 'element-ui/packages/checkbox-group';
- import ElScrollbar from 'element-ui/packages/scrollbar';
- export default {
- name: 'ElTableFilterPanel',
- mixins: [Popper, Locale],
- directives: {
- Clickoutside
- },
- components: {
- ElCheckbox,
- ElCheckboxGroup,
- ElScrollbar
- },
- props: {
- placement: {
- type: String,
- default: 'bottom-end'
- }
- },
- methods: {
- isActive(filter) {
- return filter.value === this.filterValue;
- },
- handleOutsideClick() {
- setTimeout(() => {
- this.showPopper = false;
- }, 16);
- },
- handleConfirm() {
- this.confirmFilter(this.filteredValue);
- this.handleOutsideClick();
- },
- handleReset() {
- this.filteredValue = [];
- this.confirmFilter(this.filteredValue);
- this.handleOutsideClick();
- },
- handleSelect(filterValue) {
- this.filterValue = filterValue;
- if ((typeof filterValue !== 'undefined') && (filterValue !== null)) {
- this.confirmFilter(this.filteredValue);
- } else {
- this.confirmFilter([]);
- }
- this.handleOutsideClick();
- },
- confirmFilter(filteredValue) {
- this.table.store.commit('filterChange', {
- column: this.column,
- values: filteredValue
- });
- this.table.store.updateAllSelected();
- }
- },
- data() {
- return {
- table: null,
- cell: null,
- column: null
- };
- },
- computed: {
- filters() {
- return this.column && this.column.filters;
- },
- filterValue: {
- get() {
- return (this.column.filteredValue || [])[0];
- },
- set(value) {
- if (this.filteredValue) {
- if ((typeof value !== 'undefined') && (value !== null)) {
- this.filteredValue.splice(0, 1, value);
- } else {
- this.filteredValue.splice(0, 1);
- }
- }
- }
- },
- filteredValue: {
- get() {
- if (this.column) {
- return this.column.filteredValue || [];
- }
- return [];
- },
- set(value) {
- if (this.column) {
- this.column.filteredValue = value;
- }
- }
- },
- multiple() {
- if (this.column) {
- return this.column.filterMultiple;
- }
- return true;
- }
- },
- mounted() {
- this.popperElm = this.$el;
- this.referenceElm = this.cell;
- this.table.bodyWrapper.addEventListener('scroll', () => {
- this.updatePopper();
- });
- this.$watch('showPopper', (value) => {
- if (this.column) this.column.filterOpened = value;
- if (value) {
- Dropdown.open(this);
- } else {
- Dropdown.close(this);
- }
- });
- },
- watch: {
- showPopper(val) {
- if (val === true && parseInt(this.popperJS._popper.style.zIndex, 10) < PopupManager.zIndex) {
- this.popperJS._popper.style.zIndex = PopupManager.nextZIndex();
- }
- }
- }
- };
- </script>
|