"use client"; import React from "react"; import { CustomMetricConfig, QueryResult } from "../types"; import { Label } from "@/components/ui/label"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { AlertCircle, Plus, X } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; interface CustomMetricSectionProps { queryResult: QueryResult | null; config: CustomMetricConfig; onConfigChange: (updates: Partial) => void; } /** * 통계 카드 설정 섹션 * - 쿼리 결과를 받아서 어떻게 통계를 낼지 설정 * - 컬럼 선택, 계산 방식(합계/평균/개수 등), 표시 방식 * - 필터 조건 추가 가능 */ export function CustomMetricSection({ queryResult, config, onConfigChange }: CustomMetricSectionProps) { console.log("⚙️ [CustomMetricSection] 렌더링:", { config, queryResult }); // 초기값 설정 (aggregation이 없으면 기본값 "sum" 설정) React.useEffect(() => { if (queryResult && queryResult.columns && queryResult.columns.length > 0 && !config.aggregation) { console.log("🔧 기본 aggregation 설정: sum"); onConfigChange({ aggregation: "sum" }); } }, [queryResult, config.aggregation, onConfigChange]); // 쿼리 결과가 없으면 안내 메시지 if (!queryResult || !queryResult.columns || queryResult.columns.length === 0) { return (
먼저 데이터 소스 탭에서 쿼리를 실행하고 결과를 확인해주세요.
); } // 필터 추가 const addFilter = () => { const newFilters = [ ...(config.filters || []), { column: queryResult.columns[0] || "", operator: "=" as const, value: "" }, ]; onConfigChange({ filters: newFilters }); }; // 필터 제거 const removeFilter = (index: number) => { const newFilters = [...(config.filters || [])]; newFilters.splice(index, 1); onConfigChange({ filters: newFilters }); }; // 필터 업데이트 const updateFilter = (index: number, field: string, value: string) => { const newFilters = [...(config.filters || [])]; newFilters[index] = { ...newFilters[index], [field]: value }; onConfigChange({ filters: newFilters }); }; // 통계 설정 return (

쿼리 결과를 바탕으로 통계를 계산하고 표시합니다

{/* 1. 필터 조건 (선택사항) */}
{config.filters && config.filters.length > 0 ? (
{config.filters.map((filter, index) => (
{/* 첫 번째 줄: 컬럼 선택 */}
{/* 삭제 버튼 */}
{/* 두 번째 줄: 연산자 선택 */} {/* 세 번째 줄: 값 입력 */} updateFilter(index, "value", e.target.value)} placeholder="값을 입력하세요" className="h-9 w-full text-sm" />
))}
) : (

필터 없음 (전체 데이터 사용)

)}
{/* 2. 계산할 컬럼 선택 */}
{/* 3. 계산 방식 선택 */}
{/* 4. 카드 제목 */}
onConfigChange({ title: e.target.value })} placeholder="예: 총 매출액" className="h-9 text-xs" />
{/* 5. 표시 단위 (선택사항) */}
onConfigChange({ unit: e.target.value })} placeholder="예: 원, 건, %" className="h-9 text-xs" />
{/* 6. 소수점 자릿수 */}

표시할 소수점 자릿수 (평균, 비율 등에 유용)

{/* 7. 자동 새로고침 간격 */}

통계 데이터를 자동으로 갱신하는 주기

{/* 미리보기 */} {config.valueColumn && config.aggregation && (

설정 미리보기

{/* 필터 조건 표시 */} {config.filters && config.filters.length > 0 && (

필터:

{config.filters.map((filter, idx) => (

· {filter.column} {filter.operator} "{filter.value}"

))}
)} {/* 계산 표시 */}

{config.title || "통계 제목"}: {config.aggregation?.toUpperCase()}({config.valueColumn}) {config.unit ? ` ${config.unit}` : ""}

)}
); }