index.vue 4.2 KB

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