From 549e0fea69be374426ea2347c5341288d22d237c Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 9 Oct 2026 19:03:22 +0900 Subject: [PATCH] =?UTF-8?q?=EF=BB=BFfeat(m02):=20=EC=82=AC=EC=A0=84?= =?UTF-8?q?=EC=A1=B0=ED=95=A9=20=EB=AA=A9=EB=A1=9D=ED=91=9C=20=EB=AF=B8?= =?UTF-8?q?=EB=B6=84=EB=A5=98=20=ED=91=9C=EA=B8=B0=20=C2=B7=20=EA=B3=A0?= =?UTF-8?q?=EB=A5=B4=EA=B8=B0=20=EC=B0=BD=20=EC=83=88=20=EB=B6=84=EB=A5=98?= =?UTF-8?q?=20=EA=B1=B0=EB=A6=84(149-2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 목록표 빈 구분 = 「미분류」(나무와 같은 말) - [로직 추가] 고르기 창 구분 거름 = 단가산출 로직 품셈 분류 + 사전조합 새 분류(구조물군 › 공통 + 종류) - 일위조합 줄 작은 글 = 새 분류 · 빈 값은 미분류 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01SE9MxeXTu2uaDZ55BJowAY --- .../M02_MasterTemplete_Labor_Pick.ts | 18 ++++++++++++++---- .../M02_MasterTemplete_Library_List.ts | 2 +- resources/tester/test_m02_precombo_scope.py | 13 +++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts index d684978b9..7dafc26ec 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts @@ -2,7 +2,7 @@ * M02_MasterTemplete_Labor_Pick.ts * [로직 더하기] 창 — 한 목록에 구분(단가산출 · 단가승격 · 일위조합) 칸 · 치는 대로 걸러짐(찾기 단추 없음) · * 단가승격 · 일위조합 줄은 층 단추(위 층만 · 짝 `M02_Labor_Ref.readable`) 층의 서고 · 고르면 참조 {층 · 주인 · 키} · - * 프로젝트 · 카드엔 서고 줄 없음 + * 프로젝트 · 카드엔 서고 줄 없음 · 거름 = 로직 품셈 분류 + 사전조합 새 분류(149-2 · 구조물군 › 공통 + 종류) * ========================================================================== */ import { createButton, createSelectField, el, showToast } from "@ui/ui_template_elements"; @@ -20,6 +20,8 @@ import { import type { LaborRef } from "./M02_MasterTemplete_Labor_Calc"; import { ownOwner } from "./M02_MasterTemplete_Layer"; import { tc } from "./M02_MasterTemplete_Labor_Text"; +import { precomboClasses } from "./M02_MasterTemplete_UI_Side_Precombo"; +import { fetchStructureDef } from "./StructOptions/M02_SO_Api"; import "../M01_MasterData/M01_MasterData_UI_Logic_Style.css"; // 창 겉틀 import "./M02_MasterTemplete_Labor.css"; @@ -54,6 +56,7 @@ const LAYER_TEXT = { export function openLogicPicker(done: (logic: LogicSummary) => void, lib?: LibraryPick): void { const subs: SubBrief[] = []; + let classes: ReturnType = []; // 사전조합 새 분류(149-2) — 서고 줄이 있을 때만 let all: LogicSummary[] = []; const sub = createSelectField({ options: opts([]), compact: true, label: tc("Sub") }); const detail = createSelectField({ options: opts([]), compact: true, label: tc("Detail") }); @@ -113,7 +116,7 @@ export function openLogicPicker(done: (logic: LogicSummary) => void, lib?: Libra key: x.row.이름, tag: tc(x.kind), name: x.row.제목 || x.row.이름, - sub: [x.row.이름, `${x.row.구분 ?? ""} ${x.row.상세구분 ?? ""}`.trim()] + sub: [x.row.이름, `${x.row.구분 || tc("Lib_Unsorted")} ${x.row.상세구분 ?? ""}`.trim()] .filter(Boolean) .join(" · "), unit: x.row.단위 ?? "", @@ -158,9 +161,9 @@ export function openLogicPicker(done: (logic: LogicSummary) => void, lib?: Libra }), ), ); - /** 구분 → 상세구분 — 로직 구분에 서고 줄(승격 · 조합) 것을 더함 · 같은 값은 한 칸 */ + /** 구분 → 상세구분 — 로직 품셈 구분 + 사전조합 새 분류 + 서고 줄 지금 값 · 같은 값은 한 칸 */ const subMap = (): Map> => { - const m = new Map(subs.map((s) => [s.name, new Set(s.details)])); + const m = new Map([...subs, ...classes].map((s) => [s.name, new Set(s.details)])); for (const { row } of libRows) { if (!row.구분) continue; if (!m.has(row.구분)) m.set(row.구분, new Set()); @@ -194,6 +197,13 @@ export function openLogicPicker(done: (logic: LogicSummary) => void, lib?: Libra layerBar.style.display = ""; drawLayers(); void loadLib(); + void fetchStructureDef().then( + (def) => { + classes = precomboClasses(def); + drawSubs(); + }, + () => undefined, // 못 받으면 서고 줄 지금 값만 + ); }); const dialog = el("div", { diff --git a/M02_MasterTemplete/M02_MasterTemplete_Library_List.ts b/M02_MasterTemplete/M02_MasterTemplete_Library_List.ts index d4d6f2a4a..003678691 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Library_List.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Library_List.ts @@ -144,7 +144,7 @@ export function mountLibraryList( pick, ...[ row.이름, - row.구분 ?? "", + row.구분 || tc("Lib_Unsorted"), // 빈 구분 = 미분류(149-2 · 나무와 같은 말) row.상세구분 ?? "", row.제목 ?? "", row.단위 ?? "", diff --git a/resources/tester/test_m02_precombo_scope.py b/resources/tester/test_m02_precombo_scope.py index 11583f7b0..c41363ee6 100644 --- a/resources/tester/test_m02_precombo_scope.py +++ b/resources/tester/test_m02_precombo_scope.py @@ -130,3 +130,16 @@ def test_나무_폴더_문서수_처음_펼침_폴더_메뉴_생성(): assert 'newLibrary(at.layer, "precombo", { 문서 }, at.owner)' in make lib = _text("M02_MasterTemplete_Library_List.ts") assert "export const nameDialog = (" in lib + + +def test_목록표_빈_구분_미분류_고르기_창_새_분류_거름(): + """149-2 — 목록표 빈 구분 = 미분류 · 고르기 창 거름 = 품셈 구분 + 사전조합 새 분류""" + lib = _text("M02_MasterTemplete_Library_List.ts") + assert 'row.구분 || tc("Lib_Unsorted"),' in lib + pick = _text("M02_MasterTemplete_Labor_Pick.ts") + assert "new Map([...subs, ...classes].map((s) => [s.name, new Set(s.details)]))" in pick + assert "classes = precomboClasses(def);" in pick + assert 'x.row.구분 || tc("Lib_Unsorted")' in pick # 서고 줄 작은 글 = 새 분류 · 빈 값 미분류 + # 거름은 칸 값 그대로 — 품셈 구분을 고르면 서고 줄 빠지고 새 분류를 고르면 로직 줄 빠짐 + assert "(!sub.select.value || x.row.구분 === sub.select.value)" in pick + assert "(!sub.select.value || x.구분 === sub.select.value)" in pick