@easyv/charts 1.3.9 → 1.3.11

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 (74) hide show
  1. package/.babelrc +8 -8
  2. package/.husky/commit-msg +3 -3
  3. package/CHANGELOG.md +18 -18
  4. package/lib/components/Axis.js +10 -10
  5. package/lib/components/Background.js +2 -2
  6. package/lib/components/Band.js +22 -1
  7. package/lib/components/Carousel.js +2 -2
  8. package/lib/components/CartesianChart.js +1 -1
  9. package/lib/components/ConicalGradient.js +21 -21
  10. package/lib/components/Indicator.js +2 -2
  11. package/lib/components/Lighter.js +179 -179
  12. package/lib/components/Line.js +6 -0
  13. package/lib/components/LinearGradient.js +2 -2
  14. package/lib/components/Marquee.js +3 -3
  15. package/lib/components/TextOverflow.js +3 -3
  16. package/lib/css/index.module.css +41 -41
  17. package/lib/css/piechart.module.css +26 -26
  18. package/lib/element/ConicGradient.js +72 -72
  19. package/lib/hooks/useAnimateData.js +5 -5
  20. package/lib/hooks/useAxes.js +5 -5
  21. package/lib/hooks/useCarouselAxisX.js +5 -5
  22. package/lib/hooks/useExtentData.js +6 -6
  23. package/lib/hooks/useFilterData.js +5 -5
  24. package/lib/hooks/useStackData.js +5 -5
  25. package/lib/hooks/useTooltip.js +10 -10
  26. package/lib/utils/index.js +91 -74
  27. package/package.json +54 -54
  28. package/src/components/AnimateData.tsx +24 -24
  29. package/src/components/Axis.tsx +354 -354
  30. package/src/components/Background.tsx +62 -62
  31. package/src/components/Band.tsx +191 -169
  32. package/src/components/BaseLine.js +82 -82
  33. package/src/components/Brush.js +159 -159
  34. package/src/components/Carousel.tsx +144 -144
  35. package/src/components/CartesianChart.js +3 -1
  36. package/src/components/Chart.js +99 -99
  37. package/src/components/ChartContainer.tsx +63 -63
  38. package/src/components/ConicalGradient.js +258 -258
  39. package/src/components/ExtentData.js +17 -17
  40. package/src/components/FilterData.js +23 -23
  41. package/src/components/Indicator.js +13 -13
  42. package/src/components/Label.js +226 -226
  43. package/src/components/Legend.js +158 -158
  44. package/src/components/Lighter.jsx +173 -173
  45. package/src/components/Line.js +150 -145
  46. package/src/components/LinearGradient.js +29 -29
  47. package/src/components/Mapping.js +71 -71
  48. package/src/components/Marquee.js +97 -97
  49. package/src/components/PieChart.js +1278 -1278
  50. package/src/components/StackData.js +16 -16
  51. package/src/components/StereoBar.tsx +307 -307
  52. package/src/components/TextOverflow.js +51 -51
  53. package/src/components/Tooltip.js +169 -169
  54. package/src/components/index.js +55 -55
  55. package/src/context/index.js +2 -2
  56. package/src/css/index.module.css +41 -41
  57. package/src/css/piechart.module.css +26 -26
  58. package/src/element/ConicGradient.jsx +55 -55
  59. package/src/element/Line.tsx +33 -33
  60. package/src/element/index.ts +3 -3
  61. package/src/formatter/index.js +1 -1
  62. package/src/formatter/legend.js +90 -90
  63. package/src/hooks/index.js +17 -17
  64. package/src/hooks/useAnimateData.ts +67 -67
  65. package/src/hooks/useAxes.js +144 -144
  66. package/src/hooks/useCarouselAxisX.js +163 -163
  67. package/src/hooks/useExtentData.js +89 -89
  68. package/src/hooks/useFilterData.js +72 -72
  69. package/src/hooks/useStackData.js +101 -101
  70. package/src/hooks/useTooltip.ts +96 -96
  71. package/src/index.js +6 -6
  72. package/src/types/index.d.ts +67 -67
  73. package/src/utils/index.js +755 -738
  74. package/tsconfig.json +23 -23
