Search by

mansoor / filament-versionable

mansoorkhan96

Effortlessly manage revisions of your Eloquent models in Filament.

Package info

github.com/mansoorkhan96/filament-versionable

pkg:composer/mansoor/filament-versionable

Fund package maintenance!

mansoor

Statistics

Installs: 193 006

Dependents: 6

Suggesters: 0

Stars: 111

Open Issues: 2

v5.2 2026-10-24 07:18 UTC

README

Filament Versionable

Latest Version on Packagist Tests Code Style Total Downloads

Efforlessly manage your Eloquent model revisions in Filament. It includes:

  • A Filament page to show the Diff of what has changed and who changed it
  • A list of Revisions by different users
  • A Restore action to restore the model to any state

Installation

You can install the package via composer:

composer require mansoor/filament-versionable

Then, publish the config file and migrations:

php artisan vendor:publish --provider="Overtrue\LaravelVersionable\ServiceProvider"

Run the migration command:

php artisan migrate

Important

If you have not set up a custom theme and are using Filament Panels follow the instructions in the Filament Docs first.

After setting up a custom theme add the plugin's views and css to your theme css file.

@import '../../../../vendor/mansoor/filament-versionable/resources/css/plugin.css';
@source '../../../../vendor/mansoor/filament-versionable/resources/**/*.blade.php';

Usage

Add Overtrue\LaravelVersionable\Versionable trait to your model and set $versionable attributes.

NOTE: Make sure to add protected $versionStrategy = VersionStrategy::SNAPSHOT; This would save all the $versionable attributes when any of them changed. There are different bug reports on using VersionStrategy::DIFF

use Overtrue\LaravelVersionable\VersionStrategy;

class Post extends Model
{
    use Overtrue\LaravelVersionable\Versionable;

    protected $versionable = ['title', 'content'];

    protected $versionStrategy = VersionStrategy::SNAPSHOT;
}

Create a Revisons Resource page to show Revisions, it should extend the Mansoor\FilamentVersionable\RevisionsPage. If you were to create a Revisions page for ArticleResource, it would look like:

namespace App\Filament\Resources\ArticleResource\Pages;

use App\Filament\Resources\ArticleResource;
use Mansoor\FilamentVersionable\RevisionsPage;

class ArticleRevisions extends RevisionsPage
{
    protected static string $resource = ArticleResource::class;
}

Next, Add the ArticleRevisions page (that you just created) to your Resource

use App\Filament\Resources\ArticleResource\Pages;

public static function getPages(): array
{
    return [
        ...
        'revisions' => Pages\ArticleRevisions::route('/{record}/revisions'),
    ];
}

Add RevisionsAction to your edit/view pages, this action would only appear when there are any versions for the model you are viewing/editing.

use Mansoor\FilamentVersionable\Page\RevisionsAction;

protected function getHeaderActions(): array
{
    return [
        RevisionsAction::make(),
    ];
}

You can also add the RevisionsAction to your table.

use Mansoor\FilamentVersionable\Table\RevisionsAction;

$table->actions([
    RevisionsAction::make(),
]);

You are all set! Your app should store the model states and you can manage them in Filament.

Translatable Models

If your model uses spatie/laravel-translatable, the Revisions page automatically splits every translatable attribute into one diff block per locale, so instead of a raw JSON blob like {"en":"Hello","ar":"مرحبا"} you get a clean, readable diff for each language — complete with a locale badge, right-to-left rendering support, and the same word-level highlighting as any other attribute.

use Overtrue\LaravelVersionable\Versionable;
use Overtrue\LaravelVersionable\VersionStrategy;
use Spatie\Translatable\HasTranslations;

class Article extends Model
{
    use HasTranslations;
    use Versionable;

    protected $versionable = ['title', 'content'];

    protected $versionStrategy = VersionStrategy::SNAPSHOT;

    public array $translatable = ['title', 'content'];
}

No extra setup is required. The detection is based on the model exposing getTranslatableAttributes() (provided by the HasTranslations trait), so models without translations keep rendering exactly as before. Models using the DIFF version strategy are supported as well.

The right-to-left styling ships in the plugin's plugin.css, so rebuild your theme after upgrading.

Note

If you are on Filament 3, you may also use the official filament/spatie-laravel-translatable-plugin to edit translatable records. From Filament 4 onwards the official plugin no longer exists; community packages such as lara-zeus/spatie-translatable provide the equivalent editing experience for recent Filament versions. Either way, the Revisions page renders translatable attributes per locale on its own.

Customisation

If you want to change the UI for Revisions page, you may publish the publish the views to do so.

php artisan vendor:publish --tag="filament-versionable-views"

If you want more control over how the versions are stored, you may read the Laravel Versionable Docs.

Strip Tags from Diff

You can easily remove/strip HTML tags from the diff by just overriding shouldStripTags method inside your revisions page.

class ArticleRevisions extends RevisionsPage
{
    protected static string $resource = ArticleResource::class;

    public function shouldStripTags(): bool
    {
        return true;
    }
}

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.