From 95d5876495470fab90fa5d602dfe7eab316280f8 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 4 Oct 2026 20:44:09 +0900 Subject: [PATCH] =?UTF-8?q?feat(M02):=20=EB=A9=B4=EC=A0=81=EC=82=B0?= =?UTF-8?q?=EC=B6=9C=20=EC=98=A4=EB=A5=B8=EC=AA=BD=20=ED=8C=A8=EB=84=90=20?= =?UTF-8?q?=E2=80=94=20=EC=A7=80=EA=B8=88=20=EC=8B=9C=ED=8A=B8=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=B9=B8=20=EC=A3=BC=EC=86=8C=EB=A5=BC=20=EC=9D=BC?= =?UTF-8?q?=EC=9C=84=EB=8C=80=EA=B0=80=20=EB=B3=B4=EA=B8=B0=EC=97=90=20?= =?UTF-8?q?=EB=84=98=EA=B9=80=20=C2=B7=20=EC=A0=80=EC=9E=A5=20=EC=A0=84=20?= =?UTF-8?q?=EC=9E=87=EA=B8=B0=EB=8F=84=20=E3=80=8C=EC=88=98=EB=9F=89=20C3?= =?UTF-8?q?=20=3D=2012.5=E3=80=8D=20(PLAN=2039-4=20D6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01W4uKaV4ZBhsJN4GHG7yRj4 --- M02_MasterTemplete/M02_MasterTemplete_AreaPanel.ts | 13 +++++++++++-- resources/tester/test_m02_area_panel.py | 3 ++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_AreaPanel.ts b/M02_MasterTemplete/M02_MasterTemplete_AreaPanel.ts index 89e6ff7ef..39c55433d 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_AreaPanel.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_AreaPanel.ts @@ -4,7 +4,7 @@ * 몸 = 일위대가 보기 갈래(`Labor_View` · 고치기 없음) · 틀 = 공용 사이드바 카드 · 접기 손잡이 · 폭 손잡이 * (폭 · 접힘 기억은 옛 조합 패널 키 그대로). * · 줄 누름 = 칸 지정 모달(`AreaLink` · 그 줄 알약 키를 면적 칸에 잇기 · 풀기) - * · 시트 칸 값이 바뀌면 `refresh` — 받은 기준에 바로 곱함(서버 안 부름 · `Labor_View.setQty`) + * · 시트 칸 값 · 연결이 바뀌면 `refresh` — 받은 기준에 바로 곱함 · 칸 주소도 넘김(서버 안 부름 · `Labor_View.setQty`) * ========================================================================== */ import { el, showToast } from "@ui/ui_template_elements"; @@ -57,6 +57,13 @@ function quantities(sheet: SpreadsheetHandle | null): Record { return out; } +/** 시트 연결 → `{알약 키: 칸 주소}` — 저장 전 잇기 · 풀기도(줄 아래 「수량 B6 = …」) */ +function cellsOf(sheet: SpreadsheetHandle | null): Record { + const out: Record = {}; + for (const s of sheet?.getDoc().시트 ?? []) for (const l of s.연결 ?? []) out[l.키] = l.칸; + return out; +} + export function buildAreaPanel(opts: AreaPanelOptions): AreaPanel { const openLink = (row: LaborViewRow): void => { const sheet = opts.sheet(); @@ -112,10 +119,12 @@ export function buildAreaPanel(opts: AreaPanelOptions): AreaPanel { setCollapsed(readStateRaw("m02-combo-panel-collapsed") === "true"); // 처음 = 저장 안 한 시트 칸 값으로 셈(서버 calc 한 번) + const refresh = (): void => view.setQty(quantities(opts.sheet()), cellsOf(opts.sheet())); void view.show(opts.layer, opts.column, quantities(opts.sheet())); + refresh(); // 칸 주소는 지금 시트 것 — 보기가 저장본 대신 씀 return { root, - refresh: () => view.setQty(quantities(opts.sheet())), + refresh, destroy: () => { view.destroy(); resizer.dispose(); diff --git a/resources/tester/test_m02_area_panel.py b/resources/tester/test_m02_area_panel.py index 61276d60d..2b8e56228 100644 --- a/resources/tester/test_m02_area_panel.py +++ b/resources/tester/test_m02_area_panel.py @@ -33,7 +33,8 @@ def test_패널_몸은_보기_갈래_줄_누름은_칸_지정(): panel = _text("M02_MasterTemplete_AreaPanel.ts") assert "createLaborView(openLink)" in panel assert "void view.show(opts.layer, opts.column, quantities(opts.sheet()));" in panel - assert "refresh: () => view.setQty(quantities(opts.sheet()))," in panel + assert "view.setQty(quantities(opts.sheet()), cellsOf(opts.sheet()))" in panel + assert panel.index("void view.show(") < panel.index("refresh(); // 칸 주소") assert "openAreaLink({" in panel and "if (!row.pill) return showToast(TEXT.noPill" in panel for gone in ("fetchUsableCombos", "setColumnCombo", "branchCombo"): assert gone not in panel