feat(B 페이지): 떠남 물음 가드 · 지금 프로젝트 = 탭마다 (PLAN 572-2 · 요구 400~403)

- B04 · B07 · B08 · B09 가 공용 guardProjectLeave 에 {dirty, save, discard} 등록 — 고침 있을 때만 [취소 · 폐기 · 저장]
  - B04 = 관 지점 고침(drainageDirty) · 저장 = 관 지점 · 세부유역 영구저장
  - B07 = CAD · 탭 고침 · 저장 = saveEditedDrawings · 폐기 = 고친 도면 CAD 자동백업도 버림(discardEditedRecovery)
  - B08 = 세션 b08-* 칸 넷 · 저장 = saveShown · B09 = b09-estimation 칸 · 저장 = saveChanged
- 지금 프로젝트 직접 읽기(localStorage) → currentProjectId() · B02 새 프로젝트 = setCurrentProject — B02 · B03 · B04 · B07 · B08 · B09 · B11
- 다른 프로젝트 보관함 지우기 셋(B04 · B05 종단 · B11) 뺌 — enterProject 한 곳 · 다른 탭 보관분 안 지움
- B02 · B03 은 가드 없음 — 저장 안 한 프로젝트 값 없음(B03 올리기 끊김은 이어 올리기 배너가 받음)
- 시험 test_560_4 넓힘(B 가드 · 탭 프로젝트 · 보관함) · helper_298_2 · helper_481_2 · test_204_2 흉내를 currentProjectId 로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 18:07:58 +09:00
co-authored by Claude Opus 5.5
parent 92d952d8ac
commit 676b46eb9e
21 changed files with 154 additions and 47 deletions
@@ -54,6 +54,8 @@ export interface SurfaceMapViewer {
render: (projectId: string, routeBounds?: PlanBounds | null) => void;
/** 관 매설 지점·세부유역을 영구저장한다. 저장한 관 개수를 돌려준다(모델 확정과 함께 호출). */
commitDrainage: () => Promise<number>;
/** 관 지점을 고치고 아직 저장 안 했나(떠날 때 물음 · 572-2). */
drainageDirty: () => boolean;
dispose: () => void;
}
@@ -675,6 +677,7 @@ export function createSurfaceMapViewer(): SurfaceMapViewer {
},
/** 모델 확정과 함께 관 매설 지점·세부유역을 영구저장한다. */
commitDrainage: () => detailBasins.commit(),
drainageDirty: () => detailBasins.isDirty(),
dispose() {
loadSequence += 1;
if (frameHandle) {