125 lines
5.0 KiB
PHP
Executable File
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) }}
|