User:Euphoria/common.js: Difference between revisions

From Test Wiki
Content deleted Content added
fix
No edit summary
Line 2: Line 2:
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function () {
const pagePrefix = 'User:Euphoria/TestVfD';
const pagePrefix = 'User:Euphoria/TestVfD';

if (!mw.config.get('wgPageName').startsWith(pagePrefix) || mw.config.get('wgAction') !== 'view') return;
if (!mw.config.get('wgPageName').startsWith(pagePrefix) || mw.config.get('wgAction') !== 'view') return;


$(function() {
$(function() { // synchronous DOM ready
const api = new mw.Api();
const api = new mw.Api();


Line 21: Line 20:
];
];


actions.forEach(function(actionObj) {
actions.forEach(actionObj => {
const btn = document.createElement('button');
const btn = document.createElement('button');
btn.textContent = actionObj.name.charAt(0).toUpperCase();
btn.textContent = actionObj.name.charAt(0).toUpperCase();
Line 41: Line 40:
});
});


btn.addEventListener('mouseenter', () => btn.style.filter='brightness(1.3)');
btn.addEventListener('mouseenter', () => btn.style.filter = 'brightness(1.3)');
btn.addEventListener('mouseleave', () => btn.style.filter='brightness(1)');
btn.addEventListener('mouseleave', () => btn.style.filter = 'brightness(1)');


// Async click handler
// Async click handler
btn.addEventListener('click', async function(e) {
btn.addEventListener('click', async e => {
e.preventDefault();
e.preventDefault();
if (!confirm('Are you sure you want to close as ' + actionObj.name + '?')) return;
if (!confirm('Are you sure you want to close as ' + actionObj.name + '?')) return;


try {
try {
// 1️⃣ Fetch discussion page content
// 1️⃣ Get discussion page content
const data = await api.get({
const data = await api.get({
action: 'query',
action: 'query',
Line 63: Line 62:
let content = pages[pageId].revisions[0]['*'];
let content = pages[pageId].revisions[0]['*'];


// 2️⃣ Wrap discussion content
// Wrap discussion content
const topText = '{{subst:vt|' + actionObj.name + '. --~~~~}}\n';
const topText = '{{subst:vt|' + actionObj.name + '. --~~~~}}\n';
const bottomText = '\n{{subst:vb}}';
const bottomText = '\n{{subst:vb}}';
Line 77: Line 76:
});
});


// 3️⃣ Extract target article from heading
// Extract target article from heading
const match = content.match(/==\s*\[\[([^\]]+)\]\]\s*==/);
const match = content.match(/==\s*\[\[([^\]]+)\]\]\s*==/);
if (!match) {
if (!match) {
Line 86: Line 85:


if (actionObj.name === 'delete') {
if (actionObj.name === 'delete') {
// 4️⃣ Delete target article
// Delete target article
await api.postWithToken('csrf', {
await api.postWithToken('csrf', {
action: 'delete',
action: 'delete',
Line 105: Line 104:
alert(`Discussion closed and "${targetPage}" along with its talk page deleted.`);
alert(`Discussion closed and "${targetPage}" along with its talk page deleted.`);
location.reload();
location.reload();

} else {
} else {
// 5️⃣ Keep / No consensus: edit article
// Keep / No consensus
const articleData = await api.get({
const articleData = await api.get({
action: 'query',
action: 'query',
Line 129: Line 129:
});
});


// 6️⃣ Update talk page
// Update talk page
const talkData = await api.get({
const talkData = await api.get({
action: 'query',
action: 'query',