Files
taxbaik/src/TaxBaik.Web.Client/Components/Admin/Pages/Faqs/FaqEdit.razor
T
kjh2064 89fa51efe2
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m20s
refactor admin UX and stabilize shell
2026-07-09 00:03:33 +09:00

160 lines
5.9 KiB
Plaintext

@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
<PageTitle>@(Id.HasValue ? "FAQ 수정" : "FAQ 등록")</PageTitle>
<AdminPageHeader Title="@(Id.HasValue ? "FAQ 수정" : "FAQ 등록")" Eyebrow="홈페이지">
<MudButton Variant="Variant.Outlined" Href="./faqs"
StartIcon="@Icons.Material.Filled.ArrowBack">목록으로</MudButton>
</AdminPageHeader>
<AdminEditorPanel Loading="@isLoading" SkeletonContent="@FaqSkeleton">
<MudPaper Class="admin-surface admin-faq-edit-panel" Elevation="0">
<MudForm @ref="form" @bind-IsValid="isValid">
<MudGrid Spacing="3">
<MudItem xs="12">
<MudTextField @bind-Value="model.Question"
Label="질문 *" Required="true"
RequiredError="질문을 입력하세요."
Counter="300" MaxLength="300"
Lines="2"
Placeholder="예: 기장료가 얼마인지 미리 알 수 있나요?" />
</MudItem>
<MudItem xs="12">
<MudTextField @bind-Value="model.Answer"
Label="답변 *" Required="true"
RequiredError="답변을 입력하세요."
Lines="5"
Placeholder="방문자에게 보여질 답변을 입력하세요." />
</MudItem>
<MudItem xs="12" md="6">
<CommonCodeSelect @bind-Value="model.Category" Group="FAQ_CATEGORY" Label="카테고리" Clearable="true" Placeholder="전체" />
</MudItem>
<MudItem xs="12" md="3">
<MudNumericField @bind-Value="model.SortOrder"
Label="정렬 순서"
HelperText="작을수록 위에 노출"
Min="0" Max="9999" />
</MudItem>
<MudItem xs="12" md="3" Class="d-flex align-center">
<MudSwitch T="bool" @bind-Value="model.IsActive" Color="Color.Success"
Label="@(model.IsActive ? "노출 중" : "비활성")" />
</MudItem>
<MudItem xs="12" Class="d-flex gap-2 mt-2">
<MudButton Variant="Variant.Filled" Color="Color.Primary"
StartIcon="@Icons.Material.Filled.Save"
OnClick="@SaveAsync" Disabled="@isSaving">
@(isSaving ? "저장 중..." : "저장")
</MudButton>
<MudButton Variant="Variant.Outlined" Href="./faqs">
취소
</MudButton>
</MudItem>
</MudGrid>
</MudForm>
</MudPaper>
</AdminEditorPanel>
@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<AdminSkeletonRows>(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;
}
}
}