Compare commits

...

39 Commits

Author SHA1 Message Date
Jakub Juszczak
98961547f3 💎 Release new version 1.1.3 2016-09-08 13:39:30 +02:00
Jakub Juszczak
c11127e64f 1.1.3 2016-09-08 13:38:52 +02:00
Jakub Juszczak
0f98800b92 Add prepublish command to package.json for np 2016-09-08 13:34:05 +02:00
Jakub Juszczak
8eefeeef86 📝 Update README with badges 2016-09-08 13:30:19 +02:00
Jakub Juszczak
d913e9c515 Add unit tests and travis.yml 2016-09-08 13:21:20 +02:00
Jakub Juszczak
377ae5e27a Change example location to src folder for easier testing 2016-09-08 13:06:36 +02:00
Jakub Juszczak
9bcffae429 Add missing image for readme 2016-09-08 12:12:25 +02:00
Jakub Juszczak
086fb1d4e9 Add BubbleExample to app.vue 2016-09-08 12:12:15 +02:00
Jakub Juszczak
f241613107 Add canvas id as prop 2016-09-08 12:08:19 +02:00
Jakub Juszczak
af373cf09d 📝 Add BubbleChart Preview to README 2016-09-08 12:04:36 +02:00
Jakub Juszczak
a7776f8407 Add bubbleChart example 2016-09-08 12:03:15 +02:00
Jakub
776f3976ec Merge pull request #9 from jcalonso/feature/bubble-chart
Add bubble chart type
2016-09-08 11:49:31 +02:00
Juan Carlos Alonso
3785e73b43 Added bubble chart type 2016-09-07 22:50:18 +01:00
Jakub Juszczak
9bf6e6078d 📝 Update CHANGELOG
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-09-07 10:38:43 +02:00
Jakub Juszczak
e62e8c81fb Update npm version
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-09-07 10:30:07 +02:00
Jakub Juszczak
9f79fb581d 🔥 Remove placeholder test
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-09-07 10:29:56 +02:00
Jakub Juszczak
45d500d401 💎 Release new version 1.1.2
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-09-07 10:24:07 +02:00
Jakub Juszczak
9f02e95355 🐛 Fix props 2016-09-07 10:19:05 +02:00
Jakub Juszczak
d80eace435 📝 Update CHANGELOG 2016-08-23 20:59:21 +02:00
Jakub Juszczak
d9f95fd737 💎 Release new version 1.1.1
Updated ChartJs
2016-08-23 20:55:04 +02:00
Jakub Juszczak
e3f9936049 📝 Update CHANGELOG to 1.1.0
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:42:16 +02:00
Jakub Juszczak
2f66dd9a44 📝 📖 🐛 Fix README and Template
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:41:59 +02:00
Jakub Juszczak
a3bed8b8b6 💎 Release new version 1.1.0
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:38:34 +02:00
Jakub Juszczak
e48f4eaeec 📝 📖 Add Github issue and contribution templates
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:38:15 +02:00
Jakub Juszczak
57f3c651ed 📝 Update README with contribution and license section
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:26:38 +02:00
Jakub Juszczak
3c5c572a86 📝 📖 Add CODE OF CONDUCT
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:24:28 +02:00
Jakub Juszczak
c677dcb55a 📝 📖 Add LICENSE
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-21 14:24:17 +02:00
Jakub Juszczak
f5005fbd67 📝 Update CHANGELOG.md 2016-08-21 14:07:40 +02:00
Jakub
5258ab1a0f Feature/merge options #5 (#6)
*  Add dependency lodash

*  Add helper function to merge chartOptions

* Change Charts to merge options

* And renamed options data to defaultOptions
2016-08-21 14:04:34 +02:00
Jakub Juszczak
df7b6ec93e 🐛 Fix npm badge
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-20 12:40:59 +02:00
Jakub Juszczak
9a8e8d6e1e 📝 Update CHANGELOG.md
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-20 12:25:02 +02:00
Jakub Juszczak
8138969058 💎 Release new version 1.0.3
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-20 12:18:48 +02:00
Jakub Juszczak
e128ee27c7 Add changelog
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-08-19 23:57:04 +02:00
Jakub
ad7cabe809 Merge pull request #3 from LinusBorg/properly_destroy_chartsjs_objects
Properly destroy chartjs objects
2016-08-19 23:27:03 +02:00
Jakub Juszczak
d1bd9ef5ee Merge branch 'master' into develop
* master:
  Update README.md
