Merge commit '629f7c10c' into sub_laptop_1

This commit is contained in:
2026-10-05 12:50:13 +09:00
5 changed files with 162 additions and 24 deletions
@@ -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;
}
/* 카드 = 제목 + 머리 + 본문 — 본문이 남는 높이를 채움 · 넘치면 카드 안 스크롤 */
+103 -18
View File
@@ -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",
@@ -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
+2 -2
View File
@@ -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"
)
@@ -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,
});
})();