diff --git a/apps/sn/src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx b/apps/sn/src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx index 1bd99d0be..8ebc6c279 100644 --- a/apps/sn/src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx +++ b/apps/sn/src/features/exmn/ui/ExmnBusinessRegisterPopupPage.tsx @@ -3,7 +3,10 @@ import LoadingOverlay from "@/components/ui/LoadingBar"; import { getStartYearArray } from "@/components/ui/YearRangeSelectBox"; import useStore from "@/store/useStore"; -import { postPopupMessage } from "@/features/windowPopup/lib/popupMessage"; +import { + postPopupMessage, + postPopupMessageAndClose, +} from "@/features/windowPopup/lib/popupMessage"; import { WINDOW_POPUP_MESSAGE_TYPE } from "@/features/windowPopup/model/types"; import { StandardFormField, @@ -319,19 +322,24 @@ export function ExmnBusinessRegisterPopupPage({ : await createExmnBusiness(request); setSavedBusiness(persisted); + const popupPayload = { + exmnBizId: persisted.exmnBizId, + }; + if (!isEditMode) { + postPopupMessageAndClose( + WINDOW_POPUP_MESSAGE_TYPE.EXMN_BUSINESS_CREATED, + popupPayload, + ); + return; + } + postPopupMessage( - isEditMode - ? WINDOW_POPUP_MESSAGE_TYPE.EXMN_BUSINESS_UPDATED - : WINDOW_POPUP_MESSAGE_TYPE.EXMN_BUSINESS_CREATED, - { - exmnBizId: persisted.exmnBizId, - }, + WINDOW_POPUP_MESSAGE_TYPE.EXMN_BUSINESS_UPDATED, + popupPayload, ); setNotice({ type: "success", - text: isEditMode - ? "사업정보를 수정했습니다. 변경된 처리분구 기준으로 양식을 다시 받을 수 있습니다." - : "사업정보와 처리분구별 기본 요약행을 저장했습니다.", + text: "사업정보를 수정했습니다. 변경된 처리분구 기준으로 양식을 다시 받을 수 있습니다.", }); } catch (error) { setNotice({ @@ -447,7 +455,7 @@ export function ExmnBusinessRegisterPopupPage({ {notice && (
-
+

사업대상 처리분구

diff --git a/apps/sn/src/features/exmn/ui/ExmnRegistrationPage.tsx b/apps/sn/src/features/exmn/ui/ExmnRegistrationPage.tsx index 707fe0bc4..5e30fe15f 100644 --- a/apps/sn/src/features/exmn/ui/ExmnRegistrationPage.tsx +++ b/apps/sn/src/features/exmn/ui/ExmnRegistrationPage.tsx @@ -98,6 +98,8 @@ export function ExmnRegistrationPage() { const [selectedBusinessId, setSelectedBusinessId] = useState( null, ); + // 목록 행을 선택한 뒤 스크롤과 키보드 포커스를 함께 이동할 상세현황 영역이다. + const detailPanelRef = useRef(null); const [isLoading, setIsLoading] = useState(false); const [notice, setNotice] = useState(null); @@ -122,6 +124,17 @@ export function ExmnRegistrationPage() { [businesses, selectedBusinessId], ); + /** 목록 행 선택 후 렌더링된 상세현황을 화면 상단으로 이동하고 포커스를 부여한다. */ + const handleBusinessRowClick = (business: ExmnBusiness) => { + setSelectedBusinessId(business.exmnBizId); + window.requestAnimationFrame(() => { + const detailPanel = detailPanelRef.current; + if (!detailPanel) return; + detailPanel.scrollIntoView({ behavior: "smooth", block: "start" }); + detailPanel.focus({ preventScroll: true }); + }); + }; + /** 사업 목록의 숫자·행정구역·사업보고서 파일명을 표시 전용 값으로 변환한다. */ const businessRows = useMemo( () => @@ -598,7 +611,7 @@ export function ExmnRegistrationPage() { className={EXMN_TABLE_HEADER_CLASS} scrollMode="horizontal" minTableWidth="110rem" - onRowClick={(row) => setSelectedBusinessId(row.exmnBizId)} + onRowClick={handleBusinessRowClick} actions={ <>
- +
+ +
); } diff --git a/apps/sn/src/features/exmn/ui/ExmnResultRegisterPopupPage.tsx b/apps/sn/src/features/exmn/ui/ExmnResultRegisterPopupPage.tsx index e5475141f..ebeb67947 100644 --- a/apps/sn/src/features/exmn/ui/ExmnResultRegisterPopupPage.tsx +++ b/apps/sn/src/features/exmn/ui/ExmnResultRegisterPopupPage.tsx @@ -432,7 +432,7 @@ export function ExmnResultRegisterPopupPage({ {notice && notice.type !== "success" && (
-
+
0 && (
diff --git a/packages/common/business_components/src/ui/standard_form/index.tsx b/packages/common/business_components/src/ui/standard_form/index.tsx index 1b5f21614..eba028b18 100644 --- a/packages/common/business_components/src/ui/standard_form/index.tsx +++ b/packages/common/business_components/src/ui/standard_form/index.tsx @@ -53,7 +53,7 @@ function StandardFormSection({ }: StandardFormSectionProps) { return (

{title}