68 Commits

Author SHA1 Message Date
asantibanez
35324eace3 Added Radial chart 2024-08-22 14:42:07 -05:00
asantibanez
c30c408fe2 Fixed property access 2024-08-22 13:04:12 -05:00
asantibanez
b182546766 Removed duplicate traits 2024-08-22 12:56:22 -05:00
asantibanez
3014bb1ab3 Namespaced traits 2024-08-22 12:56:14 -05:00
asantibanez
343ebbaeee Improved README 2024-08-22 10:41:44 -05:00
asantibanez
79f61f15f6 Fixed CI 2024-08-22 10:19:16 -05:00
asantibanez
af540f428c Fixed CI 2024-08-22 10:15:17 -05:00
asantibanez
e2f9c814e2 Fixed CI 2024-08-22 10:10:15 -05:00
asantibanez
b04c338283 Changed CI to 8.2 2024-08-22 09:21:00 -05:00
asantibanez
98ffca8cf3 Changed CI to 8.3 2024-08-22 09:17:49 -05:00
asantibanez
d31ed188a9 Migrated configuration 2024-08-22 09:17:32 -05:00
Andrés Santibáñez
08d60e1ffa Merge pull request #122 from laravel-shift/l11-compatibility
Laravel 11.x Compatibility
2024-08-22 08:48:46 -05:00
Shift
fc0c122926 Bump dependencies for Laravel 11 2024-02-27 15:28:13 +00:00
Andrés Santibáñez
d58465084e Merge pull request #105 from redsquirrelstudio/livewire-3-event-fix
Changed 'emit' functions in Area,Line, and Radar chart to 'dispatch' …
2023-11-07 14:50:23 -05:00
Andrés Santibáñez
5a222abdbf Merge pull request #108 from stijnvanouplines/master
Added missing jsonConfig
2023-11-07 14:40:56 -05:00
Stijn Vanouplines
af44417115 Added missing jsonConfig 2023-10-27 17:37:09 +02:00
Lewis Raggett
4c70acd41c Changed 'emit' functions in Area,Line, and Radar chart to 'dispatch' to work with Livewire 3 2023-10-05 11:41:49 +01:00
asantibanez
ca044277ee Updated README 2023-08-24 10:04:02 -05:00
asantibanez
badbd7d872 Fixed README 2023-07-25 17:22:42 -05:00
asantibanez
802416ee7a v3.0.0 released 2023-07-25 17:14:18 -05:00
asantibanez
d957e698bb Updated build 2023-07-25 17:10:45 -05:00
asantibanez
46d82cf6bc Refactored how event was triggered 2023-07-25 17:07:51 -05:00
asantibanez
1f26a9ed39 Updated README 2023-07-25 16:58:00 -05:00
asantibanez
55d76bcecd Fixed error dispatching 2023-07-25 16:51:53 -05:00
asantibanez
5034771e57 Added helper methods 2023-07-25 16:51:45 -05:00
asantibanez
6b2667f590 Changed properties visibility 2023-07-25 16:51:35 -05:00
asantibanez
c5784b0ced Added helper methods for PieChartModel 2023-07-25 16:28:59 -05:00
asantibanez
2d9bcfe480 Fixed event dispatching. Added tests. 2023-07-25 16:19:04 -05:00
asantibanez
aa822000af Made properties private so everything is accessed via methods 2023-07-25 16:18:48 -05:00
asantibanez
682b282fe8 Updated dependencies 2023-07-25 16:18:19 -05:00
asantibanez
de936c77d6 Fixed arguments 2023-07-25 16:18:03 -05:00
asantibanez
17efda3ed0 Merge branch 'master' of github.com:asantibanez/livewire-charts 2023-07-25 13:50:56 -05:00
Andrés Santibáñez
25b13b3573 Merge pull request #50 from syntaxlexx/theme-mods
Feat: added theme setting options - dark mode, palette
2023-07-25 14:48:22 -04:00
asantibanez
30eae50c04 Bumped up CI 2023-07-25 13:43:41 -05:00
asantibanez
c79dfeb0ab Refactored tests with new Testable class 2023-07-25 13:42:43 -05:00
asantibanez
3dcc97bef3 Started Livewire v3 support 2023-07-25 13:42:29 -05:00
/SyntaxLexx
c408b639e9 Merge branch 'master' into theme-mods 2023-06-10 03:44:07 +03:00
asantibanez
ac1e6130d4 Updated export 2023-02-01 18:32:57 -05:00
asantibanez
756781c3a9 Added ability to add custom configs to pie charts 2023-02-01 18:32:06 -05:00
asantibanez
93dbaffc61 Added custom configs to Column Chart 2023-02-01 18:28:06 -05:00
asantibanez
6926a504b1 Added deepmerge dependency 2023-02-01 18:24:15 -05:00
asantibanez
40828df23e Added ability to specify custom json config to charts 2023-02-01 18:23:53 -05:00
asantibanez
9f9554314e v2.5.0 released 2023-02-01 13:16:56 -05:00
asantibanez
c7997758bd Added ability to format value via "extras.formatted" 2023-02-01 13:13:28 -05:00
asantibanez
5bc85376a3 Extracted title 2023-02-01 13:13:28 -05:00
Andrés Santibáñez
e6c34e2d49 Merge pull request #83 from laravel-shift/l10-compatibility
Laravel 10.x Compatibility
2023-02-01 12:40:17 -05:00
asantibanez
66ce742311 v2.4.2 released 2023-02-01 12:38:11 -05:00
asantibanez
cd56963f6e Extracted value into variable 2023-02-01 12:35:21 -05:00
asantibanez
ce43d0b97c Fixed column title 2023-02-01 12:35:10 -05:00
Shift
d1ce67f9e5 Bump dependencies for Laravel 10 2023-01-31 19:47:59 +00:00
Lexx YungCarter
1e04ebf6d9 feat: merged with master 2022-10-17 16:02:42 +03:00
asantibanez
072a98da5c Updated CHANGELOG 2022-02-18 16:47:04 -05:00
asantibanez
27198d12b8 Fixed xAxis auto-labels for MultiColumnChart 2022-02-18 16:43:46 -05:00
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
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
Lexx YungCarter
9ad481000c fix: typo in palette 2021-08-01 05:16:16 +03:00
Lexx YungCarter
fe0c62be75 feat: added theme setting options - dark mode, pallates 2021-08-01 05:13:49 +03:00
60 changed files with 7673 additions and 4271 deletions

