User:Writ Keeper/Scripts/massRevdel.js

mw.hook("wikipage.content").add( function()

{

mw.loader.using(["mediawiki.api"]).then(function ()

{

var apiLimit = 500;

var api = new mw.Api();

if(mw.config.get("wgCanonicalSpecialPageName") == "Contributions")

{

wkContribsCheckboxInit = true;

$("ul.mw-contributions-list:first").before("

Revision deletion\

\

\

delete content \

delete user name \

delete edit summary \

undelete content \

undelete user name \

undelete edit summary \


\

\

");

$("ul.mw-contributions-list .mw-revdelundel-link").each(function(ind,el){

if($(this).children("a").length > 0)

{

var revId = /ids=(\d+)/.exec($(this).children("a").attr("href"))[1];

var pageTitle = /target=([^&]+)/.exec($(this).children("a").attr("href"))[1];

el.innerHTML = "";

$(el).children(".revdelIds").data("index", ind);

}

});

$("ul.mw-contributions-list").after("");

$("#revdelCP").data("revdelToolbarShowing", false);

$("#revdelCP").data("lastSelectedIndex", -1);

//load canned summaries

$.get("/w/index.php?title=MediaWiki:Revdelete-reason-dropdown&action=raw",function(data)

{

reasons = data.replace(/\*\* ([^\*]+)/g, '');

reasons = reasons.replace(/\* ([^<]+)([^\*]+)/g, '$2');

$('#wpRevDeleteReasonList').append(reasons);

}).done(function()

{

$.get("/w/index.php?title=MediaWiki:Revdelete-reason-dropdown-suppress&action=raw", function(data)

{

reasons = data.replace(/\*\* ([^\*]+)/g, '');

reasons = reasons.replace(/\* ([^<]+)([^\*]+)/g, '$2');

$('#wpRevDeleteReasonList').append(reasons);

});

});

//attach handlers

$("#revdelLabel").click(

function()

{

if($("#revdelCP").data("revdelToolbarShowing"))

{

$("#revdelCP").data("revdelToolbarShowing", false);

$("#revdelLabelImg").css("transform","rotate(270deg)");

$("#revdelCPBody").fadeOut();

}

else

{

$("#revdelCP").data("revdelToolbarShowing", true);

$("#revdelLabelImg").css("transform","none");

$("#revdelCPBody").fadeIn();

}

}

);

$("#revdelSelectAll").click(

function()

{

$('input.revdelIds').each(function()

{

$(this).prop("checked", true);

});

$("#revdelCP").data("lastSelectedIndex", -1);

}

);

$("#revdelSelectNone").click(

function()

{

$('input.revdelIds').each(function()

{

$(this).prop("checked", false);

});

$("#revdelCP").data("lastSelectedIndex", -1);

}

);

$("#revdelSelectInv").click(

function()

{

$('input.revdelIds').each(function()

{

$(this).prop("checked", !($(this).prop("checked")));

});

$("#revdelCP").data("lastSelectedIndex", -1);

}

);

$("input.revdelIds").off("click").click(

function(ev)

{

var lastSelectedRevdel = $("#revdelCP").data("lastSelectedIndex");

var newIndex = $(this).data("index")

if(ev.shiftKey && lastSelectedRevdel >= 0)

{

var checkboxArray = $("input.revdelIds");

var start = lastSelectedRevdel;

var stop = newIndex;

if(start < stop)

{

for(var i = start; i < stop; i++)

{

if(i != lastSelectedRevdel)

{

$(checkboxArray[i]).prop("checked", !($(checkboxArray[i]).prop("checked")));

}

}

}

else

{

for(var i = start; i > stop; i--)

{

if(i != lastSelectedRevdel)

{

$(checkboxArray[i]).prop("checked", !($(checkboxArray[i]).prop("checked")));

}

}

}

}

$("#revdelCP").data("lastSelectedIndex", newIndex);

}

);

$("#revdelSubmit").click(

function()

{

//figure out which revisions and pages we're working on.

var revCount = 0;

var numTitles = 0;

var pageTitles = {};

$("input.revdelIds:checked").each(function(ind)

{

revCount = ind + 1;

if(ind > apiLimit - 1)

{

mw.notify("You can't do more than " + apiLimit + " revdels at once! Canceling...");

return false;

}

if(typeof pageTitles[$(this).attr("name")] == "undefined")

{

pageTitles[$(this).attr("name")] = $(this).val();

numTitles++;

}

else

{

pageTitles[$(this).attr("name")] = pageTitles[$(this).attr("name")] + "|" + $(this).val();

}

});

if(numTitles == 0)

{

mw.notify("You didn't select any revisions to delete!");

return false;

}

var confirmString = "You are attempting to modify " + revCount + " revisions.\n\nThe following revision attributes will be changed:\n";

//figure out what we're doing to each revision. This is pretty clunky, but whatever.

var deleteString = "";

var revealString = "";

var typeString = "revdel";

if($("#revdelContent").prop("checked") == $("#undelContent").prop("checked"))

{

confirmString = confirmString + "-Content visibility won't change.\n";

}

else if($("#revdelContent").prop("checked"))

{

deleteString = "content";

confirmString = confirmString + "-Content will be deleted.\n";

}

else

{

revealString = "content";

confirmString = confirmString + "-Content will be revealed.\n";

}

if($("#revdelComment").prop("checked") == $("#undelComment").prop("checked"))

{

confirmString = confirmString + "-Edit summary visibility won't change.\n";

}

else if($("#revdelComment").prop("checked"))

{

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "comment";

confirmString = confirmString + "-Edit summary will be deleted.\n";

}

else

{

if(revealString != "")

{

revealString = revealString + "|";

}

revealString = revealString + "comment";

confirmString = confirmString + "-Edit summary will be revealed.\n";

}

if($("#revdelName").prop("checked") == $("#undelName").prop("checked"))

{

confirmString = confirmString + "-User name visibility won't change.\n";

}

else if($("#revdelName").prop("checked"))

{

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "user";

confirmString = confirmString + "-User name will be deleted.\n";

}

else

{

if(revealString != "")

{

revealString = revealString + "|";

}

revealString = revealString + "user";

confirmString = confirmString + "-User name will be revealed.\n";

}

if(deleteString == "" && revealString == "")

{

mw.notify("You didn't select any properties of the revisions to change!");

return false;

}

var summary = "";

//construct the revdel summary

if($("#wpRevDeleteReasonList").val() == "other")

{

if($("#wpReason").val() == "")

{

mw.notify("You didn't select or write in an edit summary for the logs!");

return false;

}

summary = $("#wpReason").val();

}

else

{

summary = $("#wpRevDeleteReasonList").val();

if($("#wpReason").val() != "")

{

summary = summary + ": " + $("#wpReason").val();

}

}

confirmString = confirmString + "\nYour revdel summary is: "+ summary +"\n\nAre you sure you want to do this?";

if(confirm(confirmString))

{

var numCompleted = 0;

for (title in pageTitles)

{

var ajaxData;

ajaxData = {action:"revisiondelete",type:"revision",ids:pageTitles[title],reason:summary};

if(deleteString != "")

{

ajaxData.hide=deleteString;

}

if(revealString != "")

{

ajaxData.show=revealString;

}

api.postWithToken('csrf', ajaxData).done(function()

{

numCompleted++;

if(numCompleted == numTitles)

{

mw.notify("modified " + revCount + " revision(s) successfully!");

return false;

}

});

}

}

return false;

}

)

$("#oversightSubmit").click(

function()

{

//figure out which revisions and pages we're working on.

var revCount = 0;

var numTitles = 0;

var pageTitles = {};

$("input.revdelIds:checked").each(function(ind)

{

revCount = ind + 1;

if(ind > apiLimit - 1)

{

mw.notify("You can't do more than " + apiLimit + " revdels at once! Canceling...");

return false;

}

if(typeof pageTitles[$(this).attr("name")] == "undefined")

{

pageTitles[$(this).attr("name")] = $(this).val();

numTitles++;

}

else

{

pageTitles[$(this).attr("name")] = pageTitles[$(this).attr("name")] + "|" + $(this).val();

}

});

if(numTitles == 0)

{

mw.notify("You didn't select any revisions to delete!");

return false;

}

var confirmString = "You are attempting to modify " + revCount + " revisions.\n\nThe following revision attributes will be changed:\n";

//figure out what we're doing to each revision. This is pretty clunky, but whatever.

var deleteString = "";

var oversighting = -1;

if($("#revdelContent").prop("checked") == $("#undelContent").prop("checked"))

{

confirmString = confirmString + "-Content visibility won't change.\n";

}

else if($("#revdelContent").prop("checked"))

{

deleteString = "content";

confirmString = confirmString + "-Content will be oversighted.\n";

oversighting = 1;

}

else

{

if(oversighting == 1)

{

mw.notify("we can't oversight and un-oversight edits at the same time!");

return false;

}

deleteString = "content";

confirmString = confirmString + "-Content will be returned to normal (admin-only) revision deletion.\n";

oversighting = 0;

}

if($("#revdelComment").prop("checked") == $("#undelComment").prop("checked"))

{

confirmString = confirmString + "-Edit summary visibility won't change.\n";

}

else if($("#revdelComment").prop("checked"))

{

if(oversighting == 0)

{

mw.notify("we can't oversight and un-oversight edits at the same time!");

return false;

}

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "comment";

confirmString = confirmString + "-Edit summary will be oversighted.\n";

oversighting = 1;

}

else

{

if(oversighting == 1)

{

mw.notify("we can't oversight and un-oversight edits at the same time!");

return false;

}

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "comment";

confirmString = confirmString + "-Edit summary will be returned to normal (admin-only) revision deletion.\n";

oversighting = 0;

}

if($("#revdelName").prop("checked") == $("#undelName").prop("checked"))

{

confirmString = confirmString + "-User name visibility won't change.\n";

}

else if($("#revdelName").prop("checked"))

{

if(oversighting == 0)

{

mw.notify("we can't oversight and un-oversight edits at the same time!");

return false;

}

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "user";

confirmString = confirmString + "-User name will be oversighted.\n";

oversighting = 1;

}

else

{

if(oversighting == 1)

{

mw.notify("we can't oversight and un-oversight edits at the same time!");

return false;

}

if(deleteString != "")

{

deleteString = deleteString + "|";

}

deleteString = deleteString + "user";

confirmString = confirmString + "-User name will be returned to normal (admin-only) revision deletion.\n";

oversighting = 0;

}

if(deleteString == "")

{

mw.notify("You didn't select any properties of the revisions to change!");

return false;

}

var summary = "";

//construct the revdel summary

if($("#wpRevDeleteReasonList").val() == "other")

{

if($("#wpReason").val() == "")

{

mw.notify("You didn't select or write in an edit summary for the logs!");

return false;

}

summary = $("#wpReason").val();

}

else

{

summary = $("#wpRevDeleteReasonList").val();

if($("#wpReason").val() != "")

{

summary = summary + ": " + $("#wpReason").val();

}

}

confirmString = confirmString + "\nYour oversight summary is: "+ summary +"\n\nAre you sure you want to do this?";

if(confirm(confirmString))

{

var numCompleted = 0;

for (title in pageTitles)

{

var ajaxData;

ajaxData = {action:"revisiondelete",type:"revision",ids:pageTitles[title],reason:summary,hide:deleteString};

if(oversighting == 1)

{

ajaxData.suppress = "yes";

}

else if(oversighting == 0)

{

ajaxData.suppress = "no";

}

else

{

mw.notify("Something went wrong, so we're going to abort without doing anything.");

}

api.postWithToken('csrf', ajaxData).done(function()

{

numCompleted++;

if(numCompleted == numTitles)

{

mw.notify("modified " + revCount + " revision(s) successfully!");

return false;

}

});

}

}

return false;

}

)

}

});

});