# 플로우 위젯 단계별 컬럼 표시 설정 기능 구현 완료

## 📋 개요

플로우 위젯에서 각 단계별로 표시할 컬럼을 선택할 수 있는 기능을 **하이브리드 방식**으로 구현하였습니다.

### 하이브리드 방식의 장점

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

**구현 방식**: 하이브리드 (플로우 에디터 기본 설정 + 화면관리 오버라이드)

**적용 범위**:

- 플로우 관리 시스템 (플로우 정의 편집)
- 화면관리 시스템 (플로우 위젯 설정)
- 실제 화면 표시 (플로우 위젯 렌더링)
