Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js: Difference between revisions

MediaWiki interface page
More languages
(added edit button to non logged in users that will take them to the request account page)
No edit summary
 
(77 intermediate revisions by 2 users not shown)
Line 181: Line 181:


/**
/**
* Append edit button to non-logged in users that redirects to Request Account.
* Append edit button to non-logged in users that redirects to Request Account.
* Only applies to Citizen because anon users use Citizen by default and can't change it
* Only applies to Citizen because anon users use Citizen by default and can't change it
* DISABLED on jan 6 2024 due to non-use. Can be re-enabled by removing the comment lines
**/
**/
/*
(function($, mw) {
(function($, mw) {
     // Wait for the DOM to be ready
     // Wait for the DOM to be ready
     $(document).ready(function() {
     $(document).ready(function() {
         // Check if the user is anonymous
         // Check if the user is anonymous, i.e. not logged in
         if (mw.user.isAnon()) {
         if (mw.user.isAnon()) {
             // Create the HTML for the "request account" edit button. Styled in MediaWiki:Citizen.css
             // Create the HTML for the "request account" edit button. Styled in MediaWiki:Citizen.css
             var requestAccountEditBtn = '<li id="ca-ve-edit" class="mw-list-item">' +
             var requestAccountEditBtn = '<li id="ca-request-account" class="mw-list-item">' +
                 '<a href="/index.php?title=Special:RequestAccount" title="Edit page">Edit this page</a>' +
                 '<a href="/wiki/Special:RequestAccount" title="Edit page">Make a correction</a>' +
                 '</li>';
                 '</li>';


Line 199: Line 201:
     });
     });
})(jQuery, mediaWiki);
})(jQuery, mediaWiki);
*/
/**
* Append icons to Citizen sidebar starting under Megamenu (drawer)
**/
/* Library */
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
            var libraryLink = '<a class="citizen-header__item sidebar-library" href="/wiki/ProleWiki:Library" title="Library"><div class="citizen-header__button"></div></a>';
   
            $('.citizen-drawer').after(libraryLink);
    });
})(jQuery, mediaWiki);
/* Essays*/
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
            var essaysLink = '<a class="citizen-header__item sidebar-essays" href="/wiki/ProleWiki:Essays" title="Essays"><div class="citizen-header__button"></div></a>';
   
            $('.sidebar-library').after(essaysLink);
    });
})(jQuery, mediaWiki);
/* Upload file icon */
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        if (!mw.user.isAnon()) {
            // Create the HTML for the "Upload file" icon + link
            var uploadFileIcon = '<a class="citizen-header__item sidebar-upload" href="/wiki/Special:Upload" title="Upload file"><div class="citizen-header__button"></div></a>';
   
            // Insert the icon HTML after the existing icon container element
            $('.sidebar-essays').after(uploadFileIcon);
        }
    });
})(jQuery, mediaWiki);
/**
* Append hyperlink icon in headings so it's easier to copy the link
**/
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        // Function to add hyperlink buttons to headings and subheadings
        function addHyperlinkButton(selector) {
            $(selector).each(function() {
                // Get the section title
                var sectionTitle = $(this).text();
               
                // Replace spaces with underscores in the section title
                var sectionTitleWithUnderscores = sectionTitle.replace(/ /g, '_');
               
                // Create the HTML for the hyperlink button
                var hyperlinkButton = $('<a>', {
                    class: 'heading-hyperlink citizen-editsection-icon mw-ui-icon-wikimedia-link',
                    href: '/wiki/' + mw.config.get('wgPageName') + '#' + sectionTitleWithUnderscores,
                    title: sectionTitle,
                    'data-no-preview': 'true', // Custom attribute to disable the preview
                    click: function(event) {
                        event.stopPropagation(); // Prevent the heading from collapsing
                    }
                });
                // Insert the button HTML after the section heading
                $(this).after(hyperlinkButton);
            });
        }
        // Add hyperlink buttons to h2, h3, h4, and h5 headings
        addHyperlinkButton('h2 .mw-headline'); // h2
        addHyperlinkButton('h3 .mw-headline'); // h3
        addHyperlinkButton('h4 .mw-headline'); // h4
        addHyperlinkButton('h5 .mw-headline'); // h5
    });
})(jQuery, mediaWiki);
// If we're on the Collection page and are still rendering:
if ($("#renderingProgress").length) {
  // Refresh in 5 seconds:
  setTimeout(location.reload.bind(location), 5000);
}
/* Function is ready to roll out but waiting on more testimonials first
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        console.log("Document is ready and script is running");
       
        const thresholdHeight = 400;
        const testimonials = [
            //'<span>"I joined a really cool community I joined a really cool community I joined a really cool community I joined a really cool community I joined a really cool community"</span> — Alice'
        ];
            const joinUsDiv = document.getElementById('joinUs');
            const testimonialContainer = document.getElementById('homepage-testimonial');
            // Check if the elements exist
            if (joinUsDiv && testimonialContainer) {
                const joinUsHeight = joinUsDiv.offsetHeight;
                //console.log("Join Us Div Height:", joinUsHeight);
                if (joinUsHeight >= thresholdHeight) {
                    const randomTestimonial = testimonials[Math.floor(Math.random() * testimonials.length)];
                    testimonialContainer.innerHTML = randomTestimonial;
                    testimonialContainer.style.display = 'block';
                } else {
                    testimonialContainer.style.display = 'none';
                }
            } else {
                //console.log("Either joinUsDiv or testimonialContainer is missing.");
            }
        });
})(jQuery, mediaWiki);
*/

