tonegabes / filament-better-options
Filament form components for better radio and checkbox options.
Installs: 94
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 0
Forks: 0
Open Issues: 0
Language:Blade
pkg:composer/tonegabes/filament-better-options
Requires
- php: ^8.3
- filament/forms: ^4.0
- spatie/laravel-package-tools: ^1.15.0
- tonegabes/filament-phosphor-icons: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.86
- larastan/larastan: ^3.0
- laravel/pint: ^1.0
- phpstan/phpstan-deprecation-rules: ^2.0
README
Enhanced form components for Filament Forms with modern interface, advanced features, and excellent performance. Provides CheckboxList
, CheckboxCards
, RadioList
, and RadioCards
with icons, visual indicators, descriptions, extra texts, search functionality, and bulk operations.
Features
✨ Enhanced UI Components
- Modern card-based and list layouts
- Extensible icon system using Filament icons aliases
- Flexible icon positioning (before/after)
- Support for descriptions and extra texts
- Pre-defined themes (minimal, modern, classic)
Advanced Features
- Real-time search with debounced input
- Bulk select/deselect operations for checkboxes
- Configurable positioning and visibility
- Performance-optimized JavaScript
🎨 Extensible Architecture
- Tailwind CSS styling with dark mode support
- Configurable default positions and icons via config file
- Full accessibility support
Performance & Caching
- Intelligent icon caching system
- Efficient DOM operations and caching
- Alpine.js components loaded on demand
- Minimal JavaScript footprint
Requirements
- PHP 8.3+
- Laravel 11.0+
- Filament 4.0+
Installation
Install the package via Composer:
composer require tonegabes/filament-better-options
Optionally, publish the configuration file for positioning settings:
php artisan vendor:publish --tag="better-options-config"
Optionally, publish the assets for customization:
php artisan vendor:publish --tag="better-options-assets"
Configuration
The published configuration file (config/better-options.php
) provides customization positioning options:
return [ 'components' => [ 'checkbox' => [ 'list' => [ 'icon_position' => 'after', 'indicator_position' => 'before', ], 'cards' => [ 'icon_position' => 'before', 'indicator_position' => 'after', ], ], 'radio' => [ 'list' => [ 'icon_position' => 'after', 'indicator_position' => 'before', ], 'cards' => [ 'icon_position' => 'before', 'indicator_position' => 'after', ], ], ], ];
Usage
Basic Examples
use ToneGabes\BetterOptions\Forms\Components\CheckboxCards; use ToneGabes\Filament\Icons\Enums\Phosphor; // Checkbox Cards with default features CheckboxCards::make('permissions') ->label('Permissions') ->columns(2) ->options([ 'view' => 'View', 'edit' => 'Edit', 'delete' => 'Delete', 'create' => 'Create', ]) ->descriptions([ 'view' => 'Allows viewing the model.', 'edit' => 'Allows editing the model.', 'delete' => 'Allows deleting the model.', 'create' => 'Allows creating a new model.', ]) ->icons([ 'view' => Phosphor::Eye->thin(), 'edit' => Phosphor::Pencil->thin(), 'delete' => Phosphor::Trash->thin(), 'create' => Phosphor::Plus->thin(), ]) ,
use ToneGabes\BetterOptions\Forms\Components\CheckboxList; use ToneGabes\Filament\Icons\Enums\Phosphor; // Checkbox List with default features CheckboxList::make('permissions') ->label('Permissions') ->options([ 'view' => 'View', 'edit' => 'Edit', 'delete' => 'Delete', 'create' => 'Create', ]) ->descriptions([ 'view' => 'Allows viewing the model.', 'edit' => 'Allows editing the model.', 'delete' => 'Allows deleting the model.', 'create' => 'Allows creating a new model.', ]) ->icons([ 'view' => Phosphor::Eye->thin(), 'edit' => Phosphor::Pencil->thin(), 'delete' => Phosphor::Trash->thin(), 'create' => Phosphor::Plus->thin(), ]) ,
use ToneGabes\BetterOptions\Forms\Components\RadioCards; use ToneGabes\Filament\Icons\Enums\Phosphor; // Radio Cards with default features RadioCards::make('role') ->label('Role') ->columns(2) ->options([ 'manager' => 'Manager', 'editor' => 'Editor', 'viewer' => 'Viewer', 'creator' => 'Creator', ]) ->descriptions([ 'manager' => 'Allows managing the model.', 'editor' => 'Allows editing the model.', 'viewer' => 'Allows viewing the model.', 'creator' => 'Allows creating a new model.', ]) ->icons([ 'manager' => Phosphor::Gear->thin(), 'editor' => Phosphor::Pencil->thin(), 'viewer' => Phosphor::Eye->thin(), 'creator' => Phosphor::Plus->thin(), ]) ,
use ToneGabes\BetterOptions\Forms\Components\RadioList; use ToneGabes\Filament\Icons\Enums\Phosphor; // Radio List with default features RadioList::make('role') ->label('Role') ->options([ 'manager' => 'Manager', 'editor' => 'Editor', 'viewer' => 'Viewer', 'creator' => 'Creator', ]) ->descriptions([ 'manager' => 'Allows managing the model.', 'editor' => 'Allows editing the model.', 'viewer' => 'Allows viewing the model.', 'creator' => 'Allows creating a new model.', ]) ->icons([ 'manager' => Phosphor::Gear->thin(), 'editor' => Phosphor::Pencil->thin(), 'viewer' => Phosphor::Eye->thin(), 'creator' => Phosphor::Plus->thin(), ]) ,
Using Enums
This package provides a convenient way to use PHP enums for defining options, descriptions, and icons. Here's how you can leverage enums in your component definitions:
use Filament\Support\Contracts\HasDescription; use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasLabel; use ToneGabes\BetterOptions\Contracts\HasExtraText; use ToneGabes\Filament\Icons\Enums\Phosphor; enum Roles: string implements HasDescription, HasExtraText, HasIcon, HasLabel { case Manager = 'manager'; case Editor = 'editor'; case Viewer = 'viewer'; case Creator = 'creator'; public function getDescription(): string { return match($this) { self::Manager => 'Allows managing the model.', self::Editor => 'Allows editing the model.', self::Viewer => 'Allows viewing the model.', self::Creator => 'Allows creating a new model.', }; } public function getExtraText(): string { return match($this) { self::Manager => 'model.manager', self::Editor => 'model.editor', self::Viewer => 'model.viewer', self::Creator => 'model.creator', }; } public function getIcon(): string { return match($this) { self::Manager => Phosphor::Gear->thin(), self::Editor => Phosphor::Pencil->thin(), self::Viewer => Phosphor::Eye->thin(), self::Creator => Phosphor::Plus->thin(), }; } public function getLabel(): string { return match($this) { self::Manager => 'Manager', self::Editor => 'Editor', self::Viewer => 'Viewer', self::Creator => 'Creator', }; } }
Passing a Backend Enum automatically maps the enum cases to the component options, descriptions, icons, and extra texts.
RadioList::make('role') ->label('Role') ->enum(Roles::cases()) // No need to specify these if enum is using filament enum contracts // ->descriptions() // ->icons() // ->extraTexts() ,
You can hide the descriptions, icons, and extra texts if you don't need them.
RadioList::make('role') ->enum(Roles::class) ->hiddenDescriptions() ->hiddenIcons() ->hiddenExtraTexts() , // Accepts Closures RadioList::make('role') ->enum(Roles::class) ->hiddenDescription(fn () => false) ->hiddenIcon(fn () => false) ->hiddenExtraText(fn () => false) ,
Advanced Features
Search and Bulk Operations
CheckboxList::make('permissions') ->label('Permissions') ->enum(Permissions::class) ->searchable() ->searchPrompt('Search permissions...') ->bulkToggleable() ,
Custom Positioning and Visibility
RadioCards::make('role') ->label('Role') ->columns(2) ->enum(Roles::class) ->partiallyHiddenIndicator() ->itemsCenter() ->iconAfter() ->indicatorBefore() // ->hiddenIndicator() // You also can totaly hide the indicator ,
Icons and Indicators
RadioList::make('role') ->label('Role') ->enum(Roles::class) ->idleIndicator(Phosphor::User->thin()) ->selectedIndicator(Phosphor::User->fill()) ,
Extra Texts/Values
CheckboxCards::make('permissions') ->label('Permissions') ->columns(2) ->enum(Permissions::class) ->extraTexts([ 'view' => 'model.view', 'edit' => 'model.edit', 'delete' => 'model.delete', 'create' => 'model.create', ]) ,
RadioCard::make('storage') ->enum(Storages::class) ->hiddenIcon() ->partiallyHiddenIndicator() ->idleIndicator(Phosphor::HardDrives->thin()) ->selectedIndicator(Phosphor::HardDrives->fill())
Pre-defined Themes
// Modern Theme - Icons before, indicators after, centered CheckboxCards::make('options') ->options($options) ->theme('modern'); // Minimal Theme - Subtle indicators CheckboxCards::make('options') ->options($options) ->theme('minimal'); // Classic Theme - Traditional layout CheckboxCards::make('options') ->options($options) ->theme('classic');
Available Components
Component | Description | Features |
---|---|---|
CheckboxList |
Vertical list of checkboxes | Search, Bulk toggle, Icons |
CheckboxCards |
Grid of checkbox cards | All list features + Columns, Centering |
RadioList |
Vertical list of radio buttons | Icons, Custom indicators |
RadioCards |
Grid of radio button cards | All list features + Columns, Centering |
Component Methods
Common Methods (All Components)
// Content ->options(array $options) ->descriptions(array $descriptions) ->extraTexts(array $extraTexts) ->hiddenDescription(bool|Closure $condition = true) ->hiddenExtraText(bool|Closure $condition = true) // Icons and Indicators ->icons(array $icons) ->iconBefore() ->iconAfter() ->hiddenIcon(bool|Closure $condition = true) ->idleIndicator(string $icon) ->selectedIndicator(string $icon) ->indicatorBefore() ->indicatorAfter() ->hiddenIndicator(bool|Closure $condition = true) ->partiallyHiddenIndicator(bool|Closure $condition = true)
Checkbox-Specific Methods
// Search functionality ->searchable(bool $condition = true) ->searchPrompt(string $prompt) // Bulk operations ->bulkToggleable(bool $condition = true) ->selectAllAction(Action $action) ->deselectAllAction(Action $action)
Card-Specific Methods
// Layout ->columns(int|array $columns) ->itemsCenter(bool|Closure $condition = true)
Styling and Themes
The package uses Tailwind CSS classes and supports Filament's theming system. Main CSS classes:
/* Component containers */ .fi-fo-checkbox-list .fi-fo-checkbox-card .fi-fo-radio-list /* Individual options */ .fi-fo-checkbox-option .fi-fo-radio-item /* Content elements */ .fi-fo-checkbox-option__label .fi-fo-checkbox-option__description .fi-fo-checkbox-option__extra .fi-fo-checkbox-option__icon .fi-fo-checkbox-option__indicator /* State classes */ .is-selected .is-centered .is-indicator-partially-hidden .is-indicator-partially-hidden
Credits
License
The MIT License (MIT). Please see License File for more information.
Made with ❤️ by Tone Gabes