MediaWiki:Gadget-markreview.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary Tag: Reverted |
No edit summary Tag: Reverted |
||
| Line 3: | Line 3: | ||
function run($content) { | function run($content) { | ||
// Find .doc-meta in content or fallback to whole DOM | |||
var $docMeta = $content.find('.doc-meta').first(); | var $docMeta = $content.find('.doc-meta').first(); | ||
if (!$docMeta.length) { | if (!$docMeta.length) { | ||
$docMeta = $('.doc-meta').first(); | $docMeta = $('.doc-meta').first(); | ||
} | } | ||
if (!$docMeta.length) return; // No panel found | |||
var owner = $docMeta.attr('data-owner'); | var owner = $docMeta.attr('data-owner'); | ||
| Line 97: | Line 98: | ||
border: '1px solid #ccc', | border: '1px solid #ccc', | ||
borderRadius: '2px', | borderRadius: '2px', | ||
textDecoration: 'none' | |||
}) | |||
.on('click', function (e) { | |||
e.preventDefault(); | |||
doReview(); | |||
}); | |||
// Inject into .doc-meta-actions or create it | |||
var $actions = $docMeta.closest('table').nextAll('.doc-meta-actions').first(); | |||
if (!$actions.length) { | |||
$actions = $('<div class="doc-meta-actions"></div>').insertAfter($docMeta.closest('table')); | |||
} | |||
$actions.empty().append($btn); | |||
} | |||
// Run on initial load and after AJAX loads | |||
mw.hook('wikipage.content').add(run); | |||
}); | |||
Revision as of 09:04, 9 September 2025
/* Gadget: MarkReview — One‑click "Mark as reviewed" for page owners (updates review_ping parameter) */
mw.loader.using(['mediawiki.api', 'mediawiki.util', 'mediawiki.user']).then(function () {
function run($content) {
// Find .doc-meta in content or fallback to whole DOM
var $docMeta = $content.find('.doc-meta').first();
if (!$docMeta.length) {
$docMeta = $('.doc-meta').first();
}
if (!$docMeta.length) return; // No panel found
var owner = $docMeta.attr('data-owner');
var user = mw.config.get('wgUserName');
var action = mw.config.get('wgAction') || 'view';
if (action !== 'view') return;
if (!owner || !user || owner.toLowerCase() !== user.toLowerCase()) return;
function localStamp() {
var now = new Date();
return now.getFullYear() + '-' +
String(now.getMonth() + 1).padStart(2, '0') + '-' +
String(now.getDate()).padStart(2, '0') + 'T' +
String(now.getHours()).padStart(2, '0') + ':' +
String(now.getMinutes()).padStart(2, '0') + ':' +
String(now.getSeconds()).padStart(2, '0');
}
function doReview() {
var page = mw.config.get('wgPageName');
var stamp = localStamp();
var api = new mw.Api();
api.get({
action: 'query',
prop: 'revisions',
titles: page,
rvslots: 'main',
rvprop: 'content|timestamp',
formatversion: 2
}).done(function (data) {
var pg = data.query.pages[0];
if (!pg || !pg.revisions || !pg.revisions.length) {
mw.notify('Could not read page content', { type: 'error' });
return;
}
var rev = pg.revisions[0];
var content = rev.slots.main.content;
var baseTs = rev.timestamp;
// Match the first {{DocMeta ...}} block
var docmetaRe = /\{\{\s*DocMeta\b([\s\S]*?)\}\}/i;
var m = content.match(docmetaRe);
if (!m) {
mw.notify('DocMeta block not found on this page', { type: 'error' });
return;
}
var block = m[0];
var inner = m[1];
// Replace or insert review_ping
var rpRe = /(\|\s*review_ping\s*=\s*)(.*)/i;
var newInner;
if (rpRe.test(inner)) {
newInner = inner.replace(rpRe, '$1' + stamp);
} else {
newInner = inner + '\n | review_ping = ' + stamp;
}
var newBlock = block.replace(inner, newInner);
var newContent = content.replace(docmetaRe, newBlock);
api.postWithToken('csrf', {
action: 'edit',
title: page,
text: newContent,
summary: 'Mark as reviewed',
minor: true,
nocreate: true,
basetimestamp: baseTs
}).done(function () {
location.reload();
}).fail(function (err) {
mw.notify('Review failed: ' + (err && err.error && err.error.info ? err.error.info : err), { type: 'error' });
});
});
}
// Create the button
var $btn = $('<a>')
.attr('href', '#')
.text('Mark as reviewed')
.css({
display: 'inline-block',
marginTop: '8px',
padding: '4px 8px',
background: '#f0f0f0',
border: '1px solid #ccc',
borderRadius: '2px',
textDecoration: 'none'
})
.on('click', function (e) {
e.preventDefault();
doReview();
});
// Inject into .doc-meta-actions or create it
var $actions = $docMeta.closest('table').nextAll('.doc-meta-actions').first();
if (!$actions.length) {
$actions = $('<div class="doc-meta-actions"></div>').insertAfter($docMeta.closest('table'));
}
$actions.empty().append($btn);
}
// Run on initial load and after AJAX loads
mw.hook('wikipage.content').add(run);
});