lacodix/laravel-metric-cards
WIP Laravel package for rendering metric cards with Chart.js. Ships a pre-built browser bundle (metrics.js) you can publish; no Chart.js install needed. Configure chart defaults, palette, and Colors plugin via config/metric-cards.php.
composer require lacodix/laravel-metric-cards
php artisan vendor:publish --tag=laravel-metrics-assets --tag=laravel-metric-cards-config
public/vendor/laravel-metrics/dist/metrics.js exists.<x-metric-card::value
title="Users"
value="{{ $userCount }}"
/>
Create a dashboard with 3 metrics:
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<x-metric-card::value title="Active Users" value="{{ $activeUsers }}" />
<x-metric-card::trend title="Revenue" value="{{ $revenue }}" trend="{{ $revenueChange }}" />
<x-metric-card::pie title="User Distribution" :data="$userDistribution" />
</div>
// In a controller or service
public function getMetrics()
{
return [
'active_users' => User::active()->count(),
'revenue' => Order::sum('amount'),
'user_distribution' => User::selectRaw('role, count(*) as count')
->groupBy('role')
->get()
->toArray(),
];
}
// Create a Livewire component
php artisan make:livewire DashboardMetrics
// In DashboardMetrics.php
public function render()
{
return view('livewire.dashboard-metrics', [
'metrics' => $this->getMetrics(),
]);
}
// In dashboard-metrics.blade.php
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
@foreach($metrics as $name => $data)
@if($name === 'active_users')
<x-metric-card::value title="Active Users" value="{{ $data }}" />
@elseif($name === 'user_distribution')
<x-metric-card::pie title="User Distribution" :data="$data" />
@endif
@endforeach
</div>
// In a controller
public function metrics()
{
$metrics = collect([
'users' => User::count(),
'orders' => Order::count(),
'revenue' => Order::sum('amount'),
]);
return view('metrics.dashboard', compact('metrics'));
}
// In Blade
@foreach($metrics as $name => $value)
<x-metric-card::value
title="{{ ucfirst($name) }}"
value="{{ $value }}"
link="{{ route('metrics.details', $name) }}"
/>
@endforeach
Caching Strategy:
// Cache metrics for 5 minutes
$metrics = Cache::remember('dashboard_metrics', 300, function() {
return [
'users' => User::count(),
'revenue' => Order::sum('amount'),
];
});
Queue Background Processing:
// Dispatch metric calculation
MetricCalculator::dispatch($metricType);
// In MetricCalculator job
public function handle()
{
$this->updateMetrics();
}
Custom Metric Components:
<!-- resources/views/vendor/metric-card/extended-value.blade.php -->
<x-metric-card::value
:title="$title"
:value="$value"
:link="$link"
:icon="$icon"
>
<div class="text-sm text-gray-500">
Last updated: {{ now()->format('H:i') }}
</div>
</x-metric-card::value>
Asset Loading Issues:
public/vendor/laravel-metrics/dist/metrics.js exists and is included in your layout:
@stack('scripts')
@push('scripts')
@metricCardAssets
@endpush
Color Overrides Not Working:
config/metric-cards.php ignored.colors_plugin.force_override is true or set colors directly in metric components:
<x-metric-card::pie
:data="$data"
colors="['#6c5cff', '#00c2a8']"
/>
Division by Zero in Pie Charts:
DivisionByZeroError when displaying pie charts.$data = $userDistribution->isEmpty()
? [['label' => 'No data', 'value' => 0]]
: $userDistribution->toArray();
Check JavaScript Errors:
npm run dev # Rebuild assets locally
Inspect browser console for errors related to LaravelMetrics.
Verify Configuration:
// Dump current config
dd(config('metric-cards'));
Inspect Metric Data:
@dump($metricData)
Custom Metric Types:
Create a new metric component in resources/views/vendor/metric-card/custom.blade.php:
<div class="metric-card">
<div class="title">{{ $title }}</div>
<div class="value">{{ $value }}</div>
<!-- Custom content -->
@if($hasTrend)
<div class="trend {{ $trendClass }}">
{{ $trend }}%
</div>
@endif
</div>
Override Default Styling: Publish views and modify:
php artisan vendor:publish --tag=laravel-metric-cards-views
Add New Chart Types:
Extend the JavaScript bundle by modifying resources/js/metrics.js and rebuilding:
npm ci
npm run build
Avoid N+1 Queries:
// Bad
$metrics = [
'users' => User::count(),
'orders' => Order::count(),
];
// Good
$counts = DB::table('users')->count() . ',' . DB::table('orders')->count();
$metrics = explode(',', $counts);
Lazy Load Metrics:
@if(request()->wantsJson() || request()->has('metrics'))
@include('metrics.partial', ['metrics' => $metrics])
@endif
Use Query Caching:
$metrics = Cache::rememberForever('app_metrics', function() {
return [
'users' => User::count(),
'revenue' => Order::sum('amount'),
];
});
How can I help you explore Laravel packages today?