diff --git a/packages/actions/docs/06-adding-an-action-to-a-livewire-component.md b/packages/actions/docs/06-adding-an-action-to-a-livewire-component.md index 79a03ef357..90e5463829 100644 --- a/packages/actions/docs/06-adding-an-action-to-a-livewire-component.md +++ b/packages/actions/docs/06-adding-an-action-to-a-livewire-component.md @@ -4,16 +4,40 @@ title: Adding an action to a Livewire component ## Setting up the Livewire component -You must use the `InteractsWithActions` trait and implement the `HasActions` interface on your Livewire component class: +First, generate a new Livewire component: + +```bash +php artisan make:livewire ManageProduct +``` + +Then, render your Livewire component on the page: + +```blade +@livewire('manage-product') +``` + +Alternatively, you can use a full-page Livewire component: + +```php +use App\Http\Livewire\ManageProduct; +use Illuminate\Support\Facades\Route; + +Route::get('products/{product}/manage', ManageProduct::class); +``` + +You must use the `InteractsWithActions` and `InteractsWithForms` traits, and implement the `HasActions` and `HasForms` interfaces on your Livewire component class: ```php use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Livewire\Component; -class ManagePost extends Component implements HasActions +class ManagePost extends Component implements HasActions, HasForms { use InteractsWithActions; + use InteractsWithForms; // ... } @@ -28,11 +52,14 @@ use App\Models\Post; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Livewire\Component; -class ManagePost extends Component implements HasActions +class ManagePost extends Component implements HasActions, HasForms { use InteractsWithActions; + use InteractsWithForms; public Post $post; diff --git a/packages/actions/src/Concerns/InteractsWithActions.php b/packages/actions/src/Concerns/InteractsWithActions.php index 2082ebfd7b..273213091d 100644 --- a/packages/actions/src/Concerns/InteractsWithActions.php +++ b/packages/actions/src/Concerns/InteractsWithActions.php @@ -18,9 +18,6 @@ use InvalidArgumentException; */ trait InteractsWithActions { - use Forms\Concerns\InteractsWithForms; - use ResolvesDynamicLivewireProperties; - /** * @var array | null */ diff --git a/packages/app/src/Pages/BasePage.php b/packages/app/src/Pages/BasePage.php index c342ded707..994d00cc60 100644 --- a/packages/app/src/Pages/BasePage.php +++ b/packages/app/src/Pages/BasePage.php @@ -5,6 +5,8 @@ namespace Filament\Pages; use Closure; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Filament\Support\Exceptions\Halt; use Filament\Tables\Contracts\RendersActionModal; use Illuminate\Contracts\Support\Htmlable; @@ -12,9 +14,10 @@ use Illuminate\Contracts\View\View; use Illuminate\Validation\ValidationException; use Livewire\Component; -abstract class BasePage extends Component implements HasActions, RendersActionModal +abstract class BasePage extends Component implements HasActions, HasForms, RendersActionModal { use InteractsWithActions; + use InteractsWithForms; protected static string $layout; diff --git a/packages/app/src/Resources/Pages/ListRecords.php b/packages/app/src/Resources/Pages/ListRecords.php index 9fcfbad0b7..830d72c895 100644 --- a/packages/app/src/Resources/Pages/ListRecords.php +++ b/packages/app/src/Resources/Pages/ListRecords.php @@ -4,6 +4,7 @@ namespace Filament\Resources\Pages; use Filament\Actions\Action; use Filament\Actions\CreateAction; +use Filament\Forms; use Filament\Forms\Form; use Filament\Infolists\Infolist; use Filament\Resources\Pages\ListRecords\Tab; @@ -14,8 +15,9 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; -class ListRecords extends Page implements Tables\Contracts\HasTable +class ListRecords extends Page implements Forms\Contracts\HasForms, Tables\Contracts\HasTable { + use Forms\Concerns\InteractsWithForms; use Tables\Concerns\InteractsWithTable { makeTable as makeBaseTable; } diff --git a/packages/app/src/Resources/RelationManagers/RelationManager.php b/packages/app/src/Resources/RelationManagers/RelationManager.php index 74f0cfde02..43f94dfd77 100644 --- a/packages/app/src/Resources/RelationManagers/RelationManager.php +++ b/packages/app/src/Resources/RelationManagers/RelationManager.php @@ -3,6 +3,7 @@ namespace Filament\Resources\RelationManagers; use Filament\Facades\Filament; +use Filament\Forms; use Filament\Forms\Form; use Filament\Infolists\Infolist; use Filament\Resources\Pages\ViewRecord; @@ -17,8 +18,9 @@ use Illuminate\Support\Facades\Gate; use Illuminate\Support\Str; use Livewire\Component; -class RelationManager extends Component implements Tables\Contracts\HasTable +class RelationManager extends Component implements Forms\Contracts\HasForms, Tables\Contracts\HasTable { + use Forms\Concerns\InteractsWithForms; use Tables\Concerns\InteractsWithTable { makeTable as makeBaseTable; } diff --git a/packages/forms/src/Contracts/HasForms.php b/packages/forms/src/Contracts/HasForms.php index d770da5d23..0dd8554482 100644 --- a/packages/forms/src/Contracts/HasForms.php +++ b/packages/forms/src/Contracts/HasForms.php @@ -57,5 +57,5 @@ interface HasForms * @param array $attributes * @return array */ - public function validate(?array $rules = null, array $messages = [], array $attributes = []): array; + public function validate($rules = null, $messages = [], $attributes = []); } diff --git a/packages/infolists/docs/05-adding-an-infolist-to-a-livewire-component.md b/packages/infolists/docs/05-adding-an-infolist-to-a-livewire-component.md index 05891078cc..99c463f0f8 100644 --- a/packages/infolists/docs/05-adding-an-infolist-to-a-livewire-component.md +++ b/packages/infolists/docs/05-adding-an-infolist-to-a-livewire-component.md @@ -25,6 +25,24 @@ use Illuminate\Support\Facades\Route; Route::get('products/{product}', ViewProduct::class); ``` +You must use the `InteractsWithInfolists` and `InteractsWithForms` traits, and implement the `HasInfolists` and `HasForms` interfaces on your Livewire component class: + +```php +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; +use Filament\Infolists\Concerns\InteractsWithInfolists; +use Filament\Infolists\Contracts\HasInfolists; +use Livewire\Component; + +class ViewProduct extends Component implements HasInfolists, HasForms +{ + use InteractsWithInfolists; + use InteractsWithForms; + + // ... +} +``` + ## Adding the infolist Next, add a method to the Livewire component which accepts an `$infolist` object, modifies it, and returns it: diff --git a/packages/infolists/src/Concerns/InteractsWithInfolists.php b/packages/infolists/src/Concerns/InteractsWithInfolists.php index 53763b9eb4..a99b10a0e4 100644 --- a/packages/infolists/src/Concerns/InteractsWithInfolists.php +++ b/packages/infolists/src/Concerns/InteractsWithInfolists.php @@ -13,9 +13,6 @@ use Filament\Support\Exceptions\Halt; trait InteractsWithInfolists { - use Forms\Concerns\InteractsWithForms; - use ResolvesDynamicLivewireProperties; - protected bool $hasInfolistsModalRendered = false; /** diff --git a/packages/tables/docs/11-adding-a-table-to-a-livewire-component.md b/packages/tables/docs/11-adding-a-table-to-a-livewire-component.md index c850a2c839..ebc1c6b354 100644 --- a/packages/tables/docs/11-adding-a-table-to-a-livewire-component.md +++ b/packages/tables/docs/11-adding-a-table-to-a-livewire-component.md @@ -29,7 +29,7 @@ Route::get('products', ListProducts::class); There are 3 tasks when adding a table to a Livewire component class: -1) Implement the `HasTable` interface and use the `InteractsWithTable` trait. +1) Implement the `HasTable` and `HasForms` interfaces, and use the `InteractsWithTable` and `InteractsWithForms` traits. 2) Add a `table()` method, which is where you configure the table. [Add the table's columns, filters, and actions](getting-started#columns). 3) Make sure to define the base query that will be used to fetch rows in the table. For example, if you're listing products from your `Product` model, you will want to return `Product::query()`. @@ -40,6 +40,8 @@ namespace App\Http\Livewire; use App\Models\Post; use App\Models\Shop\Product; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; @@ -47,9 +49,10 @@ use Filament\Tables\Table; use Illuminate\Contracts\View\View; use Livewire\Component; -class ListProducts extends Component implements HasTable +class ListProducts extends Component implements HasTable, HasForms { use InteractsWithTable; + use InteractsWithForms; public function table(Table $table): Table { diff --git a/packages/tables/src/Concerns/InteractsWithTable.php b/packages/tables/src/Concerns/InteractsWithTable.php index dde33ced9e..ddfa4ac87a 100644 --- a/packages/tables/src/Concerns/InteractsWithTable.php +++ b/packages/tables/src/Concerns/InteractsWithTable.php @@ -27,7 +27,6 @@ trait InteractsWithTable use HasColumns; use HasFilters; use HasRecords; - use Forms\Concerns\InteractsWithForms; use CanBeStriped; use CanPollRecords; use HasContent; diff --git a/packages/tables/src/TableComponent.php b/packages/tables/src/TableComponent.php index b49c22e6e3..05b9638a37 100644 --- a/packages/tables/src/TableComponent.php +++ b/packages/tables/src/TableComponent.php @@ -7,5 +7,6 @@ use Livewire\Component; abstract class TableComponent extends Component implements Forms\Contracts\HasForms, Contracts\HasTable { + use Forms\Concerns\InteractsWithForms; use Concerns\InteractsWithTable; } diff --git a/packages/tables/stubs/Table.stub b/packages/tables/stubs/Table.stub index 8f5c713b32..45d3090199 100644 --- a/packages/tables/stubs/Table.stub +++ b/packages/tables/stubs/Table.stub @@ -3,6 +3,8 @@ namespace {{ namespace }}; use App\Models\{{ model }}; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Filament\Tables; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; @@ -11,8 +13,9 @@ use Livewire\Component; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Builder; -class {{ class }} extends Component implements HasTable +class {{ class }} extends Component implements HasForms, HasTable { + use InteractsWithForms; use InteractsWithTable; public function table(Table $table): Table diff --git a/packages/widgets/src/TableWidget.php b/packages/widgets/src/TableWidget.php index b3aa1d1ea9..39d63a50c9 100644 --- a/packages/widgets/src/TableWidget.php +++ b/packages/widgets/src/TableWidget.php @@ -2,14 +2,16 @@ namespace Filament\Widgets; +use Filament\Forms; use Filament\Tables; use Filament\Tables\Table; use Illuminate\Contracts\Pagination\Paginator; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Builder; -class TableWidget extends Widget implements Tables\Contracts\HasTable +class TableWidget extends Widget implements Forms\Contracts\HasForms, Tables\Contracts\HasTable { + use Forms\Concerns\InteractsWithForms; use Tables\Concerns\InteractsWithTable { makeTable as makeBaseTable; } diff --git a/tests/src/Tables/Fixtures/PostsTable.php b/tests/src/Tables/Fixtures/PostsTable.php index e5c554ae3c..d4bd82ed1c 100644 --- a/tests/src/Tables/Fixtures/PostsTable.php +++ b/tests/src/Tables/Fixtures/PostsTable.php @@ -4,6 +4,8 @@ namespace Filament\Tests\Tables\Fixtures; use Filament\Forms\ComponentContainer; use Filament\Forms\Components\TextInput; +use Filament\Forms\Concerns\InteractsWithForms; +use Filament\Forms\Contracts\HasForms; use Filament\Tables; use Filament\Tables\Table; use Filament\Tests\Models\Post; @@ -12,8 +14,9 @@ use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Query\Builder; use Livewire\Component; -class PostsTable extends Component implements Tables\Contracts\HasTable +class PostsTable extends Component implements HasForms, Tables\Contracts\HasTable { + use InteractsWithForms; use Tables\Concerns\InteractsWithTable; public function table(Table $table): Table