@agions/taroviz 1.10.0 → 1.11.5

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 (109) hide show
  1. package/README.md +122 -275
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/cjs/vendors.js +1 -0
  4. package/dist/cjs/vendors~echarts.js +1 -0
  5. package/dist/esm/index.js +7106 -50834
  6. package/dist/esm/vendors.js +16770 -0
  7. package/dist/esm/vendors~echarts.js +59417 -0
  8. package/package.json +10 -11
  9. package/src/adapters/MiniAppAdapter.ts +136 -0
  10. package/src/adapters/__tests__/index.test.ts +1 -1
  11. package/src/adapters/h5/__tests__/index.test.ts +4 -2
  12. package/src/adapters/h5/index.ts +32 -33
  13. package/src/adapters/harmony/index.ts +23 -245
  14. package/src/adapters/index.ts +18 -12
  15. package/src/adapters/swan/index.ts +6 -69
  16. package/src/adapters/tt/index.ts +7 -70
  17. package/src/adapters/types.ts +2 -3
  18. package/src/adapters/weapp/index.ts +6 -69
  19. package/src/charts/__tests__/testUtils.tsx +87 -0
  20. package/src/charts/boxplot/__tests__/index.test.tsx +49 -103
  21. package/src/charts/boxplot/index.tsx +2 -1
  22. package/src/charts/boxplot/types.ts +15 -14
  23. package/src/charts/common/BaseChartWrapper.tsx +84 -78
  24. package/src/charts/common/__mocks__/BaseChartWrapper.tsx +17 -0
  25. package/src/charts/createChartComponent.tsx +48 -0
  26. package/src/charts/index.ts +88 -30
  27. package/src/charts/liquid/index.tsx +260 -77
  28. package/src/charts/liquid/types.ts +5 -5
  29. package/src/charts/parallel/__tests__/index.test.tsx +40 -67
  30. package/src/charts/parallel/index.tsx +2 -1
  31. package/src/charts/parallel/types.ts +16 -15
  32. package/src/charts/tree/index.tsx +4 -1
  33. package/src/charts/tree/types.ts +1 -1
  34. package/src/charts/utils.ts +9 -7
  35. package/src/components/DataFilter/index.tsx +25 -4
  36. package/src/core/animation/AnimationManager.ts +9 -6
  37. package/src/core/animation/types.ts +30 -0
  38. package/src/core/components/Annotation.tsx +2 -3
  39. package/src/core/components/BaseChart.tsx +60 -72
  40. package/src/core/components/ErrorBoundary.tsx +17 -4
  41. package/src/core/components/LazyChart.tsx +83 -57
  42. package/src/core/components/hooks/useChartInit.ts +6 -3
  43. package/src/core/index.ts +1 -1
  44. package/src/core/themes/ThemeManager.ts +1 -1
  45. package/src/core/types/common.ts +100 -5
  46. package/src/core/types/index.ts +0 -12
  47. package/src/core/types/platform.ts +2 -5
  48. package/src/core/utils/codeGenerator/CodeGenerator.ts +1 -1
  49. package/src/core/utils/codeGenerator/types.ts +2 -2
  50. package/src/core/utils/common.ts +12 -5
  51. package/src/core/utils/configGenerator/ConfigGenerator.ts +4 -4
  52. package/src/core/utils/configGenerator/types.ts +16 -12
  53. package/src/core/utils/debug/DebugPanel.tsx +14 -11
  54. package/src/core/utils/debug/debugger.ts +9 -9
  55. package/src/core/utils/debug/types.ts +4 -4
  56. package/src/core/utils/download.ts +134 -0
  57. package/src/core/utils/drillDown.ts +33 -353
  58. package/src/core/utils/drillDownHelpers.ts +426 -0
  59. package/src/core/utils/export/ExportUtils.ts +67 -69
  60. package/src/core/utils/index.ts +23 -15
  61. package/src/core/utils/performance/PerformanceAnalyzer.ts +43 -18
  62. package/src/core/utils/performance/types.ts +10 -1
  63. package/src/core/utils/performanceUtils.ts +310 -0
  64. package/src/core/utils/setOptionUtils.ts +59 -0
  65. package/src/core/version.ts +14 -0
  66. package/src/editor/EnhancedThemeEditor.tsx +362 -540
  67. package/src/editor/ThemeEditor.tsx +55 -321
  68. package/src/editor/components/ThemeBasicSettings.tsx +113 -0
  69. package/src/editor/components/ThemeColorEditor.tsx +105 -0
  70. package/src/editor/components/ThemeSelector.tsx +70 -0
  71. package/src/editor/hooks/useThemeEditorState.ts +201 -0
  72. package/src/editor/index.ts +10 -2
  73. package/src/hooks/__tests__/index.test.tsx +3 -1
  74. package/src/hooks/chartConnectHelpers.ts +335 -0
  75. package/src/hooks/index.ts +62 -63
  76. package/src/hooks/types.ts +162 -0
  77. package/src/hooks/useAnimation.ts +41 -38
  78. package/src/hooks/useChartConnect.ts +88 -238
  79. package/src/hooks/useChartDownload.ts +42 -288
  80. package/src/hooks/useChartHistory.ts +33 -46
  81. package/src/hooks/useChartSelection.ts +31 -39
  82. package/src/hooks/useDataTransform.ts +39 -286
  83. package/src/hooks/useDataZoom.ts +164 -168
  84. package/src/hooks/usePerformance.ts +20 -12
  85. package/src/hooks/usePerformanceHooks.ts +278 -0
  86. package/src/hooks/utils/chartDownloadUtils.ts +260 -0
  87. package/src/hooks/utils/dataTransformUtils.ts +309 -0
  88. package/src/index.ts +52 -33
  89. package/src/main.tsx +4 -9
  90. package/src/charts/bar/__tests__/index.test.tsx +0 -113
  91. package/src/charts/bar/index.tsx +0 -14
  92. package/src/charts/candlestick/__tests__/index.test.tsx +0 -37
  93. package/src/charts/candlestick/index.tsx +0 -13
  94. package/src/charts/funnel/index.tsx +0 -14
  95. package/src/charts/gauge/index.tsx +0 -14
  96. package/src/charts/graph/__tests__/index.test.tsx +0 -41
  97. package/src/charts/graph/index.tsx +0 -13
  98. package/src/charts/heatmap/index.tsx +0 -14
  99. package/src/charts/line/__tests__/index.test.tsx +0 -107
  100. package/src/charts/line/index.tsx +0 -15
  101. package/src/charts/pie/__tests__/index.test.tsx +0 -112
  102. package/src/charts/pie/index.tsx +0 -14
  103. package/src/charts/radar/index.tsx +0 -14
  104. package/src/charts/sankey/index.tsx +0 -18
  105. package/src/charts/scatter/index.tsx +0 -14
  106. package/src/charts/sunburst/index.tsx +0 -18
  107. package/src/charts/treemap/index.tsx +0 -18
  108. package/src/charts/wordcloud/__tests__/index.test.tsx +0 -36
  109. package/src/charts/wordcloud/index.tsx +0 -13
