# 조건부 컨테이너 (ConditionalContainer) - 화면 선택 방식 제어 셀렉트박스 값에 따라 다른 **화면**을 표시하는 조건부 컨테이너 컴포넌트입니다. ## 📋 개요 화면 편집기에서 조건별로 표시할 화면을 선택하여 조건부 UI를 구성할 수 있는 컨테이너입니다. 상단의 셀렉트박스 값에 따라 하단에 미리 만들어진 화면을 표시합니다. ## ✨ 주요 기능 - ✅ **조건별 화면 전환**: 셀렉트박스 값에 따라 다른 화면 표시 - ✅ **화면 재사용**: 기존에 만든 화면을 조건별로 할당 - ✅ **간편한 구성**: 복잡한 입력 폼도 화면 선택으로 간단히 구성 - ✅ **자동 동기화**: 화면 수정 시 자동 반영 - ✅ **폼 데이터 연동**: formData와 자동 동기화 - ✅ **커스터마이징**: 테두리, 간격, 기본값 등 설정 가능 ## 🎯 사용 사례 ### 1. 입력 방식 선택 ``` [셀렉트: 입력 방식] ├─ 거래처 우선: "거래처_우선_입력_화면" (화면 ID: 101) ├─ 견적서 기반: "견적서_업로드_화면" (화면 ID: 102) └─ 단가 직접입력: "단가_직접입력_화면" (화면 ID: 103) ``` ### 2. 판매 유형 선택 ``` [셀렉트: 판매 유형] ├─ 국내 판매: "국내판매_기본폼" (화면 ID: 201) └─ 해외 판매: "해외판매_무역정보폼" (화면 ID: 202) ``` ### 3. 문서 유형 선택 ``` [셀렉트: 문서 유형] ├─ 신규 작성: "신규문서_입력폼" (화면 ID: 301) ├─ 복사 생성: "문서복사_화면" (화면 ID: 302) └─ 불러오기: "파일업로드_화면" (화면 ID: 303) ``` ## 📐 구조 ``` ┌─────────────────────────────────┐ │ ConditionalContainer │ ├─────────────────────────────────┤ │ [제어 셀렉트박스] │ ← controlField, controlLabel ├─────────────────────────────────┤ │ 📄 조건 1: "옵션 A" 선택 시 │ ← sections[0] │ ┌─────────────────────────────┐│ │ │ [선택된 화면이 표시됨] ││ ← screenId로 지정된 화면 │ │ (화면 ID: 101) ││ │ │ ││ │ └─────────────────────────────┘│ ├─────────────────────────────────┤ │ 📄 조건 2: "옵션 B" 선택 시 │ ← sections[1] │ ┌─────────────────────────────┐│ │ │ [다른 화면이 표시됨] ││ ← screenId로 지정된 다른 화면 │ │ (화면 ID: 102) ││ │ └─────────────────────────────┘│ └─────────────────────────────────┘ ``` ## 🔧 설정 방법 ### 1. 컴포넌트 추가 화면 편집기의 컴포넌트 패널에서 **"조건부 컨테이너"**를 드래그하여 캔버스에 배치합니다. ### 2. 설정 패널에서 구성 #### 제어 필드 설정 - **제어 필드명**: formData에 저장될 필드명 (예: `inputMode`) - **셀렉트박스 라벨**: 화면에 표시될 라벨 (예: "입력 방식") #### 조건별 섹션 추가 1. **"섹션 추가"** 버튼 클릭 2. 각 섹션 설정: - **조건 값**: 고유한 값 (예: `customer_first`) - **표시 라벨**: 사용자에게 보이는 텍스트 (예: "거래처 우선") #### 기본값 설정 - 처음 화면 로드 시 선택될 기본 조건 선택 #### 스타일 설정 - **섹션 테두리 표시**: ON/OFF - **섹션 간격**: 좁게 / 보통 / 넓게 ### 3. 조건별 화면 선택 1. **디자인 모드**에서 모든 조건 섹션이 표시됩니다 2. 각 섹션의 **"표시할 화면"** 드롭다운에서 화면을 선택합니다 3. 선택된 화면 ID와 이름이 자동으로 저장됩니다 **장점:** - ✅ 이미 만든 화면을 재사용 - ✅ 복잡한 입력 폼도 간단히 구성 - ✅ 화면 수정 시 자동 반영 ### 4. 실행 모드 동작 - 셀렉트박스에서 조건 선택 - 선택된 조건의 **화면**이 표시됨 - 다른 조건의 화면은 자동으로 숨김 ## 💻 기술 사양 ### Props ```typescript interface ConditionalContainerProps { // 제어 필드 controlField: string; // 예: "inputMode" controlLabel: string; // 예: "입력 방식" // 조건별 섹션 sections: ConditionalSection[]; // 기본값 defaultValue?: string; // 스타일 showBorder?: boolean; // 기본: true spacing?: "tight" | "normal" | "loose"; // 기본: "normal" // 폼 연동 formData?: Record; onFormDataChange?: (fieldName: string, value: any) => void; } interface ConditionalSection { id: string; // 고유 ID condition: string; // 조건 값 label: string; // 표시 라벨 screenId: number | null; // 표시할 화면 ID screenName?: string; // 화면 이름 (표시용) } ``` ### 기본 설정 ```typescript defaultSize: { width: 800, height: 600, } defaultConfig: { controlField: "condition", controlLabel: "조건 선택", sections: [ { id: "section_1", condition: "option1", label: "옵션 1", screenId: null, // 화면 미선택 상태 }, { id: "section_2", condition: "option2", label: "옵션 2", screenId: null, // 화면 미선택 상태 }, ], defaultValue: "option1", showBorder: true, spacing: "normal", } ``` ## 🎨 디자인 모드 vs 실행 모드 ### 디자인 모드 (편집기) - ✅ 모든 조건 섹션 표시 - ✅ 각 섹션에 "조건: XXX" 라벨 표시 - ✅ 화면 선택 안내 메시지 (미선택 시) - ✅ 선택된 화면 ID 표시 - ✅ 활성 조건 "(활성)" 표시 ### 실행 모드 (할당된 화면) - ✅ 선택된 조건의 화면만 표시 - ✅ 다른 조건의 화면 자동 숨김 - ✅ 깔끔한 UI (라벨, 점선 테두리 제거) - ✅ 선택된 화면이 완전히 통합되어 표시 ## 📊 폼 데이터 연동 ### 자동 동기화 ```typescript // formData 읽기 formData[controlField] // 현재 선택된 값 // formData 쓰기 onFormDataChange(controlField, newValue) ``` ### 예시 ```typescript // controlField = "salesType" formData = { salesType: "export", // ← 자동으로 여기에 저장됨 // ... 다른 필드들 } // 셀렉트박스 값 변경 시 자동으로 formData 업데이트 ``` ## 🔍 주의사항 1. **조건 값은 고유해야 함**: 각 섹션의 `condition` 값은 중복되면 안 됩니다 2. **최소 1개 섹션 필요**: 섹션이 없으면 안내 메시지 표시 3. **컴포넌트 ID 충돌 방지**: 각 섹션의 컴포넌트 ID는 전역적으로 고유해야 함 ## 📝 예시: 수주 입력 방식 선택 ```typescript { controlField: "inputMode", controlLabel: "입력 방식", sections: [ { id: "customer_first", condition: "customer_first", label: "거래처 우선", components: [ // 거래처 검색 컴포넌트 // 품목 선택 테이블 // 저장 버튼 ] }, { id: "quotation", condition: "quotation", label: "견적서 기반", components: [ // 견적서 검색 컴포넌트 // 견적서 내용 표시 // 수주 전환 버튼 ] }, { id: "unit_price", condition: "unit_price", label: "단가 직접입력", components: [ // 품목 입력 테이블 // 단가 입력 필드들 // 계산 위젯 ] } ], defaultValue: "customer_first", showBorder: true, spacing: "normal" } ``` ## 🚀 로드맵 - [ ] 다중 제어 필드 지원 (AND/OR 조건) - [ ] 섹션 전환 애니메이션 - [ ] 조건별 검증 규칙 - [ ] 템플릿 저장/불러오기 ## 🐛 트러블슈팅 ### Q: 섹션이 전환되지 않아요 A: `controlField` 값이 formData에 제대로 저장되고 있는지 확인하세요. ### Q: 컴포넌트가 드롭되지 않아요 A: 디자인 모드인지 확인하고, 드롭존 영역에 정확히 드롭하세요. ### Q: 다른 조건의 UI가 계속 보여요 A: 실행 모드로 전환했는지 확인하세요. 디자인 모드에서는 모든 조건이 표시됩니다. ## 📦 파일 구조 ``` conditional-container/ ├── types.ts # 타입 정의 ├── ConditionalContainerComponent.tsx # 메인 컴포넌트 ├── ConditionalSectionDropZone.tsx # 드롭존 컴포넌트 ├── ConditionalContainerConfigPanel.tsx # 설정 패널 ├── ConditionalContainerRenderer.tsx # 렌더러 및 등록 ├── index.ts # 컴포넌트 정의 └── README.md # 이 파일 ``` ## 🎉 완료! 이제 화면 편집기에서 **조건부 컨테이너**를 사용하여 동적인 UI를 만들 수 있습니다! 🚀