User:SD0001/draft-sort-burst.js

From Wikipedia, the free encyclopedia
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.
// Extended from [[User:Enterprisey/draft-sorter.js]]

//<nowiki>
$.when(mw.loader.using(['jquery.chosen', 'mediawiki.util']), $.ready).then(function() {
    mw.loader.load( "mediawiki.ui.input", "text/css" );

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

	const WIKIPROJECT_LIST = "Wikipedia:WikiProject Articles for creation/WikiProject templates.json";

	$( mw.util.addPortletLink('p-cactions', '#', 'Draft-sort', 'ptx-draftsort', 'Add WikiProject tags') ).click(function(e) {
		e.preventDefault();
		draftsort();
	} );

	var draftsort = function ( ) {

        // 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" ) );

        var select = $( "<select>" )
            .attr( "id", "draft-sorter-form" )
			.attr( "multiple", "multiple" );

		$.getJSON( mw.config.get( 'wgServer' ) + "/w/index.php?title=" +
        encodeURIComponent(WIKIPROJECT_LIST) + "&action=raw&ctype=text/json" ).done( function ( data ) {
            $.each( data, 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" )
                .attr( "accesskey", "s" )
                .click( submit ) );
            form.append( $( "<button>" )
				.addClass( "mw-ui-button mw-ui-destructive mw-ui-quiet" )
				.text( "Cancel" )
				.click( function () {
					$( "#draft-sorter-wrapper" ).remove();
				} ) );

			// add skip button only if in burst mode
			if (mw.util.getParamValue('draftsorttrigger')) {
				form.append( $('<button>')
					.addClass('mw-ui-button')
					.addClass('mw-ui-destructive')
					.addClass('mw-ui-quiet')
					.addClass('draft-sort-skip')
					.text('Skip')
				);
			}
            form.show();
            $( select ).chosen( {
            	"placeholder_text_multiple": "Select some WikiProjects"
			} );

        } ).catch(console.log);	

        // Add the form to the page
        form.insertAfter( "#siteSub" );
        
        $(".chosen-search-input").focus();

        // 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 + "}}\n";
			} );

        	$.ajax( {
                url: mw.util.wikiScript( 'api' ),
                type: 'POST',
                dataType: 'json',
                data: {
                    format: 'json',
                    action: 'edit',
                    title: "Draft talk:" + mw.config.get( 'wgTitle' ),
                    summary: "Adding WikiProject tags ([[User:SD0001/draft-sort-burst|draft-sort-burst]])",
                    watchlist: typeof draft_sort_burst_watchlistOption === 'undefined' ? "nochange" : draft_sort_burst_watchlistOption,
                    token: mw.user.tokens.get( 'csrfToken' ),
                    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( ")" );
					var event = new Event('draft_sort:saved');
					document.dispatchEvent(event);
        		} else {
        			showStatus( "Couldn't save due to error: " + JSON.stringify( data ) );
        		}
        	} ).fail( function ( error ) {
        		showStatus( "Couldn't save due to error: " + JSON.stringify( error ) );
        	} );
        };
    }


	$(mw.util.addPortletLink('p-cactions', '#', 'Draft-sort (burst)', 'ptx-draftsortburst', 'Add WikiProject tags to drafts in burst mode')).click(function(e) {
		e.preventDefault();
		burstmode();
	});

	if (mw.util.getParamValue('draftsorttrigger')) {
		burstmode();
	}

	function burstmode() {

		draftsort();

		var nextDraft, cmcontinue;
		var api = new mw.Api();
		var query = {
			"action": "query",
			"list": "categorymembers",
			"cmtitle": "Category:Pending_AfC_submissions",
			"cmprop": "title",
			"cmnamespace": "118",
			"cmlimit": "50",
			"cmsort": "sortkey",
			"cmdir": "ascending",
			"cmstartsortkeyprefix": "P"
		};

		function checkTalkPages(r) {
			//console.log('in checkTalkPages');
			//console.log(r);
			if (r && r.query && r.query.categorymembers) {

				cmcontinue = r.continue.cmcontinue;
				var draftTalkPages = r.query.categorymembers.map(function(e) {
					return e.title.replace(/^Draft:/, 'Draft talk:');
				});
				return api.get({
					action: 'query',
					titles: draftTalkPages
				});
			}
		}

		function selectNextDraft(r) {
			//console.log('in selectNextDraft');
			//console.log(r);
			if (r && r.query && r.query.pages) {
				var found = false;
				var skiplist = {}
				try {
					skiplist = JSON.parse(window.localStorage.getItem('draft-sort-burst-skiplist')) || {};
				} catch (e) {
					console.log('[draft-sort-burst]: error reading from localStorage cache');
					console.log(
						'\t' + e.name + ' message: ' + e.message +
						( e.at ? ' at: ' + e.at : '') +
						( e.text ? ' text: ' + e.text : '')
					);
				}
				$.each(r.query.pages, function(i,e) {
					if (parseInt(i) < 0) {
						var page = r.query.pages[i].title.replace(/^Draft talk:/, 'Draft:');
						if (page === mw.config.get('wgPageName').replace(/_/g, ' ')) {
							return true; // continue
						}
						if (skiplist[page]) {
							return true;
						}

						nextDraft = page;
						found = true;
						return false;
					}
				});
				//console.log('found:', found);
				if (!found) {
					//console.log('No suitable next draft found');
					query.cmcontinue = cmcontinue;
					postQuery();
					return;
				}

				$(document).on('draft_sort:saved', function() {
					window.location = '//en.wikipedia.org/wiki/' + nextDraft + '?draftsorttrigger=y';
				});

				$('#draft-sorter-wrapper .draft-sort-skip').click(function() {

					var currentPage = mw.config.get('wgPageName').replace(/_/g, ' ');
					try {
						var skiplist = JSON.parse(window.localStorage.getItem('draft-sort-burst-skiplist')) || {};
						skiplist[currentPage] = 1;
						window.localStorage.setItem('draft-sort-burst-skiplist', JSON.stringify(skiplist));
					}  catch(e) {}

					window.location = '//en.wikipedia.org/wiki/' + nextDraft + '?draftsorttrigger=y';
				});

			}
		}

		function postQuery() {
			//console.log(query);
			api.get(query)
				.then(checkTalkPages)
				.then(selectNextDraft)
				.fail(function(e) {
					console.log('API for getting next draft failed ' + e);
				});
		}

		postQuery();

	}

});

//</nowiki>