@iotready/nextjs-components-library 1.0.0-preview3 → 1.0.0-preview4
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.
@@ -6,7 +6,7 @@ type Measure = {
|
|
6
6
|
polltime: number;
|
7
7
|
unit: string;
|
8
8
|
};
|
9
|
-
declare const TrendChart: ({ deviceId, measures, enableExportData, enableDatePicker, handleGetInfluxData,
|
9
|
+
declare const TrendChart: ({ deviceId, measures, enableExportData, enableDatePicker, handleGetInfluxData, theme, ...props }: {
|
10
10
|
deviceId: string;
|
11
11
|
measures: Array<Measure>;
|
12
12
|
enableenableExportData: boolean;
|
@@ -162,8 +162,11 @@ function getCsvData(data, measures) {
|
|
162
162
|
});
|
163
163
|
});
|
164
164
|
});
|
165
|
-
//
|
166
|
-
Object.
|
165
|
+
// Sort timestamps in ascending order
|
166
|
+
const sortedTimestamps = Object.keys(timestampMap).sort((a, b) => new Date(a).getTime() - new Date(b).getTime());
|
167
|
+
// Create rows from sorted timestampMap
|
168
|
+
sortedTimestamps.forEach(timestamp => {
|
169
|
+
const entry = timestampMap[timestamp];
|
167
170
|
const row = [entry.timestamp];
|
168
171
|
measures.forEach(measure => {
|
169
172
|
// Push the corresponding value or an empty string if undefined
|
@@ -171,7 +174,7 @@ function getCsvData(data, measures) {
|
|
171
174
|
});
|
172
175
|
// Check if the row contains only empty values (besides the timestamp)
|
173
176
|
const hasNonEmptyValues = row.slice(1).some(value => value !== null && value !== '' && value !== undefined);
|
174
|
-
// If the row has at least one non-empty value
|
177
|
+
// If the row has at least one non-empty value, add it to csvData
|
175
178
|
if (hasNonEmptyValues || row.length === 1) {
|
176
179
|
csvData.push(row);
|
177
180
|
}
|
@@ -180,16 +183,18 @@ function getCsvData(data, measures) {
|
|
180
183
|
return csvData.map(row => row.join(',')).join('\n');
|
181
184
|
}
|
182
185
|
// eslint-disable-next-line no-unused-vars
|
183
|
-
const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, handleGetInfluxData,
|
186
|
+
const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, handleGetInfluxData, theme, ...props }) => {
|
184
187
|
const [chartJsLoaded, setChartJsLoaded] = useState(false);
|
185
188
|
const [dataMeasures, setDataMeasures] = useState(null);
|
186
189
|
const [chartPeriod, setChartPeriod] = useState('1D');
|
187
190
|
const [chartPeriodConfig, setChartPeriodConfig] = useState(chartConfigByPeriod['1D']);
|
188
191
|
const [chartLoading, setChartLoading] = useState(false);
|
192
|
+
const [timeStartPicker, setTimeStartPicker] = useState(moment().subtract(1, 'day').unix());
|
189
193
|
const [timeStart, setTimeStart] = useState(moment().subtract(1, 'day').unix());
|
190
194
|
const [timeEnd, setTimeEnd] = useState(moment().unix());
|
191
|
-
const [firstTimestamp, setFirstTimestamp] = useState();
|
192
195
|
const [datePickerUsed, setDatePickerUsed] = useState(false);
|
196
|
+
const [pickerTimeStart, setPickerTimeStart] = useState(moment().subtract(1, 'day').unix());
|
197
|
+
const [pickerTimeEnd, setPickerTimeEnd] = useState(moment().unix());
|
193
198
|
const [loadingButton, setLoadingButton] = useState(false);
|
194
199
|
const csvLinkRef = useRef(null);
|
195
200
|
const [csvData, setCsvData] = useState('');
|
@@ -244,7 +249,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
244
249
|
setDatePickerUsed(false);
|
245
250
|
setCsvData('');
|
246
251
|
if (newPeriod === "ALL") {
|
247
|
-
setTimeStart(
|
252
|
+
setTimeStart(1577854800);
|
248
253
|
setTimeEnd(moment().unix());
|
249
254
|
setChartPeriod(newPeriod);
|
250
255
|
return;
|
@@ -259,10 +264,8 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
259
264
|
};
|
260
265
|
const handleExportData = async () => {
|
261
266
|
setLoadingButton(true);
|
262
|
-
const intervalInSeconds = timeEnd - timeStart;
|
263
267
|
const data = await Promise.all(measures.map(async (measure) => {
|
264
|
-
|
265
|
-
return await handleGetInfluxData(measure.name, timeStart, timeEnd, deviceId, polltime, true);
|
268
|
+
return await handleGetInfluxData(measure.name, timeStart, timeEnd, deviceId, "0s", true);
|
266
269
|
}));
|
267
270
|
const csvData = getCsvData(data, measures);
|
268
271
|
setCsvData(csvData);
|
@@ -278,19 +281,18 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
278
281
|
const intervalInSeconds = timeEnd - timeStart;
|
279
282
|
// Inizializza un array di promesse per ottenere i dati per ciascuna misura
|
280
283
|
const datasetsPromises = measures.map(async (measure) => {
|
281
|
-
const polltime = getPollTime(intervalInSeconds, measure.polltime);
|
282
|
-
const influxData = await handleGetInfluxData(measure.name, timeStart, timeEnd, deviceId, polltime,
|
284
|
+
const polltime = measure.polltime ? getPollTime(intervalInSeconds, measure.polltime) : "0s";
|
285
|
+
const influxData = await handleGetInfluxData(measure.name, timeStart, timeEnd, deviceId, polltime, !!!measure.polltime);
|
283
286
|
const points = GetPoints(influxData);
|
284
287
|
return {
|
285
288
|
label: measure.name,
|
286
289
|
data: points,
|
287
290
|
unit: measure.unit,
|
288
|
-
// borderColor: `hsl(${index * 50}, 70%, 50%)`, // Colore unico per ogni dataset
|
289
291
|
borderWidth: 2,
|
290
292
|
pointRadius: 1,
|
291
293
|
pointHoverRadius: 5,
|
292
294
|
pointHoverBackgroundColor: 'rgba(52, 125, 236, 0.5)',
|
293
|
-
//
|
295
|
+
// showLine: measure.polltime ? true : false, //<- set this
|
294
296
|
fill: false
|
295
297
|
};
|
296
298
|
});
|
@@ -298,15 +300,21 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
298
300
|
const datasets = await Promise.all(datasetsPromises);
|
299
301
|
let min = null;
|
300
302
|
let max = null;
|
301
|
-
let
|
303
|
+
let time;
|
304
|
+
let minTime = null;
|
302
305
|
datasets.forEach(dataset => {
|
303
|
-
values =
|
306
|
+
const values = dataset.data.map((point) => point.y).filter((data) => data !== null);
|
307
|
+
if (chartPeriod === "ALL" && !datePickerUsed && !zoomed && values.length) {
|
308
|
+
time = dataset.data.filter((data) => data.y !== null).map((data) => data.x)[0];
|
309
|
+
}
|
304
310
|
const datasetMin = Math.min(...values);
|
305
311
|
const datasetMax = Math.max(...values);
|
306
312
|
if (min === null || datasetMin < min)
|
307
313
|
min = datasetMin;
|
308
314
|
if (max === null || datasetMax > max)
|
309
315
|
max = datasetMax;
|
316
|
+
if (time && (minTime === null || time.unix() < minTime))
|
317
|
+
minTime = time.unix() - 86400;
|
310
318
|
});
|
311
319
|
let paddedMin = null;
|
312
320
|
let paddedMax = null;
|
@@ -316,6 +324,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
316
324
|
paddedMax = max + diff;
|
317
325
|
}
|
318
326
|
setDataMeasures([...datasets]);
|
327
|
+
setTimeStartPicker(minTime || timeStart);
|
319
328
|
setOptions({
|
320
329
|
...options,
|
321
330
|
scales: {
|
@@ -327,7 +336,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
327
336
|
},
|
328
337
|
x: {
|
329
338
|
...options.scales.x,
|
330
|
-
min: moment.unix(timeStart).toString(),
|
339
|
+
min: moment.unix(minTime || timeStart).toString(),
|
331
340
|
max: moment.unix(timeEnd).toString(),
|
332
341
|
time: {
|
333
342
|
...options.scales.x.time,
|
@@ -337,15 +346,6 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
337
346
|
}
|
338
347
|
});
|
339
348
|
};
|
340
|
-
useEffect(() => {
|
341
|
-
const fetchFirstTimestamp = async () => {
|
342
|
-
const response = await handleGetFirstTimestamp(deviceId);
|
343
|
-
if (response) {
|
344
|
-
setFirstTimestamp(response);
|
345
|
-
}
|
346
|
-
};
|
347
|
-
fetchFirstTimestamp();
|
348
|
-
}, []);
|
349
349
|
useEffect(() => {
|
350
350
|
const timeDifference = Math.abs(moment(timeStart).valueOf() - moment(timeEnd).valueOf()); // Convert milliseconds to seconds
|
351
351
|
let newChartPeriod = '1D'; // Default to 1 day
|
@@ -403,16 +403,18 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
403
403
|
loadZoomPlugin();
|
404
404
|
resetChart();
|
405
405
|
}, []);
|
406
|
-
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(
|
407
|
-
|
408
|
-
|
409
|
-
|
406
|
+
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) => {
|
407
|
+
setDatePickerUsed(true);
|
408
|
+
setZoomed(false);
|
409
|
+
setPickerTimeStart(moment(newValue).unix());
|
410
|
+
setTimeStart(moment(newValue).unix());
|
410
411
|
}, maxDateTime: moment(timeEnd * 1000), slotProps: {
|
411
412
|
textField: { size: 'small', sx: { width: { sm: 210 } } }
|
412
|
-
} }), " \u00A0\u00A0 ", _jsx(Box, { children: "\u2013" }), " \u00A0\u00A0", _jsx(DateTimePicker, { value: moment(timeEnd * 1000),
|
413
|
-
|
414
|
-
|
415
|
-
|
413
|
+
} }), " \u00A0\u00A0 ", _jsx(Box, { children: "\u2013" }), " \u00A0\u00A0", _jsx(DateTimePicker, { value: moment(timeEnd * 1000), onChange: (newValue) => {
|
414
|
+
setDatePickerUsed(true);
|
415
|
+
setZoomed(false);
|
416
|
+
setPickerTimeEnd(moment(newValue).unix());
|
417
|
+
setTimeEnd(moment(newValue).unix());
|
416
418
|
}, minDateTime: moment(timeStart * 1000), slotProps: {
|
417
419
|
textField: { size: 'small', sx: { width: { sm: 210 } } }
|
418
420
|
} })] }) });
|
@@ -421,16 +423,18 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
421
423
|
, {
|
422
424
|
//@ts-ignore
|
423
425
|
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: () => {
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
setZoomed(false);
|
426
|
+
setZoomed(false);
|
427
|
+
if (chartPeriod === "ALL") {
|
428
|
+
setDatePickerUsed(false);
|
429
|
+
setTimeStart(1577854800);
|
429
430
|
setTimeEnd(moment().unix());
|
430
|
-
|
431
|
+
}
|
432
|
+
else if (datePickerUsed) {
|
433
|
+
setTimeStart(pickerTimeStart);
|
434
|
+
setTimeEnd(pickerTimeEnd);
|
431
435
|
}
|
432
436
|
else {
|
433
|
-
|
437
|
+
setDatePickerUsed(false);
|
434
438
|
setChartPeriodConfig(chartConfigByPeriod[chartPeriod]);
|
435
439
|
setTimeStart(chartPeriodConfig.from?.days
|
436
440
|
? moment()
|
@@ -439,7 +443,7 @@ const TrendChart = ({ deviceId, measures, enableExportData, enableDatePicker, ha
|
|
439
443
|
: moment().subtract(1, 'day').unix());
|
440
444
|
setTimeEnd(moment().unix());
|
441
445
|
}
|
442
|
-
}, children: [_jsx(ZoomOut, { fontSize: 'small' }), _jsx(Box, { sx: { display: { xs: 'none',
|
446
|
+
}, 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",
|
443
447
|
// sx={{ boxShadow: 1 }}
|
444
448
|
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' ?
|
445
449
|
_jsx(_Fragment, { children: dataMeasures && dataMeasures[0]?.data?.length ?
|