Latest revision as of 10:03, 23 September 2024

/* Any JavaScript here will be loaded for all users on every page load. */
/**
 * Dynamic Navigation Bars. See [[Wikipedia:NavFrame]]
 * 
 * Based on script from en.wikipedia.org, 2008-09-15.
 *
 * @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js
 * @maintainer Helder.wiki, 2012–2013
 * @maintainer Krinkle, 2013
 */
( function () {

// Set up the words in your language
var collapseCaption = 'hide';
var expandCaption = 'show';

var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';

/**
 * Shows and hides content and picture (if available) of navigation bars.
 *
 * @param {number} indexNavigationBar The index of navigation bar to be toggled
 * @param {jQuery.Event} e Event object
 */
function toggleNavigationBar( indexNavigationBar, e ) {
	var navChild,
		navToggle = document.getElementById( 'NavToggle' + indexNavigationBar ),
		navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );

	// Prevent browser from jumping to href "#"
	e.preventDefault();

	if ( !navFrame || !navToggle ) {
		return false;
	}

	// If shown now
	if ( navToggle.firstChild.data === navigationBarHide ) {
		for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
			if ( $( navChild ).hasClass( 'NavContent' ) || $( navChild ).hasClass( 'NavPic' ) ) {
				navChild.style.display = 'none';
			}
		}
		navToggle.firstChild.data = navigationBarShow;

	// If hidden now
	} else if ( navToggle.firstChild.data === navigationBarShow ) {
		for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
			if ( $( navChild ).hasClass( 'NavContent' ) || $( navChild ).hasClass( 'NavPic' ) ) {
				navChild.style.display = 'block';
			}
		}
		navToggle.firstChild.data = navigationBarHide;
	}
}

/**
 * Adds show/hide-button to navigation bars.
 *
 * @param {jQuery} $content
 */
function createNavigationBarToggleButton( $content ) {
	var i, j, navChild, navToggle, navToggleText, isCollapsed,
		indexNavigationBar = 0;
	// iterate over all < div >-elements
	var $divs = $content.find( 'div.NavFrame' );
	$divs.each( function ( i, navFrame ) {
		indexNavigationBar++;
		navToggle = document.createElement( 'a' );
		navToggle.className = 'NavToggle';
		navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
		navToggle.setAttribute( 'href', '#' );
		$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );

		isCollapsed = $( navFrame ).hasClass( 'collapsed' );
		// backwards compatibility for old technique where the collapsed class was not yet used
		for ( navChild = navFrame.firstChild; navChild !== null && !isCollapsed; navChild = navChild.nextSibling ) {
			if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
				if ( navChild.style.display === 'none' ) {
					isCollapsed = true;
				}
			}
		}
		if ( isCollapsed ) {
			for ( navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling ) {
				if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) {
					navChild.style.display = 'none';
				}
			}
		}
		navToggleText = document.createTextNode( isCollapsed ? navigationBarShow : navigationBarHide );
		navToggle.appendChild( navToggleText );

		// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
		for ( j = 0; j < navFrame.childNodes.length; j++ ) {
			if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
				navToggle.style.color = navFrame.childNodes[j].style.color;
				navFrame.childNodes[j].appendChild( navToggle );
			}
		}
		navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
	} );
}



mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );

}());

/**
 * 
 * Side bar customization
 * 
 */
function ModifySidebar( action, section, name, link ) {
	try {
		switch ( section ) {
			case 'languages':
				var target = 'p-lang';
				break;
			case 'toolbox':
				var target = 'p-tb';
				break;
			case 'navigation':
				var target = 'p-navigation';
				break;
			default:
				var target = 'p-' + section;
				break;
		}

		if ( action == 'add' ) {
			var node = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var aNode = document.createElement( 'a' );
			var liNode = document.createElement( 'li' );

			aNode.appendChild( document.createTextNode( name ) );
			aNode.setAttribute( 'href', link );
			liNode.appendChild( aNode );
			liNode.className = 'plainlinks';
			node.appendChild( liNode );
		}

		if ( action == 'remove' ) {
			var list = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var listelements = list.getElementsByTagName( 'li' );

			for ( var i = 0; i < listelements.length; i++ ) {
				if (
					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||
					listelements[i].getElementsByTagName( 'a' )[0].href == link
				)
				{
					list.removeChild( listelements[i] );
				}
			}
		}


	} catch( e ) {
		// let's just ignore what's happened
		return;
	}
}

