I am encountering an issue with saving and restoring the zoom state in the Kendo React Charts component. The problem arises when I attempt to save the zoom level and reapply it whenever the chart data updates. Although the zoom state values are captured correctly, the chart resets to its default zoom level after each zoom interaction.
This is the parent Component:
function Monitor () {
const { chartDataByParameter, treshholdRangeData } = useTable()
const [zoomState, setZoomState] = useState({})
const handleZoomChange = (newZoomState) => {
setZoomState(newZoomState)
}
return
<ChartComponent dataProps={chartDataByParameter} rangeData={treshholdRangeData} zoomState={zoomState} onZoomChange={handleZoomChange} />
}
export default Monitor
And this is the Chart Component. Note that i have two axis because is the only way I found to deal with negative values.
function ChartComponent ({ dataProps, rangeData, zoomState, onZoomChange }) {
const chartRef = useRef(null)
useEffect(() => {
setIsChartLoading(false)
if (chartRef.current && chartRef.current.kendoChart) {
chartRef.current.kendoChart.setOptions({
categoryAxis: {
min: zoomState.xAxis.min,
max: zoomState.xAxis.max
},
valueAxis: {
min: zoomState.valueAxis.min,
max: zoomState.valueAxis.max
}
})
}
}, [dataProps])
const handleZoom = (event) => {
const newZoomState = {
xAxis: {
min: event.axisRanges?.xAxis?.min,
max: event.axisRanges?.xAxis?.max
},
valueAxis: {
min: event.axisRanges?.valueAxis?.min,
max: event.axisRanges?.valueAxis?.max
}
}
onZoomChange(newZoomState)
}
const colors = ['#718ad5', '#424242', '#ffe162', '#4cd180', '#8634b7']
const categoryAxisMaxDivisions = 10
return (
<div style={{ height: '55vh, width: '100%' }}>
{(dataProps && dataProps.length > 0) || (rangeData && rangeData.length > 0)
? (
<Chart
ref={chartRef}
style={{ height: '100%', width: '100%' }}
pannable={true}
zoomable={true}
transitions={false}
className='custom-chart'
onZoom={handleZoom}
>
<ChartLegend position="top" />
<ChartCategoryAxis>
<ChartCategoryAxisItem name="xAxis" maxDivisions={categoryAxisMaxDivisions} visible={false} />
<ChartCategoryAxisItem name="xAxis2" maxDivisions={categoryAxisMaxDivisions} />
</ChartCategoryAxis>
<ChartSeries>
{dataProps.map((item, index) => (
<ChartSeriesItem
key={index}
type="line"
data={item}
field="value"
categoryField="category"
name={item[0].parameter}
style="smooth"
color={item[0].parameter === 'Anomalies' ? '#d75d5d' : colors[index]}
width={item[0].parameter === 'Anomalies' ? 0 : 2}
legendItem={item[0].parameter === 'Anomalies' ? customLegendItem : customLegendItem2}
tooltip={{ visible: true, render: lineTooltipRender }}
/>
))}
{rangeData.length > 0 && (
<ChartSeriesItem
type="rangeArea"
data={rangeData}
fromField="min"
toField="max"
categoryField="Datetime"
name="Anomaly sensitivity"
color='#80cf63'
>
<ChartTooltip render={rangeTooltipRender} />
</ChartSeriesItem>
)}
</ChartSeries>
<ChartValueAxis>
<ChartValueAxisItem
name="valueAxis"
axisCrossingValue={[0, Number.NEGATIVE_INFINITY]}
labels={{ format: (value) => value.toFixed(2) }}
/>
</ChartValueAxis>
</Chart>
)
: (
<div style={{ height: chartHeight, width: '100%' }}></div>
)}
</div>
)
}
}
const MemoizedChartComponent = React.memo(ChartComponent)
export default MemoizedChartComponent
Thank you in advance!
Xavier