@php
$authenticatedUser = auth()->user();
$isCustomerUser = $authenticatedUser?->hasRole('customer') ?? false;
$isPartnerUser = $authenticatedUser?->hasRole('partner') ?? false;
$isSuperAdminUser = $authenticatedUser?->hasRole('super_admin') ?? false;
$isAdminUser = $isSuperAdminUser || ($authenticatedUser?->hasRole('admin') ?? false);
$isStaffUser = ! $isAdminUser
&& ($authenticatedUser?->hasPermission('submission.read.assigned_operational') ?? false);
$isGraderUser = $authenticatedUser?->hasPermission('grading.session.claim') ?? false;
$isOperationalPortalUser = $isAdminUser || $isStaffUser || $isGraderUser;
$isPortalArea = request()->routeIs('portal.*');
// Build the nav items once so desktop and the mobile menu
// render from the same source (stays neatly in sync).
// Nav items whose route isn't registered yet (e.g. a not-yet
// deployed route file / stale route cache) are safely skipped
// instead of throwing a 500.
$navItems = [];
$addNav = function (string $label, ?string $url, bool $active, ?string $routeName = null) use (&$navItems): void {
if ($routeName !== null && ! \Illuminate\Support\Facades\Route::has($routeName)) {
return;
}
if ($url === null || $url === '') {
return;
}
$navItems[] = ['label' => $label, 'url' => $url, 'active' => $active];
};
$portalNavGroups = [];
$addPortalNav = function (string $group, string $label, string $routeName, string $activePattern) use (&$portalNavGroups): void {
if (! \Illuminate\Support\Facades\Route::has($routeName)) {
return;
}
$portalNavGroups[$group][] = [
'label' => $label,
'url' => route($routeName),
'active' => request()->routeIs($activePattern),
];
};
if ($isPortalArea && $isAdminUser) {
$addPortalNav('Overview', 'Admin home', 'portal.admin', 'portal.admin');
if ($authenticatedUser?->hasPermission('submission.read.assigned_operational')) {
$addPortalNav('Overview', 'Orders', 'portal.admin.submitted-orders', 'portal.admin.submitted-orders');
}
if ($authenticatedUser?->hasPermission('grading.queue.read')) {
$addPortalNav('Work queues', 'Grading oversight', 'portal.admin.grading-oversight', 'portal.admin.grading-oversight');
$addPortalNav('Work queues', 'Grader dashboard', 'portal.staff.grading.dashboard', 'portal.staff.grading.dashboard');
}
if ($authenticatedUser?->hasPermission('certificate.read.internal')) {
$addPortalNav('Work queues', 'Certification queue', 'portal.staff.certification.index', 'portal.staff.certification.*');
}
if ($authenticatedUser?->hasPermission('label.queue.read')) {
$addPortalNav('Work queues', 'Label queue', 'portal.staff.labels.index', 'portal.staff.labels.*');
}
if ($authenticatedUser?->hasPermission('dispatch.queue.read')) {
$addPortalNav('Work queues', 'Dispatch', 'portal.staff.dispatch.index', 'portal.staff.dispatch.*');
}
if ($authenticatedUser?->hasAnyPermission(['catalog.manage', 'catalog.view.grader'])) {
$addPortalNav('Catalogue & content', 'Card catalogue', 'portal.admin.catalog.index', 'portal.admin.catalog.*');
if ($authenticatedUser?->hasPermission('catalog.manage')) {
$addPortalNav('Catalogue & content', 'Languages & print names', 'portal.admin.catalog.language-print-names.index', 'portal.admin.catalog.language-print-names.*');
}
}
$addPortalNav('Catalogue & content', 'Label designer', 'portal.admin.label-layouts.index', 'portal.admin.label-layouts.*');
if ($authenticatedUser?->hasPermission('cms.page.read')) {
$addPortalNav('Catalogue & content', 'Content manager', 'portal.staff.content.index', 'portal.staff.content.*');
}
if ($authenticatedUser?->hasPermission('admin.system.config.manage')) {
$addPortalNav('Administration', 'Sales', 'portal.admin.sales.index', 'portal.admin.sales.*');
if (\Illuminate\Support\Facades\Route::has('portal.admin.partner-pricing.index')) {
$addPortalNav('Administration', 'Partner pricing', 'portal.admin.partner-pricing.index', 'portal.admin.partner-pricing.*');
}
}
if ($authenticatedUser?->hasRole('admin') || $authenticatedUser?->hasRole('super_admin')) {
$addPortalNav('Administration', 'Email designer', 'portal.admin.email-templates.index', 'portal.admin.email-templates.*');
}
if ($authenticatedUser?->hasPermission('admin.user.read')) {
$addPortalNav('Administration', 'User control', 'portal.admin.user-control', 'portal.admin.user-control*');
$addPortalNav('Administration', 'Reviews', 'portal.admin.reviews.index', 'portal.admin.reviews.*');
$addPortalNav('Administration', 'GG Points', 'portal.admin.points-store.index', 'portal.admin.points-store.*');
$addPortalNav('Administration', 'Discount codes', 'portal.admin.discount-codes.index', 'portal.admin.discount-codes.*');
}
if ($authenticatedUser?->hasPermission('partner.webhook.admin')) {
$addPortalNav('Administration', 'Partner webhooks', 'portal.admin.webhooks.index', 'portal.admin.webhooks.*');
}
if ($authenticatedUser?->hasPermission('cache.manage')) {
$addPortalNav('Administration', 'Cache', 'portal.admin.cache.index', 'portal.admin.cache.*');
}
if ($authenticatedUser?->hasPermission('audit.read.security')) {
$addPortalNav('Administration', 'Operational logs', 'portal.admin.observability.index', 'portal.admin.observability.*');
}
if ($authenticatedUser?->hasPermission('admin.partner.api_credential.manage')) {
$addPortalNav('Administration', 'Create partner API', 'portal.admin.partner-api.create', 'portal.admin.partner-api.*');
}
if ($authenticatedUser?->