Jump to content

User:Enterprisey/draft-sorter.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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(/media/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>