"use client"; import React from "react"; interface CardDisplayConfigPanelProps { config: any; onChange: (config: any) => void; screenTableName?: string; tableColumns?: any[]; } /** * CardDisplay 설정 패널 * 카드 레이아웃과 동일한 설정 UI 제공 */ export const CardDisplayConfigPanel: React.FC = ({ config, onChange, screenTableName, tableColumns = [], }) => { const handleChange = (key: string, value: any) => { onChange({ ...config, [key]: value }); }; const handleNestedChange = (path: string, value: any) => { const keys = path.split("."); let newConfig = { ...config }; let current = newConfig; // 중첩 객체 생성 for (let i = 0; i < keys.length - 1; i++) { if (!current[keys[i]]) { current[keys[i]] = {}; } current = current[keys[i]]; } current[keys[keys.length - 1]] = value; onChange(newConfig); }; // 표시 컬럼 추가 const addDisplayColumn = () => { const currentColumns = config.columnMapping?.displayColumns || []; const newColumns = [...currentColumns, ""]; handleNestedChange("columnMapping.displayColumns", newColumns); }; // 표시 컬럼 삭제 const removeDisplayColumn = (index: number) => { const currentColumns = [...(config.columnMapping?.displayColumns || [])]; currentColumns.splice(index, 1); handleNestedChange("columnMapping.displayColumns", currentColumns); }; // 표시 컬럼 값 변경 const updateDisplayColumn = (index: number, value: string) => { const currentColumns = [...(config.columnMapping?.displayColumns || [])]; currentColumns[index] = value; handleNestedChange("columnMapping.displayColumns", currentColumns); }; return (
카드 디스플레이 설정
{/* 테이블이 선택된 경우 컬럼 매핑 설정 */} {tableColumns && tableColumns.length > 0 && (
컬럼 매핑
{/* 동적 표시 컬럼 추가 */}
{(config.columnMapping?.displayColumns || []).map((column: string, index: number) => (
))} {(!config.columnMapping?.displayColumns || config.columnMapping.displayColumns.length === 0) && (
"컬럼 추가" 버튼을 클릭하여 표시할 컬럼을 추가하세요
)}
)} {/* 카드 스타일 설정 */}
카드 스타일
handleChange("cardsPerRow", parseInt(e.target.value))} className="w-full rounded border border-gray-300 px-2 py-1 text-sm" />
handleChange("cardSpacing", parseInt(e.target.value))} className="w-full rounded border border-gray-300 px-2 py-1 text-sm" />
handleNestedChange("cardStyle.showTitle", e.target.checked)} className="rounded border-gray-300" />
handleNestedChange("cardStyle.showSubtitle", e.target.checked)} className="rounded border-gray-300" />
handleNestedChange("cardStyle.showDescription", e.target.checked)} className="rounded border-gray-300" />
handleNestedChange("cardStyle.showImage", e.target.checked)} className="rounded border-gray-300" />
handleNestedChange("cardStyle.showActions", e.target.checked)} className="rounded border-gray-300" />
{/* 개별 버튼 설정 (액션 버튼이 활성화된 경우에만 표시) */} {(config.cardStyle?.showActions ?? true) && (
handleNestedChange("cardStyle.showViewButton", e.target.checked)} className="rounded border-gray-300" />
handleNestedChange("cardStyle.showEditButton", e.target.checked)} className="rounded border-gray-300" />
)}
handleNestedChange("cardStyle.maxDescriptionLength", parseInt(e.target.value))} className="w-full rounded border border-gray-300 px-2 py-1 text-sm" />
{/* 공통 설정 */}
공통 설정
handleChange("disabled", e.target.checked)} className="rounded border-gray-300" />
handleChange("readonly", e.target.checked)} className="rounded border-gray-300" />
); };