WIP: Implement menu/navigation

This commit is contained in:
Björn Fromme
2023-09-25 18:02:27 +02:00
parent c3c2e1ae2d
commit 3e0353c79b
24 changed files with 475 additions and 92 deletions
@@ -10,7 +10,7 @@ use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Contracts\Translation\TranslatorInterface;
class MenuBuilder
abstract class AbstractMenuBuilder
{
public function __construct(
protected FactoryInterface $factory,
@@ -20,42 +20,26 @@ class MenuBuilder
) {
}
private function assertMobile(array $options): bool
protected function assertMobile(array $options): bool
{
return isset($options['mobile']) && true === (bool) $options['mobile'];
}
private function createRootElement(bool $isMobile): ItemInterface
protected function createRootElement(string $class): ItemInterface
{
return $this
->factory->createItem('root')
->setChildrenAttribute('class', 'menu'.($isMobile ? ' menu--mobile' : ''))
->setChildrenAttribute('class', $class)
;
}
private function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
protected function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
{
return [$parameter => $this->requestStack->getMainRequest()->get($parameter, $default)];
}
public function createMainMenu(array $options): ItemInterface
protected function addLogoutItem(ItemInterface $menu, bool $isMobile = false): void
{
/** @var User $user */
$user = $this->security->getUser();
$userLabel = $user->getUserIdentifier();
$isMobile = $this->assertMobile($options);
$menu = $this->createRootElement($isMobile);
if ($this->security->isGranted('ROLE_TEAMER')) {
$menu
->addChild('Profil', ['route' => 'app_teamer_profile'])
->setLinkAttribute('title', 'Benutzer: '.$userLabel)
->setExtra('icon', 'user')
->setExtra('icon_only', false === $isMobile)
;
}
$token = $this->security->getToken();
if ($token instanceof SwitchUserToken) {
@@ -85,6 +69,5 @@ class MenuBuilder
;
}
return $menu;
}
}
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace App\Menu;
use Knp\Menu\ItemInterface;
class AdminMenuBuilder extends AbstractMenuBuilder
{
public function createHeaderMenu(array $options): ItemInterface
{
$menu = $this->createRootElement();
$this->addLogoutItem($menu);
return $menu;
}
public function createMainMenu(array $options): ItemInterface
{
$menu = $this->createRootElement();
return $menu;
}
public function createMobileMenu(array $options): ItemInterface
{
$menu = $this->createRootElement(true);
$this->addLogoutItem($menu, true);
return $menu;
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Menu;
use Knp\Menu\ItemInterface;
class ManagerMenuBuilder extends AbstractMenuBuilder
{
public function createHeaderMenu(array $options): ItemInterface
{
$menu = $this->createRootElement();
$this->addLogoutItem($menu);
return $menu;
}
public function createMainMenu(array $options): ItemInterface
{
$menu = $this->createRootElement();
return $menu;
}
public function createMobileMenu(array $options): ItemInterface
{
$menu = $this->createRootElement(true);
$this->addLogoutItem($menu, true);
return $menu;
}
}
+92
View File
@@ -0,0 +1,92 @@
<?php
namespace App\Menu;
use Knp\Menu\ItemInterface;
class TeamerMenuBuilder extends AbstractMenuBuilder
{
public function createHeaderMenu(array $options): ItemInterface
{
$menu = $this->createRootElement('menu menu--header');
$this->addLogoutItem($menu);
return $menu;
}
public function createMainMenu(array $options): ItemInterface
{
$menu = $this->createRootElement('menu menu--main');
$menu
->addChild('Einsatzübersicht', ['route' => 'app_teamer_disposition_index'])
->setLinkAttributes([
'title' => 'Einsatzübersicht',
'class' => 'icon-link',
])
->setExtra('icon', 'calendar')
->setExtra('icon_only', false)
;
$profileMenu = $menu
->addChild('Mein Profil')
->setExtra('icon', 'user')
->setExtra('icon_only', false)
;
$profileMenu
->addChild('Stammdaten und Foto', ['route' => 'app_teamer_profile_index'])
->setLinkAttributes([
'title' => 'Mein Profil',
])
;
$profileMenu
->addChild('Jobprofile & Skills', ['route' => 'app_teamer_profile_skills'])
->setLinkAttributes([
'title' => 'Jobprofile & Skills',
])
;
$profileMenu
->addChild('Meine Verfügbarkeit', ['route' => 'app_teamer_profile_availabilities'])
->setLinkAttributes([
'title' => 'Meine Verfügbarkeit',
])
;
$dispositionMenu = $menu
->addChild('Meine Einsätze')
->setExtra('icon', 'calendar')
->setExtra('icon_only', false)
;
$dispositionMenu
->addChild('Merkliste', ['route' => 'app_teamer_disposition_watchlist'])
->setLinkAttributes([
'title' => 'Merkliste',
])
;
return $menu;
}
public function createMobileMenu(array $options): ItemInterface
{
$menu = $this->createRootElement('menu menu--mobile');
$menu
->addChild('Profil', ['route' => 'app_teamer_profile_index'])
->setLinkAttributes([
'title' => 'Mein Profil',
'class' => 'icon-link',
])
->setExtra('icon', 'user')
->setExtra('icon_only', false)
;
$this->addLogoutItem($menu, true);
return $menu;
}
}