Files
taxbaik/TaxBaik.Web/Components/Admin/InquiryTable.razor
kjh2064 c65742a0c7
TaxBaik CI/CD / build-and-deploy (push) Successful in 48s
feat: implement admin inquiry create/edit/delete functionality
Core Components:
- Create reusable InquiryForm.razor component following SOLID principles
- Implement InquiryCreate.razor for registering new inquiries (offline, phone)
- Implement InquiryEdit.razor for modifying existing inquiries with delete
- Add DeleteAsync method to InquiryRepository and InquiryService
- Update InquiryList with 'Create' button and Edit link in table

Architecture:
- InquiryForm: Encapsulates form logic, can be reused for create/edit
- Service Layer: All operations go through InquiryService for cache invalidation
- Repository Pattern: Database operations isolated in InquiryRepository
- UI Consistency: Both pages follow admin-page-hero pattern

Features:
- Admin can create inquiries from phone/offline consultations
- Admin can modify inquiry details (name, phone, email, message, status, memo)
- Admin can delete inquiries with confirmation dialog
- All operations update dashboard cache
- Status validation and error handling throughout

Testing:
- Updated FakeInquiryRepository in tests to implement DeleteAsync
2026-06-28 16:45:29 +09:00

81 lines
2.6 KiB
Plaintext

<MudSimpleTable Striped="true" Dense="true" Class="admin-table mt-4">
<thead>
<tr>
<th>이름</th>
<th>전화</th>
<th>분야</th>
<th>상태</th>
<th>메시지</th>
<th>날짜</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var inquiry in filteredInquiries)
{
<tr>
<td>@inquiry.Name</td>
<td>@inquiry.Phone</td>
<td>@inquiry.ServiceType</td>
<td>
<MudChip Size="Size.Small" Color="@GetStatusColor(inquiry.Status)">
@GetStatusLabel(inquiry.Status)
</MudChip>
</td>
<td>@GetPreview(inquiry.Message)</td>
<td>@inquiry.CreatedAt.ToString("yyyy-MM-dd")</td>
<td>
<MudButton Size="Size.Small" Variant="Variant.Outlined" Color="Color.Primary"
Href="@($"/taxbaik/admin/inquiries/{inquiry.Id}")">보기</MudButton>
<MudButton Size="Size.Small" Variant="Variant.Outlined" Color="Color.Info"
Href="@($"/taxbaik/admin/inquiries/{inquiry.Id}/edit")">수정</MudButton>
</td>
</tr>
}
</tbody>
</MudSimpleTable>
@code {
[Parameter, EditorRequired]
public IReadOnlyList<Domain.Entities.Inquiry> Inquiries { get; set; } = [];
[Parameter]
public string Status { get; set; } = "";
private IReadOnlyList<Domain.Entities.Inquiry> filteredInquiries = [];
protected override void OnParametersSet()
{
if (Inquiries == null || Inquiries.Count == 0)
{
filteredInquiries = [];
return;
}
filteredInquiries = string.IsNullOrEmpty(Status)
? Inquiries
: Inquiries.Where(x => x.Status == Status).ToList();
}
private static string GetPreview(string message)
{
if (string.IsNullOrWhiteSpace(message))
return "-";
var trimmed = message.Trim();
return trimmed.Length <= 30 ? trimmed : $"{trimmed[..30]}...";
}
private static Color GetStatusColor(string status) => status switch
{
"new" => Color.Warning,
"consulting" => Color.Info,
"contracted" => Color.Success,
"rejected" => Color.Error,
"closed" => Color.Dark,
_ => Color.Default
};
private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status);
}