User:DR/test.js: Difference between revisions
< User:DR
Content deleted Content added
Created page with "// <nowiki> (function() { 'use strict'; const config = window.clearDeleteReasonConfig || { applyOnlyOnMobile: true }; if (window.location.search.includes('action=delete') && (!config.applyOnlyOnMobile || /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent))) { // window.addEventListener('load', function() { // const reasonInput = document.querySelector('input[name="wpReason"]'); // if (reasonInput) { // r..." Tags: Mobile edit Mobile web edit |
test |
||
Line 1: | Line 1: | ||
$(document).ready(function() { |
|||
// <nowiki> |
|||
function initializeMassDelete() { |
|||
$('#mw-content-text > p').remove(); |
|||
'use strict'; |
|||
$('#firstHeading').text('MassDelete'); |
|||
const config = window.clearDeleteReasonConfig || { applyOnlyOnMobile: true }; |
|||
var pagesTextarea = new OO.ui.MultilineTextInputWidget({ |
|||
if (window.location.search.includes('action=delete') && (!config.applyOnlyOnMobile || /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent))) { |
|||
placeholder: 'Enter list of pages (one per line)', |
|||
// window.addEventListener('load', function() { |
|||
autosize: true, |
|||
// const reasonInput = document.querySelector('input[name="wpReason"]'); |
|||
rows: 10 |
|||
}), |
|||
reasonInputField = new OO.ui.TextInputWidget({ |
|||
placeholder: 'Reason for deletion' |
|||
// }); |
|||
}), |
|||
const observer = new MutationObserver(function(mutations) { |
|||
previewButton = new OO.ui.ButtonWidget({ |
|||
label: 'Preview Deletion', |
|||
flags: ['primary'] |
|||
const reasonInput = document.querySelector('input[name="wpReason"]'); |
|||
}), |
|||
startButton = new OO.ui.ButtonWidget({ |
|||
label: 'Start Deletion', |
|||
icon: 'alert', |
|||
flags: ['primary', 'progressive'], |
|||
disabled: true |
|||
}), |
|||
cancelButton = new OO.ui.ButtonWidget({ |
|||
label: 'Cancel', |
|||
flags: ['primary', 'destructive'], |
|||
href: 'https:' + mw.config.get('wgServer') |
|||
}), |
|||
logContainer = $("<div>").hide(); |
|||
var labels = { |
|||
pagesLabel: $('<p>').text('Pages to Delete:').css('font-weight', 'bold'), |
|||
reasonLabel: $('<p>').text('Reason:').css('font-weight', 'bold') |
|||
}; |
|||
$('#mw-content-text').append( |
|||
labels.pagesLabel, pagesTextarea.$element, |
|||
labels.reasonLabel, reasonInputField.$element, |
|||
'<br/>', |
|||
previewButton.$element, |
|||
startButton.$element, |
|||
cancelButton.$element, |
|||
'<br/>', |
|||
logContainer |
|||
); |
|||
function deletePage(page, reason, callback) { |
|||
(new mw.Api({ |
|||
ajax: { |
|||
headers: { |
|||
'Api-User-Agent': 'en:User:DreamRimmer/MassDelete.js' |
|||
} |
} |
||
} |
} |
||
})).postWithToken('csrf', { |
|||
action: 'delete', |
|||
title: page, |
|||
reason: reason |
|||
}, { |
|||
async: false |
|||
}).done(function(data) { |
|||
callback(null, data, page); |
|||
}).fail(function(code, data) { |
|||
callback(code, data, page); |
|||
}); |
}); |
||
} |
|||
function showAlert(message) { |
|||
alert("Error: " + message); |
|||
} |
|||
function handleDeleteResponse(err, data, page) { |
|||
var logList = $("<ul>").appendTo(logContainer); |
|||
if (err) { |
|||
logList.append("<li>Failed to delete page <b>" + page + "</b>: " + err + "</li>"); |
|||
} else { |
|||
logList.append("<li><b>" + page + "</b> deleted successfully.</li>"); |
|||
} |
|||
} |
|||
function previewDeleting() { |
|||
var pages = pagesTextarea.getValue().replace(/^\s*[\r\n]/gm, '').split("\n"), |
|||
reason = reasonInputField.getValue().trim(); |
|||
if (pages[0].trim() === "" || reason === "") { |
|||
showAlert("Please fill in all fields."); |
|||
return; |
|||
} |
|||
logContainer.empty(); |
|||
$("<h1>").wrapInner("<span class='mw-headline'>Deletion preview</span>").appendTo(logContainer); |
|||
logContainer.show(); |
|||
var logList = $("<ul>").appendTo(logContainer); |
|||
pages.forEach(function(page) { |
|||
page = page.trim(); |
|||
logList.append("<li><b>" + page + "</b> will be deleted for reason: <b>" + reason + "</b></li>"); |
|||
}); |
|||
startButton.setDisabled(false); |
|||
} |
|||
function startDeleting() { |
|||
if (!confirm("Are you sure you want to delete the listed pages? This action cannot be undone.")) { |
|||
return; |
|||
} |
|||
var pages = pagesTextarea.getValue().replace(/^\s*[\r\n]/gm, '').split("\n"), |
|||
reason = reasonInputField.getValue().trim() + " (using [[User:DreamRimmer/MassDelete|MassDelete.js]])"; |
|||
if (pages[0].trim() === "" || reason === "") { |
|||
showAlert("Please fill in all fields."); |
|||
return; |
|||
} |
|||
logContainer.empty(); |
|||
$("<h1>").wrapInner("<span class='mw-headline'>Deletion log</span>").appendTo(logContainer); |
|||
logContainer.show(); |
|||
var currentIndex = 0; |
|||
function processNextPage() { |
|||
if (currentIndex >= pages.length) { |
|||
return; |
|||
} |
|||
var page = pages[currentIndex].trim(); |
|||
deletePage(page, reason, function(err, data) { |
|||
handleDeleteResponse(err, data, page); |
|||
currentIndex++; |
|||
setTimeout(processNextPage, 2000); |
|||
}); |
|||
} |
|||
processNextPage(); |
|||
} |
|||
pagesTextarea.on('change', function() { |
|||
previewButton.setDisabled(pagesTextarea.getValue().trim() === '' || reasonInputField.getValue().trim() === ''); |
|||
startButton.setDisabled(true); |
|||
}); |
}); |
||
reasonInputField.on('change', function() { |
|||
observer.observe(document.body, { childList: true, subtree: true }); |
|||
previewButton.setDisabled(pagesTextarea.getValue().trim() === '' || reasonInputField.getValue().trim() === ''); |
|||
startButton.setDisabled(true); |
|||
}); |
|||
previewButton.on('click', previewDeleting); |
|||
startButton.on('click', startDeleting); |
|||
} |
|||
$.when(mw.loader.using('mediawiki.util'), $.ready).then(function() { |
|||
mw.util.addPortletLink( |
|||
'p-tb', |
|||
mw.util.getUrl('Special:BlankPage/MassDelete'), |
|||
'MassDelete' |
|||
); |
|||
}); |
|||
if (mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'MassDelete') { |
|||
$.when(mw.loader.using('oojs-ui-core'), $.ready).then(function() { |
|||
initializeMassDelete(); |
|||
}); |
|||
} |
} |
||
} |
}); |
||
// </nowiki> |
Revision as of 17:48, 30 March 2025
$(document).ready(function() {
function initializeMassDelete() {
$('#mw-content-text > p').remove();
$('#firstHeading').text('MassDelete');
var pagesTextarea = new OO.ui.MultilineTextInputWidget({
placeholder: 'Enter list of pages (one per line)',
autosize: true,
rows: 10
}),
reasonInputField = new OO.ui.TextInputWidget({
placeholder: 'Reason for deletion'
}),
previewButton = new OO.ui.ButtonWidget({
label: 'Preview Deletion',
flags: ['primary']
}),
startButton = new OO.ui.ButtonWidget({
label: 'Start Deletion',
icon: 'alert',
flags: ['primary', 'progressive'],
disabled: true
}),
cancelButton = new OO.ui.ButtonWidget({
label: 'Cancel',
flags: ['primary', 'destructive'],
href: 'https:' + mw.config.get('wgServer')
}),
logContainer = $("<div>").hide();
var labels = {
pagesLabel: $('<p>').text('Pages to Delete:').css('font-weight', 'bold'),
reasonLabel: $('<p>').text('Reason:').css('font-weight', 'bold')
};
$('#mw-content-text').append(
labels.pagesLabel, pagesTextarea.$element,
labels.reasonLabel, reasonInputField.$element,
'<br/>',
previewButton.$element,
startButton.$element,
cancelButton.$element,
'<br/>',
logContainer
);
function deletePage(page, reason, callback) {
(new mw.Api({
ajax: {
headers: {
'Api-User-Agent': 'en:User:DreamRimmer/MassDelete.js'
}
}
})).postWithToken('csrf', {
action: 'delete',
title: page,
reason: reason
}, {
async: false
}).done(function(data) {
callback(null, data, page);
}).fail(function(code, data) {
callback(code, data, page);
});
}
function showAlert(message) {
alert("Error: " + message);
}
function handleDeleteResponse(err, data, page) {
var logList = $("<ul>").appendTo(logContainer);
if (err) {
logList.append("<li>Failed to delete page <b>" + page + "</b>: " + err + "</li>");
} else {
logList.append("<li><b>" + page + "</b> deleted successfully.</li>");
}
}
function previewDeleting() {
var pages = pagesTextarea.getValue().replace(/^\s*[\r\n]/gm, '').split("\n"),
reason = reasonInputField.getValue().trim();
if (pages[0].trim() === "" || reason === "") {
showAlert("Please fill in all fields.");
return;
}
logContainer.empty();
$("<h1>").wrapInner("<span class='mw-headline'>Deletion preview</span>").appendTo(logContainer);
logContainer.show();
var logList = $("<ul>").appendTo(logContainer);
pages.forEach(function(page) {
page = page.trim();
logList.append("<li><b>" + page + "</b> will be deleted for reason: <b>" + reason + "</b></li>");
});
startButton.setDisabled(false);
}
function startDeleting() {
if (!confirm("Are you sure you want to delete the listed pages? This action cannot be undone.")) {
return;
}
var pages = pagesTextarea.getValue().replace(/^\s*[\r\n]/gm, '').split("\n"),
reason = reasonInputField.getValue().trim() + " (using [[User:DreamRimmer/MassDelete|MassDelete.js]])";
if (pages[0].trim() === "" || reason === "") {
showAlert("Please fill in all fields.");
return;
}
logContainer.empty();
$("<h1>").wrapInner("<span class='mw-headline'>Deletion log</span>").appendTo(logContainer);
logContainer.show();
var currentIndex = 0;
function processNextPage() {
if (currentIndex >= pages.length) {
return;
}
var page = pages[currentIndex].trim();
deletePage(page, reason, function(err, data) {
handleDeleteResponse(err, data, page);
currentIndex++;
setTimeout(processNextPage, 2000);
});
}
processNextPage();
}
pagesTextarea.on('change', function() {
previewButton.setDisabled(pagesTextarea.getValue().trim() === '' || reasonInputField.getValue().trim() === '');
startButton.setDisabled(true);
});
reasonInputField.on('change', function() {
previewButton.setDisabled(pagesTextarea.getValue().trim() === '' || reasonInputField.getValue().trim() === '');
startButton.setDisabled(true);
});
previewButton.on('click', previewDeleting);
startButton.on('click', startDeleting);
}
$.when(mw.loader.using('mediawiki.util'), $.ready).then(function() {
mw.util.addPortletLink(
'p-tb',
mw.util.getUrl('Special:BlankPage/MassDelete'),
'MassDelete'
);
});
if (mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'MassDelete') {
$.when(mw.loader.using('oojs-ui-core'), $.ready).then(function() {
initializeMassDelete();
});
}
});