Skip to content

Commit e0201d0

Browse files
authored
Merge pull request #1751 from merico-dev/1750-infinite-re-rendering-of-charts
1750 infinite re rendering of charts
2 parents e64e686 + 17d12d3 commit e0201d0

File tree

15 files changed

+50
-41
lines changed

15 files changed

+50
-41
lines changed

api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devtable/api",
3-
"version": "14.50.5",
3+
"version": "14.50.6",
44
"description": "",
55
"main": "index.js",
66
"scripts": {

dashboard/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@devtable/dashboard",
3-
"version": "14.50.5",
3+
"version": "14.50.6",
44
"license": "Apache-2.0",
55
"publishConfig": {
66
"access": "public",

dashboard/src/components/panel/panel-editor/dropdown-menu-items/dropdown-menu-items.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type Props = {
99
};
1010

1111
export const PanelDropdownMenuItems = observer(({ view }: Props) => {
12-
const { echartsOptions, panel } = useRenderPanelContext();
12+
const { getEchartsOptions, panel } = useRenderPanelContext();
1313
const items = useItems(view);
14-
return items.map((item) => item.render({ echartsOptions, inEditMode: true, panelID: panel.id, viewID: view.id }));
14+
return items.map((item) => item.render({ getEchartsOptions, inEditMode: true, panelID: panel.id, viewID: view.id }));
1515
});

dashboard/src/components/panel/panel-editor/dropdown-menu-items/use-items.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,56 +32,56 @@ export const useItems = (view: ViewMetaInstance) => {
3232
const ret: PanelMenuItem[] = [
3333
{
3434
order: 10,
35-
render: () => <Refresh />,
35+
render: () => <Refresh key="refresh" />,
3636
},
3737
{
3838
order: 100,
39-
render: () => <DownloadData />,
39+
render: () => <DownloadData key="download-data" />,
4040
},
4141
{
4242
order: 200,
43-
render: () => <DownloadSchema />,
43+
render: () => <DownloadSchema key="download-schema" />,
4444
},
4545
{
4646
order: 300,
47-
render: () => <DownloadScreenshot />,
47+
render: () => <DownloadScreenshot key="download-screenshot" />,
4848
},
4949
{
5050
order: 400,
51-
render: () => <EnterFullScreen view={view} />,
51+
render: () => <EnterFullScreen key="enter-full-screen" view={view} />,
5252
},
5353
...queryItems,
5454
{
5555
order: 600,
56-
render: () => <Divider label={t('common.actions.edit')} labelPosition="center" />,
56+
render: () => <Divider key="edit-divider" label={t('common.actions.edit')} labelPosition="center" />,
5757
},
5858
{
5959
order: 700,
60-
render: () => <OpenTabPanel panelID={panelID} viewID={viewID} />,
60+
render: () => <OpenTabPanel key="open-tab-panel" panelID={panelID} viewID={viewID} />,
6161
},
6262
{
6363
order: 800,
64-
render: () => <OpenTabVariable panelID={panelID} viewID={viewID} />,
64+
render: () => <OpenTabVariable key="open-tab-variable" panelID={panelID} viewID={viewID} />,
6565
},
6666
{
6767
order: 900,
68-
render: () => <OpenTabVisualization panelID={panelID} viewID={viewID} />,
68+
render: () => <OpenTabVisualization key="open-tab-visualization" panelID={panelID} viewID={viewID} />,
6969
},
7070
{
7171
order: 1000,
72-
render: () => <OpenTabInteraction panelID={panelID} viewID={viewID} />,
72+
render: () => <OpenTabInteraction key="open-tab-interaction" panelID={panelID} viewID={viewID} />,
7373
},
7474
{
7575
order: 1100,
76-
render: () => <Divider label={t('common.actions.actions')} labelPosition="center" />,
76+
render: () => <Divider key="actions-divider" label={t('common.actions.actions')} labelPosition="center" />,
7777
},
7878
{
7979
order: 1200,
80-
render: () => <Duplicate panelID={panelID} viewID={viewID} />,
80+
render: () => <Duplicate key="duplicate" panelID={panelID} viewID={viewID} />,
8181
},
8282
{
8383
order: 1300,
84-
render: () => <DeletePanel panelID={panelID} viewID={viewID} />,
84+
render: () => <DeletePanel key="delete-panel" panelID={panelID} viewID={viewID} />,
8585
},
8686

8787
...additionalItems,

dashboard/src/components/panel/panel-render/dropdown-menu-items/dropdown-menu-items.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type Props = {
99
};
1010

1111
export const PanelDropdownMenuItems = observer(({ view }: Props) => {
12-
const { echartsOptions, panel } = useRenderPanelContext();
12+
const { getEchartsOptions, panel } = useRenderPanelContext();
1313
const items = useItems(view);
14-
return items.map((item) => item.render({ echartsOptions, inEditMode: false, panelID: panel.id, viewID: view.id }));
14+
return items.map((item) => item.render({ getEchartsOptions, inEditMode: false, panelID: panel.id, viewID: view.id }));
1515
});

dashboard/src/components/panel/panel-render/dropdown-menu-items/use-items.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ export const useItems = (view: ViewMetaInstance) => {
1414
const ret: PanelMenuItem[] = [
1515
{
1616
order: 10,
17-
render: () => <Refresh />,
17+
render: () => <Refresh key="refresh" />,
1818
},
1919
{
2020
order: 100,
21-
render: () => <DownloadData />,
21+
render: () => <DownloadData key="download-data" />,
2222
},
2323
{
2424
order: 300,
25-
render: () => <DownloadScreenshot />,
25+
render: () => <DownloadScreenshot key="download-screenshot" />,
2626
},
2727
{
2828
order: 400,
29-
render: () => <EnterFullScreen view={view} />,
29+
render: () => <EnterFullScreen key="enter-full-screen" view={view} />,
3030
},
3131
...additionalItems,
3232
];

dashboard/src/components/panel/panel-render/panel-render-base.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Box } from '@mantine/core';
22
import { EmotionSx } from '@mantine/emotion';
33
import { EChartsOption } from 'echarts';
44
import { observer } from 'mobx-react-lite';
5-
import React, { ReactNode, useContext, useEffect, useState } from 'react';
5+
import React, { ReactNode, useCallback, useContext, useEffect, useRef, useState } from 'react';
66
import { usePanelVizFeatures } from '~/components/panel/panel-render/panel-viz-features';
77
import { PanelAddonProvider } from '~/components/plugins/panel-addon';
88
import { PanelContextProvider } from '~/contexts/panel-context';
@@ -17,14 +17,18 @@ import { doesVizRequiresData } from '../utils';
1717
import { PanelDropdownMenu } from './panel-dropdown-menu';
1818

1919
function useUpdateEchartsOptions(vizType: string) {
20-
const [echartsOptions, setEchartsOptions] = useState<EChartsOption | null>(null);
20+
const ref = useRef<EChartsOption | null>(null);
21+
const setEchartsOptions = useCallback((options: EChartsOption | null) => {
22+
ref.current = options;
23+
}, []);
24+
2125
useEffect(() => {
22-
setEchartsOptions(null);
26+
ref.current = null;
2327
}, [vizType]);
2428

2529
return {
26-
echartsOptions,
27-
setEchartsOptions,
30+
getEchartsOptions: () => ref.current,
31+
setEchartsOptions: setEchartsOptions,
2832
};
2933
}
3034

@@ -40,7 +44,7 @@ export const PanelRenderBase = observer(({ panel, panelStyle, dropdownContent }:
4044
const { ref, downloadPanelScreenshot } = useDownloadPanelScreenshot(panel);
4145
const { withAddon, withPanelTitle } = usePanelVizFeatures();
4246
const OptionalAddon = withAddon ? PanelAddonProvider : React.Fragment;
43-
const { echartsOptions, setEchartsOptions } = useUpdateEchartsOptions(panel.viz.type);
47+
const { getEchartsOptions, setEchartsOptions } = useUpdateEchartsOptions(panel.viz.type);
4448
const { inEditMode } = useContext(LayoutStateContext);
4549
const showDropdownMenu = inEditMode || doesVizRequiresData(panel.viz.type);
4650

@@ -52,12 +56,13 @@ export const PanelRenderBase = observer(({ panel, panelStyle, dropdownContent }:
5256
loading: panel.dataLoading,
5357
errors: panel.queryErrors,
5458
downloadPanelScreenshot,
55-
echartsOptions,
59+
getEchartsOptions,
5660
setEchartsOptions,
5761
}}
5862
>
5963
<Box
6064
id={panel.id}
65+
data-testid="panel-root"
6166
className={`panel-root ${panel.title.show ? 'panel-root--show-title' : ''}`}
6267
ref={ref}
6368
p={0}

dashboard/src/components/panel/panel-render/title-bar/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const PanelTitleBar = observer(function _PanelTitleBar() {
1010
return null;
1111
}
1212
return (
13-
<Group grow justify="center" className="panel-title-wrapper" sx={{ flexGrow: 1 }}>
13+
<Group data-testid="panel-title-bar" grow justify="center" className="panel-title-wrapper" sx={{ flexGrow: 1 }}>
1414
<Text size="sm" ta="center" lineClamp={1} className="panel-title-text">
1515
{name}
1616
</Text>

dashboard/src/contexts/panel-context.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ const PanelContext = React.createContext<{
99
loading: boolean;
1010
errors: string[];
1111
downloadPanelScreenshot: () => void;
12-
echartsOptions: EChartsOption | null;
12+
getEchartsOptions: () => EChartsOption | null;
1313
setEchartsOptions: (v: EChartsOption | null) => void;
1414
}>({
1515
panel: null,
1616
data: {},
1717
loading: false,
1818
errors: [],
1919
downloadPanelScreenshot: () => {},
20-
echartsOptions: null,
20+
getEchartsOptions: () => null,
2121
setEchartsOptions: () => {},
2222
});
2323

@@ -34,7 +34,7 @@ function usePanelContext<T = PanelRenderModelInstance>() {
3434
loading: boolean;
3535
errors: string[];
3636
downloadPanelScreenshot: () => {};
37-
echartsOptions: null;
37+
getEchartsOptions: () => EChartsOption | null;
3838
setEchartsOptions: (v: EChartsOption | null) => {};
3939
};
4040
}

dashboard/src/dashboard-editor/ui/settings/content/edit-panel/panel-editor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export const PanelEditor = observer(({ panel }: { panel: PanelModelInstance }) =
126126
loading,
127127
errors: panel.queryErrors,
128128
downloadPanelScreenshot: () => {},
129-
echartsOptions: null,
129+
getEchartsOptions: () => null,
130130
setEchartsOptions: () => {},
131131
}}
132132
>

0 commit comments

Comments
 (0)