2016-08-19 23:20:55 +02:00
Thorsten
90d9d87523 correct hook name. 2016-08-19 21:35:10 +02:00
Thorsten
998b190007 save chart instance on vm instance and add destroy() hooks to properly destroy chart when component is destroyed. 2016-08-19 21:30:39 +02:00
Jakub
44eb15a89a Update README.md
Add dependency badge
2016-08-01 20:04:03 +02:00
Jakub Juszczak
4c84718f7c Add npm badge
Signed-off-by: Jakub Juszczak <netghost03@gmail.com>
2016-07-27 22:07:55 +02:00
39 changed files with 558 additions and 121 deletions

10
.github/CONTRIBUTING.md vendored Normal file
View File

@@ -0,0 +1,10 @@
Thank you for contributing vue-chartjs!
=========================================
Please follow this steps:
1. Fork it ( https://github.com/apertureless/vue-chartjs/fork )
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request

14
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,14 @@
### Expected Behavior
### Actual Behavior
### Environment
- OS: Write here
- NPM Version: Write here

12
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,12 @@
### Fix or Enhancement?
- [ ] All tests passed
### Environment
- OS: Write here
- NPM Version: Write here

5
.travis.yml Normal file
View File

@@ -0,0 +1,5 @@
language: node_js
node_js:
- "6"
after_success:
- bash <(curl -s https://codecov.io/bash)

35
CHANGELOG.md Normal file
View File

@@ -0,0 +1,35 @@
# Change Log
## [1.1.2](https://github.com/apertureless/vue-chartjs/tree/1.1.2) (2016-09-07)
[Full Changelog](https://github.com/apertureless/vue-chartjs/compare/1.1.1...1.1.2)
**Implemented enhancements:**
- Change name of the render method to ensure compatiblity with Vue 2.0 [\#4](https://github.com/apertureless/vue-chartjs/issues/4)
## [1.1.1](https://github.com/apertureless/vue-chartjs/tree/1.1.1) (2016-08-23)
[Full Changelog](https://github.com/apertureless/vue-chartjs/compare/1.1.0...1.1.1)
## [1.1.0](https://github.com/apertureless/vue-chartjs/tree/1.1.0) (2016-08-21)
[Full Changelog](https://github.com/apertureless/vue-chartjs/compare/1.0.3...1.1.0)
**Implemented enhancements:**
- Use Vue.util.mergeOptions to merge default options with user's options [\#5](https://github.com/apertureless/vue-chartjs/issues/5)
**Merged pull requests:**
- Feature/merge options \#5 [\#6](https://github.com/apertureless/vue-chartjs/pull/6) ([apertureless](https://github.com/apertureless))
## [1.0.3](https://github.com/apertureless/vue-chartjs/tree/1.0.3) (2016-08-20)
[Full Changelog](https://github.com/apertureless/vue-chartjs/compare/1.0.2...1.0.3)
**Implemented enhancements:**
- Publish on NPM [\#2](https://github.com/apertureless/vue-chartjs/issues/2)
- Properly destroy chartjs objects [\#3](https://github.com/apertureless/vue-chartjs/pull/3) ([LinusBorg](https://github.com/LinusBorg))
## [1.0.2](https://github.com/apertureless/vue-chartjs/tree/1.0.2) (2016-07-27)
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*

13
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,13 @@
# Contributor Code of Conduct
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)

21
LICENSE.txt Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016 Jakub Juszczak
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,5 +1,7 @@
# Vue-ChartJs # Vue-ChartJs
[![npm version](https://badge.fury.io/js/vue-chartjs.svg)](https://badge.fury.io/js/vue-chartjs) ![npm dependencies](https://david-dm.org/apertureless/vue-chartjs.svg) [![codecov](https://codecov.io/gh/apertureless/vue-chartjs/branch/master/graph/badge.svg)](https://codecov.io/gh/apertureless/vue-chartjs) [![Build Status](https://travis-ci.org/apertureless/vue-chartjs.svg?branch=master)](https://travis-ci.org/apertureless/vue-chartjs)
> VueJS wrapper for ChartJs > VueJS wrapper for ChartJs
## Install ## Install
@@ -105,17 +107,9 @@ export default {
![Pie](assets/polar.png) ![Pie](assets/polar.png)
## Todo ### Bubble
- [x] ~~Implement Bar Chart~~
- [x] ~~Implement Line Chart~~
- [x] ~~Implement Radar Chart~~
- [x] ~~Implement Polar Area Chart~~
- [x] ~~Implement Pie Chart~~
- [x] ~~Implement Doughnut Chart~~
- [x] ~~Make npm module~~
- [ ] Add tests
![Bubble](assets/bubble.png)
## Build Setup ## Build Setup
@@ -140,3 +134,15 @@ npm test
``` ```
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
## Contributing
1. Fork it ( https://github.com/apertureless/vue-chartjs/fork )
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## License
This software is distributed under [MIT license](LICENSE.txt).

BIN
assets/bubble.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

32
dist/vue-chartjs.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,30 +0,0 @@
<template>
<div class="container">
<bar-example></bar-example>
<line-example></line-example>
<doughnut-example></doughnut-example>
<pie-example></pie-example>
<radar-example></radar-example>
<polar-area-example></polar-area-example>
</div>
</template>
<script>
import BarExample from './examples/BarExample'
import LineExample from './examples/LineExample'
import DoughnutExample from './examples/DoughnutExample'
import PieExample from './examples/PieExample'
import RadarExample from './examples/RadarExample'
import PolarAreaExample from './examples/PolarAreaExample'
export default {
components: { BarExample, LineExample, DoughnutExample, PieExample, RadarExample, PolarAreaExample }
}
</script>
<style>
.container {
max-width: 800px;
margin: 0 auto;
}
</style>

View File

@@ -1,6 +1,6 @@
{ {
"name": "vue-chartjs", "name": "vue-chartjs",
"version": "1.0.2", "version": "1.1.3",
"description": "Vue wrapper for chart.js", "description": "Vue wrapper for chart.js",
"author": "Jakub Juszczak <jakub@nextindex.de>", "author": "Jakub Juszczak <jakub@nextindex.de>",
"repository": { "repository": {
@@ -20,8 +20,9 @@
"build": "node build/build.js", "build": "node build/build.js",
"unit": "karma start test/unit/karma.conf.js --single-run", "unit": "karma start test/unit/karma.conf.js --single-run",
"e2e": "node test/e2e/runner.js", "e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e", "test": "npm run unit",
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs" "lint": "eslint --ext .js,.vue src test/unit/specs",
"prepublish": "node build/build.js"
}, },
"dependencies": { "dependencies": {
"babel-runtime": "^6.0.0", "babel-runtime": "^6.0.0",
@@ -34,13 +35,16 @@
"babel-plugin-transform-runtime": "^6.0.0", "babel-plugin-transform-runtime": "^6.0.0",
"babel-preset-es2015": "^6.0.0", "babel-preset-es2015": "^6.0.0",
"babel-preset-stage-2": "^6.0.0", "babel-preset-stage-2": "^6.0.0",
"chai": "^3.5.0",
"chromedriver": "^2.21.2",
"connect-history-api-fallback": "^1.1.0", "connect-history-api-fallback": "^1.1.0",
"cross-spawn": "^2.1.5",
"css-loader": "^0.23.0", "css-loader": "^0.23.0",
"eslint": "^2.10.2", "eslint": "^2.10.2",
"eslint-config-standard": "^5.1.0",
"eslint-friendly-formatter": "^2.0.5", "eslint-friendly-formatter": "^2.0.5",
"eslint-loader": "^1.3.0", "eslint-loader": "^1.3.0",
"eslint-plugin-html": "^1.3.0", "eslint-plugin-html": "^1.3.0",
"eslint-config-standard": "^5.1.0",
"eslint-plugin-promise": "^1.0.8", "eslint-plugin-promise": "^1.0.8",
"eslint-plugin-standard": "^1.3.2", "eslint-plugin-standard": "^1.3.2",
"eventsource-polyfill": "^0.9.6", "eventsource-polyfill": "^0.9.6",
@@ -50,6 +54,8 @@
"function-bind": "^1.0.2", "function-bind": "^1.0.2",
"html-webpack-plugin": "^2.8.1", "html-webpack-plugin": "^2.8.1",
"http-proxy-middleware": "^0.12.0", "http-proxy-middleware": "^0.12.0",
"inject-loader": "^2.0.1",
"isparta-loader": "^2.0.0",
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"karma": "^0.13.15", "karma": "^0.13.15",
"karma-coverage": "^0.5.5", "karma-coverage": "^0.5.5",
@@ -59,20 +65,16 @@
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "0.0.24", "karma-spec-reporter": "0.0.24",
"karma-webpack": "^1.7.0", "karma-webpack": "^1.7.0",
"lodash": "^4.15.0",
"lolex": "^1.4.0", "lolex": "^1.4.0",
"mocha": "^2.4.5", "mocha": "^2.4.5",
"chai": "^3.5.0", "nightwatch": "^0.8.18",
"ora": "^0.2.0",
"phantomjs-prebuilt": "^2.1.3",
"selenium-server": "2.53.0",
"shelljs": "^0.6.0",
"sinon": "^1.17.3", "sinon": "^1.17.3",
"sinon-chai": "^2.8.0", "sinon-chai": "^2.8.0",
"inject-loader": "^2.0.1",
"isparta-loader": "^2.0.0",
"phantomjs-prebuilt": "^2.1.3",
"chromedriver": "^2.21.2",
"cross-spawn": "^2.1.5",
"nightwatch": "^0.8.18",
"selenium-server": "2.53.0",
"ora": "^0.2.0",
"shelljs": "^0.6.0",
"url-loader": "^0.5.7", "url-loader": "^0.5.7",
"vue-hot-reload-api": "^1.2.0", "vue-hot-reload-api": "^1.2.0",
"vue-html-loader": "^1.0.0", "vue-html-loader": "^1.0.0",

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="bar-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width="{{width}}" height="{{height}}" v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'bar-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,7 +26,7 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
scales: { scales: {
yAxes: [{ yAxes: [{
ticks: { ticks: {
@@ -44,15 +49,20 @@ export default Vue.extend({
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'bar', type: 'bar',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

51
src/BaseCharts/Bubble.js Normal file
View File

@@ -0,0 +1,51 @@
import Vue from 'vue'
import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({
template: `
<div>
<canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div>
`,
props: {
chartId: {
default: 'bubble-chart',
type: String
},
width: {
default: 400,
type: Number
},
height: {
default: 400,
type: Number
}
},
data () {
return {
defaultOptions: {
}
}
},
methods: {
render (data, options) {
let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), {
type: 'bubble',
data: data,
options: chartOptions
}
)
this._chart.generateLegend()
}
},
beforeDestroy () {
this._chart.destroy()
}
})

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="doughnut-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'doughnut-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,21 +26,26 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
} }
} }
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'doughnut', type: 'doughnut',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="line-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'line-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,7 +26,7 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
scales: { scales: {
yAxes: [{ yAxes: [{
ticks: { ticks: {
@@ -42,15 +47,20 @@ export default Vue.extend({
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'line', type: 'line',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="pie-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'pie-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,21 +26,26 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
} }
} }
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'pie', type: 'pie',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="polar-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'polar-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,21 +26,26 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
} }
} }
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'polarArea', type: 'polarArea',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

View File

@@ -1,14 +1,19 @@
import Vue from 'vue' import Vue from 'vue'
import Chart from 'chart.js' import Chart from 'chart.js'
import { mergeOptions } from '../helpers/options'
export default Vue.extend({ export default Vue.extend({
template: ` template: `
<div> <div>
<canvas id="radar-chart" width=width height=height v-el:canvas></canvas> <canvas id="{{chartId}}" width={{width}} height={{height}} v-el:canvas></canvas>
</div> </div>
`, `,
props: { props: {
chartId: {
default: 'radar-chart',
type: String
},
width: { width: {
default: 400, default: 400,
type: Number type: Number
@@ -21,21 +26,26 @@ export default Vue.extend({
data () { data () {
return { return {
options: { defaultOptions: {
} }
} }
}, },
methods: { methods: {
render (data, options = this.options) { render (data, options) {
const chart = new Chart( let chartOptions = mergeOptions(this.defaultOptions, options)
this._chart = new Chart(
this.$els.canvas.getContext('2d'), { this.$els.canvas.getContext('2d'), {
type: 'radar', type: 'radar',
data: data, data: data,
options: options options: chartOptions
} }
) )
chart.generateLegend() this._chart.generateLegend()
} }
},
beforeDestroy () {
this._chart.destroy()
} }
}) })

40
src/examples/App.vue Normal file
View File

@@ -0,0 +1,40 @@
<template>
<div class="container">
<bar-example></bar-example>
<line-example></line-example>
<doughnut-example></doughnut-example>
<pie-example></pie-example>
<radar-example></radar-example>
<polar-area-example></polar-area-example>
<bubble-example></bubble-example>
</div>
</template>
<script>
import BarExample from './BarExample'
import LineExample from './LineExample'
import DoughnutExample from './DoughnutExample'
import PieExample from './PieExample'
import RadarExample from './RadarExample'
import PolarAreaExample from './PolarAreaExample'
import BubbleExample from './BubbleExample'
export default {
components: {
BarExample,
LineExample,
DoughnutExample,
PieExample,
RadarExample,
PolarAreaExample,
BubbleExample
}
}
</script>
<style>
.container {
max-width: 800px;
margin: 0 auto;
}
</style>

View File

@@ -11,6 +11,6 @@ export default BarChart.extend({
data: [40, 20, 12, 39, 10, 40, 39, 80, 40, 20, 12, 11] data: [40, 20, 12, 39, 10, 40, 39, 80, 40, 20, 12, 11]
} }
] ]
}) }, {responsive: true, maintainAspectRatio: false})
} }
}) })

View File

@@ -0,0 +1,52 @@
import BubbleChart from '../BaseCharts/Bubble'
export default BubbleChart.extend({
ready () {
this.render({
datasets: [
{
label: 'Data One',
backgroundColor: '#f87979',
data: [
{
x: 20,
y: 25,
r: 5
},
{
x: 40,
y: 10,
r: 10
},
{
x: 30,
y: 22,
r: 30
}
]
},
{
label: 'Data Two',
backgroundColor: '#7C8CF8',
data: [
{
x: 10,
y: 30,
r: 15
},
{
x: 20,
y: 20,
r: 10
},
{
x: 15,
y: 8,
r: 30
}
]
}
]
})
}
})

5
src/helpers/options.js Normal file
View File

@@ -0,0 +1,5 @@
import merge from 'lodash/fp/merge'
export function mergeOptions (obj, src) {
return merge(obj, src)
}

View File

@@ -4,6 +4,7 @@ import Line from './BaseCharts/Line'
import Pie from './BaseCharts/Pie' import Pie from './BaseCharts/Pie'
import PolarArea from './BaseCharts/PolarArea' import PolarArea from './BaseCharts/PolarArea'
import Radar from './BaseCharts/Radar' import Radar from './BaseCharts/Radar'
import Bubble from './BaseCharts/Bubble'
const VueCharts = { const VueCharts = {
Bar, Bar,
@@ -11,7 +12,8 @@ const VueCharts = {
Line, Line,
Pie, Pie,
PolarArea, PolarArea,
Radar Radar,
Bubble
} }
module.exports = VueCharts module.exports = VueCharts

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import BarChart from 'src/examples/BarExample'
describe('BarChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<bar-chart></bar-chart>',
components: { BarChart }
})
expect(vm.$el.querySelector('#bar-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import BubbleChart from 'src/examples/BubbleExample'
describe('BubbleChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<bubble-chart></bubble-chart>',
components: { BubbleChart }
})
expect(vm.$el.querySelector('#bubble-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import DoughnutChart from 'src/examples/DoughnutExample'
describe('DoughnutChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<doughnut-chart></doughnut-chart>',
components: { DoughnutChart }
})
expect(vm.$el.querySelector('#doughnut-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -1,12 +0,0 @@
import Vue from 'vue'
import Hello from 'src/components/Hello'
describe('Hello.vue', () => {
it('should render correct contents', () => {
const vm = new Vue({
template: '<div><hello></hello></div>',
components: { Hello }
}).$mount()
expect(vm.$el.querySelector('.hello h1').textContent).to.contain('Hello World!')
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import LineChart from 'src/examples/LineExample'
describe('LineChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<line-chart></line-chart>',
components: { LineChart }
})
expect(vm.$el.querySelector('#line-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import PieChart from 'src/examples/PieExample'
describe('PieChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<pie-chart></pie-chart>',
components: { PieChart }
})
expect(vm.$el.querySelector('#pie-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import PolarChart from 'src/examples/PolarAreaExample'
describe('PolarChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<polar-chart></polar-chart>',
components: { PolarChart }
})
expect(vm.$el.querySelector('#polar-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,17 @@
import Vue from 'vue'
import RadarChart from 'src/examples/RadarExample'
describe('RadarChart', () => {
it('should render a canvas', () => {
const vm = new Vue({
el: 'body',
replace: false,
template: '<radar-chart></radar-chart>',
components: { RadarChart }
})
expect(vm.$el.querySelector('#radar-chart')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('undefined')
expect(vm.$el.querySelector('canvas')).not.to.be.an('null')
expect(vm.$el.querySelector('canvas')).to.exist
})
})

View File

@@ -0,0 +1,30 @@
import { mergeOptions } from 'src/helpers/options'
describe('mergeOptions.js', () => {
const a = {
a: 'a',
b: 'a'
}
const b = {
a: 'b',
b: 'b'
}
const c = {
c: 'c'
}
it('should replace old a and b if a and b are new', () => {
let ab = mergeOptions(a, b)
expect(ab).to.have.property('a').and.to.equal('b')
expect(ab).to.have.property('b').and.to.equal('b')
})
it('should add c if c is new', () => {
let ac = mergeOptions(a, c)
expect(ac).to.have.property('a').and.to.equal('a')
expect(ac).to.have.property('b').and.to.equal('a')
expect(ac).to.have.property('c').and.to.equal('c')
})
})