Split traits

This commit is contained in:
Dan Harrin
2023-05-19 11:46:57 +01:00
parent 8247b8f600
commit 67bf5adab3
14 changed files with 76 additions and 19 deletions
@@ -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;
@@ -18,9 +18,6 @@ use InvalidArgumentException;
*/
trait InteractsWithActions
{
use Forms\Concerns\InteractsWithForms;
use ResolvesDynamicLivewireProperties;
/**
* @var array<string> | null
*/
+4 -1
View File
@@ -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;
@@ -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;
}
@@ -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;
}
+1 -1
View File
@@ -57,5 +57,5 @@ interface HasForms
* @param array<string, string> $attributes
* @return array<string, mixed>
*/
public function validate(?array $rules = null, array $messages = [], array $attributes = []): array;
public function validate($rules = null, $messages = [], $attributes = []);
}
@@ -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:
@@ -13,9 +13,6 @@ use Filament\Support\Exceptions\Halt;
trait InteractsWithInfolists
{
use Forms\Concerns\InteractsWithForms;
use ResolvesDynamicLivewireProperties;
protected bool $hasInfolistsModalRendered = false;
/**
@@ -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
{
@@ -27,7 +27,6 @@ trait InteractsWithTable
use HasColumns;
use HasFilters;
use HasRecords;
use Forms\Concerns\InteractsWithForms;
use CanBeStriped;
use CanPollRecords;
use HasContent;
+1
View File
@@ -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;
}
+4 -1
View File
@@ -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
+3 -1
View File
@@ -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;
}
+4 -1
View File
@@ -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