From 63c901e62aec79c11adb9d5d8140acada2566e46 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Tue, 23 Mar 2021 00:17:12 +0000 Subject: [PATCH] wip forms --- packages/forms/src/Components/Component.php | 20 +++----- packages/forms/src/Components/Field.php | 5 ++ packages/forms/src/Components/FileUpload.php | 14 +---- packages/forms/src/Form.php | 40 +++++++-------- packages/forms/src/HasForm.php | 5 ++ src/Http/Livewire/Auth/Login.php | 3 +- src/Http/Livewire/Auth/RequestPassword.php | 3 +- src/Http/Livewire/Auth/ResetPassword.php | 3 +- src/Http/Livewire/EditAccount.php | 6 +-- src/Resources/Forms/Components/Component.php | 2 +- .../CanBeDependentOnResourceRecord.php | 29 +++++++++++ .../Forms/Components/Concerns/CanBeUnique.php | 8 ++- .../Concerns/InteractsWithResource.php | 51 +------------------ .../Concerns/ManipulatesResourceRecord.php | 16 ++++++ src/Resources/Forms/Components/Fieldset.php | 2 +- src/Resources/Forms/Components/Grid.php | 2 +- src/Resources/Forms/Components/Group.php | 2 +- src/Resources/Forms/Components/Section.php | 2 +- src/Resources/Forms/Components/Tab.php | 2 +- src/Resources/Forms/Components/Tabs.php | 2 +- src/Resources/Forms/Components/View.php | 2 +- src/Resources/Forms/HasForm.php | 13 +++++ src/Resources/Pages/CreateRecord.php | 7 +-- src/Resources/Pages/EditRecord.php | 7 +-- src/Resources/Pages/ListRecords.php | 2 +- .../RelationManager/AttachRecord.php | 3 +- .../RelationManager/CreateRecord.php | 6 +-- src/Resources/RelationManager/EditRecord.php | 5 +- src/Resources/Tables/HasTable.php | 8 +++ 29 files changed, 134 insertions(+), 136 deletions(-) create mode 100644 src/Resources/Forms/Components/Concerns/CanBeDependentOnResourceRecord.php create mode 100644 src/Resources/Forms/Components/Concerns/ManipulatesResourceRecord.php create mode 100644 src/Resources/Forms/HasForm.php create mode 100644 src/Resources/Tables/HasTable.php diff --git a/packages/forms/src/Components/Component.php b/packages/forms/src/Components/Component.php index 549251502a..ea1699745c 100644 --- a/packages/forms/src/Components/Component.php +++ b/packages/forms/src/Components/Component.php @@ -148,6 +148,11 @@ class Component return $this->label; } + public function getLivewire() + { + return $this->getForm()->getLivewire(); + } + public function getModel() { return $this->getForm()->getModel(); @@ -158,11 +163,6 @@ class Component return $this->parent; } - public function getRecord() - { - return $this->getForm()->getRecord(); - } - public function getRules($field = null) { if ($field !== null) { @@ -189,10 +189,8 @@ class Component public function getSubform() { - return Form::make() - ->context($this->getContext()) + return Form::for($this->getLivewire()) ->model($this->getModel()) - ->record($this->getRecord()) ->schema($this->getSchema()); } @@ -327,12 +325,8 @@ class Component $callback = fn ($component) => $component->visible(); } - if ($this->getRecord() === null) { - return $this; - } - try { - $shouldExecuteCallback = $condition($this->getRecord()); + $shouldExecuteCallback = $condition($this->getLivewire()); } catch (\Exception $exception) { $shouldExecuteCallback = false; } diff --git a/packages/forms/src/Components/Field.php b/packages/forms/src/Components/Field.php index 89c1e8111e..17dfad9f35 100644 --- a/packages/forms/src/Components/Field.php +++ b/packages/forms/src/Components/Field.php @@ -196,6 +196,11 @@ class Field extends Component return $this->validationAttribute; } + public function getValue() + { + return $this->getLivewire()->getPropertyValue($this->getName()); + } + public function helpMessage($message) { $this->configure(function () use ($message) { diff --git a/packages/forms/src/Components/FileUpload.php b/packages/forms/src/Components/FileUpload.php index 1f3591b5ce..26d3f3e144 100644 --- a/packages/forms/src/Components/FileUpload.php +++ b/packages/forms/src/Components/FileUpload.php @@ -183,19 +183,9 @@ class FileUpload extends Field public function getUploadedFileUrl() { - $record = $this->getRecord(); + $path = $this->getValue(); - if ($record === null) return; - - $name = $this->getName(); - - if (Str::of($name)->contains('.')) { - $name = (string) Str::of($name)->after('.'); - } - - $path = $record->{$name}; - - if (! $path) { + if ($path === null) { return null; } diff --git a/packages/forms/src/Form.php b/packages/forms/src/Form.php index 92628ee1cd..4a65a5d49e 100644 --- a/packages/forms/src/Form.php +++ b/packages/forms/src/Form.php @@ -10,12 +10,10 @@ class Form protected $columns = 1; - protected $context; + protected $livewire; protected $model; - protected $record; - protected $rules = []; protected $schema = []; @@ -24,6 +22,11 @@ class Form protected $validationAttributes = []; + public function __construct($livewire) + { + $this->livewire($livewire); + } + public function columns($columns) { $this->columns = $columns; @@ -31,11 +34,9 @@ class Form return $this; } - public function context($context) + public static function for($livewire) { - $this->context = $context; - - return $this; + return new static($livewire); } public function getColumns() @@ -45,7 +46,7 @@ class Form public function getContext() { - return $this->context; + return get_class($this->getLivewire()); } public function getDefaultValues() @@ -70,16 +71,16 @@ class Form return $schema; } + public function getLivewire() + { + return $this->livewire; + } + public function getModel() { return $this->model; } - public function getRecord() - { - return $this->record; - } - public function getRules() { $rules = $this->rules; @@ -114,9 +115,11 @@ class Form return $attributes; } - public static function make() + public function livewire($component) { - return new static(); + $this->livewire = $component; + + return $this; } public function model($model) @@ -126,13 +129,6 @@ class Form return $this; } - public function record($record) - { - $this->record = (object) $record; - - return $this; - } - public function rules($rules) { $this->rules = value($rules); diff --git a/packages/forms/src/HasForm.php b/packages/forms/src/HasForm.php index 0a04394a54..859a1c2992 100644 --- a/packages/forms/src/HasForm.php +++ b/packages/forms/src/HasForm.php @@ -55,6 +55,11 @@ trait HasForm } } + protected function form() + { + return Form::for($this); + } + public function getPropertyDefaults() { return $this->getForm()->getDefaultValues(); diff --git a/src/Http/Livewire/Auth/Login.php b/src/Http/Livewire/Auth/Login.php index 5755dcc7f7..d866a1c0f6 100644 --- a/src/Http/Livewire/Auth/Login.php +++ b/src/Http/Livewire/Auth/Login.php @@ -23,8 +23,7 @@ class Login extends Component public function getForm() { - return Form::make() - ->context(static::class) + return Form::for($this) ->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 6392c425d3..52d4e5afd8 100644 --- a/src/Http/Livewire/Auth/RequestPassword.php +++ b/src/Http/Livewire/Auth/RequestPassword.php @@ -19,8 +19,7 @@ class RequestPassword extends Component public function getForm() { - return Form::make() - ->context(static::class) + return Form::for($this) ->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 82b1363b73..2690557931 100644 --- a/src/Http/Livewire/Auth/ResetPassword.php +++ b/src/Http/Livewire/Auth/ResetPassword.php @@ -27,8 +27,7 @@ class ResetPassword extends Component public function getForm() { - return Form::make() - ->context(static::class) + return Form::for($this) ->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 3912c80c00..9ac6e5e296 100644 --- a/src/Http/Livewire/EditAccount.php +++ b/src/Http/Livewire/EditAccount.php @@ -3,7 +3,7 @@ namespace Filament\Http\Livewire; use Filament\Filament; -use Filament\Forms\HasForm; +use Filament\Resources\Forms\HasForm; use Filament\Resources\Forms\Form; use Filament\Resources\Pages\Page; use Illuminate\Support\Facades\Hash; @@ -21,10 +21,8 @@ class EditAccount extends Page public function getForm() { return static::getResource()::form( - Form::make() - ->context(static::class) + Form::for($this) ->model(static::getModel()) - ->record($this->record) ->submitMethod('save'), ); } diff --git a/src/Resources/Forms/Components/Component.php b/src/Resources/Forms/Components/Component.php index dbe88308b5..e34bbee1d3 100644 --- a/src/Resources/Forms/Components/Component.php +++ b/src/Resources/Forms/Components/Component.php @@ -4,5 +4,5 @@ namespace Filament\Resources\Forms\Components; class Component extends \Filament\Forms\Components\Component { - // + use Concerns\CanBeDependentOnResourceRecord; } diff --git a/src/Resources/Forms/Components/Concerns/CanBeDependentOnResourceRecord.php b/src/Resources/Forms/Components/Concerns/CanBeDependentOnResourceRecord.php new file mode 100644 index 0000000000..bc5b0fe6c3 --- /dev/null +++ b/src/Resources/Forms/Components/Concerns/CanBeDependentOnResourceRecord.php @@ -0,0 +1,29 @@ +configure(function () use ($callback, $condition) { + if (! $callback) { + $this->hidden(); + + $callback = fn ($component) => $component->visible(); + } + + try { + $shouldExecuteCallback = $condition((object) $this->getLivewire()->record); + } catch (\Exception $exception) { + $shouldExecuteCallback = false; + } + + if ($shouldExecuteCallback) { + $callback($this); + } + }); + + return $this; + } +} diff --git a/src/Resources/Forms/Components/Concerns/CanBeUnique.php b/src/Resources/Forms/Components/Concerns/CanBeUnique.php index 6772de158a..f386092f9b 100644 --- a/src/Resources/Forms/Components/Concerns/CanBeUnique.php +++ b/src/Resources/Forms/Components/Concerns/CanBeUnique.php @@ -2,6 +2,8 @@ namespace Filament\Resources\Forms\Components\Concerns; +use Illuminate\Database\Eloquent\Model; + trait CanBeUnique { use \Filament\Forms\Components\Concerns\CanBeUnique; @@ -11,8 +13,10 @@ trait CanBeUnique $this->configure(function () use ($column, $except, $table) { $rule = "unique:$table,$column"; - if ($except) { - $rule .= ',{{ record }}'; + $record = $this->getLivewire()->record; + + if ($except && $record instanceof Model) { + $rule .= ",{$record->getKey()}"; } $this->addRules([$this->getName() => [$rule]]); diff --git a/src/Resources/Forms/Components/Concerns/InteractsWithResource.php b/src/Resources/Forms/Components/Concerns/InteractsWithResource.php index ff61648ee5..a60899dc90 100644 --- a/src/Resources/Forms/Components/Concerns/InteractsWithResource.php +++ b/src/Resources/Forms/Components/Concerns/InteractsWithResource.php @@ -2,55 +2,8 @@ namespace Filament\Resources\Forms\Components\Concerns; -use Filament\Forms\Components\Field; -use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Str; - trait InteractsWithResource { - public function getRules($field = null) - { - if ($field !== null) { - return $this->rules[$field] ?? null; - } - - if ($this->isHidden()) { - return []; - } - - $rules = $this instanceof Field ? $this->rules : []; - - foreach ($rules as $field => $conditions) { - $rules[$field] = $this->transformConditions($conditions); - } - - foreach ($this->getSubform()->getRules() as $field => $conditions) { - $rules[$field] = array_merge($rules[$field] ?? [], $this->transformConditions($conditions)); - } - - return $rules; - } - - public static function make($name) - { - return new static("record.{$name}"); - } - - public function requiredWith($field) - { - return parent::requiredWith("record.{$field}"); - } - - protected function transformConditions($conditions) - { - return collect($conditions) - ->map(function ($condition) { - if (! is_string($condition)) { - return $condition; - } - - return (string) Str::of($condition)->replace('{{ record }}', $this->getRecord() instanceof Model ? $this->getRecord()->getKey() : ''); - }) - ->toArray(); - } + use CanBeDependentOnResourceRecord; + use ManipulatesResourceRecord; } diff --git a/src/Resources/Forms/Components/Concerns/ManipulatesResourceRecord.php b/src/Resources/Forms/Components/Concerns/ManipulatesResourceRecord.php new file mode 100644 index 0000000000..e10e194535 --- /dev/null +++ b/src/Resources/Forms/Components/Concerns/ManipulatesResourceRecord.php @@ -0,0 +1,16 @@ +context(static::class) + $this->form() ->model(static::getModel()) - ->record($this->record) ->submitMethod('create'), ); } diff --git a/src/Resources/Pages/EditRecord.php b/src/Resources/Pages/EditRecord.php index 21b8e9f2ab..254996b9ad 100644 --- a/src/Resources/Pages/EditRecord.php +++ b/src/Resources/Pages/EditRecord.php @@ -3,8 +3,7 @@ namespace Filament\Resources\Pages; use Filament\Filament; -use Filament\Forms\HasForm; -use Filament\Resources\Forms\Form; +use Filament\Resources\Forms\HasForm; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\Str; @@ -60,10 +59,8 @@ class EditRecord extends Page public function getForm() { return static::getResource()::form( - Form::make() - ->context(static::class) + $this->form() ->model(static::getModel()) - ->record($this->record) ->submitMethod('save'), ); } diff --git a/src/Resources/Pages/ListRecords.php b/src/Resources/Pages/ListRecords.php index 30a1651573..91c22b43c1 100644 --- a/src/Resources/Pages/ListRecords.php +++ b/src/Resources/Pages/ListRecords.php @@ -3,9 +3,9 @@ namespace Filament\Resources\Pages; use Filament\Filament; +use Filament\Resources\Tables\HasTable; use Filament\Resources\Tables\RecordActions; use Filament\Resources\Tables\Table; -use Filament\Tables\HasTable; use Illuminate\Support\Str; class ListRecords extends Page diff --git a/src/Resources/RelationManager/AttachRecord.php b/src/Resources/RelationManager/AttachRecord.php index 8e2dc1c62b..4e6d965ae1 100644 --- a/src/Resources/RelationManager/AttachRecord.php +++ b/src/Resources/RelationManager/AttachRecord.php @@ -45,8 +45,7 @@ class AttachRecord extends Component public function getForm() { - return Form::make() - ->context(static::class) + return Form::for($this) ->submitMethod('attach') ->schema([ Select::make('related') diff --git a/src/Resources/RelationManager/CreateRecord.php b/src/Resources/RelationManager/CreateRecord.php index 10af05054d..ea365b4746 100644 --- a/src/Resources/RelationManager/CreateRecord.php +++ b/src/Resources/RelationManager/CreateRecord.php @@ -2,7 +2,7 @@ namespace Filament\Resources\RelationManager; -use Filament\Forms\HasForm; +use Filament\Resources\Forms\HasForm; use Filament\Resources\Forms\Form; use Livewire\Component; @@ -49,10 +49,8 @@ class CreateRecord extends Component public function getForm() { return $this->manager::form( - Form::make() - ->context(static::class) + Form::for($this) ->model(get_class($this->owner->{$this->getRelationship()}()->getModel())) - ->record($this->record) ->submitMethod('create'), ); } diff --git a/src/Resources/RelationManager/EditRecord.php b/src/Resources/RelationManager/EditRecord.php index 191eadd75b..53be7252dc 100644 --- a/src/Resources/RelationManager/EditRecord.php +++ b/src/Resources/RelationManager/EditRecord.php @@ -3,7 +3,7 @@ namespace Filament\Resources\RelationManager; use Filament\Filament; -use Filament\Forms\HasForm; +use Filament\Resources\Forms\HasForm; use Filament\Resources\Forms\Form; use Illuminate\Database\Eloquent\Model; use Livewire\Component; @@ -30,8 +30,7 @@ class EditRecord extends Component public function getForm() { - $form = Form::make() - ->context(static::class) + $form = Form::for($this) ->model(get_class($this->owner->{$this->getRelationship()}()->getModel())) ->submitMethod('save'); diff --git a/src/Resources/Tables/HasTable.php b/src/Resources/Tables/HasTable.php new file mode 100644 index 0000000000..62f56b3e1a --- /dev/null +++ b/src/Resources/Tables/HasTable.php @@ -0,0 +1,8 @@ +