Files
2026-09-21 10:14:57 +01:00

125 lines
5.0 KiB
PHP
Executable File

@props([
'position' => null,
])
@php
use Filament\Actions\Action;
use Filament\Enums\UserMenuPosition;
use Illuminate\Support\Arr;
$user = filament()->auth()->user();
$items = $this->getUserMenuItems();
$itemsBeforeAndAfterThemeSwitcher = collect($items)
->groupBy(fn(Action $item): bool => $item->getSort() < 0, preserveKeys: true)
->all();
$itemsBeforeThemeSwitcher = $itemsBeforeAndAfterThemeSwitcher[true] ?? collect();
$itemsAfterThemeSwitcher = $itemsBeforeAndAfterThemeSwitcher[false] ?? collect();
$hasProfileHeader =
$itemsBeforeThemeSwitcher->has('profile') &&
blank(($item = Arr::first($itemsBeforeThemeSwitcher))->getUrl()) &&
!$item->hasAction();
if ($itemsBeforeThemeSwitcher->has('profile')) {
$itemsBeforeThemeSwitcher = $itemsBeforeThemeSwitcher->prepend(
$itemsBeforeThemeSwitcher->pull('profile'),
'profile',
);
}
$position ??= filament()->getUserMenuPosition();
$isSidebarCollapsibleOnDesktop = filament()->isSidebarCollapsibleOnDesktop();
@endphp
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_BEFORE) }}
<x-filament::dropdown :placement="$position === UserMenuPosition::Topbar ? 'bottom-end' : 'top-end'" :teleport="$position === UserMenuPosition::Topbar" :attributes="\Filament\Support\prepare_inherited_attributes($attributes)->class(['fi-user-menu'])">
<x-slot name="trigger">
@if ($position === UserMenuPosition::Topbar)
<button aria-label="{{ __('filament-panels::layout.actions.open_user_menu.label') }}" type="button"
class="fi-user-menu-trigger">
<x-filament-panels::avatar.user :user="$user" loading="lazy" />
</button>
@else
<button aria-label="{{ __('filament-panels::layout.actions.open_user_menu.label') }}" type="button"
class="fi-user-menu-trigger">
<x-filament-panels::avatar.user :user="$user" loading="lazy" />
<span @if ($isSidebarCollapsibleOnDesktop) x-show="$store.sidebar.isOpen" @endif
class="fi-user-menu-trigger-text">
{{ filament()->getUserName($user) }}
</span>
{{ \Filament\Support\generate_icon_html(
\Filament\Support\Icons\Heroicon::ChevronUp,
alias: \Filament\View\PanelsIconAlias::USER_MENU_TOGGLE_BUTTON,
attributes: new \Illuminate\View\ComponentAttributeBag([
'x-show' => $isSidebarCollapsibleOnDesktop ? '$store.sidebar.isOpen' : null,
]),
) }}
</button>
@endif
</x-slot>
@if ($hasProfileHeader)
@php
$item = $itemsBeforeThemeSwitcher['profile'];
$itemColor = $item->getColor();
$itemIcon = $item->getIcon();
unset($itemsBeforeThemeSwitcher['profile']);
@endphp
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_BEFORE) }}
<x-filament::dropdown.header :color="$itemColor" :icon="$itemIcon">
{{ $item->getLabel() }}
</x-filament::dropdown.header>
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_AFTER) }}
@endif
@if ($itemsBeforeThemeSwitcher->isNotEmpty())
<x-filament::dropdown.list>
@foreach ($itemsBeforeThemeSwitcher as $key => $item)
@if ($key === 'profile')
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_BEFORE) }}
{{ $item }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_AFTER) }}
@else
{{ $item }}
@endif
@endforeach
</x-filament::dropdown.list>
@endif
@if (filament()->hasDarkMode() && !filament()->hasDarkModeForced())
<x-filament::dropdown.list>
<x-filament-panels::theme-switcher />
</x-filament::dropdown.list>
@endif
@if ($itemsAfterThemeSwitcher->isNotEmpty())
<x-filament::dropdown.list>
@foreach ($itemsAfterThemeSwitcher as $key => $item)
@if ($key === 'profile')
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_BEFORE) }}
{{ $item }}
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_PROFILE_AFTER) }}
@else
{{ $item }}
@endif
@endforeach
</x-filament::dropdown.list>
@endif
</x-filament::dropdown>
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::USER_MENU_AFTER) }}