feat(M02): 구조물 조합 표에서 NO · 측점 열도 숨김 · 틀고정 열 수 맞춤 (PLAN 30-7)
- comboView 숨긴 열에 no · sta 더함(비고와 같은 자리 — 보일 문서에서만 빼고 [저장] 때 저장본 것 되끼움) - 틀고정 열 수는 숨긴 열만큼 줄여 보이고(2 → 0) [저장] 때 저장본 값 되돌림 · 열너비 고침은 받음 - 양식 파일 · M02_Table_Fill · 프로젝트 · B08 안 건드림 - 시험 test_m02_combo_screen 기대값(NO · 측점 · 비고 숨김 · 틀고정 · 저장본 차례) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KmELpdXFDRZHhfbGuRhSmL
This commit is contained in:
@@ -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<string, unknown>;
|
||||
type ComboDoc = { 열: StructureColumn[]; 줄?: unknown[]; 합계줄?: unknown[]; 보기?: ComboView };
|
||||
|
||||
export function comboView<T>(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<T>(stored: unknown, edited: T): T {
|
||||
const s = stored as ComboDoc;
|
||||
const e = edited as unknown as ComboDoc;
|
||||
@@ -197,7 +211,14 @@ export function comboMerge<T>(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) */
|
||||
|
||||
@@ -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},
|
||||
}, # 틀고정은 저장본 · 열너비 고침은 받음
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user