From 5d576d05b474a8c32383b136cf6f93cf9c99e1c7 Mon Sep 17 00:00:00 2001 From: NikG Date: Mon, 19 Dec 2022 18:00:56 +0200 Subject: [PATCH] Add language settings button inside dropdown for non-content pages Bug: T316559 Change-Id: Ifdf2a529b30e5a2df8867b606a525c9f7b3bdb6c --- includes/Hooks.php | 4 +++ resources/css/ext.uls.interface.less | 4 +++ resources/js/ext.uls.interface.js | 51 ++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/includes/Hooks.php b/includes/Hooks.php index 5f2bf575..d5a99521 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -170,6 +170,10 @@ class Hooks implements if ( $this->isEnabled() ) { // Enable UI language selection for the user. $out->addModules( 'ext.uls.interface' ); + + $templateData = $skin->getTemplateData(); + $isLanguageSelectorEmpty = $templateData[ 'data-lang-btn' ][ 'is-language-selector-empty' ] ?? false; + $config[ 'wgULSisLanguageSelectorEmpty' ] = $isLanguageSelectorEmpty; } // This is added here, and not in onResourceLoaderGetConfigVars to allow skins and extensions diff --git a/resources/css/ext.uls.interface.less b/resources/css/ext.uls.interface.less index a730eaa0..81dd2a6f 100644 --- a/resources/css/ext.uls.interface.less +++ b/resources/css/ext.uls.interface.less @@ -70,3 +70,7 @@ margin: 1em 0; } } + +.empty-language-selector__language-settings-button { + margin: 12px; +} diff --git a/resources/js/ext.uls.interface.js b/resources/js/ext.uls.interface.js index 4f98290a..d568cd4b 100644 --- a/resources/js/ext.uls.interface.js +++ b/resources/js/ext.uls.interface.js @@ -717,7 +717,58 @@ } } + /** + * The new Vector 2022 skin uses a less prominent language button for non-content pages. + * For these pages, the ULS should not be displayed, but a dropdown with an appropriate message + * should appear. The UniversalLanguageSelector extension should add a button to open the + * language settings, inside this dropdown. + * This method adds this button inside the dropdown. + */ + function addLanguageSettingsToNonContentPages() { + var $languageBtn = $( '#p-lang-btn' ); + var clickHandler = function ( event ) { + event.stopPropagation(); + + mw.loader.using( languageSettingsModules ).then( function () { + $( event.target ).languagesettings( { + autoOpen: true, + onPosition: function () { + var offset = $languageBtn.offset(); + var top = offset.top + $languageBtn.outerHeight(); + var right = $( window ).width() - offset.left - $languageBtn.outerWidth(); + return { top: top, right: right }; + } + } ); + } ); + }; + // the first time the language button is clicked inside a non-content page, + // we should add the "Open language settings" button inside the dropdown + $languageBtn.one( 'mouseover', function () { + mw.loader.using( [ 'oojs-ui-widgets', 'oojs-ui.styles.icons-interactions', 'ext.uls.messages' ] ) + .done( function () { + var actionButton = new ActionsMenuItem( + 'settings', + $.i18n( 'ext-uls-actions-menu-language-settings-item-label' ), + clickHandler, + null + ).render(); + + actionButton.$element.addClass( 'empty-language-selector__language-settings-button' ); + var $emptyLanguageSelectorBody = $( '.mw-portlet-empty-language-selector-body' ); + $emptyLanguageSelectorBody.after( actionButton.$element ); + } ); + } ); + } + function init() { + // if it's not Vector skin, nothing to be done here + if ( mw.config.get( 'skin' ) === 'vector-2022' && mw.config.get( 'wgULSisLanguageSelectorEmpty' ) ) { + // if this is a non-content page, we should add the "Open language settings" button + // inside the language dropdown + addLanguageSettingsToNonContentPages(); + // TODO: should we return after here? + } + initLanguageChangeUndoTooltip(); initIme();