From cf3fea966da0cdd71666e50d334557f88acc7516 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Thu, 9 Jul 2026 11:16:50 +0900 Subject: [PATCH] Add admin layout and customer pagination --- .../Pages/Admin/Customers/Index.cshtml | 9 ++++-- .../Pages/Admin/Customers/Index.cshtml.cs | 13 +++++++-- src/TaxBaik.Web/Pages/Admin/Login.cshtml | 1 + .../Pages/Admin/_AdminLayout.cshtml | 28 +++++++++++++++++++ src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml | 4 +++ .../Pages/Shared/_AdminSidebar.cshtml | 8 ++++++ .../Pages/Shared/_AdminTopbar.cshtml | 13 +++++++++ .../Pages/Shared/_EmptyState.cshtml | 5 ++++ .../Pages/Shared/_Pagination.cshtml | 15 ++++++++++ .../Pages/Shared/_StatusBadge.cshtml | 11 ++++++++ 10 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml create mode 100644 src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml create mode 100644 src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml create mode 100644 src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml create mode 100644 src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml create mode 100644 src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml create mode 100644 src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml diff --git a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml index aad63eb..102a680 100644 --- a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml @@ -62,7 +62,9 @@ @if (Model.Items.Count == 0) { - 고객 데이터가 없습니다. + + + } else @@ -73,7 +75,7 @@ @item.Name @item.CompanyName @item.Phone - @item.Status + @item.CreatedAt.ToString("yyyy-MM-dd") 상세 @@ -86,5 +88,6 @@ - + + diff --git a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs index ee3efc3..570d17e 100644 --- a/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs +++ b/src/TaxBaik.Web/Pages/Admin/Customers/Index.cshtml.cs @@ -9,18 +9,27 @@ namespace TaxBaik.Web.Pages.Admin.Customers; public class IndexModel(ClientService clientService) : PageModel { public List Items { get; private set; } = []; + public int CurrentPage { get; private set; } = 1; + public int TotalPages { get; private set; } = 1; + public int TotalCount { get; private set; } public string? Search { get; set; } public string? Status { get; set; } public int PageSize { get; set; } = 10; - public async Task OnGetAsync(string? search, string? status, int pageSize = 10, CancellationToken ct = default) + public async Task OnGetAsync(string? search, string? status, int page = 1, int pageSize = 10, CancellationToken ct = default) { Search = search; Status = status; PageSize = pageSize; + CurrentPage = Math.Max(1, page); - var (items, _) = await clientService.GetPagedAsync(1, pageSize, status, search, ct); + var (items, total) = await clientService.GetPagedAsync(CurrentPage, pageSize, status, search, ct); Items = items.ToList(); + TotalCount = total; + TotalPages = Math.Max(1, (int)Math.Ceiling(total / (double)pageSize)); } + + public string BuildPageUrl(int page) => + $"/admin/customers?search={Uri.EscapeDataString(Search ?? string.Empty)}&status={Uri.EscapeDataString(Status ?? string.Empty)}&page={page}&pageSize={PageSize}"; } diff --git a/src/TaxBaik.Web/Pages/Admin/Login.cshtml b/src/TaxBaik.Web/Pages/Admin/Login.cshtml index f0ca1bb..833c0d0 100644 --- a/src/TaxBaik.Web/Pages/Admin/Login.cshtml +++ b/src/TaxBaik.Web/Pages/Admin/Login.cshtml @@ -1,6 +1,7 @@ @page "/admin/login" @model TaxBaik.Web.Pages.Admin.LoginModel @{ + Layout = null; ViewData["Title"] = "관리자 로그인"; ViewData["Description"] = "관리자 로그인 페이지입니다."; ViewData["CanonicalUrl"] = $"{Request.Scheme}://{Request.Host}/admin/login"; diff --git a/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml b/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml new file mode 100644 index 0000000..4fb1905 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/_AdminLayout.cshtml @@ -0,0 +1,28 @@ + + + + + + @(ViewData["Title"] ?? "TaxBaik Admin") + + + + + + + +
+
+ +
+ @RenderBody() +
+
+
+ + @await RenderSectionAsync("Scripts", required: false) + + + diff --git a/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml b/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml new file mode 100644 index 0000000..75aec31 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Admin/_ViewStart.cshtml @@ -0,0 +1,4 @@ +@{ + Layout = "_AdminLayout"; +} + diff --git a/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml b/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml new file mode 100644 index 0000000..4684539 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Shared/_AdminSidebar.cshtml @@ -0,0 +1,8 @@ + + diff --git a/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml b/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml new file mode 100644 index 0000000..37269b5 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Shared/_AdminTopbar.cshtml @@ -0,0 +1,13 @@ +
+
+
+
TaxBaik Admin
+
Razor Pages + Cookie Authentication
+
+
+ @User.Identity?.Name + 로그아웃 +
+
+
+ diff --git a/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml b/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml new file mode 100644 index 0000000..88799b9 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Shared/_EmptyState.cshtml @@ -0,0 +1,5 @@ +@model string +
+
@(string.IsNullOrWhiteSpace(Model) ? "데이터가 없습니다." : Model)
+
+ diff --git a/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml b/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml new file mode 100644 index 0000000..ba20feb --- /dev/null +++ b/src/TaxBaik.Web/Pages/Shared/_Pagination.cshtml @@ -0,0 +1,15 @@ +@model dynamic +@if (Model.TotalPages > 1) +{ + +} + diff --git a/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml b/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml new file mode 100644 index 0000000..d749ad6 --- /dev/null +++ b/src/TaxBaik.Web/Pages/Shared/_StatusBadge.cshtml @@ -0,0 +1,11 @@ +@model string +@{ + var badgeClass = Model?.ToLowerInvariant() switch + { + "active" => "text-bg-success", + "inactive" => "text-bg-secondary", + _ => "text-bg-light" + }; +} +@Model +