TableColumnMenu.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <script setup lang="ts">
  2. import { VbUtil } from "@@/vb-dom"
  3. import { symbolKeys } from "./../../models"
  4. // 从统一上下文获取数据
  5. const context = inject(symbolKeys.tableContext)!
  6. // 从 context 获取列菜单显示状态
  7. const columnMenuVisible = context.state.columnMenuVisible
  8. // 获取列数据和 el-tree ref
  9. const columns = context.state.columns
  10. const tableBox = context.refs.tableBox
  11. const elTreeRef = ref()
  12. // 计算可见列 ID
  13. const visColumnIds = ref<string[]>([])
  14. function getVisibleIds() {
  15. const ids: string[] = []
  16. function calcVisibleIds(list: any[]) {
  17. list.forEach((v) => {
  18. if (v.visible === undefined || v.visible) {
  19. ids.push(v.field)
  20. if (v.children && v.children.length > 0) {
  21. calcVisibleIds(v.children)
  22. }
  23. }
  24. })
  25. }
  26. calcVisibleIds(columns.value)
  27. return ids
  28. }
  29. function getColumnById(id: string, list: any[]): any | null {
  30. for (let i = 0; i < list.length; i++) {
  31. const item = list[i]
  32. if (item.field === id) {
  33. return item
  34. }
  35. if (item.children && item.children.length > 0) {
  36. const ret = getColumnById(id, item.children)
  37. if (ret) {
  38. return ret
  39. }
  40. }
  41. }
  42. return null
  43. }
  44. // 切换列菜单
  45. const toggleColumnMenu = () => {
  46. columnMenuVisible.value = !columnMenuVisible.value
  47. }
  48. // 列变化处理
  49. const onColumnChange = (data: any) => {
  50. const column = getColumnById(data.field, columns.value)
  51. if (column) {
  52. column.visible = !(column.visible == undefined || column.visible)
  53. VbUtil.EventHandlerUtil.trigger(tableBox.value, "vbtable.columns-change", columns.value)
  54. }
  55. }
  56. // 监听 columns 变化,更新选中状态
  57. watch(
  58. () => columns.value,
  59. () => {
  60. visColumnIds.value = getVisibleIds()
  61. if (elTreeRef.value) {
  62. elTreeRef.value.setCheckedKeys(visColumnIds.value)
  63. }
  64. },
  65. { immediate: true }
  66. )
  67. </script>
  68. <template>
  69. <div class="column-menu-panel" :class="{ 'panel-hidden': !columnMenuVisible }">
  70. <div class="panel-header">
  71. <span class="panel-title">显隐列</span>
  72. <vb-tooltip class="item" content="关闭" placement="top" :delay="1000">
  73. <div
  74. class="btn btn-sm btn-light-primary w-25px h-25px p-0 d-flex align-items-center justify-content-center"
  75. @click="toggleColumnMenu">
  76. <span class="bi bi-x-circle fs-5"></span>
  77. </div>
  78. </vb-tooltip>
  79. </div>
  80. <div class="panel-content">
  81. <el-tree
  82. ref="elTreeRef"
  83. :data="columns"
  84. show-checkbox
  85. node-key="field"
  86. :default-checked-keys="visColumnIds"
  87. :check-on-click-node="true"
  88. :props="{ label: 'name', children: 'children' }"
  89. @check="onColumnChange"></el-tree>
  90. </div>
  91. </div>
  92. </template>