Files
taxbaik/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml
T

163 lines
14 KiB
Plaintext

@{
var path = (Context.Request.Path.Value ?? string.Empty).ToLowerInvariant();
Func<string, bool> isActive = target => path.StartsWith(target.ToLowerInvariant(), StringComparison.OrdinalIgnoreCase);
Func<string, string> activeClass = target => isActive(target) ? "active" : string.Empty;
var breadcrumbText = ViewData["Title"]?.ToString() ?? "대시보드";
var coreOpen = isActive("/admin/dashboard") || isActive("/admin/settings") || isActive("/admin/clientlogs") || path == "/admin";
var customerOpen = isActive("/admin/customers") || isActive("/admin/clients") || isActive("/admin/inquiries") || isActive("/admin/consultingactivities");
var contentOpen = isActive("/admin/blog") || isActive("/admin/announcements") || isActive("/admin/faqs");
var financeOpen = isActive("/admin/taxprofiles") || isActive("/admin/taxfilings") || isActive("/admin/taxfilingschedules") || isActive("/admin/revenuetrackings");
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@(ViewData["Title"] ?? "TaxBaik Admin")</title>
<meta name="theme-color" content="#1F4E79" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link href="https://cdn.jsdelivr.net/npm/@@tabler/core@1.0.0/dist/css/tabler.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
<link rel="stylesheet" href="~/css/admin.css" asp-append-version="true" />
</head>
<body class="admin-app bg-light">
<div class="page admin-shell min-vh-100 d-flex flex-column">
<!-- Topbar Panel -->
<header class="navbar navbar-expand-md navbar-light d-print-none admin-topbar py-2 sticky-top">
<div class="container-fluid px-3">
<div class="d-flex align-items-center gap-3 flex-wrap admin-topbar-branding">
<div class="navbar-brand">
<a href="/admin/dashboard" class="text-decoration-none text-dark fw-bold d-flex align-items-center gap-2">
<span class="avatar avatar-sm bg-primary text-white rounded-3"><i class="bi bi-safe-fill"></i></span>
<span>TaxBaik <span class="text-primary">Admin</span></span>
</a>
</div>
<nav aria-label="breadcrumb" class="admin-topbar-breadcrumb d-none d-md-inline-block ms-2">
<ol class="breadcrumb breadcrumb-muted mb-0 small">
<li class="breadcrumb-item"><a href="/admin/dashboard" class="text-muted"><i class="bi bi-house-door-fill"></i></a></li>
<li class="breadcrumb-item active text-dark fw-semibold" aria-current="page">@breadcrumbText</li>
</ol>
</nav>
</div>
<div class="navbar-nav flex-row order-md-last gap-3 align-items-center">
<div class="d-flex align-items-center gap-2">
<span class="avatar avatar-xs rounded-circle bg-secondary-lt text-secondary"><i class="bi bi-person-circle"></i></span>
<span class="text-dark small fw-semibold font-numeric d-none d-md-inline">@User.Identity?.Name</span>
</div>
<a class="btn btn-outline-danger btn-sm px-3 rounded-pill fw-semibold" href="/admin/logout">
<i class="bi bi-box-arrow-right me-1"></i> 로그아웃
</a>
</div>
</div>
</header>
<div class="page-wrapper flex-fill py-4">
<div class="container-fluid px-3 px-md-4">
<div class="row g-4">
<!-- Left Sidebar Panel -->
<aside class="col-12 col-lg-3 col-xxl-2">
<div class="card shadow-sm border-0 admin-sidebar-card sticky-top" style="top: 80px; z-index: 10;">
<div class="card-header admin-sidebar-header bg-white py-3 px-4 border-bottom border-light">
<h3 class="card-title mb-0 admin-sidebar-title fw-bold text-dark" style="font-size: 0.9rem;">
<i class="bi bi-grid-fill text-primary me-2"></i> 관리 메뉴
</h3>
</div>
<div class="card-body p-0 admin-sidebar-body bg-white">
<div class="accordion accordion-flush" id="adminSidebarAccordion">
<!-- 기본 Accordion -->
<div class="accordion-item border-0">
<h2 class="accordion-header">
<button class="accordion-button py-2.5 px-4 @(coreOpen ? string.Empty : "collapsed") fw-semibold" type="button" data-bs-toggle="collapse" data-bs-target="#adminMenuCore" aria-expanded="@(coreOpen ? "true" : "false")">
<i class="bi bi-speedometer2 text-muted me-2"></i> 기본 관리
</button>
</h2>
<div id="adminMenuCore" class="accordion-collapse collapse @(coreOpen ? "show" : string.Empty)" data-bs-parent="#adminSidebarAccordion">
<div class="list-group list-group-flush bg-transparent py-1">
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/dashboard")" href="/admin/dashboard"><i class="bi bi-circle small me-2"></i> 대시보드</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/settings")" href="/admin/settings"><i class="bi bi-circle small me-2"></i> 설정</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/clientlogs")" href="/admin/clientlogs"><i class="bi bi-circle small me-2"></i> 클라이언트 로그</a>
</div>
</div>
</div>
<!-- 고객/상담 Accordion -->
<div class="accordion-item border-0">
<h2 class="accordion-header">
<button class="accordion-button py-2.5 px-4 @(customerOpen ? string.Empty : "collapsed") fw-semibold" type="button" data-bs-toggle="collapse" data-bs-target="#adminMenuCustomer" aria-expanded="@(customerOpen ? "true" : "false")">
<i class="bi bi-people text-muted me-2"></i> 고객/상담
</button>
</h2>
<div id="adminMenuCustomer" class="accordion-collapse collapse @(customerOpen ? "show" : string.Empty)" data-bs-parent="#adminSidebarAccordion">
<div class="list-group list-group-flush bg-transparent py-1">
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/customers")" href="/admin/customers"><i class="bi bi-circle small me-2"></i> 고객</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/clients")" href="/admin/clients"><i class="bi bi-circle small me-2"></i> 고객사</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/inquiries")" href="/admin/inquiries"><i class="bi bi-circle small me-2"></i> 문의 관리</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/consultingactivities")" href="/admin/consultingactivities"><i class="bi bi-circle small me-2"></i> 상담 활동</a>
</div>
</div>
</div>
<!-- 콘텐츠 Accordion -->
<div class="accordion-item border-0">
<h2 class="accordion-header">
<button class="accordion-button py-2.5 px-4 @(contentOpen ? string.Empty : "collapsed") fw-semibold" type="button" data-bs-toggle="collapse" data-bs-target="#adminMenuContent" aria-expanded="@(contentOpen ? "true" : "false")">
<i class="bi bi-file-earmark-richtext text-muted me-2"></i> 콘텐츠 운영
</button>
</h2>
<div id="adminMenuContent" class="accordion-collapse collapse @(contentOpen ? "show" : string.Empty)" data-bs-parent="#adminSidebarAccordion">
<div class="list-group list-group-flush bg-transparent py-1">
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/blog")" href="/admin/blog"><i class="bi bi-circle small me-2"></i> 블로그 편집</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/announcements")" href="/admin/announcements"><i class="bi bi-circle small me-2"></i> 공지사항</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/faqs")" href="/admin/faqs"><i class="bi bi-circle small me-2"></i> FAQ 관리</a>
</div>
</div>
</div>
<!-- 세무 관리 Accordion -->
<div class="accordion-item border-0">
<h2 class="accordion-header">
<button class="accordion-button py-2.5 px-4 @(financeOpen ? string.Empty : "collapsed") fw-semibold" type="button" data-bs-toggle="collapse" data-bs-target="#adminMenuFinance" aria-expanded="@(financeOpen ? "true" : "false")">
<i class="bi bi-calculator text-muted me-2"></i> 세무 관리
</button>
</h2>
<div id="adminMenuFinance" class="accordion-collapse collapse @(financeOpen ? "show" : string.Empty)" data-bs-parent="#adminSidebarAccordion">
<div class="list-group list-group-flush bg-transparent py-1">
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/taxprofiles")" href="/admin/taxprofiles"><i class="bi bi-circle small me-2"></i> 세무 프로필</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/taxfilings")" href="/admin/taxfilings"><i class="bi bi-circle small me-2"></i> 신고 관리</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/taxfilingschedules")" href="/admin/taxfilingschedules"><i class="bi bi-circle small me-2"></i> 신고 일정</a>
<a class="list-group-item list-group-item-action ps-5 py-2 @activeClass("/admin/revenuetrackings")" href="/admin/revenuetrackings"><i class="bi bi-circle small me-2"></i> 매출 추적</a>
</div>
</div>
</div>
</div>
</div>
</div>
</aside>
<!-- Center Content Panel -->
<main class="col-12 col-lg-9 col-xxl-10">
<div class="card shadow-sm border-0 admin-content-card rounded-4 bg-white overflow-hidden">
<div class="card-body p-4 p-md-5">
@RenderBody()
</div>
</div>
</main>
</div>
</div>
</div>
<!-- Footer Panel -->
<footer class="admin-footer border-top bg-white mt-auto py-3">
<div class="container-fluid px-4 small text-muted">
<div class="d-flex flex-wrap justify-content-between align-items-center gap-2 font-numeric">
<span>&copy; 2026 TaxBaik. All rights reserved.</span>
<div class="d-flex align-items-center gap-3">
<span>Razor Pages + Dapper Architecture</span>
<span>·</span>
<span>Cookie Security Authentication</span>
</div>
</div>
</div>
</footer>
</div>
<script src="https://cdn.jsdelivr.net/npm/@@tabler/core@1.0.0/dist/js/tabler.min.js" defer></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>