hide.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <el-button size="mini" @click="drawer = true">
  3. {{ number ? `隐藏列 :${number}` : "隐藏列" }}
  4. <el-drawer
  5. :show-close="false"
  6. :visible.sync="drawer"
  7. size="20%"
  8. title="隐藏列"
  9. append-to-body
  10. >
  11. <template slot="title">
  12. <span>隐藏列</span>
  13. <el-button type="primary" size="mini" @click="useSubmit('superForm')">
  14. 确 认
  15. </el-button>
  16. <el-button size="mini" @click="drawer = false"> 取 消 </el-button>
  17. </template>
  18. <el-input
  19. v-model="key"
  20. size="mini"
  21. placeholder="请输入列名称"
  22. style="width: 100%; padding: 0 16px 16px"
  23. >
  24. </el-input>
  25. <el-row :gutter="20" style="margin: 0; display: flex">
  26. <el-draggable
  27. v-model="columns"
  28. :group="{ item: 'key' }"
  29. @change="onDraggableChange"
  30. >
  31. <el-col
  32. v-for="({ item }, index) in searchColumns"
  33. :key="index"
  34. :span="24"
  35. style="
  36. display: flex;
  37. justify-content: space-between;
  38. padding: 12px 16px;
  39. "
  40. >
  41. <span
  42. style="
  43. height: 20px;
  44. line-height: 20px;
  45. font-size: 13px;
  46. flex: 1;
  47. cursor: move;
  48. padding: 0 12px 0 0;
  49. text-overflow: ellipsis;
  50. overflow: hidden;
  51. word-break: break-all;
  52. white-space: nowrap;
  53. "
  54. >
  55. <i
  56. class="el-icon-mouse"
  57. style="color: #72767b; margin: 0 6px 0 0"
  58. ></i>
  59. <i
  60. class="el-icon-user"
  61. style="color: #72767b; margin: 0 6px 0 0"
  62. ></i>
  63. {{ item.title }}
  64. </span>
  65. </el-col>
  66. </el-draggable>
  67. <div @click.stop>
  68. <div
  69. v-for="({ item }, index) in searchColumns"
  70. :key="index"
  71. style="padding: 12px 16px"
  72. >
  73. <el-switch
  74. v-model="item.hidden"
  75. size="mini"
  76. @change="onDraggableChange"
  77. ></el-switch>
  78. </div>
  79. </div>
  80. </el-row>
  81. </el-drawer>
  82. </el-button>
  83. </template>
  84. <script>
  85. import deepCopy from "@gby/deep-copy";
  86. export default {
  87. name: "",
  88. components: {
  89. ElDraggable: () => import("@/components/draggable/index.vue"),
  90. },
  91. props: {
  92. value: {
  93. type: Array,
  94. require: true,
  95. },
  96. },
  97. data() {
  98. return {
  99. drawer: false,
  100. key: "",
  101. };
  102. },
  103. computed: {
  104. columns: {
  105. get() {
  106. return this.$props.value;
  107. },
  108. set(value) {
  109. this.$emit("input", value);
  110. },
  111. },
  112. searchColumns: {
  113. get() {
  114. return this.columns.filter(
  115. ({ item }) => item.title.indexOf(this.key) > -1
  116. );
  117. },
  118. set(value) {},
  119. },
  120. number: {
  121. get() {
  122. return this.columns.filter(({ item }) => !item.hidden).length;
  123. },
  124. set(value) {},
  125. },
  126. },
  127. watch: {},
  128. methods: {
  129. onClone(prop) {
  130. return deepCopy(prop);
  131. },
  132. onDraggableChange() {
  133. this.$emit("change", this.columns);
  134. },
  135. },
  136. created() {},
  137. mounted() {},
  138. destroyed() {},
  139. };
  140. </script>
  141. <style scoped></style>