UNPKG

unserver-unify

Version:

201 lines (171 loc) 5.5 kB
/** * tc-angular-chartjs - http://carlcraig.github.io/tc-angular-chartjs/ * Copyright (c) 2016 Carl Craig * Dual licensed with the Apache-2.0 or MIT license. */ ;(function(root, factory) { if (typeof define === 'function' && define.amd) { define(['angular', 'chart.js'], factory); } else if (typeof exports === 'object') { module.exports = factory(require('angular'), require('chart.js')); } else { root.tcAngularChartjs = factory(root.angular, root.Chart); } }(this, function(angular, Chart) { TcChartjs.$inject = ["TcChartjsFactory"]; TcChartjsLine.$inject = ["TcChartjsFactory"]; TcChartjsBar.$inject = ["TcChartjsFactory"]; TcChartjsHorizontalBar.$inject = ["TcChartjsFactory"]; TcChartjsRadar.$inject = ["TcChartjsFactory"]; TcChartjsPolararea.$inject = ["TcChartjsFactory"]; TcChartjsPie.$inject = ["TcChartjsFactory"]; TcChartjsDoughnut.$inject = ["TcChartjsFactory"]; TcChartjsBubble.$inject = ["TcChartjsFactory"];angular .module('tc.chartjs', []) .directive('tcChartjs', TcChartjs) .directive('tcChartjsLine', TcChartjsLine) .directive('tcChartjsBar', TcChartjsBar) .directive('tcChartjsHorizontalbar', TcChartjsHorizontalBar) .directive('tcChartjsRadar', TcChartjsRadar) .directive('tcChartjsPolararea', TcChartjsPolararea) .directive('tcChartjsPie', TcChartjsPie) .directive('tcChartjsDoughnut', TcChartjsDoughnut) .directive('tcChartjsBubble', TcChartjsBubble) .directive('tcChartjsLegend', TcChartjsLegend) .factory('TcChartjsFactory', TcChartjsFactory); function TcChartjs(TcChartjsFactory) { return new TcChartjsFactory(); } function TcChartjsLine(TcChartjsFactory) { return new TcChartjsFactory('line'); } function TcChartjsBar(TcChartjsFactory) { return new TcChartjsFactory('bar'); } function TcChartjsHorizontalBar(TcChartjsFactory) { return new TcChartjsFactory('horizontalbar'); } function TcChartjsRadar(TcChartjsFactory) { return new TcChartjsFactory('radar'); } function TcChartjsPolararea(TcChartjsFactory) { return new TcChartjsFactory('polararea'); } function TcChartjsPie(TcChartjsFactory) { return new TcChartjsFactory('pie'); } function TcChartjsDoughnut(TcChartjsFactory) { return new TcChartjsFactory('doughnut'); } function TcChartjsBubble(TcChartjsFactory) { return new TcChartjsFactory('bubble'); } function TcChartjsFactory() { return function (chartType) { return { restrict: 'A', scope: { data: '=chartData', options: '=chartOptions', type: '@chartType', legend: '=?chartLegend', chart: '=?chart', click: '&chartClick' }, link: link }; function link($scope, $elem, $attrs) { var ctx = $elem[0].getContext('2d'); var chartObj; var showLegend = false; var autoLegend = false; var exposeChart = false; var legendElem = null; for (var attr in $attrs) { if (attr === 'chartLegend') { showLegend = true; } else if (attr === 'chart') { exposeChart = true; } else if (attr === 'autoLegend') { autoLegend = true; } } $scope.$on('$destroy', function() { if (chartObj && typeof chartObj.destroy === 'function') { chartObj.destroy(); } }); if ($scope.click) { $elem[0].onclick = function(evt) { var out = { chartEvent: evt, element: chartObj.getElementAtEvent(evt), elements: chartObj.getElementsAtEvent(evt), dataset: chartObj.getDatasetAtEvent(evt) }; $scope.click({event: out}); }; } $scope.$watch('[data, options]', function (value) { if (value && $scope.data) { if (chartObj && typeof chartObj.destroy === 'function') { chartObj.destroy(); } var type = chartType || $scope.type; if (!type) { throw 'Error creating chart: Chart type required.'; } type = cleanChartName(type); chartObj = new Chart(ctx, { type: type, data: angular.copy($scope.data), options: $scope.options }); if (showLegend) { $scope.legend = chartObj.generateLegend(); } if (autoLegend) { if (legendElem) { legendElem.remove(); } angular.element($elem[0]).after(chartObj.generateLegend()); legendElem = angular.element($elem[0] ).next(); } if (exposeChart) { $scope.chart = chartObj; } chartObj.resize(); } }, true); } function cleanChartName(type) { var typeLowerCase = type.toLowerCase(); switch (typeLowerCase) { case 'polararea': return 'polarArea'; case 'horizontalbar': return 'horizontalBar'; default: return type; } } }; } function TcChartjsLegend() { return { restrict: 'A', scope: { legend: '=?chartLegend' }, link: link }; function link($scope, $elem) { $scope.$watch('legend', function (value) { if (value) { $elem.html(value); } }, true); } } return TcChartjsFactory; }));