fix: per-page WASM render mode, Contact checkbox binding, Telegram inquiry channel
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m11s

- Admin: replace the global @rendermode on <Routes>/<Router> with per-page
  render mode. Login.razor now prerenders (form visible before WASM loads);
  every other [Authorize] page stays prerender: false to avoid the
  AuthorizeRouteView blank-render regression from earlier attempts. Adds a
  "준비 중" -> "로그인" splash tied to WASM boot completion, and lets the
  authenticated-shell loading overlay stay up until AdminShell actually renders.
- Contact.cshtml: fix the "Agree" checkbox missing value="true" - a checked
  box sent the browser-default "on", which bool model binding can't parse,
  so ModelState.IsValid silently went false and OnPostAsync returned a blank
  form with no visible error on every submission. Validation summary widened
  from ModelOnly to All so this class of failure isn't silent again.
- TelegramInquiryNotificationService: read Telegram:InquiryChatId (falling
  back to ChatId) instead of only ChatId, matching the channel routing
  CLAUDE.md documents and deploy.yml already provisions as separate secrets.
- Reconcile CLAUDE.md's self-contradicting Phase 8 prerender notes (Phase 9),
  rewrite validate_admin_render.sh for the per-page design, and add a
  SmartAdmin 5.5 design reference section to DOUZONE_UX_GUIDE.md for future
  admin screens (existing screens unchanged, tracked as WBS P4-03).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 10:15:27 +09:00
parent d015bb6c92
commit e5981769b9
42 changed files with 198 additions and 77 deletions
+10 -1
View File
@@ -35,8 +35,17 @@
<p>로드 중...</p>
</div>
</div>
<script>
// 로그인 화면은 prerender로 즉시 표시되므로 스피너가 필요 없다.
// 그 외 인증 화면은 WASM 부팅이 끝날 때까지(AdminShell.OnAfterRenderAsync에서 hideLoading 호출)
// 스피너를 "업데이트 스플래시"로 보여준다.
if (!document.documentElement.classList.contains('admin-login-route')) {
var loadingOverlay = document.getElementById('blazor-loading');
if (loadingOverlay) loadingOverlay.classList.add('show');
}
</script>
<MudThemeProvider @bind-IsDarkMode="isDarkMode" Theme="mudTheme" />
<Routes @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)" />
<Routes />
<script src="/taxbaik/_content/MudBlazor/MudBlazor.min.js"></script>
<script src="/taxbaik/js/admin-session.js"></script>
<script src="/taxbaik/_framework/blazor.web.js"></script>
@@ -1,5 +1,5 @@
@page "/admin"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@inject NavigationManager NavigationManager
@@ -1,6 +1,6 @@
@page "/admin/announcements/create"
@page "/admin/announcements/{Id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Services
@@ -1,5 +1,5 @@
@page "/admin/announcements"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@@ -1,5 +1,5 @@
@page "/admin/blog/create"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.WasmClient.Components.Admin.Pages.Blog
@@ -1,5 +1,5 @@
@page "/admin/blog/{id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.WasmClient.Components.Admin.Pages.Blog
@@ -1,5 +1,5 @@
@page "/admin/blog"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@inject IBlogBrowserClient BlogClient
@inject ISnackbar Snackbar
@@ -1,5 +1,5 @@
@page "/admin/clients/{ClientId:int}"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Web.Services.AdminClients
@@ -1,6 +1,6 @@
@page "/admin/clients/create"
@page "/admin/clients/{Id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.Web.Services
@@ -1,5 +1,5 @@
@page "/admin/clients"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@@ -1,5 +1,5 @@
@page "/admin/common-codes"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Domain.Entities
@attribute [Authorize]
@@ -1,5 +1,5 @@
@page "/admin/companies/create"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IApiClient ApiClient
@@ -1,5 +1,5 @@
@page "/admin/companies/{id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.WasmClient.Components.Admin.Forms
@inject IApiClient ApiClient
@@ -1,5 +1,5 @@
@page "/admin/companies"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@inject IApiClient ApiClient
@inject ISnackbar Snackbar
@@ -1,5 +1,5 @@
@page "/admin/consulting-activities"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IConsultingActivityBrowserClient ActivityClient
@@ -1,5 +1,5 @@
@page "/admin/contracts"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IContractBrowserClient ContractClient
@@ -1,5 +1,5 @@
@page "/admin/dashboard"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.WasmClient.Components.Admin.Shared
@@ -1,6 +1,6 @@
@page "/admin/faqs/create"
@page "/admin/faqs/{Id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@@ -1,5 +1,5 @@
@page "/admin/faqs"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@@ -1,5 +1,5 @@
@page "/admin/inquiries/create"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.WasmClient.Components.Admin.Forms
@@ -1,5 +1,5 @@
@page "/admin/inquiries/{InquiryId:int}"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@inject IInquiryBrowserClient InquiryClient
@@ -1,5 +1,5 @@
@page "/admin/inquiries/{id:int}/edit"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.DTOs
@using TaxBaik.WasmClient.Components.Admin.Forms
@@ -1,5 +1,5 @@
@page "/admin/inquiries"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@inject IInquiryBrowserClient InquiryClient
@@ -1,6 +1,6 @@
@page "/admin/login"
@layout TaxBaik.WasmClient.Components.Admin.Layout.BlankLayout
@attribute [AllowAnonymous]
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: true))
<PageTitle>로그인</PageTitle>
<AdminLoginForm />
@@ -1,5 +1,5 @@
@page "/admin/logout"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services
@inject CustomAuthenticationStateProvider AuthStateProvider
@inject NavigationManager NavigationManager
@@ -1,5 +1,5 @@
@page "/admin/revenue-trackings"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject IRevenueTrackingBrowserClient RevenueClient
@@ -1,5 +1,5 @@
@page "/admin/season-simulator"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Application.Seasonal
@using TaxBaik.Application.Services
@@ -1,5 +1,5 @@
@page "/admin/settings"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using System.ComponentModel.DataAnnotations
@using System.Collections.Generic
@@ -1,5 +1,5 @@
@page "/admin/tax-filing-schedules"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Domain.Entities
@using TaxBaik.WasmClient.Components.Admin.Shared
@@ -1,5 +1,5 @@
@page "/admin/tax-filings"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@attribute [Authorize]
@using TaxBaik.Web.Services
@using TaxBaik.Domain.Entities
@@ -1,5 +1,5 @@
@page "/admin/tax-profiles"
@rendermode InteractiveWebAssembly
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.WasmClient.Components.Admin.Shared
@inject ITaxProfileBrowserClient TaxProfileClient
@@ -1,7 +1,7 @@
@namespace TaxBaik.WasmClient.Components.Admin
@using Microsoft.AspNetCore.Components.Routing
<Router AppAssembly="@typeof(TaxBaik.WasmClient._Imports).Assembly" @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)">
<Router AppAssembly="@typeof(TaxBaik.WasmClient._Imports).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(TaxBaik.WasmClient.Components.Admin.Layout.MainLayout)">
<NotAuthorized>
@@ -28,9 +28,11 @@
<div class="mud-alert mud-alert-filled-error mb-4 login-error-message" style="display:none;">로그인 중 오류가 발생했습니다.</div>
<button type="submit"
id="admin-login-submit"
disabled
class="mud-button-root mud-button mud-button-filled mud-button-filled-primary mud-elevation-0"
style="width: 100%; min-height: 52px; border: 0; border-radius: 4px; color: white;">
<span>로그인</span>
<span>준비 중...</span>
</button>
</form>
</MudPaper>