Aller au contenu

MediaWiki:Minerva.js

De Militothèque

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.
/* Chargé sur le site mobile */

(function () {
	'use strict';

	var MENU_SELECTOR = 'ul#p-navigation';
	var ENHANCED_ATTR = 'data-enhanced-menu';

	function addMenuItem(parent, itemId, linkText, url, imageUrl, insertAtStart) {
		if (!parent || document.getElementById(itemId)) return;

		var li = document.createElement('li');
		li.id = itemId;
		li.classList.add('toggle-list-item'); // <-- classe demandée

		li.innerHTML =
			'<a href="' + url + '" class="toggle-list-item__anchor menu__item--home">' +
				'<span class="menu-item-text toggle-list-item__label">' + linkText + '</span>' +
			'</a>';

		if (insertAtStart && parent.firstChild) {
			parent.insertBefore(li, parent.firstChild);
		} else {
			parent.appendChild(li);
		}

		var label = li.querySelector('.menu-item-text');
		if (label) {
			label.style.setProperty('--image-url', 'url(' + imageUrl + ')');
		}
	}

	function addStylesOnce() {
		if (document.getElementById('menu-item-styles')) return;
		var style = document.createElement('style');
		style.id = 'menu-item-styles';
		style.textContent =
			'#p-navigation li a .menu-item-text {' +
				'position: relative; display: inline-block; padding-left: 30px;' +
			'}' +
			'#p-navigation li a .toggle-list-item__label::before {' +
				'content: ""; position: absolute; left: 0; top: 0; width: 20px; height: 20px;' +
				'background-size: contain; background-repeat: no-repeat; background-position: center;' +
				'opacity: .65; background-image: var(--image-url);' +
			'}';
		document.head.appendChild(style);
	}

	function enhanceMenuIfReady() {
		var nav = document.querySelector(MENU_SELECTOR);
		if (!nav || nav.getAttribute(ENHANCED_ATTR) === '1') return;

		// Ajouter les 3 entrées
		addMenuItem(nav, 'pt-all-documentaires', 'Documentaires', 'https://militotheque.org/wiki/Catégorie:Documentaire', '/w/images/8/82/Videographie_noir.svg');
		addMenuItem(nav, 'pt-all-films', 'Films', 'https://militotheque.org/wiki/Catégorie:Film', '/w/images/8/82/Videographie_noir.svg');
		addMenuItem(nav, 'pt-carte-videos', 'Carte des vidéos', 'https://militotheque.org/wiki/Militothèque:Carte_des_vidéos', '/w/images/6/6e/Mappemonde.svg');

		// Réordonner pour placer entre "Accueil" et "Au hasard"
		var auHasard = nav.querySelector('li:nth-child(2)'); // après Accueil
		['pt-carte-videos', 'pt-all-films', 'pt-all-documentaires'].forEach(function (id) {
			var li = nav.querySelector('#' + id);
			if (li && auHasard) nav.insertBefore(li, auHasard);
		});

		addStylesOnce();
		nav.setAttribute(ENHANCED_ATTR, '1'); // éviter doublons
	}

	function initObservers() {
		// 1) Essai immédiat
		enhanceMenuIfReady();

		// 2) Observer les mutations (le menu peut être injecté après)
		var obs = new MutationObserver(function () { enhanceMenuIfReady(); });
		obs.observe(document.documentElement, { childList: true, subtree: true });

		// 3) Hook MediaWiki quand dispo
		if (window.mw && mw.hook) {
			mw.hook('wikipage.content').add(enhanceMenuIfReady);
		}
	}

	if (document.readyState === 'loading') {
		document.addEventListener('DOMContentLoaded', initObservers);
	} else {
		initObservers();
	}
})();

/* Pour les utilisateurs connectés, remplace le bouton Modifier le wikicode par Modifier avec formulaire */
$(document).ready(function () {
	if (!$("body").hasClass("is-authenticated")) {
		return;
	}
	var boutonModifier = document.querySelector("#bouton-modifier");
	var caEdit = document.querySelector("#ca-edit"); // Minerva: <a id="ca-edit">
	if (boutonModifier && caEdit) {
		var lien = boutonModifier.querySelector("a");
		// On récupère l'attribut "href" tel qu'il est écrit dans le HTML
		var nouveauHref = lien && lien.getAttribute("href");
		console.log("lien bouton : " + nouveauHref);
		if (!nouveauHref) return;

		// Appliquer notre URL et titre
		caEdit.setAttribute("href", nouveauHref);
		var nouveauTitre = lien.getAttribute("title");
		if (nouveauTitre) caEdit.setAttribute("title", nouveauTitre);

		// 1) Empêcher les handlers du skin de rediriger vers ?section=0
		caEdit.addEventListener("click", function (e) {
			e.preventDefault();
			e.stopImmediatePropagation();
			window.location.assign(nouveauHref);
		}, true); // phase de capture

		// 2) Bloquer toute réécriture ultérieure de l'attribut href
		var mo = new MutationObserver(function (mutations) {
			for (var m of mutations) {
				if (m.type === "attributes" && m.attributeName === "href") {
					if (caEdit.getAttribute("href") !== nouveauHref) {
						caEdit.setAttribute("href", nouveauHref);
					}
				}
			}
		});
		mo.observe(caEdit, { attributes: true, attributeFilter: ["href"] });

		// (optionnel) Re-appliquer juste après le paint si un script a couru entre-temps
		setTimeout(function(){ caEdit.setAttribute("href", nouveauHref); }, 0);

		// Supprimer le bouton custom
		boutonModifier.remove();
	}
});