index.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <div class="top-right-btn" :style="style">
  3. <el-row>
  4. <el-tooltip class="item" effect="dark" :content="showSearch ? '隐藏搜索' : '显示搜索'" placement="top" v-if="search">
  5. <el-button size="mini" circle icon="el-icon-search" @click="toggleSearch()" />
  6. </el-tooltip>
  7. <el-tooltip class="item" effect="dark" content="刷新" placement="top">
  8. <el-button size="mini" circle icon="el-icon-refresh" @click="refresh()" />
  9. </el-tooltip>
  10. <el-tooltip class="item" effect="dark" content="显隐列" placement="top" v-if="columns">
  11. <el-button size="mini" circle icon="el-icon-menu" @click="showColumn()" v-if="showColumnsType == 'transfer'"/>
  12. <el-dropdown trigger="click" :hide-on-click="false" style="padding-left: 12px" v-if="showColumnsType == 'checkbox'">
  13. <el-button size="mini" circle icon="el-icon-menu" />
  14. <el-dropdown-menu slot="dropdown">
  15. <!-- 全选/反选 按钮 -->
  16. <el-dropdown-item>
  17. <el-checkbox :indeterminate="isIndeterminate" v-model="isChecked" @change="toggleCheckAll"> 列展示 </el-checkbox>
  18. </el-dropdown-item>
  19. <div class="check-line"></div>
  20. <template v-for="item in columns">
  21. <el-dropdown-item :key="item.key">
  22. <el-checkbox v-model="item.visible" @change="checkboxChange($event, item.label)" :label="item.label" />
  23. </el-dropdown-item>
  24. </template>
  25. </el-dropdown-menu>
  26. </el-dropdown>
  27. </el-tooltip>
  28. </el-row>
  29. <el-dialog :title="title" :visible.sync="open" append-to-body>
  30. <el-transfer
  31. :titles="['显示', '隐藏']"
  32. v-model="value"
  33. :data="columns"
  34. @change="dataChange"
  35. ></el-transfer>
  36. </el-dialog>
  37. </div>
  38. </template>
  39. <script>
  40. export default {
  41. name: "RightToolbar",
  42. data() {
  43. return {
  44. // 显隐数据
  45. value: [],
  46. // 弹出层标题
  47. title: "显示/隐藏",
  48. // 是否显示弹出层
  49. open: false
  50. };
  51. },
  52. props: {
  53. /* 是否显示检索条件 */
  54. showSearch: {
  55. type: Boolean,
  56. default: true
  57. },
  58. /* 显隐列信息 */
  59. columns: {
  60. type: Array
  61. },
  62. /* 是否显示检索图标 */
  63. search: {
  64. type: Boolean,
  65. default: true
  66. },
  67. /* 显隐列类型(transfer穿梭框、checkbox复选框) */
  68. showColumnsType: {
  69. type: String,
  70. default: "checkbox"
  71. },
  72. /* 右外边距 */
  73. gutter: {
  74. type: Number,
  75. default: 10
  76. },
  77. },
  78. computed: {
  79. style() {
  80. const ret = {};
  81. if (this.gutter) {
  82. ret.marginRight = `${this.gutter / 2}px`;
  83. }
  84. return ret;
  85. },
  86. isChecked: {
  87. get() {
  88. return this.columns.every((col) => col.visible);
  89. },
  90. set() {}
  91. },
  92. isIndeterminate() {
  93. return this.columns.some((col) => col.visible) && !this.isChecked;
  94. }
  95. },
  96. created() {
  97. if (this.showColumnsType == 'transfer') {
  98. // 显隐列初始默认隐藏列
  99. for (let item in this.columns) {
  100. if (this.columns[item].visible === false) {
  101. this.value.push(parseInt(item));
  102. }
  103. }
  104. }
  105. },
  106. methods: {
  107. // 搜索
  108. toggleSearch() {
  109. this.$emit("update:showSearch", !this.showSearch);
  110. },
  111. // 刷新
  112. refresh() {
  113. this.$emit("queryTable");
  114. },
  115. // 右侧列表元素变化
  116. dataChange(data) {
  117. for (let item in this.columns) {
  118. const key = this.columns[item].key;
  119. this.columns[item].visible = !data.includes(key);
  120. }
  121. },
  122. // 打开显隐列dialog
  123. showColumn() {
  124. this.open = true;
  125. },
  126. // 单勾选
  127. checkboxChange(event, label) {
  128. this.columns.filter(item => item.label == label)[0].visible = event;
  129. },
  130. // 切换全选/反选
  131. toggleCheckAll() {
  132. const newValue = !this.isChecked;
  133. this.columns.forEach((col) => (col.visible = newValue))
  134. }
  135. },
  136. };
  137. </script>
  138. <style lang="scss" scoped>
  139. ::v-deep .el-transfer__button {
  140. border-radius: 50%;
  141. padding: 12px;
  142. display: block;
  143. margin-left: 0px;
  144. }
  145. ::v-deep .el-transfer__button:first-child {
  146. margin-bottom: 10px;
  147. }
  148. .check-line {
  149. width: 90%;
  150. height: 1px;
  151. background-color: #ccc;
  152. margin: 3px auto;
  153. }
  154. </style>