Amélioration de l'interface des courbes multiples + un peu de FAQ
authorDenise sur Lya <sekhmet@lya>
Tue, 13 Jul 2021 20:05:20 +0000 (22:05 +0200)
committerDenise sur Lya <sekhmet@lya>
Tue, 13 Jul 2021 20:05:20 +0000 (22:05 +0200)
app.py
configuration.py
data/FAQ_data.txt
static/outilspage.js
templates/index.html

diff --git a/app.py b/app.py
index 26c8a2bbbe3bd1e2dff2e5d5f6bb38d212aaeaf0..58754356da684ac8d44af7e01df979d6b0df74fe 100644 (file)
--- a/app.py
+++ b/app.py
@@ -56,8 +56,9 @@ def courbe_image(ext):
     liste_err = initialise_erreurs()
     data = flask.request.form
     enfants_add = [] # Enfants additionnels
-    for i in range(2, 11): 
-        if 'fichier_donnees_'+str(i) in flask.request.files: # UUn enfant à ajouter
+    i=2
+    while "couleur_donnees_"+str(i) in data: # Tant qu'il y a des données de ce type
+        if 'fichier_donnees_'+str(i) in flask.request.files: # Un enfant à ajouter
             fichier = flask.request.files["fichier_donnees_"+str(i)]
             chaine = fichier.read() # On récupère la chaîne
             if len(chaine)>=5: # Si elle a une longueur à peu près raisonnable
@@ -75,7 +76,7 @@ def courbe_image(ext):
                     coul2 = couleurs.rgb_vers_tuple(data.get("couleur_donnees_"+str(i),""),CONFIG["couleurs"]["cadretxt"],liste_err)
                     enfant2 = donnees.eclate_donnees_additionnelles(conf2, ljours2, listes_donnees2, symb2, coul2)
                     enfants_add.append(enfant2)
-            
+        i+=1
 
     # récupérer les données du formulaire proprement
     config,listes_jours,listes_donnees = donnees.web_vers_python(data,liste_err)
index f7dc1f3811d574ff7b35599b1a0d10e5ed5c69b2..0fc8f20bd15f898e228a03445f8df5b53803ce97 100644 (file)
@@ -21,6 +21,7 @@ CONFIG["extradata"] = ["calculextradata", "calculextratemps"]
 # Sous forme "item: description"
 CONFIG["liste_symboles"] = {"o": "&#x25CF;", "^": "&#x25B2;", "v": "&#x25BC;", "<": "&#x25C0;", ">": "&#x25B6;", "s": "&#x25A0;", "p": "&#11039;", "P": "&#x2795;", "x": "&times;", "D": "&#x25C6;", '$\u2665$':"&#x2665;", '$\u2217$':"&#x2217;" }
 
+CONFIG["nb_fichiers_enfants_add"] = 3 # Nombre d'enfants additionnels au départ
 
 # fichiers
 
@@ -139,6 +140,7 @@ DEFAUT["agecorrige"] = "oui"
 DEFAUT["liste_reperes"] = []
 DEFAUT["nb_reperes_mini"] = 3 # Nombre minimum de lignes de repères 
 
+
 # initialiser la config
 def config_init():
     c = DEFAUT.copy()
index d7e41c7a99366a981ee5700663b0eff401466910..cbc3a56440783763afe4a6127b9080686d59e501 100644 (file)
@@ -2,11 +2,44 @@
 
 "Utilisation","Comment sauvegarder mes données pour une prochaine fois ?","L'outil ne propose pas de sauvegarde en ligne, car il ne garde aucune donnée personnelle. Vous pouvez télécharger vos propres données (dans un format adapté) en cliquant sur «&nbsp;Télécharger les données&nbsp;». Enregistrez ce fichier quelque part. Pour les réutiliser, utilisez la partie ""Importer le fichier de données"" puis ""Charger les données"" : les champs seront alors pré-remplis et vous pourrez les modifier ou ajouter des données (par exemple une visite médicale récente avec de nouvelles données de poids ou de taille)."
 
