"use client"; import { WidgetComponent } from "@/types/screen"; import InputWidget from "./widgets/InputWidget"; import SelectWidget from "./widgets/SelectWidget"; import TextareaWidget from "./widgets/TextareaWidget"; import { Calendar, CheckSquare, Radio, FileText, Hash, Database } from "lucide-react"; interface WidgetFactoryProps { widget: WidgetComponent; value?: string; onChange?: (value: string) => void; className?: string; } export default function WidgetFactory({ widget, value, onChange, className }: WidgetFactoryProps) { // 웹 타입에 따라 적절한 컴포넌트 렌더링 switch (widget.widgetType) { case "text": return ; case "number": return ; case "date": return (
{widget.label && ( )}
onChange?.(e.target.value)} required={widget.required} readOnly={widget.readonly} className="w-full rounded-md border border-gray-300 py-2 pr-3 pl-10 text-sm focus:border-primary focus:ring-1 focus:ring-blue-500 focus:outline-none" />
); case "code": return (
{widget.label && ( )}
onChange?.(e.target.value)} required={widget.required} readOnly={widget.readonly} className="w-full rounded-md border border-gray-300 py-2 pr-3 pl-10 font-mono text-sm focus:border-primary focus:ring-1 focus:ring-blue-500 focus:outline-none" />
); case "entity": return (
{widget.label && ( )}
onChange?.(e.target.value)} required={widget.required} readOnly={widget.readonly} className="w-full rounded-md border border-gray-300 py-2 pr-3 pl-10 text-sm focus:border-primary focus:ring-1 focus:ring-blue-500 focus:outline-none" />
); case "file": return (
{widget.label && ( )}
onChange?.(e.target.files?.[0]?.name || "")} required={widget.required} disabled={widget.readonly} className="w-full rounded-md border border-gray-300 py-2 pr-3 pl-10 text-sm file:mr-4 file:rounded-md file:border-0 file:bg-accent file:px-4 file:py-1 file:text-sm file:font-medium file:text-blue-700 hover:file:bg-primary/20 focus:border-primary focus:ring-1 focus:ring-blue-500 focus:outline-none" />
); case "select": return ; case "checkbox": return (
onChange?.(e.target.checked ? "true" : "false")} required={widget.required} disabled={widget.readonly} className="h-4 w-4 rounded border-gray-300 text-primary focus:ring-blue-500" /> {widget.label && ( )}
); case "radio": return (
{widget.label && ( )}
onChange?.(e.target.value)} required={widget.required} disabled={widget.readonly} className="h-4 w-4 border-gray-300 text-primary focus:ring-blue-500" />
onChange?.(e.target.value)} required={widget.required} disabled={widget.readonly} className="h-4 w-4 border-gray-300 text-primary focus:ring-blue-500" />
); case "textarea": return ; default: return (

지원하지 않는 위젯 타입

타입: {widget.widgetType}

); } }