Manage model revisions with ease.
If you are also looking to preview the form data before submitting to the db, you may want to give OverSeer a try.
composer require ctf0/odin
(Laravel < 5.5) add the service provider & facade
'providers' => [
ctf0\Odin\OdinServiceProvider::class,
];
publish the package assets with
php artisan vendor:publish --provider="ctf0\Odin\OdinServiceProvider"
after installation, run php artisan odin:setup
to add
routes/web.php
webpack.mix.js
check laravel-auditing docs for configuration
install dependencies
yarn add vue vue-awesome@v2 vue-notif axios keycode
add this one liner to your main js file and run npm run watch
to compile your js/css
files.
// app.js
window.Vue = require('vue')
require('../vendor/Odin/js/manager')
new Vue({
el: '#app'
})
support single & nested values.
delete & restore revisions.
support soft deletes.
clear audits for permanently deleted models.
php artisan odin:gc
$schedule->command('odin:gc')->sundays();
shortcuts
navigation | keyboard | mouse (click) |
---|---|---|
go to next revision | right/down | * (revision date) |
go to prev revision | left/up | * (revision date) |
go to first revision | home | * (revision date) |
go to last revision | end | * (revision date) |
hide revision window | esc | * (x) |
events "JS"
event-name | description |
---|---|
odin-show | when revision is showen |
odin-hide | when revision is hidden |
run php artisan migrate
add Revisions
trait & AuditableContract
contract to your model
User model
Check
use ctf0\Odin\Traits\Revisions;
use Illuminate\Database\Eloquent\Model;
use OwenIt\Auditing\Contracts\Auditable as AuditableContract;
class Post extends Model implements AuditableContract
{
use Revisions;
/**
* resolve model title/name for the revision relation
* this is needed so we can render
* the model relation attach/detach changes
*/
public function getMiscTitleAttribute()
{
return $this->name;
}
// ...
}
you can disable creating ghost audits where both old/new
values are empty by using
// app/Providers/EventServiceProvider
use OwenIt\Auditing\Models\Audit;
public function boot()
{
parent::boot();
Audit::creating(function (Audit $model) {
if (empty($model->old_values) && empty($model->new_values)) {
return false;
}
});
}
inside the model view ex.post edit view
add
@if (count($post->revisionsWithRelation))
@include('Odin::list', ['revisions' => $post->revisionsWithRelation])
@endif
model user_id
& id
are excluded from the audit log by default.
data:uri
if you use data:uri
in your revisionable content, change audits_table
columns type to either mediumText
or longText
before migrating to avoid future errors of long data.
because data:uri
is a render blocking & isn't readable by humans, we truncate it to 75 char max
note that this ONLY effects the displaying of the revision diff, we never touch the data that gets saved to the db.
model-relation
attach/detach
changes but we cant undo/redo
any of them through the package it self.Model::update()
make sure to call $model->touch();
afterwards to make sure an audit is created ex.
$model = Model::update([...]);
$model->touch();
If you discover any security-related issues, please email [email protected].