jquery.makeCollapsible: Make it possible to clone a collapsible
authorSchnark <listenleser@gmail.com>
Wed, 15 Jul 2015 09:11:56 +0000 (09:11 +0000)
committer[[mw:User:Schnark]] <gerritpatchuploader@gmail.com>
Wed, 15 Jul 2015 09:11:56 +0000 (09:11 +0000)
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
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js

index f7c4217..19fdb26 100644 (file)
                }
 
                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
index 8040581..c51e409 100644 (file)
                this.clock.tick( 500 );
        } );
 
+       QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
+               var test = this,
+                       $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $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 ) );