refactor: simplify node editor page and update admin page registry
- Removed the redirect logic from the NodeEditorPage, now directly rendering the DataFlowPage component. - Updated the AdminPageRenderer to correctly register the new node editor page and adjust the cascading management imports for consistency. - Enhanced the dynamic import logic to streamline page loading and improve performance. Made-with: Cursor
This commit is contained in:
parent
09c3fa4708
commit
5c6469c75c
|
|
@ -1,24 +1,7 @@
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
/**
|
import DataFlowPage from "../page";
|
||||||
* 제어 시스템 페이지 (리다이렉트)
|
|
||||||
* 이 페이지는 /admin/dataflow로 리다이렉트됩니다.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { useEffect } from "react";
|
|
||||||
import { useRouter } from "next/navigation";
|
|
||||||
|
|
||||||
export default function NodeEditorPage() {
|
export default function NodeEditorPage() {
|
||||||
const router = useRouter();
|
return <DataFlowPage />;
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// /admin/dataflow 메인 페이지로 리다이렉트
|
|
||||||
router.replace("/admin/systemMng/dataflow");
|
|
||||||
}, [router]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="flex h-screen items-center justify-center bg-muted">
|
|
||||||
<div className="text-muted-foreground">제어 관리 페이지로 이동중...</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,9 @@ const ADMIN_PAGE_REGISTRY: Record<string, React.ComponentType<any>> = {
|
||||||
"/admin/systemMng/tableMngList": dynamic(() => import("@/app/(main)/admin/systemMng/tableMngList/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/systemMng/tableMngList": dynamic(() => import("@/app/(main)/admin/systemMng/tableMngList/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/systemMng/i18nList": dynamic(() => import("@/app/(main)/admin/systemMng/i18nList/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/systemMng/i18nList": dynamic(() => import("@/app/(main)/admin/systemMng/i18nList/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/systemMng/collection-managementList": dynamic(() => import("@/app/(main)/admin/systemMng/collection-managementList/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/systemMng/collection-managementList": dynamic(() => import("@/app/(main)/admin/systemMng/collection-managementList/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
|
"/admin/systemMng/cascading-managementList": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/systemMng/dataflow": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/systemMng/dataflow": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
|
"/admin/systemMng/dataflow/node-editorList": dynamic(() => import("@/app/(main)/admin/systemMng/dataflow/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
|
|
||||||
// 자동화 관리
|
// 자동화 관리
|
||||||
"/admin/automaticMng/flowMgmtList": dynamic(() => import("@/app/(main)/admin/automaticMng/flowMgmtList/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/automaticMng/flowMgmtList": dynamic(() => import("@/app/(main)/admin/automaticMng/flowMgmtList/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
|
|
@ -117,13 +119,13 @@ const ADMIN_PAGE_REGISTRY: Record<string, React.ComponentType<any>> = {
|
||||||
|
|
||||||
// 기타
|
// 기타
|
||||||
"/admin/cascading-management": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/cascading-management": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/cascading-relations": dynamic(() => import("@/app/(main)/admin/cascading-relations/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/cascading-relations": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/layouts": dynamic(() => import("@/app/(main)/admin/layouts/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/layouts": dynamic(() => import("@/app/(main)/admin/layouts/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/templates": dynamic(() => import("@/app/(main)/admin/templates/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/templates": dynamic(() => import("@/app/(main)/admin/templates/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/monitoring": dynamic(() => import("@/app/(main)/admin/monitoring/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/monitoring": dynamic(() => import("@/app/(main)/admin/monitoring/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/standards": dynamic(() => import("@/app/(main)/admin/standards/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/standards": dynamic(() => import("@/app/(main)/admin/standards/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/flow-external-db": dynamic(() => import("@/app/(main)/admin/flow-external-db/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/flow-external-db": dynamic(() => import("@/app/(main)/admin/flow-external-db/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
"/admin/auto-fill": dynamic(() => import("@/app/(main)/admin/auto-fill/page"), { ssr: false, loading: LoadingFallback }),
|
"/admin/auto-fill": dynamic(() => import("@/app/(main)/admin/cascading-management/page"), { ssr: false, loading: LoadingFallback }),
|
||||||
};
|
};
|
||||||
|
|
||||||
const DYNAMIC_ADMIN_IMPORTS: Record<string, () => Promise<any>> = {
|
const DYNAMIC_ADMIN_IMPORTS: Record<string, () => Promise<any>> = {
|
||||||
|
|
@ -135,7 +137,7 @@ const DYNAMIC_ADMIN_IMPORTS: Record<string, () => Promise<any>> = {
|
||||||
"/admin/aiAssistant/chat": () => import("@/app/(main)/admin/aiAssistant/chat/page"),
|
"/admin/aiAssistant/chat": () => import("@/app/(main)/admin/aiAssistant/chat/page"),
|
||||||
"/admin/screenMng/barcodeList": () => import("@/app/(main)/admin/screenMng/barcodeList/page"),
|
"/admin/screenMng/barcodeList": () => import("@/app/(main)/admin/screenMng/barcodeList/page"),
|
||||||
"/admin/automaticMng/batchmngList/create": () => import("@/app/(main)/admin/automaticMng/batchmngList/create/page"),
|
"/admin/automaticMng/batchmngList/create": () => import("@/app/(main)/admin/automaticMng/batchmngList/create/page"),
|
||||||
"/admin/systemMng/dataflow/node-editorList": () => import("@/app/(main)/admin/systemMng/dataflow/node-editorList/page"),
|
"/admin/systemMng/dataflow/node-editorList": () => import("@/app/(main)/admin/systemMng/dataflow/page"),
|
||||||
"/admin/standards/new": () => import("@/app/(main)/admin/standards/new/page"),
|
"/admin/standards/new": () => import("@/app/(main)/admin/standards/new/page"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -201,25 +203,52 @@ function DynamicAdminLoader({ url, params }: { url: string; params?: Record<stri
|
||||||
const [failed, setFailed] = useState(false);
|
const [failed, setFailed] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
let cancelled = false;
|
||||||
|
|
||||||
|
const tryLoad = async () => {
|
||||||
|
// 1) 정적 import 목록
|
||||||
const staticImport = DYNAMIC_ADMIN_IMPORTS[url];
|
const staticImport = DYNAMIC_ADMIN_IMPORTS[url];
|
||||||
if (staticImport) {
|
if (staticImport) {
|
||||||
staticImport()
|
try {
|
||||||
.then((mod) => setComponent(() => mod.default))
|
const mod = await staticImport();
|
||||||
.catch(() => setFailed(true));
|
if (!cancelled) setComponent(() => mod.default);
|
||||||
|
} catch {
|
||||||
|
if (!cancelled) setFailed(true);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const { pattern, getImport, extractParams } of DYNAMIC_ADMIN_PATTERNS) {
|
// 2) 동적 라우트 패턴 매칭
|
||||||
|
for (const { pattern, getImport } of DYNAMIC_ADMIN_PATTERNS) {
|
||||||
const match = url.match(pattern);
|
const match = url.match(pattern);
|
||||||
if (match) {
|
if (match) {
|
||||||
getImport()
|
try {
|
||||||
.then((mod) => setComponent(() => mod.default))
|
const mod = await getImport();
|
||||||
.catch(() => setFailed(true));
|
if (!cancelled) setComponent(() => mod.default);
|
||||||
|
} catch {
|
||||||
|
if (!cancelled) setFailed(true);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setFailed(true);
|
// 3) URL 경로 기반 자동 import 시도
|
||||||
|
const pagePath = url.replace(/^\//, "");
|
||||||
|
try {
|
||||||
|
const mod = await import(
|
||||||
|
/* webpackMode: "lazy" */
|
||||||
|
/* webpackInclude: /\/page\.tsx$/ */
|
||||||
|
`@/app/(main)/${pagePath}/page`
|
||||||
|
);
|
||||||
|
if (!cancelled) setComponent(() => mod.default);
|
||||||
|
} catch {
|
||||||
|
console.warn("[DynamicAdminLoader] 자동 import 실패:", url);
|
||||||
|
if (!cancelled) setFailed(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tryLoad();
|
||||||
|
return () => { cancelled = true; };
|
||||||
}, [url]);
|
}, [url]);
|
||||||
|
|
||||||
if (failed) return <AdminPageFallback url={url} />;
|
if (failed) return <AdminPageFallback url={url} />;
|
||||||
|
|
@ -291,12 +320,7 @@ export function AdminPageRenderer({ url }: AdminPageRendererProps) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 정적 동적 import 목록에 있으면
|
// 레지스트리/패턴에 없으면 DynamicAdminLoader가 자동 import 시도
|
||||||
if (DYNAMIC_ADMIN_IMPORTS[cleanUrl]) {
|
console.log("[AdminPageRenderer] → 자동 import 시도:", cleanUrl);
|
||||||
console.log("[AdminPageRenderer] → 동적 import:", cleanUrl);
|
|
||||||
return <DynamicAdminLoader url={cleanUrl} />;
|
return <DynamicAdminLoader url={cleanUrl} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.error("[AdminPageRenderer] 미등록 URL:", cleanUrl);
|
|
||||||
return <AdminPageFallback url={url} />;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue