PHP code example of saintsystems / nova-linkable-metrics
1. Go to this page and download the library: Download saintsystems/nova-linkable-metrics library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
saintsystems / nova-linkable-metrics example snippets
// App\Nova\Metrics\NewUsers.php
use SaintSystems\Nova\LinkableMetrics\LinkableValue;
class NewUsers extends Value
{
use LinkableValue;
//...omitted for brevity
// App\Nova\Metrics\UsersPerDay.php
use SaintSystems\Nova\LinkableMetrics\LinkableTrend;
class UsersPerDay extends Trend
{
use LinkableTrend;
//...omitted for brevity
// App\Nova\Metrics\UsersByStatus.php
use SaintSystems\Nova\LinkableMetrics\LinkablePartition;
class UsersByStatus extends Partition
{
use LinkablePartition;
//...omitted for brevity
// 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]),
];
}
// 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);
}
// 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
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.