mirror of
https://github.com/KevinMidboe/vue-chartjs.git
synced 2025-10-29 18:00:20 +00:00
Compare commits
45 Commits
v3.0.2
...
fix/depend
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92ca2f7295 | ||
|
|
1e046e828e | ||
|
|
256eec9518 | ||
|
|
d08666f2ad | ||
|
|
6433a0a4a5 | ||
|
|
081b97028b | ||
|
|
eb42bd78ea | ||
|
|
9f9aa23a69 | ||
|
|
ef52d98fdd | ||
|
|
4cec21ed2d | ||
|
|
33da30021b | ||
|
|
1c2be6a83e | ||
|
|
274717a237 | ||
|
|
bdeac75422 | ||
|
|
ebcab9f2f8 | ||
|
|
88b16e89d4 | ||
|
|
71b50df77a | ||
|
|
4297872885 | ||
|
|
96adf9eab3 | ||
|
|
b80b07efd8 | ||
|
|
84f2934f74 | ||
|
|
ee5be86e5b | ||
|
|
3907c5a378 | ||
|
|
2274cfab22 | ||
|
|
66533c09a9 | ||
|
|
281c847070 | ||
|
|
e7be94e041 | ||
|
|
9ef0dedeb0 | ||
|
|
4347fe906e | ||
|
|
662329846e | ||
|
|
ecae747ba3 | ||
|
|
75bfa5ccbc | ||
|
|
8f91703e9f | ||
|
|
ac5d4d824c | ||
|
|
db0040e613 | ||
|
|
3b46bc8f03 | ||
|
|
39ff839d92 | ||
|
|
0506b4ee35 | ||
|
|
072724fc6f | ||
|
|
dd9a5b855d | ||
|
|
5486560257 | ||
|
|
ae13d71081 | ||
|
|
1902bf0b0e | ||
|
|
b0ad387856 | ||
|
|
b7074e428f |
@@ -15,5 +15,8 @@ module.exports = {
|
|||||||
'arrow-parens': 0,
|
'arrow-parens': 0,
|
||||||
// allow debugger during development
|
// allow debugger during development
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
|
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"LIB_VERSION": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,3 +1,22 @@
|
|||||||
|
# Change Log
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
<a name="3.1.0"></a>
|
||||||
|
# [3.1.0](https://github.com/apertureless/vue-chartjs/compare/v3.0.2...v3.1.0) (2018-01-12)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **mixins:** Check for chartjs instance before rendering chart ([39ff839](https://github.com/apertureless/vue-chartjs/commit/39ff839)), closes [#288](https://github.com/apertureless/vue-chartjs/issues/288)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **charts:** Remove default styling ([ac5d4d8](https://github.com/apertureless/vue-chartjs/commit/ac5d4d8))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
## [v3.0.1](https://github.com/apertureless/vue-chartjs/tree/v3.0.1) (2017-11-06)
|
## [v3.0.1](https://github.com/apertureless/vue-chartjs/tree/v3.0.1) (2017-11-06)
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -33,7 +33,8 @@ If you're looking for v1 check this [branch](https://github.com/apertureless/vue
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
Simply run `yarn add vue-chartjs chart.js`
|
- **yarn** install: `yarn add vue-chartjs chart.js`
|
||||||
|
- **npm** install: `npm install vue-chartjs chart.js --save`
|
||||||
|
|
||||||
Or if you want to use it directly in the browser add
|
Or if you want to use it directly in the browser add
|
||||||
|
|
||||||
@@ -72,11 +73,11 @@ Vue.component('line-chart', {
|
|||||||
|
|
||||||
If you're using Gulp, Browserify or Webpack 1 the entry is `vue-chartjs.js` which is __transpiled__ and __bundled__ UMD Module.
|
If you're using Gulp, Browserify or Webpack 1 the entry is `vue-chartjs.js` which is __transpiled__ and __bundled__ UMD Module.
|
||||||
|
|
||||||
However Chart.js is a `peerDependencies` so you have to install it separately. In most projects This way, you can have different versions of Chart.js then in this package.
|
However, Chart.js is a `peerDependencies` so you have to install it separately. In most projects This way, you can have different versions of Chart.js then in this package.
|
||||||
|
|
||||||
### Webpack 2
|
### Webpack 2
|
||||||
If you're using Webpack 2 it will automatically use the `jsnext:main` / `module` entry point. Which is `es/index.js`
|
If you're using Webpack 2 it will automatically use the `jsnext:main` / `module` entry point. Which is `es/index.js`
|
||||||
It is a __transpiled__ es version of the source. And is not __bundled__ to a module. This way you three shaking will work. Like in the bundled version, `Chart.js` is a `peerDependencies` and need to be installed.
|
It is a __transpiled__ es version of the source. And is not __bundled__ to a module. This way your tree shaking will work. Like in the bundled version, `Chart.js` is a `peerDependencies` and need to be installed.
|
||||||
|
|
||||||
|
|
||||||
## How to use
|
## How to use
|
||||||
@@ -122,7 +123,7 @@ import CommitChart from 'path/to/component/CommitChart'
|
|||||||
|
|
||||||
## Another Example with options
|
## Another Example with options
|
||||||
|
|
||||||
You can overwrite the default chart options. Just pass the options object as a second paramenter to the render method
|
You can overwrite the default chart options. Just pass the options object as a second parameter to the render method
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// MonthlyIncome.vue
|
// MonthlyIncome.vue
|
||||||
@@ -157,7 +158,7 @@ export default {
|
|||||||
## Reactivity
|
## Reactivity
|
||||||
|
|
||||||
Chart.js does not update or re-render the chart if new data is passed.
|
Chart.js does not update or re-render the chart if new data is passed.
|
||||||
However you can simply implement this on your own or use one of the two mixins which are included.
|
However, you can simply implement this on your own or use one of the two mixins which are included.
|
||||||
|
|
||||||
- `reactiveProp`
|
- `reactiveProp`
|
||||||
- `reactiveData`
|
- `reactiveData`
|
||||||
@@ -165,7 +166,11 @@ However you can simply implement this on your own or use one of the two mixins w
|
|||||||
Both are included in the `mixins` module.
|
Both are included in the `mixins` module.
|
||||||
|
|
||||||
The mixins automatically create `chartData` as a prop or data. And add a watcher. If data has changed, the chart will update.
|
The mixins automatically create `chartData` as a prop or data. And add a watcher. If data has changed, the chart will update.
|
||||||
However keep in mind the limitations of vue and javascript for mutations on arrays and objects. More info [here](http://vue-chartjs.org/#/home?id=reactive-data)
|
However, keep in mind the limitations of vue and javascript for mutations on arrays and objects.
|
||||||
|
**It is important that you pass your options in a local variable named `options`!**
|
||||||
|
The reason is that if the mixin re-renders the chart it calls `this.renderChart(this.chartData, this.options`)` so don't pass in the options object directly or it will be ignored.
|
||||||
|
|
||||||
|
More info [here](http://vue-chartjs.org/#/home?id=reactive-data)
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// MonthlyIncome.js
|
// MonthlyIncome.js
|
||||||
@@ -183,7 +188,7 @@ export default {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Mixins module
|
### Mixins module
|
||||||
The `mixins` module is included in the `VueCharts` module and as a seperate module.
|
The `mixins` module is included in the `VueCharts` module and as a separate module.
|
||||||
Some ways to import them:
|
Some ways to import them:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@@ -229,6 +234,10 @@ export default {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Single File Components
|
||||||
|
|
||||||
|
You can create your components in Vues single file components. However it is important that you **do not** have the `<template></template>` included. Because Vue can't merge templates. And the template is included in the mixin. If you leave the template tag in your component, it will overwrite the one which comes from the base chart and you will have a blank screen.
|
||||||
|
|
||||||
## Available Charts
|
## Available Charts
|
||||||
|
|
||||||
### Bar Chart
|
### Bar Chart
|
||||||
@@ -285,7 +294,7 @@ npm run e2e
|
|||||||
npm test
|
npm test
|
||||||
```
|
```
|
||||||
|
|
||||||
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
For a detailed explanation of how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
const webpack = require('webpack')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const utils = require('./utils')
|
const utils = require('./utils')
|
||||||
const config = require('../config')
|
const config = require('../config')
|
||||||
const vueLoaderConfig = require('./vue-loader.conf')
|
const vueLoaderConfig = require('./vue-loader.conf')
|
||||||
|
const npmCfg = require('../package.json')
|
||||||
|
|
||||||
function resolve (dir) {
|
function resolve (dir) {
|
||||||
return path.join(__dirname, '..', dir)
|
return path.join(__dirname, '..', dir)
|
||||||
@@ -72,5 +74,10 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
plugins: [
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
LIB_VERSION: JSON.stringify(npmCfg.version)
|
||||||
|
})
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ module.exports = {
|
|||||||
entry: {
|
entry: {
|
||||||
'vue-chartjs': './src/index.js'
|
'vue-chartjs': './src/index.js'
|
||||||
},
|
},
|
||||||
|
devtool: 'source-map',
|
||||||
output: {
|
output: {
|
||||||
filename: './dist/[name].js',
|
filename: './dist/[name].js',
|
||||||
library: 'VueChartJs',
|
library: 'VueChartJs',
|
||||||
@@ -82,17 +83,12 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
delete module.exports.devtool
|
// delete module.exports.devtool
|
||||||
module.exports.plugins = [
|
module.exports.plugins = [
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
'process.env': {
|
'process.env': {
|
||||||
NODE_ENV: '"production"'
|
NODE_ENV: '"production"'
|
||||||
}
|
}
|
||||||
}),
|
|
||||||
new webpack.optimize.UglifyJsPlugin({
|
|
||||||
compress: {
|
|
||||||
warnings: false
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
4
build/webpack.release.min.js
vendored
4
build/webpack.release.min.js
vendored
@@ -3,12 +3,10 @@ var webpack = require('webpack')
|
|||||||
|
|
||||||
config.output.filename = config.output.filename.replace(/\.js$/, '.min.js')
|
config.output.filename = config.output.filename.replace(/\.js$/, '.min.js')
|
||||||
|
|
||||||
delete config.devtool
|
|
||||||
|
|
||||||
config.plugins = [
|
config.plugins = [
|
||||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||||
new webpack.optimize.UglifyJsPlugin({
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
sourceMap: false,
|
sourceMap: true,
|
||||||
compress: {
|
compress: {
|
||||||
warnings: false
|
warnings: false
|
||||||
}
|
}
|
||||||
|
|||||||
3331
dist/vue-chartjs.js
vendored
3331
dist/vue-chartjs.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/vue-chartjs.js.map
vendored
2
dist/vue-chartjs.js.map
vendored
File diff suppressed because one or more lines are too long
3
dist/vue-chartjs.min.js
vendored
3
dist/vue-chartjs.min.js
vendored
File diff suppressed because one or more lines are too long
1
dist/vue-chartjs.min.js.map
vendored
Normal file
1
dist/vue-chartjs.min.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -6,7 +6,7 @@ search: ja
|
|||||||
**vue-chartjs** は [Chart.js](https://github.com/chartjs/Chart.js) をvueで使用するためのラッパーです。 再利用可能なチャートコンポーネントを簡単に作成できます。
|
**vue-chartjs** は [Chart.js](https://github.com/chartjs/Chart.js) をvueで使用するためのラッパーです。 再利用可能なチャートコンポーネントを簡単に作成できます。
|
||||||
|
|
||||||
## イントロ
|
## イントロ
|
||||||
`vue-chartjs` vueの中であまり面倒なくchart.jsを使うことができます。 シンプルなチャートをできるだけ早く実行したいという人に最適です。
|
`vue-chartjs` vueの中であまり面倒ことがなくchart.jsを使うことができます。 シンプルなチャートをできるだけ早く実行したいという人に最適です。
|
||||||
|
|
||||||
chart.jsの基本ロジックを抽象化していますが、公開されたchart.jsのオブジェクト使用して柔軟にカスタマイズできます。
|
chart.jsの基本ロジックを抽象化していますが、公開されたchart.jsのオブジェクト使用して柔軟にカスタマイズできます。
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ export default {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
renderChart()メソッドに2つの引数を渡すことができます:
|
`renderChart()`メソッドに2つの引数を渡すことができます:
|
||||||
|
|
||||||
- Data object
|
- Data object
|
||||||
- Options object
|
- Options object
|
||||||
@@ -64,16 +64,18 @@ renderChart()メソッドに2つの引数を渡すことができます:
|
|||||||
```
|
```
|
||||||
|
|
||||||
詳細については、[Chart.js](http://www.chartjs.org/docs/#chart-configuration-chart-data) のドキュメントをご覧ください。
|
詳細については、[Chart.js](http://www.chartjs.org/docs/#chart-configuration-chart-data) のドキュメントをご覧ください。
|
||||||
|
|
||||||
## プロパティ
|
## プロパティ
|
||||||
|
|
||||||
BaseChartsには基本プロパティがいくつか定義されています。 extendされたときにそれらは明示的に表示されていませんが、使用するときに上書きして設定することができます。
|
BaseChartsには基本プロパティがいくつか定義されています。 `extend()`したときにそれらは *表示されていません* が、使用するときに上書きして設定することができます。
|
||||||
|
|
||||||
| プロパティ | 説明 |
|
| プロパティ | 説明 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| width | chartの表示幅 |
|
| width | chartの表示幅 |
|
||||||
| height | chartの表示高さ |
|
| height | chartの表示高さ |
|
||||||
| chart-id | canvas要素のid |
|
| chart-id | canvas要素のid |
|
||||||
|
| css-classes | 周囲のdivのCSSクラスの文字列 |
|
||||||
|
| styles | 周囲のdivコンテナのCSSスタイルを持つオブジェクト |
|
||||||
|
|
||||||
## 実装例
|
## 実装例
|
||||||
|
|
||||||
@@ -115,7 +117,7 @@ export default {
|
|||||||
```
|
```
|
||||||
|
|
||||||
<p class="warning">
|
<p class="warning">
|
||||||
`width` と `height` を反映させるためには、 `responsive:false` を設定しなければならないことに注意してください。
|
固定値の`width` と `height` を反映させるためには、 `responsive:false` を設定しなければならないことに注意してください。
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
### コンポーネント内のローカルデータを使用する場合
|
### コンポーネント内のローカルデータを使用する場合
|
||||||
@@ -147,8 +149,7 @@ export default {
|
|||||||
|
|
||||||
### コンポーネントの再利用
|
### コンポーネントの再利用
|
||||||
|
|
||||||
チャートコンポーネントを再利用可能にしたい場合は、ラッパーを使用することをお勧めします。このようにすると、チャートコンポーネントはデータ表示とロジックを含むラッパーコンポーネントに対してのみ応答可能です。単一ページアプリケーションを実行している場合や、laravelで統合されている場合は、異なった方法があります。
|
チャートコンポーネントを再利用可能にしたい場合は、ラッパーを使用することがベストです。このようにしてチャートコンポーネントは純粋なデータ表示と、背後にあるロジックのラッパーとしてのみ責務を負います。単一ページアプリケーションを実行している場合や、たとえば laravel などで統合されている場合は、異なった方法があります。
|
||||||
|
|
||||||
|
|
||||||
## リアクティブデータ
|
## リアクティブデータ
|
||||||
|
|
||||||
@@ -182,7 +183,8 @@ export default {
|
|||||||
mixins: [reactiveProp],
|
mixins: [reactiveProp],
|
||||||
props: ['options'],
|
props: ['options'],
|
||||||
mounted () {
|
mounted () {
|
||||||
// this.chartData is created in the mixin
|
// this.chartData is created in the mixin.
|
||||||
|
// If you want to pass options please create a local options object
|
||||||
this.renderChart(this.chartData, this.options)
|
this.renderChart(this.chartData, this.options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,7 +261,24 @@ export default {
|
|||||||
|
|
||||||
## Chart.js オブジェクト
|
## Chart.js オブジェクト
|
||||||
|
|
||||||
場合によっては、chart.jsをより詳細に制御する必要があります。Chart.jsインスタンスには `this.$data._chart` を使ってアクセスします。
|
時にはchart.jsをより詳細に制御する必要があります。そのためには `this.$data._chart` を使ってChart.jsインスタンスにアクセスすることができます。
|
||||||
|
|
||||||
|
## インライン プラグイン
|
||||||
|
|
||||||
|
Chart.jsでは、グローバルプラグインとインラインプラグインを定義できます。[Chart.js docs](http://www.chartjs.org/docs/latest/developers/plugins.html)で記載されているのようなグローバルプラグインは、 `vue-chartjs ` で問題なく動作しています。
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
mounted () {
|
||||||
|
this.addPlugin({
|
||||||
|
id: 'my-plugin',
|
||||||
|
beforeInit: function (chart) {
|
||||||
|
....
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 利用可能なグラフ
|
## 利用可能なグラフ
|
||||||
|
|
||||||
@@ -293,6 +312,11 @@ export default {
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
### 散布図
|
||||||
|
|
||||||
|
このチャートは、他のものとは異なるデータ構造を持っています。現在のところ、reactive mixins はこのチャートタイプでは機能していません。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## ビルド方法の違い
|
## ビルド方法の違い
|
||||||
あなたが使用するビルドツールに依存した3つの異なるエントリーポイントがあります。 依存するライブラリは一緒にバンドルされているか、または peerDependency として指定します。
|
あなたが使用するビルドツールに依存した3つの異なるエントリーポイントがあります。 依存するライブラリは一緒にバンドルされているか、または peerDependency として指定します。
|
||||||
@@ -320,3 +344,13 @@ Vue.jsとChart.jsは `peerDependencies` なので別にインストールする
|
|||||||
|
|
||||||
### Webpack 2
|
### Webpack 2
|
||||||
Webpack 2を使用している場合、 `jsnext:main` または `module` に`es/index.js` を指定します。 ソースファイルは __トランスパイル__ されます。またmoduleには __バンドル__ されません。このようにすると `tree shaking` が動作します。バンドル版のように、`peerDependencies` で指定された `Vue.js` と `Chart.js` はインストールする必要があります。
|
Webpack 2を使用している場合、 `jsnext:main` または `module` に`es/index.js` を指定します。 ソースファイルは __トランスパイル__ されます。またmoduleには __バンドル__ されません。このようにすると `tree shaking` が動作します。バンドル版のように、`peerDependencies` で指定された `Vue.js` と `Chart.js` はインストールする必要があります。
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
以下に `vue-chartjs` の使い方に関するチュートリアルのようなリソースがあります
|
||||||
|
|
||||||
|
- [Using vue-chartjs with WordPress](https://medium.com/@apertureless/wordpress-vue-and-chart-js-6b61493e289f)
|
||||||
|
- [Create stunning Charts with Vue and Chart.js](https://hackernoon.com/creating-stunning-charts-with-vue-js-and-chart-js-28af584adc0a)
|
||||||
|
- [Let’s Build a Web App with Vue, Chart.js and an API Part I](https://hackernoon.com/lets-build-a-web-app-with-vue-chart-js-and-an-api-544eb81c4b44)
|
||||||
|
- [Let’s Build a Web App with Vue, Chart.js and an API Part II](https://hackernoon.com/lets-build-a-web-app-with-vue-chart-js-and-an-api-part-ii-39781b1d5acf)
|
||||||
|
- [Build a realtime chart with VueJS and Pusher](https://blog.pusher.com/build-realtime-chart-with-vuejs-pusher/)
|
||||||
10646
package-lock.json
generated
10646
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vue-chartjs",
|
"name": "vue-chartjs",
|
||||||
"version": "3.0.2",
|
"version": "3.2.1",
|
||||||
"description": "Vue.js wrapper for chart.js for creating beautiful charts.",
|
"description": "Vue.js wrapper for chart.js for creating beautiful charts.",
|
||||||
"author": "Jakub Juszczak <jakub@posteo.de>",
|
"author": "Jakub Juszczak <jakub@posteo.de>",
|
||||||
"homepage": "http://vue-chartjs.org",
|
"homepage": "http://vue-chartjs.org",
|
||||||
@@ -53,26 +53,23 @@
|
|||||||
"e2e": "node test/e2e/runner.js",
|
"e2e": "node test/e2e/runner.js",
|
||||||
"test": "npm run unit",
|
"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 test/e2e/specs",
|
||||||
"release": "webpack --progress --hide-modules --config ./build/webpack.release.js && NODE_ENV=production webpack --progress --hide-modules --config ./build/webpack.release.min.js",
|
"release": "cross-env NODE_ENV=production webpack --progress --hide-modules --config ./build/webpack.release.js && cross-env NODE_ENV=production webpack --progress --hide-modules --config ./build/webpack.release.min.js",
|
||||||
"prepublishOnly": "yarn run lint && yarn run test && yarn run build"
|
"prepublishOnly": "yarn run lint && yarn run test && yarn run build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
|
||||||
"lodash.merge": "^4.6.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"chart.js": "2.7.x"
|
"chart.js": "2.7.x"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.0.0-beta.31",
|
"@babel/cli": "^7.0.0-beta.42",
|
||||||
"@babel/core": "^7.0.0-beta.31",
|
"@babel/core": "^7.0.0-beta.42",
|
||||||
"@babel/preset-env": "^7.0.0-beta.31",
|
"@babel/preset-env": "^7.0.0-beta.42",
|
||||||
"@babel/preset-stage-2": "^7.0.0-beta.31",
|
"@babel/preset-stage-2": "^7.0.0-beta.42",
|
||||||
"babel-loader": "8.0.0-beta.0",
|
"babel-loader": "8.0.0-beta.0",
|
||||||
"chai": "^3.5.0",
|
"chai": "^3.5.0",
|
||||||
"chart.js": "2.7.0",
|
"chart.js": "2.7.2",
|
||||||
"chromedriver": "^2.28.0",
|
"chromedriver": "^2.28.0",
|
||||||
"connect-history-api-fallback": "^1.1.0",
|
"connect-history-api-fallback": "^1.1.0",
|
||||||
"cross-env": "^3.2.4",
|
"cross-env": "^5.1.1",
|
||||||
"cross-spawn": "^5.1.0",
|
"cross-spawn": "^5.1.0",
|
||||||
"css-loader": "^0.28.0",
|
"css-loader": "^0.28.0",
|
||||||
"eslint": "^3.19.0",
|
"eslint": "^3.19.0",
|
||||||
@@ -108,7 +105,6 @@
|
|||||||
"karma-webpack": "2",
|
"karma-webpack": "2",
|
||||||
"lolex": "^1.6.0",
|
"lolex": "^1.6.0",
|
||||||
"mocha": "^3.1.0",
|
"mocha": "^3.1.0",
|
||||||
"nightwatch": "^0.9.14",
|
|
||||||
"opn": "^5.1.0",
|
"opn": "^5.1.0",
|
||||||
"ora": "^1.2.0",
|
"ora": "^1.2.0",
|
||||||
"phantomjs-prebuilt": "^2.1.13",
|
"phantomjs-prebuilt": "^2.1.13",
|
||||||
@@ -118,12 +114,12 @@
|
|||||||
"sinon": "^2.1.0",
|
"sinon": "^2.1.0",
|
||||||
"sinon-chai": "^2.9.0",
|
"sinon-chai": "^2.9.0",
|
||||||
"url-loader": "^0.5.8",
|
"url-loader": "^0.5.8",
|
||||||
"vue": "2.5.2",
|
"vue": "2.5.16",
|
||||||
"vue-hot-reload-api": "2.1.0",
|
"vue-hot-reload-api": "2.3.0",
|
||||||
"vue-html-loader": "^1.2.4",
|
"vue-html-loader": "^1.2.4",
|
||||||
"vue-loader": "^13.3.0",
|
"vue-loader": "^14.2.1",
|
||||||
"vue-style-loader": "3.0.1",
|
"vue-style-loader": "4.0.2",
|
||||||
"vue-template-compiler": "2.5.2",
|
"vue-template-compiler": "2.5.16",
|
||||||
"webpack": "^3.7.1",
|
"webpack": "^3.7.1",
|
||||||
"webpack-dev-middleware": "^1.10.1",
|
"webpack-dev-middleware": "^1.10.1",
|
||||||
"webpack-hot-middleware": "^2.17.1",
|
"webpack-hot-middleware": "^2.17.1",
|
||||||
|
|||||||
104
src/BaseCharts.js
Normal file
104
src/BaseCharts.js
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
import Chart from 'chart.js'
|
||||||
|
|
||||||
|
function generateChart (chartId, chartType) {
|
||||||
|
return {
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
'div', {
|
||||||
|
style: this.styles,
|
||||||
|
class: this.cssClasses
|
||||||
|
},
|
||||||
|
[
|
||||||
|
createElement(
|
||||||
|
'canvas', {
|
||||||
|
attrs: {
|
||||||
|
id: this.chartId,
|
||||||
|
width: this.width,
|
||||||
|
height: this.height
|
||||||
|
},
|
||||||
|
ref: 'canvas'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
chartId: {
|
||||||
|
default: chartId,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
width: {
|
||||||
|
default: 400,
|
||||||
|
type: Number
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
default: 400,
|
||||||
|
type: Number
|
||||||
|
},
|
||||||
|
cssClasses: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
styles: {
|
||||||
|
type: Object
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
type: Array,
|
||||||
|
default () {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
_chart: null,
|
||||||
|
_plugins: this.plugins
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
addPlugin (plugin) {
|
||||||
|
this.$data._plugins.push(plugin)
|
||||||
|
},
|
||||||
|
renderChart (data, options) {
|
||||||
|
this.$data._chart = new Chart(
|
||||||
|
this.$refs.canvas.getContext('2d'), {
|
||||||
|
type: chartType,
|
||||||
|
data: data,
|
||||||
|
options: options,
|
||||||
|
plugins: this.$data._plugins
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
beforeDestroy () {
|
||||||
|
if (this.$data._chart) {
|
||||||
|
this.$data._chart.destroy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Bar = generateChart('bar-chart', 'bar')
|
||||||
|
export const HorizontalBar = generateChart('horizontalbar-chart', 'horizontalBar')
|
||||||
|
export const Doughnut = generateChart('doughnut-chart', 'doughnut')
|
||||||
|
export const Line = generateChart('line-chart', 'line')
|
||||||
|
export const Pie = generateChart('pie-chart', 'pie')
|
||||||
|
export const PolarArea = generateChart('polar-chart', 'polarArea')
|
||||||
|
export const Radar = generateChart('radar-chart', 'radar')
|
||||||
|
export const Bubble = generateChart('bubble-chart', 'bubble')
|
||||||
|
export const Scatter = generateChart('scatter-chart', 'scatter')
|
||||||
|
|
||||||
|
export default {
|
||||||
|
Bar,
|
||||||
|
HorizontalBar,
|
||||||
|
Doughnut,
|
||||||
|
Line,
|
||||||
|
Pie,
|
||||||
|
PolarArea,
|
||||||
|
Radar,
|
||||||
|
Bubble,
|
||||||
|
Scatter
|
||||||
|
}
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'bar-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
scales: {
|
|
||||||
yAxes: [{
|
|
||||||
ticks: {
|
|
||||||
beginAtZero: true
|
|
||||||
},
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [ {
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
categoryPercentage: 0.5,
|
|
||||||
barPercentage: 0.2
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'bar',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'bubble-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
scales: {
|
|
||||||
yAxes: [{
|
|
||||||
ticks: {
|
|
||||||
beginAtZero: true
|
|
||||||
},
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [ {
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
categoryPercentage: 0.5,
|
|
||||||
barPercentage: 0.2
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'bubble',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'doughnut-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'doughnut',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'horizontalbar-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
scales: {
|
|
||||||
yAxes: [{
|
|
||||||
ticks: {
|
|
||||||
beginAtZero: true
|
|
||||||
},
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [ {
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
categoryPercentage: 0.5,
|
|
||||||
barPercentage: 0.2
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options, type) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'horizontalBar',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'line-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
scales: {
|
|
||||||
yAxes: [{
|
|
||||||
ticks: {
|
|
||||||
beginAtZero: true
|
|
||||||
},
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
xAxes: [ {
|
|
||||||
gridLines: {
|
|
||||||
display: false
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'line',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'pie-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'pie',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'polar-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'polarArea',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'radar-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'radar',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
import Chart from 'chart.js'
|
|
||||||
import { mergeOptions } from '../helpers/options'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
render: function (createElement) {
|
|
||||||
return createElement(
|
|
||||||
'div', {
|
|
||||||
style: this.styles,
|
|
||||||
class: this.cssClasses
|
|
||||||
},
|
|
||||||
[
|
|
||||||
createElement(
|
|
||||||
'canvas', {
|
|
||||||
attrs: {
|
|
||||||
id: this.chartId,
|
|
||||||
width: this.width,
|
|
||||||
height: this.height
|
|
||||||
},
|
|
||||||
ref: 'canvas'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
chartId: {
|
|
||||||
default: 'scatter-chart',
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
default: 400,
|
|
||||||
type: Number
|
|
||||||
},
|
|
||||||
cssClasses: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
styles: {
|
|
||||||
type: Object
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
_chart: null,
|
|
||||||
defaultOptions: {
|
|
||||||
scales: {
|
|
||||||
xAxes: [{
|
|
||||||
type: 'linear',
|
|
||||||
position: 'bottom'
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
plugins: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
addPlugin (plugin) {
|
|
||||||
this.plugins.push(plugin)
|
|
||||||
},
|
|
||||||
renderChart (data, options) {
|
|
||||||
let chartOptions = mergeOptions(this.defaultOptions, options)
|
|
||||||
|
|
||||||
this.$data._chart = new Chart(
|
|
||||||
this.$refs.canvas.getContext('2d'), {
|
|
||||||
type: 'scatter',
|
|
||||||
data: data,
|
|
||||||
options: chartOptions,
|
|
||||||
plugins: this.plugins
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy () {
|
|
||||||
if (this.$data._chart) {
|
|
||||||
this.$data._chart.destroy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,11 @@
|
|||||||
<bar-example></bar-example>
|
<bar-example></bar-example>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="Chart">
|
||||||
|
<h1 style="text-align:center;">Horizontal Barchart</h1>
|
||||||
|
<horizontal-bar-example></horizontal-bar-example>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="Chart">
|
<div class="Chart">
|
||||||
<h1 style="text-align:center;">Barchart with reactive mixing for live data</h1>
|
<h1 style="text-align:center;">Barchart with reactive mixing for live data</h1>
|
||||||
<reactive-example></reactive-example>
|
<reactive-example></reactive-example>
|
||||||
@@ -63,6 +68,7 @@
|
|||||||
import ReactiveExample from './ReactiveExample'
|
import ReactiveExample from './ReactiveExample'
|
||||||
import ReactivePropExample from './ReactivePropExample'
|
import ReactivePropExample from './ReactivePropExample'
|
||||||
import ScatterExample from './ScatterExample'
|
import ScatterExample from './ScatterExample'
|
||||||
|
import HorizontalBarExample from './HorizontalBarExample'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -75,7 +81,8 @@
|
|||||||
BubbleExample,
|
BubbleExample,
|
||||||
ReactiveExample,
|
ReactiveExample,
|
||||||
ReactivePropExample,
|
ReactivePropExample,
|
||||||
ScatterExample
|
ScatterExample,
|
||||||
|
HorizontalBarExample
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Bar from '../BaseCharts/Bar'
|
import { Bar } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Bar,
|
extends: Bar,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Bubble from '../BaseCharts/Bubble'
|
import { Bubble } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Bubble,
|
extends: Bubble,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Doughnut from '../BaseCharts/Doughnut'
|
import { Doughnut } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Doughnut,
|
extends: Doughnut,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import HorizontalBar from '../BaseCharts/HorizontalBar'
|
import { HorizontalBar } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: HorizontalBar,
|
extends: HorizontalBar,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Line from '../BaseCharts/Line'
|
import { Line } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Line,
|
extends: Line,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Pie from '../BaseCharts/Pie'
|
import { Pie } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Pie,
|
extends: Pie,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import PolarArea from '../BaseCharts/PolarArea'
|
import { PolarArea } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: PolarArea,
|
extends: PolarArea,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Radar from '../BaseCharts/Radar'
|
import { Radar } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Radar,
|
extends: Radar,
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
import Bar from '../BaseCharts/Bar'
|
import { Bar } from '../BaseCharts'
|
||||||
import reactiveData from '../mixins/reactiveData'
|
import { reactiveData } from '../mixins'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Bar,
|
extends: Bar,
|
||||||
mixins: [reactiveData],
|
mixins: [reactiveData],
|
||||||
data () {
|
data: () => ({
|
||||||
return {
|
chartData: '',
|
||||||
chartData: ''
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
maintainAspectRatio: false
|
||||||
}
|
}
|
||||||
},
|
}),
|
||||||
created () {
|
created () {
|
||||||
this.fillData()
|
this.fillData()
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted () {
|
mounted () {
|
||||||
this.renderChart(this.chartData, {responsive: true, maintainAspectRatio: false})
|
this.renderChart(this.chartData, this.options)
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
this.fillData()
|
this.fillData()
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
import Bar from '../BaseCharts/Bar'
|
import { Bar } from '../BaseCharts'
|
||||||
import reactiveProp from '../mixins/reactiveProp'
|
import { reactiveProp } from '../mixins'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Bar,
|
extends: Bar,
|
||||||
mixins: [reactiveProp],
|
mixins: [reactiveProp],
|
||||||
|
data: () => ({
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
maintainAspectRatio: false
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
mounted () {
|
mounted () {
|
||||||
this.renderChart(this.chartData, {responsive: true, maintainAspectRatio: false})
|
this.renderChart(this.chartData, this.options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Scatter from '../BaseCharts/Scatter'
|
import { Scatter } from '../BaseCharts'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: Scatter,
|
extends: Scatter,
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
import merge from 'lodash.merge'
|
|
||||||
|
|
||||||
export function mergeOptions (obj, src) {
|
|
||||||
return merge(obj, src)
|
|
||||||
}
|
|
||||||
23
src/index.js
23
src/index.js
@@ -1,17 +1,18 @@
|
|||||||
import Bar from './BaseCharts/Bar'
|
|
||||||
import HorizontalBar from './BaseCharts/HorizontalBar'
|
|
||||||
import Doughnut from './BaseCharts/Doughnut'
|
|
||||||
import Line from './BaseCharts/Line'
|
|
||||||
import Pie from './BaseCharts/Pie'
|
|
||||||
import PolarArea from './BaseCharts/PolarArea'
|
|
||||||
import Radar from './BaseCharts/Radar'
|
|
||||||
import Bubble from './BaseCharts/Bubble'
|
|
||||||
import Scatter from './BaseCharts/Scatter'
|
|
||||||
import mixins from './mixins/index.js'
|
import mixins from './mixins/index.js'
|
||||||
import npmCfg from '../package.json'
|
|
||||||
|
import {
|
||||||
|
Bar,
|
||||||
|
HorizontalBar,
|
||||||
|
Doughnut,
|
||||||
|
Line,
|
||||||
|
Pie,
|
||||||
|
PolarArea,
|
||||||
|
Radar,
|
||||||
|
Bubble,
|
||||||
|
Scatter
|
||||||
|
} from './BaseCharts'
|
||||||
|
|
||||||
const VueCharts = {
|
const VueCharts = {
|
||||||
version: npmCfg.version,
|
|
||||||
Bar,
|
Bar,
|
||||||
HorizontalBar,
|
HorizontalBar,
|
||||||
Doughnut,
|
Doughnut,
|
||||||
|
|||||||
@@ -1,5 +1,89 @@
|
|||||||
import reactiveData from './reactiveData.js'
|
function dataHandler (newData, oldData) {
|
||||||
import reactiveProp from './reactiveProp.js'
|
if (oldData) {
|
||||||
|
let chart = this.$data._chart
|
||||||
|
|
||||||
|
// Get new and old DataSet Labels
|
||||||
|
let newDatasetLabels = newData.datasets.map((dataset) => {
|
||||||
|
return dataset.label
|
||||||
|
})
|
||||||
|
|
||||||
|
let oldDatasetLabels = oldData.datasets.map((dataset) => {
|
||||||
|
return dataset.label
|
||||||
|
})
|
||||||
|
|
||||||
|
// Stringify 'em for easier compare
|
||||||
|
const oldLabels = JSON.stringify(oldDatasetLabels)
|
||||||
|
const newLabels = JSON.stringify(newDatasetLabels)
|
||||||
|
|
||||||
|
// Check if Labels are equal and if dataset length is equal
|
||||||
|
if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) {
|
||||||
|
newData.datasets.forEach((dataset, i) => {
|
||||||
|
// Get new and old dataset keys
|
||||||
|
const oldDatasetKeys = Object.keys(oldData.datasets[i])
|
||||||
|
const newDatasetKeys = Object.keys(dataset)
|
||||||
|
|
||||||
|
// Get keys that aren't present in the new data
|
||||||
|
const deletionKeys = oldDatasetKeys.filter((key) => {
|
||||||
|
return key !== '_meta' && newDatasetKeys.indexOf(key) === -1
|
||||||
|
})
|
||||||
|
|
||||||
|
// Remove outdated key-value pairs
|
||||||
|
deletionKeys.forEach((deletionKey) => {
|
||||||
|
delete chart.data.datasets[i][deletionKey]
|
||||||
|
})
|
||||||
|
|
||||||
|
// Update attributes individually to avoid re-rendering the entire chart
|
||||||
|
for (const attribute in dataset) {
|
||||||
|
if (dataset.hasOwnProperty(attribute)) {
|
||||||
|
chart.data.datasets[i][attribute] = dataset[attribute]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (newData.hasOwnProperty('labels')) {
|
||||||
|
chart.data.labels = newData.labels
|
||||||
|
}
|
||||||
|
if (newData.hasOwnProperty('xLabels')) {
|
||||||
|
chart.data.xLabels = newData.xLabels
|
||||||
|
}
|
||||||
|
if (newData.hasOwnProperty('yLabels')) {
|
||||||
|
chart.data.yLabels = newData.yLabels
|
||||||
|
}
|
||||||
|
chart.update()
|
||||||
|
} else {
|
||||||
|
chart.destroy()
|
||||||
|
this.renderChart(this.chartData, this.options)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.$data._chart) {
|
||||||
|
this.$data._chart.destroy()
|
||||||
|
}
|
||||||
|
this.renderChart(this.chartData, this.options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const reactiveData = {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
chartData: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
'chartData': dataHandler
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const reactiveProp = {
|
||||||
|
props: {
|
||||||
|
chartData: {
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
'chartData': dataHandler
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
reactiveData,
|
reactiveData,
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
chartData: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
'chartData': {
|
|
||||||
handler (newData, oldData) {
|
|
||||||
if (oldData) {
|
|
||||||
let chart = this.$data._chart
|
|
||||||
|
|
||||||
// Get new and old DataSet Labels
|
|
||||||
let newDatasetLabels = newData.datasets.map((dataset) => {
|
|
||||||
return dataset.label
|
|
||||||
})
|
|
||||||
|
|
||||||
let oldDatasetLabels = oldData.datasets.map((dataset) => {
|
|
||||||
return dataset.label
|
|
||||||
})
|
|
||||||
|
|
||||||
// Stringify 'em for easier compare
|
|
||||||
const oldLabels = JSON.stringify(oldDatasetLabels)
|
|
||||||
const newLabels = JSON.stringify(newDatasetLabels)
|
|
||||||
|
|
||||||
// Check if Labels are equal and if dataset length is equal
|
|
||||||
if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) {
|
|
||||||
newData.datasets.forEach((dataset, i) => {
|
|
||||||
// Get new and old dataset keys
|
|
||||||
const oldDatasetKeys = Object.keys(oldData.datasets[i])
|
|
||||||
const newDatasetKeys = Object.keys(dataset)
|
|
||||||
|
|
||||||
// Get keys that aren't present in the new data
|
|
||||||
const deletionKeys = oldDatasetKeys.filter((key) => {
|
|
||||||
return key !== '_meta' && newDatasetKeys.indexOf(key) === -1
|
|
||||||
})
|
|
||||||
|
|
||||||
// Remove outdated key-value pairs
|
|
||||||
deletionKeys.forEach((deletionKey) => {
|
|
||||||
delete chart.data.datasets[i][deletionKey]
|
|
||||||
})
|
|
||||||
|
|
||||||
// Update attributes individually to avoid re-rendering the entire chart
|
|
||||||
for (const attribute in dataset) {
|
|
||||||
if (dataset.hasOwnProperty(attribute)) {
|
|
||||||
chart.data.datasets[i][attribute] = dataset[attribute]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (newData.hasOwnProperty('labels')) {
|
|
||||||
chart.data.labels = newData.labels
|
|
||||||
}
|
|
||||||
if (newData.hasOwnProperty('xLabels')) {
|
|
||||||
chart.data.xLabels = newData.xLabels
|
|
||||||
}
|
|
||||||
if (newData.hasOwnProperty('yLabels')) {
|
|
||||||
chart.data.yLabels = newData.yLabels
|
|
||||||
}
|
|
||||||
chart.update()
|
|
||||||
} else {
|
|
||||||
chart.destroy()
|
|
||||||
this.renderChart(this.chartData, this.options)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.renderChart(this.chartData, this.options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
props: {
|
|
||||||
chartData: {
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
'chartData': {
|
|
||||||
handler (newData, oldData) {
|
|
||||||
if (oldData) {
|
|
||||||
let chart = this.$data._chart
|
|
||||||
|
|
||||||
// Get new and old DataSet Labels
|
|
||||||
let newDatasetLabels = newData.datasets.map((dataset) => {
|
|
||||||
return dataset.label
|
|
||||||
})
|
|
||||||
|
|
||||||
let oldDatasetLabels = oldData.datasets.map((dataset) => {
|
|
||||||
return dataset.label
|
|
||||||
})
|
|
||||||
|
|
||||||
// Stringify 'em for easier compare
|
|
||||||
const oldLabels = JSON.stringify(oldDatasetLabels)
|
|
||||||
const newLabels = JSON.stringify(newDatasetLabels)
|
|
||||||
|
|
||||||
// Check if Labels are equal and if dataset length is equal
|
|
||||||
if (newLabels === oldLabels && oldData.datasets.length === newData.datasets.length) {
|
|
||||||
newData.datasets.forEach((dataset, i) => {
|
|
||||||
// Get new and old dataset keys
|
|
||||||
const oldDatasetKeys = Object.keys(oldData.datasets[i])
|
|
||||||
const newDatasetKeys = Object.keys(dataset)
|
|
||||||
|
|
||||||
// Get keys that aren't present in the new data
|
|
||||||
const deletionKeys = oldDatasetKeys.filter((key) => {
|
|
||||||
return key !== '_meta' && newDatasetKeys.indexOf(key) === -1
|
|
||||||
})
|
|
||||||
|
|
||||||
// Remove outdated key-value pairs
|
|
||||||
deletionKeys.forEach((deletionKey) => {
|
|
||||||
delete chart.data.datasets[i][deletionKey]
|
|
||||||
})
|
|
||||||
|
|
||||||
// Update attributes individually to avoid re-rendering the entire chart
|
|
||||||
for (const attribute in dataset) {
|
|
||||||
if (dataset.hasOwnProperty(attribute)) {
|
|
||||||
chart.data.datasets[i][attribute] = dataset[attribute]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (newData.hasOwnProperty('labels')) {
|
|
||||||
chart.data.labels = newData.labels
|
|
||||||
}
|
|
||||||
if (newData.hasOwnProperty('xLabels')) {
|
|
||||||
chart.data.xLabels = newData.xLabels
|
|
||||||
}
|
|
||||||
if (newData.hasOwnProperty('yLabels')) {
|
|
||||||
chart.data.yLabels = newData.yLabels
|
|
||||||
}
|
|
||||||
chart.update()
|
|
||||||
} else {
|
|
||||||
chart.destroy()
|
|
||||||
this.renderChart(this.chartData, this.options)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.renderChart(this.chartData, this.options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -76,9 +76,31 @@ describe('BarChart', () => {
|
|||||||
components: { BarChart }
|
components: { BarChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
BarChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { BarChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('BubbleChart', () => {
|
|||||||
components: { BubbleChart }
|
components: { BubbleChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
BubbleChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { BubbleChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('DoughnutChart', () => {
|
|||||||
components: { DoughnutChart }
|
components: { DoughnutChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
DoughnutChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { DoughnutChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('HorizontalBarChart', () => {
|
|||||||
components: { HorizontalBarChart }
|
components: { HorizontalBarChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
HorizontalBarChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { HorizontalBarChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('LineChart', () => {
|
|||||||
components: { LineChart }
|
components: { LineChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
LineChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { LineChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -75,9 +75,31 @@ describe('PieChart', () => {
|
|||||||
components: { PieChart }
|
components: { PieChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
PieChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { PieChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('PolarChart', () => {
|
|||||||
components: { PolarChart }
|
components: { PolarChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
PolarChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { PolarChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -75,9 +75,31 @@ describe('RadarChart', () => {
|
|||||||
components: { RadarChart }
|
components: { RadarChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
RadarChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { RadarChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -76,9 +76,31 @@ describe('ScatterChart', () => {
|
|||||||
components: { ScatterChart }
|
components: { ScatterChart }
|
||||||
}).$mount(el)
|
}).$mount(el)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins).to.exist
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
vm.$children[0].addPlugin(testPlugin)
|
vm.$children[0].addPlugin(testPlugin)
|
||||||
|
|
||||||
expect(vm.$children[0].plugins.length).to.equal(1)
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should add inline plugins based on prop', () => {
|
||||||
|
const testPlugin = {
|
||||||
|
id: 'test'
|
||||||
|
}
|
||||||
|
|
||||||
|
const vm = new Vue({
|
||||||
|
render: function (createElement) {
|
||||||
|
return createElement(
|
||||||
|
ScatterChart, {
|
||||||
|
props: {
|
||||||
|
plugins: [testPlugin]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
components: { ScatterChart }
|
||||||
|
}).$mount(el)
|
||||||
|
|
||||||
|
expect(vm.$children[0].$data._plugins).to.exist
|
||||||
|
expect(vm.$children[0].$data._plugins.length).to.equal(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
import { mergeOptions } from '@/helpers/options'
|
|
||||||
|
|
||||||
describe('mergeOptions.js', () => {
|
|
||||||
const a = {
|
|
||||||
a: 'a',
|
|
||||||
b: 'a'
|
|
||||||
}
|
|
||||||
|
|
||||||
const b = {
|
|
||||||
a: 'b',
|
|
||||||
b: 'b'
|
|
||||||
}
|
|
||||||
|
|
||||||
const c = {
|
|
||||||
c: 'c'
|
|
||||||
}
|
|
||||||
|
|
||||||
const an = {
|
|
||||||
a: {
|
|
||||||
a: 'a'
|
|
||||||
},
|
|
||||||
b: {
|
|
||||||
b: 'a'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const bn = {
|
|
||||||
a: {
|
|
||||||
a: 'a'
|
|
||||||
},
|
|
||||||
b: {
|
|
||||||
b: 'b'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
it('should replace old a and b if a and b are new', () => {
|
|
||||||
const 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', () => {
|
|
||||||
const ac = mergeOptions(a, c)
|
|
||||||
expect(ac).to.have.property('a').and.to.equal('b')
|
|
||||||
expect(ac).to.have.property('b').and.to.equal('b')
|
|
||||||
expect(ac).to.have.property('c').and.to.equal('c')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should replace old a and b if a and b are new in nested objects', () => {
|
|
||||||
const ab = mergeOptions(an, bn)
|
|
||||||
expect(ab).to.have.deep.property('a.a').and.to.equal('a')
|
|
||||||
expect(ab).to.have.deep.property('b.b').and.to.equal('b')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
Reference in New Issue
Block a user