diff --git a/extension.json b/extension.json index 90e859b6..dea015e2 100644 --- a/extension.json +++ b/extension.json @@ -159,8 +159,7 @@ }, "ext.uls.compactlinks": { "packageFiles": [ - "js/ext.uls.compactlinks.js", - "js/ext.uls.launch.js" + "js/ext.uls.compactlinks.js" ], "styles": "css/ext.uls.compactlinks.less", "dependencies": [ @@ -224,7 +223,10 @@ }, "ext.uls.interface": { "targets": [ "desktop", "mobile" ], - "scripts": "js/ext.uls.interface.js", + "packageFiles": [ + "js/ext.uls.interface.js", + "js/ext.uls.launch.js" + ], "styles": "css/ext.uls.interface.less", "dependencies": [ "mediawiki.jqueryMsg", diff --git a/includes/UniversalLanguageSelectorHooks.php b/includes/UniversalLanguageSelectorHooks.php index a532d416..62bf4746 100644 --- a/includes/UniversalLanguageSelectorHooks.php +++ b/includes/UniversalLanguageSelectorHooks.php @@ -106,9 +106,10 @@ class UniversalLanguageSelectorHooks { // Soft dependency to Wikibase client. Don't enable CLL if links are managed manually. $excludedLinks = $out->getProperty( 'noexternallanglinks' ); $override = is_array( $excludedLinks ) && in_array( '*', $excludedLinks ); - if ( !$override && self::isCompactLinksEnabled( $out->getUser() ) ) { - $out->addModules( 'ext.uls.compactlinks' ); - } + $config = [ + 'wgULSPosition' => $wgULSPosition, + 'wgULSCompactLinksEnabled' => !$override && self::isCompactLinksEnabled( $out->getUser() ), + ]; if ( is_string( $wgULSGeoService ) ) { $out->addModules( 'ext.uls.geoclient' ); @@ -121,7 +122,8 @@ class UniversalLanguageSelectorHooks { // This is added here, and not in addConfig to allow skins and extensions to vary it // For example, ContentTranslation special pages depend on being able to change it. - $out->addJsConfigVars( 'wgULSPosition', $wgULSPosition ); + $out->addJsConfigVars( $config ); + if ( $wgULSPosition === 'personal' ) { $out->addModuleStyles( 'ext.uls.pt' ); } else { diff --git a/resources/js/ext.uls.compactlinks.js b/resources/js/ext.uls.compactlinks.js index 122cd317..269bf402 100644 --- a/resources/js/ext.uls.compactlinks.js +++ b/resources/js/ext.uls.compactlinks.js @@ -20,8 +20,7 @@ ( function () { 'use strict'; - var DEFAULT_LIST_SIZE = 9, - launchULS = require( './ext.uls.launch.js' ); + var DEFAULT_LIST_SIZE = 9; /** * @param {Array} target @@ -179,7 +178,6 @@ this.compactList = this.getCompactList(); this.hideOriginal(); this.render(); - this.listen(); }; /** @@ -197,33 +195,6 @@ mw.hook( 'mw.uls.compactlinks.initialized' ).fire( true ); }; - /** - * Attaches the actual selector to the trigger. - * - * @param {jQuery} $trigger Element to use as trigger. - */ - CompactInterlanguageList.prototype.createSelector = function ( $trigger ) { - launchULS( - $trigger, - this.interlanguageList - ); - }; - - /** - * Bind to event handlers and listen for events - */ - CompactInterlanguageList.prototype.listen = function () { - var self = this; - - this.$trigger.one( 'click', function () { - // Load the ULS now. - mw.loader.using( 'ext.uls.mediawiki' ).then( function () { - self.createSelector( self.$trigger ); - self.$trigger.trigger( 'click' ); - } ); - } ); - }; - /** * Get the compacted interlanguage list as associative array * diff --git a/resources/js/ext.uls.interface.js b/resources/js/ext.uls.interface.js index a89a5e07..3cd82d75 100644 --- a/resources/js/ext.uls.interface.js +++ b/resources/js/ext.uls.interface.js @@ -19,7 +19,8 @@ ( function () { 'use strict'; - var languageSettingsModules = [ 'ext.uls.displaysettings' ]; + var languageSettingsModules = [ 'ext.uls.displaysettings' ], + launchULS = require( './ext.uls.launch.js' ); /** * Construct the display settings link @@ -442,10 +443,59 @@ } ); } + /** + * Compact the language list if necessary + */ + function compactLanguageLinksList() { + if ( + // Allow skins to register their own button, in which case no need to compact + !document.querySelector( '.mw-interlanguage-selector' ) && ( + // This line is for cached HTML where the JS config variable is not available + // it can be removed a week after this code has been in production. + mw.loader.getState( 'ext.uls.compactlinks' ) !== 'registered' || + mw.config.get( 'wgULSCompactLinksEnabled' ) + ) + ) { + mw.loader.using( 'ext.uls.compactlinks' ); + } + } + + /** + * Event handler for the language button + * @param {jQuery.Event} ev + */ + function clickLanguageButton( ev ) { + var $target = $( ev.currentTarget ); + ev.preventDefault(); + // Load the ULS now. + mw.loader.using( 'ext.uls.mediawiki' ).then( function () { + launchULS( + $target, + mw.uls.getInterlanguageListFromNodes( + document.querySelectorAll( '#p-lang .interlanguage-link-target' ) + ) + ); + $target.trigger( 'click' ); + } ); + } + /** + * Sets up the interlanguage selector button if present + */ + function initInterlanguageSelector() { + // Special handling for Timeless which stops propagation on links in this menu + if ( $( '.sidebar-inner' ).length ) { + $( '.sidebar-inner #p-lang' ).one( 'click', '.mw-interlanguage-selector', clickLanguageButton ); + } else { + $( document ).one( 'click', '.mw-interlanguage-selector', clickLanguageButton ); + } + } + function init() { initInterface(); initTooltip(); initIme(); + compactLanguageLinksList(); + initInterlanguageSelector(); } // Early execute of init