dispatch('$refresh'); } public function openMailboxCreate(int $domainId): void { $this->dispatch('openModal', component: 'ui.mail.modal.mailbox-create-modal', arguments: [ 'domainId' => $domainId, ]); } public function openMailboxEdit(int $mailUserId): void { $this->dispatch('openModal', component: 'ui.mail.modal.mailbox-edit-modal', arguments: [ $mailUserId, ]); } public function openMailboxDelete(int $mailUserId): void { $this->dispatch('openModal', component: 'ui.mail.modal.mailbox-delete-modal', arguments: [ $mailUserId, ]); } public function updateMailboxStats(): void { dispatch(fn() => Artisan::call('mail:update-stats')); $this->dispatch('$refresh'); $this->dispatch('toast', type: 'done', badge: 'Mailbox', title: 'Statistiken aktualisiert', text: 'Die Mailbox-Statistiken wurden aktualisiert.', duration: 5000, ); } 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('mailUsers', fn($u) => $u ->where('is_active', true) ->where('is_system', false) ->where('localpart', 'like', $needle) ); }); }) ->withCount(['mailUsers as mail_users_count' => fn($u) => $u ->where('is_active', true) ->where('is_system', false) ]) ->with(['mailUsers' => function ($q) use ($hasTerm, $needle) { $q->where('is_active', true)->where('is_system', false); if ($hasTerm) { $q->where('localpart', 'like', $needle); } $q->orderBy('localpart'); }]) ->orderBy('domain') ->get(); if ($hasTerm) { $lower = Str::lower($term); foreach ($domains as $d) { if (Str::contains(Str::lower($d->domain), $lower)) { $d->setRelation('mailUsers', $d->mailUsers() ->where('is_active', true) ->where('is_system', false) ->orderBy('localpart') ->get() ); } } } foreach ($domains as $d) { $prepared = []; $domainActive = (bool)($d->is_active ?? true); foreach ($d->mailUsers as $u) { $email = $u->email ?? null; $stats = $email ? (Setting::get("mailbox.{$email}", []) ?: []) : []; $usedBytes = (int)($stats['used_bytes'] ?? 0); $messageCount = (int)($stats['message_count'] ?? 0); $usedMiB = round($usedBytes / 1048576, 2); $quotaMiB = (int)($u->quota_mb ?? 0); $usage = $quotaMiB > 0 ? min(100, (int)round($usedBytes / ($quotaMiB * 1048576) * 100)) : 0; $mailboxActive = (bool)($u->is_active ?? true); $effective = $domainActive && $mailboxActive; $reason = null; if (!$effective) { $reason = !$domainActive ? 'Domain inaktiv' : 'Postfach inaktiv'; } $barClass = $usage > 85 ? 'mbx-bar-high' : ($usage > 60 ? 'mbx-bar-mid' : 'mbx-bar-low'); $prepared[] = [ 'id' => $u->id, 'localpart' => (string)$u->localpart, 'quota_mb' => $quotaMiB, 'used_mb' => $usedMiB, 'usage_percent' => $usage, 'bar_class' => $barClass, 'message_count' => $messageCount, 'is_active' => $mailboxActive, 'is_effective_active' => $effective, 'inactive_reason' => $reason, 'last_login' => $u->last_login_at?->diffForHumans() ?? '—', ]; } $d->prepared_mailboxes = $prepared; } $totalMailboxes = $domains->sum('mail_users_count'); return view('livewire.ui.v2.mail.mailbox-list', [ 'domains' => $domains, 'totalMailboxes'=> $totalMailboxes, ]); } }