113 lines
4.1 KiB
Plaintext
113 lines
4.1 KiB
Plaintext
@page "/admin/faqs/create"
|
|
@page "/admin/faqs/{Id:int}/edit"
|
|
@attribute [Authorize]
|
|
@using TaxBaik.Web.Services
|
|
@using TaxBaik.Domain.Entities
|
|
@inject IFaqBrowserClient FaqClient
|
|
@inject NavigationManager Navigation
|
|
@inject IJSRuntime JS
|
|
|
|
<PageTitle>@(Id.HasValue ? "FAQ 수정" : "FAQ 등록")</PageTitle>
|
|
<section class="admin-page-hero">
|
|
<div>
|
|
<div class="admin-eyebrow">홈페이지</div>
|
|
<h1 class="admin-page-title">@(Id.HasValue ? "FAQ 수정" : "FAQ 등록")</h1>
|
|
</div>
|
|
<button type="button" class="site-button secondary" @onclick='() => Navigation.NavigateTo("/taxbaik/admin/faqs")'>목록으로</button>
|
|
</section>
|
|
|
|
<div class="admin-surface" style="max-width:720px;">
|
|
@if (isLoading)
|
|
{
|
|
<Skeleton Count="4" CssClass="taxbaik-skeleton-grid" />
|
|
}
|
|
else
|
|
{
|
|
<form class="admin-dialog-card" @onsubmit="SaveAsync" @onsubmit:preventDefault="true">
|
|
<label>질문 * <textarea class="admin-input" rows="3" @bind="faq.Question"></textarea></label>
|
|
<label>답변 * <textarea class="admin-input" rows="6" @bind="faq.Answer"></textarea></label>
|
|
<label>카테고리
|
|
<select class="admin-input" @bind="faq.Category">
|
|
<option value="">선택하세요</option>
|
|
@foreach (var cat in FaqService.Categories)
|
|
{
|
|
<option value="@cat">@cat</option>
|
|
}
|
|
</select>
|
|
</label>
|
|
<label>정렬 순서 <input class="admin-input" type="number" min="0" max="9999" @bind="SortOrderText" /></label>
|
|
<label><input type="checkbox" @bind="faq.IsActive" /> 노출 중</label>
|
|
<div class="admin-dialog-actions">
|
|
<button type="submit" class="site-button primary" disabled="@isSaving">저장</button>
|
|
<button type="button" class="site-button secondary" @onclick='() => Navigation.NavigateTo("/taxbaik/admin/faqs")'>취소</button>
|
|
</div>
|
|
</form>
|
|
}
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public int? Id { get; set; }
|
|
private Faq faq = new() { SortOrder = 10, IsActive = true };
|
|
private bool isLoading = true;
|
|
private bool isSaving;
|
|
private string SortOrderText { get => faq.SortOrder.ToString(); set => faq.SortOrder = int.TryParse(value, out var n) ? n : 0; }
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
if (Id.HasValue)
|
|
{
|
|
try
|
|
{
|
|
var existing = await FaqClient.GetByIdAsync(Id.Value);
|
|
if (existing is null)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "FAQ를 찾을 수 없습니다.");
|
|
Navigation.NavigateTo("/taxbaik/admin/faqs");
|
|
return;
|
|
}
|
|
faq = existing;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"오류: {ex.Message}");
|
|
Navigation.NavigateTo("/taxbaik/admin/faqs");
|
|
return;
|
|
}
|
|
}
|
|
isLoading = false;
|
|
}
|
|
|
|
private async Task SaveAsync()
|
|
{
|
|
isSaving = true;
|
|
try
|
|
{
|
|
if (string.IsNullOrWhiteSpace(faq.Question) || string.IsNullOrWhiteSpace(faq.Answer))
|
|
{
|
|
await JS.InvokeVoidAsync("alert", "질문과 답변을 입력하세요.");
|
|
return;
|
|
}
|
|
|
|
if (Id.HasValue)
|
|
{
|
|
var result = await FaqClient.UpdateAsync(Id.Value, faq);
|
|
await JS.InvokeVoidAsync("alert", result != null ? "FAQ가 수정되었습니다." : "수정 실패");
|
|
}
|
|
else
|
|
{
|
|
var result = await FaqClient.CreateAsync(faq);
|
|
await JS.InvokeVoidAsync("alert", result != null ? "FAQ가 등록되었습니다." : "등록 실패");
|
|
}
|
|
Navigation.NavigateTo("/taxbaik/admin/faqs");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"저장 실패: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
isSaving = false;
|
|
}
|
|
}
|
|
}
|