feat(376-2): B07 좌측 「구조물 도면」 카드(늘 카드 · 단추 = 조합 이름 · 연결 없으면 빈 글 한 줄)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
This commit is contained in:
2026-10-17 14:44:30 +09:00
co-authored by Claude Opus 5.5
parent 56c8ba96b9
commit 864ef20390
4 changed files with 31 additions and 2 deletions
@@ -16,6 +16,7 @@ export interface DesignDrawingItem {
| "landuse"
| "plan_lidar"
| "cross_standard"
| "structure"
| "blank";
label: string;
chainage_m: number | null;
@@ -112,6 +113,7 @@ export interface DesignDrawingResponse {
| "landuse"
| "plan_lidar"
| "cross_standard"
| "structure"
| "blank";
label: string;
drawing: CadDrawing;
+11 -2
View File
@@ -37,6 +37,8 @@ export const DRAWING_GROUPS: readonly {
// 표준 횡단면도는 횡단도 묶음 맨 위 한 줄(93-5).
{ label: "횡단도", kind: "cross" },
{ label: "토적도(유토곡선)", kind: "mass_haul" },
// 구조물 도면(376) — B05 · B06 배치에 연결된 구조물 조합마다 한 장(더한장은 장마다) · 늘 묶음.
{ label: "구조물 도면", kind: "structure" },
];
/** 311 기본 접힘 묶음 — 그 밖 묶음(토적도 등)은 기본 펼침. */
@@ -128,8 +130,9 @@ export function buildDrawingSidePanel(
)
: drawings.filter((item) => item.id === group.blankId);
const cross = group.kind === "cross";
// 한 장짜리(와 아직 내용이 없는 도면)는 컨테이너 없이 버튼 하나로 둔다 — 횡단도는 늘 묶음.
if (items.length <= 1 && !cross) {
const structure = group.kind === "structure";
// 한 장짜리(와 아직 내용이 없는 도면)는 컨테이너 없이 버튼 하나로 둔다 — 횡단도 · 구조물 도면은 늘 묶음.
if (items.length <= 1 && !cross && !structure) {
const [drawing] = items;
// 서버가 빈 도각을 내주지 못한 경우에만 회색 버튼으로 남는다.
if (!drawing) {
@@ -166,6 +169,12 @@ export function buildDrawingSidePanel(
// 횡단면도는 장 단위(여러 측점)라 서버가 준 "N장 (구간)" 라벨을 그대로 쓴다.
section.append(drawingButton(drawing, drawing.label));
}
if (structure && items.length === 0) {
const empty = document.createElement("p");
empty.className = "b07-drawing-list__empty";
empty.textContent = "B05 · B06 구조물 배치에 연결된 구조물 도면이 없습니다.";
section.append(empty);
}
if (cross && crossTools) section.append(crossTools);
panel.append(section);
}
@@ -249,4 +249,15 @@ const again = b07.buildDrawingSidePanel(
b07.foldedGroups(host),
);
out.b07Redraw = groups(again);
// 376-2 구조물 도면 카드 — 연결 없으면 카드 안 빈 글 · 있으면 단추 = 조합 이름(늘 카드)
const structureCard = (p) =>
p.querySelectorAll(".b07-drawing-group").find((s) => s.dataset.kind === "structure");
out.b07StructureEmpty = structureCard(first).querySelector(".b07-drawing-list__empty")?.textContent;
const one = b07.buildDrawingSidePanel(
[...drawings, { id: "structure_k", kind: "structure", label: "관보호공 조합", confirmed: false }],
() => undefined,
);
out.b07StructureButtons = structureCard(one)
.querySelectorAll(".b07-drawing-button")
.map((b) => [b.dataset.drawingId, b.textContent]);
process.stdout.write(JSON.stringify(out));
@@ -64,6 +64,7 @@ def test_B07_첫_그림_접힘(out):
"longitudinal": True,
"cross": True,
"mass_haul": False,
"structure": False, # 376-2 늘 카드 · 기본 펼침
}
@@ -73,9 +74,15 @@ def test_B07_다시_세워도_접힘_이어_받음(out):
"longitudinal": True,
"cross": False,
"mass_haul": True,
"structure": False,
}
def test_376_2_구조물_도면_카드(out):
assert out["b07StructureEmpty"] == "B05 · B06 구조물 배치에 연결된 구조물 도면이 없습니다."
assert out["b07StructureButtons"] == [["structure_k", "관보호공 조합"]]
def test_B07_다시_세우기는_옛_목록을_기다리기_전에_읽음():
page = _read("B07_DesignDetail/B07_DesignDetail_UI_Page.ts")
body = page[page.index("export async function renderB07DesignDetail(") :]