MediaWiki:Gadget-spriteEditLoader.js

$( function { 'use strict';

/** * Add an edit button which loads the sprite editor * * If spriteaction=edit is in the URL, the editor will be loaded * immediately, otherwise it will wait for the button to be clicked. */ var editPage = $( '#sprite-editor-message' ).data( 'page' ) || null; if ( !$( '#spritedoc' ).length && !editPage ) { return; }

var $spriteEditLink; // Temporary: FandomDesktop-specific changes if ( $( ".skin-fandomdesktop" ).length > 0 ) { var $editButton = $( '#ca-edit' ); if ( !$editButton.length ) { $editButton = $( '#ca-viewsource' ); }	$spriteEditLink = $( '' ) .attr( 'id', 'ca-spriteedit' ) .attr( 'href', mw.util.getUrl( editPage, { spriteaction: 'edit' } ) ) .attr( 'title', 'Edit sprite' ) .addClass( 'page-side-tool' ) .html(' '); // It's the "Photograph" icon from Heroicons – https://heroicons.dev/ $spriteEditLink.insertAfter( $editButton ); } else { var $editTab = $( '#ca-edit' ); if ( !$editTab.length ) { $editTab = $( '#ca-viewsource' ); }	$spriteEditLink = $( '' ).text( 'Edit sprite' ).attr( 'href',		mw.util.getUrl( editPage, { spriteaction: 'edit' } )	); var $spriteEditTab = $( '' ) .attr( 'id', 'ca-spriteedit' ) .addClass( 'page-side-tool' ) .append(		   $( ' ' ).append( $spriteEditLink )	    ); $spriteEditTab.insertAfter( $editTab ); }

// Page to sprite edit is not here, so no need to bind events if ( editPage ) { return; }

var loadSpriteEditor = function { $spriteEditTab.add( '#ca-view' ).toggleClass( 'selected' ); return mw.loader.using( 'ext.gadget.spriteEdit' ); }; if ( location.search.match( '[?&]spriteaction=edit' ) ) { loadSpriteEditor; return; }

var $win = $( window ); $spriteEditLink.one( 'click.spriteEditLoader', function( e ) {	// Initially add the history so it is not delayed waiting	// for the editor to load. The editor will handle it from now.	history.pushState( {}, '', this.href );	loadSpriteEditor.then( function { $win.off( '.spriteEditLoader' ); } );	e.preventDefault; } );

// If the page is reloaded while the editor isn't loaded, navigating // back to the editor won't work, so an initial navigation check is // necessary to load the editor, where it will then monitor navigation $win.on( 'popstate.spriteEditLoader', function {	if ( location.search.match( '[?&]spriteaction=edit' ) && !$( 'html' ).hasClass( 'spriteedit-loaded' ) ) {		loadSpriteEditor.then( function { $win.off( '.spriteEditLoader' ); } );	} } );

} );