מדיה ויקי:Gadget-foldPortalMenus.js: הבדלים בין גרסאות בדף

מתוך צפונות ויקי
(ניסוי)
מ (30 גרסאות של הדף wikipedia:he:מדיה_ויקי:Gadget-foldPortalMenus.js יובאו)
 
(15 גרסאות ביניים של 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 = 'sidemenuFolded',
var storageKey = 'portalFolded',
skin = mw.config.get( 'skin' ),
skin = mw.config.get( 'skin' ),
portalSelector,
portalSelector,
bodySelector,
bodySelector,
storage = $.jStorage.storageAvailable(),
foldedClass = 'foldmenu-folded',
origFolded = [],
expandedClass = 'foldmenu-expanded',
heights = {},
heights = {},
toggleElement = function( elem ) {
toggleElement = function( elem ) {
var id = elem.closest( portalSelector ).attr( 'id' ),
var id = elem.closest( portalSelector ).attr( 'id' ),
hide = ! elem.hasClass( 'foldmenu-folded' );
hide = ! elem.hasClass( foldedClass );
elem.toggleClass( 'foldmenu-expanded', ! hide )
elem.toggleClass( expandedClass, !hide )
.toggleClass('foldmenu-folded', hide )
.toggleClass(foldedClass, hide )
.siblings( bodySelector ).stop( true ).animate( { maxHeight: hide ? 0 : heights[id] } );
.siblings().stop( true ).animate( { maxHeight: hide ? 0 : heights[id] } );
updateState();
mw.storage.set( storageKey + id, JSON.stringify( hide ) );
},
updateState = function() {
if (! storage)
return;
var folded = [];
$( portalSelector + ' h3.foldmenu-folded' ).each( function( id, item ) {
folded.push( $( item ).closest( portalSelector ).attr( 'id' ) );
});
Storage[storageKey] = folded;
},
},
preparePortalBody = function( index, elem ) {
preparePortalBody = function( index, elem ) {
שורה 35: שורה 28:
prepareHeader = function( selector ) {
prepareHeader = function( selector ) {
$( selector )
$( selector )
.addClass( 'foldmenu-expanded' )
.addClass( expandedClass )
.prepend( $('<span>', { 'class': 'plus' } ).text( '+' ) )
.prepend( $('<span>', { 'class': 'plus' } ).text( '+' ) )
.prepend( $('<span>', { 'class': 'minus' } ).text( '-' ) )
.prepend( $('<span>', { 'class': 'minus' } ).text( '-' ) )
שורה 51: שורה 44:
clone.remove();
clone.remove();
});
});
restoreState();
},
},
restoreState = function() {
restoreState = function() {
if (storage) {
$( portalSelector ).each( function( index, item ) {
origFolded = Storage[storageKey] || [];
var $item = $( item ),
$( origFolded ).each(function( index, item ) {
id = $item.attr( 'id' ),
toggleElement( $( portalSelector + '#' + item ).find( 'h3:first' ) );
$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 ) {
switch( skin ) {
case 'vector-2022':
case 'vector':
case 'vector':
portalSelector = 'div.portal';
portalSelector = 'nav.portal';
bodySelector = 'div.body';
bodySelector = 'div.vector-menu-content';
break;
break;
case 'monobook':
case 'monobook':
שורה 87: שורה 88:
preparePortalBody( 0, ps );
preparePortalBody( 0, ps );
prepareHeader( ps + ' h3' );
prepareHeader( ps + ' h3' );
if ( $.inArray( portalId, origFolded ) + 1 )
restoreState();
toggleElement( $( ps ).find( 'h3:first' ) );
});
});
} // 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);
});