+
 "Utilisation","Je ne comprends pas comment saisir les données !","Pour chaque donnée, vous avez le choix entre donner son âge, ou donner la date de la pesée/mesure. Si vous choisissez la date, il faut que vous ayez rempli la date de naissance (sinon l'outil ne peut pas calculer l'âge !). Pour l'âge, vous pouvez indiquer en années, mois, semaines, jours, et mélanger plusieurs unités. Par exemple 2m3j pour «&nbsp;2 mois 3 jours&nbsp;». Ne remplissez qu'un des deux champs : âge ou date. Puis saisissez le poids et/ou la taille dans la colonne de droite. Vous pouvez avoir pour un même âge plusieurs données (taille ET poids) ou n'avoir que l'un des deux.<br>
 Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour avoir plus de champs de données. Il n'y a pas de problème à laisser des champs vides, ils seront simplement ignorés."
 
+
 "Utilisation","Une erreur s'affiche en haut de ma courbe, je ne comprends pas.","Si le message d'erreur n'est pas clair pour vous, c'est qu'il est probablement dû à un souci interne. Si vous le pouvez, contactez l'administratrice, en citant le message d'erreur et en donnant les données qui ont amené à cette erreur (fichier de données, ou données saisies). Merci d'avance ! :)"
 
+"Utilisation - préférences du graphique","Pourquoi tracer des courbes vides ?","Cela peut servir à tracer une courbe de référence à imprimer pour tracer la courbe à la main. Cette option est désactivée par défaut."
+
+"Utilisation - préférences du graphique","C'est quoi la différence entre la courbe percentiles et moyenne/écarts-types ?","Ce sont deux manières de comparer son enfant à la «&nbsp;référence&nbsp;». Si vous ne savez pas la différence entre une moyenne et une médiane, retenez juste que ce sont des calculs un peu différents, mais cela ne change pas l'allure de la courbe, si votre enfant «&nbsp;suit&nbsp;» un couloir sur un type de courbe ce sera pareil sur l'autre. Vous pouvez au pire choisir celle que vous préférez. ;)
+<br>Pour les curieuses et les curieux :
+<ul>
+<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie qu'il est dans la 30e «&nbsp;tranche&nbsp;» sur 100 tranches. Autrement dit 29% des enfants sont plus légers que lui, et 70% sont plus lourds. Cela donne une idée de où il se situe par rapport aux autres. <a href=""https://fr.wikipedia.org/wiki/Centile"">Plus d'infos (maths)</a></li>
+<li>Moyenne et écart-types : la moyenne est obtenue en faisant la somme et en divisant par le nombre d'enfants. L'écart-type (noté &sigma;) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li>
+</ul>
+Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne."
+
+"Utilisation - préférences du graphique","Que signifie même échelle d'âge sur tous les graphiques&nbsp;?","Si, par exemple, vous avez des données de poids qui vont jusqu'à 2 ans et des données de taille qui vont jusqu'à 6 mois, alors chaque graphique (taille et poids) aura son échelle différente. Mais si vous cochez la case, alors tous seront sur une échelle similaire (c'est-à-dire jusqu'à 2 ans et un peu plus). Si vous saisissez un âge maximum du graphique, c'est cette limite maximum qui sera appliquée sur tous les graphiques."
+
+"Utilisation - préférences du graphique","C'est quoi la grille améliorée ?","La grille non-améliorée est plus simple et a peu de repères, la grille améliorée en a nettement plus."
+
+"Utilisation - préférences du graphique","Que sont les repères sur les courbes ?","Si vous souhaitez tracer un trait vertical sur les courbes, avec une annotation, par exemple un événement particulier que vous souhaitez mettre en valeur sur la courbe (début de diversification, apprentissage de la marche, maladie, ...). Vous pouvez en ajouter autant que vous voulez. Si vous souhaitez imprimer une courbe sans ces repères, mais sans les supprimer, il suffit de décocher le «&nbsp;Tracer&nbsp;». Ainsi les repères seront quand même enregistrés (pour une prochaine fois) mais non tracés."
+
+"Utilisation - extrapolation","C'est quoi l'extrapolation ?","À partir des données saisies, on peut calculer, en supposant que l'enfant continue à suivre une courbe, quelle sera sa taille, son poids, etc à un certain âge. On peut choisir sur combien de données on veut extrapoler. Par défaut, c'est une seule valeur : on calcule alors sur quelle ""courbe"" on se situe et on trace à partir de là, mais on peut choisir d'extrapoler à partir de plus de données (par exemple les 3 dernières valeurs, ou toutes les valeurs. Si on coche la case adaptée, la courbe sera tracée en pointillés."
+
+"Utilisation - extrapolation","Mon enfant est hors des clous, et je n'arrive pas à avoir l'extrapolation !","Une solution possible est de passer en courbe des moyennes/écarts-types. Les données OMS pour les percentiles vont un peu moins loin."
+
+"Utilisation - extrapolation","Quels calculs peut-on faire ?","On peut faire des calculs dans deux sens : calculer le poids (ou la taille, ou autre) à un âge donné, ou l'inverse, à quel âge l'enfant aura tel poids (ou taille, etc). Les résultats s'afficheront en bas des courbes. On peut demander plusieurs calculs de ce genre, ils s'ajouteront à ceux déjà présents. Ces calculs ne sont pas sauvegardés par contre."
+
+"Utilisation - extrapolation","Mais ça marche comment l'extrapolation en détail, dis dis ?","Mathophobes s'asbtenir !<br> 
+Pour chaque donnée concernée (utilisée pour l'extrapolation), on calcule entre quelles courbes OMS on se situe. Il y a plus de courbes dans les données de l'OMS que de courbes tracées donc c'est plus précis que le graphique ne le laisse voir. <br>
+Si on trouve que la donnée se situe entre les courbes 5 et 6 (par exemple), on calcule alors le barycentre par rapport aux courbes 5 et 6 : par exemple la donnée est à 20% de la courbe 5 et à 80% de la courbe 6 (donc plutôt proche de la courbe 6). Les données extrapolées seront donc basées sur 20% de la courbe 5 et 80% de la courbe 6.<br>
+S'il y a plusieurs données, alors on cherche dans quel intervalle de courbes elles se situent (par exemple toutes les données sont entre les courbes 3 et 6), puis on calcule la moyenne des barycentres par rapport aux courbes 3 et 6, et on obtient les valeurs suivantes en se basant sur cette moyenne.
+<br>(Si vous avez un meilleur algo je prends, en attendant, ce truc marche)"
+
+"Utilisation - courbes multiples","C'est quoi les courbes multiples&nbsp;?","Vous pouvez souhaiter tracer sur une même courbe de poids (par exemple) l'évolution du poids de deux (ou plus) enfants, du même âge ou d'âges différents. Pour cela, il faut avoir déjà sous forme de fichier les données des enfants additionnels. Seuls le nom de l'enfant et ses données sont extraites, les paramètres du graphiques seront ceux définis plus haut (donc pour l'enfant «&nbsp;principal&nbsp;»). C'est pourquoi vous pouvez choisir un symbole et une couleur pour chacun des graphiques additionnels. Par contre ces paramètres ne sont pas sauvegardés (seuls ceux de l'enfant «&nbsp;principal&nbsp;» le sont)."
+
+
 "Courbe","À quoi sert ce site ?","Il sert à tracer les courbes de croissance des bébés et jeunes enfants en fonction de leur âge, comme sur le carnet de santé, et la compare aux courbes de références de l'Organisation Mondiale de la Santé. Ces courbes sont a priori prévues pour des enfants nés à terme en bonne santé. Pour un enfant prématuré ou à situation particulière, référez vous à un.e professionnel.le de santé."
 
 "Courbe","Pourquoi des courbes OMS et pas des courbes françaises ?","Les particularités de ces données sont les suivantes : bébés et enfants choisis dans différents pays du monde (et non dans un seul pays), dans des familles raisonnablement aisées (pour éviter les problèmes liés à la malnutrition), et des bébés allaités. Plus d'infos <a href=""https://www.who.int/childgrowth/standards/technical_report/en/"">ici</a> (en anglais). Les courbes du carnet de santé français récent (si vous avez celles datant d'avant 2018, elles sont un peu anciennes par contre) sont basées sur un échantillon assez large de bébés français, allaités ou non (et donc peu allaités en proportion). Il y a quelques différences entre les bébés allaités et non allaités, surtout dans les 6-8 premiers mois : si votre bébé est allaité, cela vaut le coup de regarder ce que donne la courbe OMS par rapport à celle du carnet."
@@ -19,17 +52,9 @@ Si vous manquez de lignes, vous pouvez cliquer sur ""Ajouter des lignes"" pour a
 "Courbe","Que faire pour un enfant prématuré ?","Si votre enfant est né prématurément (c'est-à-dire avant 37 semaines d'aménorrhée), on a dû vous fournir des courbes de référence pour le début de sa vie. Ensuite, une fois que l'enfant a atteint son ""terme"", il est possible d'utiliser les courbes de références normales <em>en âge corrigé</em>. C'est possible dans cet outil, il suffit d'indiquer de ""combien"" l'enfant est prématuré. Puis on peut cocher ou pas « afficher en âge corrigé » : l'affichage des courbes sera le même (courbes de référence décalées pour correspondre à l'âge corrigé), mais dans un des cas l'affichage des âge sera l'âge corrigé, dans l'autre l'âge réel de l'enfant.<br>
 Dans tous les cas, gardez en tête que la courbe de référence peut ne pas être pertinente, et en cas de doute référez-vous au/à la professionnel(le) de santé qui suit votre enfant."
 
-"Courbe","Pourquoi une courbe de «&nbsp;neutre&nbsp;» ? Et c'est quoi ?","Pourquoi pas ? C'est simplement une courbe moyennée des courbes garçon/fille. Ce n'est absolument pas une vraie référence, mais ça ne coûtait rien d'essayer. Je n'ai aucune connaissance dans les données de croissance des enfants intersexes, et s'il existe pour ces enfants des courbes de référence, peut-être que celle-ci aurait du sens, peut-être pas. Elle permet accessoirement de générer une courbe «&nbsp;acceptable&nbsp;» même si on n'a pas spécifié sexe masculin/féminin. Au pire vous pouvez considérer que c'est une «&nbsp;courbe jouet&nbsp;»."
+"Courbe","Pourquoi une courbe de «&nbsp;neutre&nbsp;» ? Et c'est quoi ?","C'est simplement une courbe moyennée des courbes garçon/fille. Ce n'est absolument pas une vraie référence, mais ça ne coûtait rien d'essayer. Elle peut servir de référence acceptable pour deux courbes d'enfants de sexe différent. Je n'ai aucune connaissance dans les données de croissance des enfants intersexes, et s'il existe pour ces enfants des courbes de référence, peut-être que celle-ci aurait du sens, peut-être pas. Vous pouvez considérer que c'est une «&nbsp;courbe jouet&nbsp;»."
 
 
-"Courbe","C'est quoi la différence entre la courbe percentiles et moyenne/écarts-types ?","Ce sont deux manières de comparer son enfant à la «&nbsp;référence&nbsp;». Si vous ne savez pas la différence entre une moyenne et une médiane, retenez juste que ce sont des calculs un peu différents, mais cela ne change pas l'allure de la courbe, si votre enfant «&nbsp;suit&nbsp;» un couloir sur un type de courbe ce sera pareil sur l'autre. Vous pouvez au pire choisir celle que vous préférez. ;)
-<br>Pour les curieuses et les curieux :
-<ul>
-<li>Médiane et percentiles : si votre enfant est (par exemple) au 30e percentile, cela signifie qu'il est dans la 30e «&nbsp;tranche&nbsp;» sur 100 tranches. Autrement dit 29% des enfants sont plus légers que lui, et 70% sont plus lourds. Cela donne une idée de où il se situe par rapport aux autres. <a href=""https://fr.wikipedia.org/wiki/Centile"">Plus d'infos (maths)</a></li>
-<li>Moyenne et écart-types : la moyenne est obtenue en faisant la somme et en divisant par le nombre d'enfants. L'écart-type (noté &sigma;) est une sorte d'«&nbsp;écart moyen&nbsp;» à la moyenne. On regarde donc généralement la moyenne, la moyenne + 1&sigma;, moyenne +2&sigma;, moyenne -1 &sigma;, etc. <a href=""https://fr.wikipedia.org/wiki/%C3%89cart_type"">Plus d'infos (maths)</a></li>
-</ul>
-Si la répartition des données est «&nbsp;bonne&nbsp;» (on parle de gaussienne entre matheuses et matheux), alors la moyenne correspond à la médiane, la moyenne + 1&sigma; correspond environ au 84e percentile, la moyenne -1&sigma; correspond au 16e percentile. Pour ces données, il semble que ce soit assez proche d'une gaussienne."
-
 "Courbe de poids","Mon enfant doit-il être dans la moyenne ?","Il y a des petits bébés, des gros bébés, des bébés moyens. En général, un bébé en bonne santé ""suit"" un couloir de courbe, que ce soit la courbe des «&nbsp;bébés crevettes&nbsp;» ou des «&nbsp;bébés dodus&nbsp;». Un changement de couloir (poids en baisse le plus souvent) peut éventuellement être signe d'un problème. Ou pas. Dans tous les cas, référez vous à des professionnels de santé et/ou de la petite enfance."
 
 "Courbe de poids","Pourquoi faire des courbes de référence différenciées selon le sexe ?","Il se trouve que l'évolution de poids diffère selon ce critère. S'il s'agissait d'une simple différence de poids en moyenne, une courbe mixte serait adaptée (puisqu'on s'intéresse à l'allure de la courbe et non au poids absolu), mais les courbes sont légèrement différentes.<br>
@@ -37,18 +62,6 @@ Vous trouverez <a href=""static/courbe_oms_gf_1an.png"">ici</a> et <a href=""sta
 
 "Courbe de taille","Pourquoi une cassure à 2 ans pour la taille ?","Quand on mesure un enfant, il y a environ 1cm de différence entre la mesure allongée (pour les bébés) et la mesure debout (pour les enfants). Dans ses données, l'OMS a choisi de mesurer les enfants de moins de deux ans allongés, et ensuite debout. Donc à partir de 2 ans on observe une petite cassure, qui est simplement due au fait qu'on a mesuré à partir de là les enfants debout (et non, ils n'ont pas rétréci !). Si votre enfant a été mesuré debout avant 2 ans, ou allongé après, vous pouvez ajuster d'environ 1cm pour comparer aux courbes de référence."
 
-"Utilisation avancée","C'est quoi l'extrapolation ?","À partir des données saisies, on peut calculer, en supposant que l'enfant continue à suivre une courbe, quelle sera sa taille, son poids, etc à un certain âge. On peut choisir sur combien de données on veut extrapoler. Par défaut, c'est une seule valeur : on calcule alors sur quelle ""courbe"" on se situe et on trace à partir de là, mais on peut choisir d'extrapoler à partir de plus de données (par exemple les 3 dernières valeurs, ou toutes les valeurs. Si on coche la case adaptée, la courbe sera tracée en pointillés."
-
-"Utilisation avancée","Mon enfant est hors des clous, et je n'arrive pas à avoir l'extrapolation !","Une solution possible est de passer en courbe des moyennes/écarts-types. Les données OMS pour les percentiles vont un peu moins loin."
-
-"Utilisation avancée","Quels calculs peut-on faire ?","On peut faire des calculs dans deux sens : calculer le poids (ou la taille, ou autre) à un âge donné, ou l'inverse, à quel âge l'enfant aura tel poids (ou taille, etc). Les résultats s'afficheront en bas des courbes. On peut demander plusieurs calculs de ce genre, ils s'ajouteront à ceux déjà présents. Ces calculs ne sont pas sauvegardés par contre."
-
-"Utilisation avancée","Mais ça marche comment l'extrapolation en détail, dis dis ?","Mathophobes s'asbtenir !<br> 
-Pour chaque donnée concernée (utilisée pour l'extrapolation), on calcule entre quelles courbes OMS on se situe. Il y a plus de courbes dans les données de l'OMS que de courbes tracées donc c'est plus précis que le graphique ne le laisse voir. <br>
-Si on trouve que la donnée se situe entre les courbes 5 et 6 (par exemple), on calcule alors le barycentre par rapport aux courbes 5 et 6 : par exemple la donnée est à 20% de la courbe 5 et à 80% de la courbe 6 (donc plutôt proche de la courbe 6). Les données extrapolées seront donc basées sur 20% de la courbe 5 et 80% de la courbe 6.<br>
-S'il y a plusieurs données, alors on cherche dans quel intervalle de courbes elles se situent (par exemple toutes les données sont entre les courbes 3 et 6), puis on calcule la moyenne des barycentres par rapport aux courbes 3 et 6, et on obtient les valeurs suivantes en se basant sur cette moyenne.
-<br>(Si vous avez un meilleur algo je prends, en attendant, ce truc marche)"
-
 
 
 "Divers","Pourquoi cet outil ?","Tout a commencé sur le <a href=""https://forum.lllfrance.org/"">forum de La Leche League</a>, où de nombreuses mamans (et parfois quelques papas) viennent poser des questions sur l'allaitement. Souvent, se pose la question de la prise de poids du bébé, qui est un bon indicateur de si le bébé reçoit assez de lait. Le poids dans l'absolu étant peu pertinent, il est utile de «&nbsp;tracer&nbsp;» la courbe de poids. Il n'existe actuellement que peu d'outils qui permettent de le faire (l'OMS en fournit un qui ne fonctionne que sous windows), en voici un."
index 5d1fc4165d75b61b627ebdfe819fdfad94531e10..7c995f161101c653aac67e85c15a5578293e9fd4 100644 (file)
@@ -145,16 +145,36 @@ function change_mode_dates(mode)
        }
 }
 
