65 Commits

Author SHA1 Message Date
asantibanez
8bfdaa1763 Updated README 2022-02-14 15:42:57 -05:00
asantibanez
aa94016b6e Added TreeMap chart
- Added tests
2022-02-14 15:38:59 -05:00
asantibanez
4a74606e4d Added shades support in trait 2022-02-14 15:37:59 -05:00
asantibanez
52abe77e7e Extracted radar chart js to file 2022-02-14 12:49:47 -05:00
asantibanez
202591954d Added install command 2022-02-14 12:49:36 -05:00
asantibanez
9e4d8ddf40 Added tests for Radar Chart component 2022-02-14 12:49:17 -05:00
Andrés Santibáñez
3e57a722b4 Merge pull request #54 from AlexHupe/master
Added RadarChart
2022-02-14 12:25:49 -05:00
Andrés Santibáñez
0c72c83dda Merge pull request #53 from nicko170/master
Allow setting type on Pie Chart Model
2022-02-14 12:22:16 -05:00
Andrés Santibáñez
327665919f Merge pull request #69 from asantibanez/update-to-laravel-9
Added support for L9. Upgraded dependencies
2022-02-14 10:42:35 -05:00
asantibanez
879734fe9c Updated CI 2022-02-14 10:33:10 -05:00
asantibanez
6754e94cde Added support for L9. Upgraded dependencies 2022-02-14 10:26:17 -05:00
Alex
9802ec2bcd Preview-Image 2021-10-15 19:51:13 +02:00
Alex
821ac7a454 Add RadarChart 2021-10-15 19:23:27 +02:00
nicko170
a7364ad51c compile 2021-08-27 16:14:40 +10:00
nicko170
47d0f028af adding pie chart type 2021-08-27 16:05:53 +10:00
Andrés Santibáñez
582ad340dd Updated docs 2021-02-12 00:29:24 -05:00
Andrés Santibáñez
35d8a80bb4 Updated docs 2021-02-12 00:26:33 -05:00
Andrés Santibáñez
665a3370b2 Added build 2021-02-12 00:26:10 -05:00
Andrés Santibáñez
84527ff809 Added color customization to multiline chart 2021-02-12 00:26:04 -05:00
Andrés Santibáñez
cefb5089e8 Updated docs 2021-02-12 00:22:32 -05:00
Andrés Santibáñez
bf644a5931 Updated docs 2021-02-12 00:20:11 -05:00
Andrés Santibáñez
3abe96bdb0 Added build 2021-02-12 00:17:20 -05:00
Andrés Santibáñez
171a333044 Added init method to all charts
- Added custom colors to pie chart
2021-02-12 00:17:11 -05:00
Andrés Santibáñez
372d6ffcb0 Added extra configuration options to column chart 2021-02-11 23:42:06 -05:00
asantibanez
0de38b041b Added new traits for colors and grid handling 2021-02-11 22:35:59 -05:00
asantibanez
b649aaef23 Added CI setup and PR templates 2020-12-16 09:27:18 -05:00
asantibanez
75f46fc1cf Updated .gitignore 2020-12-16 09:27:01 -05:00
asantibanez
11272bd21b Added base tests for components 2020-12-16 09:26:37 -05:00
Andrés Santibáñez
1e1075ba07 Merge pull request #24 from AlexHupe/patch-2
Add method 'addSeriesColumn' to readme
2020-12-16 08:55:51 -05:00
Andrés Santibáñez
1bfa52ca83 Merge pull request #26 from mokhosh/patch-1
Add support for php 8.0
2020-12-16 08:55:01 -05:00
Mo Khosh
3add4a148e Add support for php 8.0
Modify composer.json to allow php 8.0
2020-12-16 11:47:43 +03:30
Alexander Hupe
27606ff1e9 Add method 'addSeriesColumn' to readme 2020-12-07 16:33:03 +01:00
Andrés Santibáñez
230b706c63 Merge pull request #11 from hamidafghan/ifix-stroke-width
Added stroke width customization
2020-11-30 12:59:20 -05:00
Andrés Santibáñez
8b0bb9c250 Added custom stroke for Area Chart 2020-11-30 12:58:19 -05:00
Andrés Santibáñez
3d89d210b5 Added build 2020-11-30 12:48:14 -05:00
Andrés Santibáñez
f72c5294d9 Updated README 2020-11-30 12:45:44 -05:00
Andrés Santibáñez
76b64536d1 Added build system and assets for js 2020-11-30 12:13:03 -05:00
Andrés Santibáñez
fd4961d7ae Merge pull request #9 from AlexHupe/patch-1
Typo in README.md
2020-11-30 09:54:17 -05:00
hamidafghan
c61ca90905 Add stroke width 2020-11-24 10:36:09 +04:30
Alexander Hupe
67bd18bc48 Typo in README.md 2020-11-19 09:35:05 +01:00
Andrés Santibáñez
940109ef03 Fixed infinite growing charts 2020-11-09 10:53:42 -05:00
Andrés Santibáñez
0457a9a007 Updated CHANGELOG 2020-11-09 10:18:23 -05:00
Andrés Santibáñez
2c7317c3b8 Removed unused directives 2020-11-09 10:17:29 -05:00
Andrés Santibáñez
98df89eca4 Updated README 2020-11-09 08:49:16 -05:00
Andrés Santibáñez
de8ed5c844 Added release badge :) 2020-11-09 08:43:36 -05:00
Andrés Santibáñez
81b502fd10 Increased package version 2020-11-09 08:39:24 -05:00
Andrés Santibáñez
01176c001e Updated CHANGELOG and README 2020-11-09 08:38:15 -05:00
Andrés Santibáñez
8e9aed484e Added sparkline feature to charts 2020-11-09 08:29:43 -05:00
Andrés Santibáñez
f5b40ec73d Added LivewireCharts facade 2020-11-08 21:53:26 -05:00
Andrés Santibáñez
dbbbf8eca2 Updated README and CHANGELOG 2020-11-07 19:50:52 -05:00
Andrés Santibáñez
a002d2f041 Added support for multi-column stacked charts 2020-11-07 19:40:23 -05:00
Andrés Santibáñez
e11c5ca375 Improved code 2020-11-07 19:21:19 -05:00
Andrés Santibáñez
0af61a2997 Added support for multi column chart 2020-11-07 19:21:13 -05:00
Andrés Santibáñez
cb3e4180a1 Added support for custom categories in Area Chart 2020-11-06 23:59:34 -05:00
Andrés Santibáñez
1e7ac1bffb Added ability to add custom categories to xAxis 2020-11-06 23:50:51 -05:00
Andrés Santibáñez
0aedf541a9 Updated README and CHANGELOG 2020-11-03 08:02:36 -05:00
Andrés Santibáñez
316bb5a976 Removed markers support for multi line chart 2020-11-03 07:59:45 -05:00
Andrés Santibáñez
05c9f5c605 Added DataLabels support for charts 2020-11-03 07:44:32 -05:00
Andrés Santibáñez
63fe7a1533 Extracted title property to trait 2020-11-03 07:20:46 -05:00
Andrés Santibáñez
22b72c1980 Extracted multi line chart Blade view 2020-11-03 07:16:51 -05:00
Andrés Santibáñez
5e7cabfd16 Extracted animated property to trait 2020-11-03 07:10:30 -05:00
Andrés Santibáñez
71e2168b6c Added MultiLine support for Line Chart 2020-11-03 07:07:02 -05:00
Andrés Santibáñez
9b74d45a86 Updated README 2020-11-02 22:01:02 -05:00
Andrés Santibáñez
19f3ce70ae Updated README 2020-11-02 21:51:15 -05:00
Andrés Santibáñez
4c55e19486 Updated README 2020-10-25 01:01:39 -05:00
65 changed files with 12113 additions and 493 deletions

1
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1 @@
* @asantibanez

26
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,26 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. '...'
2. '...'
3. '...'
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
**Solution Ideas**
Initial thoughts or details about how this could be fixed

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

@@ -0,0 +1,14 @@
---
name: Feature
about: New feature idea
---
### Summary
What's the new feature about? What should it do?
### Proposal
How should it work? API ideas?
### Additional Notes
Reference links or comments

18
.github/PULL_REQUEST_TEMPLATE vendored Normal file
View File

@@ -0,0 +1,18 @@
## Summary
[Provide a summary of the change.]
## Issue
[If exists, provide a link to the corresponding issue(s).]
## Type of Change
- [ ] :rocket: New Feature
- [ ] :bug: Bug Fix
- [ ] :hammer: Refactor
- [ ] :question: [Other]
## Screenshot/Video
[Provide a screenshot or video that describes the change if applicable]

29
.github/workflows/phpunit.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: PHPUnit
on: [push]
jobs:
phpunit:
runs-on: ubuntu-latest
steps:
- name: Cancel Previous Run
uses: styfle/cancel-workflow-action@0.6.0
with:
access_token: ${{ github.token }}
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, exif, imagick, bcmath
coverage: none
- name: Checkout code
uses: actions/checkout@v2
- name: Install Composer dependencies
run: composer install --ignore-platform-reqs
- name: Run tests
run: ./vendor/bin/phpunit

2
.gitignore vendored
View File

@@ -5,3 +5,5 @@ docs
vendor vendor
coverage coverage
.DS_STORE .DS_STORE
node_modules
.phpunit.result.cache

View File

