feat(M02 고르기 창 낱말): ★ 12 → 1 — 옵션 고치기 · 이 구조물에서 고치기 · 내 자료집에 복사 · 일위대가 금액 · 값 확인 전 · 면적산출 연결 칸 · 세부 구분 · 실무 엑셀 일위대가 · 옵션 머리 · 카드 · 목록 번호 숨김 (PLAN 707 ③)

- 남김 1 = 분류1~5(구조물집계표 층 이름 = 마스터 템플릿 자료 · 코드 밖)
- ui_template 네 파일 글만(한시 브레인 승인) · 키 · 동작 그대로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-31 16:24:12 +09:00
co-authored by Claude Opus 5.5
parent a5f87812e6
commit 6aa06d618b
10 changed files with 27 additions and 14 deletions
+1
View File
@@ -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);
+2 -2
View File
@@ -132,10 +132,10 @@ export interface InputsValueHandle {
const VALUE_TEXT = {
title: "넣을 값",
missing: "빠진 로직 {value}",
edit: "넣을 값 수정",
edit: "옵션 고치기",
none: "넣을 값이 없음 — 단가산출 로직에 입력이 없음",
auto: "자동값",
unconfirmed: "확인 안 함",
unconfirmed: "값 확인 전",
confirmed: "✓ 확인함",
confirmBox: "확인",
summary: "넣을 값 {value}",
@@ -58,6 +58,7 @@ export const PART_WORD: Record<CardKind, string> = {
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<void>,
) => {
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<CardKind, string> = {
structure: TEXT.edit,
area: TEXT.edit,
labor: TEXT.edit,
labor: opts.picker ? TEXT.editOptions : TEXT.edit,
};
const root = el("div", {
@@ -56,7 +56,7 @@ export function openLaborInput(opt: LaborInputOptions): void {
const draft: LaborValues = { ...kept };
const bad = new Set<string>();
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) => {
@@ -40,8 +40,10 @@ import { createText } from "@ui/ui_template_text";
export { withHopyo } from "./M02_MasterTemplete_Hopyo_Pick";
/** 구분 보이는 글(707 낱말) — 값(저장 글)은 그대로 */
const CLASS_TEXT: Record<string, string> = { 실무자료: "실무 엑셀 일위대가" };
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<LaborRef, "키">;
/** 덧붙일 줄 하나 — 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.단위 ?? "",
@@ -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 (%)"],
+1 -1
View File
@@ -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: [" 추가", " +"],
@@ -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);
}
+1 -1
View File
@@ -39,7 +39,7 @@ const TEXT = {
loadFailed: "복사본을 못 읽음 — {value}",
discard: "저장 안 한 고침이 있음 — 버리고 돌아갈까요?",
outOfRange: "범위 밖 값이 있어 저장하지 못함",
noAreaPill: "면적산출 알약 없음 — 이 복사본 일위대가에 단가산출 로직 · 자재가 없음",
noAreaPill: "면적산출 연결 칸 없음 — 이 복사본 일위대가에 단가산출 로직 · 자재가 없음",
drawing: "도면",
area: "면적산출",
inputs: "넣을 값",
+2 -2
View File
@@ -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"],