HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/farmfun.komma.pro/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;
    }
}