MediaWiki:Common.js
Page de l’interface de MediaWiki
Autres actions
Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
- Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
- Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
- Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
$(function() {
if (document.getElementById('citizen-newpage-button')) return;
var a = document.createElement('a');
a.id = 'citizen-newpage-button';
a.href = '#';
a.title = 'Créer une page';
a.className = 'citizen-header__item cdx-button cdx-button--icon-only';
a.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M17 9v2h-6v6H9v-6H3V9h6V3h2v6z"/></svg>';
a.addEventListener('click', function(e) {
e.preventDefault();
var isLoggedIn = mw.config.get('wgUserName');
var userGroups = mw.config.get('wgUserGroups') || [];
var isAutoconfirmed = userGroups.indexOf('autoconfirmed') !== -1;
// Utilisateur non connecté
if (!isLoggedIn) {
mw.loader.using('oojs-ui-windows').then(function() {
OO.ui.alert(
'Vous devez être connecté pour créer ou modifier une page.',
{ title: 'Connexion requise' }
).done(function() {
window.location.href = mw.util.getUrl('Special:UserLogin', {
returnto: mw.config.get('wgPageName')
});
});
});
return;
}
// Utilisateur connecté mais compte non validé
if (!isAutoconfirmed) {
mw.loader.using('oojs-ui-windows').then(function() {
OO.ui.alert(
'Votre compte doit être validé avant de pouvoir créer ou modifier des pages. Pensez a vérifier vos spams.',
{ title: 'Compte non validé' }
);
});
return;
}
// Utilisateur autorisé - Afficher le formulaire de création
mw.loader.using(['oojs-ui-windows', 'oojs-ui-widgets', 'mediawiki.api']).then(function() {
// Créer le dialogue personnalisé
function CreatePageDialog(config) {
CreatePageDialog.super.call(this, config);
}
OO.inheritClass(CreatePageDialog, OO.ui.ProcessDialog);
CreatePageDialog.static.name = 'createPageDialog';
CreatePageDialog.static.title = 'Créer une page';
CreatePageDialog.static.actions = [
{ action: 'create', label: 'Créer', flags: ['primary', 'progressive'] },
{ action: 'cancel', label: 'Annuler', flags: 'safe' }
];
CreatePageDialog.prototype.initialize = function() {
CreatePageDialog.super.prototype.initialize.apply(this, arguments);
// Champ nom de page
this.pageNameInput = new OO.ui.TextInputWidget({
placeholder: 'Nom de la page',
required: true
});
// Récupérer les namespaces
var namespaces = mw.config.get('wgFormattedNamespaces');
var nsOptions = [{ data: 0, label: '(Article principal)' }];
for (var nsId in namespaces) {
if (nsId > 0 && namespaces[nsId]) {
nsOptions.push({ data: parseInt(nsId), label: namespaces[nsId] });
}
}
// Dropdown namespace
this.namespaceSelect = new OO.ui.DropdownInputWidget({
options: nsOptions,
value: 0
});
// Section Advanced (cachée par défaut)
this.advancedToggle = new OO.ui.ButtonWidget({
label: 'Options avancées',
framed: false,
flags: ['progressive']
});
this.advancedSection = new OO.ui.FieldsetLayout({ classes: ['create-page-advanced'] });
this.advancedSection.addItems([
new OO.ui.FieldLayout(this.namespaceSelect, { label: 'Espace de noms', align: 'top' })
]);
this.advancedSection.$element.hide();
this.advancedToggle.on('click', function() {
this.advancedSection.$element.toggle();
}.bind(this));
// Message d'erreur/info
this.messageLabel = new OO.ui.LabelWidget({ classes: ['create-page-message'] });
this.messageLabel.$element.hide();
// Layout
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.content.$element.append(
new OO.ui.FieldLayout(this.pageNameInput, { label: 'Nom de la page', align: 'top' }).$element,
this.advancedToggle.$element,
this.advancedSection.$element,
this.messageLabel.$element
);
this.$body.append(this.content.$element);
};
CreatePageDialog.prototype.getActionProcess = function(action) {
var dialog = this;
if (action === 'create') {
return new OO.ui.Process(function() {
var pageName = dialog.pageNameInput.getValue().trim();
var nsId = parseInt(dialog.namespaceSelect.getValue());
var namespaces = mw.config.get('wgFormattedNamespaces');
// Vérification nom vide
if (!pageName) {
dialog.messageLabel.setLabel('Veuillez entrer un nom de page.');
dialog.messageLabel.$element.css('color', 'red').show();
return $.Deferred().reject().promise();
}
// Vérification caractères interdits
var invalidChars = /[#<>\[\]{}|]/;
if (invalidChars.test(pageName)) {
dialog.messageLabel.setLabel('Le nom contient des caractères interdits: # < > [ ] { } |');
dialog.messageLabel.$element.css('color', 'red').show();
return $.Deferred().reject().promise();
}
// Construire le titre complet
var fullTitle = nsId > 0 ? namespaces[nsId] + ':' + pageName : pageName;
// Vérifier si la page existe via l'API
var api = new mw.Api();
return api.get({
action: 'query',
titles: fullTitle,
formatversion: 2
}).then(function(data) {
var page = data.query.pages[0];
if (!page.missing) {
// La page existe déjà
dialog.messageLabel.$element.html(
'Cette page existe déjà. <a href="' + mw.util.getUrl(fullTitle) + '">Voir la page</a> ou <a href="' + mw.util.getUrl(fullTitle, {action: 'edit'}) + '">la modifier</a>.'
).css('color', '#c59000').show();
return $.Deferred().reject().promise();
}
// Rediriger vers l'éditeur
window.location.href = mw.util.getUrl(fullTitle, { action: 'edit' });
});
});
}
if (action === 'cancel') {
return new OO.ui.Process(function() {
dialog.close();
});
}
return CreatePageDialog.super.prototype.getActionProcess.call(this, action);
};
CreatePageDialog.prototype.getBodyHeight = function() {
return this.content.$element.outerHeight(true) + 50;
};
// Ouvrir le dialogue
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
var dialog = new CreatePageDialog({ size: 'medium' });
windowManager.addWindows([dialog]);
windowManager.openWindow(dialog);
});
});
var d = document.querySelector('.citizen-drawer');
if (d) d.parentNode.insertBefore(a, d.nextSibling);
});