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:Common.js

Page de l’interface de MediaWiki

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.
/* ============================================================
   Calculateur de lecture du catalogue mictionnel
   À coller dans la page MediaWiki:Common.js (réservée aux administrateurs).
   S'active sur toute page contenant <div id="calc-mictionnel"></div>.
   Seuils : Société internationale de continence de l'enfant, 2016 ;
   épreuve de report de miction : Marzuillo et coll., 2018.
   ============================================================ */
( function () {
	'use strict';

	function init( $content ) {
		var root = $content[ 0 ].querySelector( '#calc-mictionnel' );
		if ( !root || root.dataset.ready ) { return; }
		root.dataset.ready = '1';

		var champs = [
			[ 'age',       'Âge (années)',                                             8,   'Formule de capacité validée de 4 à 12 ans' ],
			[ 'poids',     'Poids (kilogrammes)',                                      26,  'Sert au seuil de polyurie' ],
			[ 'diurnes',   'Mictions diurnes (nombre par jour)',                       '',  'Toutes les mictions entre le lever et le coucher' ],
			[ 'nocturnes', 'Mictions nocturnes (nombre)',                              0,   'Réveils pour uriner ou énurésie' ],
			[ 'premiere',  'Première miction du matin (millilitres)',                  '',  'Mesure la capacité fonctionnelle réelle' ],
			[ 'vmax',      'Volume maximal hors première miction (millilitres)',       '',  'Le plus grand volume de la journée' ],
			[ 'diurese',   'Diurèse des 24 heures (millilitres)',                      '',  'Somme de toutes les mictions, première du matin comprise' ],
			[ 'fuites',    'Fuites (nombre par jour)',                                 0,   'Culotte mouillée, même un peu' ],
			[ 'urgences',  'Urgenturies (nombre par jour)',                            0,   'Envies brutales et impérieuses' ],
			[ 'boissons',  'Boissons totales (millilitres)',                           '',  'Facultatif' ],
			[ 'residu',    'Résidu post-mictionnel à l\'échographie (millilitres)',    '',  'Facultatif ; laisser vide si non mesuré' ]
		];

		var html = '<div class="cm-grille">';
		champs.forEach( function ( c ) {
			html += '<label class="cm-champ"><span class="cm-libelle">' + c[ 1 ] + '</span>' +
				'<input type="number" min="0" step="1" id="cm-' + c[ 0 ] + '" value="' + c[ 2 ] + '">' +
				'<span class="cm-aide">' + c[ 3 ] + '</span></label>';
		} );
		html += '<label class="cm-champ cm-case"><input type="checkbox" id="cm-constipation"> ' +
			'<span class="cm-libelle">Signes de constipation</span>' +
			'<span class="cm-aide">Selles Bristol 1 ou 2, poussée, douleur, gros diamètre ou souillures, même avec une selle par jour</span></label>';
		html += '<label class="cm-champ cm-case"><input type="checkbox" id="cm-bandelette" checked> ' +
			'<span class="cm-libelle">Bandelette urinaire normale</span>' +
			'<span class="cm-aide">Leucocytes, nitrites, sang, glucose, densité</span></label>';
		html += '</div><div id="cm-resultats"></div>';
		root.innerHTML = html;

		var style = document.createElement( 'style' );
		style.textContent =
			'#calc-mictionnel{border:1px solid #a2a9b1;border-radius:8px;padding:16px;background:#f8f9fa;margin:1em 0}' +
			'.cm-grille{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px 20px}' +
			'.cm-champ{display:flex;flex-direction:column;font-size:95%}' +
			'.cm-case{flex-direction:row;flex-wrap:wrap;align-items:center;gap:6px}' +
			'.cm-case .cm-aide{flex-basis:100%}' +
			'.cm-libelle{font-weight:600}' +
			'.cm-aide{color:#54595d;font-size:85%}' +
			'#calc-mictionnel input[type=number]{width:120px;padding:4px 6px;margin:4px 0}' +
			'#cm-resultats{margin-top:16px}' +
			'#cm-resultats table{width:100%;border-collapse:collapse;background:#fff}' +
			'#cm-resultats th,#cm-resultats td{border:1px solid #a2a9b1;padding:6px 10px;text-align:left;vertical-align:top}' +
			'#cm-resultats th{background:#eaecf0}' +
			'.cm-ok{color:#14866d}.cm-alerte{color:#b32424;font-weight:600}.cm-neutre{color:#54595d}' +
			'.cm-profil{margin-top:12px;padding:12px 16px;border-left:5px solid #36c;background:#fff;font-size:105%}';
		root.appendChild( style );

		function val( id ) {
			var v = document.getElementById( 'cm-' + id ).value;
			return v === '' ? null : Number( v );
		}
		function ml( x ) { return Math.round( x ) + ' millilitres'; }
		function ligne( libelle, texte, classe ) {
			return '<tr><td>' + libelle + '</td><td class="' + ( classe || '' ) + '">' + texte + '</td></tr>';
		}

		function calculer() {
			var age = val( 'age' ), poids = val( 'poids' );
			var out = document.getElementById( 'cm-resultats' );
			if ( age === null || poids === null ) {
				out.innerHTML = '<p class="cm-neutre">Saisir l\'âge et le poids.</p>';
				return;
			}
			var ebc = ( age + 1 ) * 30, petite = ebc * 0.65, grande = ebc * 1.5,
				reservoir = ebc * 0.8, polyurie = 40 * poids, residu15 = ebc * 0.15;

			var diurnes = val( 'diurnes' ), nocturnes = val( 'nocturnes' ) || 0,
				premiere = val( 'premiere' ), vmax = val( 'vmax' ), diurese = val( 'diurese' ),
				fuites = val( 'fuites' ) || 0, urgences = val( 'urgences' ) || 0,
				boissons = val( 'boissons' ), residu = val( 'residu' ),
				constip = document.getElementById( 'cm-constipation' ).checked,
				bandelette = document.getElementById( 'cm-bandelette' ).checked;

			var h = '<table><tr><th>Repère pour cet enfant</th><th>Valeur</th></tr>' +
				ligne( 'Capacité vésicale attendue, 30 × (âge + 1)', ml( ebc ) ) +
				ligne( 'Petite capacité si volume maximal inférieur à', ml( petite ) + ' (65 pour cent)' ) +
				ligne( 'Grande capacité si volume maximal supérieur à', ml( grande ) + ' (150 pour cent)' ) +
				ligne( 'Réservoir jugé normal si première miction du matin atteint', ml( reservoir ) + ' (80 pour cent)' ) +
				ligne( 'Polyurie si diurèse supérieure à', ml( polyurie ) + ' par 24 heures (40 millilitres par kilogramme)' ) +
				ligne( 'Résidu anormal (7 à 12 ans, mesure isolée) au-delà de', '20 millilitres ou ' + ml( residu15 ) + ' (15 pour cent)' ) +
				( age < 4 || age > 12 ? ligne( 'Attention', 'Formule de capacité validée de 4 à 12 ans seulement', 'cm-alerte' ) : '' ) +
				'</table>';

			h += '<table style="margin-top:12px"><tr><th>Lecture du journal</th><th>Interprétation</th></tr>';

			var estPolyurie = diurese !== null && diurese > polyurie;
			h += ligne( 'Diurèse', diurese === null ? 'Non renseignée' :
				( estPolyurie ? 'Polyurie : ' + Math.round( diurese / poids ) + ' millilitres par kilogramme. Bandelette (glucose, densité), glycémie, osmolalité urinaire du matin, avant toute lecture vésicale' :
				'Diurèse normale : ' + Math.round( diurese / poids ) + ' millilitres par kilogramme' ),
				diurese === null ? 'cm-neutre' : ( estPolyurie ? 'cm-alerte' : 'cm-ok' ) );

			var freq = diurnes === null ? null : ( diurnes >= 8 ? 'pollakiurie' : ( diurnes <= 3 ? 'rares' : 'normale' ) );
			h += ligne( 'Fréquence', diurnes === null ? 'Non renseignée' :
				( freq === 'pollakiurie' ? 'Pollakiurie (' + diurnes + ' mictions diurnes, seuil 8)' :
				freq === 'rares' ? 'Mictions rares (' + diurnes + ', seuil 3)' : 'Fréquence normale (' + diurnes + ', normale de 3 à 8)' ),
				diurnes === null ? 'cm-neutre' : ( freq === 'normale' ? 'cm-ok' : 'cm-alerte' ) );

			var cap = vmax === null ? null : ( vmax < petite ? 'petite' : ( vmax > grande ? 'grande' : 'normale' ) );
			h += ligne( 'Capacité (volume maximal hors première miction)', vmax === null ? 'Non renseignée' :
				( cap === 'petite' ? 'Petite capacité : ' + vmax + ' millilitres, soit ' + Math.round( 100 * vmax / ebc ) + ' pour cent de la capacité attendue' :
				cap === 'grande' ? 'Grande capacité : ' + vmax + ' millilitres, soit ' + Math.round( 100 * vmax / ebc ) + ' pour cent' :
				'Capacité normale : ' + vmax + ' millilitres, soit ' + Math.round( 100 * vmax / ebc ) + ' pour cent' ),
				vmax === null ? 'cm-neutre' : ( cap === 'normale' ? 'cm-ok' : 'cm-alerte' ) );

			var resOk = premiere === null ? null : premiere >= reservoir;
			h += ligne( 'Réservoir (première miction du matin)', premiere === null ? 'Non renseignée' :
				( resOk ? 'Réservoir normal : ' + premiere + ' millilitres, soit ' + Math.round( 100 * premiere / ebc ) + ' pour cent de la capacité attendue' :
				'Première miction petite : ' + premiere + ' millilitres, soit ' + Math.round( 100 * premiere / ebc ) + ' pour cent. Capacité réduite ou miction nocturne non notée à vérifier' ),
				premiere === null ? 'cm-neutre' : ( resOk ? 'cm-ok' : 'cm-alerte' ) );

			if ( diurnes !== null && diurese !== null && premiere !== null && diurnes + nocturnes > 1 ) {
				var moy = ( diurese - premiere ) / ( diurnes + nocturnes - 1 );
				h += ligne( 'Volume moyen des autres mictions', ml( moy ) + ', soit ' + Math.round( 100 * moy / ebc ) + ' pour cent de la capacité attendue' +
					( moy / ebc < 0.5 ? ' (critère de pollakiurie extraordinaire : inférieur à 50 pour cent, typiquement 10 à 15)' : '' ), 'cm-neutre' );
			}

			h += ligne( 'Nuit', nocturnes > 0 ? nocturnes + ' miction(s) nocturne(s) : contre la pollakiurie extraordinaire' : 'Nuit calme', nocturnes > 0 ? 'cm-alerte' : 'cm-ok' );
			h += ligne( 'Fuites et urgenturies', ( fuites > 0 || urgences > 0 ) ?
				fuites + ' fuite(s), ' + urgences + ' urgenturie(s) : oriente vers la vessie hyperactive' : 'Aucune', ( fuites > 0 || urgences > 0 ) ? 'cm-alerte' : 'cm-ok' );

			if ( boissons !== null ) {
				h += ligne( 'Boissons', boissons + ' millilitres' + ( diurese !== null && boissons < diurese ? ' : apports inférieurs à la diurèse, recueil des boissons probablement incomplet' :
					( boissons < 30 * poids ? ' : apports faibles, restriction que l\'enfant s\'impose souvent' : '' ) ), 'cm-neutre' );
			}

			var resAnormal = residu !== null && ( residu > 20 || residu > residu15 );
			h += ligne( 'Résidu post-mictionnel', residu === null ? 'Non mesuré' :
				( resAnormal ? residu + ' millilitres : résidu anormal, débitmétrie avec électromyographie avant toute conclusion (dysfonction mictionnelle ou vessie hypoactive)' : residu + ' millilitres : résidu normal' ),
				residu === null ? 'cm-neutre' : ( resAnormal ? 'cm-alerte' : 'cm-ok' ) );

			h += ligne( 'Transit', constip ? 'Constipation probable : traiter en priorité, relire le journal urinaire après 4 à 6 semaines' : 'Sans signe d\'alerte', constip ? 'cm-alerte' : 'cm-ok' );
			h += ligne( 'Bandelette', bandelette ? 'Normale' : 'Anormale : examen cytobactériologique des urines avant toute lecture fonctionnelle', bandelette ? 'cm-ok' : 'cm-alerte' );
			h += '</table>';

			var profil;
			if ( diurnes === null ) {
				profil = 'Renseigner le nombre de mictions diurnes pour obtenir un profil.';
			} else if ( !bandelette ) {
				profil = 'Bandelette anormale : traiter ou écarter l\'infection avant d\'interpréter le journal.';
			} else if ( estPolyurie ) {
				profil = 'Polyurie : à explorer avant toute lecture vésicale (diabète sucré, diabète insipide, potomanie).';
			} else if ( resAnormal ) {
				profil = 'Vidange incomplète probable (dysfonction mictionnelle ou vessie hypoactive) : échographie puis débitmétrie avec électromyographie avant toute conclusion.';
			} else if ( freq === 'pollakiurie' && ( fuites > 0 || urgences > 0 ) ) {
				profil = 'Vessie hyperactive probable (phase de remplissage) : urothérapie, échographie avec résidu, anticholinergique seulement en cas d\'échec.';
			} else if ( freq === 'rares' && cap === 'grande' ) {
				profil = 'Miction différée probable : mictions programmées, apports normalisés.';
			} else if ( freq === 'pollakiurie' && resOk === true && fuites === 0 && nocturnes === 0 ) {
				profil = 'Pollakiurie extraordinaire probable' + ( residu === null ? ' (à confirmer par un résidu nul à l\'échographie si doute)' : '' ) + ' : rassurer, urothérapie, revoir à 3 mois.' +
					( constip ? ' Traiter d\'abord la constipation.' : '' );
			} else if ( freq === 'pollakiurie' && resOk === null ) {
				profil = 'Pollakiurie sans fuite : renseigner la première miction du matin pour distinguer pollakiurie extraordinaire et petite capacité.';
			} else {
				profil = 'Profil intermédiaire : lire la grille de tri et confronter au résidu.' + ( constip ? ' Traiter d\'abord la constipation et relire le journal à 4 à 6 semaines.' : '' );
			}
			h += '<div class="cm-profil"><strong>Profil dominant :</strong> ' + profil + '</div>';
			out.innerHTML = h;
		}

		root.querySelectorAll( 'input' ).forEach( function ( i ) { i.addEventListener( 'input', calculer ); } );
		calculer();
	}

	mw.hook( 'wikipage.content' ).add( init );
}() );