Content deleted Content added
Update - fix redirect target notifications, RFD: check titles are redirects, hopefully fix major bug with options being global [Factotum] |
Fix issue with batches not being sync, cleanup code [Factotum] |
||
Line 1:
// <nowiki>
// todo: make counter inline, remove progresss and progressElement from editPAge(), more dynamic reatelimit wait.
// counter semi inline; adjust align in createProgressBar()
// Function to wipe the text content of the page inside #bodyContent
// update normalise function for CfD - use mw.Title()
Line 761 ⟶ 762:
}
function editPage(options) {
const localOptions = deepCopy(options);
console.log(localOptions);
localOptions.text = localOptions.textToModify;
const api = new mw.Api();
const messageElement = createMessageElement();
messageElement.setLabel((localOptions.retry)
? $('<span>').text('Retrying ').append($(makeLink(localOptions.title)))
: $('<span>').text('Editing ').append($(makeLink(localOptions.title))));
localOptions.progressElement.$element.append(messageElement.$element);
const container = $('.sticky-container');
container.scrollTop(container.prop("scrollHeight"));
if (localOptions.retry) {
sleep(1000);
}
action: 'edit',
format: 'json'
};
if (
requestData.nocreate = 1;
for (let i = 0; i < targets.length; i++) {
const placeholder = '$' + (i + 1);
}
requestData.prependtext =
} else if (localOptions.type === 'append') {
requestData.appendtext = '\n\n' + localOptions.text.trim();
} else if (localOptions.type === 'text') {
requestData.text = localOptions.text;
}
console.log(requestData);
return new Promise((resolve, reject) => {
if (window.abortEdits) {
messageElement.toggle(false);
resolve();
return;
}
if (data.edit && data.edit.result === 'Success') {
messageElement.setType('success');
messageElement.setLabel($('<span>' + makeLink(localOptions.title) + ' edited successfully</span><span class="massxfdundo" data-revid="' + data.edit.newrevid + '" data-title="' + localOptions.title + '"></span>'));
resolve();
} else {
handleError('Error occurred while editing', data, localOptions, messageElement, resolve, reject);
}
})
.catch((error) => handleError('Error occurred while editing', error, localOptions, messageElement, resolve, reject));
});
}
function handleError(msg, error, options, messageElement, resolve, reject) {
messageElement.setLabel($('<span> } else if (error === 'ratelimited') {
handleRateLimitError(options.ratelimitMessage).then(() => {
editPage(deepCopy(options)).then(resolve);
});
}
reject();
}
}
// global scope - needed to syncronise ratelimits
Line 924 ⟶ 917:
mw.loader.using('oojs-ui').done(function () {
wipePageContent();
if (!window.debuggingMode) { // annoying when reloading for debugging
onbeforeunload = function() {
return "Closing this tab will cause you to lose all progress.";
};
}
elementsToDisable = [];
var bodyContent = $('#bodyContent');
mw.util.addCSS(`.sticky-container {
bottom: 0;
width: 100%;
max-height: 600px;
overflow-y: auto;
}`); // should probably be styled directly on the element than via the stylesheet
var nominationToggleObj = createNominationToggle();
var nominationToggle = nominationToggleObj.toggle;
Line 1,353 ⟶ 1,348:
if (nonredirects.length) {
let nonredirectsWarningMessage = createWarningMessage();
nonredirectsWarningMessage.$element.css({'max-height': '20em', 'overflow-y': 'auto'}) // normally shouldn't be needed
let nonRedirectsHTML = $('<div>').append($('<span>').text('The following pages were ignored because they are not redirects:'))
let $listElement = $('<ul>')
Line 1,389 ⟶ 1,385:
async function processContent(options) {
function getKeyByValue(object, value) {
return Object.keys(object).find(key => object[key] === value);
}
console.log(options.titles);
if (!Array.isArray(options.titles)) {
options.titlesDict = options.titles;
options.titles = Object.keys(options.titles);
} else {
options.titlesDict = {}; const fieldset = createFieldset(options.headingLabel); bodyContent.append(fieldset.$element);
options.progressElement = createProgressElement();
fieldset.addItems([options.progressElement]);
options.ratelimitMessage = createWarningMessage();
options.ratelimitMessage.toggle(false);
fieldset.addItems([options.ratelimitMessage]);
options.progress = progressObj.progressBar;
options.progress.$element.css('margin-top', '5px');
options.progress.pushPending();
fieldset.addItems([progressContainer]);
let resolvedCount = 0;
let rejectedCount = 0;
function updateCounter() {
progressContainer.setLabel(`(${resolvedCount} / ${options.titles.length}, ${rejectedCount} errors)`);
}
function updateProgress() {
options.progress.setProgress(percentage);
}
function trackPromise(promise) {
return new Promise((resolve
promise
.then(value => {
Line 1,442 ⟶ 1,439:
})
.catch(error => {
rejectedCount++;
updateCounter();
Line 1,455 ⟶ 1,446:
});
}
}
data.textToModify = data.textToModify.replace('${redirectTitle}', getKeyByValue(redirectTargets, new mw.Title(title).getSubjectPage().getPrefixedText()));
const promise =
return trackPromise(promise);
});
await Promise.allSettled(promises);
options.progress.toggle(false);
if (window.abortEdits) {
const abortMessage = createAbortMessage();
const revertEditsLink = $('<a id="massxfdrevertlink">Revert?</a>');
revertEditsLink.on('click', revertEdits);
abortMessage.setLabel($('<span>').append('Edits manually aborted. ').append(revertEditsLink));
bodyContent.append(abortMessage.$element);
} else {
const completedElement = createCompletedElement();
completedElement.setLabel(options.doneMessage);
completedElement.$element.css('margin-bottom', '16px');
bodyContent.append(completedElement.$element);
}
}
const date = new Date();
|