PHP code example of developerawam / livewire-datatable
1. Go to this page and download the library: Download developerawam/livewire-datatable library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
developerawam / livewire-datatable example snippets
namespace App\Livewire;
use App\Models\User;
use Livewire\Component;
class UsersTable extends Component
{
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'columns' => [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
'created_at' => 'Joined'
],
'searchable' => ['name', 'email']
]);
}
}
'columns' => [
'id' => 'ID',
'name' => 'Full Name',
'email' => 'Email Address',
'created_at' => 'Joined Date',
'department.name' => 'Department', // Relationship data
]
'searchable' => ['name', 'email', 'department.name']
// By default, all columns are sortable
// Prevent sorting on specific columns:
'unsortable' => ['actions', 'avatar']
'formatters' => [
'created_at' => 'datetime', // Format as datetime
'updated_at' => 'date', // Format as date
'balance' => 'currency', // Format as currency
'is_active' => 'boolean', // Format as Yes/No
]
'formatters' => [
'description' => [
'type' => 'words',
'options' => ['words' => 10, 'end' => '...']
],
'title' => [
'type' => 'limit',
'options' => ['length' => 50, 'end' => '...']
],
'price' => [
'type' => 'money',
'options' => [
'symbol' => '$',
'decimals' => 2,
'decimal_point' => '.',
'thousand_sep' => ','
]
],
]
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $with = ['department', 'role'];
public function department()
{
return $this->belongsTo(Department::class);
}
public function role()
{
return $this->belongsTo(Role::class);
}
}
'columns' => [
'id' => 'ID',
'name' => 'Name',
'department.name' => 'Department',
'role.name' => 'Role',
'department.location' => 'Office',
]
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
class User extends Model
{
public function scopeActive(Builder $query): Builder
{
return $query->where('status', 'active');
}
public function scopeFromDepartment(Builder $query, string $department): Builder
{
return $query->whereHas('department', fn ($q) => $q->where('name', $department));
}
}
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'scope' => 'active', // Single scope
'columns' => [...],
]);
}
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'scope' => 'fromDepartment',
'scopeParams' => ['Engineering'],
'columns' => [...],
]);
}
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'columns' => [
'id' => 'ID',
'name' => 'Name',
'status' => 'Status',
'actions' => 'Actions'
],
'customColumns' => [
'status' => 'components.table.status-badge',
'actions' => 'components.table.user-actions'
],
'unsortable' => ['actions']
]);
}
namespace App\Livewire;
use App\Models\User;
use Livewire\Component;
use Livewire\Attributes\On;
class UsersTable extends Component
{
#[On('user-edit')]
public function editUser($id)
{
$this->redirect(route('users.edit', $id));
}
#[On('user-delete')]
public function deleteUser($id)
{
try {
User::findOrFail($id)->delete();
session()->flash('message', 'User deleted successfully!');
// Refresh table after deletion
$this->dispatch('reset-table');
} catch (\Exception $e) {
session()->flash('error', 'Failed to delete user.');
}
}
#[On('user-update-status')]
public function updateUserStatus($id)
{
try {
$user = User::findOrFail($id);
$user->update(['status' => $user->status === 'active' ? 'inactive' : 'active']);
session()->flash('message', 'User status updated!');
// Refresh table after status update
$this->dispatch('reset-table');
} catch (\Exception $e) {
session()->flash('error', 'Failed to update user status.');
}
}
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'columns' => [...],
'customColumns' => [...],
]);
}
}
// Dispatch event to refresh the table after modifications
$this->dispatch('reset-table');
<livewire:livewire-datatable
:model="User::class"
:columns="[...]"
defaultSortField="created_at"
defaultSortDirection="desc" />
defaultSortField="department.name"
defaultSortDirection="asc"
// config/livewire-datatable.php
return [
'advanced_filter' => true, // Default: true
];
// config/livewire-datatable.php
'theme' => [
'filter_panel' => 'p-4 border-r border-gray-200',
'filter_items' => 'space-y-3',
'filter_input' => 'py-2.5 px-4 border-gray-200 rounded-lg',
'filter_add_button' => 'py-2 px-3 text-sm font-medium',
'filter_reset_button' => 'py-2 px-3 text-sm font-medium',
'filter_apply_button' => 'py-2 px-3 text-sm font-medium',
]
namespace App\Livewire;
use Livewire\Component;
class TodoTableApi extends Component
{
public function render()
{
$apiConfig = [
'url' => url('/api/todos'),
'headers' => ['Accept' => 'application/json'],
'data_key' => 'data', // Where to find items
'total_key' => 'total', // Where to find total count
'search_param' => 'search',
'sort_param' => 'sort',
'sort_direction_param' => 'direction',
'per_page_param' => 'per_page',
'page_param' => 'page',
];
return view('livewire.todo-table-api', [
'apiConfig' => $apiConfig,
'columns' => ['id' => 'ID', 'title' => 'Title'],
'searchable' => ['title'],
]);
}
}
$apiConfig = [
'url' => url('/api/todos'),
'method' => 'GET',
'headers' => [
'Authorization' => 'Bearer ' . $token,
'Accept' => 'application/json',
],
'query_params' => ['status' => 'active'],
'response_key' => 'data.todos', // For nested responses
];
// config/livewire-datatable.php
'export' => [
'enabled' => true,
'types' => ['excel', 'pdf'],
'orientation' => 'portrait',
'paper_size' => 'a4',
];
'export' => [
'enabled' => true,
'types' => ['excel', 'pdf'],
'orientation' => 'landscape',
'paper_size' => 'a4',
'dropdown' => [
'position' => 'top',
'trigger_text' => 'Download',
],
],
'template' => env('DATATABLE_TEMPLATE', 'tailwind'),
'bootstrap_theme' => [
'wrapper' => 'container-fluid card',
'table' => 'table table-hover table-sm',
'th' => 'table-light',
'th_sort_button' => 'btn btn-sm btn-ghost',
// ... more bootstrap classes
]
'theme' => [
'table' => 'min-w-full divide-y divide-gray-200',
'th' => 'px-6 py-3 bg-gray-50 text-left text-xs font-medium',
'td' => 'px-6 py-4 whitespace-nowrap text-sm',
'tr' => 'hover:bg-gray-50 transition',
]
'theme' => [
'td_id' => 'font-mono text-gray-500 text-xs',
'td_email' => 'font-medium text-blue-600',
'td_status' => 'text-center font-semibold',
'td_actions' => 'text-right space-x-2',
]
public function render()
{
return view('livewire.users-table', [
'model' => User::class,
'columns' => ['id' => 'ID', 'name' => 'Name'],
'theme' => [
'table' => 'min-w-full divide-y divide-blue-200',
'tr' => 'hover:bg-blue-50',
'td_id' => 'font-mono text-gray-500',
]
]);
}
// config/livewire-datatable.php
'per_page_options' => [10, 25, 50, 100, 'all']
// Set in component
public $perPage = 25;
namespace App\Livewire;
use App\Models\User;
use Livewire\Component;
use Livewire\Attributes\On;
class AdvancedUsersTable extends Component
{
#[On('user-edit')]
public function editUser($id)
{
$this->redirect(route('users.edit', $id));
}
#[On('user-delete')]
public function deleteUser($id)
{
try {
User::findOrFail($id)->delete();
session()->flash('message', 'User deleted!');
} catch (\Exception $e) {
session()->flash('error', 'Failed to delete user.');
}
}
public function render()
{
return view('livewire.advanced-users-table', [
'model' => User::class,
'scope' => 'active',
'columns' => [
'id' => 'ID',
'name' => 'Name',
'email' => 'Email',
'department.name' => 'Department',
'role.name' => 'Role',
'status' => 'Status',
'created_at' => 'Joined',
'actions' => 'Actions'
],
'searchable' => ['name', 'email'],
'unsortable' => ['actions'],
'customColumns' => [
'status' => 'components.table.status-badge',
'actions' => 'components.table.user-actions'
],
'defaultSortField' => 'created_at',
'defaultSortDirection' => 'desc',
]);
}
}
protected $with = ['department', 'role'];
js
// tailwind.config.js
module.exports = {
content: [
"./resources/**/*.blade.php",
"./resources/**/*.js",
"./vendor/developerawam/livewire-datatable/resources/views/**/*.blade.php",
],
};
bash
php artisan vendor:publish --tag="livewire-datatable-config"
bash
php artisan make:livewire UsersTable
blade
{{-- resources/views/livewire/users-table.blade.php --}}
<div>
<livewire:livewire-datatable
:model="$model"
:columns="$columns"
:searchable="$searchable" />
</div>
blade
@php
$statusColors = [
'active' => 'bg-green-100 text-green-800',
'inactive' => 'bg-red-100 text-red-800',
'pending' => 'bg-yellow-100 text-yellow-800'
];
$colorClass = $statusColors[$value] ?? 'bg-gray-100 text-gray-800';
@endphp
<span class="inline-flex px-2 py-1 text-xs font-semibold rounded-full {{ $colorClass }}">
{{ ucfirst($value) }}
</span>
blade
<div>
<livewire:livewire-datatable
:api-config="$apiConfig"
:columns="$columns"
:searchable="$searchable" />
</div>
GET /api/todos?search=keyword&sort=title&direction=asc&per_page=10&page=1