feat(design): 노면공 콘크리트 포장 명세 컨테이너 · 기타 상세 종류 이름(표 08 · 52-10)

- 콘크리트 포장 = 기준 측점 + 필수 컨테이너 「상세 내용」(포장사양 고르기 · 높이 m 손 입력) · 구조물 조합 잇기
- 포장사양 선택지는 명세 한 곳(PAVE_SPEC_CHOICES · 지금 콘크리트 하나) · 새 키 pave_spec · height_m
- 구간 길이 · 전 · 후는 정의 칸 그대로 · 표에 없는 옛 상세 칸(두께 · 폭 · 확폭 · 줄눈 · 비닐 · 철망)은 화면에서 빼고 지난 정의 값으로 보존
- 일반 구조물(structures.json)도 명세 폼을 옵션 칸 아래에 그림(B05_Profile_UI_Structures_Spec) · 잠금은 옵션 칸을 따름 · [수정] 병합은 명세 키를 다시 씀
- 기타 이름 칸 = 「상세 종류 이름」(정의 판 8 · 이력 판_7) · 목록 이름으로 씀 · 종류 단위 잇기 그대로
- 시험: test_52_10_structure_spec_road · 헬퍼 road · ui_checks/52-10_노면공_기타(B05 · B06 같음 · 되돌림)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KYZ2HWWdUwZWYnn3tQz7X
This commit is contained in:
2026-10-05 23:49:27 +09:00
co-authored by Claude Opus 5.5
parent 9f3a00041d
commit 355361bdb5
13 changed files with 3828 additions and 8 deletions
@@ -18,6 +18,7 @@ import type { FacilityAttributes, FacilityOptionsForm } from "./B05_Profile_UI_D
import type { StationFields } from "./B05_Profile_UI_Structures_Fields";
import { splitPavementRange } from "./B05_Profile_UI_Structures_Pavement";
import { mergeStructureOptions } from "./B05_Profile_UI_Structures_Summary";
import { readStructureSpec, specRenderedKeys } from "./B05_Profile_UI_Structures_Spec";
import type { GroupBoxes } from "./B05_Profile_UI_Structures_Groups";
import {
readGroupItems,
@@ -40,6 +41,8 @@ export interface StructuresCommitContext {
startFields: StationFields;
endFields: StationFields;
facilityOptions: FacilityOptionsForm;
/** 옵션 칸 — 짝 명세 폼(52-10)을 찾는 열쇠. */
optionRow: HTMLElement;
optionInputs: Array<{
key: string;
required: boolean;
@@ -205,7 +208,7 @@ export function readOptions(ctx: StructuresCommitContext): Record<string, string
if (input.isEmpty()) return;
values[input.key] = input.read();
});
return values;
return { ...values, ...readStructureSpec(ctx.optionRow, ctx.currentType()) };
}
export function emit(ctx: StructuresCommitContext): void {
@@ -369,7 +372,11 @@ export async function commit(ctx: StructuresCommitContext, live = false): Promis
options: mergeStructureOptions(
previous,
type.type_id,
[...ctx.optionInputs.map((entry) => entry.key), ...ctx.groupBoxes.shapeKeys()],
[
...ctx.optionInputs.map((entry) => entry.key),
...ctx.groupBoxes.shapeKeys(),
...specRenderedKeys(type, previous.options), // 명세 폼 키(52-10) — 비운 칸 · 뺀 컨테이너는 지움
],
records[0].options,
),
};