ReportsKit.Chart = (function(options) { var self = this; self.initialize = function(options) { self.options = options; self.report = options.report; self.el = self.report.el; self.defaultEmptyStateText = 'No data was found'; self.emptyStateEl = $('
' + self.defaultEmptyStateText + '
').appendTo(self.report.visualizationEl).hide(); self.loadingIndicatorEl = $('
').appendTo(self.report.visualizationEl).hide(); self.canvas = $('').appendTo(self.report.visualizationEl); }; self.render = function() { var path = self.el.data('path'); var separator = path.indexOf('?') === -1 ? '?' : '&'; path += separator + 'properties=' + encodeURIComponent(JSON.stringify(self.report.properties())); self.loadingIndicatorEl.fadeIn(1000); if (self.canvas.is(':visible')) { self.canvas.fadeTo(300, 0.1); } $.getJSON(path, function(response) { var data = response.data; var chartData = data.chart_data; var isEmptyState = chartData.datasets.length === 0 || (chartData.datasets.length === 1 && chartData.datasets[0].data.length === 0); var emptyStateText = (data.report_options && data.report_options.empty_state_text) || self.defaultEmptyStateText; var options = chartData.options; options = self.addAdditionalOptions(options, data.report_options); self.loadingIndicatorEl.stop(true, true).hide(); self.emptyStateEl.html(emptyStateText).toggle(isEmptyState); if (isEmptyState) { self.canvas.hide(); return; } self.canvas.show().fadeTo(300, 1); var args = { type: data.type, data: chartData, options: options }; if (self.chart) { self.chart.data.datasets = chartData.datasets; self.chart.data.labels = chartData.labels; self.chart.update(); } else { self.chart = new Chart(self.canvas, args); } }); }; self.addAdditionalOptions = function(options, reportOptions) { var additionalOptions = {}; var maxItems = reportOptions && reportOptions.legend && reportOptions.legend.max_items; if (maxItems) { options.legend = options.legend || {}; options.legend.labels = options.legend.labels || {}; options.legend.labels.filter = options.legend.labels.filter || function(item) { var index = (typeof item.datasetIndex === 'undefined') ? item.index : item.datasetIndex; return index < maxItems; }; } return options; }; self.initialize(options); return self; });