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.
/* ============================================================
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 );
}() );