"use client"; import * as React from "react"; import { Badge } from "@/components/ui/badge"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Sortable, SortableDragHandle, SortableItem } from "@/components/ui/sortable"; import { GripVertical } from "lucide-react"; import { complianceQuestions } from "@/db/schema/compliance"; import { ComplianceQuestionEditSheet } from "./compliance-question-edit-sheet"; import { ComplianceQuestionDeleteDialog } from "./compliance-question-delete-dialog"; import { updateComplianceQuestion } from "@/lib/compliance/services"; import { toast } from "sonner"; import { useRouter } from "next/navigation"; interface SortableQuestionItemProps { question: typeof complianceQuestions.$inferSelect; onSuccess?: () => void; } function SortableQuestionItem({ question, onSuccess }: SortableQuestionItemProps) { return (
{question.questionNumber} {question.questionText}
질문 타입: {question.questionType}
필수 여부: {question.isRequired ? '필수' : '선택'}
상세 설명: {question.hasDetailText ? '필요' : '불필요'}
파일 업로드: {question.hasFileUpload ? '필요' : '불필요'}
{question.conditionalValue && (
조건: {question.conditionalValue}
)}
); } interface ComplianceQuestionsDraggableListProps { questions: typeof complianceQuestions.$inferSelect[]; onSuccess?: () => void; } export function ComplianceQuestionsDraggableList({ questions, onSuccess }: ComplianceQuestionsDraggableListProps) { const [items, setItems] = React.useState(questions); const router = useRouter(); React.useEffect(() => { setItems(questions); }, [questions]); const handleValueChange = async (newItems: typeof complianceQuestions.$inferSelect[]) => { setItems(newItems); // 새로운 순서로 displayOrder 업데이트 const updatedItems = newItems.map((item, index) => ({ ...item, displayOrder: index + 1, })); // 서버에 순서 업데이트 await updateDisplayOrders(updatedItems); }; const updateDisplayOrders = async (updatedItems: typeof complianceQuestions.$inferSelect[]) => { try { // 각 질문의 displayOrder를 순차적으로 업데이트 await Promise.all( updatedItems.map((item, index) => updateComplianceQuestion(item.id, { displayOrder: index + 1, }) ) ); toast.success("질문 순서가 업데이트되었습니다."); router.refresh(); if (onSuccess) { onSuccess(); } } catch (error) { console.error("Error updating question order:", error); toast.error("질문 순서 업데이트 중 오류가 발생했습니다."); } }; if (items.length === 0) { return (
아직 질문이 없습니다. 질문을 추가해보세요.
); } return ( {items.map((question) => ( ))} ); }