מדיה ויקי:Gadget-foldPortalMenus.js
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload), או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh), או ללחוץ על צירוף המקשים Ctrl-F5.
- אופרה: ללחוץ על Ctrl-F5.
// Mediawiki:Gadget-foldPortalMenus.js // allow folding of side-menus to emulate a feature which was removed from mediawiki. $( function() { "use strict"; function doit() { var storageKey = 'portalFolded', skin = mw.config.get( 'skin' ), portalSelector, bodySelector, divPortalSelector = 'div.portal', foldedClass = 'foldmenu-folded', expandedClass = 'foldmenu-expanded', heights = {}, toggleElement = function( elem ) { var id = elem.closest( portalSelector ).attr( 'id' ), hide = ! elem.hasClass( foldedClass ); elem.toggleClass( expandedClass, !hide ) .toggleClass(foldedClass, hide ) .siblings().stop( true ).animate( { maxHeight: hide ? 0 : heights[id] } ); mw.storage.set( storageKey + id, JSON.stringify( hide ) ); }, preparePortalBody = function( index, elem ) { var $elem = $( elem ), id = $elem.closest( portalSelector ).attr( 'id' ), height = $elem.height(); $elem.css( 'max-height', $elem.height() ); heights[id] = height; }, prepareHeader = function( selector ) { $( selector ) .addClass( expandedClass ) .prepend( $('<span>', { 'class': 'plus' } ).text( '+' ) ) .prepend( $('<span>', { 'class': 'minus' } ).text( '-' ) ) .click( function() { toggleElement( $(this) ) } ); }, recalcHeights = function() { $( portalSelector + ' ' + bodySelector ).each( function() { var $div = $( this ), id = $div.closest( divPortalSelector ).attr( 'id' ), clone = $div.clone() .css( { maxHeight: 50000, left: -5000, display: 'block' } ) .appendTo( 'body' ), height = heights[id] = Math.max( (heights[id] || 0), clone.height() ); $div.css( { maxHeight: height } ); clone.remove(); }); }, restoreState = function() { $( portalSelector ).each( function( index, item ) { var $item = $( item ), id = $item.attr( 'id' ), $h3 = $( 'h3:first', item ), toFold; try { toFold = mw.storage.get( storageKey + id ); if ( toFold ) toFold = JSON.parse( toFold ); } catch(e) { toFold = false; } if ( toFold != $h3.hasClass( foldedClass ) ) toggleElement( $( 'h3:first', item ) ); }); }; switch( skin ) { case 'vector-2022': portalSelector = 'div.vector-main-menu-group'; bodySelector = 'div.vector-menu-content'; divPortalSelector = 'div.mw-portlet' break; case 'vector': portalSelector = 'nav.portal'; bodySelector = 'div.vector-menu-content'; break; case 'monobook': portalSelector = 'div.portlet'; bodySelector = 'div.pBody'; break; default: return; } $( portalSelector + ' h3#p-navigation-label' ).toggle( true ); $( portalSelector + ' ' + bodySelector ).each( preparePortalBody ); prepareHeader( portalSelector + ' h3' ); restoreState(); $( document ).on( 'new-portlet-link', function( event, portalId ) { recalcHeights(); if ( ! portalId ) return; var ps = '#' + portalId; preparePortalBody( 0, ps ); prepareHeader( ps + ' h3' ); restoreState(); }); } // doit setTimeout(doit, 777); });