163 lines
5.1 KiB
Markdown
163 lines
5.1 KiB
Markdown
|
|
# v2-table-grouped (그룹화 테이블)
|
||
|
|
|
||
|
|
## 개요
|
||
|
|
|
||
|
|
데이터를 특정 컬럼 기준으로 그룹화하여 접기/펼치기 기능을 제공하는 테이블 컴포넌트입니다.
|
||
|
|
|
||
|
|
## 주요 기능
|
||
|
|
|
||
|
|
- **그룹화**: 지정된 컬럼 기준으로 데이터를 그룹핑
|
||
|
|
- **접기/펼치기**: 그룹 헤더 클릭으로 하위 항목 토글
|
||
|
|
- **그룹 요약**: 그룹별 개수, 합계, 평균, 최대/최소값 표시
|
||
|
|
- **체크박스 선택**: 그룹 단위 또는 개별 항목 선택
|
||
|
|
- **전체 펼치기/접기**: 모든 그룹 일괄 토글 버튼
|
||
|
|
|
||
|
|
## 사용 예시
|
||
|
|
|
||
|
|
```tsx
|
||
|
|
import { TableGroupedComponent } from "./TableGroupedComponent";
|
||
|
|
|
||
|
|
<TableGroupedComponent
|
||
|
|
config={{
|
||
|
|
selectedTable: "production_plan_mng",
|
||
|
|
groupConfig: {
|
||
|
|
groupByColumn: "item_code",
|
||
|
|
groupLabelFormat: "{item_name} ({item_code})",
|
||
|
|
defaultExpanded: true,
|
||
|
|
summary: {
|
||
|
|
showCount: true,
|
||
|
|
sumColumns: ["quantity"],
|
||
|
|
},
|
||
|
|
},
|
||
|
|
columns: [
|
||
|
|
{ columnName: "plan_no", displayName: "계획번호", visible: true },
|
||
|
|
{ columnName: "plan_date", displayName: "계획일", visible: true },
|
||
|
|
{ columnName: "quantity", displayName: "수량", visible: true, format: "number" },
|
||
|
|
],
|
||
|
|
showCheckbox: true,
|
||
|
|
checkboxMode: "multi",
|
||
|
|
showExpandAllButton: true,
|
||
|
|
}}
|
||
|
|
onSelectionChange={(event) => console.log("선택:", event.selectedItems)}
|
||
|
|
onRowClick={(event) => console.log("행 클릭:", event.row)}
|
||
|
|
/>
|
||
|
|
```
|
||
|
|
|
||
|
|
## 설정 옵션
|
||
|
|
|
||
|
|
### 기본 설정
|
||
|
|
|
||
|
|
| 옵션 | 타입 | 기본값 | 설명 |
|
||
|
|
|------|------|--------|------|
|
||
|
|
| `selectedTable` | string | - | 데이터 테이블명 |
|
||
|
|
| `useCustomTable` | boolean | false | 커스텀 테이블 사용 여부 |
|
||
|
|
| `customTableName` | string | - | 커스텀 테이블명 |
|
||
|
|
| `columns` | ColumnConfig[] | [] | 표시할 컬럼 설정 |
|
||
|
|
|
||
|
|
### 그룹화 설정 (groupConfig)
|
||
|
|
|
||
|
|
| 옵션 | 타입 | 기본값 | 설명 |
|
||
|
|
|------|------|--------|------|
|
||
|
|
| `groupByColumn` | string | - | 그룹화 기준 컬럼 (필수) |
|
||
|
|
| `groupLabelFormat` | string | "{value}" | 그룹 라벨 형식 |
|
||
|
|
| `defaultExpanded` | boolean | true | 초기 펼침 상태 |
|
||
|
|
| `sortDirection` | "asc" \| "desc" | "asc" | 그룹 정렬 방향 |
|
||
|
|
| `summary.showCount` | boolean | true | 개수 표시 여부 |
|
||
|
|
| `summary.sumColumns` | string[] | [] | 합계 컬럼 목록 |
|
||
|
|
| `summary.avgColumns` | string[] | [] | 평균 컬럼 목록 |
|
||
|
|
|
||
|
|
### 표시 설정
|
||
|
|
|
||
|
|
| 옵션 | 타입 | 기본값 | 설명 |
|
||
|
|
|------|------|--------|------|
|
||
|
|
| `showCheckbox` | boolean | false | 체크박스 표시 |
|
||
|
|
| `checkboxMode` | "single" \| "multi" | "multi" | 선택 모드 |
|
||
|
|
| `showExpandAllButton` | boolean | true | 전체 펼치기/접기 버튼 |
|
||
|
|
| `groupHeaderStyle` | "default" \| "compact" \| "card" | "default" | 그룹 헤더 스타일 |
|
||
|
|
| `rowClickable` | boolean | true | 행 클릭 가능 여부 |
|
||
|
|
| `maxHeight` | number | 600 | 최대 높이 (px) |
|
||
|
|
| `emptyMessage` | string | "데이터가 없습니다." | 빈 데이터 메시지 |
|
||
|
|
|
||
|
|
## 이벤트
|
||
|
|
|
||
|
|
### onSelectionChange
|
||
|
|
|
||
|
|
선택 상태가 변경될 때 호출됩니다.
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface SelectionChangeEvent {
|
||
|
|
selectedGroups: string[]; // 선택된 그룹 키 목록
|
||
|
|
selectedItems: any[]; // 선택된 아이템 전체
|
||
|
|
isAllSelected: boolean; // 전체 선택 여부
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### onGroupToggle
|
||
|
|
|
||
|
|
그룹 펼치기/접기 시 호출됩니다.
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface GroupToggleEvent {
|
||
|
|
groupKey: string; // 그룹 키
|
||
|
|
expanded: boolean; // 펼침 상태
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### onRowClick
|
||
|
|
|
||
|
|
행 클릭 시 호출됩니다.
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface RowClickEvent {
|
||
|
|
row: any; // 클릭된 행 데이터
|
||
|
|
groupKey: string; // 그룹 키
|
||
|
|
indexInGroup: number; // 그룹 내 인덱스
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 그룹 라벨 형식
|
||
|
|
|
||
|
|
`groupLabelFormat`에서 사용 가능한 플레이스홀더:
|
||
|
|
|
||
|
|
- `{value}`: 그룹화 컬럼의 값
|
||
|
|
- `{컬럼명}`: 해당 컬럼의 값
|
||
|
|
|
||
|
|
**예시:**
|
||
|
|
```
|
||
|
|
groupLabelFormat: "{item_name} ({item_code}) - {category}"
|
||
|
|
// 결과: "제품A (P001) - 완제품"
|
||
|
|
```
|
||
|
|
|
||
|
|
## 파일 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
v2-table-grouped/
|
||
|
|
├── index.ts # Definition
|
||
|
|
├── types.ts # 타입 정의
|
||
|
|
├── config.ts # 기본 설정값
|
||
|
|
├── TableGroupedComponent.tsx # 메인 컴포넌트
|
||
|
|
├── TableGroupedConfigPanel.tsx # 설정 패널
|
||
|
|
├── TableGroupedRenderer.tsx # 레지스트리 등록
|
||
|
|
├── components/
|
||
|
|
│ └── GroupHeader.tsx # 그룹 헤더
|
||
|
|
├── hooks/
|
||
|
|
│ └── useGroupedData.ts # 그룹화 로직 훅
|
||
|
|
└── README.md
|
||
|
|
```
|
||
|
|
|
||
|
|
## v2-table-list와의 차이점
|
||
|
|
|
||
|
|
| 항목 | v2-table-list | v2-table-grouped |
|
||
|
|
|------|---------------|------------------|
|
||
|
|
| 데이터 구조 | 플랫 리스트 | 계층 구조 (그룹 > 아이템) |
|
||
|
|
| 렌더링 | 행 단위 | 그룹 헤더 + 상세 행 |
|
||
|
|
| 선택 | 개별 행 | 그룹 단위 / 개별 단위 |
|
||
|
|
| 요약 | 전체 합계 (선택) | 그룹별 요약 |
|
||
|
|
| 용도 | 일반 데이터 목록 | 카테고리별 분류 데이터 |
|
||
|
|
|
||
|
|
## 관련 컴포넌트
|
||
|
|
|
||
|
|
- `v2-table-list`: 기본 테이블 (그룹화 없음)
|
||
|
|
- `v2-pivot-grid`: 피벗 테이블 (다차원 집계)
|
||
|
|
- `v2-split-panel-layout`: 마스터-디테일 레이아웃
|