feat(M02): 좌측 구조물 조합 안 하위 컨테이너 셋 · 「전체 항목」 길 없앰(45-2)

- 좌측 구조물 조합 = 층 단추 · 나무만 · 구조물 도면 · 일위대가 · 면적산출 하위와 수평선 지움
- 「전체 항목」 목록 화면 길(onAll · buildAllItems) 지움 · 상세는 카드 [수정]으로
- 쓰는 곳 없는 structureLabel · 로케일 키 다섯 · 하위 CSS 지움
- 낡은 글 찾기 시험을 지금 코드에 맞춤 · 화면 시나리오 ui_checks/45-2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVPp2o6Mh2FZJr72yW3ofZ
This commit is contained in:
2026-10-05 12:32:50 +09:00
co-authored by Claude Opus 5.5
parent d26da8e6db
commit 407481dc8d
10 changed files with 110 additions and 232 deletions
@@ -15,7 +15,7 @@ import { t as L } from "@ui/ui_template_locale";
import { createWorkflowOverlays } from "@ui/ui_template_overlay";
import { navigateTo, type MountedPage } from "../A00_Common/router";
import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch";
import { fetchOwners, setActiveLayer, type Kind } from "./M02_MasterTemplete_Api_Fetch";
import { fetchOwners, setActiveLayer } from "./M02_MasterTemplete_Api_Fetch";
import {
accessFor,
buildReadOnlyBar,
@@ -40,8 +40,7 @@ import {
seesOthers,
} from "./M02_MasterTemplete_TreePanel_Roots";
import { canEdit, createMain, newItemButton, type Selection } from "./M02_MasterTemplete_UI_Main";
import { buildSide, type AllKind } from "./M02_MasterTemplete_UI_Side";
import { buildAllItems } from "./M02_MasterTemplete_ItemList";
import { buildSide } from "./M02_MasterTemplete_UI_Side";
import { buildTwoWay, pickedName } from "./M02_MasterTemplete_ItemPick";
import "./M02_MasterTemplete_UI_Style.css";
@@ -49,13 +48,6 @@ const NEW_NOTE = "새 항목이 들어갈 자리 — {value} · 나무에서 폴
const NEW_ASK =
"{from} 「{name}」 을(를) 복사해 「{to}」 에 새 항목으로 만듦 — 새 번호 · 원래 이름";
/** 「전체 항목」 화면 제목 앞마디 — 하위 이름 */
const ALL_TITLE = {
structure: "M02_KindStructure",
labor: "M02_KindLabor",
area: "M02_KindArea",
} as const satisfies Record<AllKind, string>;
export async function renderM02MasterTemplate(root: HTMLElement): Promise<MountedPage> {
const user = await fetchSessionUser().catch(() => null);
const entry = entryFromHash();
@@ -97,9 +89,9 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
canEdit: canEdit(layer, isAdmin),
onPick: (item) => void main.openTable(layer, item.열),
settle: () => main.settle(),
// 나무가 바뀜(새 항목 · 복사 생성 · 붙여넣기 · 지우기 · 이름 · 옮기기) — 집계표 + 좌측 하위 열 줄 · 번호
// 나무가 바뀜(새 항목 · 복사 생성 · 붙여넣기 · 지우기 · 이름 · 옮기기) — 집계표
onChanged: async (colId) => {
await Promise.all([main.openTable(layer, colId, true), side.refresh()]);
await main.openTable(layer, colId, true);
},
});
const go = async (next: Root, nextOwner: string | null, open: OpenTarget): Promise<void> => {
@@ -110,7 +102,7 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
entryQuery({ ...entry, open, root: next, owner: nextOwner }),
);
};
// 층 단추 셋(PLAN 29-2) — 「구조물 조합」 줄 아래 한 벌(하위 도면 · 일위대가 · 면적산출도 이 층)
// 층 단추 셋(PLAN 29-2) — 「구조물 조합」 줄 아래 한 벌
// 단추 옆 「+」 = 그 나무 맨 위 더하기(뿌리 줄을 갈음 · 29-6)
// 켜진 단추를 다시 누르면 그 층 목록 화면(30-4 · 집계표)
const layerBar = (open: OpenTarget, add: HTMLElement, reselect: () => void): HTMLElement =>
@@ -193,20 +185,6 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise<Mounte
layerBar("구조물조합", tree.add, () => void main.openTable(layer)),
peopleTree("구조물조합", tree.root),
],
// 「전체 항목」(39-5) — 메인 칸에 그 하위 목록 · 줄 누름 = 그 항목 상세(좌측 열 줄과 같은 `open`)
onAll: (kind) =>
void main.showView(
`${L(ALL_TITLE[kind])} · ${L("M02_ItemsAll")}`,
buildAllItems(kind, layer, owner, (row) => {
void main.open({
layer,
projectId: null,
kind: kind as Kind,
name: row.열,
label: row.이름,
});
}),
),
});
const layout = el("div", { className: "ui-workflow-layout m02-master" });