3
0
mirror of https://github.com/snipe/snipe-it.git synced 2026-08-18 11:15:42 +00:00
Files
snipe-it/app/Livewire/AlertMenu.php
2026-07-27 14:06:52 +01:00

67 lines
2.6 KiB
PHP

<?php
namespace App\Livewire;
use App\Helpers\Helper;
use Illuminate\View\View;
use Livewire\Attributes\Lazy;
use Livewire\Component;
/**
* Top-nav alert bell. Wraps the old blade/alert-menu.blade.php partial so
* the low-inventory + deprecation queries no longer block first-paint.
*
* `#[Lazy]` makes the component render a lightweight placeholder on the
* initial page load, then Livewire fires a second XHR to hydrate the
* real body — so `Helper::checkLowInventory()` and
* `Helper::deprecationCheck()` (both cached at the helper layer with
* observer-driven invalidation) never sit on the critical render path.
*
* The setting-gate lives on the tag in layouts/default.blade.php:
* `@if ($snipeSettings->show_alerts_in_menu == '1') <livewire:alert-menu />`
* so nothing about this component runs when the operator turned the
* bell off.
*/
#[Lazy]
class AlertMenu extends Component
{
public function placeholder(): string
{
// Reserve the same visual footprint as the loaded bell so the
// top-nav doesn't shift when the real component swaps in. The
// hidden label reserves badge width so hydration with alerts
// does not push the surrounding nav items sideways. Kept in
// sync with the same-shape hidden-label in the loaded view
// (livewire/alert-menu.blade.php) so the "no alerts" state also
// preserves the reserved width.
// Match the loaded view's markup exactly — same icon, same
// sr-only span position, same label markup with no surrounding
// whitespace. Any inline-element width difference between the
// placeholder and the loaded state translates directly into a
// top-nav layout shift on hydration.
$srOnly = trans('general.alerts');
return <<<HTML
<li class="dropdown tasks-menu" aria-busy="true">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="far fa-flag" aria-hidden="true"></i>
<span class="sr-only">{$srOnly}</span>
<span class="label label-danger" aria-hidden="true" style="visibility: hidden">0</span>
</a>
</li>
HTML;
}
public function render(): View
{
$alert_items = Helper::checkLowInventory();
$deprecations = Helper::deprecationCheck();
return view('livewire.alert-menu', [
'alert_items' => $alert_items,
'deprecations' => $deprecations,
'alert_count' => count($alert_items) + count($deprecations),
]);
}
}