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:
parent
e117ee433a
commit
ad04f31441
|
@ -24,6 +24,9 @@ use MediaWiki\Minerva\LanguagesHelper;
|
|||
use MediaWiki\Minerva\Menu\Definitions;
|
||||
use MediaWiki\Minerva\Menu\Main as MainMenu;
|
||||
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\MinervaPagePermissions;
|
||||
use MediaWiki\Minerva\Permissions\MinervaNoPagePermissions;
|
||||
|
@ -31,13 +34,34 @@ use MediaWiki\Minerva\SkinOptions;
|
|||
use MediaWiki\Minerva\SkinUserPageHelper;
|
||||
|
||||
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 {
|
||||
$context = RequestContext::getMain();
|
||||
/** @var SkinOptions $options */
|
||||
$options = $services->getService( 'Minerva.SkinOptions' );
|
||||
$definitions = $services->getService( 'Minerva.Menu.Definitions' );
|
||||
$showMobileOptions = $options->get( SkinOptions::OPTION_MOBILE_OPTIONS );
|
||||
$user = $context->getUser();
|
||||
$definitions = new Definitions( $context, $services->getSpecialPageFactory() );
|
||||
$builder = $options->get( SkinOptions::OPTION_AMC ) ?
|
||||
new MainMenu\AdvancedBuilder( $showMobileOptions, $user, $definitions ) :
|
||||
new MainMenu\DefaultBuilder( $showMobileOptions, $user, $definitions );
|
||||
|
|
|
@ -20,11 +20,11 @@
|
|||
namespace MediaWiki\Minerva\Menu\User;
|
||||
|
||||
use Hooks;
|
||||
use IContextSource;
|
||||
use MediaWiki\Minerva\Menu\Definitions;
|
||||
use MediaWiki\Minerva\Menu\Entries\ProfileMenuEntry;
|
||||
use MediaWiki\Minerva\Menu\Entries\SingleMenuEntry;
|
||||
use MediaWiki\Minerva\Menu\Group;
|
||||
use MessageLocalizer;
|
||||
use User;
|
||||
|
||||
/**
|
||||
|
@ -32,9 +32,9 @@ use User;
|
|||
*/
|
||||
final class AdvancedUserMenuBuilder implements IUserMenuBuilder {
|
||||
/**
|
||||
* @var IContextSource
|
||||
* @var MessageLocalizer
|
||||
*/
|
||||
private $context;
|
||||
private $messageLocalizer;
|
||||
|
||||
/**
|
||||
* @var User
|
||||
|
@ -47,46 +47,43 @@ final class AdvancedUserMenuBuilder implements IUserMenuBuilder {
|
|||
private $definitions;
|
||||
|
||||
/**
|
||||
* @var array|null
|
||||
*/
|
||||
private $sandbox;
|
||||
|
||||
/**
|
||||
* @param IContextSource $context
|
||||
* @param MessageLocalizer $messageLocalizer
|
||||
* @param User $user
|
||||
* @param Definitions $definitions A menu items definitions set
|
||||
* @param array|null $sandbox
|
||||
*/
|
||||
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->definitions = $definitions;
|
||||
$this->sandbox = $sandbox;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @param array $personalTools list of personal tools generated by
|
||||
* SkinTemplate::getPersonalTools
|
||||
* @return Group
|
||||
*/
|
||||
public function getGroup(): Group {
|
||||
public function getGroup( array $personalTools ): Group {
|
||||
$group = new Group();
|
||||
$group->insertEntry( new ProfileMenuEntry( $this->user ) );
|
||||
$group->insertEntry( new SingleMenuEntry(
|
||||
'userTalk',
|
||||
$this->context->msg( 'mobile-frontend-user-page-talk' )->escaped(),
|
||||
$this->messageLocalizer->msg( 'mobile-frontend-user-page-talk' )->escaped(),
|
||||
$this->user->getUserPage()->getTalkPage()->getLocalURL(),
|
||||
true,
|
||||
null,
|
||||
'before',
|
||||
'wikimedia-ui-userTalk-base20'
|
||||
) );
|
||||
if ( $this->sandbox ) {
|
||||
$sandbox = $personalTools['sandbox']['links'][0] ?? false;
|
||||
|
||||
if ( $sandbox ) {
|
||||
$group->insertEntry( new SingleMenuEntry(
|
||||
'userSandbox',
|
||||
$this->sandbox['text'],
|
||||
$this->sandbox['href']
|
||||
$sandbox['text'],
|
||||
$sandbox['href']
|
||||
) );
|
||||
}
|
||||
$this->definitions->insertWatchlistMenuItem( $group );
|
||||
|
|
|
@ -29,7 +29,7 @@ final class DefaultUserMenuBuilder implements IUserMenuBuilder {
|
|||
* @inheritDoc
|
||||
* @return Group
|
||||
*/
|
||||
public function getGroup(): Group {
|
||||
public function getGroup( array $personalTools ): Group {
|
||||
return new Group();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,9 @@ use MediaWiki\Minerva\Menu\Group;
|
|||
|
||||
interface IUserMenuBuilder {
|
||||
/**
|
||||
* @param array $personalTools list of personal tools generated by
|
||||
* SkinTemplate::getPersonalTools
|
||||
* @return Group
|
||||
*/
|
||||
public function getGroup(): Group;
|
||||
public function getGroup( array $personalTools ): Group;
|
||||
}
|
||||
|
|
|
@ -48,10 +48,11 @@ final class UserMenuDirector {
|
|||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public function renderMenuData() {
|
||||
$entries = $this->builder->getGroup()->getEntries();
|
||||
public function renderMenuData( array $personalTools ) {
|
||||
$entries = $this->builder->getGroup( $personalTools )->getEntries();
|
||||
|
||||
foreach ( $entries as &$entry ) {
|
||||
foreach ( $entry['components'] as &$component ) {
|
||||
|
|
|
@ -23,10 +23,6 @@ use MediaWiki\Minerva\Menu\Main\Director as MainMenuDirector;
|
|||
use MediaWiki\Minerva\Permissions\IMinervaPagePermissions;
|
||||
use MediaWiki\Minerva\SkinOptions;
|
||||
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!
|
||||
|
@ -98,22 +94,10 @@ class SkinMinerva extends SkinTemplate {
|
|||
* @return string|null
|
||||
*/
|
||||
private function getUserMenuHTML( BaseTemplate $tpl ) {
|
||||
$services = MediaWikiServices::getInstance();
|
||||
$options = $services->getService( 'Minerva.SkinOptions' );
|
||||
$context = RequestContext::getMain();
|
||||
$definitions = new Definitions( $context, $services->getSpecialPageFactory() );
|
||||
$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();
|
||||
/** @var \MediaWiki\Minerva\Menu\User\UserMenuDirector $director */
|
||||
$director = MediaWikiServices::getInstance()
|
||||
->getService( 'Minerva.Menu.UserMenuDirector' );
|
||||
return $director->renderMenuData( $tpl->getPersonalTools() );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue