From 6aa06d618be9cafb5f19798addda64819ec11ca3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 31 Oct 2026 16:24:12 +0900 Subject: [PATCH] =?UTF-8?q?feat(M02=20=EA=B3=A0=EB=A5=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=B0=BD=20=EB=82=B1=EB=A7=90):=20=E2=98=85=2012=20=E2=86=92?= =?UTF-8?q?=201=20=E2=80=94=20=EC=98=B5=EC=85=98=20=EA=B3=A0=EC=B9=98?= =?UTF-8?q?=EA=B8=B0=20=C2=B7=20=EC=9D=B4=20=EA=B5=AC=EC=A1=B0=EB=AC=BC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B3=A0=EC=B9=98=EA=B8=B0=20=C2=B7=20?= =?UTF-8?q?=EB=82=B4=20=EC=9E=90=EB=A3=8C=EC=A7=91=EC=97=90=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=20=C2=B7=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=C2=B7=20=EA=B0=92=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=84=20=C2=B7=20=EB=A9=B4=EC=A0=81=EC=82=B0=EC=B6=9C=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=20=EC=B9=B8=20=C2=B7=20=EC=84=B8=EB=B6=80=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=20=C2=B7=20=EC=8B=A4=EB=AC=B4=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EC=9D=BC=EC=9C=84=EB=8C=80=EA=B0=80=20=C2=B7=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EB=A8=B8=EB=A6=AC=20=C2=B7=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=C2=B7=20=EB=AA=A9=EB=A1=9D=20=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=88=A8=EA=B9=80=20(PLAN=20707=20=E2=91=A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 남김 1 = 분류1~5(구조물집계표 층 이름 = 마스터 템플릿 자료 · 코드 밖) - ui_template 네 파일 글만(한시 브레인 승인) · 키 · 동작 그대로 Co-Authored-By: Claude Opus 5.5 --- B08_Quantity/B08_Quantity_UI_Drawing.ts | 1 + M02_MasterTemplete/M02_Labor_Values.ts | 4 ++-- M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts | 9 +++++++-- M02_MasterTemplete/M02_MasterTemplete_Labor_Input.ts | 2 +- M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts | 10 ++++++++-- M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts | 4 ++-- ui_template/sheet/ui_template_sheet_text.ts | 2 +- ui_template/ui_template_item_picker_detail.ts | 3 ++- ui_template/ui_template_item_picker_edit.ts | 2 +- ui_template/ui_template_locale_m2.ts | 4 ++-- 10 files changed, 27 insertions(+), 14 deletions(-) diff --git a/B08_Quantity/B08_Quantity_UI_Drawing.ts b/B08_Quantity/B08_Quantity_UI_Drawing.ts index 725ff48fb..b05c33f84 100644 --- a/B08_Quantity/B08_Quantity_UI_Drawing.ts +++ b/B08_Quantity/B08_Quantity_UI_Drawing.ts @@ -143,6 +143,7 @@ function comboSection( onEdit: (kind) => openEdit(copy, name, kind, load), warnOnFail: () => false, // 못 읽으면 카드에 「없음」 labor: () => openEdit(copy, name, "inputs", load), // 일위대가 카드(161-1) [수정] = 넣을 값만 + picker: true, }); handles.push(cards); section.append(cards.root); diff --git a/M02_MasterTemplete/M02_Labor_Values.ts b/M02_MasterTemplete/M02_Labor_Values.ts index 5df45859a..ac2eb93f9 100644 --- a/M02_MasterTemplete/M02_Labor_Values.ts +++ b/M02_MasterTemplete/M02_Labor_Values.ts @@ -132,10 +132,10 @@ export interface InputsValueHandle { const VALUE_TEXT = { title: "넣을 값", missing: "빠진 로직 {value}", - edit: "넣을 값 수정", + edit: "옵션 고치기", none: "넣을 값이 없음 — 단가산출 로직에 입력이 없음", auto: "자동값", - unconfirmed: "확인 안 함", + unconfirmed: "값 확인 전", confirmed: "✓ 확인함", confirmBox: "확인", summary: "넣을 값 {value}", diff --git a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts index b8d8f49f9..478a2b0f7 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts @@ -58,6 +58,7 @@ export const PART_WORD: Record = { const TEXT = { drawingInfo: "도면 정보", edit: "수정", // 카드 셋 같은 글(40-2) — 무엇을 고치는지는 툴팁 + editOptions: "옵션 고치기", noNumber: "도번 없음", noDrawing: "도면 없음", editTip: "{value} 수정 — 전체 편집 화면", @@ -108,6 +109,9 @@ export interface ItemCardsOptions { /** 일위대가 카드(39-5 · 몸 = 일위대가 상세 카드 갈래 `Labor_Detail` · 43-4) — 도면 다음 · 지금 층에서 읽음 · * [일위대가 수정] = 이것(일위대가 상세) */ labor?: () => void; + /** 구조물 조합 고르기 창 · B08 도면 창(707) — 일위대가 카드 [수정] = 넣을 값만 → 글 「옵션 고치기」 · + * 카드 번호(SD · SU · SA) 숨김 */ + picker?: boolean; } /** 카드 스프레드시트를 다루는 손잡이 — 알약이 씀 */ @@ -191,6 +195,7 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { save: () => Promise, ) => { const no = createBadge("", "accent"); // 번호 = 배지 부품 + no.hidden = !!opts.picker; no.classList.add("m02-struct__no"); const name = el("span", { className: "m02-struct__title" }); const shell = cardShell({ title, body, sub: [no, name] }); @@ -204,7 +209,7 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { ); const help = helpButton(shell, title, CARD_HELP[kind]); // 제목 바로 옆(47-1) const edit = createButton({ - label: TEXT.edit, + label: kind === "labor" && opts.picker ? TEXT.editOptions : TEXT.edit, variant: "ghost", size: "sm", }); @@ -340,7 +345,7 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { const defaults: Record = { structure: TEXT.edit, area: TEXT.edit, - labor: TEXT.edit, + labor: opts.picker ? TEXT.editOptions : TEXT.edit, }; const root = el("div", { diff --git a/M02_MasterTemplete/M02_MasterTemplete_Labor_Input.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Input.ts index 4b50c22d6..30cb66a3e 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Labor_Input.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Input.ts @@ -56,7 +56,7 @@ export function openLaborInput(opt: LaborInputOptions): void { const draft: LaborValues = { ...kept }; const bad = new Set(); openModal({ - title: fill(tc("In_Title"), opt.title), + title: fill(tc("In_Title"), opt.title.replace(/^[A-Z]{2}\d{6}\s+/, "")), // 707 번호(GF …) 숨김 closeLabel: tc("In_Close"), dialogClass: "m02-modal m02-labin", mount: (body, close, head) => { diff --git a/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts index a92505ab3..2b675b661 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Pick.ts @@ -40,8 +40,10 @@ import { createText } from "@ui/ui_template_text"; export { withHopyo } from "./M02_MasterTemplete_Hopyo_Pick"; +/** 구분 보이는 글(707 낱말) — 값(저장 글)은 그대로 */ +const CLASS_TEXT: Record = { 실무자료: "실무 엑셀 일위대가" }; const opts = (values: string[]): { value: string; text: string }[] => - [L("M01_All"), ...values].map((v, i) => ({ value: i ? v : "", text: v })); + [L("M01_All"), ...values].map((v, i) => ({ value: i ? v : "", text: CLASS_TEXT[v] ?? v })); type Scope = Omit; /** 덧붙일 줄 하나 — kind = 종류 고르기 값 */ @@ -215,7 +217,11 @@ export function openLogicPicker( key: x.row.이름, tag: tc(x.kind), name: x.row.제목 || x.row.이름, - sub: [x.row.이름, `${x.row.구분 || tc("Lib_Unsorted")} ${x.row.상세구분 ?? ""}`.trim()] + // 707 번호(SC · SP 키) 숨김 — 제목이 없을 때만 이름 자리에 씀 + sub: [ + x.row.제목 ? "" : x.row.이름, + `${CLASS_TEXT[x.row.구분 ?? ""] ?? (x.row.구분 || tc("Lib_Unsorted"))} ${x.row.상세구분 ?? ""}`.trim(), + ] .filter(Boolean) .join(" · "), unit: x.row.단위 ?? "", diff --git a/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts b/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts index 17a29f798..1dfdbf22b 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Labor_Text.ts @@ -9,7 +9,7 @@ const TEXT = { Title: ["일위대가 조합", "Unit-price combination"], ReadOnly: ["읽기만 — 이 층은 고칠 수 없음", "Read only — this layer cannot be edited"], Sub: ["구분", "Category"], - Detail: ["상세구분", "Detail"], + Detail: ["세부 구분", "Detail"], All: ["전체", "All"], Empty: ["조합이 없음 — [새 조합]으로 만듦", "No combinations — press [New combination]"], New: ["새 조합", "New combination"], @@ -138,7 +138,7 @@ const TEXT = { Mark_Direct: ["직접계산", "Direct"], Mark_In: ["포함", "Included"], Mark_Out: ["미포함", "Excluded"], - In_Title: ["넣을 값 — {value}", "Inputs — {value}"], + In_Title: ["옵션 — {value}", "Inputs — {value}"], In_None: ["이 로직은 넣을 값이 없음", "This logic has no inputs"], In_Memo: ["메모", "Memo"], In_Layer: ["켜쌓기 적용율 (%)", "Layered-course rate (%)"], diff --git a/ui_template/sheet/ui_template_sheet_text.ts b/ui_template/sheet/ui_template_sheet_text.ts index 1c6966dea..3532bc060 100644 --- a/ui_template/sheet/ui_template_sheet_text.ts +++ b/ui_template/sheet/ui_template_sheet_text.ts @@ -11,7 +11,7 @@ const TEXT = { Col_New: ["새 열", "New column"], Row_Unit: ["단위", "Unit"], Row_Unit_Price: ["일위대가", "Unit price"], - Row_LaborSum: ["일위대가 합계", "Unit price total"], + Row_LaborSum: ["일위대가 금액", "Unit price total"], Row_Drawing: ["도면", "Drawing"], Row_Area: ["면적산출", "Area"], Add_Suffix: [" 추가", " +"], diff --git a/ui_template/ui_template_item_picker_detail.ts b/ui_template/ui_template_item_picker_detail.ts index d673624fb..ada74e3d8 100644 --- a/ui_template/ui_template_item_picker_detail.ts +++ b/ui_template/ui_template_item_picker_detail.ts @@ -75,7 +75,7 @@ export interface ItemDetail { } const TEXT = { - importEdit: "이 구조물로 가져와 고침", + importEdit: "이 구조물에서 고치기", noStructure: "구조물을 먼저 추가하면 이 항목을 그 구조물로 가져와 고칠 수 있음 — 지금은 원본을 보고 있음", notImported: "이 구조물에는 아직 안 가져옴 — 원본을 보고 있음", @@ -327,6 +327,7 @@ export function createItemDetail(opts: ItemDetailOptions): ItemDetail { onEdit: (kind) => void edit(kind), warnOnFail: () => false, labor: () => void edit("inputs"), + picker: true, }); cardsHost.replaceChildren(cards.root); } diff --git a/ui_template/ui_template_item_picker_edit.ts b/ui_template/ui_template_item_picker_edit.ts index c39f4385b..1d9fc1da5 100644 --- a/ui_template/ui_template_item_picker_edit.ts +++ b/ui_template/ui_template_item_picker_edit.ts @@ -39,7 +39,7 @@ const TEXT = { loadFailed: "복사본을 못 읽음 — {value}", discard: "저장 안 한 고침이 있음 — 버리고 돌아갈까요?", outOfRange: "범위 밖 값이 있어 저장하지 못함", - noAreaPill: "면적산출 알약 없음 — 이 복사본 일위대가에 단가산출 로직 · 자재가 없음", + noAreaPill: "면적산출 연결 칸 없음 — 이 복사본 일위대가에 단가산출 로직 · 자재가 없음", drawing: "도면", area: "면적산출", inputs: "넣을 값", diff --git a/ui_template/ui_template_locale_m2.ts b/ui_template/ui_template_locale_m2.ts index aa695e38e..3a5811a1d 100644 --- a/ui_template/ui_template_locale_m2.ts +++ b/ui_template/ui_template_locale_m2.ts @@ -88,9 +88,9 @@ export const ui_locales_m2 = { M02_PickerNone: ["없음", "None"], M02_PickerApply: ["적용", "Apply"], M02_PickerClear: ["해제", "Clear"], - M02_PickerCopy: ["개인용 복사", "Copy to personal"], + M02_PickerCopy: ["내 자료집에 복사", "Copy to personal"], M02_PickerManage: ["관리 화면 편집", "Edit in manager"], - M02_PickerCopied: ["개인용으로 복사했음", "Copied to personal"], + M02_PickerCopied: ["내 자료집에 복사했음", "Copied to personal"], M02_PickerCopyFailed: ["복사 못 함 — {value}", "Copy failed — {value}"], M02_TreeTitle: ["구조물 라이브러리", "Structure library"], M02_RootMine: ["내 것", "Mine"],