102 lines
4.4 KiB
Plaintext
102 lines
4.4 KiB
Plaintext
@page "/admin/announcements/create"
|
|
@page "/admin/announcements/{Id:int}/edit"
|
|
@attribute [Authorize]
|
|
@using TaxBaik.Application.DTOs
|
|
@using TaxBaik.Web.Services
|
|
@inject IAnnouncementBrowserClient AnnouncementClient
|
|
@inject NavigationManager Navigation
|
|
@inject IJSRuntime JS
|
|
|
|
<PageTitle>@(Id.HasValue ? "공지 수정" : "공지 등록")</PageTitle>
|
|
|
|
<section class="admin-page-hero">
|
|
<div>
|
|
<div class="admin-eyebrow">Homepage</div>
|
|
<h1 class="admin-page-title">@(Id.HasValue ? "공지 수정" : "공지 등록")</h1>
|
|
</div>
|
|
</section>
|
|
|
|
<div class="admin-surface" style="max-width:720px;">
|
|
<form class="admin-dialog-card" @onsubmit="SaveAsync" @onsubmit:preventDefault="true">
|
|
<label>제목 * <input class="admin-input" @bind="model.Title" /></label>
|
|
<label>상세 내용 (선택) <textarea class="admin-input" rows="3" @bind="model.Content"></textarea></label>
|
|
<label>유형
|
|
<select class="admin-input" @bind="model.DisplayType">
|
|
<option value="info">일반 (파란색)</option>
|
|
<option value="banner">배너 (주황색)</option>
|
|
<option value="urgent">긴급 (빨간색)</option>
|
|
</select>
|
|
</label>
|
|
<label>노출 순서 <input class="admin-input" type="number" @bind="model.SortOrder" /></label>
|
|
<label>게시 시작일 <input class="admin-input" type="text" placeholder="yyyy-MM-dd" @bind="StartsAtText" /></label>
|
|
<label>게시 종료일 <input class="admin-input" type="text" placeholder="yyyy-MM-dd" @bind="EndsAtText" /></label>
|
|
<label><input type="checkbox" @bind="model.IsActive" /> @(model.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/announcements")'>취소</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public int? Id { get; set; }
|
|
private bool isSaving;
|
|
private DateTime? startsAtDate;
|
|
private DateTime? endsAtDate;
|
|
private AnnouncementDto model = new();
|
|
private string StartsAtText { get => startsAtDate?.ToString("yyyy-MM-dd") ?? ""; set => startsAtDate = DateTime.TryParse(value, out var dt) ? dt : null; }
|
|
private string EndsAtText { get => endsAtDate?.ToString("yyyy-MM-dd") ?? ""; set => endsAtDate = DateTime.TryParse(value, out var dt) ? dt : null; }
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
if (Id.HasValue)
|
|
{
|
|
try
|
|
{
|
|
var entity = await AnnouncementClient.GetByIdAsync(Id.Value);
|
|
if (entity is null)
|
|
{
|
|
Navigation.NavigateTo("/taxbaik/admin/announcements");
|
|
return;
|
|
}
|
|
model = new AnnouncementDto
|
|
{
|
|
Id = entity.Id,
|
|
Title = entity.Title,
|
|
Content = entity.Content,
|
|
DisplayType = entity.DisplayType,
|
|
IsActive = entity.IsActive,
|
|
SortOrder = entity.SortOrder
|
|
};
|
|
startsAtDate = entity.StartsAt?.ToLocalTime();
|
|
endsAtDate = entity.EndsAt?.ToLocalTime();
|
|
}
|
|
catch
|
|
{
|
|
Navigation.NavigateTo("/taxbaik/admin/announcements");
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task SaveAsync()
|
|
{
|
|
isSaving = true;
|
|
try
|
|
{
|
|
model.StartsAt = startsAtDate.HasValue ? DateTime.SpecifyKind(startsAtDate.Value.Date, DateTimeKind.Local).ToUniversalTime() : null;
|
|
model.EndsAt = endsAtDate.HasValue ? DateTime.SpecifyKind(endsAtDate.Value.Date.AddDays(1).AddSeconds(-1), DateTimeKind.Local).ToUniversalTime() : null;
|
|
var result = Id.HasValue ? await AnnouncementClient.UpdateAsync(Id.Value, model) : await AnnouncementClient.CreateAsync(model);
|
|
await JS.InvokeVoidAsync("alert", result != null ? "공지사항이 저장되었습니다." : "저장 실패");
|
|
Navigation.NavigateTo("/taxbaik/admin/announcements");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
await JS.InvokeVoidAsync("alert", $"저장 실패: {ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
isSaving = false;
|
|
}
|
|
}
|
|
}
|