Skip to content

Commit 09b4e50

Browse files
authored
DataTables feature (#29)
1 parent 5e153fc commit 09b4e50

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+4982
-1417
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use App\Models\User;
6+
use ProtoneMedia\Splade\SpladeTable;
7+
8+
class TableController
9+
{
10+
public function custom()
11+
{
12+
$users = User::query()->orderBy('name')->paginate(10);
13+
14+
return view('table.custom', [
15+
'users' => SpladeTable::for($users)
16+
->column('name')
17+
->column('email')
18+
->column('actions'),
19+
]);
20+
}
21+
22+
public function rowLink()
23+
{
24+
$users = User::query()->orderBy('name')->paginate(10);
25+
26+
return view('table.users', [
27+
'users' => SpladeTable::for($users)
28+
->defaultSort('name')
29+
->rowLink(fn (User $user) => route('navigation.one', ['id' => $user->id]))
30+
->column('name')
31+
->column('email')
32+
->column('actions'),
33+
]);
34+
}
35+
}

app/app/Http/UserTableView.php

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace App\Http;
4+
5+
use App\Models\User;
6+
use Illuminate\Support\Collection;
7+
use ProtoneMedia\Splade\SpladeTable;
8+
use Spatie\QueryBuilder\AllowedFilter;
9+
use Spatie\QueryBuilder\QueryBuilder;
10+
11+
class UserTableView
12+
{
13+
public function __invoke($paginateMethod)
14+
{
15+
$globalSearch = AllowedFilter::callback('global', function ($query, $value) {
16+
$query->where(function ($query) use ($value) {
17+
Collection::wrap($value)->each(function ($value) use ($query) {
18+
$query
19+
->orWhere('name', 'LIKE', "%{$value}%")
20+
->orWhere('email', 'LIKE', "%{$value}%");
21+
});
22+
});
23+
});
24+
25+
$users = QueryBuilder::for(User::query())
26+
->defaultSort('name')
27+
->allowedSorts(['name', 'email', 'language_code'])
28+
->allowedFilters(['name', 'email', 'language_code', $globalSearch])
29+
->{$paginateMethod}(request()->query('perPage', 10))
30+
->withQueryString();
31+
32+
return view('table.users', [
33+
'users' => SpladeTable::for($users)
34+
->withGlobalSearch()
35+
->defaultSort('name')
36+
->column(key: 'name', searchable: true, sortable: true, canBeHidden: false)
37+
->column(key: 'email', searchable: true, sortable: true)
38+
->column(key: 'language_code', label: 'Language')
39+
->column(label: 'Actions')
40+
->selectFilter(key: 'language_code', options: [
41+
'en' => 'English',
42+
'nl' => 'Dutch',
43+
], label: 'Language'),
44+
]);
45+
}
46+
}

app/composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"laravel/framework": "^9.19",
1515
"laravel/sanctum": "^2.14.1",
1616
"laravel/tinker": "^2.7",
17-
"pusher/pusher-php-server": "^7.0"
17+
"pusher/pusher-php-server": "^7.0",
18+
"spatie/laravel-query-builder": "^5.0"
1819
},
1920
"require-dev": {
2021
"fakerphp/faker": "^1.9.1",

app/database/factories/UserFactory.php

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public function definition()
2323
'email_verified_at' => now(),
2424
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
2525
'remember_token' => Str::random(10),
26+
'language_code' => fake()->randomElement(['en', 'nl']),
2627
];
2728
}
2829

app/database/migrations/2014_10_12_000000_create_users_table.php

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public function up()
1919
$table->string('email')->unique();
2020
$table->timestamp('email_verified_at')->nullable();
2121
$table->string('password');
22+
$table->string('language_code');
2223
$table->rememberToken();
2324
$table->timestamps();
2425
});

app/database/seeders/DatabaseSeeder.php

+2
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,7 @@ public function run()
1717
'name' => 'Test User',
1818
'email' => '[email protected]',
1919
]);
20+
21+
\App\Models\User::factory()->count(99)->create();
2022
}
2123
}

0 commit comments

Comments
 (0)