diff --git a/frontend/components/common/ScreenModal.tsx b/frontend/components/common/ScreenModal.tsx index 609c2b43..4bbb913e 100644 --- a/frontend/components/common/ScreenModal.tsx +++ b/frontend/components/common/ScreenModal.tsx @@ -414,6 +414,11 @@ export const ScreenModal: React.FC = ({ className }) => { return newFormData; }); }} + onRefresh={() => { + // 부모 화면의 테이블 새로고침 이벤트 발송 + console.log("🔄 모달에서 부모 화면 테이블 새로고침 이벤트 발송"); + window.dispatchEvent(new CustomEvent("refreshTable")); + }} screenInfo={{ id: modalState.screenId!, tableName: screenData.screenInfo?.tableName, diff --git a/frontend/components/screen/InteractiveScreenViewerDynamic.tsx b/frontend/components/screen/InteractiveScreenViewerDynamic.tsx index 639ffa0a..a2ab1522 100644 --- a/frontend/components/screen/InteractiveScreenViewerDynamic.tsx +++ b/frontend/components/screen/InteractiveScreenViewerDynamic.tsx @@ -40,6 +40,8 @@ interface InteractiveScreenViewerProps { tableName?: string; }; onSave?: () => Promise; + onRefresh?: () => void; + onFlowRefresh?: () => void; } export const InteractiveScreenViewerDynamic: React.FC = ({ @@ -50,6 +52,8 @@ export const InteractiveScreenViewerDynamic: React.FC { const { isPreviewMode } = useScreenPreview(); // 프리뷰 모드 확인 const { userName, user } = useAuth(); @@ -324,9 +328,11 @@ export const InteractiveScreenViewerDynamic: React.FC { - // 테이블 컴포넌트는 자체적으로 loadData 호출 - }} + onRefresh={onRefresh || (() => { + // 부모로부터 전달받은 onRefresh 또는 기본 동작 + console.log("🔄 InteractiveScreenViewerDynamic onRefresh 호출"); + })} + onFlowRefresh={onFlowRefresh} onClose={() => { // buttonActions.ts가 이미 처리함 }} diff --git a/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx b/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx index ced60e9e..955bae86 100644 --- a/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx +++ b/frontend/lib/registry/components/split-panel-layout/SplitPanelLayoutComponent.tsx @@ -962,6 +962,26 @@ export const SplitPanelLayoutComponent: React.FC // eslint-disable-next-line react-hooks/exhaustive-deps }, [leftFilters]); + // 🆕 전역 테이블 새로고침 이벤트 리스너 + useEffect(() => { + const handleRefreshTable = () => { + if (!isDesignMode) { + console.log("🔄 [SplitPanel] refreshTable 이벤트 수신 - 데이터 새로고침"); + loadLeftData(); + // 선택된 항목이 있으면 우측 패널도 새로고침 + if (selectedLeftItem) { + loadRightData(selectedLeftItem); + } + } + }; + + window.addEventListener("refreshTable", handleRefreshTable); + + return () => { + window.removeEventListener("refreshTable", handleRefreshTable); + }; + }, [isDesignMode, loadLeftData, loadRightData, selectedLeftItem]); + // 리사이저 드래그 핸들러 const handleMouseDown = (e: React.MouseEvent) => { if (!resizable) return; diff --git a/frontend/lib/registry/components/table-list/TableListComponent.tsx b/frontend/lib/registry/components/table-list/TableListComponent.tsx index 16734059..8b397881 100644 --- a/frontend/lib/registry/components/table-list/TableListComponent.tsx +++ b/frontend/lib/registry/components/table-list/TableListComponent.tsx @@ -1766,6 +1766,22 @@ export const TableListComponent: React.FC = ({ } }, [tableConfig.refreshInterval, isDesignMode]); + // 🆕 전역 테이블 새로고침 이벤트 리스너 + useEffect(() => { + const handleRefreshTable = () => { + if (tableConfig.selectedTable && !isDesignMode) { + console.log("🔄 [TableList] refreshTable 이벤트 수신 - 데이터 새로고침"); + setRefreshTrigger((prev) => prev + 1); + } + }; + + window.addEventListener("refreshTable", handleRefreshTable); + + return () => { + window.removeEventListener("refreshTable", handleRefreshTable); + }; + }, [tableConfig.selectedTable, isDesignMode]); + // 초기 컬럼 너비 측정 (한 번만) useEffect(() => { if (!hasInitializedWidths.current && visibleColumns.length > 0) {