@@ -1,57 +1,36 @@
1
1
  /**
2
2
  * useChartConnect - 图表联动 Hook
3
3
  * 实现多个图表之间的联动(chartConnect),当一个图表被操作时,其他联动图表同步变化
4
+ *
5
+ * @refactor 已拆分为多个辅助函数,详见 chartConnectHelpers.ts
4
6
  */
5
- import { useRef, useCallback, useEffect } from 'react';
6
- import type { ChartInstance } from './index';
7
+ import { useRef, useCallback, useEffect, useMemo } from 'react';
8
+ import type {
9
+ ChartInstance,
10
+ UseChartConnectOptions,
11
+ UseChartConnectReturn,
12
+ ConnectEventType,
13
+ } from './types';
14
+ import {
15
+ createConnectHandler,
16
+ dispatchToOthers,
17
+ bindChartEvents,
18
+ unbindChartEvents,
19
+ connectChart,
20
+ disconnectChart,
21
+ connectAllCharts,
22
+ disconnectAllCharts,
23
+ dispatchConnectEvent,
24
+ type ChartConnectItem,
25
+ type EventHandlersMap,
26
+ } from './chartConnectHelpers';
7
27
 
8
28
  // ============================================================================
9
- // 类型定义
29
+ // 导出共享类型(从 types.ts re-export)
10
30
  // ============================================================================
11
31
 
