diff --git a/packages/forms/src/HasForm.php b/packages/forms/src/HasForm.php index 859a1c2992..c2bf4e1afb 100644 --- a/packages/forms/src/HasForm.php +++ b/packages/forms/src/HasForm.php @@ -6,6 +6,7 @@ use Filament\Forms\Components\Concerns\CanConcealFields; use Filament\Forms\Components\Field; use Filament\Forms\Components\FileUpload; use Filament\Forms\Components\Select; +use Filament\Forms\Form; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; @@ -16,6 +17,8 @@ trait HasForm { use WithFileUploads; + protected $form; + public $temporaryUploadedFiles = []; public function clearTemporaryUploadedFile($name) @@ -55,9 +58,20 @@ trait HasForm } } - protected function form() + public function form(Form $form) { - return Form::for($this); + return $form; + } + + public function getForm() + { + if ($this->form !== null) { + return $this->form; + } + + return $this->form = $this->form( + Form::for($this), + ); } public function getPropertyDefaults() diff --git a/src/Http/Livewire/Auth/Login.php b/src/Http/Livewire/Auth/Login.php index d866a1c0f6..044a3c0e2d 100644 --- a/src/Http/Livewire/Auth/Login.php +++ b/src/Http/Livewire/Auth/Login.php @@ -21,9 +21,9 @@ class Login extends Component public $remember = false; - public function getForm() + public function form(Form $form) { - return Form::for($this) + return $form ->schema([ Components\TextInput::make('email') ->label('filament::auth/login.form.email.label') diff --git a/src/Http/Livewire/Auth/RequestPassword.php b/src/Http/Livewire/Auth/RequestPassword.php index 52d4e5afd8..f80c0a45d9 100644 --- a/src/Http/Livewire/Auth/RequestPassword.php +++ b/src/Http/Livewire/Auth/RequestPassword.php @@ -17,9 +17,9 @@ class RequestPassword extends Component public $email; - public function getForm() + public function form(Form $form) { - return Form::for($this) + return $form ->schema([ Components\TextInput::make('email') ->label('filament::auth/request-password.form.email.label') diff --git a/src/Http/Livewire/Auth/ResetPassword.php b/src/Http/Livewire/Auth/ResetPassword.php index 2690557931..39cba7c5d3 100644 --- a/src/Http/Livewire/Auth/ResetPassword.php +++ b/src/Http/Livewire/Auth/ResetPassword.php @@ -25,9 +25,9 @@ class ResetPassword extends Component public $user; - public function getForm() + public function form(Form $form) { - return Form::for($this) + return $form ->schema([ Components\TextInput::make('email') ->label('filament::auth/reset-password.form.email.label') diff --git a/src/Http/Livewire/EditAccount.php b/src/Http/Livewire/EditAccount.php index bb448ecc3b..7716eb1d92 100644 --- a/src/Http/Livewire/EditAccount.php +++ b/src/Http/Livewire/EditAccount.php @@ -18,10 +18,10 @@ class EditAccount extends Page public static $view = 'filament::edit-account'; - public function getForm() + public function form(Form $form) { return static::getResource()::form( - Form::for($this)->model(static::getModel()), + $form->model(static::getModel()), ); } diff --git a/src/Resources/Forms/HasForm.php b/src/Resources/Forms/HasForm.php index 84fc82a641..6ec05886d1 100644 --- a/src/Resources/Forms/HasForm.php +++ b/src/Resources/Forms/HasForm.php @@ -2,12 +2,25 @@ namespace Filament\Resources\Forms; +use Filament\Resources\Forms\Form; + trait HasForm { use \Filament\Forms\HasForm; - protected function form() + public function form(Form $form) { - return Form::for($this); + return $form; + } + + public function getForm() + { + if ($this->form !== null) { + return $this->form; + } + + return $this->form = $this->form( + Form::for($this), + ); } } diff --git a/src/Resources/Pages/CreateRecord.php b/src/Resources/Pages/CreateRecord.php index 3d1ed93503..4b6e5c138b 100644 --- a/src/Resources/Pages/CreateRecord.php +++ b/src/Resources/Pages/CreateRecord.php @@ -3,6 +3,7 @@ namespace Filament\Resources\Pages; use Filament\Filament; +use Filament\Resources\Forms\Form; use Filament\Resources\Forms\HasForm; use Illuminate\Support\Str; @@ -48,10 +49,10 @@ class CreateRecord extends Page ]; } - public function getForm() + public function form(Form $form) { return static::getResource()::form( - $this->form()->model(static::getModel()), + $form->model(static::getModel()), ); } diff --git a/src/Resources/Pages/EditRecord.php b/src/Resources/Pages/EditRecord.php index 8c958053e5..3e614542bf 100644 --- a/src/Resources/Pages/EditRecord.php +++ b/src/Resources/Pages/EditRecord.php @@ -3,6 +3,7 @@ namespace Filament\Resources\Pages; use Filament\Filament; +use Filament\Resources\Forms\Form; use Filament\Resources\Forms\HasForm; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\Str; @@ -56,10 +57,10 @@ class EditRecord extends Page ]; } - public function getForm() + public function form(Form $form) { return static::getResource()::form( - $this->form()->model(static::getModel()), + $form->model(static::getModel()), ); } diff --git a/src/Resources/RelationManager/AttachRecord.php b/src/Resources/RelationManager/AttachRecord.php index 3b2b61f91d..e9a394aa65 100644 --- a/src/Resources/RelationManager/AttachRecord.php +++ b/src/Resources/RelationManager/AttachRecord.php @@ -43,9 +43,9 @@ class AttachRecord extends Component $this->related = null; } - public function getForm() + public function form(Form $form) { - return Form::for($this) + return $form ->schema([ Select::make('related') ->label((string) Str::of($this->getRelationship())->singular()->ucfirst()) diff --git a/src/Resources/RelationManager/CreateRecord.php b/src/Resources/RelationManager/CreateRecord.php index f7d0a8a5b2..531f13bea0 100644 --- a/src/Resources/RelationManager/CreateRecord.php +++ b/src/Resources/RelationManager/CreateRecord.php @@ -46,10 +46,10 @@ class CreateRecord extends Component $this->fillWithFormDefaults(); } - public function getForm() + public function form(Form $form) { return $this->manager::form( - Form::for($this)->model(get_class($this->owner->{$this->getRelationship()}()->getModel())), + $form->model(get_class($this->owner->{$this->getRelationship()}()->getModel())), ); } diff --git a/src/Resources/RelationManager/EditRecord.php b/src/Resources/RelationManager/EditRecord.php index f299fde1fa..450250a497 100644 --- a/src/Resources/RelationManager/EditRecord.php +++ b/src/Resources/RelationManager/EditRecord.php @@ -28,11 +28,9 @@ class EditRecord extends Component 'switchRelationManagerEditRecord' => 'switchRecord', ]; - public function getForm() + public function form(Form $form) { - $form = Form::for($this)->model(get_class($this->owner->{$this->getRelationship()}()->getModel())); - - return $this->manager::form($form); + return $this->manager::form($form->model(get_class($this->owner->{$this->getRelationship()}()->getModel()))); } public function getQuery()