User:Monster Domosed/common.js: Difference between revisionsGive feedback
No edit summary Tag: Manual revert |
No edit summary |
||
| Line 1: | Line 1: | ||
(function ($, mw) { | |||
function formatRelativeTime(timestamp) { | |||
var then = new Date(timestamp).getTime(); | |||
var now = Date.now(); | |||
var diffSeconds = Math.round((now - then) / 1000); | |||
var abs = Math.abs(diffSeconds); | |||
var value; | |||
var short; | |||
if (abs < 60) { | |||
short = 's'; | |||
value = diffSeconds; | |||
} else if (abs < 3600) { | |||
short = 'm'; | |||
value = Math.round(diffSeconds / 60); | |||
} else if (abs < 86400) { | |||
short = 'h'; | |||
value = Math.round(diffSeconds / 3600); | |||
} else { | |||
short = 'd'; | |||
value = Math.round(diffSeconds / 86400); | |||
} | |||
var n = Math.abs(value); | |||
return diffSeconds < 0 ? 'in ' + n + short : n + short + ' ago'; | |||
} | |||
function renderWidget($root, items) { | |||
var $container = $('<div class="recent-edits-container"></div>'); | |||
var $list = $('<ol class="recent-edits-list"></ol>'); | |||
items.forEach(function (item) { | |||
var $li = $('<li class="recent-edits-item"></li>'); | |||
var $title = $('<a class="recent-edits-title"></a>') | |||
.attr('href', mw.util.getUrl(item.title)) | |||
.text(item.title); | |||
var $user; | |||
if (item.user) { | |||
$user = $('<a class="recent-edits-user"></a>') | |||
.attr('href', mw.util.getUrl('Special:Contributions/' + item.user)) | |||
.text(item.user); | |||
} else { | |||
$user = $('<span class="recent-edits-user"></span>') | |||
.text('Unknown'); | |||
} | |||
var $time = $('<time class="recent-edits-time"></time>') | |||
.attr('datetime', new Date(item.timestamp).toISOString()) | |||
.text(formatRelativeTime(item.timestamp)); | |||
var $meta = $('<div class="recent-edits-meta"></div>') | |||
.append($time) | |||
.append(document.createTextNode(' · ')) | |||
.append($user); | |||
$li.append($title).append($meta); | |||
$list.append($li); | |||
}); | |||
var $footer = $('<div class="recent-edits-footer"></div>'); | |||
var $moreBtn = $('<a class="recent-edits-more" role="button"></a>') | |||
.attr('href', mw.util.getUrl('Special:RecentChanges')) | |||
.text('Show more...'); | |||
$footer.append($moreBtn); | |||
$container.append($list).append($footer); | |||
$root.empty().append($container); | |||
} | |||
function loadRecentEdits($root) { | |||
var limit = parseInt($root.data('limit'), 10) || 5; | |||
return new mw.Api().get({ | |||
action: 'query', | |||
list: 'recentchanges', | |||
rcprop: 'title|timestamp|user|ids|flags', | |||
rctype: 'edit|new', | |||
rcnamespace: 0, | |||
rclimit: limit | |||
}).then( | |||
function (data) { | |||
var items = []; | |||
if (data && data.query && data.query.recentchanges) { | |||
items = data.query.recentchanges; | |||
} | |||
renderWidget($root, items); | |||
}, | |||
function () { | |||
$root.html( | |||
'<div class="recent-edits-error">Could not load recent edits.</div>' | |||
); | |||
} | |||
); | |||
} | |||
function initWidget($root) { | |||
var refreshMs = parseInt($root.data('refresh'), 10) || 300000; | |||
$root.html( | |||
'<div class="recent-edits-loading">Loading recent edits…</div>' | |||
); | |||
function refresh() { | |||
loadRecentEdits($root); | |||
} | |||
refresh(); | |||
window.setInterval(refresh, refreshMs); | |||
} | |||
function injectSidebarWidget() { | |||
if ($('#p-recent-edits').length) { | |||
return $('#p-recent-edits .recent-edits-widget'); | |||
} | |||
var $portlet = $( | |||
'<nav id="p-recent-edits" class="mw-portlet mw-portlet-recent-edits vector-menu-portal portal vector-menu" aria-labelledby="p-recent-edits-label">' + | |||
'<h3 id="p-recent-edits-label" class="vector-menu-heading">' + | |||
'<span class="vector-menu-heading-label">Recent Changes</span>' + | |||
'</h3>' + | |||
'<div class="vector-menu-content">' + | |||
'<div class="recent-edits-widget" data-limit="5" data-refresh="300000"></div>' + | |||
'</div>' + | |||
'</nav>' | |||
); | |||
if ($('#p-Community').length) { | |||
$('#p-Community').after($portlet); | |||
} else if ($('#p-Contribute').length) { | |||
$('#p-Contribute').after($portlet); | |||
} else { | |||
$('#mw-panel').append($portlet); | |||
} | |||
return $portlet.find('.recent-edits-widget'); | |||
} | |||
$(function () { | |||
var $widget = $('.recent-edits-widget'); | |||
if (!$widget.length) { | |||
$widget = injectSidebarWidget(); | |||
} | |||
$widget.each(function () { | |||
initWidget($(this)); | |||
}); | |||
}); | |||
}(jQuery, mediaWiki)); | |||