12
- /** 联动事件类型 */
13
- export type ConnectEventType = 'click' | 'hover' | 'select' | 'dataZoom';
14
-
15
- /** 联动配置选项 */
16
- export interface UseChartConnectOptions {
17
- /** 要绑定的图表 ID 列表 */
18
- chartIds: string[];
19
- /** 联动触发的事件类型 */
20
- events?: ConnectEventType[];
21
- /** 是否自动绑定/解绑 */
22
- autoBind?: boolean;
23
- /** 联动组名称 */
24
- groupName?: string;
25
- /** 是否禁用 */
26
- disabled?: boolean;
27
- /** 联动回调 */
28
- onConnect?: (sourceId: string, targetId: string, payload: any) => void;
29
- /** 事件过滤函数 */
30
- eventFilter?: (event: string, params: any) => boolean;
31
- }
32
-
33
- /** 图表联动项 */
34
- interface ChartConnectItem {
35
- instance: ChartInstance;
36
- id: string;
37
- handlers: Map<string, any>;
38
- }
39
-
40
- /** 联动返回值 */
41
- export interface UseChartConnectReturn {
42
- /** 绑定图表到联动组 */
43
- connect: (chartInstance: ChartInstance, chartId?: string) => void;
44
- /** 解除图表联动 */
45
- disconnect: (chartInstance: ChartInstance, chartId?: string) => void;
46
- /** 触发联动事件 */
47
- dispatchConnect: (sourceId: string, payload: any) => void;
48
- /** 批量连接图表 */
49
- connectAll: (charts: Array<{ instance: ChartInstance; id: string }>) => void;
50
- /** 批量断开图表 */
51
- disconnectAll: () => void;
52
- /** 联动组是否已连接 */
53
- isConnected: boolean;
54
- }
32
+ /** 联动配置选项(从 types.ts 导出) */
33
+ export type { UseChartConnectOptions, UseChartConnectReturn } from './types';
55
34
 
56
35
  // ============================================================================
57
36
  // Hook 实现
