4 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
25 changed files with 318 additions and 34 deletions

View File

@@ -1,5 +1,15 @@
# Changelog # 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 ## 3.0.0 - 2023-07-25
- Added Livewire v3 support - Added Livewire v3 support
- Added ability to set chart theme (thanks to @syntaxlexx) - Added ability to set chart theme (thanks to @syntaxlexx)

View File

@@ -47,6 +47,7 @@ Livewire Charts supports out of the box the following types of charts
- Area Chart (`LivewireAreaChart` component) - Area Chart (`LivewireAreaChart` component)
- Radar Chart (`LivewireRadarChart` component) - Radar Chart (`LivewireRadarChart` component)
- Tree Map Chart (`LivewireTreeMapChart` 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. 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.
@@ -55,6 +56,7 @@ Each one comes with its own "model" class that allows you to define the chart's
- `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. - `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. - `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 For example, to render a column chart, we can create an instance of `ColumnChartModel` and add some data to it
```php ```php
@@ -106,6 +108,7 @@ LivewireCharts::pieChartModel();
LivewireCharts::areaChartModel(); LivewireCharts::areaChartModel();
LivewireCharts::radarChartModel(); LivewireCharts::radarChartModel();
LivewireCharts::treeMapChartModel(); LivewireCharts::treeMapChartModel();
LivewireCharts::radialChartModel();
``` ```
## Enabling Interactions ## Enabling Interactions
@@ -247,6 +250,14 @@ for each type of chart.
| withOnBlockClickEvent(string $eventName) | Event Name that will be fired when a block of the chart is clicked | | 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 | | 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 ## Advanced Usage - Integrating Scripts

File diff suppressed because one or more lines are too long

View File

@@ -1,12 +1,13 @@
import ApexCharts from 'apexcharts' import ApexCharts from 'apexcharts'
import areaChart from "./areaChart" import areaChart from "./areaChart"
import columnChart from "./columnChart" import columnChart from "./columnChart"
import multiColumnChart from "./multiColumnChart"; import multiColumnChart from "./multiColumnChart"
import lineChart from "./lineChart" import lineChart from "./lineChart"
import multiLineChart from "./multiLineChart" import multiLineChart from "./multiLineChart"
import pieChart from "./pieChart" import pieChart from "./pieChart"
import radarChart from "./radarChart" import radarChart from "./radarChart"
import treeMapChart from "./treeMapChart" import treeMapChart from "./treeMapChart"
import radialChart from "./radialChart"
window.ApexCharts = ApexCharts window.ApexCharts = ApexCharts
window.livewireChartsAreaChart = areaChart window.livewireChartsAreaChart = areaChart
@@ -17,3 +18,4 @@ window.livewireChartsPieChart = pieChart
window.livewireChartsMultiColumnChart = multiColumnChart window.livewireChartsMultiColumnChart = multiColumnChart
window.livewireChartsRadarChart = radarChart window.livewireChartsRadarChart = radarChart
window.livewireChartsTreeMapChart = treeMapChart window.livewireChartsTreeMapChart = treeMapChart
window.livewireChartsRadialChart = radialChart

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,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,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

@@ -7,6 +7,7 @@ use Asantibanez\LivewireCharts\Models\ColumnChartModel;
use Asantibanez\LivewireCharts\Models\LineChartModel; use Asantibanez\LivewireCharts\Models\LineChartModel;
use Asantibanez\LivewireCharts\Models\PieChartModel; use Asantibanez\LivewireCharts\Models\PieChartModel;
use Asantibanez\LivewireCharts\Models\RadarChartModel; use Asantibanez\LivewireCharts\Models\RadarChartModel;
use Asantibanez\LivewireCharts\Models\RadialChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel; use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
use Illuminate\Support\Facades\Facade; use Illuminate\Support\Facades\Facade;
@@ -21,6 +22,7 @@ use Illuminate\Support\Facades\Facade;
* @method static PieChartModel pieChartModel() * @method static PieChartModel pieChartModel()
* @method static RadarChartModel radarChartModel() * @method static RadarChartModel radarChartModel()
* @method static TreeMapChartModel treeMapChartModel() * @method static TreeMapChartModel treeMapChartModel()
* @method static RadialChartModel radialChartModel()
*/ */
class LivewireCharts extends Facade class LivewireCharts extends Facade
{ {

View File

@@ -9,6 +9,7 @@ use Asantibanez\LivewireCharts\Models\ColumnChartModel;
use Asantibanez\LivewireCharts\Models\LineChartModel; use Asantibanez\LivewireCharts\Models\LineChartModel;
use Asantibanez\LivewireCharts\Models\PieChartModel; use Asantibanez\LivewireCharts\Models\PieChartModel;
use Asantibanez\LivewireCharts\Models\RadarChartModel; use Asantibanez\LivewireCharts\Models\RadarChartModel;
use Asantibanez\LivewireCharts\Models\RadialChartModel;
use Asantibanez\LivewireCharts\Models\TreeMapChartModel; use Asantibanez\LivewireCharts\Models\TreeMapChartModel;
class LivewireCharts class LivewireCharts
@@ -52,8 +53,13 @@ class LivewireCharts
return new RadarChartModel(); return new RadarChartModel();
} }
public function treeMapChartModel() public function treeMapChartModel(): TreeMapChartModel
{ {
return new TreeMapChartModel(); return new TreeMapChartModel();
} }
public function radialChartModel(): RadialChartModel
{
return new RadialChartModel();
}
} }

View File

@@ -7,6 +7,7 @@ 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\LivewireRadarChart;
use Asantibanez\LivewireCharts\Charts\LivewireRadialChart;
use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart; use Asantibanez\LivewireCharts\Charts\LivewireTreeMapChart;
use Asantibanez\LivewireCharts\Console\InstallCommand; use Asantibanez\LivewireCharts\Console\InstallCommand;
use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Blade;
@@ -73,6 +74,7 @@ class LivewireChartsServiceProvider extends ServiceProvider
Livewire::component('livewire-area-chart', LivewireAreaChart::class); Livewire::component('livewire-area-chart', LivewireAreaChart::class);
Livewire::component('livewire-radar-chart', LivewireRadarChart::class); Livewire::component('livewire-radar-chart', LivewireRadarChart::class);
Livewire::component('livewire-tree-map-chart', LivewireTreeMapChart::class); Livewire::component('livewire-tree-map-chart', LivewireTreeMapChart::class);
Livewire::component('livewire-radial-chart', LivewireRadialChart::class);
} }
private function registerDirectives() private function registerDirectives()

View File

@@ -3,6 +3,18 @@
namespace Asantibanez\LivewireCharts\Models; 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 * Class BaseChartModel
* @package Asantibanez\LivewireCharts\Models * @package Asantibanez\LivewireCharts\Models

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 <?php
namespace Asantibanez\LivewireCharts\Models; namespace Asantibanez\LivewireCharts\Models\Traits;
trait HasAnimation trait HasAnimation

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,9 +9,6 @@ namespace Asantibanez\LivewireCharts\Models;
*/ */
class TreeMapChartModel extends BaseChartModel class TreeMapChartModel extends BaseChartModel
{ {
use HasTitle;
use HasColors;
public $data; public $data;
public $distributed; public $distributed;
public $onBlockClickEventName; public $onBlockClickEventName;
@@ -36,7 +33,7 @@ class TreeMapChartModel extends BaseChartModel
public function addBlock($title, $value, $extras = []) public function addBlock($title, $value, $extras = [])
{ {
return $this->addSeriesBlock($this->title, $title, $value, $extras); return $this->addSeriesBlock($this->getTitle(), $title, $value, $extras);
} }
public function addSeriesBlock($seriesName, $title, $value, $extras = []) public function addSeriesBlock($seriesName, $title, $value, $extras = [])

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');
}
}