MenuPages.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <script lang="ts" setup>
  2. import { useRoute } from "vue-router"
  3. import appStore from "@s"
  4. import { headerMenuIcons } from "@@/config/theme"
  5. const menus = computed(() => {
  6. return appStore.menuStore.getSidebarMenus()
  7. })
  8. const route = useRoute()
  9. const hasActiveChildren = (match: string) => {
  10. return route.path.includes(match)
  11. }
  12. </script>
  13. <template>
  14. <template v-for="(item, i) in menus" :key="i">
  15. <template v-if="!item.heading">
  16. <template v-for="(menuItem, j) in item.pages" :key="j">
  17. <div v-if="menuItem.heading" class="menu-item me-lg-1">
  18. <router-link
  19. v-if="menuItem.route"
  20. class="menu-link"
  21. :to="menuItem.route"
  22. active-class="active">
  23. <span class="menu-title">{{ menuItem.heading }}</span>
  24. </router-link>
  25. </div>
  26. </template>
  27. </template>
  28. <div
  29. v-if="item.heading"
  30. data-vb-menu-trigger="click"
  31. data-vb-menu-placement="bottom-start"
  32. class="menu-item menu-lg-down-accordion me-lg-1">
  33. <span
  34. v-if="item.route"
  35. class="menu-link py-3"
  36. :class="{ active: hasActiveChildren(item.route) }">
  37. <span class="menu-title">{{ item.heading }}</span>
  38. <span class="menu-arrow d-lg-none"></span>
  39. </span>
  40. <div
  41. class="menu-sub menu-sub-lg-down-accordion menu-sub-lg-dropdown menu-rounded-0 py-lg-4 w-lg-225px">
  42. <template v-for="(menuItem, j) in item.pages" :key="j">
  43. <div
  44. v-if="menuItem.sectionTitle"
  45. data-vb-menu-trigger="{default:'click', lg: 'hover'}"
  46. data-vb-menu-placement="right-start"
  47. class="menu-item menu-lg-down-accordion">
  48. <span
  49. v-if="menuItem.route"
  50. class="menu-link py-3"
  51. :class="{ active: hasActiveChildren(menuItem.route) }">
  52. <span class="menu-icon">
  53. <i
  54. v-if="headerMenuIcons === 'bootstrap'"
  55. :class="menuItem.bootstrapIcon"
  56. class="bi fs-3"></i>
  57. <VbIcon
  58. v-if="headerMenuIcons === 'keenthemes'"
  59. :icon-name="menuItem.keenthemesIcon"
  60. icon-class="fs-2" />
  61. </span>
  62. <span class="menu-title">{{ menuItem.sectionTitle }}</span>
  63. <span class="menu-arrow"></span>
  64. </span>
  65. <div
  66. class="menu-sub menu-sub-lg-down-accordion menu-sub-lg-dropdown menu-active-bg py-lg-4 w-lg-225px">
  67. <template v-for="(menuItem1, k) in menuItem.sub" :key="k">
  68. <div
  69. v-if="menuItem1.sectionTitle"
  70. data-vb-menu-trigger="{default:'click', lg: 'hover'}"
  71. data-vb-menu-placement="right-start"
  72. class="menu-item menu-lg-down-accordion">
  73. <span
  74. v-if="menuItem1.route"
  75. class="menu-link py-3"
  76. :class="{ active: hasActiveChildren(menuItem1.route) }">
  77. <span class="menu-bullet">
  78. <span class="bullet bullet-dot"></span>
  79. </span>
  80. <span class="menu-title">{{ menuItem1.sectionTitle }}</span>
  81. <span class="menu-arrow"></span>
  82. </span>
  83. <div
  84. class="menu-sub menu-sub-lg-down-accordion menu-sub-lg-dropdown menu-active-bg py-lg-4 w-lg-225px">
  85. <template v-for="(menuItem2, l) in menuItem1.sub" :key="l">
  86. <div class="menu-item">
  87. <router-link
  88. v-if="menuItem2.route && menuItem2.heading"
  89. class="menu-link py-3"
  90. active-class="active"
  91. :to="menuItem2.route">
  92. <span class="menu-bullet">
  93. <span class="bullet bullet-dot"></span>
  94. </span>
  95. <span class="menu-title">{{ menuItem2.heading }}</span>
  96. </router-link>
  97. </div>
  98. </template>
  99. </div>
  100. </div>
  101. <div v-if="menuItem1.heading" class="menu-item">
  102. <router-link
  103. v-if="menuItem1.route"
  104. class="menu-link"
  105. active-class="active"
  106. :to="menuItem1.route">
  107. <span class="menu-bullet">
  108. <span class="bullet bullet-dot"></span>
  109. </span>
  110. <span class="menu-title">{{ menuItem1.heading }}</span>
  111. </router-link>
  112. </div>
  113. </template>
  114. </div>
  115. </div>
  116. <div v-if="menuItem.heading" class="menu-item">
  117. <router-link
  118. v-if="menuItem.route && menuItem.route"
  119. class="menu-link"
  120. active-class="active"
  121. :to="menuItem.route">
  122. <span class="menu-icon">
  123. <VbIcon icon-name="element-8" icon-class="fs-2" />
  124. </span>
  125. <span class="menu-title">{{ menuItem.heading }}</span>
  126. </router-link>
  127. </div>
  128. </template>
  129. </div>
  130. </div>
  131. </template>
  132. </template>