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,71 +1,71 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2023-12-01 14:18:43
|
4
|
-
* @FilePath : /visualifyjs/src/core/libs/echarts.js
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
import React, { useEffect, useRef, forwardRef } from 'react';
|
9
|
-
import ReactEcharts from 'echarts-for-react';
|
10
|
-
|
11
|
-
const ReCharts = forwardRef(({ options, style, onEvents = {} }, ref) => {
|
12
|
-
const internalRef = useRef(null);
|
13
|
-
|
14
|
-
// Use the provided ref or the internalRef
|
15
|
-
const chartRef = ref || internalRef;
|
16
|
-
|
17
|
-
useEffect(() => {
|
18
|
-
// Ensure the chart instance is available
|
19
|
-
if (chartRef.current) {
|
20
|
-
const chart = chartRef.current.getEchartsInstance();
|
21
|
-
|
22
|
-
// Set the 'silent' option to suppress warnings
|
23
|
-
chart.setOption({
|
24
|
-
...options,
|
25
|
-
silent: true,
|
26
|
-
});
|
27
|
-
|
28
|
-
// Efficiently update options
|
29
|
-
if (JSON.stringify(options) !== JSON.stringify(chart.getOption())) {
|
30
|
-
chart.clear();
|
31
|
-
chart.setOption(options);
|
32
|
-
}
|
33
|
-
|
34
|
-
// Handle events
|
35
|
-
Object.keys(onEvents).forEach((eventName) => {
|
36
|
-
chart.off(eventName); // Remove old listener
|
37
|
-
chart.on(eventName, onEvents[eventName]); // Attach new listener
|
38
|
-
});
|
39
|
-
|
40
|
-
// Resize observer for responsive charts
|
41
|
-
const resizeObserver = new ResizeObserver(() => {
|
42
|
-
chart.resize();
|
43
|
-
});
|
44
|
-
const parent = chart.getDom().parentElement;
|
45
|
-
if (parent) {
|
46
|
-
resizeObserver.observe(parent);
|
47
|
-
}
|
48
|
-
|
49
|
-
// Cleanup
|
50
|
-
return () => {
|
51
|
-
resizeObserver.disconnect();
|
52
|
-
|
53
|
-
if (!chart.isDisposed()) {
|
54
|
-
chart.off();
|
55
|
-
chart.dispose();
|
56
|
-
}
|
57
|
-
};
|
58
|
-
}
|
59
|
-
}, [options, chartRef, onEvents]); // Include onEvents in the dependency array
|
60
|
-
|
61
|
-
return (
|
62
|
-
<ReactEcharts
|
63
|
-
ref={chartRef}
|
64
|
-
option={options}
|
65
|
-
style={style}
|
66
|
-
onEvents={onEvents}
|
67
|
-
/>
|
68
|
-
);
|
69
|
-
});
|
70
|
-
|
71
|
-
export default ReCharts;
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2023-12-01 14:18:43
|
4
|
+
* @FilePath : /visualifyjs/src/core/libs/echarts.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
import React, { useEffect, useRef, forwardRef } from 'react';
|
9
|
+
import ReactEcharts from 'echarts-for-react';
|
10
|
+
|
11
|
+
const ReCharts = forwardRef(({ options, style, onEvents = {} }, ref) => {
|
12
|
+
const internalRef = useRef(null);
|
13
|
+
|
14
|
+
// Use the provided ref or the internalRef
|
15
|
+
const chartRef = ref || internalRef;
|
16
|
+
|
17
|
+
useEffect(() => {
|
18
|
+
// Ensure the chart instance is available
|
19
|
+
if (chartRef.current) {
|
20
|
+
const chart = chartRef.current.getEchartsInstance();
|
21
|
+
|
22
|
+
// Set the 'silent' option to suppress warnings
|
23
|
+
chart.setOption({
|
24
|
+
...options,
|
25
|
+
silent: true,
|
26
|
+
});
|
27
|
+
|
28
|
+
// Efficiently update options
|
29
|
+
if (JSON.stringify(options) !== JSON.stringify(chart.getOption())) {
|
30
|
+
chart.clear();
|
31
|
+
chart.setOption(options);
|
32
|
+
}
|
33
|
+
|
34
|
+
// Handle events
|
35
|
+
Object.keys(onEvents).forEach((eventName) => {
|
36
|
+
chart.off(eventName); // Remove old listener
|
37
|
+
chart.on(eventName, onEvents[eventName]); // Attach new listener
|
38
|
+
});
|
39
|
+
|
40
|
+
// Resize observer for responsive charts
|
41
|
+
const resizeObserver = new ResizeObserver(() => {
|
42
|
+
chart.resize();
|
43
|
+
});
|
44
|
+
const parent = chart.getDom().parentElement;
|
45
|
+
if (parent) {
|
46
|
+
resizeObserver.observe(parent);
|
47
|
+
}
|
48
|
+
|
49
|
+
// Cleanup
|
50
|
+
return () => {
|
51
|
+
resizeObserver.disconnect();
|
52
|
+
|
53
|
+
if (!chart.isDisposed()) {
|
54
|
+
chart.off();
|
55
|
+
chart.dispose();
|
56
|
+
}
|
57
|
+
};
|
58
|
+
}
|
59
|
+
}, [options, chartRef, onEvents]); // Include onEvents in the dependency array
|
60
|
+
|
61
|
+
return (
|
62
|
+
<ReactEcharts
|
63
|
+
ref={chartRef}
|
64
|
+
option={options}
|
65
|
+
style={style}
|
66
|
+
onEvents={onEvents}
|
67
|
+
/>
|
68
|
+
);
|
69
|
+
});
|
70
|
+
|
71
|
+
export default ReCharts;
|
@@ -1,43 +1,43 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2023-11-11 23:09:44
|
4
|
-
* @FilePath : /visualifyjs/src/core/lib/echartsUtils
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
// echartsUtils.js
|
9
|
-
import * as echarts from 'echarts';
|
10
|
-
|
11
|
-
export const initChart = (chartRef, chartOption) => {
|
12
|
-
if (!chartRef.current) {
|
13
|
-
throw new Error('Chart container DOM element not available.');
|
14
|
-
}
|
15
|
-
|
16
|
-
let chartInstance = echarts.getInstanceByDom(chartRef.current);
|
17
|
-
if (!chartInstance) {
|
18
|
-
chartInstance = echarts.init(chartRef.current);
|
19
|
-
}
|
20
|
-
chartInstance.setOption(chartOption);
|
21
|
-
return chartInstance;
|
22
|
-
};
|
23
|
-
|
24
|
-
export const disposeChart = (chartInstance) => {
|
25
|
-
chartInstance && chartInstance.dispose();
|
26
|
-
};
|
27
|
-
|
28
|
-
export const handleChartForSharedDataChange = (
|
29
|
-
chartRef,
|
30
|
-
sharedData,
|
31
|
-
previousSharedDataRef,
|
32
|
-
extra_Excute_Func = null,
|
33
|
-
) => {
|
34
|
-
if (sharedData !== previousSharedDataRef.current) {
|
35
|
-
const chartInstance = echarts.getInstanceByDom(chartRef.current);
|
36
|
-
disposeChart(chartInstance);
|
37
|
-
previousSharedDataRef.current = sharedData;
|
38
|
-
if (extra_Excute_Func) {
|
39
|
-
//console.log('excute func: ', extra_Excute_Func);
|
40
|
-
extra_Excute_Func();
|
41
|
-
}
|
42
|
-
}
|
43
|
-
};
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2023-11-11 23:09:44
|
4
|
+
* @FilePath : /visualifyjs/src/core/lib/echartsUtils
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
// echartsUtils.js
|
9
|
+
import * as echarts from 'echarts';
|
10
|
+
|
11
|
+
export const initChart = (chartRef, chartOption) => {
|
12
|
+
if (!chartRef.current) {
|
13
|
+
throw new Error('Chart container DOM element not available.');
|
14
|
+
}
|
15
|
+
|
16
|
+
let chartInstance = echarts.getInstanceByDom(chartRef.current);
|
17
|
+
if (!chartInstance) {
|
18
|
+
chartInstance = echarts.init(chartRef.current);
|
19
|
+
}
|
20
|
+
chartInstance.setOption(chartOption);
|
21
|
+
return chartInstance;
|
22
|
+
};
|
23
|
+
|
24
|
+
export const disposeChart = (chartInstance) => {
|
25
|
+
chartInstance && chartInstance.dispose();
|
26
|
+
};
|
27
|
+
|
28
|
+
export const handleChartForSharedDataChange = (
|
29
|
+
chartRef,
|
30
|
+
sharedData,
|
31
|
+
previousSharedDataRef,
|
32
|
+
extra_Excute_Func = null,
|
33
|
+
) => {
|
34
|
+
if (sharedData !== previousSharedDataRef.current) {
|
35
|
+
const chartInstance = echarts.getInstanceByDom(chartRef.current);
|
36
|
+
disposeChart(chartInstance);
|
37
|
+
previousSharedDataRef.current = sharedData;
|
38
|
+
if (extra_Excute_Func) {
|
39
|
+
//console.log('excute func: ', extra_Excute_Func);
|
40
|
+
extra_Excute_Func();
|
41
|
+
}
|
42
|
+
}
|
43
|
+
};
|
@@ -1,152 +1,152 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2023-12-01 14:21:40
|
4
|
-
* @FilePath : /
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
import React, { useState, useEffect, useRef } from 'react';
|
9
|
-
import ReCharts from './echarts';
|
10
|
-
import Loading from '../pages/loading';
|
11
|
-
import _ from 'lodash';
|
12
|
-
import _parser_gereral from '../parser/echart.general';
|
13
|
-
import _parser_data from '../parser/echart.data';
|
14
|
-
import _fetch_data, { _process_fetched_data } from '../parser/echart.parser';
|
15
|
-
|
16
|
-
import {
|
17
|
-
fetchPresetFromURL,
|
18
|
-
getEmbeddedPreset,
|
19
|
-
} from '../modules/echarts/presetHandler';
|
20
|
-
import minimumPreset from './echarts/common';
|
21
|
-
|
22
|
-
import ErrorBoundary from '../widgets/errorBoundary';
|
23
|
-
import { useAppContext } from '../appContext';
|
24
|
-
|
25
|
-
import downsampleSeries from '../parser/echart.hilbert';
|
26
|
-
|
27
|
-
const EChartSwitcher = ({ props, style }) => {
|
28
|
-
const { config = {}, parser, advanced, style: _style } = props;
|
29
|
-
|
30
|
-
const [loading, setLoading] = useState({
|
31
|
-
active: true,
|
32
|
-
message: null,
|
33
|
-
style: advanced?.loadingStlye ?? {},
|
34
|
-
});
|
35
|
-
// Store the previous sharedData value using a ref
|
36
|
-
const previousSharedDataRef = useRef(null);
|
37
|
-
const chartRef = useRef(null);
|
38
|
-
const [presetData, setPresetData] = useState(null);
|
39
|
-
const [Options, setOptions] = useState({});
|
40
|
-
const [onEvents] = useState({});
|
41
|
-
const { width, height = '400px' } = config;
|
42
|
-
const { sharedData } = useAppContext();
|
43
|
-
|
44
|
-
useEffect(() => {
|
45
|
-
let fetched_data, combinedOptions;
|
46
|
-
const parsedGeneral = _parser_gereral(config, presetData);
|
47
|
-
const parsedData = _parser_data(config, parsedGeneral);
|
48
|
-
|
49
|
-
const loadPreset = async () => {
|
50
|
-
try {
|
51
|
-
if (typeof config.preset === 'string') {
|
52
|
-
if (
|
53
|
-
config.preset.startsWith('http://') ||
|
54
|
-
config.preset.startsWith('https://')
|
55
|
-
) {
|
56
|
-
const presetData = await fetchPresetFromURL(
|
57
|
-
config.preset,
|
58
|
-
);
|
59
|
-
setPresetData(presetData);
|
60
|
-
} else {
|
61
|
-
const embeddedPreset = getEmbeddedPreset(config.preset);
|
62
|
-
setPresetData(embeddedPreset);
|
63
|
-
}
|
64
|
-
} else {
|
65
|
-
setPresetData(minimumPreset);
|
66
|
-
}
|
67
|
-
} catch (error) {
|
68
|
-
console.error('Error loading preset:', error);
|
69
|
-
// Handle error or set to a default value
|
70
|
-
setPresetData(minimumPreset);
|
71
|
-
}
|
72
|
-
};
|
73
|
-
|
74
|
-
const updatePlot = async () => {
|
75
|
-
try {
|
76
|
-
let parsedAPI = parsedData;
|
77
|
-
|
78
|
-
if (parser) {
|
79
|
-
// fetch data from api
|
80
|
-
fetched_data = await _fetch_data(
|
81
|
-
parser,
|
82
|
-
parsedData,
|
83
|
-
sharedData,
|
84
|
-
);
|
85
|
-
parsedAPI = _process_fetched_data(
|
86
|
-
fetched_data,
|
87
|
-
parser,
|
88
|
-
parsedData,
|
89
|
-
);
|
90
|
-
}
|
91
|
-
|
92
|
-
combinedOptions = _.merge(parsedAPI, config.overrides);
|
93
|
-
|
94
|
-
if (advanced?.hilbert)
|
95
|
-
combinedOptions.series = downsampleSeries(
|
96
|
-
combinedOptions.series,
|
97
|
-
advanced.hilbert,
|
98
|
-
);
|
99
|
-
|
100
|
-
console.log('Final Options:', combinedOptions);
|
101
|
-
setOptions(combinedOptions);
|
102
|
-
|
103
|
-
setLoading((prev) => ({
|
104
|
-
...prev,
|
105
|
-
active: false,
|
106
|
-
message: null,
|
107
|
-
}));
|
108
|
-
} catch (error) {
|
109
|
-
setLoading((prev) => ({
|
110
|
-
...prev,
|
111
|
-
active: true,
|
112
|
-
message: error.message,
|
113
|
-
}));
|
114
|
-
}
|
115
|
-
};
|
116
|
-
|
117
|
-
loadPreset();
|
118
|
-
|
119
|
-
updatePlot();
|
120
|
-
|
121
|
-
if (!_.isEqual(sharedData, previousSharedDataRef.current))
|
122
|
-
previousSharedDataRef.current = sharedData;
|
123
|
-
}, [config, parser, advanced, presetData, sharedData]);
|
124
|
-
|
125
|
-
return (
|
126
|
-
<div
|
127
|
-
id={props.id}
|
128
|
-
style={{ ...style, position: 'relative' }}>
|
129
|
-
{loading.active && (
|
130
|
-
<Loading
|
131
|
-
message={loading.message}
|
132
|
-
style={loading.style}
|
133
|
-
/>
|
134
|
-
)}
|
135
|
-
<ErrorBoundary>
|
136
|
-
<ReCharts
|
137
|
-
options={Options}
|
138
|
-
style={{
|
139
|
-
opacity: loading.active ? 0 : 1,
|
140
|
-
width,
|
141
|
-
height,
|
142
|
-
..._style,
|
143
|
-
}}
|
144
|
-
onEvents={onEvents}
|
145
|
-
ref={chartRef}
|
146
|
-
/>
|
147
|
-
</ErrorBoundary>
|
148
|
-
</div>
|
149
|
-
);
|
150
|
-
};
|
151
|
-
|
152
|
-
export default EChartSwitcher;
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2023-12-01 14:21:40
|
4
|
+
* @FilePath : /visualifyjs/src/core/modules/echartswitcher.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
import React, { useState, useEffect, useRef } from 'react';
|
9
|
+
import ReCharts from './echarts';
|
10
|
+
import Loading from '../pages/loading';
|
11
|
+
import _ from 'lodash';
|
12
|
+
import _parser_gereral from '../parser/echart.general';
|
13
|
+
import _parser_data from '../parser/echart.data';
|
14
|
+
import _fetch_data, { _process_fetched_data } from '../parser/echart.parser';
|
15
|
+
|
16
|
+
import {
|
17
|
+
fetchPresetFromURL,
|
18
|
+
getEmbeddedPreset,
|
19
|
+
} from '../modules/echarts/presetHandler';
|
20
|
+
import minimumPreset from './echarts/common';
|
21
|
+
|
22
|
+
import ErrorBoundary from '../widgets/errorBoundary';
|
23
|
+
import { useAppContext } from '../appContext';
|
24
|
+
|
25
|
+
import downsampleSeries from '../parser/echart.hilbert';
|
26
|
+
|
27
|
+
const EChartSwitcher = ({ props, style }) => {
|
28
|
+
const { config = {}, parser, advanced, style: _style } = props;
|
29
|
+
|
30
|
+
const [loading, setLoading] = useState({
|
31
|
+
active: true,
|
32
|
+
message: null,
|
33
|
+
style: advanced?.loadingStlye ?? {},
|
34
|
+
});
|
35
|
+
// Store the previous sharedData value using a ref
|
36
|
+
const previousSharedDataRef = useRef(null);
|
37
|
+
const chartRef = useRef(null);
|
38
|
+
const [presetData, setPresetData] = useState(null);
|
39
|
+
const [Options, setOptions] = useState({});
|
40
|
+
const [onEvents] = useState({});
|
41
|
+
const { width, height = '400px' } = config;
|
42
|
+
const { sharedData } = useAppContext();
|
43
|
+
|
44
|
+
useEffect(() => {
|
45
|
+
let fetched_data, combinedOptions;
|
46
|
+
const parsedGeneral = _parser_gereral(config, presetData);
|
47
|
+
const parsedData = _parser_data(config, parsedGeneral);
|
48
|
+
|
49
|
+
const loadPreset = async () => {
|
50
|
+
try {
|
51
|
+
if (typeof config.preset === 'string') {
|
52
|
+
if (
|
53
|
+
config.preset.startsWith('http://') ||
|
54
|
+
config.preset.startsWith('https://')
|
55
|
+
) {
|
56
|
+
const presetData = await fetchPresetFromURL(
|
57
|
+
config.preset,
|
58
|
+
);
|
59
|
+
setPresetData(presetData);
|
60
|
+
} else {
|
61
|
+
const embeddedPreset = getEmbeddedPreset(config.preset);
|
62
|
+
setPresetData(embeddedPreset);
|
63
|
+
}
|
64
|
+
} else {
|
65
|
+
setPresetData(minimumPreset);
|
66
|
+
}
|
67
|
+
} catch (error) {
|
68
|
+
console.error('Error loading preset:', error);
|
69
|
+
// Handle error or set to a default value
|
70
|
+
setPresetData(minimumPreset);
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
const updatePlot = async () => {
|
75
|
+
try {
|
76
|
+
let parsedAPI = parsedData;
|
77
|
+
|
78
|
+
if (parser) {
|
79
|
+
// fetch data from api
|
80
|
+
fetched_data = await _fetch_data(
|
81
|
+
parser,
|
82
|
+
parsedData,
|
83
|
+
sharedData,
|
84
|
+
);
|
85
|
+
parsedAPI = _process_fetched_data(
|
86
|
+
fetched_data,
|
87
|
+
parser,
|
88
|
+
parsedData,
|
89
|
+
);
|
90
|
+
}
|
91
|
+
|
92
|
+
combinedOptions = _.merge(parsedAPI, config.overrides);
|
93
|
+
|
94
|
+
if (advanced?.hilbert)
|
95
|
+
combinedOptions.series = downsampleSeries(
|
96
|
+
combinedOptions.series,
|
97
|
+
advanced.hilbert,
|
98
|
+
);
|
99
|
+
|
100
|
+
console.log('Final Options:', combinedOptions);
|
101
|
+
setOptions(combinedOptions);
|
102
|
+
|
103
|
+
setLoading((prev) => ({
|
104
|
+
...prev,
|
105
|
+
active: false,
|
106
|
+
message: null,
|
107
|
+
}));
|
108
|
+
} catch (error) {
|
109
|
+
setLoading((prev) => ({
|
110
|
+
...prev,
|
111
|
+
active: true,
|
112
|
+
message: error.message,
|
113
|
+
}));
|
114
|
+
}
|
115
|
+
};
|
116
|
+
|
117
|
+
loadPreset();
|
118
|
+
|
119
|
+
updatePlot();
|
120
|
+
|
121
|
+
if (!_.isEqual(sharedData, previousSharedDataRef.current))
|
122
|
+
previousSharedDataRef.current = sharedData;
|
123
|
+
}, [config, parser, advanced, presetData, sharedData]);
|
124
|
+
|
125
|
+
return (
|
126
|
+
<div
|
127
|
+
id={props.id}
|
128
|
+
style={{ ...style, position: 'relative' }}>
|
129
|
+
{loading.active && (
|
130
|
+
<Loading
|
131
|
+
message={loading.message}
|
132
|
+
style={loading.style}
|
133
|
+
/>
|
134
|
+
)}
|
135
|
+
<ErrorBoundary>
|
136
|
+
<ReCharts
|
137
|
+
options={Options}
|
138
|
+
style={{
|
139
|
+
opacity: loading.active ? 0 : 1,
|
140
|
+
width,
|
141
|
+
height,
|
142
|
+
..._style,
|
143
|
+
}}
|
144
|
+
onEvents={onEvents}
|
145
|
+
ref={chartRef}
|
146
|
+
/>
|
147
|
+
</ErrorBoundary>
|
148
|
+
</div>
|
149
|
+
);
|
150
|
+
};
|
151
|
+
|
152
|
+
export default EChartSwitcher;
|
@@ -1,24 +1,24 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2024-01-14 14:54:27
|
4
|
-
* @FilePath : /visualifyjs/src/core/modules/replotly/presetHandler.js
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
|
9
|
-
import minimumPreset from './presets/minimum';
|
10
|
-
import mmtrbc_violin from './presets/mmtrbc.violin';
|
11
|
-
import mmtrbc_dot from './presets/mmtrbc.dot';
|
12
|
-
|
13
|
-
// Example embedded presets
|
14
|
-
const embeddedPresets = {
|
15
|
-
mmtrbc_violin,
|
16
|
-
mmtrbc_dot,
|
17
|
-
// 'presetName': { ...preset data... }
|
18
|
-
// Define embedded presets here
|
19
|
-
};
|
20
|
-
|
21
|
-
export const getPreset = (presetKey) => {
|
22
|
-
// Return minimumPreset if preset not found
|
23
|
-
return embeddedPresets[presetKey] || minimumPreset;
|
24
|
-
};
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2024-01-14 14:54:27
|
4
|
+
* @FilePath : /visualifyjs/src/core/modules/replotly/presetHandler.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
|
9
|
+
import minimumPreset from './presets/minimum';
|
10
|
+
import mmtrbc_violin from './presets/mmtrbc.violin';
|
11
|
+
import mmtrbc_dot from './presets/mmtrbc.dot';
|
12
|
+
|
13
|
+
// Example embedded presets
|
14
|
+
const embeddedPresets = {
|
15
|
+
mmtrbc_violin,
|
16
|
+
mmtrbc_dot,
|
17
|
+
// 'presetName': { ...preset data... }
|
18
|
+
// Define embedded presets here
|
19
|
+
};
|
20
|
+
|
21
|
+
export const getPreset = (presetKey) => {
|
22
|
+
// Return minimumPreset if preset not found
|
23
|
+
return embeddedPresets[presetKey] || minimumPreset;
|
24
|
+
};
|
@@ -1,18 +1,18 @@
|
|
1
|
-
/*
|
2
|
-
* @Author : Lihao leolihao@arizona.edu
|
3
|
-
* @Date : 2024-01-14 14:55:51
|
4
|
-
* @FilePath : /visualifyjs/src/core/modules/replotly/presets/minimum.js
|
5
|
-
* @Description :
|
6
|
-
* Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
-
*/
|
8
|
-
const minimumPreset = {
|
9
|
-
data: [],
|
10
|
-
config: {},
|
11
|
-
layout: {
|
12
|
-
title: 'Minimum Preset of RePlotly',
|
13
|
-
chartWidth: 800,
|
14
|
-
chartHeight: 400,
|
15
|
-
},
|
16
|
-
};
|
17
|
-
|
18
|
-
export default minimumPreset;
|
1
|
+
/*
|
2
|
+
* @Author : Lihao leolihao@arizona.edu
|
3
|
+
* @Date : 2024-01-14 14:55:51
|
4
|
+
* @FilePath : /visualifyjs/src/core/modules/replotly/presets/minimum.js
|
5
|
+
* @Description :
|
6
|
+
* Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
|
7
|
+
*/
|
8
|
+
const minimumPreset = {
|
9
|
+
data: [],
|
10
|
+
config: {},
|
11
|
+
layout: {
|
12
|
+
title: 'Minimum Preset of RePlotly',
|
13
|
+
chartWidth: 800,
|
14
|
+
chartHeight: 400,
|
15
|
+
},
|
16
|
+
};
|
17
|
+
|
18
|
+
export default minimumPreset;
|