« MediaWiki:Common.js » : différence entre les versions
Page de l’interface de MediaWiki
Autres actions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
| (4 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 9 : | Ligne 9 : | ||
a.addEventListener('click', function(e) { | a.addEventListener('click', function(e) { | ||
e.preventDefault(); | e.preventDefault(); | ||
var | var isLoggedIn = mw.config.get('wgUserName'); | ||
if ( | 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 avec filtrage selon les permissions | |||
var namespaces = mw.config.get('wgFormattedNamespaces'); | |||
var userGroups = mw.config.get('wgUserGroups') || []; | |||
var isAdmin = userGroups.indexOf('sysop') !== -1 || userGroups.indexOf('bureaucrat') !== -1; | |||
var currentUser = mw.config.get('wgUserName'); | |||
// Namespaces restreints (réservés aux admins) | |||
var adminOnlyNs = [8, 9]; // MediaWiki, MediaWiki_talk | |||
// Namespaces de discussion (impairs) - on les exclut car on crée généralement la page principale | |||
// Namespaces techniques | |||
var technicalNs = [828, 829, 2300, 2301, 2302, 2303]; // Module, Gadget, etc. | |||
var nsOptions = [{ data: 0, label: '(Article principal)' }]; | |||
for (var nsId in namespaces) { | |||
var id = parseInt(nsId); | |||
if (id <= 0 || !namespaces[nsId]) continue; | |||
// Exclure les namespaces de discussion (impairs) | |||
if (id % 2 === 1) continue; | |||
// Exclure les namespaces techniques | |||
if (technicalNs.indexOf(id) !== -1) continue; | |||
// Namespaces admin-only | |||
if (adminOnlyNs.indexOf(id) !== -1 && !isAdmin) continue; | |||
// Namespace Utilisateur (2) - ajouter avec le nom de l'utilisateur | |||
if (id === 2) { | |||
nsOptions.push({ data: id, label: namespaces[nsId] + ':' + currentUser + '/...' }); | |||
} else { | |||
nsOptions.push({ data: id, 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; | |||
var currentUser = mw.config.get('wgUserName'); | |||
if (nsId === 2) { | |||
// Namespace Utilisateur - préfixer avec le nom de l'utilisateur | |||
fullTitle = namespaces[nsId] + ':' + currentUser + '/' + pageName; | |||
} else if (nsId > 0) { | |||
fullTitle = namespaces[nsId] + ':' + pageName; | |||
} else { | |||
fullTitle = 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 250; | |||
}; | |||
// Ouvrir le dialogue | |||
var windowManager = new OO.ui.WindowManager(); | |||
$(document.body).append(windowManager.$element); | |||
var dialog = new CreatePageDialog({ size: 'large' }); | |||
windowManager.addWindows([dialog]); | |||
windowManager.openWindow(dialog); | |||
}); | |||
}); | }); | ||
var d = document.querySelector('.citizen-drawer'); | var d = document.querySelector('.citizen-drawer'); | ||
if (d) d.parentNode.insertBefore(a, d.nextSibling); | if (d) d.parentNode.insertBefore(a, d.nextSibling); | ||
}); | }); | ||
Dernière version du 30 mai 2026 à 08:48
$(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 avec filtrage selon les permissions
var namespaces = mw.config.get('wgFormattedNamespaces');
var userGroups = mw.config.get('wgUserGroups') || [];
var isAdmin = userGroups.indexOf('sysop') !== -1 || userGroups.indexOf('bureaucrat') !== -1;
var currentUser = mw.config.get('wgUserName');
// Namespaces restreints (réservés aux admins)
var adminOnlyNs = [8, 9]; // MediaWiki, MediaWiki_talk
// Namespaces de discussion (impairs) - on les exclut car on crée généralement la page principale
// Namespaces techniques
var technicalNs = [828, 829, 2300, 2301, 2302, 2303]; // Module, Gadget, etc.
var nsOptions = [{ data: 0, label: '(Article principal)' }];
for (var nsId in namespaces) {
var id = parseInt(nsId);
if (id <= 0 || !namespaces[nsId]) continue;
// Exclure les namespaces de discussion (impairs)
if (id % 2 === 1) continue;
// Exclure les namespaces techniques
if (technicalNs.indexOf(id) !== -1) continue;
// Namespaces admin-only
if (adminOnlyNs.indexOf(id) !== -1 && !isAdmin) continue;
// Namespace Utilisateur (2) - ajouter avec le nom de l'utilisateur
if (id === 2) {
nsOptions.push({ data: id, label: namespaces[nsId] + ':' + currentUser + '/...' });
} else {
nsOptions.push({ data: id, 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;
var currentUser = mw.config.get('wgUserName');
if (nsId === 2) {
// Namespace Utilisateur - préfixer avec le nom de l'utilisateur
fullTitle = namespaces[nsId] + ':' + currentUser + '/' + pageName;
} else if (nsId > 0) {
fullTitle = namespaces[nsId] + ':' + pageName;
} else {
fullTitle = 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 250;
};
// Ouvrir le dialogue
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
var dialog = new CreatePageDialog({ size: 'large' });
windowManager.addWindows([dialog]);
windowManager.openWindow(dialog);
});
});
var d = document.querySelector('.citizen-drawer');
if (d) d.parentNode.insertBefore(a, d.nextSibling);
});