Merge "Implement visual language grouping in ULS"

This commit is contained in:
Amire80
2012-08-07 10:59:15 +00:00
committed by Gerrit Code Review
4 changed files with 78 additions and 31 deletions

View File

@@ -52,3 +52,7 @@
margin-top: 1.6em; margin-top: 1.6em;
line-height: 1.6em; line-height: 1.6em;
} }
.uls-lcd-region-section ul li.uls-column-break:hover{
background: none;
}

View File

@@ -170,16 +170,20 @@
}; };
/** /**
* Get the given list of languages sorted by script. * Get the given list of languages grouped by script.
* @param languages Array of language codes * @param languages Array of language codes
* @return {Object} Array of languages indexed by script codes * @return {Object} Array of languages indexed by script codes
*/ */
$.uls.data.languagesByScriptGroup = function( languages ) { $.uls.data.languagesByScriptGroup = function( languages ) {
var languagesByScriptGroup = {}, scriptGroup, language, langScriptGroup; var languagesByScriptGroup = {},
scriptGroup,
language,
langScriptGroup;
for ( scriptGroup in $.uls.data.scriptgroups ) { for ( scriptGroup in $.uls.data.scriptgroups ) {
for ( language in languages ) { for ( language in languages ) {
langScriptGroup = $.uls.data.scriptGroupOfLanguage( language ); langScriptGroup = $.uls.data.scriptGroupOfLanguage( language );
if( langScriptGroup !== scriptGroup ){ if( langScriptGroup !== scriptGroup ) {
continue; continue;
} }
if ( !languagesByScriptGroup[scriptGroup] ) { if ( !languagesByScriptGroup[scriptGroup] ) {
@@ -188,8 +192,10 @@
languagesByScriptGroup[scriptGroup].push( language ); languagesByScriptGroup[scriptGroup].push( language );
} }
} }
return languagesByScriptGroup; return languagesByScriptGroup;
}; };
/** /**
* Returns an associative array of languages in several regions, * Returns an associative array of languages in several regions,
* grouped by script group. * grouped by script group.
@@ -298,4 +304,15 @@
$.uls.data.scriptGroupOfLanguage = function( language ) { $.uls.data.scriptGroupOfLanguage = function( language ) {
return $.uls.data.groupOfScript( $.uls.data.script( language ) ); return $.uls.data.groupOfScript( $.uls.data.script( language ) );
}; };
/**
* A callback for sorting languages by autonym.
* Can be used as an argument to a sort function.
* @param two language codes
*/
$.uls.data.sortByAutonym = function( a, b ) {
var autonymA = $.uls.data.autonym( a ) || a,
autonymB = $.uls.data.autonym( b ) || b;
return ( autonymA.toLowerCase() < autonymB.toLowerCase() ) ? -1 : 1;
};
} )( jQuery ); } )( jQuery );

View File

