Besides rendering the head, body, and pagination, the component supports many other features like filtering, searching, sorting, and more. The built-in Query Builder has been tested with MySQL, PostgreSQL and SQLite.
With the searchInput
method, you can specify which attributes are searchable. Search queries are passed to the URL query as a filter.
Though it's enough to pass in the column key, you may specify a custom label.
$table
->searchInput('name')
->searchInput(
key: 'framework',
label: 'Find your framework',
);
Select Filters are similar to search fields but use a select
element instead of an input
element. This way, you can present the user a predefined set of options.
The selectFilter
method requires two arguments: the key and a key-value array with the options.
$table->selectFilter('language_code', [
'en' => 'English',
'nl' => 'Dutch',
]);
The selectFilter
will, by default, add a no filter option to the array. You may disable this or specify a custom label for it.
$table->selectFilter(
key: 'language_code',
options: $languages,
label: 'Language',
noFilterOption: true,
noFilterOptionLabel: 'All languages'
);
With the column
method, you can specify which columns you want to be toggleable, sortable, and searchable. You must pass in at least a key or label for each column.
$table
->column('email', 'User Email')
->column(
key: 'name',
label: 'User Name',
canBeHidden: true,
hidden: false,
sortable: true,
searchable: true
);
By default, the canBeHidden
value is set to true
, making every column toggleable. However, you may change this behavior by using the static defaultColumnCanBeHidden
method on the SpladeTable
class, for example, in the AppServiceProvider
class:
SpladeTable::defaultColumnCanBeHidden(false);
The searchable
boolean is a shortcut to the searchInput
method. The example above will essentially call $table->searchInput('name', 'User Name')
.
Sometimes, you want to transform the value in the table without using a custom column cell. You may do this by providing a callback to the as
argument. The callback takes two arguments: the original value and the item itself (typically the Eloquent Model).
$table->column(
key: 'email',
as: fn ($email, $user) => Str::mask($email)
);
You may change the alignment of the column by setting it the left
(default), center
, or right
.
$table->column(
key: 'actions',
alignment: 'right'
);
You may configure the default sorting with the defaultSort()
method:
$table->defaultSort('name');
If you want to sort in descending order, you may prefix the key with a -
character or use the defaultSortDesc
method. Alternatively, you may use the defaultSort
method with an additional second argument:
$table->defaultSort('-name');
$table->defaultSortDesc('name');
$table->defaultSort('name', 'desc');
The Table component supports sorting the results by a Relationship column. This requires the installation of the kirschbaum-development/eloquent-power-joins
package.
$table->column(
key: 'user.organization.name',
label: 'Organization',
sortable: true
);
You may enable Global Search with the withGlobalSearch
method, and optionally specify a placeholder.
$table->withGlobalSearch(columns: ['name', 'email']);
$table->withGlobalSearch('Search through the data...', ['name', 'email']);
<?php
namespace App\Tables;
use App\Models\User;
use ProtoneMedia\Splade\AbstractTable;
use ProtoneMedia\Splade\SpladeTable;
class Users extends AbstractTable
{
public function for()
{
return User::query();
}
public function configure(SpladeTable $table)
{
$table
->withGlobalSearch(columns: ['name', 'email'])
->defaultSort('name')
->column(key: 'name', searchable: true, sortable: true, canBeHidden: false)
->column(key: 'email', searchable: true, sortable: true)
->column(key: 'language_code', label: 'Language')
->column(label: 'Actions')
->selectFilter(key: 'language_code', label: 'Language', options: [
'en' => 'English',
'nl' => 'Dutch',
])
->paginate(15);
}
}
When using auto-fill, you may want to transform the presented data for a specific column while leaving the other columns untouched. For this, you may use a cell
component. This example is taken from the Example Table above.
<x-splade-table :for="$users">
<x-splade-cell actions>
<Link href="/users/{{ $item->id }}/edit"> Edit </Link>
</x-splade-cell>
</x-splade-table>
If you want to change the $item
variable, you may use use the as
attribute on the component:
<x-splade-cell actions as="$user">
<Link href="/users/{{ $user->id }}/edit"> Edit </Link>
</x-splade-cell>
This is a scoped component, so variables outside the slot won't be available by default. If you still want to use a variable, you may use the use
attribute:
@php $message = 'Hello, world!'; @endphp
<x-splade-cell actions as="$user" use="$message">
<p> {{ $message }} </p>
<Link href="/users/{{ $user->id }}/edit"> Edit </Link>
</x-splade-cell>
When your template uses multiple custom cells, you may set these variables as defaults on the parent table:
<x-splade-table :for="$users" as="$user">
<x-splade-cell name>
<p class="text-red-500"> {{ $user->name }}</p>
</x-splade-cell>
<x-splade-cell actions>
<Link modal href="/users/{{ $user->id }}/edit"> Edit </Link>
</x-splade-cell>
</x-splade-table>
Note the modal
attribute on the Link element in the example above. Instead of navigating to another page, you may open a Modal or Slideover from a Table.
You may use the rowLink
method to make one entire row clickable.
$table->rowLink(fn (User $user) => route('users.edit', ['id' => $user->id]))
If you want to open the URL in a Modal or Slideover, you may use the rowModal
or rowSlideover
method.
The filter and select elements have a default debounce time of 350ms. You may customize this:
<x-splade-table :for="$users" search-debounce="500" />
You may also set it globally using the static defaultSearchDebounce
method, for example, in the AppServiceProvider
class:
SpladeTable::defaultSearchDebounce(750);
You may use the striped
attribute to add a striped layout to the table.
<x-splade-table :for="$users" striped />
By default, a Reset-button is rendered when the table is filtered, sorted, or searched. You may disable this button by setting the reset-button
attribute to false
:
<x-splade-table :for="$users" :reset-button="false" />
You may also disable it globally using the static defaultResetButton
method, for example, in the AppServiceProvider
class:
SpladeTable::defaultResetButton(false);