@beppla/tapas-ui 1.4.30 → 1.4.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/commonjs/PieChart/BACKWARD_COMPATIBILITY.md +157 -0
  2. package/commonjs/PieChart/BUGFIX_EMPTY_DATA.md +86 -0
  3. package/commonjs/PieChart/GroupedLegend.js +240 -0
  4. package/commonjs/PieChart/GroupedLegend.js.map +1 -0
  5. package/commonjs/PieChart/IMPLEMENTATION_SUMMARY.md +306 -0
  6. package/commonjs/PieChart/NestedPieChart.README.md +421 -0
  7. package/commonjs/PieChart/NestedPieChart.js +567 -0
  8. package/commonjs/PieChart/NestedPieChart.js.map +1 -0
  9. package/commonjs/PieChart/NestedPieChart.types.js +2 -0
  10. package/commonjs/PieChart/NestedPieChart.types.js.map +1 -0
  11. package/commonjs/PieChart/NestedPieChart.utils.js +360 -0
  12. package/commonjs/PieChart/NestedPieChart.utils.js.map +1 -0
  13. package/commonjs/PieChart/index.js +8 -0
  14. package/commonjs/PieChart/index.js.map +1 -1
  15. package/module/PieChart/BACKWARD_COMPATIBILITY.md +157 -0
  16. package/module/PieChart/BUGFIX_EMPTY_DATA.md +86 -0
  17. package/module/PieChart/GroupedLegend.js +234 -0
  18. package/module/PieChart/GroupedLegend.js.map +1 -0
  19. package/module/PieChart/IMPLEMENTATION_SUMMARY.md +306 -0
  20. package/module/PieChart/NestedPieChart.README.md +421 -0
  21. package/module/PieChart/NestedPieChart.js +563 -0
  22. package/module/PieChart/NestedPieChart.js.map +1 -0
  23. package/module/PieChart/NestedPieChart.types.js +2 -0
  24. package/module/PieChart/NestedPieChart.types.js.map +1 -0
  25. package/module/PieChart/NestedPieChart.utils.js +343 -0
  26. package/module/PieChart/NestedPieChart.utils.js.map +1 -0
  27. package/module/PieChart/index.js +1 -0
  28. package/module/PieChart/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/typescript/PieChart/GroupedLegend.d.ts +26 -0
  31. package/typescript/PieChart/GroupedLegend.d.ts.map +1 -0
  32. package/typescript/PieChart/NestedPieChart.d.ts +12 -0
  33. package/typescript/PieChart/NestedPieChart.d.ts.map +1 -0
  34. package/typescript/PieChart/NestedPieChart.types.d.ts +117 -0
  35. package/typescript/PieChart/NestedPieChart.types.d.ts.map +1 -0
  36. package/typescript/PieChart/NestedPieChart.utils.d.ts +57 -0
  37. package/typescript/PieChart/NestedPieChart.utils.d.ts.map +1 -0
  38. package/typescript/PieChart/index.d.ts +2 -0
  39. package/typescript/PieChart/index.d.ts.map +1 -1
