MediaWiki:Gadget-C helper message.js
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;
Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.//<nowiki>
/* jshint esversion: 8 */
/* globals mw, $, C */
C.message = {
dialog: null,
config: {
'modal-title': 'C helper - Informer un utilisateur',
'submit': 'Valider la requête',
'c-message-checkbox-class': 'c-message-checkbox',
'notify-success': 'Les messages ont bien été ajoutés.',
'notify-not-a-page': 'Impossible d\'ajouter un message à un utilisateur depuis cette page.',
'page-input-help': 'De nombreux modèles font référence à la page où le problème a eu lieu ; C-helper n\'a pas réussi à la déterminer automatiquement, veuillez donc la préciser manuellement si nécessaire.',
'subst-checkbox-help': 'Cette case doit rester cochée dans la plupart des cas.',
'add-summary': '$1',
'template-link-summary': '$1',
},
categories: [
{display:"Souhaiter la bienvenue", node:null}, //0
{display:"Maladresses", node:null}, //1
{display:"Vandalisme", node:null}, //2
{display:"Suggestion", node:null}, //3
{display:"Liens externes", node:null}, //4
{display:"Copyvio", node:null}, //5
{display:"Avertissement supression", node:null}, //6
{display:"Aide", node:null}, //7
],
/*
{category:, display:'', template:'', help:'', reason:'', page:'', diff:''},
Magic words :
* $(page)
* $(diff)
* $(user)
* $(day) $(month) $(year)
* $(reason)
* $(extra)
*/
templates: [
{category:0, display:'Bienvenue nouveau', template:'Bienvenue nouveau|$(user)|message=$(extra)', extra:'Ajouter un message personnel (facultatif) :', help:''},
{category:0, display:'Bienvenue IP', template:'Bienvenue IP', help:''},
{category:0, display:'Bienvenue IP méritante', template:'Bienvenue IP méritante|$(user)|message=$(extra)', extra:'Ajouter un message personnel (facultatif) :', help:''},
{category:1, display:'Test 0', template:'Test 0|$(page)|$(diff)|autre=$(extra)|user=$(user)', extra:'Type de maladresse (facultatif) :', help:''},
{category:1, display:'Test ?', template:'Test ?|$(page)|$(diff)', help:''},
{category:1, display:'Ajout POV', template:'Ajout POV|$(page)|user=$(user)', help:''},
{category:1, display:'Non-encyclo', template:'Non-encyclo|user=$(user)', help:''},
{category:1, display:'Retrait injustifié', template:'Retrait injustifié|$(page)|user=$(user)', help:''},
{category:1, display:'Ortho', template:'Ortho|$(page)|user=$(user)', help:''},
{category:1, display:'Signature', template:'Signature', help:''},
{category:1, display:'Traduction automatique', template:'Traduction automatique|$(page)|user=$(user)', help:''},
{category:1, display:'No ref wiki', template:'No ref wiki|$(page)|user=$(user)', help:''},
{category:1, display:'PU brouillon', template:'PU brouillon', help:''},
{category:1, display:'Compte publicitaire', template:'Compte publicitaire', help:''},
{category:1, display:'Conflit d\'intérêts', template:'Conflit d\'intérêts|$(page)', help:''},
{category:1, display:'Bienvenue autobiographie', template:'Bienvenue autobiographie|$(page)|$(extra)', extra:'Message à la fin du modèle', help:''},
{category:1, display:'Suppr Bandeaux', template:'Suppr Bandeaux|$(page)', help:''},
{category:2, display:'Test 1', template:'Test 1|$(page)', help:''},
{category:2, display:'Test 2', template:'Test 2', help:''},
{category:2, display:'Test 3', template:'Test 3', help:''},
{category:2, display:'Test 4', template:'Test 4', help:''},
{category:2, display:'Faux décès', template:'Faux décès|$(page)', help:''},
{category:2, display:'Faux décès 2', template:'Faux décès 2|$(page)', help:''},
{category:2, display:'Pas un forum', template:'Pas un forum|$(page)', help:''},
{category:2, display:'Pas un forum 2', template:'Pas un forum 2|$(page)', help:''},
{category:2, display:'U-R3R', template:'U-R3R|$(page)', help:''},
{category:2, display:'U-R3R-2', template:'U-R3R-2|$(page)', help:''},
{category:2, display:'Vandalisme cracra', template:'Vandalisme cracra', help:''},
{category:3, display:'Faut sourcer', template:'Faut sourcer|$(page)|user=$(user)', help:''},
{category:3, display:'Faut sourcer 2', template:'Faut sourcer 2|$(page)', help:''},
{category:3, display:'Motivation modif', template:'Motivation modif|$(page)|user=$(user)', help:''},
{category:3, display:'Contributions promotionnelles', template:'Contributions promotionnelles|$(page)', help:''},
{category:3, display:'Contributions rémunérées rappel', template:'Contributions rémunérées rappel|$(page)', help:''},
{category:3, display:'Nom d\'utilisateur connu', template:'Nom d\'utilisateur connu', help:''},
{category:3, display:'Bienvenue nom d\'utilisateur', template:'Bienvenue nom d\'utilisateur', help:''},
{category:4, display:'Bienvenue spammeur', template:'Bienvenue spammeur|$(page)|user=$(user)', help:''},
{category:4, display:'Bienvenue spammeur 2', template:'Bienvenue spammeur 2|$(page)', help:''},
{category:4, display:'Bienvenue spammeur 3', template:'Bienvenue spammeur 3|$(page)', help:''},
{category:4, display:'Unique avertissement spammeur', template:'Bienvenue spammeur 4|$(page)|user=$(user)', help:''},
{category:4, display:'LE HC', template:'LE HC|$(page)|user=$(user)', help:''},
{category:4, display:'LE dans texte', template:'LE dans texte|$(page)|user=$(user)', help:''},
{category:5, display:'Avertissement Copyvio', template:'Avertissement Copyvio|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
{category:5, display:'Avertissement Copyvio Synopsis', template:'Avertissement Copyvio Synopsis|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
{category:5, display:'Dernier avertissement Copyvio', template:'Dernier avertissement Copyvio|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
{category:5, display:'Unique avertissement Copyvio', template:'Bienvenue Copyvio 4|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
{category:6, display:'Averto sursis', template:'Averto sursis|$(page)|$(extra)', extra:'Raison :', help:''},
{category:6, display:'BSI CAA', template:'BSI CAA|$(page)', help:''},
{category:6, display:'BSI BàS', template:'BSI BàS|$(page)|user=$(user)', help:''},
{category:6, display:'BSI promo', template:'BSI promo|$(page)|user=$(user)', help:''},
{category:6, display:'BSI canular', template:'BSI canular|$(page)|user=$(user)', help:''},
{category:6, display:'BSI doublon', template:'BSI doublon|$(page)|$(extra)|user=$(user)', extra:'Titre de l\'article en double :', help:''},
{category:6, display:'BSI vandalisme', template:'BSI vandalisme|$(page)', help:''},
{category:6, display:'Bienvenue SI 2', template:'Bienvenue SI 2', help:''},
{category:6, display:'Bienvenue SI 3', template:'Bienvenue SI 3', help:''},
{category:6, display:'Bienvenue SI 4', template:'Bienvenue SI 4', help:''},
{category:7, display:'Aide sources', template:'Aide sources|user=$(user)', help:''},
{category:7, display:'Aide images', template:'Aide images|user=$(user)', help:''},
{category:7, display:'Aide wikification', template:'Aide wikification|user=$(user)', help:''},
{category:7, display:'Aide liens', template:'Aide liens', help:''},
],
categories_container: null,
alphabetic_container: null,
current_display_mode: "categories",
init: function () {
},
launch: function () {
if (mw.config.get('wgArticleId') === 0 && mw.config.get('wgRelevantUserName') === null) {
mw.notify(C.message.config['notify-not-a-page'], {title:'C-helper', type:'error'});
return;
}
if (this.dialog === null) {
this.build_dialog();
}
this.dialog.dialog("open");
},
"build_dialog": function () {
this.dialog = $('<div>', {title:this.config['modal-title']});
let form = $('<form>');
this.dialog.append(form);
// Try to determine the page name to display in the template, if it's ambiguous, ask a manual input
if (mw.config.get('wgNamespaceNumber') == 2 || mw.config.get('wgNamespaceNumber') == 3) {
$("<div>")
.append($("<label>", {"for":"C-message-input-page"}).text("Article modifié :"))
.append($("<input>", {type:"text", name:"C-message-input-page", id:"C-message-input-page"}))
.append(C.util.construct_help_icon(this.config['page-input-help']))
.appendTo(form);
} else {
$("<div>")
.append($("<input>", {type:"hidden", name:"C-message-input-page", id:"C-message-input-page", value:mw.config.get('wgPageName').replaceAll('_', ' ')}))
.appendTo(form);
}
$("<div>")
.append($("<input>", {type:"checkbox", checked: "checked", name:"C-message-checkbox-subst", id:"C-message-checkbox-subst"}))
.append($("<label>", {"for":"C-message-checkbox-subst"}).text("Substituer les modèles"))
.append(C.util.construct_help_icon(this.config['subst-checkbox-help']))
.appendTo(form);
//Create sections
this.alphabetic_container = $("<div>", {id:"C-message-alphabetic-container"});
this.categories_container = $("<div>", {id:"C-message-categories-container"});
for (let i=0; i<this.categories.length; i++) {
this.categories[i].node = $("<div>").append($("<h3>").text(this.categories[i].display)).appendTo(this.categories_container);
}
for (let i=0; i<this.templates.length; i++) {
this.templates[i].node = $("<div>");
this.templates[i].node.append($("<input>", {type:"checkbox", id:"C-message-"+i, message_id:i, class:this.config['c-message-checkbox-class']}));
this.templates[i].node.append($("<label>", {"for":"C-message-"+i}).text(this.templates[i].display));
if (this.templates[i].help) {
this.templates[i].node.append(C.util.construct_help_icon(this.templates[i].help));
}
if (this.templates[i].extra) {
this.templates[i].node.append($('<span>', {id:'C-message-extra-'+i, class:this.config['c-message-extra-class']})
.hide()
.append($('<br>'))
.append($('<label>', {"for":'C-message-extra-input-'+i}).html(this.templates[i].extra))
.append(" ")
.append($('<input>', {type:'text', id:'C-message-extra-input-'+i})));
}
this.categories[this.templates[i].category].node.append(this.templates[i].node);
}
form.append(this.alphabetic_container);
form.append(this.categories_container);
this.dialog.dialog({
autoOpen: false,
height: 400,
width: 600,
modal: true,
buttons: [
{
text: C.message.config['submit'],
click: function () {
C.message.dialog.dialog("close");
C.message.validate();
},
},
],
dialogClass: 'c-helper-dialog',
});
$('.'+this.config['c-message-checkbox-class']).change(function () {
if ($(this).is(":checked")) {
$('#C-message-extra-'+$(this).attr('message_id')).show();
} else {
$('#C-message-extra-'+$(this).attr('message_id')).hide();
}
});
},
validate: async function () {
let target_page = $('#C-message-input-page').val();
let target_user_name;
if ($(".diff").length) {
target_user_name = $(".diff-ntitle .mw-userlink").text();
} else {
target_user_name = mw.config.get('wgRelevantUserName');
}
let reverted_edit = "";
let to_append = "";
let summary_array = [];
for (let i=0; i<this.templates.length; i++) {
if ($('#C-message-'+i).is(':checked')) {
let template = this.templates[i].template;
if (template.includes('$(diff)') && !reverted_edit && target_page) {
reverted_edit = await this.last_edit_on_page_by_user(target_page, target_user_name)
.catch(function (err) {
let notification = 'Failed to guess the reverted edit.';
if ( err ) {
notification += ' ' + err;
if ( !notification.endsWith( '.' ) ) {
notification += '.';
}
}
// vu que ça n'interrompt pas le traitement, je mets en type "warn" et non "error"
mw.notify( notification, { type: 'warn' } );
return "";
});
}
let tmp = template.replaceAll('$(day)', "{{subst:CURRENTDAY}}")
.replaceAll('$(month)', "{{subst:CURRENTMONTHNAME}}")
.replaceAll('$(year)', "{{subst:CURRENTYEAR}}")
.replaceAll('$(page)', target_page)
.replaceAll('$(diff)', reverted_edit)
.replaceAll('$(user)', mw.config.get('wgUserName'));
if ($('#C-message-extra-input-'+i).length > 0) {
tmp = tmp.replaceAll('$(extra)', $('#C-message-extra-input-'+i).val());
}
let subst = "";
if ($('#C-message-checkbox-subst').is(':checked')) {
subst = "subst:";
}
to_append += '\n\n{{'+subst+tmp+'}}';
summary_array.push(this.templates[i].display);
}
}
to_append += '\n~~~~';
if (summary_array.length > 0) {
let template_links = summary_array.map(function (item) {
return this.config['template-link-summary'].replaceAll('$1', item);
}, this);
let summary = this.config['add-summary'].replaceAll('$1', C.util.array_to_text(template_links));
C.util.append("Discussion utilisateur:"+target_user_name, to_append, summary, function () {
mw.notify(C.message.config['notify-success'], {title:'C-helper', type:'info'});
});
}
},
'last_edit_on_page_by_user': async function ( page, user ) {
if ( !page ) {
throw new Error( 'Missing "page" argument' );
}
if ( !user ) {
throw new Error( 'Missing "user" argument' );
}
let data = await new mw.Api().get( {
action: 'query',
prop: 'revisions',
titles: page,
rvuser: user,
rvlimit: 1,
rvprop: 'ids',
formatversion: 2
} ).catch( function ( err ) {
throw new Error( 'API error: ' + err );
} );
// la propriété "pages" peut être absente dans ce cas :
// - input "#" (ou "#foobar"), qui est normalisé en "", c'est-à-dire un titre vide
// la propriété "revisions" peut être absente dans divers cas :
// - page inexistante
// - titre de page invalide
// - aucune révision trouvée (parce que l'utilisateur n'a jamais modifié la page)
if ( !data.query.pages ) {
throw new Error( 'Erroneous page title input' );
}
if ( !data.query.pages[ 0 ].revisions ) {
if ( data.query.pages[ 0 ].missing ) {
throw new Error( 'Page not found' );
}
if ( data.query.pages[ 0 ].invalid ) {
throw new Error( 'Invalid page title' );
}
throw new Error( 'Revision not found' );
}
return data.query.pages[ 0 ].revisions[ 0 ].revid;
},
};
C.modules.message.callback = C.message;
//</nowiki>