120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace Modules\Mailgateway\Components;
 | |
| 
 | |
| use App\Mailgateway\Models\Mailgateway;
 | |
| use Illuminate\Support\Collection;
 | |
| use Illuminate\Validation\Rule;
 | |
| use Illuminate\Validation\ValidationException;
 | |
| use Livewire\Attributes\On;
 | |
| use Livewire\Attributes\Validate;
 | |
| use Livewire\Component;
 | |
| 
 | |
| class Form extends Component
 | |
| {
 | |
| 
 | |
|     public string $id = '';
 | |
|     public string $name = '';
 | |
|     public string $domain = '';
 | |
|     public array $params = [];
 | |
|     #[Validate('required')]
 | |
|     public ?string $cls = null;
 | |
|     public Collection $types;
 | |
| 
 | |
|     public function rules()
 | |
|     {
 | |
|         return [
 | |
|             'name' => 'required|string|max:255',
 | |
|             'domain' => 'required|string|max:255',
 | |
|             'cls' => ['required', 'string', 'max:255', Rule::in(app('mail-gateways'))],
 | |
|             'params' => 'present|array',
 | |
|             ...$this->cls ? collect($this->cls::rules($this->id ? 'updateValidator' : 'storeValidator'))->mapWithKeys(fn ($rules, $key) => ["params.{$key}" => $rules]) : [],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public function validationAttributes(): array
 | |
|     {
 | |
|         return [
 | |
|             'cls' => 'Typ',
 | |
|             'name' => 'Beschreibung',
 | |
|             'domain' => 'Domain',
 | |
|             ...$this->cls ? collect($this->cls::fieldNames())->mapWithKeys(fn ($attribute, $key) => ["params.{$key}" => $attribute]) : [],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public function mount(?string $model = null): void
 | |
|     {
 | |
|         $this->types = app('mail-gateways')->map(fn ($gateway) => [
 | |
|             'name' => $gateway::name(),
 | |
|             'id' => $gateway,
 | |
|         ]);
 | |
| 
 | |
|         $model = Mailgateway::find($model);
 | |
| 
 | |
|         if ($model) {
 | |
|             $this->id = $model->id;
 | |
|             $this->name = $model->name;
 | |
|             $this->domain = $model->domain;
 | |
|             $this->cls = get_class($model->type);
 | |
|             $this->params = (array) $model->type;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function updatedType(string $type): void
 | |
|     {
 | |
|         $this->params = $type::defaults();
 | |
|     }
 | |
| 
 | |
|     public function fields(): array
 | |
|     {
 | |
|         return $this->cls ? $this->cls::fields() : [];
 | |
|     }
 | |
| 
 | |
|     #[On('onStoreFromModal')]
 | |
|     public function onSave(): void
 | |
|     {
 | |
|         $this->validate();
 | |
| 
 | |
|         if (!app($this->cls)->setParams($this->params)->works()) {
 | |
|             throw ValidationException::withMessages(['connection' => 'Verbindung fehlgeschlagen.']);
 | |
|         }
 | |
| 
 | |
|         $payload = [
 | |
|             'name' => $this->name,
 | |
|             'domain' => $this->domain,
 | |
|             'type' => ['cls' => $this->cls, 'params' => $this->params],
 | |
|         ];
 | |
|         if ($this->id) {
 | |
|             Mailgateway::find($this->id)->update($payload);
 | |
|         } else {
 | |
|             Mailgateway::create($payload);
 | |
|         }
 | |
|         $this->dispatch('closeModal');
 | |
|         $this->dispatch('refresh-page');
 | |
|         $this->dispatch('success', 'Erfolgreich gespeichert.');
 | |
|     }
 | |
| 
 | |
|     public function render()
 | |
|     {
 | |
|         return <<<'HTML'
 | |
|             <div>
 | |
|                 <form class="grid grid-cols-2 gap-3">
 | |
|                     <x-form::text name="name" wire:model="name" label="Beschreibung" required />
 | |
|                     <x-form::text name="domain" wire:model="domain" label="Domain" required />
 | |
|                     <x-form::select name="cls" wire:model.live="cls" label="Typ" :options="$types" required />
 | |
|                     @foreach($this->fields() as $index => $field)
 | |
|                         <x-form::text
 | |
|                             wire:key="index"
 | |
|                             wire:model="params.{{$field['name']}}"
 | |
|                             :label="$field['label']"
 | |
|                             :type="$field['type']"
 | |
|                             :name="$field['name']"
 | |
|                             :required="str_contains('required', $field['storeValidator'])"
 | |
|                         ></x-form::text>
 | |
|                     @endforeach
 | |
|                 </form>
 | |
|             </div>
 | |
|         HTML;
 | |
|     }
 | |
| }
 |