- 우클릭 바로 추가에서 세월교 · 물넘이포장을 폼만 갈래에서 뺌 · 추가 뒤 그 측점 관 고름 + 알림 한 줄 - 배수유역 패널 — 바로 놓은 빈 높이 측점을 기다렸다가 응답 유량으로 필요 수심 채움(`fordHeightM` · 서버 `ford_height_m` 짝) · 손 값은 안 덮음 · 유량 전엔 빈칸 · 채우면 세션 초안에 다시 담음 - 세부유역 요청은 최신 응답만 채택(requestSeq) - 시험 test_126_ford_right_click(헬퍼 helper_126_ford_fill) · test_116 기대값 고침 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UoSr2sqvYtBf1dtQdus88s
55 lines
3.0 KiB
TypeScript
55 lines
3.0 KiB
TypeScript
/* =============================================================================
|
|
* B05_Profile_UI_Structures_Panel_AddAt.ts
|
|
* 종단 우클릭 → 종류 고름 = 「[추가]까지 끝난 상태」(PLAN 116-1) — 세 길(B05 종단 · B06 종단 ·
|
|
* 3D)이 함께 쓰는 패널 `addAt` 의 끝맺음. 필수 빈칸이 없는 종류는 그 측점에 바로 추가하고
|
|
* 새 항목을 고른 채로 둠 · 남는 종류는 폼만. 세월교 · 물넘이포장도 바로 추가 — 빈 월류 높이는
|
|
* 배수유역 재계산 유량이 오면 그 항목에 채움(126-1 · `_Drainage_Ford_Fill`).
|
|
* ========================================================================== */
|
|
|
|
import type { StructureInstance, StructureType } from "./B05_Profile_Api_Structures";
|
|
import type { StructuresSection } from "./B05_Profile_UI_Structures_Panel_Types";
|
|
import { showToast } from "@ui/ui_template_elements";
|
|
|
|
/** 바로 추가하지 않는 종류 — 노면공(겹침 확인창). */
|
|
const FORM_ONLY = new Set(["pavement_concrete"]);
|
|
/** 월류 높이를 유량 뒤에 받는 종류 — 추가 때 알림 한 줄. */
|
|
const FORD_KINDS = new Set(["ford_bridge", "ford_pavement"]);
|
|
export const FORD_WAIT_NOTICE = "월류 높이는 배수유역 재계산(설계유량)이 오면 채워집니다.";
|
|
|
|
/** 우클릭 한 번으로 [추가]까지 끝낼 수 있는지 — [추가]가 막는 빈 필수 칸이 없어야 함. */
|
|
export function addsAtOnce(
|
|
type: StructureType,
|
|
optionInputs: ReadonlyArray<{ required: boolean; isEmpty: () => boolean }>,
|
|
): boolean {
|
|
if (FORM_ONLY.has(type.type_id)) return false;
|
|
return !optionInputs.some((entry) => entry.required && entry.isEmpty());
|
|
}
|
|
|
|
/** [추가]를 대신 누르고 새 항목을 고름. [추가]가 거절하면(전길이 > 기준 등) 아무것도 안 들고
|
|
* 그 칸에 포커스가 간 폼 그대로 남음 — false. */
|
|
export async function finishAdd(ctx: {
|
|
type: StructureType;
|
|
anchorM: number;
|
|
structures: StructureInstance[];
|
|
commit: () => Promise<void>;
|
|
/** 패널 — 바깥에서 고를 때와 같은 길(좌측 패널 폄 · 폼 · 목록 고름). */
|
|
pick: Pick<StructuresSection, "selectById" | "selectPipeByChainage">;
|
|
}): Promise<boolean> {
|
|
if (ctx.type.managed_by) {
|
|
// 관 지점 정본 — 배수유역 재계산은 종전 [추가] 그대로. B06 은 목록에 바로 들어 여기서 고르고,
|
|
// B05 는 재계산 뒤 배수유역 패널이 새 관 고름을 다시 알려 폼이 열림.
|
|
await ctx.commit();
|
|
ctx.pick.selectPipeByChainage(ctx.anchorM);
|
|
if (FORD_KINDS.has(ctx.type.type_id)) showToast(FORD_WAIT_NOTICE);
|
|
return true;
|
|
}
|
|
const before = new Set(ctx.structures.map((entry) => entry.structure_id));
|
|
await ctx.commit(); // 목록 알림 → 페이지가 임시 id 를 붙여 되돌려 줌(`withLocalIds`)
|
|
const added = ctx.structures.find(
|
|
(entry) => !!entry.structure_id && !before.has(entry.structure_id),
|
|
);
|
|
if (!added?.structure_id) return false;
|
|
ctx.pick.selectById(added.structure_id);
|
|
return true;
|
|
}
|