ERP-node/frontend/lib/registry/components/DashboardRenderer.tsx

68 lines
2.2 KiB
TypeScript

"use client";
import React from "react";
import { ComponentData } from "@/types/screen";
import { componentRegistry, ComponentRenderer } from "../DynamicComponentRenderer";
import { LayoutGrid } from "lucide-react";
// 대시보드 컴포넌트 렌더러
const DashboardRenderer: ComponentRenderer = ({ component, children, isInteractive = false, ...props }) => {
const config = component.componentConfig || {};
const { columns = 3, gap = 16, items = [], style = {} } = config;
console.log("📊 DashboardRenderer 렌더링:", {
componentId: component.id,
isInteractive,
config,
columns,
gap,
});
return (
<div
className="h-full w-full overflow-hidden p-4"
style={{
display: "grid",
gridTemplateColumns: `repeat(${columns}, 1fr)`,
gap: `${gap}px`,
width: "100%",
height: "100%",
boxSizing: "border-box",
...style,
}}
>
{children && React.Children.count(children) > 0
? children
: // 플레이스홀더 그리드 아이템들
Array.from({ length: columns * 2 }).map((_, index) => (
<div
key={index}
className={`flex min-h-0 items-center justify-center rounded p-2 ${
isInteractive
? "border border-gray-200 bg-white shadow-sm"
: "border-2 border-dashed border-gray-300 bg-gray-50"
}`}
style={{
minWidth: 0,
minHeight: "60px",
maxWidth: "100%",
}}
>
<div className="text-center">
<LayoutGrid className={`mx-auto mb-2 h-6 w-6 ${isInteractive ? "text-blue-500" : "text-gray-400"}`} />
<div className={`text-xs ${isInteractive ? "font-medium text-gray-700" : "text-gray-400"}`}>
{index + 1}
</div>
{isInteractive && <div className="mt-1 text-xs text-gray-500"> </div>}
</div>
</div>
))}
</div>
);
};
// 레지스트리에 등록
componentRegistry.register("dashboard", DashboardRenderer);
export { DashboardRenderer };