"use client"; import React, { useCallback } from "react"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Plus, Trash2 } from "lucide-react"; import { ReportParamMapping, ReportViewerConfig } from "./types"; interface ReportViewerConfigPanelProps { config: ReportViewerConfig; onChange: (config: Partial) => void; } export const ReportViewerConfigPanel: React.FC = ({ config, onChange }) => { const mappings = config.paramMappings ?? []; const handleAddMapping = useCallback(() => { onChange({ paramMappings: [...mappings, { param: "", formField: "" }] }); }, [mappings, onChange]); const handleRemoveMapping = useCallback( (index: number) => { onChange({ paramMappings: mappings.filter((_, i) => i !== index) }); }, [mappings, onChange], ); const handleMappingChange = useCallback( (index: number, field: keyof ReportParamMapping, value: string) => { const updated = mappings.map((m, i) => (i === index ? { ...m, [field]: value } : m)); onChange({ paramMappings: updated }); }, [mappings, onChange], ); return (
{/* 컴포넌트 제목 */}
onChange({ title: e.target.value })} placeholder="리포트" className="h-8 text-sm" />

디자인 모드에서 표시되는 제목입니다.

{/* 파라미터 매핑 */}
{mappings.length === 0 ? (

매핑 없음 — 폼 데이터가 순서대로 자동 주입됩니다.

) : (
쿼리 파라미터 폼 데이터 필드
{mappings.map((mapping, index) => (
handleMappingChange(index, "param", e.target.value)} placeholder="예: $1" className="h-7 text-xs" /> handleMappingChange(index, "formField", e.target.value)} placeholder="예: orderId" className="h-7 text-xs" />
))}
)}

쿼리 파라미터($1, $2 또는 이름)와 현재 화면 폼 데이터 필드를 연결합니다.

{/* 안내 */}
메뉴에 연결된 리포트는 리포트 관리 페이지에서 설정합니다.
매핑이 없으면 폼 데이터가 자동으로 순서 기반 주입됩니다.
); };