"use client"; import { Button } from "@/components/ui/button"; import { Save, Eye, RotateCcw, ArrowLeft, Loader2, BookTemplate, Grid3x3, Undo2, Redo2, AlignLeft, AlignRight, AlignVerticalJustifyStart, AlignVerticalJustifyEnd, AlignCenterHorizontal, AlignCenterVertical, AlignHorizontalDistributeCenter, AlignVerticalDistributeCenter, RectangleHorizontal, RectangleVertical, Square, ChevronDown, ChevronsDown, ChevronsUp, ChevronUp, Lock, Unlock, Ruler as RulerIcon, Group, Ungroup, } from "lucide-react"; import { useRouter } from "next/navigation"; import { useReportDesigner } from "@/contexts/ReportDesignerContext"; import { useState } from "react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { SaveAsTemplateModal } from "./SaveAsTemplateModal"; import { MenuSelectModal } from "./MenuSelectModal"; import { reportApi } from "@/lib/api/reportApi"; import { useToast } from "@/hooks/use-toast"; import { ReportPreviewModal } from "./ReportPreviewModal"; export function ReportDesignerToolbar() { const router = useRouter(); const { reportDetail, saveLayoutWithMenus, isSaving, loadLayout, components, canvasWidth, canvasHeight, queries, snapToGrid, setSnapToGrid, showGrid, setShowGrid, undo, redo, canUndo, canRedo, selectedComponentIds, alignLeft, alignRight, alignTop, alignBottom, alignCenterHorizontal, alignCenterVertical, distributeHorizontal, distributeVertical, makeSameWidth, makeSameHeight, makeSameSize, bringToFront, sendToBack, bringForward, sendBackward, toggleLock, lockComponents, unlockComponents, showRuler, setShowRuler, groupComponents, ungroupComponents, menuObjids, } = useReportDesigner(); const [showPreview, setShowPreview] = useState(false); const [showSaveAsTemplate, setShowSaveAsTemplate] = useState(false); const [showBackConfirm, setShowBackConfirm] = useState(false); const [showResetConfirm, setShowResetConfirm] = useState(false); const [showMenuSelect, setShowMenuSelect] = useState(false); const [pendingSaveAndClose, setPendingSaveAndClose] = useState(false); const { toast } = useToast(); // 버튼 활성화 조건 const canAlign = selectedComponentIds && selectedComponentIds.length >= 2; const canDistribute = selectedComponentIds && selectedComponentIds.length >= 3; const hasSelection = selectedComponentIds && selectedComponentIds.length >= 1; const canGroup = selectedComponentIds && selectedComponentIds.length >= 2; // 템플릿 저장 가능 여부: 컴포넌트가 있어야 함 const canSaveAsTemplate = components.length > 0; // Grid 토글 (Snap과 Grid 표시 함께 제어) const handleToggleGrid = () => { const newValue = !snapToGrid; setSnapToGrid(newValue); setShowGrid(newValue); }; const handleSave = () => { setPendingSaveAndClose(false); setShowMenuSelect(true); }; const handleSaveAndClose = () => { setPendingSaveAndClose(true); setShowMenuSelect(true); }; const handleMenuSelectConfirm = async (selectedMenuObjids: number[]) => { await saveLayoutWithMenus(selectedMenuObjids); if (pendingSaveAndClose) { router.push("/admin/screenMng/reportList"); } }; const handleResetConfirm = async () => { setShowResetConfirm(false); await loadLayout(); }; const handleBackConfirm = () => { setShowBackConfirm(false); router.push("/admin/screenMng/reportList"); }; const handleSaveAsTemplate = async (data: { templateNameKor: string; templateNameEng?: string; description?: string; }) => { try { // 현재 레이아웃 데이터로 직접 템플릿 생성 (리포트 저장 불필요) const response = await reportApi.createTemplateFromLayout({ templateNameKor: data.templateNameKor, templateNameEng: data.templateNameEng, templateType: reportDetail?.report?.report_type || "GENERAL", description: data.description, layoutConfig: { width: canvasWidth, height: canvasHeight, orientation: "portrait", margins: { top: 10, bottom: 10, left: 10, right: 10, }, components: components, }, defaultQueries: queries.map((q, index) => ({ name: q.name, type: q.type, sqlQuery: q.sqlQuery, parameters: q.parameters, externalConnectionId: q.externalConnectionId || null, displayOrder: index, })), }); if (response.success) { toast({ title: "성공", description: "템플릿이 생성되었습니다.", }); setShowSaveAsTemplate(false); } } catch (error: unknown) { const errorMessage = error instanceof Error && "response" in error ? (error as { response?: { data?: { message?: string } } }).response?.data?.message || "템플릿 생성에 실패했습니다." : "템플릿 생성에 실패했습니다."; toast({ title: "오류", description: errorMessage, variant: "destructive", }); throw error; } }; return ( <>
{reportDetail.report.report_name_eng}
)}