$('.jsDivSalaryChart').each(function () { new SalaryBarChart({ SalaryChart: $(this) }); }); function SalaryBarChart(pSettings) { var settings = { SalaryChart: '.jsDivSalaryChart' // Overwritten }, options = {}, data = { labels: [], datasets: [{ type: 'bar', backgroundColor: [], data: [] }] }, config = { type: 'bar', data: {}, options: { responsive: false, maintainAspectRatio: false, legend: { display: false }, title: { display: false, }, layout: { padding: { bottom: 20 } }, scales: { xAxes: [{ barThickness: 20, gridLines: { display: false }, ticks: { maxRotation: 0, callback: function (value, index, values) { return !index || index == values.length - 1 ? ['R$ ' + (!index ? minVal : maxVal), !index ? 'Mínimo' : 'Máximo'] : ''; } } }], yAxes: [{ display: false }] }, tooltips: { backgroundColor: 'rgba(0,0,0, 1)', titleFontColor: '#fff', displayColors: false, callbacks: { title: function (tooltipItem, data) { if (!data) return ''; return 'R$ ' + Number(data.labels[tooltipItem[0].index]).toLocaleString() + ' mensuales'; }, label: function (tooltipItem, data) { return data.datasets[0].data[tooltipItem.index] + ' funcionarios'; } } } } }, aColors = [], minVal = 0, maxVal = 0; // function init(pSettings) { options = $.extend(settings, pSettings || {}); var _$SalaryChart = $(options.SalaryChart), _graphData = _$SalaryChart.data('y-axis'); if (_graphData) { if (typeof window.orientation !== 'undefined') { // Mobile device _$SalaryChart.on('click', function (e) { e.preventDefault(); }); config.options.events = ['click']; } _graphData = _graphData.split(',').map(function (el) { return Number(el) }); data.labels = _$SalaryChart.data('x-axis').split(',').map(function (el) { return [el] }); // get rid of leading and trailing zero elements ---------------- [Start] ------------------ var _firstIdx = _graphData.findIndex(function (e) { return e; }), _lastIdx = _graphData.length - _graphData.slice(0).reverse().findIndex(function (e) { return e; }), _finalArray = []; //console.log(_firstIdx, _lastIdx, _graphData, _graphData.slice(_firstIdx, _lastIdx)); // Assuming at least one non zero value _graphData = _graphData.slice(_firstIdx, _lastIdx); data.datasets[0].data = _graphData; data.labels = data.labels.slice(_firstIdx, _lastIdx); minVal = Number(data.labels[0]).toLocaleString(); maxVal = Number(data.labels[data.labels.length - 1]).toLocaleString(); // get rid of leading and trailing zero elements ---------------- [End] ------------------- // bar color ---------------------------------------------------- [Start] ----------------- for (var i = 0; i < 4; i++) aColors[i] = _$SalaryChart.data('q' + (i + 1)); var _max = _graphData.reduce(function (a, b) { return Math.max(a, b); }), _percent; data.datasets[0].backgroundColor = _graphData.map(function (el, i) { _percent = Math.floor(el * 100 / _max); return aColors[Math.ceil(_percent / 25) - 1]; }); // bar color ---------------------------------------------------- [End] ----------------- config.data = data; var ctx = _$SalaryChart.find('canvas')[0].getContext('2d'); ctx.canvas.width = 300; ctx.canvas.height = 80; var _paddingRight = Math.abs(_graphData.length - 10) * 20; config.options.layout.padding.right = _paddingRight; //console.log(_paddingRight); new Chart(ctx, config); } } // init(pSettings); }
<div class="jsDivSalaryChart" data-x-axis="1321,1472,1623,1774,1925,2076,2227,2378,2529,2680" data-y-axis="1,0,1,2,3,7,3,0,2,0" data-q1="#FEE7D8" data-q2="#FCCDAF" data-q3="#FAA771" data-q4="#F88132"> <canvas></canvas> </div> <div class="jsDivSalaryChart" data-x-axis="3453,3476,3499,3522,3545,3568,3591,3614,3637,3660" data-y-axis="0,0,0,0,5,2,0,0,0,0" data-q1="#FEE7D8" data-q2="#FCCDAF" data-q3="#FAA771" data-q4="#F88132"> <canvas></canvas> </div>