Comparar commits

...

122 Commits

Autor SHA1 Mensagem Data
etimberg a62537a800 bump and build for 1.1.1 release 2016-04-05 18:27:27 -04:00
Evert Timberg 4495b63d0a Merge pull request #2220 from TAGraves/master
Fixed a bug with calculating the canvas width and height
2016-04-05 09:47:25 -04:00
Tommy Graves 75ce567d05 Fixed a bug with calculating the canvas width and height
A previous commit removing a workaround for an old Firefox bug left part
of that workaround in, and it was preventing the expected behavior of
the canvas size being equal to the offsetWidth and offsetHeight of the
canvas prior to instantiation of Chart.JS
2016-04-05 08:28:46 -04:00
Evert Timberg ae103c3d0f Merge pull request #2218 from eemikula/master
Change legendTemplates to use separate spans for text and icon.
2016-04-04 19:49:03 -04:00
Eric Mikula 1ccb100739 Change legendTemplates to use separate spans for text and icon.
This addresses the issue in #2192 without entirely reverting #886. Note that it still may cause confusing behavior for some legends: Specifically, the example on chartjs.org styles ".doughnut-legend li span" with a fixed width, and therefore both of the new spans will be impacted by this styling. However, now two spans are generated instead. %name%-legend-icon is used for the color icon, and %name%-legend-text can be used for styling the text. This should be described in release notes.
2016-04-04 18:22:25 -04:00
Evert Timberg 09efe9e6e2 Merge pull request #2214 from eemikula/master
Changing object type check to prevent errors when undefined. Fixes #2213
2016-04-03 15:33:12 -04:00
Eric Mikula 31b883f815 Changing object type check to prevent errors when undefined. Fixes #2213 2016-04-03 15:19:21 -04:00
Nick Downie ef923dfe28 Update package + built files to 1.1.0 version 2016-04-01 17:03:30 +01:00
etimberg 3f73433831 Fixes #2185
Undoes the merge of #1334
2016-03-29 19:41:13 -04:00
Evert Timberg d7117bc792 Add title of license to license file. Fixes #2097 2016-03-13 10:20:24 -04:00
Evert Timberg cf767f71a2 Merge pull request #2093 from aaron-em/angleLineInterval
Add angleLineInterval option
2016-03-13 10:09:43 -04:00
Aaron Miller 668b532fbe Add angleLineInterval option to radar chart 2016-03-13 09:59:19 -04:00
Evert Timberg 6507f5c087 Merge pull request #2118 from davidcochrum/master
Fix multi-dataset bar highlighting and bar highlight color logic
2016-03-11 13:29:30 -05:00
David Cochrum 131b18059a Update Chart.js 2016-03-11 12:21:45 -05:00
David Cochrum 48c082b04a Fix multi-dataset bar highlighting and bar highlight color logic 2016-03-11 12:19:12 -05:00
David Cochrum cf47543243 Fix multi-dataset bar highlighting and bar highlight color logic 2016-03-11 12:16:43 -05:00
Evert Timberg 3f2119526d Fix #2102 2016-03-06 19:03:03 -05:00
Evert Timberg d17c76ea1a Merge pull request #2090 from aaron-em/patch-1
Mention that 1.x is feature-complete
2016-03-02 16:24:35 -05:00
Aaron Miller af3bcd5cfe Mention that 1.x is feature-complete
It'll help would-be contributors (such as myself, see #2058) avoid creating PRs that won't be accepted.
2016-03-02 16:20:23 -05:00
Evert Timberg ea0d93c970 Merge pull request #1070 from mackuba/stop_animations
Stop animations when destroying a chart
2016-02-27 15:46:05 -05:00
Evert Timberg 43606d1faa Merge pull request #1334 from thePanz/patch-2
Fix error in generateLegend() function
2016-02-20 13:29:32 -05:00
William Entriken 6009b00f74 Merge pull request #1886 from coolbombom/patch-4
having differnt colors in one dataset
2016-02-20 13:11:16 -05:00
Derek Perkins 8d6209271b Add link to slack invite 2016-02-19 21:21:26 -07:00
Evert Timberg 57753b8280 update to new gulp and new uglify version. 2016-02-15 19:22:55 -05:00
Evert Timberg 111ada730c Fix typo in docs. Fixes #1042 2016-02-15 16:42:23 -05:00
Evert Timberg 4aa274d5b2 Default multiTooltipTemplate now shows the dataset label + updated built files. Fixes #612 2016-02-15 14:43:34 -05:00
Evert Timberg 4f4f804a71 Use a named define to fix #768 2016-02-15 14:38:11 -05:00
Evert Timberg d4917afba9 Update git ignore to make it easier to switch between branches. Add code climate config here as well. 2016-02-14 15:15:17 -05:00
etimberg 37883689ad Fixes #1144 with an update to the docs to indicate that labels are required for each point 2016-02-07 19:58:15 -05:00
etimberg cf0b550a80 Check to ensure dom node exists when calculating size. Fixes #919 2016-02-07 19:23:54 -05:00
coolbombom 3f658555ba I will try again!
had a bad effect on color that was not array .... fully tested now, is working in my solution!
2016-01-11 12:48:09 +01:00
coolbombom 1f1e6b4e44 minor update, missed a small detail sorry!!!
missed a small detail, resolved in an error, sorry!
2016-01-11 12:17:08 +01:00
coolbombom 3ac54b8790 having differnt colors in one dataset
Hi updated the bar chart so the bars can have different colors in one dataset!

