From 0576420d824a429e492e2e7a09cfdbbc3b7fdd88 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 16 Oct 2026 21:31:24 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix(M02):=20=EB=A1=9C=EC=BC=80=EC=9D=BC=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EA=B8=80=20=EB=AA=85=EC=82=AC=ED=98=95=20?= =?UTF-8?q?=E2=80=94=20=EC=8B=A0=EA=B7=9C=20=C2=B7=20=EB=B3=B5=EC=A0=9C=20?= =?UTF-8?q?=C2=B7=20=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8=20=C2=B7=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=82=AD=EC=A0=9C=20=C2=B7=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=C2=B7=20=ED=9A=8C=EC=82=AC=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=C2=B7=20=EA=B0=9C=EC=9D=B8=EC=9A=A9=20=EB=B3=B5=EC=82=AC=20?= =?UTF-8?q?=C2=B7=20=EA=B4=80=EB=A6=AC=20=ED=99=94=EB=A9=B4=20=ED=8E=B8?= =?UTF-8?q?=EC=A7=91=20(235-27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL --- .../M02_MasterTemplete_DetailNav.ts | 2 +- .../M02_MasterTemplete_Layer.ts | 4 ++-- .../M02_MasterTemplete_Practice.ts | 2 +- .../M02_MasterTemplete_UI_Main.ts | 2 +- .../M02_MasterTemplete_UI_Page.ts | 2 +- resources/tester/test_m02_detail_nav.py | 2 +- .../tester/ui_checks/43-1_수량산출_모달.js | 2 +- .../tester/ui_checks/44-6_일위대가_표.js | 4 ++-- .../tester/ui_checks/52-10_노면공_기타.js | 2 +- .../tester/ui_checks/52-5_횡단수로_개거.js | 2 +- ui_template/ui_template_locale_m2.ts | 20 +++++++++---------- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts b/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts index 39ea53ed2..568cf5a4e 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_DetailNav.ts @@ -1,7 +1,7 @@ /* ============================================================================= * M02_MasterTemplete_DetailNav.ts * 상세 머리 제목과 [?] 사이 [도면][일위대가][면적산출] 묶음(105-4) — 같은 열의 다른 상세로 옮겨 감. - * 지금 상세 단추 = 숨김(113-2) · 단추 크기 = 머리 [다시 열기]와 같은 보통 · 그 열 문서가 없으면 그 단추 꺼짐(번호 목록에 번호 없음). + * 지금 상세 단추 = 숨김(113-2) · 단추 크기 = 머리 [새로고침]와 같은 보통 · 그 열 문서가 없으면 그 단추 꺼짐(번호 목록에 번호 없음). * 보임 조건 · 옮겨 가기(confirmLeave → open)는 부른 쪽(`UI_Main`) 몫. * ========================================================================== */ diff --git a/M02_MasterTemplete/M02_MasterTemplete_Layer.ts b/M02_MasterTemplete/M02_MasterTemplete_Layer.ts index 77736b7d4..ce046f785 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Layer.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Layer.ts @@ -3,7 +3,7 @@ * M02 한 화면의 뿌리 셋(마스터 · 회사 · 개인 · PLAN 27-1) — 진입 해시 * `#/m02-master-template?open=구조물조합|옵션|도면&root=master|company|personal&owner=…&company=…&pre=…` * (옛 `?layer=` 도 root 로 읽음 · `pre` = 일위대가 사전조합 층 · 134-3) · 고칠 권한(`accessFor` — 서버 `M02_Layer_Access` 와 짝 · 27-1c) · - * 회사 없음 안내 · 회사용 읽기만일 때 [개인용으로 복사] 막대. + * 회사 없음 안내 · 회사용 읽기만일 때 [개인용 복사] 막대. * ========================================================================== */ import { ROUTES } from "@config/config_frontend"; @@ -201,7 +201,7 @@ export interface ReadOnlyBar { setColumn: (column: string | null) => void; } -/** 회사용을 읽기만 볼 때 — 안내 + [개인용으로 복사](고른 열 하나를 내 개인 층으로) */ +/** 회사용을 읽기만 볼 때 — 안내 + [개인용 복사](고른 열 하나를 내 개인 층으로) */ export function buildReadOnlyBar(user: SessionUser | null): ReadOnlyBar { let column: string | null = null; const copy = createButton({ label: L("M02_CopyToPersonal"), variant: "filled", size: "sm" }); diff --git a/M02_MasterTemplete/M02_MasterTemplete_Practice.ts b/M02_MasterTemplete/M02_MasterTemplete_Practice.ts index f3b72ceac..0649c592c 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Practice.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Practice.ts @@ -2,7 +2,7 @@ * M02_MasterTemplete_Practice.ts * 좌측 「실무문서」 컨테이너(구조물 조합 밖 · 도면 양식 아래 · 마스터 층 · 시스템 관리자만 · PLAN 39-2) — * 줄 하나를 누르면 메인 칸에 옛 마스터 일위대가 조합(`일위대가조합.json` 통째) 목록 · 상세(읽기만) · - * [통째 지우기](물음 두 번 → `DELETE /api/m02/practice` · 서버도 시스템 관리자 · 쓰는 곳 0 확인). + * [전체 삭제](물음 두 번 → `DELETE /api/m02/practice` · 서버도 시스템 관리자 · 쓰는 곳 0 확인). * 읽기 = 마스터 조합 길(`Labor_Api`) · 복사 원본 고르기는 목록 화면(ItemList)의 실무문서 탭 몫. * ========================================================================== */ diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts index b4c77c65f..ed0af9ff2 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts @@ -255,7 +255,7 @@ export function createMain( nav.update(back.hidden ? null : sel); // 보임 조건 = 뒤로 단추와 같음 const kind = sel && sel.kind in HELP_TITLE ? (sel.kind as keyof typeof HELP_TITLE) : null; const help = kind && helpParts(HELP_TITLE[kind], detailHelp(kind)); // 열 때마다 새로 — 상자는 닫힘 - help?.button.classList.remove("ui-btn--sm"); // 머리 [?] = [다시 열기]와 같은 보통 크기(113-2 · 카드 [?]는 작게) + help?.button.classList.remove("ui-btn--sm"); // 머리 [?] = [새로고침]와 같은 보통 크기(113-2 · 카드 [?]는 작게) helpSlot.replaceChildren(...(help ? [help.button, help.box] : [])); }; diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts index c44e253e8..2f8f094bb 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Page.ts @@ -72,7 +72,7 @@ export async function renderM02MasterTemplate(root: HTMLElement): Promise str: def test_단추_셋_묶음(run): assert run["labels"] == ["도면", "일위대가", "면적산출"] assert "ui-btn-group" in run["className"] - assert run["sizes"] == [None, None, None] # 113-2 — [다시 열기]와 같은 보통 크기 + assert run["sizes"] == [None, None, None] # 113-2 — [새로고침]와 같은 보통 크기 def test_지금_것_숨김_없는_문서_꺼짐(run): diff --git a/resources/tester/ui_checks/43-1_수량산출_모달.js b/resources/tester/ui_checks/43-1_수량산출_모달.js index ffab377bb..283aa48ba 100644 --- a/resources/tester/ui_checks/43-1_수량산출_모달.js +++ b/resources/tester/ui_checks/43-1_수량산출_모달.js @@ -124,7 +124,7 @@ btn(im, "취소")?.click(); await W(300); // ⑦ 버림 - btn($(".m02-main__head"), "다시 열기").click(); + btn($(".m02-main__head"), "새로고침").click(); await W(600); btn($(".ui-confirm"), "확인")?.click(); await W(4500); diff --git a/resources/tester/ui_checks/44-6_일위대가_표.js b/resources/tester/ui_checks/44-6_일위대가_표.js index 030a8102c..acabcb4b5 100644 --- a/resources/tester/ui_checks/44-6_일위대가_표.js +++ b/resources/tester/ui_checks/44-6_일위대가_표.js @@ -1,7 +1,7 @@ /* 44-6 일위대가 단가산출 로직 표 — `orca eval --expression "$(cat 이 파일)"` 한 번에 돎 · JSON 돌려줌. * * 시작 화면: M02 마스터 템플릿(시스템 관리자) · 좌측 일위대가 줄 「SU-000003」 이 보이는 상태 · - * 첫 로직 줄(GF000219 돌쌓기)에 고르기 입력이 있음 · 저장은 안 함(끝에 [다시 열기] → 확인 → 버림). + * 첫 로직 줄(GF000219 돌쌓기)에 고르기 입력이 있음 · 저장은 안 함(끝에 [새로고침] → 확인 → 버림). * 기대 수치: * heads[2] = "별칭" · alias.inputs = 줄 수 · foot.totalBorder ≥ 1.5(2px · 화면 배율) · foot.totalBg ≠ 다른 금액 칸 배경 * opt.row = true · opt.colspan = 3(구분 ~ 별칭 · 나머지 칸은 위 줄 rowspan 2 · 113-1) · opt.nowrap = "nowrap" · opt.ellipsis = "ellipsis" · @@ -87,7 +87,7 @@ await W(3500); out.alias.kept = $("[data-labor-alias]", first())?.value; // 버림 - btn($(".m02-main__head"), "다시 열기").click(); + btn($(".m02-main__head"), "새로고침").click(); await W(600); btn($(".ui-confirm"), "확인")?.click(); await W(4500); diff --git a/resources/tester/ui_checks/52-10_노면공_기타.js b/resources/tester/ui_checks/52-10_노면공_기타.js index 7bc7c221f..4484f84fb 100644 --- a/resources/tester/ui_checks/52-10_노면공_기타.js +++ b/resources/tester/ui_checks/52-10_노면공_기타.js @@ -115,7 +115,7 @@ await until(() => document.querySelector(".ui-item-picker")); await w(600); const modal = document.querySelector(".ui-item-picker"); - const ctl = ["닫기", "개인용으로 복사", "관리 화면에서 고치기", "해제", "적용"]; + const ctl = ["닫기", "개인용 복사", "관리 화면 편집", "해제", "적용"]; const leaf = [...modal.querySelectorAll("button")].find((b) => { const t = b.textContent.trim(); return t && !/^[▸▾]/.test(t) && !ctl.includes(t); diff --git a/resources/tester/ui_checks/52-5_횡단수로_개거.js b/resources/tester/ui_checks/52-5_횡단수로_개거.js index 8b7b11211..f7f3f478c 100644 --- a/resources/tester/ui_checks/52-5_횡단수로_개거.js +++ b/resources/tester/ui_checks/52-5_횡단수로_개거.js @@ -68,7 +68,7 @@ await w(600); const modal = document.querySelector(".ui-item-picker"); // 끝 항목 = ▸ · ▾ 로 안 시작하고 모달 조작 단추가 아닌 첫 단추 - const ctl = ["닫기", "개인용으로 복사", "관리 화면에서 고치기", "해제", "적용"]; + const ctl = ["닫기", "개인용 복사", "관리 화면 편집", "해제", "적용"]; const leaf = [...modal.querySelectorAll("button")].find((b) => { const t = b.textContent.trim(); return t && !/^[▸▾]/.test(t) && !ctl.includes(t); diff --git a/ui_template/ui_template_locale_m2.ts b/ui_template/ui_template_locale_m2.ts index c0af92511..aa695e38e 100644 --- a/ui_template/ui_template_locale_m2.ts +++ b/ui_template/ui_template_locale_m2.ts @@ -11,11 +11,11 @@ export const ui_locales_m2 = { M02_KindTable: ["구조물 조합", "Structure combos"], M02_KindDrawing: ["도면 양식", "Drawing templates"], M02_NoTemplates: ["양식 없음", "None"], - M02_New: ["새로", "New"], - M02_Copy: ["본떠 만들기", "Copy as new"], + M02_New: ["신규", "New"], + M02_Copy: ["복제", "Duplicate"], M02_Delete: ["지우기", "Delete"], M02_NewTitle: ["새 양식", "New template"], - M02_CopyTitle: ["본떠 만들기", "Copy as new"], + M02_CopyTitle: ["복제", "Duplicate"], M02_Kind: ["종류", "Kind"], M02_Name: ["이름", "Name"], M02_Create: ["만들기", "Create"], @@ -31,7 +31,7 @@ export const ui_locales_m2 = { M02_Created: ["만들었음", "Created"], M02_Saved: ["저장했음", "Saved"], M02_Save: ["저장", "Save"], - M02_Reload: ["다시 열기", "Reopen"], + M02_Reload: ["새로고침", "Refresh"], M02_PickTemplate: ["왼쪽에서 양식을 고를 것", "Pick a template on the left"], M02_ReadOnlyLayer: ["이 층은 여기서 고치지 못함", "This layer is read-only here"], @@ -61,7 +61,7 @@ export const ui_locales_m2 = { "회사용은 복사해서 씀 — 고치려면 고른 열을 개인용으로 복사", "Company templates are read-only — copy the selected column to your own to edit", ], - M02_CopyToPersonal: ["개인용으로 복사", "Copy to personal"], + M02_CopyToPersonal: ["개인용 복사", "Copy to personal"], M02_CopyPickFirst: ["복사할 열을 구조물 조합에서 먼저 고름", "Pick a column in the table first"], M02_CopyDone: ["개인용으로 복사함 — 「개인」 뿌리에서 고침", "Copied — edit it in your own"], M02_CopyFailed: ["복사 안 됨 — {value}", "Copy failed — {value}"], @@ -69,7 +69,7 @@ export const ui_locales_m2 = { "회사부터 등록해야 구조물 조합을 만들 수 있음", "Register a company first to manage structure templates", ], - M02_NeedCompanyGo: ["회사 등록하러 가기", "Go to company registration"], + M02_NeedCompanyGo: ["회사 등록", "Company registration"], M02_PickerTitle: ["구조물 조합 선택", "Select structure combo"], M02_PickerSearch: ["항목 찾기", "Search items"], M02_PickerSystem: ["마스터", "Master"], @@ -88,8 +88,8 @@ export const ui_locales_m2 = { M02_PickerNone: ["없음", "None"], M02_PickerApply: ["적용", "Apply"], M02_PickerClear: ["해제", "Clear"], - M02_PickerCopy: ["개인용으로 복사", "Copy to personal"], - M02_PickerManage: ["관리 화면에서 고치기", "Edit in manager"], + M02_PickerCopy: ["개인용 복사", "Copy to personal"], + M02_PickerManage: ["관리 화면 편집", "Edit in manager"], M02_PickerCopied: ["개인용으로 복사했음", "Copied to personal"], M02_PickerCopyFailed: ["복사 못 함 — {value}", "Copy failed — {value}"], M02_TreeTitle: ["구조물 라이브러리", "Structure library"], @@ -176,8 +176,8 @@ export const ui_locales_m2 = { M02_PracticeOrder: ["차례", "No."], M02_PracticeMemo: ["메모", "Memo"], M02_PracticeNoLogic: ["단가산출 로직 없음", "No logics"], - M02_PracticeBack: ["목록으로", "Back to list"], - M02_PracticeDrop: ["통째 지우기", "Delete all"], + M02_PracticeBack: ["목록", "List"], + M02_PracticeDrop: ["전체 삭제", "Delete all"], M02_PracticeDropAsk: ["실무문서 {n}개를 모두 지울까요?", "Delete all {n} practice documents?"], M02_PracticeDropAsk2: [ "되돌릴 수 없음 — 정말 통째로 지울까요?", From 47b28e4ed1c0bb44e1f504c25228a58de331ac11 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 16 Oct 2026 21:46:33 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix(=EC=8B=9C=ED=97=98):=20=EC=83=88=20Pivo?= =?UTF-8?q?t=20=ED=8C=8C=EC=9D=BC=EC=9D=84=20=EA=B0=80=EC=A7=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EB=AA=A9=EB=A1=9D=20=EB=8F=84=EC=9A=B0?= =?UTF-8?q?=EB=AF=B8=EA=B0=80=20=EC=8B=A3=EA=B2=8C=20(355-2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_013QyNXY2TUKXCFMwAca2APG --- resources/tester/helper_234_1_structure_station.cjs | 5 ++++- resources/tester/helper_344_2_route_pairs.cjs | 5 ++++- resources/tester/helper_349_0v_span.cjs | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/resources/tester/helper_234_1_structure_station.cjs b/resources/tester/helper_234_1_structure_station.cjs index f7ba635ec..1ee3da8d5 100644 --- a/resources/tester/helper_234_1_structure_station.cjs +++ b/resources/tester/helper_234_1_structure_station.cjs @@ -159,7 +159,10 @@ Promise.resolve( out.second = { count: snap.snapOldStations(again), toasts: [...toasts] }; // ④ 계획고 편집 따라감 — 한꺼번에 여럿 옮김(사라진 둘 · 새 둘) - const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts"); + const pivot = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Pivot.ts"); + const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts", { + "./B05_Profile_UI_Profile_Pivot": pivot, + }); const gone = [ { id: "pipe-80.17", chainage_m: 80.17 }, { id: "pipe-263.31", chainage_m: 263.31 }, diff --git a/resources/tester/helper_344_2_route_pairs.cjs b/resources/tester/helper_344_2_route_pairs.cjs index b00f2b115..bad98ffc5 100644 --- a/resources/tester/helper_344_2_route_pairs.cjs +++ b/resources/tester/helper_344_2_route_pairs.cjs @@ -20,7 +20,10 @@ function loadTs(file, stubs = {}) { return box.exports; } -const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts"); +const pivot = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Pivot.ts"); +const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts", { + "./B05_Profile_UI_Profile_Pivot": pivot, +}); const ground = loadTs("B05_Profile/logic/B05_Profile_Grade_Ground.ts", { "./B05_Profile_UI_Profile_Alignment": alignment, }); diff --git a/resources/tester/helper_349_0v_span.cjs b/resources/tester/helper_349_0v_span.cjs index ab579bdd2..0ddfe65ed 100644 --- a/resources/tester/helper_349_0v_span.cjs +++ b/resources/tester/helper_349_0v_span.cjs @@ -21,7 +21,10 @@ function loadTs(file, stubs = {}) { } const curve = loadTs("B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts"); -const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts"); +const pivot = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Pivot.ts"); +const alignment = loadTs("B05_Profile/logic/B05_Profile_UI_Profile_Alignment.ts", { + "./B05_Profile_UI_Profile_Pivot": pivot, +}); const carry = loadTs("B05_Profile/logic/B05_Profile_Grade_Carry.ts", { "./B05_Profile_UI_Profile_Alignment": alignment, });