View File

@@ -15,15 +15,15 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.0'
php-version: '8.3'
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, exif, imagick, bcmath
coverage: none
coverage: xdebug
- name: Checkout code
uses: actions/checkout@v2
- name: Install Composer dependencies
run: composer install --ignore-platform-reqs
run: composer install
- name: Run tests
run: ./vendor/bin/phpunit
run: XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text

View File

@@ -0,0 +1 @@
{"version":1,"defects":{"Asantibanez\\LivewireCharts\\Tests\\LivewirePieChartTest::can_build_component":7},"times":{"Asantibanez\\LivewireCharts\\Tests\\LivewireAreaChartTest::can_build_component":0.026,"Asantibanez\\LivewireCharts\\Tests\\LivewireColumnChartTest::can_build_component":0.003,"Asantibanez\\LivewireCharts\\Tests\\LivewireColumnChartTest::should_emit_event_if_present":0.01,"Asantibanez\\LivewireCharts\\Tests\\LivewireLineChartTest::can_build_component":0.003,"Asantibanez\\LivewireCharts\\Tests\\LivewirePieChartTest::can_build_component":0.025,"Asantibanez\\LivewireCharts\\Tests\\LivewirePieChartTest::should_emit_event_if_present":0.011,"Asantibanez\\LivewireCharts\\Tests\\LivewireRadarChartTest::can_build_component":0.003,"Asantibanez\\LivewireCharts\\Tests\\LivewireTreeMapChartTest::can_build_component":0.004,"Asantibanez\\LivewireCharts\\Tests\\LivewireTreeMapChartTest::should_emit_event_if_present":0.008}}

View File

@@ -1,5 +1,34 @@
# Changelog
## 4.1.0 - 2024-08-22
- Added Radial chart
## 4.0.0 - 2024-08-22
- Added Laravel 11 support
## 3.1.0 - 2023-11-07
- Added missing jsonConfig (thanks to @stijnvanouplines)
- Changed 'emit' functions in Area,Line, and Radar chart to 'dispatch' (thanks to @redsquirrelstudio)
## 3.0.0 - 2023-07-25
- Added Livewire v3 support
- Added ability to set chart theme (thanks to @syntaxlexx)
- Added ability to configure chart via JSON properties
## 2.5.0 - 2023-02-01
- Added tooltip override via `extras.tooltip`
## 2.4.2 - 2023-02-01
- Fixed hover title on column chart
## 2.4.1 - 2022-02-18
- Fixed xAxis auto-categories for MultiColumnChart
## 2.4.0 - 2022-02-14
- Added Radar Chart (thanks to @AlexHupe)
- Added Tree Map Chart
- Added "donut" type to Pie Chart (thanks to @nicko170)
## 2.3.0 - 2021-02-12
- Added `init()` method for better boot and $wire hoisting
- Added color customization for columns, multiline and pie chart

160
README.md
View File

