Skip to content

Advanced Usage ​

This guide covers more advanced usage of Livewire Simple Tables, showing how to create complex and feature-rich tables.

Complete Table Example ​

Here's a comprehensive example showcasing various features of Livewire Simple Tables:

php
<?php

namespace App\Livewire;

use App\Models\User;
use App\Filters\StateFilter;
use App\Filters\CityFilter;
use App\Filters\RegistrationTypeFilter;
use Illuminate\Database\Eloquent\Builder;
use TiagoSpem\SimpleTables\Action;
use TiagoSpem\SimpleTables\Bulk;
use TiagoSpem\SimpleTables\Column;
use TiagoSpem\SimpleTables\Concerns\ActionBuilder;
use TiagoSpem\SimpleTables\Concerns\BulkAction;
use TiagoSpem\SimpleTables\Concerns\Mutation;
use TiagoSpem\SimpleTables\Concerns\TableRowStyle;
use TiagoSpem\SimpleTables\Facades\SimpleTables;
use TiagoSpem\SimpleTables\Field;
use TiagoSpem\SimpleTables\Option;
use TiagoSpem\SimpleTables\SimpleTableComponent;

class UsersTable extends SimpleTableComponent
{
    use UserTableSharedMethods;

    // Pagination settings
    public bool $stickyPagination = true;
    public int $perPage = 20;
    
    // Detail view settings
    public bool $shouldCloseOthers = false;
    
    // Filter settings
    protected bool $persistFilters = true;
    
    // Styling
    protected string $paginationContainerStyle = 'mt-4 w-full bg-white rounded p-1';

    /**
     * Define the detailed view for each row.
     */
    public function detailView(): array
    {
        return [
            'view'   => 'livewire.admin.users.detail',
            'params' => [
                'search'                => $this->search,
                'formatPersonalAddress' => fn (User $user) => $this->formatPersonalAddress($user),
                'formatCompanyAddress'  => fn (User $user) => $this->formatCompanyAddress($user),
            ],
        ];
    }

    /**
     * Define filters for the table.
     */
    protected function filters(): array
    {
        return [
            StateFilter::class,
            CityFilter::class,
            RegistrationTypeFilter::class,
        ];
    }

    /**
     * Define bulk actions for the table.
     */
    public function bulkActions(): BulkAction
    {
        return SimpleTables::bulkActions()
            ->bulkActions([
                Bulk::event('Delete Users', 'deleteUsersDialog')
                    ->icon('svg.trash')
                    ->can(true),
            ]);
    }

    /**
     * Define the columns to be searched.
     */
    protected function setColumnsToSearch(): array
    {
        return [
            ...$this->usersFields(),
            ...$this->personalInformationFields(),
            ...$this->spouseInformationFields(),
            ...$this->companyInformationFields(),
        ];
    }

    /**
     * Define the columns for the table.
     */
    public function columns(): array
    {
        return [
            Column::text(__('ui.inputs.id'), 'id')->style('w-[90px]')
                ->sortable(),
            Column::text(__('ui.inputs.name'), 'personal_name')
                ->sortable()
                ->style('w-[300px]'),
            Column::text(__('ui.inputs.username'), 'username')
                ->sortable()
                ->style('!w-[200px]'),
            Column::text(__('ui.inputs.state'), 'personal_address_state'),
            Column::text(__('ui.inputs.created_at'), 'created_at')->sortable(),
            Column::action('actions', ''),
        ];
    }

    /**
     * Define the data source for the table.
     */
    public function datasource(): Builder
    {
        return $this->baseUserQuery();
    }

    /**
     * Define field mutations for the table.
     */
    public function mutation(): Mutation
    {
        return SimpleTables::mutation()
            ->fields([
                Field::key('id')->style('!w-[90px]'),
                Field::key('username')->style('!w-[200px] truncate'),
                Field::key('personal_name')
                    ->view('livewire.admin.users.user-info-column'),
                Field::key('created_at')
                    ->mutate(fn (User $user) => $user->created_at->format('d/m/Y H:i')),
            ]);
    }

