@easyv/charts 1.3.27 → 1.3.29

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 (53) hide show
  1. package/.babelrc +8 -8
  2. package/.husky/commit-msg +3 -3
  3. package/CHANGELOG.md +18 -18
  4. package/lib/components/Background.js +2 -2
  5. package/lib/components/CartesianChart.js +15 -2
  6. package/lib/components/ConicalGradient.js +21 -21
  7. package/lib/components/Indicator.js +2 -2
  8. package/lib/components/Lighter.js +179 -179
  9. package/lib/components/LinearGradient.js +2 -2
  10. package/lib/components/PieChart.js +3 -40
  11. package/lib/css/index.module.css +41 -41
  12. package/lib/css/piechart.module.css +26 -26
  13. package/lib/element/ConicGradient.js +72 -72
  14. package/lib/hooks/useAnimateData.js +5 -5
  15. package/lib/hooks/useCarouselAxisX.js +14 -8
  16. package/lib/hooks/useFilterData.js +5 -5
  17. package/lib/hooks/useStackData.js +5 -5
  18. package/lib/hooks/useTooltip.js +10 -10
  19. package/package.json +1 -1
  20. package/src/components/Background.tsx +62 -62
  21. package/src/components/Band.tsx +192 -192
  22. package/src/components/Brush.js +159 -159
  23. package/src/components/CartesianChart.js +5 -2
  24. package/src/components/Chart.js +99 -99
  25. package/src/components/ChartContainer.tsx +63 -63
  26. package/src/components/ConicalGradient.js +258 -258
  27. package/src/components/ExtentData.js +17 -17
  28. package/src/components/Indicator.js +13 -13
  29. package/src/components/Label.js +225 -225
  30. package/src/components/Lighter.jsx +173 -173
  31. package/src/components/Line.js +150 -150
  32. package/src/components/LinearGradient.js +29 -29
  33. package/src/components/PieChart.js +6 -51
  34. package/src/components/StereoBar.tsx +307 -307
  35. package/src/components/index.js +55 -55
  36. package/src/context/index.js +2 -2
  37. package/src/css/index.module.css +41 -41
  38. package/src/css/piechart.module.css +26 -26
  39. package/src/element/ConicGradient.jsx +55 -55
  40. package/src/element/Line.tsx +33 -33
  41. package/src/element/index.ts +3 -3
  42. package/src/formatter/index.js +1 -1
  43. package/src/formatter/legend.js +90 -90
  44. package/src/hooks/index.js +17 -17
  45. package/src/hooks/useAnimateData.ts +67 -67
  46. package/src/hooks/useCarouselAxisX.js +11 -7
  47. package/src/hooks/useFilterData.js +72 -72
  48. package/src/hooks/useStackData.js +101 -101
  49. package/src/hooks/useTooltip.ts +96 -96
  50. package/src/index.js +6 -6
  51. package/src/types/index.d.ts +67 -67
  52. package/src/utils/index.js +757 -757
  53. package/tsconfig.json +23 -23
