File: D:/HostingSpaces/farmfun/reserveren.farmfun.be/app/Komma/Kms/Composers/SidebarMenuComposer.php
<?php
namespace App\Komma\Kms\Composers;
/**
* @author Komma <info@komma.pro>
* @copyright (c) 2012-2016, Komma
*/
use App\Komma\Kms\Menu\Item;
use App\Komma\Kms\Menu\KmsMenu;
use App\Komma\LocationProducts\Models\LocationProduct;
use App\Komma\Locations\Kms\LocationService;
use App\Komma\Locations\Models\Location;
use App\Komma\Pages\Models\Page;
use App\Komma\Posts\Models\Post;
use App\Komma\ProductCategories\Models\ProductCategory;
use App\Komma\Products\Models\Product;
use App\Komma\Questions\Models\Question;
use App\Komma\Sites\Models\Site;
use App\Komma\Sites\SiteServiceInterface;
use App\Komma\Users\Models\KmsUserRole;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
class SidebarMenuComposer
{
public function compose($view)
{
$viewData = $view->getData();
$currentSectionSlug = isset($viewData['slug']) ? $viewData['slug'] : $this->getCurrentSectionSlug();
if (isset($viewData['differ_slug'])) {
$currentSectionSlug = $viewData['differ_slug'];
}
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.dashboard'))
->setUrl(route('dashboard.index'))
->setSlug('dashboard')
);
KmsMenu::addItem((new Item)
->setName(__('kms/sidebarMenu.kms_users'))
->setUrl(route('kms_users.index'))
->setSlug('kms_users')
);
$locationService = app()->make(LocationService::class);
isset($viewData['location']) ? $viewLocation = $viewData['location'] : $viewLocation = null;
$locationPlanSubItems = array_merge([
(new Item())
->setName(__('kms/SidebarMenu.reservations'))
->setUrl(route('reservations.index'))
->setSlug('reservations'),
(new Item())
->setName(__('kms/SidebarMenu.reservations_archive'))
->setUrl(route('reservations.archive'))
->setSlug('reservations_archive'),
], $locationService->getSidebarPlanningItems($viewLocation));
$locationPlanSubItems[] = (new Item())
->setName(__('kms/sidebarMenu.block_outs'))
->setSlug('calendarblockouts')
->setUrl(route('calendarblockouts.index'));
$locationPlanSubItems[] = (new Item())
->setName(__('kms/sidebarMenu.calendar_notes'))
->setSlug('calendarnotes')
->setUrl(route('calendarnotes.index'));
KmsMenu::addItem((new Item())
->setName(__('kms/sidebarMenu.planning'))
->setSlug('planning')
->setSubItems($locationPlanSubItems)
);
if (auth()->user()->can('index', Product::class)) {
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.products'))
->setUrl(route('products.index'))
->setSlug('products')
);
}
if (auth()->user()->can('index', ProductCategory::class)) {
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.productCategories'))
->setUrl(route('productcategories.index'))
->setSlug('productcategories')
);
}
$locationSubItems = [];
if (auth()->user()->can('index', Location::class)) {
$locationSubItems[] = (new Item())
->setName(__('kms/SidebarMenu.locations'))
->setUrl(route('locations.index'))
->setSlug('locations');
}
if (auth()->user()->can('index', LocationProduct::class)) {
$locationSubItems[] = (new Item())
->setName(__('kms/SidebarMenu.locationProducts'))
->setUrl(route('locationproducts.index'))
->setSlug('locationproducts');
}
KmsMenu::addItem((new Item())
->setName(__('kms/sidebarMenu.locations_dropdown'))
->setSlugs(['locations', 'locationproducts'])
->setSubItems($locationSubItems)
);
KmsMenu::addItem((new Item())
->setSlug('vacancies')
->setUrl(route('vacancies.index'))
->setName(__('kms/sidebarMenu.vacancies')));
if (auth()->user()->can('index', Question::class)) {
KmsMenu::addItem((new Item())
->setName(__('kms/sidebarMenu.questions_dropdown'))
->setSlugs(['questions', 'questioncategories'])
->setSubItems([
(new Item())
->setName(__('kms/SidebarMenu.questions'))
->setUrl(route('questions.index'))
->setSlug('questions'),
(new Item())
->setName(__('kms/SidebarMenu.questionCategories'))
->setUrl(route('questioncategories.index'))
->setSlug('questioncategories'),
])
);
}
if (auth()->user()->can('index', Post::class)) {
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.posts'))
->setUrl(route('posts.index'))
->setSlug('posts')
);
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.export'))
->setUrl(route('export.index'))
->setSlug('export')
);
}
if (Auth::user()->isAtleast(KmsUserRole::SuperAdmin)) {
KmsMenu::addItem((new Item())
->setName(__('kms/SidebarMenu.searchAmountOfPersons'))
->setUrl(route('searchamountofpersons.index'))
->setSlug('searchamountofpersons')
);
}
//Get the current site.
/** @var SiteServiceInterface $siteService */
$siteService = app(SiteServiceInterface::class);
$sites = $siteService->getSites();
$currentSite = $siteService->getCurrentSite();
//Create site menu items
//If there is only one, merge the siteSub items, so it is not a sub menu
if (! config('app.multipleSites') || $sites->count() == 1) {
KmsMenu::addItems($this->getSiteSubItems($sites->first()));
} //If there are multiple sites, loop and ad these as an sub menu
else {
$siteMenus = [];
foreach ($sites as $site) {
/** @var Site $site */
//We put all site items in a submenu for a site except for the default site.
if ($site->exists) {
$siteMenus[] = (new Item())
->setName($site->name)
->setSlugs([$site->slug])
->setSubItems($this->getSiteSubItems($site));
}
}
KmsMenu::addItems($siteMenus);
}
//Define logic that determines when a menu items is active or not.
KmsMenu::itemActiveWhen(function (Item $item) use ($currentSectionSlug, $currentSite) {
if (! $item->hasSlugs()) {
return false;
}
if ($item->isActive()) {
return true;
}
//The first slug is the section slug. The second slug IF PRESENT, is the site slug. Use them to determine when to activate a menu item.
$active = false;
if (! $item->hasActiveSubItems()) {
if (count($item->getSlugs()) >= 2) {
//We have a site slug and a section slug in some cases
$active = ($item->getSlugs()[0] == $currentSectionSlug) && ($item->getSlugs()[1] == $currentSite->slug);
//In other cases we have twice a section slug.
if (! $active) {
foreach ($item->getSlugs() as $slug) {
$active = $currentSectionSlug == $slug;
}
}
} else {
//We only have the section slug
$active = ($item->getSlugs()[0] == $currentSectionSlug);
}
} else {
$active = true;
}
return $active;
});
//Return the menu structure items and pass them into the view.
$menuStructure = KmsMenu::getItems();
$view->with('menuStructure', $menuStructure);
}
protected function getCurrentSectionSlug()
{
$route = explode('/', Route::current()->uri());
if (Route::current()->parameter('site')) {
return $route[2];
}
return isset($route[1]) ? $route[1] : null;
}
/**
* This will return the site specific items
*
* @param Site $site
* @return array
*/
protected function getSiteSubItems(Site $site)
{
$items = [];
if (auth()->user()->can('index', Page::class)) {
$items[] = (new Item())
->setName(__('kms/sidebarMenu.pages'))
->setUrl(route('pages.index', ['siteSlug' => $site->slug]))
->setSlugs(['pages', $site->slug]);
}
return $items;
}
}