ERP-node/플로우_위젯_컬럼_표시_설정_구현_완료.md

415 lines
13 KiB
Markdown
Raw Permalink Normal View History

# 플로우 위젯 단계별 컬럼 표시 설정 기능 구현 완료
## 📋 개요
플로우 위젯에서 각 단계별로 표시할 컬럼을 선택할 수 있는 기능을 **하이브리드 방식**으로 구현하였습니다.
### 하이브리드 방식의 장점
1. **플로우 에디터**에서 각 스텝의 **기본 컬럼 설정** 정의
2. **화면관리**에서 특정 화면에만 **컬럼 오버라이드** 가능
3. **우선순위**: 화면 설정 > 플로우 기본 설정 > 전체 컬럼 표시
---
## 🎯 구현 내용
### Phase 1: 데이터베이스 스키마 확장 ✅
**파일**: `db/migrations/023_add_display_config_to_flow_step.sql`
- `flow_step` 테이블에 `display_config` 컬럼 추가 (JSONB 타입)
- 인덱스 추가 (GIN 인덱스로 JSONB 검색 최적화)
```sql
ALTER TABLE flow_step
ADD COLUMN IF NOT EXISTS display_config JSONB DEFAULT NULL;
CREATE INDEX IF NOT EXISTS idx_flow_step_display_config
ON flow_step USING gin(display_config);
```
**구조**:
```json
{
"visibleColumns": ["column1", "column2", ...],
"columnOrder": ["column1", "column2", ...],
"columnLabels": {
"column1": "커스텀 라벨 1"
},
"columnWidths": {
"column1": 150
}
}
```
---
### Phase 2: 백엔드 타입 정의 업데이트 ✅
**파일**: `backend-node/src/types/flow.ts`
**새로운 인터페이스**:
```typescript
export interface FlowStepDisplayConfig {
visibleColumns?: string[];
columnOrder?: string[];
columnLabels?: Record<string, string>;
columnWidths?: Record<string, number>;
}
```
**FlowStep 인터페이스 확장**:
```typescript
export interface FlowStep {
// ... 기존 필드
displayConfig?: FlowStepDisplayConfig; // 🆕
}
```
**CreateFlowStepRequest 및 UpdateFlowStepRequest에도 추가됨**
---
### Phase 3: 워크플로우 에디터 - 스텝 속성 패널 UI 추가 ✅
**파일**: `frontend/components/flow/FlowStepPanel.tsx`
#### 추가된 기능
1. **테이블 컬럼 목록 자동 로드**
- 스텝의 테이블이 선택되면 해당 테이블의 컬럼 목록을 자동으로 가져옴
2. **"표시 설정" 카드 추가**
- 전체 선택/해제 체크박스
- 개별 컬럼 선택 체크박스
- 선택된 컬럼 개수 표시
```typescript
// formData에 displayConfig 추가
const [formData, setFormData] = useState({
// ... 기존 필드
displayConfig: step.displayConfig || { visibleColumns: [] }, // 🆕
});
```
#### UI 구조
```
┌─ 표시 설정 카드 ─────────────────────┐
│ 표시할 컬럼 선택 │
│ ┌────────────────────────────┐ │
│ │ ☐ 전체 선택/해제 │ │
│ ├────────────────────────────┤ │
│ │ ☑ id │ │
│ │ ☑ name │ │
│ │ ☐ description │ │
│ │ ☑ created_at │ │
│ └────────────────────────────┘ │
│ │
│ 💡 선택된 컬럼: 3개 │
└───────────────────────────────────────┘
```
---
### Phase 4: 플로우 위젯 - 컬럼 표시 로직 업데이트 ✅
**파일**: `frontend/components/screen/widgets/FlowWidget.tsx`
#### 핵심 로직: getVisibleColumns 함수
```typescript
/**
* 컬럼 표시 우선순위 결정 함수 (하이브리드 방식)
* 1순위: 화면 위젯 설정 (stepColumnConfig)
* 2순위: 플로우 스텝 기본 설정 (displayConfig)
* 3순위: 모든 컬럼 표시
*/
const getVisibleColumns = (stepId: number, allColumns: string[]): string[] => {
// 1순위: 화면 위젯 설정
const widgetConfig = component.stepColumnConfig;
if (widgetConfig && widgetConfig[stepId]) {
const config = widgetConfig[stepId];
if (config.selectedColumns && config.selectedColumns.length > 0) {
return config.selectedColumns;
}
}
// 2순위: 플로우 스텝 기본 설정
const currentStep = steps.find((s) => s.id === stepId);
if (
currentStep?.displayConfig?.visibleColumns &&
currentStep.displayConfig.visibleColumns.length > 0
) {
return currentStep.displayConfig.visibleColumns;
}
// 3순위: 모든 컬럼 표시
return allColumns;
};
```
#### 적용된 위치
1. 스텝 클릭 시 데이터 로드 (`handleStepClick`)
2. 플로우 새로고침 시 (`refreshStepData`)
---
### Phase 5: 화면관리 - 플로우 위젯 설정 패널 UI 추가 ✅
**파일**: `frontend/components/screen/config-panels/FlowWidgetConfigPanel.tsx`
#### 추가된 기능
1. **스텝 목록 자동 로드**
- 플로우가 선택되면 해당 플로우의 스텝 목록을 자동으로 가져옴
2. **테이블 컬럼 목록 자동 로드**
- 플로우의 테이블 컬럼 목록을 자동으로 가져옴
3. **"스텝별 컬럼 설정 (고급)" 섹션 추가**
- 토글 버튼으로 표시/숨김 가능
- 각 스텝별로 컬럼 선택 가능
- 커스텀 설정이 있으면 "초기화" 버튼 표시
#### UI 구조
```
┌─ 스텝별 컬럼 설정 (고급) ──────── [설정▼] ─┐
│ │
│ ┌─ 스텝 1: 주문 접수 ─────────── [초기화] ─┐ │
│ │ 커스텀 설정 (3개 컬럼) │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ ☑ id │ │ │
│ │ │ ☑ customer_name │ │ │
│ │ │ ☐ order_date │ │ │
│ │ │ ☑ amount │ │ │
│ │ └──────────────────────────┘ │ │
│ └─────────────────────────────────────────┘ │
│ │
│ ┌─ 스텝 2: 승인 대기 ──────────────────────┐ │
│ │ 기본 설정 사용 │ │
│ │ (플로우 정의에서 설정된 컬럼 표시) │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
```
---
### Phase 6: 프론트엔드 타입 정의 업데이트 ✅
**파일 1**: `frontend/types/flow.ts`
```typescript
export interface FlowStepDisplayConfig {
visibleColumns?: string[];
columnOrder?: string[];
columnLabels?: Record<string, string>;
columnWidths?: Record<string, number>;
}
export interface FlowStep {
// ... 기존 필드
displayConfig?: FlowStepDisplayConfig; // 🆕
}
```
**파일 2**: `frontend/types/screen-management.ts`
```typescript
export interface FlowStepColumnConfig {
selectedColumns: string[];
columnOrder?: string[];
}
export interface FlowComponent extends BaseComponent {
type: "flow";
// ... 기존 필드
stepColumnConfig?: {
[stepId: number]: FlowStepColumnConfig; // 🆕
};
}
```
---
## 🔄 사용 시나리오
### 시나리오 1: 플로우 기본 설정 사용 (일반적인 경우)
1. 플로우 관리 페이지에서 플로우 스텝 편집
2. "표시 설정" 카드에서 표시할 컬럼 선택 (예: id, name, created_at)
3. 저장
4. **모든 화면**에서 이 플로우를 사용할 때 선택한 컬럼만 표시됨
### 시나리오 2: 화면별 컬럼 오버라이드 (특수한 경우)
1. 화면 설계자 모드에서 플로우 위젯 선택
2. 속성 패널 > "스텝별 컬럼 설정 (고급)" 클릭
3. 특정 스텝의 컬럼을 다르게 선택 (예: id, amount만 표시)
4. 저장
5. **이 화면에서만** 오버라이드된 컬럼이 표시됨
### 시나리오 3: 아무 설정도 하지 않은 경우
- 모든 컬럼이 자동으로 표시됨 (기본 동작)
---
## 📊 우선순위 다이어그램
```
데이터 로드
┌────────────────────────────────────────┐
│ 1. 화면 위젯 설정 확인 │
│ (stepColumnConfig[stepId]) │
└────────────────────────────────────────┘
↓ 없음
┌────────────────────────────────────────┐
│ 2. 플로우 스텝 기본 설정 확인 │
│ (step.displayConfig.visibleColumns)│
└────────────────────────────────────────┘
↓ 없음
┌────────────────────────────────────────┐
│ 3. 모든 컬럼 표시 │
│ (Object.keys(data[0])) │
└────────────────────────────────────────┘
테이블 렌더링
```
---
## 🎨 UI/UX 특징
### 1. 점진적 공개 (Progressive Disclosure)
- 기본적으로는 간단한 UI만 표시
- "스텝별 컬럼 설정 (고급)"은 토글로 숨김/표시
### 2. 명확한 피드백
- 선택된 컬럼 개수 표시
- "커스텀 설정" vs "기본 설정 사용" 명확히 표시
- 초기화 버튼으로 쉽게 되돌리기 가능
### 3. 검색 가능한 체크박스 리스트
- 컬럼이 많을 경우 스크롤 가능
- font-mono로 컬럼명 명확히 표시
---
## 🧪 테스트 체크리스트
### 기능 테스트
- [ ] 데이터베이스 마이그레이션 실행 (`023_add_display_config_to_flow_step.sql`)
- [ ] 플로우 관리 페이지에서 스텝 속성 패널 열기
- [ ] "표시 설정" 카드에서 컬럼 선택 및 저장
- [ ] 플로우 위젯에서 선택한 컬럼만 표시되는지 확인
- [ ] 화면관리에서 특정 스텝의 컬럼 오버라이드 설정
- [ ] 오버라이드가 우선 적용되는지 확인
- [ ] 오버라이드 초기화 버튼 동작 확인
### 우선순위 테스트
1. **모든 설정 없음**: 전체 컬럼 표시 ✓
2. **플로우 기본 설정만**: 선택한 컬럼만 표시 ✓
3. **화면 오버라이드 설정**: 오버라이드된 컬럼만 표시 (최우선) ✓
### 엣지 케이스
- [ ] 컬럼이 없는 테이블 선택 시
- [ ] 모든 컬럼 선택 해제 시 (빈 배열) → 전체 표시
- [ ] 존재하지 않는 컬럼명 선택 시 (무시)
- [ ] 플로우 삭제 후 화면에서 참조하는 경우
---
## 📝 주의사항
### 1. 데이터베이스 마이그레이션
- 운영 환경에 배포하기 전에 반드시 마이그레이션 실행 필요
- 기존 데이터에는 영향 없음 (NULL 허용)
### 2. 하위 호환성
- `displayConfig`가 없으면 자동으로 전체 컬럼 표시 (기존 동작 유지)
- `stepColumnConfig`가 없으면 플로우 기본 설정 사용
### 3. 성능
- 컬럼 목록 로드는 테이블 선택 시 1회만 실행
- GIN 인덱스로 JSONB 검색 최적화
---
## 🚀 향후 개선 방안 (선택사항)
### 1. 컬럼 순서 변경 기능
- Drag & Drop으로 컬럼 순서 변경
- `columnOrder` 필드 활용
### 2. 컬럼별 커스텀 라벨
- 표시명을 사용자가 직접 지정
- `columnLabels` 필드 활용
### 3. 컬럼 너비 설정
- 각 컬럼의 표시 너비 조정
- `columnWidths` 필드 활용
### 4. 빠른 프리셋
- "기본 정보만", "전체 정보", "요약 정보" 등 프리셋 제공
---
## 📚 관련 파일 목록
### 데이터베이스
- `db/migrations/023_add_display_config_to_flow_step.sql`
### 백엔드
- `backend-node/src/types/flow.ts`
### 프론트엔드 (타입)
- `frontend/types/flow.ts`
- `frontend/types/screen-management.ts`
### 프론트엔드 (컴포넌트)
- `frontend/components/screen/widgets/FlowWidget.tsx`
- `frontend/components/flow/FlowStepPanel.tsx`
- `frontend/components/screen/config-panels/FlowWidgetConfigPanel.tsx`
---
## ✅ 구현 완료
모든 Phase가 성공적으로 완료되었습니다!
**구현 날짜**: 2025-10-24
**구현 방식**: 하이브리드 (플로우 에디터 기본 설정 + 화면관리 오버라이드)
**적용 범위**:
- 플로우 관리 시스템 (플로우 정의 편집)
- 화면관리 시스템 (플로우 위젯 설정)
- 실제 화면 표시 (플로우 위젯 렌더링)