Comparar commits

..

120 Commits

Autor SHA1 Mensagem Data
Evert Timberg 3bba0ef780 Merge pull request #2122 from davidcochrum/release/1.1
Fix multi-dataset bar highlighting
2016-03-13 09:29:59 -04:00
Evert Timberg 5e626238fc Merge pull request #2099 from atlantech/release/1.1
Tooltip fix
2016-03-13 09:29:11 -04:00
David Cochrum a446bf979a Fix multi-dataset bar highlighting
When a bar graph contains multiple data sets and any of the datasets are incomplete (ie: no data yet for April through December of this year), the `activeBar` objects without a data point at that location received by `this.getBarsAtEvent(evt)` are `undefined`. This includes a check prior to attempting to access its properties (lines 86-89).
2016-03-12 11:16:13 -05:00
Alexander Leanovich b89ae28481 tooltip fix 2016-03-05 14:52:31 +03:00
Nick Downie 3c4b1f6560 1.1 Release 2015-06-04 16:15:26 +01:00
Evert Timberg e093fdf572 Merge pull request #1127 from leighquince/fix/radar-datasetfill-option
fix for radar chart ignoring datasetFill option
2015-05-20 17:54:17 -04:00
Leigh Quince 73b0d587ba fix for radar chart ignoring datasetFill option 2015-05-20 21:53:30 +02:00
Evert Timberg 2ce4291e98 Merge pull request #1122 from ismeta/fix-span-tag
Fixes #886 - Close span tags properly in legend generation template.
2015-05-16 08:37:38 -04:00
Vanessa Ung 598a6f3485 Fixes #886 - Close span tags properly in legend generation template. 2015-05-16 15:31:56 +10:00
Tanner Linsley b8691c9581 Revert "Merge pull request #856 from tannerlinsley/editable-chart-config"
This reverts commit a8063de6b8, reversing
changes made to 7f513b87ee.
2015-05-11 18:57:14 -06:00
Evert Timberg 4e3dd8ae3f Merge pull request #1066 from tannerlinsley/add-stacked-area
Add StackedArea chart type to community extensions
2015-05-06 20:31:27 -04:00
Evert Timberg cc57b9e581 Merge pull request #1098 from WouterSioen/fix-typo
Fix typo
2015-05-05 14:39:35 -04:00
Wouter Sioen aad966820e Fix a typo: segment vs segement
Fix typo in PolarArea

Update 04-Polar-Area-Chart.md
2015-05-05 16:31:00 +02:00
William Entriken 5443886ec3 Merge pull request #1068 from nnnick/animation-refactory
Animation refactory
2015-05-04 15:55:59 -04:00
William Entriken a8063de6b8 Merge pull request #856 from tannerlinsley/editable-chart-config
Data now editable right from chart config
2015-05-04 15:28:03 -04:00
William Entriken 7f513b87ee Merge pull request #952 from msmiley/patch-1
add datasetLabel for multiTooltip on dynamically-added points
2015-04-24 16:32:24 -04:00
William Entriken a3d4bc0bfe Merge pull request #851 from jtblin/master
Fix #507 - calculate container width and heigh without padding
2015-04-24 10:28:29 -04:00
Evert Timberg b5692c8534 Merge pull request #1069 from mackuba/fix_endpoint
Prevent taking vertical space for X labels more than once
2015-04-17 06:33:42 -04:00
Kuba Suder 2e311896ad prevent taking vertical space for x labels more than once
calculateXLabelRotation() subtracts space needed for x labels from
this.endPoint, but if this block is called more than once then the space
is subtracted more than once and the chart gets smaller and smaller with
every iteration
2015-04-16 22:23:17 +02:00
Tanner Linsley 8cc5be1212 Revert changes to build 2015-04-16 13:57:27 -06:00
William Entriken b0a780822a Merge pull request #1025 from pijey/feature/offsetgridlines-linechart
Add offsetGridLines option to Line charts
2015-04-16 15:27:43 -04:00
William Entriken a932442d26 Merge branch 'chasd00-piechart-redraw-after-zero-segment-values' 2015-04-16 15:17:36 -04:00
William Entriken 889c9de779 Merge #756 Fixes #661 2015-04-16 15:17:28 -04:00
Tanner Linsley e69aa04918 Add StackedArea chart type to community extensions 2015-04-16 00:50:08 -06:00
Nick Downie c7f52f516c Derped HTML attributes. 2015-04-13 16:35:14 +01:00
Nick Downie 8c641d21d8 Merge pull request #1062 from dima117/patch-1
Update 06-Advanced.md
2015-04-13 16:32:41 +01:00
dima117 9605409838 Update 06-Advanced.md
https://github.com/nnnick/Chart.js/issues/1060
2015-04-13 15:39:44 +03:00
Evert Timberg 604d6bd4e3 Merge pull request #677 from rylanhalteman/fix-yLabel-padding
add 10 to yLabelWidth on set, rather than on use
2015-04-12 08:06:23 -04:00
Tanner Linsley 14f4fae786 Only start digest on first request. Cleanup 2015-04-12 00:05:31 -06:00
Evert Timberg c476db0dd7 Use findNextWhere correctly. 2015-04-11 23:05:05 -04:00
Evert Timberg 0a5f92a854 Remove the minAnimationSteps option since we did not end up needing it. 2015-04-11 21:11:49 -04:00
Evert Timberg b1cbf04f25 Remove the unused lastTimeRun from the animation service 2015-04-11 20:47:35 -04:00
Tanner Linsley 70b8bf106c Always execute last frame 2015-04-11 18:42:11 -06:00
Tanner Linsley 99bf85e913 Merge remote-tracking branch 'origin/animation-refactory' into animation-refactory
Conflicts:
	src/Chart.Core.js
