User:Dane/orcp.js

// ( function ( $, mw ) {   mw.loader.load( "mediawiki.ui.input", "text/css" );    var ADVERTISEMENT = "";

if ( mw.config.get( 'wgPageName' ) === "Wikipedia:Requests_for_adminship/Optional_RfA_candidate_poll" ) { $( `        .orcp-rating {            box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);            padding: 5px;            padding-left: 19px;            display: inline-block;        }

.orcp-rating input { padding: 4px 4px 4px 8px; height: 35px; }

.orcp-rating input.invalid { box-shadow: 0px 0px 0px 2px #D11D13 inset; border-color: #D11D13; }

.orcp-rating textarea { height: auto; }

.orcp-rating textarea.mw-ui-input { min-height: 0; }

.orcp-rating th { text-align: left; }       ` ).appendTo( "head" );        $( "h2:not(:contains('Instructions')) .mw-editsection" ).each( function ( index, element ) { var username = $( this ).parent.text.replace( /\[[\s\S]+\]/, "" );

// We shouldn't be able to rate ourselves if( mw.config.get( "wgUserName" ) === username ) return;

// We shouldn't be able to rate people twice var testLink = function ( link ) { return link.href.indexOf( mw.config.get( "wgUserName" ) ) >= 0; }; var linksInComments = $( this ).parent.nextUntil( "h2" ).filter( "ul" ).children.children( "a" ).toArray; if( linksInComments.some( testLink ) ) return; $( this ).children( ".mw-editsection-bracket" ).last .before( " | " ) .before( makeActionLink( username ) ); } );   }

function specificElementId ( username ) { var prefix = "orcp-" + username.replace( /[^a-z0-9]/g, "_" ) + "-"; return { "rating": prefix + "rating-field", "comment": prefix + "comment-field", "button": prefix + "rate-button", "placeholder": prefix + "placeholder", "cancel": prefix + "cancel-button" };   }

function specificElement ( username ) { var ids = specificElementId( username );

// Object "mapping" taken from http://stackoverflow.com/a/14810722 return Object.keys( ids ).reduce( function ( previous, current ) {           previous[ current ] = $( "#" + ids[ current ] );            return previous;        }, {} ); }

function makeActionLink ( username ) { return $( "" ).css( "cursor", "pointer" ).text( "add rating" ).attr( "href", "#" ).on( "click", function ( e ) {           console.log( "Link for " + username + " was clicked." );           buildPanel( $( this ), username );            $( this ).replaceWith( "add rating" );            return false;        } ); }

/*    * target is the "add request" link that was clicked to trigger this. */   function buildPanel ( target, username ) { var ids = specificElementId( username ), createSeparator = function { return $( " | " ); }; target.parent.parent.after( `       `); specificElement( username ).rating.blur( function { validate( username ); } ); specificElement( username ).comment.blur( function { validate( username ); } ); specificElement( username ).button.click( function { saveRating( username, $( this ).parent ); } ); specificElement( username ).cancel.click( function {

// This statement walks back up the DOM to the .orcp-rating div $( this ).parent.parent.parent.parent.parent.remove; specificElement( username ).placeholder.replaceWith( makeActionLink( username ) ); } );   }

function validate ( username ) { var userInput = specificElement( username ).rating.val, validRating = /^[0-9]+(\.[0-9]+)?$/.test( userInput ) && ( parseInt( userInput, 10 ) <= 10 ); specificElement( username ).rating.toggleClass( "invalid", !validRating ); specificElement( username ).button.prop( "disabled", !validRating ); return validRating; }

// The argument "that" represents the entire panel div function saveRating ( username, that ) { if ( !validate( username ) ) return; $( specificElement( username ).button ).prop( "disabled", true ); $( specificElement( username ).rating ).prop( "disabled", true ); $( specificElement( username ).comment ).prop( "disabled", true ); var statusElement = $( " Saving rating... " ).appendTo( that ), setStatus = function ( status, callback ) { statusElement.fadeOut( function { statusElement.html( status ).fadeIn( callback ); } ) }; setStatus( "Getting wikitext..." ); var wikitext; $.getJSON(           mw.util.wikiScript('api'),            {                format: 'json',                action: 'query',                prop: 'revisions',                rvprop: 'content',                rvlimit: 1,                titles: "Wikipedia:Requests for adminship/Optional RfA candidate poll"            }        ).done( function ( data ) {            try {                var pageId = Object.keys(data.query.pages)[0];                wikitext = data.query.pages[pageId].revisions[0]['*'];                setStatus( "Got this page's wikitext, processing..." );

var headerMatch = ( new RegExp( "(==\\s*" + username + "\\s*==)" ) ).exec( wikitext ); var sectionTextPlus = wikitext.slice( headerMatch.index + headerMatch[1].length );

var sectionText = sectionTextPlus; if( sectionTextPlus.indexOf( "==" ) >= 0 ) { sectionText = sectionText.substring( 0, sectionText.indexOf( "==" ) ); }               sectionText = sectionText.trim;

// Make the new wikitext var rating = specificElement( username ).rating.val; var newLine = "*" + rating + "/10 - " + specificElement( username ).comment.val + " ~"; var newWikitext = wikitext.replace( sectionText, sectionText + "\n" + newLine );

setStatus( "Wikitext processed. Saving..." ); $.ajax( {                   url: mw.util.wikiScript( 'api' ),                    type: 'POST',                    dataType: 'json',                    data: {                        format: 'json',                        action: 'edit',                        title: "Wikipedia:Requests for adminship/Optional RfA candidate poll",                        summary: rating + "/10 for " + username + ADVERTISEMENT,                        token: mw.user.tokens.get( 'csrfToken' ),                        text: newWikitext                    }                } ).done ( function ( data ) {                    if ( data && data.edit && data.edit.result && data.edit.result == 'Success' ) {                        setStatus( "Rating saved! (Reload)" );                        $( ":animated" ).promise.done( function { that.children( "span.status" ).children( "a" ).click( function { document.location.reload( true ); } ); } );                       specificElement( username ).cancel.text( "Done" );                    } else {                        setStatus( "While saving, the edit query returned an error. =(" ); }               } ).fail ( function { setStatus( "While saving, the AJAX request failed." ); } );           } catch ( e ) {                setStatus( "While getting the wikitext, there was an error." );               console.log( "Content request error: " + e.message );                console.log( "Content request response: " + JSON.stringify( data ) );            }        } ).fail( function  {            setStatus( "While getting the wikitext, there was an AJAX error." );       } );    } }( jQuery, mediaWiki ) ); //