Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

gilr's avatar
Level 5

Tip: (Nova) Change history (in detail screen) using revisionable

Hi all, What is your solution to display a record history when using the venturecraft/revisionable package? I needed a simple solution, here my first simple snippet. If you're using another solution, I am really interested . Or don't hesitate to provide improvements or advices! (Note that the example below also uses SoftDeletes & Wildside\Userstamps package)

In the resource class of each model, I just has to add a simple common panel:

public function fields(Request $request)
{
    return [
       ID::make('#', 'id')->sortable(),
        ...
        // Common history panel
        new Panel('Record history', $this->commonMetadata()),
    ];
}

And here is the common function, added in the ressource class:

protected function commonMetadata()
{
    return [
        DateTime::make('Created', 'created_at')
            ->format('DD/MM/YYYY HH:mm')
            ->onlyOnDetail(),

        BelongsTo::make('By', 'creator', 'App\Nova\User')
            ->onlyOnDetail(),

        DateTime::make('Updated', 'updated_at')
            ->sortable()
            ->format('DD/MM/YYYY HH:mm')
            ->exceptOnForms(),

        BelongsTo::make('By', 'editor', 'App\Nova\User')
            ->sortable()
            ->exceptOnForms(),

        DateTime::make('Deleted', 'deleted_at')
            ->format('DD/MM/YYYY HH:mm')
            ->onlyOnDetail(),

        BelongsTo::make('By, 'destroyer', 'App\Nova\User')
            ->onlyOnDetail(),

        Trix::make('Changes', function() {
            $history = $this->revisionHistory()->getResults()->reverse();
            $display = "";
            foreach ($history as $revision) {
                $name_pattern = " - <span style='color:green; font-weight:bold'>" . $revision->userResponsible()->name . "</span> - ";
                if($revision->key == 'created_at' && !$revision->old_value) {
                    $display .= $revision->created_at . $name_pattern . "<span style='color:blue'>Creation</span></br>";
                }
                else if($revision->key == 'deleted_at' && !$revision->old_value) {
                    $display .= $revision->created_at . $name_pattern . "<span style='color:red'>Deletion</span></br>";
                }
                else if($revision->key == 'deleted_at' && $revision->old_value) {
                    $display .= $revision->created_at . $name_pattern . "<span style='color:blue'>Restoration</span></br>";
                }
                else {
                    $display .= $revision->created_at . $name_pattern . "Field <b>" . $revision->fieldName() . "</b> changed from \"<span style='color:red'>" . $revision->oldValue() . "</span>\" to \"<span style='color:blue'>" . $revision->newValue() ."</span>\"</br>";
                }
            }
            return $display;

        }) ->onlyOnDetail(),
    ];
}

It still has to be improved (e.g. hiding be default a change in a too long text , or limiting the number of displayed changes/lines). ideas and improvements are welcome!

0 likes
0 replies

Please or to participate in this conversation.