ERP-node/frontend/lib/meta-components/MetaComponentRenderer.tsx

170 lines
4.1 KiB
TypeScript
Raw Normal View History

2026-03-01 03:39:00 +09:00
"use client";
/**
*
* - component.type에 props
* - V2
*/
import React from "react";
import { FieldRenderer } from "./Field/FieldRenderer";
import { DataViewRenderer } from "./DataView/DataViewRenderer";
import { ActionRenderer } from "./Action/ActionRenderer";
import { LayoutRenderer } from "./Layout/LayoutRenderer";
import { DisplayRenderer } from "./Display/DisplayRenderer";
import { SearchRenderer } from "./Search/SearchRenderer";
import { ModalRenderer } from "./Modal/ModalRenderer";
interface MetaComponentRendererProps {
component: {
id: string;
type: string;
config: any;
position?: any;
};
// 데이터 바인딩
formData?: Record<string, any>;
onFormDataChange?: (fieldName: string, value: any) => void;
// 선택된 행
selectedRowsData?: any[];
onSelectedRowsChange?: (rows: any[], data: any[]) => void;
// 컨텍스트
tableName?: string;
companyCode?: string;
screenId?: number;
userId?: string;
// 콜백
onRefresh?: () => void;
// UI 모드
isDesignMode?: boolean;
disabled?: boolean;
className?: string;
// 레이아웃 children
children?: React.ReactNode;
}
export function MetaComponentRenderer({
component,
formData,
onFormDataChange,
selectedRowsData,
onSelectedRowsChange,
tableName,
companyCode,
screenId,
userId,
onRefresh,
isDesignMode = false,
disabled = false,
className,
children,
}: MetaComponentRendererProps) {
const { id, type, config } = component;
// type에 따라 적절한 렌더러에 dispatch
switch (type) {
case "meta-field":
return (
<FieldRenderer
id={id}
config={config}
formData={formData}
onFormDataChange={onFormDataChange}
tableName={tableName}
companyCode={companyCode}
screenId={screenId}
isDesignMode={isDesignMode}
disabled={disabled}
className={className}
/>
);
case "meta-dataview":
return (
<DataViewRenderer
id={id}
config={config}
selectedRowsData={selectedRowsData}
onSelectedRowsChange={onSelectedRowsChange}
tableName={tableName}
companyCode={companyCode}
screenId={screenId}
formData={formData}
onFormDataChange={onFormDataChange}
isDesignMode={isDesignMode}
className={className}
onRefresh={onRefresh}
/>
);
case "meta-action":
return (
<ActionRenderer
id={id}
config={config}
formData={formData}
selectedRowsData={selectedRowsData}
tableName={tableName}
companyCode={companyCode}
screenId={screenId}
userId={userId}
onRefresh={onRefresh}
isDesignMode={isDesignMode}
disabled={disabled}
className={className}
/>
);
case "meta-layout":
return (
<LayoutRenderer
id={id}
config={config}
children={children}
isDesignMode={isDesignMode}
className={className}
/>
);
case "meta-display":
return (
<DisplayRenderer
id={id}
config={config}
formData={formData}
isDesignMode={isDesignMode}
className={className}
/>
);
case "meta-search":
return (
<SearchRenderer
id={id}
config={config}
isDesignMode={isDesignMode}
disabled={disabled}
className={className}
/>
);
case "meta-modal":
return (
<ModalRenderer
id={id}
config={config}
isDesignMode={isDesignMode}
disabled={disabled}
className={className}
/>
);
default:
return (
<div className="flex h-20 items-center justify-center rounded border border-destructive bg-destructive/10 text-sm text-destructive">
Unknown component type: {type}
</div>
);
}
}