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\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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ) {
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue