Move hamburger icon generation into Director
The MainMenu is built using Builder pattern. The hamburger icon is always the same, and it should be defined in the Menu builder, not as a separte UI element. For better code organization, all things related to MainMenu building should stay in the Menu Director/Builders, not in the SkinMinerva class. Changes: - moved hamburger icon build method into MainMenu/Director (as the menu icon is the same for all builders) - renamed stuff in BaseTemplate for better readability - use MediaWikiServices::getInstance()->getSpecialPageFactory() instead of deprecated SpecialPageFactory class. Change-Id: Ie5b30c0dd1649d38a4023ccb40c99dee2a127a70
This commit is contained in:
parent
18a1d48d53
commit
0e65adbf44
@ -41,7 +41,7 @@ return [
|
||||
new MainMenu\AdvancedBuilder( $showMobileOptions, $user, $definitions ) :
|
||||
new MainMenu\DefaultBuilder( $showMobileOptions, $user, $definitions );
|
||||
|
||||
return new MainMenu\Director( $builder );
|
||||
return new MainMenu\Director( $builder, $context, $services->getSpecialPageFactory() );
|
||||
},
|
||||
'Minerva.Menu.PageActionsDirector' => function ( MediaWikiServices $services ) {
|
||||
/**
|
||||
|
@ -19,6 +19,12 @@
|
||||
*/
|
||||
namespace MediaWiki\Minerva\Menu\Main;
|
||||
|
||||
use Html;
|
||||
use MessageLocalizer;
|
||||
use MinervaUI;
|
||||
use SpecialPage;
|
||||
use \MediaWiki\Special\SpecialPageFactory;
|
||||
|
||||
/**
|
||||
* Director responsible for building Main Menu
|
||||
*/
|
||||
@ -34,13 +40,32 @@ final class Director {
|
||||
*/
|
||||
private $menuData;
|
||||
|
||||
/**
|
||||
* @var MessageLocalizer
|
||||
*/
|
||||
private $msgLocalizer;
|
||||
|
||||
/**
|
||||
* @var SpecialPageFactory
|
||||
*/
|
||||
private $specialPageFactory;
|
||||
|
||||
/**
|
||||
* Director responsible for Main Menu building
|
||||
*
|
||||
* @param IBuilder $builder
|
||||
* @param MessageLocalizer $messageLocalizer Used for translating texts in menu toggle
|
||||
* @param SpecialPageFactory $specialPageFactory Used to check for MobileMenu special page
|
||||
* existence
|
||||
*/
|
||||
public function __construct( IBuilder $builder ) {
|
||||
public function __construct(
|
||||
IBuilder $builder,
|
||||
MessageLocalizer $messageLocalizer,
|
||||
SpecialPageFactory $specialPageFactory
|
||||
) {
|
||||
$this->builder = $builder;
|
||||
$this->msgLocalizer = $messageLocalizer;
|
||||
$this->specialPageFactory = $specialPageFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -60,15 +85,37 @@ final class Director {
|
||||
*/
|
||||
private function buildMenu() {
|
||||
$menuData = [
|
||||
'groups' => [],
|
||||
'sitelinks' => $this->builder->getSiteLinks()->getEntries()
|
||||
'buttonHTML' => $this->prepareToggle(),
|
||||
'items' => [
|
||||
'groups' => [],
|
||||
'sitelinks' => $this->builder->getSiteLinks()->getEntries()
|
||||
]
|
||||
];
|
||||
foreach ( $this->builder->getGroups() as $group ) {
|
||||
if ( $group->hasEntries() ) {
|
||||
$menuData['groups'][] = $group->getEntries();
|
||||
$menuData['items']['groups'][] = $group->getEntries();
|
||||
}
|
||||
}
|
||||
return $menuData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the button opens the main side menu
|
||||
* @return string Rendered Menu button as HTML
|
||||
*/
|
||||
protected function prepareToggle() {
|
||||
$url = $this->specialPageFactory->exists( 'MobileMenu' ) ?
|
||||
SpecialPage::getTitleFor( 'MobileMenu' )->getLocalURL() : '#';
|
||||
$title = $this->msgLocalizer->msg( 'mobile-frontend-main-menu-button-tooltip' )->text();
|
||||
$tooltip = $this->msgLocalizer->msg( 'mobile-frontend-main-menu-button-tooltip' )
|
||||
->text();
|
||||
|
||||
return Html::element( 'a', [
|
||||
'title' => $title,
|
||||
'href' => $url,
|
||||
'class' => MinervaUI::iconClass( 'mainmenu', 'element', 'main-menu-button' ),
|
||||
'id' => 'mw-mf-main-menu-button',
|
||||
], $tooltip );
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -211,7 +211,7 @@ class MinervaTemplate extends BaseTemplate {
|
||||
$templateParser = new TemplateParser(
|
||||
__DIR__ . '/../../resources/skins.minerva.scripts/menu/' );
|
||||
|
||||
return $templateParser->processTemplate( 'menu', $data['menu_data'] );
|
||||
return $templateParser->processTemplate( 'menu', $data['mainMenu']['items'] );
|
||||
}
|
||||
|
||||
return '';
|
||||
@ -239,7 +239,7 @@ class MinervaTemplate extends BaseTemplate {
|
||||
'search' => $data['search'],
|
||||
'placeholder' => wfMessage( 'mobile-frontend-placeholder' ),
|
||||
'headelement' => $data[ 'headelement' ],
|
||||
'menuButton' => $data['menuButton'],
|
||||
'menuButton' => $data['mainMenu']['buttonHTML'],
|
||||
'siteheading' => $data['footer-site-heading-html'],
|
||||
'mainPageURL' => Title::newMainPage()->getLocalURL(),
|
||||
// A button when clicked will submit the form
|
||||
|
@ -138,7 +138,7 @@ class SkinMinerva extends SkinTemplate {
|
||||
$tpl->set( 'unstyledContent', $out->getProperty( 'unstyledContent' ) );
|
||||
|
||||
// Set the links for the main menu
|
||||
$tpl->set( 'menu_data', $this->getMainMenu()->getMenuData() );
|
||||
$tpl->set( 'mainMenu', $this->getMainMenu()->getMenuData() );
|
||||
|
||||
// Set the links for page secondary actions
|
||||
$tpl->set( 'secondary_actions', $this->getSecondaryActions( $tpl ) );
|
||||
@ -146,7 +146,6 @@ class SkinMinerva extends SkinTemplate {
|
||||
// Construct various Minerva-specific interface elements
|
||||
$this->preparePageContent( $tpl );
|
||||
$this->prepareHeaderAndFooter( $tpl );
|
||||
$this->prepareMenuButton( $tpl );
|
||||
$this->prepareBanners( $tpl );
|
||||
$this->preparePageActions( $tpl );
|
||||
$this->prepareUserNotificationsButton( $tpl, $tpl->get( 'newtalk' ) );
|
||||
@ -671,25 +670,6 @@ class SkinMinerva extends SkinTemplate {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the button opens the main side menu
|
||||
* @param BaseTemplate $tpl
|
||||
*/
|
||||
protected function prepareMenuButton( BaseTemplate $tpl ) {
|
||||
// menu button
|
||||
$url = SpecialPageFactory::exists( 'MobileMenu' ) ?
|
||||
SpecialPage::getTitleFor( 'MobileMenu' )->getLocalURL() : '#';
|
||||
|
||||
$tpl->set( 'menuButton',
|
||||
Html::element( 'a', [
|
||||
'title' => $this->msg( 'mobile-frontend-main-menu-button-tooltip' )->text(),
|
||||
'href' => $url,
|
||||
'class' => MinervaUI::iconClass( 'mainmenu', 'element', 'main-menu-button' ),
|
||||
'id' => 'mw-mf-main-menu-button',
|
||||
], $this->msg( 'mobile-frontend-main-menu-button-tooltip' )->text() )
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load internal banner content to show in pre content in template
|
||||
* Beware of HTML caching when using this function.
|
||||
@ -871,10 +851,12 @@ class SkinMinerva extends SkinTemplate {
|
||||
* @return array
|
||||
*/
|
||||
public function getSkinConfigVariables() {
|
||||
$menuData = $this->getMainMenu()->getMenuData();
|
||||
$vars = [
|
||||
'wgMinervaFeatures' => $this->skinOptions->getAll(),
|
||||
'wgMinervaDownloadNamespaces' => $this->getConfig()->get( 'MinervaDownloadNamespaces' ),
|
||||
'wgMinervaMenuData' => $this->getMainMenu()->getMenuData(),
|
||||
// hamburger icon is already rendered, pass only menu items
|
||||
'wgMinervaMenuData' => $menuData['items']
|
||||
];
|
||||
|
||||
return $vars;
|
||||
|
Loading…
Reference in New Issue
Block a user