MediaWiki:Gadget-0xBlockMessage.js
Apparence
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) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.// Customisation
var templatesList = {
finite: [
{
label: "Bloqué",
data: '{ "template": "Bloqué|$1|$2" }'
}, {
label: "Bloqué sans avertissement",
data: '{ "template": "Bloqué sans avertissement|$1|$2" }'
}, {
label: "Insultes",
data: '{ "template": "Insultes|$1|$2" }'
}, {
label: "IP partagée bloquée",
data: '{ "template": "IP partagée bloquée|$1|$2" }'
}, {
label: "Vandale scolaire bloqué",
data: '{ "template": "Vandale scolaire bloqué" }',
'autoselect-time': '15 july 2018'
}, {
label: "Proxy",
data: '{ "template": "Proxy", "default-subst": false }',
'autoselect-reason': '[[Wikipédia:Proxy ouvert|Proxy ouvert]]'
}, {
label: "IP bloquée pour 3 jours",
data: '{ "template": "Adresse IP bloquée pour trois jours|$3|$1|$2" }'
},
],
infinite: [
{
label: "Compte bloqué indéfiniment",
data: '{ "template": "Compte bloqué indéfiniment|$3", "default-clean": true }'
}, {
label: "Vandale banni",
data: '{ "template": "Vandale banni", "default-clean": true }'
}, {
label: "Vandale banni sans avertissement",
data: '{ "template": "Vandale banni sans avertissement", "default-clean": true }'
}, {
label: "Bot banni",
data: '{ "template": "Bot banni" }'
},
]
};
// I18n
var blockMessageMessages = {
'en': {
'blockmessage-default-header' : 'Block user',
'blockmessage-success-header' : 'Block succeeded',
'blockmessage-form-legend': 'Avertir du blocage',
'blockmessage-username-label': 'Utilisateur',
'blockmessage-template-label': 'Modèle',
'blockmessage-expiry-label': 'Expiration',
'blockmessage-subst-label': 'Subster le modèle',
'blockmessage-clean-label': 'Effacer la PdD avant de mettre le modèle',
'blockmessage-extra-label': 'Rajouter un message sous le modèle',
'blockmessage-extraTextareaLabel': '(attention, la signature n\'est plus apposé automatiquement)',
'blockmessage-submit-label': 'Avertir',
'blockmessage-message-summary': 'Blocage',
'blockmessage-section-title': 'Blocage',
'blockmessage-successnotif': 'La pose du message a réussi',
'blockmessage-time-label': 'Durée',
'blockmessage-unit-label': 'Unité',
'blockmessage-hour': 'heure',
'blockmessage-hours': 'heures',
'blockmessage-day': 'jour',
'blockmessage-days': 'jours',
'blockmessage-week': 'semaine',
'blockmessage-weeks': 'semaines',
'blockmessage-month': 'mois',
'blockmessage-months': 'mois',
'blockmessage-year': 'année',
'blockmessage-years': 'années',
},
'fr': {
'blockmessage-default-header' : 'Bloquer l’utilisateur',
'blockmessage-success-header' : 'Blocage réussi',
'blockmessage-form-legend': 'Avertir du blocage',
'blockmessage-username-label': 'Utilisateur',
'blockmessage-template-label': 'Modèle',
'blockmessage-expiry-label': 'Expiration',
'blockmessage-subst-label': 'Subster le modèle',
'blockmessage-clean-label': 'Effacer la PdD avant de mettre le modèle',
'blockmessage-extra-label': 'Rajouter un message sous le modèle',
'blockmessage-extraTextareaLabel': '(attention, la signature n\'est plus apposé automatiquement)',
'blockmessage-submit-label': 'Avertir',
'blockmessage-message-summary': 'Blocage',
'blockmessage-section-title': 'Blocage',
'blockmessage-successnotif': 'La pose du message a réussi',
'blockmessage-time-label': 'Durée',
'blockmessage-unit-label': 'Unité',
'blockmessage-hour': 'heure',
'blockmessage-hours': 'heures',
'blockmessage-day': 'jour',
'blockmessage-days': 'jours',
'blockmessage-week': 'semaine',
'blockmessage-weeks': 'semaines',
'blockmessage-month': 'mois',
'blockmessage-months': 'mois',
'blockmessage-year': 'année',
'blockmessage-years': 'années',
}
};
mw.messages.set( blockMessageMessages[ 'en' ] );
var lang = mw.config.get( 'wgUserLanguage' );
if ( lang && lang !== 'en' && lang in blockMessageMessages ) {
mw.messages.set( blockMessageMessages[ lang ] );
}
var blockMessageUnits = [
{ en: 'hour', data: mw.msg( 'blockmessage-hour' ), label: mw.msg( 'blockmessage-hour' ) },
{ en: 'hours', data: mw.msg( 'blockmessage-hours' ), label: mw.msg( 'blockmessage-hours' ) },
{ en: 'day', data: mw.msg( 'blockmessage-day' ), label: mw.msg( 'blockmessage-day' ) },
{ en: 'days', data: mw.msg( 'blockmessage-days' ), label: mw.msg( 'blockmessage-days' ) },
{ en: 'week', data: mw.msg( 'blockmessage-week' ), label: mw.msg( 'blockmessage-week' ) },
{ en: 'weeks', data: mw.msg( 'blockmessage-weeks' ), label: mw.msg( 'blockmessage-weeks' ) },
{ en: 'month', data: mw.msg( 'blockmessage-month' ), label: mw.msg( 'blockmessage-month' ) },
{ en: 'months', data: mw.msg( 'blockmessage-months' ), label: mw.msg( 'blockmessage-months' ) },
{ en: 'year', data: mw.msg( 'blockmessage-year' ), label: mw.msg( 'blockmessage-year' ) },
{ en: 'years', data: mw.msg( 'blockmessage-years' ), label: mw.msg( 'blockmessage-years' ) }
];
$( function() {
if ( mw.config.get( 'wgCanonicalNamespace' ) === 'Special' && mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Block' ) {
mw.loader.using( [ 'mediawiki.cookie' ], function() {
// On the Block page
if ( $( '#firstHeading' ).html() === mw.msg( 'blockmessage-default-header' ) ) {
$( 'form.mw-htmlform' ).submit( function( event ) {
if ( $( '#mw-input-wpExpiry select' ).val() === 'other' ) {
mw.cookie.set( 'blockmessage-expiry', $( 'input[name="wpExpiry-other"]' ).val() );
}
else {
mw.cookie.set( 'blockmessage-expiry', $( '#mw-input-wpExpiry select' ).val() );
}
if ( $( '#mw-input-wpReason-select select' ).val() === 'other' ) {
mw.cookie.set( 'blockmessages-reason', $( 'input[name="wpReason-other"]' ).val() );
}
else if ( $( 'input[name="wpReason-other"]' ).val() !== '' ) {
mw.cookie.set( 'blockmessage-reason', $( '#mw-input-wpReason-select select' ).val() + ' : ' + $( 'input[name="wpReason-other"]' ).val() );
}
else {
mw.cookie.set( 'blockmessage-reason', $( '#mw-input-wpReason-select select' ).val() );
}
});
}
// When the user has successfully blocked someone
else if ( $( '#firstHeading' ).html() === mw.msg( 'blockmessage-success-header' ) && mw.cookie.get( 'blockmessage-expiry' ) !== null ) {
window.blockMessage = new BlockMessage( mw.config.get( 'wgRelevantUserName' ), mw.cookie.get( 'blockmessage-reason' ), mw.cookie.get( 'blockmessage-expiry' ) );
window.blockMessage.init();
}
} );
}
});
var BlockMessage = function(targetUser, reason, duration) {
this.targetUser = targetUser;
this.reason = reason;
this.duration = duration;
this.usernameInput;
this.templateDropdownInput;
this.expiryInput;
this.substCheckboxInput;
this.cleanCheckboxInput;
this.extraCheckboxInput;
this.extraTextarea;
this.submitInput;
this.expiryField;
this.extraTextareaField;
this.form;
};
BlockMessage.prototype.init = function() {
this.createWidgets();
this.addEventHandlers();
this.initializeWidgets();
$( '#mw-content-text' ).append( this.form.$element );
};
BlockMessage.prototype.createWidgets = function() {
this.usernameInput = new OO.ui.TextInputWidget( {
name: 'username',
disabled: 'disabled'
} );
this.templateDropdownInput = new OO.ui.DropdownInputWidget();
this.expiryInput = new mw.widgets.SelectWithInputWidget( {
or: false,
dropdowninput: {
label: mw.msg( 'blockmessage-unit-label' ),
options: blockMessageUnits,
},
textinput: {
placeholder: mw.msg( 'blockmessage-time-label' )
}
} );
this.substCheckboxInput = new OO.ui.CheckboxInputWidget( {
name: '',
selected: true
} );
this.cleanCheckboxInput = new OO.ui.CheckboxInputWidget( {
name: '',
selected: false
} );
this.extraCheckboxInput = new OO.ui.CheckboxInputWidget( {
name: '',
selected: false
} );
this.extraTextarea = new OO.ui.MultilineTextInputWidget( {
rows: 10,
autosize: true,
} );
this.submitInput = new OO.ui.ButtonInputWidget( {
type: 'submit',
label: mw.msg( 'blockmessage-submit-label' ),
flags: [ 'primary', 'destructive' ],
} );
this.expiryField = new OO.ui.FieldLayout( this.expiryInput, {
align: 'top',
label: mw.msg( 'blockmessage-expiry-label' )
} );
this.extraTextareaField = new OO.ui.FieldLayout( this.extraTextarea, {
align: 'top',
label: $( '<small>' ).text( mw.msg( 'blockmessage-extraTextareaLabel' ) )
} );
this.form = new OO.ui.FieldsetLayout( {
id: 'demo-section-formLayout',
label: mw.msg( 'blockmessage-form-legend' ),
items: [
new OO.ui.FieldLayout( this.usernameInput, {
align: 'top',
label: mw.msg( 'blockmessage-username-label' )
} ),
new OO.ui.FieldLayout( this.templateDropdownInput, {
align: 'top',
label: mw.msg( 'blockmessage-template-label' )
} ),
this.expiryField,
new OO.ui.FieldLayout( this.substCheckboxInput, {
align: 'inline',
label: mw.msg( 'blockmessage-subst-label' )
} ),
new OO.ui.FieldLayout( this.cleanCheckboxInput, {
align: 'inline',
label: mw.msg( 'blockmessage-clean-label' )
} ),
new OO.ui.FieldLayout( this.extraCheckboxInput, {
align: 'inline',
label: mw.msg( 'blockmessage-extra-label' )
} ),
this.extraTextareaField,
new OO.ui.FieldLayout( this.submitInput )
]
} );
};
BlockMessage.prototype.addEventHandlers = function() {
var self = this;
this.submitInput.on( 'click', function() {
self.submitInput.setDisabled(true);
self.postMessage();
} );
this.templateDropdownInput.on( 'change', function (value) {
value = JSON.parse(value);
if ( value.hasOwnProperty( 'default-subst' ) ) {
self.substCheckboxInput.setSelected( value[ 'default-subst' ] );
}
if ( value.hasOwnProperty( 'default-clean' ) ) {
self.cleanCheckboxInput.setSelected( value[ 'default-clean' ] );
}
} );
this.extraCheckboxInput.on( 'change', function ( checked ) {
self.extraTextareaField.toggle( checked );
} );
};
BlockMessage.prototype.initializeWidgets = function() {
var templates;
if ( this.duration === 'infinite' ) {
this.expiryField.toggle( false );
templates = templatesList.infinite;
}
else {
templates = templatesList.finite;
this.computeDuration();
}
this.templateDropdownInput.setOptions( templates );
// Autoselect a template depending of the reasons or the duration
for ( var i=0; i<templates.length; i++ ) {
if ( 'autoselect-reason' in templates[ i ] ) {
if ( templates[ i ][ 'autoselect-reason' ] === this.reason ) {
this.templateDropdownInput.setValue( templates[ i ].data );
break;
}
}
if ( 'autoselect-duration' in templates[ i ] ) {
if ( templates[ i ][ 'autoselect-duration' ] === this.duration ) {
this.templateDropdownInput.setValue( templates[ i ].data );
break;
}
}
}
this.usernameInput.setValue( this.targetUser );
this.extraTextareaField.toggle( false );
};
BlockMessage.prototype.computeDuration = function() {
if ( this.duration !== null ) {
var splitedDuration = this.duration.split( ' ' );
if ( splitedDuration.length === 2 && !isNaN( splitedDuration[ 0 ] ) ) {
for ( var i=0; i<blockMessageUnits; i++) {
if ( splitedDuration[ 1 ] === blockMessageUnits[ i ].data ) {
this.expiryInput.dropdowninput.setValue( blockMessageUnits[ i ].data );
this.expiryInput.textinput.setValue( splitedDuration[ 0 ] );
break;
}
}
}
}
};
BlockMessage.prototype.postMessage = function() {
var subst = '';
if ( this.substCheckboxInput.isSelected() ) {
subst = 'subst:';
}
var extra = ' ~~' + '~~';
if ( this.extraCheckboxInput.isSelected() ) {
extra = '\n\n' + this.extraTextarea.getValue();
}
var self = this;
new mw.Api().edit( 'User talk:' + self.targetUser, function( revision ) {
var template = JSON.parse( self.templateDropdownInput.getValue() ).template;
template = template.replace( '$1', self.expiryInput.textinput.getValue() );
template = template.replace( '$2', self.expiryInput.dropdowninput.getValue() );
template = template.replace( '$3', self.reason );
var data = {
summary: mw.msg( 'blockmessage-message-summary' ),
text: '{{' + subst + template + '}}' + extra,
};
if ( ! self.cleanCheckboxInput.isSelected() ) {
data.section = "new";
data.sectiontitle = mw.msg( 'blockmessage-section-title' );
}
return data;
} ).then( function ( data ) {
mw.notify( mw.msg( 'blockmessage-successnotif' ) );
mw.cookie.set( 'blockmessage-user', null );
mw.cookie.set( 'blockmessage-duree', null );
mw.cookie.set( 'blockmessage-reason', null );
setTimeout( function() {
document.location.href = mw.util.getUrl( 'User talk:' + self.targetUser + '#footer' );
}, 750 );
} );
};