dongrim / datatable-inertia
Easy build datatable for InertiaJS on Laravel
Requires
- php: >=7.4.0
- laravel/framework: ~6.0||^7.0||^8.0||^9.0
Requires (Dev)
- inertiajs/inertia-laravel: ^0.6.3
- laravel/legacy-factories: 1.x
- laravel/pint: ^0.2.3
- orchestra/testbench: ^6.24
- phpunit/phpunit: 9.5.*
README
This package provides a DataTables-like experience for Inertia.js with support for searching, filtering, sorting and pagination.
Laravel compatibility
Installation
Install the package via composer.
composer require dongrim/datatable-inertia
Config Files
In order to edit the default configuration you may execute:
php artisan vendor:publish --provider="Dongrim\DatatableInertia\DatatableInertiaServiceProvider"
Usage
php artisan datatable:make SomeDatatable
By default, the command generates the SomeDatatable
class in the \App\Datatables directory
If you want to change the destination path of a class, you can use one of these methods:
- Specify a new path in the file /config/datatables.php
'basePath' => '\App\Datatables'
- Run command
php artisan datatable:make
without specifying the name of the generated class and answer questions.
To generate data, a table
macro has been created for Inertia\Response.
You can take advantage of dependency injection
public function index(PostDatatable $datatable) { return Inertia::render('Post/Index')->table($datatable); }
Or just give the classpath
public function index() { return Inertia::render('Post/Index')->table(PostDatatable::class); // '\App\Datatables\PostDatatable' }
If you need to pass additional data, use the usual method of passing data in InertiaJs
public function index(PostDatatable $datatable) { return Inertia::render('Post/Index', ['data' => 'some data'])->table($datatable); }
By default datatable class is generated in minimal configuration
For example
namespace \App\Datatables; use Illuminate\Database\Eloquent\Builder; use Dongrim\DatatableInertia\DatatableInertia; class PostDatatable extends DatatableInertia { /** * Eloquent datatable query builder * * @return Builder */ public function query(): Builder { // code } }
Public properties available in the class:
Note that these options are set globally in the config/datatables.php configuration file.
You can override them directly in you the class
Public methods available in the class:
For ExampleDatatable:
namespace App\Datatables; use App\Models\Post; use Illuminate\Support\Facades\Auth; use Illuminate\Database\Eloquent\Builder; use Dongrim\DatatableInertia\DatatableInertia; class PostDatatable extends DatatableInertia { public $datatableName = 'post_datatable'; public $perPageKey = 'post_per_page'; public $itemsPerPage = 25; public $serverSide = true; public function query(): Builder { return Post::select('posts.*', 'users.username as author_name') ->join('users', function ($join) { $join->on('users.id', '=', 'posts.author_id'); }) ->when(request()->search, function ($query, $search) { return $query->where('title', 'like', "{$search}%") ->orWhere('text', 'like', "{$search}%") ->orWhere('users.username', 'like', "{$search}%"); }) ->when(request()->sort, function ($query, $sort) { $query->withoutGlobalScopes(); $table = ($sort == 'id') ? "posts." : ""; $query->orderBy($table . $sort, request()->order ?? 'asc'); }) ->when(request()->active, function ($query, $active) { $active = $active === 'true' ? true : false; $query->where('posts.active', $active); }); } public function columns(): array { return ['id', 'position', 'active', 'title', 'text', 'author_name']; } public function filters(): array { return ['sort', 'order', 'search', 'active']; } public function guard($data): array { return [ 'edit' => Auth::user()->can('post.edit') ? route('post.edit', $data->id) : null, 'destroy' => Auth::user()->can('post.destroy') ? route('post.destroy', $data->id) : null, 'restore' => Auth::user()->can('post.restore') ? route('post.restore', $data->id) : null, ]; } public function modify($data) { $data->text = str($data->text)->substr(0, 100); return $data; } }