DEFAUT["prematurite"] = "0j"
DEFAUT["agecorrige"] = "oui"
+#repere = {"typed": "age", "donnee": "", "texte": ""}
+DEFAUT["liste_reperes"] = []
+DEFAUT["nb_reperes_mini"] = 3 # Nombre minimum de lignes de repères
# initialiser la config
def config_init():
-"Version 2.4","29/06/2021","<p>Plus de courbes ! Et autres...
+"Version 2.45","29/06/2021","<p>Plus de courbes ! Et autres...
<ul>
<li>On peut désormais personnaliser la couleur et le symbol de la courbe (principale).</li>
<li>Les dates sont maintenant exportées et importées. C'est plus sympa pour la lecture (pour le calcul, la donnée en âge l'emporte).</li>
<li>Une version de l'appli est incluse dans le fichier de sauvegarde. On affiche un petit message si la version du fichier importé est inférieure à celle du site, mais normalement tout reste compatible. Si vous voulez la toute dernière version, il suffit de ré-enregistrer vos données, tout simplement.</li>
-<li>Normalement on peut saisir les dates au format aaaa/mm/dd si on est en mode "texte" pour plus de cohérence avec l'affichage "confortable".</li>
+<li>Il est possible de tracer des repères sur les courbes (lignes verticales à un âge donné). Ces repères sont sauvegardés (et vous pouvez décocher le ""tracer"" afin de les sauvegarder sans les tracer).</li>
+<li>Normalement on peut saisir les dates au format aaaa/mm/dd si on est en mode ""texte"" pour plus de cohérence avec l'affichage ""confortable"".</li>
<li>Courbes de plusieurs enfants :
<ul>
<li>Les données et la configuration sont celles de l'enfant qu'on a saisi en ""principal""</li>
configuration["non_sauve"]["calculextratemps_trace"] = gere_checkbox(data.get("calculextratemps_trace"))
+ ### Gestion des repères additionnels
+ configuration["liste_reperes"] = []
+ i=0
+ while "repere_texte_"+str(i) in data: # Tant qu'il y a des trucs définis
+ debug("Repère trouvé", liste_err)
+ age=data.get("repere_age_"+str(i), "")
+ trace=gere_checkbox(data.get("repere_trace_"+str(i), ""))
+ if age !="":
+ agec=convertit_jours_vers_python(age, liste_err)
+ texte = data.get("repere_texte_"+str(i), "") # Même si le texte est vide, osef
+ configuration["liste_reperes"].append({"typed": "age", "donnee": agec, "texte": texte, "trace": trace})
+ i+=1
+
return configuration
# gérer l'age maxi
gros_dico["maxi"] = convertit_age_vers_texte(gros_dico["maxi"])
+ # Gérer les repères
+ for i in range(len(gros_dico["liste_reperes"])):
+ gros_dico["liste_reperes"][i]["donnee"] = convertit_age_vers_texte(gros_dico["liste_reperes"][i]["donnee"])
# gérer les couleurs
for clecouleur in DEFAUT["couleurs"]:
gros_dico["couleurs"][clecouleur] = tuple_vers_rgb(gros_dico["couleurs"][clecouleur])
var cellpoids = ligne.insertCell(2);
var celltaille = ligne.insertCell(3);
- cellage.innerHTML = '<input type="text" name="age_'+i+'">' ;
+ cellage.innerHTML = '<input type="text" class="data" name="age_'+i+'">' ;
celldate.innerHTML = '<input name="date_'+i+'">' ;
celldate.firstChild.type = mode ;
if(mode == "text") // si on a déjà affiché les cases en mode texte, on continue en mode texte
celldate.firstChild.maxlength = taillemaxdate ;
celldate.firstChild.placeholder = placeholder_date ;
}
- cellpoids.innerHTML = '<input type="text" name="poids_'+i+'">' ;
- celltaille.innerHTML = '<input type="text" name="taille_'+i+'">' ;
+ cellpoids.innerHTML = '<input type="text" class="data" name="poids_'+i+'">' ;
+ celltaille.innerHTML = '<input type="text" class="data" name="taille_'+i+'">' ;
celltaille.classList.add("donneesplus") ;
if(deuxiemeligne.children[3].style.display == "block")
celltaille.style.display = "block" ;
var elt = document.getElementById(nom) ;
elt.value = "" ;
}
+
+function ajoute_reperes()
+{ // ajoute des repères
+ var eltul = document.getElementById("ajoutereperecourbe") ;
+ var nblignes = eltul.childElementCount ;
+// alert(nblignes) ;
+ var nb_additionnel = 2;
+ for(var i=nblignes; i<nblignes+nb_additionnel ; i++)
+ {
+ var elt = document.createElement("li") ;
+ elt.innerHTML = 'Âge : <input class="data" type="text" name="repere_age_'+i+'" value=""> Texte associé : <input class="texte" type="text" name="repere_texte_'+i+'" value="">' ;
+ eltul.appendChild(elt) ;
+ }
+
+}
#content {
padding-bottom: 70px;
}
+
+/* Taille des champs */
+.texte {
+ width:20em
+}
+
+.data {
+ width:7em
+}
{% if "version" not in valform or valform.version < CONFIG.version %}
<p class="petit">Note : La version du fichier de sauvegarde est inférieure à la version du site ({{ CONFIG.version}}), mais cela ne devrait pas générer de bug (normalement).
</p>{% elif valform.version > CONFIG.version %}
-<p class="petit">Note : la version du fichier de sauvegarde ({{ valform.version }}) est <b>supérieure</b> à la version du site ({{ CONFIG.version}}). Soit vous avez voyagé dans le futur, soit vous avez testé un fichier de sauvegarde de la version bêta sur la version normale du site, soit vous avez trifouillé le fichier de sauvegarde, soit... je ne sais pas. Il se peut qu'il y ait des bugs. Ou pas.</p>
+<p class="petit">Note : la version du fichier de sauvegarde ({{ valform.version }}) est <b>supérieure</b> à la version du site ({{ CONFIG.version}}). Vous avez probablement avez testé un fichier de sauvegarde de la version bêta sur la version normale du site. Sinon c'est que vous avez voyagé dans le temps, trifouillé le fichier de sauvegarde, ou... je ne sais pas. Il se peut qu'il y ait des bugs. Ou pas.</p>
{% endif %}
{% endif %}
<input type="reset" id="reset_donnees" value="Effacer les données du formulaire">
</div>
<ul>
-<li><label>Nom de l'enfant :</label> <input type="text" name="nom" value="{{ valform.nom }}"></li>
+<li><label>Nom de l'enfant :</label> <input type="text" class="texte" name="nom" value="{{ valform.nom }}"></li>
<li><label>Sexe :</label> <label><input type="radio" name="sexe" value="F" {%if valform.sexe == "F" %}checked{% endif %}> féminin </label>
| <label><input type="radio" name="sexe" value="M" {%if valform.sexe == "M"%} checked {% endif %}> masculin</label> | <label><input type="radio" name="sexe" value="N" {%if valform.sexe == "N"%} checked {% endif %}> neutre (expérimental)</label></li>
<li><label>Date de naissance : </label> <input type="date" name="naissance" value="{{ valform.naissance }}">
<p id="changemode" class="petit"><span onclick="change_mode_dates('text')" class="bouton">Cliquer ici</span> pour saisir les dates comme du texte.</p> </li>
<li>Prématuré ? <span class="petit">(expérimental)</span> <span class="bouton" onclick="affiche_cache('prema',this)">Afficher</span>
<div id="prema"><p class="petit">Si l'enfant est né prématuré (avant 37 semaines d'aménorrhée), indiquer de « combien » en durée (même syntaxe que pour les âges, voir plus bas). Sinon, laisser 0j.</p>
-<label>Prématurité</label> <input type="text" name="prematurite" value="{{ valform.prematurite }}"> <input type="checkbox" name="agecorrige"{% if valform.agecorrige == "oui"%} checked{%endif%}> Afficher l'âge corrigé sur la courbe (plutôt que l'âge réel).
+<label>Prématurité</label> <input type="text" class="data" name="prematurite" value="{{ valform.prematurite }}"> <input type="checkbox" name="agecorrige"{% if valform.agecorrige == "oui"%} checked{%endif%}> Afficher l'âge corrigé sur la courbe (plutôt que l'âge réel).
</div></li>
</ul>
<p class="donneesplus">Si vous ne saisissez que des données de poids par exemple, la courbe de taille ne sera pas tracée (par défaut, voir préférences du graphique).</p>
<table id="donneespoids">
- <tr><th>Âge</th><th>Date</th><th>Poids (kg ou g)</th><th class="donneesplus">Taille (cm) </th></tr>
+ <tr><th>Âge</th><th>Date</th><th>Poids</th><th class="donneesplus">Taille (cm) </th></tr>
{% for i in range(valform.nb_data) %}
<tr><td>
- <input type="text" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
+ <input type="text" class="data" name="age_{{ i }}" value="{{ valform['age_'~i] }}">
</td><td><input type="date" name="date_{{ i }}" value="{{ valform['date_'~i] }}"></td>
- <td><input type="text" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td>
- <td class="donneesplus"><input type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td>
+ <td><input type="text" class="data" name="poids_{{ i }}" value="{{ valform['poids_'~i] }}"></td>
+ <td class="donneesplus"><input class="data" type="text" name="taille_{{ i }}" value="{{ valform['taille_'~i] }}"></td>
</tr>
{% endfor %}
<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" name="maxi" value="{{ valform.maxi }}"></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>Même échelle sur tous les graphiques : </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
<li><label>Grille améliorée :</label><input type="checkbox" name="grilleamelio" {% if valform.grilleamelio == 'oui' %} checked{% endif %}></li>
- <li>Dimensions du graphique : <label>largeur : </label><input type="text" name="largeur" value="{{ valform.largeur }}">
- <label>hauteur : </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li>
+ <li>Dimensions du graphique : <label>largeur : </label><input type="text" class="data" name="largeur" value="{{ valform.largeur }}">
+ <label>hauteur : </label><input type="text" class="data" name="hauteur" value="{{ valform.hauteur }}"></li>
<li><label>Légende : <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label>
<label>Position : <select name="positionlegende">
{%for (pos,posnom) in [('upper left','Haut gauche'),('upper right','Haut Droite'),('lower left','Bas gauche'),('lower right','Bas droite')] %}
{% endfor %}
</select>
</li>
+
+ <li>Ajouter des repères sur les courbes. <span class="bouton petit" onclick="ajoute_reperes()">Plus de repères</span>
+ <ul id="ajoutereperecourbe">
+ {% for i in range(valform.liste_reperes | length) %}
+ <li>Âge : <input class="data" type="text" name="repere_age_{{ i }}" value="{{ valform.liste_reperes[i].donnee }}">
+ Texte associé : <input class="texte" type="text" name="repere_texte_{{ i }}" value="{{ valform.liste_reperes[i].texte }}">
+ Tracer : <input type="checkbox" name="repere_trace_{{ i }}" {% if valform.liste_reperes[i].trace %} checked {% endif %}></li>
+ {% endfor %}
+ {% for j in range(valform.liste_reperes | length, valform.nb_reperes_mini) %}
+ <li>Âge : <input class="data" type="text" name="repere_age_{{ j }}" value="">
+ Texte associé : <input class="texte" type="text" name="repere_texte_{{ j }}" value="">
+ Tracer : <input type="checkbox" name="repere_trace_{{ j }}"></li>
+ {% endfor %}
+ </ul>
+
+ </li>
</ul>
<div id="extra">
<ul>
- <li>Calculer le prolongement de la courbe à partir des <input type="text" name="nbextradata" size="4" value="1"> dernières données (mettre 0 pour "toutes").</li>
+ <li>Calculer le prolongement de la courbe à partir des <input type="text" class="data" name="nbextradata" size="4" value="1"> dernières données (mettre 0 pour "toutes").</li>
<li><input type="checkbox" name="prolongercourbes">Tracer l'extrapolation sur le graphique.</li>
<li>Calculer <select name="calculextradata_type">
{% for val in CONFIG.liste_typedonnees %}
<option value="{{val}}">{{val}}</option>
{% endfor %}
- </select> à l'âge <input type="text" name="calculextradata_age" value="6m">
+ </select> à l'âge <input type="text" class="data" name="calculextradata_age" value="6m">
<input type="checkbox" name="calculextradata_trace"> ... et le voir sur le graphique.</li>
- <li>Calculer l'âge auquel l'enfant aura <input type="text" name="calculextratemps_val">
+ <li>Calculer l'âge auquel l'enfant aura <input type="text" class="data" name="calculextratemps_val">
<select name="calculextratemps_type">
<option value="">Choisir la donnée</option>
{% for val in CONFIG.liste_typedonnees %}
liste_extracalculs
Les enfants en plus sont dans la liste enfants_add. Pour chaque item de la liste, il faut prendre
- item[typed] pour avoir accès au nom, ljours, et ldonnees"""
+ item[typed] pour avoir accès au nom, ljours, et ldonnees
+
+ """
debug("debut de cree_figure. Config : "+str(conf)+". Nombre d'enfants additionnels : "+str(len(enfants_add)),liste_err)
try:
liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err)
else:
titre+=" (courbe en âge réel, données OMS décalées)"
- print("coucou")
#### extrapolatios éventuelles
# a-t-on demndé des calculs ?
jextrapole = conf["non_sauve"]["prolongercourbes"] == "oui"
poids_max = poids_max * 1.05
+ ### Repères additionnels éventuels.
+ #reperes est une liste qui contient des dictionnaires avec "typed" (type de donnée : âge, etc), "donnee" :
+ #la donnée (en jours pour l'âge), et "texte": le texte à mettre sur le repère en question.
+ #Pour tracer des repères verticaux (horizontaux plus tard) sur la courbe.
+ for rep in conf["liste_reperes"]:
+ if rep.get("trace", "") == "oui": # SI on veut tracer
+ agec = u.convertitunite(rep["donnee"], unite, liste_err)
+ # Tracé de la ligne verticale
+ ax.vlines(agec, poids_min, poids_max, linestyles="dashed", color=conf["couleurs"]["cadretxt"])
+ # Tracé éventuel du texte
+ if rep["texte"] != "":
+ ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"])
+
+
+
+
+
# Grille custom ?
if conf["non_sauve"]["grilleamelio"] == "oui":
debug("On a choisi la grille plus jolie", liste_err)