@@ -5,6 +5,7 @@
## Preview
![preview](https://github.com/asantibanez/livewire-charts/raw/master/preview.gif)
![preview](./preview_radarchart.gif)
## Demo
@@ -18,19 +19,19 @@ You can install the package via composer:
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.
Next, you must export the package public scripts. To do this run
```bash
php artisan vendor:publish --tag=livewire-charts:public
```
php artisan livewire-charts:install
```
This command will export a `vendor/livewire-charts` folder under the `public` directory of your app which is used
by the `@livewireChartsScripts` directive. More on this topic later.
## Requirements
This package requires the following packages/libraries to work:
- `Laravel Livewire v2` (https://laravel-livewire.com/)
- `Alpine Js` (https://github.com/alpinejs/alpine)
- `Laravel Livewire v3` (https://livewire.laravel.com/)
- `Apex Charts` (https://apexcharts.com/)
Please follow each package/library instructions on how to set them properly in your project.
@@ -44,12 +45,18 @@ Livewire Charts supports out of the box the following types of charts
- Pie Chart (`LivewirePieChart` component)
- Column/Multi Line Chart (`LivewireColumnChart` component)
- Area Chart (`LivewireAreaChart` component)
- Radar Chart (`LivewireRadarChart` component)
- Tree Map Chart (`LivewireTreeMapChart` component)
- Radial Chart (`LivewireRadialChart` component)
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.
- `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.
- `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.
- `LivewireRadialChart` uses `RadialChartModel` to set up data bars, 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
```php
@@ -68,14 +75,16 @@ With `$columnChartModel` at hand, we pass it to our `LivewireColumnChart` compon
```blade
<livewire:livewire-column-chart
{{-- key="{{ $columnChartModel->reactiveKey() }}" --}}
:column-chart-model="$columnChartModel"
/>
```
>Note: Optionally add "key" to enable props reactivity if needed 💪
Next, include the `@livewireChartsScripts` directive next to your other app scripts
```html
<livewire:scripts />
@livewireScripts
@livewireChartsScripts
```
@@ -97,6 +106,9 @@ LivewireCharts::columnChartModel();
LivewireCharts::multiColumnChartModel();
LivewireCharts::pieChartModel();
LivewireCharts::areaChartModel();
LivewireCharts::radarChartModel();
LivewireCharts::treeMapChartModel();
LivewireCharts::radialChartModel();
```
## Enabling Interactions
@@ -117,10 +129,12 @@ $columnChartModel =
We can listen to the `onClickEvent` registering a listener in any other Livewire component.
```php
protected $listeners = [
'onColumnClick' => 'handleOnColumnClick',
];
```
#[On('onColumnClick')]
public function handleOnColumnClick($event)
{
// Handle event
}
```
## "Reactive" Charts
@@ -157,24 +171,25 @@ 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 type of chart.
#### All
### All
| Method | Description |
|--------|-------------|
| setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation |
| setDataLabelsEnabled(boolean $enabled) | Enables/disables data labels |
| 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 |
| Method | Description |
|-----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
| setTitle(string $title) | Sets chart title |
| setAnimated(boolean $animated) | Enables/disables animation |
| setDataLabelsEnabled(boolean $enabled) | Enables/disables data labels |
| 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 |
| setJsonConfig(array $config) | Adds extra customization to charts by passing Apex charts properties keys and values. Nested keys must be added using dot (.) notation |
#### LivewireLineChart
### LivewireLineChart
| Method | Description |
|--------|-------------|
@@ -185,29 +200,32 @@ for each type of chart.
| 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 |
#### LivewireColumnChart
### LivewireColumnChart
| Method | Description |
|--------|-------------|
| 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 |
| 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 |
| Method | Description |
|---------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| setOpacity(int $opacity) | Sets columns' opacity |
| setColumnWidth(int $columnWidth) | Sets columns' width |
| setHorizontal() | Displays columns horizontally |
| setVertical() | Displays columns vertically |
| 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 |
| addSeriesColumn(string $seriesName, string $title, double $value, array $extras = []) | Adds a column to a multicolumn chart. `$extras` is forwarded on click event |
| withOnColumnClickEventName(string $eventName) | Event Name that will be fired when a column of the chart is clicked |
#### LivewirePieChart
### LivewirePieChart
| Method | Description |
|--------|-------------|
| setOpacity(int $opacity) | Sets slices' opacity |
| Method | Description |
|---------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|
| setOpacity(int $opacity) | Sets slices' opacity |
| asPie() | Displays chart as pie |
| asDonut() | Displays chart as donut |
| 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 |
|--------|-------------|
@@ -216,6 +234,31 @@ for each type of chart.
| setXAxisVisible(boolean $visible) | Shows/hides xAxis 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 |
### LivewireRadialChart
| Method | Description |
|--------------------------------------------------------------------------------|------------------------------------------------------------------|
| addBar(string $title, double $value, string $color = null, array $extras = []) | Adds a bar to the default series |
| withOnBarClickEvent(string $eventName) | Event Name that will be fired when a bar of the chart is clicked |
| showTotal() | Show the total percetage to the graph |
| hideTotal() | Hides the total percetage to the graph |
## Advanced Usage - Integrating Scripts
The directive `@livewireChartsScripts` adds a `script` tag that includes `public/vendor/livewire-charts/app.js`.
@@ -225,6 +268,31 @@ inside your resources folder. You can then adjust imports as you see fit in your
>Note: You must remove @livewireChartsScripts directive so it doesn't clash with the scripts in your build system.
## Advanced Usage - Custom Json Configs
The `setJsonConfig()` method on every chart allows adding custom Apex properties not provided first hand by the package.
This means that any chart property supported by Apex chart can be passed down using this method.
```php
$chart->setJsonConfig([
'plotOptions.pie.startAngle' => -90,
'plotOptions.pie.endAngle' => 90,
'plotOptions.pie.offsetY' => 10,
'grid.padding.bottom' => -180,
]);
```
>Note: If you want to add nested properties, you can use dot (.) notation for this matter.
You can even pass down simple JS functions. For example, for formatting you can pass down your own closure
```php
$chart->setJsonConfig([
'tooltip.y.formatter' => '(val) => `$${val} million dollars baby!`'
])
```
## Troubleshooting
Chart components must be placed inside a container with fixed height. This is because the chart will use all the given

View File

@@ -17,12 +17,12 @@
],
"require": {
"php": "^7.2|^7.3|^7.4|^8.0",
"illuminate/support": "^7.0|^8.0|^9.0",
"livewire/livewire": "^2.3"
"illuminate/support": "^7.0|^8.0|^9.0|^10.0|^11.0",
"livewire/livewire": "^3.0"
},
"require-dev": {
"orchestra/testbench": "^5.0|^6.0|^7.0",
"phpunit/phpunit": "^8.0"
"orchestra/testbench": "^5.0|^6.0|^7.0|^8.0|^9.0",
"phpunit/phpunit": "^8.0|^9.5.10|^10.5"
},
"autoload": {
"psr-4": {
@@ -37,7 +37,6 @@
"scripts": {
"test": "vendor/bin/phpunit",
"test-coverage": "vendor/bin/phpunit --coverage-html coverage"
},
"config": {
"sort-packages": true
@@ -51,5 +50,7 @@
"LivewireCharts": "Asantibanez\\LivewireCharts\\LivewireChartsFacade"
}
}
}
},
"minimum-stability": "dev",
"prefer-stable": true
}

10410
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,5 +12,8 @@
"cross-env": "^7.0.2",
"laravel-mix": "^5.0.9",
"vue-template-compiler": "^2.6.12"
},
"dependencies": {
"deepmerge": "^2.2.1"
}
}

