From 1bb7a2c95729dde266aab6275273157fd0c26704 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 27 Oct 2026 20:18:43 +0900 Subject: [PATCH] =?UTF-8?q?feat(563-1):=20D03=20=EB=96=A0=EB=82=A0=20?= =?UTF-8?q?=EB=95=8C=20=EC=84=A0=EB=A7=8C=20=EC=A0=80=EC=9E=A5(beforeLeave?= =?UTF-8?q?)=20=C2=B7=20=EC=8B=9C=EC=A0=90=20=C2=B7=20=EC=A2=85=EC=A0=90?= =?UTF-8?q?=EC=9D=80=20network=20=EC=9D=91=EB=8B=B5=20base=20=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 단계 아이콘 · [<] [>] · 머리 메뉴 · 뒤로 = 고친 선이 있으면 PUT plan/network 뒤 이동 · 실패면 머묾 - D02 points 따로 부르지 않음(562-2 GET network 의 base · year_start) Co-Authored-By: Claude Opus 5.5 --- D03_PlanAnalysis/D03_PlanAnalysis_Api.ts | 9 ++++----- D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts | 13 +++++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_Api.ts b/D03_PlanAnalysis/D03_PlanAnalysis_Api.ts index ea2362e4e..b8923ff97 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_Api.ts +++ b/D03_PlanAnalysis/D03_PlanAnalysis_Api.ts @@ -1,7 +1,7 @@ /* ============================================================================= * D03_PlanAnalysis_Api.ts - * D03 분석 화면 서버 요청(PLAN 563-1) — 전체 시점 · 종점(D02 정본) · 지형 받기 범위 · 받기 · 진행 · - * 사업 전체 지형면 한 벌(`models_plan/` · 격자) · 그은 선 정본(562-2 GET · PUT network). + * D03 분석 화면 서버 요청(PLAN 563-1) — 지형 받기 범위 · 받기 · 진행 · + * 사업 전체 지형면 한 벌(`models_plan/` · 격자) · 그은 선 정본(562-2 GET · PUT network · 응답에 D02 시점 · 종점). * ========================================================================== */ import { API_BASE_URL } from "@config/config_frontend"; @@ -53,6 +53,8 @@ export interface ServerNetwork { } export interface PlanNetworkView { + /** D02 정본 전체 시점 · 종점. */ + base: PlanBaseView; network: ServerNetwork | null; derived: { lines: Array<{ id: string; length_m: number; stations: number[] }>; @@ -85,9 +87,6 @@ async function request(path: string, init: RequestInit = {}): Promise { const base = (projectId: string): string => `/projects/${projectId}/plan`; -export const fetchPlanBase = (projectId: string): Promise => - request(`${base(projectId)}/points`); - /** 받기 전 범위 — `extra` = 더 덮을 점(그은 꺾임점). */ export const fetchTerrainExtent = ( projectId: string, diff --git a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts index e30c8fc41..56b090ffd 100644 --- a/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts +++ b/D03_PlanAnalysis/D03_PlanAnalysis_UI_Page.ts @@ -39,7 +39,6 @@ import { prepareLayer } from "../B04_PreProcess/logic/B04_PreProcess_UI_MapRende import { heightAt as gridHeightAt } from "../common_util/common_util_surface_sampler"; import { stationLabel } from "../common_util/common_util_station"; import { - fetchPlanBase, fetchPlanNetwork, fetchPlanProgress, fetchPlanSurface, @@ -164,7 +163,12 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { panel.className = "ui-sidebar-panel d03-plan__panel"; panel.append(terrainCard, drawCard, pieceCard, actions); attachCollapsible(panel); - mountGroupStep(root, ROUTES.D03_PLAN_ANALYSIS, { mainContent: main, leftPanel: panel }); + // 떠날 때(단계 아이콘 · [<] [>] · 머리 메뉴 · 뒤로) 선만 저장 · 실패면 머묾 + mountGroupStep(root, ROUTES.D03_PLAN_ANALYSIS, { + mainContent: main, + leftPanel: panel, + beforeLeave: async () => !editable || !dirty() || (await save()), + }); root.querySelector(".ui-workflow-layout")?.classList.add("d03-plan-layout"); const allVertices = (): Vertex[] => network.lines.flatMap((line) => line.vertices); @@ -558,7 +562,8 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { try { editable = !!(await fetchSessionUser())?.is_forest_service; draw.setEditable(editable); - const base = await fetchPlanBase(projectId); + const view = await fetchPlanNetwork(projectId); + const base = view.base; if (!base.start || !base.end || !base.epsg) { terrainText.textContent = "시점 · 종점이 비었습니다 — 1단계(기준 지정)에서 정하세요."; return; @@ -566,7 +571,7 @@ export async function renderD03PlanAnalysis(root: HTMLElement): Promise { start = [base.start.x, base.start.y]; end = [base.end.x, base.end.y]; epsg = base.epsg; - takeServer(await fetchPlanNetwork(projectId)); + takeServer(view); const draft = readState("d03-plan", projectId); if (draft?.version === DRAFT_VERSION && draft.network?.lines?.length) network = draft.network; map.update({ fit: [start, end, ...allVertices()] });