feat(D · E): 떠남 = 공용 물음 [취소 · 폐기 · 저장] · 캐시 = 등록표 · 프로젝트 = 탭 currentProjectId (PLAN 572-3 · 요구 400~403)

- D02 · D03 · E02 말없이 저장 → mountGroupStep {dirty, save, discard} 공용 물음
- D04 · E05 · E06 가드 새로 · E03 = 대표 단면 별 저장 진행 중일 때만 물음
- D02 · E02~E07 세션 직접 읽기 · 쓰기 → 등록표 d02-points · e02-ground · e03-prob · e04-settings · e05-report · e06-rock · e07-settings
- 아홉 페이지 localStorage 지금 프로젝트 직접 읽기 → currentProjectId() (다른 탭이 바꿔도 이 탭 그대로)
- test_560_4 D · E 줄 넓힘(옛 beforeLeave 단언 → dirty · save) · test_401 PENDING 에서 D · E 뺌

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 18:09:08 +09:00
co-authored by Claude Opus 5.5
parent a98533cf39
commit c3fbcb13f1
12 changed files with 220 additions and 112 deletions
+7 -4
View File
@@ -13,7 +13,7 @@
* ========================================================================== */
import "./D03_PlanAnalysis_UI_Style.css";
import { CURRENT_PROJECT_ID_KEY, ROUTES } from "@config/config_frontend";
import { ROUTES } from "@config/config_frontend";
import { attachCollapsible, createPanelCard } from "@ui/ui_template_collapsible";
import { createInputField, createSelectField } from "@ui/ui_template_input";
import { editMap } from "@ui/ui_template_kakao_map";
@@ -27,6 +27,7 @@ import {
showToast,
} from "@ui/ui_template_elements";
import { clearState, readState, writeState } from "../A00_Common/b_page_state";
import { currentProjectId } from "../A00_Common/b_project_switch";
import { mountGroupStep } from "../A00_Common/group_workflow";
import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch";
import { heightAt as gridHeightAt } from "../common_util/common_util_surface_sampler";
@@ -79,7 +80,7 @@ const errorText = (error: unknown): string =>
const station = (m: number): string => stationLabel(m, PLAN_STATION_INTERVAL_M, 1);
export async function renderD03PlanAnalysis(root: HTMLElement): Promise<void> {
const projectId = localStorage.getItem(CURRENT_PROJECT_ID_KEY) ?? "";
const projectId = currentProjectId();
let editable = false;
let start: Vertex = [0, 0];
let end: Vertex = [0, 0];
@@ -161,11 +162,13 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise<void> {
panel.className = "ui-sidebar-panel d03-plan__panel";
panel.append(terrainCard, drawCard, pieceCard, actions);
attachCollapsible(panel);
// 떠날 때(단계 아이콘 · [<] [>] · 머리 메뉴 · 뒤로) 선만 저장 · 실패면 머묾
// 떠날 때(단계 아이콘 · [<] [>] · 머리 메뉴 · 뒤로) 고친 선이 있으면 공용 물음 [취소][폐기][저장](572-3)
mountGroupStep(root, ROUTES.D03_PLAN_ANALYSIS, {
mainContent: main,
leftPanel: panel,
beforeLeave: async () => !editable || !dirty() || (await save()),
dirty: () => editable && dirty(),
save,
discard: () => clearState("d03-plan", projectId),
});
root.querySelector(".ui-workflow-layout")?.classList.add("d03-plan-layout");