"use client"; import React, { useState, useCallback } from "react"; import { DashboardElement, ChartDataSource, ChartConfig, QueryResult, ClockConfig } from "./types"; import { QueryEditor } from "./QueryEditor"; import { ChartConfigPanel } from "./ChartConfigPanel"; import { ClockConfigModal } from "./widgets/ClockConfigModal"; 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]); // 시계 위젯 설정 저장 const handleClockConfigSave = useCallback( (clockConfig: ClockConfig) => { const updatedElement: DashboardElement = { ...element, clockConfig, }; onSave(updatedElement); }, [element, onSave], ); // 모달이 열려있지 않으면 렌더링하지 않음 if (!isOpen) return null; // 시계 위젯은 자체 설정 UI를 가지고 있으므로 모달 표시하지 않음 if (element.type === "widget" && element.subtype === "clock") { return null; } // 이전 코드 호환성 유지 (아래 주석 처리된 코드는 제거 예정) if (false && element.type === "widget" && element.subtype === "clock") { return ( ); } return (
{/* 모달 헤더 */}

{element.title} 설정

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

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