'use client'; import React, { useState, useCallback } from 'react'; import { DashboardElement, ChartDataSource, ChartConfig, QueryResult } from './types'; import { QueryEditor } from './QueryEditor'; import { ChartConfigPanel } from './ChartConfigPanel'; interface ElementConfigModalProps { element: DashboardElement; isOpen: boolean; onClose: () => void; onSave: (element: DashboardElement) => void; } /** * 요소 설정 모달 컴포넌트 * - 차트/위젯 데이터 소스 설정 * - 쿼리 에디터 통합 * - 차트 설정 패널 통합 */ export function ElementConfigModal({ element, isOpen, onClose, onSave }: ElementConfigModalProps) { const [dataSource, setDataSource] = useState( element.dataSource || { type: 'database', refreshInterval: 30000 } ); const [chartConfig, setChartConfig] = useState( element.chartConfig || {} ); const [queryResult, setQueryResult] = useState(null); const [activeTab, setActiveTab] = useState<'query' | 'chart'>('query'); // 데이터 소스 변경 처리 const handleDataSourceChange = useCallback((newDataSource: ChartDataSource) => { setDataSource(newDataSource); }, []); // 차트 설정 변경 처리 const handleChartConfigChange = useCallback((newConfig: ChartConfig) => { setChartConfig(newConfig); }, []); // 쿼리 테스트 결과 처리 const handleQueryTest = useCallback((result: QueryResult) => { setQueryResult(result); // 쿼리 결과가 나오면 자동으로 차트 설정 탭으로 이동 if (result.rows.length > 0) { setActiveTab('chart'); } }, []); // 저장 처리 const handleSave = useCallback(() => { const updatedElement: DashboardElement = { ...element, dataSource, chartConfig, }; onSave(updatedElement); onClose(); }, [element, dataSource, chartConfig, onSave, onClose]); // 모달이 열려있지 않으면 렌더링하지 않음 if (!isOpen) return null; return (
{/* 모달 헤더 */}

{element.title} 설정

데이터 소스와 차트 설정을 구성하세요

{/* 탭 네비게이션 */}
{/* 탭 내용 */}
{activeTab === 'query' && ( )} {activeTab === 'chart' && ( )}
{/* 모달 푸터 */}
{dataSource.query && ( <> 💾 쿼리: {dataSource.query.length > 50 ? `${dataSource.query.substring(0, 50)}...` : dataSource.query} )}
); }