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 (