/** * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ /** * @fileOverview Replaces widgets with charts using Chart.js. * * This file should be included on websites as CKEditor returns just a div element with data attributes that needs to be replaced with a proper chart. * The "Preview" plugin is using this file automatically. */ /* global chartjs_colors:false, chartjs_colors_json:false, chartjs_config:false, chartjs_config_json:false, console:false, Chart:false */ // For IE8 and below the code will not be executed. if ( typeof document.addEventListener !== 'undefined' ) document.addEventListener( 'DOMContentLoaded', function() { // Make sure Chart.js is enabled on a page. if ( typeof Chart === 'undefined' ) { if ( typeof console !== 'undefined' ) { console.log( 'ERROR: You must include chart.min.js on this page in order to use Chart.js' ); } return; } // Loop over all found elements. [].forEach.call( document.querySelectorAll( 'div.chartjs' ), function( el ) { var colors, config; // Color sets defined on a website. if ( typeof chartjs_colors !== 'undefined' ) { colors = chartjs_colors; } // Color sets provided by contentPreview event handler. else if ( typeof chartjs_colors_json !== 'undefined' ) { colors = JSON.parse( chartjs_colors_json ); } // Default hardcoded values used if file is included on a website that did not set "chartjs_colors" variable. else { colors = { // Colors for Bar/Line chart: http://www.chartjs.org/docs/#bar-chart-data-structure fillColor: 'rgba(151,187,205,0.5)', strokeColor: 'rgba(151,187,205,0.8)', highlightFill: 'rgba(151,187,205,0.75)', highlightStroke: 'rgba(151,187,205,1)', // Colors for Doughnut/Pie/PolarArea charts: http://www.chartjs.org/docs/#doughnut-pie-chart-data-structure data: [ '#B33131', '#B66F2D', '#B6B330', '#71B232', '#33B22D', '#31B272', '#2DB5B5', '#3172B6', '#3232B6', '#6E31B2', '#B434AF', '#B53071' ] }; } // Chart.js config defined on a website. if ( typeof chartjs_config !== 'undefined' ) { config = chartjs_config; } // Chart.js config provided by contentPreview event handler. else if ( typeof chartjs_config_json !== 'undefined' ) { config = JSON.parse( chartjs_config_json ); } else { config = { Bar: { animation: false }, Doughnut: { animateRotate: false }, Line: { animation: false }, Pie: { animateRotate: false }, PolarArea: { animateRotate: false } }; } // Get chart information from data attributes. var chartType = el.getAttribute( 'data-chart' ), values = JSON.parse( el.getAttribute( 'data-chart-value' ) ); // Malformed element, exit. if ( !values || !values.length || !chartType ) return; //
may contain some text like "chart" or   which is there just to prevent
s from being deleted. el.innerHTML = ''; // Prepare some DOM elements for Chart.js. var canvas = document.createElement( 'canvas' ); canvas.height = el.getAttribute( 'data-chart-height' ); el.appendChild( canvas ); var legend = document.createElement( 'div' ); legend.setAttribute( 'class', 'chartjs-legend' ); el.appendChild( legend ); // The code below is the same as in plugin.js. // ########## RENDER CHART START ########## // Prepare canvas and chart instance. var i, ctx = canvas.getContext( '2d' ), chart = new Chart( ctx ); // Set some extra required colors by Pie/Doughnut charts. // Ugly charts will be drawn if colors are not provided for each data. // http://www.chartjs.org/docs/#doughnut-pie-chart-data-structure if ( chartType != 'bar' ) { for ( i = 0; i < values.length; i++ ) { values[i].color = colors.data[i]; values[i].highlight = colors.data[i]; } } // Prepare data for bar/line charts. if ( chartType == 'bar' || chartType == 'line' ) { var data = { // Chart.js supports multiple datasets. // http://www.chartjs.org/docs/#bar-chart-data-structure // This plugin is simple, so it supports just one. // Need more features? Create a Pull Request :-) datasets: [ { label: '', fillColor: colors.fillColor, strokeColor: colors.strokeColor, highlightFill: colors.highlightFill, highlightStroke: colors.highlightStroke, data: [] } ], labels: [] }; // Bar charts accept different data format than Pie/Doughnut. // We need to pass values inside datasets[0].data. for ( i = 0; i < values.length; i++ ) { if ( values[i].value ) { data.labels.push( values[i].label ); data.datasets[0].data.push( values[i].value ); } } // Legend makes sense only with more than one dataset. legend.innerHTML = ''; } // Render Bar chart. if ( chartType == 'bar' ) { chart.Bar( data, config.Bar ); } // Render Line chart. else if ( chartType == 'line' ) { chart.Line( data, config.Line ); } // Render Line chart. else if ( chartType == 'polar' ) { //chart.PolarArea( values ); legend.innerHTML = chart.PolarArea( values, config.PolarArea ).generateLegend(); } // Render Pie chart and legend. else if ( chartType == 'pie' ) { legend.innerHTML = chart.Pie( values, config.Pie ).generateLegend(); } // Render Doughnut chart and legend. else { legend.innerHTML = chart.Doughnut( values, config.Doughnut ).generateLegend(); } // ########## RENDER CHART END ########## } ); } );