Membuat Fungsi Datatable dengan Livewire

Seperti yang sudah diketahui, datatable merupakan component yang sering digunakan untuk menyajikan data. Karena fungsinya yang cukup lengkap seperti sorting, searching dan pagination. Tapi keterbatasan menggunakan datatable adalah kita harus menggunakan jQuery di dalamnya dan Bootstrap. Nah apabila aplikasi kita sekarang dibangun menggunakan Laravel, Livewire dan Tailwinds, kita juga bisa membuat fungsi table layaknya datatable tersebut,

Setup Laravel dan Livewire, bisa dilihat pada halaman dokumentasi di https://laravel-livewire.com/docs/2.x/installation

Saya anggap kita sudah punya tabel Categories yang ada isinya dan sudah dibuat modelnya, dan buat dulu component Livewirenya dengan perintah

php artisan make:component Categories

Pada class Categories, kita ubah menjadi seperti berikut

<?php
namespace App\Http\Livewire;
use App\Models\Categories as ModelsCategories;
use Livewire\Component;
use Livewire\WithPagination;
class Categories extends Component
{
    use WithPagination;
    public $category_id, $name, $description,$searchParam;
   
    public $columnOrder = 'id';
    public $order = 'ASC';
   
    public function render()
    {
        $searchParam = '%'.$this->searchParam.'%';
        $order = $this->order;
        $columnOrder = $this->columnOrder;
        return view('livewire.categories', [
            'data' => ModelsCategories::orderBy($columnOrder,$order)->where('name','like',$searchParam)->paginate(5),
        ]);
    }
    public function sort($column){
        $this->order = $this->order == 'ASC' ? 'DESC' : 'ASC';
        $this->columnOrder = $column;
    }
}

Untuk pengaplikasiannya, kira-kira seperti ini untuk pencarian

<input type="search" name="search" wire:model="searchParam" class="leading-snug border border-gray-300 block w-full appearance-none bg-gray-100 text-sm text-gray-600 py-1 px-4 pl-8 rounded-lg" placeholder="Search" />

Untuk tabelnya

<table class="table-auto border-collapse w-full">
            <thead>
                <tr class="rounded-lg text-sm font-medium text-gray-700 text-left" style="font-size: 0.9674rem">
                    <th  wire:click="sort('name')" class="px-4 py-2 bg-gray-200" style="background-color:#f8f8f8">
                        <div class="flex flex-row">
                        Name 
                        </div>
                    </th>
                    <th  wire:click="sort('description')" class="px-4 py-2" style="background-color:#f8f8f8">
                        <div class="flex flex-row">
                        Description
                        </div>
                    </th>
                    <th class="px-4 py-2 " style="background-color:#f8f8f8">Action</th>
                </tr>
            </thead>
            <tbody class="text-sm font-normal text-gray-700">
                @foreach ($data as $item)
                    <tr class="hover:bg-gray-100 border-b border-gray-200 py-10">
                        <td class="px-4 py-4">{{ $item->name }}</td>
                        <td class="px-4 py-4">{{ $item->description }}</td>
                        <td class="px-4 py-4 flex space-x-4"> 
                            <a href="#" wire:click.prevent="edit({{ $item->id }})" class="text-yellow-400">Edit</a>
                            <a href="#" wire:click.prevent="delete({{ $item->id }})" class="text-red-500">Delete</a>
                            
                        </td>
                    </tr>
                @endforeach
            </tbody>
        </table>

Sedangkan untuk paginasinya

<div id="pagination" class="w-full mt-4">
{{ $data->links() }}
</div>

Full sourcecode https://github.com/dwijonarko/laravel-8-livewire-tailwind

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.