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.
lodufour1 368ccab2cd
continuous-integration/drone/push Build is failing Details
Fix(Back-End): le manager marche
2 years ago
Documentation Update (Back-End): début patron mvvm 2 years ago
Sources Fix(Back-End): le manager marche 2 years ago
fonts 💄 fonts SF 2 years ago
screens Update (Back-End): Mise à jour 2 years ago
symbols Update (Back-End): Mise à jour 2 years ago
.drone.yml Refacto (master): change src en Sources 2 years ago
.gitignore Initial commit 2 years ago
README.md Update (Back-End): Mise à jour 2 years ago

README.md

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

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

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

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