Skip to content

Commit fc86028

Browse files
authored
Filament v4 (#113)
* Run upgrade script * Use v4 directory structure * Remove upgrade script * Update laravel-boost.mdc * Move form and table back into methods * Use new form and table files * Add "All" table pagination option * Update User.php
1 parent c6164f0 commit fc86028

37 files changed

+1051
-458
lines changed

.cursor/rules/laravel-boost.mdc

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
1212
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.
1313

1414
- php - 8.4.15
15-
- filament/filament (FILAMENT) - v3
15+
- filament/filament (FILAMENT) - v4
1616
- inertiajs/inertia-laravel (INERTIA) - v2
1717
- laravel/framework (LARAVEL) - v12
1818
- laravel/nightwatch (NIGHTWATCH) - v1
@@ -648,13 +648,19 @@ Forms\Components\Select::make('user_id')
648648
</code-snippet>
649649

650650

651-
## Version 3 Changes To Focus On
652-
- Resources are located in `app/Filament/Resources/` directory.
653-
- Resource pages (List, Create, Edit) are auto-generated within the resource's directory - e.g., `app/Filament/Resources/PostResource/Pages/`.
654-
- Forms use the `Forms\Components` namespace for form fields.
655-
- Tables use the `Tables\Columns` namespace for table columns.
656-
- A new `Filament\Forms\Components\RichEditor` component is available.
657-
- Form and table schemas now use fluent method chaining.
658-
- Added `php artisan filament:optimize` command for production optimization.
659-
- Requires implementing `FilamentUser` contract for production access control.
651+
### Important Version 4 Changes
652+
- File visibility is now `private` by default.
653+
- The `deferFilters` method from Filament v3 is now the default behavior in Filament v4, so users must click a button before the filters are applied to the table. To disable this behavior, you can use the `deferFilters(false)` method.
654+
- The `Grid`, `Section`, and `Fieldset` layout components no longer span all columns by default.
655+
- The `all` pagination page method is not available for tables by default.
656+
- All action classes extend `Filament\Actions\Action`. No action classes exist in `Filament\Tables\Actions`.
657+
- The `Form` & `Infolist` layout components have been moved to `Filament\Schemas\Components`, for example `Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc.
658+
- A new `Repeater` component for Forms has been added.
659+
- Icons now use the `Filament\Support\Icons\Heroicon` Enum by default. Other options are available and documented.
660+
661+
### Organize Component Classes Structure
662+
- Schema components: `Schemas/Components/`
663+
- Table columns: `Tables/Columns/`
664+
- Table filters: `Tables/Filters/`
665+
- Actions: `Actions/`
660666
</laravel-boost-guidelines>

app/Filament/Pages/Auth/Login.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
namespace App\Filament\Pages\Auth;
44

55
use App\Enums\Environment;
6-
use Filament\Pages\Auth\Login as BasePage;
76

8-
class Login extends BasePage
7+
class Login extends \Filament\Auth\Pages\Login
98
{
109
public function mount(): void
1110
{

app/Filament/Resources/UserResource.php

Lines changed: 0 additions & 118 deletions
This file was deleted.

app/Filament/Resources/UserResource/Pages/CreateUser.php renamed to app/Filament/Resources/Users/Pages/CreateUser.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
namespace App\Filament\Resources\UserResource\Pages;
3+
namespace App\Filament\Resources\Users\Pages;
44

5-
use App\Filament\Resources\UserResource;
5+
use App\Filament\Resources\Users\UserResource;
66
use Filament\Resources\Pages\CreateRecord;
77

88
class CreateUser extends CreateRecord
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?php
22

3-
namespace App\Filament\Resources\UserResource\Pages;
3+
namespace App\Filament\Resources\Users\Pages;
44

5-
use App\Filament\Resources\UserResource;
6-
use Filament\Actions;
5+
use App\Filament\Resources\Users\UserResource;
6+
use Filament\Actions\DeleteAction;
77
use Filament\Resources\Pages\EditRecord;
88

99
class EditUser extends EditRecord
@@ -13,7 +13,7 @@ class EditUser extends EditRecord
1313
protected function getHeaderActions(): array
1414
{
1515
return [
16-
Actions\DeleteAction::make(),
16+
DeleteAction::make(),
1717
];
1818
}
1919
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?php
22

3-
namespace App\Filament\Resources\UserResource\Pages;
3+
namespace App\Filament\Resources\Users\Pages;
44

5-
use App\Filament\Resources\UserResource;
6-
use Filament\Actions;
5+
use App\Filament\Resources\Users\UserResource;
6+
use Filament\Actions\CreateAction;
77
use Filament\Resources\Pages\ListRecords;
88

99
class ListUsers extends ListRecords
@@ -13,7 +13,7 @@ class ListUsers extends ListRecords
1313
protected function getHeaderActions(): array
1414
{
1515
return [
16-
Actions\CreateAction::make(),
16+
CreateAction::make(),
1717
];
1818
}
1919
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\Users\Schemas;
4+
5+
use Filament\Forms\Components\DateTimePicker;
6+
use Filament\Forms\Components\Select;
7+
use Filament\Forms\Components\TextInput;
8+
use Filament\Schemas\Schema;
9+
10+
class UserForm
11+
{
12+
public static function configure(Schema $schema): Schema
13+
{
14+
return $schema
15+
->components([
16+
TextInput::make('first_name')
17+
->autofocus()
18+
->required()
19+
->maxLength(255),
20+
21+
TextInput::make('last_name')
22+
->required()
23+
->maxLength(255),
24+
25+
TextInput::make('email')
26+
->required()
27+
->email()
28+
->maxLength(255),
29+
30+
TextInput::make('password')
31+
->required(fn (string $operation): bool => $operation === 'create')
32+
->password()
33+
->afterStateHydrated(function (TextInput $component, $state) {
34+
$component->state('');
35+
})
36+
->dehydrated(fn (?string $state): bool => filled($state))
37+
->maxLength(255),
38+
39+
DateTimePicker::make('email_verified_at'),
40+
41+
Select::make('roles')
42+
->preload()
43+
->multiple()
44+
->relationship('roles', 'name'),
45+
]);
46+
}
47+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\Users\Tables;
4+
5+
use Filament\Actions\BulkActionGroup;
6+
use Filament\Actions\DeleteBulkAction;
7+
use Filament\Actions\EditAction;
8+
use Filament\Tables\Columns\IconColumn;
9+
use Filament\Tables\Columns\TextColumn;
10+
use Filament\Tables\Table;
11+
12+
class UsersTable
13+
{
14+
public static function configure(Table $table): Table
15+
{
16+
return $table
17+
->columns([
18+
TextColumn::make('name')
19+
->getStateUsing(fn ($record) => $record->fullName)
20+
->searchable()
21+
->sortable(),
22+
23+
TextColumn::make('email')
24+
->searchable()
25+
->sortable(),
26+
27+
IconColumn::make('email_verified')
28+
->getStateUsing(fn ($record) => $record->email_verified_at)
29+
->boolean()
30+
->sortable(),
31+
32+
TextColumn::make('roles')
33+
->getStateUsing(fn ($record) => $record->roles->pluck('name')->join(', '))
34+
->searchable()
35+
->sortable(),
36+
37+
TextColumn::make('created_at')
38+
->dateTime()
39+
->sortable()
40+
->toggleable(isToggledHiddenByDefault: true),
41+
42+
TextColumn::make('updated_at')
43+
->dateTime()
44+
->sortable()
45+
->toggleable(isToggledHiddenByDefault: true),
46+
])
47+
->recordActions([
48+
EditAction::make(),
49+
])
50+
->toolbarActions([
51+
BulkActionGroup::make([
52+
DeleteBulkAction::make(),
53+
]),
54+
]);
55+
}
56+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\Users;
4+
5+
use App\Filament\Resources\Users\Pages\CreateUser;
6+
use App\Filament\Resources\Users\Pages\EditUser;
7+
use App\Filament\Resources\Users\Pages\ListUsers;
8+
use App\Filament\Resources\Users\Schemas\UserForm;
9+
use App\Filament\Resources\Users\Tables\UsersTable;
10+
use App\Models\User;
11+
use Filament\Resources\Resource;
12+
use Filament\Schemas\Schema;
13+
use Filament\Tables\Table;
14+
15+
class UserResource extends Resource
16+
{
17+
protected static ?string $model = User::class;
18+
19+
protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-users';
20+
21+
protected static ?string $recordTitleAttribute = 'full_name';
22+
23+
public static function form(Schema $schema): Schema
24+
{
25+
return UserForm::configure($schema);
26+
}
27+
28+
public static function table(Table $table): Table
29+
{
30+
return UsersTable::configure($table);
31+
}
32+
33+
public static function getPages(): array
34+
{
35+
return [
36+
'index' => ListUsers::route('/'),
37+
'create' => CreateUser::route('/create'),
38+
'edit' => EditUser::route('/{record}/edit'),
39+
];
40+
}
41+
}

app/Http/Controllers/RegisterController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use App\Enums\Role;
77
use App\Http\Requests\Register\RegisterStoreRequest;
88
use App\Models\User;
9-
use Filament\Events\Auth\Registered;
9+
use Filament\Auth\Events\Registered;
1010

1111
class RegisterController extends Controller
1212
{

0 commit comments

Comments
 (0)