From ed3f454c69584610b568ab195bd73c457bcab2fc Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 17 Oct 2026 17:22:46 +0900 Subject: [PATCH] =?UTF-8?q?fix(B05=20=EB=B0=B0=EC=88=98=EC=9C=A0=EC=97=AD)?= =?UTF-8?q?:=20392-1=20=EB=B0=B0=EC=88=98=EC=9C=A0=EC=97=AD=20=ED=8C=90=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EB=8B=AB=ED=9E=98=20=E2=80=94=20=EA=B8=B0?= =?UTF-8?q?=EC=96=B5=20=EC=97=86=EC=9D=8C=20=3D=20=EB=8B=AB=ED=9E=98=20?= =?UTF-8?q?=C2=B7=20=EC=98=9B=20"false"=20=EA=B8=B0=EC=96=B5=20=ED=95=9C?= =?UTF-8?q?=20=EB=B2=88=20=EB=B2=84=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - b_page_state drainage-collapsed version 2(옛 열쇠 · 옛 legacy 열쇠 안 읽음) · 전역 열쇠라 B06 도 같이 - 판은 사용자가 펼친 기억("false")만 펼침 - 시험 test_392_1_drainage_default_closed Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Se7ytqbohmBQnfYpwYFnYf --- A00_Common/b_page_state.ts | 7 +-- B05_Profile/B05_Profile_UI_Drainage_Panel.ts | 5 +- .../test_392_1_drainage_default_closed.py | 50 +++++++++++++++++++ 3 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 resources/tester/test_392_1_drainage_default_closed.py diff --git a/A00_Common/b_page_state.ts b/A00_Common/b_page_state.ts index 60ee6b9dd..5aea8666a 100644 --- a/A00_Common/b_page_state.ts +++ b/A00_Common/b_page_state.ts @@ -51,11 +51,8 @@ export const STATE_REGISTRY = { legacy: () => "b05-route-profile-collapsed", }, "profile-height": { bucket: "pref", scope: "global", legacy: () => "b05-route-profile-height" }, - "drainage-collapsed": { - bucket: "pref", - scope: "global", - legacy: () => "b05-route-drainage-collapsed", - }, + /** 배수유역 판 접힘 — 기억 없음 = 닫힘(392-1 · 옛 "false" 기억 버림). */ + "drainage-collapsed": { bucket: "pref", scope: "global", version: 2 }, "drainage-width": { bucket: "pref", scope: "global", legacy: () => "b05-route-drainage-width" }, /** M02 면적산출 오른쪽 일위대가 패널(`AreaPanel`) — 접힘 · 폭(옛 조합 패널 키 그대로) */ "m02-combo-panel-collapsed": { bucket: "pref", scope: "global" }, diff --git a/B05_Profile/B05_Profile_UI_Drainage_Panel.ts b/B05_Profile/B05_Profile_UI_Drainage_Panel.ts index ab255052d..a559d0664 100644 --- a/B05_Profile/B05_Profile_UI_Drainage_Panel.ts +++ b/B05_Profile/B05_Profile_UI_Drainage_Panel.ts @@ -556,9 +556,8 @@ export function createDrainagePanel(callbacks: DrainagePanelCallbacks = {}): Dra panelHandle.root.addEventListener("click", () => setCollapsed(!root.classList.contains("is-collapsed")), ); - // 상세 배수유역 정보는 페이지에 들어오면 바로 보여야 한다 — 저장값이 없으면 펼침이 기본이다 - // (같은 페이지의 하단 종단 패널과 같은 규칙). - setCollapsed(readStateRaw("drainage-collapsed") === "true"); + // 저장값이 없으면 닫힘이 기본(392-1) — 사용자가 펼친 기억("false")만 펼친다. + setCollapsed(readStateRaw("drainage-collapsed") !== "false"); return { root, diff --git a/resources/tester/test_392_1_drainage_default_closed.py b/resources/tester/test_392_1_drainage_default_closed.py new file mode 100644 index 000000000..3f2f73be9 --- /dev/null +++ b/resources/tester/test_392_1_drainage_default_closed.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +"""배수유역 판 기본 닫힘(계획서 392-1). + +진짜 `b_page_state.ts` 를 가짜 저장소 위에서 돌림 — 옛 기억("false" · 옛 키 · 판 없는 키)은 +버리고 기억 없음 = null. 판은 "false"(사용자가 펼친 기억)만 펼침 · B06 도 같은 전역 키. +""" + +import json +import os +import subprocess + +HERE = os.path.dirname(os.path.abspath(__file__)) +ROOT = os.path.dirname(os.path.dirname(HERE)) + +NODE = r""" +const path = require("path"), fs = require("fs"); +const ts = require(path.join(process.argv[1], "config", "node_modules", "typescript")); +const src = fs.readFileSync(path.join(process.argv[1], "A00_Common", "b_page_state.ts"), "utf8"); +const js = ts.transpileModule(src, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 } }).outputText; +const mk = (init) => { const m = new Map(Object.entries(init)); return { + getItem: (k) => (m.has(k) ? m.get(k) : null), setItem: (k, v) => m.set(k, String(v)), + removeItem: (k) => m.delete(k), key: (i) => [...m.keys()][i] ?? null, get length() { return m.size; }, _m: m }; }; +const local = mk({ "aislo:pref:drainage-collapsed": "false", "b05-route-drainage-collapsed": "false" }); +const window = { localStorage: local, sessionStorage: mk({}) }; +const exports = {}; +new Function("exports", "window", "require", js)(exports, window, () => ({})); +const out = { key: exports.stateKey("drainage-collapsed"), old: exports.readStateRaw("drainage-collapsed") }; +exports.writeStateRaw("drainage-collapsed", "false"); +out.kept = exports.readStateRaw("drainage-collapsed"); +process.stdout.write(JSON.stringify(out)); +""" + + +def test_old_memory_dropped_and_new_kept(): + res = subprocess.run( + ["node", "-e", NODE, ROOT], capture_output=True, text=True, encoding="utf-8", check=True + ) + out = json.loads(res.stdout) + assert out["key"] == "aislo:pref:drainage-collapsed-v2" + assert out["old"] is None # 옛 "false" 두 키 모두 안 읽음 + assert out["kept"] == "false" # 새 기억은 그대로 + + +def test_panel_default_closed(): + with open( + os.path.join(ROOT, "B05_Profile", "B05_Profile_UI_Drainage_Panel.ts"), encoding="utf-8" + ) as f: + src = f.read() + # 기억 없음(null) = 닫힘 · "false" 만 펼침 + assert 'setCollapsed(readStateRaw("drainage-collapsed") !== "false")' in src