JGonera has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/98743


Change subject: Story 1401: Language Selector Overlay UI Redesign
......................................................................

Story 1401: Language Selector Overlay UI Redesign

Also make some overlay styles more uniform, fix a -1px margin hack so
that the border of the last element in an overlay list (.page-list)
doesn't disappear.

Change-Id: Ib700b810c1d1e10fdac1ae43f25c8e043227e02c
---
M MobileFrontend.i18n.php
M includes/Resources.php
M includes/skins/SkinMinerva.php
M includes/skins/SkinMobileBeta.php
R javascripts/modules/languages/LanguageOverlay.js
A javascripts/modules/languagesNew/LanguageOverlay.js
A javascripts/modules/languagesNew/languages.js
R javascripts/modules/languagesNew/preferred.js
M less/common/OverlayNew.less
M less/common/pagelist.less
M less/variables.less
A templates/modules/languagesNew/LanguageOverlay.html
A tests/javascripts/modules/languagesNew/test_languages.js
13 files changed, 239 insertions(+), 20 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend 
refs/changes/43/98743/1

diff --git a/MobileFrontend.i18n.php b/MobileFrontend.i18n.php
index 7c3dc5e..026f583 100644
--- a/MobileFrontend.i18n.php
+++ b/MobileFrontend.i18n.php
@@ -68,7 +68,7 @@
        'mobile-frontend-on' => 'ON',
        'mobile-frontend-featured-article' => 'Today\'s featured content',
        'mobile-frontend-news-items' => 'In The News',
-       'mobile-frontend-language' => 'Language:',
+       'mobile-frontend-language-heading' => "'''Languages'''",
        'mobile-frontend-language-article-heading' => 'Read in another 
language',
        'mobile-frontend-current-language' => '{{#language:{{CONTENTLANG}}}}',
        'mobile-frontend-language-header' => 'This page is available in $1 
{{PLURAL:$1|language|languages}}',
@@ -477,7 +477,7 @@
 {{Identical|On}}',
        'mobile-frontend-featured-article' => 'The title that will appear 
before the element with the mf-tfa selector.',
        'mobile-frontend-news-items' => 'The title that will appear before the 
element with the mf-itn selector.',
-       'mobile-frontend-language' => '{{Identical|Language}}',
+       'mobile-frontend-language-heading' => 'The title for the list of 
languages for a page.',
        'mobile-frontend-language-article-heading' => 'A heading within the 
page the content of which lists the other languages available for this page: 
translate the message considering the list to have an undetermined number of 
items.',
        'mobile-frontend-current-language' => '{{optional}}',
        'mobile-frontend-language-header' => 'Header at top of language 
selection overlay describing number of languages that it is possible to read 
the page in
diff --git a/includes/Resources.php b/includes/Resources.php
index 3c08653..b8a1738 100644
--- a/includes/Resources.php
+++ b/includes/Resources.php
@@ -505,7 +505,6 @@
                        'javascripts/modules/mf-toggle-dynamic.js',
                        'javascripts/modules/talk/talk.js',
                        'javascripts/modules/mediaViewer.js',
