@page "/admin/announcements" @attribute [Authorize] @using TaxBaik.Web.Services @using TaxBaik.Domain.Entities @inject IAnnouncementBrowserClient AnnouncementClient @inject NavigationManager Navigation @inject IDialogService DialogService @inject ISnackbar Snackbar 공지사항 관리
Homepage 공지사항 관리 홈페이지 상단에 노출되는 공지사항을 등록하고 관리합니다.
공지 등록
@if (announcements is null) { } else if (!announcements.Any()) { 등록된 공지사항이 없습니다. } else { 제목 유형 상태 게시 기간 순서 @foreach (var item in announcements) { @item.Title @GetTypeLabel(item.DisplayType) @if (IsCurrentlyActive(item)) { 노출 중 } else if (!item.IsActive) { 비활성 } else { 기간 외 } @FormatPeriod(item) @item.SortOrder 수정 삭제 } } @code { [CascadingParameter] private Task? AuthStateTask { get; set; } private List? announcements; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { if (AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { await LoadAsync(); StateHasChanged(); } } } } private async Task LoadAsync() { try { announcements = (await AnnouncementClient.GetAllAsync()).ToList(); } catch (Exception ex) { Snackbar.Add($"오류: {ex.Message}", Severity.Error); announcements = []; } } private async Task DeleteAsync(Announcement item) { var confirmed = await DialogService.ShowMessageBox( "공지 삭제", $"'{item.Title}' 공지를 삭제하시겠습니까?", yesText: "삭제", cancelText: "취소"); if (confirmed != true) return; try { var success = await AnnouncementClient.DeleteAsync(item.Id); if (success) { Snackbar.Add("공지사항이 삭제되었습니다.", Severity.Success); await LoadAsync(); } else { Snackbar.Add("삭제 실패", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"오류: {ex.Message}", Severity.Error); } } private static bool IsCurrentlyActive(Announcement a) { if (!a.IsActive) return false; var now = DateTime.UtcNow; if (a.StartsAt.HasValue && a.StartsAt > now) return false; if (a.EndsAt.HasValue && a.EndsAt < now) return false; return true; } private static string FormatPeriod(Announcement a) { var start = a.StartsAt?.ToLocalTime().ToString("MM/dd") ?? "즉시"; var end = a.EndsAt?.ToLocalTime().ToString("MM/dd") ?? "무기한"; return $"{start} ~ {end}"; } private static Color GetTypeColor(string type) => type switch { "urgent" => Color.Error, "banner" => Color.Warning, _ => Color.Info }; private static string GetTypeLabel(string type) => type switch { "urgent" => "긴급", "banner" => "배너", _ => "일반" }; }