From d062b8a7d45db241b4ee2e05ec2d533e28e92264 Mon Sep 17 00:00:00 2001 From: kiminchan Date: Wed, 15 Jul 2026 11:34:06 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A7=80=EB=B0=98=EC=B9=A8=ED=95=98=20?= =?UTF-8?q?=EC=97=B0=EA=B3=84=20=EA=B4=80=EB=A1=9C=20=ED=83=AD=EC=9D=98=20?= =?UTF-8?q?=EB=B6=80=EB=AA=A8=20=EC=A2=85=EC=86=8D=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/sn/app/(map-layout)/map/page.tsx | 58 +++++++------------ .../001-qa-SFR-010-010-지반침하정보-통합검증계획.md | 12 ++++ .../002-qa-SFR-010-010-지반침하정보-통합검증결과.md | 12 ++++ .../001-fe-SFR-010-010-지반침하정보-작업카드.md | 9 +++ .../001-fe-SFR-010-010-지반침하정보-통합구현기록.md | 9 +++ 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/apps/sn/app/(map-layout)/map/page.tsx b/apps/sn/app/(map-layout)/map/page.tsx index 845ea1102..82de8a7e4 100644 --- a/apps/sn/app/(map-layout)/map/page.tsx +++ b/apps/sn/app/(map-layout)/map/page.tsx @@ -170,7 +170,8 @@ const WATER_RISK_GRID_LAYER_ID = "SN_WATER_RISK_GRID"; const WATER_RISK_PIPE_LAYER_ID = "SN_WATER_RISK_PIPE"; const FLOOD_HISTORY_SELECTION_PADDING: [number, number, number, number] = [100, 380, 120, 120]; const RIGHT_PANEL_TAB_LIMIT = 5; -const RIGHT_PANEL_PIPE_TAB_ID = "feature:tb_ms_swage_ppl:singleton"; +// Only pipes opened from sinkhole details share one slot within the parent-return flow. +const RIGHT_PANEL_SINKHOLE_PIPE_TAB_ID = "feature:tb_ms_swage_ppl:sinkhole-singleton"; type RightPanelTabKind = "feature" | "sinkhole" | "gisEdit"; type RightPanelTabCategory = @@ -237,34 +238,20 @@ const RIGHT_PANEL_TAB_STYLE_BY_CATEGORY: Record< }, }; -// 탭 제한을 넘으면 새 탭과 현재 탭을 보존하고 오래된 일반 상세부터 정리한다. +// 공용 우측 탭은 유형과 활성 상태에 관계없이 먼저 열린 탭부터 제거한다. const findRightPanelTabOverflowCandidate = ( tabs: RightPanelTab[], nextTabId: string, - activeTabId: string | null, ) => { - const protectedTabIds = new Set([nextTabId, activeTabId].filter(Boolean) as string[]); - [nextTabId, activeTabId].forEach((tabId) => { - const pipeTab = tabs.find((tab) => tab.id === tabId && tab.category === "pipe"); - const parentTabId = pipeTab?.parentTabId; - if (parentTabId && tabs.some((tab) => tab.id === parentTabId)) { - protectedTabIds.add(parentTabId); - } - }); - - const removableTabs = tabs - .filter((tab) => !protectedTabIds.has(tab.id)) - .sort((a, b) => a.lastActiveAt - b.lastActiveAt); - - return ( - removableTabs.find((tab) => tab.kind === "feature") ?? - removableTabs.find((tab) => tab.kind !== "gisEdit") ?? - removableTabs[0] ?? - tabs.filter((tab) => tab.id !== nextTabId).sort((a, b) => a.lastActiveAt - b.lastActiveAt)[0] ?? - null - ); + return tabs.find((tab) => tab.id !== nextTabId) ?? null; }; +// 부모 지반침하가 제거되면 그 부모에서 열린 연계 관로도 같은 탭 그룹으로 제거한다. +const removeRightPanelTabGroup = (tabs: RightPanelTab[], removedTabId: string) => + tabs.filter( + (tab) => tab.id !== removedTabId && tab.parentTabId !== removedTabId, + ); + // 오른쪽 상세 패널에 상세가 2개 이상 쌓였을 때만 책갈피형 전환 버튼을 보여준다. const RightPanelBookmarkTabs = ({ tabs, @@ -291,7 +278,7 @@ const RightPanelBookmarkTabs = ({ isActive ? style.active : style.inactive, ].join(" ")} > - {tab.category === "pipe" && isActive && parentTab ? ( + {tab.category === "pipe" && parentTab ? (