-                       'javascripts/modules/languages/preferred.js',
                        'javascripts/modules/keepgoing/keepgoing.js',
                ),
                'templates' => array(
@@ -619,7 +618,6 @@
        'mobile.stable.styles' => $wgMFMobileResourceBoilerplate + array(
                'styles' => array(
                        'less/common/common-js.less',
-                       'less/modules/languages.less',
                        'less/modules/watchstar.less',
                        'less/modules/tutorials.less',
                ),
@@ -676,8 +674,6 @@
                'templates' => array(
                        'section',
                        'wikitext/commons-upload',
-                       // LanguageOverlay.js
-                       'overlays/languages',
                        'overlays/cleanup',
                        // search.js and Nearby.js
                        'articleList',
@@ -701,8 +697,6 @@
                        'javascripts/common/notification.js',
                        'javascripts/common/Page.js',
                        'javascripts/modules/uploads/PhotoUploaderButton.js',
-                       // Language specific code
-                       'javascripts/common/languages/LanguageOverlay.js',
                ),
                'messages' => array(
                        // mf-navigation.js
@@ -712,11 +706,6 @@
 
                        // LearnMoreOverlay.js, newbie.js
                        'cancel',
-
-                       // LanguageOverlay.js
-                       'mobile-frontend-language-header',
-                       'mobile-frontend-language-site-choose',
-                       'mobile-frontend-language-footer',
 
                        // page.js
                        'mobile-frontend-talk-overlay-header',
@@ -773,7 +762,6 @@
                'scripts' => array(
                        'javascripts/externals/micro.autosize.js',
                        'javascripts/modules/mf-toggle.js',
-                       'javascripts/modules/languages/languages.js',
                        'javascripts/modules/uploads/lead-photo-init.js',
                        'javascripts/modules/mainmenutweaks.js',
                        'javascripts/modules/mf-watchstar.js',
@@ -838,6 +826,48 @@
                ),
        ),
 
+       // FIXME: remove when new overlays in stable
+       'mobile.languages' => $wgMFMobileResourceBoilerplate + array(
+               'dependencies' => array(
+                       'mobile.overlays',
+               ),
+               'styles' => array(
+                       'less/modules/languages.less',
+               ),
+               'scripts' => array(
+                       'javascripts/modules/languages/LanguageOverlay.js',
+                       'javascripts/modules/languages/languages.js',
+               ),
+               'templates' => array(
+                       'overlays/languages',
+               ),
+               'messages' => array(
+                       'mobile-frontend-language-header',
+                       'mobile-frontend-language-site-choose',
+                       'mobile-frontend-language-footer',
+               ),
+       ),
+
+       'mobile.languages.beta' => $wgMFMobileResourceBoilerplate + array(
+               'dependencies' => array(
+                       'mobile.overlays.beta',
+               ),
+               'scripts' => array(
+                       'javascripts/modules/languagesNew/LanguageOverlay.js',
+                       'javascripts/modules/languagesNew/languages.js',
+                       'javascripts/modules/languagesNew/preferred.js',
+               ),
+               'templates' => array(
+                       'modules/languagesNew/LanguageOverlay',
+               ),
+               'messages' => array(
+                       'mobile-frontend-language-heading' => array( 'parse' ),
+                       'mobile-frontend-language-header',
+                       'mobile-frontend-language-variant-header' => array( 
'parse' ),
+                       'mobile-frontend-language-site-choose',
+               ),
+       ),
+
        'mobile.issues' => $wgMFMobileResourceBoilerplate + array(
                'dependencies' => array(
                        'mobile.overlays',
diff --git a/includes/skins/SkinMinerva.php b/includes/skins/SkinMinerva.php
index 55e0901..7ebb25c 100644
--- a/includes/skins/SkinMinerva.php
+++ b/includes/skins/SkinMinerva.php
@@ -566,6 +566,7 @@
                $modules['stableonly'] = array( 'mobile.lastEdited.stable' );
                $modules['issues'] = array( 'mobile.issues' );
                $modules['editor'] = array( 'mobile.editor' );
+               $modules['languages'] = array( 'mobile.languages' );
 
                $title = $this->getTitle();
 
diff --git a/includes/skins/SkinMobileBeta.php 
b/includes/skins/SkinMobileBeta.php
index 9345155..5760180 100644
--- a/includes/skins/SkinMobileBeta.php
+++ b/includes/skins/SkinMobileBeta.php
@@ -61,6 +61,7 @@
                $modules['search'] = array( 'mobile.search.beta' );
                $modules['issues'] = array( 'mobile.issues.beta' );
                $modules['editor'] = array( 'mobile.editor.beta' );
+               $modules['languages'] = array( 'mobile.languages.beta' );
                // turn off stable only modules
                $modules['stableonly'] = array();
                return $modules;
diff --git a/javascripts/common/languages/LanguageOverlay.js 
b/javascripts/modules/languages/LanguageOverlay.js
similarity index 100%
rename from javascripts/common/languages/LanguageOverlay.js
rename to javascripts/modules/languages/LanguageOverlay.js
diff --git a/javascripts/modules/languagesNew/LanguageOverlay.js 
b/javascripts/modules/languagesNew/LanguageOverlay.js
new file mode 100644
index 0000000..ba19ab8
--- /dev/null
+++ b/javascripts/modules/languagesNew/LanguageOverlay.js
@@ -0,0 +1,61 @@
+( function( M, $ ) {
+
+       var OverlayNew = M.require( 'OverlayNew' ),
+               LanguageOverlay;
+
+       LanguageOverlay = OverlayNew.extend( {
+               defaults: {
+                       heading: mw.msg( 'mobile-frontend-language-heading' ),
+                       placeholder: mw.msg( 
'mobile-frontend-language-site-choose' )
+               },
+               className: 'language-overlay overlay',
+               templatePartials: {
+                       content: M.template.get( 
'modules/languagesNew/LanguageOverlay' )
+               },
+
+               initialize: function( options ) {
+                       if ( options.languages && options.languages.length ) {
+                               options.header = mw.msg( 
'mobile-frontend-language-header', options.languages.length );
+                       }
+                       if ( options.variants && options.variants.length ) {
+                               options.variantHeader = mw.msg( 
'mobile-frontend-language-variant-header' );
+                       }
+                       M.emit( 'language-overlay-initialize', options );
+                       this._super( options );
+               },
+
+               filterLists: function( val ) {
+                       var $items = this.$( '.page-list li' ), $subheaders = 
this.$( 'h3' );
+
+                       if ( val ) {
+                               $subheaders.hide();
+                               $items.each( function() {
+                                       var $item = $( this );
+                                       if ( $item.find( 'span' 
).text().toLowerCase().indexOf( val ) > -1 ) {
+                                               $item.show();
+                                       } else {
+                                               $item.hide();
+                                       }
+                               } );
+                       } else {
+                               $subheaders.show();
+                               $items.show();
+                       }
+               },
+
+               postRender: function( options ) {
+                       var self = this;
+                       this._super( options );
+
+                       this.$( 'ul' ).find( 'a' ).on( 'click', function() {
+                               M.emit( 'language-select', $( this ).attr( 
'lang' ) );
+                       } );
+                       this.$( '.search' ).on( 'input', function() {
+                               self.filterLists( $( this ).val().toLowerCase() 
);
+                       } );
+               }
+       } );
+
+       M.define( 'languagesNew/LanguageOverlay', LanguageOverlay );
+
+}( mw.mobileFrontend, jQuery ) );
diff --git a/javascripts/modules/languagesNew/languages.js 
b/javascripts/modules/languagesNew/languages.js
new file mode 100644
index 0000000..965e82c
--- /dev/null
+++ b/javascripts/modules/languagesNew/languages.js
@@ -0,0 +1,50 @@
+( function( M,  $ ) {
+
+       var LanguageOverlay = M.require( 'languagesNew/LanguageOverlay' );
+
+       /**
+        * Takes a list of languages and transforms them into an array for use 
in a LanguageOverlay
+        *
+        * @returns {Array}
+        */
+       function parseList( $list ) {
+               var list = [];
+               $list.find( 'li' ).each( function() {
+                       var $a = $( this ).find( 'a' ), lang, pageName = 
$a.attr( 'title' );
+
+                       lang = { lang: $a.attr( 'lang' ), langName: $a.text(), 
url: $a.attr( 'href' ) };
+                       if ( pageName ) {
+                               lang.pageName = pageName;
+                       }
+                       list.push( lang );
+               } );
+               return list;
+       }
+
+       function initButton() {
+               var $section = $( '#mw-mf-language-section' ),
+                       $h2 = $section.find( 'h2' ),
+                       languages = parseList( $section.find( 
'#mw-mf-language-selection' ) ),
+                       variants = parseList( $section.find( 
'#mw-mf-language-variant-selection' ) );
+
+               // assume the current language is not present
+               if ( languages.length > 0 || variants.length > 1 ) {
+                       $( '<button>' ).text( $h2.text() ).
+                               addClass( 'languageSelector' ).
+                               on( 'click', function() {
+                                       new LanguageOverlay( {
+                                               variants: variants,
+                                               languages: languages
+                                       } ).show();
+                               } ).insertBefore( $section );
+               }
+               $section.remove();
+       }
+
+       $( initButton );
+       M.on( 'languages-loaded', initButton );
+       M.define( 'modules/languagesNew/languages', {
+               _parseList: parseList
+       } );
+
+}( mw.mobileFrontend, jQuery ) );
diff --git a/javascripts/modules/languages/preferred.js 
b/javascripts/modules/languagesNew/preferred.js
similarity index 100%
rename from javascripts/modules/languages/preferred.js
rename to javascripts/modules/languagesNew/preferred.js
diff --git a/less/common/OverlayNew.less b/less/common/OverlayNew.less
index 19b85da..48f7518 100644
--- a/less/common/OverlayNew.less
+++ b/less/common/OverlayNew.less
@@ -76,11 +76,11 @@
                }
 
                .v-border:first-child {
-                       border-right: 1px solid #cacaca;
+                       border-right: 1px solid @grayLight;
                }
 
                .v-border:last-child li:last-child {
-                       border-left: 1px solid #cacaca;
+                       border-left: 1px solid @grayLight;
                }
 
                &.with-margins {
@@ -139,9 +139,13 @@
                }
        }
 
+       input, textarea {
+               padding: .5em;
+       }
+
        .panel {
-               padding: @contentMargin;
-               border-bottom: 1px solid @grayLight;
+               padding: 12px @contentMargin;
+               border-bottom: 1px solid @grayVeryLight;
        }
 
        .license {
@@ -156,6 +160,14 @@
                line-height: 1.4;
        }
 
+       h3 {
+               font-weight: normal;
+               font-size: .9em;
+               padding: .3em @contentMargin;
+               background-color: @grayVeryLight;
+               color: @grayMedium;
+       }
+
        // AbuseFilterOverlay
        .content {
                .cancel {
diff --git a/less/common/pagelist.less b/less/common/pagelist.less
index b43425e..725d575 100644
--- a/less/common/pagelist.less
+++ b/less/common/pagelist.less
@@ -32,10 +32,10 @@
        li {
                color: #666;
                position: relative;
-               border-bottom: solid 1px #eee;
+               border-bottom: solid 1px @grayVeryLight;
                padding: 18px @contentMargin;
                // avoid the gap between thumbnails
-               margin: 0 0 -1px;
+               margin: -1px 0 0;
                line-height: 1;
 
                > a {
diff --git a/less/variables.less b/less/variables.less
index dec1284..1bc220e 100644
--- a/less/variables.less
+++ b/less/variables.less
@@ -19,6 +19,7 @@
 @grayMedium: #777;
 @grayMediumLight: #aaa;
 @grayLight: #cacaca;
+@grayVeryLight: #eee;
 
 // page actions
 @watchStarSize: 22px;
diff --git a/templates/modules/languagesNew/LanguageOverlay.html 
b/templates/modules/languagesNew/LanguageOverlay.html
new file mode 100644
index 0000000..53d6017
--- /dev/null
+++ b/templates/modules/languagesNew/LanguageOverlay.html
@@ -0,0 +1,25 @@
+<div class="panel">
+       <input type="search" class="search" placeholder="{{placeholder}}">
+</div>
+{{#variantHeader}}
+<h3 class="mw-mf-overlay-header">{{{variantHeader}}}</h3>
+<ul class="page-list">
+       {{#variants}}
+               <li>
+                       <a href="{{url}}" hreflang="{{lang}}" 
lang="{{lang}}"><span>{{langName}}</span>{{#pageName}}  
({{pageName}}){{/pageName}}</a>
+               </li>
+       {{/variants}}
+</ul>
+{{/variantHeader}}
+{{#header}}
+{{#variantHeader}}
+<h3 class="mw-mf-overlay-header">{{{header}}}</h3>
+{{/variantHeader}}
+<ul class="page-list">
+       {{#languages}}
+               <li {{#preferred}}class="preferred"{{/preferred}}>
+                       <a href="{{url}}" hreflang="{{lang}}" 
lang="{{lang}}"><span>{{langName}}</span>{{#pageName}} 
({{pageName}}){{/pageName}}</a>
+               </li>
+       {{/languages}}
+</ul>
+{{/header}}
diff --git a/tests/javascripts/modules/languagesNew/test_languages.js 
b/tests/javascripts/modules/languagesNew/test_languages.js
new file mode 100644
index 0000000..86535ef
--- /dev/null
+++ b/tests/javascripts/modules/languagesNew/test_languages.js
@@ -0,0 +1,38 @@
+( function ( M, $ ) {
+
+var module = M.require( 'modules/languagesNew/languages' );
+
+QUnit.module( 'MobileFrontend: languages.js' );
+
+QUnit.test( 'no results', function() {
+       var i, list,
+               examples = [
+                       [
+                               '<ul></ul>',
+                               0
+                       ],
+                       [
+                               '<ul><li class="interwiki-de"><a 
href="//de.m.wikipedia.org/wiki/Unicorn" title="Unicorn" lang="de" 
hreflang="de">Deutsch</a></li><li class="interwiki-es"><a 
href="//es.m.wikipedia.org/wiki/Unicornio_(desambiguaci%C3%B3n)" 
title="Unicornio (desambiguación)" lang="es" hreflang="es">Español</a></li><li 
class="interwiki-fa"><a 
href="//fa.m.wikipedia.org/wiki/%D8%AA%DA%A9%E2%80%8C%D8%B4%D8%A7%D8%AE_(%D8%A7%D8%A8%D9%87%D8%A7%D9%85%E2%80%8C%D8%B2%D8%AF%D8%A7%DB%8C%DB%8C)"
 title="" lang="fa" hreflang="fa">فارسی</a></li><li class="interwiki-fr"><a 
href="//fr.m.wikipedia.org/wiki/Unicorn" title="Unicorn" lang="fr" 
hreflang="fr">Français</a></li><li class="interwiki-ko"><a 
href="//ko.m.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%98_(%EB%8F%99%EC%9D%8C%EC%9D%B4%EC%9D%98)"
 title="유니콘 (동음이의)" lang="ko" hreflang="ko">한국어</a></li><li 
class="interwiki-it"><a href="//it.m.wikipedia.org/wiki/Unicorn" 
title="Unicorn" lang="it" hreflang="it">Italiano</a></li><li 
class="interwiki-he"><a 
href="//he.m.wikipedia.org/wiki/%D7%97%D7%93-%D7%A7%D7%A8%D7%9F_(%D7%A4%D7%99%D7%A8%D7%95%D7%A9%D7%95%D7%A0%D7%99%D7%9D)"
 title="חד-קרן (פירושונים)" lang="he" hreflang="he">עברית</a></li><li 
class="interwiki-la"><a href="//la.m.wikipedia.org/wiki/Monoceros" 
title="Monoceros" lang="la" hreflang="la">Latina</a></li><li 
class="interwiki-lt"><a 
href="//lt.m.wikipedia.org/wiki/Vienaragis_(reik%C5%A1m%C4%97s)" 
title="Vienaragis (reikšmės)" lang="lt" hreflang="lt">Lietuvių</a></li><li 
class="interwiki-nl"><a href="//nl.m.wikipedia.org/wiki/Eenhoorn" 
title="Eenhoorn" lang="nl" hreflang="nl">Nederlands</a></li><li 
class="interwiki-ja"><a 
href="//ja.m.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%82%B3%E3%83%BC%E3%83%B3_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)"
 title="ユニコーン (曖昧さ回避)" lang="ja" hreflang="ja">日本語</a></li><li 
class="interwiki-pl"><a 
href="//pl.m.wikipedia.org/wiki/Jednoro%C5%BCec_(ujednoznacznienie)" 
title="Jednorożec (ujednoznacznienie)" lang="pl" 
hreflang="pl">Polski</a></li><li class="interwiki-pt"><a 
href="//pt.m.wikipedia.org/wiki/Unic%C3%B3rnio_(desambigua%C3%A7%C3%A3o)" 
title="Unicórnio (desambiguação)" lang="pt" hreflang="pt">Português</a></li><li 
class="interwiki-ru"><a 
href="//ru.m.wikipedia.org/wiki/%D0%95%D0%B4%D0%B8%D0%BD%D0%BE%D1%80%D0%BE%D0%B3_(%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F)"
 title="Единорог (значения)" lang="ru" hreflang="ru">Русский</a></li><li 
class="interwiki-fi"><a href="//fi.m.wikipedia.org/wiki/Unicorn" 
title="Unicorn" lang="fi" hreflang="fi">Suomi</a></li><li 
class="interwiki-uk"><a 
href="//uk.m.wikipedia.org/wiki/%D0%84%D0%B4%D0%B8%D0%BD%D0%BE%D1%80%D1%96%D0%B3_(%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%BD%D1%8F)"
 title="Єдиноріг (значення)" lang="uk" hreflang="uk">Українська</a></li></ul>',
+                               16,
+                               { url: '//de.m.wikipedia.org/wiki/Unicorn', 
lang: 'de', langName: 'Deutsch', pageName: 'Unicorn' }
+                       ],
+                       [
+                               '<ul><li><a 
href="//fr.m.wikipedia.org/wiki/Bonjour" lang="fr" 
title="Bonjour">French</a></li></ul>',
+                               1,
+                               { url: '//fr.m.wikipedia.org/wiki/Bonjour', 
lang: 'fr', langName: 'French', pageName: 'Bonjour' }
+                       ],
+                       [
+                               '<ul><li><a 
href="//klingon.m.wikipedia.org/wiki/MainPage" 
lang="klz">Klingon</a></li></ul>',
+                               1,
+                               { url: 
'//klingon.m.wikipedia.org/wiki/MainPage', lang: 'klz', langName: 'Klingon' }
+                       ]
+               ];
+       QUnit.expect( examples.length * 2 );
+       for( i = 0; i < examples.length; i++ ) {
+               list = module._parseList(  $( examples[i][0] ) );
+               strictEqual( list.length, examples[i][1], 'check the length was 
as expected' );
+               deepEqual( list[0], examples[i][2], 'Check the first result' );
+       }
+} );
+
+}( mw.mobileFrontend, jQuery ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/98743
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib700b810c1d1e10fdac1ae43f25c8e043227e02c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: JGonera <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to