@@ -1,5 +1,48 @@
# Changelog # Changelog
## 2.3.0 - 2021-02-12
- Added `init()` method for better boot and $wire hoisting
- Added color customization for columns, multiline and pie chart
## 2.2.0 - 2020-12-16
- Added support for PHP 8
- Updated docs
- Added base tests for components and CI
## 2.1.0 - 2020-11-30
- Added stroke width customization
- Added stroke support for Area Chart
## 2.0.0 - 2020-11-30
- Added build system for JS charts code
- Added Blade directive to include assets
- Updated installation and advanced usage instructions
## 1.5.2 - 2020-11-09
- Fixed infinite growing charts
## 1.5.1 - 2020-11-09
- Removed unused Alpine directives
## 1.5.0 - 2020-11-09
- Added `LivewireCharts` facade to create any chart model
- Added `sparklined` Apex Chart feature to all charts (https://apexcharts.com/javascript-chart-demos/sparklines/basic/)
## 1.4.0 - 2020-11-07
- Added Multi Column Chart
- Added Stacked Multi Column Chart
- Added support for custom X Axis categories
## 1.3.0 - 2020-11-03
- Added Multi Line Chart
- Added Data Labels configuration for all charts
- Refactored title and animation to traits
## 1.2.0 - 2020-10-25 ## 1.2.0 - 2020-10-25
- Fixed column chart growing infinitely - Fixed column chart growing infinitely

138
README.md
View File

@@ -1,10 +1,15 @@
# Livewire Charts [![GitHub release](https://img.shields.io/github/release/asantibanez/livewire-charts.svg)](https://github.com/asantibanez/livewire-charts/releases/)
Neat Livewire Charts for your Laravel projects. ![Livewire Charts](https://banners.beyondco.de/Livewire%20Charts.png?theme=light&packageName=asantibanez%2Flivewire-charts&pattern=graphPaper&style=style_1&description=Neat+Livewire+Charts+for+your+Laravel+projects&md=1&fontSize=100px&images=chart-square-bar)
## Preview ## Preview
![preview](https://github.com/asantibanez/livewire-charts/raw/master/preview.gif) ![preview](https://github.com/asantibanez/livewire-charts/raw/master/preview.gif)
![preview](./preview_radarchart.gif)
## Demo
https://github.com/asantibanez/livewire-charts-demo
## Installation ## Installation
@@ -14,6 +19,16 @@ You can install the package via composer:
composer require asantibanez/livewire-charts composer require asantibanez/livewire-charts
``` ```
Next, you must export the package public scripts. To do this run `php artisan vendor:publish`
and export `livewire-charts:public`. This command will export a `vendor/livewire-charts` folder under the
`public` directory of your app.
```bash
php artisan vendor:publish --tag=livewire-charts:public
```
> Note: This last step can also be done using `livewire-charts:install` command in the artisan console.
## Requirements ## Requirements
This package requires the following packages/libraries to work: This package requires the following packages/libraries to work:
@@ -23,21 +38,25 @@ This package requires the following packages/libraries to work:
Please follow each package/library instructions on how to set them properly in your project. Please follow each package/library instructions on how to set them properly in your project.
> Note: At the moment, `Apex Charts` is only supported for drawing charts. >Note: At the moment, `Apex Charts` is only supported for drawing charts.
## Usage ## Usage
Livewire Charts supports out of the box the following types of charts Livewire Charts supports out of the box the following types of charts
- Line Chart (`LivewireLineChart` component) - Line/Multi Line Chart (`LivewireLineChart` component)
- Pie Chart (`LivewirePieChart` component) - Pie Chart (`LivewirePieChart` component)
- Column Chart (`LivewireColumnChart` component) - Column/Multi Line Chart (`LivewireColumnChart` component)
- Area Chart (`LivewireAreaChart` component) - Area Chart (`LivewireAreaChart` component)
- Radar Chart (`LivewireRadarChart` component)
- Tree Map Chart (`LivewireTreeMapChart` component)
Each one comes with its own "model" class that allows you to define the chart's data and render behavior. Each one comes with its own "model" class that allows you to define the chart's data and render behavior.
- `LivewireLineChart` uses `LineChartModel` to set up data points, markers, events and other ui customizations. - `LivewireLineChart` uses `LineChartModel` to set up data points, markers, events and other ui customizations.
- `LivewirePieChart` uses `PieChartModel` to set up data slices, events and other ui customizations. - `LivewirePieChart` uses `PieChartModel` to set up data slices, events and other ui customizations.
- `LivewireColumnChart` uses `ColumnChartModel` to set up data columns, events and other ui customizations. - `LivewireColumnChart` uses `ColumnChartModel` to set up data columns, events and other ui customizations.
- `LivewireAreaChart` uses `AreaChartModel` to set up data points, events and other ui customizations. - `LivewireAreaChart` uses `AreaChartModel` to set up data points, events and other ui customizations.
- `LivewireRadarChart` uses `RadarChartModel` to set up data points, events and other ui customizations.
- `LivewireTreeMapChart` uses `TreeMapChartModel` to set up data blocks, events and other ui customizations.
For example, to render a column chart, we can create an instance of `ColumnChartModel` and add some data to it For example, to render a column chart, we can create an instance of `ColumnChartModel` and add some data to it
```php ```php
@@ -50,7 +69,7 @@ $columnChartModel =
; ;
``` ```
> Note: Chart model methods are chainable 💪 >Note: Chart model methods are chainable 💪
With `$columnChartModel` at hand, we pass it to our `LivewireColumnChart` component in our Blade template. With `$columnChartModel` at hand, we pass it to our `LivewireColumnChart` component in our Blade template.
@@ -60,12 +79,34 @@ With `$columnChartModel` at hand, we pass it to our `LivewireColumnChart` compon
/> />
``` ```
Next, include the `@livewireChartsScripts` directive next to your other app scripts
```html
<livewire:scripts />
@livewireChartsScripts
```
And that's it! You have a beautiful rendered chart in seconds. 👌 And that's it! You have a beautiful rendered chart in seconds. 👌
![column chart example](https://github.com/asantibanez/livewire-charts/raw/master/column-chart-example.png) ![column chart example](https://github.com/asantibanez/livewire-charts/raw/master/column-chart-example.png)
> Note: You can use these charts inside other Livewire components too. Just render them in your Blade template and you >Note: You can use these charts inside other Livewire components too. Just render them in your Blade template and you
are good to go. 👍 are good to go. 👍
## LivewireCharts facade
Chart models can also be created using the `LivewireCharts` facade.
```php
LivewireCharts::lineChartModel();
LivewireCharts::multiLineChartModel();
LivewireCharts::columnChartModel();
LivewireCharts::multiColumnChartModel();
LivewireCharts::pieChartModel();
LivewireCharts::areaChartModel();
LivewireCharts::radarChartModel();
LivewireCharts::treeMapChartModel();
```
## Enabling Interactions ## Enabling Interactions
@@ -125,47 +166,104 @@ The parent component renders the charts as follows
For each chart, a specific model class needs to be used. Here, it is detailed the api available For each chart, a specific model class needs to be used. Here, it is detailed the api available
for each type of chart. for each type of chart.
#### LivewireLineChart ### All
| Method | Description | | Method | Description |
|--------|-------------| |--------|-------------|
| setTitle(string $title) | Sets chart title | | setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation | | setAnimated(boolean $animated) | Enables/disables animation |
| addPoint(string $title, double $value, array $extras = []) | Adds a point to the line chart. `$extras` is forwarded on click event | | setDataLabelsEnabled(boolean $enabled) | Enables/disables data labels |
| addMarker(string $title, double $value) | Adds a marker point to the line chart. Markers are used to emphasize particular points in the chart | | withDataLabels() | Enables data labels |
| withoutDataLabels() | Disables data labels |
| withLegend() | Shows legends |
| withoutLegend() | Hides legends |
| setColors(array $colors) | Set colors for chart |
| addColors(string $color) | Append $color to $colors set |
| setXAxisCategories(array $categories) | Enables custom categories for chart X Axis |
| sparklined() | Enables Apex Charts sparkline feature |
| setSparklineEnabled(boolean $isEnabled) | Enables/Disables Apex Charts sparkline feature |
### LivewireLineChart
| Method | Description |
|--------|-------------|
| multiLine() | Adds multiline support for line chart |
| singleLine() | Adds single support for line chart |
| addPoint(string $title, double $value, array $extras = []) | Adds a point to a single line chart. `$extras` is forwarded on click event |
| addSeriesPoint(string $seriesName, string $title, double $value, array $extras = []) | Adds a point to series to a multi line chart. `$extras` is forwarded on click event |
| addMarker(string $title, double $value) | Adds a marker point to the line chart. Markers are used to emphasize particular points in the chart (singleLine only) |
| withOnPointClickEvent(string $eventName) | Event Name that will be fired when a point/marker of the chart is clicked | | withOnPointClickEvent(string $eventName) | Event Name that will be fired when a point/marker of the chart is clicked |
#### LivewireColumnChart ### LivewireColumnChart
| Method | Description | | Method | Description |
|--------|-------------| |--------|-------------|
| setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation |
| setOpacity(int $opacity) | Sets columns' opacity | | setOpacity(int $opacity) | Sets columns' opacity |
| setColumnWidth(int $columnWidth) | Sets columns' width |
| setHorizontal(boolean $value) | Sets columns or bars |
| multiColumn() | Sets chart to display multiple column series |
| singleColumn() | Sets chart to display a single column series |
| stacked() | Sets chart to display column series stacked |
| addColumn(string $title, double $value, string $color, array $extras = []) | Adds a column to the chart with the specified color. `$extras` is forwarded on click event | | addColumn(string $title, double $value, string $color, array $extras = []) | Adds a column to the chart with the specified color. `$extras` is forwarded on click event |
| addSeriesColumn(string $seriesName, string $title, double $value, array $extras = []) | Adds a column to a multicolumn chart. `$extras` is forwarded on click event |
| onColumnClickEventName(string $eventName) | Event Name that will be fired when a column of the chart is clicked | | onColumnClickEventName(string $eventName) | Event Name that will be fired when a column of the chart is clicked |
#### LivewirePieChart ### LivewirePieChart
| Method | Description | | Method | Description |
|--------|-------------| |--------|-------------|
| setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation |
| setOpacity(int $opacity) | Sets slices' opacity | | setOpacity(int $opacity) | Sets slices' opacity |
| addSlice(string $title, double $value, string $color, array $extras = []) | Adds a slice to the chart with the specified color. `$extras` is forwarded on click event | | addSlice(string $title, double $value, string $color, array $extras = []) | Adds a slice to the chart with the specified color. `$extras` is forwarded on click event |
| withOnSliceClickEvent(string $eventName) | Event Name that will be fired when a column of the chart is clicked | | withOnSliceClickEvent(string $eventName) | Event Name that will be fired when a column of the chart is clicked |
#### LivewireAreaChart ### LivewireAreaChart
| Method | Description | | Method | Description |
|--------|-------------| |--------|-------------|
| setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation |
| addPoint(string $title, double $value, array $extras = []) | Adds a point to the area chart. `$extras` is forwarded on click event | | addPoint(string $title, double $value, array $extras = []) | Adds a point to the area chart. `$extras` is forwarded on click event |
| withOnPointClickEvent(string $eventName) | Event Name that will be fired when a point of the chart is clicked | | withOnPointClickEvent(string $eventName) | Event Name that will be fired when a point of the chart is clicked |
| setXAxisVisible(boolean $visible) | Shows/hides xAxis labels | | setXAxisVisible(boolean $visible) | Shows/hides xAxis labels |
| setYAxisVisible(boolean $visible) | Shows/hides yAxis labels | | setYAxisVisible(boolean $visible) | Shows/hides yAxis labels |
### LivewireRadarChart
| Method | Description |
|--------|-------------|
| addSeries(string $seriesName, string $title, double $value, array $extras = []) | |
| withOnPointClickEvent(string $eventName) | Event Name that will be fired when a point of the chart is clicked |
### LivewireTreeMapChart
| Method | Description |
|--------|-------------|
| addBlock(string $title, double $value, array $extras = []) | Adds a block to the default series|
| addSeriesBlock(string $seriesName, string $title, double $value, array $extras = []) | Adds a block to the specified series|
| withOnBlockClickEvent(string $eventName) | Event Name that will be fired when a block of the chart is clicked |
| setDistributed(bool $distributed) | Set whether the chart uses distribution or not |
## Advanced Usage - Integrating Scripts
The directive `@livewireChartsScripts` adds a `script` tag that includes `public/vendor/livewire-charts/app.js`.
If you want to include this script in your build system, you can export the package scripts
with `php artisan vendor:publish` and selecting `livewire-charts:scripts`. This will export `js/vendor/livewire-charts`
inside your resources folder. You can then adjust imports as you see fit in your project.
>Note: You must remove @livewireChartsScripts directive so it doesn't clash with the scripts in your build system.
## Troubleshooting
Chart components must be placed inside a container with fixed height. This is because the chart will use all the given
vertical space. A fixed height is needed to render properly.
```blade
<div style="height: 32rem;">
<livewire:livewire-column-chart .../>
</div>
```
>Note: if a fixed height is not given, the chart will grow vertically infinitely. That's not what we want, right?
## Testing ## Testing
``` bash ``` bash

View File

@@ -16,12 +16,12 @@
} }
], ],
"require": { "require": {
"php": "^7.2|^7.3|^7.4", "php": "^7.2|^7.3|^7.4|^8.0",
"illuminate/support": "^7.0|^8.0", "illuminate/support": "^7.0|^8.0|^9.0",
"livewire/livewire": "^2.3" "livewire/livewire": "^2.3"
}, },
"require-dev": { "require-dev": {
"orchestra/testbench": "^4.0|^5.0", "orchestra/testbench": "^5.0|^6.0|^7.0",
"phpunit/phpunit": "^8.0" "phpunit/phpunit": "^8.0"
}, },
"autoload": { "autoload": {

3
mix-manifest.json Normal file
View File

@@ -0,0 +1,3 @@
{
"/public/app.js": "/public/app.js"
}

9931
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

16
package.json Normal file
View File

@@ -0,0 +1,16 @@
{
"scripts": {
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"apexcharts": "^3.22.2",
"cross-env": "^7.0.2",
"laravel-mix": "^5.0.9",
"vue-template-compiler": "^2.6.12"
}
}

View File

@@ -22,7 +22,7 @@
<logging> <logging>
<log type="tap" target="build/report.tap"/> <log type="tap" target="build/report.tap"/>
<log type="junit" target="build/report.junit.xml"/> <log type="junit" target="build/report.junit.xml"/>
<log type="coverage-html" target="build/coverage" charset="UTF-8" yui="true" highlight="true"/> <log type="coverage-html" target="build/coverage"/>
<log type="coverage-text" target="build/coverage.txt"/> <log type="coverage-text" target="build/coverage.txt"/>
<log type="coverage-clover" target="build/logs/clover.xml"/> <log type="coverage-clover" target="build/logs/clover.xml"/>
</logging> </logging>

BIN
preview_radarchart.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

2
public/app.js Normal file

File diff suppressed because one or more lines are too long

13
public/app.js.LICENSE.txt Normal file
View File

@@ -0,0 +1,13 @@
/*!
* ApexCharts v3.22.2
* (c) 2018-2020 Juned Chhipa
* Released under the MIT License.
*/
/*! svg.draggable.js - v2.2.2 - 2019-01-08
* https://github.com/svgdotjs/svg.draggable.js
* Copyright (c) 2019 Wout Fierens; Licensed MIT */
/*! svg.filter.js - v2.0.2 - 2016-02-24
* https://github.com/wout/svg.filter.js
* Copyright (c) 2016 Wout Fierens; Licensed MIT */

19
resources/js/app.js Normal file
View File

@@ -0,0 +1,19 @@
import ApexCharts from 'apexcharts'
import areaChart from "./areaChart"
import columnChart from "./columnChart"
import multiColumnChart from "./multiColumnChart";
import lineChart from "./lineChart"
import multiLineChart from "./multiLineChart"
import pieChart from "./pieChart"
import radarChart from "./radarChart"
import treeMapChart from "./treeMapChart"
window.ApexCharts = ApexCharts
window.livewireChartsAreaChart = areaChart
window.livewireChartsColumnChart = columnChart
window.livewireChartsLineChart = lineChart
window.livewireChartsMultiLineChart = multiLineChart
window.livewireChartsPieChart = pieChart
window.livewireChartsMultiColumnChart = multiColumnChart
window.livewireChartsRadarChart = radarChart
window.livewireChartsTreeMapChart = treeMapChart

94
resources/js/areaChart.js Normal file
View File

@@ -0,0 +1,94 @@
const areaChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('areaChartModel.title');
const animated = component.get('areaChartModel.animated') || false;
const dataLabels = component.get('areaChartModel.dataLabels') || {};
const onPointClickEventName = component.get('areaChartModel.onPointClickEventName')
const data = component.get('areaChartModel.data');
const sparkline = component.get('areaChartModel.sparkline');
const categories = component.get('areaChartModel.xAxis.categories').length > 0
? component.get('areaChartModel.xAxis.categories')
: data.map(item => item.title)
;
var options = {
series: [{
name: title,
data: data.map(item => item.value)
}],
chart: {
type: 'area',
height: '100%',
...sparkline,
zoom: { enabled: false },
toolbar: { show: false },
animations: { enabled: animated },
events: {
markerClick: function(event, chartContext, { dataPointIndex }) {
if (!onPointClickEventName) {
return
}
const point = data[dataPointIndex]
component.call('onPointClick', point)
}
}
},
dataLabels: dataLabels,
colors: [component.get('areaChartModel.color') || '#2E93fA'],
stroke: component.get('areaChartModel.stroke') || {},
title: {
text: title,
align: 'center'
},
labels: data.map(item => item.title),
xaxis: {
labels: component.get('areaChartModel.xAxis.labels'),
categories: categories,
},
yaxis: component.get('areaChartModel.yAxis') || {},
grid: {
padding: {
left: 0,
top: 0,
right: 0,
bottom: 0,
}
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default areaChart

104
resources/js/columnChart.js Normal file
View File

@@ -0,0 +1,104 @@
const columnChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const animated = component.get('columnChartModel.animated') || false;
const onColumnClickEventName = component.get('columnChartModel.onColumnClickEventName')
const dataLabels = component.get('columnChartModel.dataLabels') || {};
const sparkline = component.get('columnChartModel.sparkline');
const legend = component.get('columnChartModel.legend')
const grid = component.get('columnChartModel.grid');
const columnWidth = component.get('columnChartModel.columnWidth');
const horizontal = component.get('columnChartModel.horizontal');
const data = component.get('columnChartModel.data');
const series = [{ data: data.map(item => item.value)}]
const options = {
series: series,
chart: {
type: 'bar',
height: '100%',
...sparkline,
toolbar: { show: false },
animations: { enabled: animated },
events: {
dataPointSelection: function(event, chartContext, config) {
if (!onColumnClickEventName) {
return
}
const { dataPointIndex } = config
const column = data[dataPointIndex]
component.call('onColumnClick', column)
},
}
},
colors: data.map(item => item.color),
labels: {
style: {
colors: data.map(item => item.color),
},
},
legend: legend,
grid: grid,
plotOptions: {
bar: {
horizontal: horizontal,
columnWidth: `${columnWidth}%`,
distributed: true,
},
},
dataLabels: dataLabels,
xaxis: {
categories: data.map(item => item.title),
},
yaxis: {
title: {
text: component.get('columnChartModel.title'),
}
},
fill: {
opacity: component.get('columnChartModel.opacity') || 0.5
},
};
const colors = component.get('columnChartModel.colors');
if (colors && colors.length > 0) {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default columnChart

108
resources/js/lineChart.js Normal file
View File

@@ -0,0 +1,108 @@
const lineChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('lineChartModel.title');
const animated = component.get('lineChartModel.animated') || false;
const dataLabels = component.get('lineChartModel.dataLabels') || {};
const data = component.get('lineChartModel.data');
const onPointClickEventName = component.get('lineChartModel.onPointClickEventName');
const sparkline = component.get('lineChartModel.sparkline');
const series = [{
name: title,
data: data.map(item => item.value),
}]
const categories = component.get('lineChartModel.xAxis.categories').length > 0
? component.get('lineChartModel.xAxis.categories')
: data.map(item => item.title)
const options = {
series: series,
chart: {
type: 'line',
height: '100%',
...sparkline,
zoom: { enabled: false },
toolbar: { show: false },
animations: { enabled: animated },
events: {
markerClick: function(event, chartContext, { dataPointIndex }) {
if (!onPointClickEventName) {
return
}
const point = data[dataPointIndex]
component.call('onPointClick', point)
}
}
},
dataLabels: dataLabels,
stroke: component.get('lineChartModel.stroke') || {},
title: {
text: title,
align: 'center'
},
xaxis: {
labels: component.get('lineChartModel.xAxis.labels'),
categories: categories,
},
yaxis: component.get('lineChartModel.yAxis') || {},
annotations: {
points: component.get('lineChartModel.markers').map(item => {
return {
x: item.title,
y: item.value,
marker: {
size: 6,
fillColor: '#fff',
strokeColor: item.strokeColor,
radius: 2,
},
label: {
offsetY: 0,
style: {
color: item.textColor,
background: item.textBackgroundColor,
},
text: item.text || '',
}
}
}
)
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default lineChart

View File

@@ -0,0 +1,105 @@
const multiColumnChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const stacked = component.get('columnChartModel.isStacked');
const animated = component.get('columnChartModel.animated');
const onColumnClickEventName = component.get('columnChartModel.onColumnClickEventName')
const dataLabels = component.get('columnChartModel.dataLabels');
const sparkline = component.get('columnChartModel.sparkline');
const legend = component.get('columnChartModel.legend')
const grid = component.get('columnChartModel.grid');
const columnWidth = component.get('columnChartModel.columnWidth');
const horizontal = component.get('columnChartModel.horizontal');
const data = component.get('columnChartModel.data');
const series = Object.keys(data)
.map(seriesName => ({
name: seriesName,
data: data[seriesName].map(item => item.value)
}))
const categories = component.get('columnChartModel.xAxis.categories').length > 0
? component.get('columnChartModel.xAxis.categories')
: []
;
const options = {
series: series,
chart: {
type: 'bar',
height: '100%',
stacked: stacked,
...sparkline,
toolbar: { show: false },
animations: { enabled: animated },
events: {
dataPointSelection: function(event, chartContext, {seriesIndex, dataPointIndex}) {
if (!onColumnClickEventName) {
return
}
const column = data[series[seriesIndex].name][dataPointIndex]
component.call('onColumnClick', column)
},
}
},
legend: legend,
grid: grid,
plotOptions: {
bar: {
horizontal: horizontal,
columnWidth: `${columnWidth}%`,
},
},
dataLabels: dataLabels,
xaxis: {
categories: categories,
},
yaxis: {
title: {
text: component.get('columnChartModel.title'),
}
},
fill: {
opacity: component.get('columnChartModel.opacity'),
},
};
const colors = component.get('columnChartModel.colors');
if (colors && colors.length > 0) {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default multiColumnChart

View File

@@ -0,0 +1,91 @@
const multiLineChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('lineChartModel.title');
const animated = component.get('lineChartModel.animated') || false;
const dataLabels = component.get('lineChartModel.dataLabels') || {};
const data = component.get('lineChartModel.data');
const onPointClickEventName = component.get('lineChartModel.onPointClickEventName');
const sparkline = component.get('lineChartModel.sparkline');
const series = Object.keys(data).map(key => {
return {
name: key,
data: data[key].map(item => item.value),
}
})
const categories = component.get('lineChartModel.xAxis.categories').length > 0
? component.get('lineChartModel.xAxis.categories')
: data[series[0].name].map(item => item.title)
const options = {
series: series,
chart: {
type: 'line',
height: '100%',
...sparkline,
zoom: { enabled: false },
toolbar: { show: false },
animations: { enabled: animated },
events: {
markerClick: function(event, chartContext, { seriesIndex, dataPointIndex }) {
if (!onPointClickEventName) {
return
}
const point = data[series[seriesIndex].name][dataPointIndex]
component.call('onPointClick', point)
}
}
},
dataLabels: dataLabels,
stroke: component.get('lineChartModel.stroke') || {},
title: {
text: title,
align: 'center'
},
xaxis: {
labels: component.get('lineChartModel.xAxis.labels'),
categories: categories,
},
yaxis: component.get('lineChartModel.yAxis') || {},
};
const colors = component.get('lineChartModel.colors');
if (colors && colors.length > 0) {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default multiLineChart

90
resources/js/pieChart.js Normal file
View File

@@ -0,0 +1,90 @@
const pieChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('pieChartModel.title');
const animated = component.get('pieChartModel.animated') || false
const dataLabels = component.get('pieChartModel.dataLabels') || {}
const onSliceClickEventName = component.get('pieChartModel.onSliceClickEventName')
const data = component.get('pieChartModel.data')
const sparkline = component.get('pieChartModel.sparkline')
const type = component.get('pieChartModel.type')
const options = {
series: data.map(item => item.value),
chart: {
height: '100%',
type: type,
...sparkline,
animations: { enabled: animated },
events: {
dataPointSelection: function(event, chartContext, config) {
if (!onSliceClickEventName) {
return
}
const { dataPointIndex } = config
const slice = data[dataPointIndex]
component.call('onSliceClick', slice)
},
}
},
labels: data.map(item => item.title),
dataLabels: dataLabels,
colors: data.map(item => item.color),
fill: {
opacity: component.get('pieChartModel.opacity'),
},
title: {
text: title,
align: 'center',
},
responsive: [
{
breakpoint: 600,
options: {
legend: {
position: 'bottom'
}
}
}
],
legend: component.get('pieChartModel.legend') || {},
};
const colors = component.get('pieChartModel.colors');
if (colors && colors.length > 0) {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default pieChart

View File

@@ -0,0 +1,97 @@
const radarChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('radarChartModel.title');
const animated = component.get('radarChartModel.animated');
const onPointClickEventName = component.get('areaChartModel.onPointClickEventName');
const dataLabels = component.get('radarChartModel.dataLabels');
const data = component.get('radarChartModel.data');
const sparkline = component.get('radarChartModel.sparkline');
const colors = component.get('radarChartModel.colors');
const series = Object.keys(data)
.map(seriesName => ({
name: seriesName,
data: data[seriesName].map(item => item.value)
}))
const categories = component.get('radarChartModel.xAxis.categories').length > 0
? component.get('radarChartModel.xAxis.categories')
: data[series[0].name].map(item => item.title)
;
const options = {
series: series,
chart: {
type: 'radar',
height: '100%',
...sparkline,
toolbar: {show: false},
animations: {enabled: animated},
events: {
markerClick: function(event, chartContext, {seriesIndex, dataPointIndex}) {
if (!onPointClickEventName) {
return
}
const point = data[series[seriesIndex].name][dataPointIndex]
component.call('onPointClick', point)
},
}
},
legend: component.get('radarChartModel.legend'),
plotOptions: {
bar: {
horizontal: false,
columnWidth: '50%',
},
},
dataLabels: dataLabels,
xaxis: {
categories: categories,
},
title: { text: title },
fill: {
opacity: component.get('radarChartModel.opacity'),
},
colors: colors,
markers: {
size: 4
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default radarChart

View File

@@ -0,0 +1,78 @@
const treeMapChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire)
}, 0)
},
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const title = component.get('treeMapChartModel.title');
const animated = component.get('treeMapChartModel.animated');
const distributed = component.get('treeMapChartModel.distributed');
const onBlockClickEventName = component.get('treeMapChartModel.onBlockClickEventName');
const data = component.get('treeMapChartModel.data');
const colors = component.get('treeMapChartModel.colors');
const enableShades = component.get('treeMapChartModel.enableShades');
const series = Object.keys(data)
.map(seriesName => ({
name: seriesName,
data: data[seriesName].map(item => ({
x: item.title,
y: item.value,
}))
}))
const options = {
series: series,
legend: { show: false },
title: { text: title },
chart: {
height: '100%',
type: 'treemap',
toolbar: {show: false},
animations: {enabled: animated},
events: {
click: function(event, chartContext, {seriesIndex, dataPointIndex}) {
if (!onBlockClickEventName) {
return
}
const block = data[series[seriesIndex].name][dataPointIndex]
component.emit(onBlockClickEventName, block)
},
}
},
plotOptions: {
treemap: {
distributed: distributed,
enableShades: enableShades,
}
},
colors: colors,
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
export default treeMapChart

View File

@@ -1,87 +1,8 @@
<div <div
class="w-full h-full" style="width: 100%; height: 100%;"
x-data="{ ...areaChart() }" x-data="{ ...livewireChartsAreaChart() }"
x-init="drawChart(@this)" x-init="init()"
x-on:draw-column-chart.window="drawChart(@this)"
> >
<div wire:ignore x-ref="container"></div> <div wire:ignore x-ref="container"></div>
<script>
function areaChart() {
return {
chart: null,
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
var options = {
series: [{
name: component.get('areaChartModel.title'),
data: component.get('areaChartModel.data').map(item => item.value)
}],
chart: {
type: 'area',
height: '100%',
zoom: { enabled: false },
toolbar: { show: false },
animations: {
enabled: component.get('areaChartModel.animated') || false,
},
events: {
markerClick: function(event, chartContext, { dataPointIndex }) {
const onPointClickEventName = component.get('areaChartModel.onPointClickEventName')
if (!onPointClickEventName) {
return
}
const point = component.get('areaChartModel.data')[dataPointIndex]
component.call('onPointClick', point)
}
}
},
dataLabels: {
enabled: false
},
colors: [component.get('areaChartModel.color') || '#2E93fA'],
stroke: {
curve: 'straight'
},
title: {
text: component.get('areaChartModel.title'),
align: 'center'
},
labels: component.get('areaChartModel.data').map(item => item.title),
xaxis: component.get('areaChartModel.xAxis') || {},
yaxis: component.get('areaChartModel.yAxis') || {},
grid: {
padding: {
left: 0,
top: 0,
right: 0,
bottom: 0,
}
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
</script>
</div> </div>

View File

@@ -1,97 +1,8 @@
<div <div
class="w-full h-full" style="width: 100%; height: 100%;"
x-data="{ ...columnChart() }" x-data="{ ...livewireChartsColumnChart() }"
x-init="drawChart(@this)" x-init="init()"
x-on:draw-column-chart.window="drawChart(@this)"
> >
<div wire:ignore x-ref="container"></div> <div wire:ignore x-ref="container"></div>
<script>
function columnChart() {
return {
chart: null,
drawChart(component) {
this.renderApex(component)
},
renderApex(component) {
if (this.chart) {
this.chart.destroy()
}
const options = {
series: [{ data: component.get('columnChartModel.data').map(item => item.value)}],
chart: {
type: 'bar',
height: '100%',
toolbar: {
show: false
},
animations: {
enabled: component.get('columnChartModel.animated') || false,
},
events: {
dataPointSelection: function(event, chartContext, config) {
const onColumnClickEventName = component.get('columnChartModel.onColumnClickEventName')
if (!onColumnClickEventName) {
return
}
const { dataPointIndex } = config
const column = component.get('columnChartModel.data')[dataPointIndex]
component.call('onColumnClick', column)
},
}
},
colors: component.get('columnChartModel.data').map(item => item.color),
labels: {
style: {
colors: component.get('columnChartModel.data').map(item => item.color),
},
},
legend: component.get('columnChartModel.legend') || {},
plotOptions: {
bar: {
horizontal: false,
columnWidth: '40%',
distributed: true,
},
},
dataLabels: {
enabled: false,
},
xaxis: {
categories: component.get('columnChartModel.data').map(item => item.title),
},
yaxis: {
title: {
text: component.get('columnChartModel.title'),
}
},
fill: {
opacity: component.get('columnChartModel.opacity') || 0.5
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
</script>
</div> </div>

View File

@@ -1,99 +1,8 @@
<div <div
class="w-full h-full" style="width: 100%; height: 100%;"
x-data="{ ...lineChart() }" x-data="{ ...livewireChartsLineChart() }"
x-init="drawChart(@this)" x-init="init()"
> >
<div wire:ignore x-ref="container"></div> <div wire:ignore x-ref="container"></div>
<script>
function lineChart() {
return {
chart: null,
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const options = {
series: [{
name: component.get('lineChartModel.title'),
data: component.get('lineChartModel.data').map(item => item.value),
}],
chart: {
type: 'line',
height: '100%',
zoom: {
enabled: false
},
toolbar: {
show: false
},
animations: {
enabled: component.get('lineChartModel.animated') || false,
},
events: {
markerClick: function(event, chartContext, { dataPointIndex }) {
const onPointClickEventName = component.get('lineChartModel.onPointClickEventName')
if (!onPointClickEventName) {
return
}
const point = component.get('lineChartModel.data')[dataPointIndex]
component.call('onPointClick', point)
}
}
},
dataLabels: {
enabled: false
},
stroke: component.get('lineChartModel.stroke') || {},
title: {
text: component.get('lineChartModel.title'),
align: 'center'
},
xaxis: {
...component.get('lineChartModel.xAxis') || {},
categories: component.get('lineChartModel.data').map(item => item.title),
},
yaxis: component.get('lineChartModel.yAxis') || {},
annotations: {
points: component.get('lineChartModel.markers').map(item => {
return {
x: item.title,
y: item.value,
marker: {
size: 6,
fillColor: '#fff',
strokeColor: item.strokeColor,
radius: 2,
},
label: {
offsetY: 0,
style: {
color: item.textColor,
background: item.textBackgroundColor,
},
text: item.text || '',
}
}
}
)
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
</script>
</div> </div>

View File

@@ -0,0 +1,8 @@
<div
style="width: 100%; height: 100%;"
x-data="{ ...livewireChartsMultiColumnChart() }"
x-init="init()"
>
<div wire:ignore x-ref="container"></div>
</div>

View File

@@ -0,0 +1,8 @@
<div
style="width: 100%; height: 100%;"
x-data="{ ...livewireChartsMultiLineChart() }"
x-init="init()"
>
<div wire:ignore x-ref="container"></div>
</div>

View File

@@ -1,82 +1,8 @@
<div <div
class="w-full h-full" style="width: 100%; height: 100%;"
x-data="{ ...pieChart() }" x-data="{ ...livewireChartsPieChart() }"
x-init="drawChart(@this)" x-init="init()"
> >
<div wire:ignore x-ref="container"></div> <div wire:ignore x-ref="container"></div>
<script>
function pieChart() {
return {
chart: null,
drawChart(component) {
if (this.chart) {
this.chart.destroy()
}
const options = {
series: component.get('pieChartModel.data').map(item => item.value),
chart: {
height: '100%',
type: 'pie',
animations: {
enabled: component.get('pieChartModel.animated') || false,
},
events: {
dataPointSelection: function(event, chartContext, config) {
const onSliceClickEventName = component.get('pieChartModel.onSliceClickEventName')
if (!onSliceClickEventName) {
return
}
const { dataPointIndex } = config
const slice = component.get('pieChartModel.data')[dataPointIndex]
component.call('onSliceClick', slice)
},
}
},
labels: component.get('pieChartModel.data').map(item => item.title),
dataLabels: {
enabled: false,
},
colors: component.get('pieChartModel.data').map(item => item.color),
fill: {
opacity: component.get('pieChartModel.opacity'),
},
title: {
text: component.get('pieChartModel.title'),
align: 'center',
},
responsive: [
{
breakpoint: 600,
options: {
legend: {
position: 'bottom'
}
}
}
],
legend: component.get('pieChartModel.legend') || {},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart.render();
}
}
}
</script>
</div> </div>

View File

@@ -0,0 +1,7 @@
<div
style="width: 100%; height: 100%;"
x-data="{ ...livewireChartsRadarChart() }"
x-init="init()"
>
<div wire:ignore x-ref="container"></div>
</div>

View File

@@ -0,0 +1,7 @@
<div
style="width: 100%; height: 100%;"
x-data="{ ...livewireChartsTreeMapChart() }"
x-init="init()"
>
<div wire:ignore x-ref="container"></div>
</div>

View File

@@ -31,6 +31,10 @@ class LivewireColumnChart extends Component
public function render() public function render()
{ {
if ($this->columnChartModel['isMultiColumn']) {
return view('livewire-charts::livewire-multi-column-chart');
}
return view('livewire-charts::livewire-column-chart'); return view('livewire-charts::livewire-column-chart');
} }
} }

View File

@@ -31,6 +31,10 @@ class LivewireLineChart extends Component
public function render() public function render()
{ {
if ($this->lineChartModel['isMultiLine']) {
return view('livewire-charts::livewire-multi-line-chart');
}
return view('livewire-charts::livewire-line-chart'); return view('livewire-charts::livewire-line-chart');
} }
} }

View File

@@ -0,0 +1,36 @@
<?php
namespace Asantibanez\LivewireCharts\Charts;
use Asantibanez\LivewireCharts\Models\RadarChartModel;
use Livewire\Component;
/**
* Class LivewireRadarChart
* @package Asantibanez\LivewireCharts\Charts
*/
class LivewireRadarChart extends Component
{
public $radarChartModel;
public function mount(RadarChartModel $radarChartModel)
{
$this->radarChartModel = $radarChartModel->toArray();
}
public function onPointClick($point)
{
$onPointClickEventName = data_get($this->radarChartModel, 'onPointClickEventName', null);
if ($onPointClickEventName === null) {
return;
}
$this->emit($onPointClickEventName, $point);
}
public function render()
{
return view('livewire-charts::livewire-radar-chart');
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Charts;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
use Livewire\Component;
/**
* Class LivewireTreeMapChart
* @package Asantibanez\LivewireCharts\Charts
*/
class LivewireTreeMapChart extends Component
{
public $treeMapChartModel;
public function mount(TreeMapChartModel $treeMapChartModel)
{
$this->treeMapChartModel = $treeMapChartModel->toArray();
}
public function render()
{
return view('livewire-charts::livewire-tree-map-chart');
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace Asantibanez\LivewireCharts\Console;
use Illuminate\Console\Command;
class InstallCommand extends Command
{
protected $signature = 'livewire-charts:install';
protected $description = 'Installs Livewire Charts';
public function handle()
{
$this->call('vendor:publish', ['--tag' => 'livewire-charts:public']);
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Asantibanez\LivewireCharts\Facades;
use Asantibanez\LivewireCharts\Models\AreaChartModel;
use Asantibanez\LivewireCharts\Models\ColumnChartModel;
use Asantibanez\LivewireCharts\Models\LineChartModel;
use Asantibanez\LivewireCharts\Models\PieChartModel;
use Asantibanez\LivewireCharts\Models\RadarChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
use Illuminate\Support\Facades\Facade;
/**
* Class LivewireCharts
* @package Asantibanez\LivewireCharts\Facades
* @method static LineChartModel lineChartModel()
* @method static LineChartModel multiLineChartModel()
* @method static ColumnChartModel columnChartModel()
* @method static ColumnChartModel multiColumnChartModel()
* @method static AreaChartModel areaChartModel()
* @method static PieChartModel pieChartModel()
* @method static RadarChartModel radarChartModel()
* @method static TreeMapChartModel treeMapChartModel()
*/
class LivewireCharts extends Facade
{
protected static function getFacadeAccessor()
{
return 'livewirecharts';
}
}

59
src/LivewireCharts.php Normal file
View File

@@ -0,0 +1,59 @@
<?php
namespace Asantibanez\LivewireCharts;
use Asantibanez\LivewireCharts\Models\AreaChartModel;
use Asantibanez\LivewireCharts\Models\ColumnChartModel;
use Asantibanez\LivewireCharts\Models\LineChartModel;
use Asantibanez\LivewireCharts\Models\PieChartModel;
use Asantibanez\LivewireCharts\Models\RadarChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
class LivewireCharts
{
public function lineChartModel()
{
return (new LineChartModel)
->singleLine();
}
public function multiLineChartModel()
{
return (new LineChartModel)
->multiLine();
}
public function columnChartModel()
{
return (new ColumnChartModel)
->singleColumn();
}
public function multiColumnChartModel()
{
return (new ColumnChartModel)
->multiColumn();
}
public function areaChartModel()
{
return new AreaChartModel;
}
public function pieChartModel()
{
return new PieChartModel;
}
public function radarChartModel()
{
return new RadarChartModel();
}
public function treeMapChartModel()
{
return new TreeMapChartModel();
}
}

View File

@@ -6,35 +6,82 @@ use Asantibanez\LivewireCharts\Charts\LivewireAreaChart;
use Asantibanez\LivewireCharts\Charts\LivewireColumnChart; use Asantibanez\LivewireCharts\Charts\LivewireColumnChart;
use Asantibanez\LivewireCharts\Charts\LivewireLineChart; use Asantibanez\LivewireCharts\Charts\LivewireLineChart;
use Asantibanez\LivewireCharts\Charts\LivewirePieChart; use Asantibanez\LivewireCharts\Charts\LivewirePieChart;
use Asantibanez\LivewireCharts\Charts\LivewireRadarChart;
use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart;
use Asantibanez\LivewireCharts\Console\InstallCommand;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Livewire\Livewire; use Livewire\Livewire;
class LivewireChartsServiceProvider extends ServiceProvider class LivewireChartsServiceProvider extends ServiceProvider
{ {
/**
* Bootstrap the application services.
*/
public function boot() public function boot()
{ {
$this->loadViewsFrom(__DIR__.'/../resources/views', 'livewire-charts'); $this->registerCommands();
$this->registerViews();
$this->registerPublishables();
$this->registerComponents();
$this->registerDirectives();
}
public function register()
{
$this->app->bind('livewirecharts', LivewireCharts::class);
}
private function registerCommands()
{
if ($this->app->runningInConsole()) {
$this->commands([
InstallCommand::class,
]);
}
}
private function registerViews()
{
$this->loadViewsFrom(__DIR__.'/../resources/views', 'livewire-charts');
}
private function registerPublishables()
{
if ($this->app->runningInConsole()) { if ($this->app->runningInConsole()) {
$this->publishes([ $this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/livewire-charts'), __DIR__.'/../resources/views' => resource_path('views/vendor/livewire-charts'),
], 'livewire-charts-views'); ], 'livewire-charts:views');
}
$this->publishes([
__DIR__.'/../resources/js' => resource_path('js/vendor/livewire-charts'),
], 'livewire-charts:scripts');
$this->publishes([
__DIR__.'/../public' => public_path('vendor/livewire-charts'),
], 'livewire-charts:public');
}
}
private function registerComponents()
{
Livewire::component('livewire-line-chart', LivewireLineChart::class); Livewire::component('livewire-line-chart', LivewireLineChart::class);
Livewire::component('livewire-column-chart', LivewireColumnChart::class); Livewire::component('livewire-column-chart', LivewireColumnChart::class);
Livewire::component('livewire-pie-chart', LivewirePieChart::class); Livewire::component('livewire-pie-chart', LivewirePieChart::class);
Livewire::component('livewire-area-chart', LivewireAreaChart::class); Livewire::component('livewire-area-chart', LivewireAreaChart::class);
Livewire::component('livewire-radar-chart', LivewireRadarChart::class);
Livewire::component('livewire-tree-map-chart', LivewireTreeMapChart::class);
} }
/** private function registerDirectives()
* Register the application services.
*/
public function register()
{ {
// Blade::directive('livewireChartsScripts', function () {
$scriptsUrl = asset('/vendor/livewire-charts/app.js');
return <<<EOF
<script src="$scriptsUrl"></script>
EOF;
});
} }
} }

View File

@@ -9,10 +9,6 @@ namespace Asantibanez\LivewireCharts\Models;
*/ */
class AreaChartModel extends BaseChartModel class AreaChartModel extends BaseChartModel
{ {
public $title;
public $animated;
public $color; public $color;
public $data; public $data;
@@ -23,10 +19,6 @@ class AreaChartModel extends BaseChartModel
{ {
parent::__construct(); parent::__construct();
$this->title = '';
$this->animated = false;
$this->color = '#90cdf4'; $this->color = '#90cdf4';
$this->onPointClickEventName = null; $this->onPointClickEventName = null;
@@ -34,20 +26,6 @@ class AreaChartModel extends BaseChartModel
$this->data = collect(); $this->data = collect();
} }
public function setTitle($title)
{
$this->title = $title;
return $this;
}
public function setAnimated($animated)
{
$this->animated = $animated;
return $this;
}
public function setColor($color) public function setColor($color)
{ {
$this->color = $color; $this->color = $color;
@@ -76,8 +54,6 @@ class AreaChartModel extends BaseChartModel
public function toArray() public function toArray()
{ {
return array_merge(parent::toArray(), [ return array_merge(parent::toArray(), [
'title' => $this->title,
'animated' => $this->animated,
'color' => $this->color, 'color' => $this->color,
'onPointClickEventName' => $this->onPointClickEventName, 'onPointClickEventName' => $this->onPointClickEventName,
'data' => $this->data->toArray(), 'data' => $this->data->toArray(),
@@ -88,10 +64,6 @@ class AreaChartModel extends BaseChartModel
{ {
parent::fromArray($array); parent::fromArray($array);
$this->title = data_get($array, 'title', '');
$this->animated = data_get($array, 'animated', false);
$this->color = data_get($array, 'color', '#90cdf4'); $this->color = data_get($array, 'color', '#90cdf4');
$this->onPointClickEventName = data_get($array, 'onPointClickEventName', null); $this->onPointClickEventName = data_get($array, 'onPointClickEventName', null);

View File

@@ -9,15 +9,27 @@ namespace Asantibanez\LivewireCharts\Models;
*/ */
class BaseChartModel class BaseChartModel
{ {
use HasTitle;
use HasAnimation;
use HasAxis; use HasAxis;
use HasStroke; use HasStroke;
use HasLegend; use HasLegend;
use HasDataLabels;
use HasSparkline;
use HasGrid;
use HasColors;
public function __construct() public function __construct()
{ {
$this->initTitle();
$this->initAnimation();
$this->initAxis(); $this->initAxis();
$this->initStroke(); $this->initStroke();
$this->initLegend(); $this->initLegend();
$this->initDataLabels();
$this->initSparkline();
$this->initGrid();
$this->initColors();
} }
public function reactiveKey() public function reactiveKey()
@@ -28,16 +40,28 @@ class BaseChartModel
public function toArray() public function toArray()
{ {
return array_merge( return array_merge(
$this->titleToArray(),
$this->animationToArray(),
$this->axisToArray(), $this->axisToArray(),
$this->strokeToArray(), $this->strokeToArray(),
$this->legendToArray() $this->legendToArray(),
$this->dataLabelsToArray(),
$this->sparklineToArray(),
$this->gridToArray(),
$this->colorsToArray()
); );
} }
public function fromArray($array) public function fromArray($array)
{ {
$this->titleFromArray($array);
$this->animationFromArray($array);
$this->axisFromArray($array); $this->axisFromArray($array);
$this->strokeFromArray($array); $this->strokeFromArray($array);
$this->legendFromArray($array); $this->legendFromArray($array);
$this->dataLabelsFromArray($array);
$this->sparklineFromArray($array);
$this->gridFromArray($array);
$this->colorsFromArray($array);
} }
} }

View File

@@ -6,15 +6,21 @@ namespace Asantibanez\LivewireCharts\Models;
/** /**
* Class ColumnChartModel * Class ColumnChartModel
* @package Asantibanez\LivewireCharts\Models * @package Asantibanez\LivewireCharts\Models
* @property boolean $isMultiColumn
* @property boolean $isStacked
*/ */
class ColumnChartModel extends BaseChartModel class ColumnChartModel extends BaseChartModel
{ {
public $title;
public $animated;
public $opacity; public $opacity;
public $columnWidth;
public $horizontal;
public $isMultiColumn;
public $isStacked;
public $onColumnClickEventName; public $onColumnClickEventName;
public $data; public $data;
@@ -23,27 +29,52 @@ class ColumnChartModel extends BaseChartModel
{ {
parent::__construct(); parent::__construct();
$this->title = '';
$this->animated = false;
$this->onColumnClickEventName = null; $this->onColumnClickEventName = null;
$this->opacity = 0.5; $this->opacity = 0.75;
$this->columnWidth = 70;
$this->horizontal = false;
$this->isMultiColumn = false;
$this->isStacked = false;
$this->data = collect(); $this->data = collect();
} }
public function setTitle($title) public function multiColumn()
{ {
$this->title = $title; $this->isMultiColumn = true;
return $this; return $this;
} }
public function setAnimated($animated) public function singleColumn()
{ {
$this->animated = $animated; $this->isMultiColumn = false;
return $this;
}
public function stacked()
{
$this->isStacked = true;
return $this;
}
public function setHorizontal($value)
{
$this->horizontal = $value;
return $this;
}
public function setColumnWidth($value)
{
$this->columnWidth = $value;
return $this; return $this;
} }
@@ -74,13 +105,31 @@ class ColumnChartModel extends BaseChartModel
return $this; return $this;
} }
public function addSeriesColumn($seriesName, $title, $value, $extras = [])
{
$series = $this->data->get($seriesName, collect());
$series->push([
'seriesName' => $seriesName,
'title' => $title,
'value' => $value,
'extras' => $extras,
]);
$this->data->put($seriesName, $series);
return $this;
}
public function toArray() public function toArray()
{ {
return array_merge(parent::toArray(), [ return array_merge(parent::toArray(), [
'title' => $this->title,
'animated' => $this->animated,
'onColumnClickEventName' => $this->onColumnClickEventName, 'onColumnClickEventName' => $this->onColumnClickEventName,
'opacity' => $this->opacity, 'opacity' => $this->opacity,
'horizontal' => $this->horizontal,
'columnWidth' => $this->columnWidth,
'isMultiColumn' => $this->isMultiColumn,
'isStacked' => $this->isStacked,
'data' => $this->data->toArray(), 'data' => $this->data->toArray(),
]); ]);
} }
@@ -89,14 +138,18 @@ class ColumnChartModel extends BaseChartModel
{ {
parent::fromArray($array); parent::fromArray($array);
$this->title = data_get($array, 'title', '');
$this->animated = data_get($array, 'animated', false);
$this->onColumnClickEventName = data_get($array, 'onColumnClickEventName', null); $this->onColumnClickEventName = data_get($array, 'onColumnClickEventName', null);
$this->opacity = data_get($array, 'opacity', 0.5); $this->opacity = data_get($array, 'opacity', 0.5);
$this->columnWidth = data_get($array, 'columnWidth', 70);
$this->horizontal = data_get($array, 'horizontal', false);
$this->isMultiColumn = data_get($array, 'isMultiColumn', false);
$this->isStacked = data_get($array, 'isStacked', false);
$this->data = collect(data_get($array, 'data', [])); $this->data = collect(data_get($array, 'data', []));
} }
} }

View File

@@ -0,0 +1,39 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasAnimation
{
private $animated;
public function setAnimated($animated)
{
$this->animated = $animated;
return $this;
}
protected function initAnimation()
{
$this->animated = $this->defaultAnimated();
}
private function defaultAnimated()
{
return false;
}
protected function animationFromArray($array)
{
$this->animated = data_get($array, 'animated', $this->defaultAnimated());
}
protected function animationToArray()
{
return [
'animated' => $this->animated,
];
}
}

View File

@@ -10,7 +10,7 @@ trait HasAxis
private $yAxis; private $yAxis;
public function initAxis() protected function initAxis()
{ {
$this->xAxis = $this->defaultXAxis(); $this->xAxis = $this->defaultXAxis();
$this->yAxis = $this->defaultYAxis(); $this->yAxis = $this->defaultYAxis();
@@ -19,6 +19,7 @@ trait HasAxis
private function defaultXAxis() private function defaultXAxis()
{ {
return [ return [
'categories' => [],
'labels' => [ 'labels' => [
'show' => true, 'show' => true,
], ],
@@ -39,6 +40,13 @@ trait HasAxis
return $this; return $this;
} }
public function setXAxisCategories($categories = [])
{
data_set($this->xAxis, 'categories', $categories);
return $this;
}
public function setYAxisVisible($visible) public function setYAxisVisible($visible)
{ {
data_set($this->yAxis, 'show', $visible); data_set($this->yAxis, 'show', $visible);

67
src/Models/HasColors.php Normal file
View File

@@ -0,0 +1,67 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasColors
{
private $colors;
private $enableShades;
public function setColors($colors)
{
$this->colors = $colors;
return $this;
}
public function addColor($color)
{
$this->colors[] = $color;
return $this;
}
public function enableShades()
{
$this->enableShades = true;
return $this;
}
public function disableShades()
{
$this->enableShades = false;
return $this;
}
protected function initColors()
{
$this->colors = $this->defaultColors();
$this->enableShades = true;
}
private function defaultColors()
{
return [];
}
protected function colorsFromArray($array)
{
$this->colors = data_get($array, 'colors', $this->defaultColors());
$this->enableShades = data_get($array, 'enableShades', true);
}
protected function colorsToArray()
{
return [
'colors' => $this->colors,
'enableShades' => $this->enableShades,
];
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasDataLabels
{
private $dataLabels;
public function setDataLabelsEnabled($enabled)
{
data_set($this->dataLabels, 'enabled', $enabled);
return $this;
}
public function withDataLabels()
{
data_set($this->dataLabels, 'enabled', true);
return $this;
}
public function withoutDataLabels()
{
data_set($this->dataLabels, 'enabled', false);
return $this;
}
protected function initDataLabels()
{
$this->dataLabels = $this->defaultDataLabels();
}
private function defaultDataLabels()
{
return [
'enabled' => false,
];
}
protected function dataLabelsFromArray($array)
{
$this->dataLabels = data_get($array, 'dataLabels', $this->defaultDataLabels());
}
protected function dataLabelsToArray()
{
return [
'dataLabels' => $this->dataLabels,
];
}
}

66
src/Models/HasGrid.php Normal file
View File

@@ -0,0 +1,66 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasGrid
{
private $grid;
public function setGridVisible($visible)
{
data_set($this->grid, 'show', $visible);
return $this;
}
public function withGrid()
{
data_set($this->grid, 'show', true);
return $this;
}
public function withoutGrid()
{
data_set($this->grid, 'show', false);
return $this;
}
protected function initGrid()
{
$this->grid = $this->defaultGrid();
}
private function defaultGrid()
{
return [
'show' => false,
'position' => 'back',
'xaxis' => [
'lines' => [
'show' => true,
],
],
'yaxis' => [
'lines' => [
'show' => true,
],
],
];
}
protected function gridFromArray($array)
{
$this->grid = data_get($array, 'grid', $this->defaultGrid());
}
protected function gridToArray()
{
return [
'grid' => $this->grid,
];
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasSparkline
{
private $sparkline;
public function setSparklineEnabled($isEnabled)
{
data_set($this->sparkline, 'sparkline.enabled', $isEnabled);
return $this;
}
public function sparklined()
{
return $this->setSparklineEnabled(true);
}
protected function initSparkline()
{
$this->sparkline = $this->defaultSparkline();
}
private function defaultSparkline()
{
return [
'sparkline' => [
'enabled' => false,
],
];
}
protected function sparklineFromArray($array)
{
$this->sparkline = data_get($array, 'sparkline', $this->defaultSparkline());
}
protected function sparklineToArray()
{
return [
'sparkline' => $this->sparkline,
];
}
}

View File

@@ -7,6 +7,7 @@ namespace Asantibanez\LivewireCharts\Models;
trait HasStroke trait HasStroke
{ {
private $stroke; private $stroke;
private $width;
public function initStroke() public function initStroke()
{ {
@@ -17,6 +18,7 @@ trait HasStroke
{ {
return [ return [
'curve' => 'straight', 'curve' => 'straight',
'width' => 4
]; ];
} }
@@ -34,6 +36,13 @@ trait HasStroke
return $this; return $this;
} }
public function setStrokeWidth($width)
{
data_set($this->stroke, 'width', $width);
return $this;
}
protected function strokeToArray() protected function strokeToArray()
{ {
return [ return [

39
src/Models/HasTitle.php Normal file
View File

@@ -0,0 +1,39 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
trait HasTitle
{
private $title;
public function setTitle($title)
{
$this->title = $title;
return $this;
}
protected function initTitle()
{
$this->title = $this->defaultTitle();
}
private function defaultTitle()
{
return '';
}
protected function titleFromArray($array)
{
$this->title = data_get($array, 'title', $this->defaultTitle());
}
protected function titleToArray()
{
return [
'title' => $this->title,
];
}
}

View File

@@ -3,15 +3,16 @@
namespace Asantibanez\LivewireCharts\Models; namespace Asantibanez\LivewireCharts\Models;
use Illuminate\Support\Collection;
/** /**
* Class LineChartModel * Class LineChartModel
* @package Asantibanez\LivewireCharts\Models * @package Asantibanez\LivewireCharts\Models
* @property boolean $isMultiLine
*/ */
class LineChartModel extends BaseChartModel class LineChartModel extends BaseChartModel
{ {
public $title; public $isMultiLine;
public $animated;
public $data; public $data;
@@ -23,9 +24,7 @@ class LineChartModel extends BaseChartModel
{ {
parent::__construct(); parent::__construct();
$this->title = ''; $this->isMultiLine = false;
$this->animated = false;
$this->onPointClickEventName = null; $this->onPointClickEventName = null;
@@ -34,16 +33,20 @@ class LineChartModel extends BaseChartModel
$this->markers = collect(); $this->markers = collect();
} }
public function setTitle($title) public function multiLine()
{ {
$this->title = $title; $this->isMultiLine = true;
$this->data = collect();
return $this; return $this;
} }
public function setAnimated($animated) public function singleLine()
{ {
$this->animated = $animated; $this->isMultiLine = false;
$this->data = collect();
return $this; return $this;
} }
@@ -59,6 +62,22 @@ class LineChartModel extends BaseChartModel
return $this; return $this;
} }
public function addSeriesPoint($seriesName, $title, $value, $extras = [])
{
$series = $this->data->get($seriesName, collect());
$series->push([
'seriesName' => $seriesName,
'title' => $title,
'value' => $value,
'extras' => $extras,
]);
$this->data->put($seriesName, $series);
return $this;
}
public function addMarker($title, public function addMarker($title,
$value, $value,
$strokeColor = 'green', $strokeColor = 'green',
@@ -88,8 +107,7 @@ class LineChartModel extends BaseChartModel
public function toArray() public function toArray()
{ {
return array_merge(parent::toArray(), [ return array_merge(parent::toArray(), [
'title' => $this->title, 'isMultiLine' => $this->isMultiLine,
'animated' => $this->animated,
'onPointClickEventName' => $this->onPointClickEventName, 'onPointClickEventName' => $this->onPointClickEventName,
'data' => $this->data->toArray(), 'data' => $this->data->toArray(),
'markers' => $this->markers->toArray(), 'markers' => $this->markers->toArray(),
@@ -100,9 +118,7 @@ class LineChartModel extends BaseChartModel
{ {
parent::fromArray($array); parent::fromArray($array);
$this->title = data_get($array, 'title', ''); $this->isMultiLine = data_get($array, 'isMultiLine', false);
$this->animated = data_get($array, 'animated', false);
$this->onPointClickEventName = data_get($array, 'onPointClickEventName', null); $this->onPointClickEventName = data_get($array, 'onPointClickEventName', null);

View File

@@ -9,45 +9,27 @@ namespace Asantibanez\LivewireCharts\Models;
*/ */
class PieChartModel extends BaseChartModel class PieChartModel extends BaseChartModel
{ {
public $title;
public $animated;
public $onSliceClickEventName; public $onSliceClickEventName;
public $opacity; public $opacity;
public $type;
public $data; public $data;
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->title = '';
$this->animated = false;
$this->onSliceClickEventName = null; $this->onSliceClickEventName = null;
$this->opacity = 0.75; $this->opacity = 0.75;
$this->type = 'pie';
$this->data = collect(); $this->data = collect();
} }
public function setTitle($title)
{
$this->title = $title;
return $this;
}
public function setAnimated($animated)
{
$this->animated = $animated;
return $this;
}
public function setOpacity($opacity) public function setOpacity($opacity)
{ {
$this->opacity = $opacity; $this->opacity = $opacity;
@@ -55,6 +37,13 @@ class PieChartModel extends BaseChartModel
return $this; return $this;
} }
public function setType($type)
{
$this->type = $type;
return $this;
}
public function withOnSliceClickEvent($onSliceClickEventName) public function withOnSliceClickEvent($onSliceClickEventName)
{ {
$this->onSliceClickEventName = $onSliceClickEventName; $this->onSliceClickEventName = $onSliceClickEventName;
@@ -77,10 +66,9 @@ class PieChartModel extends BaseChartModel
public function toArray() public function toArray()
{ {
return array_merge(parent::toArray(), [ return array_merge(parent::toArray(), [
'title' => $this->title,
'animated' => $this->animated,
'onSliceClickEventName' => $this->onSliceClickEventName, 'onSliceClickEventName' => $this->onSliceClickEventName,
'opacity' => $this->opacity, 'opacity' => $this->opacity,
'type' => $this->type,
'data' => $this->data->toArray(), 'data' => $this->data->toArray(),
]); ]);
} }
@@ -89,14 +77,12 @@ class PieChartModel extends BaseChartModel
{ {
parent::fromArray($array); parent::fromArray($array);
$this->title = data_get($array, 'title', '');
$this->animated = data_get($array, 'animated', false);
$this->onSliceClickEventName = data_get($array, 'onSliceClickEventName', null); $this->onSliceClickEventName = data_get($array, 'onSliceClickEventName', null);
$this->opacity = data_get($array, 'opacity', 0.75); $this->opacity = data_get($array, 'opacity', 0.75);
$this->type = data_get($array, 'type', 'pie');
$this->data = collect(data_get($array, 'data', [])); $this->data = collect(data_get($array, 'data', []));
} }
} }

View File

@@ -0,0 +1,95 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
/**
* Class ColumnChartModel
* @package Asantibanez\LivewireCharts\Models
* @property boolean $isMultiColumn
* @property boolean $isStacked
*/
class RadarChartModel extends BaseChartModel
{
public $opacity;
public $colors;
public $onPointClickEventName;
public $data;
public function __construct()
{
parent::__construct();
$this->onPointClickEventName = null;
$this->opacity = 0.5;
$this->colors = ['#2E93fA', '#66DA26', '#546E7A', '#E91E63', '#FF9800'];
$this->data = collect();
}
public function setColors($colors)
{
$this->colors = $colors;
return $this;
}
public function setOpacity($opacity)
{
$this->opacity = $opacity;
return $this;
}
public function withOnPointClickEvent($onPointClickEventName)
{
$this->onPointClickEventName = $onPointClickEventName;
return $this;
}
public function addSeries($seriesName, $title, $value, $extras = [])
{
$series = $this->data->get($seriesName, collect());
$series->push([
'seriesName' => $seriesName,
'title' => $title,
'value' => $value,
'extras' => $extras,
]);
$this->data->put($seriesName, $series);
return $this;
}
public function toArray()
{
return array_merge(parent::toArray(), [
'onPointClickEventName' => $this->onPointClickEventName,
'opacity' => $this->opacity,
'colors' => $this->colors,
'data' => $this->data->toArray(),
]);
}
public function fromArray($array)
{
parent::fromArray($array);
$this->onPointClickEventName = data_get($array, 'onPointClickEventName', null);
$this->opacity = data_get($array, 'opacity', 0.5);
$this->colors = data_get($array, 'color', '#90cdf4');
$this->data = collect(data_get($array, 'data', []));
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
/**
* Class TreeMapChartModel
* @package Asantibanez\LivewireCharts\Models
*/
class TreeMapChartModel extends BaseChartModel
{
use HasTitle;
use HasColors;
public $data;
public $distributed;
public $onBlockClickEventName;
public function __construct()
{
parent::__construct();
$this->data = collect();
$this->distributed = false;
$this->setColors(['#2E93fA']);
}
public function setDistributed($distributed)
{
$this->distributed = $distributed;
return $this;
}
public function addBlock($title, $value, $extras = [])
{
return $this->addSeriesBlock($this->title, $title, $value, $extras);
}
public function addSeriesBlock($seriesName, $title, $value, $extras = [])
{
$series = $this->data->get($seriesName, collect());
$series->push([
'seriesName' => $seriesName,
'title' => $title,
'value' => $value,
'extras' => $extras,
]);
$this->data->put($seriesName, $series);
return $this;
}
public function withOnBlockClickEvent($onBlockClickEventName)
{
$this->onBlockClickEventName = $onBlockClickEventName;
return $this;
}
public function toArray()
{
return array_merge(parent::toArray(), [
'data' => $this->data->toArray(),
'distributed' => $this->distributed,
'onBlockClickEventName' => $this->onBlockClickEventName,
]);
}
public function fromArray($array)
{
parent::fromArray($array);
$this->data = collect(data_get($array, 'data', []));
$this->distributed = data_get($array, 'distributed', false);
$this->onBlockClickEventName = data_get($array, 'onBlockClickEventName', null);
}
}

View File

@@ -1,21 +0,0 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Orchestra\Testbench\TestCase;
use Asantibanez\LivewireCharts\LivewireChartsServiceProvider;
class ExampleTest extends TestCase
{
protected function getPackageProviders($app)
{
return [LivewireChartsServiceProvider::class];
}
/** @test */
public function true_is_true()
{
$this->assertTrue(true);
}
}

25
tests/LivewireAreaChartTest.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireAreaChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireAreaChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewireAreaChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireColumnChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireColumnChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewireColumnChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

25
tests/LivewireLineChartTest.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireLineChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireLineChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewireLineChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

25
tests/LivewirePieChartTest.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewirePieChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewirePieChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewirePieChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireRadarChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireRadarChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewireRadarChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireTreeMapChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
{
return Livewire::test(LivewireTreeMapChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
}

25
tests/TestCase.php Executable file
View File

@@ -0,0 +1,25 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\LivewireChartsServiceProvider;
use Livewire\LivewireServiceProvider;
use Orchestra\Testbench\TestCase as BaseTestCase;
class TestCase extends BaseTestCase
{
protected function getPackageProviders($app)
{
return [
LivewireServiceProvider::class,
LivewireChartsServiceProvider::class
];
}
protected function getEnvironmentSetUp($app)
{
$app['config']->set('app.key', 'base64:Hupx3yAySikrM2/edkZQNQHslgDWYfiBfCuSThJ5SK8=');
}
}

3
webpack.mix.js Normal file
View File

@@ -0,0 +1,3 @@
let mix = require('laravel-mix')
mix.js('resources/js/app.js', 'public/')