"use client"; import { useState, useMemo, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { cn } from "@/lib/utils"; import { Table, FormInput, Columns, LayoutGrid, X, } from "lucide-react"; // 자동생성 설정 export interface AutoGenerateConfig { templateType: "list" | "form" | "master-detail" | "card"; selectedColumns: string[]; includeSearch: boolean; includeCrud: boolean; // CRUD 버튼 포함 여부 includeModal: boolean; // 등록/수정 모달 포함 여부 } // 컬럼 정보 export interface AutoGenerateColumn { columnName: string; label: string; webType: string; required: boolean; } // 모달 props export interface AutoGenerateModalProps { isOpen: boolean; onClose: () => void; tableName: string; tableLabel: string; columns: AutoGenerateColumn[]; onGenerate: (config: AutoGenerateConfig) => void; } // 시스템 컬럼 목록 const SYSTEM_COLUMNS = [ "created_by", "updated_by", "created_date", "updated_date", "created_at", "updated_at", "writer", "company_code", ]; // 시스템 컬럼 판별 function isSystemColumn(columnName: string): boolean { return SYSTEM_COLUMNS.includes(columnName.toLowerCase()); } // 템플릿 타입 정의 interface TemplateOption { id: AutoGenerateConfig["templateType"]; label: string; description: string; icon: React.ReactNode; } const TEMPLATES: TemplateOption[] = [ { id: "list", label: "목록형", description: "검색 + 테이블 + CRUD 버튼", icon: (
), }, { id: "form", label: "폼형", description: "입력 필드 + 저장 버튼", icon: (
), }, { id: "master-detail", label: "마스터-디테일", description: "좌측 목록 + 우측 상세", icon: (
), }, { id: "card", label: "카드형", description: "카드 그리드 뷰", icon: (
), }, ]; export function AutoGenerateModal({ isOpen, onClose, tableName, tableLabel, columns, onGenerate, }: AutoGenerateModalProps) { // 템플릿 타입 선택 const [templateType, setTemplateType] = useState("list"); // 컬럼 선택 (기본: 시스템 컬럼 제외한 모든 컬럼 선택) const [selectedColumns, setSelectedColumns] = useState>(() => { const initial = new Set(); columns.forEach((col) => { if (!isSystemColumn(col.columnName)) { initial.add(col.columnName); } }); return initial; }); // 모달이 열릴 때마다 선택 상태 리셋 (columns가 변경되면) useEffect(() => { if (isOpen) { const initial = new Set(); columns.forEach((col) => { if (!isSystemColumn(col.columnName)) { initial.add(col.columnName); } }); setSelectedColumns(initial); setTemplateType("list"); } }, [isOpen, columns]); // 옵션 const [includeSearch, setIncludeSearch] = useState(true); const [includeCrud, setIncludeCrud] = useState(true); const [includeModal, setIncludeModal] = useState(true); // 컬럼 체크박스 토글 const toggleColumn = (columnName: string) => { setSelectedColumns((prev) => { const next = new Set(prev); if (next.has(columnName)) { next.delete(columnName); } else { next.add(columnName); } return next; }); }; // 전체 선택/해제 const toggleAll = () => { if (selectedColumns.size === columns.length) { setSelectedColumns(new Set()); } else { setSelectedColumns(new Set(columns.map((c) => c.columnName))); } }; // 생성 핸들러 const handleGenerate = () => { const config: AutoGenerateConfig = { templateType, selectedColumns: Array.from(selectedColumns), includeSearch, includeCrud, includeModal, }; onGenerate(config); }; // 선택된 컬럼 개수 const selectedCount = selectedColumns.size; return ( 화면 자동 생성 테이블: {tableLabel || tableName} ({tableName})
{/* 템플릿 선택 */}
{TEMPLATES.map((template) => ( ))}
{/* 컬럼 선택 */}
{columns.map((col) => { const isSystem = isSystemColumn(col.columnName); return (
toggleColumn(col.columnName)} />
); })}
{/* 옵션 */}
{templateType === "list" || templateType === "master-detail" ? (
setIncludeSearch(!!checked)} />
) : null} {templateType === "list" || templateType === "form" ? (
setIncludeCrud(!!checked)} />
) : null} {templateType === "list" ? (
setIncludeModal(!!checked)} />
) : null}
); }