feat(M02): 359-4 실무자료 단추 명사형 · 별칭 장부 풀이 시험

- [맞음 · 별칭 모두 체크] → [맞음 · 별칭 일괄 체크] · 머리 글 [엑셀 보기]
- 시험: 별칭 장부 뜻 한 줄 · 좌측 단추 title · 장부 단추 명사형 · 갈래 글 · 옛 서술형 글 없음(내 몫 다섯 파일)
- 로케일 단추 글(M02_New · M02_Reload · M02_PracticeDrop 등)은 sub6 몫으로 손 안 댐

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
This commit is contained in:
2026-10-16 20:55:21 +09:00
co-authored by Claude Opus 5.5
parent dd49b554b4
commit 6312671ab8
3 changed files with 32 additions and 6 deletions
@@ -182,7 +182,7 @@ export function newest(): (key: number) => () => boolean {
};
}
/** [맞음 · 별칭 모두 체크] 대상 줄 */
/** [맞음 · 별칭 일괄 체크] 대상 줄 */
export const sureLines = (lines: HopyoLine[], d: CheckDraft): HopyoLine[] =>
lines.filter((l) => ["맞음", "별칭"].includes(l.맞춤.상태) && checkable(l, d));
@@ -484,7 +484,7 @@ export function buildHopyoCheck(opt: CheckOptions): HTMLElement {
const tools: HTMLElement[] = [];
if (opt.canWrite) {
const sure = sureLines(h.줄, d);
const all = createButton({ label: `맞음 · 별칭 모두 체크 (${sure.length})`, size: "sm" });
const all = createButton({ label: `맞음 · 별칭 일괄 체크 (${sure.length})`, size: "sm" });
all.disabled = !sure.length;
all.addEventListener("click", () => {
for (const l of sure) d.체크[l.차례] = true;
@@ -62,9 +62,9 @@ export interface HopyoSheetOptions {
canWrite: boolean;
/** 사전조합을 만들 층(없으면 `scope` · [로직 추가] = 문서 층) */
target?: HopyoScope;
/** 처음 고를 호표 번(호표 화면 [엑셀에서 보기]) */
/** 처음 고를 호표 번(확인 창 머리 [엑셀 보기]) */
호표?: number;
/** 처음 보일 단가산출 행(330-3 근거 [엑셀에서 보기]) */
/** 처음 보일 단가산출 행(330-3 근거 [엑셀 보기]) */
단산행?: number | [number, number];
/** 호표 하나를 만들었음 — [로직 추가] 참조 줄 */
onImport?: (got: HopyoBuilt, hopyo: HopyoBrief) => void;
+28 -2
View File
@@ -126,7 +126,7 @@ def test_확인_창_체크한_줄만_몸():
]
assert got["leftOut"] == {"확인 안 함": 3, "뺌": 1, "% 줄": 1}
assert got["checkable"] == [True, True, True, True, False, False, True, False]
assert got["sure"] == [1, 2] # [맞음 · 별칭 모두 체크]
assert got["sure"] == [1, 2] # [맞음 · 별칭 일괄 체크]
assert got["compare"] == "콘크리트공 0.1091 → 0.1091 ✓ · 굴착기 0.29 → 0.31 ≠"
assert got["compareMany"] == "굴착기 0.1594 → 0.0889 ≠" # 같은 장비 여러 줄 = 합쳐 한 줄
assert got["toTarget"] == [{"호표": 46, "배": 2.3}, {"자재": "MT1", "배": 1}]
@@ -283,7 +283,7 @@ def test_옛_즉시_확정과_바로_만들기_없음():
users = sorted(name for name, text in texts.items() if "buildHopyo(" in text)
assert users == ["Hopyo_Check", "Hopyo_Sheet"] # 확인 창 · 엑셀 보기 [저장] 물음 뒤
check = texts["Hopyo_Check"]
assert '"사전조합 생성"' in check and "맞음 · 별칭 모두 체크" in check
assert '"사전조합 생성"' in check and "맞음 · 별칭 일괄 체크" in check
assert "확인하고" not in check # 359-4 명사형
assert "showLoadingOverlay()" in check and "dropDraft(k)" in check
assert "m02-hopyo-check:" in check and "POLL_MS" in check
@@ -473,3 +473,29 @@ def test_확인_창_표_일위대가_상세_꼴_359():
code = draft.split("*/", 1)[1] # 머리 글 밖
for gone in ("document", "fetch(", "sessionStorage", "@ui/"):
assert gone not in code, gone
def test_명사형_단추와_별칭_장부_풀이_359():
"""359-4 — 별칭 장부 뜻 한 줄(좌측 단추 title · 화면 머리) · M02 실무자료 단추 = 명사형 ·
갈래 글 = 확인 창 드롭다운과 같음(저장 값 그대로)."""
ledger = _text("M02_MasterTemplete_Hopyo_Ledger.ts")
hint = "엑셀 품명 ↔ 우리 로직 · 자재 짝을 기억해 두었다가 같은 품명이 나오면 먼저 제안"
assert hint in ledger and "note(`${LEDGER_HINT}" in ledger
side = _text("M02_MasterTemplete_Hopyo_Side.ts")
assert "title: LEDGER_HINT" in side
for label in ('"변경 취소"', '"로직 추가"', '"내 층 복사"', '"삭제"'):
assert f"label: {label}" in ledger, label
assert '"우리에 없음": "로직없음"' in ledger and '"안 씀": "사용안함"' in ledger
mine = ("Hopyo_Side", "Hopyo_Sheet", "Hopyo_Check", "Hopyo_CheckRows", "Hopyo_Ledger")
every = "\n".join(_text(f"M02_MasterTemplete_{n}.ts") for n in mine)
for gone in (
"고친 것 버림",
"로직 더함",
"내 층으로 고쳐 씀",
"확인하고 사전조합 만들기",
"엑셀 올리기",
"엑셀에서 보기",
"모두 체크 (",
'label: "지우기"',
):
assert gone not in every, gone