103 lines
3.2 KiB
PHP
103 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Ui\Nx\Mail;
|
|
|
|
use App\Models\Domain;
|
|
use Illuminate\Support\Str;
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Attributes\On;
|
|
use Livewire\Attributes\Title;
|
|
use Livewire\Component;
|
|
|
|
#[Layout('layouts.dvx')]
|
|
#[Title('Aliasse · Mailwolt')]
|
|
class AliasList extends Component
|
|
{
|
|
public string $search = '';
|
|
|
|
#[On('alias:created')]
|
|
#[On('alias:updated')]
|
|
#[On('alias:deleted')]
|
|
public function refreshAliasList(): void
|
|
{
|
|
$this->dispatch('$refresh');
|
|
}
|
|
|
|
public function openAliasCreate(int $domainId): void
|
|
{
|
|
$this->dispatch('openModal', component: 'ui.mail.modal.alias-form-modal', arguments: [
|
|
'domainId' => $domainId,
|
|
]);
|
|
}
|
|
|
|
public function openAliasEdit(int $aliasId): void
|
|
{
|
|
$this->dispatch('openModal', component: 'ui.mail.modal.alias-form-modal', arguments: [
|
|
'aliasId' => $aliasId,
|
|
]);
|
|
}
|
|
|
|
public function openAliasDelete(int $aliasId): void
|
|
{
|
|
$this->dispatch('openModal', component: 'ui.mail.modal.alias-delete-modal', arguments: [
|
|
'aliasId' => $aliasId,
|
|
]);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
$term = trim($this->search);
|
|
$hasTerm = $term !== '';
|
|
$needle = '%' . str_replace(['%', '_'], ['\%', '\_'], $term) . '%';
|
|
|
|
$domains = Domain::query()
|
|
->where('is_system', false)
|
|
->where('is_server', false)
|
|
->when($hasTerm, function ($q) use ($needle) {
|
|
$q->where(function ($w) use ($needle) {
|
|
$w->where('domain', 'like', $needle)
|
|
->orWhereHas('mailAliases', fn($a) => $a
|
|
->where('is_system', false)
|
|
->where(fn($x) => $x
|
|
->where('local', 'like', $needle)
|
|
->orWhere('destination', 'like', $needle)
|
|
)
|
|
);
|
|
});
|
|
})
|
|
->withCount(['mailAliases as aliases_count' => fn($a) => $a->where('is_system', false)])
|
|
->with(['mailAliases' => function ($q) use ($hasTerm, $needle) {
|
|
$q->where('is_system', false);
|
|
if ($hasTerm) {
|
|
$q->where(fn($x) => $x
|
|
->where('local', 'like', $needle)
|
|
->orWhere('destination', 'like', $needle)
|
|
);
|
|
}
|
|
$q->orderBy('local');
|
|
}])
|
|
->orderBy('domain')
|
|
->get();
|
|
|
|
if ($hasTerm) {
|
|
$lower = Str::lower($term);
|
|
foreach ($domains as $d) {
|
|
if (Str::contains(Str::lower($d->domain), $lower)) {
|
|
$d->setRelation('mailAliases', $d->mailAliases()
|
|
->where('is_system', false)
|
|
->orderBy('local')
|
|
->get()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$totalAliases = $domains->sum('aliases_count');
|
|
|
|
return view('livewire.ui.nx.mail.alias-list', [
|
|
'domains' => $domains,
|
|
'totalAliases' => $totalAliases,
|
|
]);
|
|
}
|
|
}
|