merge: 구조물 패널 후속 수정 4건을 통합한다

This commit is contained in:
2026-08-29 19:29:39 +09:00
7 changed files with 48 additions and 74 deletions
@@ -287,8 +287,8 @@ export function createFacilityOptionsForm(
extraGroup.root.hidden = true;
// ── 독립 기슭막이(2026-08-28 이관: 배관처럼 pipe_points 관리) ─────────────
// 설치 측은 **컨테이너 밖**(배관의 관종·관경과 같은 층), 벽 제원과 **단 수**는 좌·우
// 두 칸이 각자 갖는다(2026-08-30 사용자). 설치 측이 한쪽이면 그 칸만 뜬다.
// 설치 측은 **컨테이너 밖**(배관의 관종·관경과 같은 층), 벽 제원은 좌·우 두 칸으로
// 나눈다(2026-08-30 사용자). 설치 측이 한쪽이면 그 칸만 뜬다.
// 좌·우가 저장 채널(유입/유출) 중 어느 쪽인지는 측점 지형이 정하므로 이름표만
// 바꿔 단다(`setRevetSideLabels`) — 값은 언제나 그 채널 키로 오간다.
const revetSide = optionalSelect("양쪽", ["양쪽", "좌", "우"]);
@@ -511,9 +511,7 @@ export function createFacilityOptionsForm(
outletRevet.onChange(emit);
revetInlet.fields.onChange(emit);
revetOutlet.fields.onChange(emit);
[revetSide, revetInlet.tiers, revetOutlet.tiers].forEach((input) =>
input.addEventListener("change", emit),
);
revetSide.addEventListener("change", emit);
[
pipeMaterial,
pipeDiameter,
@@ -609,10 +607,6 @@ export function createFacilityOptionsForm(
fordHeight.value = text("ford_height_m");
fordSlope.value = text("ford_slope_pct");
revetSide.value = text("side") || "양쪽";
// 단 수 — 좌·우 각자 키가 먼저고, 옛 한 벌 값(`tiers`)이 폴백이다.
const legacyTiers = text("tiers") || "1";
revetInlet.tiers.value = text("inlet_revet_tiers") || legacyTiers;
revetOutlet.tiers.value = text("outlet_revet_tiers") || legacyTiers;
const spread = legacyRevetOptions(options);
revetInlet.fields.write(spread);
revetOutlet.fields.write(spread);
@@ -667,16 +661,8 @@ export function createFacilityOptionsForm(
wingOutFields.read(options);
} else if (current === "revetment") {
options.side = revetSide.value;
const tierOf = (input: HTMLInputElement): number | null => {
const value = Number.parseInt(input.value, 10);
return Number.isFinite(value) && value >= 1 ? value : null;
};
const inletTiers = tierOf(revetInlet.tiers);
const outletTiers = tierOf(revetOutlet.tiers);
if (inletTiers !== null) options.inlet_revet_tiers = inletTiers;
if (outletTiers !== null) options.outlet_revet_tiers = outletTiers;
// 옛 한 벌 키도 남긴다 — 서버 `_revet_set`이 아직 이 값을 읽는다.
options.tiers = Math.max(inletTiers ?? 1, outletTiers ?? 1);
// 단 수는 폼이 갖지 않는다 — 횡단 설계 patch(extra_wall_counts)가 정본이고
// 조작은 [추가 기슭막이(단)] 행이 한다(2026-08-30 사용자: 중복이라 삭제).
// 좌·우가 각자 값을 갖는다 — 저장 채널은 유입/유출 키 그대로다(2026-08-30).
revetInlet.fields.read(options);
revetOutlet.fields.read(options);
@@ -211,8 +211,6 @@ export interface RevetSideGroup {
root: HTMLFieldSetElement;
legend: HTMLLegendElement;
fields: RevetmentFields;
/** 단 수(다단) — 좌·우가 각자 갖는다(2026-08-30 사용자). */
tiers: HTMLInputElement;
/** 조정창 행이 옮겨 붙는 자리 — 배관 유입구·유출구 칸과 같은 규칙. */
slot: HTMLElement;
}
@@ -222,20 +220,19 @@ export function createRevetSideGroup(keys: RevetmentKeys, formDefault: string):
const kind = document.createElement("select");
kind.replaceChildren(new Option("기슭막이", "기슭막이"));
const fields = createRevetmentFields(keys, { ...REVET_COMMON_DEFAULTS, form: formDefault });
const tiers = numberInput("1", "1");
tiers.value = "1";
const slot = document.createElement("div");
slot.className = "b05-structure__adjust-slot";
box.body.append(
grid(labeled("구조", kind), fields.formField),
...fields.rows,
grid(labeled("단 수(다단)", stepper(tiers, 1))),
// 단 수는 여기 두지 않는다 — 조정창에서 옮겨 오는 [추가 기슭막이(단)] 행과
// 같은 값이라 두 벌이면 헷갈린다(2026-08-30 사용자).
slot,
);
const legend = box.root.querySelector("legend")!;
// 이름표는 좌·우가 정해 준다 — 고른 구조물 이름을 덧붙이지 않는다(2026-08-30).
legend.dataset.fixedLabel = "1";
return { root: box.root, legend, fields, tiers, slot };
return { root: box.root, legend, fields, slot };
}
export interface RevetmentFields {