UnisKB/ui/src/layout/components/sidebar/SidebarItem.vue

110 lines
2.6 KiB
Vue
Raw Normal View History

2023-10-16 10:58:51 +00:00
<template>
2024-07-01 01:45:59 +00:00
<div v-if="(!menu.meta || !menu.meta.hidden) && showMenu()" class="sidebar-item">
2024-07-09 09:50:37 +00:00
<el-sub-menu
v-if="menu?.children && menu?.children.length > 0"
:index="menu.path"
popper-class="sidebar-container-popper"
>
<template #title>
<el-icon>
<AppIcon v-if="menu.meta && menu.meta.icon" :iconName="menuIcon" class="sidebar-icon" />
</el-icon>
<span>{{ menu.meta?.title as string }}</span>
</template>
<sidebar-item
2024-07-10 04:22:41 +00:00
v-hasPermission="child.meta?.permission"
2024-07-09 09:50:37 +00:00
v-for="(child, index) in menu?.children"
:key="index"
:menu="child"
:activeMenu="activeMenu"
>
</sidebar-item>
</el-sub-menu>
2024-07-01 01:45:59 +00:00
<el-menu-item
2024-07-09 09:50:37 +00:00
v-else
2024-07-01 01:45:59 +00:00
ref="subMenu"
:index="menu.path"
popper-class="sidebar-popper"
@click="clickHandle(menu)"
>
2023-10-16 10:58:51 +00:00
<template #title>
2023-12-01 03:36:04 +00:00
<AppIcon v-if="menu.meta && menu.meta.icon" :iconName="menuIcon" class="sidebar-icon" />
2023-10-16 10:58:51 +00:00
<span v-if="menu.meta && menu.meta.title">{{ menu.meta.title }}</span>
</template>
</el-menu-item>
</div>
</template>
<script setup lang="ts">
2023-12-01 03:36:04 +00:00
import { computed } from 'vue'
2024-07-01 01:45:59 +00:00
import { useRouter, useRoute, type RouteRecordRaw } from 'vue-router'
import { isWorkFlow } from '@/utils/application'
2023-12-01 03:36:04 +00:00
const props = defineProps<{
2023-10-16 10:58:51 +00:00
menu: RouteRecordRaw
2023-12-01 03:36:04 +00:00
activeMenu: any
2023-10-16 10:58:51 +00:00
}>()
2024-07-01 01:45:59 +00:00
const router = useRouter()
const route = useRoute()
const {
params: { id, type }
} = route as any
2024-07-12 11:04:08 +00:00
2024-07-01 01:45:59 +00:00
function showMenu() {
if (isWorkFlow(type)) {
return props.menu.name !== 'AppHitTest'
} else {
return true
}
}
function clickHandle(item: any) {
if (isWorkFlow(type) && item.name === 'AppSetting') {
router.push({ path: `/application/${id}/workflow` })
}
}
2023-12-01 03:36:04 +00:00
const menuIcon = computed(() => {
if (props.activeMenu === props.menu.path) {
return props.menu.meta?.iconActive || props.menu?.meta?.icon
} else {
return props.menu?.meta?.icon
}
})
2023-10-16 10:58:51 +00:00
</script>
2023-10-18 11:06:22 +00:00
<style scoped lang="scss">
.sidebar-item {
2023-11-02 10:25:09 +00:00
.sidebar-icon {
font-size: 20px;
margin-top: -2px;
}
2023-10-18 11:06:22 +00:00
.el-menu-item {
2023-11-02 10:25:09 +00:00
padding: 13px 12px 13px 16px !important;
2023-10-18 11:06:22 +00:00
font-weight: 500;
2023-11-02 10:25:09 +00:00
border-radius: 4px;
2023-11-07 07:30:15 +00:00
&:hover {
background: none;
2024-07-12 11:04:08 +00:00
color: var(--el-color-primary);
2023-11-07 07:30:15 +00:00
}
2023-10-18 11:06:22 +00:00
}
2024-07-09 09:50:37 +00:00
:deep(.el-sub-menu__title) {
padding: 13px 12px 13px 16px !important;
&:hover {
background: none;
2024-07-12 11:04:08 +00:00
color: var(--el-color-primary);
2024-07-09 09:50:37 +00:00
}
}
.el-sub-menu {
.el-menu-item {
padding-left: 43px !important;
}
}
2023-10-18 11:06:22 +00:00
.el-menu-item.is-active {
2024-07-12 11:04:08 +00:00
color: var(--el-color-primary);
2023-11-06 11:06:02 +00:00
background: var(--el-color-primary-light-9);
2023-10-18 11:06:22 +00:00
}
}
</style>