// Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This code is inspired by https://github.com/jettro/c3-angular-sample/tree/master/js // License is MIT angular.module('appenlight.directives.c3chart', []) .controller('ChartCtrl', ['$scope', '$timeout', function ($scope, $timeout) { $scope.chart = null; this.showGraph = function () { var config = angular.copy($scope.config); var firstLoad = true; config.bindto = "#" + $scope.domid; var originalXTickCount = null; if ($scope.data && $scope.config) { if (!_.isEmpty($scope.data)) { _.extend(config.data, angular.copy($scope.data)); } console.log('ChartCtrl.showGraph', config); config.onresized = function () { if (this.currentWidth < 400){ $scope.chart.internal.config.axis_x_tick_culling_max = 3; } else if (this.currentWidth < 600){ $scope.chart.internal.config.axis_x_tick_culling_max = 5; } else{ $scope.chart.internal.config.axis_x_tick_culling_max = originalXTickCount; } $scope.chart.flush(); }; $scope.chart = c3.generate(config); originalXTickCount = $scope.chart.internal.config.axis_x_tick_culling_max; $scope.chart.internal.config.onresized.call($scope.chart.internal); } console.log('should update', $scope.update); if ($scope.update) { console.log('reload driven'); $scope.$watch('data', function () { if (!firstLoad) { console.log('data updated', $scope.data); $scope.chart.load(angular.copy($scope.data), {unload: true}); if (typeof $scope.data.groups != 'undefined') { console.log('add groups'); $scope.chart.groups($scope.data.groups); } if (typeof $scope.data.names != 'undefined') { console.log('add names'); $scope.chart.data.names($scope.data.names); } $scope.chart.flush(); } }, true); } $scope.$watch('config.regions', function (newValue, oldValue) { if (newValue === oldValue) { return } if (typeof $scope.config.regions != 'undefined') { console.log('update regions', $scope.config.regions); $scope.chart.regions($scope.config.regions); } }); firstLoad = false; $scope.$watch('resizetrigger', function (newValue, oldValue) { if (newValue !== oldValue) { $timeout(function () { $scope.chart.resize(); $scope.chart.internal.config.onresized.call($scope.chart.internal); }); } }); }; }]) .directive('c3chart', function ($timeout) { var chartLinker = function (scope, element, attrs, chartCtrl) { // Trick to wait for all rendering of the DOM to be finished. // then we can tell c3js to "connect" to our dom node $timeout(function () { chartCtrl.showGraph() }); scope.$on("$destroy", function () { if (scope.chart !== null) { scope.chart = scope.chart.destroy(); delete element; delete scope.chart; } } ); }; return { "restrict": "E", "controller": "ChartCtrl", "scope": { "domid": "@domid", "config": "=config", "data": "=data", "resizetrigger": "=resizetrigger", "update": "=update" }, "template": "
", "replace": true, "link": chartLinker } });