MediaWiki:Gadget-twinklebatchundelete.js
Giao diện
Twinkle
Tiện ích Twinkle được phát triển trên GitHub. Phiên bản dành cho Wikipedia tiếng Việt cũng được biên dịch và bảo quản trên GitHub. Xin các bảo quản viên vui lòng thực hiện các thay đổi trong cành vi trên GitHub và sao chép vào đây thay vì sửa đổi tiện ích này trực tiếp. |
// <nowiki>
(function($) {
/*
****************************************
*** twinklebatchundelete.js: Batch undelete module
****************************************
* Mode of invocation: Tab ("Phục hồi hàng loạt")
* Active on: Existing user and project pages (các trang dự án và người dùng đang tồn tại)
*/
Twinkle.batchundelete = function twinklebatchundelete() {
if ((!Morebits.userIsSysop && !Morebits.userIsInGroup('eliminator')) || !mw.config.get('wgArticleId') || (
mw.config.get('wgNamespaceNumber') !== mw.config.get('wgNamespaceIds').user &&
mw.config.get('wgNamespaceNumber') !== mw.config.get('wgNamespaceIds').project)) {
return;
}
Twinkle.addPortletLink(Twinkle.batchundelete.callback, 'Phục hồi hàng loạt', 'tw-batch-undel', 'Phục hồi hàng loạt các trang');
};
Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
var Window = new Morebits.simpleWindow(600, 400);
Window.setScriptName('Twinkle');
Window.setTitle('Phục hồi hàng loạt');
Window.addFooterLink('Trợ giúp Twinkle', 'WP:TW/DOC#phục_hồi_hàng_loạt');
var form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
form.append({
type: 'checkbox',
list: [
{
label: 'Khôi phục các trang thảo luận của các trang chưa bị xóa nếu chúng tồn tại',
name: 'undel_talk',
value: 'undel_talk',
checked: true
}
]
});
form.append({
type: 'input',
name: 'reason',
label: 'Reason: ',
size: 60
});
var statusdiv = document.createElement('div');
statusdiv.style.padding = '15px'; // just so it doesn't look broken
Window.setContent(statusdiv);
Morebits.status.init(statusdiv);
Window.display();
var query = {
'action': 'query',
'generator': 'links',
'prop': 'info',
'inprop': 'protection',
'titles': mw.config.get('wgPageName'),
'gpllimit': Twinkle.getPref('batchMax')
};
var statelem = new Morebits.status('Đang lấy danh sách trang');
var wikipedia_api = new Morebits.wiki.api('đang tải...', query, function(apiobj) {
var xml = apiobj.responseXML;
var $pages = $(xml).find('page[missing]');
var list = [];
$pages.each(function(index, page) {
var $page = $(page);
var title = $page.attr('title');
var $editprot = $page.find('pr[type="create"][level="sysop"]');
var isProtected = $editprot.length > 0;
list.push({
label: title + (isProtected ? ' (khóa tạo trang hoàn toàn' +
($editprot.attr('expiry') === 'infinity' ? ' indefinitely' : ', hết hạn ' + new Morebits.date($editprot.attr('expiry')).calendar('utc') + ' (UTC)') + ')' : ''),
value: title,
checked: true,
style: isProtected ? 'color:red' : ''
});
});
apiobj.params.form.append({ type: 'header', label: 'Các trang cần phục hồi' });
apiobj.params.form.append({
type: 'button',
label: 'Chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
}
});
apiobj.params.form.append({
type: 'button',
label: 'Bỏ chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
}
});
apiobj.params.form.append({
type: 'checkbox',
name: 'pages',
shiftClickSupport: true,
list: list
});
apiobj.params.form.append({ type: 'submit' });
var result = apiobj.params.form.render();
apiobj.params.Window.setContent(result);
}, statelem);
wikipedia_api.params = { form: form, Window: Window };
wikipedia_api.post();
};
Twinkle.batchundelete.callback.evaluate = function(event) {
Morebits.wiki.actionCompleted.notice = 'Phục hồi hàng loạt hiện đã hoàn tất';
var numProtected = Morebits.quickForm.getElements(event.target, 'pages').filter(function(element) {
return element.checked && element.nextElementSibling.style.color === 'red';
}).length;
if (numProtected > 0 && !confirm('Bạn sắp phục hồi ' + numProtected + ' (các) trang hoàn toàn được bảo vệ. Bạn có chắc không?')) {
return;
}
var input = Morebits.quickForm.getInputData(event.target);
if (!input.reason) {
alert('Bạn cần phải đưa ra một lý do!');
return;
}
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(event.target);
if (!input.pages || !input.pages.length) {
Morebits.status.error('Lỗi', 'không có gì để xóa, đang dừng thực hiện');
return;
}
var pageUndeleter = new Morebits.batchOperation('Các trang cần phục hồi');
pageUndeleter.setOption('chunkSize', Twinkle.getPref('batchChunks'));
pageUndeleter.setOption('preserveIndividualStatusLines', true);
pageUndeleter.setPageList(input.pages);
pageUndeleter.run(function(pageName) {
var params = {
page: pageName,
undel_talk: input.undel_talk,
reason: input.reason,
pageUndeleter: pageUndeleter
};
var wikipedia_page = new Morebits.wiki.page(pageName, 'Phục hồi trang ' + pageName);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.setEditSummary(input.reason);
wikipedia_page.setChangeTags(Twinkle.changeTags);
wikipedia_page.suppressProtectWarning();
wikipedia_page.setMaxRetries(3); // temporary increase from 2 to make batchundelete more likely to succeed [[phab:T222402]] #613
wikipedia_page.undeletePage(Twinkle.batchundelete.callbacks.doExtras, pageUndeleter.workerFailure);
});
};
Twinkle.batchundelete.callbacks = {
// this stupid parameter name is a temporary thing until I implement an overhaul
// of Morebits.wiki.* callback parameters
doExtras: function(thingWithParameters) {
var params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() :
thingWithParameters.getCallbackParameters();
// the initial batch operation's job is to delete the page, and that has
// succeeded by now
params.pageUndeleter.workerSuccess(thingWithParameters);
var query, wikipedia_api;
if (params.undel_talk) {
var talkpagename = new mw.Title(params.page).getTalkPage().getPrefixedText();
if (talkpagename !== params.page) {
query = {
'action': 'query',
'prop': 'deletedrevisions',
'drvprop': 'ids',
'drvlimit': 1,
'titles': talkpagename
};
wikipedia_api = new Morebits.wiki.api('Đang kiểm tra trang thảo luận để tìm các phiên bản sửa đổi bị xóa', query, Twinkle.batchundelete.callbacks.undeleteTalk);
wikipedia_api.params = params;
wikipedia_api.params.talkPage = talkpagename;
wikipedia_api.post();
}
}
},
undeleteTalk: function(apiobj) {
var xml = apiobj.responseXML;
var exists = $(xml).find('page:not([missing])').length > 0;
var delrevs = $(xml).find('rev').attr('revid');
if (exists || !delrevs) {
// page exists or has no deleted revisions; forget about it
return;
}
var page = new Morebits.wiki.page(apiobj.params.talkPage, 'Đang phục hồi trang thảo luận của ' + apiobj.params.page);
page.setEditSummary('Đang phục hồi [[Help:Talk page|trang thảo luận]] của "' + apiobj.params.page + '"');
page.setChangeTags(Twinkle.changeTags);
page.undeletePage();
}
};
Twinkle.addInitCallback(Twinkle.batchundelete, 'batchundelete');
})(jQuery);
// </nowiki>