Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>
( function ( $, mw ) {
    mw.loader.load( "mediawiki.api" );
    mw.loader.load( "jquery.chosen" );
    mw.loader.load( "mediawiki.ui.input", "text/css" );

    if ( mw.config.get( "wgNamespaceNumber" ) !== 118 ) return;

    const WIKIPROJECT_LIST_AFCH = "User:Theo's Little Bot/afchwikiproject.js";
    const WIKIPROJECT_LIST_IBX = "User:Enterprisey/ibx-wproj-map.js";

    var portletLink = mw.util.addPortletLink('p-cactions', '#', 'Sort (draft)', 'pt-draftsort', 'Manage WikiProject tags');
    $( portletLink ).click( function ( e ) {
        e.preventDefault();

        // If it's already there, don't duplicate
        if ( $( "#draft-sorter-wrapper" ).length ) return;

        // Construct the form
        var form = $( "<div>" )
            .attr( "id", "draft-sorter-wrapper" )
            .css( { "background-image": "url(https://upload.wikimedia.org/wikipedia/commons/b/b8/OOjs_UI_icon_tag-progressive.svg)",
                    "background-repeat": "no-repeat",
                    "background-position-y": "center",
                    "background-size": "50px",
                    "margin": "1em auto",
                    "border": "thin solid #BBB",
                    "padding": "0.5em 0",
                    "padding-left": "50px",
                    "display": "inline-block",
                    "border-radius": "0.25em"
            } )
            .append( $( "<span>" )
                .text( "Loading form..." )
                .css( "color", "gray" ) );

        // Now, make two JSON calls to the WikiProject lists
        var select = $( "<select>" )
            .attr( "id", "draft-sorter-form" )
            .attr( "multiple", "multiple" );
        var wikiprojects = {}; // maps names to template names
        $.when(
            $.ajax( {
                url: mw.config.get( 'wgServer' ) + "/w/index.php?title=" +
                    WIKIPROJECT_LIST_IBX + "&action=raw&ctype=text/plain",
            } ).done( function ( data ) {
                console.log( "got ibx" );
                var start = data.indexOf( "--------------------" );
                data = data.substr( start );
                var dataLines = data.split( "\n" );
                for( var i = 0; i < dataLines.length; i++ ) {
                    if( dataLines[i].startsWith( "//" ) ) {
                        continue;
                    }

                    projectName = dataLines[i].split( "|" )[0].trim();
                    wikiprojects[projectName.replace( "WikiProject ", "" )] = projectName;
                }
            } ),
            $.getJSON( mw.config.get( 'wgServer' ) + "/w/index.php?title=" +
                WIKIPROJECT_LIST_AFCH + "&action=raw&ctype=text/javascript" ).done( function ( data ) {
                console.log( "got afch" );
                $.each( data, function ( name, template ) {
                    wikiprojects[name] = template;
                } );
            } )
        ).then( function ( a, b ) {
            console.log( wikiprojects );
            console.log( arguments );
            $.each( wikiprojects, function ( name, template ) {
            	select.append( $( "<option>" )
            	    .attr( "value", template )
            	    .text( name ) );
            } );
            form.hide();
            form.empty();
            form.append( $( "<span>" )
                .text( "Tag WikiProjects: " )
                .css( {
                	"font-size": "115%",
                	"font-weight": "bold"
                } ) );
            form.append( select );
            form.append( $( "<button>" )
                .text( "Submit" )
                .addClass( "mw-ui-button" )
                .addClass( "mw-ui-progressive" )
                .addClass( "mw-ui-big" )
                .css( "margin-left", "0.25em" )
                .click( submit ) );
            form.append( $( "<button>" )
                        .addClass( "mw-ui-button mw-ui-destructive mw-ui-quiet" )
                        .text( "Cancel" )
                        .click( function ( e ) {
                                $( "#draft-sorter-wrapper" ).remove();
                        } ) );
            form.show();
            $( select ).chosen( {
            	"placeholder_text_multiple": "Select some WikiProjects"
            } );
        } ).catch(function(e){console.log(e);});
        
        // Add the form to the page
        form.insertAfter( "#jump-to-nav" );
                        
        // The submission function
        var submit = function () {
        	var newTags = $( "#draft-sorter-form").val();
        	console.log( newTags );
        	var statusList = $( "<ul>" )
        	    .appendTo( "#draft-sorter-wrapper" )
        	    .append( $( "<li>" ).text( "Saving " + newTags.length + " new tags." ) );
        	var showStatus = function ( status ) {
        		return $( "<li>" )
        		    .text( status )
        		    .appendTo( statusList );
        	};
        	var newText = "";
        	newTags.forEach( function ( element ) {
        		newText += "{{" + element + "|importance=|class=draft}}";
        	} );
            ( new mw.Api() ).postWithEditToken( {
                action: "edit",
                title: "Draft talk:" + mw.config.get( 'wgTitle' ),
                summary: "Tagging drafts (draft-sorter.js)",
                prependtext: newText
        	} ).done( function ( data ) {
        		if ( data && data.edit && data.edit.result && data.edit.result === "Success" ) {
        			showStatus( "Edit saved successfully! (" )
                        .append( $( "<a>" )
                            .text( "reload" )
                            .attr( "href", "#" )
                            .click( function () { document.location.reload( true ); } ) )
                        .append( ")" );
        		} else {
        			showStatus( "Couldn't save due to error: " + JSON.stringify( data ) );
        		}
        	} ).fail( function ( error ) {
        		showStatus( "Couldn't save due to error: " + JSON.stringify( error ) );
        	} );
        };
    } );
}( jQuery, mediaWiki ) );
//</nowiki>