visualifyjs 2.5.3-2.dev → 2.5.3-9-dev
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of visualifyjs might be problematic. Click here for more details.
- package/.github/workflows/{static.yml.bak → build.yaml} +51 -51
- package/LICENSE +674 -674
- package/README.md +40 -58
- package/config-overrides.js +31 -31
- package/dist/visualify.js +3 -3
- package/docs/CLI.md +15 -0
- package/docs/{docs/README.md → README.md} +41 -65
- package/docs/{docs/Rechart → Rechart}/bar.md +190 -190
- package/docs/{docs/Rechart → Rechart}/funnel.md +193 -241
- package/docs/{docs/Rechart → Rechart}/line.md +355 -355
- package/docs/{docs/Rechart → Rechart}/pie.md +225 -225
- package/docs/{docs/Rechart → Rechart}/radar.md +253 -253
- package/docs/{docs/_404.md → _404.md} +51 -51
- package/docs/{docs/_coverpage.md → _coverpage.md} +11 -11
- package/docs/{docs/_sidebar.md → _sidebar.md} +42 -44
- package/docs/{docs/components → components}/dotBio.md +34 -34
- package/docs/{docs/components → components}/echart.md +82 -82
- package/docs/{docs/components → components}/html.md +34 -34
- package/docs/{docs/components → components}/macaron.md +145 -145
- package/docs/components/markdown.md +0 -0
- package/docs/{docs/components → components}/more.md +142 -142
- package/docs/{docs/components → components}/plotly.md +62 -62
- package/docs/{docs/components → components}/scatterL.md +70 -70
- package/docs/{docs/components → components}/visium.md +56 -56
- package/docs/{docs/configuration.md → configuration.md} +123 -121
- package/docs/{docs/deploy.md → deploy.md} +23 -31
- package/docs/index.html +70 -70
- package/docs/log.md +1 -0
- package/docs/manifest.json +23 -23
- package/docs/{docs/more-pages.md → more-pages.md} +23 -23
- package/docs/{docs/quickstart.md → quickstart.md} +115 -124
- package/docs/{docs/rechart-attributes.md → rechart-attributes.md} +74 -74
- package/docs/{docs/rechart-basic-usage.md → rechart-basic-usage.md} +162 -162
- package/docs/static/css/fluff-stuff.css +169 -169
- package/docs/static/css/font-awesome.min.css +4 -4
- package/docs/static/css/visualify.css +25 -25
- package/docs/static/js/configuration.js +448 -448
- package/docs/static/js/visualify.js +24 -23
- package/docs/theme.md +3 -0
- package/package.json +74 -83
- package/rollup.config.mjs +75 -75
- package/src/_css/404.css +115 -115
- package/src/_css/App.css +37 -37
- package/src/_css/autoSuggestion.css +26 -26
- package/src/_css/circular-progress.css +32 -32
- package/src/_css/index.css +36 -36
- package/src/_css/modern.css +24 -24
- package/src/_media/corner.svg +8 -8
- package/src/_media/download.svg +3 -3
- package/src/_media/logo.svg +14 -14
- package/src/_test/App.test.js +15 -15
- package/src/_utils/reportWebVitals.js +13 -13
- package/src/core/appContext.js +27 -27
- package/src/core/components/Scatter.js +188 -188
- package/src/core/components/ScatterBio.js +572 -572
- package/src/core/components/VisiumPlot.js +165 -165
- package/src/core/components/browser.js +42 -42
- package/src/core/components/dotplot.js +413 -413
- package/src/core/components/html.js +29 -29
- package/src/core/components/list.js +178 -178
- package/src/core/components/macaron.js +201 -201
- package/src/core/components/markdown.js +56 -56
- package/src/core/components/parser.scatterBio.js +579 -587
- package/src/core/components/ratio.js +80 -80
- package/src/core/components/scatterL.js +173 -173
- package/src/core/components/searchbar.js +131 -131
- package/src/core/components/selection.js +193 -193
- package/src/core/components/timeline.js +281 -281
- package/src/core/components/visium.js +97 -97
- package/src/core/fetch/condfetch.js +82 -82
- package/src/core/fetch/fetch.js +92 -92
- package/src/core/fetch/json.js +29 -29
- package/src/core/fetch/vfetch.js +42 -42
- package/src/core/liveEditor.js +44 -44
- package/src/core/modules/codeEditorWithPreview.js +104 -104
- package/src/core/modules/echarts/common.js +20 -20
- package/src/core/modules/echarts/presetHandler.js +41 -41
- package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
- package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
- package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
- package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
- package/src/core/modules/echarts.js +71 -71
- package/src/core/modules/echartsUtils.js +43 -43
- package/src/core/modules/echartswitcher.js +152 -152
- package/src/core/modules/replotly/presetHandler.js +24 -24
- package/src/core/modules/replotly/presets/minimum.js +18 -18
- package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
- package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
- package/src/core/modules/replotly.js +71 -71
- package/src/core/pages/404.js +50 -50
- package/src/core/pages/error.js +27 -27
- package/src/core/pages/jsonPage.js +62 -62
- package/src/core/pages/loading.js +44 -44
- package/src/core/parser/echart.data.js +183 -183
- package/src/core/parser/echart.features.js +125 -125
- package/src/core/parser/echart.general.js +143 -147
- package/src/core/parser/echart.hilbert.js +57 -57
- package/src/core/parser/echart.parser.js +210 -210
- package/src/core/parser/echart.series.js +67 -67
- package/src/core/parser/echart.types.js +76 -76
- package/src/core/parser/plotly.config.js +10 -10
- package/src/core/parser/plotly.data.js +132 -132
- package/src/core/parser/plotly.layout.js +9 -9
- package/src/core/parser/plotly.violin.js +18 -18
- package/src/core/recharts.js +62 -62
- package/src/core/router/alias.js +49 -49
- package/src/core/router/jsonRouter.js +31 -31
- package/src/core/themes/modern.js +32 -32
- package/src/core/themes/themeSelector.js +33 -33
- package/src/core/visualify.js +47 -47
- package/src/core/widgets/circularProgress.js +23 -23
- package/src/core/widgets/controller.js +83 -83
- package/src/core/widgets/errorBoundary.js +36 -36
- package/src/core/widgets/footer.js +177 -177
- package/src/core/widgets/header.js +234 -234
- package/src/core/widgets/layout/Grid.js +31 -31
- package/src/core/widgets/layout.js +36 -36
- package/src/core/widgets/mapping.js +42 -42
- package/src/index.js +62 -62
- package/src/setupTests.js +5 -5
- package/docs/docs/CLI.md +0 -34
- package/docs/docs/Rechart/scatter.md +0 -298
- package/docs/docs/log.md +0 -9
- package/docs/docs/static/logo/favicon.ico +0 -0
- package/docs/docs/static/logo/logo_128x128.png +0 -0
- package/docs/docs/static/logo/logo_192x192.png +0 -0
- package/docs/docs/static/logo/logo_256x256.png +0 -0
- package/docs/docs/static/logo/logo_512x512.png +0 -0
- package/docs/docs/static/logo/logo_64x64.png +0 -0
- package/docs/docs/theme.md +0 -5
- /package/docs/{docs/Rechart → Rechart}/geo.md +0 -0
- /package/docs/{docs/Rechart → Rechart}/liquidfill.md +0 -0
- /package/docs/{docs/Rechart → Rechart}/polar.md +0 -0
- /package/docs/{docs/Rechart → Rechart}/sankey.md +0 -0
- /package/docs/{docs/Rechart/sunburst.md → Rechart/scatter.md} +0 -0
- /package/docs/{docs/Rechart/tree.md → Rechart/sunburst.md} +0 -0
- /package/docs/{docs/Rechart/wordcloud.md → Rechart/tree.md} +0 -0
- /package/docs/{docs/components/markdown.md → Rechart/wordcloud.md} +0 -0
- /package/docs/{docs/static → static}/_images/deploy-github-pages.png +0 -0
@@ -1,80 +1,80 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2023-12-30 15:11:35
|
4
|
-
* @FilePath : /visualifyjs/src/core/components/ratio.js
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
import React, { useState, useEffect } from 'react';
|
9
|
-
import { useAppContext } from '../appContext';
|
10
|
-
|
11
|
-
function RatioBox({ props, style }) {
|
12
|
-
const { debug } = props;
|
13
|
-
|
14
|
-
const { style: blockStyle } = props;
|
15
|
-
// if debug is true, then border is red, else no border
|
16
|
-
style = {
|
17
|
-
...style,
|
18
|
-
...blockStyle,
|
19
|
-
border: debug ? '1px solid red' : 'none',
|
20
|
-
};
|
21
|
-
|
22
|
-
const { title } = props;
|
23
|
-
const renderTitle = () => {
|
24
|
-
return title && <h3>{title}</h3>;
|
25
|
-
};
|
26
|
-
|
27
|
-
const { setSharedData } = useAppContext();
|
28
|
-
const { choice = [] } = props;
|
29
|
-
|
30
|
-
// State to keep track of selected choice
|
31
|
-
const [selectedChoice, setSelectedChoice] = useState(
|
32
|
-
choice.length > 0 ? choice[0] : null,
|
33
|
-
);
|
34
|
-
|
35
|
-
// Handler for radio button change
|
36
|
-
const handleRadioChange = (event) => {
|
37
|
-
setSelectedChoice(event.target.value);
|
38
|
-
};
|
39
|
-
|
40
|
-
const {
|
41
|
-
id,
|
42
|
-
val,
|
43
|
-
ratio_style = {
|
44
|
-
margin: 'auto 15px',
|
45
|
-
},
|
46
|
-
} = props;
|
47
|
-
|
48
|
-
// Store the selected choice in shared data whenever it changes
|
49
|
-
useEffect(() => {
|
50
|
-
if (val) {
|
51
|
-
setSharedData((prevSharedData) => {
|
52
|
-
return { ...prevSharedData, [val]: selectedChoice };
|
53
|
-
});
|
54
|
-
}
|
55
|
-
}, [selectedChoice, val, setSharedData]);
|
56
|
-
|
57
|
-
return (
|
58
|
-
<div
|
59
|
-
key={id}
|
60
|
-
style={style}
|
61
|
-
className='ratio-box-container'>
|
62
|
-
{renderTitle()}
|
63
|
-
{choice.map((item, index) => (
|
64
|
-
<label
|
65
|
-
key={index}
|
66
|
-
style={ratio_style}>
|
67
|
-
<input
|
68
|
-
type='radio'
|
69
|
-
value={item}
|
70
|
-
checked={selectedChoice === item}
|
71
|
-
onChange={handleRadioChange}
|
72
|
-
/>
|
73
|
-
{item}
|
74
|
-
</label>
|
75
|
-
))}
|
76
|
-
</div>
|
77
|
-
);
|
78
|
-
}
|
79
|
-
|
80
|
-
export default RatioBox;
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2023-12-30 15:11:35
|
4
|
+
* @FilePath : /visualifyjs/src/core/components/ratio.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
import React, { useState, useEffect } from 'react';
|
9
|
+
import { useAppContext } from '../appContext';
|
10
|
+
|
11
|
+
function RatioBox({ props, style }) {
|
12
|
+
const { debug } = props;
|
13
|
+
|
14
|
+
const { style: blockStyle } = props;
|
15
|
+
// if debug is true, then border is red, else no border
|
16
|
+
style = {
|
17
|
+
...style,
|
18
|
+
...blockStyle,
|
19
|
+
border: debug ? '1px solid red' : 'none',
|
20
|
+
};
|
21
|
+
|
22
|
+
const { title } = props;
|
23
|
+
const renderTitle = () => {
|
24
|
+
return title && <h3>{title}</h3>;
|
25
|
+
};
|
26
|
+
|
27
|
+
const { setSharedData } = useAppContext();
|
28
|
+
const { choice = [] } = props;
|
29
|
+
|
30
|
+
// State to keep track of selected choice
|
31
|
+
const [selectedChoice, setSelectedChoice] = useState(
|
32
|
+
choice.length > 0 ? choice[0] : null,
|
33
|
+
);
|
34
|
+
|
35
|
+
// Handler for radio button change
|
36
|
+
const handleRadioChange = (event) => {
|
37
|
+
setSelectedChoice(event.target.value);
|
38
|
+
};
|
39
|
+
|
40
|
+
const {
|
41
|
+
id,
|
42
|
+
val,
|
43
|
+
ratio_style = {
|
44
|
+
margin: 'auto 15px',
|
45
|
+
},
|
46
|
+
} = props;
|
47
|
+
|
48
|
+
// Store the selected choice in shared data whenever it changes
|
49
|
+
useEffect(() => {
|
50
|
+
if (val) {
|
51
|
+
setSharedData((prevSharedData) => {
|
52
|
+
return { ...prevSharedData, [val]: selectedChoice };
|
53
|
+
});
|
54
|
+
}
|
55
|
+
}, [selectedChoice, val, setSharedData]);
|
56
|
+
|
57
|
+
return (
|
58
|
+
<div
|
59
|
+
key={id}
|
60
|
+
style={style}
|
61
|
+
className='ratio-box-container'>
|
62
|
+
{renderTitle()}
|
63
|
+
{choice.map((item, index) => (
|
64
|
+
<label
|
65
|
+
key={index}
|
66
|
+
style={ratio_style}>
|
67
|
+
<input
|
68
|
+
type='radio'
|
69
|
+
value={item}
|
70
|
+
checked={selectedChoice === item}
|
71
|
+
onChange={handleRadioChange}
|
72
|
+
/>
|
73
|
+
{item}
|
74
|
+
</label>
|
75
|
+
))}
|
76
|
+
</div>
|
77
|
+
);
|
78
|
+
}
|
79
|
+
|
80
|
+
export default RatioBox;
|
@@ -1,173 +1,173 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2023-11-06 17:23:59
|
4
|
-
* @FilePath : /
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
import React, { useEffect, useRef, useState } from 'react';
|
9
|
-
import { useAppContext } from '../appContext';
|
10
|
-
import Loading from '../pages/loading';
|
11
|
-
import {
|
12
|
-
initChart,
|
13
|
-
handleChartForSharedDataChange,
|
14
|
-
} from '../modules/echartsUtils';
|
15
|
-
import {
|
16
|
-
parseConfig,
|
17
|
-
validateConfig,
|
18
|
-
handleAPI,
|
19
|
-
handleSimplyLoad,
|
20
|
-
onDataZoom,
|
21
|
-
parseData,
|
22
|
-
outputAxisValues,
|
23
|
-
} from './parser.scatterBio';
|
24
|
-
|
25
|
-
function ScatterBio({ props, style }) {
|
26
|
-
const chartRef = useRef(null);
|
27
|
-
const { sharedData } = useAppContext();
|
28
|
-
const [loading, setLoading] = useState({ active: true, message: null });
|
29
|
-
|
30
|
-
// Store the previous sharedData value using a ref
|
31
|
-
const previousSharedDataRef = useRef(null);
|
32
|
-
|
33
|
-
useEffect(() => {
|
34
|
-
let option = parseConfig(props);
|
35
|
-
|
36
|
-
let fetched_dat = null;
|
37
|
-
|
38
|
-
// Check if the sharedData has changed
|
39
|
-
handleChartForSharedDataChange(
|
40
|
-
chartRef,
|
41
|
-
sharedData,
|
42
|
-
previousSharedDataRef,
|
43
|
-
() => {
|
44
|
-
option.xAxis.min = props?.echart?.xAxis?.min;
|
45
|
-
option.xAxis.max = props?.echart?.xAxis?.max;
|
46
|
-
option.yAxis.min = props?.echart?.yAxis?.min;
|
47
|
-
option.yAxis.max = props?.echart?.yAxis?.max;
|
48
|
-
},
|
49
|
-
);
|
50
|
-
|
51
|
-
// Simulate fetching data asynchronously (replace with your data fetching logic)
|
52
|
-
const updatePlot = async () => {
|
53
|
-
try {
|
54
|
-
setLoading({ active: true, message: null });
|
55
|
-
validateConfig(props.config);
|
56
|
-
const myChart = initChart(chartRef, option);
|
57
|
-
if (props.config.simpleload)
|
58
|
-
handleSimplyLoad(props.config.simpleload);
|
59
|
-
else {
|
60
|
-
const ibox = props.config?.ibox ?? {
|
61
|
-
xMin: -9999,
|
62
|
-
yMin: -9999,
|
63
|
-
xMax: 9999,
|
64
|
-
yMax: 9999,
|
65
|
-
};
|
66
|
-
fetched_dat = await handleAPI(
|
67
|
-
props.config,
|
68
|
-
sharedData,
|
69
|
-
ibox,
|
70
|
-
);
|
71
|
-
|
72
|
-
}
|
73
|
-
var { series, legend, visualMap, title } = parseData(
|
74
|
-
fetched_dat,
|
75
|
-
props.config,
|
76
|
-
sharedData,
|
77
|
-
);
|
78
|
-
// Chart options
|
79
|
-
option.series = props?.echart?.series ?? series;
|
80
|
-
option.legend = {
|
81
|
-
...option.legend,
|
82
|
-
...legend,
|
83
|
-
};
|
84
|
-
|
85
|
-
option.visualMap = visualMap;
|
86
|
-
option.title = {
|
87
|
-
...option.title,
|
88
|
-
text: title,
|
89
|
-
};
|
90
|
-
|
91
|
-
// Set the initial option
|
92
|
-
myChart.setOption(option);
|
93
|
-
|
94
|
-
let zoomTimeout;
|
95
|
-
const zoom_action = () => {
|
96
|
-
clearTimeout(zoomTimeout);
|
97
|
-
zoomTimeout = setTimeout(async () => {
|
98
|
-
await onDataZoom(
|
99
|
-
props,
|
100
|
-
sharedData,
|
101
|
-
fetched_dat,
|
102
|
-
myChart,
|
103
|
-
option,
|
104
|
-
);
|
105
|
-
}, 500);
|
106
|
-
};
|
107
|
-
|
108
|
-
myChart.on('dataZoom', zoom_action);
|
109
|
-
|
110
|
-
setLoading({ active: false, message: null });
|
111
|
-
|
112
|
-
let bbox = outputAxisValues(myChart);
|
113
|
-
option.xAxis.min = option.xAxis.min ?? bbox.xMin;
|
114
|
-
option.xAxis.max = option.xAxis.max ?? bbox.xMax;
|
115
|
-
option.yAxis.min = option.yAxis.min ?? bbox.yMin;
|
116
|
-
option.yAxis.max = option.yAxis.max ?? bbox.yMax;
|
117
|
-
|
118
|
-
// Cleanup event listeners on component unmount
|
119
|
-
return () => {
|
120
|
-
myChart.off('dataZoom', zoom_action);
|
121
|
-
myChart.dispose();
|
122
|
-
};
|
123
|
-
} catch (error) {
|
124
|
-
setLoading({ active: true, message: error.message });
|
125
|
-
}
|
126
|
-
};
|
127
|
-
|
128
|
-
// Execute the updatePlot function
|
129
|
-
updatePlot();
|
130
|
-
|
131
|
-
// Observe changes to the size of the chart container
|
132
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
133
|
-
for (let entry of entries) {
|
134
|
-
if (entry.contentRect.width && entry.contentRect.height) {
|
135
|
-
updatePlot();
|
136
|
-
resizeObserver.disconnect();
|
137
|
-
}
|
138
|
-
}
|
139
|
-
});
|
140
|
-
|
141
|
-
if (chartRef.current) {
|
142
|
-
resizeObserver.observe(chartRef.current);
|
143
|
-
}
|
144
|
-
|
145
|
-
// Cleanup function
|
146
|
-
return () => {
|
147
|
-
resizeObserver.disconnect();
|
148
|
-
};
|
149
|
-
}, [props, sharedData]);
|
150
|
-
|
151
|
-
return (
|
152
|
-
<div
|
153
|
-
id={props.id}
|
154
|
-
style={{ ...style, position: 'relative' }}>
|
155
|
-
{loading.active && (
|
156
|
-
<Loading
|
157
|
-
message={loading.message}
|
158
|
-
style={{ marginTop: '10px' }}
|
159
|
-
/>
|
160
|
-
)}
|
161
|
-
<div
|
162
|
-
ref={chartRef}
|
163
|
-
style={{
|
164
|
-
opacity: loading.active ? 0 : 1,
|
165
|
-
width: props.config?.size?.width || '100%',
|
166
|
-
height: props.config?.size?.height || '100%',
|
167
|
-
}}
|
168
|
-
/>
|
169
|
-
</div>
|
170
|
-
);
|
171
|
-
}
|
172
|
-
|
173
|
-
export default ScatterBio;
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2023-11-06 17:23:59
|
4
|
+
* @FilePath : /visualifyjs/src/core/components/scatterL.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
import React, { useEffect, useRef, useState } from 'react';
|
9
|
+
import { useAppContext } from '../appContext';
|
10
|
+
import Loading from '../pages/loading';
|
11
|
+
import {
|
12
|
+
initChart,
|
13
|
+
handleChartForSharedDataChange,
|
14
|
+
} from '../modules/echartsUtils';
|
15
|
+
import {
|
16
|
+
parseConfig,
|
17
|
+
validateConfig,
|
18
|
+
handleAPI,
|
19
|
+
handleSimplyLoad,
|
20
|
+
onDataZoom,
|
21
|
+
parseData,
|
22
|
+
outputAxisValues,
|
23
|
+
} from './parser.scatterBio';
|
24
|
+
|
25
|
+
function ScatterBio({ props, style }) {
|
26
|
+
const chartRef = useRef(null);
|
27
|
+
const { sharedData } = useAppContext();
|
28
|
+
const [loading, setLoading] = useState({ active: true, message: null });
|
29
|
+
|
30
|
+
// Store the previous sharedData value using a ref
|
31
|
+
const previousSharedDataRef = useRef(null);
|
32
|
+
|
33
|
+
useEffect(() => {
|
34
|
+
let option = parseConfig(props);
|
35
|
+
console.log('option: ', option);
|
36
|
+
let fetched_dat = null;
|
37
|
+
|
38
|
+
// Check if the sharedData has changed
|
39
|
+
handleChartForSharedDataChange(
|
40
|
+
chartRef,
|
41
|
+
sharedData,
|
42
|
+
previousSharedDataRef,
|
43
|
+
() => {
|
44
|
+
option.xAxis.min = props?.echart?.xAxis?.min;
|
45
|
+
option.xAxis.max = props?.echart?.xAxis?.max;
|
46
|
+
option.yAxis.min = props?.echart?.yAxis?.min;
|
47
|
+
option.yAxis.max = props?.echart?.yAxis?.max;
|
48
|
+
},
|
49
|
+
);
|
50
|
+
|
51
|
+
// Simulate fetching data asynchronously (replace with your data fetching logic)
|
52
|
+
const updatePlot = async () => {
|
53
|
+
try {
|
54
|
+
setLoading({ active: true, message: null });
|
55
|
+
validateConfig(props.config);
|
56
|
+
const myChart = initChart(chartRef, option);
|
57
|
+
if (props.config.simpleload)
|
58
|
+
handleSimplyLoad(props.config.simpleload);
|
59
|
+
else {
|
60
|
+
const ibox = props.config?.ibox ?? {
|
61
|
+
xMin: -9999,
|
62
|
+
yMin: -9999,
|
63
|
+
xMax: 9999,
|
64
|
+
yMax: 9999,
|
65
|
+
};
|
66
|
+
fetched_dat = await handleAPI(
|
67
|
+
props.config,
|
68
|
+
sharedData,
|
69
|
+
ibox,
|
70
|
+
);
|
71
|
+
console.log(fetched_dat, 'fetched_dat');
|
72
|
+
}
|
73
|
+
var { series, legend, visualMap, title } = parseData(
|
74
|
+
fetched_dat,
|
75
|
+
props.config,
|
76
|
+
sharedData,
|
77
|
+
);
|
78
|
+
// Chart options
|
79
|
+
option.series = props?.echart?.series ?? series;
|
80
|
+
option.legend = {
|
81
|
+
...option.legend,
|
82
|
+
...legend,
|
83
|
+
};
|
84
|
+
|
85
|
+
option.visualMap = visualMap;
|
86
|
+
option.title = {
|
87
|
+
...option.title,
|
88
|
+
text: title,
|
89
|
+
};
|
90
|
+
|
91
|
+
// Set the initial option
|
92
|
+
myChart.setOption(option);
|
93
|
+
|
94
|
+
let zoomTimeout;
|
95
|
+
const zoom_action = () => {
|
96
|
+
clearTimeout(zoomTimeout);
|
97
|
+
zoomTimeout = setTimeout(async () => {
|
98
|
+
await onDataZoom(
|
99
|
+
props,
|
100
|
+
sharedData,
|
101
|
+
fetched_dat,
|
102
|
+
myChart,
|
103
|
+
option,
|
104
|
+
);
|
105
|
+
}, 500);
|
106
|
+
};
|
107
|
+
|
108
|
+
myChart.on('dataZoom', zoom_action);
|
109
|
+
|
110
|
+
setLoading({ active: false, message: null });
|
111
|
+
|
112
|
+
let bbox = outputAxisValues(myChart);
|
113
|
+
option.xAxis.min = option.xAxis.min ?? bbox.xMin;
|
114
|
+
option.xAxis.max = option.xAxis.max ?? bbox.xMax;
|
115
|
+
option.yAxis.min = option.yAxis.min ?? bbox.yMin;
|
116
|
+
option.yAxis.max = option.yAxis.max ?? bbox.yMax;
|
117
|
+
|
118
|
+
// Cleanup event listeners on component unmount
|
119
|
+
return () => {
|
120
|
+
myChart.off('dataZoom', zoom_action);
|
121
|
+
myChart.dispose();
|
122
|
+
};
|
123
|
+
} catch (error) {
|
124
|
+
setLoading({ active: true, message: error.message });
|
125
|
+
}
|
126
|
+
};
|
127
|
+
|
128
|
+
// Execute the updatePlot function
|
129
|
+
updatePlot();
|
130
|
+
|
131
|
+
// Observe changes to the size of the chart container
|
132
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
133
|
+
for (let entry of entries) {
|
134
|
+
if (entry.contentRect.width && entry.contentRect.height) {
|
135
|
+
updatePlot();
|
136
|
+
resizeObserver.disconnect();
|
137
|
+
}
|
138
|
+
}
|
139
|
+
});
|
140
|
+
|
141
|
+
if (chartRef.current) {
|
142
|
+
resizeObserver.observe(chartRef.current);
|
143
|
+
}
|
144
|
+
|
145
|
+
// Cleanup function
|
146
|
+
return () => {
|
147
|
+
resizeObserver.disconnect();
|
148
|
+
};
|
149
|
+
}, [props, sharedData]);
|
150
|
+
|
151
|
+
return (
|
152
|
+
<div
|
153
|
+
id={props.id}
|
154
|
+
style={{ ...style, position: 'relative' }}>
|
155
|
+
{loading.active && (
|
156
|
+
<Loading
|
157
|
+
message={loading.message}
|
158
|
+
style={{ marginTop: '10px' }}
|
159
|
+
/>
|
160
|
+
)}
|
161
|
+
<div
|
162
|
+
ref={chartRef}
|
163
|
+
style={{
|
164
|
+
opacity: loading.active ? 0 : 1,
|
165
|
+
width: props.config?.size?.width || '100%',
|
166
|
+
height: props.config?.size?.height || '100%',
|
167
|
+
}}
|
168
|
+
/>
|
169
|
+
</div>
|
170
|
+
);
|
171
|
+
}
|
172
|
+
|
173
|
+
export default ScatterBio;
|