136 lines
5.1 KiB
PHP
136 lines
5.1 KiB
PHP
@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) }}
|