12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- <template>
- <div class="w-10 h-10 grid place-items-center rounded-full mt-3 hover:cursor-pointer">
- <div class="flex flex-row w-96">
- <Icon name="magnifying-glass" class="hidden sm:block" @click="searchMenuVisiable = true" />
- <Teleport to="body">
- <el-dialog v-model="searchMenuVisiable" width="30%" draggable>
- <el-cascader :filterable="true" :options="options" @change="toWhere" placeholder="请输入菜单名称" clearable class="w-full" :show-all-levels="false" />
- </el-dialog>
- </Teleport>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { usePermissionsStore } from '/admin/stores/modules/user/permissions'
- import { Menu } from '/admin/types/Menu'
- import router from '/admin/router'
- import { ref, computed } from 'vue'
- const searchMenuVisiable = ref(false)
- const permissionStore = usePermissionsStore()
- const options = computed(() => {
- return filterMenus(permissionStore.getMenus)
- })
- const toWhere = (value: string[]) => {
- if (value.length) {
- router.push({ path: value[value.length - 1] })
- }
- searchMenuVisiable.value = false
- }
- /**
- * filter menus
- *
- * @param menus
- */
- function filterMenus(menus: Menu[] | undefined): Object[] {
- const cascaderMenus: Object[] = []
- menus?.forEach(menu => {
- if (menu.meta === undefined) {
- const child = menu.children?.pop()
- cascaderMenus.push(Object.assign({ label: child?.meta?.title, value: child?.path }))
- } else {
- const cascaderMenu = Object.assign({ label: menu.meta?.title, value: menu.path, children: [] })
- cascaderMenu.children = filterMenus(menu.children)
- cascaderMenus.push(cascaderMenu)
- }
- })
- return cascaderMenus
- }
- </script>
|