# PocketBook # TP2 : MVVM (partie 2) _Ă  terminer pour le 15 octobre 2023 - 23h59_ 🚧 En construction : le **ModĂšle** est terminĂ© Ă  plus de 95%. Seules des modifications mineures peuvent ĂȘtre intĂ©grĂ©es ## Modifications Ă  prendre en compte : - le **Stub** est modifiĂ© et _doit_ fonctionner sans avoir Ă  utiliser la propriĂ©tĂ© ```BasePath```, aussi bien en Console qu'avec MAUI - le **Model** prend en charge maintenant deux services : ```ILibraryManager``` doit permettre de gĂ©rer l'intĂ©gralitĂ© des livres, et ```IUserLibraryManager``` doit permettre de gĂ©rer la bibliothĂšque personnelle de l'utilisateur. Le **Stub** fournit de quoi simuler leur utilisation. ## Ajout dans l'Ă©noncĂ© L'application doit maintenant permettre de naviguer sur toutes les pages et l'utilisateur doit pouvoir : - changer le statut de lecture d'un livre, - ajouter un livre aux favoris, - filtrer les livres par **Auteur**, **Date de publication**, **Note** - ajouter un livre Ă  sa collection en saisissant l'ISBN (les vues seront Ă  ajouter) - supprimer un livre - prĂȘter un livre (et ajouter un contact si besoin) - consulter la liste des livres prĂȘtĂ©s. Lors de la consultation des livres, il faudra gĂ©rer la pagination pour que l'on puisse limiter l'affichage Ă  n (5, 10, 20,...) livres par page. > # Note : les TP3 et TP4 peuvent ĂȘtre faits dans le dĂ©sordre. > ### Mais pour pouvoir rĂ©aliser les TP3 et TP4, vous devez au prĂ©alable faire valider les bases du TP2 Ă  votre enseignant. Si celui-ci n'est pas exploitable Ă  la date de rendu demandĂ©e, celle-ci est repoussĂ©e au 22 octobre 23h59. Le TP2 est prioritaire sur les TP3 et 4. # TP3 : utilisation du MVVM Community Toolkit _Ă  terminer pour le 22 octobre 2023 - 23h59_ Modifiez l'intĂ©gralitĂ© de votre code pour que votre application utilise dĂ©sormais le MVVM Community Toolkit Ă  la place de votre toolkit maison. # TP4 : utilisation de la camĂ©ra comme scanner d'ISBN _Ă  terminer pour le 22 octobre 2023 - 23h59_ Ajoutez les vues et les VM nĂ©cessaires pour permettre le scan de code-barres afin d'ajouter de nouveaux livres, et la recherche en ligne (via le web service). ----------------------------------------------------------- ----------------------------------------------------------- # TP2 : MVVM _Ă  terminer pour le 15 octobre 2023 - 23h59_ L'objectif de cette partie est de relier les vues (_Views_) et le modĂšle (_Model_) en respectant le patron d'architecture **MVVM** (_Model-View-ViewModel_). Vous devrez rĂ©aliser les Ă©tapes suivantes (je vous suggĂšre de les rĂ©aliser dans cet ordre) : 1. page d'accueil : en utilisant une _ContentView_ et des _Commands_, faites en sorte que l'utilisateur puisse : - naviguer vers la page affichant les livres de l'utilisateur (_BooksPage_) (sans liaison de donnĂ©es pour le moment) en tapant sur **Tous**, - naviguer vers la page affichant les prĂȘts et emprunts (_LoanPage_) (sans liaison de donnĂ©es pour le moment) en tapant sur **En prĂȘt**, - naviguer vers la page affichant des filtres par critĂšres (_FilterPage_) (sans liaison de donnĂ©es pour le moment) en tapant sur **À lire plus tard**, **Statut de lecture**, **Favoris**, **Auteur**, **Date de publication**, **Note** - afficher la vue permettant d'ajouter un livre lorsqu'on clique sur le **+** puis ajouter une vue modale lorsqu'on clique sur **Saisir l'ISBN** > _**Note**_ : vous devez bien sĂ»r limiter au maximum le code en _code-behind_ et utiliser des _VM_ et des _Commands_. 2. affichage des livres de l'utilisateur : afficher tous les livres de l'utilisateur dans la vue _BooksPage_ et permettre la sĂ©lection d'un livre et la navigation vers la page _BookPage_ > _**Note**_ : le modĂšle ne permet pas encore d'accĂ©der aux livres de l'utilisateur, mais vous pouvez utiliser dans un premier temps la fonctionnalitĂ© qui permet d'atteindre tous les livres. Elle est basĂ©e sur un stub et il y en a donc peu. Cette partie manquante du modĂšle devrait ĂȘtre livrĂ©e dans la semaine. > _**Conseils**_ : commencez par les donnĂ©es simples (titre du livre, auteur, statut de lecture), puis passez Ă  la navigation vers la page d'un livre (_BookPage_) oĂč vous pourrez afficher les donnĂ©es simples (titre du livre, l'auteur, la maison d'Ă©dition, le rĂ©sumĂ©, le nombre de pages, la langue, l'isbn et le statut de lecture). Enfin, vous pourrez vous occuper des donnĂ©es plus compliquĂ©es Ă  afficher (la couverture et la note). Le bouton avec les deux flĂšches inversera l'ordre d'affichage. > _**Difficile**_ : l'utilisation de la _scrollview_ par index est plus compliquĂ©e. Je la compterai en bonus. 3. filtrage par auteur et par date de publication : afficher dans la vue de filtrage (_FilterPage_) - les auteurs (et le nombre de livres par auteur) lorsqu'on tape sur _Auteurs_, puis navigation vers la page des livres _BooksPage_ mais seulement avec les livres de l'auteur sĂ©lectionnĂ©, - les annĂ©es de publication (et le nombre de livres par annĂ©e) lorsqu'on tape sur _Date de publication_, puis navigation vers la page des livres _BooksPage_ mais seulement avec les livres publiĂ©s dans l'annĂ©e sĂ©lectionnĂ©. ## ModĂšle ```mermaid classDiagram direction LR class Book { +Id : string +Title : string +Publishers : List~string~ +PublishDate : DateTime +ISBN13 : string +Series : List~string~ +NbPages : int +Format : string +ImageSmall : string +ImageMedium : string +ImageLarge : string } class Languages { <> Unknown, French, } class Work { +Id : string +Description : string +Title : string +Subjects : List~string~ } class Contributor { +Name : string +Role : string } class Author { +Id : string +Name : string +ImageSmall : string +ImageMedium : string +ImageLarge : string +Bio : string +AlternateNames : List~string~ +BirthDate : DateTime? +DeathDate : DateTime? } class Link { +Title : string +Url : string } class Ratings { +Average : float +Count : int } Book --> "1" Languages : Language Book --> "*" Contributor : Contributors Author --> "*" Link : Links Work --> "*" Author : Authors Work --> "1" Ratings : Ratings Book --> "*" Author : Authors Book --> "*" Work : Works class Status { <> Unknown, Finished, Reading, NotRead, ToBeRead } class Contact{ +string Id; +string FirstName; +string LastName; } ``` ## Services & Interfaces ```mermaid classDiagram direction LR Book --> "1" Languages : Language Book --> "*" Contributor : Contributors Author --> "*" Link : Links Work --> "1" Ratings : Ratings Work --> "*" Author : Authors Book --> "*" Work : Works Book --> "*" Author : Authors class IUserLibraryManager { <> +AddBook(Book book) : Task +AddBook(string id) : Task +AddBookByIsbn(string isbn) : Task +RemoveBook(Book book) : Task +RemoveBook(string id) : Task +RemoveBook(string id) : Task +AddToFavorites(Book book) : Task +AddToFavorites(string bookId) : Task +RemoveFromFavorites(Book book) : Task +RemoveFromFavorites(string bookId) : Task +UpdateBook(Book updatedBook) : Task +AddContact(Contact contact) : Task +RemoveContact(Contact contact) : Task +LendBook(Book book, Contact contact, DateTime? loanDate) : Task +GetBackBook(Book book, DateTime? returnedDate) : Task +BorrowBook(Book book, Contact owner, DateTime? borrowedDate) : Task +GiveBackBook(Book book, DateTime? returnedDate) : Task +GetCurrentLoans(int index, int count) +GetPastLoans(int index, int count) +GetCurrentBorrowings(int index, int count) +GetPastBorrowings(int index, int count) +GetContacts(int index, int count) } class ILibraryManager { <> +GetBookById(string id) +GetBookByIsbn(string isbn) +GetBooksByTitle(string title, int index, int count, string sort) +GetBooksByAuthorId(string authorId, int index, int count, string sort) +GetBooksByAuthor(string author, int index, int count, string sort) +GetAuthorById(string id) +GetAuthorsByName(string substring, int index, int count, string sort) } class Status { <> } IUserLibraryManager ..|> ILibraryManager IUserLibraryManager ..> Status IUserLibraryManager ..> Contact IUserLibraryManager ..> Book ILibraryManager ..> Book ILibraryManager ..> Author ``` # TO BE CONTINUED # TP1 : Pages & Views _Ă  terminer pour le 17 septembre 2023 - 23h59_ L'objectif est de reproduire les pages et les vues d'une application _PocketBook_ de recherche et de stockage de livres pour iPhone et Android en MAUI. Une reproduction la plus _parfaite_ possible est souhaitĂ©e (avec la _TabBar_, le bouton _Modifier_, etc.). Je vous conseille de faire (par ordre de prioritĂ©) : - la page d'accueil de la bibliothĂšque ("Mes livres" avec les menus), - la page affichant les livres, - la page affichant les dĂ©tails d'un livre, - la page permettant de lister les auteurs et de filtrer les livres par auteur - le menu contextuel permettant d'ajouter un nouveau livre - une page permettant de prĂȘter ou d'emprunter Ă  livre Ă  quelqu'un - la page permettant de lister les annĂ©es de publication et de filtrer les livres - la page permettant de trier les livres par note. ## CritĂšres d'Ă©valuation - L'app doit marcher sur iOS et Android - CrĂ©ation des pages - Utilisation de _Views_ (layout, affichage, buttons...) - CrĂ©ation de _Views_ personnalisĂ©es - CrĂ©ation et utilisation de Styles et ressources - CrĂ©ation et utilisation des _Themes_ (light & dark) - (si besoin) utilisation du MAUI Community Toolkit ## Ressources - [Doc officielle MAUI](https://learn.microsoft.com/en-us/dotnet/maui/) - [MAUI Community Toolkit](https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/) - [SF Symbols 5.0 (format SVG et PNG)](https://www.figma.com/file/7ATqS05m0VqE905x1NKS0D/SF-Symbols-5.0---5296-SVG-Icons-(Community)?type=design&node-id=5-1670&mode=design&t=75VRROmRWJsStAIv-0) - [SF Symbols 5.0 (PNG only)](https://github.com/andrewtavis/sf-symbols-online/tree/master/glyphs) ## Voici les captures d'Ă©cran rĂ©alisĂ©es sur iPhone. ### Page BibliothĂšque - Un clic sur "Tous" permet de naviguer vers la page affichant tous les livres de notre bibliothĂšque, - Un clic sur "En prĂȘt" permet de voir Ă  qui on a prĂȘtĂ© un livre et Ă  qui on a empruntĂ© un livre - Un clic sur "À lire plus tard" affiche tous les livres de la bibliothĂšque marquĂ©s comme "Ă  lire plus tard" - Un clic sur Statut de lecture permet de regrouper les livres en trois catĂ©gories : "Lu", "À lire", "Non lu" - Un clic sur "Favoris" affiche seulement les livres prĂ©fĂ©rĂ©s de notre bibliothĂšque - Finalement, ... vous pouvez oublier "Étiquettes" - Un clic sur "Auteur" permet de filtrer les livres par auteur (cf. plus bas) - Un clic sur "Date de publication" permet de filtrer les livres par annĂ©e de publication (cf. plus bas) - Un clic sur "Note" permet de trier les livres par notes (donnĂ©es par la communautĂ©) - Le bouton "Modifier" ne sera pas utilisĂ© - Le bouton "+" permet de rentrer de nouveaux livres (cf. plus bas). ### Affichage de la liste de livres - Le bouton "+" permet de scanner un nouveau livre (cf. plus bas). - Le bouton avec les deux flĂšches permet de changer l'ordre de prĂ©sentation des livres. - Note : les livres sont regroupĂ©s par auteur ### Affichage d'un livre ### Filtrage par auteur Lorsqu'on clique sur un le filtre "Auteur" de la page "Mes Livres", on navigue vers la page suivante : Un clic sur un de ces auteurs permet d'aller sur la mĂȘme page que celle qui affiche la liste des livres, mais seuls les livres de cet auteur apparaitront. ### Filtrage par date de publication Lorsqu'on clique sur un le filtre "Date de publication" de la page "Mes Livres", on navigue vers la page suivante : Un clic sur une de ces annĂ©es permet d'aller sur la mĂȘme page que celle qui affiche la liste des livres, mais seuls les livres publiĂ©e cette annĂ©e apparaitront. ### Emprunts / PrĂȘts Lorsqu'on clique sur le menu "En prĂȘt" sur la page d'accueil, on peut voir la liste de nos emprunts et de nos prĂȘts rĂ©partis par contacts. Par exemple : Le switch permet de voir les livres qu'on a prĂȘtĂ©s regroupĂ©s par contacts, ou les livres qu'on a empruntĂ©s regroupĂ©s par prĂȘteurs. ### Le fameux bouton "+" Un clic sur le bouton "+" fait apparaĂźtre un sous-menu permettant d'ajouter un livre Ă  la bibliothĂšque : - en scannant un code-barres (cf. plus bas) - en scannant plusieurs code-barres - en recherchant en ligne (par titre ou par auteur), - en saisissant l'ISBN ### Le scan La page Scan pourra ĂȘtre rĂ©alisĂ©e plus tard. # Troubleshootings #### J'ai bien renommĂ© mes images, mais le Mac continue Ă  me dire que non... C'est peut-ĂȘtre dĂ» au fait que certains fichiers cachĂ©s n'ont pas Ă©tĂ© correctement exclus (notamment les ```.DS_Store```). Essayez d'appeler cette commande depuis un Terminal (sous Visual ou depuis... un Terminal) : ``` find . -name ".DS_Store" -delete ```