@easyv/charts 1.7.35 → 1.7.37

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 (61) hide show
  1. package/.babelrc +8 -8
  2. package/CHANGELOG.md +18 -18
  3. package/commitlint.config.js +1 -1
  4. package/lib/components/Background.js +2 -2
  5. package/lib/components/Band.js +2 -2
  6. package/lib/components/Brush.js +2 -2
  7. package/lib/components/Chart.js +2 -2
  8. package/lib/components/ChartContainer.js +2 -2
  9. package/lib/components/ConicalGradient.js +21 -21
  10. package/lib/components/Control.js +5 -1
  11. package/lib/components/ExtentData.js +2 -2
  12. package/lib/components/Indicator.js +2 -2
  13. package/lib/components/Label.js +2 -2
  14. package/lib/components/Legend.js +38 -6
  15. package/lib/components/Lighter.js +2 -2
  16. package/lib/components/Line.js +2 -2
  17. package/lib/components/LinearGradient.js +2 -2
  18. package/lib/components/StereoBar.js +2 -2
  19. package/lib/css/index.module.css +39 -42
  20. package/lib/css/piechart.module.css +26 -26
  21. package/lib/formatter/legend.js +55 -50
  22. package/lib/hooks/useAnimateData.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 +11 -11
  26. package/package.json +54 -54
  27. package/src/components/Background.tsx +61 -61
  28. package/src/components/Band.tsx +334 -334
  29. package/src/components/Brush.js +159 -159
  30. package/src/components/Chart.js +157 -157
  31. package/src/components/ChartContainer.tsx +71 -71
  32. package/src/components/ConicalGradient.js +258 -258
  33. package/src/components/Control.jsx +242 -242
  34. package/src/components/ExtentData.js +18 -18
  35. package/src/components/Indicator.js +61 -61
  36. package/src/components/Label.js +262 -262
  37. package/src/components/Legend.js +289 -267
  38. package/src/components/Lighter.jsx +173 -173
  39. package/src/components/Line.js +153 -153
  40. package/src/components/LinearGradient.js +29 -29
  41. package/src/components/PieTooltip.jsx +160 -160
  42. package/src/components/SplitText.tsx +70 -70
  43. package/src/components/StereoBar.tsx +307 -307
  44. package/src/components/index.js +61 -61
  45. package/src/context/index.js +2 -2
  46. package/src/css/index.module.css +39 -42
  47. package/src/css/piechart.module.css +26 -26
  48. package/src/element/ConicGradient.jsx +55 -55
  49. package/src/element/Line.tsx +33 -33
  50. package/src/element/index.ts +3 -3
  51. package/src/formatter/index.js +1 -1
  52. package/src/formatter/legend.js +122 -115
  53. package/src/hooks/index.js +20 -20
  54. package/src/hooks/useAnimateData.ts +68 -68
  55. package/src/hooks/useFilterData.js +77 -77
  56. package/src/hooks/useStackData.js +140 -140
  57. package/src/hooks/useTooltip.ts +103 -103
  58. package/src/index.js +6 -6
  59. package/src/types/index.d.ts +68 -68
  60. package/src/utils/index.js +812 -812
  61. 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
