121 lines
3.9 KiB
Plaintext
121 lines
3.9 KiB
Plaintext
@page "/admin/inquiries/{id:int}/edit"
|
|
@attribute [Authorize]
|
|
@using TaxBaik.Application.DTOs
|
|
@using TaxBaik.Application.Services
|
|
@using TaxBaik.Web.Components.Admin.Forms
|
|
@inject InquiryService InquiryService
|
|
@inject NavigationManager Navigation
|
|
@inject IJSRuntime JS
|
|
|
|
<PageTitle>문의 수정</PageTitle>
|
|
|
|
<section class="admin-page-hero">
|
|
<div>
|
|
<div class="admin-eyebrow">Customer Relations</div>
|
|
<h1 class="admin-page-title">문의 수정</h1>
|
|
<p class="admin-page-subtitle">고객 문의 정보를 수정합니다.</p>
|
|
</div>
|
|
<button type="button" class="site-button secondary" @onclick="GoBack">취소</button>
|
|
</section>
|
|
|
|
@if (isLoading)
|
|
{
|
|
<div class="admin-surface mt-4"><Skeleton Count="4" CssClass="taxbaik-skeleton-grid" /></div>
|
|
}
|
|
else if (inquiry == null)
|
|
{
|
|
<div class="admin-surface mt-4">문의를 찾을 수 없습니다.</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="admin-surface mt-4">
|
|
<InquiryForm ButtonText="수정" InitialData="formModel" OnSubmit="HandleUpdate" OnCancel="GoBack" />
|
|
<div class="mt-4">
|
|
<button type="button" class="site-button secondary danger" @onclick="DeleteInquiry">문의 삭제</button>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@code {
|
|
[Parameter] public int Id { get; set; }
|
|
private Domain.Entities.Inquiry? inquiry;
|
|
private InquiryForm.InquiryFormModel? formModel;
|
|
private bool isLoading = true;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
try
|
|
{
|
|
inquiry = await InquiryService.GetByIdAsync(Id);
|
|
if (inquiry != null)
|
|
{
|
|
formModel = new InquiryForm.InquiryFormModel
|
|
{
|
|
Name = inquiry.Name,
|
|
Phone = inquiry.Phone,
|
|
Email = inquiry.Email,
|
|
ServiceType = inquiry.ServiceType,
|
|
Message = inquiry.Message,
|
|
Status = inquiry.Status,
|
|
AdminMemo = inquiry.AdminMemo
|
|
};
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"문의 로드 실패: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
isLoading = false;
|
|
}
|
|
}
|
|
|
|
private void GoBack() => Navigation.NavigateTo("/taxbaik/admin/inquiries");
|
|
|
|
private async Task HandleUpdate(InquiryForm.InquiryFormModel model)
|
|
{
|
|
if (inquiry == null) return;
|
|
try
|
|
{
|
|
inquiry.Name = model.Name;
|
|
inquiry.Phone = model.Phone;
|
|
inquiry.Email = model.Email;
|
|
inquiry.ServiceType = model.ServiceType;
|
|
inquiry.Message = model.Message;
|
|
inquiry.AdminMemo = model.AdminMemo;
|
|
|
|
if (inquiry.Status != model.Status)
|
|
await InquiryService.UpdateStatusAsync(inquiry.Id, model.Status);
|
|
|
|
await InquiryService.UpdateAdminMemoAsync(inquiry.Id, model.AdminMemo);
|
|
await JS.InvokeVoidAsync("alert", "문의가 수정되었습니다.");
|
|
Navigation.NavigateTo("/taxbaik/admin/inquiries");
|
|
}
|
|
catch (ValidationException ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", ex.Message);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"수정 실패: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
private async Task DeleteInquiry()
|
|
{
|
|
if (inquiry == null) return;
|
|
if (!await JS.InvokeAsync<bool>("confirm", "정말 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.")) return;
|
|
try
|
|
{
|
|
await InquiryService.DeleteAsync(inquiry.Id);
|
|
await JS.InvokeVoidAsync("alert", "문의가 삭제되었습니다.");
|
|
Navigation.NavigateTo("/taxbaik/admin/inquiries");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"삭제 실패: {ex.Message}");
|
|
}
|
|
}
|
|
}
|