Applications client

Licence Informatique 1ère année

Jean-Marc Lecarpentier

Enseignement des technologies du Web

 

Travail personnel

Notes de cours

Exercice 1 — Compteur de calories #

Attention : cet exercice sera continué lors du prochain TP et sera noté sur 10.

Cet exercice fait partie de ceux qui seront évalués. La page doit être accessible et fonctionnelle à l'URL suivante :

https://dev-LOGIN.users.info.unicaen.fr/TW2-2025/TP07/ex1/compteur.html
(en remplaçant LOGIN par votre nom de login). Pensez à vérifier la validité W3C de votre page !

D'autre part, l'élément head doit contenir le code suivant :

<meta name="author" content="LOGINS" />
en remplaçant LOGINS par les noms de login des étudiant·e·s qui ont travaillé sur cette page, séparés par des virgules. (Il faut laisser name="author" tel quel, par contre !) Par exemple, si dupont210 et durand212 ont travaillé ensemble, ils mettent <meta name="author" content="dupont210,durand212" /> dans le head de leur page. Ça permettra à notre script de savoir qui a travaillé avec qui. Attention, le travail en binôme est réservé aux cas où il n'y a pas assez de machines disponibles.

Il est conseillé de vérifier que l'exercice a été correctement rendu en utilisant l'application evalweb.

Vous avez jusqu'au début du TP de la semaine suivante pour terminer l'exercice.

Le but final est de réaliser une version basique d'application de gestion de menu avec compteur de calories, comme on peut en trouver dans les sites ou applications de bien-être ou santé.

La première partie concerne le compteur de calories pour un repas. La deuxième partie (prochain TP) sera la réalisation du créateur de menu.

Notre compteur utilise une liste d'ingrédients exportée de la table de composition nutritionnelle des aliments Ciqual disponible sur le site de données publiques https://www.data.gouv.fr. Pour simplifier, les catégories ont été réduites à un seul niveau (au lieu de 3) et les valeurs de type < 0,05 ont été mises à 0.

L'objectif de cette première partie est d'avoir un compteur de calorie pour un repas comme illustré ci-dessous :

Exemple de compteur
Exemple de compteur

Format des données

Les fichiers categories.js et ingredients.js fournissent la liste des catégories et les plats ou ingrédients de chaque catégorie.

Chaque fichier contient les données dans un objet JavaScript, respectivement avec les variables categories et ingredients.

Une catégorie est représentée par un objet qui contient son intitulé et un identifiant :

{
    "categorie": "Entrées et plats composés",
    "id": "cat_2487"
}

Chaque ingrédient est défini par un objet contenant son identifiant, l'identifiant de la catégorie auquel il appartient, son nom, sa valeur énergétique en kCal pour 100g et les quantités (en g) de protéines, glucides, lipides et sucres, par exemple :

{
    "id":"item_58293648",
    "categorie":"cat_2487",
    "ingredient":"Taboul\u00e9 ou Salade de couscous, pr\u00e9emball\u00e9",
    "energie":179,
    "proteines":4,
    "glucides":23,
    "lipides":6,
    "sucres":4
}

Les caractères accentués ont été encodés en UTF-8 par le script d'export de la base Ciqual.

Partie 1 : chargement des catégories

Télécharger l'archive de l'exercice, l'extraire et installer le tout dans le bon dossier pour le TP.

Le formulaire de choix d'ingrédient contient 2 éléments fieldset. Au chargement de la page, le premier (à gauche) doit être rempli avec les catégories qui sont fournies par la liste contenue dans la variable categories du fichier categories.js.

Affichage des catégories
Affichage des catégories

Écrire la fonction afficheCategories() qui affiche la liste des catégories. Pour pouvoir ensuite afficher la liste des ingrédients correspondants, il faudra avoir l'identifiant de la catégorie. Ajouter à chaque item un attribut data-categorie-id en utilisant la propriété dataset des éléments.

Chaque item de la liste doit capter le clic et appeler la fonction makeSelectIngredients. Pour commencer, cette fonction fera simplement un console.log de l'identifiant de la catégorie cliquée.

Partie 2 : chargement des ingrédients

Compléter la fonction makeSelectIngredients, qui va remplir l'élément select d'identifiant select-ingredients. Il faut donc y ajouter des éléments <option> avec pour attribut value l'identifiant de l'ingrédient.
Voir la documentation sur <select>

Indication : pour avoir les ingrédients d'une catégorie donnée, il faut prendre tous les éléments de la liste ingredients qui correspondent à l'identifiant de la catégorie voulue. Pour cela, on pourra utiliser la méthode filter des tableaux.

Attention : penser à enlever les ingrédients déjà présents dans le select (i.e. enlever tous ses fils sauf le premier) avant d'y ajouter ceux de la catégorie cliquée. Sinon les ingrédients continuent de s'ajouter au select quand on clique sur des catégories. Attention, il faut conserver le premier élément option.

Ajouter le capteur d'évènement submit au formulaire (au chargement de la page) et créer la fonction ajouterIngredient qui commencera par bloquer la soumission du formulaire et fait un console.log de l'identifiant de l'ingrédient à ajouter.

Partie 3 : compteur

Pour pouvoir ajouter plusieurs ingrédients à un repas, on va utiliser une liste qui garde en mémoire les ingrédients ajoutés et leur poids.

Créer une variable globale listeIngredients initialisée à une liste vide.

Compléter la fonction ajouterIngredient pour :

  • ajouter à listeIngredients un élément sous la forme d'un objet du type { "item": ingredient, "poids": poids }.
  • appeler une fonction afficheRepas(liste) qui parcourt la liste donnée en argument (ici listeIngredients) et recrée le tableau d'affichage du repas comme sur le modèle ci-dessous. La première et dernière ligne contiennent des éléments th, et la CSS incluse dans la page met le tableau en forme comme sur le modèle. Indication : pour afficher le tableau, commencer par vider la division d'identifiant compteur et refaire le tableau en entier à chaque affichage. C'est aussi simple, et surtout cela sera plus pratique pour la suite du TP (partie 2).
Affichage du repas
Affichage du repas

Indication : pour retrouver l'ingrédient sélectionné dans la liste complète, on peut rechercher dans la liste en la parcourant avec un for, mais on peut aussi utiliser la méthode find() des tableaux.

Indication : pour éviter d'avoir trop de décimales dans les valeurs numériques, utiliser la méthode toFixed().

Partie 4

Il faut pouvoir commencer un nouveau repas sans avoir à recharger la page pour tout réinitialiser.

Ajouter un capteur de clic au bouton d'identifiant reset au chargement de la page. Au clic cela doit appeler la fonction raz.

Écrire la fonction raz qui réinitialise la liste listeIngredients, vide le select des ingrédients (sauf le premier élément option) et vide la division d'affichage du repas.