MenuItem-yn.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <template v-for="item in datas" :key="item?.code">
  3. <el-sub-menu v-if="item?.children && item?.children.length > 0" :index="item?.code" :popper-offset="0" :popper-class="`aside-menu-popper ${curKey}`" :class="getMenuLevel(item)">
  4. <template #title>
  5. <div class="hc-aside-menu-item">
  6. <div class="menu---item">
  7. <HcIcon v-if="item?.source" :name="item?.source" :fill="curKey === item?.code" class="hc-menu-icon" />
  8. <div v-if="isCollapse" class="name truncate">{{ item?.name.substring(0, 2) }}</div>
  9. <div v-else class="name truncate">{{ item?.name }}</div>
  10. <el-badge v-if="item?.code === 'tasks' && msgCount?.allCount > 0" :value="msgCount.allCount" />
  11. </div>
  12. </div>
  13. <HcIcon name="arrow-down-s" ui="el-icon el-sub-menu__icon-arrow" />
  14. </template>
  15. <MenuItem v-if="!isYunNanProject" :datas="item?.children" :cur="curKey" :msg-count="msgCount" @change="MenuClick" />
  16. <MenuItem2 v-else :datas="item?.children" :cur="curKey" :msg-count="msgCount" @change="MenuClick" />
  17. </el-sub-menu>
  18. <el-menu-item v-else :index="item?.code" :class="getMenuLevel(item)" @click="MenuClick(item)">
  19. <div class="hc-aside-menu-item">
  20. <div class="menu---item">
  21. <HcIcon v-if="item?.source" :name="item?.source" :fill="curKey === item?.code" class="hc-menu-icon" />
  22. <div v-if="isCollapse" class="name truncate">{{ item?.name.substring(0, 2) }}</div>
  23. <div v-else class="name truncate">{{ item?.name }}</div>
  24. <el-badge v-if="item?.code === 'tasks-data' && msgCount?.taskCount > 0" :value="msgCount.taskCount" />
  25. <el-badge v-if="item?.code === 'message-data' && msgCount?.messageCount > 0" :value="msgCount.messageCount" />
  26. </div>
  27. </div>
  28. </el-menu-item>
  29. </template>
  30. </template>
  31. <script setup>
  32. import { computed, ref, watch } from 'vue'
  33. import MenuItem from '../modules/MenuItem.vue'
  34. import MenuItem2 from '../test-yn/MenuItem-yn.vue'
  35. import { useAppStore } from '~src/store'
  36. const props = defineProps({
  37. datas: {
  38. type: Array,
  39. default: () => ([]),
  40. },
  41. cur: {
  42. type: String,
  43. default: '',
  44. },
  45. collapse: {
  46. type: Boolean,
  47. default: false,
  48. },
  49. msgCount: {
  50. type: Object,
  51. default: () => ({
  52. allCount: 0,
  53. taskCount: 0,
  54. messageCount: 0,
  55. messageCount_1: 0,
  56. messageCount_2: 0,
  57. messageCount_3: 0,
  58. messageCount_4: 0,
  59. messageCount_5: 0,
  60. }),
  61. },
  62. })
  63. //事件
  64. const emit = defineEmits(['change'])
  65. const store = useAppStore()
  66. const projectId = ref(store.getProjectId)
  67. const isYunNanProject = ref(projectId.value === '1904814720589430785')
  68. // 添加watch来更新isYunNanProject
  69. watch(() =>store.getProjectId, (newProjectId) => {
  70. isYunNanProject.value = newProjectId === '1904814720589430785'
  71. })
  72. //初始变量
  73. const curKey = ref(props.cur)
  74. const isCollapse = ref(props.collapse)
  75. //监听
  76. watch(() => [
  77. props.cur,
  78. props.collapse,
  79. ], ([cur, collapse]) => {
  80. curKey.value = cur
  81. isCollapse.value = collapse
  82. })
  83. const MenuClick = (item) => {
  84. emit('change', item)
  85. }
  86. // 获取菜单层级样式
  87. const getMenuLevel = (item) => {
  88. const level = item.code.split('-').length
  89. return `menu-level-${level}`
  90. }
  91. </script>
  92. <style lang="scss" scoped>
  93. .menu-level-1 {
  94. padding-left: 0px;
  95. }
  96. .menu-level-2 {
  97. padding-left: 20px !important;
  98. :deep(.el-sub-menu__title),
  99. :deep(.el-menu-item) {
  100. padding-left: 20px !important;
  101. }
  102. }
  103. .menu-level-3 {
  104. padding-left: 40px !important;
  105. :deep(.el-sub-menu__title),
  106. :deep(.el-menu-item) {
  107. padding-left: 40px !important;
  108. }
  109. }
  110. </style>