You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PocketBook/README.md

306 lines
13 KiB

# 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 {
<<enum>>
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 {
<<enum>>
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 {
<<interface>>
+AddBook(Book book) : Task<Book>
+AddBook(string id) : Task<Book>
+AddBookByIsbn(string isbn) : Task<Book>
+RemoveBook(Book book) : Task<bool>
+RemoveBook(string id) : Task<bool>
+RemoveBook(string id) : Task<bool>
+AddToFavorites(Book book) : Task<bool>
+AddToFavorites(string bookId) : Task<bool>
+RemoveFromFavorites(Book book) : Task<bool>
+RemoveFromFavorites(string bookId) : Task<bool>
+UpdateBook(Book updatedBook) : Task<Book>
+AddContact(Contact contact) : Task<Contact>
+RemoveContact(Contact contact) : Task<bool>
+LendBook(Book book, Contact contact, DateTime? loanDate) : Task<bool>
+GetBackBook(Book book, DateTime? returnedDate) : Task<bool>
+BorrowBook(Book book, Contact owner, DateTime? borrowedDate) : Task<bool>
+GiveBackBook(Book book, DateTime? returnedDate) : Task<bool>
+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 {
<<interface>>
+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 {
<<enum>>
}
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
<img src="screens/Library.png" width="300"/>
- 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
<img src="screens/AllBooks.png" width="300"/>
- 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
<img src="screens/OneBook.png" width="300"/>
<img src="screens/OneBook2.png" width="300"/>
### Filtrage par auteur
Lorsqu'on clique sur un le filtre "Auteur" de la page "Mes Livres", on navigue vers la page suivante :
<img src="screens/Auteurs.png" width="300"/>
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 :
<img src="screens/Dates.png" width="300"/>
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 :
<img src="screens/emprunts.png" width="300"/>
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
<img src="screens/Popup.png" width="300"/>
### Le scan
La page Scan pourra être réalisée plus tard.
<img src="screens/Scan.jpeg" width="300"/>
# 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
```