cheers
c_bb
2016-01-11 12:02:32 +01:00
Evert Timberg 126e318fef Update built files 2016-01-09 10:59:52 -05:00
Evert Timberg 1d3cb8ec41 Merge pull request #1875 from michaelarnauts/master
Ignore null values when calculating scale
2016-01-09 09:40:07 -05:00
Michaël Arnauts 57bd8c7715 Ignore null values when calculating scale 2016-01-09 12:04:29 +01:00
Evert Timberg 104143672b Merge pull request #1874 from Parent5446/patch-1
Added documentation about tooltip templates
2016-01-08 23:49:32 -05:00
Tyler Romeo c5f141306f Added documentation about tooltip templates
It can be a little unclear what the actual format for tooltip templates are. Added information concerning how the tooltip templates are evaluated, and what context, i.e., variables, is available inside of them.
2016-01-08 20:02:45 -08:00
Evert Timberg 299c4b3ae1 Update readme for latest v2 beta release 2016-01-01 12:56:08 -05:00
Evert Timberg cea557849a Merge pull request #1844 from zachpanz88/patch-2
Bump copyright year in license
2015-12-31 16:41:26 -05:00
Zach Panzarino 12a35b5d7b Bump copyright year in license 2015-12-31 15:41:36 -05:00
etimberg cfa6eb1289 Update built files 2015-12-27 12:10:07 -05:00
Evert Timberg 92d4d989f5 Merge pull request #1834 from damiansilbergleithcunniff/issue-1764-default-pie-chart-colors
Issue 1764: Add default colors for Pie Charts
2015-12-27 12:08:33 -05:00
Damian Silbergleith Cunniff cebbca67d1 Choose a "better" set of 12 default colors/highlight colors for pie charts 2015-12-27 09:14:15 -07:00
Damian Silbergleith Cunniff c47e4c1da1 Change reference to index to prevent running off the end of the array 2015-12-26 15:36:15 -07:00
Damian Silbergleith Cunniff b06344563d spaces -> tabs 2015-12-26 10:04:29 -07:00
Damian Silbergleith Cunniff 77185993df fix spaces -> tabs 2015-12-26 10:01:06 -07:00
Damian Silbergleith Cunniff fd2344dd5f Update the docs to reflect the new feature 2015-12-26 09:47:59 -07:00
Damian Silbergleith Cunniff e949edacf5 Update the pie chart to use the default color/highlight if none is specified 2015-12-26 09:41:31 -07:00
Damian Silbergleith Cunniff a868a2f61e Add default global values for Color and Highlight color 2015-12-26 09:34:43 -07:00
Evert Timberg ee6aabaffc Merge pull request #1302 from jantimon/master
More robust in-between arc calculation see #1301
2015-12-25 17:44:26 -05:00
Evert Timberg 69695235ac Merge pull request #1771 from ryoon/recent-firefox
Remove Firefox workaround
2015-12-25 13:39:21 -05:00
Evert Timberg 5cdd7a0893 Merge pull request #1141 from kirkstrobeck/gulp-watch
Add livereload to Gulp  task
2015-12-24 23:17:29 -05:00
Evert Timberg f63debe2c7 Merge pull request #1040 from dima117/master
fix multiTooltip appearance with empty title
2015-12-24 21:50:18 -05:00
William Entriken 3c6a736413 Merge pull request #1192 from kkirsche/patch-1
Remove moot `version` property from bower.json
2015-12-21 16:05:38 -05:00
Ryo ONODERA e94bd460a7 Remove Firefox workaround
The workaround for older Firefox should be removed, because latest
supported Firefox 38.4.0/42.0 do not require it.
And it has side effect like #1198 or my problem on Kintone on cybozu.com.
2015-12-12 09:00:12 +09:00
Evert Timberg 4297672424 Merge pull request #1092 from tannerlinsley/negative-arcs-fix
Only draw positive radius arcs Fixes #592
2015-11-16 21:17:46 -05:00
William Entriken 07aa9473f1 Typo: consistent capitalization 2015-11-16 18:11:22 -05:00
Jake 2e9c3d3109 Merge pull request #1621 from jakesyl/add-composer
Add Composer file
2015-11-08 14:37:41 -05:00
Jake a5e382ab8a add composer file
add composer file
2015-11-05 13:36:04 -05:00
Jake 4476c698c5 Merge pull request #1589 from zachpanz88/patch-1
Change license link
2015-11-04 13:07:25 -05:00
Evert Timberg 257da76b4c Merge pull request #1190 from Nek-/patch-1
Added ignore section
2015-11-01 17:16:22 -05:00
Evert Timberg a169e5ad41 Merge pull request #1262 from mattclegg/master
Call onAnimationComplete when reached last frame
2015-11-01 17:11:24 -05:00
Zach Panzarino 682545e1e3 Change license link
The link to the license now points to the direct license that applies for chart.js, rather than a generic MIT license
2015-10-28 21:22:41 -04:00
Tanner Linsley 69e886ad5b Update README.md 2015-10-26 12:44:48 -06:00
Tanner Linsley 249ca0cef7 Update README.md 2015-10-26 12:43:50 -06:00
Tanner Linsley f1a3fb2361 Merge pull request #1577 from yanarchy/patch-1
Add npm info to getting started doc.
2015-10-26 12:42:54 -06:00
Yan Fan b87106c181 Add npm info to getting started doc. 2015-10-26 11:41:01 -07:00
Tanner Linsley b4856d2e24 Update README.md 2015-10-24 18:07:26 -06:00
Tanner Linsley a68c53cf1e Update README.md 2015-10-24 18:06:59 -06:00
Tanner Linsley 891bd63ac7 Update README.md 2015-10-24 18:06:36 -06:00
Tanner Linsley 70b437b41a Update README.md 2015-10-24 18:05:24 -06:00
Tanner Linsley 07b1758c2e Update README.md 2015-10-24 17:56:28 -06:00
Tanner Linsley 55235ef03c Update README.md 2015-10-24 17:55:34 -06:00
Tanner Linsley dfdd865508 Update README.md 2015-10-24 17:43:51 -06:00
Tanner Linsley c11145bb2d Update README.md 2015-10-24 17:37:18 -06:00
Tanner Linsley 9c39d47bc7 Update README.md 2015-10-24 17:26:10 -06:00
Tanner Linsley 0510ba4139 Update README.md 2015-09-30 12:06:26 -06:00
Tanner Linsley 85e6d1ae71 Added Current 2.0 release to Readme 2015-09-30 11:59:09 -06:00
Tanner Linsley 322abd4361 Merge pull request #1476 from nnnick/v1.0-readme-update
Update v1.x readme to reflect release status
2015-09-24 22:34:00 -06:00
Tanner Linsley f992ddd0d7 Update README.md 2015-09-24 22:33:05 -06:00
Tanner Linsley 407eb846d0 Update v1.x readme to reflect release status 2015-09-21 14:28:10 -06:00
Evert Timberg dd4a67e85c Merge pull request #1067 from rvaidya/master
Added a scaleBackgroundColors configuration option for radar charts, to...
2015-09-17 17:28:00 -04:00
Evert Timberg 7fcd4dcae8 Merge pull request #1450 from nlzet/fix-legend-template-doc
Fix span closed before appending the label
2015-09-14 18:44:04 -04:00
NLZ13 8481811110 Fix span closed before appending the label 2015-09-13 00:33:51 +02:00
Evert Timberg c38e852b61 Merge pull request #1449 from bgvianyc/master
adding template language reference to docs
2015-09-12 11:10:40 -04:00
Barry Gitarts b601e2c2a1 adding template language reference to docs 2015-09-12 09:02:26 -04:00
Evert Timberg b41ba24fff Merge pull request #1439 from bengesoff/patch-2
fixed very small typo
2015-09-04 13:49:49 -04:00
Ben Gesoff 8983929f18 fixed very small typo
wrong it's
2015-09-04 17:08:58 +01:00
Tanner Linsley 2fff73f9e3 Merge pull request #1397 from coolbombom/patch-3
Fix scale error before animation complete
2015-08-28 16:29:30 -06:00
Tanner Linsley 1ae2884a04 Merge pull request #1402 from hrniels/tooltip
Added tooltipTitleTemplate option.
2015-08-28 16:28:11 -06:00
Evert Timberg 2b9a575d4d Merge pull request #1389 from ericjperry/fix/datasetStroke
The datasetStroke option has been fixed for line graphs
2015-08-22 09:39:20 -04:00
Evert Timberg 41fb914952 Merge pull request #1390 from internalfx/patch-1
Closes #1309
2015-08-22 09:38:03 -04:00
Nils Asmussen a14309d95f Added tooltipTitleTemplate option. 2015-08-22 13:47:01 +02:00
coolbombom 80ba5aa1c5 error thrown
error thrown (TypeError: this.scale is undefined) if destroy is called before animation is complete, this update fix this error!
2015-08-21 10:53:52 +02:00
Internalfx ac5bf729c5 Closes #1309
Doughnut.addData() broken for index of 0 #1309
2015-08-18 18:39:11 -07:00
Eric Perry 3f77eb83b2 The datasetStroke option has been fixed for line graphs 2015-08-18 17:56:19 -04:00
Evert Timberg ac360b8dd1 Merge pull request #1382 from bengesoff/patch-1
fixed two typos
2015-08-18 10:42:11 -04:00
Ben Gesoff c276c3a974 fixed two typos
wrong it's
2015-08-17 16:37:01 +01:00
Ema Panz d7ee18372a Fix error in generateLegend() function 2015-07-25 17:32:58 +02:00
Tanner Linsley 43f19359a9 Merge pull request #1308 from eunicekokor/patch-1
Update 00-Getting-Started.md
2015-07-22 11:32:08 -06:00
Evert Timberg f56a7db8fc Merge pull request #1181 from paulmasson/master
Update CDN link
2015-07-18 08:01:29 -04:00
eunice 804fcea46a Update 00-Getting-Started.md
Closes a small issue I found while going through the documentation https://github.com/nnnick/Chart.js/issues/1307
2015-07-13 17:45:27 -07:00
Jan Nicklas 0bb3a9b024 Fix typo 2015-07-10 11:53:35 +02:00
Jan Nicklas 961fd11098 More robust in-between arc calculation see #1301 2015-07-10 11:47:48 +02:00
Evert Timberg 66cf8ab787 Merge pull request #1268 from klaemo/patch-1
add license to package.json
2015-07-01 09:04:44 -04:00
Clemens Stolle 79b02bcf26 add license to package.json
just to be a good npm citizen :)
2015-07-01 11:03:00 +02:00
mattclegg d5f1738a3f Merge branch 'master' of github.com:nnnick/Chart.js
# By Amir E. Aharoni
# Via Amir E. Aharoni (1) and Evert Timberg (1)
* 'master' of github.com:nnnick/Chart.js:
  Fix the spelling of "separate"