@@ -65,7 +44,7 @@ export interface UseChartConnectReturn {
65
44
  export function useChartConnect(options: UseChartConnectOptions): UseChartConnectReturn {
66
45
  const {
67
46
  chartIds = [],
68
- events = ['click', 'hover', 'select', 'dataZoom'],
47
+ events = useMemo(() => ['click', 'hover', 'select', 'dataZoom'], []),
69
48
  autoBind = false,
70
49
  groupName,
71
50
  disabled = false,
@@ -74,180 +53,93 @@ export function useChartConnect(options: UseChartConnectOptions): UseChartConnec
74
53
  } = options;
75
54
 
76
55
  // Refs
77
- const chartsRef = useRef<Map<string, ChartConnectItem>>(new Map());
56
+ // 使用 useMemo 缓存初始值,避免每次渲染都创建新 Map
57
+ const chartsRef = useRef<Map<string, ChartConnectItem>>(
58
+ (() => {
59
+ const initialMap = new Map();
60
+ return initialMap;
61
+ })()
62
+ );
78
63
  const connectedRef = useRef(false);
79
64
  const optionsRef = useRef(options);
80
65
  optionsRef.current = options;
81
66
 
82
- // 存储事件处理器的映射
83
- const eventHandlersRef = useRef<Map<string, Map<string, any>>>(new Map());
67
+ const eventHandlersRef = useRef<EventHandlersMap>(
68
+ (() => {
69
+ const initialMap = new Map();
70
+ return initialMap;
71
+ })()
72
+ );
84
73
 
85
74
  /**
86
75
  * 创建联动事件处理器
87
76
  */
88
- const createConnectHandler = useCallback(
77
+ const createConnectHandlerCallback = useCallback(
89
78
  (sourceId: string, eventType: ConnectEventType) => {
90
- return (params: any) => {
91
- if (disabled) return;
92
-
93
- // 应用事件过滤器
94
- if (eventFilter && !eventFilter(eventType, params)) {
95
- return;
96
- }
97
-
98
- // 分发联动事件到所有其他图表
99
- dispatchToOthers(sourceId, eventType, params);
100
-
101
- // 触发回调
102
- const currentOptions = optionsRef.current;
103
- if (currentOptions.onConnect) {
104
- chartsRef.current.forEach((item, targetId) => {
105
- if (targetId !== sourceId) {
106
- currentOptions.onConnect?.(sourceId, targetId, { eventType, params });
107
- }
108
- });
109
- }
110
- };
79
+ return createConnectHandler(
80
+ sourceId,
81
+ eventType,
82
+ disabled,
83
+ eventFilter,
84
+ chartsRef,
85
+ optionsRef
86
+ );
111
87
  },
112
- [disabled, eventFilter]
88
+ [disabled, eventFilter, chartsRef, optionsRef]
113
89
  );
114
90
 
115
91
  /**
116
92
  * 分发事件到其他图表
117
93
  */
118
- const dispatchToOthers = useCallback(
119
- (sourceId: string, eventType: ConnectEventType, params: any) => {
120
- chartsRef.current.forEach((item, targetId) => {
121
- if (targetId === sourceId) return;
122
-
123
- try {
124
- switch (eventType) {
125
- case 'click':
126
- item.instance.dispatchAction?.({
127
- type: 'showTip',
128
- seriesIndex: params?.seriesIndex,
129
- dataIndex: params?.dataIndex,
130
- });
131
- break;
132
-
133
- case 'hover':
134
- item.instance.dispatchAction?.({
135
- type: 'showTip',
136
- seriesIndex: params?.seriesIndex,
137
- dataIndex: params?.dataIndex,
138
- });
139
- break;
140
-
141
- case 'select':
142
- item.instance.dispatchAction?.({
143
- type: 'toggleSelect',
144
- seriesIndex: params?.seriesIndex,
145
- dataIndex: params?.dataIndex,
146
- });
147
- break;
148
-
149
- case 'dataZoom':
150
- item.instance.dispatchAction?.({
151
- type: 'dataZoom',
152
- start: params?.start,
153
- end: params?.end,
154
- dataZoomIndex: params?.dataZoomIndex,
155
- dataZoomIndexs: params?.dataZoomIndexs,
156
- });
157
- break;
158
-
159
- default:
160
- break;
161
- }
162
- } catch (e) {
163
- console.warn(`[useChartConnect] Failed to dispatch ${eventType} to ${targetId}:`, e);
164
- }
165
- });
94
+ const dispatchToOthersCallback = useCallback(
95
+ (sourceId: string, eventType: ConnectEventType, params: unknown) => {
96
+ dispatchToOthers(sourceId, eventType, params, chartsRef);
166
97
  },
167
- []
98
+ [chartsRef]
168
99
  );
169
100
 
170
101
  /**
171
102
  * 绑定单个图表的联动事件
172
103
  */
173
- const bindChartEvents = useCallback(
104
+ const bindChartEventsCallback = useCallback(
174
105
  (chartInstance: ChartInstance, chartId: string) => {
175
- if (!chartInstance) return;
176
-
177
- const handlers = new Map<string, any>();
178
-
179
- // 为每个事件类型创建并绑定处理器
180
- events.forEach((eventType) => {
181
- const handler = createConnectHandler(chartId, eventType);
182
- handlers.set(eventType, handler);
183
-
184
- try {
185
- chartInstance.on(eventType, handler);
186
- } catch (e) {
187
- console.warn(`[useChartConnect] Failed to bind ${eventType} event:`, e);
188
- }
189
- });
190
-
191
- eventHandlersRef.current.set(chartId, handlers);
106
+ bindChartEvents(
107
+ chartInstance,
108
+ chartId,
109
+ events,
110
+ createConnectHandlerCallback,
111
+ eventHandlersRef
112
+ );
192
113
  },
193
- [events, createConnectHandler]
114
+ [events, createConnectHandlerCallback, eventHandlersRef]
194
115
  );
195
116
 
196
117
  /**
197
118
  * 解绑单个图表的联动事件
198
119
  */
199
- const unbindChartEvents = useCallback((chartId: string) => {
200
- const handlers = eventHandlersRef.current.get(chartId);
201
- if (!handlers) return;
202
-
203
- const chartItem = chartsRef.current.get(chartId);
204
- if (!chartItem) return;
205
-
206
- handlers.forEach((handler, eventType) => {
207
- try {
208
- chartItem.instance.off(eventType, handler);
209
- } catch (e) {
210
- console.warn(`[useChartConnect] Failed to unbind ${eventType} event:`, e);
211
- }
212
- });
213
-
214
- eventHandlersRef.current.delete(chartId);
215
- }, []);
120
+ const unbindChartEventsCallback = useCallback(
121
+ (chartId: string) => {
122
+ unbindChartEvents(chartId, eventHandlersRef, chartsRef);
123
+ },
124
+ [eventHandlersRef, chartsRef]
125
+ );
216
126
 
217
127
  /**
218
128
  * 绑定图表到联动组
219
129
  */
220
130
  const connect = useCallback(
221
131
  (chartInstance: ChartInstance, chartId?: string) => {
222
- const id = chartId || `chart_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
223
-
224
- // 检查是否已连接
225
- if (chartsRef.current.has(id)) {
226
- console.warn(`[useChartConnect] Chart ${id} is already connected`);
227
- return;
228
- }
229
-
230
- // 存储图表实例
231
- chartsRef.current.set(id, {
232
- instance: chartInstance,
233
- id,
234
- handlers: new Map(),
235
- });
236
-
237
- // 绑定事件
238
- bindChartEvents(chartInstance, id);
239
- connectedRef.current = true;
240
-
241
- // 如果有 groupName,设置图表组
242
- if (groupName && chartInstance.group !== undefined) {
243
- try {
244
- (chartInstance as any).group = groupName;
245
- } catch (e) {
246
- console.warn('[useChartConnect] Failed to set chart group:', e);
247
- }
248
- }
132
+ connectChart(
133
+ chartInstance,
134
+ chartId,
135
+ groupName,
136
+ chartsRef,
137
+ connectedRef,
138
+ eventHandlersRef,
139
+ bindChartEventsCallback
140
+ );
249
141
  },
250
- [bindChartEvents, groupName]
142
+ [groupName, chartsRef, connectedRef, eventHandlersRef, bindChartEventsCallback]
251
143
  );
252
144
 
253
145
  /**
@@ -255,56 +147,19 @@ export function useChartConnect(options: UseChartConnectOptions): UseChartConnec
255
147
  */
256
148
  const disconnect = useCallback(
257
149
  (chartInstance: ChartInstance, chartId?: string) => {
258
- // 查找图表 ID
259
- let targetId = chartId;
260
- if (!targetId) {
261
- chartsRef.current.forEach((item, id) => {
262
- if (item.instance === chartInstance) {
263
- targetId = id;
264
- }
265
- });
266
- }
267
-
268
- if (!targetId || !chartsRef.current.has(targetId)) {
269
- console.warn(`[useChartConnect] Chart ${targetId} not found in connection group`);
270
- return;
271
- }
272
-
273
- // 解绑事件
274
- unbindChartEvents(targetId);
275
-
276
- // 移除图表
277
- chartsRef.current.delete(targetId);
278
-
279
- // 更新连接状态
280
- connectedRef.current = chartsRef.current.size > 0;
150
+ disconnectChart(chartInstance, chartId, chartsRef, connectedRef, unbindChartEventsCallback);
281
151
  },
282
- [unbindChartEvents]
152
+ [chartsRef, connectedRef, unbindChartEventsCallback]
283
153
  );
284
154
 
285
155
  /**
286
156
  * 触发联动事件
287
157
  */
288
158
  const dispatchConnect = useCallback(
289
- (sourceId: string, payload: any) => {
290
- if (disabled) return;
291
-
292
- const chartItem = chartsRef.current.get(sourceId);
293
- if (!chartItem) {
294
- console.warn(`[useChartConnect] Source chart ${sourceId} not found`);
295
- return;
296
- }
297
-
298
- const { eventType, params } = payload || {};
299
- if (!eventType) {
300
- console.warn('[useChartConnect] Payload must include eventType');
301
- return;
302
- }
303
-
304
- // 分发事件到其他图表
305
- dispatchToOthers(sourceId, eventType, params);
159
+ (sourceId: string, payload: { eventType: ConnectEventType; params: unknown }) => {
160
+ dispatchConnectEvent(sourceId, payload, disabled, chartsRef, dispatchToOthersCallback);
306
161
  },
307
- [disabled, dispatchToOthers]
162
+ [disabled, chartsRef, dispatchToOthersCallback]
308
163
  );
309
164
 
310
165
  /**
@@ -312,9 +167,7 @@ export function useChartConnect(options: UseChartConnectOptions): UseChartConnec
312
167
  */
313
168
  const connectAll = useCallback(
314
169
  (charts: Array<{ instance: ChartInstance; id: string }>) => {
315
- charts.forEach(({ instance, id }) => {
316
- connect(instance, id);
317
- });
170
+ connectAllCharts(charts, connect);
318
171
  },
319
172
  [connect]
320
173
  );
@@ -323,12 +176,8 @@ export function useChartConnect(options: UseChartConnectOptions): UseChartConnec
323
176
  * 批量断开所有图表
324
177
  */
325
178
  const disconnectAll = useCallback(() => {
326
- chartsRef.current.forEach((item, id) => {
327
- unbindChartEvents(id);
328
- });
329
- chartsRef.current.clear();
330
- connectedRef.current = false;
331
- }, [unbindChartEvents]);
179
+ disconnectAllCharts(chartsRef, connectedRef, unbindChartEventsCallback);
180
+ }, [chartsRef, connectedRef, unbindChartEventsCallback]);
332
181
 
333
182
  // 自动绑定
334
183
  useEffect(() => {
@@ -359,4 +208,5 @@ export function useChartConnect(options: UseChartConnectOptions): UseChartConnec
359
208
  // 导出
360
209
  // ============================================================================
361
210
 
362
- export default useChartConnect;
211
+ /** 导出共享事件类型 */
212
+ export type { ConnectEventType, ChartConnectItem, EventHandlersMap } from './chartConnectHelpers';