square1/nova-metrics

为您的Laravel Nova指标添加对资源筛选器的支持

1.0.0 2020-02-03 14:57 UTC

This package is auto-updated.

Last update: 2024-08-29 05:07:14 UTC


README

此包允许您访问任何Laravel Nova指标类中的资源筛选器,并在您在资源列表中选择新筛选器时动态更新这些卡片。

图表是显示仪表板图形信息的好方法,并且使用Laravel Nova可以快速创建漂亮的指标卡片

您还可以将这些图表用于资源视图。

Custom Trend

通常,当您将指标添加到任何资源中时,您期望图表是您在下面列表中看到的数据的表示。目前,在Nova中这是不可能的——当您更改筛选器选择时,资源列表会更新,但相应的图表不会。

Custom Trend

这是因为填充列表的请求与获取指标数据的请求是独立的。这意味着更新筛选器会中断与图表的连接,使它们过时。

此包恢复该连接,确保屏幕上的图表和数据保持同步。

Custom Trend

安装

通过composer安装

composer require square1/nova-metrics

用法

您可以使用默认的nova命令创建新的指标

php artisan nova:partition NewPartition
php artisan nova:trend NewTrend
php artisan nova:value NewValue

然后,您只需更新您最近创建的指标类。从以下类之一扩展以访问您的资源筛选器

use Square1\NovaMetrics\CustomTrend;
use Square1\NovaMetrics\CustomValue;
use Square1\NovaMetrics\CustomPartition;

例如

<?php

namespace App\Nova\Metrics;

use App\Post;
use Square1\NovaMetrics\CustomTrend;
use Laravel\Nova\Http\Requests\NovaRequest;

class NewTrend extends CustomTrend
{
    public function calculate(NovaRequest $request)
    {
        // $request->filters
    }
}

假设您有一个CategoryFilter::class

<?php

namespace App\Nova\Filters;

use Illuminate\Http\Request;
use Laravel\Nova\Filters\Filter;

class CategoryFilter extends Filter
{

    public $component = 'select-filter';


    public function apply(Request $request, $query, $value)
    {
        return $query->where('category', $value);
    }

    public function options(Request $request)
    {
        return [
            'css' => 'css',
            'javascript' => 'javascript',
            'laravel' =>'laravel',
            'php' => 'php',
        ];
    }
}

这是如何将此筛选器应用于您的NewTrend::class

class NewTrend extends CustomTrend
{
    public function calculate(NovaRequest $request)
        {
            $model = Post::make();
    
            if (!empty($filters)) {
                if ($request->has('filters')) {
                    // Get the decoded list of filters
                    $filters = json_decode(base64_decode($request->filters));
        
                    foreach ($filters as $filter) {
                        if (empty($filter->value)) {
                            continue;
                        }
                        // Create a new instance of the filter and apply the query to your model
                        $model = (new $filter->class)->apply($request, $model, $filter->value);
                    }
                }
            }
            
            return $this->averageByDays($request, $model, 'pageviews');
        }
}

已知问题

如果您想为此包做出贡献,这是一个好开始的地方 🙂

  • 等待第一个resources-loaded事件触发以加载卡片。
  • 在请求对象中解码$request->filters

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件