2015-04-11 18:37:01 -06:00
Tanner Linsley e0c208be58 Frame Dropper 2015-04-11 18:34:06 -06:00
Evert Timberg 26eca23706 Implement cancel animation frame in the animation service 2015-04-11 20:17:46 -04:00
Evert Timberg 98253fea5d Fix some bugs in the animation stuff 2015-04-11 20:08:17 -04:00
Evert Timberg 9a13dd78fc Fix a typo 2015-04-11 19:42:54 -04:00
Evert Timberg 3e59438646 Integrate animation service with chart 2015-04-11 19:33:20 -04:00
Tanner Linsley 7a6f2b4f06 Src changes... derrrr 2015-04-11 17:30:06 -06:00
Tanner Linsley a417dd00c5 Merge pull request #1058 from tannerlinsley/animation-refactory
Chart.AnimationService
2015-04-11 17:23:59 -06:00
Tanner Linsley eee5af5924 Chart.AnimationService 2015-04-11 17:19:29 -06:00
Evert Timberg d3579334b2 Add an option to control the minimum number of animation steps. 2015-04-11 19:17:30 -04:00
Evert Timberg 0b8fd966ff Chart animations will now use the animation service provided in Chart.animationService. 2015-04-11 19:02:50 -04:00
Evert Timberg 972bc5636d Merge pull request #711 from cmweiss/master
Default color for Doughnut/Pie
2015-04-09 11:25:45 -04:00
Evert Timberg 44ed661e3b Merge pull request #1036 from dima117/master
helpers.generateLabels throws exception #1035
2015-04-01 18:04:12 -04:00
dima117 4009dbd6a0 helpers.generateLabels throws "labelTemplateString is not defined" exception #1035 2015-03-31 22:06:41 +03:00
pijey 2677360f4b Add offsetGridLines option to Line charts 2015-03-25 11:51:56 +01:00
Evert Timberg e461788b2b Merge pull request #1022 from GitGal/master
Added possible animation effects to getting started guide
2015-03-24 19:17:06 -04:00
GitGal f7ed97a33e Update 00-Getting-Started.md
Move Possible effects list above animationEasing
2015-03-24 18:17:41 +01:00
gitgal fc0434b3da add all possible easing animations to 00-Getting-Started.md 2015-03-24 18:07:35 +01:00
Nick Downie 1408c68205 Merge pull request #1005 from zymiboxpay/master
fix custom build bug
2015-03-18 11:38:15 +00:00
zymiboxpay 53bc8e769f fix custom build bug 2015-03-18 16:26:17 +08:00
Evert Timberg b5f73e2087 Merge pull request #1002 from nnnick/fix/issue927
fixes #927
2015-03-17 10:59:49 -04:00
William Entriken cb113c6452 fixes #927 2015-03-17 10:12:01 -04:00
William Entriken 8e5f1d9667 Merge pull request #575 from msrocka/master
fix #570: getDecimalPlaces throws error
2015-03-17 09:28:54 -04:00
William Entriken 47d23601b1 Fix CodeClimate issues 2015-03-16 19:14:36 -04:00
William Entriken 212d513746 Merge pull request #999 from mbrevda/unattachedElement
Properly size unattached canvas
2015-03-16 10:22:39 -04:00
Moshe Brevda 3e6883bdc0 Use default canvas size if one cannot be intelligently procured 2015-03-16 13:58:09 +02:00
Nick Downie 930b16a0af Versioned release files 2015-03-10 11:04:30 +00:00
Nick Downie 78d9627e4d Bump bower/package versions 2015-03-10 11:03:30 +00:00
Nick Downie 785f0b64b7 Merge pull request #983 from nnnick/release/v1.0.2
Release 1.0.2
2015-03-09 18:41:53 +00:00
Nick Downie d2b73bdc5b Release 1.0.2 2015-03-09 18:37:37 +00:00
Nick Downie 4b120ccbe9 Merge pull request #982 from nnnick/fix/automatic-chart-size-src
Target src files from #142
2015-03-09 17:20:29 +00:00
Nick Downie 1fd52e702c Merge pull request #981 from nnnick/fix/cancel-anim-frame
Ensure cancelAnimFrame has no function context
2015-03-09 17:16:15 +00:00
Nick Downie de564326b0 Target src files from #142 2015-03-09 17:14:09 +00:00
Nick Downie 154ce016cc Ensure cancelAnimFrame has no function context 2015-03-09 17:05:20 +00:00
Evert Timberg 5d8df20b0d Merge pull request #962 from steaks/removeUnecessaryComment
Removed an unnecessary comment
2015-03-02 11:39:28 -05:00
Steven Wexler 24248120a9 Removed an unnecessary comment 2015-03-01 20:31:44 -05:00
Jake 019e985c8f Merge pull request #898 from etimberg/fix/line_chart_single_label
Fix a divide by 0 error when there is only 1 label
2015-02-24 15:00:53 -05:00
Mike Smiley ff493738a2 add datasetLabel for multiTooltip on dynamically-added points 2015-02-24 14:19:01 -05:00
Nick Downie 5ea265983e Merge pull request #931 from jtibble/master
Removed trailing comma
2015-02-11 00:09:58 +00:00
John Tibble c09cac1cdd Removed trailing comma
Automated scan at my place of employment caught this trailing comma
2015-02-10 16:13:03 -05:00
William Entriken afd2631728 Merge pull request #917 from nnnick/fix-915
Fixes #915
2015-02-04 11:51:14 -05:00
William Entriken 4b09072c2a Fixes #915 2015-02-03 14:09:17 -05:00
William Entriken b865fd317a Fixes #901 2015-02-02 16:56:43 -05:00
Christopher Weiss bb6237a15e Accidentally left in Array.prototype.map. 2015-01-30 11:12:08 -05:00
Christopher Weiss b8b7c85c5e Using helper.each instead of Array.prototype.map 2015-01-30 11:01:44 -05:00
Jake 5ec66308e4 Update .travis.yml 2015-01-29 21:43:02 -05:00
William Entriken 9c6a7397b5 Merge pull request #867 from bendxn/master
Doughnut charts handling negative values
2015-01-29 16:54:45 -05:00
Evert Timberg 87b7f8070a Merge pull request #889 from bjornarg/cancelanimframe-fix
Fix issue with "Illegal invocation" in cancelAnimFrame.
2015-01-28 17:55:47 -05:00
Jake 2d28075cde ADD GH PR guidelines 2015-01-28 14:22:28 -05:00
Evert Timberg 2e0211320b Fix a divide by 0 error when there is only 1 label 2015-01-27 18:31:03 -05:00
William Entriken 8244dd1271 Merge pull request #551 from mparramont/patch-1
Fix global config multiTooltipTemplate comment
2015-01-27 14:04:10 -05:00
William Entriken 654e02763f Merge pull request #553 from johnheroy/master
Documentation: change lineColor to strokeColor for the first 3 example charts
2015-01-27 14:03:13 -05:00
William Entriken 0c1c9824b2 Merge pull request #694 from spmjs/master
Add spm support
2015-01-27 13:48:47 -05:00
William Entriken 63b14dde15 Clean up PR process 2015-01-27 13:35:30 -05:00
Bjørnar Grip Fjær 6f6f80e6d7 Fix issue with "Illegal invocation" in cancelAnimFrame. 2015-01-27 19:14:00 +01:00
Ben Dixon 13396c72b3 Merge remote-tracking branch 'upstream/master' 2015-01-26 18:49:17 -06:00
Evert Timberg a5550cef6b Merge pull request #142 from JonRowe/automatically_size_chart
Automatically size charts based upon the canvas size.
2015-01-26 18:55:49 -05:00
Christopher Weiss 0f49be56a4 Update 05-Pie-Doughnut-Chart.md 2015-01-26 16:33:24 -05:00
Christopher Weiss b9776736d4 Removed custom hue(), using hsl() 2015-01-26 16:28:11 -05:00
Jon Rowe 9ab36291a9 force calculated width/heights back to context, for firefox compatibility 2015-01-26 20:15:04 +11:00
Jon Rowe 657e53c117 make charts dependent on calculated width 2015-01-26 20:15:04 +11:00
Evert Timberg dc2ebab883 Merge pull request #890 from jakesyl/master
Update CONTRIBUTING.md
2015-01-25 21:29:22 -05:00
Jake 82571710c6 Update CONTRIBUTING.md 2015-01-25 20:48:33 -05:00
William Entriken 06adbb0c54 Merge pull request #703 from etimberg/fix/polar_area_update
Ensure that scales for polar area graphs are regenerated on updates.
2015-01-23 15:15:58 -05:00
Ben Dixon d051dfe47f handling negative values in doughnut charts 2015-01-15 13:40:08 -06:00
Ben Dixon 06b02e9c33 Revert "doughnut charts handling negative values"
This reverts commit 8b3a98f242.
2015-01-15 13:38:20 -06:00
Ben Dixon 8b3a98f242 doughnut charts handling negative values 2015-01-15 13:31:54 -06:00
Tanner Linsley 026611110a Updated Samples
Samples now include a “Randomize Data” button which utilizes the latest
changes.
2015-01-08 10:13:14 -07:00
William Entriken 092b011f9b formatting 2015-01-08 09:40:54 -05:00
William Entriken 8a027f49a4 typo 2015-01-08 09:39:49 -05:00
Tanner Linsley 359e94151c Data editable from chart config 2015-01-07 21:45:50 -07:00
chad a7712e8c71 prevent divide by zero error when calculating a circumference 2014-11-13 11:36:13 -06:00
Jerome Touffe-Blin 1900c3b0f3 Fix #507 - calculate container width and heigh without padding 2014-10-25 13:21:52 +11:00
Christopher Weiss 73faf3413b Update Chart.Doughnut.js 2014-10-21 13:32:45 -04:00
Christopher Weiss fdc9be3e23 Correction in algorithm. 2014-10-21 13:28:45 -04:00
Christopher Weiss 7e21cb4e04 Pointed to core and doughnut. 2014-10-21 10:19:58 -04:00
Christopher Weiss 8984e8c2c4 Create doughnut.color.html
To test the new version of doughnut.
2014-10-21 10:16:30 -04:00
Christopher Weiss 686ea49953 Hue uses switch & fixed other problems. 2014-10-21 10:08:54 -04:00
Christopher Weiss ae9eaa95c7 hue() complete but undebugged. 2014-10-20 22:18:50 -04:00
Christopher Weiss e21147cbb9 Prototype for hue() & default fillColor to use it. 2014-10-20 21:49:41 -04:00
Evert Timberg 98c1ac439d Ensure that scales for polar area graphs are regenerated on updates. 2014-10-19 20:04:21 -04:00
chencheng 337511110c Add spm support 2014-10-15 17:28:50 +08:00
Rylan Halteman 5ab5e8400a add 10 to yLabelWidth on set, rather than on use 2014-10-08 11:36:39 -04:00
John Heroy 27a121c6b2 Change 'strokeColor' to 'fillColor' on 02-Bar-Chart.md 2014-09-25 09:49:20 -07:00
msrocka 5282c63ec3 fix #570: getDecimalPlaces throws error 2014-08-25 13:29:22 +02:00
John Heroy e6cbd9dc7f Change lineColor to strokeColor in legendTemplate for Line, Bar, and Radar charts 2014-08-19 22:42:39 +08:00
Miguel Parramon f825a31ce4 Fix global config multiTooltipTemplate comment 2014-08-19 13:19:37 +02:00
21 arquivos alterados com 678 adições e 159 exclusões
+3
Ver Arquivo
@@ -8,3 +8,6 @@ before_script:
script:
- gulp test
notifications:
slack: chartjs:pcfCZR6ugg5TEcaLtmIfQYuA
+11 -7
Ver Arquivo
@@ -25,25 +25,29 @@ Guidlines for reporting bugs:
- Check the issue search to see if it has already been reported
- Isolate the problem to a simple test case
- Provide a demonstration of the problem on [jsbin](http://jsbin.com) or similar
- Provide a demonstration of the problem on [JS Bin](http://jsbin.com) or similar
Please provide any additional details associated with the bug, if it's browser of screen density specific, or only happens with a certain configuration or data.
Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data.
Pull requests
-------------
Clear, concise pull requests are excellent at continuing the projects community driven growth. But please review the guidelines below before starting work on the project.
Clear, concise pull requests are excellent at continuing the project's community driven growth. But please review [these guidelines](https://github.com/blog/1943-how-to-write-the-perfect-pull-request) and the guidelines below before starting work on the project.
Guidlines:
- Please ask before starting significant work on a pull request to check it's a change within the project scope, and isn't a duplicate effort
- Please make changes to the files in [`/src`](https://github.com/nnnick/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory
- Tabs for indentation, not spaces please.
- Please create an issue first:
- For bugs, we can discuss the fixing approach
- For enhancements, we can discuss if it is within the project scope and avoid duplicate effort
- Please make changes to the files in [`/src`](https://github.com/nnnick/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory, this avoids merge conflicts
- Tabs for indentation, not spaces please
- If adding new functionality, please also update the relevant `.md` file in [`/docs`](https://github.com/nnnick/Chart.js/tree/master/docs)
- Please make your commits in logical sections with clear commit messages
- Please avoid committing in the build Chart.js & Chart.min.js file, as it may cause conflicts when merging back
Joining the Project
-------------
- Active committers and contributors are invited to introduce yourself and request commit access to this project. Please send an email to hello@nickdownie.com or file an issue.
License
-------
externo
+281 -64
Ver Arquivo
@@ -1,7 +1,7 @@
/*!
* Chart.js
* http://chartjs.org/
* Version: 1.0.1
* Version: 1.1.0
*
* Copyright 2015 Nick Downie
* Released under the MIT license
@@ -25,8 +25,27 @@
this.ctx = context;
//Variables global to the chart
var width = this.width = context.canvas.width;
var height = this.height = context.canvas.height;
var computeDimension = function(element,dimension)
{
if (element['offset'+dimension])
{
return element['offset'+dimension];
}
else
{
return document.defaultView.getComputedStyle(element).getPropertyValue(dimension);
}
};
var width = this.width = computeDimension(context.canvas,'Width') || context.canvas.width;
var height = this.height = computeDimension(context.canvas,'Height') || context.canvas.height;
// Firefox requires this to work correctly
context.canvas.width = width;
context.canvas.height = height;
width = this.width = context.canvas.width;
height = this.height = context.canvas.height;
this.aspectRatio = this.width / this.height;
//High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
helpers.retinaScale(this);
@@ -191,14 +210,18 @@
clone = helpers.clone = function(obj){
var objClone = {};
each(obj,function(value,key){
if (obj.hasOwnProperty(key)) objClone[key] = value;
if (obj.hasOwnProperty(key)){
objClone[key] = value;
}
});
return objClone;
},
extend = helpers.extend = function(base){
each(Array.prototype.slice.call(arguments,1), function(extensionObject) {
each(extensionObject,function(value,key){
if (extensionObject.hasOwnProperty(key)) base[key] = value;
if (extensionObject.hasOwnProperty(key)){
base[key] = value;
}
});
});
return base;
@@ -281,9 +304,9 @@
})(),
warn = helpers.warn = function(str){
//Method for warning of errors
if (window.console && typeof window.console.warn == "function") console.warn(str);
if (window.console && typeof window.console.warn === "function") console.warn(str);
},
amd = helpers.amd = (typeof define == 'function' && define.amd),
amd = helpers.amd = (typeof define === 'function' && define.amd),
//-- Math methods
isNumber = helpers.isNumber = function(n){
return !isNaN(parseFloat(n)) && isFinite(n);
@@ -309,7 +332,20 @@
},
getDecimalPlaces = helpers.getDecimalPlaces = function(num){
if (num%1!==0 && isNumber(num)){
return num.toString().split(".")[1].length;
var s = num.toString();
if(s.indexOf("e-") < 0){
// no exponent, e.g. 0.01
return s.split(".")[1].length;
}
else if(s.indexOf(".") < 0) {
// no decimal point, e.g. 1e-9
return parseInt(s.split("e-")[1]);
}
else {
// exponent and decimal point, e.g. 1.23e-9
var parts = s.split(".")[1].split("e-");
return parts[0].length + parseInt(parts[1]);
}
}
else {
return 0;
@@ -486,7 +522,7 @@
/* jshint ignore:end */
generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){
var labelsArray = new Array(numberOfSteps);
if (labelTemplateString){
if (templateString){
each(labelsArray,function(val,index){
labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))});
});
@@ -507,7 +543,9 @@
return -1 * t * (t - 2);
},
easeInOutQuad: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t;
}
return -1 / 2 * ((--t) * (t - 2) - 1);
},
easeInCubic: function (t) {
@@ -517,7 +555,9 @@
return 1 * ((t = t / 1 - 1) * t * t + 1);
},
easeInOutCubic: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t;
}
return 1 / 2 * ((t -= 2) * t * t + 2);
},
easeInQuart: function (t) {
@@ -527,7 +567,9 @@
return -1 * ((t = t / 1 - 1) * t * t * t - 1);
},
easeInOutQuart: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t * t;
}
return -1 / 2 * ((t -= 2) * t * t * t - 2);
},
easeInQuint: function (t) {
@@ -537,7 +579,9 @@
return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
},
easeInOutQuint: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t * t * t;
}
return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
},
easeInSine: function (t) {
@@ -556,60 +600,95 @@
return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
},
easeInOutExpo: function (t) {
if (t === 0) return 0;
if (t === 1) return 1;
if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1));
if (t === 0){
return 0;
}
if (t === 1){
return 1;
}
if ((t /= 1 / 2) < 1){
return 1 / 2 * Math.pow(2, 10 * (t - 1));
}
return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
},
easeInCirc: function (t) {
if (t >= 1) return t;
if (t >= 1){
return t;
}
return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
},
easeOutCirc: function (t) {
return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
},
easeInOutCirc: function (t) {
if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
if ((t /= 1 / 2) < 1){
return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
}
return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
},
easeInElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1) == 1) return 1;
if (!p) p = 1 * 0.3;
if (t === 0){
return 0;
}
if ((t /= 1) == 1){
return 1;
}
if (!p){
p = 1 * 0.3;
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
} else{
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
},
easeOutElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1) == 1) return 1;
if (!p) p = 1 * 0.3;
if (t === 0){
return 0;
}
if ((t /= 1) == 1){
return 1;
}
if (!p){
p = 1 * 0.3;
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
} else{
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
},
easeInOutElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1 / 2) == 2) return 1;
if (!p) p = 1 * (0.3 * 1.5);
if (t === 0){
return 0;
}
if ((t /= 1 / 2) == 2){
return 1;
}
if (!p){
p = 1 * (0.3 * 1.5);
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
} else {
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
if (t < 1){
return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));}
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
},
easeInBack: function (t) {
@@ -622,7 +701,9 @@
},
easeInOutBack: function (t) {
var s = 1.70158;
if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
if ((t /= 1 / 2) < 1){
return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
}
return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
},
easeInBounce: function (t) {
@@ -640,7 +721,9 @@
}
},
easeInOutBounce: function (t) {
if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5;
if (t < 1 / 2){
return easingEffects.easeInBounce(t * 2) * 0.5;
}
return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
}
},
@@ -743,14 +826,21 @@
});
},
getMaximumWidth = helpers.getMaximumWidth = function(domNode){
var container = domNode.parentNode;
var container = domNode.parentNode,
padding = parseInt(getStyle(container, 'padding-left')) + parseInt(getStyle(container, 'padding-right'));
// TODO = check cross browser stuff with this.
return container.clientWidth;
return container.clientWidth - padding;
},
getMaximumHeight = helpers.getMaximumHeight = function(domNode){
var container = domNode.parentNode;
var container = domNode.parentNode,
padding = parseInt(getStyle(container, 'padding-bottom')) + parseInt(getStyle(container, 'padding-top'));
// TODO = check cross browser stuff with this.
return container.clientHeight;
return container.clientHeight - padding;
},
getStyle = helpers.getStyle = function (el, property) {
return el.currentStyle ?
el.currentStyle[property] :
document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
},
getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support
retinaScale = helpers.retinaScale = function(chart){
@@ -825,7 +915,7 @@
},
stop : function(){
// Stops any current animation loop occuring
helpers.cancelAnimFrame.call(root, this.animationFrame);
Chart.animationService.cancelAnimation(this);
return this;
},
resize : function(callback){
@@ -849,15 +939,26 @@
if (reflow){
this.reflow();
}
if (this.options.animation && !reflow){
helpers.animationLoop(
this.draw,
this.options.animationSteps,
this.options.animationEasing,
this.options.onAnimationProgress,
this.options.onAnimationComplete,
this
);
var animation = new Chart.Animation();
animation.numSteps = this.options.animationSteps;
animation.easing = this.options.animationEasing;
// render function
animation.render = function(chartInstance, animationObject) {
var easingFunction = helpers.easingEffects[animationObject.easing];
var stepDecimal = animationObject.currentStep / animationObject.numSteps;
var easeDecimal = easingFunction(stepDecimal);
chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);
};
// user events
animation.onAnimationProgress = this.options.onAnimationProgress;
animation.onAnimationComplete = this.options.onAnimationComplete;
Chart.animationService.addAnimation(this, animation);
}
else{
this.draw();
@@ -1264,6 +1365,16 @@
}
});
Chart.Animation = Chart.Element.extend({
currentStep: null, // the current animation step
numSteps: 60, // default number of steps
easing: "", // the easing to use for this animation
render: null, // render function used by the animation service
onAnimationProgress: null, // user specified callback to fire on each step of the animation
onAnimationComplete: null, // user specified callback to fire when the animation finishes
});
Chart.Tooltip = Chart.Element.extend({
draw : function(){
@@ -1368,7 +1479,6 @@
var halfHeight = this.height/2;
//Check to ensure the height will fit on the canvas
//The three is to buffer form the very
if (this.y - halfHeight < 0 ){
this.y = halfHeight;
} else if (this.y + halfHeight > this.chart.height){
@@ -1448,7 +1558,7 @@
for (var i=0; i<=this.steps; i++){
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
}
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0;
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) + 10 : 0;
},
addXLabel : function(label){
this.xLabels.push(label);
@@ -1472,6 +1582,9 @@
this.startPoint += this.padding;
this.endPoint -= this.padding;
// Cache the starting endpoint, excluding the space for x labels
var cachedEndPoint = this.endPoint;
// Cache the starting height, so can determine if we need to recalculate the scale yAxis
var cachedHeight = this.endPoint - this.startPoint,
cachedYLabelWidth;
@@ -1503,6 +1616,7 @@
// Only go through the xLabel loop again if the yLabel width has changed
if (cachedYLabelWidth < this.yLabelWidth){
this.endPoint = cachedEndPoint;
this.calculateXLabelRotation();
}
}
@@ -1521,7 +1635,7 @@
this.xScalePaddingRight = lastWidth/2 + 3;
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10;
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth) ? firstWidth/2 : this.yLabelWidth;
this.xLabelRotation = 0;
if (this.display){
@@ -1540,7 +1654,7 @@
lastRotated = cosRotation * lastWidth;
// We're right aligning the text now.
if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){
if (firstRotated + this.fontSize / 2 > this.yLabelWidth){
this.xScalePaddingLeft = firstRotated + this.fontSize / 2;
}
this.xScalePaddingRight = this.fontSize/2;
@@ -1575,7 +1689,7 @@
var isRotated = (this.xLabelRotation > 0),
// innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding,
innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),
valueWidth = innerWidth/(this.valuesCount - ((this.offsetGridLines) ? 0 : 1)),
valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1),
valueOffset = (valueWidth * index) + this.xScalePaddingLeft;
if (this.offsetGridLines){
@@ -1966,6 +2080,90 @@
}
});
Chart.animationService = {
frameDuration: 17,
animations: [],
dropFrames: 0,
addAnimation: function(chartInstance, animationObject) {
for (var index = 0; index < this.animations.length; ++ index){
if (this.animations[index].chartInstance === chartInstance){
// replacing an in progress animation
this.animations[index].animationObject = animationObject;
return;
}
}
this.animations.push({
chartInstance: chartInstance,
animationObject: animationObject
});
// If there are no animations queued, manually kickstart a digest, for lack of a better word
if (this.animations.length == 1) {
helpers.requestAnimFrame.call(window, this.digestWrapper);
}
},
// Cancel the animation for a given chart instance
cancelAnimation: function(chartInstance) {
var index = helpers.findNextWhere(this.animations, function(animationWrapper) {
return animationWrapper.chartInstance === chartInstance;
});
if (index)
{
this.animations.splice(index, 1);
}
},
// calls startDigest with the proper context
digestWrapper: function() {
Chart.animationService.startDigest.call(Chart.animationService);
},
startDigest: function() {
var startTime = Date.now();
var framesToDrop = 0;
if(this.dropFrames > 1){
framesToDrop = Math.floor(this.dropFrames);
this.dropFrames -= framesToDrop;
}
for (var i = 0; i < this.animations.length; i++) {
if (this.animations[i].animationObject.currentStep === null){
this.animations[i].animationObject.currentStep = 0;
}
this.animations[i].animationObject.currentStep += 1 + framesToDrop;
if(this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps){
this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;
}
this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);
if (this.animations[i].animationObject.currentStep == this.animations[i].animationObject.numSteps){
// executed the last frame. Remove the animation.
this.animations.splice(i, 1);
// Keep the index in place to offset the splice
i--;
}
}
var endTime = Date.now();
var delay = endTime - startTime - this.frameDuration;
var frameDelay = delay / this.frameDuration;
if(frameDelay > 1){
this.dropFrames += frameDelay;
}
// Do we have more stuff to animate?
if (this.animations.length > 0){
helpers.requestAnimFrame.call(window, this.digestWrapper);
}
}
};
// Attach global event to resize each chart instance when the browser resizes
helpers.addEvent(window, "resize", (function(){
// Basic debounce of resize function so it doesn't hurt performance when resizing browser.
@@ -2042,7 +2240,7 @@
barDatasetSpacing : 1,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
};
@@ -2244,6 +2442,7 @@
this.datasets[datasetIndex].bars.push(new this.BarClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),
y: this.scale.endPoint,
width : this.scale.calculateBarWidth(this.datasets.length),
@@ -2339,11 +2538,10 @@
animateScale : false,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
};
Chart.Type.extend({
//Passing in a name registers this chart in the Chart namespace
name: "Doughnut",
@@ -2380,6 +2578,9 @@
this.calculateTotal(data);
helpers.each(data,function(datapoint, index){
if (!datapoint.color) {
datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
}
this.addData(datapoint, index, true);
},this);
@@ -2415,13 +2616,17 @@
this.update();
}
},
calculateCircumference : function(value){
return (Math.PI*2)*(value / this.total);
calculateCircumference : function(value) {
if ( this.total > 0 ) {
return (Math.PI*2)*(value / this.total);
} else {
return 0;
}
},
calculateTotal : function(data){
this.total = 0;
helpers.each(data,function(segment){
this.total += segment.value;
this.total += Math.abs(segment.value);
},this);
},
update : function(){
@@ -2489,6 +2694,7 @@
});
}).call(this);
(function(){
"use strict";
@@ -2541,7 +2747,10 @@
datasetFill : true,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>",
//Boolean - Whether to horizontally center the label and point dot inside the grid
offsetGridLines : false
};
@@ -2552,6 +2761,7 @@
initialize: function(data){
//Declare the extension of the default point, to cater for the options passed in to the constructor
this.PointClass = Chart.Point.extend({
offsetGridLines : this.options.offsetGridLines,
strokeWidth : this.options.pointDotStrokeWidth,
radius : this.options.pointDotRadius,
display: this.options.pointDot,
@@ -2667,6 +2877,7 @@
width : this.chart.width,
ctx : this.chart.ctx,
textColor : this.options.scaleFontColor,
offsetGridLines : this.options.offsetGridLines,
fontSize : this.options.scaleFontSize,
fontStyle : this.options.scaleFontStyle,
fontFamily : this.options.scaleFontFamily,
@@ -2717,6 +2928,7 @@
this.datasets[datasetIndex].points.push(new this.PointClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: this.scale.calculateX(this.scale.valuesCount+1),
y: this.scale.endPoint,
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
@@ -2894,7 +3106,7 @@
//Boolean - Stroke a line around each segment in the chart
segmentShowStroke : true,
//String - The colour of the stroke on each segement.
//String - The colour of the stroke on each segment.
segmentStrokeColor : "#fff",
//Number - The width of the stroke value in pixels
@@ -2913,7 +3125,7 @@
animateScale : false,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
};
@@ -3061,6 +3273,8 @@
helpers.each(this.segments,function(segment){
segment.save();
});
this.reflow();
this.render();
},
reflow : function(){
@@ -3112,6 +3326,7 @@
});
}).call(this);
(function(){
"use strict";
@@ -3176,7 +3391,7 @@
datasetFill : true,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
},
@@ -3359,6 +3574,7 @@
this.datasets[datasetIndex].points.push(new this.PointClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: pointPosition.x,
y: pointPosition.y,
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
@@ -3433,8 +3649,9 @@
ctx.stroke();
ctx.fillStyle = dataset.fillColor;
ctx.fill();
if(this.options.datasetFill){
ctx.fill();
}
//Now draw the points over the line
//A little inefficient double looping, but better than the line
//lagging behind the point positions
@@ -3454,4 +3671,4 @@
}).call(this);
}).call(this);
+3 -3
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+2 -2
Ver Arquivo
@@ -1,11 +1,11 @@
{
"name": "Chart.js",
"version": "1.0.1",
"version": "1.1.0",
"description": "Simple HTML5 Charts using the canvas element",
"homepage": "https://github.com/nnnick/Chart.js",
"author": "nnnick",
"main": [
"Chart.min.js"
"Chart.js"
],
"dependencies": {}
}
+14 -2
Ver Arquivo
@@ -28,9 +28,13 @@ require(['path/to/Chartjs'], function(Chart){
You can also grab Chart.js using bower:
```bash
bower install chartjs --save
bower install Chart.js --save
```
Also, Chart.js is available from CDN:
https://cdnjs.com/libraries/chart.js
###Creating a chart
To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the 2d context of where we want to draw the chart. Here's an example.
@@ -77,6 +81,14 @@ Chart.defaults.global = {
animationSteps: 60,
// String - Animation easing effect
// Possible effects are:
// [easeInOutQuart, linear, easeOutBounce, easeInBack, easeInOutQuad,
// easeOutQuart, easeOutQuad, easeInOutBounce, easeOutSine, easeInOutCubic,
// easeInExpo, easeInOutBack, easeInCirc, easeInOutElastic, easeOutBack,
// easeInQuad, easeInOutExpo, easeInQuart, easeOutQuint, easeInOutCirc,
// easeInSine, easeOutExpo, easeOutCirc, easeOutCubic, easeInQuint,
// easeInElastic, easeInOutSine, easeInOutQuint, easeInBounce,
// easeOutElastic, easeInCubic]
animationEasing: "easeOutQuart",
// Boolean - If we should show the scale at all
@@ -183,7 +195,7 @@ Chart.defaults.global = {
// String - Template string for single tooltips
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
{% endraw %}
// String - Template string for single tooltips
// String - Template string for multiple tooltips
multiTooltipTemplate: "<%= value %>",
// Function - Will fire on animation progression.
+4 -1
Ver Arquivo
@@ -100,8 +100,11 @@ These are the customisation options specific to Line charts. These options are m
datasetFill : true,
{% raw %}
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
{% endraw %}
//Boolean - Whether to horizontally center the label and point dot inside the grid
offsetGridLines : false
};
```
+1 -1
Ver Arquivo
@@ -84,7 +84,7 @@ These are the customisation options specific to Bar charts. These options are me
barDatasetSpacing : 1,
{% raw %}
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
{% endraw %}
}
```
+1 -1
Ver Arquivo
@@ -110,7 +110,7 @@ These are the customisation options specific to Radar charts. These options are
datasetFill : true,
{% raw %}
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
{% endraw %}
}
```
+2 -2
Ver Arquivo
@@ -83,7 +83,7 @@ These are the customisation options specific to Polar Area charts. These options
//Boolean - Stroke a line around each segment in the chart
segmentShowStroke : true,
//String - The colour of the stroke on each segement.
//String - The colour of the stroke on each segment.
segmentStrokeColor : "#fff",
//Number - The width of the stroke value in pixels
@@ -169,4 +169,4 @@ Calling `removeData(index)` on your Chart instance will remove segment at that p
```javascript
myPolarAreaChart.removeData();
// Other segments will update to fill the empty space left.
```
```
+1 -1
Ver Arquivo
@@ -55,7 +55,7 @@ var data = [
]
```
For a pie chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
For a pie chart, you must pass in an array of objects with a value and an optional color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
### Chart options
+4 -2
Ver Arquivo
@@ -158,8 +158,10 @@ new Chart(ctx).LineAlt(data);
### Community extensions
- <a href="https://github.com/Regaddi/Chart.StackedBar.js" target"_blank">Stacked Bar Chart</a> by <a href="https://twitter.com/Regaddi" target="_blank">@Regaddi</a>
- <a href="https://github.com/CAYdenberg/Chart.js" target"_blank">Error bars (bar and line charts)</a> by <a href="https://twitter.com/CAYdenberg" target="_blank">@CAYdenberg</a>
- <a href="https://github.com/Regaddi/Chart.StackedBar.js" target="_blank">Stacked Bar Chart</a> by <a href="https://twitter.com/Regaddi" target="_blank">@Regaddi</a>
- <a href="https://github.com/tannerlinsley/Chart.StackedArea.js" target="_blank">Stacked Bar Chart</a> by <a href="https://twitter.com/tannerlinsley" target="_blank">@tannerlinsley</a>
- <a href="https://github.com/CAYdenberg/Chart.js" target="_blank">Error bars (bar and line charts)</a> by <a href="https://twitter.com/CAYdenberg" target="_blank">@CAYdenberg</a>
- <a href="http://dima117.github.io/Chart.Scatter/" target="_blank">Scatter chart (number & date scales are supported)</a> by <a href="https://github.com/dima117" target="_blank">@dima117</a>
### Creating custom builds
+4 -4
Ver Arquivo
@@ -28,7 +28,7 @@ gulp.task('build', function(){
isCustom = !!(util.env.types),
outputDir = (isCustom) ? 'custom' : '.';
if (isCustom){
util.env.types.split(',').forEach(function(type){ return srcFiles.push(FileName(type))});
util.env.types.split(',').forEach(function(type){ return srcFiles.push(FileName(type));});
}
else{
// Seems gulp-concat remove duplicates - nice!
@@ -46,7 +46,7 @@ gulp.task('build', function(){
function FileName(moduleName){
return srcDir+'Chart.'+moduleName+'.js';
};
}
});
/*
@@ -109,7 +109,7 @@ gulp.task('module-sizes', function(){
.pipe(size({
showFiles: true,
gzip: true
}))
}));
});
gulp.task('watch', function(){
@@ -124,7 +124,7 @@ gulp.task('default', ['build', 'watch']);
gulp.task('server', function(){
connect.server({
port: 8000,
port: 8000
});
});
+4 -1
Ver Arquivo
@@ -2,7 +2,7 @@
"name": "chart.js",
"homepage": "http://www.chartjs.org",
"description": "Simple HTML5 charts using the canvas element.",
"version": "1.0.1",
"version": "1.1.0",
"main": "Chart.js",
"repository": {
"type": "git",
@@ -21,5 +21,8 @@
"gulp-html-validator": "^0.0.2",
"inquirer": "^0.5.1",
"semver": "^3.0.1"
},
"spm": {
"main": "Chart.js"
}
}
+58
Ver Arquivo
@@ -0,0 +1,58 @@
<!doctype html>
<html>
<head>
<title>Doughnut Chart</title>
<script src="../src/Chart.Core.js"></script>
<script src="../src/Chart.Doughnut.js"></script>
<style>
body{
padding: 0;
margin: 0;
}
#canvas-holder{
width:30%;
}
</style>
</head>
<body>
<div id="canvas-holder">
<canvas id="chart-area" width="500" height="500"/>
</div>
<script>
var doughnutData = [
{
value: 1,
label: "One"
},
{
value: 2,
label: "Two"
},
{
value: 3,
label: "Three"
},
{
value: 4,
label: "Four"
},
{
value: 5,
label: "Five"
}
];
window.onload = function(){
var ctx = document.getElementById("chart-area").getContext("2d");
window.myDoughnut = new Chart(ctx).Doughnut(doughnutData, {responsive : true});
};
</script>
</body>
</html>
+6 -3
Ver Arquivo
@@ -38,7 +38,7 @@
barDatasetSpacing : 1,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
};
@@ -83,8 +83,10 @@
bar.restore(['fillColor', 'strokeColor']);
});
helpers.each(activeBars, function(activeBar){
activeBar.fillColor = activeBar.highlightFill;
activeBar.strokeColor = activeBar.highlightStroke;
if (activeBar) {
activeBar.fillColor = activeBar.highlightFill;
activeBar.strokeColor = activeBar.highlightStroke;
}
});
this.showTooltip(activeBars);
});
@@ -240,6 +242,7 @@
this.datasets[datasetIndex].bars.push(new this.BarClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),
y: this.scale.endPoint,
width : this.scale.calculateBarWidth(this.datasets.length),
+249 -51
Ver Arquivo
@@ -25,8 +25,27 @@
this.ctx = context;
//Variables global to the chart
var width = this.width = context.canvas.width;
var height = this.height = context.canvas.height;
var computeDimension = function(element,dimension)
{
if (element['offset'+dimension])
{
return element['offset'+dimension];
}
else
{
return document.defaultView.getComputedStyle(element).getPropertyValue(dimension);
}
};
var width = this.width = computeDimension(context.canvas,'Width') || context.canvas.width;
var height = this.height = computeDimension(context.canvas,'Height') || context.canvas.height;
// Firefox requires this to work correctly
context.canvas.width = width;
context.canvas.height = height;
width = this.width = context.canvas.width;
height = this.height = context.canvas.height;
this.aspectRatio = this.width / this.height;
//High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
helpers.retinaScale(this);
@@ -191,14 +210,18 @@
clone = helpers.clone = function(obj){
var objClone = {};
each(obj,function(value,key){
if (obj.hasOwnProperty(key)) objClone[key] = value;
if (obj.hasOwnProperty(key)){
objClone[key] = value;
}
});
return objClone;
},
extend = helpers.extend = function(base){
each(Array.prototype.slice.call(arguments,1), function(extensionObject) {
each(extensionObject,function(value,key){
if (extensionObject.hasOwnProperty(key)) base[key] = value;
if (extensionObject.hasOwnProperty(key)){
base[key] = value;
}
});
});
return base;
@@ -281,9 +304,9 @@
})(),
warn = helpers.warn = function(str){
//Method for warning of errors
if (window.console && typeof window.console.warn == "function") console.warn(str);
if (window.console && typeof window.console.warn === "function") console.warn(str);
},
amd = helpers.amd = (typeof define == 'function' && define.amd),
amd = helpers.amd = (typeof define === 'function' && define.amd),
//-- Math methods
isNumber = helpers.isNumber = function(n){
return !isNaN(parseFloat(n)) && isFinite(n);
@@ -309,7 +332,20 @@
},
getDecimalPlaces = helpers.getDecimalPlaces = function(num){
if (num%1!==0 && isNumber(num)){
return num.toString().split(".")[1].length;
var s = num.toString();
if(s.indexOf("e-") < 0){
// no exponent, e.g. 0.01
return s.split(".")[1].length;
}
else if(s.indexOf(".") < 0) {
// no decimal point, e.g. 1e-9
return parseInt(s.split("e-")[1]);
}
else {
// exponent and decimal point, e.g. 1.23e-9
var parts = s.split(".")[1].split("e-");
return parts[0].length + parseInt(parts[1]);
}
}
else {
return 0;
@@ -486,7 +522,7 @@
/* jshint ignore:end */
generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){
var labelsArray = new Array(numberOfSteps);
if (labelTemplateString){
if (templateString){
each(labelsArray,function(val,index){
labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))});
});
@@ -507,7 +543,9 @@
return -1 * t * (t - 2);
},
easeInOutQuad: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t;
}
return -1 / 2 * ((--t) * (t - 2) - 1);
},
easeInCubic: function (t) {
@@ -517,7 +555,9 @@
return 1 * ((t = t / 1 - 1) * t * t + 1);
},
easeInOutCubic: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t;
}
return 1 / 2 * ((t -= 2) * t * t + 2);
},
easeInQuart: function (t) {
@@ -527,7 +567,9 @@
return -1 * ((t = t / 1 - 1) * t * t * t - 1);
},
easeInOutQuart: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t * t;
}
return -1 / 2 * ((t -= 2) * t * t * t - 2);
},
easeInQuint: function (t) {
@@ -537,7 +579,9 @@
return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
},
easeInOutQuint: function (t) {
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t;
if ((t /= 1 / 2) < 1){
return 1 / 2 * t * t * t * t * t;
}
return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
},
easeInSine: function (t) {
@@ -556,60 +600,95 @@
return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
},
easeInOutExpo: function (t) {
if (t === 0) return 0;
if (t === 1) return 1;
if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1));
if (t === 0){
return 0;
}
if (t === 1){
return 1;
}
if ((t /= 1 / 2) < 1){
return 1 / 2 * Math.pow(2, 10 * (t - 1));
}
return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
},
easeInCirc: function (t) {
if (t >= 1) return t;
if (t >= 1){
return t;
}
return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
},
easeOutCirc: function (t) {
return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
},
easeInOutCirc: function (t) {
if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
if ((t /= 1 / 2) < 1){
return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
}
return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
},
easeInElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1) == 1) return 1;
if (!p) p = 1 * 0.3;
if (t === 0){
return 0;
}
if ((t /= 1) == 1){
return 1;
}
if (!p){
p = 1 * 0.3;
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
} else{
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
},
easeOutElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1) == 1) return 1;
if (!p) p = 1 * 0.3;
if (t === 0){
return 0;
}
if ((t /= 1) == 1){
return 1;
}
if (!p){
p = 1 * 0.3;
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
} else{
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
},
easeInOutElastic: function (t) {
var s = 1.70158;
var p = 0;
var a = 1;
if (t === 0) return 0;
if ((t /= 1 / 2) == 2) return 1;
if (!p) p = 1 * (0.3 * 1.5);
if (t === 0){
return 0;
}
if ((t /= 1 / 2) == 2){
return 1;
}
if (!p){
p = 1 * (0.3 * 1.5);
}
if (a < Math.abs(1)) {
a = 1;
s = p / 4;
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
} else {
s = p / (2 * Math.PI) * Math.asin(1 / a);
}
if (t < 1){
return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));}
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
},
easeInBack: function (t) {
@@ -622,7 +701,9 @@
},
easeInOutBack: function (t) {
var s = 1.70158;
if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
if ((t /= 1 / 2) < 1){
return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
}
return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
},
easeInBounce: function (t) {
@@ -640,7 +721,9 @@
}
},
easeInOutBounce: function (t) {
if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5;
if (t < 1 / 2){
return easingEffects.easeInBounce(t * 2) * 0.5;
}
return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
}
},
@@ -743,14 +826,21 @@
});
},
getMaximumWidth = helpers.getMaximumWidth = function(domNode){
var container = domNode.parentNode;
var container = domNode.parentNode,
padding = parseInt(getStyle(container, 'padding-left')) + parseInt(getStyle(container, 'padding-right'));
// TODO = check cross browser stuff with this.
return container.clientWidth;
return container.clientWidth - padding;
},
getMaximumHeight = helpers.getMaximumHeight = function(domNode){
var container = domNode.parentNode;
var container = domNode.parentNode,
padding = parseInt(getStyle(container, 'padding-bottom')) + parseInt(getStyle(container, 'padding-top'));
// TODO = check cross browser stuff with this.
return container.clientHeight;
return container.clientHeight - padding;
},
getStyle = helpers.getStyle = function (el, property) {
return el.currentStyle ?
el.currentStyle[property] :
document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
},
getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support
retinaScale = helpers.retinaScale = function(chart){
@@ -825,7 +915,7 @@
},
stop : function(){
// Stops any current animation loop occuring
helpers.cancelAnimFrame.call(root, this.animationFrame);
Chart.animationService.cancelAnimation(this);
return this;
},
resize : function(callback){
@@ -849,15 +939,26 @@
if (reflow){
this.reflow();
}
if (this.options.animation && !reflow){
helpers.animationLoop(
this.draw,
this.options.animationSteps,
this.options.animationEasing,
this.options.onAnimationProgress,
this.options.onAnimationComplete,
this
);
var animation = new Chart.Animation();
animation.numSteps = this.options.animationSteps;
animation.easing = this.options.animationEasing;
// render function
animation.render = function(chartInstance, animationObject) {
var easingFunction = helpers.easingEffects[animationObject.easing];
var stepDecimal = animationObject.currentStep / animationObject.numSteps;
var easeDecimal = easingFunction(stepDecimal);
chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);
};
// user events
animation.onAnimationProgress = this.options.onAnimationProgress;
animation.onAnimationComplete = this.options.onAnimationComplete;
Chart.animationService.addAnimation(this, animation);
}
else{
this.draw();
@@ -1264,6 +1365,16 @@
}
});
Chart.Animation = Chart.Element.extend({
currentStep: null, // the current animation step
numSteps: 60, // default number of steps
easing: "", // the easing to use for this animation
render: null, // render function used by the animation service
onAnimationProgress: null, // user specified callback to fire on each step of the animation
onAnimationComplete: null, // user specified callback to fire when the animation finishes
});
Chart.Tooltip = Chart.Element.extend({
draw : function(){
@@ -1368,7 +1479,6 @@
var halfHeight = this.height/2;
//Check to ensure the height will fit on the canvas
//The three is to buffer form the very
if (this.y - halfHeight < 0 ){
this.y = halfHeight;
} else if (this.y + halfHeight > this.chart.height){
@@ -1448,7 +1558,7 @@
for (var i=0; i<=this.steps; i++){
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
}
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0;
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) + 10 : 0;
},
addXLabel : function(label){
this.xLabels.push(label);
@@ -1472,6 +1582,9 @@
this.startPoint += this.padding;
this.endPoint -= this.padding;
// Cache the starting endpoint, excluding the space for x labels
var cachedEndPoint = this.endPoint;
// Cache the starting height, so can determine if we need to recalculate the scale yAxis
var cachedHeight = this.endPoint - this.startPoint,
cachedYLabelWidth;
@@ -1503,6 +1616,7 @@
// Only go through the xLabel loop again if the yLabel width has changed
if (cachedYLabelWidth < this.yLabelWidth){
this.endPoint = cachedEndPoint;
this.calculateXLabelRotation();
}
}
@@ -1521,7 +1635,7 @@
this.xScalePaddingRight = lastWidth/2 + 3;
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10;
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth) ? firstWidth/2 : this.yLabelWidth;
this.xLabelRotation = 0;
if (this.display){
@@ -1540,7 +1654,7 @@
lastRotated = cosRotation * lastWidth;
// We're right aligning the text now.
if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){
if (firstRotated + this.fontSize / 2 > this.yLabelWidth){
this.xScalePaddingLeft = firstRotated + this.fontSize / 2;
}
this.xScalePaddingRight = this.fontSize/2;
@@ -1569,13 +1683,13 @@
},
calculateY : function(value){
var scalingFactor = this.drawingArea() / (this.min - this.max);
return this.endPoint - (scalingFactor * (value - this.min));
return Math.round(this.endPoint - (scalingFactor * (value - this.min)));
},
calculateX : function(index){
var isRotated = (this.xLabelRotation > 0),
// innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding,
innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),
valueWidth = innerWidth/(this.valuesCount - ((this.offsetGridLines) ? 0 : 1)),
valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1),
valueOffset = (valueWidth * index) + this.xScalePaddingLeft;
if (this.offsetGridLines){
@@ -1966,6 +2080,90 @@
}
});
Chart.animationService = {
frameDuration: 17,
animations: [],
dropFrames: 0,
addAnimation: function(chartInstance, animationObject) {
for (var index = 0; index < this.animations.length; ++ index){
if (this.animations[index].chartInstance === chartInstance){
// replacing an in progress animation
this.animations[index].animationObject = animationObject;
return;
}
}
this.animations.push({
chartInstance: chartInstance,
animationObject: animationObject
});
// If there are no animations queued, manually kickstart a digest, for lack of a better word
if (this.animations.length == 1) {
helpers.requestAnimFrame.call(window, this.digestWrapper);
}
},
// Cancel the animation for a given chart instance
cancelAnimation: function(chartInstance) {
var index = helpers.findNextWhere(this.animations, function(animationWrapper) {
return animationWrapper.chartInstance === chartInstance;
});
if (index)
{
this.animations.splice(index, 1);
}
},
// calls startDigest with the proper context
digestWrapper: function() {
Chart.animationService.startDigest.call(Chart.animationService);
},
startDigest: function() {
var startTime = Date.now();
var framesToDrop = 0;
if(this.dropFrames > 1){
framesToDrop = Math.floor(this.dropFrames);
this.dropFrames -= framesToDrop;
}
for (var i = 0; i < this.animations.length; i++) {
if (this.animations[i].animationObject.currentStep === null){
this.animations[i].animationObject.currentStep = 0;
}
this.animations[i].animationObject.currentStep += 1 + framesToDrop;
if(this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps){
this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;
}
this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);
if (this.animations[i].animationObject.currentStep == this.animations[i].animationObject.numSteps){
// executed the last frame. Remove the animation.
this.animations.splice(i, 1);
// Keep the index in place to offset the splice
i--;
}
}
var endTime = Date.now();
var delay = endTime - startTime - this.frameDuration;
var frameDelay = delay / this.frameDuration;
if(frameDelay > 1){
this.dropFrames += frameDelay;
}
// Do we have more stuff to animate?
if (this.animations.length > 0){
helpers.requestAnimFrame.call(window, this.digestWrapper);
}
}
};
// Attach global event to resize each chart instance when the browser resizes
helpers.addEvent(window, "resize", (function(){
// Basic debounce of resize function so it doesn't hurt performance when resizing browser.
+12 -6
Ver Arquivo
@@ -32,11 +32,10 @@
animateScale : false,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
};
Chart.Type.extend({
//Passing in a name registers this chart in the Chart namespace
name: "Doughnut",
@@ -73,6 +72,9 @@
this.calculateTotal(data);
helpers.each(data,function(datapoint, index){
if (!datapoint.color) {
datapoint.color = 'hsl(' + (360 * index / data.length) + ', 100%, 50%)';
}
this.addData(datapoint, index, true);
},this);
@@ -108,13 +110,17 @@
this.update();
}
},
calculateCircumference : function(value){
return (Math.PI*2)*(value / this.total);
calculateCircumference : function(value) {
if ( this.total > 0 ) {
return (Math.PI*2)*(value / this.total);
} else {
return 0;
}
},
calculateTotal : function(data){
this.total = 0;
helpers.each(data,function(segment){
this.total += segment.value;
this.total += Math.abs(segment.value);
},this);
},
update : function(){
@@ -181,4 +187,4 @@
defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0})
});
}).call(this);
}).call(this);
+7 -1
Ver Arquivo
@@ -50,7 +50,10 @@
datasetFill : true,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>",
//Boolean - Whether to horizontally center the label and point dot inside the grid
offsetGridLines : false
};
@@ -61,6 +64,7 @@
initialize: function(data){
//Declare the extension of the default point, to cater for the options passed in to the constructor
this.PointClass = Chart.Point.extend({
offsetGridLines : this.options.offsetGridLines,
strokeWidth : this.options.pointDotStrokeWidth,
radius : this.options.pointDotRadius,
display: this.options.pointDot,
@@ -176,6 +180,7 @@
width : this.chart.width,
ctx : this.chart.ctx,
textColor : this.options.scaleFontColor,
offsetGridLines : this.options.offsetGridLines,
fontSize : this.options.scaleFontSize,
fontStyle : this.options.scaleFontStyle,
fontFamily : this.options.scaleFontFamily,
@@ -226,6 +231,7 @@
this.datasets[datasetIndex].points.push(new this.PointClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: this.scale.calculateX(this.scale.valuesCount+1),
y: this.scale.endPoint,
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
+5 -3
Ver Arquivo
@@ -28,7 +28,7 @@
//Boolean - Stroke a line around each segment in the chart
segmentShowStroke : true,
//String - The colour of the stroke on each segement.
//String - The colour of the stroke on each segment.
segmentStrokeColor : "#fff",
//Number - The width of the stroke value in pixels
@@ -47,7 +47,7 @@
animateScale : false,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
};
@@ -195,6 +195,8 @@
helpers.each(this.segments,function(segment){
segment.save();
});
this.reflow();
this.render();
},
reflow : function(){
@@ -245,4 +247,4 @@
}
});
}).call(this);
}).call(this);
+6 -4
Ver Arquivo
@@ -62,7 +62,7 @@
datasetFill : true,
//String - A legend template
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
},
@@ -245,6 +245,7 @@
this.datasets[datasetIndex].points.push(new this.PointClass({
value : value,
label : label,
datasetLabel: this.datasets[datasetIndex].label,
x: pointPosition.x,
y: pointPosition.y,
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
@@ -319,8 +320,9 @@
ctx.stroke();
ctx.fillStyle = dataset.fillColor;
ctx.fill();
if(this.options.datasetFill){
ctx.fill();
}
//Now draw the points over the line
//A little inefficient double looping, but better than the line
//lagging behind the point positions
@@ -340,4 +342,4 @@
}).call(this);
}).call(this);