-function revele_enfants()
+function ajoute_enfants()
 {
-       // révèle tous les champs pour enfants additionnels
-       var listelt = document.getElementsByClassName("enfants_cache_def") ;
-       for(i=0; i<listelt.length; i++) {
-               listelt[i].style.display = "block" ;
-       }
-       // Enlève le bouton pour les afficher
-       var bouton = document.getElementById("reveleenfants") ;
-       bouton.style.display = "none" ;
+       var eltul = document.getElementById("liste_enfants_add") ;
+       var nblignes = eltul.childElementCount ;
+       var elt1 = eltul.children[0] ;
+       //alert(elt1.innerHTML) ;
+       var texte = elt1.innerHTML ; 
+       // Il faut remplacer les nblignes 2 par des nblignes +2
+       texte = texte.replace("fichier_donnees_"+(2), "fichier_donnees_"+(nblignes +2)) ;
+       texte = texte.replace("fichier_donnees_"+(2), "fichier_donnees_"+(nblignes +2)) ;
+       texte = texte.replace("fichier_donnees_"+(2), "fichier_donnees_"+(nblignes +2)) ;
+       texte = texte.replace("symbole_donnees_"+(2), "symbole_donnees_"+(nblignes +2)) ;
+       texte = texte.replace("couleur_donnees_"+(2), "couleur_donnees_"+(nblignes +2)) ;
+
+       // Enlever le "selected"
+       texte = texte.replace("selected", "") ;
+
+       var elt2 = document.createElement("li") ;
+       elt2.innerHTML = texte ;
+
+       // remettre le "selected" au bon endroit
+       var options = elt2.getElementsByTagName("option") ;
+       // Trouver le nblignes-ième élément
+       var numero = (nblignes +1) % options.length ;
+       //Sélectionner l'élément en question
+       var monoption = options[numero] ;
+       monoption.setAttribute("selected", true) ;
+
+       eltul.appendChild(elt2) ;
+
 }
 
 function vide_champ(nom) 
