diff --git a/M02_MasterTemplete/M02_MasterTemplete_Structure.ts b/M02_MasterTemplete/M02_MasterTemplete_Structure.ts index baf34db0..52ae9568 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Structure.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_Structure.ts @@ -176,18 +176,32 @@ export interface StructureColumn { /** 구조물 열 = 꼴=수 — NO · 측점 · 비고 같은 글 열은 도면 · 면적산출 · 재료산출 · 번호가 없음(서버와 같은 규칙) */ export const isStructureColumn = (col: StructureColumn): boolean => col.꼴 === "수"; -/** 관리 화면 「구조물 조합」에서 숨기는 것(PLAN 26-7b) — 비고 열 · 전구간 줄(본문 줄) · 합계 줄. - * 양식 파일은 그대로 — 보일 문서에서만 빼고 [저장] 때 저장본 것을 다시 끼움(`comboMerge`). */ -const HIDDEN_COLUMNS = ["memo"]; -type ComboDoc = { 열: StructureColumn[]; 줄?: unknown[]; 합계줄?: unknown[] }; +/** 관리 화면 「구조물 조합」에서 숨기는 것(PLAN 26-7b · 30-7) — NO · 측점 · 비고 열 · 전구간 줄(본문 줄) · + * 합계 줄. 양식 파일은 그대로 — 보일 문서에서만 빼고 [저장] 때 저장본 것을 다시 끼움(`comboMerge`) · + * 틀고정 열 수는 숨긴 열만큼 줄여 보이고 [저장] 때 저장본 값으로 되돌림. */ +const HIDDEN_COLUMNS = ["no", "sta", "memo"]; +type ComboView = { 틀고정?: { 열?: number } } & Record; +type ComboDoc = { 열: StructureColumn[]; 줄?: unknown[]; 합계줄?: unknown[]; 보기?: ComboView }; export function comboView(doc: T): T { const d = doc as unknown as ComboDoc; - const 열 = (d.열 ?? []).filter((c) => !HIDDEN_COLUMNS.includes(c.id)); - return { ...d, 열, 줄: [], 합계줄: [] } as unknown as T; + const all = d.열 ?? []; + const 열 = all.filter((c) => !HIDDEN_COLUMNS.includes(c.id)); + const frozen = d.보기?.틀고정?.열; + const 보기 = + d.보기 && typeof frozen === "number" + ? { + ...d.보기, + 틀고정: { + ...d.보기.틀고정, + 열: frozen - all.slice(0, frozen).filter((c) => HIDDEN_COLUMNS.includes(c.id)).length, + }, + } + : d.보기; + return { ...d, 열, 줄: [], 합계줄: [], ...(보기 ? { 보기 } : {}) } as unknown as T; } -/** 보인 표 고침 + 저장본의 숨긴 것 — 열 차례는 저장본(표에서 열을 더하거나 지우지 않음 · 26-7d) */ +/** 보인 표 고침 + 저장본의 숨긴 것 — 열 차례 · 틀고정은 저장본(표에서 열을 더하거나 지우지 않음 · 26-7d) */ export function comboMerge(stored: unknown, edited: T): T { const s = stored as ComboDoc; const e = edited as unknown as ComboDoc; @@ -197,7 +211,14 @@ export function comboMerge(stored: unknown, edited: T): T { ); const known = new Set(kept.map((c) => c.id)); const 열 = [...kept, ...e.열.filter((c) => !known.has(c.id))]; - return { ...e, 열, 줄: s.줄 ?? [], 합계줄: s.합계줄 ?? [] } as unknown as T; + const 보기 = e.보기 && s.보기?.틀고정 ? { ...e.보기, 틀고정: s.보기.틀고정 } : e.보기; + return { + ...e, + 열, + 줄: s.줄 ?? [], + 합계줄: s.합계줄 ?? [], + ...(보기 ? { 보기 } : {}), + } as unknown as T; } /** 구조물 이름 + 변수값 — 제목행 층을 빈칸으로 이음(빈 층은 건너뜀 · 다 비면 열 id) */ diff --git a/resources/tester/test_m02_combo_screen.py b/resources/tester/test_m02_combo_screen.py index a56bb554..74dc2bca 100644 --- a/resources/tester/test_m02_combo_screen.py +++ b/resources/tester/test_m02_combo_screen.py @@ -1,8 +1,8 @@ """관리 화면 「구조물 조합」(PLAN 26-7a~d) — 이름 · 숨김(비고 · 전구간 · 합계) · 참조표 잠금 · 나무 자리. -① `comboView` · `comboMerge`(Node) — 보일 문서에서 비고 열 · 줄 · 합계 줄을 빼고, [저장] 때 - 저장본 것을 다시 끼움(열 차례 = 저장본 · 보인 고침은 받음). +① `comboView` · `comboMerge`(Node) — 보일 문서에서 NO · 측점 · 비고 열 · 줄 · 합계 줄을 + 빼고(30-7), [저장] 때 저장본 것을 다시 끼움(열 차례 = 저장본 · 보인 고침은 받음). ② 표 부품 `lockHead` — 열 더하기 · 지우기 · 머리 · 층 이름 고치기 없음(단위 · 조회 후 선택은 그대로). ③ 나무는 좌측 패널 「구조물 조합」 줄 아래(층 단추 + 나무 · PLAN 29-2) · 상세 위쪽 찾기 칸은 @@ -41,17 +41,21 @@ def test_숨긴_것은_저장_때_저장본에서_다시_끼움(): + part.group(0).replace("export ", "") + """ const stored = { - 열: [{ id: "no", 머리: ["NO"] }, { id: "a", 머리: ["가"], 꼴: "수" }, + 열: [{ id: "no", 머리: ["NO"] }, { id: "sta", 머리: ["측점"] }, + { id: "a", 머리: ["가"], 꼴: "수" }, { id: "b", 머리: ["나"], 꼴: "수" }, { id: "memo", 머리: ["비고"] }], - 줄: [{ id: "all", 값: { memo: "x" } }], 합계줄: [{ id: "sum" }], 변수: { k: 1 }, + 줄: [{ id: "all", 값: { memo: "x", sta: "전구간" } }], 합계줄: [{ id: "sum" }], 변수: { k: 1 }, + 보기: { 틀고정: { 열: 2 }, 열너비: { no: 40, a: 72 } }, }; const view = comboView(stored); const edited = structuredClone(view); -edited.열[2].단위 = "m"; +edited.열[1].단위 = "m"; +edited.보기.열너비.a = 90; const saved = comboMerge(stored, edited); console.log(JSON.stringify([ - view.열.map((c) => c.id), view.줄, view.합계줄, stored.열.length, - saved.열.map((c) => c.id), saved.열[2].단위, saved.줄, saved.합계줄, saved.변수, + view.열.map((c) => c.id), view.줄, view.합계줄, view.보기.틀고정.열, stored.열.length, + stored.보기.틀고정.열, saved.열.map((c) => c.id), saved.열[3].단위, saved.줄, saved.합계줄, + saved.변수, saved.보기, ])); """ ) @@ -62,15 +66,21 @@ console.log(JSON.stringify([ ) # fmt: skip assert result.returncode == 0, result.stderr assert json.loads(result.stdout) == [ - ["no", "a", "b"], + ["a", "b"], # NO · 측점 · 비고 숨김(30-7) [], [], - 4, # 저장본은 안 바뀜 - ["no", "a", "b", "memo"], + 0, # 틀고정 2 열(NO · 측점)이 숨어 0 + 5, # 저장본은 안 바뀜 + 2, + ["no", "sta", "a", "b", "memo"], # [저장] 때 저장본 차례 · 숨긴 열 되끼움 "m", - [{"id": "all", "값": {"memo": "x"}}], + [{"id": "all", "값": {"memo": "x", "sta": "전구간"}}], [{"id": "sum"}], {"k": 1}, + { + "틀고정": {"열": 2}, + "열너비": {"no": 40, "a": 90}, + }, # 틀고정은 저장본 · 열너비 고침은 받음 ]