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