refactor: admin ui를 fluent v5와 html 기반으로 전환
TaxBaik CI/CD / build-and-deploy (push) Failing after 1m53s

This commit is contained in:
2026-06-29 22:37:40 +09:00
parent 1a7bc9e209
commit 1b173376ee
51 changed files with 2471 additions and 3560 deletions
@@ -6,77 +6,53 @@
@inject BlogService BlogService
@inject ICategoryRepository CategoryRepository
@inject NavigationManager Navigation
@inject ISnackbar Snackbar
@inject IJSRuntime JS
<PageTitle>새 포스트 작성</PageTitle>
<section class="admin-page-hero">
<div>
<MudText Typo="Typo.caption" Class="admin-eyebrow">Content</MudText>
<MudText Typo="Typo.h4" Class="admin-page-title">새 포스트 작성</MudText>
<MudText Typo="Typo.body2" Class="admin-page-subtitle">새로운 블로그 포스트를 작성합니다.</MudText>
<div class="admin-eyebrow">Content</div>
<h1 class="admin-page-title">새 포스트 작성</h1>
<p class="admin-page-subtitle">새로운 블로그 포스트를 작성합니다.</p>
</div>
<MudButton Variant="Variant.Outlined" StartIcon="@Icons.Material.Filled.Close" @onclick="GoBack">취소</MudButton>
<button type="button" class="site-button secondary" @onclick='() => Navigation.NavigateTo("/taxbaik/admin/blog")'>취소</button>
</section>
<MudPaper Class="pa-4 mt-4" Elevation="1">
<MudForm @ref="form">
<MudTextField @bind-Value="model.Title" Label="제목"
Variant="Variant.Outlined" Class="mb-4" Required="true" />
<MudSelect T="int?" @bind-Value="model.CategoryId" Label="카테고리"
Variant="Variant.Outlined" Class="mb-4">
@foreach (var category in categories)
{
<MudSelectItem T="int?" Value="@((int?)category.Id)">@category.Name</MudSelectItem>
}
</MudSelect>
<MudTextField @bind-Value="model.Content" Label="본문"
Variant="Variant.Outlined" Lines="10" Class="mb-4" Required="true" />
<MudTextField @bind-Value="model.Tags" Label="태그 (쉼표로 구분)"
Variant="Variant.Outlined" Class="mb-4" />
<MudTextField @bind-Value="model.SeoTitle" Label="SEO 제목"
Variant="Variant.Outlined" Class="mb-4" />
<MudTextField @bind-Value="model.SeoDescription" Label="SEO 설명"
Variant="Variant.Outlined" Lines="3" Class="mb-4" />
<MudCheckBox @bind-Checked="model.IsPublished" Label="즉시 발행" Class="mb-4" />
<div class="d-flex gap-2">
<MudButton Variant="Variant.Filled" Color="Color.Primary"
@onclick="SavePost">저장</MudButton>
<div class="admin-surface mt-4">
<form class="admin-dialog-card" @onsubmit="SavePost" @onsubmit:preventDefault="true">
<label>제목 * <input class="admin-input" @bind="model.Title" /></label>
<label>카테고리
<select class="admin-input" @bind="CategoryIdText">
<option value="">선택하세요</option>
@foreach (var category in categories)
{
<option value="@category.Id.ToString()">@category.Name</option>
}
</select>
</label>
<label>본문 * <textarea class="admin-input" rows="10" @bind="model.Content"></textarea></label>
<label>태그 (쉼표로 구분) <input class="admin-input" @bind="model.Tags" /></label>
<label>SEO 제목 <input class="admin-input" @bind="model.SeoTitle" /></label>
<label>SEO 설명 <textarea class="admin-input" rows="3" @bind="model.SeoDescription"></textarea></label>
<label><input type="checkbox" @bind="model.IsPublished" /> 즉시 발행</label>
<div class="admin-dialog-actions">
<button type="submit" class="site-button primary">저장</button>
</div>
</MudForm>
</MudPaper>
</form>
</div>
@code {
private MudForm? form;
private List<Domain.Entities.Category> categories = [];
private CreatePostModel model = new();
private string CategoryIdText { get => model.CategoryId?.ToString() ?? ""; set => model.CategoryId = int.TryParse(value, out var id) ? id : null; }
protected override async Task OnInitializedAsync()
{
categories = (await CategoryRepository.GetAllAsync()).ToList();
}
private void GoBack()
{
Navigation.NavigateTo("/taxbaik/admin/blog");
}
private async Task SavePost()
{
if (form == null)
return;
await form.Validate();
if (!form.IsValid)
return;
try
{
await BlogService.CreateAsync(new CreateBlogPostDto
@@ -90,12 +66,12 @@
IsPublished = model.IsPublished
});
Snackbar.Add("포스트가 저장되었습니다.", Severity.Success);
await JS.InvokeVoidAsync("alert", "포스트가 저장되었습니다.");
Navigation.NavigateTo("/taxbaik/admin/blog");
}
catch (ValidationException ex)
{
Snackbar.Add(ex.Message, Severity.Error);
await JS.InvokeVoidAsync("alert", ex.Message);
}
}