MediaWiki:Gadget-twinklebatchprotect.js
Cache: Sau khi lưu biểu mẫu này, phải xóa bộ nhớ đệm (cache) của trình duyệt để những thay đổi hiện ra:
Firefox, Chrome, Safari, Opera — Shift Internet Explorer — Ctrl Konqueror —
Nếu bạn viết mã JavaScript, chú ý đọc hướng dẫn để tránh mâu thuẫn với mã mặc định của mạng.
//<nowiki>
(function($){
/*
****************************************
*** twinklebatchprotect.js: Batch protect module (sysops only)
****************************************
* Mode of invocation: Tab ("P-batch")
* Active on: Existing project pages and user pages; existing and
* non-existing categories; Special:PrefixIndex
* Config directives in: TwinkleConfig
*/
Twinkle.batchprotect = function twinklebatchprotect() {
if( Morebits.userIsInGroup( 'sysop' ) && ((mw.config.get( 'wgArticleId' ) > 0 && (mw.config.get( 'wgNamespaceNumber' ) === 2 ||
mw.config.get( 'wgNamespaceNumber' ) === 4)) || mw.config.get( 'wgNamespaceNumber' ) === 14 ||
mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex') ) {
Twinkle.addPortletLink( Twinkle.batchprotect.callback, "Khóa hàng loạt", "tw-pbatch", "Khóa trang có liên kết từ trang này" );
}
};
Twinkle.batchprotect.unlinkCache = {};
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {
var Window = new Morebits.simpleWindow( 600, 400 );
Window.setTitle( "Khóa hàng loạt" );
Window.setScriptName( "Twinkle" );
Window.addFooterLink( "Quy định khóa trang", "WS:KHOA" );
Window.addFooterLink( "Trợ giúp Twinkle", "WP:TW/DOC#protect" );
var form = new Morebits.quickForm( Twinkle.batchprotect.callback.evaluate );
form.append({
type: 'checkbox',
name: 'editmodify',
event: Twinkle.protect.formevents.editmodify,
list: [
{
label: 'Sửa khóa sửa đổi',
value: 'editmodify',
tooltip: 'Chỉ dành cho trang hiện có.',
checked: true
}
]
});
var editlevel = form.append({
type: 'select',
name: 'editlevel',
label: 'Khóa sửa đổi:',
event: Twinkle.protect.formevents.editlevel
});
editlevel.append({
type: 'option',
label: 'Tất cả',
value: 'all'
});
editlevel.append({
type: 'option',
label: 'Tự xác nhận',
value: 'autoconfirmed'
});
editlevel.append({
type: 'option',
label: 'Bảo quản viên',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'editexpiry',
label: 'Hết hạn:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 giờ', value: '1 hour' },
{ label: '2 giờ', value: '2 hours' },
{ label: '3 giờ', value: '3 hours' },
{ label: '6 giờ', value: '6 hours' },
{ label: '12 giờ', value: '12 hours' },
{ label: '1 ngày', value: '1 day' },
{ label: '2 ngày', selected: true, value: '2 days' },
{ label: '3 ngày', value: '3 days' },
{ label: '4 ngày', value: '4 days' },
{ label: '1 tuần', value: '1 week' },
{ label: '2 tuần', value: '2 weeks' },
{ label: '1 tháng', value: '1 month' },
{ label: '2 tháng', value: '2 months' },
{ label: '3 tháng', value: '3 months' },
{ label: '1 năm', value: '1 year' },
{ label: 'vô thời hạn', value:'indefinite' },
{ label: 'Tùy chỉnh...', value: 'custom' }
]
});
form.append({
type: 'checkbox',
name: 'movemodify',
event: Twinkle.protect.formevents.movemodify,
list: [
{
label: 'Sửa khóa di chuyển',
value: 'movemodify',
tooltip: 'Chỉ dành cho trang hiện có.',
checked: true
}
]
});
var movelevel = form.append({
type: 'select',
name: 'movelevel',
label: 'Khóa di chuyển:',
event: Twinkle.protect.formevents.movelevel
});
movelevel.append({
type: 'option',
label: 'Tất cả',
value: 'all'
});
movelevel.append({
type: 'option',
label: 'Tự xác nhận',
value: 'autoconfirmed'
});
movelevel.append({
type: 'option',
label: 'Bảo quản viên',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'moveexpiry',
label: 'Hết hạn:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 giờ', value: '1 hour' },
{ label: '2 giờ', value: '2 hours' },
{ label: '3 giờ', value: '3 hours' },
{ label: '6 giờ', value: '6 hours' },
{ label: '12 giờ', value: '12 hours' },
{ label: '1 ngày', value: '1 day' },
{ label: '2 ngày', selected: true, value: '2 days' },
{ label: '3 ngày', value: '3 days' },
{ label: '4 ngày', value: '4 days' },
{ label: '1 tuần', value: '1 week' },
{ label: '2 tuần', value: '2 weeks' },
{ label: '1 tháng', value: '1 month' },
{ label: '2 tháng', value: '2 months' },
{ label: '3 tháng', value: '3 months' },
{ label: '1 năm', value: '1 year' },
{ label: 'vô thời hạn', value:'indefinite' },
{ label: 'Tùy chỉnh...', value: 'custom' }
]
});
form.append({
type: 'checkbox',
name: 'createmodify',
event: function twinklebatchprotectFormCreatemodifyEvent(e) {
e.target.form.createlevel.disabled = !e.target.checked;
e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');
e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? "" : "transparent");
},
list: [
{
label: 'Sửa khóa tạo trang',
value: 'createmodify',
tooltip: 'Chỉ dành cho trang chưa tồn tại.',
checked: true
}
]
});
var createlevel = form.append({
type: 'select',
name: 'createlevel',
label: 'Khóa tạo trang:',
event: Twinkle.protect.formevents.createlevel
});
createlevel.append({
type: 'option',
label: 'Tất cả',
value: 'all'
});
createlevel.append({
type: 'option',
label: 'Tự xác nhận',
value: 'autoconfirmed'
});
createlevel.append({
type: 'option',
label: 'Bảo quản viên',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'createexpiry',
label: 'Hết hạn:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 giờ', value: '1 hour' },
{ label: '2 giờ', value: '2 hours' },
{ label: '3 giờ', value: '3 hours' },
{ label: '6 giờ', value: '6 hours' },
{ label: '12 giờ', value: '12 hours' },
{ label: '1 ngày', value: '1 day' },
{ label: '2 ngày', value: '2 days' },
{ label: '3 ngày', value: '3 days' },
{ label: '4 ngày', value: '4 days' },
{ label: '1 tuần', value: '1 week' },
{ label: '2 tuần', value: '2 weeks' },
{ label: '1 tháng', value: '1 month' },
{ label: '2 tháng', value: '2 months' },
{ label: '3 tháng', value: '3 months' },
{ label: '1 năm', value: '1 year' },
{ label: 'vô thời hạn', selected: true, value: 'indefinite' },
{ label: 'Tùy chỉnh...', value: 'custom' }
]
});
form.append( {
type: 'header',
label: '' // horizontal rule
} );
form.append( {
type: 'input',
name: 'reason',
label: 'Lý do: ',
size: 60,
tooltip: 'Để ghi vào nhật trình khóa và lịch sử trang.'
} );
var query;
if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) { // categories
query = {
'action': 'query',
'generator': 'categorymembers',
'gcmtitle': mw.config.get( 'wgPageName' ),
'gcmlimit' : Twinkle.getPref('batchMax'), // the max for sysops
'prop': 'revisions',
'rvprop': 'size'
};
} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Prefixindex' ) {
query = {
'action': 'query',
'generator': 'allpages',
'gapnamespace': Morebits.queryString.exists('namespace') ? Morebits.queryString.get( 'namespace' ) : document.getElementById('namespace').value,
'gapprefix': Morebits.queryString.exists('from') ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( 'from' ).replace('+', ' ')) :
Morebits.string.toUpperCaseFirstChar(document.getElementById('nsfrom').value),
'gaplimit' : Twinkle.getPref('batchMax'), // the max for sysops
'prop': 'revisions',
'rvprop': 'size'
};
} else {
query = {
'action': 'query',
'gpllimit' : Twinkle.getPref('batchMax'), // the max for sysops
'generator': 'links',
'titles': mw.config.get( 'wgPageName' ),
'prop': 'revisions',
'rvprop': 'size'
};
}
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 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');
var list = [];
$pages.each(function(index, page) {
var $page = $(page);
var title = $page.attr('title');
var isRedir = $page.attr('redirect') === ""; // XXX ??
var missing = $page.attr('missing') === ""; // XXX ??
var size = $page.find('rev').attr('size');
var metadata = [];
if (missing) {
metadata.push("trang không tồn tại");
} else {
if (isRedir) {
metadata.push("redirect");
}
metadata.push(size + " bytes");
}
list.push( { label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : '' ), value: title, checked: true });
});
form.append({ type: 'header', label: 'Trang sắp khóa' });
form.append({
type: 'button',
label: "Chọn tất cả",
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
}
});
form.append({
type: 'button',
label: "Bỏ chọn tất cả",
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
}
});
form.append( {
type: 'checkbox',
name: 'pages',
list: list
} );
form.append( { type:'submit' } );
var result = form.render();
Window.setContent( result );
}, statelem );
wikipedia_api.post();
};
Twinkle.batchprotect.currentProtectCounter = 0;
Twinkle.batchprotect.currentprotector = 0;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {
var pages = event.target.getChecked( 'pages' );
var reason = event.target.reason.value;
var editmodify = event.target.editmodify.checked;
var editlevel = event.target.editlevel.value;
var editexpiry = event.target.editexpiry.value;
var movemodify = event.target.movemodify.checked;
var movelevel = event.target.movelevel.value;
var moveexpiry = event.target.moveexpiry.value;
var createmodify = event.target.createmodify.checked;
var createlevel = event.target.createlevel.value;
var createexpiry = event.target.createexpiry.value;
if( ! reason ) {
alert("Bạn phải ghi lý do chứ, đồ bảo quản viên tồi tệ!");
return;
}
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init( event.target );
if( !pages ) {
Morebits.status.error( 'Lỗi', 'Không có gì để khóa, hủy' );
return;
}
var batchOperation = new Morebits.batchOperation("Đang áp dụng thiết lập khóa");
batchOperation.setOption("chunkSize", Twinkle.getPref('batchProtectChunks'));
batchOperation.setOption("preserveIndividualStatusLines", true);
batchOperation.setPageList(pages);
batchOperation.run(function(pageName) {
var query = {
'action': 'query',
'titles': pageName
};
var wikipedia_api = new Morebits.wiki.api( 'Hãy kiểm tra nếu trang ' + pageName + ' đã tồn tại', query,
Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure );
wikipedia_api.params = {
page: pageName,
reason: reason,
editmodify: editmodify,
editlevel: editlevel,
editexpiry: editexpiry,
movemodify: movemodify,
movelevel: movelevel,
moveexpiry: moveexpiry,
createmodify: createmodify,
createlevel: createlevel,
createexpiry: createexpiry,
batchOperation: batchOperation
};
wikipedia_api.post();
});
};
Twinkle.batchprotect.callbacks = {
main: function( apiobj ) {
var xml = apiobj.responseXML;
var normal = $(xml).find('normalized n').attr('to');
if( normal ) {
apiobj.params.page = normal;
}
var exists = ($(xml).find('page').attr('missing') !== "");
var page = new Morebits.wiki.page(apiobj.params.page, "Đang khóa " + apiobj.params.page);
var takenAction = false;
if (exists && apiobj.params.editmodify) {
page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
takenAction = true;
}
if (exists && apiobj.params.movemodify) {
page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
takenAction = true;
}
if (!exists && apiobj.params.createmodify) {
page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
takenAction = true;
}
if (!takenAction) {
Morebits.status.warn("Đang khóa " + apiobj.params.page, "trang " + (exists ? "đã tồn tại" : "không tồn tại") + "; không có gì để làm, bỏ qua");
apiobj.params.batchOperation.workerFailure(apiobj);
return;
}
page.setEditSummary(apiobj.params.reason);
page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);
}
};
})(jQuery);
//</nowiki>