Files
bio_frontend/layouts/default.vue

94 lines
2.3 KiB
Vue
Raw Normal View History

<template>
<div class="layout">
<AppHeader v-model="activeMenu" @update:model-value="handleMenuChange" />
<!-- 서브메뉴 -->
<SubMenuBar
:show-submenu-bar="showSubmenuBar"
:active-menu="activeMenu"
:sub-menus="subMenus"
@submenu-click="onSubMenuClick"
/>
<!-- -->
<TabBar />
<main class="main">
<slot />
</main>
</div>
</template>
2025-08-08 13:11:33 +09:00
<script setup lang="ts">
2025-09-25 15:33:11 +09:00
import AppHeader from "../components/layout/navigation/AppHeader.vue";
import SubMenuBar from "../components/layout/navigation/SubMenuBar.vue";
import TabBar from "../components/layout/navigation/TabBar.vue";
import { ref, computed } from "vue";
2025-08-14 11:00:48 +09:00
import { useTabsStore } from "../stores/tab";
2025-09-23 14:15:32 +09:00
import { usePermissionsStore } from "~/stores/permissions";
2025-08-08 13:11:33 +09:00
2025-09-23 14:15:32 +09:00
const activeMenu = ref("HOME");
2025-08-08 13:11:33 +09:00
const showSubmenuBar = ref(false);
2025-08-14 11:00:48 +09:00
const tabsStore = useTabsStore();
2025-09-23 14:15:32 +09:00
const permissionStore = usePermissionsStore();
// 권한 기반 서브메뉴 생성
2025-08-08 13:11:33 +09:00
const subMenus = computed(() => {
2025-09-23 14:15:32 +09:00
if (activeMenu.value === "HOME") return [];
2025-09-23 15:21:00 +09:00
// 활성 메뉴의 코드 찾기 (PG01, PG02 등)
2025-09-23 14:15:32 +09:00
const activeMenuCode = activeMenu.value;
2025-09-23 15:21:00 +09:00
// 해당 페이지그룹의 하위 페이지들 필터링 (menu_yn이 "Y"인 것만)
2025-09-23 14:15:32 +09:00
return permissionStore.permissions.resources.pages
.filter(page => page.parentCode === activeMenuCode)
2025-09-23 15:21:00 +09:00
.filter(page => page.menuYn === "Y") // 메뉴에 표시할 페이지만
2025-09-23 14:15:32 +09:00
.filter(page => permissionStore.hasPagePermission(page.path || ""))
.sort((a, b) => a.sortOrder - b.sortOrder)
.map(page => ({
key: page.code,
label: page.name,
to: page.path || "",
componentName: page.name,
}));
2025-08-08 13:11:33 +09:00
});
2025-09-24 16:35:52 +09:00
async function handleMenuChange(_menuCode: string) {
if (activeMenu.value === "HOME") {
showSubmenuBar.value = false;
2025-09-24 16:35:52 +09:00
await navigateTo("/");
} else {
showSubmenuBar.value = true;
}
2025-08-08 13:11:33 +09:00
}
function onSubMenuClick(sub: {
key: string;
label: string;
to: string;
componentName: string;
}) {
2025-08-22 14:01:30 +09:00
tabsStore.updateActiveTab(sub);
2025-08-08 13:11:33 +09:00
}
</script>
<style scoped>
.layout {
min-height: 100vh;
display: flex;
flex-direction: column;
position: relative;
}
.main {
flex: 1;
padding: 2rem;
padding-top: 0.5rem;
}
.footer {
background: #f8f9fa;
padding: 1rem;
text-align: center;
border-top: 1px solid #e9ecef;
}
</style>