index abd1a1305eedac5170592061607bdcd6e2f5c76b..9477dd933a36f9117eef7e07c95eae5f70536b56 100644 (file)
                        <option value="{{ unite }}"{% if valform.unite == unite %} selected {% endif %} >{{ unite }}</option>
        {% endfor %}
                </select></label></li>
-       <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" class="data" name="maxi" value="{{ valform.maxi }}"></li>
+       <li><label>Âge maximum du graphique (facultatif) </label><input type="text" class="data" name="maxi" value="{{ valform.maxi }}"></li>
        
-       <li><label>Même échelle sur tous les graphiques&nbsp;: </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
+       <li><label>Même échelle d'âge sur tous les graphiques&nbsp;: </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
        <li><label>Grille améliorée&nbsp;:</label><input type="checkbox" name="grilleamelio" {% if valform.grilleamelio == 'oui' %} checked{% endif %}></li>
        
        <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" class="data" name="largeur" value="{{ valform.largeur }}"> 
 
 <div id="multi">
        <p>Si vous souhaitez tracer sur le même graphique les courbes de différents enfants, c'est ici. Il faut importer le fichier de données additionnel de l'autre enfant (ou des autres enfants). Seul le nom de l'enfant et ses données seront utilisés, les autres paramètres (courbe de référence suivant le sexe, maximum du graphique, ...) seront ceux de l'enfant «&nbsp;principal&nbsp;».</p>