View File

@@ -1,29 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
verbose="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
bootstrap="vendor/autoload.php"
backupGlobals="false"
colors="true"
processIsolation="false"
stopOnFailure="false"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
cacheDirectory=".phpunit.cache"
backupStaticProperties="false"
>
<coverage>
<report>
<clover outputFile="build/logs/clover.xml"/>
<html outputDirectory="build/coverage"/>
<text outputFile="build/coverage.txt"/>
</report>
</coverage>
<testsuites>
<testsuite name="Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
<logging>
<log type="tap" target="build/report.tap"/>
<log type="junit" target="build/report.junit.xml"/>
<log type="coverage-html" target="build/coverage"/>
<log type="coverage-text" target="build/coverage.txt"/>
<log type="coverage-clover" target="build/logs/clover.xml"/>
<junit outputFile="build/report.junit.xml"/>
</logging>
<source>
<include>
<directory suffix=".php">src/</directory>
</include>
</source>
</phpunit>

BIN
preview_radarchart.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
/*!
* ApexCharts v3.22.2
* (c) 2018-2020 Juned Chhipa
* ApexCharts v3.41.0
* (c) 2018-2023 ApexCharts
* Released under the MIT License.
*/

View File

@@ -1,10 +1,13 @@
import ApexCharts from 'apexcharts'
import areaChart from "./areaChart"
import columnChart from "./columnChart"
import multiColumnChart from "./multiColumnChart";
import multiColumnChart from "./multiColumnChart"
import lineChart from "./lineChart"
import multiLineChart from "./multiLineChart"
import pieChart from "./pieChart"
import radarChart from "./radarChart"
import treeMapChart from "./treeMapChart"
import radialChart from "./radialChart"
window.ApexCharts = ApexCharts
window.livewireChartsAreaChart = areaChart
@@ -13,3 +16,6 @@ window.livewireChartsLineChart = lineChart
window.livewireChartsMultiLineChart = multiLineChart
window.livewireChartsPieChart = pieChart
window.livewireChartsMultiColumnChart = multiColumnChart
window.livewireChartsRadarChart = radarChart
window.livewireChartsTreeMapChart = treeMapChart
window.livewireChartsRadialChart = radialChart

View File

