From 3fdc9e36f400ccf1f11015cd2c7081b68080f131 Mon Sep 17 00:00:00 2001 From: kjs Date: Mon, 5 Jan 2026 16:14:36 +0900 Subject: [PATCH] =?UTF-8?q?=ED=83=AD=20=EB=B6=84=ED=95=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen/panels/ComponentsPanel.tsx | 212 +++++------------- 1 file changed, 55 insertions(+), 157 deletions(-) diff --git a/frontend/components/screen/panels/ComponentsPanel.tsx b/frontend/components/screen/panels/ComponentsPanel.tsx index 329b4493..e189aaf9 100644 --- a/frontend/components/screen/panels/ComponentsPanel.tsx +++ b/frontend/components/screen/panels/ComponentsPanel.tsx @@ -2,24 +2,10 @@ import React, { useState, useMemo } from "react"; import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { ComponentRegistry } from "@/lib/registry/ComponentRegistry"; import { ComponentDefinition, ComponentCategory } from "@/types/component"; -import { - Search, - Package, - Grid, - Layers, - Palette, - Zap, - MousePointer, - Edit3, - BarChart3, - Database, - Wrench, - Sparkles, -} from "lucide-react"; +import { Search, Package, Grid, Layers, Palette, Zap, MousePointer, Database } from "lucide-react"; import { TableInfo, ColumnInfo } from "@/types/screen"; import TablesPanel from "./TablesPanel"; @@ -67,33 +53,34 @@ export function ComponentsPanel({ // Unified 컴포넌트 정의 (새로운 통합 컴포넌트 시스템) // 입력 컴포넌트(unified-input, unified-select, unified-date)는 테이블 컬럼 드래그 시 자동 생성되므로 숨김 - const unifiedComponents: ComponentDefinition[] = useMemo( - () => [ - // unified-input: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 - // unified-select: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 - // unified-date: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 - // unified-layout: 중첩 드래그앤드롭 기능 미구현으로 숨김 처리 - // unified-group: 중첩 드래그앤드롭 기능 미구현으로 숨김 처리 - { - id: "unified-list", - name: "통합 목록", - description: "테이블, 카드, 칸반, 리스트 등 다양한 데이터 표시 방식 지원", - category: "display" as ComponentCategory, - tags: ["table", "list", "card", "kanban", "unified"], - defaultSize: { width: 600, height: 400 }, - }, - // unified-media 제거 - 테이블 컬럼의 image/file 입력 타입으로 사용 - // unified-biz 제거 - 개별 컴포넌트(flow-widget, rack-structure, numbering-rule)로 직접 표시 - // unified-hierarchy 제거 - 현재 미사용 - { - id: "unified-repeater", - name: "통합 반복 데이터", - description: "반복 데이터 관리 (인라인/모달/버튼 모드)", - category: "data" as ComponentCategory, - tags: ["repeater", "table", "modal", "button", "unified"], - defaultSize: { width: 600, height: 300 }, - }, - ], + const unifiedComponents = useMemo( + () => + [ + // unified-input: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 + // unified-select: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 + // unified-date: 테이블 컬럼 드래그 시 자동 생성되므로 숨김 처리 + // unified-layout: 중첩 드래그앤드롭 기능 미구현으로 숨김 처리 + // unified-group: 중첩 드래그앤드롭 기능 미구현으로 숨김 처리 + { + id: "unified-list", + name: "통합 목록", + description: "테이블, 카드 등 다양한 데이터 표시 방식 지원", + category: "display" as ComponentCategory, + tags: ["table", "list", "card", "unified"], + defaultSize: { width: 600, height: 400 }, + }, + // unified-media 제거 - 테이블 컬럼의 image/file 입력 타입으로 사용 + // unified-biz 제거 - 개별 컴포넌트(flow-widget, rack-structure, numbering-rule)로 직접 표시 + // unified-hierarchy 제거 - 현재 미사용 + { + id: "unified-repeater", + name: "통합 반복 데이터", + description: "반복 데이터 관리 (인라인/모달/버튼 모드)", + category: "data" as ComponentCategory, + tags: ["repeater", "table", "modal", "button", "unified"], + defaultSize: { width: 600, height: 300 }, + }, + ] as ComponentDefinition[], [], ); @@ -270,87 +257,20 @@ export function ComponentsPanel({ - {/* 카테고리 탭 */} - - - {/* 1행: Unified, 테이블, 입력, 데이터 */} - - - Unified - - + {/* 테이블 / 컴포넌트 탭 */} + + + - 테이블 + 테이블 - - - 입력 - - - - 데이터 - - {/* 2행: 액션, 표시, 레이아웃, 유틸리티 */} - - - 액션 - - - - 표시 - - - - 레이아웃 - - - - 유틸 + + + 컴포넌트 - {/* Unified 컴포넌트 탭 */} - -
-

- Unified 컴포넌트는 속성 기반으로 다양한 기능을 - 지원하는 새로운 컴포넌트입니다. -

-
- {getFilteredComponents("unified").length > 0 - ? getFilteredComponents("unified").map(renderComponentCard) - : renderEmptyState()} -
- - {/* 테이블 탭 */} + {/* 테이블 컬럼 탭 */} {tables.length > 0 && onTableDragStart ? (

테이블이 없습니다

+

화면에 테이블을 선택해주세요

)}
- {/* 입력 컴포넌트 */} - - {getFilteredComponents("input").length > 0 - ? getFilteredComponents("input").map(renderComponentCard) - : renderEmptyState()} - + {/* 컴포넌트 탭 */} + + {(() => { + const allFilteredComponents = [ + ...getFilteredComponents("unified"), + ...getFilteredComponents("action"), + ...getFilteredComponents("display"), + ...getFilteredComponents("data"), + ...getFilteredComponents("layout"), + ...getFilteredComponents("input"), + ...getFilteredComponents("utility"), + ]; - {/* 데이터 컴포넌트 */} - - {getFilteredComponents("data").length > 0 - ? getFilteredComponents("data").map(renderComponentCard) - : renderEmptyState()} - - - {/* 액션 컴포넌트 */} - - {getFilteredComponents("action").length > 0 - ? getFilteredComponents("action").map(renderComponentCard) - : renderEmptyState()} - - - {/* 표시 컴포넌트 */} - - {getFilteredComponents("display").length > 0 - ? getFilteredComponents("display").map(renderComponentCard) - : renderEmptyState()} - - - {/* 레이아웃 컴포넌트 */} - - {getFilteredComponents("layout").length > 0 - ? getFilteredComponents("layout").map(renderComponentCard) - : renderEmptyState()} - - - {/* 유틸리티 컴포넌트 */} - - {getFilteredComponents("utility").length > 0 - ? getFilteredComponents("utility").map(renderComponentCard) - : renderEmptyState()} + return allFilteredComponents.length > 0 + ? allFilteredComponents.map(renderComponentCard) + : renderEmptyState(); + })()}