-
-
-
+
+ {/* 참조 테이블 */}
+
+
+
+
+
+
+
+
+
+
+ 테이블을 찾을 수 없습니다.
+
+ {refTableOpts.map((opt) => (
+ {
+ onColumnChange("referenceTable", opt.value === "none" ? undefined : opt.value);
+ if (opt.value !== "none") onLoadReferenceColumns?.(opt.value);
+ setEntityTableOpen(false);
+ }}
+ className="text-xs"
+ >
+
+ {opt.label}
+
+ ))}
+
+
+
+
+
+
+
+ {/* 조인 컬럼 */}
+ {column.referenceTable && column.referenceTable !== "none" && (
+
+
+
-
+
- 테이블을 찾을 수 없습니다.
+ 컬럼을 찾을 수 없습니다.
- {refTableOpts.map((opt) => (
+ {
+ onColumnChange("referenceColumn", undefined);
+ setEntityColumnOpen(false);
+ }}
+ className="text-xs"
+ >
+
+ 선택 안함
+
+ {refColumns.map((refCol) => (
{
- onColumnChange("referenceTable", opt.value === "none" ? undefined : opt.value);
- if (opt.value !== "none") onLoadReferenceColumns?.(opt.value);
- setEntityTableOpen(false);
+ onColumnChange("referenceColumn", refCol.columnName);
+ setEntityColumnOpen(false);
}}
className="text-xs"
>
- {opt.label}
+ {refCol.columnName}
))}
@@ -177,67 +254,20 @@ export function ColumnDetailPanel({
- {column.referenceTable && column.referenceTable !== "none" && (
-
-
-
-
-
-
-
-
-
-
- 컬럼을 찾을 수 없습니다.
-
- {
- onColumnChange("referenceColumn", undefined);
- setEntityColumnOpen(false);
- }}
- className="text-xs"
- >
-
- 선택 안함
-
- {refColumns.map((refCol) => (
- {
- onColumnChange("referenceColumn", refCol.columnName);
- setEntityColumnOpen(false);
- }}
- className="text-xs"
- >
-
- {refCol.columnName}
-
- ))}
-
-
-
-
-
-
- )}
-
+ )}
+
+ {/* 참조 요약 미니맵 */}
+ {column.referenceTable && column.referenceTable !== "none" && column.referenceColumn && (
+
+
+ {column.referenceTable}
+
+ →
+
+ {column.referenceColumn}
+
+
+ )}
)}
diff --git a/frontend/components/admin/table-type/ColumnGrid.tsx b/frontend/components/admin/table-type/ColumnGrid.tsx
index e520fc43..5f339a8a 100644
--- a/frontend/components/admin/table-type/ColumnGrid.tsx
+++ b/frontend/components/admin/table-type/ColumnGrid.tsx
@@ -45,6 +45,7 @@ export function ColumnGrid({
columns,
selectedColumn,
onSelectColumn,
+ onColumnChange,
constraints,
typeFilter = null,
getColumnIndexState: externalGetIndexState,
@@ -128,8 +129,8 @@ export function ColumnGrid({
isSelected && "border-primary/30 bg-primary/5 shadow-sm",
)}
>
- {/* 4px 색상바 */}
-
+ {/* 4px 색상바 (타입별 진한 색) */}
+
{/* 라벨 + 컬럼명 */}
@@ -180,48 +181,72 @@ export function ColumnGrid({
{typeConf.label}
- {/* PK / NN / IDX / UQ (읽기 전용) */}
+ {/* PK / NN / IDX / UQ (클릭 토글) */}
- {
+ e.stopPropagation();
+ onColumnChange(column.columnName, "isPrimaryKey" as keyof ColumnTypeInfo, !idxState.isPk);
+ }}
+ title="Primary Key 토글"
>
PK
-
-
+
-
+
-
+
+
diff --git a/frontend/components/admin/table-type/types.ts b/frontend/components/admin/table-type/types.ts
index 8adbcb62..329b4049 100644
--- a/frontend/components/admin/table-type/types.ts
+++ b/frontend/components/admin/table-type/types.ts
@@ -47,23 +47,25 @@ export type ColumnGroup = "basic" | "reference" | "meta";
export interface TypeColorConfig {
color: string;
bgColor: string;
+ barColor: string;
label: string;
- icon?: string;
+ desc: string;
+ iconChar: string;
}
-/** 입력 타입별 색상 맵 - 배경/텍스트/보더는 다크에서 자동 변환 */
+/** 입력 타입별 색상 맵 - iconChar는 카드 선택용 시각 아이콘 */
export const INPUT_TYPE_COLORS: Record = {
- text: { color: "text-slate-600", bgColor: "bg-slate-50", label: "텍스트" },
- number: { color: "text-indigo-600", bgColor: "bg-indigo-50", label: "숫자" },
- date: { color: "text-amber-600", bgColor: "bg-amber-50", label: "날짜" },
- code: { color: "text-emerald-600", bgColor: "bg-emerald-50", label: "코드" },
- entity: { color: "text-violet-600", bgColor: "bg-violet-50", label: "엔티티" },
- select: { color: "text-cyan-600", bgColor: "bg-cyan-50", label: "셀렉트" },
- checkbox: { color: "text-pink-600", bgColor: "bg-pink-50", label: "체크박스" },
- numbering: { color: "text-orange-600", bgColor: "bg-orange-50", label: "채번" },
- category: { color: "text-teal-600", bgColor: "bg-teal-50", label: "카테고리" },
- textarea: { color: "text-indigo-600", bgColor: "bg-indigo-50", label: "텍스트영역" },
- radio: { color: "text-rose-600", bgColor: "bg-rose-50", label: "라디오" },
+ text: { color: "text-slate-600", bgColor: "bg-slate-50", barColor: "bg-slate-400", label: "텍스트", desc: "일반 텍스트 입력", iconChar: "T" },
+ number: { color: "text-indigo-600", bgColor: "bg-indigo-50", barColor: "bg-indigo-500", label: "숫자", desc: "숫자만 입력", iconChar: "#" },
+ date: { color: "text-amber-600", bgColor: "bg-amber-50", barColor: "bg-amber-500", label: "날짜", desc: "날짜 선택", iconChar: "D" },
+ code: { color: "text-emerald-600", bgColor: "bg-emerald-50", barColor: "bg-emerald-500", label: "코드", desc: "공통코드 선택", iconChar: "{}" },
+ entity: { color: "text-violet-600", bgColor: "bg-violet-50", barColor: "bg-violet-500", label: "테이블 참조", desc: "다른 테이블 연결", iconChar: "⊞" },
+ select: { color: "text-cyan-600", bgColor: "bg-cyan-50", barColor: "bg-cyan-500", label: "셀렉트", desc: "직접 옵션 선택", iconChar: "☰" },
+ checkbox: { color: "text-pink-600", bgColor: "bg-pink-50", barColor: "bg-pink-500", label: "체크박스", desc: "예/아니오 선택", iconChar: "☑" },
+ numbering: { color: "text-orange-600", bgColor: "bg-orange-50", barColor: "bg-orange-500", label: "채번", desc: "자동 번호 생성", iconChar: "≡" },
+ category: { color: "text-teal-600", bgColor: "bg-teal-50", barColor: "bg-teal-500", label: "카테고리", desc: "등록된 선택지", iconChar: "⊟" },
+ textarea: { color: "text-indigo-600", bgColor: "bg-indigo-50", barColor: "bg-indigo-400", label: "여러 줄", desc: "긴 텍스트 입력", iconChar: "≡" },
+ radio: { color: "text-rose-600", bgColor: "bg-rose-50", barColor: "bg-rose-500", label: "라디오", desc: "하나만 선택", iconChar: "◉" },
};
/** 컬럼 그룹 판별 */