"use client"; import React, { useState, useEffect } from "react"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Plus, X } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; interface TableSearchWidgetConfigPanelProps { component?: any; // 레거시 지원 config?: any; // 새 인터페이스 onUpdateProperty?: (property: string, value: any) => void; // 레거시 지원 onChange?: (newConfig: any) => void; // 새 인터페이스 tables?: any[]; // 화면의 테이블 정보 } interface PresetFilter { id: string; columnName: string; columnLabel: string; filterType: "text" | "number" | "date" | "select"; width?: number; } export function TableSearchWidgetConfigPanel({ component, config, onUpdateProperty, onChange, tables = [], }: TableSearchWidgetConfigPanelProps) { // 레거시와 새 인터페이스 모두 지원 const currentConfig = config || component?.componentConfig || {}; const updateConfig = onChange || ((key: string, value: any) => { if (onUpdateProperty) { onUpdateProperty(`componentConfig.${key}`, value); } }); // 첫 번째 테이블의 컬럼 목록 가져오기 const availableColumns = tables.length > 0 && tables[0].columns ? tables[0].columns : []; // inputType에서 filterType 추출 헬퍼 함수 const getFilterTypeFromInputType = (inputType: string): "text" | "number" | "date" | "select" => { if (inputType.includes("number") || inputType.includes("decimal") || inputType.includes("integer")) { return "number"; } if (inputType.includes("date") || inputType.includes("time")) { return "date"; } if (inputType.includes("select") || inputType.includes("dropdown") || inputType.includes("code") || inputType.includes("category")) { return "select"; } return "text"; }; const [localAutoSelect, setLocalAutoSelect] = useState( currentConfig.autoSelectFirstTable ?? true ); const [localShowSelector, setLocalShowSelector] = useState( currentConfig.showTableSelector ?? true ); const [localFilterMode, setLocalFilterMode] = useState<"dynamic" | "preset">( currentConfig.filterMode ?? "dynamic" ); const [localPresetFilters, setLocalPresetFilters] = useState( currentConfig.presetFilters ?? [] ); useEffect(() => { setLocalAutoSelect(currentConfig.autoSelectFirstTable ?? true); setLocalShowSelector(currentConfig.showTableSelector ?? true); setLocalFilterMode(currentConfig.filterMode ?? "dynamic"); setLocalPresetFilters(currentConfig.presetFilters ?? []); }, [currentConfig]); // 설정 업데이트 헬퍼 const handleUpdate = (key: string, value: any) => { if (onChange) { // 새 인터페이스: 전체 config 업데이트 onChange({ ...currentConfig, [key]: value }); } else if (onUpdateProperty) { // 레거시: 개별 속성 업데이트 onUpdateProperty(`componentConfig.${key}`, value); } }; // 필터 추가 const addFilter = () => { const newFilter: PresetFilter = { id: `filter_${Date.now()}`, columnName: "", columnLabel: "", filterType: "text", width: 200, }; const updatedFilters = [...localPresetFilters, newFilter]; setLocalPresetFilters(updatedFilters); handleUpdate("presetFilters", updatedFilters); }; // 필터 삭제 const removeFilter = (id: string) => { const updatedFilters = localPresetFilters.filter((f) => f.id !== id); setLocalPresetFilters(updatedFilters); handleUpdate("presetFilters", updatedFilters); }; // 필터 업데이트 const updateFilter = (id: string, field: keyof PresetFilter, value: any) => { const updatedFilters = localPresetFilters.map((f) => f.id === id ? { ...f, [field]: value } : f ); setLocalPresetFilters(updatedFilters); handleUpdate("presetFilters", updatedFilters); }; return (

검색 필터 위젯 설정

이 위젯은 화면 내의 테이블들을 자동으로 감지하여 검색, 필터, 그룹 기능을 제공합니다.

{/* 첫 번째 테이블 자동 선택 */}
{ setLocalAutoSelect(checked as boolean); handleUpdate("autoSelectFirstTable", checked); }} />
{/* 테이블 선택 드롭다운 표시 */}
{ setLocalShowSelector(checked as boolean); handleUpdate("showTableSelector", checked); }} />
{/* 필터 모드 선택 */}
{ setLocalFilterMode(value); handleUpdate("filterMode", value); }} >
{/* 고정 모드일 때만 필터 설정 UI 표시 */} {localFilterMode === "preset" && (
{localPresetFilters.length === 0 ? (
필터가 없습니다. 필터 추가 버튼을 클릭하세요.
) : (
{localPresetFilters.map((filter) => (
{/* 컬럼 선택 */}
{availableColumns.length > 0 ? ( ) : ( updateFilter(filter.id, "columnName", e.target.value)} placeholder="예: customer_name" className="h-7 text-xs" /> )} {filter.columnLabel && (

표시명: {filter.columnLabel}

)}
{/* 필터 타입 */}
{/* 너비 */}
updateFilter(filter.id, "width", parseInt(e.target.value))} placeholder="200" className="h-7 text-xs" min={100} max={500} />
))}
)}
)}

참고사항:

  • 테이블 리스트, 분할 패널, 플로우 위젯이 자동 감지됩니다
  • 여러 테이블이 있으면 드롭다운에서 선택할 수 있습니다
  • {localFilterMode === "dynamic" ? (
  • 사용자가 필터 설정 버튼을 클릭하여 원하는 필터를 선택합니다
  • ) : (
  • 고정 모드에서는 설정 버튼이 숨겨지고 지정된 필터만 표시됩니다
  • )}
); }