Skip to content
Lenny P. edited this page Jan 9, 2026 · 1 revision

Welcome to the PenguTables wiki!

Example Usage:

<?php

namespace App\Livewire;

use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use RealZone22\PenguTables\Livewire\PenguTable;
use RealZone22\PenguTables\Table\Action;
use RealZone22\PenguTables\Table\BulkAction;
use RealZone22\PenguTables\Table\Column;
use RealZone22\PenguTables\Table\ExportTypes;
use RealZone22\PenguTables\Table\Filters\BooleanFilter;
use RealZone22\PenguTables\Table\Filters\DateFilter;
use RealZone22\PenguTables\Table\Filters\SelectFilter;
use RealZone22\PenguTables\Table\Filters\TextFilter;
use RealZone22\PenguTables\Table\Header;
use RealZone22\PenguTables\Table\Options;
use RealZone22\PenguTables\Traits\WithExport;

class Test extends PenguTable
{
    use WithExport;

    protected function setupOptions(): Options
    {
        return parent::setupOptions()->withExport(true, ExportTypes::CSV_SELECTED, ExportTypes::CSV_ALL, ExportTypes::XLSX_SELECTED, ExportTypes::XLSX_ALL)->setPerPage(2000);
    }

    public function query(): Builder
    {
        return User::query();
    }

    public function header(): array
    {
        return [
            Header::make('<x-button>Hello World</x-button>'),
            Header::make('<x-button>Hello World 1</x-button>'),
        ];
    }

    public function bulkActions(): array
    {
        return [
            BulkAction::make('Test', fn($row) => dd($row)),
            BulkAction::make('Test1', fn($row) => dd($row)),
            BulkAction::make('Test2', fn($row) => dd($row)),
        ];
    }

    public function filters(): array
    {
        return [
            BooleanFilter::make('email_verified_at')
                ->label('Email Verified')
                ->trueLabel('Yes')
                ->falseLabel('No'),
            DateFilter::make('created_at')
                ->label('Created At')
                ->filter(fn(Builder $query, $value) => $query->whereDate('created_at', $value)),
            SelectFilter::make('email')
                ->label('Email')
                ->options([
                    'gmail.com' => 'Gmail',
                    'example.com' => 'Example.com',
                    'example.net' => 'Example.net',
                ])
                ->filter(function (Builder $query, $value) {
                    if (!empty($value)) {
                        $query->where('email', 'like', '%' . $value . '%');
                    }
                }),
            TextFilter::make('name')
                ->label('Name')
                ->filter(function (Builder $query, $value) {
                    if (!empty($value)) {
                        $query->where('name', 'like', '%' . $value . '%');
                    }
                }),
        ];
    }

    public function columns(): array
    {
        return [
            Column::make('ID', 'id')
                ->sortable()
                ->searchable(),
            Column::make('Name', 'name')
                ->sortable()
                ->searchable(),
            Column::make('EMail', 'email')
                ->sortable()
                ->searchable(),
            Column::make('EMailVerifiedAt', 'email_verified_at')
                ->format(function ($value) {
                    if ($value) {
                        return '<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-check" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 12l5 5l10 -10" /></svg> ' . date('d.m.Y H:i:s', strtotime($value));
                    }
                    return '';
                })
                ->html()
                ->sortable()
                ->searchable(),
            Column::make('Created At', 'created_at')
                ->format(fn($value) => date('d.m.Y H:i:s', strtotime($value)))
                ->sortable()
                ->searchable(),
            Column::make('Updated At', 'updated_at')
                ->format(fn($value) => date('d.m.Y H:i:s', strtotime($value)))
                ->sortable()
                ->searchable(),
            Column::actions('Actions', function ($row) {
                return [
                    Action::make('<a href="/users/' . $row->id . '/edit" class="btn btn-sm btn-primary">Edit</a>'),
                    Action::make('<button onclick="deleteUser(' . $row->id . ')" class="btn btn-sm btn-danger">Delete</button>')
                ];
            })
        ];
    }
}

Clone this wiki locally