"use client"; import React, { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { WebTypeConfigPanelProps } from "@/lib/registry/types"; import { WidgetComponent, NumberTypeConfig } from "@/types/screen"; export const NumberConfigPanel: React.FC = ({ component, onUpdateComponent, onUpdateProperty, }) => { const widget = component as WidgetComponent; const config = (widget.webTypeConfig as NumberTypeConfig) || {}; // 로컬 상태 const [localConfig, setLocalConfig] = useState({ min: config.min || undefined, max: config.max || undefined, step: config.step || undefined, format: config.format || "integer", decimalPlaces: config.decimalPlaces || undefined, thousandSeparator: config.thousandSeparator || false, placeholder: config.placeholder || "", required: config.required || false, readonly: config.readonly || false, }); // 컴포넌트 변경 시 로컬 상태 동기화 useEffect(() => { const currentConfig = (widget.webTypeConfig as NumberTypeConfig) || {}; setLocalConfig({ min: currentConfig.min || undefined, max: currentConfig.max || undefined, step: currentConfig.step || undefined, format: currentConfig.format || "integer", decimalPlaces: currentConfig.decimalPlaces || undefined, thousandSeparator: currentConfig.thousandSeparator || false, placeholder: currentConfig.placeholder || "", required: currentConfig.required || false, readonly: currentConfig.readonly || false, }); }, [widget.webTypeConfig]); // 설정 업데이트 핸들러 const updateConfig = (field: keyof NumberTypeConfig, value: any) => { const newConfig = { ...localConfig, [field]: value }; setLocalConfig(newConfig); onUpdateProperty("webTypeConfig", newConfig); }; return ( 숫자 설정 숫자 입력 필드의 세부 설정을 관리합니다. {/* 기본 설정 */}

기본 설정

updateConfig("placeholder", e.target.value)} placeholder="숫자를 입력하세요" className="text-xs" />
updateConfig("min", e.target.value ? parseFloat(e.target.value) : undefined)} placeholder="0" className="text-xs" />
updateConfig("max", e.target.value ? parseFloat(e.target.value) : undefined)} placeholder="100" className="text-xs" />
updateConfig("step", e.target.value ? parseFloat(e.target.value) : undefined)} placeholder="1" min="0" step="0.01" className="text-xs" />

증가/감소 버튼 클릭 시 변경되는 값의 크기

{/* 형식 설정 */}

형식 설정

{(localConfig.format === "decimal" || localConfig.format === "currency") && (
updateConfig("decimalPlaces", e.target.value ? parseInt(e.target.value) : undefined)} placeholder="2" min="0" max="10" className="text-xs" />
)}

1,000 형태로 표시합니다.

updateConfig("thousandSeparator", checked)} />
{/* 상태 설정 */}

상태 설정

값이 입력되어야 합니다.

updateConfig("required", checked)} />

값을 수정할 수 없습니다.

updateConfig("readonly", checked)} />
{/* 미리보기 */}

미리보기

{localConfig.format === "currency" && "통화 형식으로 표시됩니다."} {localConfig.format === "percentage" && "퍼센트 형식으로 표시됩니다."} {localConfig.thousandSeparator && "천 단위 구분자가 적용됩니다."}
); }; NumberConfigPanel.displayName = "NumberConfigPanel";