"use client"; import React, { useMemo, useCallback } from "react"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Separator } from "@/components/ui/separator"; import { FileUploadConfig } from "./types"; import { V2FileUploadDefaultConfig } from "./config"; export interface FileUploadConfigPanelProps { config: FileUploadConfig; onChange: (config: Partial) => void; screenTableName?: string; } /** * V2 FileUpload 설정 패널 * 컴포넌트의 설정값들을 편집할 수 있는 UI 제공 */ export const FileUploadConfigPanel: React.FC = ({ config: propConfig, onChange, screenTableName, }) => { // config 안전하게 초기화 (useMemo) const config = useMemo(() => ({ ...V2FileUploadDefaultConfig, ...propConfig, }), [propConfig]); // 핸들러 const handleChange = useCallback(( key: K, value: FileUploadConfig[K] ) => { onChange({ [key]: value }); }, [onChange]); // 파일 크기를 MB 단위로 변환 const maxSizeMB = useMemo(() => { return (config.maxSize || 10 * 1024 * 1024) / (1024 * 1024); }, [config.maxSize]); const handleMaxSizeChange = useCallback((value: string) => { const mb = parseFloat(value) || 10; handleChange("maxSize", mb * 1024 * 1024); }, [handleChange]); return (
V2 파일 업로드 설정
{/* 기본 설정 */}
handleChange("placeholder", e.target.value)} placeholder="파일을 선택하세요" className="h-8 text-xs" />
handleMaxSizeChange(e.target.value)} className="h-8 text-xs" />
handleChange("maxFiles", parseInt(e.target.value) || 10)} className="h-8 text-xs" />
{/* 동작 설정 */}
handleChange("multiple", checked as boolean)} />
handleChange("allowDelete", checked as boolean)} />
handleChange("allowDownload", checked as boolean)} />
{/* 표시 설정 */}
handleChange("showPreview", checked as boolean)} />
handleChange("showFileList", checked as boolean)} />
handleChange("showFileSize", checked as boolean)} />
{/* 상태 설정 */}
handleChange("required", checked as boolean)} />
handleChange("readonly", checked as boolean)} />
handleChange("disabled", checked as boolean)} />
{/* 스타일 설정 */}
{/* 도움말 */}
handleChange("helperText", e.target.value)} placeholder="파일 업로드에 대한 안내 문구" className="h-8 text-xs" />
); };