@@ -67,7 +67,7 @@
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
} else { } else {
this.options.$target.focus(); this.options.$target.focus();
} }
default: default:
var that = this; var that = this;
@@ -87,7 +87,10 @@
}, },
toggleClear: function() { toggleClear: function() {
if ( !this.$clear.length ) return; if ( !this.$clear.length ) {
return;
}
if ( this.$element.val() ) { if ( this.$element.val() ) {
this.$clear.show(); this.$clear.show();
} else { } else {
@@ -101,8 +104,10 @@
scriptGroup, langNum, langCode; scriptGroup, langNum, langCode;
this.resultCount = 0; this.resultCount = 0;
for ( scriptGroup in languages ) { for ( scriptGroup in languages ) {
for ( langNum = 0; langNum < languages[scriptGroup].length; langNum++ ) { var languagesInScript = languages[scriptGroup];
langCode = languages[scriptGroup][langNum]; languagesInScript.sort( $.uls.data.sortByAutonym );
for ( langNum = 0; langNum < languagesInScript.length; langNum++ ) {
langCode = languagesInScript[langNum];
if ( query === "" || this.filter( langCode, query ) ) { if ( query === "" || this.filter( langCode, query ) ) {
if ( this.resultCount === 0 ) { if ( this.resultCount === 0 ) {
// Autofill the first result. // Autofill the first result.
@@ -261,6 +266,7 @@
test: function( langCode ) { test: function( langCode ) {
var langRegions = $.uls.data.regions( langCode ), var langRegions = $.uls.data.regions( langCode ),
region; region;
for ( var i = 0; i < this.regions.length; i++ ) { for ( var i = 0; i < this.regions.length; i++ ) {
region = this.regions[i]; region = this.regions[i];
if ( $.inArray( region, langRegions ) >= 0 ) { if ( $.inArray( region, langRegions ) >= 0 ) {
@@ -271,21 +277,21 @@
}, },
show: function() { show: function() {
var i, regions, language, languagesByScriptGroup, scriptGroup, languages;
// Make the selected region (and it only) active // Make the selected region (and it only) active
$( '.regionselector' ).removeClass( 'active' ); $( '.regionselector' ).removeClass( 'active' );
if( this.regionGroup ) { if ( this.regionGroup ) {
// if there is a region group, make it active. // if there is a region group, make it active.
this.$element.addClass( 'active' ); this.$element.addClass( 'active' );
} }
// Re-populate the list of languages // Re-populate the list of languages
this.options.$target.empty(); this.options.$target.empty();
languagesByScriptGroup = $.uls.data.languagesByScriptGroup( this.options.languages ); var languagesByScriptGroup = $.uls.data.languagesByScriptGroup( this.options.languages );
for ( scriptGroup in languagesByScriptGroup ) { for ( var scriptGroup in languagesByScriptGroup ) {
languages = languagesByScriptGroup[scriptGroup]; var languages = languagesByScriptGroup[scriptGroup];
for ( i = 0; i < languages.length; i++) { languages.sort( $.uls.data.sortByAutonym );
language = languages[i]; for ( var i = 0; i < languages.length; i++ ) {
this.test( language ); this.test( languages[i] );
} }
} }

View File

@@ -32,7 +32,6 @@
constructor: LanguageCategoryDisplay, constructor: LanguageCategoryDisplay,
append: function( langCode, regionCode, languageName ) { append: function( langCode, regionCode, languageName ) {
var that = this;
this.addToRegion( langCode, regionCode, languageName ); this.addToRegion( langCode, regionCode, languageName );
}, },
@@ -47,10 +46,10 @@
addToRegion: function( langCode, region, languageName) { addToRegion: function( langCode, region, languageName) {
var that = this; var that = this;
var language = that.options.languages[langCode], var language = that.options.languages[langCode],
langName = languageName langName = languageName ||
|| $.uls.data.autonym( langCode ) $.uls.data.autonym( langCode ) ||
|| that.options.languages[langCode] that.options.languages[langCode] ||
|| langCode, langCode,
regions = []; regions = [];
if ( region ) { if ( region ) {
regions.push( region ); regions.push( region );
@@ -68,8 +67,22 @@
); );
// Append the element to the column in the list // Append the element to the column in the list
var column = that.getColumn( regionCode ); var $column = that.getColumn( regionCode );
column.append( $li ); var lastLanguage = $column.find( 'li:last' ).data( 'code' );
if ( lastLanguage ) {
var lastScriptGroup = $.uls.data.scriptGroupOfLanguage( lastLanguage ),
currentScriptGroup = $.uls.data.scriptGroupOfLanguage( langCode );
if ( lastScriptGroup !== currentScriptGroup ) {
if ( $column.find( 'li' ).length > 5 ) {
// If column has already 5 or more languages, add a new column
$column = that.getColumn( regionCode, true );
} else {
// An empty item as column break.
$column.append( $( '<li>' ).addClass( 'uls-column-break' ) );
}
}
}
$column.append( $li );
if ( that.options.clickhandler ) { if ( that.options.clickhandler ) {
$li.click( function() { $li.click( function() {
@@ -78,23 +91,30 @@
} }
} }
}, },
/**
getColumn: function( regionCode ) { * Get a column to add language.
var $divRegionCode = $( 'div#' + regionCode ); * @param String regionCode The region code
var $rowDiv = $divRegionCode.find( 'div.row:last' ); * @param boolean forceNew whether a new column must be created or not
var $ul = $divRegionCode.find( 'ul:last' ); */
getColumn: function( regionCode, forceNew ) {
var $divRegionCode, $rowDiv, $ul;
forceNew = forceNew || false;
$divRegionCode = $( 'div#' + regionCode );
$rowDiv = $divRegionCode.find( 'div.row:last' );
$ul = $divRegionCode.find( 'ul:last' );
// Each column can have maximum 10 languages. // Each column can have maximum 10 languages.
if ( $ul.length === 0 || $ul.find( 'li' ).length >= 10 ) { if ( $ul.length === 0 || $ul.find( 'li' ).length >= 10 || forceNew ) {
// Each row can have 4 columns with 10 languages.
$ul = $( '<ul>' ).addClass( 'three columns end' ); $ul = $( '<ul>' ).addClass( 'three columns end' );
if ( $rowDiv.length === 0 || $rowDiv.find( 'ul' ).length >= 4 ) { if ( $rowDiv.length === 0 || $rowDiv.find( 'ul' ).length >= 4 ) {
$rowDiv = $( '<div>' ).addClass( 'row uls-language-block' ); $rowDiv = $( '<div>' ).addClass( 'row uls-language-block' );
$divRegionCode.append( $rowDiv ); $divRegionCode.append( $rowDiv );
$ul.addClass('offset-by-one'); $ul.addClass( 'offset-by-one' );
} }
$rowDiv.append( $ul ); $rowDiv.append( $ul );
} }
$divRegionCode.show(); if( !$divRegionCode.is( ':visible' ) ) {
$divRegionCode.show();
}
return $ul; return $ul;
}, },