+ });
@@ -1,157 +1,157 @@
1
- /**
2
- * 总入口,通过外面传进来的type来确定渲染哪种图表,饼环图表为“pie”,否则为轴类图表
3
- */
4
- import React, { memo, useMemo, useRef, createRef, useState, useEffect, useCallback } from 'react';
5
- import { chartContext } from '../context';
6
- import { PieChart, CartesianChart } from '.';
7
- import { group } from 'd3v7';
8
-
9
- const getCallbackData = (action,callbacks, data) => {
10
- const callbackData={};
11
- if (callbacks && Array.isArray(callbacks) && callbacks.length && data) {
12
- callbacks.forEach(({ origin, target, actions:_action }) => {
13
- if(action === _action){
14
- callbackData[target] = data[origin];
15
- }
16
- });
17
- }
18
- return callbackData;
19
- };
20
-
21
- const Chart = memo(
22
- ({
23
- id,
24
- type,
25
- config,
26
- config: {
27
- axes,
28
- chart: {
29
- margin: { marginRight, marginLeft, marginBottom, marginTop },
30
- },
31
- interaction,
32
- },
33
- data:originData,
34
- onRelative,
35
- emit,
36
- emitEvent,
37
- ...props
38
- }) => {
39
- const { width, height } = props;
40
- const isIOS = useRef(
41
- /iPad|iPhone|iPod|iOS/i.test(navigator.userAgent) ||
42
- (/Mac OS X/i.test(navigator.userAgent) &&
43
- !/Chrome/i.test(navigator.userAgent))
44
- );
45
- const svg = createRef();
46
- const chartWidth = width - marginLeft - marginRight;
47
- const chartHeight = height - marginTop - marginBottom;
48
- const [active, setActive] = useState(true);
49
- const scaleRef = useRef([1,1]);
50
- const triggerOnRelative = useCallback(
51
- (action,data) => {
52
- if (!interaction) return;
53
- const { callbacks, remoteControls } = interaction;
54
- const callbackData = getCallbackData(action, callbacks, data);
55
- if (JSON.stringify(callbackData)!="{}") {
56
- onRelative && onRelative(id, callbackData);
57
- remoteControls &&
58
- emitEvent &&
59
- remoteControls.forEach((o) => {
60
- const control = JSON.parse(o.control);
61
- if (
62
- control.screen &&
63
- control.type &&
64
- control.type === 'callback'
65
- ) {
66
- emitEvent({
67
- screen: control.screen,
68
- type: 'callback',
69
- callbackData,
70
- });
71
- }
72
- });
73
- }
74
- },
75
- [ JSON.stringify(interaction)]
76
- );
77
-
78
- const onEmit = useCallback(
79
- (type = 'click', data) => emit && emit(type, data),
80
- [emit]
81
- );
82
-
83
- const context = useMemo(
84
- () => ({
85
- id,
86
- isIOS:isIOS.current, //是否为IOS设备
87
- scale:scaleRef, //大屏的缩放比
88
- width: chartWidth,
89
- height: chartHeight,
90
- triggerOnRelative,
91
- svg,
92
- onEmit,
93
- }),
94
- [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]
95
- );
96
-
97
- useEffect(()=>{
98
- let isAnimation = window.screenConfig?window.screenConfig.isAnimation:true; //大屏的全局设置是否允许开启动画,false为不允许
99
- if(!isAnimation) setActive(false);
100
- const activeHandler=(e)=>{
101
- const { dynamicData = true } = e;
102
- isAnimation && setActive(dynamicData);
103
- }
104
- getScreenScale();
105
- document.addEventListener(`switchActive_${id}`,activeHandler);
106
- document.addEventListener("resize",getScreenScale);
107
- return ()=>{
108
- document.removeEventListener(`switchActive_${id}`,activeHandler);
109
- document.removeEventListener("resize",getScreenScale);
110
- }
111
- },[]);
112
-
113
- let data = checkData(originData);
114
-
115
- return (
116
- <chartContext.Provider value={context}>
117
- {type == 'pie' ? (
118
- <PieChart id={id} config={config} data={data} active={active} {...props} />
119
- ) : (
120
- <CartesianChart id={id} config={config} data={data} active={active} {...props} />
121
- )}
122
- </chartContext.Provider>
123
-
124
- );
125
- //获取大屏缩放系数
126
- function getScreenScale(){
127
- setTimeout(()=>{
128
- //获取大屏缩放系数
129
- let dom = document.getElementById("bigscreen-container") || document.getElementById("m-simulator");
130
- if(dom){
131
- const transform = dom.style.transform;
132
- const scale = transform?transform.match(/^scale\((.+)\)$/)[1]:"1,1";
133
- const arr = scale.split(",");
134
- scaleRef.current = [1/arr[0],1/(arr.length===1?arr[0]:arr[1])]; //这里做一次除法,后面就可以用乘法计算值了
135
- }
136
- },50);
137
- }
138
- //预检数据格式是否规范
139
- function checkData(data){
140
- try{
141
- const hasS = data.some(d=>d.s);
142
- if(!hasS){
143
- return data.map(d=>{
144
- return {
145
- ...d,
146
- s:"系列一"
147
- }
148
- })
149
- }
150
- return data;
151
- }catch(e){}
152
- return [];
153
- }
154
- }
155
- );
156
-
157
- export default Chart;
1
+ /**
2
+ * 总入口,通过外面传进来的type来确定渲染哪种图表,饼环图表为“pie”,否则为轴类图表
3
+ */
4
+ import React, { memo, useMemo, useRef, createRef, useState, useEffect, useCallback } from 'react';
5
+ import { chartContext } from '../context';
6
+ import { PieChart, CartesianChart } from '.';
7
+ import { group } from 'd3v7';
8
+
9
+ const getCallbackData = (action,callbacks, data) => {
10
+ const callbackData={};
11
+ if (callbacks && Array.isArray(callbacks) && callbacks.length && data) {
12
+ callbacks.forEach(({ origin, target, actions:_action }) => {
13
+ if(action === _action){
14
+ callbackData[target] = data[origin];
15
+ }
16
+ });
17
+ }
18
+ return callbackData;
19
+ };
20
+
21
+ const Chart = memo(
22
+ ({
23
+ id,
24
+ type,
25
+ config,
26
+ config: {
27
+ axes,
28
+ chart: {
29
+ margin: { marginRight, marginLeft, marginBottom, marginTop },
30
+ },
31
+ interaction,
32
+ },
33
+ data:originData,
34
+ onRelative,
35
+ emit,
36
+ emitEvent,
37
+ ...props
38
+ }) => {
39
+ const { width, height } = props;
40
+ const isIOS = useRef(
41
+ /iPad|iPhone|iPod|iOS/i.test(navigator.userAgent) ||
42
+ (/Mac OS X/i.test(navigator.userAgent) &&
43
+ !/Chrome/i.test(navigator.userAgent))
44
+ );
45
+ const svg = createRef();
46
+ const chartWidth = width - marginLeft - marginRight;
47
+ const chartHeight = height - marginTop - marginBottom;
48
+ const [active, setActive] = useState(true);
49
+ const scaleRef = useRef([1,1]);
50
+ const triggerOnRelative = useCallback(
51
+ (action,data) => {
52
+ if (!interaction) return;
53
+ const { callbacks, remoteControls } = interaction;
54
+ const callbackData = getCallbackData(action, callbacks, data);
55
+ if (JSON.stringify(callbackData)!="{}") {
56
+ onRelative && onRelative(id, callbackData);
57
+ remoteControls &&
58
+ emitEvent &&
59
+ remoteControls.forEach((o) => {
60
+ const control = JSON.parse(o.control);
61
+ if (
62
+ control.screen &&
63
+ control.type &&
64
+ control.type === 'callback'
65
+ ) {
66
+ emitEvent({
67
+ screen: control.screen,
68
+ type: 'callback',
69
+ callbackData,
70
+ });
71
+ }
72
+ });
73
+ }
74
+ },
75
+ [ JSON.stringify(interaction)]
76
+ );
77
+
78
+ const onEmit = useCallback(
79
+ (type = 'click', data) => emit && emit(type, data),
80
+ [emit]
81
+ );
82
+
83
+ const context = useMemo(
84
+ () => ({
85
+ id,
86
+ isIOS:isIOS.current, //是否为IOS设备
87
+ scale:scaleRef, //大屏的缩放比
88
+ width: chartWidth,
89
+ height: chartHeight,
90
+ triggerOnRelative,
91
+ svg,
92
+ onEmit,
93
+ }),
94
+ [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]
95
+ );
96
+
97
+ useEffect(()=>{
98
+ let isAnimation = window.screenConfig?window.screenConfig.isAnimation:true; //大屏的全局设置是否允许开启动画,false为不允许
99
+ if(!isAnimation) setActive(false);
100
+ const activeHandler=(e)=>{
101
+ const { dynamicData = true } = e;
102
+ isAnimation && setActive(dynamicData);
103
+ }
104
+ getScreenScale();
105
+ document.addEventListener(`switchActive_${id}`,activeHandler);
106
+ document.addEventListener("resize",getScreenScale);
107
+ return ()=>{
108
+ document.removeEventListener(`switchActive_${id}`,activeHandler);
109
+ document.removeEventListener("resize",getScreenScale);
110
+ }
111
+ },[]);
112
+
113
+ let data = checkData(originData);
114
+
115
+ return (
116
+ <chartContext.Provider value={context}>
117
+ {type == 'pie' ? (
118
+ <PieChart id={id} config={config} data={data} active={active} {...props} />
119
+ ) : (
120
+ <CartesianChart id={id} config={config} data={data} active={active} {...props} />
121
+ )}
122
+ </chartContext.Provider>
123
+
124
+ );
125
+ //获取大屏缩放系数
126
+ function getScreenScale(){
127
+ setTimeout(()=>{
128
+ //获取大屏缩放系数
129
+ let dom = document.getElementById("bigscreen-container") || document.getElementById("m-simulator");
130
+ if(dom){
131
+ const transform = dom.style.transform;
132
+ const scale = transform?transform.match(/^scale\((.+)\)$/)[1]:"1,1";
133
+ const arr = scale.split(",");
134
+ scaleRef.current = [1/arr[0],1/(arr.length===1?arr[0]:arr[1])]; //这里做一次除法,后面就可以用乘法计算值了
135
+ }
136
+ },50);
137
+ }
138
+ //预检数据格式是否规范
139
+ function checkData(data){
140
+ try{
141
+ const hasS = data.some(d=>d.s);
142
+ if(!hasS){
143
+ return data.map(d=>{
144
+ return {
145
+ ...d,
146
+ s:"系列一"
147
+ }
148
+ })
149
+ }
150
+ return data;
151
+ }catch(e){}
152
+ return [];
153
+ }
154
+ }
155
+ );
156
+
157
+ export default Chart;