ERP-node/선택항목_상세입력_완전_자동화_가이드.md

376 lines
12 KiB
Markdown
Raw Permalink Normal View History

# 선택 항목 상세입력 완전 자동화 가이드 🚀
## ✨ 완전 자동화 완료!
이제 **아무 설정도 하지 않아도** 데이터가 자동으로 전달됩니다!
---
## 🎯 자동화된 흐름
### 1단계: TableList (선택 화면)
```
┌─────────────────────────────────┐
│ TableList 컴포넌트 │
│ - 테이블: item_info │
│ - 체크박스로 품목 3개 선택 │
└─────────────────────────────────┘
↓ (자동 저장)
┌─────────────────────────────────┐
│ modalDataStore │
│ { "item_info": [선택된 데이터] }│
└─────────────────────────────────┘
```
### 2단계: Button (다음 버튼)
```
┌─────────────────────────────────┐
│ Button 컴포넌트 │
│ - 액션: "데이터 전달 + 모달열기"│
│ - dataSourceId: (비워둠) │ ← 자동 감지!
└─────────────────────────────────┘
↓ (자동 감지)
┌─────────────────────────────────┐
│ 같은 화면에서 TableList 찾기 │
│ → tableName = "item_info" │
└─────────────────────────────────┘
↓ (URL 전달)
┌─────────────────────────────────┐
│ 모달 열기 │
│ URL: ?dataSourceId=item_info │
└─────────────────────────────────┘
```
### 3단계: SelectedItemsDetailInput (상세 입력 화면)
```
┌─────────────────────────────────┐
│ SelectedItemsDetailInput │
│ - dataSourceId: (비워둠) │ ← URL에서 자동 읽기!
└─────────────────────────────────┘
↓ (자동 읽기)
┌─────────────────────────────────┐
│ URL: ?dataSourceId=item_info │
│ → modalDataStore에서 데이터 로드│
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ 화면에 데이터 표시 │
│ 선택된 3개 품목 + 입력 필드 │
└─────────────────────────────────┘
```
---
## 🛠️ 설정 방법 (완전 자동)
### 1단계: 선택 화면 구성
#### TableList 컴포넌트
```yaml
테이블: item_info
옵션:
- 체크박스 표시: ✓
- 다중 선택: ✓
```
**설정 끝!** 선택된 데이터는 자동으로 `modalDataStore`에 저장됩니다.
#### Button 컴포넌트
```yaml
버튼 텍스트: "다음"
버튼 액션: "데이터 전달 + 모달 열기" 🆕
설정:
- 데이터 소스 ID: (비워둠) ← ✨ 자동 감지!
- 모달 제목: "상세 정보 입력"
- 모달 크기: Large
- 대상 화면: (상세 입력 화면 선택)
```
**중요**: `데이터 소스 ID`**비워두세요**! 자동으로 같은 화면의 TableList를 찾아서 테이블명을 사용합니다.
---
### 2단계: 상세 입력 화면 구성
#### SelectedItemsDetailInput 컴포넌트 추가
```yaml
컴포넌트: "선택 항목 상세입력"
```
**설정 끝!** URL 파라미터에서 자동으로 `dataSourceId`를 읽어옵니다.
#### 상세 설정 (선택사항)
```yaml
데이터 소스 ID: (비워둠) ← ✨ URL에서 자동!
표시할 컬럼:
- 품목코드 (item_code)
- 품목명 (item_name)
- 규격 (specification)
추가 입력 필드:
- 수량 (quantity): 숫자
- 단가 (unit_price): 숫자
- 납기일 (delivery_date): 날짜
- 비고 (remarks): 텍스트영역
옵션:
- 레이아웃: 테이블 형식 (Grid)
- 항목 번호 표시: ✓
- 항목 제거 허용: ☐
```
---
## 📊 실제 동작 시나리오
### 시나리오: 수주 등록
#### 1단계: 품목 선택
```
사용자가 품목 테이블에서 3개 선택:
✓ [PD-001] 케이블 100m
✓ [PD-002] 커넥터 50개
✓ [PD-003] 단자대 20개
```
#### 2단계: "다음" 버튼 클릭
```javascript
// 자동으로 일어나는 일:
1. 같은 화면에서 table-list 컴포넌트 찾기
→ componentType === "table-list"
→ tableName === "item_info"
2. modalDataStore에서 데이터 확인
→ modalData = [
{ id: "PD-001", originalData: {...} },
{ id: "PD-002", originalData: {...} },
{ id: "PD-003", originalData: {...} }
]
3. 모달 열기 + URL 파라미터 전달
→ URL: /screen/detail-input?dataSourceId=item_info
```
#### 3단계: 상세 정보 입력
```
자동으로 표시됨:
┌───────────────────────────────────────────────────────┐
│ 상세 정보 입력 │
├───────────────────────────────────────────────────────┤
│ # │ 품목코드 │ 품목명 │ 수량 │ 단가 │ 납기일 │
├───┼──────────┼────────────┼──────┼────────┼─────────┤
│ 1 │ PD-001 │ 케이블100m │ [ ] │ [ ] │ [ ] │
│ 2 │ PD-002 │ 커넥터50개 │ [ ] │ [ ] │ [ ] │
│ 3 │ PD-003 │ 단자대20개 │ [ ] │ [ ] │ [ ] │
└───────────────────────────────────────────────────────┘
사용자가 수량, 단가, 납기일만 입력하면 끝!
```
---
## 🎨 UI 미리보기
### Button 설정 화면
```
버튼 액션
├─ 데이터 전달 + 모달 열기 🆕
└─ 데이터 전달 + 모달 설정
├─ 데이터 소스 ID (선택사항)
│ [ ]
│ ✨ 비워두면 같은 화면의 TableList를 자동으로 감지합니다
│ 직접 지정하려면 테이블명을 입력하세요 (예: item_info)
├─ 모달 제목
│ [상세 정보 입력 ]
├─ 모달 크기
│ [큰 (Large) - 권장 ▼]
└─ 대상 화면 선택
[화면을 선택하세요... ▼]
```
### SelectedItemsDetailInput 설정 화면
```
데이터 소스 ID (자동 설정됨)
[ ]
✨ URL 파라미터에서 자동으로 가져옵니다 (Button이 전달)
테스트용으로 직접 입력하려면 테이블명을 입력하세요
```
---
## 🔍 자동화 원리
### 1. TableList → modalDataStore
```typescript
// TableListComponent.tsx
const handleRowSelection = (rowKey: string, checked: boolean) => {
// ... 선택 처리 ...
// 🆕 자동으로 스토어에 저장
const { useModalDataStore } = await import("@/stores/modalDataStore");
const dataSourceId = tableName; // item_info
const modalDataItems = selectedRowsData.map(row => ({
id: row.item_code,
originalData: row,
additionalData: {}
}));
useModalDataStore.getState().setData(dataSourceId, modalDataItems);
};
```
### 2. Button → TableList 자동 감지
```typescript
// buttonActions.ts - handleOpenModalWithData()
let dataSourceId = config.dataSourceId;
// 🆕 비워있으면 자동 감지
if (!dataSourceId && context.allComponents) {
const tableListComponent = context.allComponents.find(
(comp) => comp.componentType === "table-list" && comp.componentConfig?.tableName
);
if (tableListComponent) {
dataSourceId = tableListComponent.componentConfig.tableName;
console.log("✨ TableList 자동 감지:", dataSourceId);
}
}
// 🆕 URL 파라미터로 전달
const modalEvent = new CustomEvent("openScreenModal", {
detail: {
screenId: config.targetScreenId,
urlParams: { dataSourceId } // ← URL에 추가
}
});
```
### 3. SelectedItemsDetailInput → URL 읽기
```typescript
// SelectedItemsDetailInputComponent.tsx
import { useSearchParams } from "next/navigation";
const searchParams = useSearchParams();
const urlDataSourceId = searchParams?.get("dataSourceId");
// 🆕 우선순위: URL > 설정 > component.id
const dataSourceId = useMemo(
() => urlDataSourceId || componentConfig.dataSourceId || component.id,
[urlDataSourceId, componentConfig.dataSourceId, component.id]
);
// 🆕 스토어에서 데이터 로드
const dataRegistry = useModalDataStore((state) => state.dataRegistry);
const modalData = dataRegistry[dataSourceId] || [];
```
---
## 🧪 테스트 시나리오
### 기본 테스트
1. **화면 편집기 열기**
2. **첫 번째 화면 (선택) 만들기**:
- TableList 추가 (item_info)
- Button 추가 (버튼 액션: "데이터 전달 + 모달 열기")
- **dataSourceId는 비워둠!**
3. **두 번째 화면 (상세 입력) 만들기**:
- SelectedItemsDetailInput 추가
- **dataSourceId는 비워둠!**
- 표시 컬럼 설정
- 추가 입력 필드 설정
4. **할당된 화면에서 테스트**:
- 품목 3개 선택
- "다음" 버튼 클릭
- 상세 입력 화면에서 데이터 확인 ✅
### 고급 테스트 (직접 지정)
```yaml
시나리오: 여러 TableList가 있는 화면
화면 구성:
- TableList (item_info) ← 품목
- TableList (customer_info) ← 고객
- Button (품목 상세입력) ← dataSourceId: "item_info"
- Button (고객 상세입력) ← dataSourceId: "customer_info"
```
---
## 🚨 주의사항
### ❌ 잘못된 사용법
```yaml
# 1. 같은 화면에 TableList가 여러 개 있는데 비워둠
TableList 1: item_info
TableList 2: customer_info
Button: dataSourceId = (비워둠) ← 어느 것을 선택해야 할까?
해결: dataSourceId를 명시적으로 지정
```
### ✅ 올바른 사용법
```yaml
# 1. TableList가 1개인 경우
TableList: item_info
Button: dataSourceId = (비워둠) ← 자동 감지 OK!
# 2. TableList가 여러 개인 경우
TableList 1: item_info
TableList 2: customer_info
Button 1: dataSourceId = "item_info" ← 명시
Button 2: dataSourceId = "customer_info" ← 명시
```
---
## 🎯 완료 체크리스트
### 구현 완료 ✅
- [x] TableList → modalDataStore 자동 저장
- [x] Button → TableList 자동 감지
- [x] Button → URL 파라미터 전달
- [x] SelectedItemsDetailInput → URL 자동 읽기
- [x] 설정 패널 UI에 "자동" 힌트 추가
### 사용자 경험 ✅
- [x] dataSourceId 입력 불필요 (자동)
- [x] 일관된 데이터 흐름 (자동)
- [x] 오류 메시지 명확 (자동)
- [x] 직관적인 UI (자동 힌트)
---
## 📝 요약
**이제 사용자는 단 3단계만 하면 됩니다:**
1. **TableList 추가** → 테이블 선택
2. **Button 추가** → 액션 "데이터 전달 + 모달 열기" 선택
3. **SelectedItemsDetailInput 추가** → 필드 설정
**dataSourceId는 자동으로 처리됩니다!** ✨
---
## 🔗 관련 파일
- `frontend/stores/modalDataStore.ts` - 데이터 저장소
- `frontend/lib/utils/buttonActions.ts` - 버튼 액션 (자동 감지)
- `frontend/lib/registry/components/table-list/TableListComponent.tsx` - 자동 저장
- `frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputComponent.tsx` - URL 자동 읽기
- `frontend/components/screen/config-panels/ButtonConfigPanel.tsx` - 버튼 설정 UI
- `frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputConfigPanel.tsx` - 상세 입력 설정 UI
---
**🎉 완전 자동화 완료!**