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!
Please or to participate in this conversation.