-  <ul>
-         {% for numero_enfant in (2, 3, 4, 5, 6, 7, 8, 9, 10) %}
-  <li {% if numero_enfant>4 %} class="enfants_cache_def"{% endif %}><input type="file" name="fichier_donnees_{{ numero_enfant }}" id="fichier_donnees_{{ numero_enfant }}"> <span class="bouton petit" onclick="vide_champ('fichier_donnees_{{ numero_enfant }}')">Enlever ce fichier</span> | 
+  <ul id="liste_enfants_add">{% for numero_enfant in range(2, CONFIG.nb_fichiers_enfants_add+2) %}
+         <li><input type="file" name="fichier_donnees_{{ numero_enfant }}" id="fichier_donnees_{{ numero_enfant }}"> <span class="bouton petit" onclick="vide_champ('fichier_donnees_{{ numero_enfant }}')">Enlever ce fichier</span> | 
   Symbole&nbsp;: <select name="symbole_donnees_{{ numero_enfant }}"> 
        {% for symb in CONFIG.liste_symboles %}
        <option value="{{ symb }}" {% if numero_enfant == loop.index  %} selected{% endif %}>{{ CONFIG.liste_symboles[symb] | safe}}</option>
        {% endfor %}
   </select> | 
-  Couleur&nbsp;: <input type="color" name="couleur_donnees_{{ numero_enfant }}" value="{{ valform.couleurs.cadretxt }}">
-  </li>
-          {% endfor %}
+  Couleur&nbsp;: <input type="color" name="couleur_donnees_{{ numero_enfant }}" value="{{ valform.couleurs.cadretxt }}"></li>{% endfor %}
   </ul>
-  <p class="bouton" onclick="revele_enfants()" id="reveleenfants">Plus d'enfants O_o</p>
+  <p class="bouton" onclick="ajoute_enfants()" id="reveleenfants">Plus d'enfants O_o</p>
 </div>