@page "/admin/dashboard" @attribute [Authorize] @using TaxBaik.Web.Services @using TaxBaik.WasmClient.Components.Admin.Shared @inject IAdminDashboardClient DashboardClient @inject NavigationManager Nav 대시보드
Overview 대시보드 문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다.
새 포스트 작성
@if (!string.IsNullOrEmpty(errorMessage)) { @errorMessage }
@if (upcomingFilings.Count > 0) {
이번 달 마감 임박 신고 30일 이내 신고 예정 건 (고객명 클릭 시 상세 카드로 연결)
전체 일정 보기
고객 신고 유형 기한 D-day @foreach (var f in upcomingFilings) { var dday = BusinessDayCalculator.GetDday(DateOnly.FromDateTime(f.DueDate)); var effectiveDueDate = BusinessDayCalculator.GetEffectiveDueDate(DateOnly.FromDateTime(f.DueDate)); @f.ClientName @f.FilingType @effectiveDueDate.ToDateTime(TimeOnly.MinValue).ToString("yyyy-MM-dd") @if (dday < 0) { 기한 초과 (@(-dday)일) } else if (dday <= 7) { D-@dday } else { D-@dday } }
}
최근 문의 최근 유입된 상담 요청을 빠르게 확인합니다. (이름 클릭 시 상세 관리 화면으로 연계)
문의 전체 보기
이름 전화 분야 상태 날짜 @foreach (var inquiry in summary.RecentInquiries) { @inquiry.Name @inquiry.Phone @inquiry.ServiceType @GetStatusLabel(inquiry.Status) @inquiry.CreatedAt.ToString("yyyy-MM-dd") }
@code { [CascadingParameter] private Task? AuthStateTask { get; set; } private AdminDashboardSummary summary = new(0, 0, 0, 0, []); private List upcomingFilings = []; private string? errorMessage; private bool isLoading = true; private RenderFragment DashboardSkeleton => builder => { builder.OpenComponent(0); builder.AddAttribute(1, "Rows", 6); builder.AddAttribute(2, "Columns", 4); builder.CloseComponent(); }; private void GoInquiries() { Nav.NavigateTo("/taxbaik/admin/inquiries"); } private void GoNewInquiries() { Nav.NavigateTo("/taxbaik/admin/inquiries?status=new"); } private void GoBlog() { Nav.NavigateTo("/taxbaik/admin/blog"); } protected override async Task OnInitializedAsync() { if (AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { try { var summaryTask = DashboardClient.GetSummaryAsync(); var filingsTask = DashboardClient.GetUpcomingFilingsAsync(30); await Task.WhenAll(summaryTask, filingsTask); summary = await summaryTask; upcomingFilings = (await filingsTask).ToList(); } catch (Exception ex) { errorMessage = "대시보드 데이터를 불러올 수 없습니다."; Console.Error.WriteLine($"Dashboard error: {ex.Message}"); } finally { isLoading = false; } } } } private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status); private static Color StatusColor(string status) => status switch { "new" => Color.Warning, "consulting" => Color.Info, "contracted" => Color.Success, "rejected" => Color.Error, "closed" => Color.Dark, _ => Color.Default }; }