Merge "Feature flag language button in main page header"
This commit is contained in:
commit
a7c16c7f30
|
@ -251,6 +251,31 @@ final class Constants {
|
|||
*/
|
||||
public const CONFIG_SEARCH_TREATMENT_AB_TEST = 'VectorSearchTreatmentABTest';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const REQUIREMENT_IS_MAIN_PAGE = 'IsMainPage';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const REQUIREMENT_LANGUAGE_IN_MAIN_PAGE_HEADER = 'LanguageInMainPageHeader';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const CONFIG_LANGUAGE_IN_MAIN_PAGE_HEADER = 'VectorLanguageInMainPageHeader';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const QUERY_PARAM_LANGUAGE_IN_MAIN_PAGE_HEADER = 'languageinmainpageheader';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER = 'LanguageInMainPageHeader';
|
||||
|
||||
/**
|
||||
* This class is for namespacing constants only. Forbid construction.
|
||||
* @throws FatalError
|
||||
|
|
|
@ -135,6 +135,37 @@ return [
|
|||
]
|
||||
);
|
||||
|
||||
// Feature: T293470: Language in main page header
|
||||
// ================================
|
||||
$featureManager->registerRequirement(
|
||||
new OverridableConfigRequirement(
|
||||
$services->getMainConfig(),
|
||||
$context->getUser(),
|
||||
$context->getRequest(),
|
||||
null,
|
||||
Constants::CONFIG_LANGUAGE_IN_MAIN_PAGE_HEADER,
|
||||
Constants::REQUIREMENT_LANGUAGE_IN_MAIN_PAGE_HEADER,
|
||||
Constants::QUERY_PARAM_LANGUAGE_IN_MAIN_PAGE_HEADER,
|
||||
null
|
||||
)
|
||||
);
|
||||
|
||||
$featureManager->registerSimpleRequirement(
|
||||
Constants::REQUIREMENT_IS_MAIN_PAGE,
|
||||
$context->getTitle() ? $context->getTitle()->isMainPage() : false
|
||||
);
|
||||
|
||||
$featureManager->registerFeature(
|
||||
Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER,
|
||||
[
|
||||
Constants::REQUIREMENT_FULLY_INITIALISED,
|
||||
Constants::REQUIREMENT_LATEST_SKIN_VERSION,
|
||||
Constants::REQUIREMENT_IS_MAIN_PAGE,
|
||||
Constants::REQUIREMENT_LANGUAGE_IN_HEADER,
|
||||
Constants::REQUIREMENT_LANGUAGE_IN_MAIN_PAGE_HEADER
|
||||
]
|
||||
);
|
||||
|
||||
// Feature: Use Wvui Search
|
||||
// ================================
|
||||
$featureManager->registerRequirement(
|
||||
|
|
|
@ -154,15 +154,40 @@ class SkinVector extends SkinMustache {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param string $location Either 'top' or 'bottom' is accepted.
|
||||
* @return bool
|
||||
*/
|
||||
private function isLanguagesInHeader() {
|
||||
private function isLanguagesInContentAt( $location ) {
|
||||
if ( !$this->canHaveLanguages() ) {
|
||||
return false;
|
||||
}
|
||||
$featureManager = VectorServices::getFeatureManager();
|
||||
// Disable button on pages without languages (based on Wikibase RepoItemLinkGenerator class)
|
||||
|
||||
return $this->canHaveLanguages() && $featureManager->isFeatureEnabled(
|
||||
$inContent = $featureManager->isFeatureEnabled(
|
||||
Constants::FEATURE_LANGUAGE_IN_HEADER
|
||||
);
|
||||
$isMainPage = $this->getTitle() ? $this->getTitle()->isMainPage() : false;
|
||||
|
||||
switch ( $location ) {
|
||||
case 'top':
|
||||
return $isMainPage ? $inContent && $featureManager->isFeatureEnabled(
|
||||
Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER
|
||||
) : $inContent;
|
||||
case 'bottom':
|
||||
return $inContent && $isMainPage && !$featureManager->isFeatureEnabled(
|
||||
Constants::FEATURE_LANGUAGE_IN_MAIN_PAGE_HEADER
|
||||
);
|
||||
default:
|
||||
throw new RuntimeException( 'unknown language button location' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the languages are out of the sidebar and in the content either at
|
||||
* the top or the bottom.
|
||||
* @return bool
|
||||
*/
|
||||
private function isLanguagesInContent() {
|
||||
return $this->isLanguagesInContentAt( 'top' ) || $this->isLanguagesInContentAt( 'bottom' );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,7 +199,7 @@ class SkinVector extends SkinMustache {
|
|||
return !$this->isLegacy() &&
|
||||
!$this->canHaveLanguages() ||
|
||||
// NOTE: T276950 - This should be revisited when an empty state for the language button is chosen.
|
||||
( $this->isLanguagesInHeader() && empty( $this->getLanguagesCached() ) );
|
||||
( $this->isLanguagesInContent() && empty( $this->getLanguagesCached() ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -438,7 +463,9 @@ class SkinVector extends SkinMustache {
|
|||
|
||||
'sidebar-visible' => $this->isSidebarVisible(),
|
||||
|
||||
'is-language-in-header' => $this->isLanguagesInHeader(),
|
||||
'is-language-in-content' => $this->isLanguagesInContent(),
|
||||
'is-language-in-content-top' => $this->isLanguagesInContentAt( 'top' ),
|
||||
'is-language-in-content-bottom' => $this->isLanguagesInContentAt( 'bottom' ),
|
||||
|
||||
'data-search-box' => $this->getSearchData(
|
||||
$parentData['data-search-box'],
|
||||
|
@ -706,7 +733,7 @@ class SkinVector extends SkinMustache {
|
|||
break;
|
||||
}
|
||||
|
||||
if ( $portletData['id'] === 'p-lang' && $this->isLanguagesInHeader() ) {
|
||||
if ( $portletData['id'] === 'p-lang' && $this->isLanguagesInContent() ) {
|
||||
$portletData = array_merge( $portletData, $this->getULSPortletData() );
|
||||
}
|
||||
$class = $portletData['class'];
|
||||
|
@ -738,7 +765,7 @@ class SkinVector extends SkinMustache {
|
|||
$type = self::MENU_TYPE_DEFAULT;
|
||||
break;
|
||||
case 'lang':
|
||||
$type = $this->isLanguagesInHeader() ?
|
||||
$type = $this->isLanguagesInContent() ?
|
||||
self::MENU_TYPE_DROPDOWN : self::MENU_TYPE_PORTAL;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
</div>
|
||||
{{/data-emphasized-sidebar-action}}
|
||||
{{#array-portlets-rest}}{{>Menu}}{{/array-portlets-rest}}
|
||||
{{^is-language-in-header}}
|
||||
{{^is-language-in-content}}
|
||||
{{#data-portlets.data-languages}}{{>Menu}}{{/data-portlets.data-languages}}
|
||||
{{/is-language-in-header}}
|
||||
{{/is-language-in-content}}
|
||||
</div>
|
||||
|
|
|
@ -51,28 +51,28 @@
|
|||
<a id="top"></a>
|
||||
<div id="siteNotice">{{{html-site-notice}}}</div>
|
||||
|
||||
{{^is-language-in-header}}
|
||||
{{^is-language-in-content}}
|
||||
{{>Indicators}}
|
||||
<h1 id="firstHeading" class="firstHeading" {{{html-user-language-attributes}}}>{{{html-title}}}</h1>
|
||||
{{/is-language-in-header}}
|
||||
{{/is-language-in-content}}
|
||||
|
||||
{{#is-language-in-header}}
|
||||
{{#is-language-in-content}}
|
||||
<header class="mw-body-header">
|
||||
{{^is-mainpage}}
|
||||
{{#is-language-in-content-top}}
|
||||
{{#data-portlets.data-languages}}{{>Menu}}{{/data-portlets.data-languages}}
|
||||
{{/is-mainpage}}
|
||||
{{/is-language-in-content-top}}
|
||||
<h1 id="firstHeading" class="firstHeading" {{{html-user-language-attributes}}}>{{{html-title}}}</h1>
|
||||
{{>Indicators}}
|
||||
{{#is-article}}
|
||||
<div id="siteSub" class="noprint">{{msg-tagline}}</div>
|
||||
{{/is-article}}
|
||||
</header>
|
||||
{{/is-language-in-header}}
|
||||
{{/is-language-in-content}}
|
||||
|
||||
<div id="bodyContent" class="vector-body">
|
||||
{{^is-language-in-header}}
|
||||
{{^is-language-in-content}}
|
||||
{{#is-article}}<div id="siteSub" class="noprint">{{msg-tagline}}</div>{{/is-article}}
|
||||
{{/is-language-in-header}}
|
||||
{{/is-language-in-content}}
|
||||
<div id="contentSub"{{{html-user-language-attributes}}}>{{{html-subtitle}}}</div>
|
||||
<div id="contentSub2">{{{html-undelete-link}}}</div>
|
||||
{{{html-user-message}}}
|
||||
|
@ -80,11 +80,9 @@
|
|||
{{{html-categories}}}
|
||||
</div>
|
||||
|
||||
{{#is-mainpage}}
|
||||
{{#is-language-in-header}}
|
||||
{{#data-portlets.data-languages}}{{>Menu}}{{/data-portlets.data-languages}}
|
||||
{{/is-language-in-header}}
|
||||
{{/is-mainpage}}
|
||||
{{#is-language-in-content-bottom}}
|
||||
{{#data-portlets.data-languages}}{{>Menu}}{{/data-portlets.data-languages}}
|
||||
{{/is-language-in-content-bottom}}
|
||||
|
||||
</main>
|
||||
{{{html-after-content}}}
|
||||
|
|
|
@ -358,6 +358,13 @@
|
|||
},
|
||||
"description": "@var array Moves the language links from the sidebar into a menu beside the page title. Also moves the indicators to the line below, next to the tagline (siteSub)."
|
||||
},
|
||||
"VectorLanguageInMainPageHeader": {
|
||||
"value": {
|
||||
"logged_in": false,
|
||||
"logged_out": false
|
||||
},
|
||||
"description": "@var When `VectorLanguageInHeader` is enabled, determines whether the Main Page's language button should be at the top or bottom of the content. The default position on the main page is at the bottom."
|
||||
},
|
||||
"VectorLanguageInHeaderTreatmentABTest": {
|
||||
"value": false,
|
||||
"description": "@var boolean Enables or disables the language in header treatment A/B test. See https://phabricator.wikimedia.org/T280825 and associated tasks for additional detail."
|
||||
|
|
Loading…
Reference in New Issue