visualbuilder/filament-versionable
Filament plugin to manage Eloquent model revisions with polymorphic user support. View diffs, see who changed what, browse revision history, and restore any previous state. Built on visualbuilder/versionable for multi-user-model tracking.
composer require visualbuilder/filament-versionable
php artisan vendor:publish --provider="Visualbuilder\Versionable\ServiceProvider"
php artisan migrate
@import '../../../../vendor/visualbuilder/filament-versionable/resources/css/plugin.css';
@source '../../../../vendor/visualbuilder/filament-versionable/resources/**/*.blade.php';
Make a model versionable:
use Visualbuilder\Versionable\Versionable;
use Visualbuilder\Versionable\VersionStrategy;
class Post extends Model
{
use Versionable;
protected $versionable = ['title', 'content'];
protected $versionStrategy = VersionStrategy::SNAPSHOT; // Recommended
}
Model Integration:
Versionable trait to Eloquent models.$versionable (attributes to track) and $versionStrategy (use SNAPSHOT for reliability).class Article extends Model
{
use Versionable;
protected $versionable = ['slug', 'body'];
protected $versionStrategy = VersionStrategy::SNAPSHOT;
}
Filament Resource Setup:
RevisionsPage for your resource:
namespace App\Filament\Resources\ArticleResource\Pages;
use App\Filament\Resources\ArticleResource;
use Visualbuilder\FilamentVersionable\RevisionsPage;
class ArticleRevisions extends RevisionsPage
{
protected static string $resource = ArticleResource::class;
}
public static function getPages(): array
{
return [
'revisions' => Pages\ArticleRevisions::route('/{record}/revisions'),
];
}
UI Integration:
RevisionsAction to edit/view pages:
use Visualbuilder\FilamentVersionable\Page\RevisionsAction;
protected function getHeaderActions(): array
{
return [
RevisionsAction::make(),
];
}
RevisionsAction to tables:
use Visualbuilder\FilamentVersionable\Table\RevisionsAction;
$table->actions([
RevisionsAction::make(),
]);
visualbuilder/versionable’s polymorphic support (e.g., User, Admin, OrganisationUser).shouldStripTags() in RevisionsPage for HTML content:
public function shouldStripTags(): bool
{
return true;
}
RevisionsPage to restore any version via the UI.Version Strategy:
DIFF: The README warns of bugs with VersionStrategy::DIFF. Use SNAPSHOT for reliability.SNAPSHOT stores full attribute copies, which may bloat storage for large models.Filament Theme Requirement:
@import '../../../../vendor/visualbuilder/filament-versionable/resources/css/plugin.css';
@source '../../../../vendor/visualbuilder/filament-versionable/resources/**/*.blade.php';
Polymorphic User Edge Cases:
$versionable['user_id'] or $versionable['user_type'] might be null (e.g., in tests or migrations).Migration Conflicts:
overtrue/laravel-versionable before, drop its migrations first to avoid conflicts:
php artisan migrate:fresh --env=testing
versions table directly to verify data:
\DB::table('versions')->where('versionable_id', $model->id)->get();
$versionable attributes are correctly defined.shouldStripTags() method isn’t interfering (toggle it to test).Custom Views: Publish views for overrides:
php artisan vendor:publish --tag="filament-versionable-views"
Then modify resources/views/vendor/filament-versionable/....
Versionable Attributes Dynamically:
Use a getter to define $versionable dynamically:
public function getVersionableAttributes(): array
{
return ['title', 'content'];
}
Event Hooks:
Listen to versioning events (via visualbuilder/versionable) for custom logic:
\Visualbuilder\Versionable\Events\Versioning::class => [YourListener::class, 'handle'],
versions table for large datasets:
Schema::table('versions', function (Blueprint $table) {
$table->index(['versionable_id', 'versionable_type']);
});
$model->disableVersioning();
// ... bulk operations ...
$model->enableVersioning();
How can I help you explore Laravel packages today?