import { fillArray } from '../utils/helpers'; import { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH, SERIES_LABEL_SPACE_RATIO } from '../utils/constants'; export function dataPrep(data, type) { data.labels = data.labels || []; let datasetLength = data.labels.length; // Datasets let datasets = data.datasets; let zeroArray = new Array(datasetLength).fill(0); if(!datasets) { // default datasets = [{ values: zeroArray }]; } datasets.map(d=> { // Set values if(!d.values) { d.values = zeroArray; } else { // Check for non values let vals = d.values; vals = vals.map(val => (!isNaN(val) ? val : 0)); // Trim or extend if(vals.length > datasetLength) { vals = vals.slice(0, datasetLength); } else { vals = fillArray(vals, datasetLength - vals.length, 0); } d.values = vals; } // Set type if(!d.chartType ) { if(!AXIS_DATASET_CHART_TYPES.includes(type)) type = DEFAULT_AXIS_CHART_TYPE; d.chartType = type; } }); // Markers // Regions // data.yRegions = data.yRegions || []; if(data.yRegions) { data.yRegions.map(d => { if(d.end < d.start) { [d.start, d.end] = [d.end, d.start]; } }); } return data; } export function zeroDataPrep(realData) { let datasetLength = realData.labels.length; let zeroArray = new Array(datasetLength).fill(0); let zeroData = { labels: realData.labels.slice(0, -1), datasets: realData.datasets.map(d => { return { name: '', values: zeroArray.slice(0, -1), chartType: d.chartType }; }), }; if(realData.yMarkers) { zeroData.yMarkers = [ { value: 0, label: '' } ]; } if(realData.yRegions) { zeroData.yRegions = [ { start: 0, end: 0, label: '' } ]; } return zeroData; } export function getShortenedLabels(chartWidth, labels=[], isSeries=true) { let allowedSpace = (chartWidth / labels.length) * SERIES_LABEL_SPACE_RATIO; if(allowedSpace <= 0) allowedSpace = 1; let allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; let seriesMultiple; if(isSeries) { // Find the maximum label length for spacing calculations let maxLabelLength = Math.max(...labels.map(label => label.length)); seriesMultiple = Math.ceil(maxLabelLength/allowedLetters); } let calcLabels = labels.map((label, i) => { label += ""; if(label.length > allowedLetters) { if(!isSeries) { if(allowedLetters-3 > 0) { label = label.slice(0, allowedLetters-3) + " ..."; } else { label = label.slice(0, allowedLetters) + '..'; } } else { if(i % seriesMultiple !== 0 && i !== (labels.length - 1)) { label = ""; } } } return label; }); return calcLabels; }