"use client"; import React, { useState } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Switch } from "@/components/ui/switch"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; import { ArrowLeft, Save, RotateCcw } from "lucide-react"; import { useButtonActions, type ButtonActionFormData } from "@/hooks/admin/useButtonActions"; import Link from "next/link"; // 기본 카테고리 목록 const DEFAULT_CATEGORIES = ["crud", "navigation", "utility", "custom"]; // 기본 변형 목록 const DEFAULT_VARIANTS = ["default", "destructive", "outline", "secondary", "ghost", "link"]; export default function NewButtonActionPage() { const router = useRouter(); const { createButtonAction, isCreating, createError } = useButtonActions(); const [formData, setFormData] = useState({ action_type: "", action_name: "", action_name_eng: "", description: "", category: "general", default_text: "", default_text_eng: "", default_icon: "", default_color: "", default_variant: "default", confirmation_required: false, confirmation_message: "", validation_rules: {}, action_config: {}, sort_order: 0, is_active: "Y", }); const [jsonErrors, setJsonErrors] = useState<{ validation_rules?: string; action_config?: string; }>({}); // JSON 문자열 상태 (편집용) const [jsonStrings, setJsonStrings] = useState({ validation_rules: "{}", action_config: "{}", }); // 입력값 변경 핸들러 const handleInputChange = (field: keyof ButtonActionFormData, value: any) => { setFormData((prev) => ({ ...prev, [field]: value, })); }; // JSON 입력 변경 핸들러 const handleJsonChange = (field: "validation_rules" | "action_config", value: string) => { setJsonStrings((prev) => ({ ...prev, [field]: value, })); // JSON 파싱 시도 try { const parsed = value.trim() ? JSON.parse(value) : {}; setFormData((prev) => ({ ...prev, [field]: parsed, })); setJsonErrors((prev) => ({ ...prev, [field]: undefined, })); } catch (error) { setJsonErrors((prev) => ({ ...prev, [field]: "유효하지 않은 JSON 형식입니다.", })); } }; // 폼 유효성 검사 const validateForm = (): boolean => { if (!formData.action_type.trim()) { toast.error("액션 타입을 입력해주세요."); return false; } if (!formData.action_name.trim()) { toast.error("액션명을 입력해주세요."); return false; } if (!formData.category.trim()) { toast.error("카테고리를 선택해주세요."); return false; } // JSON 에러가 있는지 확인 const hasJsonErrors = Object.values(jsonErrors).some((error) => error); if (hasJsonErrors) { toast.error("JSON 형식 오류를 수정해주세요."); return false; } return true; }; // 저장 핸들러 const handleSave = async () => { if (!validateForm()) return; try { await createButtonAction(formData); toast.success("버튼 액션이 성공적으로 생성되었습니다."); router.push("/admin/system-settings/button-actions"); } catch (error) { toast.error(error instanceof Error ? error.message : "생성 중 오류가 발생했습니다."); } }; // 폼 초기화 const handleReset = () => { setFormData({ action_type: "", action_name: "", action_name_eng: "", description: "", category: "general", default_text: "", default_text_eng: "", default_icon: "", default_color: "", default_variant: "default", confirmation_required: false, confirmation_message: "", validation_rules: {}, action_config: {}, sort_order: 0, is_active: "Y", }); setJsonStrings({ validation_rules: "{}", action_config: "{}", }); setJsonErrors({}); }; return (
{/* 헤더 */}

새 버튼 액션 추가

새로운 버튼 액션을 생성하여 화면관리에서 사용할 수 있습니다.

{/* 기본 정보 */} 기본 정보 버튼 액션의 기본적인 정보를 입력해주세요. {/* 액션 타입 */}
handleInputChange("action_type", e.target.value)} placeholder="예: save, delete, edit..." className="font-mono" />

영문 소문자, 숫자, 언더스코어(_)만 사용 가능합니다.

{/* 액션명 */}
handleInputChange("action_name", e.target.value)} placeholder="예: 저장" />
handleInputChange("action_name_eng", e.target.value)} placeholder="예: Save" />
{/* 카테고리 */}
{/* 설명 */}