199 lines
9.0 KiB
PHP
199 lines
9.0 KiB
PHP
<div>
|
|
@php
|
|
$navigation = filament()->getNavigation();
|
|
$isRtl = __('filament-panels::layout.direction') === 'rtl';
|
|
$isSidebarCollapsibleOnDesktop = filament()->isSidebarCollapsibleOnDesktop();
|
|
$isSidebarFullyCollapsibleOnDesktop = filament()->isSidebarFullyCollapsibleOnDesktop();
|
|
$hasNavigation = filament()->hasNavigation();
|
|
$hasTopbar = filament()->hasTopbar();
|
|
@endphp
|
|
|
|
{{-- format-ignore-start --}}
|
|
<aside
|
|
x-data="{}"
|
|
@if ($isSidebarCollapsibleOnDesktop || $isSidebarFullyCollapsibleOnDesktop)
|
|
x-cloak
|
|
@else
|
|
x-cloak="-lg"
|
|
@endif
|
|
x-bind:class="{ 'fi-sidebar-open': $store.sidebar.isOpen }"
|
|
class="fi-sidebar fi-main-sidebar"
|
|
>
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_START) }}
|
|
|
|
<div class="fi-sidebar-header-ctn">
|
|
<header
|
|
class="fi-sidebar-header"
|
|
>
|
|
@if ((! $hasTopbar) && $isSidebarCollapsibleOnDesktop)
|
|
<x-filament::icon-button
|
|
color="gray"
|
|
:icon="$isRtl ? \Filament\Support\Icons\Heroicon::OutlinedChevronLeft : \Filament\Support\Icons\Heroicon::OutlinedChevronRight"
|
|
{{-- @deprecated Use `PanelsIconAlias::SIDEBAR_EXPAND_BUTTON_RTL` instead of `PanelsIconAlias::SIDEBAR_EXPAND_BUTTON` for RTL. --}}
|
|
:icon-alias="
|
|
$isRtl
|
|
? [
|
|
\Filament\View\PanelsIconAlias::SIDEBAR_EXPAND_BUTTON_RTL,
|
|
\Filament\View\PanelsIconAlias::SIDEBAR_EXPAND_BUTTON,
|
|
]
|
|
: \Filament\View\PanelsIconAlias::SIDEBAR_EXPAND_BUTTON
|
|
"
|
|
icon-size="lg"
|
|
:label="__('filament-panels::layout.actions.sidebar.expand.label')"
|
|
x-cloak
|
|
x-data="{}"
|
|
x-on:click="$store.sidebar.open()"
|
|
x-show="! $store.sidebar.isOpen"
|
|
class="fi-sidebar-open-collapse-sidebar-btn"
|
|
/>
|
|
@endif
|
|
|
|
@if ((! $hasTopbar) && ($isSidebarCollapsibleOnDesktop || $isSidebarFullyCollapsibleOnDesktop))
|
|
<x-filament::icon-button
|
|
color="gray"
|
|
:icon="$isRtl ? \Filament\Support\Icons\Heroicon::OutlinedChevronRight : \Filament\Support\Icons\Heroicon::OutlinedChevronLeft"
|
|
{{-- @deprecated Use `PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON_RTL` instead of `PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON` for RTL. --}}
|
|
:icon-alias="
|
|
$isRtl
|
|
? [
|
|
\Filament\View\PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON_RTL,
|
|
\Filament\View\PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON,
|
|
]
|
|
: \Filament\View\PanelsIconAlias::SIDEBAR_COLLAPSE_BUTTON
|
|
"
|
|
icon-size="lg"
|
|
:label="__('filament-panels::layout.actions.sidebar.collapse.label')"
|
|
x-cloak
|
|
x-data="{}"
|
|
x-on:click="$store.sidebar.close()"
|
|
x-show="$store.sidebar.isOpen"
|
|
class="fi-sidebar-close-collapse-sidebar-btn"
|
|
/>
|
|
@endif
|
|
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_LOGO_BEFORE) }}
|
|
|
|
<div x-show="$store.sidebar.isOpen" class="fi-sidebar-header-logo-ctn">
|
|
@if ($homeUrl = filament()->getHomeUrl())
|
|
<a {{ \Filament\Support\generate_href_html($homeUrl) }}>
|
|
<x-filament-panels::logo />
|
|
</a>
|
|
@else
|
|
<x-filament-panels::logo />
|
|
@endif
|
|
</div>
|
|
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_LOGO_AFTER) }}
|
|
</header>
|
|
</div>
|
|
|
|
@if (filament()->hasTenancy() && filament()->hasTenantMenu())
|
|
<x-filament-panels::tenant-menu />
|
|
@endif
|
|
|
|
@if (filament()->isGlobalSearchEnabled() && filament()->getGlobalSearchPosition() === \Filament\Enums\GlobalSearchPosition::Sidebar)
|
|
<div
|
|
@if ($isSidebarCollapsibleOnDesktop || $isSidebarFullyCollapsibleOnDesktop)
|
|
x-show="$store.sidebar.isOpen"
|
|
@endif
|
|
>
|
|
@livewire(Filament\Livewire\GlobalSearch::class)
|
|
</div>
|
|
@endif
|
|
|
|
<nav class="fi-sidebar-nav">
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_NAV_START) }}
|
|
|
|
<ul class="fi-sidebar-nav-groups">
|
|
@foreach ($navigation as $group)
|
|
@php
|
|
$isGroupActive = $group->isActive();
|
|
$isGroupCollapsible = $group->isCollapsible();
|
|
$groupIcon = $group->getIcon();
|
|
$groupItems = $group->getItems();
|
|
$groupLabel = $group->getLabel();
|
|
$groupExtraSidebarAttributeBag = $group->getExtraSidebarAttributeBag();
|
|
@endphp
|
|
|
|
<x-filament-panels::sidebar.group
|
|
:active="$isGroupActive"
|
|
:collapsible="$isGroupCollapsible"
|
|
:icon="$groupIcon"
|
|
:items="$groupItems"
|
|
:label="$groupLabel"
|
|
:attributes="\Filament\Support\prepare_inherited_attributes($groupExtraSidebarAttributeBag)"
|
|
/>
|
|
@endforeach
|
|
</ul>
|
|
|
|
<script>
|
|
var collapsedGroups = JSON.parse(
|
|
localStorage.getItem('collapsedGroups'),
|
|
)
|
|
|
|
if (collapsedGroups === null || collapsedGroups === 'null') {
|
|
localStorage.setItem(
|
|
'collapsedGroups',
|
|
JSON.stringify(@js(
|
|
collect($navigation)
|
|
->filter(fn (\Filament\Navigation\NavigationGroup $group): bool => $group->isCollapsed())
|
|
->map(fn (\Filament\Navigation\NavigationGroup $group): string => $group->getLabel())
|
|
->values()
|
|
->all()
|
|
)),
|
|
)
|
|
}
|
|
|
|
collapsedGroups = JSON.parse(
|
|
localStorage.getItem('collapsedGroups'),
|
|
)
|
|
|
|
document
|
|
.querySelectorAll('.fi-sidebar-group')
|
|
.forEach((group) => {
|
|
if (
|
|
!collapsedGroups.includes(group.dataset.groupLabel)
|
|
) {
|
|
return
|
|
}
|
|
|
|
// Alpine.js loads too slow, so attempt to hide a
|
|
// collapsed sidebar group earlier.
|
|
group.querySelector(
|
|
'.fi-sidebar-group-items',
|
|
).style.display = 'none'
|
|
group.classList.add('fi-collapsed')
|
|
})
|
|
</script>
|
|
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_NAV_END) }}
|
|
</nav>
|
|
|
|
@php
|
|
$isAuthenticated = filament()->auth()->check();
|
|
$hasDatabaseNotificationsInSidebar = filament()->hasDatabaseNotifications() && filament()->getDatabaseNotificationsPosition() === \Filament\Enums\DatabaseNotificationsPosition::Sidebar;
|
|
$hasUserMenuInSidebar = filament()->hasUserMenu() && filament()->getUserMenuPosition() === \Filament\Enums\UserMenuPosition::Sidebar;
|
|
$shouldRenderFooter = $isAuthenticated && ($hasDatabaseNotificationsInSidebar || $hasUserMenuInSidebar);
|
|
@endphp
|
|
|
|
@if ($shouldRenderFooter)
|
|
<div class="fi-sidebar-footer">
|
|
@if ($hasDatabaseNotificationsInSidebar)
|
|
@livewire(Filament\Livewire\DatabaseNotifications::class, [
|
|
'lazy' => filament()->hasLazyLoadedDatabaseNotifications(),
|
|
])
|
|
@endif
|
|
|
|
@if ($hasUserMenuInSidebar)
|
|
<x-filament-panels::user-menu />
|
|
@endif
|
|
</div>
|
|
@endif
|
|
|
|
{{ \Filament\Support\Facades\FilamentView::renderHook(\Filament\View\PanelsRenderHook::SIDEBAR_FOOTER) }}
|
|
</aside>
|
|
{{-- format-ignore-end --}}
|
|
|
|
<x-filament-actions::modals />
|
|
</div>
|