Merge origin/sub_laptop_5 into sub_laptop_8 — PLAN 701 · B09 껍데기 겹침 양쪽 살림(띠 위 · 표 · 펼침 · 안내)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-31 13:26:34 +09:00
co-authored by Claude Opus 5.5
28 changed files with 504 additions and 87 deletions
+9 -3
View File
@@ -15,6 +15,7 @@ import "./B09_Estimation_UI_Page.css";
import { API_BASE_URL } from "@config/config_frontend";
import { createWorkflowLayout } from "@ui/ui_template_workflow_layout";
import { createText } from "@ui/ui_template_text";
import { createBanner } from "@ui/ui_template_banner";
import {
createButton,
hideLoadingOverlay,
@@ -41,7 +42,7 @@ import { closePopups, openRowPopup } from "./B09_Estimation_UI_Popup";
import {
DRAFT,
rowIndex,
TABS,
unfinished,
type Link,
type TabContext,
type TabId,
@@ -127,7 +128,7 @@ export function renderB09Estimation(root: HTMLElement): void {
let payload: Row | null = null;
let user: Row = {};
let sheets: Row = {};
let current: TabId = TABS[0][0];
let current: TabId = "bill"; // 701-2 첫 화면 = 설계내역서(빈 원가계산서 아님)
// 181-1 위 탭(md) · 아래 탭(sm) 두 줄 — 줄 그리기 = `…_UI_TabBar`
const bars = createTabBars((tab) => show(tab));
@@ -266,7 +267,9 @@ export function renderB09Estimation(root: HTMLElement): void {
if (level && hint) hint.textContent = `${level.guide.textContent} · ${hint.textContent}`;
const foot = hint ?? level?.guide;
const fold = bill?.fold?.(table.root); // 702-1 줄 펼침 = 표 아래
panel.replaceChildren(table.root, ...(fold ? [fold] : []), ...(foot ? [foot] : []));
// 701-3 띠(원가계산서 「빈 줄 n · 미완성」) = 표 위
const banner = spec.banner ? [createBanner({ tone: "warning", text: spec.banner })] : [];
panel.replaceChildren(...banner, table.root, ...(fold ? [fold] : []), ...(foot ? [foot] : []));
if (at >= 0) requestAnimationFrame(() => table.focusRow(at, false)); // 스크롤만(표시 = 빨강)
};
@@ -311,6 +314,7 @@ export function renderB09Estimation(root: HTMLElement): void {
? run("/estimation", "PUT", "원가 사용자 값을 저장했습니다.", { user })
: Promise.resolve(true);
DRAFT.save = saveChanged; // 초안 [인쇄 미리보기] = 저장 뒤 이동(506-3)
DRAFT.blocked = () => (payload ? unfinished(sheets) : null); // 701-3 인쇄 · 확정 = 빈 줄 0
const refresh = createButton({
label: "업데이트",
variant: "ghost",
@@ -370,6 +374,8 @@ export function renderB09Estimation(root: HTMLElement): void {
left.addEventListener("ui-step-nav", (event) => {
if ((event as CustomEvent<number>).detail !== 1 || !goNext || !projectId) return;
event.stopPropagation();
const why = DRAFT.blocked?.();
if (why) return void showToast(why, "warning"); // 701-3 확정 = 빈 줄 0 일 때만
void moveStage(projectId, goNext, [
{ name: "원가 저장", run: saveChanged },
{