From 22266508d49a4096aeb5ab3c22f1897dd3c23412 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 8 Oct 2026 14:10:03 +0900 Subject: [PATCH] =?UTF-8?q?fix(B01):=20=ED=95=AD=EB=AA=A9=EB=B3=84=20?= =?UTF-8?q?=ED=83=AD=20=ED=99=94=EB=A9=B4=20=EB=8B=A4=EB=93=AC=EC=9D=8C=20?= =?UTF-8?q?=E2=80=94=20=ED=9A=8C=EC=82=AC=20=EC=A0=95=EB=B3=B4=20=EC=B9=B8?= =?UTF-8?q?=20=EC=A4=84=EB=A7=9E=EC=B6=A4=20=C2=B7=20=EB=A6=AC=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=20=EA=B8=B0=EA=B0=84=20=EA=B8=80=20=C2=B7=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=91=9C=20=EB=8B=A8=EA=B3=84=20?= =?UTF-8?q?=EB=A7=89=EB=8C=80=20=EB=91=90=20=EC=A4=84=20=C2=B7=20=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0=20=EC=A4=84=20=EC=A0=95=EB=A0=AC=20(92-1=C2=B792-2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정보 칸 라벨 · 값 한 쌍씩 묶음 · 리소스 그래프 글이 고른 기간을 따름 · 프로젝트 표 가로 여백 줄임 - 화면 검증(ORCA) 권한 셋 · 밝음 · 어두움 · 390px 끝 — PLAN 92장 검증완료 Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01MgChuAcyBqUkhHMTXomQC7 --- B01_Dashboard/B01_Dashboard_UI_Company.ts | 21 ++++++++++-------- B01_Dashboard/B01_Dashboard_UI_Profile.ts | 4 +++- B01_Dashboard/B01_Dashboard_UI_ProjectsTab.ts | 1 + B01_Dashboard/B01_Dashboard_UI_Resources.ts | 2 +- B01_Dashboard/B01_Dashboard_UI_Style_Tabs.css | 22 ++++++++++++++++++- ui_template/ui_template_locale_b1_tabs.ts | 1 + 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/B01_Dashboard/B01_Dashboard_UI_Company.ts b/B01_Dashboard/B01_Dashboard_UI_Company.ts index b5582f3bf..6eed3b476 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Company.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Company.ts @@ -23,12 +23,14 @@ import { formatDate, L, runRequest } from "./B01_Dashboard_UI_Common"; import { createPagedTable } from "./B01_Dashboard_UI_Paging"; /** 라벨 + 값 한 칸 — 회사 정보 격자 */ -function infoItem(label: string, value: unknown): HTMLElement[] { +function infoItem(label: string, value: unknown): HTMLElement { + const item = document.createElement("div"); const term = document.createElement("dt"); term.textContent = label; const detail = document.createElement("dd"); detail.textContent = value == null || value === "" ? "-" : String(value); - return [term, detail]; + item.append(term, detail); + return item; } export function buildCompanyPanel(state: DashboardState): HTMLElement { @@ -54,15 +56,16 @@ export function buildCompanyPanel(state: DashboardState): HTMLElement { const info = document.createElement("dl"); info.className = "b01-dashboard__info"; info.append( - ...infoItem(L("B01_Dashboard_Table_Company"), company.name), - ...infoItem(L("B01_Dashboard_Field_BusinessNumber"), company.business_registration_number), - ...infoItem(L("B01_Co_Owner"), company.business_owner), - ...infoItem(L("B01_Co_Status"), company.business_status), - ...infoItem(L("B01_Dashboard_Field_Address"), company.business_address), - ...infoItem(L("B01_Co_Members"), company.user_count ?? 0), - ...infoItem(L("B01_Co_Projects"), company.project_count ?? 0), + infoItem(L("B01_Dashboard_Table_Company"), company.name), + infoItem(L("B01_Dashboard_Field_BusinessNumber"), company.business_registration_number), + infoItem(L("B01_Co_Owner"), company.business_owner), + infoItem(L("B01_Co_Status"), company.business_status), + infoItem(L("B01_Dashboard_Field_Address"), company.business_address), + infoItem(L("B01_Co_Members"), company.user_count ?? 0), + infoItem(L("B01_Co_Projects"), company.project_count ?? 0), ); const box = document.createElement("div"); + box.className = "b01-dashboard__stack"; box.append(info, wrap); // 회사 정보 수정 (2026-09-06 사용자 지시) — 관리자만 보인다. if (state.user.role !== "USER") { diff --git a/B01_Dashboard/B01_Dashboard_UI_Profile.ts b/B01_Dashboard/B01_Dashboard_UI_Profile.ts index faa4cc08b..c7b73650d 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Profile.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Profile.ts @@ -121,11 +121,13 @@ export function buildAccountInfo(user: DashboardUser): HTMLElement { [L("B01_Ac_AuthExpires"), formatDate(user.auth_expires_at)], ]; for (const [label, value] of rows) { + const item = document.createElement("div"); const term = document.createElement("dt"); term.textContent = label; const detail = document.createElement("dd"); detail.textContent = value; - info.append(term, detail); + item.append(term, detail); + info.append(item); } return info; } diff --git a/B01_Dashboard/B01_Dashboard_UI_ProjectsTab.ts b/B01_Dashboard/B01_Dashboard_UI_ProjectsTab.ts index 3e7dd69a8..cbdc2b657 100644 --- a/B01_Dashboard/B01_Dashboard_UI_ProjectsTab.ts +++ b/B01_Dashboard/B01_Dashboard_UI_ProjectsTab.ts @@ -96,6 +96,7 @@ export function buildProjectsTab(state: DashboardState, projects: ProjectItem[]) ); const progress = createPagedTable(progressHeaders(), progressRow, projects); + list.root.classList.add("b01-dashboard__paged--dense"); let filter: ProjectFilter = parseFilter(currentQuery().get("filter")); const query = createInputField({ label: L("B01_Pj_Search"), diff --git a/B01_Dashboard/B01_Dashboard_UI_Resources.ts b/B01_Dashboard/B01_Dashboard_UI_Resources.ts index 923573137..efba99f84 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Resources.ts +++ b/B01_Dashboard/B01_Dashboard_UI_Resources.ts @@ -66,7 +66,7 @@ function buildResourceMetrics(resources: ResourceData | null): HTMLElement { function buildResourceChart(resources: ResourceData | null, days: number): HTMLElement { return buildTrendChart(resources, days, { - caption: L("B01_Dashboard_Resources_ChartCaption"), + caption: L("B01_Sy_ResourceCaption").replace("{days}", String(days)), ariaLabel: L("B01_Dashboard_Resources_ChartAria"), series: [ { name: L("B01_Dashboard_Metric_Cpu"), colorIndex: 0, pick: (h) => h.cpu_usage_percent }, diff --git a/B01_Dashboard/B01_Dashboard_UI_Style_Tabs.css b/B01_Dashboard/B01_Dashboard_UI_Style_Tabs.css index dd752a34e..51ba92b82 100644 --- a/B01_Dashboard/B01_Dashboard_UI_Style_Tabs.css +++ b/B01_Dashboard/B01_Dashboard_UI_Style_Tabs.css @@ -66,11 +66,15 @@ gap: var(--spacing-8); } +.b01-dashboard__overview { + gap: var(--spacing-24); +} + /* 찾기 · 거르기 줄 */ .b01-dashboard__filters { display: flex; flex-wrap: wrap; - align-items: flex-end; + align-items: flex-start; gap: var(--spacing-16); margin-bottom: var(--spacing-16); } @@ -102,6 +106,12 @@ margin: 0 0 var(--spacing-16); } +.b01-dashboard__stack { + display: flex; + flex-direction: column; + gap: var(--spacing-16); +} + .b01-dashboard__info dt { color: var(--color-text-secondary); font-size: var(--text-caption); @@ -154,3 +164,13 @@ vertical-align: bottom; white-space: nowrap; } + +/* 칸이 많은 표(프로젝트) — 가로 여백을 줄이고 단계 막대가 두 줄 안에 들어오게 */ +.b01-dashboard__paged--dense .b01-dashboard__table th, +.b01-dashboard__paged--dense .b01-dashboard__table td { + padding: var(--spacing-8); +} + +.b01-dashboard__paged--dense .ui-workflow-layout__steps { + min-width: 400px; +} diff --git a/ui_template/ui_template_locale_b1_tabs.ts b/ui_template/ui_template_locale_b1_tabs.ts index 8084b4cb4..95d00d28f 100644 --- a/ui_template/ui_template_locale_b1_tabs.ts +++ b/ui_template/ui_template_locale_b1_tabs.ts @@ -77,6 +77,7 @@ export const ui_locales_b1_tabs = { /* --- 시스템 --- */ B01_Sy_Period: ["기간", "Period"], B01_Sy_Days: ["{days}일", "{days} days"], + B01_Sy_ResourceCaption: ["최근 {days}일 리소스 사용률", "Resource usage, last {days} days"], B01_Sy_ActiveTrend: ["활성 추이", "Activity trend"], B01_Sy_TrendCaption: ["활성 사용자 · 활성 프로젝트 수", "Active users and active projects"], B01_Sy_AllCompanies: ["전체 회사", "All companies"],