@@ -1,3 +1,4 @@
import { mergedOptionsWithJsonConfig } from './helpers'
const areaChart = () => {
return {
@@ -20,6 +21,7 @@ const areaChart = () => {
const onPointClickEventName = component.get('areaChartModel.onPointClickEventName')
const data = component.get('areaChartModel.data');
const sparkline = component.get('areaChartModel.sparkline');
const jsonConfig = component.get('areaChartModel.jsonConfig');
const categories = component.get('areaChartModel.xAxis.categories').length > 0
? component.get('areaChartModel.xAxis.categories')
@@ -83,9 +85,12 @@ const areaChart = () => {
bottom: 0,
}
},
theme: component.get('areaChartModel.theme') || {},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

View File

@@ -1,3 +1,4 @@
import { mergedOptionsWithJsonConfig } from './helpers'
const columnChart = () => {
return {
@@ -14,6 +15,7 @@ const columnChart = () => {
this.chart.destroy()
}
const title = component.get('columnChartModel.title')
const animated = component.get('columnChartModel.animated') || false;
const onColumnClickEventName = component.get('columnChartModel.onColumnClickEventName')
const dataLabels = component.get('columnChartModel.dataLabels') || {};
@@ -22,9 +24,13 @@ const columnChart = () => {
const grid = component.get('columnChartModel.grid');
const columnWidth = component.get('columnChartModel.columnWidth');
const horizontal = component.get('columnChartModel.horizontal');
const jsonConfig = component.get('columnChartModel.jsonConfig');
const data = component.get('columnChartModel.data');
const series = [{ data: data.map(item => item.value)}]
const series = [{
name: title,
data: data.map(item => item.value)
}]
const options = {
series: series,
@@ -80,13 +86,24 @@ const columnChart = () => {
yaxis: {
title: {
text: component.get('columnChartModel.title'),
text: title,
}
},
fill: {
opacity: component.get('columnChartModel.opacity') || 0.5
},
theme: component.get('columnChartModel.theme') || {},
tooltip: {
y: {
formatter: function(value, series) {
return data[series.dataPointIndex].extras.tooltip || value;
}
}
},
};
const colors = component.get('columnChartModel.colors');
@@ -95,7 +112,7 @@ const columnChart = () => {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

27
resources/js/helpers.js Normal file
View File

@@ -0,0 +1,27 @@
import deepmerge from 'deepmerge'
export const addPathToObjectWithValue = (obj, path, value) => {
const pList = path.split('.');
const key = pList.pop();
const pointer = pList.reduce((accumulator, currentValue) => {
if (accumulator[currentValue] === undefined) accumulator[currentValue] = {};
return accumulator[currentValue];
}, obj);
pointer[key] = value;
return obj;
}
export const mergedOptionsWithJsonConfig = (options, jsonConfig) => {
const customOptions = Object.keys(jsonConfig)
.reduce(function (obj, key) {
const value = jsonConfig[key]
if (typeof value === 'string' && value.includes('function')) {
return addPathToObjectWithValue(obj, key, eval('(' + value + ')'))
}
return addPathToObjectWithValue(obj, key, eval(value))
}, {})
return deepmerge(options, customOptions)
}

View File

@@ -1,3 +1,4 @@
import { mergedOptionsWithJsonConfig } from './helpers'
const lineChart = () => {
return {
@@ -20,6 +21,7 @@ const lineChart = () => {
const data = component.get('lineChartModel.data');
const onPointClickEventName = component.get('lineChartModel.onPointClickEventName');
const sparkline = component.get('lineChartModel.sparkline');
const jsonConfig = component.get('lineChartModel.jsonConfig');
const series = [{
name: title,
@@ -61,6 +63,8 @@ const lineChart = () => {
stroke: component.get('lineChartModel.stroke') || {},
theme: component.get('lineChartModel.theme') || {},
title: {
text: title,
align: 'center'
@@ -96,9 +100,17 @@ const lineChart = () => {
}
)
},
tooltip: {
y: {
formatter: function(value, series) {
return data[series.dataPointIndex].extras.tooltip || value;
}
}
},
};
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

View File

@@ -1,3 +1,4 @@
import { mergedOptionsWithJsonConfig } from './helpers'
const multiColumnChart = () => {
return {
@@ -14,6 +15,7 @@ const multiColumnChart = () => {
this.chart.destroy()
}
const title = component.get('columnChartModel.title')
const stacked = component.get('columnChartModel.isStacked');
const animated = component.get('columnChartModel.animated');
const onColumnClickEventName = component.get('columnChartModel.onColumnClickEventName')
@@ -23,6 +25,7 @@ const multiColumnChart = () => {
const grid = component.get('columnChartModel.grid');
const columnWidth = component.get('columnChartModel.columnWidth');
const horizontal = component.get('columnChartModel.horizontal');
const jsonConfig = component.get('columnChartModel.jsonConfig');
const data = component.get('columnChartModel.data');
const series = Object.keys(data)
@@ -33,7 +36,7 @@ const multiColumnChart = () => {
const categories = component.get('columnChartModel.xAxis.categories').length > 0
? component.get('columnChartModel.xAxis.categories')
: []
: data[series[0].name].map(item => item.title)
;
const options = {
@@ -81,13 +84,16 @@ const multiColumnChart = () => {
yaxis: {
title: {
text: component.get('columnChartModel.title'),
text: title,
}
},
fill: {
opacity: component.get('columnChartModel.opacity'),
},
theme: component.get('columnChartModel.theme') || {},
};
const colors = component.get('columnChartModel.colors');
@@ -96,7 +102,7 @@ const multiColumnChart = () => {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

View File

@@ -1,3 +1,4 @@
import { mergedOptionsWithJsonConfig } from './helpers'
const multiLineChart = () => {
return {
@@ -20,6 +21,7 @@ const multiLineChart = () => {
const data = component.get('lineChartModel.data');
const onPointClickEventName = component.get('lineChartModel.onPointClickEventName');
const sparkline = component.get('lineChartModel.sparkline');
const jsonConfig = component.get('lineChartModel.jsonConfig');
const series = Object.keys(data).map(key => {
return {
@@ -74,6 +76,8 @@ const multiLineChart = () => {
},
yaxis: component.get('lineChartModel.yAxis') || {},
theme: component.get('lineChartModel.theme') || {},
};
const colors = component.get('lineChartModel.colors');
@@ -82,7 +86,7 @@ const multiLineChart = () => {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

View File

@@ -1,3 +1,4 @@
import {mergedOptionsWithJsonConfig} from './helpers'
const pieChart = () => {
return {
@@ -20,13 +21,15 @@ const pieChart = () => {
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 jsonConfig = component.get('pieChartModel.jsonConfig');
const options = {
series: data.map(item => item.value),
chart: {
height: '100%',
type: 'pie',
type: type,
...sparkline,
@@ -72,6 +75,16 @@ const pieChart = () => {
],
legend: component.get('pieChartModel.legend') || {},
theme: component.get('pieChartModel.theme') || {},
tooltip: {
y: {
formatter: function(value, series) {
return data[series.dataPointIndex].extras.tooltip || value;
}
}
},
};
const colors = component.get('pieChartModel.colors');
@@ -80,7 +93,7 @@ const pieChart = () => {
options['colors'] = colors
}
this.chart = new ApexCharts(this.$refs.container, options);
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}

View File

@@ -0,0 +1,99 @@
import { mergedOptionsWithJsonConfig } from './helpers'
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 jsonConfig = component.get('radarChartModel.jsonConfig');
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, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}
}
export default radarChart

View File

@@ -0,0 +1,74 @@
import { mergedOptionsWithJsonConfig } from "./helpers";
const radialChart = () => {
return {
chart: null,
init() {
setTimeout(() => {
this.drawChart(this.$wire);
}, 0);
},
drawChart(component) {
if (this.chart) {
this.chart.destroy();
}
const data = component.get("radialChartModel.data");
const showTotal = component.get("radialChartModel.showTotal");
const onBarClickEventName = component.get(
"radialChartModel.onBarClickEventName"
);
const jsonConfig = component.get("radialChartModel.jsonConfig");
const colors = component.get("radialChartModel.colors");
const options = {
series: data.map((item) => item.value),
labels: data.map((item) => item.title),
colors: Object.values(colors).filter(Boolean),
chart: {
height: "100%",
type: "radialBar",
events: {
dataPointSelection: function (
event,
chartContext,
payload
) {
console.log(payload);
if (!onBarClickEventName) {
return;
}
const bar = data[payload.dataPointIndex];
console.log(bar);
component.call("onBarClick", bar);
},
},
},
plotOptions: {
radialBar: {
dataLabels: {
total: {
show: showTotal,
},
},
},
},
};
this.chart = new ApexCharts(
this.$refs.container,
mergedOptionsWithJsonConfig(options, jsonConfig)
);
this.chart.render();
},
};
};
export default radialChart;

View File

@@ -0,0 +1,80 @@
import { mergedOptionsWithJsonConfig } from './helpers'
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 jsonConfig = component.get('treeMapChartModel.jsonConfig');
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.call('onBlockClick', block)
},
}
},
plotOptions: {
treemap: {
distributed: distributed,
enableShades: enableShades,
}
},
colors: colors,
};
this.chart = new ApexCharts(this.$refs.container, mergedOptionsWithJsonConfig(options, jsonConfig));
this.chart.render();
}
}
}
export default treeMapChart

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="{ ...livewireChartsRadialChart() }"
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

@@ -26,7 +26,7 @@ class LivewireAreaChart extends Component
return;
}
$this->emit($onPointClickEventName, $point);
$this->dispatch($onPointClickEventName, $point);
}
public function render()

View File

@@ -26,7 +26,7 @@ class LivewireColumnChart extends Component
return;
}
$this->emit($onColumnClickEventName, $column);
$this->dispatch($onColumnClickEventName, $column);
}
public function render()

View File

@@ -26,7 +26,7 @@ class LivewireLineChart extends Component
return;
}
$this->emit($onPointClickEventName, $point);
$this->dispatch($onPointClickEventName, $point);
}
public function render()

View File

@@ -26,7 +26,7 @@ class LivewirePieChart extends Component
return;
}
$this->emit($onSliceClickEventName, $slice);
$this->dispatch($onSliceClickEventName, $slice);
}
public function render()

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->dispatch($onPointClickEventName, $point);
}
public function render()
{
return view('livewire-charts::livewire-radar-chart');
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Asantibanez\LivewireCharts\Charts;
use Asantibanez\LivewireCharts\Models\RadialChartModel;
use Livewire\Component;
/**
* Class LivewireRadialChart
* @package Asantibanez\LivewireCharts\Charts
*/
class LivewireRadialChart extends Component
{
public $radialChartModel;
public function mount(RadialChartModel $radialChartModel)
{
$this->radialChartModel = $radialChartModel->toArray();
}
public function onBarClick($bar): void
{
$onBarClickEventName = data_get($this->radialChartModel, 'onBarClickEventName');
if ($onBarClickEventName === null) {
return;
}
$this->dispatch($onBarClickEventName, $bar);
}
public function render()
{
return view('livewire-charts::livewire-radial-chart');
}
}

View File

@@ -0,0 +1,36 @@
<?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 onBlockClick($block)
{
$onBlockClickEventName = data_get($this->treeMapChartModel, 'onBlockClickEventName');
if ($onBlockClickEventName === null) {
return;
}
$this->dispatch($onBlockClickEventName, $block);
}
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

@@ -6,6 +6,9 @@ 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\RadialChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
use Illuminate\Support\Facades\Facade;
/**
@@ -17,6 +20,9 @@ use Illuminate\Support\Facades\Facade;
* @method static ColumnChartModel multiColumnChartModel()
* @method static AreaChartModel areaChartModel()
* @method static PieChartModel pieChartModel()
* @method static RadarChartModel radarChartModel()
* @method static TreeMapChartModel treeMapChartModel()
* @method static RadialChartModel radialChartModel()
*/
class LivewireCharts extends Facade
{

View File

@@ -8,6 +8,9 @@ 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\RadialChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
class LivewireCharts
{
@@ -44,4 +47,19 @@ class LivewireCharts
{
return new PieChartModel;
}
public function radarChartModel()
{
return new RadarChartModel();
}
public function treeMapChartModel(): TreeMapChartModel
{
return new TreeMapChartModel();
}
public function radialChartModel(): RadialChartModel
{
return new RadialChartModel();
}
}

View File

@@ -6,6 +6,10 @@ use Asantibanez\LivewireCharts\Charts\LivewireAreaChart;
use Asantibanez\LivewireCharts\Charts\LivewireColumnChart;
use Asantibanez\LivewireCharts\Charts\LivewireLineChart;
use Asantibanez\LivewireCharts\Charts\LivewirePieChart;
use Asantibanez\LivewireCharts\Charts\LivewireRadarChart;
use Asantibanez\LivewireCharts\Charts\LivewireRadialChart;
use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart;
use Asantibanez\LivewireCharts\Console\InstallCommand;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use Livewire\Livewire;
@@ -14,7 +18,9 @@ class LivewireChartsServiceProvider extends ServiceProvider
{
public function boot()
{
$this->registerViews();
$this->registerCommands();
$this->registerViews();
$this->registerPublishables();
@@ -28,6 +34,16 @@ class LivewireChartsServiceProvider extends ServiceProvider
$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');
@@ -56,6 +72,9 @@ class LivewireChartsServiceProvider extends ServiceProvider
Livewire::component('livewire-column-chart', LivewireColumnChart::class);
Livewire::component('livewire-pie-chart', LivewirePieChart::class);
Livewire::component('livewire-area-chart', LivewireAreaChart::class);
Livewire::component('livewire-radar-chart', LivewireRadarChart::class);
Livewire::component('livewire-tree-map-chart', LivewireTreeMapChart::class);
Livewire::component('livewire-radial-chart', LivewireRadialChart::class);
}
private function registerDirectives()

View File

@@ -3,6 +3,18 @@
namespace Asantibanez\LivewireCharts\Models;
use Asantibanez\LivewireCharts\Models\Traits\HasAnimation;
use Asantibanez\LivewireCharts\Models\Traits\HasAxis;
use Asantibanez\LivewireCharts\Models\Traits\HasColors;
use Asantibanez\LivewireCharts\Models\Traits\HasDataLabels;
use Asantibanez\LivewireCharts\Models\Traits\HasGrid;
use Asantibanez\LivewireCharts\Models\Traits\HasJsonConfig;
use Asantibanez\LivewireCharts\Models\Traits\HasLegend;
use Asantibanez\LivewireCharts\Models\Traits\HasSparkline;
use Asantibanez\LivewireCharts\Models\Traits\HasStroke;
use Asantibanez\LivewireCharts\Models\Traits\HasTheme;
use Asantibanez\LivewireCharts\Models\Traits\HasTitle;
/**
* Class BaseChartModel
* @package Asantibanez\LivewireCharts\Models
@@ -18,6 +30,8 @@ class BaseChartModel
use HasSparkline;
use HasGrid;
use HasColors;
use HasTheme;
use HasJsonConfig;
public function __construct()
{
@@ -30,6 +44,8 @@ class BaseChartModel
$this->initSparkline();
$this->initGrid();
$this->initColors();
$this->initTheme();
$this->initJsonConfig();
}
public function reactiveKey()
@@ -48,7 +64,9 @@ class BaseChartModel
$this->dataLabelsToArray(),
$this->sparklineToArray(),
$this->gridToArray(),
$this->colorsToArray()
$this->colorsToArray(),
$this->themeToArray(),
$this->jsonConfigToArray(),
);
}
@@ -63,5 +81,7 @@ class BaseChartModel
$this->sparklineFromArray($array);
$this->gridFromArray($array);
$this->colorsFromArray($array);
$this->themeFromArray($array);
$this->jsonConfigFromArray($array);
}
}

View File

@@ -11,19 +11,19 @@ namespace Asantibanez\LivewireCharts\Models;
*/
class ColumnChartModel extends BaseChartModel
{
public $opacity;
private $opacity;
public $columnWidth;
private $columnWidth;
public $horizontal;
private $horizontal;
public $isMultiColumn;
private $isMultiColumn;
public $isStacked;
private $isStacked;
public $onColumnClickEventName;
private $onColumnClickEventName;
public $data;
private $data;
public function __construct()
{
@@ -65,9 +65,16 @@ class ColumnChartModel extends BaseChartModel
return $this;
}
public function setHorizontal($value)
public function setHorizontal()
{
$this->horizontal = $value;
$this->horizontal = true;
return $this;
}
public function setVertical()
{
$this->horizontal = false;
return $this;
}

View File

@@ -9,11 +9,13 @@ namespace Asantibanez\LivewireCharts\Models;
*/
class PieChartModel extends BaseChartModel
{
public $onSliceClickEventName;
private $onSliceClickEventName;
public $opacity;
private $opacity;
public $data;
private $type;
private $data;
public function __construct()
{
@@ -23,6 +25,8 @@ class PieChartModel extends BaseChartModel
$this->opacity = 0.75;
$this->type = 'pie';
$this->data = collect();
}
@@ -33,6 +37,23 @@ class PieChartModel extends BaseChartModel
return $this;
}
public function setType($type)
{
$this->type = $type;
return $this;
}
public function asPie()
{
return $this->setType('pie');
}
public function asDonut()
{
return $this->setType('donut');
}
public function withOnSliceClickEvent($onSliceClickEventName)
{
$this->onSliceClickEventName = $onSliceClickEventName;
@@ -57,6 +78,7 @@ class PieChartModel extends BaseChartModel
return array_merge(parent::toArray(), [
'onSliceClickEventName' => $this->onSliceClickEventName,
'opacity' => $this->opacity,
'type' => $this->type,
'data' => $this->data->toArray(),
]);
}
@@ -69,6 +91,8 @@ class PieChartModel extends BaseChartModel
$this->opacity = data_get($array, 'opacity', 0.75);
$this->type = data_get($array, 'type', 'pie');
$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,76 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
/**
* Class RadialChartModel
* @package Asantibanez\LivewireCharts\Models
*/
class RadialChartModel extends BaseChartModel
{
public $data;
public $showTotal;
public $onBarClickEventName;
public function __construct()
{
parent::__construct();
$this->data = collect();
$this->showTotal = true;
}
public function showTotal(): self
{
$this->showTotal = true;
return $this;
}
public function hideTotal(): self
{
$this->showTotal = false;
return $this;
}
public function addBar($title, $value, $color = null, $extras = []): self
{
$this->data->push([
'title' => $title,
'value' => $value,
'extras' => $extras,
]);
$this->addColor($color);
return $this;
}
public function withOnBarClickEvent($onBarClickEvent): self
{
$this->onBarClickEventName = $onBarClickEvent;
return $this;
}
public function toArray()
{
return array_merge(parent::toArray(), [
'data' => $this->data->toArray(),
'showTotal' => $this->showTotal,
'onBarClickEventName' => $this->onBarClickEventName,
]);
}
public function fromArray($array)
{
parent::fromArray($array);
$this->data = collect(data_get($array, 'data', []));
$this->showTotal = data_get($array, 'showTotal', true);
$this->onBarClickEventName = data_get($array, 'onBarClickEventName', null);
}
}

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasAnimation

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasAxis

View File

@@ -1,13 +1,15 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasColors
{
private $colors;
private $enableShades;
public function setColors($colors)
{
$this->colors = $colors;
@@ -22,9 +24,25 @@ trait HasColors
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()
@@ -35,12 +53,15 @@ trait HasColors
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

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasDataLabels

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasGrid

View File

@@ -0,0 +1,39 @@
<?php
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasJsonConfig
{
private $jsonConfig;
public function setJsonConfig($jsonConfig)
{
$this->jsonConfig = $jsonConfig;
return $this;
}
protected function initJsonConfig()
{
$this->jsonConfig = [];
}
private function defaultJsonConfig()
{
return [];
}
protected function jsonConfigFromArray($array)
{
$this->jsonConfig = data_get($array, 'jsonConfig', $this->defaultJsonConfig());
}
protected function jsonConfigToArray()
{
return [
'jsonConfig' => $this->jsonConfig,
];
}
}

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasLegend

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasSparkline

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasStroke

View File

@@ -0,0 +1,125 @@
<?php
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasTheme
{
private $theme;
private $mode;
private $palette;
/**
* Initialize
*/
public function initTheme()
{
$this->theme = $this->defaultTheme();
}
/**
* set default theme
*
* @return array $theme
*/
private function defaultTheme()
{
return [
'mode' => 'light',
'palette' => 'palette1'
];
}
/**
* set theme mode
*
* @param string $mode
*
* @return $this
*/
public function setThemeMode(string $mode)
{
data_set($this->theme, 'mode', $mode);
return $this;
}
/**
* set theme mode to dark theme
*
* @return $this
*/
public function darkMode()
{
data_set($this->theme, 'mode', 'dark');
return $this;
}
/**
* set theme mode to light theme
*
* @return $this
*/
public function lightMode()
{
data_set($this->theme, 'mode', 'light');
return $this;
}
/**
* set the dark mode option to on or off
*
* @param bool $status = true
*
* @return $this
*/
public function setDarkMode(bool $status = true)
{
data_set($this->theme, 'mode', $status ? 'dark' : 'light');
return $this;
}
/**
* set theme pallete
*
* @param string $pallete
*
* @return $this
*/
public function setThemePalette(string $palette)
{
data_set($this->theme, 'palette', $palette);
return $this;
}
/**
* convert the theme to array
*
* @param string $mode
*
* @return $this
*/
protected function themeToArray()
{
return [
'theme' => $this->theme,
];
}
/**
* set theme from array
*
* @param string $mode
*
* @return $this
*/
protected function themeFromArray($array)
{
$this->theme = data_get($array, 'theme', $this->defaultTheme());
}
}

View File

@@ -1,7 +1,7 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasTitle
@@ -15,6 +15,11 @@ trait HasTitle
return $this;
}
public function getTitle()
{
return $this->title;
}
protected function initTitle()
{
$this->title = $this->defaultTitle();

View File

@@ -0,0 +1,81 @@
<?php
namespace Asantibanez\LivewireCharts\Models;
/**
* Class TreeMapChartModel
* @package Asantibanez\LivewireCharts\Models
*/
class TreeMapChartModel extends BaseChartModel
{
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->getTitle(), $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

@@ -3,12 +3,12 @@
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireAreaChart;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireAreaChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
private function buildComponent() : Testable
{
return Livewire::test(LivewireAreaChart::class);
}

View File

@@ -3,12 +3,12 @@
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireColumnChart;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireColumnChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
private function buildComponent() : Testable
{
return Livewire::test(LivewireColumnChart::class);
}
@@ -22,4 +22,23 @@ class LivewireColumnChartTest extends TestCase
//Assert
$this->assertNotNull($component);
}
/** @test */
public function should_emit_event_if_present()
{
//Arrange
$component = $this->buildComponent();
$columnChartModel = $component->columnChartModel;
data_set($columnChartModel, 'onColumnClickEventName', 'custom-event');
$component->set('columnChartModel', $columnChartModel);
//Act
$component->runAction('onColumnClick', []);
//Assert
$component->assertDispatched('custom-event');
}
}

View File

@@ -3,12 +3,12 @@
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireLineChart;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewireLineChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
private function buildComponent() : Testable
{
return Livewire::test(LivewireLineChart::class);
}

View File

@@ -3,12 +3,12 @@
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewirePieChart;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
class LivewirePieChartTest extends TestCase
{
private function buildComponent() : TestableLivewire
private function buildComponent() : Testable
{
return Livewire::test(LivewirePieChart::class);
}
@@ -22,4 +22,23 @@ class LivewirePieChartTest extends TestCase
//Assert
$this->assertNotNull($component);
}
/** @test */
public function should_emit_event_if_present()
{
//Arrange
$component = $this->buildComponent();
$pieChartModel = $component->pieChartModel;
data_set($pieChartModel, 'onSliceClickEventName', 'custom-event');
$component->set('pieChartModel', $pieChartModel);
//Act
$component->runAction('onSliceClick', []);
//Assert
$component->assertDispatched('custom-event');
}
}

View File

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

View File

@@ -0,0 +1,44 @@
<?php
use Asantibanez\LivewireCharts\Charts\LivewireRadialChart;
use Asantibanez\LivewireCharts\Tests\TestCase;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
class LivewireRadialChartTest extends TestCase
{
private function buildComponent() : Testable
{
return Livewire::test(LivewireRadialChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
/** @test */
public function should_emit_event_if_present()
{
//Arrange
$component = $this->buildComponent();
$radialChartModel = $component->radialChartModel;
data_set($radialChartModel, 'onBarClickEventName', 'custom-event');
$component->set('radialChartModel', $radialChartModel);
//Act
$component->runAction('onBarClick', []);
//Assert
$component->assertDispatched('custom-event');
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace Asantibanez\LivewireCharts\Tests;
use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;
class LivewireTreeMapChartTest extends TestCase
{
private function buildComponent() : Testable
{
return Livewire::test(LivewireTreeMapChart::class);
}
/** @test */
public function can_build_component()
{
//Act
$component = $this->buildComponent();
//Assert
$this->assertNotNull($component);
}
/** @test */
public function should_emit_event_if_present()
{
//Arrange
$component = $this->buildComponent();
$treeMapChartModel = $component->treeMapChartModel;
data_set($treeMapChartModel, 'onBlockClickEventName', 'custom-event');
$component->set('treeMapChartModel', $treeMapChartModel);
//Act
$component->runAction('onBlockClick', []);
//Assert
$component->assertDispatched('custom-event');
}
}