"use client"; /** * pop-dashboard 디자이너 미리보기 컴포넌트 * * 실제 데이터 없이 더미 레이아웃으로 미리보기 표시 * 디자이너가 설정 변경 시 즉시 미리보기 확인 가능 */ import React from "react"; import { BarChart3, PieChart, Gauge, LayoutList } from "lucide-react"; import type { PopDashboardConfig, DashboardSubType } from "../types"; import { migrateConfig } from "./PopDashboardComponent"; // ===== 서브타입별 아이콘 매핑 ===== const SUBTYPE_ICONS: Record = { "kpi-card": , chart: , gauge: , "stat-card": , }; const SUBTYPE_LABELS: Record = { "kpi-card": "KPI", chart: "차트", gauge: "게이지", "stat-card": "통계", }; // ===== 모드 라벨 ===== const MODE_LABELS: Record = { arrows: "좌우 버튼", "auto-slide": "자동 슬라이드", scroll: "스크롤", }; // ===== 더미 아이템 프리뷰 ===== function DummyItemPreview({ subType, label, }: { subType: DashboardSubType; label: string; }) { return (
{SUBTYPE_ICONS[subType]} {label || SUBTYPE_LABELS[subType]}
); } // ===== 메인 미리보기 ===== export function PopDashboardPreviewComponent({ config, }: { config?: PopDashboardConfig; }) { // config가 빈 객체 {} 또는 items가 없는 경우 방어 if (!config || !Array.isArray(config.items) || !config.items.length) { return (
대시보드
); } const visibleItems = config.items.filter((i) => i.visible); // 마이그레이션 적용 const migrated = migrateConfig(config as unknown as Record); const pages = migrated.pages ?? []; const hasPages = pages.length > 0; return (
{/* 모드 + 페이지 뱃지 */}
{MODE_LABELS[migrated.displayMode] ?? migrated.displayMode} {hasPages && ( {pages.length}페이지 )} {visibleItems.length}개
{/* 미리보기 */}
{hasPages ? ( // 첫 번째 페이지 그리드 미리보기
{pages[0].gridCells.length > 0 ? pages[0].gridCells.map((cell) => { const item = visibleItems.find( (i) => i.id === cell.itemId ); return (
{item ? ( ) : (
)}
); }) : visibleItems.slice(0, 4).map((item) => ( ))}
) : ( // 페이지 미설정: 첫 번째 아이템만 크게 표시
{visibleItems[0] && ( )} {visibleItems.length > 1 && (
+{visibleItems.length - 1}
)}
)}
); }