User:Euphoria/common.js: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
OOUI buttons |
fix |
||
| Line 1: | Line 1: | ||
// |
//<nowiki> |
||
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui |
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui'], function () { |
||
const pagePrefix = 'User:Euphoria/Test VfD'; |
const pagePrefix = 'User:Euphoria/Test VfD'; |
||
| Line 22: | Line 22: | ||
const actions = [ |
const actions = [ |
||
{ name: 'delete', |
{ name: 'delete', colorClass: 'oo-ui-destructiveElement' }, |
||
{ name: 'keep', |
{ name: 'keep', colorClass: 'oo-ui-progressiveElement' }, |
||
{ name: 'no consensus', |
{ name: 'no consensus', colorClass: 'oo-ui-warningElement' } |
||
]; |
]; |
||
actions.forEach(function (actionObj) { |
actions.forEach(function (actionObj) { |
||
// Create OOUI button |
|||
const btn = new OO.ui.ButtonWidget({ |
const btn = new OO.ui.ButtonWidget({ |
||
label: actionObj.name.charAt(0).toUpperCase(), |
label: actionObj.name.charAt(0).toUpperCase(), |
||
title: 'Close as ' + actionObj.name, |
title: 'Close as ' + actionObj.name, |
||
classes: ['vfd-btn', actionObj.colorClass], |
|||
flags: ['small'] // small button size |
|||
}); |
}); |
||
// Mouse hover brightness handled automatically by OOUI |
|||
btn.on('click', function (e) { |
btn.on('click', function (e) { |
||
e.preventDefault(); |
e.preventDefault(); |
||
| Line 62: | Line 60: | ||
'\n{{subst:vb}}'; |
'\n{{subst:vb}}'; |
||
// Edit discussion page |
|||
api.postWithToken('csrf', { |
api.postWithToken('csrf', { |
||
action: 'edit', |
action: 'edit', |
||
| Line 85: | Line 82: | ||
if (actionObj.name === 'delete') { |
if (actionObj.name === 'delete') { |
||
// Delete target page |
|||
api.postWithToken('csrf', { |
api.postWithToken('csrf', { |
||
action: 'delete', |
action: 'delete', |
||
| Line 101: | Line 97: | ||
if (talkId !== "-1") { |
if (talkId !== "-1") { |
||
// Delete talk page if exists |
|||
api.postWithToken('csrf', { |
api.postWithToken('csrf', { |
||
action: 'delete', |
action: 'delete', |
||
| Line 121: | Line 116: | ||
); |
); |
||
} else { |
} else { |
||
// Keep / No consensus: update page and talk page |
|||
api.get({ |
api.get({ |
||
action: 'query', |
action: 'query', |
||
| Line 185: | Line 179: | ||
}); |
}); |
||
// Append OOUI button element to container |
|||
container.appendChild(btn.$element[0]); |
container.appendChild(btn.$element[0]); |
||
}); |
}); |
||
| Line 193: | Line 186: | ||
}); |
}); |
||
}); |
}); |
||
// |
//</nowiki> |
||
Revision as of 04:43, 1 October 2025
//<nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.api', 'oojs-ui'], function () {
const pagePrefix = 'User:Euphoria/Test VfD';
// Only run on relevant pages in view mode
const currentPage = mw.config.get('wgPageName').replace(/_/g, ' ');
if (
!currentPage.startsWith(pagePrefix + '/') ||
mw.config.get('wgAction') !== 'view'
) return;
$(function () {
$('#mw-content-text').find('h2, h3').each(function () {
const heading = this;
// Skip headings already inside a .vfd container or without links
if ($(heading).closest('.vfd').length) return;
if (!$(heading).find('a').length) return;
const container = document.createElement('span');
container.style.marginLeft = '6px';
const actions = [
{ name: 'delete', colorClass: 'oo-ui-destructiveElement' },
{ name: 'keep', colorClass: 'oo-ui-progressiveElement' },
{ name: 'no consensus', colorClass: 'oo-ui-warningElement' }
];
actions.forEach(function (actionObj) {
const btn = new OO.ui.ButtonWidget({
label: actionObj.name.charAt(0).toUpperCase(),
title: 'Close as ' + actionObj.name,
classes: ['vfd-btn', actionObj.colorClass],
flags: ['small'] // small button size
});
btn.on('click', function (e) {
e.preventDefault();
if (!confirm('Are you sure you want to close as ' + actionObj.name + '?')) return;
btn.setDisabled(true);
const api = new mw.Api();
// Fetch discussion page content
api.get({
action: 'query',
prop: 'revisions',
titles: currentPage,
rvslots: 'main',
rvprop: 'content',
format: 'json'
}).done(function (data) {
const pages = data.query.pages;
const pageId = Object.keys(pages)[0];
let content = pages[pageId].revisions[0].slots.main['*'];
const discussionNewContent =
'{{subst:vt|' + actionObj.name + '. --~~~~}}\n' +
content.trim() +
'\n{{subst:vb}}';
api.postWithToken('csrf', {
action: 'edit',
title: currentPage,
text: discussionNewContent,
summary: 'Closed as ' + actionObj.name,
minor: true
}).done(function () {
const link = $(heading).find('a').first();
if (!link.length) {
mw.notify('Cannot find target page link!', { title: 'VfDcloser', type: 'error', timeout: 1500 });
setTimeout(() => location.reload(), 1500);
return;
}
const targetPage = link.attr('title') || link.text().trim();
if (!targetPage) {
mw.notify('Cannot determine target page title!', { title: 'VfDcloser', type: 'error', timeout: 1500 });
setTimeout(() => location.reload(), 1500);
return;
}
if (actionObj.name === 'delete') {
api.postWithToken('csrf', {
action: 'delete',
title: targetPage,
reason: '[[' + currentPage + ']]'
}).done(() => {
const talkPage = 'Talk:' + targetPage;
api.get({
action: 'query',
titles: talkPage,
format: 'json'
}).done(data => {
const talkPages = data.query.pages;
const talkId = Object.keys(talkPages)[0];
if (talkId !== "-1") {
api.postWithToken('csrf', {
action: 'delete',
title: talkPage,
reason: 'Parent page deleted via VfD'
}).done(() => {
mw.notify('Discussion closed. Page and talk page deleted.', { title: 'VfDcloser', type: 'success', timeout: 1500 });
setTimeout(() => location.reload(), 1500);
}).fail(err =>
mw.notify('Error deleting talk page: ' + JSON.stringify(err), { title: 'VfDcloser', type: 'error', timeout: 1500 })
);
} else {
mw.notify('Discussion closed. Page deleted.', { title: 'VfDcloser', type: 'success', timeout: 1500 });
setTimeout(() => location.reload(), 1500);
}
});
}).fail(err =>
mw.notify('Error deleting page: ' + JSON.stringify(err), { title: 'VfDcloser', type: 'error', timeout: 1500 })
);
} else {
api.get({
action: 'query',
prop: 'revisions',
titles: targetPage,
rvslots: 'main',
rvprop: 'content',
format: 'json'
}).done(function (articleData) {
const articlePages = articleData.query.pages;
const articleId = Object.keys(articlePages)[0];
let articleContent = articlePages[articleId].revisions[0].slots.main['*'];
articleContent = articleContent.replace(/\{\{vfd-new\}\}/gi, '').trim();
api.postWithToken('csrf', {
action: 'edit',
title: targetPage,
text: articleContent,
summary: 'VFD closed as ' + actionObj.name,
minor: true
}).done(() => {
const talkPage = 'Talk:' + targetPage;
api.get({
action: 'query',
prop: 'revisions',
titles: talkPage,
rvslots: 'main',
rvprop: 'content',
format: 'json'
}).done(function (talkData) {
const talkPages = talkData.query.pages;
const talkId = Object.keys(talkPages)[0];
let talkContent = '';
if (talkId !== '-1' && talkPages[talkId].revisions) {
talkContent = talkPages[talkId].revisions[0].slots.main['*'];
talkContent = '{{vfd-kept-new}}\n' + talkContent.trim();
} else {
talkContent = '{{vfd-kept-new}}';
}
api.postWithToken('csrf', {
action: 'edit',
title: talkPage,
text: talkContent,
summary: 'VFD closed as ' + actionObj.name,
minor: true
}).done(() => {
mw.notify('Discussion closed. Page and talk page updated.', { title: 'VfDcloser', type: 'success', timeout: 1500 });
setTimeout(() => location.reload(), 1500);
}).fail(err =>
mw.notify('Error editing talk page: ' + JSON.stringify(err), { title: 'VfDcloser', type: 'error', timeout: 1500 })
);
});
}).fail(err =>
mw.notify('Error editing page: ' + JSON.stringify(err), { title: 'VfDcloser', type: 'error', timeout: 1500 })
);
});
}
}).fail(err =>
mw.notify('Error editing discussion page: ' + JSON.stringify(err), { title: 'VfDcloser', type: 'error', timeout: 1500 })
);
});
});
container.appendChild(btn.$element[0]);
});
heading.appendChild(container);
});
});
});
//</nowiki>