feat(M02): 좌측 같은 이름 단추 · 나무 뿌리 줄 없앰 · 「+」 더하기 · 찾기 하나(AND) (PLAN 29-6)

- 「일위대가 조합」 · 「구조물 조합」 컨테이너 안 같은 이름 줄 단추 없앰 — 제목을 펼치면 그 화면을 엶
- 나무 맨 위 뿌리 줄 없앰 — 폴더 · 항목부터 · 맨 위 더하기는 빈 자리 오른쪽 클릭 · 층 단추 옆 「+」(읽기만 층 = 숨김) · 빈 나무 안내글 맞춤
- 찾기 칸 하나 — 띄어쓰기 낱말 모두(AND · 대소문자 무시) · 이름 · 키 · 경로(구분 · 상세구분) · 단위 · 공용 matchText 를 나무 · 일위대가 조합 목록이 함께 씀(목록의 따로 찾기 칸 없앰)
- 시험 — 찾기 AND · 새 배치 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 18:15:43 +09:00
co-authored by Claude Opus 5.5
parent 95849aefbd
commit c1ad11e869
14 changed files with 127 additions and 51 deletions
@@ -151,16 +151,26 @@ export function buildSide(opt: SideOptions): SideHandle {
onOpen: () => (matset.clear(), labor?.clear(), paint()),
});
const labor = opt.labor?.({ onOpen: () => (matset.clear(), options.clear(), paint()) });
// 구조물 집계 양식 — 집계표 줄 아래 하위 컨테이너 넷(들여 · 같이 접힘) · 처음부터 펼침(집계표가 열려 있음)
/** 컨테이너 제목을 펼치면 그 화면을 엶 — 같은 이름 줄 단추를 갈음(PLAN 29-6) */
const openOnExpand = (sec: HTMLElement, run: () => void): HTMLElement => {
sec.querySelector(".ui-collapsible__title")?.addEventListener("click", () => {
if (sec.classList.contains("is-collapsed")) run();
});
return sec;
};
// 구조물 집계 양식 — 층 단추 · 나무 아래 하위 컨테이너 넷(들여 · 같이 접힘) · 처음부터 펼침(집계표가 열려 있음) ·
// 같은 이름 줄 단추 없음(제목이 그 이름 · 29-6)
const summary = section(
L("M02_KindTable"),
bodies.get("table")!,
...(opt.tree ?? []),
el("div", { className: "m02-side__items ui-sidebar-list", children: opt.tree ?? [] }),
...COLUMN_KINDS.map((k, i) => section(k.label(), columnBodies[i])),
matsetSection,
);
summary.classList.remove("is-collapsed");
summary.classList.add("m02-side__summary");
openOnExpand(summary, async () => {
if (!isPicked("table", STRUCTURE_TABLE) && (await opt.confirmLeave())) opt.onOpen(null);
});
// 구조물 옵션 보이기 · 도면 양식은 시스템 층(마스터 템플릿)에만
const extras =
layer === "system"
@@ -172,7 +182,7 @@ export function buildSide(opt: SideOptions): SideHandle {
const listHost = el("div", {
className: "m02-side__lists ui-sidebar-panel",
children: [
...(labor ? [section(labor.title, labor.body)] : []),
...(labor ? [openOnExpand(section(labor.title, labor.body), () => void labor.open())] : []),
summary,
...(extras ? [extras.옵션, extras.도면] : []),
],