圣系统 / nova-linkable-metrics
Laravel Nova 4.x 的可链接指标。
4.1.0
2023-02-09 17:53 UTC
Requires
- php: ^8.0
- laravel/nova: ^4.13
- nova-kit/nova-packages-tool: ^1.2
README
为您的 Laravel Nova 指标添加自定义链接。
安装
您可以通过 composer 在使用 Nova 的 Laravel 应用中安装此包。
composer require saintsystems/nova-linkable-metrics
用法
要将链接功能添加到您的 Laravel Nova 指标卡,您需要将 Linkable
特性添加到您的指标中。
例如,在您的自定义 Nova 值指标中
// App\Nova\Metrics\NewUsers.php use SaintSystems\Nova\LinkableMetrics\LinkableValue; class NewUsers extends Value { use LinkableValue; //...omitted for brevity
在您的自定义 Nova 趋势指标中
// App\Nova\Metrics\UsersPerDay.php use SaintSystems\Nova\LinkableMetrics\LinkableTrend; class UsersPerDay extends Trend { use LinkableTrend; //...omitted for brevity
在您的自定义 Nova 分区指标中
// App\Nova\Metrics\UsersByStatus.php use SaintSystems\Nova\LinkableMetrics\LinkablePartition; class UsersByStatus extends Partition { use LinkablePartition; //...omitted for brevity
定义指标链接
您可以使用 Linkable
特性的 route
方法通过两种方式之一来定义指标链接
- 当卡片注册时
索引路由
// App\Nova\Dashboards\Main.php /** * Get the cards for the dashboard. * * @return array */ protected function cards() { return [ (new NewUsers)->width('1/3')->route('nova.pages.index', ['resource' => 'users']), ]; }
或者使用透镜路由
// App\Nova\Lenses\UnverifiedEmail.php class UnverifiedEmail extends Lens { //... omitted for brevity public static function query(LensRequest $request, $query) { return $request->withOrdering($request->withFilters( $query->whereNull('email_verified_at') )); } //... omitted for brevity /** * Get the URI key for the lens. * * @return string */ public function uriKey() { return 'unverified-email'; } } // App\Nova\Dashboards\Main.php /** * Get the cards for the dashboard. * * @return array */ protected function cards() { return [ (new NewUsers)->width('1/3')->route('nova.pages.lens', ['resource' => 'users', 'lens' => 'unverified-email']), ]; }
或者使用过滤器路由
// App\Nova\Filters\UserStatus.php class UserStatus extends Filter { //... omitted for brevity /** * Apply the filter to the given query. * * @param \Laravel\Nova\Http\Requests\NovaRequest $request * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function apply(NovaRequest $request, $query, $value) { return $query->where('active', $value); } /** * Get the filter's available options. * * @param \Laravel\Nova\Http\Requests\NovaRequest $request * @return array */ public function options(NovaRequest $request) { return [ 'Active' => '1', 'Inactive' => '0' ]; } } // App\Nova\Dashboards\Main.php /** * Get the cards for the dashboard. * * @return array */ protected function cards() { $filter = base64_encode(json_encode([ [ 'class' => UserStatus::class, 'value' => '1', ], ])); return [ (new NewUsers)->width('1/3')->route('nova.pages.index', ['resource' => 'users', 'users_filter' => $filter]), ]; }
- 或者,在卡片内部(对于仅在详情屏幕上可用的卡片很有用,您可能想要根据当前资源过滤 URL)
// In your linkable Nova metric class /** * Calculate the value of the metric. * * @param \Illuminate\Http\Request $request * @return mixed */ public function calculate(Request $request, UnitOfMeasure $unitOfMeasure) { $result = $this->result($unitOfMeasure->items()->count()); $params = [ 'resource' => 'items', 'viaResource' => $request->resource, 'viaResourceId' => $unitOfMeasure->id, 'viaRelationship' => 'items', 'relationshipType' => 'hasMany', ]; return $result->route('nova.pages.index', $params); }
自定义分区链接
默认情况下,分区指标可以像值和趋势指标一样具有链接。但是,像在值和趋势指标中一样使用默认的 route
方法(如上所示)将简单地链接分区指标卡的标题到提供的路由/URL。
为了更高级的自定义,就像在 自定义分区标签 中一样,您可以将闭包传递给 LinkablePartitionResult 类上的新 link
方法,这允许您为生成的图表中的每个单独分区自定义链接,甚至可以将分区信息传递到路由,如下所示
// App\Nova\Metrics\UsersByStatus use SaintSystems\Nova\LinkableMetrics\LinkablePartition; class UsersByStatus extends Partition { use LinkablePartition; /** * Calculate the value of the metric. * * @param \Laravel\Nova\Http\Requests\NovaRequest $request * @return mixed */ public function calculate(NovaRequest $request) { return $this->count($request, User::class, 'active') ->label(fn ($value) => match ($value) { 1 => 'Active', 0 => 'Inactive' }) ->link(fn ($value) => match ($value) { // 1 => null, default => route('nova.pages.index', ['resource' => 'users', 'users_filter' => base64_encode(json_encode([ [ 'class' => UserStatus::class, 'value' => $value, ], ]))], false) }); } // ... omitted for brevity
致谢
许可
MIT 许可证(MIT)。有关更多信息,请参阅 许可文件。