    /**
     * Define styling for table rows.
     */
    public function tableRowStyle(): TableRowStyle
    {
        return SimpleTables::tableRowStyle()
            ->style(fn (User $user) => $this->tableColor($user->profile_status->value))
            ->style('uppercase');
    }

    /**
     * Define actions for the table.
     */
    public function actionBuilder(): ActionBuilder
    {
        return SimpleTables::actionBuilder()
            ->actions([
                Action::for('actions')
                    ->button('svg.cog')
                    ->can('enable-users')
                    ->dropdown([
                        Option::add(__('ui.buttons.profile'), 'svg.user-tag')
                            ->href(fn (User $user) => route('admin.users.profile', $user->id), true)
                            ->can('enable-user-profile'),
                        Option::add(__('ui.buttons.edit'), 'svg.user-edit')
                            ->href(fn (User $user) => route('admin.users.edit', $user->id), true)
                            ->can('enable-edit-users'),
                        Option::add(__('ui.buttons.impersonate'), 'svg.mask')
                            ->href(fn (User $user) => route('impersonate.take', $user->id), true)
                            ->can('enable-impersonation'),

                        Option::divider([
                            Option::add(__('ui.buttons.block'), 'svg.user-block')
                                ->event('dialogAction', fn (User $user) => ['suspend', $user->id, true]),
                            Option::add(__('ui.buttons.block_without_notify'), 'svg.user-block')
                                ->event('dialogAction', fn (User $user) => ['suspend', $user->id, false]),
                        ])
                            ->hidden(fn (User $user) => !$user->profile_status->canSuspend())
                            ->can('enable-suspend-users'),

                        Option::divider([
                            Option::add(__('ui.buttons.release'), 'svg.users-check')
                                ->event('dialogAction', fn (User $user) => ['release', $user->id, true]),
                            Option::add(__('ui.buttons.release_without_notify'), 'svg.users-check')
                                ->event('dialogAction', fn (User $user) => ['release', $user->id, false]),
                        ])
                            ->hidden(fn (User $user) => !$user->profile_status->canRelease())
                            ->can('enable-release-users'),

                        Option::add(__('ui.buttons.archive'), 'svg.folder')
                            ->event('dialogAction', fn (User $user) => ['archive', $user->id, false])
                            ->hidden(fn (User $user) => !$user->canArchive())
                            ->can('enable-archive-users'),

                        Option::add(__('ui.buttons.login-history'), 'svg.key2')
                            ->href(fn (User $user) => route('admin.users.login-history', $user->id), true)
                            ->can('enable-login-history'),
                    ]),
            ]);
    }
}

Key Features Demonstrated ​

The example above shows several advanced features:

1. Custom Pagination Settings ​

php
public bool $stickyPagination = true;
public int $perPage = 20;

2. Row Details ​

php
public function detailView(): array
{
    return [
        'view'   => 'livewire.admin.users.detail',
        'params' => [
            // Parameters to pass to the detail view
        ],
    ];
}

3. Filters ​

php
protected function filters(): array
{
    return [
        StateFilter::class,
        CityFilter::class,
        RegistrationTypeFilter::class,
    ];
}

4. Bulk Actions ​

php
public function bulkActions(): BulkAction
{
    return SimpleTables::bulkActions()
        ->bulkActions([
            Bulk::event('Delete Users', 'deleteUsersDialog')
                ->icon('svg.trash')
                ->can(true),
        ]);
}

5. Custom Column Styling ​

php
Column::text(__('ui.inputs.name'), 'personal_name')
    ->sortable()
    ->style('w-[300px]'),

6. Field Mutations ​

php
public function mutation(): Mutation
{
    return SimpleTables::mutation()
        ->fields([
            Field::key('created_at')
                ->mutate(fn (User $user) => $user->created_at->format('d/m/Y H:i')),
        ]);
}

7. Row Styling ​

php
public function tableRowStyle(): TableRowStyle
{
    return SimpleTables::tableRowStyle()
        ->style(fn (User $user) => $this->tableColor($user->profile_status->value))
        ->style('uppercase');
}

8. Complex Actions with Permissions ​

The actionBuilder method demonstrates how to create dropdown menus with various actions, including navigation links, events, and conditional display based on permissions and row data.

Next Steps ​

To learn more about specific features in-depth, check out the following guides: