diff --git a/backend-node/prisma/screen-management.prisma b/backend-node/prisma/screen-management.prisma deleted file mode 100644 index ab2475f6..00000000 --- a/backend-node/prisma/screen-management.prisma +++ /dev/null @@ -1,94 +0,0 @@ -// 화면관리 시스템 Prisma 스키마 -// 기존 schema.prisma에 추가할 모델들 - -model screen_definitions { - screen_id Int @id @default(autoincrement()) - screen_name String @db.VarChar(100) - screen_code String @unique @db.VarChar(50) - table_name String @db.VarChar(100) - company_code String @db.VarChar(50) - description String? @db.Text - is_active String @default("Y") @db.Char(1) - created_date DateTime @default(now()) @db.Timestamp(6) - created_by String? @db.VarChar(50) - updated_date DateTime @default(now()) @db.Timestamp(6) - updated_by String? @db.VarChar(50) - - // 관계 - layouts screen_layouts[] - menu_assignments screen_menu_assignments[] - - @@index([company_code]) -} - -model screen_layouts { - layout_id Int @id @default(autoincrement()) - screen_id Int - component_type String @db.VarChar(50) - component_id String @unique @db.VarChar(100) - parent_id String? @db.VarChar(100) - position_x Int - position_y Int - width Int - height Int - properties Json? - display_order Int @default(0) - created_date DateTime @default(now()) @db.Timestamp(6) - - // 관계 - screen screen_definitions @relation(fields: [screen_id], references: [screen_id], onDelete: Cascade) - widgets screen_widgets[] - - @@index([screen_id]) -} - -model screen_widgets { - widget_id Int @id @default(autoincrement()) - layout_id Int - table_name String @db.VarChar(100) - column_name String @db.VarChar(100) - widget_type String @db.VarChar(50) - label String? @db.VarChar(200) - placeholder String? @db.VarChar(200) - is_required Boolean @default(false) - is_readonly Boolean @default(false) - validation_rules Json? - display_properties Json? - created_date DateTime @default(now()) @db.Timestamp(6) - - // 관계 - layout screen_layouts @relation(fields: [layout_id], references: [layout_id], onDelete: Cascade) - - @@index([layout_id]) -} - -model screen_templates { - template_id Int @id @default(autoincrement()) - template_name String @db.VarChar(100) - template_type String @db.VarChar(50) - company_code String @db.VarChar(50) - description String? @db.Text - layout_data Json? - is_public Boolean @default(false) - created_by String? @db.VarChar(50) - created_date DateTime @default(now()) @db.Timestamp(6) - - @@index([company_code]) -} - -model screen_menu_assignments { - assignment_id Int @id @default(autoincrement()) - screen_id Int - menu_objid Decimal @db.Decimal - company_code String @db.VarChar(50) - display_order Int @default(0) - is_active String @default("Y") @db.Char(1) - created_date DateTime @default(now()) @db.Timestamp(6) - created_by String? @db.VarChar(50) - - // 관계 - screen screen_definitions @relation(fields: [screen_id], references: [screen_id], onDelete: Cascade) - - @@unique([screen_id, menu_objid, company_code]) - @@index([company_code]) -} diff --git a/frontend/components/screen/RealtimePreview.tsx b/frontend/components/screen/RealtimePreview.tsx new file mode 100644 index 00000000..2ab07d1b --- /dev/null +++ b/frontend/components/screen/RealtimePreview.tsx @@ -0,0 +1,257 @@ +"use client"; + +import React from "react"; +import { ComponentData, WebType } from "@/types/screen"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +// import { Checkbox } from "@/components/ui/checkbox"; +// import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Database, Type, Hash, List, AlignLeft, CheckSquare, Radio, Calendar, Code, Building, File } from "lucide-react"; + +interface RealtimePreviewProps { + component: ComponentData; + isSelected?: boolean; + onClick?: () => void; + onDragStart?: (e: React.DragEvent) => void; + onDragEnd?: () => void; +} + +// 웹 타입에 따른 위젯 렌더링 +const renderWidget = (component: ComponentData) => { + const { widgetType, label, placeholder, required, readonly, columnName } = component; + + // 디버깅: 실제 widgetType 값 확인 + console.log('RealtimePreview - widgetType:', widgetType, 'columnName:', columnName); + + const commonProps = { + placeholder: placeholder || `입력하세요...`, + disabled: readonly, + required: required, + className: "w-full", + }; + + switch (widgetType) { + case "text": + case "email": + case "tel": + return ; + + case "number": + case "decimal": + return ; + + case "date": + case "datetime": + return ( + + ); + + case "select": + case "dropdown": + return ( + + ); + + case "textarea": + case "text_area": + return ; + + case "boolean": + case "checkbox": + return ( +
;
+ case "entity":
+ return }
+ {column.webType === "entity" &&