menuSearch.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <template>
  2. <div class="w-10 h-10 grid place-items-center rounded-full mt-3 hover:cursor-pointer">
  3. <div class="flex flex-row w-96">
  4. <Icon name="magnifying-glass" class="hidden sm:block" @click="searchMenuVisiable = true" />
  5. <Teleport to="body">
  6. <el-dialog v-model="searchMenuVisiable" width="30%" draggable>
  7. <el-cascader :filterable="true" :options="options" @change="toWhere" placeholder="请输入菜单名称" clearable class="w-full" :show-all-levels="false" />
  8. </el-dialog>
  9. </Teleport>
  10. </div>
  11. </div>
  12. </template>
  13. <script lang="ts" setup>
  14. import { usePermissionsStore } from '/admin/stores/modules/user/permissions'
  15. import { Menu } from '/admin/types/Menu'
  16. import router from '/admin/router'
  17. import { ref, computed } from 'vue'
  18. const searchMenuVisiable = ref(false)
  19. const permissionStore = usePermissionsStore()
  20. const options = computed(() => {
  21. return filterMenus(permissionStore.getMenus)
  22. })
  23. const toWhere = (value: string[]) => {
  24. if (value.length) {
  25. router.push({ path: value[value.length - 1] })
  26. }
  27. searchMenuVisiable.value = false
  28. }
  29. /**
  30. * filter menus
  31. *
  32. * @param menus
  33. */
  34. function filterMenus(menus: Menu[] | undefined): Object[] {
  35. const cascaderMenus: Object[] = []
  36. menus?.forEach(menu => {
  37. if (menu.meta === undefined) {
  38. const child = menu.children?.pop()
  39. cascaderMenus.push(Object.assign({ label: child?.meta?.title, value: child?.path }))
  40. } else {
  41. const cascaderMenu = Object.assign({ label: menu.meta?.title, value: menu.path, children: [] })
  42. cascaderMenu.children = filterMenus(menu.children)
  43. cascaderMenus.push(cascaderMenu)
  44. }
  45. })
  46. return cascaderMenus
  47. }
  48. </script>