mirror of
https://gerrit.wikimedia.org/r/mediawiki/skins/MinervaNeue
synced 2024-11-13 17:37:07 +00:00
Allow overriding text and CSS class for home menu entry
* Introduce a HomeMenuEntry class and use it for adding the home menu link * Provide override methods for text and CSS class Bug: T223210 Change-Id: I37160887478cba829a6e2f10a4d8f87d95167556
This commit is contained in:
parent
200e64d32a
commit
9b7b10bbe9
|
@ -126,7 +126,7 @@ final class Definitions {
|
|||
* @param Group $group
|
||||
*/
|
||||
public function insertHomeItem( Group $group ) {
|
||||
$group->insertEntry( new SingleMenuEntry(
|
||||
$group->insertEntry( new HomeMenuEntry(
|
||||
'home',
|
||||
$this->context->msg( 'mobile-frontend-home-button' )->escaped(),
|
||||
Title::newMainPage()->getLocalURL()
|
||||
|
|
101
includes/menu/HomeMenuEntry.php
Normal file
101
includes/menu/HomeMenuEntry.php
Normal file
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
/**
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
namespace MediaWiki\Minerva\Menu;
|
||||
|
||||
use MinervaUI;
|
||||
|
||||
/**
|
||||
* Class for defining a home menu entry in Special:MobileMenu
|
||||
*/
|
||||
final class HomeMenuEntry implements IMenuEntry {
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $name;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $component;
|
||||
|
||||
/**
|
||||
* Override the text used in the home menu entry.
|
||||
*
|
||||
* @param string $text
|
||||
* @return $this
|
||||
*/
|
||||
public function overrideText( $text ) {
|
||||
$this->component['text'] = $text;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the CSS class used in the home menu entry.
|
||||
*
|
||||
* @param string $cssClass
|
||||
* @return $this
|
||||
*/
|
||||
public function overrideCssClass( $cssClass ) {
|
||||
$this->component['class'] = $cssClass;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a home menu element with one component
|
||||
*
|
||||
* @param string $name An unique menu element identifier
|
||||
* @param string $text Text to show on menu element
|
||||
* @param string $url URL menu element points to
|
||||
* @param bool|string $trackClicks Should clicks be tracked. To override the tracking code
|
||||
* pass the tracking code as string
|
||||
*/
|
||||
public function __construct( $name, $text, $url, $trackClicks = true ) {
|
||||
$this->name = $name;
|
||||
$this->component = [
|
||||
'text' => $text,
|
||||
'href' => $url,
|
||||
'class' => trim( MinervaUI::iconClass( $name, 'before' ) )
|
||||
];
|
||||
if ( $trackClicks !== false ) {
|
||||
$this->component['data-event-name'] = $trackClicks === true ? $name : $trackClicks;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getName() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCSSClasses(): array {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getComponents(): array {
|
||||
return [ $this->component ];
|
||||
}
|
||||
|
||||
}
|
57
tests/phpunit/unit/menu/HomeMenuEntryTest.php
Normal file
57
tests/phpunit/unit/menu/HomeMenuEntryTest.php
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\MediaWiki\Minerva\Menu;
|
||||
|
||||
use MediaWiki\Minerva\Menu\HomeMenuEntry;
|
||||
|
||||
/**
|
||||
* @group MinervaNeue
|
||||
* @coversDefaultClass \MediaWiki\Minerva\Menu\HomeMenuEntry
|
||||
*/
|
||||
class HomeMenuEntryTest extends \MediaWikiUnitTestCase {
|
||||
|
||||
/**
|
||||
* @covers ::__construct
|
||||
* @covers ::getName
|
||||
* @covers ::getCSSClasses
|
||||
* @covers ::getComponents
|
||||
*/
|
||||
public function testConstruct() {
|
||||
$name = 'foo';
|
||||
$text = 'bar';
|
||||
$url = 'http://baz';
|
||||
$entry = new HomeMenuEntry( $name, $text, $url );
|
||||
$this->assertSame( $name, $entry->getName() );
|
||||
$this->assertSame( [], $entry->getCSSClasses() );
|
||||
$this->assertSame( [ [
|
||||
'text' => $text,
|
||||
'href' => $url,
|
||||
'class' => 'mw-ui-icon mw-ui-icon-before mw-ui-icon-minerva-foo',
|
||||
'data-event-name' => 'foo'
|
||||
] ], $entry->getComponents() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::overrideCssClass
|
||||
* @covers ::overrideText
|
||||
* @covers ::getComponents
|
||||
*/
|
||||
public function testOverride() {
|
||||
$entry = new HomeMenuEntry( 'foo', 'bar', 'http://baz' );
|
||||
$component = current( $entry->getComponents() );
|
||||
$this->assertSame( 'bar', $component['text'] );
|
||||
$this->assertSame(
|
||||
'mw-ui-icon mw-ui-icon-before mw-ui-icon-minerva-foo',
|
||||
$component['class']
|
||||
);
|
||||
$entry->overrideText( 'blah' )
|
||||
->overrideCssClass( 'classy' );
|
||||
$component = current( $entry->getComponents() );
|
||||
$this->assertSame( 'blah', $component['text'] );
|
||||
$this->assertSame(
|
||||
'classy',
|
||||
$component['class']
|
||||
);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue