123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /**
- * @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;
- // <div> may contain some text like "chart" or   which is there just to prevent <div>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 ##########
- }
- );
- } );
|