Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions .cursor/rules/laravel-boost.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
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.

- php - 8.4.15
- filament/filament (FILAMENT) - v3
- filament/filament (FILAMENT) - v4
- inertiajs/inertia-laravel (INERTIA) - v2
- laravel/framework (LARAVEL) - v12
- laravel/nightwatch (NIGHTWATCH) - v1
Expand Down Expand Up @@ -648,13 +648,19 @@ Forms\Components\Select::make('user_id')
</code-snippet>


## Version 3 Changes To Focus On
- Resources are located in `app/Filament/Resources/` directory.
- Resource pages (List, Create, Edit) are auto-generated within the resource's directory - e.g., `app/Filament/Resources/PostResource/Pages/`.
- Forms use the `Forms\Components` namespace for form fields.
- Tables use the `Tables\Columns` namespace for table columns.
- A new `Filament\Forms\Components\RichEditor` component is available.
- Form and table schemas now use fluent method chaining.
- Added `php artisan filament:optimize` command for production optimization.
- Requires implementing `FilamentUser` contract for production access control.
### Important Version 4 Changes
- File visibility is now `private` by default.
- 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.
- The `Grid`, `Section`, and `Fieldset` layout components no longer span all columns by default.
- The `all` pagination page method is not available for tables by default.
- All action classes extend `Filament\Actions\Action`. No action classes exist in `Filament\Tables\Actions`.
- The `Form` & `Infolist` layout components have been moved to `Filament\Schemas\Components`, for example `Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc.
- A new `Repeater` component for Forms has been added.
- Icons now use the `Filament\Support\Icons\Heroicon` Enum by default. Other options are available and documented.

### Organize Component Classes Structure
- Schema components: `Schemas/Components/`
- Table columns: `Tables/Columns/`
- Table filters: `Tables/Filters/`
- Actions: `Actions/`
</laravel-boost-guidelines>
3 changes: 1 addition & 2 deletions app/Filament/Pages/Auth/Login.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
namespace App\Filament\Pages\Auth;

use App\Enums\Environment;
use Filament\Pages\Auth\Login as BasePage;

class Login extends BasePage
class Login extends \Filament\Auth\Pages\Login
{
public function mount(): void
{
Expand Down
118 changes: 0 additions & 118 deletions app/Filament/Resources/UserResource.php

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace App\Filament\Resources\UserResource\Pages;
namespace App\Filament\Resources\Users\Pages;

use App\Filament\Resources\UserResource;
use App\Filament\Resources\Users\UserResource;
use Filament\Resources\Pages\CreateRecord;

class CreateUser extends CreateRecord
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?php

namespace App\Filament\Resources\UserResource\Pages;
namespace App\Filament\Resources\Users\Pages;

use App\Filament\Resources\UserResource;
use Filament\Actions;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;

class EditUser extends EditRecord
Expand All @@ -13,7 +13,7 @@ class EditUser extends EditRecord
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
DeleteAction::make(),
];
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?php

namespace App\Filament\Resources\UserResource\Pages;
namespace App\Filament\Resources\Users\Pages;

use App\Filament\Resources\UserResource;
use Filament\Actions;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;

class ListUsers extends ListRecords
Expand All @@ -13,7 +13,7 @@ class ListUsers extends ListRecords
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
CreateAction::make(),
];
}
}
47 changes: 47 additions & 0 deletions app/Filament/Resources/Users/Schemas/UserForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace App\Filament\Resources\Users\Schemas;

use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;

class UserForm
{
public static function configure(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('first_name')
->autofocus()
->required()
->maxLength(255),

TextInput::make('last_name')
->required()
->maxLength(255),

TextInput::make('email')
->required()
->email()
->maxLength(255),

TextInput::make('password')
->required(fn (string $operation): bool => $operation === 'create')
->password()
->afterStateHydrated(function (TextInput $component, $state) {
$component->state('');
})
->dehydrated(fn (?string $state): bool => filled($state))
->maxLength(255),

DateTimePicker::make('email_verified_at'),

Select::make('roles')
->preload()
->multiple()
->relationship('roles', 'name'),
]);
}
}
56 changes: 56 additions & 0 deletions app/Filament/Resources/Users/Tables/UsersTable.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace App\Filament\Resources\Users\Tables;

use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;

class UsersTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->getStateUsing(fn ($record) => $record->fullName)
->searchable()
->sortable(),

TextColumn::make('email')
->searchable()
->sortable(),

IconColumn::make('email_verified')
->getStateUsing(fn ($record) => $record->email_verified_at)
->boolean()
->sortable(),

TextColumn::make('roles')
->getStateUsing(fn ($record) => $record->roles->pluck('name')->join(', '))
->searchable()
->sortable(),

TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),

TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}
41 changes: 41 additions & 0 deletions app/Filament/Resources/Users/UserResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace App\Filament\Resources\Users;

use App\Filament\Resources\Users\Pages\CreateUser;
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Filament\Resources\Users\Schemas\UserForm;
use App\Filament\Resources\Users\Tables\UsersTable;
use App\Models\User;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Table;

class UserResource extends Resource
{
protected static ?string $model = User::class;

protected static string|\BackedEnum|null $navigationIcon = 'heroicon-o-users';

protected static ?string $recordTitleAttribute = 'full_name';

public static function form(Schema $schema): Schema
{
return UserForm::configure($schema);
}

public static function table(Table $table): Table
{
return UsersTable::configure($table);
}

public static function getPages(): array
{
return [
'index' => ListUsers::route('/'),
'create' => CreateUser::route('/create'),
'edit' => EditUser::route('/{record}/edit'),
];
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/RegisterController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
use App\Enums\Role;
use App\Http\Requests\Register\RegisterStoreRequest;
use App\Models\User;
use Filament\Events\Auth\Registered;
use Filament\Auth\Events\Registered;

class RegisterController extends Controller
{
Expand Down
3 changes: 0 additions & 3 deletions app/Models/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,6 @@ public function canAccessPanel(?Panel $panel = null): bool
return $this->hasRole([Role::SUPER_ADMIN, Role::ADMIN]);
}

/**
* @codeCoverageIgnore
*/
public function getFilamentName(): string
{
return $this->fullName;
Expand Down
4 changes: 3 additions & 1 deletion app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ public function boot(): void
Vite::useAggressivePrefetching();

Table::configureUsing(function (Table $table): void {
$table->defaultPaginationPageOption(50);
$table
->defaultPaginationPageOption(50)
->paginationPageOptions([5, 10, 25, 50, 'all']);
});

Health::checks([
Expand Down
Loading