index.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <el-button
  3. v-bind="$attrs"
  4. :icon="Tools"
  5. color="#ac014d"
  6. class="column-set-button"
  7. @click="dialogShow"
  8. />
  9. <Dialog
  10. :flag="dialogFlag"
  11. width="1080px"
  12. msg-title="列设置"
  13. @submit-form="submitHandler"
  14. @reset-form="dialogHide"
  15. >
  16. <div class="dialog-content">
  17. <template v-if="inGroup">
  18. <div v-for="columnGroup in columnGroups" :key="columnGroup.title">
  19. <div class="group-title">{{ columnGroup.title }}</div>
  20. <el-checkbox-group
  21. v-model="tempGroups[columnGroup.title]"
  22. size="large"
  23. >
  24. <div
  25. v-for="column in columnGroup.columns"
  26. :key="column.columnName"
  27. class="checkbox-wrapper"
  28. >
  29. <el-checkbox :label="column.columnName">{{
  30. column.columnLabel?.replace('\n', '')
  31. }}</el-checkbox>
  32. </div>
  33. </el-checkbox-group>
  34. </div>
  35. </template>
  36. <template v-else>
  37. <el-checkbox-group v-model="tempKeys" size="large">
  38. <div
  39. v-for="column in needShowColumns"
  40. :key="column.columnName"
  41. class="checkbox-wrapper"
  42. >
  43. <el-checkbox :label="column.columnName">
  44. {{ column.columnLabel?.replace('\n', '') }}
  45. </el-checkbox>
  46. </div>
  47. </el-checkbox-group>
  48. </template>
  49. </div>
  50. </Dialog>
  51. </template>
  52. <script setup lang="ts">
  53. import { Tools } from '@element-plus/icons-vue'
  54. import Dialog from '@/components/dialog/index.vue'
  55. import { PropType } from 'vue'
  56. import { CommonTableColumn } from '~/common'
  57. import { tableColumnGroup } from '../../type'
  58. const props = defineProps({
  59. tableColumns: {
  60. type: Array as PropType<CommonTableColumn[]>,
  61. required: true,
  62. },
  63. })
  64. const needShowColumns = computed(() =>
  65. props.tableColumns.filter(column => column.needShow)
  66. )
  67. const emits = defineEmits(['checkedSubmit'])
  68. const inGroup = computed(() => {
  69. return (
  70. 'groupName' in
  71. (needShowColumns.value.length ? needShowColumns.value[0] : {})
  72. )
  73. })
  74. const simpleClone = (obj: any) => JSON.parse(JSON.stringify(obj))
  75. const dialogFlag = ref(false)
  76. const dialogShow = () => {
  77. tempGroups.value = simpleClone(checkedGroups.value)
  78. tempKeys.value = simpleClone(checkedKeys.value)
  79. dialogFlag.value = true
  80. }
  81. const dialogHide = () => {
  82. dialogFlag.value = false
  83. }
  84. const submitHandler = () => {
  85. checkedGroups.value = simpleClone(tempGroups.value)
  86. checkedKeys.value = simpleClone(tempKeys.value)
  87. emits('checkedSubmit', checkedColumnKeys.value)
  88. dialogHide()
  89. }
  90. const columnGroups = computed(() => {
  91. if (inGroup.value) {
  92. return needShowColumns.value.reduce((pre: tableColumnGroup[], curr) => {
  93. const theGroup = pre.find(
  94. columnGroup => columnGroup.title === curr.groupName
  95. )
  96. if (theGroup) {
  97. theGroup.columns.push(curr)
  98. } else {
  99. pre.push({
  100. title: curr.groupName,
  101. columns: [curr],
  102. })
  103. }
  104. return pre
  105. }, [])
  106. } else {
  107. return []
  108. }
  109. })
  110. // 分组的选择框
  111. const checkedGroups = ref<any>({})
  112. const tempGroups = ref<any>({})
  113. //不分组的选择框
  114. const checkedKeys = ref<string[]>([])
  115. const tempKeys = ref<string[]>([])
  116. const checkedColumnKeys = computed<string[]>(() => {
  117. if (inGroup.value) {
  118. return Object.getOwnPropertyNames(checkedGroups.value)
  119. .map(prop => checkedGroups.value[prop])
  120. .flat()
  121. } else {
  122. return checkedKeys.value
  123. }
  124. })
  125. watch(needShowColumns, columns => {
  126. if (inGroup.value) {
  127. checkedGroups.value = {}
  128. columns.forEach(({ columnName, groupName }) => {
  129. if (
  130. checkedGroups.value[groupName] &&
  131. checkedGroups.value[groupName] instanceof Array
  132. ) {
  133. checkedGroups.value[groupName].push(columnName)
  134. } else {
  135. checkedGroups.value[groupName] = [columnName]
  136. }
  137. })
  138. } else {
  139. checkedKeys.value = columns.map(({ columnName }) => columnName)
  140. }
  141. emits('checkedSubmit', checkedColumnKeys.value)
  142. })
  143. </script>
  144. <style scoped lang="scss">
  145. .column-set-button {
  146. width: 30px;
  147. height: 30px;
  148. border-radius: 4px;
  149. font-size: 14px;
  150. }
  151. .dialog-content {
  152. padding: 0 22px;
  153. .group-title {
  154. font-size: 16px;
  155. font-family: Helvetica, Microsoft YaHei;
  156. font-weight: bold;
  157. color: #303133;
  158. margin: 22px 0;
  159. }
  160. .el-checkbox-group {
  161. display: flex;
  162. flex-wrap: wrap;
  163. align-content: center;
  164. .checkbox-wrapper {
  165. width: 20%;
  166. margin: 0;
  167. }
  168. }
  169. }
  170. </style>