File: /home/marketing.cfbon.ru/public_html/app/Services/AdminMenuBuilder.php
<?php
namespace App\Services;
use App\Enums\UserRole;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Str;
class AdminMenuBuilder
{
private array $menu = [
[
'title' => 'Программа лояльности',
'is_open' => false,
'child' => [
[
'title' => 'Баллы',
'route' => 'loyalty.scores.index',
'icon' => 'bi-coin',
'is_active' => false,
],
[
'title' => 'Пуши',
'route' => 'loyalty.push.index',
'icon' => 'bi-bell',
'is_active' => false,
],
],
],
[
'title' => 'Акции',
'route' => 'promotions.index',
'is_active' => false,
],
[
'title' => 'Профиль клиента',
'route' => 'profile.index',
'is_active' => false,
],
// [
// 'title' => 'Главная страница сайта',
// 'is_open' => false,
// 'child' => [
// [
// 'title' => 'Фото',
// 'route' => 'site.photo-gallery.index',
// 'icon' => 'bi-images',
// 'is_active' => false,
// ],
// ],
// ],
[
'title' => 'Фото на сайте',
'route' => 'site.photo-gallery.index',
'is_active' => false,
],
[
'title' => 'Меню',
'is_open' => false,
'child' => [
[
'title' => 'Товары',
'route' => 'site.menu.products.index',
'icon' => 'bi-list-columns',
'is_active' => false,
],
[
'title' => 'Категории меню',
'route' => 'site.menu.categories.index',
'icon' => 'bi-bookmarks',
'is_active' => false,
],
[
'title' => 'Объемы',
'route' => 'site.menu.volumes.index',
'icon' => 'bi-cup-hot',
'is_active' => false,
],
],
],
[
'title' => 'Кофейни на картах',
'route' => 'coffee-shops.index',
'is_active' => false,
],
[
'title' => 'Админы',
'route' => 'admin-user.index',
'is_active' => false,
'userRole' => UserRole::ADMIN->value,
],
];
public function getMenu(): Collection
{
$currentRoute = '/' . Route::getFacadeRoot()->current()->uri();
return collect($this->menu)->filter(function ($item) {
if (isset($item['userRole'])) {
$role = UserRole::tryFrom($item['userRole']);
if (!$role || !Gate::allows($role)) {
return false;
}
}
return true;
})->map(function ($item) use ($currentRoute) {
if (isset($item['child'])) {
foreach ($item['child'] as &$child) {
if (Str::startsWith($currentRoute, route($child['route'], [], false))) {
$child['is_active'] = true;
$item['is_open'] = true;
}
}
return $item;
}
if (Str::startsWith($currentRoute, route($item['route'], [], false))) $item['is_active'] = true;
return $item;
});
}
}