From 6bab937dc76a5e0b0369104ad1e891b8d8dd5549 Mon Sep 17 00:00:00 2001 From: Schnark Date: Wed, 15 Jul 2015 09:11:56 +0000 Subject: [PATCH] jquery.makeCollapsible: Make it possible to clone a collapsible Currently collapsible elements are no longer collapsible after you cloned them and made them collapsible again, e.g. via $clone = $('#bodyContent').clone(); mw.hook('wikipage.content').fire($clone); $('#bodyContent').replaceWith($clone); This patch fixes this by ignoring the linksPassthru option on links with href="#". Bug: T71288 Change-Id: I954483f3e26f46172ec2374a3717f37dd309ca57 --- resources/src/jquery/jquery.makeCollapsible.js | 9 +++++++-- .../jquery/jquery.makeCollapsible.test.js | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/resources/src/jquery/jquery.makeCollapsible.js b/resources/src/jquery/jquery.makeCollapsible.js index f7c4217797..19fdb2635d 100644 --- a/resources/src/jquery/jquery.makeCollapsible.js +++ b/resources/src/jquery/jquery.makeCollapsible.js @@ -159,8 +159,13 @@ } if ( e ) { - if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) { - // Don't fire if a link was clicked, if requested (for premade togglers by default) + if ( + e.type === 'click' && + options.linksPassthru && + $.nodeName( e.target, 'a' ) && + $( e.target ).attr( 'href' ) !== '#' + ) { + // Don't fire if a link with href !== '#' was clicked, if requested (for premade togglers by default) return; } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) { // Only handle keypresses on the "Enter" or "Space" keys diff --git a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js index 804058193b..c51e40931c 100644 --- a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js @@ -336,4 +336,22 @@ this.clock.tick( 500 ); } ); + QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) { + var test = this, + $collapsible = prepareCollapsible( + '
' + loremIpsum + '
' + ), + $clone = $collapsible.clone() // clone without data and events + .appendTo( '#qunit-fixture' ).makeCollapsible(), + $content = $clone.find( '.mw-collapsible-content' ); + + assert.assertTrue( $content.is( ':visible' ), 'content is visible' ); + + $clone.on( 'afterCollapse.mw-collapsible', function () { + assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' ); + } ); + + $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' ); + test.clock.tick( 500 ); + } ); }( mediaWiki, jQuery ) ); -- 2.20.1