8202c3278b
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m17s
Phase 8: Complete WebAssembly 렌더 모드 전환 (정공법) Migration Summary: - ALL Admin components → TaxBaik.Web.Client - Routes.razor, Pages/*, Layout/*, Shared/*, Forms/* - App.razor → TaxBaik.WasmClient (호스트 컴포넌트) - Shared utilities → TaxBaik.Application.Utils Architecture: ✅ App.razor: TaxBaik.WasmClient (WebAssembly, 호스트) ✅ Routes + Pages: TaxBaik.WasmClient (WebAssembly) ✅ Layout + Shared + Forms: TaxBaik.WasmClient (WebAssembly) ✅ Services: TaxBaik.Web (API-First) Key Changes: - Namespaces: TaxBaik.Web.Components.Admin → TaxBaik.WasmClient.Components.Admin - Shared utilities: TaxBaik.Application.Utils (single source of truth) - Program.cs: MapRazorComponents<TaxBaik.WasmClient.Components.Admin.App>() - _Imports.razor: Components/Admin 폴더에 재구성 Build Status: ✅ 0 errors, 0 warnings Benefits: - Stateless server (no Circuit memory) - Client-side rendering (WebAssembly) - Unlimited concurrent users (horizontal scaling) - ERP-ready architecture Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
143 lines
7.9 KiB
Plaintext
143 lines
7.9 KiB
Plaintext
@inject NavigationManager Navigation
|
|
@inject IJSRuntime JS
|
|
@inject VersionInfo VersionInfo
|
|
@implements IDisposable
|
|
|
|
<MudPopoverProvider />
|
|
<MudDialogProvider />
|
|
<MudSnackbarProvider />
|
|
|
|
<MudLayout Class="admin-shell">
|
|
<MudAppBar Elevation="0" Class="admin-topbar">
|
|
<MudIconButton Icon="@Icons.Material.Filled.Menu"
|
|
Color="Color.Inherit"
|
|
Edge="Edge.Start"
|
|
Class="admin-menu-button"
|
|
OnClick="@ToggleDrawer" />
|
|
<div class="admin-topbar-title">
|
|
<MudText Typo="Typo.body2" Class="font-weight-bold admin-brand-text">TaxBaik</MudText>
|
|
<MudText Typo="Typo.body2" Class="admin-brand-subtitle">세무회계 관리 대시보드</MudText>
|
|
</div>
|
|
<MudSpacer />
|
|
|
|
<div class="admin-topbar-actions">
|
|
<MudButton Class="admin-topbar-action"
|
|
Variant="Variant.Text"
|
|
Color="Color.Inherit"
|
|
Size="Size.Small"
|
|
StartIcon="@Icons.Material.Filled.OpenInNew"
|
|
Href="/taxbaik"
|
|
Target="_blank">
|
|
공개 사이트
|
|
</MudButton>
|
|
|
|
<MudDivider Vertical="true" FlexItem="true" Class="mx-2" />
|
|
|
|
<MudButton Class="admin-topbar-action"
|
|
Variant="Variant.Text"
|
|
Color="Color.Error"
|
|
Size="Size.Small"
|
|
StartIcon="@Icons.Material.Filled.Logout"
|
|
Href="/taxbaik/admin/logout">
|
|
로그아웃
|
|
</MudButton>
|
|
</div>
|
|
</MudAppBar>
|
|
|
|
<MudDrawer @bind-open="@drawerOpen"
|
|
Elevation="0"
|
|
Variant="DrawerVariant.Responsive"
|
|
Breakpoint="Breakpoint.Md"
|
|
Class="admin-drawer">
|
|
<div class="admin-drawer-brand">
|
|
<div class="admin-brand-mark">T</div>
|
|
<div>
|
|
<MudText Typo="Typo.subtitle1">TaxBaik</MudText>
|
|
<MudText Typo="Typo.caption">세무 운영 콘솔</MudText>
|
|
</div>
|
|
</div>
|
|
<MudNavMenu Class="admin-nav">
|
|
<MudNavLink Href="/taxbaik/admin/dashboard" Match="NavLinkMatch.All" Icon="@Icons.Material.Filled.Dashboard" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/dashboard"))">대시보드</MudNavLink>
|
|
<MudNavGroup Title="CRM & 세무관리" Icon="@Icons.Material.Filled.BusinessCenter" @bind-Expanded="@expandedCRMGroup">
|
|
<MudNavLink Href="/taxbaik/admin/tax-profiles" Icon="@Icons.Material.Filled.Assignment" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/tax-profiles"))">세무 프로필</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/tax-filing-schedules" Icon="@Icons.Material.Filled.CalendarMonth" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/tax-filing-schedules"))">신고 일정</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/contracts" Icon="@Icons.Material.Filled.Description" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/contracts"))">계약 관리</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/consulting-activities" Icon="@Icons.Material.Filled.ChatBubble" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/consulting-activities"))">상담 활동</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/revenue-trackings" Icon="@Icons.Material.Filled.Receipt" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/revenue-trackings"))">수익 추적</MudNavLink>
|
|
</MudNavGroup>
|
|
<MudNavGroup Title="고객 관리" Icon="@Icons.Material.Filled.PeopleAlt" @bind-Expanded="@expandedCustomerGroup">
|
|
<MudNavLink Href="/taxbaik/admin/clients" Icon="@Icons.Material.Filled.ContactPage" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/clients"))">고객 카드</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/tax-filings" Icon="@Icons.Material.Filled.Assessment" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/tax-filings"))">세무신고</MudNavLink>
|
|
</MudNavGroup>
|
|
<MudNavGroup Title="홈페이지" Icon="@Icons.Material.Filled.Home" @bind-Expanded="@expandedWebsiteGroup">
|
|
<MudNavLink Href="/taxbaik/admin/announcements" Icon="@Icons.Material.Filled.Campaign" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/announcements"))">공지사항</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/faqs" Icon="@Icons.Material.Filled.QuestionAnswer" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/faqs"))">FAQ 관리</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/blog" Icon="@Icons.Material.Filled.Article" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/blog"))">블로그 관리</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/season-simulator" Icon="@Icons.Material.Filled.Preview" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/season-simulator"))">시즌 시뮬레이터</MudNavLink>
|
|
</MudNavGroup>
|
|
<MudNavLink Href="/taxbaik/admin/inquiries" Icon="@Icons.Material.Filled.Forum" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/inquiries"))">문의 관리</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/settings" Icon="@Icons.Material.Filled.Tune" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/settings"))">설정</MudNavLink>
|
|
<MudNavLink Href="/taxbaik/admin/common-codes" Icon="@Icons.Material.Filled.Category" ClickPreventDefault="true" OnClick="@(() => NavigateTo("/taxbaik/admin/common-codes"))">공통관리</MudNavLink>
|
|
</MudNavMenu>
|
|
<div class="admin-drawer-version">
|
|
<div class="admin-drawer-version-label">Version</div>
|
|
<div class="admin-drawer-version-value">v@(VersionInfo.Version)</div>
|
|
<div class="admin-drawer-version-built">@VersionInfo.Built</div>
|
|
</div>
|
|
</MudDrawer>
|
|
|
|
<MudMainContent Class="admin-main">
|
|
<MudContainer MaxWidth="MaxWidth.False" Class="admin-content">
|
|
@ChildContent
|
|
</MudContainer>
|
|
</MudMainContent>
|
|
</MudLayout>
|
|
|
|
@code {
|
|
[Parameter]
|
|
public RenderFragment? ChildContent { get; set; }
|
|
|
|
private bool drawerOpen = true;
|
|
private bool expandedCRMGroup = true;
|
|
private bool expandedCustomerGroup = false;
|
|
private bool expandedWebsiteGroup = false;
|
|
|
|
protected override void OnInitialized()
|
|
{
|
|
Navigation.LocationChanged += OnLocationChanged;
|
|
}
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
await JS.InvokeVoidAsync("taxbaikAdminSession.setContext", "admin/shell", "navigation", "layout", "shell", "shell", "", "main");
|
|
await JS.InvokeVoidAsync("taxbaikAdminSession.hideLoading");
|
|
}
|
|
}
|
|
|
|
private void OnLocationChanged(object? sender, LocationChangedEventArgs args)
|
|
{
|
|
var route = new Uri(args.Location).AbsolutePath;
|
|
_ = JS.InvokeVoidAsync("taxbaikAdminSession.setContext", route, "navigation", "route-change", "layout", "shell", "", route);
|
|
_ = InvokeAsync(() => JS.InvokeVoidAsync("taxbaikAdminSession.hideLoading"));
|
|
}
|
|
|
|
private void ToggleDrawer()
|
|
{
|
|
drawerOpen = !drawerOpen;
|
|
_ = JS.InvokeVoidAsync("taxbaikAdminSession.setContext", "admin/shell", "navigation", "drawer", drawerOpen ? "opened" : "closed", "shell", "", "drawer");
|
|
_ = JS.InvokeVoidAsync("taxbaikAdminSession.traceUiState", "admin-shell", drawerOpen ? "drawer opened" : "drawer closed");
|
|
}
|
|
|
|
private void NavigateTo(string url)
|
|
{
|
|
Navigation.NavigateTo(url);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Navigation.LocationChanged -= OnLocationChanged;
|
|
}
|
|
}
|