diff --git a/src/app/Filament/Resources/PermissionResource.php b/src/app/Filament/Resources/PermissionResource.php new file mode 100644 index 0000000..046da5c --- /dev/null +++ b/src/app/Filament/Resources/PermissionResource.php @@ -0,0 +1,96 @@ +schema([ + Forms\Components\Section::make('Permission Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->unique(ignoreRecord: true) + ->maxLength(255) + ->helperText('Use format: resource.action (e.g., users.create, posts.edit)'), + Forms\Components\Select::make('guard_name') + ->options([ + 'web' => 'Web', + 'api' => 'API', + ]) + ->default('web') + ->required(), + ])->columns(2), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->badge() + ->color('info') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('guard_name') + ->badge() + ->color('gray'), + Tables\Columns\TextColumn::make('roles_count') + ->counts('roles') + ->label('Roles') + ->badge() + ->color('success'), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListPermissions::route('/'), + 'create' => Pages\CreatePermission::route('/create'), + 'edit' => Pages\EditPermission::route('/{record}/edit'), + ]; + } +} diff --git a/src/app/Filament/Resources/PermissionResource/Pages/CreatePermission.php b/src/app/Filament/Resources/PermissionResource/Pages/CreatePermission.php new file mode 100644 index 0000000..4db7945 --- /dev/null +++ b/src/app/Filament/Resources/PermissionResource/Pages/CreatePermission.php @@ -0,0 +1,11 @@ +schema([ + Forms\Components\Section::make('Role Details') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->unique(ignoreRecord: true) + ->maxLength(255), + Forms\Components\Select::make('guard_name') + ->options([ + 'web' => 'Web', + 'api' => 'API', + ]) + ->default('web') + ->required(), + ])->columns(2), + + Forms\Components\Section::make('Permissions') + ->schema([ + Forms\Components\CheckboxList::make('permissions') + ->relationship('permissions', 'name') + ->columns(3) + ->helperText('Select permissions for this role'), + ]), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('name') + ->badge() + ->color(fn (string $state): string => match ($state) { + 'admin' => 'danger', + 'editor' => 'warning', + default => 'success', + }) + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('guard_name') + ->badge() + ->color('gray'), + Tables\Columns\TextColumn::make('permissions_count') + ->counts('permissions') + ->label('Permissions') + ->badge() + ->color('info'), + Tables\Columns\TextColumn::make('users_count') + ->counts('users') + ->label('Users') + ->badge() + ->color('success'), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + Tables\Actions\DeleteAction::make() + ->before(function (Role $record) { + if ($record->name === 'admin') { + throw new \Exception('Cannot delete the admin role.'); + } + }), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListRoles::route('/'), + 'create' => Pages\CreateRole::route('/create'), + 'edit' => Pages\EditRole::route('/{record}/edit'), + ]; + } +} diff --git a/src/app/Filament/Resources/RoleResource/Pages/CreateRole.php b/src/app/Filament/Resources/RoleResource/Pages/CreateRole.php new file mode 100644 index 0000000..0891e26 --- /dev/null +++ b/src/app/Filament/Resources/RoleResource/Pages/CreateRole.php @@ -0,0 +1,11 @@ +schema([ - Forms\Components\TextInput::make('name') - ->required() - ->maxLength(255), - Forms\Components\TextInput::make('email') - ->email() - ->required() - ->maxLength(255), - Forms\Components\DateTimePicker::make('email_verified_at'), - Forms\Components\TextInput::make('password') - ->password() - ->required() - ->maxLength(255), + Forms\Components\Section::make('User Information') + ->schema([ + Forms\Components\TextInput::make('name') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('email') + ->email() + ->required() + ->unique(ignoreRecord: true) + ->maxLength(255), + Forms\Components\DateTimePicker::make('email_verified_at') + ->label('Email Verified At'), + ])->columns(2), + + Forms\Components\Section::make('Password') + ->schema([ + Forms\Components\TextInput::make('password') + ->password() + ->dehydrateStateUsing(fn ($state) => Hash::make($state)) + ->dehydrated(fn ($state) => filled($state)) + ->required(fn (string $context): bool => $context === 'create') + ->maxLength(255) + ->confirmed(), + Forms\Components\TextInput::make('password_confirmation') + ->password() + ->maxLength(255) + ->dehydrated(false), + ])->columns(2), + + Forms\Components\Section::make('Roles') + ->schema([ + Forms\Components\CheckboxList::make('roles') + ->relationship('roles', 'name') + ->columns(3) + ->helperText('Assign roles to this user'), + ]), ]); } @@ -43,26 +70,34 @@ public static function table(Table $table): Table return $table ->columns([ Tables\Columns\TextColumn::make('name') - ->searchable(), - Tables\Columns\TextColumn::make('email') - ->searchable(), - Tables\Columns\TextColumn::make('email_verified_at') - ->dateTime() + ->searchable() ->sortable(), + Tables\Columns\TextColumn::make('email') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('roles.name') + ->badge() + ->color('success') + ->separator(','), + Tables\Columns\IconColumn::make('email_verified_at') + ->label('Verified') + ->boolean() + ->trueIcon('heroicon-o-check-circle') + ->falseIcon('heroicon-o-x-circle'), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), - Tables\Columns\TextColumn::make('updated_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ - // + Tables\Filters\SelectFilter::make('roles') + ->relationship('roles', 'name') + ->multiple() + ->preload(), ]) ->actions([ Tables\Actions\EditAction::make(), + Tables\Actions\DeleteAction::make(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([