From 9fc5673b737925b6cd9f0bf9b59e99c9f4f6037d Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:38:22 +0900 Subject: [PATCH 1/6] =?UTF-8?q?test(M02):=20=EB=B9=88=20=EC=B9=B8=20?= =?UTF-8?q?=EC=88=98=EB=9F=89=20=ED=91=9C=EA=B8=B0=20=EA=B8=B0=EB=8C=80?= =?UTF-8?q?=EB=A5=BC=2044-6=20=E3=80=8C=EC=88=98=EB=9F=89=20=EB=B9=88=20?= =?UTF-8?q?=EC=B9=B8(=EC=B9=B8)=E3=80=8D=20=EA=BC=B4=EB=A1=9C=20=EB=A7=9E?= =?UTF-8?q?=EC=B6=A4=20=E2=80=94=20=EB=B9=88=20=EC=B9=B8=20=3D=20=EC=88=98?= =?UTF-8?q?=EB=9F=89=20=EC=97=86=EC=9D=8C=20=EB=9C=BB=20=EA=B7=B8=EB=8C=80?= =?UTF-8?q?=EB=A1=9C?= 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_01MgChuAcyBqUkhHMTXomQC7 --- resources/tester/test_m02_area_panel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/tester/test_m02_area_panel.py b/resources/tester/test_m02_area_panel.py index 0fc11d34a..cccd2e3f7 100644 --- a/resources/tester/test_m02_area_panel.py +++ b/resources/tester/test_m02_area_panel.py @@ -56,7 +56,7 @@ def test_칸_지정_모달은_setLink_만(): def test_빈_칸은_수량_없음_서버와_같음(): - """39-8 ② — 빈 칸에 이은 알약 = 수량 없음(반영 「—」 · 「수량 A1 = 빈 칸」) · 0 칸 = 0 · 값 칸 = 값.""" + """39-8 ② — 빈 칸에 이은 알약 = 수량 없음(반영 「—」 · 「수량 빈 칸(A1)」) · 0 칸 = 0 · 값 칸 = 값.""" from M02_MasterTemplete import M02_Labor_Doc as labor doc = { @@ -79,7 +79,7 @@ def test_빈_칸은_수량_없음_서버와_같음(): sheet = (ROOT / "A00_Common" / "spreadsheet" / "spreadsheet.ts").read_text(encoding="utf-8") assert 'const empty = !cell || (cell.식 === undefined && (cell.값 ?? "") === "");' in sheet rows = _text("M02_MasterTemplete_Labor_Rows.ts") - assert '${tc("Labor_Qty")} ${at} = ${tc("In_QtyEmpty")}' in rows + assert '${tc("Labor_Qty")} ${tc("In_QtyEmpty")}(${at})' in rows assert "if (!value) return `${link.칸} = ${TEXT.empty}`;" in _text( "M02_MasterTemplete_AreaLink.ts" ) From 08e2b211a9a9ff96ef8f1216242a434263df49bc Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:38:58 +0900 Subject: [PATCH 2/6] auto: 2026-10-05 12:38 (ESD_LAPTOP) --- resources/master_template/area/item1.json | 121 ++++++++++++++++++--- resources/master_template/labor/item1.json | 14 +++ 2 files changed, 117 insertions(+), 18 deletions(-) diff --git a/resources/master_template/area/item1.json b/resources/master_template/area/item1.json index 02dfac0e2..7ae03696e 100644 --- a/resources/master_template/area/item1.json +++ b/resources/master_template/area/item1.json @@ -9,27 +9,112 @@ { "id": "s1", "이름": "면적산출", - "칸": {}, - "연결": [ - { - "키": "콘크리트 표층 인력포설|㎥", - "이름": "콘크리트 표층 인력포설", - "칸": "B6", - "단위": "㎥" + "칸": { + "E7": { + "값": "구 분" }, - { - "키": "와이어메시 바닥깔기|㎡", - "이름": "와이어메시 바닥깔기", - "칸": "D15", - "단위": "㎡" + "F7": { + "값": "규 격" }, - { - "키": "기계비빔타설|㎥", - "이름": "기계비빔타설", - "칸": "F14", - "단위": "㎥" + "G7": { + "값": "수 량" + }, + "H7": { + "값": "단 위" + }, + "I7": { + "값": "산 출 근 거" + }, + "J7": { + "값": "비 고" + }, + "E8": { + "값": "야면석" + }, + "E9": { + "값": "고임돌량" + }, + "E10": { + "값": "뒤채움돌" + }, + "E11": { + "값": "구조물터파기량" + }, + "E12": { + "값": "되메우기량" + }, + "E13": { + "값": "잔토량" + }, + "F8": { + "값": "뒤길이35cm" + }, + "F10": { + "값": "9~15cm" + }, + "G8": { + "값": 2.65 + }, + "G9": { + "값": 0.24 + }, + "G10": { + "값": 0.94 + }, + "G11": { + "값": 0.38 + }, + "G12": { + "값": 0.11 + }, + "G13": { + "값": 0.26 + }, + "H8": { + "값": "㎡" + }, + "H9": { + "값": "㎥" + }, + "H10": { + "값": "㎥" + }, + "H11": { + "값": "㎥" + }, + "H12": { + "값": "㎥" + }, + "H13": { + "값": "㎥" + }, + "I8": { + "값": "2.5m * 1.059m / 1.0 m * 1.0 m = 2.6475m" + }, + "I9": { + "값": "2.6475m * 0.09m /1.0 m = 0.2383㎥" + }, + "I10": { + "값": "(0.45 + 0.3)/2 * 2.5 * 1.0 = 0.9375" + }, + "I11": { + "값": "(1.1+1.4)/2 * 0.3 * 1.0 = 0.375" + }, + "I12": { + "값": "(0.3+0.45)/2 * 0.3 * 1.0 = 0.1125" + }, + "I13": { + "값": "0.375 - 0.1125 = 0.2625" } - ] + }, + "열": { + "E": { + "폭": 14.460318429129464 + }, + "I": { + "폭": 39.60316685267857 + } + } } ], "활성": "s1", diff --git a/resources/master_template/labor/item1.json b/resources/master_template/labor/item1.json index b9889e9e3..77ea48848 100644 --- a/resources/master_template/labor/item1.json +++ b/resources/master_template/labor/item1.json @@ -11,84 +11,98 @@ "담은로직": [ { "로직": "GC000198", + "별칭": null, "메모": "레미콘타설(장비) 무근,소형", "입력값": {}, "수량": null }, { "로직": "GC000214", + "별칭": null, "메모": "유로폼 설치 및 해체 보통", "입력값": {}, "수량": null }, { "로직": "GC000206", + "별칭": null, "메모": "철근가공 및 조립 Type-Ⅰ-1,현장가공조립", "입력값": {}, "수량": null }, { "로직": "GC000207", + "별칭": null, "메모": "철근가공 및 조립 Type-Ⅰ-1,현장가공조립", "입력값": {}, "수량": null }, { "로직": "GF000218", + "별칭": null, "메모": "기초다짐 및 뒤채움 소형 장비사용 시공 (실무 수는 옛 판 값)", "입력값": {}, "수량": null }, { "로직": "GF000225", + "별칭": null, "메모": "깬잡석찰붙임 L3=30cm내외", "입력값": {}, "수량": null }, { "로직": "GF000156", + "별칭": null, "메모": "콘크리트(기계비빔) 무근구조물 (실무 수는 옛 판 값)", "입력값": {}, "수량": null }, { "로직": "GF000226", + "별칭": null, "메모": "큰돌메쌓기 뒷길이 0.6~0.8m", "입력값": {}, "수량": null }, { "로직": "GF000214", + "별칭": null, "메모": "야면석채집 L3=45cm내외 (실무 수는 옛 판 값)", "입력값": {}, "수량": null }, { "로직": "GF000222", + "별칭": null, "메모": "찰쌓기(켜쌓기) L3=55cm이하 (실무 수는 옛 판 값)", "입력값": {}, "수량": null }, { "로직": "GC000677", + "별칭": null, "메모": "모르터바르기 1:3", "입력값": {}, "수량": null }, { "로직": "GF000221", + "별칭": null, "메모": "돌쌓기 찰(켜)쌓기,L3=55cm이하 (실무 수는 옛 판 값)", "입력값": {}, "수량": null }, { "로직": "GC000088", + "별칭": null, "메모": "구조물터파기(토사) 굴착기0.6m3", "입력값": {}, "수량": null }, { "로직": "GF000113", + "별칭": null, "메모": "구조물되메우기 굴착기0.6m3 (실무 수는 옛 판 값)", "입력값": {}, "수량": null From 6eb3c551be93b8de6604bfa75a6f148d9350435e Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:39:35 +0900 Subject: [PATCH 3/6] =?UTF-8?q?chore(plan):=2010-5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=9B=90=EB=AC=B8(=EA=B5=AC=EC=A1=B0=EB=AC=BC=20=EC=A1=B0?= =?UTF-8?q?=ED=95=A9=20=EC=83=81=EC=84=B8=20=EA=B3=B5=EA=B0=84=20=C2=B7=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=84=A0)?= 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_01FJqWQpoB1RE7hiaQ2wH8qV --- docs/raw/사용자요구/2026-10-05_수정요구.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 305ec2bf6..e48eaa057 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -35,3 +35,7 @@ 1. M02 페이지의 전체영역에서 알약 템플릿으로 프론트엔드에 사용중인데 버튼들은 기본 버튼 템플릿을 사용하게 변경해서 알약 템플릿은 알약에만 사용하는게 맞아. 2. M02 페이지의 좌측패널 내부 별도의 서브 컨테이너로 구조물도면, 일위대가, 면적산출 구성되어 있는데 이건 필요없어 보임 접근은 구조물 조합을 선택하면 바로 3개의 항목 연결이 보이니 불필요해보여. 3. 구조물 조합 상세 페이지의 구조물 분류 테이블에 일위대가 도면 면적산출 행에 키값들을 노출하고 있는데 이건 필요없어보여. + +## 추가 (10-5 · 원문 그대로) + +다음으로 구조물 조합 분류 테이블과 상세컨테이너사이가 공간이 너무 넣어 그리고 구조물 분류 테이블의 하단에 구분선이 있는것같은데 삭제해줘. 컨테이너의 상단에도 구분선이 있어. From f1a1c1505356876334949fe342a1c0dbd46b90db Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:40:05 +0900 Subject: [PATCH 4/6] auto: 2026-10-05 12:40 (ESD_LAPTOP) --- docs/raw/사용자요구/2026-10-05_수정요구.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 305ec2bf6..e48eaa057 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -35,3 +35,7 @@ 1. M02 페이지의 전체영역에서 알약 템플릿으로 프론트엔드에 사용중인데 버튼들은 기본 버튼 템플릿을 사용하게 변경해서 알약 템플릿은 알약에만 사용하는게 맞아. 2. M02 페이지의 좌측패널 내부 별도의 서브 컨테이너로 구조물도면, 일위대가, 면적산출 구성되어 있는데 이건 필요없어 보임 접근은 구조물 조합을 선택하면 바로 3개의 항목 연결이 보이니 불필요해보여. 3. 구조물 조합 상세 페이지의 구조물 분류 테이블에 일위대가 도면 면적산출 행에 키값들을 노출하고 있는데 이건 필요없어보여. + +## 추가 (10-5 · 원문 그대로) + +다음으로 구조물 조합 분류 테이블과 상세컨테이너사이가 공간이 너무 넣어 그리고 구조물 분류 테이블의 하단에 구분선이 있는것같은데 삭제해줘. 컨테이너의 상단에도 구분선이 있어. From 0c85cf6b0441c4727cd174eca3852335390fa084 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:40:32 +0900 Subject: [PATCH 5/6] auto: 2026-10-05 12:40 (ESD_LAPTOP) --- docs/raw/사용자요구/2026-10-05_수정요구.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/raw/사용자요구/2026-10-05_수정요구.md b/docs/raw/사용자요구/2026-10-05_수정요구.md index 305ec2bf6..e48eaa057 100644 --- a/docs/raw/사용자요구/2026-10-05_수정요구.md +++ b/docs/raw/사용자요구/2026-10-05_수정요구.md @@ -35,3 +35,7 @@ 1. M02 페이지의 전체영역에서 알약 템플릿으로 프론트엔드에 사용중인데 버튼들은 기본 버튼 템플릿을 사용하게 변경해서 알약 템플릿은 알약에만 사용하는게 맞아. 2. M02 페이지의 좌측패널 내부 별도의 서브 컨테이너로 구조물도면, 일위대가, 면적산출 구성되어 있는데 이건 필요없어 보임 접근은 구조물 조합을 선택하면 바로 3개의 항목 연결이 보이니 불필요해보여. 3. 구조물 조합 상세 페이지의 구조물 분류 테이블에 일위대가 도면 면적산출 행에 키값들을 노출하고 있는데 이건 필요없어보여. + +## 추가 (10-5 · 원문 그대로) + +다음으로 구조물 조합 분류 테이블과 상세컨테이너사이가 공간이 너무 넣어 그리고 구조물 분류 테이블의 하단에 구분선이 있는것같은데 삭제해줘. 컨테이너의 상단에도 구분선이 있어. From 4ee2a4b74b61c07df7ae411d7b4b45e91474ea02 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 12:47:31 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix(M02):=2045-5=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=AC=BC=20=EC=A1=B0=ED=95=A9=20=EB=B6=84=EB=A5=98=20=ED=91=9C?= =?UTF-8?q?=20=C2=B7=20=EC=B9=B4=EB=93=9C=20=EC=85=8B=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=20=EA=B0=84=EA=B2=A9=20107px=20=E2=86=92=2012px=20=C2=B7=20?= =?UTF-8?q?=ED=91=9C=20=EC=95=84=EB=9E=98=20=EC=A4=84=20=C2=B7=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EC=B9=B8=20=EC=9C=84=20=EC=A4=84=20=EC=97=86?= =?UTF-8?q?=EC=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드가 보일 때 표 자리 최소 높이 240px 풀어 표 높이만큼만 - 카드 칸 위 구분선 · 안쪽 여백 12px 없앰(메인 칸 간격 하나만) - 조합 분류 표 틀 아래 줄 없앰(마지막 줄 칸 선이 표를 닫음) - 확인 시나리오 resources/tester/ui_checks/45-5_분류표_카드_간격.js Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7 --- .../M02_MasterTemplete_Structure.css | 15 ++++++--- .../tester/ui_checks/45-5_분류표_카드_간격.js | 32 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 resources/tester/ui_checks/45-5_분류표_카드_간격.js diff --git a/M02_MasterTemplete/M02_MasterTemplete_Structure.css b/M02_MasterTemplete/M02_MasterTemplete_Structure.css index 674d1bd2d..2284bcbfe 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Structure.css +++ b/M02_MasterTemplete/M02_MasterTemplete_Structure.css @@ -18,9 +18,7 @@ flex: none; grid-auto-rows: var(--m02-struct-card-h); grid-template-columns: repeat(3, minmax(0, 1fr)); /* 도면 · 일위대가 · 면적산출(40-2) */ - padding-top: var(--spacing-12); - border-top: 1px solid var(--color-border); - min-width: 0; + min-width: 0; /* 표와 사이 = 메인 칸 간격 하나 · 구분선 없음(45-5) */ } /* 상세 칸이 좁으면(카드 하나 300px 아래) 1열 — 좌측 패널을 접어도 맞게 상세 칸 폭으로 잼 @@ -46,9 +44,18 @@ overflow-y: auto; } -/* 표는 줄어들지 않음(줄면 표가 카드 위로 넘침) */ +/* 표는 줄어들지 않음(줄면 표가 카드 위로 넘침) · 표 높이만큼만(빈 칸 최소 높이 없음 · 45-5) */ .m02-main:has(> .m02-main__extra > .m02-struct:not([hidden])) > .m02-main__host { flex-shrink: 0; + min-height: 0; +} + +/* 분류 표 틀 아래 줄 없음 — 마지막 줄 칸 선이 표를 닫음(45-5) */ +.m02-main:has(> .m02-main__extra > .m02-struct:not([hidden])) + > .m02-main__host + > .ui-sheet--combo + > .ui-sheet__scroll { + border-bottom: 0; } /* 카드 = 제목 + 머리 + 본문 — 본문이 남는 높이를 채움 · 넘치면 카드 안 스크롤 */ diff --git a/resources/tester/ui_checks/45-5_분류표_카드_간격.js b/resources/tester/ui_checks/45-5_분류표_카드_간격.js new file mode 100644 index 000000000..1cf8bcf97 --- /dev/null +++ b/resources/tester/ui_checks/45-5_분류표_카드_간격.js @@ -0,0 +1,32 @@ +/* 45-5 — M02 구조물 조합 상세(항목 고른 화면) · 분류 표와 카드 셋(도면 정보 · 일위대가 · 면적산출) 사이 간격 · 구분선 + * 시작 화면: M02 마스터 템플릿 · 마스터 층(#/m02-master-template?open=구조물조합&root=master) · 나무에 item1 이 있음 + * 부르는 법: orca eval --expression "$(cat 이 파일)" (async 식 · JSON 글을 돌려줌) + * 기대 수치: + * - gap = 표 틀 아래 끝 ~ 첫 카드 위 끝 = 메인 칸 간격(12px 안팎 · 옛 107px) + * - tableLine = 0(표 틀 아래 줄 없음) · lastRow > 0(마지막 줄 칸 선이 표를 닫음) + * - cardsLine = 0 · cardsPad = 0(카드 칸 위 줄 · 안쪽 여백 없음) · hr = 0 + */ +(async () => { + const w = (ms) => new Promise((r) => setTimeout(r, ms)); + document.querySelector('[data-node="i|item1"]').click(); + for ( + let t = 0; + t < 5000 && !document.querySelector(".m02-struct:not([hidden]) .m02-struct__card"); + t += 100 + ) + await w(100); + await w(300); + const scroll = document.querySelector(".m02-main__host .ui-sheet__scroll"); + const struct = document.querySelector(".m02-struct"); + const card = struct.querySelector(".m02-struct__card"); + const cells = scroll.querySelectorAll("th, td"); + const cs = (e) => getComputedStyle(e); + return JSON.stringify({ + gap: Math.round(card.getBoundingClientRect().top - scroll.getBoundingClientRect().bottom), + tableLine: parseFloat(cs(scroll).borderBottomWidth), + lastRow: parseFloat(cs(cells[cells.length - 1]).borderBottomWidth), + cardsLine: parseFloat(cs(struct).borderTopWidth), + cardsPad: parseFloat(cs(struct).paddingTop), + hr: document.querySelectorAll(".m02-main hr").length, + }); +})();