@iotready/nextjs-components-library 1.0.0-preview6 → 1.0.0-preview8
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.
- package/components/charts/TrendChart.js +21 -10
- package/package.json +1 -1
@@ -23,7 +23,7 @@ import MuiTooltip from '@mui/material/Tooltip';
|
|
23
23
|
const lineOptions = {
|
24
24
|
parsing: false,
|
25
25
|
normalized: true,
|
26
|
-
spanGaps:
|
26
|
+
spanGaps: true, // enable for all datasets
|
27
27
|
// showLine: false, // disable for all datasets
|
28
28
|
animation: false,
|
29
29
|
responsive: true,
|
@@ -121,7 +121,7 @@ const chartConfigByPeriod = {
|
|
121
121
|
scaleUnit: 'year',
|
122
122
|
}
|
123
123
|
};
|
124
|
-
function
|
124
|
+
function getChartPoints(data) {
|
125
125
|
const points = data.results[0].series[0].values.map((row) => {
|
126
126
|
return {
|
127
127
|
x: moment.unix(row[0]),
|
@@ -198,7 +198,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
198
198
|
const [loadingButton, setLoadingButton] = useState(false);
|
199
199
|
const csvLinkRef = useRef(null);
|
200
200
|
const [csvData, setCsvData] = useState('');
|
201
|
-
const [spanGapsOption, setSpanGapsOption] = useState(
|
201
|
+
const [spanGapsOption, setSpanGapsOption] = useState(true);
|
202
202
|
const [options, setOptions] = useState({
|
203
203
|
...lineOptions,
|
204
204
|
plugins: {
|
@@ -222,6 +222,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
222
222
|
}
|
223
223
|
});
|
224
224
|
const [zoomed, setZoomed] = useState(false);
|
225
|
+
const prevMeasures = useRef();
|
225
226
|
const resetChart = () => {
|
226
227
|
setOptions({
|
227
228
|
...options,
|
@@ -245,6 +246,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
245
246
|
setSpanGapsOption(spanG);
|
246
247
|
};
|
247
248
|
const handleChange = (event, newPeriod) => {
|
249
|
+
setChartLoading(true);
|
248
250
|
setZoomed(false);
|
249
251
|
setDatePickerUsed(false);
|
250
252
|
setCsvData('');
|
@@ -277,14 +279,13 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
277
279
|
}
|
278
280
|
}, [csvData]);
|
279
281
|
const loadDatasets = async (chartPeriod) => {
|
280
|
-
setChartLoading(true);
|
281
282
|
let intervalInSeconds = chartPeriod === "ALL" && !datePickerUsed && !zoomed ? 31536000 : timeEnd - timeStart;
|
282
283
|
const rawQuery = intervalInSeconds < 86400; //
|
283
284
|
// Inizializza un array di promesse per ottenere i dati per ciascuna misura
|
284
285
|
const datasetsPromises = measures.map(async (measure) => {
|
285
286
|
const polltime = getPollTime(intervalInSeconds, measure.polltime || 30);
|
286
287
|
const influxData = await handleGetInfluxData(measure.name, timeStart, timeEnd, deviceId, polltime, !measure.polltime && rawQuery);
|
287
|
-
const points =
|
288
|
+
const points = getChartPoints(influxData);
|
288
289
|
return {
|
289
290
|
label: measure.name,
|
290
291
|
data: points,
|
@@ -368,10 +369,17 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
368
369
|
newChartPeriod = '1Y'; // Set to 1 year
|
369
370
|
}
|
370
371
|
setChartPeriodConfig(chartConfigByPeriod[newChartPeriod]);
|
372
|
+
// check prev measures value in order to show the loader
|
373
|
+
// hide the loader if measure is the same (for interval get measure value)
|
374
|
+
const prevMeasuresValue = prevMeasures.current;
|
375
|
+
prevMeasures.current = measures;
|
376
|
+
if (!prevMeasuresValue || prevMeasuresValue.length !== measures.length || (prevMeasuresValue[0] && prevMeasuresValue[0].name !== measures[0].name)) {
|
377
|
+
setChartLoading(true);
|
378
|
+
}
|
371
379
|
loadDatasets(chartPeriod).then(() => {
|
372
380
|
setChartLoading(false);
|
373
381
|
});
|
374
|
-
}, [timeEnd, timeStart]);
|
382
|
+
}, [measures, timeEnd, timeStart]);
|
375
383
|
useEffect(() => {
|
376
384
|
const loadZoomPlugin = async () => {
|
377
385
|
const zoomPlugin = (await import('chartjs-plugin-zoom')).default;
|
@@ -401,6 +409,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
401
409
|
resetChart();
|
402
410
|
}, []);
|
403
411
|
const datePicker = _jsx(Box, { sx: { display: 'flex', alignItems: 'center', mr: { xs: 0, lg: 2 } }, children: _jsxs(LocalizationProvider, { dateAdapter: AdapterMoment, adapterLocale: "it", children: [_jsx(DateTimePicker, { value: moment(timeStartPicker * 1000), onChange: (newValue) => {
|
412
|
+
setChartLoading(true);
|
404
413
|
setDatePickerUsed(true);
|
405
414
|
setZoomed(false);
|
406
415
|
setPickerTimeStart(moment(newValue).unix());
|
@@ -408,6 +417,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
408
417
|
}, maxDateTime: moment(timeEnd * 1000), slotProps: {
|
409
418
|
textField: { size: 'small', sx: { width: { sm: 210 } } }
|
410
419
|
} }), " \u00A0\u00A0 ", _jsx(Box, { children: "\u2013" }), " \u00A0\u00A0", _jsx(DateTimePicker, { value: moment(timeEnd * 1000), onChange: (newValue) => {
|
420
|
+
setChartLoading(true);
|
411
421
|
setDatePickerUsed(true);
|
412
422
|
setZoomed(false);
|
413
423
|
setPickerTimeEnd(moment(newValue).unix());
|
@@ -420,6 +430,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
420
430
|
, {
|
421
431
|
//@ts-ignore
|
422
432
|
ref: csvLinkRef, data: csvData, filename: `export_${moment().toISOString()}.csv`, separator: ';' })] })), zoomed && (_jsxs(Button, { sx: { minWidth: '40px !important', boxShadow: 1, px: 1 }, variant: "contained", color: "secondary", size: 'small', onClick: () => {
|
433
|
+
setChartLoading(true);
|
423
434
|
setZoomed(false);
|
424
435
|
if (chartPeriod === "ALL") {
|
425
436
|
setDatePickerUsed(false);
|
@@ -443,10 +454,10 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
443
454
|
}, children: [_jsx(ZoomOut, { fontSize: 'small' }), _jsx(Box, { sx: { display: { xs: 'none', lg: 'block' }, ml: { md: 1 } }, children: "Reset" })] }))] }), _jsxs(Box, { sx: { display: 'flex', justifyContent: 'flex-end' }, children: [enableDatePicker && _jsx(Box, { sx: { display: { xs: 'none', lg: 'flex' } }, children: datePicker }), _jsxs(ToggleButtonGroup, { color: "primary", value: !datePickerUsed && !zoomed ? chartPeriod : null, exclusive: true, onChange: handleChange, size: "small",
|
444
455
|
// sx={{ boxShadow: 1 }}
|
445
456
|
disabled: chartLoading, children: [_jsx(ToggleButton, { value: "1D", sx: { px: 1 }, children: "1d" }), _jsx(ToggleButton, { value: "1W", sx: { px: 1 }, children: "1w" }), _jsx(ToggleButton, { value: "1M", sx: { px: 1 }, children: "1M" }), _jsx(ToggleButton, { value: "3M", sx: { px: 1 }, children: "3M" }), _jsx(ToggleButton, { value: "6M", sx: { px: 1 }, children: "6M" }), _jsx(ToggleButton, { value: "1Y", sx: { px: 1 }, children: "1Y" }), _jsx(ToggleButton, { value: "ALL", sx: { px: 1 }, children: "ALL" })] }), _jsx(MuiTooltip, { placement: "top", arrow: true, title: "Connect point values", children: _jsx(ToggleButton, { value: "check", color: "primary", size: "small", selected: spanGapsOption, disabled: chartLoading, onChange: () => handleSpanGaps(!spanGapsOption), sx: { ml: 2 }, children: _jsx(TimelineIcon, {}) }) })] })] }), _jsx(Box, { component: 'div', className: "chart-container", sx: { height: { xs: enableDatePicker && props.height ? `calc(${props.height} - 50px)` : props.height, lg: props.height }, minHeight: 300, mt: 2 }, children: chartJsLoaded && !chartLoading && typeof window !== 'undefined' ?
|
446
|
-
_jsx(_Fragment, { children: dataMeasures && dataMeasures[0]
|
457
|
+
_jsx(_Fragment, { children: dataMeasures && (dataMeasures.length > 1 || (dataMeasures.length === 1 && dataMeasures[0].data?.length)) ?
|
447
458
|
(_jsx(Line, { options: options, data: {
|
448
|
-
datasets: dataMeasures || [{ data: [] }]
|
449
|
-
|
459
|
+
// datasets: dataMeasures || [{ data: [] }]
|
460
|
+
datasets: dataMeasures.map(d => ({ ...d, showLine: spanGapsOption || !d.change })) || [{ data: [] }]
|
450
461
|
} })) : _jsxs(Box, { sx: {
|
451
462
|
display: 'flex',
|
452
463
|
flexDirection: 'column',
|
@@ -460,7 +471,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
460
471
|
alignItems: 'center',
|
461
472
|
justifyContent: 'center',
|
462
473
|
textAlign: 'center',
|
463
|
-
height: '100%'
|
474
|
+
height: 'calc(100% - 50px)'
|
464
475
|
}, children: _jsx(CircularProgress, {}) })) })] }));
|
465
476
|
};
|
466
477
|
export default TrendChart;
|