muhammadsadeeq/laravel-activitylog-ui
Modern, no-build Tailwind/Alpine UI for Spatie Laravel Activity Log v5: table, timeline, analytics, powerful filters, saved views, caching-backed pagination, exports (CSV/Excel/PDF/JSON), and granular authorization. Requires PHP 8.4+ and Laravel 12/13.
laravel-activitylog (v5+) is installed and configured with migrations run (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 setup is required for basic functionality.user@example.com).Post).Filtering and Analysis:
created, updated, deleted).Post, User).description, properties, and attribute_changes).Exporting Data:
config/activitylog-ui.php:
'exports' => [
'queue' => [
'enabled' => true,
'threshold' => 1000,
],
],
Authorization:
'authorization' => [
'enabled' => true,
'gate' => 'viewActivityLogUi',
],
'access' => [
'allowed_roles' => ['admin', 'auditor'],
],
Customization:
php artisan vendor:publish --tag="activitylog-ui-views"
ActivitylogUiServiceProvider and binding a new filter class to the container.Analytics Dashboard:
analytics.cache_duration in seconds).scout:search events.Order::created) to correlate UI events with business logic:
event(new OrderCreated($order));
deleted on sensitive models).Missing attribute_changes Column:
activity_log table includes the attribute_changes column (added in v5). Run:
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
php artisan migrate
properties.old/properties.attributes for unmigrated rows, but performance may degrade.Authorization Conflicts:
authorization.enabled = true, ensure the viewActivityLogUi gate is defined in your AuthServiceProvider:
Gate::define('viewActivityLogUi', function ($user) {
return $user->hasRole(['admin', 'auditor']);
});
allowed_users/allowed_roles config bypasses gates entirely.Export Failures:
maatwebsite/excel or barryvdh/laravel-dompdf will silently fall back to CSV/JSON. Check the UI’s export dropdown for disabled options.exports queue for large exports. Increase queue.threshold if jobs fail due to memory limits.Performance with Large Datasets:
cursor()) for efficient loading. Avoid take() for initial queries.activity_log has indexes on created_at, causer_id, and subject_type:
Schema::table('activity_log', function (Blueprint $table) {
$table->index('created_at');
$table->index('causer_id');
$table->index('subject_type');
});
Timeline View Quirks:
null properties may render empty in the timeline. Use the Table view for consistent data display.config/app.php sets a consistent timezone (e.g., 'timezone' => 'UTC')./api/activitylog-ui/activities). Non-JSON responses (e.g., 500 errors) now show clear diagnostics.init() method (fixed in v1.3.1). Clear Alpine state with:
Alpine.store('activitylogUi', { filters: {} });
old, attributes) from the UI’s "Custom Properties" panel to avoid duplication.Custom Filters:
StatusFilter) extending MuhammadSadeeq\ActivitylogUi\Filters\Filter and bind it in the service provider:
$this->app->bind(
'activitylog-ui.filter.status',
StatusFilter::class
);
config/activitylog-ui.php:
'filters' => [
'custom' => [
'status' => ['label' => 'Order Status', 'type' => 'select'],
],
],
Event-Specific Styling:
activitylog-ui/partials/event-badge.blade.php view to customize event badges (e.g., color-code by severity).Analytics Customization:
AnalyticsService to add custom metrics (e.g., "Failed Logins"):
namespace App\Services;
use MuhammadSadeeq\ActivitylogUi\Services\AnalyticsService;
class CustomAnalyticsService extends AnalyticsService {
public function failedLogins() { ... }
}
'analytics' => [
'service' => App\Services\CustomAnalyticsService::class,
],
Real-Time Updates:
Echo.channel('activity-log')
.listen('ActivityLogged', (e) => {
Alpine.store('activitylogUi').addActivity(e);
});
/activitylog-ui prefix in config/activitylog-ui.php:
'route' => [
'prefix' => 'admin/activity-logs',
],
'route' => [
'middleware' => ['auth', 'verified'],
],
analytics or saved_views to reduce frontend complexity:
'features' => [
'analytics' => env('APP_ENV') === 'production',
],
```markdown
How can I help you explore Laravel packages today?