From da9a849b4205ef03506f95cc6691ddf1543adaa7 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Sat, 14 Mar 2015 00:48:18 +0200 Subject: [PATCH 1/4] Show the Common language section only if the list is long enough --- src/jquery.uls.lcd.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index b52dcee..84e2f24 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -115,6 +115,8 @@ render: function () { var $section, + language, + languagesCount = 0, lcd = this, regions = [], regionNames = { @@ -129,7 +131,24 @@ PA: 'Pacific' }; - regions.push( this.buildQuicklist() ); + // IE8 does not support Object.keys + if ( Object.keys ) { + languagesCount = Object.keys( this.options.languages ).length; + } else { + for ( language in this.options.languages ) { + if ( Object.prototype.hasOwnProperty.call( + this.options.languages, + language + ) ) { + languagesCount++; + } + } + } + + // Show the Common languages section, unless the list is very short + if ( languagesCount > 12 ) { + regions.push( this.buildQuicklist() ); + } $.each( $.uls.data.regiongroups, function ( regionCode ) { lcd.regionLanguages[ regionCode ] = []; From c81561b3fc918d6058d0de96ddc56819f8d05de8 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Sat, 14 Mar 2015 23:20:09 +0200 Subject: [PATCH 2/4] Refactor the object keys counter function --- src/jquery.uls.core.js | 45 +++++++++++++++++++++++++++-------------- src/jquery.uls.lcd.js | 17 ++-------------- test/jquery.uls.test.js | 21 +++++++++++++++++++ 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/jquery.uls.core.js b/src/jquery.uls.core.js index fba4859..c8e9bf0 100644 --- a/src/jquery.uls.core.js +++ b/src/jquery.uls.core.js @@ -53,6 +53,34 @@ '; /*jshint multistr:false */ + $.uls = $.uls || {}; + + $.uls.utils = {}; + + /** + * Count the number of keys in an object. + * Works in a cross-browser way. + * @param {Object} The object. + */ + $.uls.utils.objectLength = function ( obj ) { + var count, key; + + // Some old browsers don't support Object.keys + if ( Object.keys ) { + return Object.keys( obj ).length; + } + + count = 0; + + for ( key in obj ) { + if ( Object.prototype.hasOwnProperty.call( obj, key ) ) { + count++; + } + } + + return count; + }; + /** * ULS Public class definition */ @@ -354,26 +382,13 @@ * @return string */ getMenuWidth: function () { - var language, - languagesCount = 0; + var languagesCount; if ( this.options.menuWidth ) { return this.options.menuWidth; } - // IE8 does not support Object.keys - if ( Object.keys ) { - languagesCount = Object.keys( this.options.languages ).length; - } else { - for ( language in this.options.languages ) { - if ( Object.prototype.hasOwnProperty.call( - this.options.languages, - language - ) ) { - languagesCount++; - } - } - } + languagesCount = $.uls.utils.objectLength( this.options.languages ); if ( languagesCount < 12 ) { return 'narrow'; diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index 84e2f24..2ebefef 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -115,8 +115,7 @@ render: function () { var $section, - language, - languagesCount = 0, + languagesCount, lcd = this, regions = [], regionNames = { @@ -131,19 +130,7 @@ PA: 'Pacific' }; - // IE8 does not support Object.keys - if ( Object.keys ) { - languagesCount = Object.keys( this.options.languages ).length; - } else { - for ( language in this.options.languages ) { - if ( Object.prototype.hasOwnProperty.call( - this.options.languages, - language - ) ) { - languagesCount++; - } - } - } + languagesCount = $.uls.utils.objectLength( this.options.languages ); // Show the Common languages section, unless the list is very short if ( languagesCount > 12 ) { diff --git a/test/jquery.uls.test.js b/test/jquery.uls.test.js index c3bbf1c..8721cf9 100644 --- a/test/jquery.uls.test.js +++ b/test/jquery.uls.test.js @@ -272,4 +272,25 @@ assert.ok( !$.uls.data.deleteLanguage( 'qqr' ), 'Deleting language qqr, which was never added, returns false.' ); } ); + test( '-- $.uls.utils testing', 4, function ( assert ) { + var languages, saveObjectKeys; + + languages = { + mn: 'монгол', + sah: 'саха', + udm: 'удмурт' + }; + + assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); + assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); + + // Simulate a browser without Object.keys + saveObjectKeys = Object.keys; + Object.keys = undefined; + + assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); + assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); + + Object.keys = saveObjectKeys; + } ); }( jQuery ) ); From eb4f8ff2516ef647c801251ac7fe1e25dfb929e7 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Tue, 24 Mar 2015 09:56:52 +0200 Subject: [PATCH 3/4] Make language count calculation only in core.js --- src/jquery.uls.core.js | 14 ++++++-------- src/jquery.uls.lcd.js | 8 +------- test/jquery.uls.test.js | 22 ---------------------- 3 files changed, 7 insertions(+), 37 deletions(-) diff --git a/src/jquery.uls.core.js b/src/jquery.uls.core.js index c8e9bf0..35b3b3a 100644 --- a/src/jquery.uls.core.js +++ b/src/jquery.uls.core.js @@ -53,16 +53,12 @@ '; /*jshint multistr:false */ - $.uls = $.uls || {}; - - $.uls.utils = {}; - /** * Count the number of keys in an object. * Works in a cross-browser way. * @param {Object} The object. */ - $.uls.utils.objectLength = function ( obj ) { + function objectLength ( obj ) { var count, key; // Some old browsers don't support Object.keys @@ -236,7 +232,7 @@ * Bind the UI elements with their event listeners */ listen: function () { - var lcd, columnsOptions, + var lcd, columnsOptions, languagesCount, uls = this; columnsOptions = { @@ -263,10 +259,12 @@ this.$menu.on( 'keydown', $.proxy( this.keypress, this ) ); } + languagesCount = objectLength( this.options.languages ); lcd = this.$resultsView.lcd( { languages: this.languages, columns: columnsOptions[ this.getMenuWidth() ], - quickList: this.options.quickList, + + quickList: languagesCount > 12 ? this.options.quickList : false, clickhandler: $.proxy( this.select, this ), source: this.$languageFilter, showRegions: this.options.showRegions, @@ -388,7 +386,7 @@ return this.options.menuWidth; } - languagesCount = $.uls.utils.objectLength( this.options.languages ); + languagesCount = objectLength( this.options.languages ); if ( languagesCount < 12 ) { return 'narrow'; diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index 2ebefef..b52dcee 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -115,7 +115,6 @@ render: function () { var $section, - languagesCount, lcd = this, regions = [], regionNames = { @@ -130,12 +129,7 @@ PA: 'Pacific' }; - languagesCount = $.uls.utils.objectLength( this.options.languages ); - - // Show the Common languages section, unless the list is very short - if ( languagesCount > 12 ) { - regions.push( this.buildQuicklist() ); - } + regions.push( this.buildQuicklist() ); $.each( $.uls.data.regiongroups, function ( regionCode ) { lcd.regionLanguages[ regionCode ] = []; diff --git a/test/jquery.uls.test.js b/test/jquery.uls.test.js index 8721cf9..e4aa76d 100644 --- a/test/jquery.uls.test.js +++ b/test/jquery.uls.test.js @@ -271,26 +271,4 @@ assert.strictEqual( $.uls.data.languages['qqq'], undefined, 'Data about qqq is undefined after being deleted.' ); assert.ok( !$.uls.data.deleteLanguage( 'qqr' ), 'Deleting language qqr, which was never added, returns false.' ); } ); - - test( '-- $.uls.utils testing', 4, function ( assert ) { - var languages, saveObjectKeys; - - languages = { - mn: 'монгол', - sah: 'саха', - udm: 'удмурт' - }; - - assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); - assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); - - // Simulate a browser without Object.keys - saveObjectKeys = Object.keys; - Object.keys = undefined; - - assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); - assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); - - Object.keys = saveObjectKeys; - } ); }( jQuery ) ); From f724e4a289ecff9b0dea7bcb1c06b07a95e7c532 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Wed, 8 Apr 2015 09:41:17 +0300 Subject: [PATCH 4/4] Remove unnecessary semicolon --- src/jquery.uls.core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jquery.uls.core.js b/src/jquery.uls.core.js index 35b3b3a..201d384 100644 --- a/src/jquery.uls.core.js +++ b/src/jquery.uls.core.js @@ -75,7 +75,7 @@ } return count; - }; + } /** * ULS Public class definition