From ce5b2d8d1463f8e3619214b6bcab5f683fb9bf77 Mon Sep 17 00:00:00 2001 From: bjkim Date: Wed, 20 May 2026 19:01:38 +0900 Subject: [PATCH] fix: add admin routes missed during merge --- components.d.ts | 2 ++ src/router/index.js | 12 ++++++++++++ typed-router.d.ts | 2 ++ 3 files changed, 16 insertions(+) diff --git a/components.d.ts b/components.d.ts index b483b82..d286d49 100644 --- a/components.d.ts +++ b/components.d.ts @@ -9,6 +9,7 @@ export {} declare module 'vue' { export interface GlobalComponents { AppFooter: typeof import('./src/components/AppFooter.vue')['default'] + AutoScriptDialog: typeof import('./src/components/atoms/organisms/AutoScriptDialog.vue')['default'] CompareComponent: typeof import('./src/components/templates/run/executions/CompareComponent.vue')['default'] CompareRunDialog: typeof import('./src/components/atoms/organisms/CompareRunDialog.vue')['default'] DatagroupBaseDoalog: typeof import('./src/components/atoms/organisms/DatagroupBaseDoalog.vue')['default'] @@ -34,6 +35,7 @@ declare module 'vue' { ListComponent: typeof import('./src/components/templates/datagroup/ListComponent.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + ScriptCompileDialog: typeof import('./src/components/atoms/organisms/ScriptCompileDialog.vue')['default'] SidebarHeader: typeof import('./src/components/common/SidebarHeader.vue')['default'] TrainingGroupBaseDoalog: typeof import('./src/components/atoms/organisms/TrainingGroupBaseDoalog.vue')['default'] TrainingScriptBaseDoalog: typeof import('./src/components/atoms/organisms/TrainingScriptBaseDoalog.vue')['default'] diff --git a/src/router/index.js b/src/router/index.js index 8ef6ab1..03bd965 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -114,6 +114,14 @@ const routes = [ ], }, + /** ■ 관리자(시스템 상태) - 래퍼 하나로 레이아웃+본문 직접 렌더 (중첩 router-view 없음) */ + { + path: "/system-status", + name: "admin", + meta: { title: "관리자", requiresAuth: false, requiresAdmin: true }, + component: () => import("@/pages/AdminPageWrapper.vue"), + }, + /** ■ 인증(로그인/회원가입) */ { name: "login", @@ -151,10 +159,14 @@ router.beforeEach((to, from) => { const hasProject = !!localStorage.getItem("projectId"); // ✅ 프로젝트 선택 여부 const bootDone = sessionStorage.getItem("initialRedirectDone") === "1"; + const isAdminRoute = to.name === "admin" || to.name === "project" || to.name === "users" || to.path === "/system-status" || to.meta?.requiresAdmin; // 이미 프로젝트 선택됨 → 어떤 화면이든 통과 if (hasProject) return true; + // 관리자 전용 페이지는 프로젝트 없이도 접근 허용 + if (isAdminRoute) return true; + // 아직 프로젝트 미선택 if (!bootDone) { // ✅ 선택 화면에 "들어온 순간"을 부트 완료로 간주 (여기서 한 번만 세팅) diff --git a/typed-router.d.ts b/typed-router.d.ts index 116a2e4..afc47a7 100644 --- a/typed-router.d.ts +++ b/typed-router.d.ts @@ -19,6 +19,8 @@ declare module 'vue-router/auto-routes' { */ export interface RouteNamedMap { '/': RouteRecordInfo<'/', '/', Record, Record>, + '/AdminPageWrapper': RouteRecordInfo<'/AdminPageWrapper', '/AdminPageWrapper', Record, Record>, + '/AdminView': RouteRecordInfo<'/AdminView', '/AdminView', Record, Record>, '/DatagroupView': RouteRecordInfo<'/DatagroupView', '/DatagroupView', Record, Record>, '/DatasetView': RouteRecordInfo<'/DatasetView', '/DatasetView', Record, Record>, '/DeploymentView': RouteRecordInfo<'/DeploymentView', '/DeploymentView', Record, Record>,