UNPKG

tiler-contrib-line-chart-tile

Version:
201 lines (173 loc) 5.69 kB
'use strict'; var React = require('react'); var LineChart = require("react-chartjs").Line; module.exports = React.createClass({ render: function() { var self = this; var styles = { container: { color: '#ffffff', backgroundColor: '#1e1e1e', height: '100%', boxSizing: 'border-box', paddingLeft: '0.5em', paddingRight: '0.5em', overflowY: 'hidden' }, title: { textAlign: 'center' }, chart: { width: '100%', height: '100%' }, legendList: { listStyleType: 'none', marginLeft: '0.5em', marginRight: '0.5em', padding: 0 } }; var title = (typeof self.props.title === 'undefined') ? undefined : <div key={'title'} style={styles.title}>{self.props.title}</div>; var chart; var metrics = self.props.metrics; if (metrics && metrics.length > 0) { console.log('Creating chart for ', metrics); var labels = []; var datasets = []; metrics.forEach(function(metric) { var dataset = { label: metric.label, data: [] }; metric.points.forEach(function(point) { dataset.data.push({ label: point.time, value: point.value, datasetLabel: dataset.label }); if (labels.indexOf(point.time) == -1) { labels.push(point.time); } }); datasets.push(dataset); }); labels.sort(); var colors = [ 'a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a', 'ffff99', 'b15928' ]; colors = colors.map(function(color) { var rgb = parseInt(color.slice(0, 2), 16) + ',' + parseInt(color.slice(2, 4), 16) + ',' + parseInt(color.slice(4, 6), 16); return { strokeColor: 'rgba(' + rgb + ',0.8)', fillColor: 'rgba(' + rgb + ',0)', legendColor: 'rgba(' + rgb + ',0.8)' } }); datasets.forEach(function(dataset, datasetIndex) { var sortedData = []; labels.forEach(function(label, labelIndex) { sortedData[labelIndex] = null; }); dataset.data.forEach(function(dataItem) { sortedData[labels.indexOf(dataItem.label)] = dataItem.value; }); dataset.data = sortedData; var colorIndex = datasetIndex % colors.length; dataset.strokeColor = colors[colorIndex].strokeColor; dataset.pointColor = colors[colorIndex].strokeColor; dataset.pointStrokeColor = "#000"; dataset.pointHighlightFill = "#000"; dataset.pointHighlightStroke = colors[colorIndex].strokeColor; dataset.fillColor = colors[colorIndex].fillColor; }); var lastDateLabel = ''; labels = labels.map(function(timestamp) { var date = new Date(timestamp / 1000); var dateLabel = ('0000' + date.getFullYear()).slice(-4) + '-' + ('00' + (date.getMonth() + 1)).slice(-2) + '-' + ('00' + date.getDate()).slice(-2); var label = ''; if (dateLabel != lastDateLabel) { label += dateLabel; } var hasMilliseconds = date.getMilliseconds() > 0; var hasSecondsOrMilliseconds = date.getSeconds() > 0 || hasMilliseconds; var hasHoursOrMinutesOrSecondsOrMilliseconds = date.getHours() > 0 || date.getMinutes() > 0 || hasSecondsOrMilliseconds; if (hasHoursOrMinutesOrSecondsOrMilliseconds) { label += (label.length > 0 ? ' ' : '') + ('00' + date.getHours()).slice(-2) + ':' + ('00' + date.getMinutes()).slice(-2); if (hasSecondsOrMilliseconds) { label += ':' + ('00' + date.getSeconds()).slice(-2); if (hasMilliseconds) { label += '.' + ('000' + date.getMilliseconds()).slice(-3); } } } lastDateLabel = dateLabel; return label; }); var chartOptions = { pointDotRadius: 4, pointHitDetectionRadius: 5, multiTooltipTemplate: '<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>', animation: false, responsive: true }; var chartData = { labels: labels, datasets: datasets }; console.log('chartData', chartData); var legend = datasets.map(function(dataset, datasetIndex) { var colorIndex = datasetIndex % colors.length; var legendItemStyles = { listItem: { display: 'inline-block', marginRight: '1em' }, bullet: { //display: 'inline-block', font: 'normal normal normal 14px/1 FontAwesome', fontSize: 'inherit', textRendering: 'auto', WebkitFontSmoothing: 'antialiased', MozOsxFontSmoothing: 'grayscale', transform: 'translate(0, 0)', color: colors[colorIndex].legendColor } }; return ( <li key={dataset.label} style={legendItemStyles.listItem}><span style={legendItemStyles.bullet}>&#xf068;</span> <span>{dataset.label}</span></li> ); }); chart = (<div key={'chart'}> <LineChart data={chartData} options={chartOptions} redraw style={styles.chart} /> <ul style={styles.legendList}> {legend} </ul> </div>); } else { chart = undefined; } return ( <div style={styles.container}> {title} {chart} </div> ); } });