feat(B05,B06): 구조물 배치를 실시간 반영으로 바꾸고 이식 행·강조를 정리한다
2026-08-29 사용자 지시 3건: 1. 유입구·유출구로 옮겨 온 단 수·옵션 행을 폼 양식(라벨+한 덩어리 컨트롤)으로 맞추고 2열 격자로 세운다. 2. 이미 고른 항목은 값이 바뀔 때마다 곧바로 반영한다([수정] 버튼 불필요). 버튼은 visibility만 꺼 자리를 남겨 삭제·리셋의 위치·크기가 흔들리지 않게 했다. 정본 주입이 되먹임으로 돌아와도 편집 중인 폼은 닫지 않는다. 3. 도면에서 구조물을 고르면 그쪽 그룹(유입구/유출구)을 붉은 계열로 강조한다. 카드만 고른 경우는 강조하지 않는다 — 대표 벽은 조용히 딸려 오고, 그 벽을 다시 눌러 선택을 풀면 강조만 꺼지고 행은 남는다. 검증: 슬롯 grid 2열, 카드 선택 시 강조 없음·행 2개, 다른 벽 클릭 시 유입구 그룹 붉은 테두리(rgb(192,57,43)), 재클릭 시 강조 해제·행 복귀. 길이 + 즉시 캐시 반영(11) 후 - 원복(10), 폼 유지. typecheck 통과.
This commit is contained in:
@@ -24,7 +24,12 @@ import {
|
||||
} from "../B05_Profile/B05_Profile_Api_Structures";
|
||||
import { fetchDetailPipePoints } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
|
||||
import { showToast } from "@ui/ui_template_elements";
|
||||
import { adjustDockRoot, resetAdjustDock, setAdjustSideSlots } from "./B06_Section_UI_Adjust_Dock";
|
||||
import {
|
||||
adjustDockRoot,
|
||||
resetAdjustDock,
|
||||
setAdjustSideSlots,
|
||||
withAutoAdopt,
|
||||
} from "./B06_Section_UI_Adjust_Dock";
|
||||
import type { SectionDetailResponse } from "./B06_Section_Api_Fetch";
|
||||
import type { StationControls } from "./B06_Section_UI_Page_Station_Controls";
|
||||
|
||||
@@ -118,7 +123,6 @@ export function createB06StructuresPanel(deps: B06StructuresPanelDeps): B06Struc
|
||||
);
|
||||
if (hit) hit.options = { ...(hit.options ?? {}), ...patch };
|
||||
section.setPipeFacilities(pipeFacilities);
|
||||
showToast("수정한 값은 [저장]·[확정] 때 반영됩니다.", "success");
|
||||
},
|
||||
onPipeRemove: () => showToast(PIPE_ADD_GUIDE, "error"),
|
||||
onPipeSelect: (chainageM) => {
|
||||
@@ -208,6 +212,8 @@ export function wireStructureSelection(
|
||||
stationControls: StationControls,
|
||||
detail: () => SectionDetailResponse | null,
|
||||
panel: B06StructuresPanel,
|
||||
/** 대표 벽으로 되돌릴 때 카드를 다시 그린다 — 없으면 되돌리지 않는다. */
|
||||
refreshCard?: (chainageM: number) => void,
|
||||
): { syncInletStructure: () => void } {
|
||||
const ownerChainageOf = (chainageM: number): number => {
|
||||
const sectionAt = detail()?.cross_sections.find(
|
||||
@@ -235,7 +241,26 @@ export function wireStructureSelection(
|
||||
const origRevet = stationControls.revetOffset.select;
|
||||
stationControls.revetOffset.select = (chainageM, key) => {
|
||||
origRevet(chainageM, key);
|
||||
panel.showPipeAt(key ? ownerChainageOf(chainageM) : null);
|
||||
if (key) {
|
||||
panel.showPipeAt(ownerChainageOf(chainageM));
|
||||
syncInletStructure();
|
||||
return;
|
||||
}
|
||||
// 선택을 풀어도 폼의 단 수·옵션 행은 남아야 한다 — 그 행들은 벽에 딸려 있으므로
|
||||
// 대표 벽으로 조용히 되돌린다(강조만 꺼진다, 2026-08-29 사용자 지시).
|
||||
const target = detail()?.cross_sections.find(
|
||||
(entry) => Math.abs(entry.chainage_m - chainageM) < 0.01,
|
||||
);
|
||||
const fallback = target?.culvert ? (target.culvert.outlet ? "outlet" : "inlet") : null;
|
||||
if (!fallback || !refreshCard) {
|
||||
panel.showPipeAt(null);
|
||||
return;
|
||||
}
|
||||
withAutoAdopt(() => {
|
||||
origRevet(chainageM, fallback);
|
||||
refreshCard(chainageM);
|
||||
});
|
||||
panel.showPipeAt(ownerChainageOf(chainageM));
|
||||
syncInletStructure();
|
||||
};
|
||||
const origFord = stationControls.ford.select;
|
||||
|
||||
Reference in New Issue
Block a user