Content deleted Content added
MusikAnimal (talk | contribs) No edit summary |
MusikAnimal (talk | contribs) No edit summary |
||
Line 1:
(function() {
$("head").append(importStylesheet("User:MusikAnimal/customWatchlists.css"));
var addCwLinkListener = function() {
$(".cw-add").click(function() {
if($("#cw-overlay")[0]) return false;
var pageName = new mw.Title($(this).siblings(".mw-title").text());
pageName = pageName.getNamespacePrefix()+pageName.getMain();
getCustomWatchlists().then(setupCactionInterface.bind(this, pageName),setupCactionInterface.bind(this, null));
});▼
};
var getCustomWatchlists = function() {
Line 12 ⟶ 21:
var generateListItem = function(data) {
var pageUrl = "/w/index.php?title="+data.title
var lengthDiff = data.newlen - data.oldlen;
var diffClass = lengthDiff >= 0 ? "mw-plusminus-pos" : "mw-plusminus-neg"; return "<li class='mw-line-even mw-changeslist-line-not-watched'>" +
"("+
"<a href='"+pageUrl+"&diff=prev&oldid="+data.revid+"' class='nonimage'>diff</a> | " +
"<a href='"+pageUrl+"&action=history' class='nonimage'>hist</a> | " +
"<a href='javascript:' class='cw-add'>cw</a>" +
") " +
"<span class='mw-changeslist-separator'>. .</span> " +
"<span class='mw-changeslist-date'>"+formatDate(editDate)+"</span> " +
"<span class='mw-title'><a href='/wiki/"+encodeURI(data.title).replace(/'/g, "%27")+"' class='mw-changeslist-title nonimage'>"+data.title+"</a></span> " +
(data.newlen ? "<span class='mw-changeslist-separator'>. .</span> <span dir='ltr' class='"+diffClass+"'>("+(lengthDiff > 0 ? "+" : "")+lengthDiff+")</span> " : "") +
"<span class='mw-changeslist-separator'>. .</span> " +
"<a href='/wiki/User:"+data.user+"' class='mw-userlink nonimage'>"+data.user+"</a> " +
Line 33 ⟶ 44:
};
var showCustomWatchlist = function(type,lists,target,limit,allrev) {
var apiRoot = "/w/api.php?action=query";
var pages = JSON.parse(JSON.stringify(lists[target]));
var pagesLength = pages.length;
var mwPageName = new mw.Title(pages[i]);
if(mwPageName.namespace % 2 === 0) {
pages.push(mwPageName.getNamespacePrefix().slice(0,-1) + (mwPageName.namespace === 0 ? "Talk:" : "_talk:") + mwPageName.getMain());
}
}
$(".mw-changeslist").html("Loading...");
var newHtml = "";
if(type === "rc") {
$.get(apiRoot+"&list=watchlist&wlprop=user|parsedcomment|timestamp|sizes|title|ids&wltype=edit&wllimit="+limit+(allrev === true ? "&wlallrev=true" : "")+"&format=json", function(data) {
var
var mwName = new mw.Title(el.title);
return pages.indexOf(mwName.getNamespacePrefix()+mwName.getMain()) >= 0; });
for(var i=0; i<matches.length; i++) {
newHtml += generateListItem(matches[i]);▼
}
$(".mw-changeslist").html(newHtml);▼
addCwLinkListener();
});
} else {
▲ for(var i=0; i<matches.length; i++) {
var queryablePages = $.map(pages,function(p,i){return encodeURIComponent(p).replace(/'/g, "%27")}).join("|");
▲ newHtml += generateListItem(matches[i]);
$.get(apiRoot+"&prop=revisions&rvprop=ids|timestamp|user|parsedcomment&titles="+queryablePages+"&format=json", function(data) {
▲ }
var sortedData = [];
▲ $(".mw-changeslist").html(newHtml);
for(var pageId in data.query.pages) {
▲ });
if(parseInt(pageId) > 0) {
var pageData = data.query.pages[pageId];
sortedData.push({
parsedcomment : pageData.revisions[0].parsedcomment,
revid: pageData.revisions[0].revid,
timestamp: pageData.revisions[0].timestamp,
title: pageData.title,
user: pageData.revisions[0].user
});
}
}
$.each(sortedData.sort(function(x,y) {
if($("#cw-rw-options input:checked").val() === "timestamp") {
return new Date(y.timestamp).getTime() - new Date(x.timestamp).getTime();
} else {
return x.title.localeCompare(y.title);
}
}), function(i,v) {
newHtml += generateListItem(v);
});
$(".mw-changeslist").html(newHtml);
addCwLinkListener();
});
}
};
var showCustomWatchlistsForm = function(appendHtml) {
var html = "<form id='custom_watchlist_form'><fieldset>" +
"<legend>Custom watchlists (<a href='//en.wikipedia.org/w/index.php?title=User:MusikAnimal/customWatchlists'>documentation</a>)</legend>" + appendHtml;
$("#mw-watchlist-form").after(html);
};
var setupCactionInterface = function(data, argName) {
if(argName) {
pageName = data;
data = argName;
} else {
pageName = wgPageName;
}
var customWatchlists = data ? JSON.parse(data.split("\n")[0]) : {};
var customWatchlistNames = Object.keys(customWatchlists),
Line 63 ⟶ 118:
for(var wl in customWatchlists) {
if(customWatchlists[wl].indexOf(
inWatchlists.push(wl);
}
Line 73 ⟶ 128:
"<span class='closer-x' onclick=\"$('#cw-overlay').remove();\"></span>" +
"</div>" +
"<div id='cw-overlay-body'>"
(argName ? "<p style='margin-top:0'>Page name: <i>"+pageName.replace(/_/g, " ")+"</i></p>" : "");
for(var i=0; i < customWatchlistNames.length; i++) {
var listName = customWatchlistNames[i];
html += "<span><input class='cw-option' type='checkbox' value='"+i+"' "+(inWatchlists.indexOf(listName) !== -1 ? "checked data-index='"+customWatchlists[listName].indexOf(
}
Line 118 ⟶ 174:
customWatchlistNames: customWatchlistNames,
customWatchlists: customWatchlists,
inWatchlists: inWatchlists,
pageName : pageName
}, function(e) {
$("#cw-overlay-selector-submit").replaceWith("Saving...");
var cw = e.data.customWatchlists,
iw = e.data.inWatchlists,
pageName = e.data.pageName.replace("_talk:",":").replace("Talk:",":"),
toWatch = false,
updateStr = "";
Line 138 ⟶ 196:
toWatch = true;
if(id < 0) {
updateStr = "Created the custom watchlist <b>"+key+"</b> with <b>"+
cw[key] = [
} else {
updateStr = "Added <b>"+
cw[key].push(
}
}
} else if(exists) {
updateStr = "Removed <b>"+
cw[key].splice($(this).data('index'),1);
}
Line 154 ⟶ 212:
var api = new mw.Api();
api.watch(
api.postWithToken( "edit", {
action: "edit",
Line 198 ⟶ 256:
}
html += "</select><
"<p id='cw-list-type'>Show: <label><input type='radio' name='cw-display-type' value='rc' checked /> Recent changes</label> <label><input type='radio' name='cw-display-type' value='rw' /> Raw watchlist</label></p>" +
"<label for='custom_watchlist_limit'>Search limit (from base watchlist):</label> <select id='custom_watchlist_limit'>";▼
"<p id='cw-rw-options' style='display:none'>Sorting: <label><input type='radio' name='cw-rw-sorting' value='timestamp' checked /> Last edited</label> <label><input type='radio' name='cw-rw-sorting' value='title' />Alphabetical</label></p>" +
▲ "<p id='cw-rc-options'><label for='custom_watchlist_limit'>Search limit (from base watchlist):</label> <select id='custom_watchlist_limit'>";
var limitArr = [50,100,250,500,1000,2500,5000];
for(var j=0; j<limitArr.length; j++) {
Line 206 ⟶ 266:
html += "</select><br/>" +
"<input type='checkbox' id='custom_watchlist_all_rev' value='wlallrev' /><label for='custom_watchlist_all_rev'>Include multiple revisions to same page</label><
"<p><button id='custom_watchlist_submit'>Go</button></fieldset></p></form>";
showCustomWatchlistsForm(html);
Line 213 ⟶ 273:
$("#custom_watchlist_submit").click(function(e) {
e.preventDefault();
showCustomWatchlist($("#cw-list-type input[type=radio]:checked").val(),customWatchlists,customWatchlistNames[parseInt($("#custom_watchlist_selector").val())],$("#custom_watchlist_limit").val(),$("#custom_watchlist_all_rev").is(":checked"));
});
$("#custom_watchlist_form input[type=radio]").click(function() {
if($(this).val() === "rc") {
$("#cw-rc-options").show();
$("#cw-rw-options").hide();
} else {
$("#cw-rc-options").hide();
$("#cw-rw-options").show();
}
});
}, function() {
showCustomWatchlistsForm("<p>No <a href='https://en.wikipedia.org/wiki/User:MusikAnimal/customWatchlists'>custom watchlists</a> yet! Go to a <a href='/wiki/Special:Random'>page</a> and create a custom watchlist by selecting the \"Custom Watchlists…\" item from the More menu.</p>");
});
$(".mw-changeslist .special li").each(function() {
$anchor = $(this).find("a").eq(1);
if($anchor.text() === "hist" && !$anchor.siblings(".wikibase-edit").length) {
$anchor.after(" | <a class='cw-add' href='javascript:'>cw</a>");
}
});
addCwLinkListener();
} else if(wgNamespaceNumber >= 0) {
mw.util.addPortletLink(
|