index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <el-button
  3. :icon="Tools"
  4. color="#ac014d"
  5. class="column-set-button"
  6. @click="dialogShow"
  7. />
  8. <Dialog
  9. :flag="dialogFlag"
  10. width="1080px"
  11. msg-title="列设置"
  12. @submit-form="submitHandler"
  13. @reset-form="dialogHide"
  14. >
  15. <div class="dialog-content">
  16. <div v-for="columnGroup in columnGroups" :key="columnGroup.title">
  17. <div class="group-title">{{ columnGroup.title }}</div>
  18. <el-checkbox-group
  19. v-model="checkedGroups[columnGroup.title]"
  20. size="large"
  21. >
  22. <el-checkbox
  23. v-for="tableColumn in columnGroup.columns"
  24. :key="tableColumn.columnProp"
  25. :label="tableColumn.columnProp"
  26. >{{ tableColumn.columnName }}</el-checkbox
  27. >
  28. </el-checkbox-group>
  29. </div>
  30. </div>
  31. </Dialog>
  32. </template>
  33. <script setup lang="ts">
  34. import { Tools } from '@element-plus/icons-vue'
  35. import Dialog from '@/components/dialog/index.vue'
  36. export interface tableColumn {
  37. columnName: string
  38. columnProp: string
  39. groupTitle: string
  40. }
  41. export interface tableColumnGroup {
  42. title: string
  43. columns: tableColumn[]
  44. }
  45. const props = defineProps({
  46. tableColumns: {
  47. type: Array<tableColumn>,
  48. required: true,
  49. }
  50. })
  51. const emits = defineEmits(['checkedSubmit'])
  52. const dialogFlag = ref(false)
  53. const dialogShow = () => {
  54. dialogFlag.value = true
  55. }
  56. const dialogHide = () => {
  57. dialogFlag.value = false
  58. }
  59. const checkedGroups = computed(() => {
  60. const groups = {}
  61. props.tableColumns.forEach(({ columnProp, groupTitle }) => {
  62. if (groups[groupTitle] && groups[groupTitle] instanceof Array) {
  63. groups[groupTitle].push(columnProp)
  64. } else {
  65. groups[groupTitle] = [columnProp]
  66. }
  67. })
  68. return groups
  69. })
  70. const columnGroups = computed(() => props.tableColumns.reduce((pre: tableColumnGroup[], curr) => {
  71. const theGroup = pre.find(columnGroup => columnGroup.title === curr.groupTitle)
  72. if (theGroup) {
  73. theGroup.columns.push(curr)
  74. } else {
  75. pre.push({
  76. title: curr.groupTitle,
  77. columns: [curr]
  78. })
  79. }
  80. return pre
  81. }, []))
  82. const checkedColumnProps = computed<string[]>(() => Object.getOwnPropertyNames(checkedGroups.value).map(prop => checkedGroups.value[prop]).flat())
  83. const submitHandler = () => {
  84. emits('checkedSubmit', checkedColumnProps.value)
  85. dialogHide()
  86. }
  87. </script>
  88. <style scoped lang="scss">
  89. .column-set-button {
  90. width: 30px;
  91. height: 30px;
  92. border-radius: 4px;
  93. font-size: 14px;
  94. }
  95. .dialog-content {
  96. padding: 0 22px;
  97. .group-title {
  98. font-size: 16px;
  99. font-family: Microsoft YaHei;
  100. font-weight: bold;
  101. color: #303133;
  102. margin-bottom: 22px;
  103. }
  104. }
  105. </style>