@@ -1,159 +1,159 @@
1
- /**
2
- * 实现中
3
- */
4
- import { memo, useState, useCallback, useEffect, useRef } from 'react';
5
-
6
- const left = {
7
- position: 'relative',
8
- width: 5,
9
- height: '100%',
10
- cursor: 'col-resize',
11
- backgroundClip: 'content-box',
12
- };
13
- const center = {
14
- flex: '1 1 0%',
15
- height: '100%',
16
- cursor: 'move',
17
- };
18
- const right = {
19
- position: 'relative',
20
- width: 5,
21
- height: '100%',
22
- cursor: 'col-resize',
23
- backgroundClip: 'content-box',
24
- };
25
- const initialPosition = {
26
- start: 0,
27
- end: 0,
28
- status: '',
29
- };
30
- const getValue = (x, min, max) => Math.max(min, Math.min(x, max));
31
- export default ({
32
- width,
33
- config: {
34
- height,
35
- background,
36
- margin: { marginLeft, marginRight },
37
- detail: { width: blockWidth, color },
38
- },
39
- }) => {
40
- const [state, setState] = useState({ translateX: 0, width: blockWidth });
41
- const availableWidth = width - marginLeft - marginRight;
42
- const cache = useRef(state);
43
-
44
- const move = useCallback(
45
- ({ delta, status, name }) => {
46
- let { width, translateX } = cache.current;
47
- const minWidth = 40;
48
- const minX = 0;
49
- switch (name) {
50
- case 'center':
51
- translateX = getValue(
52
- translateX + delta,
53
- minX,
54
- availableWidth - width
55
- );
56
- break;
57
- case 'left':
58
- let tempWidth = width;
59
- width = getValue(width + delta * -1, minWidth, translateX + width);
60
- translateX = getValue(
61
- translateX + delta,
62
- minX,
63
- translateX + tempWidth - width
64
- );
65
- break;
66
- case 'right':
67
- width = getValue(
68
- width + delta,
69
- minWidth,
70
- availableWidth - translateX
71
- );
72
- break;
73
- }
74
-
75
- if (status === 'up') {
76
- cache.current = { width, translateX };
77
- }
78
-
79
- setState({ width, translateX });
80
- },
81
- [availableWidth]
82
- );
83
- useEffect(() => {}, [state]);
84
- return (
85
- <div
86
- style={{
87
- marginLeft,
88
- marginRight,
89
- height,
90
- background,
91
- position: 'absolute',
92
- bottom: 0,
93
- width: availableWidth,
94
- }}
95
- >
96
- <div
97
- style={{
98
- display: 'flex',
99
- justifyContent: 'space-between',
100
- position: 'absolute',
101
- top: 0,
102
- left: 0,
103
- transform: 'translate3d(' + state.translateX + 'px, 0, 0)',
104
- height: '100%',
105
- width: state.width + 'px',
106
- backgroundColor: color,
107
- }}
108
- >
109
- <Move style={left} move={move} name='left' />
110
- <Move style={center} move={move} name='center' />
111
- <Move style={right} move={move} name='right' />
112
- </div>
113
- </div>
114
- );
115
- };
116
- const Move = memo(({ style, move, name }) => {
117
- const [position, setPosition] = useState(initialPosition);
118
-
119
- const documentOnMouseMove = useCallback((e) => {
120
- // console.log('documentOnMouseMove');
121
- setPosition((position) => {
122
- return {
123
- ...position,
124
- end: e.clientX,
125
- status: 'move',
126
- };
127
- });
128
- }, []);
129
-
130
- const documentOnMouseUp = useCallback((e) => {
131
- // console.log('documentOnMouseUp');
132
- setPosition((position) => {
133
- return {
134
- ...position,
135
- end: e.clientX,
136
- status: 'up',
137
- };
138
- });
139
- document.removeEventListener('mousemove', documentOnMouseMove);
140
- document.removeEventListener('mouseup', documentOnMouseUp);
141
- }, []);
142
-
143
- const onMouseDown = useCallback((e) => {
144
- // console.log('onMouseDown');
145
- setPosition({
146
- end: e.clientX,
147
- start: e.clientX,
148
- status: 'down',
149
- });
150
- document.addEventListener('mousemove', documentOnMouseMove);
151
- document.addEventListener('mouseup', documentOnMouseUp);
152
- }, []);
153
-
154
- useEffect(() => {
155
- const { start, end, status } = position;
156
- move({ delta: end - start, status, name });
157
- }, [position, move, name]);
158
- return <div style={style} onMouseDown={onMouseDown} />;
159
- });
1
+ /**
2
+ * 实现中
3
+ */
4
+ import { memo, useState, useCallback, useEffect, useRef } from 'react';
5
+
6
+ const left = {
7
+ position: 'relative',
8
+ width: 5,
9
+ height: '100%',
10
+ cursor: 'col-resize',
11
+ backgroundClip: 'content-box',
12
+ };
13
+ const center = {
14
+ flex: '1 1 0%',
15
+ height: '100%',
16
+ cursor: 'move',
17
+ };
18
+ const right = {
19
+ position: 'relative',
20
+ width: 5,
21
+ height: '100%',
22
+ cursor: 'col-resize',
23
+ backgroundClip: 'content-box',
24
+ };
25
+ const initialPosition = {
26
+ start: 0,
27
+ end: 0,
28
+ status: '',
29
+ };
30
+ const getValue = (x, min, max) => Math.max(min, Math.min(x, max));
31
+ export default ({
32
+ width,
33
+ config: {
34
+ height,
35
+ background,
36
+ margin: { marginLeft, marginRight },
37
+ detail: { width: blockWidth, color },
38
+ },
39
+ }) => {
40
+ const [state, setState] = useState({ translateX: 0, width: blockWidth });
41
+ const availableWidth = width - marginLeft - marginRight;
42
+ const cache = useRef(state);
43
+
44
+ const move = useCallback(
45
+ ({ delta, status, name }) => {
46
+ let { width, translateX } = cache.current;
47
+ const minWidth = 40;
48
+ const minX = 0;
49
+ switch (name) {
50
+ case 'center':
51
+ translateX = getValue(
52
+ translateX + delta,
53
+ minX,
54
+ availableWidth - width
55
+ );
56
+ break;
57
+ case 'left':
58
+ let tempWidth = width;
59
+ width = getValue(width + delta * -1, minWidth, translateX + width);
60
+ translateX = getValue(
61
+ translateX + delta,
62
+ minX,
63
+ translateX + tempWidth - width
64
+ );
65
+ break;
66
+ case 'right':
67
+ width = getValue(
68
+ width + delta,
69
+ minWidth,
70
+ availableWidth - translateX
71
+ );
72
+ break;
73
+ }
74
+
75
+ if (status === 'up') {
76
+ cache.current = { width, translateX };
77
+ }
78
+
79
+ setState({ width, translateX });
80
+ },
81
+ [availableWidth]
82
+ );
83
+ useEffect(() => {}, [state]);
84
+ return (
85
+ <div
86
+ style={{
87
+ marginLeft,
88
+ marginRight,
89
+ height,
90
+ background,
91
+ position: 'absolute',
92
+ bottom: 0,
93
+ width: availableWidth,
94
+ }}
95
+ >
96
+ <div
97
+ style={{
98
+ display: 'flex',
99
+ justifyContent: 'space-between',
100
+ position: 'absolute',
101
+ top: 0,
102
+ left: 0,
103
+ transform: 'translate3d(' + state.translateX + 'px, 0, 0)',
104
+ height: '100%',
105
+ width: state.width + 'px',
106
+ backgroundColor: color,
107
+ }}
108
+ >
109
+ <Move style={left} move={move} name='left' />
110
+ <Move style={center} move={move} name='center' />
111
+ <Move style={right} move={move} name='right' />
112
+ </div>
113
+ </div>
114
+ );
115
+ };
116
+ const Move = memo(({ style, move, name }) => {
117
+ const [position, setPosition] = useState(initialPosition);
118
+
119
+ const documentOnMouseMove = useCallback((e) => {
120
+ // console.log('documentOnMouseMove');
121
+ setPosition((position) => {
122
+ return {
123
+ ...position,
124
+ end: e.clientX,
125
+ status: 'move',
126
+ };
127
+ });
128
+ }, []);
129
+
130
+ const documentOnMouseUp = useCallback((e) => {
131
+ // console.log('documentOnMouseUp');
132
+ setPosition((position) => {
133
+ return {
134
+ ...position,
135
+ end: e.clientX,
136
+ status: 'up',
137
+ };
138
+ });
139
+ document.removeEventListener('mousemove', documentOnMouseMove);
140
+ document.removeEventListener('mouseup', documentOnMouseUp);
141
+ }, []);
142
+
143
+ const onMouseDown = useCallback((e) => {
144
+ // console.log('onMouseDown');
145
+ setPosition({
146
+ end: e.clientX,
147
+ start: e.clientX,
148
+ status: 'down',
149
+ });
150
+ document.addEventListener('mousemove', documentOnMouseMove);
151
+ document.addEventListener('mouseup', documentOnMouseUp);
152
+ }, []);
153
+
154
+ useEffect(() => {
155
+ const { start, end, status } = position;
156
+ move({ delta: end - start, status, name });
157
+ }, [position, move, name]);
158
+ return <div style={style} onMouseDown={onMouseDown} />;
159
+ });
@@ -4,6 +4,7 @@
4
4
  import React, {
5
5
  memo,
6
6
  useMemo,
7
+ useState,
7
8
  createRef,
8
9
  useContext,
9
10
  useCallback,
@@ -60,6 +61,7 @@ const Chart = memo(
60
61
  filterData,
61
62
  }) => {
62
63
  const context = useContext(chartContext);
64
+ const [isHover, setIsHover] = useState(false);
63
65
  const {
64
66
  width: chartWidth,
65
67
  height: chartHeight,
@@ -68,7 +70,7 @@ const Chart = memo(
68
70
  } = useContext(chartContext);
69
71
  const svg = createRef();
70
72
  const axes = useAxes({ axes: axesConfig, context });
71
- const axisX = useCarouselAxisX(axes.get('x'), animation);
73
+ const axisX = useCarouselAxisX(axes.get('x'), animation, isHover);
72
74
 
73
75
  const {
74
76
  x: tooltipX,
@@ -125,8 +127,9 @@ const Chart = memo(
125
127
  height={height}
126
128
  marginLeft={marginLeft}
127
129
  marginTop={marginTop}
130
+ onMouseEnter={()=>{setIsHover(true)}}
128
131
  onMouseMove={setIndex}
129
- onMouseLeave={setIndex}
132
+ onMouseLeave={(e)=>{setIsHover(false);setIndex(e)}}
130
133
  ref={svg}
131
134
  >
132
135
  {background && (
@@ -1,99 +1,99 @@
1
- /**
2
- * 总入口,通过外面传进来的type来确定渲染哪种图表,饼环图表为“pie”,否则为轴类图表
3
- */
4
- import React, { memo, useMemo, createRef, useCallback } from 'react';
5
- import { chartContext } from '../context';
6
- import { PieChart, CartesianChart } from '.';
7
-
8
- const getCallbackData = (callbacks, data) => {
9
- let callbackData;
10
- if (callbacks && Array.isArray(callbacks) && callbacks.length && data) {
11
- callbackData = {};
12
- callbacks.forEach(({ origin, target }) => {
13
- callbackData[target] = data[origin];
14
- });
15
- }
16
- return callbackData;
17
- };
18
-
19
- const Chart = memo(
20
- ({
21
- id,
22
- type,
23
- config,
24
- config: {
25
- chart: {
26
- dimension: {
27
- chartDimension: { height, width },
28
- },
29
- margin: { marginRight, marginLeft, marginBottom, marginTop },
30
- },
31
- interaction,
32
- },
33
- data,
34
- onRelative,
35
- emit,
36
- emitEvent,
37
- ...props
38
- }) => {
39
- const svg = createRef();
40
- const chartWidth = width - marginLeft - marginRight;
41
- const chartHeight = height - marginTop - marginBottom;
42
-
43
- const triggerOnRelative = useCallback(
44
- (data) => {
45
- if (!interaction) return;
46
- const { callbacks, remoteControls } = interaction;
47
- const callbackData = getCallbackData(callbacks, data);
48
- if (callbackData) {
49
- onRelative && onRelative(id, callbackData);
50
- remoteControls &&
51
- emitEvent &&
52
- remoteControls.forEach((o) => {
53
- const control = JSON.parse(o.control);
54
- if (
55
- control.screen &&
56
- control.type &&
57
- control.type === 'callback'
58
- ) {
59
- emitEvent({
60
- screen: control.screen,
61
- type: 'callback',
62
- callbackData,
63
- });
64
- }
65
- });
66
- }
67
- },
68
- [ JSON.stringify(interaction)]
69
- );
70
-
71
- const onEmit = useCallback(
72
- (type = 'click', data) => emit && emit(type, data),
73
- [emit]
74
- );
75
-
76
- const context = useMemo(
77
- () => ({
78
- id,
79
- width: chartWidth,
80
- height: chartHeight,
81
- triggerOnRelative,
82
- svg,
83
- onEmit,
84
- }),
85
- [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]
86
- );
87
- return (
88
- <chartContext.Provider value={context}>
89
- {type == 'pie' ? (
90
- <PieChart id={id} config={config} data={data} {...props} />
91
- ) : (
92
- <CartesianChart id={id} config={config} data={data} {...props} />
93
- )}
94
- </chartContext.Provider>
95
- );
96
- }
97
- );
98
-
99
- export default Chart;
1
+ /**
2
+ * 总入口,通过外面传进来的type来确定渲染哪种图表,饼环图表为“pie”,否则为轴类图表
3
+ */
4
+ import React, { memo, useMemo, createRef, useCallback } from 'react';
5
+ import { chartContext } from '../context';
6
+ import { PieChart, CartesianChart } from '.';
7
+
8
+ const getCallbackData = (callbacks, data) => {
9
+ let callbackData;
10
+ if (callbacks && Array.isArray(callbacks) && callbacks.length && data) {
11
+ callbackData = {};
12
+ callbacks.forEach(({ origin, target }) => {
13
+ callbackData[target] = data[origin];
14
+ });
15
+ }
16
+ return callbackData;
17
+ };
18
+
19
+ const Chart = memo(
20
+ ({
21
+ id,
22
+ type,
23
+ config,
24
+ config: {
25
+ chart: {
26
+ dimension: {
27
+ chartDimension: { height, width },
28
+ },
29
+ margin: { marginRight, marginLeft, marginBottom, marginTop },
30
+ },
31
+ interaction,
32
+ },
33
+ data,
34
+ onRelative,
35
+ emit,
36
+ emitEvent,
37
+ ...props
38
+ }) => {
39
+ const svg = createRef();
40
+ const chartWidth = width - marginLeft - marginRight;
41
+ const chartHeight = height - marginTop - marginBottom;
42
+
43
+ const triggerOnRelative = useCallback(
44
+ (data) => {
45
+ if (!interaction) return;
46
+ const { callbacks, remoteControls } = interaction;
47
+ const callbackData = getCallbackData(callbacks, data);
48
+ if (callbackData) {
49
+ onRelative && onRelative(id, callbackData);
50
+ remoteControls &&
51
+ emitEvent &&
52
+ remoteControls.forEach((o) => {
53
+ const control = JSON.parse(o.control);
54
+ if (
55
+ control.screen &&
56
+ control.type &&
57
+ control.type === 'callback'
58
+ ) {
59
+ emitEvent({
60
+ screen: control.screen,
61
+ type: 'callback',
62
+ callbackData,
63
+ });
64
+ }
65
+ });
66
+ }
67
+ },
68
+ [ JSON.stringify(interaction)]
69
+ );
70
+
71
+ const onEmit = useCallback(
72
+ (type = 'click', data) => emit && emit(type, data),
73
+ [emit]
74
+ );
75
+
76
+ const context = useMemo(
77
+ () => ({
78
+ id,
79
+ width: chartWidth,
80
+ height: chartHeight,
81
+ triggerOnRelative,
82
+ svg,
83
+ onEmit,
84
+ }),
85
+ [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]
86
+ );
87
+ return (
88
+ <chartContext.Provider value={context}>
89
+ {type == 'pie' ? (
90
+ <PieChart id={id} config={config} data={data} {...props} />
91
+ ) : (
92
+ <CartesianChart id={id} config={config} data={data} {...props} />
93
+ )}
94
+ </chartContext.Provider>
95
+ );
96
+ }
97
+ );
98
+
99
+ export default Chart;
@@ -1,63 +1,63 @@
1
- /**
2
- * svg外框
3
- */
4
- import React, {
5
- memo,
6
- forwardRef,
7
- ReactChild,
8
- ReactEventHandler,
9
- LegacyRef,
10
- } from 'react';
11
- const event = () => {};
12
-
13
- type Props = {
14
- width: number;
15
- height: number;
16
- marginLeft: number;
17
- marginTop: number;
18
- style: Object;
19
- children: ReactChild;
20
- onMouseEnter: ReactEventHandler;
21
- onMouseLeave: ReactEventHandler;
22
- onClick: ReactEventHandler;
23
- onMouseMove: ReactEventHandler;
24
- onMouseOut: ReactEventHandler;
25
- };
26
-
27
- export default memo(
28
- forwardRef(
29
- (
30
- {
31
- width,
32
- height,
33
- marginLeft,
34
- marginTop,
35
- style,
36
- children,
37
- onMouseEnter = event,
38
- onMouseLeave = event,
39
- onClick = event,
40
- onMouseMove = event,
41
- onMouseOut = event,
42
- }: Props,
43
- ref: LegacyRef<SVGSVGElement>
44
- ) => (
45
- <svg
46
- className='__easyv-svg'
47
- width={width}
48
- height={height}
49
- onMouseEnter={onMouseEnter}
50
- onMouseLeave={onMouseLeave}
51
- onMouseOut={onMouseOut}
52
- onClick={onClick}
53
- onMouseMove={onMouseMove}
54
- ref={ref}
55
- style={{ position: 'absolute', width, height, ...style }}
56
- >
57
- <g transform={'translate(' + marginLeft + ', ' + marginTop + ')'}>
58
- {children}
59
- </g>
60
- </svg>
61
- )
62
- )
63
- );
1
+ /**
2
+ * svg外框
3
+ */
4
+ import React, {
5
+ memo,
6
+ forwardRef,
7
+ ReactChild,
8
+ ReactEventHandler,
9
+ LegacyRef,
10
+ } from 'react';
11
+ const event = () => {};
12
+
13
+ type Props = {
14
+ width: number;
15
+ height: number;
16
+ marginLeft: number;
17
+ marginTop: number;
18
+ style: Object;
19
+ children: ReactChild;
20
+ onMouseEnter: ReactEventHandler;
21
+ onMouseLeave: ReactEventHandler;
22
+ onClick: ReactEventHandler;
23
+ onMouseMove: ReactEventHandler;
24
+ onMouseOut: ReactEventHandler;
25
+ };
26
+
27
+ export default memo(
28
+ forwardRef(
29
+ (
30
+ {
31
+ width,
32
+ height,
33
+ marginLeft,
34
+ marginTop,
35
+ style,
36
+ children,
37
+ onMouseEnter = event,
38
+ onMouseLeave = event,
39
+ onClick = event,
40
+ onMouseMove = event,
41
+ onMouseOut = event,
42
+ }: Props,
43
+ ref: LegacyRef<SVGSVGElement>
44
+ ) => (
45
+ <svg
46
+ className='__easyv-svg'
47
+ width={width}
48
+ height={height}
49
+ onMouseEnter={onMouseEnter}
50
+ onMouseLeave={onMouseLeave}
51
+ onMouseOut={onMouseOut}
52
+ onClick={onClick}
53
+ onMouseMove={onMouseMove}
54
+ ref={ref}
55
+ style={{ position: 'absolute', width, height, ...style }}
56
+ >
57
+ <g transform={'translate(' + marginLeft + ', ' + marginTop + ')'}>
58
+ {children}
59
+ </g>
60
+ </svg>
61
+ )
62
+ )
63
+ );