Files
2023-07-17 15:47:45 +08:00

156 lines
3.6 KiB
Vue

<template>
<div v-if="!item.hidden">
<template
v-if="
hasOneShowingChild(item.children, item) &&
(!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
!item.alwaysShow
"
>
<app-link
v-if="onlyOneChild.meta"
:to="resolvePath(onlyOneChild.path, onlyOneChild.query)"
>
<el-menu-item
:index="resolvePath(onlyOneChild.path)"
:class="{ 'submenu-title-noDropdown': !isNest }"
>
<svg-icon
style="flex: 1"
:icon-class="
onlyOneChild.meta.icon || (item.meta && item.meta.icon)
"
/>
<template #title
><span
style="flex: 8"
class="menu-title flex-6"
:title="
hasTitle(
onlyOneChild.meta.i18nStr
? t(onlyOneChild.meta.i18nStr)
: onlyOneChild.meta.title
)
"
>{{
onlyOneChild.meta.i18nStr
? t(onlyOneChild.meta.i18nStr)
: onlyOneChild.meta.title
}}</span
></template
>
</el-menu-item>
</app-link>
</template>
<el-sub-menu
v-else
ref="subMenu"
:index="resolvePath(item.path)"
popper-append-to-body
>
<template v-if="item.meta" #title>
<svg-icon style="flex: 1" :icon-class="item.meta && item.meta.icon" />
<span
class="menu-title"
style="flex: 8"
:title="
hasTitle(item.meta.i18nStr ? t(item.meta.i18nStr) : item.meta.title)
"
>{{
item.meta.i18nStr ? t(item.meta.i18nStr) : item.meta.title
}}</span
>
</template>
<sidebar-item
v-for="child in item.children"
:key="child.path"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
/>
</el-sub-menu>
</div>
</template>
<script setup>
import { isExternal } from "@/utils/validate";
import AppLink from "./Link";
import { getNormalPath } from "@/utils/ruoyi";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const props = defineProps({
// route object
item: {
type: Object,
required: true,
},
isNest: {
type: Boolean,
default: false,
},
basePath: {
type: String,
default: "",
},
});
const onlyOneChild = ref({});
function hasOneShowingChild(children = [], parent) {
if (!children) {
children = [];
}
const showingChildren = children.filter((item) => {
if (item.hidden) {
return false;
} else {
// Temp set(will be used if only has one showing child)
onlyOneChild.value = item;
return true;
}
});
// When there is only one child router, the child router is displayed by default
if (showingChildren.length === 1) {
return true;
}
// Show parent if there are no child router to display
if (showingChildren.length === 0) {
onlyOneChild.value = { ...parent, path: "", noShowingChildren: true };
return true;
}
return false;
}
function resolvePath(routePath, routeQuery) {
if (isExternal(routePath)) {
return routePath;
}
if (isExternal(props.basePath)) {
return props.basePath;
}
if (routeQuery) {
let query = JSON.parse(routeQuery);
return {
path: getNormalPath(props.basePath + "/" + routePath),
query: query,
};
}
return getNormalPath(props.basePath + "/" + routePath);
}
function hasTitle(title) {
if (title.length > 5) {
return title;
} else {
return "";
}
}
</script>