반응형 및 테이블 리스트 컴포넌트 오류 수정

This commit is contained in:
kjs
2025-10-17 15:31:23 +09:00
parent 54e9f45823
commit 2a8081a253
21 changed files with 886 additions and 262 deletions

View File

@@ -10,12 +10,15 @@ import { Breakpoint, BREAKPOINTS } from "@/types/responsive";
import { generateSmartDefaults, ensureResponsiveConfig } from "@/lib/utils/responsiveDefaults";
import { DynamicComponentRenderer } from "@/lib/registry/DynamicComponentRenderer";
interface ResponsiveLayoutEngineProps {
export interface ResponsiveLayoutEngineProps {
components: ComponentData[];
breakpoint: Breakpoint;
containerWidth: number;
screenWidth?: number;
preserveYPosition?: boolean; // true: Y좌표 유지 (하이브리드), false: 16px 간격 (반응형)
formData?: Record<string, unknown>;
onFormDataChange?: (fieldName: string, value: unknown) => void;
screenInfo?: { id: number; tableName?: string };
}
/**
@@ -33,6 +36,9 @@ export const ResponsiveLayoutEngine: React.FC<ResponsiveLayoutEngineProps> = ({
containerWidth,
screenWidth = 1920,
preserveYPosition = false, // 기본값: 반응형 모드 (16px 간격)
formData,
onFormDataChange,
screenInfo,
}) => {
// 1단계: 컴포넌트들을 Y 위치 기준으로 행(row)으로 그룹화
const rows = useMemo(() => {
@@ -72,6 +78,18 @@ export const ResponsiveLayoutEngine: React.FC<ResponsiveLayoutEngineProps> = ({
const responsiveComponents = useMemo(() => {
const result = sortedRows.flatMap((row, rowIndex) =>
row.map((comp, compIndex) => {
// 컴포넌트에 gridColumns가 이미 설정되어 있으면 그 값 사용
if ((comp as any).gridColumns !== undefined) {
return {
...comp,
responsiveDisplay: {
gridColumns: (comp as any).gridColumns,
order: compIndex + 1,
hide: false,
},
};
}
// 반응형 설정이 없으면 자동 생성
const compWithConfig = ensureResponsiveConfig(comp, screenWidth);
@@ -140,6 +158,7 @@ export const ResponsiveLayoutEngine: React.FC<ResponsiveLayoutEngineProps> = ({
gap: "16px",
padding: "0 16px",
marginTop,
alignItems: "start", // 각 아이템이 원래 높이 유지
}}
>
{rowComponents.map((comp) => (
@@ -148,9 +167,19 @@ export const ResponsiveLayoutEngine: React.FC<ResponsiveLayoutEngineProps> = ({
className="responsive-grid-item"
style={{
gridColumn: `span ${comp.responsiveDisplay?.gridColumns || gridColumns}`,
height: "auto", // 자동 높이
}}
>
<DynamicComponentRenderer component={comp} isPreview={true} />
<DynamicComponentRenderer
component={comp}
isPreview={true}
isDesignMode={false}
isInteractive={true}
formData={formData}
onFormDataChange={onFormDataChange}
screenId={screenInfo?.id}
tableName={screenInfo?.tableName}
/>
</div>
))}
</div>