adrema/modules/Mailgateway/Components/Form.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');
$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;
}
}