Follow-up: User menu improvements

Changes:
 - We should limit the interfaces we pass around,
  AdvancedUserMenuBuilder doesn't need whole IContextSource as it
  uses only msg() method. It's better to define that this methods
  needs only MessageLocalizer
 - move UserMenuDirector into ServiceWiring to be consistent with
 other Directors/Builders
 - pass PersonalTools as a dependency to UserMenuDirector, which
 will pass to each Builder. The personalTools is set of links
 that can/should be used when rendering user menu (which in the
 fact has almost same subset of tools as the personal toolbox)

Bug: T214540
Change-Id: I7f744651b0665452a5a9d1ce661f20547e80812d
This commit is contained in:
Piotr Miazga 2019-07-25 12:34:50 +02:00 committed by Stephen Niedzielski
parent e117ee433a
commit ad04f31441
6 changed files with 51 additions and 43 deletions

View File

@ -24,6 +24,9 @@ use MediaWiki\Minerva\LanguagesHelper;
use MediaWiki\Minerva\Menu\Definitions; use MediaWiki\Minerva\Menu\Definitions;
use MediaWiki\Minerva\Menu\Main as MainMenu; use MediaWiki\Minerva\Menu\Main as MainMenu;
use MediaWiki\Minerva\Menu\PageActions as PageActionsMenu; use MediaWiki\Minerva\Menu\PageActions as PageActionsMenu;
use MediaWiki\Minerva\Menu\User\AdvancedUserMenuBuilder;
use MediaWiki\Minerva\Menu\User\DefaultUserMenuBuilder;
use MediaWiki\Minerva\Menu\User\UserMenuDirector;
use MediaWiki\Minerva\Permissions\IMinervaPagePermissions; use MediaWiki\Minerva\Permissions\IMinervaPagePermissions;
use MediaWiki\Minerva\Permissions\MinervaPagePermissions; use MediaWiki\Minerva\Permissions\MinervaPagePermissions;
use MediaWiki\Minerva\Permissions\MinervaNoPagePermissions; use MediaWiki\Minerva\Permissions\MinervaNoPagePermissions;
@ -31,13 +34,34 @@ use MediaWiki\Minerva\SkinOptions;
use MediaWiki\Minerva\SkinUserPageHelper; use MediaWiki\Minerva\SkinUserPageHelper;
return [ return [
'Minerva.Menu.Definitions' => function ( MediaWikiServices $services ): Definitions {
return new Definitions( RequestContext::getMain(), $services->getSpecialPageFactory() );
},
'Minerva.Menu.UserMenuDirector' => function ( MediaWikiServices $services ): UserMenuDirector {
$options = $services->getService( 'Minerva.SkinOptions' );
$definitions = $services->getService( 'Minerva.Menu.Definitions' );
$context = RequestContext::getMain();
$builder = $options->get( SkinOptions::OPTION_AMC ) ?
new AdvancedUserMenuBuilder(
$context,
$context->getUser(),
$definitions
) :
new DefaultUserMenuBuilder();
return new UserMenuDirector(
$builder,
$context->getSkin()
);
},
'Minerva.Menu.MainDirector' => function ( MediaWikiServices $services ): MainMenu\Director { 'Minerva.Menu.MainDirector' => function ( MediaWikiServices $services ): MainMenu\Director {
$context = RequestContext::getMain(); $context = RequestContext::getMain();
/** @var SkinOptions $options */ /** @var SkinOptions $options */
$options = $services->getService( 'Minerva.SkinOptions' ); $options = $services->getService( 'Minerva.SkinOptions' );
$definitions = $services->getService( 'Minerva.Menu.Definitions' );
$showMobileOptions = $options->get( SkinOptions::OPTION_MOBILE_OPTIONS ); $showMobileOptions = $options->get( SkinOptions::OPTION_MOBILE_OPTIONS );
$user = $context->getUser(); $user = $context->getUser();
$definitions = new Definitions( $context, $services->getSpecialPageFactory() );
$builder = $options->get( SkinOptions::OPTION_AMC ) ? $builder = $options->get( SkinOptions::OPTION_AMC ) ?
new MainMenu\AdvancedBuilder( $showMobileOptions, $user, $definitions ) : new MainMenu\AdvancedBuilder( $showMobileOptions, $user, $definitions ) :
new MainMenu\DefaultBuilder( $showMobileOptions, $user, $definitions ); new MainMenu\DefaultBuilder( $showMobileOptions, $user, $definitions );

View File

@ -20,11 +20,11 @@
namespace MediaWiki\Minerva\Menu\User; namespace MediaWiki\Minerva\Menu\User;
use Hooks; use Hooks;
use IContextSource;
use MediaWiki\Minerva\Menu\Definitions; use MediaWiki\Minerva\Menu\Definitions;
use MediaWiki\Minerva\Menu\Entries\ProfileMenuEntry; use MediaWiki\Minerva\Menu\Entries\ProfileMenuEntry;
use MediaWiki\Minerva\Menu\Entries\SingleMenuEntry; use MediaWiki\Minerva\Menu\Entries\SingleMenuEntry;
use MediaWiki\Minerva\Menu\Group; use MediaWiki\Minerva\Menu\Group;
use MessageLocalizer;
use User; use User;
/** /**
@ -32,9 +32,9 @@ use User;
*/ */
final class AdvancedUserMenuBuilder implements IUserMenuBuilder { final class AdvancedUserMenuBuilder implements IUserMenuBuilder {
/** /**
* @var IContextSource * @var MessageLocalizer
*/ */
private $context; private $messageLocalizer;
/** /**
* @var User * @var User
@ -47,46 +47,43 @@ final class AdvancedUserMenuBuilder implements IUserMenuBuilder {
private $definitions; private $definitions;
/** /**
* @var array|null * @param MessageLocalizer $messageLocalizer
*/
private $sandbox;
/**
* @param IContextSource $context
* @param User $user * @param User $user
* @param Definitions $definitions A menu items definitions set * @param Definitions $definitions A menu items definitions set
* @param array|null $sandbox
*/ */
public function __construct( public function __construct(
IContextSource $context, User $user, Definitions $definitions, $sandbox MessageLocalizer $messageLocalizer, User $user, Definitions $definitions
) { ) {
$this->context = $context; $this->messageLocalizer = $messageLocalizer;
$this->user = $user; $this->user = $user;
$this->definitions = $definitions; $this->definitions = $definitions;
$this->sandbox = $sandbox;
} }
/** /**
* @inheritDoc * @inheritDoc
* @param array $personalTools list of personal tools generated by
* SkinTemplate::getPersonalTools
* @return Group * @return Group
*/ */
public function getGroup(): Group { public function getGroup( array $personalTools ): Group {
$group = new Group(); $group = new Group();
$group->insertEntry( new ProfileMenuEntry( $this->user ) ); $group->insertEntry( new ProfileMenuEntry( $this->user ) );
$group->insertEntry( new SingleMenuEntry( $group->insertEntry( new SingleMenuEntry(
'userTalk', 'userTalk',
$this->context->msg( 'mobile-frontend-user-page-talk' )->escaped(), $this->messageLocalizer->msg( 'mobile-frontend-user-page-talk' )->escaped(),
$this->user->getUserPage()->getTalkPage()->getLocalURL(), $this->user->getUserPage()->getTalkPage()->getLocalURL(),
true, true,
null, null,
'before', 'before',
'wikimedia-ui-userTalk-base20' 'wikimedia-ui-userTalk-base20'
) ); ) );
if ( $this->sandbox ) { $sandbox = $personalTools['sandbox']['links'][0] ?? false;
if ( $sandbox ) {
$group->insertEntry( new SingleMenuEntry( $group->insertEntry( new SingleMenuEntry(
'userSandbox', 'userSandbox',
$this->sandbox['text'], $sandbox['text'],
$this->sandbox['href'] $sandbox['href']
) ); ) );
} }
$this->definitions->insertWatchlistMenuItem( $group ); $this->definitions->insertWatchlistMenuItem( $group );

View File

@ -29,7 +29,7 @@ final class DefaultUserMenuBuilder implements IUserMenuBuilder {
* @inheritDoc * @inheritDoc
* @return Group * @return Group
*/ */
public function getGroup(): Group { public function getGroup( array $personalTools ): Group {
return new Group(); return new Group();
} }
} }

View File

@ -24,7 +24,9 @@ use MediaWiki\Minerva\Menu\Group;
interface IUserMenuBuilder { interface IUserMenuBuilder {
/** /**
* @param array $personalTools list of personal tools generated by
* SkinTemplate::getPersonalTools
* @return Group * @return Group
*/ */
public function getGroup(): Group; public function getGroup( array $personalTools ): Group;
} }

View File

@ -48,10 +48,11 @@ final class UserMenuDirector {
/** /**
* Build the menu data array that can be passed to views/javascript * Build the menu data array that can be passed to views/javascript
* @param array $personalTools Personal tools list generated by BaseTemplate::getPersonalTools
* @return string|null * @return string|null
*/ */
public function renderMenuData() { public function renderMenuData( array $personalTools ) {
$entries = $this->builder->getGroup()->getEntries(); $entries = $this->builder->getGroup( $personalTools )->getEntries();
foreach ( $entries as &$entry ) { foreach ( $entries as &$entry ) {
foreach ( $entry['components'] as &$component ) { foreach ( $entry['components'] as &$component ) {

View File

@ -23,10 +23,6 @@ use MediaWiki\Minerva\Menu\Main\Director as MainMenuDirector;
use MediaWiki\Minerva\Permissions\IMinervaPagePermissions; use MediaWiki\Minerva\Permissions\IMinervaPagePermissions;
use MediaWiki\Minerva\SkinOptions; use MediaWiki\Minerva\SkinOptions;
use MediaWiki\Minerva\SkinUserPageHelper; use MediaWiki\Minerva\SkinUserPageHelper;
use MediaWiki\Minerva\Menu\User\UserMenuDirector;
use MediaWiki\Minerva\Menu\User\AdvancedUserMenuBuilder;
use MediaWiki\Minerva\Menu\User\DefaultUserMenuBuilder;
use MediaWiki\Minerva\Menu\Definitions;
/** /**
* Minerva: Born from the godhead of Jupiter with weapons! * Minerva: Born from the godhead of Jupiter with weapons!
@ -98,22 +94,10 @@ class SkinMinerva extends SkinTemplate {
* @return string|null * @return string|null
*/ */
private function getUserMenuHTML( BaseTemplate $tpl ) { private function getUserMenuHTML( BaseTemplate $tpl ) {
$services = MediaWikiServices::getInstance(); /** @var \MediaWiki\Minerva\Menu\User\UserMenuDirector $director */
$options = $services->getService( 'Minerva.SkinOptions' ); $director = MediaWikiServices::getInstance()
$context = RequestContext::getMain(); ->getService( 'Minerva.Menu.UserMenuDirector' );
$definitions = new Definitions( $context, $services->getSpecialPageFactory() ); return $director->renderMenuData( $tpl->getPersonalTools() );
$director = new UserMenuDirector(
$options->get( SkinOptions::OPTION_AMC )
? new AdvancedUserMenuBuilder(
$context,
$this->getUser(),
$definitions,
$tpl->getPersonalTools()['sandbox']['links'][0] ?? null
)
: new DefaultUserMenuBuilder(),
$this
);
return $director->renderMenuData();
} }
/** /**