- 판정 `_Cross_FillSlope_Warn` — 길이는 카드 머리 「성토사면」 칸과 같은 fillSlopeLengths · 5m 를 넘는 쪽만 - 벽 = 배관 유입(상단측)·유출 기슭막이(집수정은 아님) · 독립 기슭막이 설치 측 · 세월교·BOX암거 양쪽 - 카드 목록 위 <details> — 펼치면 측점 단추, 누르면 그 카드로 · 구조물 자동 배치 없음 - 700줄 — 뷰 조종기 타입을 `_Section_View_Types` 로 뗌(706 → 669) - 936be972: 37측점 경고 · 5m 넘는 48측점 중 벽 선 11곳 빠짐(80·258.1·260·320·352.1 세월교·440·534·620·720·804.2·982.6) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
50 lines
2.3 KiB
TypeScript
50 lines
2.3 KiB
TypeScript
/* =============================================================================
|
|
* B06_Section_UI_Cross_FillSlope_Notice.ts
|
|
* 성토사면 5m 초과 **경고 줄** — 횡단 카드 목록 위 요약 한 줄 + 펼치면 측점 목록
|
|
* (2026-09-14 브레인 승인 (나)). 판정은 `_Cross_FillSlope_Warn`, 여기는 그리기만.
|
|
* 측점을 누르면 그 카드로 간다. 경고만 — 구조물을 세우거나 값을 바꾸지 않는다.
|
|
* ========================================================================== */
|
|
|
|
import type { CrossSection } from "./B06_Section_Api_Fetch";
|
|
import { fillSlopeLengths } from "./B06_Section_UI_Cross_Fit";
|
|
import { FILL_SLOPE_WARN_TEXT, fillSlopeWarnings } from "./B06_Section_UI_Cross_FillSlope_Warn";
|
|
import { L, stationLabel } from "./B06_Section_UI_Section_Common";
|
|
|
|
export interface FillSlopeNotice {
|
|
root: HTMLDetailsElement;
|
|
/** 측점 설계가 바뀔 때마다 부른다 — 펼침 상태는 그대로 둔다. */
|
|
update: (sections: ReadonlyArray<CrossSection>, stationInterval: number) => void;
|
|
}
|
|
|
|
export function createFillSlopeNotice(onPick: (stationId: string) => void): FillSlopeNotice {
|
|
const root = document.createElement("details");
|
|
root.className = "b06-section__notice";
|
|
root.hidden = true;
|
|
const summary = document.createElement("summary");
|
|
const list = document.createElement("div");
|
|
list.className = "b06-section__notice-list";
|
|
root.append(summary, list);
|
|
|
|
return {
|
|
root,
|
|
update(sections, stationInterval) {
|
|
const warnings = fillSlopeWarnings(sections, fillSlopeLengths);
|
|
root.hidden = !warnings.length;
|
|
summary.textContent = `⚠ ${FILL_SLOPE_WARN_TEXT} · ${warnings.length}측점`;
|
|
list.replaceChildren(
|
|
...warnings.map(({ section, sides }) => {
|
|
const button = document.createElement("button");
|
|
button.type = "button";
|
|
const parts = sides.map(({ side, lengthM, open }) => {
|
|
const label = L(side === "left" ? "B06_Design_Ditch_Left" : "B06_Design_Ditch_Right");
|
|
return `${label} ${open ? "≥" : ""}${lengthM.toFixed(2)}m`;
|
|
});
|
|
button.textContent = `${stationLabel(section.chainage_m, stationInterval)} ${parts.join(" · ")}`;
|
|
button.addEventListener("click", () => onPick(section.station_id));
|
|
return button;
|
|
}),
|
|
);
|
|
},
|
|
};
|
|
}
|