Contenu du cours
Projet TodoList
Programmer une Todo list (liste de choses à faire) en Javascript est un excellent exercice d'apprentissage. Une Todo list couvre différents aspects et concepts que l'on retrouvera dans la majorité des projets web : Manipulation d'objets Javscript, du DOM HTML et du CSSOM, formulaire, changement d'états, animation, etc. Dans cette section, nous allons réaliser plusieurs versions d'une Todo list, en démarrant avec une version simple que nous ferons évoluer en ajoutant des fonctionnalités.
0/13
Introduction au Javascript

On y est presque ! Un dernier effort.

La propriété Window.localStorage permet d’accéder à un objet local Storage.

Cet objet permet de stocker des données de type String dans le navigateur qui seront conservées lorsque le navigateur ou l’onglet est fermé.

LocalStorage permet de stocker uniquement des données String… Mais notre application manipule des objets !

On va donc devoir convertir nos objets au format String d’une part pour les sauvegarder.
Puis convertir les String stockées en objet Todo et Item pour pouvoir rétablir nos listes.

  • Dans votre projet VSCode, dupliquer le répertoire v9-controls et nommer le v10-local-storage
  • Dans le nouveau répertoire v10-local-storage :
    • Remplacer le code du fichier index.html avec celui-ci
    • Renommer le fichier v9-controls.js en v10-local-storage.js

Sauvegarde des listes

Comme notre application possède une interface découplée, on va pouvoir sauvegarder uniquement nos objets Todo et Item.

Même si sauvegarder les instances de ToDoDom pourrait paraitre plus simple, en réalité cela complexifierait le développement d’autres fonctionnalités, comme notamment le undo/redo, la synchronisation de nos listes avec une base de données, une autre interface utilisant une autre technologie que HTML/CSS, etc.

Sauvegarder uniquement les données, puis reconstruire l’interface au chargement de celles-ci, c’est the way to go.

Pour sauvegarder nos listes, créons une propriété statique lists, de type tableau, dans la classe ToDoDom.

À chaque création d’un objet ToDoDom, nous ajouterons l’objet ToDo dans le tableau lists, puis nous appellerons une fonction de sauvegarde save :

class ToDoDom {

    static count = 0;

    static lists = [];

    constructor(todo) {

        ...

        ToDoDom.lists.push(this.todo);

        this.save();
    }

    save() {
        localStorage.setItem("lists", JSON.stringify(ToDoDom.lists));
    }

    ...
}
  • La fonction JSON.stringify(ToDoDom.lists) va transformer notre tableau d’objets ToDo lists en String au format JSON
  • La fonction localStorage.setItem va sauvegarder cette String dans l’objet local

Désormais, si vous créez des listes et des items, vous devriez voir ce qui est sauvegardé dans le local storage, dans le DevTools :

Chargement des listes

Nos objets sont sauvegardés, il faut maintenant les charger lorsque le visiteur accès à la page.

Tout en en bas du fichier v10-local-storage.js, ajoutez le code suivant :

if (localStorage.getItem("lists")) {
    let lists = JSON.parse(localStorage.getItem("lists") || "[]");
    lists.forEach((list) => {
        let newTodo = new ToDo(list.name, list.items);
        let todoList = new ToDoDom(newTodo);
        let container = document.getElementById('lists-container');
        container.append(todoList.getHTML());
    });
}
  • On test si le localStorage possède une clé “lists
  • let lists = JSON.parse(localStorage.getItem(“lists”) || “[]”);
    • localStorage.getItem récupère les données sauvegardées dans le localStorage (ou bien renvoie un tableau vide si rien n’est trouvé)
    • JSON.parse convertir la String au format JSON, qui est interprété comme un objet en Javascript
  • lists.forEach((list) => {
    • effectue une boucle sur chaque élément (objet) de l’objet lists
    • à chaque tour de boucle, l’objet est placé dans une variable list
  • new ToDo(list.name, list.items);
    • On instancie un nouvel objet Todo avec les informations stockées dans le localStorage
  • Enfin, on instancie un objet de la classe ToDoDom avec notre objet ToDo fraichement créé
  • Puis on ajoute l’objet ToDoDom container du DOM

Optionnellement, on peut mettre à jour le constructeur de notre classe Todo pour générer des objets Item plutôt que des objets génériques :

class ToDo {

    constructor(name = 'My todo list', items = []) {
        this.name = name;
        this.items = [];
        items.forEach( item => this.items.push( new Item(item.name, item.done) ) );
    }
...
}

Et voilà !

Vous pouvez rafraichir votre page, et vos listes sont toujours là.

Suppression du localStorage

Pour terminer, on peut ajouter la fonction suivante en fin de fichier, déclenchée par la bouton “Supprimer toutes les listes”, qui va vider le localStorage et recharger la page :

function purgeLocalStorage() {
    localStorage.clear();
    location.reload();
}

Conclusion

Ce n’était pas une mince affaire, mais nous avons effectué toutes les étapes du développement d’un projet HTML/CSS/Javascript.

Il faudra prendre du temps pour revoir toutes les versions et apprendre à savoir reproduire ce code sans aide ( si si, c’est possible! )

Bien sûr, cette application pourrait encore être améliorée; Mais si vous avez bien compris toutes ces étapes, vous êtes sur la bonne voie !