Merge "Refactor the way we add classes to list items"

This commit is contained in:
jenkins-bot 2021-07-01 22:13:43 +00:00 committed by Gerrit Code Review
commit 7c1455b90e
2 changed files with 41 additions and 43 deletions

View File

@ -104,13 +104,37 @@ class Hooks {
// Promote watch link from actions to views and add an icon
if ( $key !== null ) {
$content_navigation['views'][$key] = self::navigationLinkToIcon(
$content_navigation['actions'][$key]
self::appendClassToListItem(
$content_navigation['actions'][$key],
'icon'
);
$content_navigation['views'][$key] = $content_navigation['actions'][$key];
unset( $content_navigation['actions'][$key] );
}
}
/**
* Updates class list on list item
*
* @param array &$item to update for use in makeListItem
* @param array $classes to add to the item
* @param bool $applyToLink (optional) and defaults to false.
* If set will modify `link-class` instead of `class`
*/
private static function addListItemClass( &$item, $classes, $applyToLink = false ) {
$property = $applyToLink ? 'link-class' : 'class';
$existingClass = $item[$property] ?? [];
if ( is_array( $existingClass ) ) {
$item[$property] = array_merge( $existingClass, $classes );
} elseif ( is_string( $existingClass ) ) {
// treat as string
$item[$property] = array_merge( [ $existingClass ], $classes );
} else {
$item[$property] = $classes;
}
}
/**
* Updates the class on an existing item taking into account whether
* a class exists there already.
@ -118,23 +142,20 @@ class Hooks {
* @param array &$item
* @param string $newClass
*/
private static function appendClassToUserLink( &$item, $newClass ) {
$existingClass = $item['class'] ?? '';
$item['class'] = $existingClass . ' ' . $newClass;
private static function appendClassToListItem( &$item, $newClass ) {
self::addListItemClass( $item, [ $newClass ] );
}
/**
* Add icon class to an existing navigation item inside a menu hook.
* See self::onSkinTemplateNavigation.
* @param array $item
* @return array
* Adds an icon to the list item of a menu.
*
* @param array &$item
* @param string $icon_name
*/
private static function navigationLinkToIcon( array $item ) {
if ( !isset( $item['class'] ) ) {
$item['class'] = '';
}
$item['class'] = rtrim( 'icon ' . $item['class'], ' ' );
return $item;
private static function addIconToListItem( &$item, $icon_name ) {
// Set the default menu icon classes.
$menu_icon_classes = [ 'mw-ui-icon', 'mw-ui-icon-before', 'mw-ui-icon-wikimedia-' . $icon_name ];
self::addListItemClass( $item, $menu_icon_classes, true );
}
/**
@ -154,7 +175,7 @@ class Hooks {
) {
if ( $sk->loggedin ) {
// Remove user page from personal menu dropdown for logged in users at higher resolutions.
self::appendClassToUserLink(
self::appendClassToListItem(
$content_navigation['user-menu']['userpage'],
$COLLAPSE_MENU_ITEM_CLASS
);
@ -164,7 +185,7 @@ class Hooks {
// Remove "Not logged in" from personal menu dropdown for anon users.
unset( $content_navigation['user-menu']['anonuserpage'] );
// Create account is pulled out into its own button and hidden at higher resolutions.
self::appendClassToUserLink(
self::appendClassToListItem(
$content_navigation['user-menu']['createaccount'],
$COLLAPSE_MENU_ITEM_CLASS
);
@ -176,30 +197,7 @@ class Hooks {
// Loop through each menu to check/append its link classes.
foreach ( $user_menu as $menu_key => $menu_value ) {
$icon_name = $menu_value['icon'] ?? '';
// Set the default menu icon classes.
$menu_icon_classes = [ 'mw-ui-icon', 'mw-ui-icon-before', 'mw-ui-icon-wikimedia-' . $icon_name ];
// Add the link-class key to the menu and its relevant classes if it doesn't exist.
if ( !( array_key_exists( 'class', $menu_value )
|| array_key_exists( 'link-class', $menu_value ) )
) {
$content_navigation['user-menu'][$menu_key]['link-class'] = $menu_icon_classes;
} else {
// The link-class or class keys do exist, so append the icon classes to them.
foreach ( $menu_value as $link_key => $link_value ) {
// Add relevant classes whether the link value is an array or a string.
switch ( $link_key ) {
case 'class':
case 'link-class':
$prior_link_classes = is_array( $link_value ) ? $link_value : [ $link_value ];
$content_navigation['user-menu'][$menu_key][$link_key] = array_merge(
$prior_link_classes,
$menu_icon_classes
);
break;
}
}
}
self::addIconToListItem( $content_navigation['user-menu'][$menu_key], $icon_name );
}
} else {
// Remove user page from personal toolbar since it will be inside the personal menu for logged in

View File

@ -367,11 +367,11 @@ class VectorHooksTest extends MediaWikiIntegrationTestCase {
Hooks::onSkinTemplateNavigation( $skin, $contentNavWatch );
$this->assertTrue(
strpos( $contentNavWatch['views']['watch']['class'], 'icon' ) !== false,
in_array( 'icon', $contentNavWatch['views']['watch']['class'] ) !== false,
'Watch list items require an "icon" class'
);
$this->assertTrue(
strpos( $contentNavUnWatch['views']['unwatch']['class'], 'icon' ) !== false,
in_array( 'icon', $contentNavUnWatch['views']['unwatch']['class'] ) !== false,
'Unwatch list items require an "icon" class'
);
$this->assertFalse(