diff --git a/README.md b/README.md index 7ba785c..fdecdae 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,69 @@ class Employee extends Model implements Chartable // ... } ``` + +### Getting parametrized datasets + +You can get a collection of parametrized datasets for each of the parameters specified in chart settings by calling `getNovaChartjsParameterizedDataSet` method. You can specify the chartName for which you want to fetch the data. You can also sort the collected data by passing optional `field name` using which you want to sort the data and the `number of results` to be considered in sorting. We have added four static methods to provide `max`, `min`, `average` and `median` value datasets using `getNovaChartjsMaxDataSet`, `getNovaChartjsMinDataSet`, `getNovaChartjsAvgDataSet` and `getNovaChartjsMedianDataSet` method. + +You can also write your own customized method using in a similar fashion. + +```php +//... + /** + * Returns a dataset consistint of max values for each parameter. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return array + */ + public static function getNovaChartjsMaxDataSet($chartName = 'default', $sortBy = null, $limit = 0): array + { + $dataset = static::getNovaChartjsParameterizedDataSet($chartName, $sortBy, $limit); + + return $dataset->map(function (Collection $datpoints) { + return $datpoints->max(); + })->values()->toArray(); + } +//... +``` + +You can use these datasets as additional datsets + +```php +use KirschbaumDevelopment\NovaChartjs\Traits\HasChart; +use KirschbaumDevelopment\NovaChartjs\Contracts\Chartable; + +class Employee extends Model implements Chartable +{ + use HasChart; + + //... + + /** + * Return a list of additional datasets added to chart + * + * @return array + */ + public function getAdditionalDatasets(): array + { + return [ + 'default' => [ + [ + 'label' => 'Average Sales', + 'borderColor' => '#f87900', + 'data' => static::getNovaChartjsAvgDataSet('default'), + ], + ] + ]; + } + + // ... +} +``` + You can read more about adding custom datasets in the [official chart.js documentation](https://www.chartjs.org/docs/latest/) ### Creating a range chart diff --git a/src/Traits/HasChart.php b/src/Traits/HasChart.php index 2e6698c..6f6f352 100644 --- a/src/Traits/HasChart.php +++ b/src/Traits/HasChart.php @@ -2,6 +2,7 @@ namespace KirschbaumDevelopment\NovaChartjs\Traits; +use Illuminate\Support\Collection; use Illuminate\Database\Eloquent\Relations\MorphMany; use KirschbaumDevelopment\NovaChartjs\Models\NovaChartjsMetricValue; @@ -68,6 +69,110 @@ public function setNovaChartjsMetricValueAttribute($value): void $chartInstance->save(); } + /** + * Return a list of datapoints for each parameters. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return \Illuminate\Support\Collection + */ + public static function getNovaChartjsParameterizedDataSet($chartName = 'default', $sortBy = null, $limit = 0): Collection + { + $parameters = data_get(static::getNovaChartjsSettings(), sprintf('%s.parameters', $chartName)); + + $output = collect(); + + $dataset = collect(static::getNovaChartjsComparisonData($chartName)); + + if (! empty($sortBy)) { + $dataset = $dataset->sortBy($sortBy)->values(); + } + + if ($limit > 0) { + $dataset = $dataset->slice(0, $limit); + } + + foreach ($parameters as $parameter) { + $output->put($parameter, $dataset->pluck(sprintf('novaChartjsComparisonData.%s', $parameter))); + } + + return $output; + } + + /** + * Returns a dataset consisting of max values for each parameter. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return array + */ + public static function getNovaChartjsMaxDataSet($chartName = 'default', $sortBy = null, $limit = 0): array + { + $dataset = static::getNovaChartjsParameterizedDataSet($chartName, $sortBy, $limit); + + return $dataset->map(function (Collection $datpoints) { + return $datpoints->max(); + })->values()->toArray(); + } + + /** + * Returns a dataset consisting of min values for each parameter. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return array + */ + public static function getNovaChartjsMinDataSet($chartName = 'default', $sortBy = null, $limit = 0): array + { + $dataset = static::getNovaChartjsParameterizedDataSet($chartName, $sortBy, $limit); + + return $dataset->map(function (Collection $datpoints) { + return $datpoints->min(); + })->values()->toArray(); + } + + /** + * Returns a dataset consisting of average values for each parameter. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return array + */ + public static function getNovaChartjsAvgDataSet($chartName = 'default', $sortBy = null, $limit = 0): array + { + $dataset = static::getNovaChartjsParameterizedDataSet($chartName, $sortBy, $limit); + + return $dataset->map(function (Collection $datpoints) { + return $datpoints->avg(); + })->values()->toArray(); + } + + /** + * Returns a dataset consisting of median values for each parameter. + * + * @param string $chartName + * @param null|mixed $sortBy + * @param mixed $limit + * + * @return array + */ + public static function getNovaChartjsMedianDataSet($chartName = 'default', $sortBy = null, $limit = 0): array + { + $dataset = static::getNovaChartjsParameterizedDataSet($chartName, $sortBy, $limit); + + return $dataset->map(function (Collection $datpoints) { + return $datpoints->median(); + })->values()->toArray(); + } + /** * Return a list of all models available for comparison to root model. *