CluPilotCloud/app/Livewire/Admin/EditMailTemplate.php

74 lines
2.0 KiB
PHP

<?php
namespace App\Livewire\Admin;
use App\Models\MailTemplate;
use App\Services\Mail\MailTemplateRenderer;
use Livewire\Attributes\Validate;
use LivewireUI\Modal\ModalComponent;
/**
* Edit one template in a modal.
*
* R20: a textarea growing inside a table row pushes every column beside it and
* reads like a rendering fault rather than a form. A modal is also the only
* place a five-line body has room.
*
* A modal is reachable WITHOUT the page's route middleware, so it authorises
* again and reads the record itself rather than trusting a property the browser
* hydrated.
*/
class EditMailTemplate extends ModalComponent
{
public string $uuid = '';
#[Validate('required|string|max:255')]
public string $name = '';
#[Validate('required|string|max:255')]
public string $subject = '';
#[Validate('required|string|max:5000')]
public string $body = '';
public bool $active = true;
public function mount(string $uuid): void
{
$this->authorize('customers.manage');
$template = MailTemplate::query()->where('uuid', $uuid)->firstOrFail();
$this->uuid = $uuid;
$this->name = $template->name;
$this->subject = $template->subject;
$this->body = $template->body;
$this->active = (bool) $template->active;
}
public function save()
{
$this->authorize('customers.manage');
$data = $this->validate();
MailTemplate::query()->where('uuid', $this->uuid)->update([
'name' => trim($data['name']),
'subject' => trim($data['subject']),
'body' => $data['body'],
'active' => $this->active,
]);
$this->dispatch('notify', message: __('templates.saved'));
return $this->redirectRoute('admin.templates', navigate: true);
}
public function render()
{
return view('livewire.admin.edit-mail-template', [
'placeholders' => MailTemplateRenderer::PLACEHOLDERS,
]);
}
}