"use client" import * as React from "react" import { Loader, Plus, Settings, Trash, Edit, Eye, EyeOff } from "lucide-react" import { toast } from "sonner" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Badge } from "@/components/ui/badge" import { type ApprovalTemplateCategory } from "../category-service" import { createApprovalTemplateCategory, updateApprovalTemplateCategory, deleteApprovalTemplateCategory, getApprovalTemplateCategoryList, getActiveApprovalTemplateCategories, } from "../category-service" import { createApprovalTemplateCategorySchema, updateApprovalTemplateCategorySchema, type CreateApprovalTemplateCategorySchema, type UpdateApprovalTemplateCategorySchema, } from "../category-validations" interface CategoryManagementDialogProps extends React.ComponentPropsWithRef { showTrigger?: boolean onSuccess?: () => void } export function CategoryManagementDialog({ showTrigger = true, onSuccess, ...props }: CategoryManagementDialogProps) { const [categories, setCategories] = React.useState([]) const [isLoading, setIsLoading] = React.useState(false) const [editingCategory, setEditingCategory] = React.useState(null) const [deletingCategory, setDeletingCategory] = React.useState(null) const [showCreateForm, setShowCreateForm] = React.useState(false) // 폼 상태 const createForm = useForm({ resolver: zodResolver(createApprovalTemplateCategorySchema), defaultValues: { name: "", description: "", sortOrder: 0, }, }) const updateForm = useForm({ resolver: zodResolver(updateApprovalTemplateCategorySchema), defaultValues: { name: "", description: "", isActive: true, sortOrder: 0, }, }) // 카테고리 목록 로드 const loadCategories = React.useCallback(async () => { setIsLoading(true) try { const result = await getApprovalTemplateCategoryList({ page: 1, perPage: 100, // 충분히 큰 수로 모든 카테고리 로드 sort: [ { id: 'sortOrder', desc: false }, { id: 'name', desc: false } ], }) setCategories(result.data) } catch (error) { toast.error("카테고리 목록을 불러오는데 실패했습니다.") } finally { setIsLoading(false) } }, []) React.useEffect(() => { if (props.open) { loadCategories() } }, [props.open, loadCategories]) // 생성 핸들러 const handleCreate = async (data: CreateApprovalTemplateCategorySchema) => { try { // 임시 사용자 ID (실제로는 세션에서 가져와야 함) const userId = 1 // TODO: 실제 사용자 ID로 변경 await createApprovalTemplateCategory({ ...data, createdBy: userId, }) toast.success("카테고리가 생성되었습니다.") createForm.reset() setShowCreateForm(false) loadCategories() onSuccess?.() } catch (error) { toast.error(error instanceof Error ? error.message : "카테고리 생성에 실패했습니다.") } } // 수정 핸들러 const handleUpdate = async (data: UpdateApprovalTemplateCategorySchema) => { if (!editingCategory) return try { // 임시 사용자 ID (실제로는 세션에서 가져와야 함) const userId = 1 // TODO: 실제 사용자 ID로 변경 await updateApprovalTemplateCategory(editingCategory.id, { ...data, updatedBy: userId, }) toast.success("카테고리가 수정되었습니다.") setEditingCategory(null) updateForm.reset() loadCategories() onSuccess?.() } catch (error) { toast.error(error instanceof Error ? error.message : "카테고리 수정에 실패했습니다.") } } // 삭제 핸들러 const handleDelete = async () => { if (!deletingCategory) return try { // 임시 사용자 ID (실제로는 세션에서 가져와야 함) const userId = 1 // TODO: 실제 사용자 ID로 변경 const result = await deleteApprovalTemplateCategory(deletingCategory.id, userId) if (result.error) { toast.error(result.error) } else { toast.success("카테고리가 삭제되었습니다.") loadCategories() onSuccess?.() } } catch (error) { toast.error("카테고리 삭제에 실패했습니다.") } finally { setDeletingCategory(null) } } // 수정 폼 열기 const openEditForm = (category: ApprovalTemplateCategory) => { setEditingCategory(category) updateForm.reset({ name: category.name, description: category.description || "", isActive: category.isActive, sortOrder: category.sortOrder, }) } const trigger = showTrigger ? ( ) : null return ( <> {trigger} 결재 템플릿 카테고리 관리 결재 템플릿의 카테고리를 관리합니다. 카테고리는 부서별로 분류하여 사용하세요.
{/* 생성 폼 */} {showCreateForm && (

새 카테고리 추가

( 카테고리 이름 * )} /> ( 정렬 순서 field.onChange(parseInt(e.target.value) || 0)} /> )} />
( 설명