c4c6353f49664b3ff583377c4fb9b310f7d8eb7e27f7ed493fe64f6f72d4287283bebf2417124162363b3598e213676c2d24fe1125a312c82f1c09a84fdeb5 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <transition name="el-zoom-in-top">
  3. <div
  4. class="el-table-filter"
  5. v-if="multiple"
  6. v-clickoutside="handleOutsideClick"
  7. v-show="showPopper">
  8. <div class="el-table-filter__content">
  9. <el-scrollbar wrap-class="el-table-filter__wrap">
  10. <el-checkbox-group class="el-table-filter__checkbox-group" v-model="filteredValue">
  11. <el-checkbox
  12. v-for="filter in filters"
  13. :key="filter.value"
  14. :label="filter.value">{{ filter.text }}</el-checkbox>
  15. </el-checkbox-group>
  16. </el-scrollbar>
  17. </div>
  18. <div class="el-table-filter__bottom">
  19. <button @click="handleConfirm"
  20. :class="{ 'is-disabled': filteredValue.length === 0 }"
  21. :disabled="filteredValue.length === 0">{{ t('el.table.confirmFilter') }}</button>
  22. <button @click="handleReset">{{ t('el.table.resetFilter') }}</button>
  23. </div>
  24. </div>
  25. <div
  26. class="el-table-filter"
  27. v-else
  28. v-clickoutside="handleOutsideClick"
  29. v-show="showPopper">
  30. <ul class="el-table-filter__list">
  31. <li class="el-table-filter__list-item"
  32. :class="{ 'is-active': filterValue === undefined || filterValue === null }"
  33. @click="handleSelect(null)">{{ t('el.table.clearFilter') }}</li>
  34. <li class="el-table-filter__list-item"
  35. v-for="filter in filters"
  36. :label="filter.value"
  37. :key="filter.value"
  38. :class="{ 'is-active': isActive(filter) }"
  39. @click="handleSelect(filter.value)" >{{ filter.text }}</li>
  40. </ul>
  41. </div>
  42. </transition>
  43. </template>
  44. <script type="text/babel">
  45. import Popper from 'element-ui/src/utils/vue-popper';
  46. import { PopupManager } from 'element-ui/src/utils/popup';
  47. import Locale from 'element-ui/src/mixins/locale';
  48. import Clickoutside from 'element-ui/src/utils/clickoutside';
  49. import Dropdown from './dropdown';
  50. import ElCheckbox from 'element-ui/packages/checkbox';
  51. import ElCheckboxGroup from 'element-ui/packages/checkbox-group';
  52. import ElScrollbar from 'element-ui/packages/scrollbar';
  53. export default {
  54. name: 'ElTableFilterPanel',
  55. mixins: [Popper, Locale],
  56. directives: {
  57. Clickoutside
  58. },
  59. components: {
  60. ElCheckbox,
  61. ElCheckboxGroup,
  62. ElScrollbar
  63. },
  64. props: {
  65. placement: {
  66. type: String,
  67. default: 'bottom-end'
  68. }
  69. },
  70. methods: {
  71. isActive(filter) {
  72. return filter.value === this.filterValue;
  73. },
  74. handleOutsideClick() {
  75. setTimeout(() => {
  76. this.showPopper = false;
  77. }, 16);
  78. },
  79. handleConfirm() {
  80. this.confirmFilter(this.filteredValue);
  81. this.handleOutsideClick();
  82. },
  83. handleReset() {
  84. this.filteredValue = [];
  85. this.confirmFilter(this.filteredValue);
  86. this.handleOutsideClick();
  87. },
  88. handleSelect(filterValue) {
  89. this.filterValue = filterValue;
  90. if ((typeof filterValue !== 'undefined') && (filterValue !== null)) {
  91. this.confirmFilter(this.filteredValue);
  92. } else {
  93. this.confirmFilter([]);
  94. }
  95. this.handleOutsideClick();
  96. },
  97. confirmFilter(filteredValue) {
  98. this.table.store.commit('filterChange', {
  99. column: this.column,
  100. values: filteredValue
  101. });
  102. this.table.store.updateAllSelected();
  103. }
  104. },
  105. data() {
  106. return {
  107. table: null,
  108. cell: null,
  109. column: null
  110. };
  111. },
  112. computed: {
  113. filters() {
  114. return this.column && this.column.filters;
  115. },
  116. filterValue: {
  117. get() {
  118. return (this.column.filteredValue || [])[0];
  119. },
  120. set(value) {
  121. if (this.filteredValue) {
  122. if ((typeof value !== 'undefined') && (value !== null)) {
  123. this.filteredValue.splice(0, 1, value);
  124. } else {
  125. this.filteredValue.splice(0, 1);
  126. }
  127. }
  128. }
  129. },
  130. filteredValue: {
  131. get() {
  132. if (this.column) {
  133. return this.column.filteredValue || [];
  134. }
  135. return [];
  136. },
  137. set(value) {
  138. if (this.column) {
  139. this.column.filteredValue = value;
  140. }
  141. }
  142. },
  143. multiple() {
  144. if (this.column) {
  145. return this.column.filterMultiple;
  146. }
  147. return true;
  148. }
  149. },
  150. mounted() {
  151. this.popperElm = this.$el;
  152. this.referenceElm = this.cell;
  153. this.table.bodyWrapper.addEventListener('scroll', () => {
  154. this.updatePopper();
  155. });
  156. this.$watch('showPopper', (value) => {
  157. if (this.column) this.column.filterOpened = value;
  158. if (value) {
  159. Dropdown.open(this);
  160. } else {
  161. Dropdown.close(this);
  162. }
  163. });
  164. },
  165. watch: {
  166. showPopper(val) {
  167. if (val === true && parseInt(this.popperJS._popper.style.zIndex, 10) < PopupManager.zIndex) {
  168. this.popperJS._popper.style.zIndex = PopupManager.nextZIndex();
  169. }
  170. }
  171. }
  172. };
  173. </script>