Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« MediaWiki:Gadget-Accueil.stats.js » : différence entre les versions

Page de l’interface de MediaWiki
WikiThionvilleSyncBot (discussion | contributions)
Sync homepage from repository (commit b06f0a0)
 
WikiThionvilleSyncBot (discussion | contributions)
Sync homepage from repository (commit 0e34c54)
 
Ligne 1 : Ligne 1 :
( function ( mw ) {
( function ( mw ) {
'use strict';
"use strict";


var accueil = mw.libs && mw.libs.wikithionvilleAccueil;
const accueil = mw.libs && mw.libs.wikithionvilleAccueil;


if ( !accueil ) {
if (!accueil) return;
return;
}


function formatCounter( value ) {
function formatCounter( value ) {
try {
try {
return value.toLocaleString( navigator.language || undefined, {
return value.toLocaleString(
notation: 'compact',
navigator.language || undefined,  
compactDisplay: 'short',
{
maximumFractionDigits: 1
notation: "compact",
} );
compactDisplay: "short",
maximumFractionDigits: 1
}
);
} catch ( error ) {
} catch ( error ) {
return String( value );
return String( value );
Ligne 20 : Ligne 21 :
}
}


function animateCounter( element, targetValue ) {
function animateCounter(element, target) {
var target = Math.max( Number( targetValue ) || 0, 0 );
const DURATION = 1100;
var duration = 1100;
let startTime = null;
var startTime = null;


function tick( timestamp ) {
function tick(timestamp) {
var progress;
if (startTime === null)
var value;
startTime = timestamp;


if ( startTime === null ) {
const progress = Math.min((timestamp - startTime) / DURATION, 1);
startTime = timestamp;
const value = Math.round(target * progress);
}


progress = Math.min( ( timestamp - startTime ) / duration, 1 );
value = Math.round( target * progress );
element.textContent = formatCounter( value );
element.textContent = formatCounter( value );


if ( progress < 1 ) {
if ( progress < 1 ) {
window.requestAnimationFrame( tick );
window.requestAnimationFrame( tick );
} else {
return;
element.textContent = formatCounter( target );
}
}
element.textContent = formatCounter(target);
}
}


window.requestAnimationFrame( tick );
window.requestAnimationFrame(tick);
}
}


function countWhenVisible( element, value ) {
function countWhenVisible(element, value) {
var observer;
if (!element) return;
value = Number(value);


if ( !element ) {
if (isNaN(value)) value = 0;
return;
value = Math.max(value, 0);
}


if ( accueil.reduceMotion || !( 'IntersectionObserver' in window ) ) {
if (
animateCounter( element, value );
accueil.reduceMotion  
|| !("IntersectionObserver" in window)
) {
element.textContent = formatCounter(value);
return;
return;
}
}


observer = new IntersectionObserver( function ( entries ) {
const observer = new IntersectionObserver(
if ( entries[ 0 ].isIntersecting ) {
entries => {
if (!entries[0].isIntersecting) return;
observer.disconnect();
observer.disconnect();
animateCounter( element, value );
animateCounter( element, value );
}
},
}, { threshold: 0.2 } );
{ threshold: 0.2 }
);


observer.observe( element );
observer.observe(element);
}
}


accueil.initStats = function ( root ) {
accueil.initStats = root => {
var stats = root.querySelector( '.home-info__stats' );
const stats = root.querySelector(".home-info__stats");
var api;
if (!stats) return;


if ( !stats ) {
const api = new mw.Api();
return;
api.get({
}
action: "query",
meta: "siteinfo",
siprop: "statistics",
formatversion: 2
})
.then(data => {
const statistics =
data
&& data.query
&& data.query.statistics;
 
if (!statistics) return;
 
stats.classList.add("is-visible");


api = new mw.Api();
countWhenVisible(
api.get( {
root.querySelector("#counter_articles"),
action: 'query',
statistics.articles
meta: 'siteinfo',
);
siprop: 'statistics',
formatversion: 2
} ).done( function ( data ) {
var statistics = data.query && data.query.statistics;


if ( !statistics ) {
countWhenVisible(
return;
root.querySelector("#counter_pages"),
}
statistics.pages
);


stats.classList.add( 'is-visible' );
countWhenVisible(
countWhenVisible( root.querySelector( '#counter_articles' ), statistics.articles );
root.querySelector("#counter_utilisateurs"),
countWhenVisible( root.querySelector( '#counter_pages' ), statistics.pages );
statistics.users
countWhenVisible( root.querySelector( '#counter_utilisateurs' ), statistics.users );
);
} );
})
.catch(error => {
console.error("Impossible de charger les statistiques", error);
});
};
};
}( mediaWiki ) );
}(mediaWiki));

Dernière version du 12 juin 2026 à 13:00

( function ( mw ) {
	"use strict";

	const accueil = mw.libs && mw.libs.wikithionvilleAccueil;

	if (!accueil) return;

	function formatCounter( value ) {
		try {
			return value.toLocaleString(
				navigator.language || undefined, 
				{
					notation: "compact",
					compactDisplay: "short",
					maximumFractionDigits: 1
				}
			);
		} catch ( error ) {
			return String( value );
		}
	}

	function animateCounter(element, target) {
		const DURATION = 1100;
		let startTime = null;

		function tick(timestamp) {
			if (startTime === null)
				startTime = timestamp;

			const progress = Math.min((timestamp - startTime) / DURATION, 1);
			const value = Math.round(target * progress);

			element.textContent = formatCounter( value );

			if ( progress < 1 ) {
				window.requestAnimationFrame( tick );
				return;
			}

			element.textContent = formatCounter(target);
		}

		window.requestAnimationFrame(tick);
	}

	function countWhenVisible(element, value) {
		if (!element) return;
		value = Number(value);

		if (isNaN(value)) value = 0;
		value = Math.max(value, 0);

		if (
			accueil.reduceMotion 
			|| !("IntersectionObserver" in window)
		) {
			element.textContent = formatCounter(value);
			return;
		}

		const observer = new IntersectionObserver(
			entries => {
				if (!entries[0].isIntersecting) return;
				
				observer.disconnect();
				animateCounter( element, value );
			},
			{ threshold: 0.2 }
		);

		observer.observe(element);
	}

	accueil.initStats = root => {
		const stats = root.querySelector(".home-info__stats");
		if (!stats) return;

		const api = new mw.Api();
		api.get({
			action: "query",
			meta: "siteinfo",
			siprop: "statistics",
			formatversion: 2
		})
		.then(data => {
			const statistics =
				data
				&& data.query
				&& data.query.statistics;

			if (!statistics) return;

			stats.classList.add("is-visible");

			countWhenVisible(
				root.querySelector("#counter_articles"),
				statistics.articles
			);

			countWhenVisible(
				root.querySelector("#counter_pages"),
				statistics.pages
			);

			countWhenVisible(
				root.querySelector("#counter_utilisateurs"),
				statistics.users
			);
		})
		.catch(error => {
			console.error("Impossible de charger les statistiques", error);
		});
	};
}(mediaWiki));