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 ? (