@@ -1,226 +1,226 @@
1
- /**
2
- * 轴类图表标签
3
- */
4
- import { memo, useContext } from 'react';
5
- import { getTranslate2d, getSeriesInfo } from '../utils';
6
- import { chartContext } from '../context';
7
-
8
- export default memo(
9
- ({
10
- config: {
11
- seriesIntervalWidth: paddingInner = 0,
12
- paddingInner: paddingOuter = 0,
13
- label,
14
- icon,
15
- },
16
- config,
17
- bandLength = 0,
18
- data,
19
- xAxis: { scaler: xScaler, step, direction },
20
- yAxis: { scaler: yScaler },
21
- triggerClick,
22
- }) => {
23
- const lineType = config.hasOwnProperty('line'); // 堆叠处理
24
- const showIcon = icon && icon.show;
25
- const showLabel = label && label.show;
26
-
27
- if (!(data.length && (showIcon || showLabel))) return null;
28
- const { width, height } = useContext(chartContext);
29
-
30
- const { seriesStep, seriesWidth, seriesStart } = getSeriesInfo({
31
- step,
32
- bandLength,
33
- paddingInner,
34
- paddingOuter,
35
- });
36
-
37
- const isVertical = direction === 'vertical';
38
- const _position = label.position;
39
- return (
40
- <g className='__easyv-label'>
41
- {data.map(
42
- (
43
- { index, bound: [start, end], data, data: { x, y, showY, s } },
44
- i
45
- ) => {
46
- const y1 = yScaler(isVertical ? end : start);
47
-
48
- // 处理z型折线图和堆叠柱图的逻辑冲突
49
- const y2 = lineType
50
- ? start
51
- ? yScaler(isVertical ? start : end - start)
52
- : yScaler(isVertical ? start : end)
53
- : yScaler(isVertical ? start : end);
54
-
55
- // const y2 = yScaler(isVertical ? start : end);
56
- const positionX =
57
- xScaler(x) - step / 2 + seriesStart + index * seriesStep;
58
-
59
- if (isNaN(positionX)) return null;
60
- const position = positionX + seriesWidth / 2;
61
- const labelPosition = isVertical
62
- ? getVerticalLabel({
63
- position: _position,
64
- y,
65
- y1,
66
- y2,
67
- width,
68
- })
69
- : getHorizontalLabel({
70
- position: _position,
71
- y,
72
- y1,
73
- y2,
74
- height,
75
- });
76
- const attr = isVertical
77
- ? {
78
- ...labelPosition,
79
- y: position,
80
- dominantBaseline: 'middle',
81
- }
82
- : {
83
- ...labelPosition,
84
- x: position,
85
- textAnchor: 'middle',
86
- };
87
- return (
88
- <g
89
- key={i}
90
- onClick={triggerClick}
91
- data-data={JSON.stringify(data)}
92
- >
93
- {showIcon && !isNaN(attr.y) && (
94
- <Icon cx={attr.x} cy={attr.y} config={icon} />
95
- )}
96
- {showLabel && <Label value={showY} config={label} {...attr} />}
97
- </g>
98
- );
99
- }
100
- )}
101
- </g>
102
- );
103
- }
104
- );
105
-
106
- const Label = ({
107
- x,
108
- y,
109
- value,
110
- config: {
111
- font,
112
- translate: { x: translateX = 0, y: translateY = 0 },
113
- },
114
- textAnchor = 'middle',
115
- dominantBaseline = 'middle',
116
- }) => {
117
- return (
118
- <text
119
- x={x}
120
- y={y}
121
- transform={getTranslate2d({
122
- x: translateX,
123
- y: translateY * (value >= 0 ? 1 : -1),
124
- })}
125
- textAnchor={textAnchor}
126
- dominantBaseline={dominantBaseline}
127
- {...font}
128
- >
129
- {value}
130
- </text>
131
- );
132
- };
133
- const Icon = ({
134
- cx,
135
- cy,
136
- config: {
137
- mode,
138
- inner,
139
- outer,
140
- color,
141
- radius,
142
- image,
143
- size: { width, height },
144
- },
145
- }) =>
146
- mode == 'single' ? (
147
- <Circle cx={cx} cy={cy} color={color} radius={radius} />
148
- ) : mode == 'double' ? (
149
- <>
150
- <Circle cx={cx} cy={cy} {...inner} />
151
- <Circle cx={cx} cy={cy} {...outer} />
152
- </>
153
- ) : (
154
- <>
155
- <image
156
- width={width}
157
- height={height}
158
- x={cx - width / 2}
159
- y={cy - height / 2}
160
- xlinkHref={window.appConfig.ASSETS_URL + image}
161
- />
162
- </>
163
- );
164
-
165
- const Circle = ({ cx, cy, color, radius }) => (
166
- <circle cx={cx} cy={cy} fill={color} r={radius} stroke='none' />
167
- );
168
-
169
- const getVerticalLabel = ({ position = 'outerStart', width, y, y1, y2 }) => {
170
- switch (position) {
171
- case 'start':
172
- return {
173
- x: y > 0 ? y2 : y1,
174
- textAnchor: 'start',
175
- };
176
- case 'middle':
177
- return {
178
- x: (y1 + y2) / 2,
179
- textAnchor: 'middle',
180
- };
181
- case 'end':
182
- return {
183
- x: y > 0 ? y1 : y2,
184
- textAnchor: 'end',
185
- };
186
- case 'outerStart':
187
- return {
188
- x: y1,
189
- textAnchor: y > 0 ? 'start' : 'end',
190
- };
191
- case 'chartStart':
192
- return {
193
- x: y > 0 ? width : 0,
194
- textAnchor: y > 0 ? 'start' : 'end',
195
- };
196
- }
197
- };
198
- const getHorizontalLabel = ({ position = 'outerStart', height, y, y1, y2 }) => {
199
- switch (position) {
200
- case 'start':
201
- return {
202
- y: y > 0 ? y1 : y2,
203
- dominantBaseline: 'text-after-edge',
204
- };
205
- case 'middle':
206
- return {
207
- y: (y1 + y2) / 2,
208
- dominantBaseline: 'middle',
209
- };
210
- case 'end':
211
- return {
212
- y: y > 0 ? y2 : y1,
213
- dominantBaseline: 'text-before-edge',
214
- };
215
- case 'outerStart':
216
- return {
217
- y: y2,
218
- dominantBaseline: y >= 0 ? 'text-after-edge' : 'text-before-edge',
219
- };
220
- case 'chartStart':
221
- return {
222
- y: y > 0 ? 0 : height,
223
- dominantBaseline: y > 0 ? 'text-after-edge' : 'text-before-edge',
224
- };
225
- }
226
- };
1
+ /**
2
+ * 轴类图表标签
3
+ */
4
+ import { memo, useContext } from 'react';
5
+ import { getTranslate2d, getSeriesInfo } from '../utils';
6
+ import { chartContext } from '../context';
7
+
8
+ export default memo(
9
+ ({
10
+ config: {
11
+ seriesIntervalWidth: paddingInner = 0,
12
+ paddingInner: paddingOuter = 0,
13
+ label,
14
+ icon,
15
+ },
16
+ config,
17
+ bandLength = 0,
18
+ data,
19
+ xAxis: { scaler: xScaler, step, direction },
20
+ yAxis: { scaler: yScaler },
21
+ triggerClick,
22
+ }) => {
23
+ const lineType = config.hasOwnProperty('line'); // 堆叠处理
24
+ const showIcon = icon && icon.show;
25
+ const showLabel = label && label.show;
26
+
27
+ if (!(data.length && (showIcon || showLabel))) return null;
28
+ const { width, height } = useContext(chartContext);
29
+
30
+ const { seriesStep, seriesWidth, seriesStart } = getSeriesInfo({
31
+ step,
32
+ bandLength,
33
+ paddingInner,
34
+ paddingOuter,
35
+ });
36
+
37
+ const isVertical = direction === 'vertical';
38
+ const _position = label.position;
39
+ return (
40
+ <g className='__easyv-label'>
41
+ {data.map(
42
+ (
43
+ { index, bound: [start, end], data, data: { x, y, showY, s } },
44
+ i
45
+ ) => {
46
+ const y1 = yScaler(isVertical ? end : start);
47
+
48
+ // 处理z型折线图和堆叠柱图的逻辑冲突
49
+ const y2 = lineType
50
+ ? start
51
+ ? yScaler(isVertical ? start : end - start)
52
+ : yScaler(isVertical ? start : end)
53
+ : yScaler(isVertical ? start : end);
54
+
55
+ // const y2 = yScaler(isVertical ? start : end);
56
+ const positionX =
57
+ xScaler(x) - step / 2 + seriesStart + index * seriesStep;
58
+
59
+ if (isNaN(positionX)) return null;
60
+ const position = positionX + seriesWidth / 2;
61
+ const labelPosition = isVertical
62
+ ? getVerticalLabel({
63
+ position: _position,
64
+ y,
65
+ y1,
66
+ y2,
67
+ width,
68
+ })
69
+ : getHorizontalLabel({
70
+ position: _position,
71
+ y,
72
+ y1,
73
+ y2,
74
+ height,
75
+ });
76
+ const attr = isVertical
77
+ ? {
78
+ ...labelPosition,
79
+ y: position,
80
+ dominantBaseline: 'middle',
81
+ }
82
+ : {
83
+ ...labelPosition,
84
+ x: position,
85
+ textAnchor: 'middle',
86
+ };
87
+ return (
88
+ <g
89
+ key={i}
90
+ onClick={triggerClick}
91
+ data-data={JSON.stringify(data)}
92
+ >
93
+ {showIcon && !isNaN(attr.y) && (
94
+ <Icon cx={attr.x} cy={attr.y} config={icon} />
95
+ )}
96
+ {showLabel && <Label value={showY} config={label} {...attr} />}
97
+ </g>
98
+ );
99
+ }
100
+ )}
101
+ </g>
102
+ );
103
+ }
104
+ );
105
+
106
+ const Label = ({
107
+ x,
108
+ y,
109
+ value,
110
+ config: {
111
+ font,
112
+ translate: { x: translateX = 0, y: translateY = 0 },
113
+ },
114
+ textAnchor = 'middle',
115
+ dominantBaseline = 'middle',
116
+ }) => {
117
+ return (
118
+ <text
119
+ x={x}
120
+ y={y}
121
+ transform={getTranslate2d({
122
+ x: translateX,
123
+ y: translateY * (value >= 0 ? 1 : -1),
124
+ })}
125
+ textAnchor={textAnchor}
126
+ dominantBaseline={dominantBaseline}
127
+ {...font}
128
+ >
129
+ {value}
130
+ </text>
131
+ );
132
+ };
133
+ const Icon = ({
134
+ cx,
135
+ cy,
136
+ config: {
137
+ mode,
138
+ inner,
139
+ outer,
140
+ color,
141
+ radius,
142
+ image,
143
+ size: { width, height },
144
+ },
145
+ }) =>
146
+ mode == 'single' ? (
147
+ <Circle cx={cx} cy={cy} color={color} radius={radius} />
148
+ ) : mode == 'double' ? (
149
+ <>
150
+ <Circle cx={cx} cy={cy} {...inner} />
151
+ <Circle cx={cx} cy={cy} {...outer} />
152
+ </>
153
+ ) : (
154
+ <>
155
+ <image
156
+ width={width}
157
+ height={height}
158
+ x={cx - width / 2}
159
+ y={cy - height / 2}
160
+ xlinkHref={window.appConfig.ASSETS_URL + image}
161
+ />
162
+ </>
163
+ );
164
+
165
+ const Circle = ({ cx, cy, color, radius }) => (
166
+ <circle cx={cx} cy={cy} fill={color} r={radius} stroke='none' />
167
+ );
168
+
169
+ const getVerticalLabel = ({ position = 'outerStart', width, y, y1, y2 }) => {
170
+ switch (position) {
171
+ case 'start':
172
+ return {
173
+ x: y > 0 ? y2 : y1,
174
+ textAnchor: 'start',
175
+ };
176
+ case 'middle':
177
+ return {
178
+ x: (y1 + y2) / 2,
179
+ textAnchor: 'middle',
180
+ };
181
+ case 'end':
182
+ return {
183
+ x: y > 0 ? y1 : y2,
184
+ textAnchor: 'end',
185
+ };
186
+ case 'outerStart':
187
+ return {
188
+ x: y1,
189
+ textAnchor: y > 0 ? 'start' : 'end',
190
+ };
191
+ case 'chartStart':
192
+ return {
193
+ x: y > 0 ? width : 0,
194
+ textAnchor: y > 0 ? 'start' : 'end',
195
+ };
196
+ }
197
+ };
198
+ const getHorizontalLabel = ({ position = 'outerStart', height, y, y1, y2 }) => {
199
+ switch (position) {
200
+ case 'start':
201
+ return {
202
+ y: y > 0 ? y1 : y2,
203
+ dominantBaseline: 'text-after-edge',
204
+ };
205
+ case 'middle':
206
+ return {
207
+ y: (y1 + y2) / 2,
208
+ dominantBaseline: 'middle',
209
+ };
210
+ case 'end':
211
+ return {
212
+ y: y > 0 ? y2 : y1,
213
+ dominantBaseline: 'text-before-edge',
214
+ };
215
+ case 'outerStart':
216
+ return {
217
+ y: y2,
218
+ dominantBaseline: y >= 0 ? 'text-after-edge' : 'text-before-edge',
219
+ };
220
+ case 'chartStart':
221
+ return {
222
+ y: y > 0 ? 0 : height,
223
+ dominantBaseline: y > 0 ? 'text-after-edge' : 'text-before-edge',
224
+ };
225
+ }
226
+ };