muhammadsadeeq/laravel-activitylog-ui
Modern UI for Spatie laravel-activitylog: table, timeline and analytics dashboards with powerful filters, saved views, exports (CSV/Excel/PDF/JSON), caching for fast counts/pagination, and authorization controls. Tailwind + Alpine, no build step.
laravel-activitylog installed and configured (v5+). Run its migrations:
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
php artisan migrate
composer require muhammadsadeeq/laravel-activitylog-ui
php artisan vendor:publish --provider="MuhammadSadeeq\ActivitylogUi\ActivitylogUiServiceProvider" --tag="activitylog-ui-config"
/activitylog-ui (default route). No additional routes or middleware are required unless configured./activitylog-ui and use the search bar to filter by a user’s email (e.g., user@example.com).created, updated, deleted).name from "Old Name" to "New Name") in the modal.created, updated).Post, User).description, properties, and attribute_changes).maatwebsite/excel:
composer require maatwebsite/excel
barryvdh/laravel-dompdf:
composer require barryvdh/laravel-dompdf
config/activitylog-ui.php:
'exports' => [
'queue' => [
'enabled' => true,
'threshold' => 1000, // Queue if >1000 records
],
],
'features' => [
'analytics' => true,
],
'analytics' => [
'cache_duration' => 3600, // 1 hour
],
'authorization' => [
'enabled' => true,
'gate' => 'viewActivityLogUi',
],
Define the gate in App\Providers\AuthServiceProvider:
Gate::define('viewActivityLogUi', function ($user) {
return $user->isAdmin(); // Custom logic
});
'access' => [
'allowed_users' => ['admin@example.com'],
'allowed_roles' => ['super-admin'],
],
php artisan vendor:publish --provider="MuhammadSadeeq\ActivitylogUi\ActivitylogUiServiceProvider" --tag="activitylog-ui-views"
resources/views/vendor/activitylog-ui/table.blade.phpresources/views/vendor/activitylog-ui/timeline.blade.phppublic/js/activitylog-ui.js (published via activitylog-ui-assets).<a href="{{ route('activitylog-ui.index') }}" class="btn btn-primary">
View Activity Log
</a>
route('activitylog-ui.index', [
'event' => 'deleted',
'user' => 'user@example.com',
]);
Activity model or use a trait to add computed properties:
namespace App\Models;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;
class Post extends Model
{
use LogsActivity;
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['title', 'content', 'published_at'])
->logOnlyDirty()
->dontSubmitEmptyLogs();
}
// Custom property for UI
public function getFormattedTitleAttribute()
{
return "Post #{$this->id}: {$this->title}";
}
}
table.blade.php view to include {{ $activity->subject->formatted_title }}.// resources/js/app.js
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
});
Echo.channel('activity-log')
.listen('ActivityLogged', (e) => {
alert(`New activity: ${e.description}`);
});
ActivityService:
event(new ActivityLogged($activity));
'ui' => [
'dark_mode' => true,
],
Missing activity_log Table
Table 'activity_log' doesn't exist.php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
php artisan migrate
PHP 8.4+ Required
Your PHP version (8.1) is not supported.Spatie v5 Schema Mismatch
Column 'attribute_changes' doesn't exist.config/activitylog-ui.php).Export Dependencies Missing
Class 'Maatwebsite\Excel\Facades\Excel' not found.composer require maatwebsite/excel
Alpine.js Conflicts
Alpine.js not defined or TypeError in console.@vite(['resources/js/app.js', 'vendor/activitylog-ui/js/activitylog-ui.js'])
Or publish assets:
php artisan vendor:publish --tag="activitylog-ui-assets"
Authorization Bypass
/activitylog-ui without permissions.'authorization' => [
'enabled' => true,
'gate' => 'viewActivityLogUi',
],
Large Dataset Performance
activity_log:
Schema::table('activity_log', function (Blueprint $table) {
$table->index('event');
$table->index('causer_id');
$table->index('subject_type');
$table->index('subject_id');
});
/activitylog-ui/api/activities in browser devHow can I help you explore Laravel packages today?