From d8375b7bd86cb50c5e3561a2814561210fd80363 Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Thu, 31 Oct 2013 19:56:26 +0200 Subject: [PATCH] Columntoggle table: Use delegation to attach events to the checkboxes Fixes #6683 --- js/widgets/table.columntoggle.js | 11 ++---- tests/unit/table/index.html | 27 ++++++++++++++ tests/unit/table/table_core.js | 62 ++++++++++++++++++++++++++++++-- 3 files changed, 88 insertions(+), 12 deletions(-) diff --git a/js/widgets/table.columntoggle.js b/js/widgets/table.columntoggle.js index eab9fbb5441..16e36895a6a 100644 --- a/js/widgets/table.columntoggle.js +++ b/js/widgets/table.columntoggle.js @@ -41,7 +41,6 @@ $.widget( "mobile.table", $.mobile.table, { if ( this.options.enhanced ) { this._menu = $( this.document[ 0 ].getElementById( this._id() + "-popup" ) ).children().first(); this._addToggles( this._menu, true ); - this._bindToggles( this._menu ); } else { this._menu = this._enhanceColToggle(); this.element.addClass( this.options.classes.columnToggleTable ); @@ -64,13 +63,8 @@ $.widget( "mobile.table", $.mobile.table, { this._on( this.window, { throttledresize: "_setToggleState" }); - }, - - _bindToggles: function( menu ) { - var inputs = menu.find( "input" ); - - this._on( inputs, { - change: "_menuInputChange" + this._on( this._menu, { + "change input": "_menuInputChange" }); }, @@ -113,7 +107,6 @@ $.widget( "mobile.table", $.mobile.table, { // set bindings here if ( !keep ) { menu.controlgroup( "refresh" ); - this._bindToggles( menu ); } }, diff --git a/tests/unit/table/index.html b/tests/unit/table/index.html index a1f3ba48d58..5e89ce41f82 100644 --- a/tests/unit/table/index.html +++ b/tests/unit/table/index.html @@ -135,6 +135,33 @@

Basic Table

Basic Table

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RankMovie TitleYearRatingReviews
1Citizen Kane1941100%74
2Casablanca194297%64
diff --git a/tests/unit/table/table_core.js b/tests/unit/table/table_core.js index 5b07767ad5e..9ca1b6eff0f 100644 --- a/tests/unit/table/table_core.js +++ b/tests/unit/table/table_core.js @@ -157,7 +157,7 @@ asyncTest( "The page should be enhanced correctly" , function(){ setTimeout(function() { var $popup = $('#column-table-test #movie-table-column-popup-popup'), - button = $('#column-table-test .ui-table-columntoggle-btn'); + button = $('#column-table-test .ui-table-columntoggle-btn:last'); ok($('#column-table-test .ui-table-columntoggle').length, ".ui-table-columntoggle class added to table element"); ok($('#column-table-test .ui-table-columntoggle-btn').length, ".ui-table-columntoggle-btn button added"); @@ -173,6 +173,62 @@ }, 800); }); + asyncTest( "Toggle column", function() { + expect( 6 ); + + var initial, post, + input = $( "#toggle-column-test-popup input:nth(1)" ), + column = $( "#toggle-column-test tr>:nth-child(3)" ), + + // Ascertain visibility and consistency + checkColumn = function( messagePrefix ) { + var visible = undefined, + inconsistent = false; + + column.each( function() { + if ( visible === undefined ) { + visible = !!$( this ).is( ":visible" ); + } else { + inconsistent = ( !!$( this ).is( ":visible" ) !== visible ); + } + if ( inconsistent ) { + + // Stop checking + return false; + } + }); + + deepEqual( inconsistent, false, + messagePrefix + " visibility of column members is consistent" ); + deepEqual( visible, input.is( ":checked" ), + messagePrefix + " visibility of column members coincides with the " + + "corresponding column checkbox state" ); + + return visible; + }; + + $.testHelper.detailedEventCascade([ + + function() { + initial = checkColumn( "Initially: " ); + input.click().checkboxradio( "refresh" ).trigger( "change" ); + }, + + { + change: { src: input, event: "change.toggleColumn1" } + }, + + function( result ) { + deepEqual( result.change.timedOut, false, "Clicking the checkbox " + + "has resulted in a 'change' event" ); + post = checkColumn( "After clicking: " ); + deepEqual( initial !== post, true, + "Visibility was toggled by clicking the checkbox" ); + start(); + } + ]); + }); + asyncTest( "Column toggle table refresh" , function(){ // hide one column and refresh @@ -258,7 +314,7 @@ var $input; $.testHelper.pageSequence([ function() { - $( ".ui-table-columntoggle-btn" ).click(); + $( ".ui-table-columntoggle-btn:last" ).click(); }, function() { setTimeout(function() { @@ -266,7 +322,7 @@ }, 800); }, function() { - $input = $( ".ui-popup-container" ).find( "input:first" ); + $input = $( "#movie-table-column-popup-popup" ).find( "input:first" ); $input.click(); }, function(){