2015-06-30 11:13:37 +01:00
mattclegg f7e3962087 Call onAnimationComplete when reached last frame 2015-06-30 11:13:30 +01:00
Evert Timberg 1367a234ee Merge pull request #1241 from amire80/spelling
Fix the spelling of "separate"
2015-06-22 18:12:38 -04:00
Amir E. Aharoni 02616b9f17 Fix the spelling of "separate" 2015-06-23 01:01:59 +03:00
Kevin Kirsche 3d389d7c09 Remove moot version property from bower.json
Per bower/bower.json-spec@a325da3
2015-06-10 18:25:22 -04:00
Maxime Veber 28d30b4f5b Added ignore section 2015-06-10 22:32:23 +02:00
paulmasson d1cccd3546 Update CDN link 2015-06-08 16:45:47 -07:00
kirkstrobeck 8db79ae365 nnnick/Chart.js#1140: Watch sample folder 2015-05-27 18:28:45 -07:00
kirkstrobeck 8ef3aaa87d Add livereload to Gulp task 2015-05-27 18:07:01 -07:00
Tanner Linsley 1df2b37bc5 Only draw positive radius arcs Fixes #592 2015-04-30 15:49:52 -06:00
Kuba Suder 66f7f96d4b stop animations when destroying a chart
otherwise the animation keeps updating the chart for some time after it
was supposed to be destroyed, and when the canvas might have been
already reused for a new chart
2015-04-16 22:41:53 +02:00
Rahul Vaidya d91c4a14e9 Decouple radar chart background colors from angle line drawing so they can be passed separately. 2015-04-16 11:36:49 -07:00
Rahul Vaidya 9eedf9adb6 For radar chart background colors, don't recalculate center offset multiple times. Verify that background color count is same as axes count. 2015-04-16 11:26:21 -07:00
Rahul Vaidya 7045fdbb5a Added a scaleBackgroundColors configuration option for Radial charts, to add a background color for each axis in the chart. 2015-04-16 09:22:31 -07:00
dima117 ca7a39232a fix multiTooltip appearance with empty title
https://github.com/nnnick/Chart.js/issues/1039
2015-04-03 22:19:34 +03:00
26 arquivos alterados com 853 adições e 167 exclusões
+19
Ver Arquivo
@@ -0,0 +1,19 @@
---
engines:
duplication:
enabled: true
config:
languages:
- javascript
eslint:
enabled: true
fixme:
enabled: true
ratings:
paths:
- "**.js"
exclude_paths:
- dist/
- node_modules/
- test/
- coverage/
+1
Ver Arquivo
@@ -0,0 +1 @@
**/*{.,-}min.js
+213
Ver Arquivo
@@ -0,0 +1,213 @@
ecmaFeatures:
modules: true
jsx: true
env:
amd: true
browser: true
es6: true
jquery: true
node: true
# http://eslint.org/docs/rules/
rules:
# Possible Errors
comma-dangle: [2, never]
no-cond-assign: 2
no-console: 0
no-constant-condition: 2
no-control-regex: 2
no-debugger: 2
no-dupe-args: 2
no-dupe-keys: 2
no-duplicate-case: 2
no-empty: 2
no-empty-character-class: 2
no-ex-assign: 2
no-extra-boolean-cast: 2
no-extra-parens: 0
no-extra-semi: 2
no-func-assign: 2
no-inner-declarations: [2, functions]
no-invalid-regexp: 2
no-irregular-whitespace: 2
no-negated-in-lhs: 2
no-obj-calls: 2
no-regex-spaces: 2
no-sparse-arrays: 2
no-unexpected-multiline: 2
no-unreachable: 2
use-isnan: 2
valid-jsdoc: 0
valid-typeof: 2
# Best Practices
accessor-pairs: 2
block-scoped-var: 0
complexity: [2, 6]
consistent-return: 0
curly: 0
default-case: 0
dot-location: 0
dot-notation: 0
eqeqeq: 2
guard-for-in: 2
no-alert: 2
no-caller: 2
no-case-declarations: 2
no-div-regex: 2
no-else-return: 0
no-empty-label: 2
no-empty-pattern: 2
no-eq-null: 2
no-eval: 2
no-extend-native: 2
no-extra-bind: 2
no-fallthrough: 2
no-floating-decimal: 0
no-implicit-coercion: 0
no-implied-eval: 2
no-invalid-this: 0
no-iterator: 2
no-labels: 0
no-lone-blocks: 2
no-loop-func: 2
no-magic-number: 0
no-multi-spaces: 0
no-multi-str: 0
no-native-reassign: 2
no-new-func: 2
no-new-wrappers: 2
no-new: 2
no-octal-escape: 2
no-octal: 2
no-proto: 2
no-redeclare: 2
no-return-assign: 2
no-script-url: 2
no-self-compare: 2
no-sequences: 0
no-throw-literal: 0
no-unused-expressions: 2
no-useless-call: 2
no-useless-concat: 2
no-void: 2
no-warning-comments: 0
no-with: 2
radix: 2
vars-on-top: 0
wrap-iife: 2
yoda: 0
# Strict
strict: 0
# Variables
init-declarations: 0
no-catch-shadow: 2
no-delete-var: 2
no-label-var: 2
no-shadow-restricted-names: 2
no-shadow: 0
no-undef-init: 2
no-undef: 0
no-undefined: 0
no-unused-vars: 0
no-use-before-define: 0
# Node.js and CommonJS
callback-return: 2
global-require: 2
handle-callback-err: 2
no-mixed-requires: 0
no-new-require: 0
no-path-concat: 2
no-process-exit: 2
no-restricted-modules: 0
no-sync: 0
# Stylistic Issues
array-bracket-spacing: 0
block-spacing: 0
brace-style: 0
camelcase: 0
comma-spacing: 0
comma-style: 0
computed-property-spacing: 0
consistent-this: 0
eol-last: 0
func-names: 0
func-style: 0
id-length: 0
id-match: 0
indent: 0
jsx-quotes: 0
key-spacing: 0
linebreak-style: 0
lines-around-comment: 0
max-depth: 0
max-len: 0
max-nested-callbacks: 0
max-params: 0
max-statements: [2, 30]
new-cap: 0
new-parens: 0
newline-after-var: 0
no-array-constructor: 0
no-bitwise: 0
no-continue: 0
no-inline-comments: 0
no-lonely-if: 0
no-mixed-spaces-and-tabs: 0
no-multiple-empty-lines: 0
no-negated-condition: 0
no-nested-ternary: 0
no-new-object: 0
no-plusplus: 0
no-restricted-syntax: 0
no-spaced-func: 0
no-ternary: 0
no-trailing-spaces: 0
no-underscore-dangle: 0
no-unneeded-ternary: 0
object-curly-spacing: 0
one-var: 0
operator-assignment: 0
operator-linebreak: 0
padded-blocks: 0
quote-props: 0
quotes: 0
require-jsdoc: 0
semi-spacing: 0
semi: 0
sort-vars: 0
space-after-keywords: 0
space-before-blocks: 0
space-before-function-paren: 0
space-before-keywords: 0
space-in-parens: 0
space-infix-ops: 0
space-return-throw-case: 0
space-unary-ops: 0
spaced-comment: 0
wrap-regex: 0
# ECMAScript 6
arrow-body-style: 0
arrow-parens: 0
arrow-spacing: 0
constructor-super: 0
generator-star-spacing: 0
no-arrow-condition: 0
no-class-assign: 0
no-const-assign: 0
no-dupe-class-members: 0
no-this-before-super: 0
no-var: 0
object-shorthand: 0
prefer-arrow-callback: 0
prefer-const: 0
prefer-reflect: 0
prefer-spread: 0
prefer-template: 0
require-yield: 0
+3
Ver Arquivo
@@ -3,5 +3,8 @@
node_modules/*
custom/*
coverage/*
docs/index.md
.settings/
+3 -1
Ver Arquivo
@@ -35,6 +35,8 @@ Pull requests
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.
Be advised that **Chart.js 1.0.2 is in feature-complete status**. Pull requests adding new features to the 1.x branch will be disregarded.
Guidlines:
- Please create an issue first:
@@ -45,7 +47,7 @@ Guidlines:
- 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
Joining the Project
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.
externo
+354 -95
Ver Arquivo
@@ -1,7 +1,7 @@
/*!
* Chart.js
* http://chartjs.org/
* Version: 1.0.2
* Version: 1.1.1
*
* Copyright 2015 Nick Downie
* Released under the MIT license
@@ -35,17 +35,11 @@
{
return document.defaultView.getComputedStyle(element).getPropertyValue(dimension);
}
}
};
var width = this.width = computeDimension(context.canvas,'Width');
var height = this.height = computeDimension(context.canvas,'Height');
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;
var width = this.width = context.canvas.width;
var 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);
@@ -150,6 +144,9 @@
// String - Tooltip title font colour
tooltipTitleFontColor: "#fff",
// String - Tooltip title template
tooltipTitleTemplate: "<%= label%>",
// Number - pixel width of padding around tooltip text
tooltipYPadding: 6,
@@ -169,11 +166,17 @@
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
// String - Template string for single tooltips
multiTooltipTemplate: "<%= value %>",
multiTooltipTemplate: "<%= datasetLabel %>: <%= value %>",
// String - Colour behind the legend colour block
multiTooltipKeyBackground: '#fff',
// Array - A list of colors to use as the defaults
segmentColorDefault: ["#A6CEE3", "#1F78B4", "#B2DF8A", "#33A02C", "#FB9A99", "#E31A1C", "#FDBF6F", "#FF7F00", "#CAB2D6", "#6A3D9A", "#B4B482", "#B15928" ],
// Array - A list of highlight colors to use as the defaults
segmentHighlightColorDefaults: [ "#CEF6FF", "#47A0DC", "#DAFFB2", "#5BC854", "#FFC2C1", "#FF4244", "#FFE797", "#FFA728", "#F2DAFE", "#9265C2", "#DCDCAA", "#D98150" ],
// Function - Will fire on animation progression.
onAnimationProgress: function(){},
@@ -210,14 +213,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;
@@ -300,9 +307,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);
@@ -328,7 +335,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;
@@ -387,10 +407,15 @@
maxSteps = Math.floor(drawingSize/(textSize * 1.5)),
skipFitting = (minSteps >= maxSteps);
var maxValue = max(valuesArray),
minValue = min(valuesArray);
// Filter out null values since these would min() to zero
var values = [];
each(valuesArray, function( v ){
v == null || values.push( v );
});
var minValue = min(values),
maxValue = max(values);
// We need some degree of seperation here to calculate the scales if all the values are the same
// We need some degree of separation here to calculate the scales if all the values are the same
// Adding/minusing 0.5 will give us a range of 1.
if (maxValue === minValue){
maxValue += 0.5;
@@ -505,7 +530,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)))});
});
@@ -526,7 +551,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) {
@@ -536,7 +563,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) {
@@ -546,7 +575,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) {
@@ -556,7 +587,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) {
@@ -575,60 +608,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) {
@@ -641,7 +709,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) {
@@ -659,7 +729,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;
}
},
@@ -762,14 +834,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 ? container.clientWidth - padding : 0;
},
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 ? container.clientHeight - padding : 0;
},
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){
@@ -844,7 +923,7 @@
},
stop : function(){
// Stops any current animation loop occuring
cancelAnimFrame(this.animationFrame);
Chart.animationService.cancelAnimation(this);
return this;
},
resize : function(callback){
@@ -868,15 +947,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();
@@ -885,9 +975,10 @@
return this;
},
generateLegend : function(){
return template(this.options.legendTemplate,this);
return helpers.template(this.options.legendTemplate, this);
},
destroy : function(){
this.stop();
this.clear();
unbindEvents(this, this.events);
var canvas = this.chart.canvas;
@@ -1015,7 +1106,7 @@
labels: tooltipLabels,
legendColors: tooltipColors,
legendColorBackground : this.options.multiTooltipKeyBackground,
title: ChartElements[0].label,
title: template(this.options.tooltipTitleTemplate,ChartElements[0]),
chart: this.chart,
ctx: this.chart.ctx,
custom: this.options.customTooltips
@@ -1199,9 +1290,18 @@
y: chartY
});
// Normalize all angles to 0 - 2*PI (0 - 360°)
var pointRelativeAngle = pointRelativePosition.angle % (Math.PI * 2),
startAngle = (Math.PI * 2 + this.startAngle) % (Math.PI * 2),
endAngle = (Math.PI * 2 + this.endAngle) % (Math.PI * 2) || 360;
// Calculate wether the pointRelativeAngle is between the start and the end angle
var betweenAngles = (endAngle < startAngle) ?
pointRelativeAngle <= endAngle || pointRelativeAngle >= startAngle:
pointRelativeAngle >= startAngle && pointRelativeAngle <= endAngle;
//Check if within the range of the open/close angle
var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle),
withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
var withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
return (betweenAngles && withinRadius);
//Ensure within the outside of the arc centre, but inside arc outer
@@ -1222,9 +1322,9 @@
ctx.beginPath();
ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle);
ctx.arc(this.x, this.y, this.outerRadius < 0 ? 0 : this.outerRadius, this.startAngle, this.endAngle);
ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true);
ctx.arc(this.x, this.y, this.innerRadius < 0 ? 0 : this.innerRadius, this.endAngle, this.startAngle, true);
ctx.closePath();
ctx.strokeStyle = this.strokeColor;
@@ -1283,6 +1383,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(){
@@ -1372,7 +1482,8 @@
this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5;
this.titleHeight = this.title ? this.titleFontSize * 1.5 : 0;
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleHeight;
this.ctx.font = this.titleFont;
@@ -1408,9 +1519,9 @@
//If the index is zero, we're getting the title
if (index === 0){
return baseLineHeight + this.titleFontSize/2;
return baseLineHeight + this.titleHeight / 3;
} else{
return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5;
return baseLineHeight + ((this.fontSize * 1.5 * afterTitleIndex) + this.fontSize / 2) + this.titleHeight;
}
},
@@ -1466,7 +1577,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);
@@ -1490,6 +1601,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;
@@ -1521,6 +1635,7 @@
// Only go through the xLabel loop again if the yLabel width has changed
if (cachedYLabelWidth < this.yLabelWidth){
this.endPoint = cachedEndPoint;
this.calculateXLabelRotation();
}
}
@@ -1539,7 +1654,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){
@@ -1558,7 +1673,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;
@@ -1940,14 +2055,40 @@
ctx.lineWidth = this.angleLineWidth;
ctx.strokeStyle = this.angleLineColor;
for (var i = this.valuesCount - 1; i >= 0; i--) {
if (this.angleLineWidth > 0){
var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max));
var centerOffset = null, outerPosition = null;
if (this.angleLineWidth > 0 && (i % this.angleLineInterval === 0)){
centerOffset = this.calculateCenterOffset(this.max);
outerPosition = this.getPointPosition(i, centerOffset);
ctx.beginPath();
ctx.moveTo(this.xCenter, this.yCenter);
ctx.lineTo(outerPosition.x, outerPosition.y);
ctx.stroke();
ctx.closePath();
}
if (this.backgroundColors && this.backgroundColors.length == this.valuesCount) {
if (centerOffset == null)
centerOffset = this.calculateCenterOffset(this.max);
if (outerPosition == null)
outerPosition = this.getPointPosition(i, centerOffset);
var previousOuterPosition = this.getPointPosition(i === 0 ? this.valuesCount - 1 : i - 1, centerOffset);
var nextOuterPosition = this.getPointPosition(i === this.valuesCount - 1 ? 0 : i + 1, centerOffset);
var previousOuterHalfway = { x: (previousOuterPosition.x + outerPosition.x) / 2, y: (previousOuterPosition.y + outerPosition.y) / 2 };
var nextOuterHalfway = { x: (outerPosition.x + nextOuterPosition.x) / 2, y: (outerPosition.y + nextOuterPosition.y) / 2 };
ctx.beginPath();
ctx.moveTo(this.xCenter, this.yCenter);
ctx.lineTo(previousOuterHalfway.x, previousOuterHalfway.y);
ctx.lineTo(outerPosition.x, outerPosition.y);
ctx.lineTo(nextOuterHalfway.x, nextOuterHalfway.y);
ctx.fillStyle = this.backgroundColors[i];
ctx.fill();
ctx.closePath();
}
// Extra 3px out for some label spacing
var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5);
ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
@@ -1984,6 +2125,93 @@
}
});
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);
// Check if executed the last frame.
if (this.animations[i].animationObject.currentStep == this.animations[i].animationObject.numSteps){
// Call onAnimationComplete
this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance);
// 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.
@@ -2004,7 +2232,7 @@
if (amd) {
define(function(){
define('Chart', [], function(){
return Chart;
});
} else if (typeof module === 'object' && module.exports) {
@@ -2060,7 +2288,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 class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
};
@@ -2105,8 +2333,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);
});
@@ -2137,10 +2367,10 @@
value : dataPoint,
label : data.labels[index],
datasetLabel: dataset.label,
strokeColor : dataset.strokeColor,
fillColor : dataset.fillColor,
highlightFill : dataset.highlightFill || dataset.fillColor,
highlightStroke : dataset.highlightStroke || dataset.strokeColor
strokeColor : (typeof dataset.strokeColor == 'object') ? dataset.strokeColor[index] : dataset.strokeColor,
fillColor : (typeof dataset.fillColor == 'object') ? dataset.fillColor[index] : dataset.fillColor,
highlightFill : (dataset.highlightFill) ? (typeof dataset.highlightFill == 'object') ? dataset.highlightFill[index] : dataset.highlightFill : (typeof dataset.fillColor == 'object') ? dataset.fillColor[index] : dataset.fillColor,
highlightStroke : (dataset.highlightStroke) ? (typeof dataset.highlightStroke == 'object') ? dataset.highlightStroke[index] : dataset.highlightStroke : (typeof dataset.strokeColor == 'object') ? dataset.strokeColor[index] : dataset.strokeColor
}));
},this);
@@ -2262,6 +2492,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),
@@ -2357,15 +2588,14 @@
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 class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=segments[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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",
//Providing a defaults will also register the deafults in the chart namespace
//Providing a defaults will also register the defaults in the chart namespace
defaults : defaultConfig,
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
//Config is automatically merged by the core of Chart.js, and is available at this.options
@@ -2398,6 +2628,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);
@@ -2414,7 +2647,11 @@
return segmentsArray;
},
addData : function(segment, atIndex, silent){
var index = atIndex || this.segments.length;
var index = atIndex !== undefined ? atIndex : this.segments.length;
if ( typeof(segment.color) === "undefined" ) {
segment.color = Chart.defaults.global.segmentColorDefault[index % Chart.defaults.global.segmentColorDefault.length];
segment.highlight = Chart.defaults.global.segmentHighlightColorDefaults[index % Chart.defaults.global.segmentHighlightColorDefaults.length];
}
this.segments.splice(index, 0, new this.SegmentArc({
value : segment.value,
outerRadius : (this.options.animateScale) ? 0 : this.outerRadius,
@@ -2433,8 +2670,12 @@
this.update();
}
},
calculateCircumference : function(value){
return (Math.PI*2)*(Math.abs(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;
@@ -2507,6 +2748,7 @@
});
}).call(this);
(function(){
"use strict";
@@ -2559,7 +2801,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 class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].strokeColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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
};
@@ -2570,6 +2815,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,
@@ -2685,6 +2931,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,
@@ -2735,6 +2982,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,
@@ -2778,6 +3026,7 @@
return helpers.findPreviousWhere(collection, hasValue, index) || point;
};
if (!this.scale) return;
this.scale.draw(easingDecimal);
@@ -2797,7 +3046,7 @@
},this);
// Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point
// Control points need to be calculated in a separate loop, because we need to know the current x/y of the point
// This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed
if (this.options.bezierCurve){
helpers.each(pointsWithValues, function(point, index){
@@ -2858,7 +3107,9 @@
}
}, this);
ctx.stroke();
if (this.options.datasetStroke) {
ctx.stroke();
}
if (this.options.datasetFill && pointsWithValues.length > 0){
//Round off the line by going to the base of the chart, back to the start, then fill.
@@ -2912,7 +3163,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
@@ -2931,14 +3182,14 @@
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 class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=segments[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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: "PolarArea",
//Providing a defaults will also register the deafults in the chart namespace
//Providing a defaults will also register the defaults in the chart namespace
defaults : defaultConfig,
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
//Config is automatically merged by the core of Chart.js, and is available at this.options
@@ -3132,6 +3383,7 @@
});
}).call(this);
(function(){
"use strict";
@@ -3162,6 +3414,9 @@
//Number - Pixel width of the angle line
angleLineWidth : 1,
//Number - Interval at which to draw angle lines ("every Nth point")
angleLineInterval: 1,
//String - Point label font declaration
pointLabelFontFamily : "'Arial'",
@@ -3196,7 +3451,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 class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].strokeColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
},
@@ -3308,12 +3563,14 @@
showLabels: this.options.scaleShowLabels,
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
backdropColor: this.options.scaleBackdropColor,
backgroundColors: this.options.scaleBackgroundColors,
backdropPaddingY : this.options.scaleBackdropPaddingY,
backdropPaddingX: this.options.scaleBackdropPaddingX,
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
lineColor: this.options.scaleLineColor,
angleLineColor : this.options.angleLineColor,
angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0,
angleLineInterval: (this.options.angleLineInterval) ? this.options.angleLineInterval : 1,
// Point labels at the edge of each line
pointLabelFontColor : this.options.pointLabelFontColor,
pointLabelFontSize : this.options.pointLabelFontSize,
@@ -3379,6 +3636,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,
@@ -3453,8 +3711,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
@@ -3474,4 +3733,4 @@
}).call(this);
}).call(this);
+3 -3
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+2 -1
Ver Arquivo
@@ -1,4 +1,5 @@
Copyright (c) 2013-2015 Nick Downie
The MIT License (MIT)
Copyright (c) 2013-2016 Nick Downie
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+46 -5
Ver Arquivo
@@ -1,15 +1,56 @@
[![](http://tannerlinsley.com/memes/chartjs.gif)](http://www.chartjs.org/docs/)
# Chart.js
[![Build Status](https://travis-ci.org/nnnick/Chart.js.svg?branch=master)](https://travis-ci.org/nnnick/Chart.js) [![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js)
[![Build Status](https://travis-ci.org/nnnick/Chart.js.svg?branch=master)](https://travis-ci.org/nnnick/Chart.js) [![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js) [![Chart.js on Slack](https://img.shields.io/badge/slack-Chart.js-blue.svg)](https://chartjs-slack-automation.herokuapp.com/)
*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org)
## Documentation
## v1.0.2 Stable
You can find documentation at [chartjs.org/docs](http://www.chartjs.org/docs/). The markdown files that build the site are available under `/docs`. Please note - in some of the json examples of configuration you might notice some liquid tags - this is just for the generating the site html, please disregard.
- NPM: `npm install chart.js --save`
- Bower: `bower install Chart.js --save`
- CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js
- Zip: [Download](https://github.com/nnnick/Chart.js/archive/master.zip)
## Bugs, issues and contributing
[Examples](https://github.com/nnnick/Chart.js/tree/master/samples) | [Documentation](http://www.chartjs.org/docs/)
## v2.0 Beta
- Release: [2.0.0-beta](https://github.com/nnnick/Chart.js/releases/tag/2.0.0-beta)
- Zip: [Download](https://github.com/nnnick/Chart.js/archive/2.0.0-beta2.zip)
Documentation for v2.0 is currently located [here](http://nnnick.github.io/Chart.js/docs-v2/).
## v2.0 Bleeding-Edge
- Branch: [v2.0-dev](https://github.com/nnnick/Chart.js/tree/v2.0-dev)
- Zip: [Download](https://github.com/nnnick/Chart.js/archive/v2.0-dev.zip)
The next generation and release of Chart.js (v2.0) has been well under way this year and we are very close to releasing some amazing new features including, but not limited to:
- Rewritten, optimized, and unit-tested
- New and improved scales (log, time, linear, category, multiple scales)
- Improved Tooltips and tooltip callbacks for customization
- Improved responsiveness and resizing
- Powerful support for adding, removing, changing, and updating data on the fly
- Animations for everything, including all elements, colors and tooltips
- Powerful customization when you need it. Automatic and dynamic when you don't.
- Excellent support for modern frameworks and modular build systems.
- Even more extensible via new element controllers, core scale classes, combo chart support, and hook systems
- Bug fixes, stability improvements, etc.
#####Contributing to 2.0
Submit PR's to the v2.0-dev branch.
#####Building and Testing
`gulp build`, `gulp test`, `gulp watch --test`
#####v1.x Status: Feature Complete
v1.x is now considered feature complete. PR's for bug fixes are still extremely welcome. Any open PR's for v1.x features will need to be reconsidered, refactored and resubmitted for v2.x (if the feature has not already been implemented). For questions on new features refer to the docs in the v2.0-dev branch
## Bugs, Issues and Contributing
Before submitting an issue or a pull request to the project, please take a moment to look over the [contributing guidelines](https://github.com/nnnick/Chart.js/blob/master/CONTRIBUTING.md) first.
@@ -17,4 +58,4 @@ For support using Chart.js, please post questions with the [`chartjs` tag on Sta
## License
Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT).
Chart.js is available under the [MIT license](https://github.com/nnnick/Chart.js/blob/master/LICENSE.md).
+12 -2
Ver Arquivo
@@ -1,11 +1,21 @@
{
"name": "Chart.js",
"version": "1.0.2",
"description": "Simple HTML5 Charts using the canvas element",
"homepage": "https://github.com/nnnick/Chart.js",
"author": "nnnick",
"main": [
"Chart.js"
],
"dependencies": {}
"ignore": [
"**/*",
".travis.yml",
"CONTRIBUTING.md",
"Chart.js",
"LICENSE.md",
"README.md",
"gulpfile.js",
"package.json"
],
"dependencies": {},
"version": "1.1.1"
}
+26
Ver Arquivo
@@ -0,0 +1,26 @@
{
"name": "nnnick/chartjs",
"type": "library",
"description": "Simple HTML5 charts using the canvas element.",
"keywords": [
"chart",
"js"
],
"homepage": "http://www.chartjs.org/",
"license": "MIT",
"authors": [
{
"name": "NICK DOWNIE",
"email": "hello@nickdownie.com"
}
],
"require": {
"php": ">=5.3.3"
},
"minimum-stability": "stable",
"extra": {
"branch-alias": {
"release/2.0": "v2.0-dev"
}
}
}
+36 -4
Ver Arquivo
@@ -11,14 +11,14 @@ First we need to include the Chart.js library on the page. The library occupies
<script src="Chart.js"></script>
```
Alternatively, if you're using an AMD loader for JavaScript modules, that is also supported in the Chart.js core. Please note: the library will still occupy a global variable of `Chart`, even if it detects `define` and `define.amd`. If this is a problem, you can call `noConflict` to restore the global Chart variable to it's previous owner.
Alternatively, if you're using an AMD loader for JavaScript modules, that is also supported in the Chart.js core. Please note: the library will still occupy a global variable of `Chart`, even if it detects `define` and `define.amd`. If this is a problem, you can call `noConflict` to restore the global Chart variable to its previous owner.
```javascript
// Using requirejs
require(['path/to/Chartjs'], function(Chart){
// Use Chart.js as normal here.
// Chart.noConflict restores the Chart global variable to it's previous owner
// Chart.noConflict restores the Chart global variable to its previous owner
// The function returns what was previously Chart, allowing you to reassign.
var Chartjs = Chart.noConflict();
@@ -31,9 +31,15 @@ You can also grab Chart.js using bower:
bower install Chart.js --save
```
or NPM:
```bash
npm install chart.js --save
```
Also, Chart.js is available from CDN:
https://cdnjs.com/libraries/chart.js
https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js
###Creating a chart
@@ -72,6 +78,10 @@ We call a method of the name of the chart we want to create. We pass in the data
This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type.
Templates are based on micro templating by John Resig:
http://ejohn.org/blog/javascript-micro-templating/
```javascript
Chart.defaults.global = {
// Boolean - Whether to animate the chart
@@ -144,7 +154,7 @@ Chart.defaults.global = {
// Boolean - Determines whether to draw tooltips on the canvas or not
showTooltips: true,
// Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-custom-tooltips))
// Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-external-tooltips))
customTooltips: false,
// Array - Array of string names to attach tooltip events
@@ -177,6 +187,9 @@ Chart.defaults.global = {
// String - Tooltip title font colour
tooltipTitleFontColor: "#fff",
// String - Tooltip title template
tooltipTitleTemplate: "<%= label%>",
// Number - pixel width of padding around tooltip text
tooltipYPadding: 6,
@@ -213,3 +226,22 @@ Chart.defaults.global.responsive = true;
```
Now, every time we create a chart, `options.responsive` will be `true`.
###Tooltip Templates
For the `tooltipTemplate` and `multiTooltipTemplate` configuration options, you may use special template blocks. **Do not use user input in the tooltip template, as it may be executed as raw JavaScript.**
Anything in between `<%` and `%>` will be executed as JavaScript. As in the example shown above, `<% if (label) { %>` and later `<% } %>`. Using `<%= expr %>` will print the value of the variable named by `expr` into the tooltip.
The available variables to print into the tooltip depends on the chart type. In general, the following variables are available:
```javascript
{
value : "value of the data point",
label : "label for the position the data point is at",
datasetLabel: "label for the dataset the point is from",
strokeColor : "stroke color for the dataset",
fillColor : "fill color for the dataset",
highlightFill : "highlight fill color for the dataset",
highlightStroke : "highlight stroke color for the dataset"
}
```
+2 -2
Ver Arquivo
@@ -45,7 +45,7 @@ var data = {
};
```
The line chart requires an array of labels for each of the data points. This is shown on the X axis.
The line chart requires an array of labels. This labels are shown on the X axis. There must be one label for each data point. More labels than datapoints are allowed, in which case the line ends at the last data point.
The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation.
The label key on each dataset is optional, and can be used when generating a scale for the chart.
@@ -100,7 +100,7 @@ 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].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>"
{% endraw %}
//Boolean - Whether to horizontally center the label and point dot inside the grid
+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].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>"
{% endraw %}
}
```
+5 -2
Ver Arquivo
@@ -76,6 +76,9 @@ These are the customisation options specific to Radar charts. These options are
//Number - Pixel width of the angle line
angleLineWidth : 1,
//Number - Interval at which to draw angle lines ("every Nth point")
angleLineInterval: 1,
//String - Point label font declaration
pointLabelFontFamily : "'Arial'",
@@ -110,7 +113,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].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>"
{% endraw %}
}
```
@@ -174,4 +177,4 @@ Calling `removeData()` on your Chart instance will remove the first value for al
```javascript
myRadarChart.removeData();
// Other points will now animate to their correct positions.
```
```
+1 -1
Ver Arquivo
@@ -102,7 +102,7 @@ These are the customisation options specific to Polar Area charts. These options
animateScale : false,
{% raw %}
//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>"
{% endraw %}
}
```
+3 -1
Ver Arquivo
@@ -88,7 +88,7 @@ These are the customisation options specific to Pie & Doughnut charts. These opt
animateScale : false,
{% raw %}
//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>"
{% endraw %}
}
```
@@ -137,6 +137,8 @@ myDoughnutChart.update();
Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an optional second argument of 'index', this determines at what index the new segment should be inserted into the chart.
If you don't specify a color and highliht, one will be chosen from the global default array: segmentColorDefault and the corresponding segmentHighlightColorDefault. The index of the addded data is used to lookup a corresponding color from the defaults.
```javascript
// An object in the same format as the original data source
myDoughnutChart.addData({
+3 -3
Ver Arquivo
@@ -54,7 +54,7 @@ myLineChart.destroy();
#### .toBase64Image()
This returns a base 64 encoded string of the chart in it's current state.
This returns a base 64 encoded string of the chart in its current state.
```javascript
myLineChart.toBase64Image();
@@ -96,7 +96,7 @@ var myPieChart = new Chart(ctx).Pie(data, {
// tooltip.y
// etc...
};
}
});
```
@@ -176,7 +176,7 @@ npm install -g gulp
This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner <a href="http://gulpjs.com/" target="_blank">gulp</a>.
Now, we can run the `gulp build` task, and pass in a comma seperated list of types as an argument to build a custom version of Chart.js with only specified chart types.
Now, we can run the `gulp build` task, and pass in a comma-separated list of types as an argument to build a custom version of Chart.js with only specified chart types.
Here we will create a version of Chart.js with only Line, Radar and Bar charts included:
+11 -1
Ver Arquivo
@@ -12,7 +12,8 @@ var gulp = require('gulp'),
exec = require('child_process').exec,
fs = require('fs'),
package = require('./package.json'),
bower = require('./bower.json');
bower = require('./bower.json'),
livereload = require('gulp-livereload');
var srcDir = './src/';
/*
@@ -114,6 +115,15 @@ gulp.task('module-sizes', function(){
gulp.task('watch', function(){
gulp.watch('./src/*', ['build']);
livereload.listen(35729);
var reloadPage = function (evt) {
livereload.changed(evt.path);
};
gulp.watch(['Chart.js', 'samples/*'], reloadPage);
});
gulp.task('test', ['jshint', 'valid']);
+6 -4
Ver Arquivo
@@ -2,25 +2,27 @@
"name": "chart.js",
"homepage": "http://www.chartjs.org",
"description": "Simple HTML5 charts using the canvas element.",
"version": "1.0.2",
"version": "1.1.1",
"main": "Chart.js",
"repository": {
"type": "git",
"url": "https://github.com/nnnick/Chart.js.git"
},
"license": "MIT",
"dependences": {},
"devDependencies": {
"gulp": "3.5.x",
"gulp": "3.9.x",
"gulp-concat": "~2.1.x",
"gulp-connect": "~2.0.5",
"gulp-jshint": "~1.5.1",
"gulp-replace": "^0.4.0",
"gulp-size": "~0.4.0",
"gulp-uglify": "~0.2.x",
"gulp-uglify": "~1.5.x",
"gulp-util": "~2.2.x",
"gulp-html-validator": "^0.0.2",
"inquirer": "^0.5.1",
"semver": "^3.0.1"
"semver": "^3.0.1",
"gulp-livereload": "^3.8.0"
},
"spm": {
"main": "Chart.js"
+9 -7
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%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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);
});
@@ -115,10 +117,10 @@
value : dataPoint,
label : data.labels[index],
datasetLabel: dataset.label,
strokeColor : dataset.strokeColor,
fillColor : dataset.fillColor,
highlightFill : dataset.highlightFill || dataset.fillColor,
highlightStroke : dataset.highlightStroke || dataset.strokeColor
strokeColor : (typeof dataset.strokeColor == 'object') ? dataset.strokeColor[index] : dataset.strokeColor,
fillColor : (typeof dataset.fillColor == 'object') ? dataset.fillColor[index] : dataset.fillColor,
highlightFill : (dataset.highlightFill) ? (typeof dataset.highlightFill == 'object') ? dataset.highlightFill[index] : dataset.highlightFill : (typeof dataset.fillColor == 'object') ? dataset.fillColor[index] : dataset.fillColor,
highlightStroke : (dataset.highlightStroke) ? (typeof dataset.highlightStroke == 'object') ? dataset.highlightStroke[index] : dataset.highlightStroke : (typeof dataset.strokeColor == 'object') ? dataset.strokeColor[index] : dataset.strokeColor
}));
},this);
+73 -25
Ver Arquivo
@@ -40,12 +40,6 @@
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);
@@ -150,6 +144,9 @@
// String - Tooltip title font colour
tooltipTitleFontColor: "#fff",
// String - Tooltip title template
tooltipTitleTemplate: "<%= label%>",
// Number - pixel width of padding around tooltip text
tooltipYPadding: 6,
@@ -169,11 +166,17 @@
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
// String - Template string for single tooltips
multiTooltipTemplate: "<%= value %>",
multiTooltipTemplate: "<%= datasetLabel %>: <%= value %>",
// String - Colour behind the legend colour block
multiTooltipKeyBackground: '#fff',
// Array - A list of colors to use as the defaults
segmentColorDefault: ["#A6CEE3", "#1F78B4", "#B2DF8A", "#33A02C", "#FB9A99", "#E31A1C", "#FDBF6F", "#FF7F00", "#CAB2D6", "#6A3D9A", "#B4B482", "#B15928" ],
// Array - A list of highlight colors to use as the defaults
segmentHighlightColorDefaults: [ "#CEF6FF", "#47A0DC", "#DAFFB2", "#5BC854", "#FFC2C1", "#FF4244", "#FFE797", "#FFA728", "#F2DAFE", "#9265C2", "#DCDCAA", "#D98150" ],
// Function - Will fire on animation progression.
onAnimationProgress: function(){},
@@ -404,10 +407,15 @@
maxSteps = Math.floor(drawingSize/(textSize * 1.5)),
skipFitting = (minSteps >= maxSteps);
var maxValue = max(valuesArray),
minValue = min(valuesArray);
// Filter out null values since these would min() to zero
var values = [];
each(valuesArray, function( v ){
v == null || values.push( v );
});
var minValue = min(values),
maxValue = max(values);
// We need some degree of seperation here to calculate the scales if all the values are the same
// We need some degree of separation here to calculate the scales if all the values are the same
// Adding/minusing 0.5 will give us a range of 1.
if (maxValue === minValue){
maxValue += 0.5;
@@ -829,13 +837,13 @@
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 - padding;
return container ? container.clientWidth - padding : 0;
},
getMaximumHeight = helpers.getMaximumHeight = function(domNode){
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 - padding;
return container ? container.clientHeight - padding : 0;
},
getStyle = helpers.getStyle = function (el, property) {
return el.currentStyle ?
@@ -967,9 +975,10 @@
return this;
},
generateLegend : function(){
return template(this.options.legendTemplate,this);
return helpers.template(this.options.legendTemplate, this);
},
destroy : function(){
this.stop();
this.clear();
unbindEvents(this, this.events);
var canvas = this.chart.canvas;
@@ -1097,7 +1106,7 @@
labels: tooltipLabels,
legendColors: tooltipColors,
legendColorBackground : this.options.multiTooltipKeyBackground,
title: ChartElements[0].label,
title: template(this.options.tooltipTitleTemplate,ChartElements[0]),
chart: this.chart,
ctx: this.chart.ctx,
custom: this.options.customTooltips
@@ -1281,9 +1290,18 @@
y: chartY
});
// Normalize all angles to 0 - 2*PI (0 - 360°)
var pointRelativeAngle = pointRelativePosition.angle % (Math.PI * 2),
startAngle = (Math.PI * 2 + this.startAngle) % (Math.PI * 2),
endAngle = (Math.PI * 2 + this.endAngle) % (Math.PI * 2) || 360;
// Calculate wether the pointRelativeAngle is between the start and the end angle
var betweenAngles = (endAngle < startAngle) ?
pointRelativeAngle <= endAngle || pointRelativeAngle >= startAngle:
pointRelativeAngle >= startAngle && pointRelativeAngle <= endAngle;
//Check if within the range of the open/close angle
var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle),
withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
var withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
return (betweenAngles && withinRadius);
//Ensure within the outside of the arc centre, but inside arc outer
@@ -1304,9 +1322,9 @@
ctx.beginPath();
ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle);
ctx.arc(this.x, this.y, this.outerRadius < 0 ? 0 : this.outerRadius, this.startAngle, this.endAngle);
ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true);
ctx.arc(this.x, this.y, this.innerRadius < 0 ? 0 : this.innerRadius, this.endAngle, this.startAngle, true);
ctx.closePath();
ctx.strokeStyle = this.strokeColor;
@@ -1464,7 +1482,8 @@
this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5;
this.titleHeight = this.title ? this.titleFontSize * 1.5 : 0;
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleHeight;
this.ctx.font = this.titleFont;
@@ -1500,9 +1519,9 @@
//If the index is zero, we're getting the title
if (index === 0){
return baseLineHeight + this.titleFontSize/2;
return baseLineHeight + this.titleHeight / 3;
} else{
return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5;
return baseLineHeight + ((this.fontSize * 1.5 * afterTitleIndex) + this.fontSize / 2) + this.titleHeight;
}
},
@@ -2036,14 +2055,40 @@
ctx.lineWidth = this.angleLineWidth;
ctx.strokeStyle = this.angleLineColor;
for (var i = this.valuesCount - 1; i >= 0; i--) {
if (this.angleLineWidth > 0){
var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max));
var centerOffset = null, outerPosition = null;
if (this.angleLineWidth > 0 && (i % this.angleLineInterval === 0)){
centerOffset = this.calculateCenterOffset(this.max);
outerPosition = this.getPointPosition(i, centerOffset);
ctx.beginPath();
ctx.moveTo(this.xCenter, this.yCenter);
ctx.lineTo(outerPosition.x, outerPosition.y);
ctx.stroke();
ctx.closePath();
}
if (this.backgroundColors && this.backgroundColors.length == this.valuesCount) {
if (centerOffset == null)
centerOffset = this.calculateCenterOffset(this.max);
if (outerPosition == null)
outerPosition = this.getPointPosition(i, centerOffset);
var previousOuterPosition = this.getPointPosition(i === 0 ? this.valuesCount - 1 : i - 1, centerOffset);
var nextOuterPosition = this.getPointPosition(i === this.valuesCount - 1 ? 0 : i + 1, centerOffset);
var previousOuterHalfway = { x: (previousOuterPosition.x + outerPosition.x) / 2, y: (previousOuterPosition.y + outerPosition.y) / 2 };
var nextOuterHalfway = { x: (outerPosition.x + nextOuterPosition.x) / 2, y: (outerPosition.y + nextOuterPosition.y) / 2 };
ctx.beginPath();
ctx.moveTo(this.xCenter, this.yCenter);
ctx.lineTo(previousOuterHalfway.x, previousOuterHalfway.y);
ctx.lineTo(outerPosition.x, outerPosition.y);
ctx.lineTo(nextOuterHalfway.x, nextOuterHalfway.y);
ctx.fillStyle = this.backgroundColors[i];
ctx.fill();
ctx.closePath();
}
// Extra 3px out for some label spacing
var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5);
ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
@@ -2141,8 +2186,11 @@
this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);
// Check if executed the last frame.
if (this.animations[i].animationObject.currentStep == this.animations[i].animationObject.numSteps){
// executed the last frame. Remove the animation.
// Call onAnimationComplete
this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance);
// Remove the animation.
this.animations.splice(i, 1);
// Keep the index in place to offset the splice
i--;
@@ -2184,7 +2232,7 @@
if (amd) {
define(function(){
define('Chart', [], function(){
return Chart;
});
} else if (typeof module === 'object' && module.exports) {
+7 -3
Ver Arquivo
@@ -32,14 +32,14 @@
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%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=segments[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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",
//Providing a defaults will also register the deafults in the chart namespace
//Providing a defaults will also register the defaults in the chart namespace
defaults : defaultConfig,
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
//Config is automatically merged by the core of Chart.js, and is available at this.options
@@ -91,7 +91,11 @@
return segmentsArray;
},
addData : function(segment, atIndex, silent){
var index = atIndex || this.segments.length;
var index = atIndex !== undefined ? atIndex : this.segments.length;
if ( typeof(segment.color) === "undefined" ) {
segment.color = Chart.defaults.global.segmentColorDefault[index % Chart.defaults.global.segmentColorDefault.length];
segment.highlight = Chart.defaults.global.segmentHighlightColorDefaults[index % Chart.defaults.global.segmentHighlightColorDefaults.length];
}
this.segments.splice(index, 0, new this.SegmentArc({
value : segment.value,
outerRadius : (this.options.animateScale) ? 0 : this.outerRadius,
+6 -3
Ver Arquivo
@@ -50,7 +50,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%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>",
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].strokeColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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
@@ -275,6 +275,7 @@
return helpers.findPreviousWhere(collection, hasValue, index) || point;
};
if (!this.scale) return;
this.scale.draw(easingDecimal);
@@ -294,7 +295,7 @@
},this);
// Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point
// Control points need to be calculated in a separate loop, because we need to know the current x/y of the point
// This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed
if (this.options.bezierCurve){
helpers.each(pointsWithValues, function(point, index){
@@ -355,7 +356,9 @@
}
}, this);
ctx.stroke();
if (this.options.datasetStroke) {
ctx.stroke();
}
if (this.options.datasetFill && pointsWithValues.length > 0){
//Round off the line by going to the base of the chart, back to the start, then fill.
+2 -2
Ver Arquivo
@@ -47,14 +47,14 @@
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%>\"><%if(segments[i].label){%><%=segments[i].label%><%}%></span></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=segments[i].fillColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%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: "PolarArea",
//Providing a defaults will also register the deafults in the chart namespace
//Providing a defaults will also register the defaults in the chart namespace
defaults : defaultConfig,
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
//Config is automatically merged by the core of Chart.js, and is available at this.options
+6 -1
Ver Arquivo
@@ -28,6 +28,9 @@
//Number - Pixel width of the angle line
angleLineWidth : 1,
//Number - Interval at which to draw angle lines ("every Nth point")
angleLineInterval: 1,
//String - Point label font declaration
pointLabelFontFamily : "'Arial'",
@@ -62,7 +65,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%>\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span class=\"<%=name.toLowerCase()%>-legend-icon\" style=\"background-color:<%=datasets[i].strokeColor%>\"></span><span class=\"<%=name.toLowerCase()%>-legend-text\"><%if(datasets[i].label){%><%=datasets[i].label%><%}%></span></li><%}%></ul>"
},
@@ -174,12 +177,14 @@
showLabels: this.options.scaleShowLabels,
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
backdropColor: this.options.scaleBackdropColor,
backgroundColors: this.options.scaleBackgroundColors,
backdropPaddingY : this.options.scaleBackdropPaddingY,
backdropPaddingX: this.options.scaleBackdropPaddingX,
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
lineColor: this.options.scaleLineColor,
angleLineColor : this.options.angleLineColor,
angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0,
angleLineInterval: (this.options.angleLineInterval) ? this.options.angleLineInterval : 1,
// Point labels at the edge of each line
pointLabelFontColor : this.options.pointLabelFontColor,
pointLabelFontSize : this.options.pointLabelFontSize,