- Triggers (Admin > Wyzwalacze): event-driven rules that fire immediately on a ticket lifecycle event (created/updated/status/priority/assignee/team/ category changed, new reply), with AND-conditions and ordered actions (set status/priority/team/assignee, send e-mail). Ships its own dedicated, freely add/edit/delete-able e-mail templates, kept separate from the fixed system templates. - Ticket watching: operators can star/"Obserwuj" any ticket to follow it regardless of assignment/team. - Real-time notification bell (private per-user broadcast channel, 30s fallback poll) with an opt-in in-tab browser push notification. - Per-user notification preferences (/settings/notifications): scope (mine/unassigned/watched/all) and e-mail toggle per event category. - Admin > Integracje: new tab for LDAP/AD + BookStack config, split out of Konfiguracja. - Operator queue: Podkategoria/Zespół/Utworzono columns (off by default). - Obserwuj button moved next to the auto-refresh countdown; trigger condition builder shows subcategory/zgłaszający as name dropdowns instead of raw IDs; /settings/notifications got a back link, full-width push card, and a bordered table container; admin panel tab and operator queue view now persist across a plain page refresh. - Docs: README/ARCHITECTURE/wiki updated for all of the above. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
59 lines
1.7 KiB
PHP
59 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Livewire\Attributes\Computed;
|
|
use Livewire\Attributes\On;
|
|
use Livewire\Component;
|
|
|
|
class NotificationBell extends Component
|
|
{
|
|
/**
|
|
* Fired by echo.js the moment a NotificationCreated broadcast arrives on
|
|
* this user's private channel — refreshes the badge/list instantly
|
|
* instead of waiting for the next 30s poll, which stays in place below
|
|
* as a fallback for dropped websocket connections.
|
|
*/
|
|
#[On('bell-notification-received')]
|
|
public function onBellNotification(): void
|
|
{
|
|
unset($this->notifications, $this->unreadCount);
|
|
}
|
|
|
|
/**
|
|
* Only unread — once a notification is read (clicked through, or via
|
|
* "mark all as read"), it disappears from the bell rather than staying
|
|
* listed dimmed. The full history still lives in the notifications
|
|
* table for anyone querying it directly, just not surfaced here.
|
|
*/
|
|
#[Computed]
|
|
public function notifications()
|
|
{
|
|
return Auth::user()->unreadNotifications()->latest()->limit(20)->get();
|
|
}
|
|
|
|
#[Computed]
|
|
public function unreadCount(): int
|
|
{
|
|
return Auth::user()->unreadNotifications()->count();
|
|
}
|
|
|
|
public function markAsRead(string $id): void
|
|
{
|
|
Auth::user()->notifications()->where('id', $id)->first()?->markAsRead();
|
|
unset($this->notifications, $this->unreadCount);
|
|
}
|
|
|
|
public function markAllAsRead(): void
|
|
{
|
|
Auth::user()->unreadNotifications->each->markAsRead();
|
|
unset($this->notifications, $this->unreadCount);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.notification-bell');
|
|
}
|
|
}
|