מדיה ויקי:Gadget-foldPortalMenus.js: הבדלים בין גרסאות בדף
(.) |
מ (30 גרסאות של הדף wikipedia:he:מדיה_ויקי:Gadget-foldPortalMenus.js יובאו) |
||
(28 גרסאות ביניים של 3 משתמשים אינן מוצגות) | |||
שורה 1: | שורה 1: | ||
// Mediawiki:Gadget-foldPortalMenus.js | |||
// allow folding of side-menus to emulate a feature which was removed from mediawiki. | |||
$( function() { | $( function() { | ||
"use strict"; | "use strict"; | ||
function doit() { | |||
var storageKey = ' | var storageKey = 'portalFolded', | ||
skin = mw.config.get( 'skin' ), | |||
portalSelector, | |||
bodySelector, | |||
foldedClass = 'foldmenu-folded', | |||
expandedClass = 'foldmenu-expanded', | |||
heights = {}, | heights = {}, | ||
toggleElement = function( elem ) { | toggleElement = function( elem ) { | ||
var id = elem.closest( | var id = elem.closest( portalSelector ).attr( 'id' ), | ||
hide = ! elem.hasClass( | hide = ! elem.hasClass( foldedClass ); | ||
elem.toggleClass( | elem.toggleClass( expandedClass, !hide ) | ||
.toggleClass( | .toggleClass(foldedClass, hide ) | ||
.siblings( | .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( 'div.portal' ).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': | ||
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); | |||
}); | }); |
גרסה אחרונה מ־12:19, 5 בדצמבר 2022
// 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,
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( 'div.portal' ).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':
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);
});