ea447495d3
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m7s
Groups the repo root into src (buildable source), docs (already existed), and everything else (db/, scripts/, tests/, deploy/ - deployment/ops/test assets that aren't compiled, already organized as their own folders). CI now only needs src/ to build: dotnet restore/build/test/publish all point at src/TaxBaik.sln, src/TaxBaik.Web/, src/TaxBaik.Proxy/. - git mv every project (Domain, Infrastructure, Application, Application.Tests, Web, Web.Client, Proxy) and TaxBaik.sln into src/ as a unit, so relative ProjectReference/.sln paths stay valid unchanged. - .gitea/workflows/deploy.yml: 6 dotnet restore/clean/build/test/publish invocations now point at src/. db/migrations and scripts/ stay at root (deploy_gb.sh and browser-e2e.yml only touch published output and the deployed URL, not source paths - verified, no changes needed there). - scripts/validate_admin_render.sh: admin render-mode file paths now src/TaxBaik.Web.Client/... - scripts/validate_kst_timestamps.sh: dropped deploy.sh from its target list - that script was removed in the prior cleanup commit (dead, no CI workflow referenced it) but this validator still expected it to exist. - CLAUDE.md, docs/ENGINEERING_HARNESS.md, docs/ADMIN_PATTERN_CRITIQUE_WBS.md: updated project-structure diagram, dotnet run/build commands, and grep targets to the new src/ paths (also fixed a pre-existing stale path in ADMIN_PATTERN_CRITIQUE_WBS.md that still said TaxBaik.Web/Components/Admin from before that ever moved to TaxBaik.Web.Client). - Added a Repo Root harness rule + Architecture Guardrail entries: new files belong under src/docs/tests/scripts/db/deploy, not loose at root; temp work stays outside the repo (or under a gitignored .scratch/) and is never committed. Verified locally: dotnet build/test src/TaxBaik.sln (26/26 tests), and all three scripts/validate_*.sh pass against the new layout. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
139 lines
4.2 KiB
Plaintext
139 lines
4.2 KiB
Plaintext
@page "/admin/common-codes"
|
|
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
|
|
@using TaxBaik.Web.Services.AdminClients
|
|
@using TaxBaik.Domain.Entities
|
|
@attribute [Authorize]
|
|
@inject ICommonCodeBrowserClient CommonCodeClient
|
|
@inject ISnackbar Snackbar
|
|
|
|
<PageTitle>공통관리</PageTitle>
|
|
|
|
<AdminPageHeader Title="공통관리" Eyebrow="System" Subtitle="공통코드 그룹과 항목을 일관된 기준으로 관리합니다." />
|
|
|
|
<MudGrid Spacing="2">
|
|
<MudItem XS="12" MD="4">
|
|
<CommonCodeGroupPanel Groups="groups"
|
|
SelectedGroup="selectedGroup"
|
|
SelectedGroupChanged="OnGroupChanged"
|
|
OnCreateRequested="PrepareCreate" />
|
|
</MudItem>
|
|
|
|
<MudItem XS="12" MD="8">
|
|
<CommonCodeListPanel Loading="@isLoading"
|
|
Codes="codes"
|
|
EditModel="editModel"
|
|
IsCreateMode="isCreateMode"
|
|
Form="form"
|
|
EditRequested="EditCode"
|
|
DeleteRequested="DeleteCode"
|
|
SaveRequested="SaveCode"
|
|
ResetRequested="PrepareCreate" />
|
|
</MudItem>
|
|
</MudGrid>
|
|
|
|
@code {
|
|
private List<string> groups = [];
|
|
private List<CommonCode> codes = [];
|
|
private string selectedGroup = "";
|
|
private bool isLoading = true;
|
|
private CommonCode editModel = new();
|
|
private bool isCreateMode = true;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
groups = await CommonCodeClient.GetGroupsAsync();
|
|
selectedGroup = groups.FirstOrDefault() ?? "";
|
|
await LoadCodes();
|
|
PrepareCreate();
|
|
}
|
|
|
|
private async Task OnGroupChanged(string value)
|
|
{
|
|
selectedGroup = value;
|
|
await LoadCodes();
|
|
PrepareCreate();
|
|
}
|
|
|
|
private async Task LoadCodes()
|
|
{
|
|
isLoading = true;
|
|
codes = string.IsNullOrWhiteSpace(selectedGroup)
|
|
? []
|
|
: await CommonCodeClient.GetByGroupAsync(selectedGroup);
|
|
isLoading = false;
|
|
}
|
|
|
|
private void PrepareCreate()
|
|
{
|
|
isCreateMode = true;
|
|
editModel = new CommonCode
|
|
{
|
|
CodeGroup = selectedGroup,
|
|
IsActive = true
|
|
};
|
|
}
|
|
|
|
private void EditCode(CommonCode code)
|
|
{
|
|
isCreateMode = false;
|
|
editModel = new CommonCode
|
|
{
|
|
CodeGroup = code.CodeGroup,
|
|
CodeValue = code.CodeValue,
|
|
CodeName = code.CodeName,
|
|
SortOrder = code.SortOrder,
|
|
IsActive = code.IsActive
|
|
};
|
|
}
|
|
|
|
private async Task SaveCode()
|
|
{
|
|
editModel.CodeGroup = editModel.CodeGroup?.Trim() ?? string.Empty;
|
|
editModel.CodeValue = editModel.CodeValue?.Trim() ?? string.Empty;
|
|
editModel.CodeName = editModel.CodeName?.Trim() ?? string.Empty;
|
|
|
|
if (string.IsNullOrWhiteSpace(editModel.CodeGroup) ||
|
|
string.IsNullOrWhiteSpace(editModel.CodeValue) ||
|
|
string.IsNullOrWhiteSpace(editModel.CodeName))
|
|
{
|
|
Snackbar.Add("그룹, 값, 이름은 모두 입력해야 합니다.", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
if (editModel.CodeGroup.Any(char.IsWhiteSpace))
|
|
{
|
|
Snackbar.Add("code_group에는 공백을 넣을 수 없습니다.", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
if (editModel.CodeValue.Any(char.IsWhiteSpace))
|
|
{
|
|
Snackbar.Add("code_value에는 공백을 넣을 수 없습니다.", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
if (!await CommonCodeClient.UpsertAsync(editModel))
|
|
{
|
|
Snackbar.Add("저장 실패", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
Snackbar.Add("저장되었습니다.", Severity.Success);
|
|
await LoadCodes();
|
|
PrepareCreate();
|
|
}
|
|
|
|
private async Task DeleteCode(CommonCode code)
|
|
{
|
|
if (!await CommonCodeClient.DeleteAsync(code.CodeGroup, code.CodeValue))
|
|
{
|
|
Snackbar.Add("삭제 실패", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
Snackbar.Add("삭제되었습니다.", Severity.Success);
|
|
await LoadCodes();
|
|
PrepareCreate();
|
|
}
|
|
}
|