codicastudio/dashboard

一个随机的Codica Studio包。

1.0.0 2020-09-25 01:52 UTC

This package is auto-updated.

Last update: 2024-09-27 12:56:36 UTC


README

Laravel Nova Dashboard In Action

Laravel Nova缺失的仪表盘!

安装

您可以通过composer安装此包

composer require digital-creative/nova-dashboard

推荐:发布配置文件以调整模型和表名

php artisan vendor:publish --provider="DigitalCreative\NovaDashboard\ToolServiceProvider" --tag="config"

发布迁移

php artisan vendor:publish --provider="DigitalCreative\NovaDashboard\ToolServiceProvider" --tag="migration"

运行迁移

php artisan migrate

用法

在您的 NovaServiceProvider.php 中注册 NovaDashboard 工具

use DigitalCreative\NovaDashboard\Examples\ExampleDashboard;
use DigitalCreative\NovaDashboard\NovaDashboard;

public function tools()
{
    return [
        new NovaDashboard([
            ExampleDashboard::class, // Example as on the gif above
        ])
    ];
}

为了可视化上面的示例,您还需要安装以下额外的包

  • digital-creative/value-widget
  • digital-creative/nova-range-input-filter
  • digital-creative/nova-pill-filter

仪表盘

use DigitalCreative\NovaDashboard\Dashboard;

class ExampleDashboard extends Dashboard
{

    public static string $title = 'Example Dashboard';

    public function views(): array
    {
        return [
            ExampleView1::make()->authorizedToSee(fn() => true),
            ExampleView2::make()->editable()->private(),
            ExampleView3::make()->editable()
        ];
    }

    public function options(): array
    {
        return [
            'expandFilterByDefault' => true,
            'grid' => [
                'compact' => true,
                'numberOfCols' => 6
            ]
        ];
    }

}

仪表盘分组视图,从该文件中您可以自定义一些基本设置并定义您的视图。

views()

需要数组形式的视图。

options()

视图

在视图中可以设置3个组件(小部件、操作、过滤器)

典型视图类的示例

use DigitalCreative\NovaDashboard\View;

class MainView extends View
{

    public function filters(): array
    {
        return [
            new ExampleFilter()
        ];
    }

    public function actions(): array
    {
        return [
            new ExampleAction(),
        ];
    }

    public function widgets(): array
    {
        return [
            new ExampleWidget(),
        ];
    }

}

在创建视图实例时,您可以通过调用以下方法之一

public function views(): array
{
    return [
        ExampleView1::make()->authorizedToSee(fn() => true),
        ExampleView2::make()->editable()->private(),
        ExampleView3::make()->editable()
    ];
}

authorizedToSee

与其他资源(仪表盘、视图、小部件、过滤器、操作)一样,有一个authorizedToSee方法,它确定当前登录用户是否可以查看/执行相应的资源。

可编辑

启用此功能并与动态小部件模式结合使用,将允许视图上的小部件可编辑,

您还可以传递一个回调来确定当前登录用户是否有权访问此功能,例如

ExampleView::make()->editable(fn() => false);

私有

默认情况下,每个视图都是公共的,这意味着每个登录用户都可以看到其中的所有小部件(除非在authorizeToSee检查中失败),但是将视图设置为私有,每个用户都将有自己的小部件集。

将此选项与可编辑方法结合使用,允许仪表盘的每个用户都可以自由地创建自己的小部件,而无需看到彼此的东西。

小部件

小部件是这个包的核心功能,有几种定义它们的方法

静态模式

Widgets Static Mode Preview

public function widgets(): array
{
    return [
        new ExampleWidget(0, 0, 2, 1, [ 'title' => 'Total Sales', 'source' => 'source1' ]),
        new ExampleWidget(2, 0, 2, 1, [ 'title' => 'Products in Stock', 'source' => 'source2' ]),
        new SomeOtherWidget(4, 0, 2, 1, [ 'title' => 'Conversion Rate', 'source' => 'source3' ]),
    ];
}

通过向小部件传递45个参数,它将在静态模式下构建,这意味着这个小部件不能在仪表盘中被修改、拖动或调整大小,如果您不想允许用户修改默认设置,请使用此模式。

参数是

int $x, int $y, int $width, int $height, array $options = []
动态模式

Widgets Static Mode Preview

public function widgets(): array
{
    return [
        new ExampleWidget(),
    ];
}

只需向其传递无参数,仪表盘中将出现一个新按钮,允许您创建任意数量的小部件。

注意:尽管可以混合静态和动态小部件,但静态小部件会因缺少锁定网格项的设置而移动,这将在底层网格库的原始作者接受此功能的建议后得到解决:bensladden/vue-responsive-dash#196

当前可用小部件列表

过滤器

Filters Preview

这些是标准的nova过滤器类,只有一个简单区别,默认情况下不会调用->apply()方法。为什么?

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

class ExampleFilter extends BooleanFilter
{

    public function apply(Request $request, $query, $value)
    {
        // this function is required however it is not used by the nova-dashboard
    }
    
    public function options(Request $request)
    {
        return [
            'Option 1' => 0,
            'Option 2' => 1,
            'Option 3' => 2,
        ];
    }

}

通常,您的widget的resolveValue()函数将接收一个\DigitalCreative\NovaDashboard\Filters类的实例。这个类包含一个用于获取任何给定过滤器值的方法,例如

use DigitalCreative\NovaDashboard\Filters;
use DigitalCreative\NovaDashboard\ValueResult;
use Illuminate\Support\Collection;

/**
 * On any widget class
 */
public function resolveValue(Collection $options, Filters $filters): ValueResult
{
    
    /**
     * On any widget class
     */
    $filterA = $filters->getFilterValue(YourFilterClass::class);
    $filterB = $filters->getFilterValue(YourSecondFilterClass::class);

    if($filterA === 'expected') {

        return new ValueResult(...);

    }

     return new ValueResult(...);

}

然而,如果您想重用之前在过滤器上设置的逻辑或与仪表板共享现有过滤器,可以调用applyToQueryBuilder方法以获得相同的行为

use DigitalCreative\NovaDashboard\Filters;
use DigitalCreative\NovaDashboard\ValueResult;
use Illuminate\Support\Collection;

public function resolveValue(Collection $options, Filters $filters): ValueResult
{
    $result = $filters->applyToQueryBuilder(AnyEloquentModel::query())->get();    
}

applyToQueryBuilder将运行默认的nova过滤器逻辑对每个过滤器进行操作。

操作

每个操作都需要扩展类:DigitalCreative\NovaDashboard\Action,它只有一个必需的方法:->execute()

use DigitalCreative\NovaDashboard\Action;
use DigitalCreative\NovaDashboard\Filters;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Fields\Text;

class ExampleAction extends Action
{

    public function execute(ActionFields $fields, Filters $filters): ?array
    {
        return Action::message('You are awesome!');
    }

    public function fields(): array
    {
        return [
            Text::make('Some field'),
        ];
    }

}

此动作与默认nova动作之间的唯一区别是执行后将调用哪个方法。实际上,如果您定义了一个->handle()方法,此动作也可以用于nova的其他任何资源。

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