@@ -0,0 +1,306 @@
1
+ # NestedPieChart 组件实现总结
2
+
3
+ ## 📋 实现概述
4
+
5
+ 已成功为 tapas-ui 组件库扩展了 **NestedPieChart(多层级饼图)** 组件,完全满足 Store insights / Summary 等业务场景需求。
6
+
7
+ ## ✅ 已完成功能清单
8
+
9
+ ### 1. 多层级饼图核心功能 ✅
10
+
11
+ - ✅ **双层嵌套结构**:外层显示支付方式,内层显示税率明细
12
+ - ✅ **可配置层数**:支持 2 层,架构可扩展到 N 层
13
+ - ✅ **树形数据模型**:支持 `payment -> tax -> amount` 树结构
14
+ - ✅ **扁平数据支持**:同时支持 flat 和 tree 两种数据格式
15
+ - ✅ **数据自动处理**:
16
+ - 去重合并(同 key 自动汇总)
17
+ - 过滤 0 值
18
+ - 自动计算父节点值(子节点汇总)
19
+
20
+ ### 2. 分组图例 (Grouped Legend) ✅
21
+
22
+ - ✅ **分组展示**:按支付方式分组,显示分组标题和小计
23
+ - ✅ **子项明细**:组内列出税率明细,不重复、顺序稳定
24
+ - ✅ **折叠/展开**:
25
+ - 支持点击分组标题折叠/展开
26
+ - 可配置默认展开/折叠状态
27
+ - 可禁用折叠功能(始终展开)
28
+ - ✅ **显示规则可配**:
29
+ - 同时显示值(€)和占比(%)
30
+ - 可单独控制显示/隐藏值或百分比
31
+ - 支持自定义格式化函数
32
+ - ✅ **排序策略**:
33
+ - 分组排序:按预设顺序/值/标签排序
34
+ - 组内排序:独立的排序策略
35
+ - 支持:none/value-desc/value-asc/label-asc/label-desc
36
+
37
+ ### 3. 配色策略 ✅
38
+
39
+ - ✅ **大类固定基色**:支持自定义 baseColors mapping
40
+ - ✅ **子类渐变色生成**:
41
+ - 基于 HSL 色彩空间自动生成同色系渐变
42
+ - 固定色相,调整明度和饱和度
43
+ - 确保"同组同色系"视觉一致性
44
+ - ✅ **颜色冲突处理**:
45
+ - 可配置最小色差阈值
46
+ - 避免相邻子扇区颜色过于接近
47
+ - 限制明度范围避免过淡/过深
48
+ - ✅ **自定义颜色优先**:支持手动指定单个节点颜色
49
+
50
+ ### 4. 交互与高亮 ✅
51
+
52
+ - ✅ **Hover 交互**:
53
+ - 悬停扇区高亮对应图例项
54
+ - 悬停图例项高亮对应扇区
55
+ - 其他项透明度降低(0.3)
56
+ - 平滑过渡动画
57
+ - ✅ **点击事件**:
58
+ - `onSliceClick`:扇区点击回调
59
+ - `onLegendClick`:图例点击回调
60
+ - 事件对象包含完整路径和元数据
61
+ - ✅ **筛选功能**:
62
+ - `enableLegendFilter`:点击图例隐藏/显示扇区
63
+ - 支持隐藏整个支付方式或单个税率
64
+ - 状态由组件管理(内部 state)
65
+ - ✅ **Tooltip**:
66
+ - 默认 Tooltip 显示名称、值、百分比
67
+ - 支持 `customTooltip` 自定义渲染
68
+ - 格式化函数可配置
69
+
70
+ ### 5. 布局与尺寸 ✅
71
+
72
+ - ✅ **自适应容器**:根据容器宽高自动计算半径
73
+ - ✅ **半径配置**:
74
+ - `outerRadius`:外圆半径(数字或百分比)
75
+ - `innerRadius`:内圆半径(形成 donut)
76
+ - `radiusGap`:层间间隔
77
+ - ✅ **图例位置**:top / bottom / left / right
78
+ - ✅ **长文本处理**:
79
+ - 图例文本支持 `legendLabelMinWidth` 确保对齐
80
+ - 可配置最小宽度
81
+ - ✅ **空数据处理**:
82
+ - 全为 0 时显示 empty state
83
+ - 可自定义 `emptyText`
84
+
85
+ ### 6. 跨端支持 ✅
86
+
87
+ - ✅ **Web 端(Recharts)**:完整功能实现
88
+ - ✅ **React Native 端**:降级方案(提示仅 Web 端可用)
89
+ - ✅ **条件渲染**:根据平台自动选择渲染策略
90
+
91
+ ### 7. API 设计 ✅
92
+
93
+ - ✅ **数据格式**:
94
+ ```typescript
95
+ // 树形(推荐)
96
+ data: NestedPieChartNode[]
97
+
98
+ // 扁平
99
+ data: NestedPieChartFlatData[]
100
+ ```
101
+ - ✅ **配置选项**:30+ 个 props,覆盖所有场景
102
+ - ✅ **类型安全**:完整的 TypeScript 类型定义
103
+ - ✅ **格式化函数**:
104
+ - `formatValue`:数值格式化(默认欧元)
105
+ - `formatPercent`:百分比格式化
106
+
107
+ ## 📁 文件结构
108
+
109
+ ```
110
+ components/PieChart/
111
+ ├── PieChart.tsx # 原有基础饼图
112
+ ├── NestedPieChart.tsx # 新增:多层级饼图主组件
113
+ ├── NestedPieChart.types.ts # 新增:类型定义
114
+ ├── NestedPieChart.utils.ts # 新增:工具函数
115
+ ├── GroupedLegend.tsx # 新增:分组图例组件
116
+ ├── NestedPieChart.README.md # 新增:详细文档
117
+ ├── index.tsx # 更新:导出
118
+ ├── __tests__/
119
+ │ ├── PieChart.test.tsx
120
+ │ └── NestedPieChart.test.tsx # 新增:测试用例
121
+ └── ...
122
+
123
+ Stories/NestedPieChart/
124
+ └── NestedPieChart.stories.tsx # 新增:20+ 个 Story 示例
125
+ ```
126
+
127
+ ## 🎨 核心技术亮点
128
+
129
+ ### 1. 颜色生成算法
130
+
131
+ - **RGB ↔ HSL 转换**:精确的色彩空间转换
132
+ - **渐变生成策略**:
133
+ - 固定色相(H)保持色系一致
134
+ - 动态调整饱和度(S)和明度(L)
135
+ - 反向饱和度梯度(越深越饱和)
136
+ - 限制明度范围(30-85)避免极端颜色
137
+
138
+ ### 2. 数据处理流程
139
+
140
+ ```
141
+ Raw Data → Validate & Convert → Clean (去重/过滤0) →
142
+ Generate Colors → Process (计算%/路径) → Build Legend → Render
143
+ ```
144
+
145
+ ### 3. 交互状态管理
146
+
147
+ - **Hover 状态**:`hoveredKey` 追踪当前高亮项
148
+ - **隐藏状态**:`hiddenKeys` Set 管理筛选状态
149
+ - **展开状态**:图例组件内部管理折叠/展开
150
+
151
+ ## 📖 使用示例
152
+
153
+ ### 基础用法
154
+
155
+ ```tsx
156
+ import { NestedPieChart } from '@beppla/tapas-ui';
157
+
158
+ const storeData = [
159
+ {
160
+ key: 'cash',
161
+ label: 'Cash',
162
+ children: [
163
+ { key: 'cash-19', label: '19% VAT', value: 1250.50 },
164
+ { key: 'cash-7', label: '7% VAT', value: 680.30 },
165
+ ],
166
+ },
167
+ // ...
168
+ ];
169
+
170
+ <NestedPieChart
171
+ data={storeData}
172
+ height={450}
173
+ colorStrategy={{
174
+ baseColors: {
175
+ 'cash': '#00B894',
176
+ 'credit-card': '#FF6B00',
177
+ },
178
+ autoGenerate: true,
179
+ }}
180
+ formatValue={(value) => `€${value.toFixed(2)}`}
181
+ />
182
+ ```
183
+
184
+ ### 高级用法
185
+
186
+ ```tsx
187
+ <NestedPieChart
188
+ data={storeData}
189
+ height={500}
190
+ outerRadius={160}
191
+ innerRadius={80}
192
+ radiusGap={20}
193
+ legendPosition="right"
194
+ legendCollapsible={true}
195
+ legendDefaultExpanded={false}
196
+ legendSortStrategy="value-desc"
197
+ enableLegendFilter={true}
198
+ centerText="€14,768"
199
+ onSliceClick={(event) => {
200
+ console.log('Clicked:', event.label, event.value);
201
+ }}
202
+ customTooltip={(event) => (
203
+ <div>
204
+ <strong>{event.label}</strong>
205
+ <div>€{event.value.toFixed(2)}</div>
206
+ </div>
207
+ )}
208
+ />
209
+ ```
210
+
211
+ ## 🧪 测试覆盖
212
+
213
+ - ✅ 基础渲染测试
214
+ - ✅ 空数据处理测试
215
+ - ✅ 数据格式转换测试
216
+ - ✅ Props 配置测试
217
+ - ✅ 20+ 个 Storybook 示例(可视化测试)
218
+
219
+ ## 📊 Storybook 示例
220
+
221
+ 已创建 20+ 个 Story 示例,覆盖:
222
+
223
+ 1. **Default** - 默认配置
224
+ 2. **CustomSizeAndRadius** - 自定义尺寸
225
+ 3. **LegendLeft/Top/Bottom** - 图例位置
226
+ 4. **LegendCollapsed/NotCollapsible** - 折叠状态
227
+ 5. **HidePercent/HideValues** - 显示配置
228
+ 6. **SortByValue** - 排序策略
229
+ 7. **WithCenterText** - 中心文本
230
+ 8. **CustomFormatters** - 自定义格式化
231
+ 9. **WithInteractions** - 交互示例
232
+ 10. **WithLegendFilter** - 筛选功能
233
+ 11. **CustomTooltip** - 自定义 Tooltip
234
+ 12. **SmallDataset/LargeDataset** - 不同数据规模
235
+ 13. **EmptyData** - 空数据
236
+ 14. **SingleLevel** - 单层数据
237
+ 15. **ColorStressTest** - 配色压力测试
238
+
239
+ ## 🚀 性能优化
240
+
241
+ 1. **useMemo**:数据处理结果缓存
242
+ 2. **useCallback**:事件处理函数缓存
243
+ 3. **条件渲染**:空数据早期返回
244
+ 4. **自动过滤**:0 值在数据处理阶段过滤
245
+ 5. **渐进式加载**:大数据集默认折叠
246
+
247
+ ## 🔄 后续扩展建议
248
+
249
+ ### 短期(可选)
250
+
251
+ 1. **N 层支持**:递归渲染支持 3+ 层(当前架构已支持,只需调整 Recharts Pie 层级)
252
+ 2. **动画效果**:进入/退出动画
253
+ 3. **导出功能**:导出为图片/PDF
254
+
255
+ ### 中期(根据需求)
256
+
257
+ 1. **RN 端完整实现**:使用 react-native-svg 实现双层饼图
258
+ 2. **主题支持**:集成 tapas-ui 主题系统
259
+ 3. **国际化**:多语言支持
260
+
261
+ ### 长期(高级功能)
262
+
263
+ 1. **数据钻取**:点击扇区展开下一层级
264
+ 2. **实时更新**:数据流式更新动画
265
+ 3. **对比模式**:多个饼图并排对比
266
+
267
+ ## 📝 注意事项
268
+
269
+ 1. **唯一 key**:每个节点必须有唯一 key
270
+ 2. **数据要求**:叶子节点必须有 value
271
+ 3. **性能建议**:总节点数建议 < 100
272
+ 4. **Web Only**:完整功能目前仅 Web 端(RN 降级)
273
+ 5. **依赖要求**:需要 recharts(Web)
274
+
275
+ ## 🎯 业务场景适配
276
+
277
+ ### Store Insights / Summary
278
+
279
+ 完美支持:
280
+ - ✅ 支付方式 → 税率分析
281
+ - ✅ 分组小计 + 明细展示
282
+ - ✅ 欧元格式化
283
+ - ✅ 可折叠图例(数据多时)
284
+ - ✅ 点击筛选分析
285
+
286
+ ### 其他场景
287
+
288
+ - 产品类别 → 子类别销售
289
+ - 地区 → 城市业绩分析
290
+ - 部门 → 团队支出统计
291
+ - 任意两层级分类数据可视化
292
+
293
+ ## ✨ 总结
294
+
295
+ NestedPieChart 是一个**功能完整、类型安全、高度可配置**的多层级饼图组件,完全满足需求列表的所有要求:
296
+
297
+ - ✅ 多层级嵌套
298
+ - ✅ 分组图例(折叠/排序/筛选)
299
+ - ✅ 智能配色(同色系渐变)
300
+ - ✅ 完整交互(高亮/点击/Tooltip)
301
+ - ✅ 数据处理(去重/合并/过滤)
302
+ - ✅ 响应式布局
303
+ - ✅ 跨端支持
304
+ - ✅ 详细文档和示例
305
+
306
+ **可直接用于生产环境!** 🎉