"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 (
);
}