User:BrandonXLF/SubpageMover.js

/*** Subpage Mover ***/

// Easily move the subpages of a page with a single click // Documentation at en:w:User:BrandonXLF/SubpageMover // By en:w:User:BrandonXLF

$(function {	function Log {		$('#moveSubpages-log').remove;

this.el = $(' ') .appendTo($('#movepage')) .append(' ') .attr('id', 'moveSubpages-log'); }

Log.prototype.log = function(html, color) { this.el.append($(' ').append(html).css('color', color)); };

Log.prototype.createLink = function(page) { return $('').attr('href', mw.util.getUrl(page)).text(page); };

Log.prototype.logError = function(html) { this.log(html, '#d33'); };

Log.prototype.logSuccess = function(html) { this.log(html, '#14866d'); };

Log.prototype.logMoveError = function(from, to, reasonHtml) { this.logError(['Failed to move page ', this.createLink(from), ' to ', this.createLink(to), '. Reason: ', reasonHtml]); };

Log.prototype.logMoveSuccess = function(from, to) { this.logSuccess(['Successfully moved page ', this.createLink(from), ' to ', this.createLink(to), '.']); };

function movePage(from, to, params, log, onSuccess) { $.post(mw.config.get('wgScriptPath') + '/api.php', $.extend({ action: 'move', from: from, to: to, token: mw.user.tokens.get('csrfToken'), format: 'json', formatversion: '2', uselang: 'user', errorformat: 'html', errorlang: 'uselang' }, params)).done(function(response) {			if (response.errors) {				log.logMoveError(from, to, response.errors[0].html);				return;			}

log.logMoveSuccess(response.move.from, response.move.to);

if (response.move['talkmove-errors']) { var talkFrom = (from.match(':') ? from.replace(':', ' talk:') : 'Talk:') + from, talkTo = (to.match(':') ? to.replace(':', ' talk:') : 'Talk:') + to;

log.logMoveError(talkFrom, talkTo, response.move['talkmove-errors'][0].html); return; }

if (response.move.talkfrom) { log.logMoveSuccess(response.move.talkfrom, response.move.talkto); }

onSuccess && onSuccess; });	}

function moveSubpages { $('#moveSubpages-log').remove;

var log = new Log;

if (mw.config.get('wgUserGroups').indexOf('extendedconfirmed') === -1) { log.log('You must be at least extended confirmed.', 'red'); return; }

var fromTitle = new mw.Title($('input[name="wpOldTitle"]').val), toTitle = mw.Title.makeTitle($('select[name="wpNewTitleNs"]').val, $('input[name="wpNewTitleMain"]').val), params = { reason: $('input[name="wpReason"]').val, movetalk: $('input[name="wpMovetalk"]').prop('checked') ? true : undefined, noredirect: $('[name="wpLeaveRedirect"]').prop('checked') === false ? true : undefined, watchlist: $('input[name="wpWatch"]').prop('checked') ? 'watch' : 'nochange', };

if (!toTitle) { log.logError('New title is an invalid page!'); return; }

$.get(mw.config.get('wgScriptPath') + '/api.php', {			action: 'query',			list: 'allpages',			apprefix: fromTitle.getMainText + '/',			apnamespace: fromTitle.getNamespaceId,			pslimit: '500',			format: 'json',			formatversion: '2'		}).done(function(res) {			movePage(fromTitle.getPrefixedText, toTitle.getPrefixedText, params, log, function { var prefixRegex = new RegExp('^' + mw.util.escapeRegExp(fromTitle.getPrefixedText));

res.query.allpages.forEach(function(info) {					if (info.title === fromTitle) return;

movePage(info.title, info.title.replace(prefixRegex, toTitle.getPrefixedText), params, log); });			});		});	}

if (window.location.href.match('Special:MovePage') && !$('p:contains(\'This page has no subpages.\')')[0]) { new OO.ui.ButtonWidget({			label: 'Move page and subpages',			flags: ['primary', 'progressive']		}).$element .on('click', moveSubpages) .appendTo($('button[name=wpMove]').parent.parent); } });