@page "/admin/faqs/create" @page "/admin/faqs/{Id:int}/edit" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) @attribute [Authorize] @inject IFaqBrowserClient FaqClient @inject NavigationManager Navigation @inject ISnackbar Snackbar @(Id.HasValue ? "FAQ 수정" : "FAQ 등록") 목록으로 @(isSaving ? "저장 중..." : "저장") 취소 @code { [Parameter] public int? Id { get; set; } private MudForm form = null!; private FaqFormModel model = new() { SortOrder = 10, IsActive = true }; private bool isValid; private bool isLoading = true; private bool isSaving; private RenderFragment FaqSkeleton => builder => { builder.OpenComponent(0); builder.AddAttribute(1, "Rows", 5); builder.AddAttribute(2, "Columns", 3); builder.CloseComponent(); }; protected override async Task OnInitializedAsync() { if (Id.HasValue) { try { var existing = await FaqClient.GetByIdAsync(Id.Value); if (existing is null) { Snackbar.Add("FAQ를 찾을 수 없습니다.", Severity.Error); Navigation.NavigateTo("./faqs"); return; } model = new FaqFormModel { Question = existing.Question, Answer = existing.Answer, Category = existing.Category, SortOrder = existing.SortOrder, IsActive = existing.IsActive }; } catch (Exception ex) { Snackbar.Add($"오류: {ex.Message}", Severity.Error); Navigation.NavigateTo("./faqs"); return; } } isLoading = false; } private async Task SaveAsync() { await form.ValidateAsync(); if (!isValid) return; isSaving = true; try { var faq = new Faq { Id = Id ?? 0, Question = model.Question, Answer = model.Answer, Category = model.Category, SortOrder = model.SortOrder, IsActive = model.IsActive }; if (Id.HasValue) { var result = await FaqClient.UpdateAsync(Id.Value, faq); if (result != null) Snackbar.Add("FAQ가 수정되었습니다.", Severity.Success); else Snackbar.Add("수정 실패", Severity.Error); } else { var result = await FaqClient.CreateAsync(faq); if (result != null) Snackbar.Add("FAQ가 등록되었습니다.", Severity.Success); else Snackbar.Add("등록 실패", Severity.Error); } Navigation.NavigateTo("./faqs"); } catch (Exception ex) { Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error); } finally { isSaving = false; } } }