|
1 | 1 | /*! |
2 | 2 | * angular-chart.js - An angular.js wrapper for Chart.js |
3 | 3 | * http://jtblin.github.io/angular-chart.js/ |
4 | | - * Version: 1.0.3 |
| 4 | + * Version: 1.1.0 |
5 | 5 | * |
6 | 6 | * Copyright 2016 Jerome Touffe-Blin |
7 | 7 | * Released under the BSD-2-Clause license |
|
19 | 19 | define(['angular', 'chart'], factory); |
20 | 20 | } else { |
21 | 21 | // Browser globals |
22 | | - if (typeof angular === 'undefined' || typeof Chart === 'undefined') |
| 22 | + if (typeof angular === 'undefined') { |
| 23 | + throw new Error('AngularJS framework needs to be included, see https://angularjs.org/'); |
| 24 | + } else if (typeof Chart === 'undefined') { |
23 | 25 | throw new Error('Chart.js library needs to be included, see http://jtblin.github.io/angular-chart.js/'); |
| 26 | + } |
24 | 27 | factory(angular, Chart); |
25 | 28 | } |
26 | 29 | }(function (angular, Chart) { |
|
180 | 183 |
|
181 | 184 | scope.chartGetColor = getChartColorFn(scope); |
182 | 185 | var data = getChartData(type, scope); |
183 | | - |
184 | 186 | // Destroy old chart if it exists to avoid ghost charts issue |
185 | 187 | // https://github.com/jtblin/angular-chart.js/issues/187 |
186 | 188 | destroyChart(scope); |
|
209 | 211 | } |
210 | 212 |
|
211 | 213 | function getEventHandler (scope, action, triggerOnlyOnChange) { |
212 | | - var lastState = null; |
| 214 | + var lastState = { |
| 215 | + point: void 0, |
| 216 | + points: void 0 |
| 217 | + }; |
213 | 218 | return function (evt) { |
214 | | - var atEvent = scope.chart.getElementsAtEvent || scope.chart.getPointsAtEvent; |
215 | | - if (atEvent) { |
216 | | - var activePoints = atEvent.call(scope.chart, evt); |
217 | | - if (triggerOnlyOnChange === false || angular.equals(lastState, activePoints) === false) { |
218 | | - lastState = activePoints; |
219 | | - scope[action](activePoints, evt); |
| 219 | + var atEvent = scope.chart.getElementAtEvent || scope.chart.getPointAtEvent; |
| 220 | + var atEvents = scope.chart.getElementsAtEvent || scope.chart.getPointsAtEvent; |
| 221 | + if (atEvents) { |
| 222 | + var points = atEvents.call(scope.chart, evt); |
| 223 | + var point = atEvent ? atEvent.call(scope.chart, evt)[0] : void 0; |
| 224 | + |
| 225 | + if (triggerOnlyOnChange === false || |
| 226 | + (! angular.equals(lastState.points, points) && ! angular.equals(lastState.point, point)) |
| 227 | + ) { |
| 228 | + lastState.point = point; |
| 229 | + lastState.points = points; |
| 230 | + scope[action](points, evt, point); |
220 | 231 | } |
221 | 232 | } |
222 | 233 | }; |
|
238 | 249 | } |
239 | 250 |
|
240 | 251 | function convertColor (color) { |
241 | | - if (typeof color === 'object' && color !== null) return color; |
| 252 | + // Allows RGB and RGBA colors to be input as a string: e.g.: "rgb(159,204,0)", "rgba(159,204,0, 0.5)" |
| 253 | + if (typeof color === 'string' && color[0] === 'r') return getColor(rgbStringToRgb(color)); |
| 254 | + // Allows hex colors to be input as a string. |
242 | 255 | if (typeof color === 'string' && color[0] === '#') return getColor(hexToRgb(color.substr(1))); |
| 256 | + // Allows colors to be input as an object, bypassing getColor() entirely |
| 257 | + if (typeof color === 'object' && color !== null) return color; |
243 | 258 | return getRandomColor(); |
244 | 259 | } |
245 | 260 |
|
|
249 | 264 | } |
250 | 265 |
|
251 | 266 | function getColor (color) { |
| 267 | + var alpha = color[3] || 1; |
| 268 | + color = color.slice(0, 3); |
252 | 269 | return { |
253 | 270 | backgroundColor: rgba(color, 0.2), |
254 | | - pointBackgroundColor: rgba(color, 1), |
| 271 | + pointBackgroundColor: rgba(color, alpha), |
255 | 272 | pointHoverBackgroundColor: rgba(color, 0.8), |
256 | | - borderColor: rgba(color, 1), |
| 273 | + borderColor: rgba(color, alpha), |
257 | 274 | pointBorderColor: '#fff', |
258 | | - pointHoverBorderColor: rgba(color, 1) |
| 275 | + pointHoverBorderColor: rgba(color, alpha) |
259 | 276 | }; |
260 | 277 | } |
261 | 278 |
|
|
278 | 295 | return [r, g, b]; |
279 | 296 | } |
280 | 297 |
|
| 298 | + function rgbStringToRgb (color) { |
| 299 | + var match = color.match(/^rgba?\(([\d,.]+)\)$/); |
| 300 | + if (! match) throw new Error('Cannot parse rgb value'); |
| 301 | + color = match[1].split(','); |
| 302 | + return color.map(Number); |
| 303 | + } |
| 304 | + |
281 | 305 | function hasData (scope) { |
282 | 306 | return scope.chartData && scope.chartData.length; |
283 | 307 | } |
|
0 commit comments