MediaWiki:Gadget-twinklespeedy.js
Opmerking: na het publiceren moet je misschien je browsercache legen om de veranderingen te zien.
- Firefox / Safari: houd Shift ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
- Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
- Edge: houd Ctrl ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5.
// <nowiki>
/** ***************************************************************************************************
* WARNING: This file is synced with a GitHub-repo. Please make any changes to this file over there. *
* Any local changes might be overwritten the next time this file is updated. *
* *
* LET OP: Dit bestand is gekoppeld aan een GitHub-repo. Gelieve alle bewerkingen daar uitvoeren. *
* Locale bewerkingen worden mogelijk overschreven bij de volgende update. *
* *
* https://github.com/NLWikiTools/Twinkle/blob/master/modules/twinklespeedy.js *
**************************************************************************************************** */
(function($) {
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink(Twinkle.speedy.callback, 'Nuweg', 'tw-csd', Morebits.userIsSysop ? 'Verwijder pagina\'s in overeenstemming met WP:RVM' : 'Verzoek directe verwijdering in overeenstemming met WP:RVM');
};
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsSysop ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// Used throughout
Twinkle.speedy.hasCSD = !!$('#delete-reason').length;
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
var dialog;
Twinkle.speedy.dialog = new Morebits.simpleWindow(Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight'));
dialog = Twinkle.speedy.dialog;
dialog.setTitle('Kies een reden voor directe verwijdering');
dialog.setScriptName('Twinkle');
dialog.addFooterLink('Directe verwijderingsrichtlijnen', 'WP:RVM#Een_pagina_direct_verwijderen');
dialog.addFooterLink('Nuweg voorkeuren', 'WP:TW/PREF#speedy');
dialog.addFooterLink('Twinkle help', 'WP:TW/DOC#speedy');
dialog.addFooterLink('Geef feedback', 'Overleg Wikipedia:Twinkle');
var form = new Morebits.quickForm(callbackfunc, Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null);
if (Morebits.userIsSysop) {
form.append({
type: 'checkbox',
list: [
{
label: 'Enkel nomineren, niet zelf verwijderen',
value: 'tag_only',
name: 'tag_only',
tooltip: 'Voor als je een collega-mod het vuile werk wil laten opknappen...',
checked: !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
var cForm = event.target.form;
var cChecked = event.target.checked;
// enable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable redirects checkbox
cForm.redirects.checked = !cChecked;
// enable delete multiple
cForm.delmultiple.checked = false;
// enable notify checkbox
cForm.notify.checked = cChecked;
// enable deletion notification checkbox
cForm.warnusertalk.checked = !cChecked && !Twinkle.speedy.hasCSD;
// enable multiple
cForm.multiple.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
});
var deleteOptions = form.append({
type: 'div',
name: 'delete_options'
});
deleteOptions.append({
type: 'header',
label: 'Verwijder opties'
});
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Verwijder ook overlegpagina',
value: 'talkpage',
name: 'talkpage',
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
event: function(event) {
event.stopPropagation();
}
}
]
});
}
deleteOptions.append({
type: 'checkbox',
list: [
{
label: 'Verwijder alle doorverwijzingen',
value: 'redirects',
name: 'redirects',
tooltip: 'Verwijder alle pagina\'s die doorverwijzingen naar deze pagina. Gebruik dit NIET bij verplaatsingen/samenvoegingen.',
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
event: function (event) {
event.stopPropagation();
}
},
{
label: 'Verwijder wegens meerdere redenen',
value: 'delmultiple',
name: 'delmultiple',
tooltip: 'Indien geselecteerd kun je de pagina voor meerdere RVM criteria verwijderen.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
},
{
label: 'Breng aanmaker op de hoogte (indien mogelijk)',
value: 'warnusertalk',
name: 'warnusertalk',
tooltip: 'Een mededeling van nominatie wordt op de overlegpagina van de aanmaker geplaatst, OOK moet je dit inschakelen op het Twinkle configuratiescherm ',
checked: !Twinkle.speedy.hasCSD,
event: function(event) {
event.stopPropagation();
}
}
]
});
}
var tagOptions = form.append({
type: 'div',
name: 'tag_options'
});
if (Morebits.userIsSysop) {
tagOptions.append({
type: 'header',
label: 'Nominatie opties'
});
}
tagOptions.append({
type: 'checkbox',
list: [
{
label: 'Breng aanmaker op de hoogte (indien mogelijk)',
value: 'notify',
name: 'notify',
tooltip: 'Een mededeling van nominatie wordt op de overlegpagina van de aanmaker geplaatst, OOK moet je dit inschakelen op het Twinkle configuratiescherm ',
checked: !Morebits.userIsSysop || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
event: function(event) {
event.stopPropagation();
}
},
{
label: 'Nomineer wegens meerdere redenen ',
value: 'multiple',
name: 'multiple',
tooltip: 'Indien geselecteerd kun je de pagina voor meerdere RVM criteria nomineren.',
event: function(event) {
Twinkle.speedy.callback.modeChanged(event.target.form);
event.stopPropagation();
}
}
]
});
form.append({
type: 'div',
id: 'prior-deletion-count',
style: 'font-style: italic'
});
form.append({
type: 'div',
name: 'work_area',
label: 'Inladen nuweg-module mislukt. Probeer nogmaals, of meld het bij de Twinkle ontwikkelaars.'
});
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
form.append({ type: 'submit', className: 'tw-speedy-submit' }); // Renamed in modeChanged
}
var result = form.render();
dialog.setContent(result);
dialog.display();
Twinkle.speedy.callback.modeChanged(result);
// Check for prior deletions. Just once, upon init
Twinkle.speedy.callback.priorDeletionCount();
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
var namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
var mode = {
isSysop: !!form.tag_only && !form.tag_only.checked,
isMultiple: form.tag_only && !form.tag_only.checked ? form.delmultiple.checked : form.multiple.checked,
isRadioClick: Twinkle.getPref('speedySelectionStyle') === 'radioClick'
};
if (mode.isSysop) {
$('[name=delete_options]').show();
$('[name=tag_options]').hide();
$('button.tw-speedy-submit').text('Verwijder pagina');
} else {
$('[name=delete_options]').hide();
$('[name=tag_options]').show();
$('button.tw-speedy-submit').text('Nomineer pagina');
}
var work_area = new Morebits.quickForm.element({
type: 'div',
name: 'work_area'
});
if (mode.isMultiple && mode.isRadioClick) {
var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
work_area.append({
type: 'div',
label: 'Alle gewenste criteria geselecteerd?, klik:'
});
work_area.append({
type: 'button',
name: 'submit-multiple',
label: mode.isSysop ? 'Verwijder pagina' : 'Nomineer pagina',
event: function(event) {
Twinkle.speedy.callback[evaluateType](event);
event.stopPropagation();
}
});
}
var appendList = function(headerLabel, csdList) {
work_area.append({ type: 'header', label: headerLabel });
work_area.append({ type: mode.isMultiple ? 'checkbox' : 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, mode) });
};
if (!Morebits.isPageRedirect()) {
switch (namespace) {
case 2: // user
case 3: // user talk
appendList('Gebruikersnaamruimte', Twinkle.speedy.userList);
break;
default:
break;
}
} else {
if (namespace === 2 || namespace === 3) {
appendList('Gebruikersnaamruimte', Twinkle.speedy.userList);
}
}
var generalCriteria = Twinkle.speedy.generalList;
// custom rationale lives under general criteria when tagging
appendList('RVM criteria', generalCriteria);
var old_area = Morebits.quickForm.getElements(form, 'work_area')[0];
form.replaceChild(work_area.render(), old_area);
// if sysop, check if CSD is already on the page and fill in custom rationale
if (mode.isSysop && Twinkle.speedy.hasCSD) {
var customOption = $('input[name=nuweg][value=reason]')[0];
if (customOption) {
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($('#delete-reason').text()).replace(/\+/g, ' ');
}
}
};
Twinkle.speedy.callback.priorDeletionCount = function () {
var query = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'delete',
leaction: 'delete/delete', // Just pure page deletion, no redirect overwrites or revdel
letitle: mw.config.get('wgPageName'),
leprop: '', // We're just counting we don't actually care about the entries
lelimit: 5 // A little bit goes a long way
};
new Morebits.wiki.api('Controleren op voorgaande verwijderingen', query, function(apiobj) {
var response = apiobj.getResponse();
var delCount = response.query.logevents.length;
// noinspection JSJQueryEfficiency
if (delCount) {
var message = delCount + ' voorgaande verwijdering';
if (delCount > 1) {
message += 'en';
if (response.continue) {
message = 'Meer dan ' + message;
}
// 3+ seems problematic
if (delCount >= 3) {
$('#prior-deletion-count').css('color', 'red');
}
}
// Provide a link to page logs (CSD templates have one for sysops)
var link = Morebits.htmlNode('a', '(logs)');
link.setAttribute('href', mw.util.getUrl('Special:Log', {page: mw.config.get('wgPageName')}));
link.setAttribute('target', '_blank');
$('#prior-deletion-count').text(message + ' '); // Space before log link
$('#prior-deletion-count').append(link);
}
}).post();
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
var pageNamespace = mw.config.get('wgNamespaceNumber');
var openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
var submitSubgroupHandler = function(e) {
var evaluateType = mode.isSysop ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, function(critElement) {
var criterion = $.extend({}, critElement);
if (mode.isMultiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (mode.isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (Morebits.isPageRedirect() && criterion.hideWhenRedirect) {
return null;
}
if (criterion.showInNamespaces && criterion.showInNamespaces.indexOf(pageNamespace) < 0) {
return null;
}
if (criterion.hideInNamespaces && criterion.hideInNamespaces.indexOf(pageNamespace) > -1) {
return null;
}
if (criterion.subgroup && !mode.isMultiple && mode.isRadioClick) {
if (Array.isArray(criterion.subgroup)) {
criterion.subgroup = criterion.subgroup.concat({
type: 'button',
name: 'submit',
label: mode.isSysop ? 'Verwijder pagina' : 'Nomineer pagina',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: mode.isSysop ? 'Verwijder pagina' : 'Nomineer pagina',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
return criterion;
});
};
Twinkle.speedy.userList = [
{
label: 'Pagina in de eigen naamruimte op eigen verzoek',
value: 'eigennaamruimte',
subgroup: mw.config.get('wgNamespaceNumber') === 3 && mw.config.get('wgTitle').indexOf('/') === -1 ? {
name: 'userreq_rationale',
type: 'input',
label: 'Waarom moet deze pagina worden verwijderd: ',
tooltip: 'Gebruikersoverleg-pagina\'s worden alleen onder zeer uitzonderlijke omstandigheden verwijderd.',
size: 60
} : null,
hideSubgroupWhenMultiple: true
},
{
label: 'Onjuist gebruik eigen naamruimte.',
value: 'onjuistgebruik'
}
];
Twinkle.speedy.generalList = [
{
label: 'Pagina zonder inhoud',
value: 'leeg',
tooltip: 'Een lege pagina, of een aantal losse letters die geen woorden vormen.'
},
{
label: 'Pagina met inhoud zonder zinvolle informatie.',
value: 'onzin',
tooltip: 'Wees er zeker van dat het volstrekte onzin is. Als er ook maar de geringste twijfel bestaat, is het beter de pagina te nomineren via TBx.',
hideInNamespaces: [ 2 ] // Not applicable in userspace
},
{
label: 'Machinevertaling of niet in het Nederlands geschreven',
value: 'vertaling'
},
{
label: 'Expliciete reclame',
value: 'reclame'
},
{
label: 'Cyberpesten',
value: 'cyberpesten'
},
{
label: 'Privacyschending',
value: 'privacy'
},
{
label: 'Zelfpromotie',
value: 'zelfpromotie',
tooltip: 'Op grond van de geboortedatum is het onmogelijk dat de persoon opmerkelijke dingen heeft gedaan en/of na een zoektocht op internet worden geen relevante verwijzingen gevonden'
},
{
label: 'Aanvraag aanmaker',
value: 'enigeauteur',
tooltip: 'Enkel gebruiken wanneer je deze pagina zelf, per abuis, hebt aangemaakt.',
hideWhenUser: true,
hideWhenMultiple: true
},
{
label: 'Pagina over zelfde onderwerp bestaat al',
tooltip: 'Wees er 100% zeker van dat beide pagina\'s exact het zelfde onderwerp beschrijven',
value: 'duplicaat',
subgroup: [
{
name: 'duplicaatpag',
type: 'input',
label: 'Duplicaat van: ',
size: 60
}
]
},
{
label: 'Auteursrechtenschending',
value: 'copyvio',
subgroup: [
{
name: 'copyvio_url',
type: 'input',
label: 'URL (indien beschikbaar): ',
tooltip: 'Indien het materiaal is gekopieerd uit een online bron, voeg dan hier de links toe, inclusief het "http://" of "https://" protocol.',
size: 60
},
{
name: 'copyvio_url2',
type: 'input',
label: 'Extra URL: ',
tooltip: 'Optioneel. Dient te beginnen met "http://" of "https://"',
size: 60
},
{
name: 'copyvio_url3',
type: 'input',
label: 'Extra URL: ',
tooltip: 'Optioneel. Dient te beginnen met "http://" of "https://"',
size: 60
}
]
},
{
label: 'Afhandelen TBx nominatie',
value: 'tbx',
hideWhenUser: true,
hideWhenMultiple: true,
subgroup: [
{
name: 'venue',
type: 'select',
label: 'Nominatiepagina: ',
list: [
{
value: "Te beoordelen pagina's",
type: 'option',
label: 'Te Beoordelen Pagina',
selected: true
},
{
value: 'Te beoordelen sjablonen',
type: 'option',
label: 'Te Beoordelen Sjabloon'
},
{
value: 'Te beoordelen categorieën',
type: 'option',
label: 'Te Beoordelen Categorie'
}
]
},
{
name: 'daypage',
type: 'number',
label: 'Dagpagina: ',
tooltip: 'De datum van nominatie, in het formaat JJJJMMDD',
placeholder: 'JJJJMMDD',
size: 8,
min: 20000101,
max: 21001231
}
]
},
{
label: 'Verwijdering wegens verplaatsing/naamwijziging',
value: 'verplaatsing',
hideWhenUser: true,
hideWhenMultiple: true
}
];
Twinkle.speedy.normalizeHash = {
leeg: 'g1',
onzin: 'g2',
vertaling: 'g3',
zelfpromotie: 'g4',
cyberpesten: 'g5', // G5 = Leeghalen bij nominatie
reclame: 'g6',
copyvio: 'g7',
duplicaat: 'g8',
privacy: 'g9', // G9 = Leeghalen bij nominatie
enigeauteur: 'g10',
eigennaamruimte: 'u1',
onjuistgebruik: 'u2',
tbx: 's1',
verplaatsing: 's2'
};
Twinkle.speedy.templateReason = {
leeg: 'Lege pagina',
onzin: 'Geen zinvolle inhoud',
vertaling: 'Niet-Nederlandstalig of resultaat van een computervertaling',
zelfpromotie: 'Overduidelijke zelfpromotie',
cyberpesten: 'Cyberpesten',
privacy: 'Privacyschending',
reclame: 'Overduidelijke reclame',
copyvio: 'Schending van [[Wikipedia:Auteursrechten|auteursrechten]] of geplaatst zonder [[Help:Toestemming|toestemming]]',
duplicaat: 'Onderwerp is reeds beschreven op: ',
eigennaamruimte: 'Verzoek in eigen naamruimte',
onjuistgebruik: 'Onjuist gebruik van gebruikersnaamruimte',
enigeauteur: 'Aanvraag door aanmaker (enige auteur)'
};
Twinkle.speedy.deleteReason = {
leeg: 'lege pagina',
onzin: 'geen zinvolle inhoud',
vertaling: 'niet-Nederlandstalig of resultaat van een computervertaling',
zelfpromotie: 'overduidelijke zelfpromotie',
cyberpesten: 'cyberpesten',
privacy: 'privacyschending',
reclame: 'expliciete reclame, werving of propaganda',
copyvio: 'schending van [[Wikipedia:Auteursrechten|auteursrechten]] of geplaatst zonder [[Help:Toestemming|toestemming]]',
duplicaat: 'duplicaat van: ',
eigennaamruimte: 'verzoek in eigen naamruimte',
onjuistgebruik: 'onjuist gebruik van gebruikersnaamruimte',
tbx: 'afhandelen TBx nominatie',
verplaatsing: 'verplaatsing/naamwijziging',
enigeauteur: 'Aanvraag van aanmaker'
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
var code, parameters, i;
if (params.normalizeds.length > 1) {
code = '{{nuweg|1=';
params.utparams = {};
$.each(params.normalizeds, function(index, norm) {
code += params.templateReason[index] + '; ';
parameters = params.templateParams[index] || [];
for (var i in parameters) {
if (typeof parameters[i] === 'string' && !parseInt(i, 10)) { // skip numeric parameters - {{db-multiple}} doesn't understand them
code += ' ' + parameters[i];
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += '}}';
} else {
parameters = params.templateParams[0] || [];
code = '{{nuweg|1=' + params.templateReason[0];
for (i in parameters) {
if (typeof parameters[i] === 'string') {
code += ' ' + parameters[i];
}
}
code += '}}';
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
return [code, params.utparams];
},
noteToCreator: function(pageobj) {
var params = pageobj.getCallbackParameters();
var initialContrib = pageobj.getCreator();
// disallow notifying yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.status.warn('Jij (' + initialContrib + ') hebt deze pagina aangemaakt; notificatie overgeslagen');
initialContrib = null;
// don't notify users when their user talk page is nominated/deleted
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.status.warn('Verwittig originele aanmaker: deze gebruiker heeft zijn/haar eigen overlegpagina gemaakt; notificatie overgeslagen');
initialContrib = null;
// quick hack to prevent excessive unwanted notifications, per request. Should actually be configurable on recipient page...
} else if ((initialContrib === 'Nlwikibot' || initialContrib === 'SoxBot') && params.normalizeds[0] === 'f2') {
Morebits.status.warn('Verwittig originele aanmaker: pagina is door een bot aangemaakt, notificatie overgeslagen');
initialContrib = null;
// Check for already existing tags
} else if (Twinkle.speedy.hasCSD && params.warnUser && !confirm('De pagina heeft al een nominatie, dus de aanmaker is waarschijnlijk al gewaarschuwd. Wil je de aanmaker ook voor deze nominatie waarschuwen?')) {
Morebits.status.info('Verwittig originele aanmaker', 'geannuleerd door gebruiker.');
initialContrib = null;
}
if (initialContrib) {
var usertalkpage = new Morebits.wiki.page('Overleg gebruiker:' + initialContrib, 'Verwittig originele aanmaker (' + initialContrib + ')'),
notifytext, editsummary;
if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') === -1) {
notifytext = '\n== ' + (params.warnUser ? 'Directe verwijdering' : 'Nominatie') + ' van ' + Morebits.pageNameNorm + ' ==';
} else if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') !== -1) { // bij privacyschending artikel niet noemen in titel
notifytext = '\n== ' + (params.warnUser ? 'Directe verwijdering' : 'Nominatie') + ' van een privacyschendende pagina ==';
} else { // bij cyberpesten artikel niet noemen in titel
notifytext = '\n== ' + (params.warnUser ? 'Directe verwijdering' : 'Nominatie') + ' van een cyberpestpagina ==';
}
notifytext += '\n{{subst:' + (params.warnUser ? 'pdv' : 'vvn4');
if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') === -1) { // bij cyberpesten of privacyschending, artikel niet noemen in tekst
notifytext += '|1=' + Morebits.pageNameNorm;
} else {
notifytext = String(notifytext);
}
notifytext += '|2=' + params.values[0];
/* //TODO deze puinhoop een beetje ordelijk maken
for (i in params.utparams) {
if (typeof params.utparams[i] === 'string') {
notifytext += params.utparams[i] + ';';
}
}
*/
notifytext += (params.welcomeuser ? '' : '|3=false') + '}}';
if (params.normalizeds.indexOf('s1') === -1) {
editsummary = 'Mededeling: ' + (params.warnUser ? 'Directe verwijdering' : ' Nuweg nominatie');
if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') === -1) {
editsummary += ' van [[' + Morebits.pageNameNorm + ']].';
} else if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') !== -1) { // bij privacyschending artikel niet noemen in samenvatting
editsummary += ' van een privacyschendende pagina.';
} else { // bij cyberpesten artikel niet noemen in samenvatting
editsummary += ' van een cyberpestpagina.';
}
} else {
editsummary = 'Mededeling: Verwijdering van [[' + Morebits.pageNameNorm + ']] n.a.v. TBP nominatie';
}
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary);
usertalkpage.setChangeTags(Twinkle.changeTags);
usertalkpage.setCreateOption('recreate');
usertalkpage.setWatchlist(Twinkle.getPref('watchSpeedyUser'));
usertalkpage.setFollowRedirect(true, false);
usertalkpage.append(function onNotifySuccess() {
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
}, function onNotifyError() {
// if user could not be notified, log nomination without mentioning that notification was sent
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
});
} else if (params.lognomination) {
// log nomination even if the user notification wasn't sent
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
sysop: {
main: function(params) {
var reason;
if (params.normalizeds.length > 1) {
reason = 'Direct verwijderd om de volgende redenen: ';
$.each(params.normalizeds, function(index) {
reason += params.deleteReason[index] + '; ';
});
} else {
if (params.normalizeds.indexOf('s1') !== -1) { // TBx afhandeling
reason = 'Per beoordelingssessie [[Wikipedia:' + params.templateParams[0]['1'] + '/Toegevoegd ' + params.templateParams[0]['2'] + '#' + Morebits.pageNameNorm + ']]';
} else if (params.normalizeds.indexOf('g7') !== -1 && typeof params.templateParams[0].url !== 'undefined') { // only if copyvio and copyvio URL was given
reason = 'Direct verwijderd wegens [[Wikipedia:Auteursrechten|auteursrechtenschending]] van';
// eslint-disable-next-line guard-for-in
for (var i in params.templateParams[0]) {
reason += ' ' + params.templateParams[0][i];
}
} else if (params.normalizeds.indexOf('g8') !== -1) {
reason = 'Direct verwijderd omdat een pagina over dit onderwerp reeds bestaat op [[' + params.templateParams[0]['1'] + ']].';
} else {
reason = 'Direct verwijderd wegens ' + params.deleteReason;
}
}
Twinkle.speedy.callbacks.sysop.deletePage(reason, params);
},
deletePage: function(reason, params) {
var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Pagina verwijderen...');
if (reason === null) {
return Morebits.status.error('Verwijderen afgebroken', 'Gebruiker annuleert');
} else if (!reason) {
return Morebits.status.error('Verwijderen afgebroken', 'Stiekem pagina\'s verwijderen zonder reden? Dat is vragen om een desysop...');
}
var deleteMain = function(callback) {
thispage.setEditSummary(reason);
thispage.setChangeTags(Twinkle.changeTags);
thispage.setWatchlist(params.watch);
thispage.deletePage(function() {
thispage.getStatusElement().info('done');
typeof callback === 'function' && callback();
Twinkle.speedy.callbacks.sysop.deleteTalk(params);
});
};
// look up initial contributor. If prompting user for deletion reason, just display a link.
// Otherwise open the talk page directly
if (params.warnUser) {
thispage.setCallbackParameters(params);
thispage.lookupCreation(function(pageobj) {
deleteMain(function() {
Twinkle.speedy.callbacks.noteToCreator(pageobj);
});
});
} else {
deleteMain();
}
},
deleteTalk: function(params) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f8' &&
document.getElementById('ca-talk').className !== 'new') {
var talkpage = new Morebits.wiki.page(mw.config.get('wgFormattedNamespaces')[mw.config.get('wgNamespaceNumber') + 1] + ':' + mw.config.get('wgTitle'), 'Overlegpagina verwijderen');
talkpage.setEditSummary('Overlegpagina van verwijderde pagina "' + Morebits.pageNameNorm + '"');
talkpage.setChangeTags(Twinkle.changeTags);
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(function() {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects(params);
}
},
deleteRedirects: function(params) {
// delete redirects
if (params.deleteRedirects) {
var query = {
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'redirects',
rdlimit: 'max', // 500 is max for normal users, 5000 for bots and sysops
format: 'json'
};
var wikipedia_api = new Morebits.wiki.api('lijst met doorverwijzingen ophalen...', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.status('Doorverwijzingen verwijderen'));
wikipedia_api.params = params;
wikipedia_api.post();
}
// promote Unlink tool
var $link, $bigtext;
if (mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f8') {
$link = $('<a/>', {
href: '#',
text: 'klik hier om naar de Ontlink module te gaan',
css: { fontSize: '130%', fontWeight: 'bold' },
click: function() {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Ontlinken en buiten gebruik nemen van verwijderd bestand (' + Morebits.pageNameNorm + ')');
}
});
$bigtext = $('<span/>', {
text: 'Voorkom rode links en gebroken bestandskoppelingen',
css: { fontSize: '130%', fontWeight: 'bold' }
});
Morebits.status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f8') {
$link = $('<a/>', {
href: '#',
text: 'klik hier om naar de Ontlink-module te gaan',
css: { fontSize: '130%', fontWeight: 'bold' },
click: function() {
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback('Ontlinken van verwijderde pagina (' + Morebits.pageNameNorm + ')');
}
});
$bigtext = $('<span/>', {
text: 'Voorkom rode links',
css: { fontSize: '130%', fontWeight: 'bold' }
});
Morebits.status.info($bigtext[0], $link[0]);
}
},
deleteRedirectsMain: function(apiobj) {
var response = apiobj.getResponse();
var snapshot = response.query.pages[0].redirects || [];
var total = snapshot.length;
var statusIndicator = apiobj.statelem;
if (!total) {
statusIndicator.status('geen doorverwijzingen gevonden');
return;
}
statusIndicator.status('0%');
var current = 0;
var onsuccess = function(apiobjInner) {
var now = parseInt(100 * ++current / total, 10) + '%';
statusIndicator.update(now);
apiobjInner.statelem.unlink();
if (current >= total) {
statusIndicator.info(now + ' (voltooid)');
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
snapshot.forEach(function(value) {
var title = value.title;
var page = new Morebits.wiki.page(title, 'Doorverwijzing verwijderen "' + title + '"');
page.setEditSummary('Doorverwijzing naar verwijderde pagina "' + Morebits.pageNameNorm + '"');
page.setChangeTags(Twinkle.changeTags);
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
var statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error('Het lijkt er op dat de pagina niet meer bestaat, misschien is hij al verwijderd?');
return;
}
var params = pageobj.getCallbackParameters();
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
var buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params),
code = buildData[0];
params.utparams = buildData[1];
// Set the correct value for |ts= parameter in {{db-g13}}
if (params.normalizeds.indexOf('g13') !== -1) {
code = code.replace('$TIMESTAMP', pageobj.getLastEditTime());
}
// Tag if possible, post on talk if not
if (pageobj.canEdit() && ['wikitext', 'Scribunto', 'javascript', 'css', 'sanitized-css'].indexOf(pageobj.getContentModel()) !== -1) {
var text = pageobj.getPageText();
statelem.status('Controleren op bestaande nominaties...');
// check for existing deletion tags
var tag = /{{\s*(nuweg|delete)(?:\s*\||\s*}})/.exec(text);
// This won't make use of the db-multiple template but it probably should
if (tag && !confirm('De pagina heeft al een {{nuweg}} nominatie. Wil je een extra nominatie toevoegen?')) {
return;
}
var xfd = /{{\s*(wiu|ne|wb|auteur|reclame|weg|verwijderen)(?:\s*\||\s*}})/.exec(text);
if (xfd && !confirm('De pagina heeft al een {{' + xfd[1] + '}} nominatie. Weet je zeker dat je een nuweg-nominatie wil toevoegen?')) {
return;
}
// curate/patrol the page
if (Twinkle.getPref('markSpeedyPagesAsPatrolled')) {
pageobj.triage();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = '<noinclude>' + code + '</noinclude>';
}
if (mw.config.get('wgPageContentModel') === 'Scribunto') {
// Scribunto isn't parsed like wikitext, so CSD templates on modules need special handling to work
var equals = '';
while (code.indexOf(']' + equals + ']') !== -1) {
equals += '=';
}
code = "require('Module:Module wikitext')._addText([" + equals + '[' + code + ']' + equals + ']);';
} else if (['javascript', 'css', 'sanitized-css'].indexOf(mw.config.get('wgPageContentModel')) !== -1) {
// Likewise for JS/CSS pages
code = '/* ' + code + ' */';
}
// Generate edit summary for edit
var editsummary = 'Verzoek om directe verwijdering (' + params.values + ').';
// Maak pagina leeg bij cyberpesten of privacyschending
if (params.normalizeds.indexOf('g5') !== -1 || params.normalizeds.indexOf('g9') !== -1) {
text = code;
} else {
// Insert tag after short description or any hatnotes
var wikipage = new Morebits.wikitext.page(text);
text = wikipage.insertAfterTemplates(code + '\n', Twinkle.hatnoteRegex).getText();
}
pageobj.setPageText(text);
pageobj.setEditSummary(editsummary);
pageobj.setWatchlist(params.watch);
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
} else { // Attempt to place on talk page
var talkName = new mw.Title(pageobj.getPageName()).getTalkPage().toText();
if (talkName !== pageobj.getPageName()) {
pageobj.getStatusElement().warn('Plaatsen op pagina mislukt, proberen op het op de overlegpagina te plaaten');
var talk_page = new Morebits.wiki.page(talkName, 'Automatisch op overlegpagina geplaatst');
talk_page.setNewSectionTitle(pageobj.getPageName() + ' genomineerd voor directe verwijdering');
talk_page.setNewSectionText(code + '\n\nHet is me niet gelukt ' + pageobj.getPageName() + ' te bewerken, dus wil ik langs deze weg verzoeken het direct te verwijderen. ~~~~');
talk_page.setCreateOption('recreate');
talk_page.setFollowRedirect(true);
talk_page.setWatchlist(params.watch);
talk_page.setChangeTags(Twinkle.changeTags);
talk_page.setCallbackParameters(params);
talk_page.newSection(Twinkle.speedy.callbacks.user.tagComplete);
} else {
pageobj.getStatusElement().error('Pagina beveiligd en geen plek gevonden om een verwijderverzoek in te dienen, afbreken...');
}
}
},
tagComplete: function(pageobj) {
var params = pageobj.getCallbackParameters();
// Notification to first contributor, will also log nomination to the user's userspace log
if (params.usertalk) {
var thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
thispage.setCallbackParameters(params);
thispage.lookupCreation(Twinkle.speedy.callbacks.noteToCreator);
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
} else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
addToLog: function(params, initialContrib) {
var usl = new Morebits.userspaceLogger(Twinkle.getPref('speedyLogPageName'));
usl.initialText =
'Dit is een log van alle nuweg-nominaties gemaakt door deze gebruiker middels [[WP:TW|Twinkle]].\n\n' +
'Indien je dit logboek niet langer wenst bij te houden, pas dan je instellingen aan op het [[Wikipedia:Twinkle/Preferences|configuratiescherm]].' +
'Eventueel kun je deze pagina vervolgens nomineren voor directe verwijdering.' +
(Morebits.userIsSysop ? '\n\nDit logboek bewaard niet je moderatorafhandelingen gemaakt met Twinkle.' : '');
var formatParamLog = function(normalize, csdparam, input) {
if (normalize === 'G7' && csdparam.lastIndexOf('url', 0) === 0 && input.lastIndexOf('http', 0) === 0) {
input = '[' + input + ' ' + input + ']';
}
return ' {' + normalize + ' ' + csdparam + ': ' + input + '}';
};
var extraInfo = '';
// If a logged file is deleted but exists on commons, the wikilink will be blue, so provide a link to the log
var fileLogLink = mw.config.get('wgNamespaceNumber') === 6 ? ' ([{{fullurl:Special:Log|page=' + mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '}} log])' : '';
var editsummary = 'Log voor nuweg aanmaken';
var appendText = '# [[:' + Morebits.pageNameNorm;
if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') === -1) { // Geen artikel naam in logs bij cyberpesten of privacyschending
appendText += ']]' + fileLogLink + ': ';
editsummary += ' van [[:' + Morebits.pageNameNorm + ']].';
} else if (params.normalizeds.indexOf('g5') === -1 && params.normalizeds.indexOf('g9') !== -1) {
appendText += '|deze]] privacyschendende pagina' + fileLogLink + ': ';
editsummary += ' van een privacyschendende pagina.';
} else {
appendText += '|deze]] cyberpestpagina' + fileLogLink + ': ';
editsummary += ' van een cyberpestpagina.';
}
if (params.normalizeds.length > 1) {
appendText += 'Twinklecodes: ';
$.each(params.normalizeds, function(index, norm) {
appendText += norm.toUpperCase() + '; ';
});
appendText = appendText.substr(0, appendText.length - 2); // remove trailing comma
appendText += ')';
} else {
appendText += 'Twinklecode: ' + params.normalizeds[0].toUpperCase() + ' (' + params.values[0] + ')';
}
// If params is "empty" it will still be full of empty arrays, but ask anyway
if (params.templateParams) {
// Treat custom rationale individually
if (params.normalizeds[0] && params.normalizeds[0] === 'db') {
extraInfo += formatParamLog('Custom', 'rationale', params.templateParams[0]['1']);
} else {
params.templateParams.forEach(function(item, index) {
var keys = Object.keys(item);
if (keys[0] !== undefined && keys[0].length > 0) {
// Second loop required since some items (G7) may have multiple keys
keys.forEach(function(key, keyIndex) {
if (keys[keyIndex] === 'blanked' || keys[keyIndex] === 'ts') {
return true; // Not worth logging
}
extraInfo += formatParamLog(params.normalizeds[index].toUpperCase(), keys[keyIndex], item[key]);
});
}
});
}
}
if (extraInfo) {
appendText += '; overige informatie:' + extraInfo;
}
if (initialContrib) {
appendText += '; {{gebruiker|1=' + initialContrib + '}} op de hoogte gebracht';
}
appendText += ' ~~~~~\n';
usl.changeTags = Twinkle.changeTags;
usl.log(appendText, editsummary);
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
var parameters = [];
$.each(values, function(index, value) {
var currentParams = [];
switch (value) {
case 'tbx': // S1
if (form['csd.venue']) {
var s1venue = form['csd.venue'].value;
if (!s1venue || !s1venue.trim()) {
alert('Geef de nominatiepagina op.');
parameters = null;
return false;
}
currentParams['1'] = s1venue;
}
if (form['csd.daypage']) {
var s1daypage = form['csd.daypage'].value;
if (!s1daypage || !s1daypage.trim()) {
alert('Geef een dagpagina op in JJJJMMDD stijl.');
parameters = null;
return false;
}
currentParams['2'] = s1daypage;
}
break;
case 'duplicaat': // G8
if (form['csd.duplicaatpag']) {
var g8pagina = form['csd.duplicaatpag'].value;
if (!g8pagina || !g8pagina.trim()) {
alert('Geef de naam van de duplicaatpagina op.');
parameters = null;
return false;
}
currentParams['1'] = g8pagina;
}
break;
case 'eigennaamruimte': // U1
if (form['csd.userreq_rationale']) {
var u1rationale = form['csd.userreq_rationale'].value;
if (mw.config.get('wgNamespaceNumber') === 3 && !(/\//).test(mw.config.get('wgTitle')) &&
(!u1rationale || !u1rationale.trim())) {
alert('Geef een reden op om een gebruikersoverlegpagina te nomineren.');
parameters = null;
return false;
}
currentParams.rationale = u1rationale;
}
break;
case 'copyvio': // G7
if (form['csd.copyvio_url'] && form['csd.copyvio_url'].value) {
currentParams.url = form['csd.copyvio_url'].value;
}
if (form['csd.copyvio_url2'] && form['csd.copyvio_url2'].value) {
currentParams.url2 = form['csd.copyvio_url2'].value;
}
if (form['csd.copyvio_url3'] && form['csd.copyvio_url3'].value) {
currentParams.url3 = form['csd.copyvio_url3'].value;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// Function for processing talk page notification template parameters
// key1/value1: for {{db-criterion-[notice|deleted]}} (via {{db-csd-[notice|deleted]-custom}})
// utparams.param: for {{db-[notice|deleted]-multiple}}
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
var utparams = [];
// Special cases
if (normalized === 'g7') {
['url', 'url2', 'url3'].forEach(function(item, idx) {
if (parameters[item]) {
idx++;
utparams['key' + idx] = item;
utparams['value' + idx] = utparams[item] = parameters[item];
}
});
} else {
// Handle the rest
var param;
switch (normalized) {
default:
break;
}
// No harm in providing a usertalk template with the others' parameters
if (param && parameters[param]) {
utparams.key1 = param;
utparams.value1 = utparams[param] = parameters[param];
}
}
return utparams;
};
/**
* @param {Event} e
* @returns {Array}
*/
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert('Geef een reden op a.u.b.!');
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
var form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
var tag_only = form.tag_only;
if (tag_only && tag_only.checked) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
var values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
var templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
var normalizeds = values.map(function(value) {
return Twinkle.speedy.normalizeHash[value];
});
var templateReason = values.map(function(value) {
return Twinkle.speedy.templateReason[value];
});
var deleteReason = values.map(function(value) {
return Twinkle.speedy.deleteReason[value];
});
// analyse each criterion to determine whether to watch the page, prompt for summary, or notify the creator
var watchPage;
normalizeds.forEach(function(norm) {
if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) {
watchPage = Twinkle.getPref('watchSpeedyExpiry');
}
});
var warnusertalk = form.warnusertalk.checked && normalizeds.some(function (norm) {
return Twinkle.getPref('warnUserOnSpeedyDelete').indexOf(norm) !== -1;
});
var welcomeuser = warnusertalk && normalizeds.some(function (norm) {
return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1;
});
var params = {
values: values,
normalizeds: normalizeds,
templateReason: templateReason,
deleteReason: deleteReason,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
warnUser: warnusertalk,
welcomeuser: welcomeuser,
templateParams: templateParams
};
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
Twinkle.speedy.callbacks.sysop.main(params);
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
var form = e.target.form ? e.target.form : e.target;
if (e.target.type === 'checkbox' || e.target.type === 'text' ||
e.target.type === 'select') {
return;
}
var values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
var templateParams = Twinkle.speedy.getParameters(form, values);
if (!templateParams) {
return;
}
// var multiple = form.multiple.checked;
var normalizeds = values.map(function(value) {
return Twinkle.speedy.normalizeHash[value];
});
var templateReason = values.map(function(value) {
return Twinkle.speedy.templateReason[value];
});
var deleteReason = values.map(function(value) {
return Twinkle.speedy.deleteReason[value];
});
// analyse each criterion to determine whether to watch the page/notify the creator
var watchPage = normalizeds.some(function(csdCriteria) {
return Twinkle.getPref('watchSpeedyPages').indexOf(csdCriteria) !== -1;
}) && Twinkle.getPref('watchSpeedyExpiry');
var notifyuser = form.notify.checked && normalizeds.some(function(norm) {
return Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1;
});
var welcomeuser = notifyuser && normalizeds.some(function(norm) {
return Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1;
});
var csdlog = Twinkle.getPref('logSpeedyNominations') && normalizeds.some(function(norm) {
return Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1;
});
var params = {
values: values,
normalizeds: normalizeds,
deleteReason: deleteReason,
templateReason: templateReason,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
templateParams: templateParams
};
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = 'Nomineren voltooid. Pagina wordt herladen...';
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), 'Pagina nomineren');
wikipedia_page.setChangeTags(Twinkle.changeTags); // Here to apply to triage
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);
};
Twinkle.addInitCallback(Twinkle.speedy, 'speedy');
})(jQuery);
// </nowiki>