<?php
namespace Webkul\UVDesk\CoreFrameworkBundle\Dashboard;
use Twig\Environment as TwigEnvironment;
use Symfony\Component\HttpFoundation\RequestStack;
use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
use Webkul\UVDesk\CoreFrameworkBundle\Framework\ExtendableComponentInterface;
use Webkul\UVDesk\CoreFrameworkBundle\Dashboard\Segments\PanelSidebarInterface;
use Webkul\UVDesk\CoreFrameworkBundle\Dashboard\Segments\PanelSidebarItemInterface;
class AsideTemplate implements ExtendableComponentInterface
{
CONST SECTION_TEMPLATE = '<div class="uv-brick"><div class="uv-brick-head"><h6>[[ TITLE ]]</h6><p>[[ DESCRIPTION ]]</p></div><div class="uv-brick-section">[[ COLLECTION ]]</div></div>';
CONST SECTION_ITEM_TEMPLATE = '<a href="[[ PATH ]]"><div class="uv-brick-container"><div class="uv-brick-icon">[[ SVG ]]</div><p>[[ TITLE ]]</p></div></a>';
private $panelSidebars = [];
private $panelSidebarItems = [];
private $isOrganized = false;
public function __construct(RequestStack $requestStack, TwigEnvironment $twig, UserService $userService)
{
$this->twig = $twig;
$this->userService = $userService;
$this->requestStack = $requestStack;
}
public function addPanelSidebar(PanelSidebarInterface $panelSidebar, $tags = [])
{
$this->panelSidebars[get_class($panelSidebar)] = $panelSidebar;
}
public function addPanelSidebarItem(PanelSidebarItemInterface $panelSidebarItem, $tags = [])
{
$this->panelSidebarItems[get_class($panelSidebarItem)] = $panelSidebarItem;
}
public function renderSidebar($sidebarReference)
{
$sidebar = [
'title' => null,
'collection' => [],
];
if (!empty($this->panelSidebars[$sidebarReference])) {
$sidebar['title'] = $sidebarReference::getTitle();
$route = $this->requestStack->getCurrentRequest()->get('_route');
foreach ($this->panelSidebarItems as $itemReference => $item) {
if ($item::getSidebarReferenceId() == $sidebarReference) {
$supportedRoutes = array_unique(array_merge((array) $item::getRouteName(), $item::getSupportedRoutes()));
if (null == $item::getRoles()) {
$sidebar['collection'][] = [
'title' => $item::getTitle(),
'routeName' => $item::getRouteName(),
'isActive' => in_array($route, $supportedRoutes),
];
} else {
foreach ($item::getRoles() as $requiredPermission) {
if ($this->userService->isAccessAuthorized($requiredPermission)) {
$sidebar['collection'][] = [
'title' => $item::getTitle(),
'routeName' => $item::getRouteName(),
'isActive' => in_array($route, $supportedRoutes),
];
break;
}
}
}
}
}
} else {
$sidebar['title'] = $sidebarReference::getTitle();
$route = $this->requestStack->getCurrentRequest()->get('_route');
foreach ($this->panelSidebarItems as $itemReference => $item) {
if ($item::getSidebarReferenceId() == $sidebarReference) {
$supportedRoutes = array_unique(array_merge((array) $item::getRouteName(), $item::getSupportedRoutes()));
if (null == $item::getRoles()) {
$sidebar['collection'][] = [
'title' => $item::getTitle(),
'routeName' => $item::getRouteName(),
'isActive' => in_array($route, $supportedRoutes),
];
} else {
foreach ($item::getRoles() as $requiredPermission) {
if ($this->userService->isAccessAuthorized($requiredPermission)) {
$sidebar['collection'][] = [
'title' => $item::getTitle(),
'routeName' => $item::getRouteName(),
'isActive' => in_array($route, $supportedRoutes),
];
break;
}
}
}
}
}
}
// Sort sidebar items alphabatically
usort($sidebar['collection'], function ($item_1, $item_2) {
return strcasecmp($item_1['title'], $item_2['title']);
});
return $this->twig->render('@UVDeskCoreFramework/Templates/aside.html.twig', [ 'sidebar' => $sidebar ]);
}
}