From 0705c265132ddb0f4275a172b2540bfae2579117 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Thu, 7 Nov 2019 11:19:10 +0100 Subject: [PATCH] highlight menus on sub-pages (#1220) --- src/EventSubscriber/MenuBuilderSubscriber.php | 8 +++ src/EventSubscriber/MenuSubscriber.php | 64 ++++++++----------- src/Utils/MenuItemModel.php | 36 +++++++++++ 3 files changed, 69 insertions(+), 39 deletions(-) create mode 100644 src/Utils/MenuItemModel.php diff --git a/src/EventSubscriber/MenuBuilderSubscriber.php b/src/EventSubscriber/MenuBuilderSubscriber.php index df63808f..380243f0 100644 --- a/src/EventSubscriber/MenuBuilderSubscriber.php +++ b/src/EventSubscriber/MenuBuilderSubscriber.php @@ -10,6 +10,7 @@ namespace App\EventSubscriber; use App\Event\ConfigureMainMenuEvent; +use App\Utils\MenuItemModel as KimaiMenuItemModel; use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent; use KevinPapst\AdminLTEBundle\Model\MenuItemModel; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -104,6 +105,13 @@ class MenuBuilderSubscriber implements EventSubscriberInterface } else { if ($item->getRoute() == $route) { $item->setIsActive(true); + continue; + } + if ($item instanceof KimaiMenuItemModel) { + if ($item->isChildRoute($route)) { + $item->setIsActive(true); + continue; + } } } } diff --git a/src/EventSubscriber/MenuSubscriber.php b/src/EventSubscriber/MenuSubscriber.php index d656596b..f0cf8d96 100644 --- a/src/EventSubscriber/MenuSubscriber.php +++ b/src/EventSubscriber/MenuSubscriber.php @@ -11,8 +11,9 @@ namespace App\EventSubscriber; use App\Event\ConfigureMainMenuEvent; use App\Twig\IconExtension; +use App\Utils\MenuItemModel; use KevinPapst\AdminLTEBundle\Event\SidebarMenuEvent; -use KevinPapst\AdminLTEBundle\Model\MenuItemModel; +use KevinPapst\AdminLTEBundle\Model\MenuItemInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; @@ -36,9 +37,6 @@ final class MenuSubscriber implements EventSubscriberInterface $this->icons = new IconExtension(); } - /** - * @return array - */ public static function getSubscribedEvents(): array { return [ @@ -46,9 +44,6 @@ final class MenuSubscriber implements EventSubscriberInterface ]; } - /** - * @param \App\Event\ConfigureMainMenuEvent $event - */ public function onMainMenuConfigure(ConfigureMainMenuEvent $event) { $auth = $this->security; @@ -62,17 +57,14 @@ final class MenuSubscriber implements EventSubscriberInterface $this->configureSystemMenu($event->getSystemMenu()); } - /** - * @param SidebarMenuEvent $menu - */ private function configureMainMenu(SidebarMenuEvent $menu) { $auth = $this->security; if ($auth->isGranted('view_own_timesheet')) { - $menu->addItem( - new MenuItemModel('timesheet', 'menu.timesheet', 'timesheet', [], $this->getIcon('timesheet')) - ); + $timesheets = new MenuItemModel('timesheet', 'menu.timesheet', 'timesheet', [], $this->getIcon('timesheet')); + $timesheets->setChildRoutes(['timesheet_export', 'timesheet_edit', 'timesheet_create']); + $menu->addItem($timesheets); $menu->addItem( new MenuItemModel('calendar', 'calendar.title', 'calendar', [], $this->getIcon('calendar')) ); @@ -91,35 +83,32 @@ final class MenuSubscriber implements EventSubscriberInterface } } - /** - * @param MenuItemModel $menu - */ - private function configureAdminMenu(MenuItemModel $menu) + private function configureAdminMenu(MenuItemInterface $menu) { $auth = $this->security; if ($auth->isGranted('view_other_timesheet')) { - $menu->addChild( - new MenuItemModel('timesheet_admin', 'menu.admin_timesheet', 'admin_timesheet', [], $this->getIcon('timesheet-team')) - ); + $timesheets = new MenuItemModel('timesheet_admin', 'menu.admin_timesheet', 'admin_timesheet', [], $this->getIcon('timesheet-team')); + $timesheets->setChildRoutes(['admin_timesheet_export', 'admin_timesheet_edit', 'admin_timesheet_create']); + $menu->addChild($timesheets); } if ($auth->isGranted('view_customer')) { - $menu->addChild( - new MenuItemModel('customer_admin', 'menu.admin_customer', 'admin_customer', [], $this->getIcon('customer')) - ); + $customers = new MenuItemModel('customer_admin', 'menu.admin_customer', 'admin_customer', [], $this->getIcon('customer')); + $customers->setChildRoutes(['admin_customer_create', 'admin_customer_permissions', 'admin_customer_budget', 'admin_customer_edit', 'admin_customer_delete']); + $menu->addChild($customers); } if ($auth->isGranted('view_project')) { - $menu->addChild( - new MenuItemModel('project_admin', 'menu.admin_project', 'admin_project', [], $this->getIcon('project')) - ); + $projects = new MenuItemModel('project_admin', 'menu.admin_project', 'admin_project', [], $this->getIcon('project')); + $projects->setChildRoutes(['admin_project_permissions', 'admin_project_create', 'admin_project_budget', 'admin_project_edit', 'admin_project_delete']); + $menu->addChild($projects); } if ($auth->isGranted('view_activity')) { - $menu->addChild( - new MenuItemModel('activity_admin', 'menu.admin_activity', 'admin_activity', [], $this->getIcon('activity')) - ); + $activities = new MenuItemModel('activity_admin', 'menu.admin_activity', 'admin_activity', [], $this->getIcon('activity')); + $activities->setChildRoutes(['admin_activity_create', 'admin_activity_budget', 'admin_activity_edit', 'admin_activity_delete']); + $menu->addChild($activities); } if ($auth->isGranted('view_tag')) { @@ -129,23 +118,20 @@ final class MenuSubscriber implements EventSubscriberInterface } } - /** - * @param MenuItemModel $menu - */ - private function configureSystemMenu(MenuItemModel $menu) + private function configureSystemMenu(MenuItemInterface $menu) { $auth = $this->security; if ($auth->isGranted('view_user')) { - $menu->addChild( - new MenuItemModel('user_admin', 'menu.admin_user', 'admin_user', [], $this->getIcon('user')) - ); + $users = new MenuItemModel('user_admin', 'menu.admin_user', 'admin_user', [], $this->getIcon('user')); + $users->setChildRoutes(['admin_user_create', 'admin_user_delete', 'admin_user_permissions', 'user_profile', 'user_profile_edit', 'user_profile_password', 'user_profile_api_token', 'user_profile_roles', 'user_profile_teams', 'user_profile_preferences']); + $menu->addChild($users); } if ($auth->isGranted('view_team')) { - $menu->addChild( - new MenuItemModel('user_team', 'menu.admin_team', 'admin_team', [], $this->getIcon('team')) - ); + $teams = new MenuItemModel('user_team', 'menu.admin_team', 'admin_team', [], $this->getIcon('team')); + $teams->setChildRoutes(['admin_team_create', 'admin_team_edit']); + $menu->addChild($teams); } if ($auth->isGranted('plugins')) { diff --git a/src/Utils/MenuItemModel.php b/src/Utils/MenuItemModel.php new file mode 100644 index 00000000..192f3cb2 --- /dev/null +++ b/src/Utils/MenuItemModel.php @@ -0,0 +1,36 @@ +childRoutes = $routes; + + return $this; + } + + public function addChildRoute(string $route): MenuItemModel + { + $this->childRoutes[] = $route; + + return $this; + } + + public function isChildRoute(string $route): bool + { + return in_array($route, $this->childRoutes); + } +}