function CustomizeModificationsOfSidebar() {
	// adds [[Special:CategoryTree|Special:CategoryTree]] to toolbox
	ModifySidebar( 'add', 'toolbox', 'List of uploaded files', 'https://en.prolewiki.org/wiki/Special:ListFiles' );
}

jQuery( CustomizeModificationsOfSidebar );


/**
	* Append edit button to non-logged in users that redirects to Request Account.
	* Only applies to Citizen because anon users use Citizen by default and can't change it
	* DISABLED on jan 6 2024 due to non-use. Can be re-enabled by removing the comment lines
**/
/*
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        // Check if the user is anonymous, i.e. not logged in
        if (mw.user.isAnon()) {
            // Create the HTML for the "request account" edit button. Styled in MediaWiki:Citizen.css
            var requestAccountEditBtn = '<li id="ca-request-account" class="mw-list-item">' +
                '<a href="/wiki/Special:RequestAccount" title="Edit page">Make a correction</a>' +
                '</li>';

            // Insert the button after the #ca-history element
            $('#ca-history').after(requestAccountEditBtn);
        }
    });
})(jQuery, mediaWiki);
*/

/**
	* Append icons to Citizen sidebar starting under Megamenu (drawer)
**/
/* Library */
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
            var libraryLink = '<a class="citizen-header__item sidebar-library" href="/wiki/ProleWiki:Library" title="Library"><div class="citizen-header__button"></div></a>';
    
            $('.citizen-drawer').after(libraryLink);
    });
})(jQuery, mediaWiki);

/* Essays*/
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
            var essaysLink = '<a class="citizen-header__item sidebar-essays" href="/wiki/ProleWiki:Essays" title="Essays"><div class="citizen-header__button"></div></a>';
    
            $('.sidebar-library').after(essaysLink);
    });
})(jQuery, mediaWiki);

/* Upload file icon */
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        if (!mw.user.isAnon()) {
            // Create the HTML for the "Upload file" icon + link
            var uploadFileIcon = '<a class="citizen-header__item sidebar-upload" href="/wiki/Special:Upload" title="Upload file"><div class="citizen-header__button"></div></a>';
    
            // Insert the icon HTML after the existing icon container element
            $('.sidebar-essays').after(uploadFileIcon);
        }
    });
})(jQuery, mediaWiki);

/**
 * Append hyperlink icon in headings so it's easier to copy the link
**/
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        // Function to add hyperlink buttons to headings and subheadings
        function addHyperlinkButton(selector) {
            $(selector).each(function() {
                // Get the section title
                var sectionTitle = $(this).text();
                
                // Replace spaces with underscores in the section title
                var sectionTitleWithUnderscores = sectionTitle.replace(/ /g, '_');
                
                // Create the HTML for the hyperlink button
                var hyperlinkButton = $('<a>', {
                    class: 'heading-hyperlink citizen-editsection-icon mw-ui-icon-wikimedia-link',
                    href: '/wiki/' + mw.config.get('wgPageName') + '#' + sectionTitleWithUnderscores,
                    title: sectionTitle,
                    'data-no-preview': 'true', // Custom attribute to disable the preview
                    click: function(event) {
                        event.stopPropagation(); // Prevent the heading from collapsing
                    }
                });

                // Insert the button HTML after the section heading
                $(this).after(hyperlinkButton);
            });
        }

        // Add hyperlink buttons to h2, h3, h4, and h5 headings
        addHyperlinkButton('h2 .mw-headline'); // h2
        addHyperlinkButton('h3 .mw-headline'); // h3
        addHyperlinkButton('h4 .mw-headline'); // h4
        addHyperlinkButton('h5 .mw-headline'); // h5
    });
})(jQuery, mediaWiki);


// If we're on the Collection page and are still rendering:
if ($("#renderingProgress").length) {
  // Refresh in 5 seconds:
  setTimeout(location.reload.bind(location), 5000);
}


/* Function is ready to roll out but waiting on more testimonials first
(function($, mw) {
    // Wait for the DOM to be ready
    $(document).ready(function() {
        console.log("Document is ready and script is running");
        
        const thresholdHeight = 400;
        const testimonials = [
            //'<span>"I joined a really cool community I joined a really cool community I joined a really cool community I joined a really cool community I joined a really cool community"</span> — Alice'
        ];

            const joinUsDiv = document.getElementById('joinUs');
            const testimonialContainer = document.getElementById('homepage-testimonial');

            // Check if the elements exist
            if (joinUsDiv && testimonialContainer) {
                const joinUsHeight = joinUsDiv.offsetHeight;
                //console.log("Join Us Div Height:", joinUsHeight);

                if (joinUsHeight >= thresholdHeight) {
                    const randomTestimonial = testimonials[Math.floor(Math.random() * testimonials.length)];
                    testimonialContainer.innerHTML = randomTestimonial;
                    testimonialContainer.style.display = 'block';
                } else {
                    testimonialContainer.style.display = 'none';
                }
            } else {
                //console.log("Either joinUsDiv or testimonialContainer is missing.");
            }
        });
})(jQuery, mediaWiki);
*/