diff --git a/lib/pkp b/lib/pkp index 6870c2e6eb2..1c377fdce64 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 6870c2e6eb2f86cf71be5ab21f0366623a1305e2 +Subproject commit 1c377fdce64c1dbe1c2c20e0bc3d1bebc5e13a8e diff --git a/plugins/themes/default/DefaultThemePlugin.php b/plugins/themes/default/DefaultThemePlugin.php index 619dc6018e1..23967785bd4 100644 --- a/plugins/themes/default/DefaultThemePlugin.php +++ b/plugins/themes/default/DefaultThemePlugin.php @@ -3,8 +3,8 @@ /** * @file plugins/themes/default/DefaultThemePlugin.php * - * Copyright (c) 2014-2021 Simon Fraser University - * Copyright (c) 2003-2021 John Willinsky + * Copyright (c) 2014-2024 Simon Fraser University + * Copyright (c) 2003-2024 John Willinsky * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. * * @class DefaultThemePlugin @@ -19,6 +19,13 @@ use PKP\config\Config; use PKP\session\SessionManager; +use APP\facades\Repo; +use APP\issue\Collector; +use APP\services\NavigationMenuService; +use PKP\plugins\ThemePlugin; +use PKP\plugins\Hook; + + class DefaultThemePlugin extends \PKP\plugins\ThemePlugin { /** @@ -210,6 +217,9 @@ public function init() // Add navigation menu areas for this theme $this->addMenuArea(['primary', 'user']); + + + Hook::add('TemplateManager::display', array($this, 'checkCurrentPage')); } /** @@ -253,6 +263,57 @@ public function getDescription() { return __('plugins.themes.default.description'); } + + /** + * @param $hookname string + * @param $args array + */ + public function checkCurrentPage($hookname, $args) { + $templateMgr = $args[0]; + // TODO check the issue with multiple calls of the hook on settings/website + if (!isset($templateMgr->registered_plugins["function"]["default_item_active"])) { + $templateMgr->registerPlugin('function', 'default_item_active', array($this, 'isActiveItem')); + } + + } + + /** + * @param $params array + * @param $smarty Smarty_Internal_Template + * @return string + */ + public function isActiveItem($params, $smarty) { + + $navigationMenuItem = $params['item']; + $emptyMarker = ''; + $activeMarker = ' active'; + + // Get URL of the current page + $request = $this->getRequest(); + $currentUrl = $request->getCompleteUrl(); + $currentPage = $request->getRequestedPage(); + + // Do not add an active marker if it's a dropdown menu + if ($navigationMenuItem->getIsChildVisible()) return $emptyMarker; + + // Retrieve URL and its components for a menu item + $itemUrl = $navigationMenuItem->getUrl(); + + // Check whether menu item points to the current page + $context = $request->getContext(); + if ($context) { + $currentIssue = Repo::issue()->getCurrent($context->getId()); + if ($navigationMenuItem->getType() === NavigationMenuService::NMI_TYPE_CURRENT) { + $issue = $smarty->getTemplateVars('issue'); + if ($issue && ($issue->getId() === $currentIssue->getId()) && $currentPage == "issue") return $activeMarker; + } + } + + if ($currentUrl === $itemUrl) return $activeMarker; + + return $emptyMarker; + } + } if (!PKP_STRICT_MODE) { diff --git a/plugins/themes/default/styles/head.less b/plugins/themes/default/styles/head.less index 2c2540fabef..ee47c3c1ea4 100644 --- a/plugins/themes/default/styles/head.less +++ b/plugins/themes/default/styles/head.less @@ -117,7 +117,7 @@ a { display: inline-block; - padding: 0.125rem 0; + padding: 0.86rem 0; color: @text-bg-base; text-decoration: none; @@ -127,6 +127,18 @@ text-decoration: underline; } } + @media (max-width: @screen-desktop) { + + .active { + background-color: @bg-base-border-color; + + } + .active a { + font-weight: bold; + + } + } + #siteNav { position: absolute; @@ -358,6 +370,19 @@ } } + // Visualy highlighting the current menu item + > li.active { + > a { + //background: @primary-lift; + border-color: @text-bg-base; + outline: 0; + } + &:hover { + color: @bg-base; + border-color: red; + } + } + // Reproduce positioning of dropdown menu from Popper.js > li:hover ul { position: absolute; @@ -377,7 +402,8 @@ } .dropdown-menu a:focus, - .dropdown-menu a:hover { + .dropdown-menu a:hover, + .dropdown-menu li.active a { border-color: @primary; }