This wiki is still in active development, many areas of the site are unstable or broken.

In the meantime, consider adding content to pages you like!

MediaWiki:Gadget-CollapsibleNav.js: Difference between revisions

From NBITTRPG Wiki
m Undid revision 3227 by CStatic (talk)
Tag: Undo
mNo edit summary
 
(One intermediate revision by the same user not shown)
Line 6: Line 6:
  * @source /core/skins/vector/collapsibleNav.js
  * @source /core/skins/vector/collapsibleNav.js
  */
  */
mw.loader.using('oojs-ui-widgets').then(function() {
( function () {
'use strict';
'use strict';


var desktopSelectors = ['#site-tools', '#page-tools', '#catlinks-sidebar', '#other-languages'];
// Use the same function for all navigation headings - don't repeat
var globalSelectors = ['#site-navigation'];
function toggle( $element, forceSetting ) {
var isCollapsed = $element.parent().is( '.collapsed' );


function toggle($element, forceSetting) {
if (forceSetting == 'expand' && !isCollapsed
var isCollapsed = $element.parent().is('.collapsed');
|| forceSetting == 'close' && isCollapsed) {
 
if (forceSetting == 'expand' && !isCollapsed ||
forceSetting == 'close' && isCollapsed) {
return;
return;
}
}


$.cookie(
$.cookie(
'timeless-nav-' + $element.parent().attr('id'),
'timeless-nav-' + $element.parent().attr( 'id' ),
isCollapsed, {
isCollapsed,
'expires': 30,
{ 'expires': 30, 'path': '/' }
'path': '/'
}
);
);


$element
$element
.parent()
.parent()
.toggleClass('expanded')
.toggleClass( 'expanded' )
.toggleClass('collapsed')
.toggleClass( 'collapsed' )
.find('.mw-portlet-body')
.find( '.mw-portlet-body' )
.slideToggle('fast');
.slideToggle( 'fast' );
isCollapsed = !isCollapsed;
isCollapsed = !isCollapsed;


$element
$element
.find('> a')
.find( '> a' )
.attr({
.attr( {
'aria-pressed': isCollapsed ? 'false' : 'true',
'aria-pressed': isCollapsed ? 'false' : 'true',
'aria-expanded': isCollapsed ? 'false' : 'true'
'aria-expanded': isCollapsed ? 'false' : 'true'
});
} );
}
}


function run(selectors) {
$( function ( $ ) {
$(function($) {
var $headings, tabIndex;
var $headings, tabIndex;
 
selectors.forEach(function(selector) {
// Apply a class to the entire panel to activate styles
$(selector).addClass('collapsible-nav');
$(selector + ' > .sidebar-inner > div > h3:not("#p-navigation-label")').addClass('collapsible-nav-header');


// Use cookie data to restore preferences of what to show and hide
/* General Portal Modification */
$(selector + ' .mw-portlet')
.each(function(i) {
var id = $(this).attr('id'),
state = $.cookie('timeless-nav-' + id);
$(this).find('ul:first').attr('id', id + '-list');
// Add anchor tag to heading for better accessibility
$(this).find('h3:not("#p-navigation-label")').wrapInner(
$('<a>')
.attr({
href: '#',
'aria-haspopup': 'true',
'aria-controls': id + '-list',
role: 'button'
})
.click(false)
);
// In the case that we are not showing the new version, let's show the languages by default
if (
state === 'true' ||
state === null
) {
$(this)
.addClass('expanded')
.removeClass('collapsed')
.find('.mw-portlet-body')
.hide() // bug 34450
.show();
$(this).find('h3:not("#p-navigation-label") > a')
.attr({
'aria-pressed': 'true',
'aria-expanded': 'true'
});
} else {
$(this)
.addClass('collapsed')
.removeClass('expanded');
$(this).find('h3:not("#p-navigation-label") > a')
.attr({
'aria-pressed': 'false',
'aria-expanded': 'false'
});
}
// Re-save cookie
if (state !== null) {
$.cookie('timeless-nav-' + $(this).attr('id'), state, {
'expires': 30,
'path': '/'
});
}
});


/* Tab Indexing */
// Apply a class to the entire panel to activate styles
// Make it keyboard accessible
$( '#site-navigation' ).addClass( 'collapsible-nav' );
$headings = $(selector + ' .mw-portlet > h3:not("#p-navigation-label")');
$( '#site-navigation > .sidebar-inner > div > h3' ).addClass( 'collapsible-nav-header' );
$headings.attr('tabindex', '0');
// Use cookie data to restore preferences of what to show and hide
$( '#site-navigation .mw-portlet' )
.each( function ( i ) {
var id = $(this).attr( 'id' ),
state = $.cookie( 'timeless-nav-' + id );
$(this).find( 'ul:first' ).attr( 'id', id + '-list' );
// Add anchor tag to heading for better accessibility
$( this ).find( 'h3' ).wrapInner(
$( '<a>' )
.attr( {
href: '#',
'aria-haspopup': 'true',
'aria-controls': id + '-list',
role: 'button'
} )
.click( false )
);
// In the case that we are not showing the new version, let's show the languages by default
if (
state === 'true' ||
state === null
) {
$(this)
.addClass( 'expanded' )
.removeClass( 'collapsed' )
.find( '.mw-portlet-body' )
.hide() // bug 34450
.show();
$(this).find( 'h3 > a' )
.attr( {
'aria-pressed': 'true',
'aria-expanded': 'true'
} );
} else {
$(this)
.addClass( 'collapsed' )
.removeClass( 'expanded' );
$(this).find( 'h3 > a' )
.attr( {
'aria-pressed': 'false',
'aria-expanded': 'false'
} );
}
// Re-save cookie
if ( state !== null ) {
$.cookie( 'timeless-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
}
} );


// Toggle the selected menu's class and expand or collapse the menu
/* Tab Indexing */
$(selector)
.on('keydown', '.mw-portlet > h3:not("#p-navigation-label")', function(e) {
// Make the space and enter keys act as a click
if (e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
toggle($(this));
}
})
.on('mousedown', '.mw-portlet > h3:not("#p-navigation-label")', function(e) {
if (e.which !== 3) { // Right mouse click
toggle($(this));
$(this).blur();
}
return false;
});
});
});
}


var initialState = {};
$headings = $( '#site-navigation .mw-portlet > h3' );
desktopSelectors.forEach(function(selector) {
initialState[selector] = $(selector).clone(true);
});


var navigationPortletExpandState = $.cookie('timeless-nav-p-navigation');
// Make it keyboard accessible
var toggleText = 'Close All';
$headings.attr( 'tabindex', '0' );
if (navigationPortletExpandState !== 'true' && navigationPortletExpandState !== null) {
toggleText = 'Expand All';
}


if ($(window).width() > 1099) {
// Toggle the selected menu's class and expand or collapse the menu
run(desktopSelectors.concat(globalSelectors));
$( '#site-navigation' )
} else {
.on( 'keydown', '.mw-portlet > h3', function ( e ) {
run(globalSelectors);
// Make the space and enter keys act as a click
}
if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
 
toggle( $(this) );
function resizeCheck() {
}
if ($(window).width() > 1099) {
} )
if (!$(desktopSelectors[0]).hasClass('collapsible-nav')) {
.on( 'mousedown', '.mw-portlet > h3', function ( e ) {
run(desktopSelectors);
if ( e.which !== 3 ) { // Right mouse click
toggle( $(this) );
$(this).blur();
}
return false;
} );
});
var navigationPortletExpandState = $.cookie( 'timeless-nav-p-navigation' );
var toggleText = 'Close All';
if (navigationPortletExpandState !== 'true' && navigationPortletExpandState !== null) {
toggleText = 'Expand All';
}
$( '#site-navigation > .sidebar-inner' ).prepend("<div id=\"sidebar-collapsible-toggle\">" + toggleText + "</div>");
$("#sidebar-collapsible-toggle").click(function() {
if($("#sidebar-collapsible-toggle").text() == "Expand All") {
$("#sidebar-collapsible-toggle").text("Close All");
$( '#site-navigation .mw-portlet > h3' ).each( function ( i ) {
toggle( $(this), 'expand');
} );
$.cookie(
'timeless-nav-text-toggle',
true,
{ 'expires': 30, 'path': '/' }
);
} else {
$("#sidebar-collapsible-toggle").text("Expand All");
$( '#site-navigation .mw-portlet > h3' ).each( function ( i ) {
toggle( $(this), 'close');
} );
$.cookie(
'timeless-nav-text-toggle',
false,
{ 'expires': 30, 'path': '/' }
);
}
}
} else {
});
if ($(desktopSelectors[0]).hasClass('collapsible-nav')) {
}() );
desktopSelectors.forEach(function(selector) {
$(selector).replaceWith(initialState[selector].clone(true));
});
}
}
}
 
window.onresize = resizeCheck;
});

Latest revision as of 20:43, 8 October 2026

/**
 * Collapsible navigation for Timeless, based on the Collapsible Navigation from Vector.
 * Derived from Dragalia Lost Wiki by Elaeagnifolia (https://dragalialost.wiki/w/User:Elaeagnifolia) 
 * Licensed under CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/)
 * @source https://dragalialost.wiki/w/MediaWiki:Gadget-CollapsibleNav.js
 * @source /core/skins/vector/collapsibleNav.js
 */
( function () {
	'use strict';

	// Use the same function for all navigation headings - don't repeat
	function toggle( $element, forceSetting ) {
		var isCollapsed = $element.parent().is( '.collapsed' );

		if (forceSetting == 'expand' && !isCollapsed
			|| forceSetting == 'close' && isCollapsed) {
			return;
		}

		$.cookie(
			'timeless-nav-' + $element.parent().attr( 'id' ),
			isCollapsed,
			{ 'expires': 30, 'path': '/' }
		);

		$element
			.parent()
			.toggleClass( 'expanded' )
			.toggleClass( 'collapsed' )
			.find( '.mw-portlet-body' )
			.slideToggle( 'fast' );
		isCollapsed = !isCollapsed;

		$element
			.find( '> a' )
			.attr( {
				'aria-pressed': isCollapsed ? 'false' : 'true',
				'aria-expanded': isCollapsed ? 'false' : 'true'
			} );
	}

	$( function ( $ ) {
		var $headings, tabIndex;

		/* General Portal Modification */

		// Apply a class to the entire panel to activate styles
		$( '#site-navigation' ).addClass( 'collapsible-nav' );
		$( '#site-navigation > .sidebar-inner > div > h3' ).addClass( 'collapsible-nav-header' );
		
		// Use cookie data to restore preferences of what to show and hide
		$( '#site-navigation .mw-portlet' )
			.each( function ( i ) {
				var id = $(this).attr( 'id' ),
					state = $.cookie( 'timeless-nav-' + id );
				$(this).find( 'ul:first' ).attr( 'id', id + '-list' );
				// Add anchor tag to heading for better accessibility
				$( this ).find( 'h3' ).wrapInner(
					$( '<a>' )
						.attr( {
							href: '#',
							'aria-haspopup': 'true',
							'aria-controls': id + '-list',
							role: 'button'
						} )
						.click( false )
				);
				// In the case that we are not showing the new version, let's show the languages by default
				if (
					state === 'true' ||
					state === null 
				) {
					$(this)
						.addClass( 'expanded' )
						.removeClass( 'collapsed' )
						.find( '.mw-portlet-body' )
						.hide() // bug 34450
						.show();
					$(this).find( 'h3 > a' )
						.attr( {
							'aria-pressed': 'true',
							'aria-expanded': 'true'
						} );
				} else {
					$(this)
						.addClass( 'collapsed' )
						.removeClass( 'expanded' );
					$(this).find( 'h3 > a' )
						.attr( {
							'aria-pressed': 'false',
							'aria-expanded': 'false'
						} );
				}
				// Re-save cookie
				if ( state !== null ) {
					$.cookie( 'timeless-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
				}
			} );

		/* Tab Indexing */

		$headings = $( '#site-navigation .mw-portlet > h3' );

		// Make it keyboard accessible
		$headings.attr( 'tabindex', '0' );

		// Toggle the selected menu's class and expand or collapse the menu
		$( '#site-navigation' )
			.on( 'keydown', '.mw-portlet > h3', function ( e ) {
				// Make the space and enter keys act as a click
				if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
					toggle( $(this) );
				}
			} )
			.on( 'mousedown', '.mw-portlet > h3', function ( e ) {
				if ( e.which !== 3 ) { // Right mouse click
					toggle( $(this) );
					$(this).blur();
				}
				return false;
			} );
		});
		
		var navigationPortletExpandState = $.cookie( 'timeless-nav-p-navigation' );
		var toggleText = 'Close All';
		if (navigationPortletExpandState !== 'true' && navigationPortletExpandState !== null) {
			toggleText = 'Expand All';
		}
		$( '#site-navigation > .sidebar-inner' ).prepend("<div id=\"sidebar-collapsible-toggle\">" + toggleText + "</div>");
		$("#sidebar-collapsible-toggle").click(function() {
			if($("#sidebar-collapsible-toggle").text() == "Expand All") {
				$("#sidebar-collapsible-toggle").text("Close All");
				$( '#site-navigation .mw-portlet > h3' ).each( function ( i ) {
					toggle( $(this), 'expand');
				} );
				$.cookie(
					'timeless-nav-text-toggle',
					true,
					{ 'expires': 30, 'path': '/' }
				);
			} else {
				$("#sidebar-collapsible-toggle").text("Expand All");
				$( '#site-navigation .mw-portlet > h3' ).each( function ( i ) {
					toggle( $(this), 'close');
				} );
				$.cookie(
					'timeless-nav-text-toggle',
					false,
					{ 'expires': 30, 'path': '/' }
				);
			}
		});
}() );