Update(Back-End): Séparation des VMWrapper
continuous-integration/drone/push Build is failing Details

Back-End
lodufour1 2 years ago
parent 368ccab2cd
commit 5f17b504a7

@ -1,63 +1,15 @@
# PocketBook
# PocketBook - Louis DUFOUR
Il veut:
README.md
- lancer le projet
- trouver les docs important
- cas d'erreur connus
- Comment accéder au code noté
- dernier commit ? tag
- Préciser plateforme
TODO
# 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
@ -203,33 +155,6 @@ 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/)
@ -295,11 +220,3 @@ 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
```

@ -6,7 +6,7 @@
xmlns:model="clr-namespace:Model;assembly=Model"
x:DataType="vm:ViewModelManager"
x:Class="BookApp.Composants.CollectionFiltrage">
<CollectionView ItemsSource="{Binding VMMrg.bookVm.authorList}">
<CollectionView ItemsSource="{Binding VMMrg.filterVm.authorList}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Author">
<StackLayout Padding="5">

@ -1,46 +1,20 @@
using Android.OS;
using BookApp.ViewModel;
using System.Collections.ObjectModel;
namespace BookApp.Composants;
public partial class CollectionFiltrage : ContentView
{
/* public class ObjetTemp
{
public string AuteurName { get; set; }
public int NbLivre { get; set; }
public ObjetTemp(string name, int number)
{
AuteurName = name;
NbLivre = number;
}
}
public ObservableCollection<ObjetTemp> MyCollections1 { get; set; }*/
public CollectionFiltrage(ViewModelManager data)
namespace BookApp.Composants
{
public partial class CollectionFiltrage : ContentView
{
InitializeComponent();
public CollectionFiltrage()
{
InitializeComponent();
}
/*MyCollections1 = new ObservableCollection<ObjetTemp>()
public CollectionFiltrage(ViewModelManager data)
: this()
{
new ObjetTemp("Victor Hugo", 10),
new ObjetTemp("Jane Austen", 3),
new ObjetTemp("F. Scott Fitzgerald", 5),
new ObjetTemp("George Orwell", 4),
new ObjetTemp("Haruki Murakami", 8),
new ObjetTemp("Gabriel Garc<72>a M<>rquez", 9),
new ObjetTemp("J.K. Rowling", 9),
new ObjetTemp("Leo Tolstoy", 9),
new ObjetTemp("Ernest Hemingway", 9),
new ObjetTemp("Agatha Christie", 9),
new ObjetTemp("Mark Twain", 9),
new ObjetTemp("J.R.R. Tolkien", 9),
new ObjetTemp("William Shakespeare", 9),
new ObjetTemp("Charles Dickensn", 9),
new ObjetTemp("Isaac Asimov", 9),
};*/
BindingContext = data;
BindingContext = data;
}
}
}

@ -6,16 +6,15 @@
x:Class="BookApp.Composants.GroupCollection">
<CollectionView ItemsSource="{Binding VMMrg.bookVm.AuteurGroups}" IsGrouped="True" SelectionMode="Single"
SelectionChangedCommand="{Binding ViewModelNavigation.BookSelected}"
SelectedItem="{Binding ViewModelNavigation.SelectedBook}">
SelectionChangedCommand="{Binding VMNav.BookSelected}"
SelectedItem="{Binding VMNav.SelectedBook}">
<CollectionView.GroupHeaderTemplate>
<DataTemplate>
<Label Text="{Binding Name}"
FontFamily="SF-Compact-Display-Semibold"
BackgroundColor="LightGrey"
TextColor="Gray"
Padding="5"
Margin="15,0,0,0"/>
Padding="5"/>
</DataTemplate>
</CollectionView.GroupHeaderTemplate>
<CollectionView.ItemTemplate>

@ -38,131 +38,114 @@
<Shell.BackButtonBehavior>
<BackButtonBehavior IsVisible="False" IsEnabled="False" />
</Shell.BackButtonBehavior>
<ContentPage.Resources>
<Style TargetType="StackLayout">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Selected">
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="Purple" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
</ContentPage.Resources>
<StackLayout>
<Label FontSize="35" FontFamily="SF-Pro-Display-Bold" Padding="10">Mes livres</Label>
<Rectangle HeightRequest="1" BackgroundColor="black" VerticalOptions="End" />
<CollectionView ItemsSource="{Binding ViewModelMenu.MenuItemsLivre}"
SelectionChangedCommand="{Binding ViewModelNavigation.ItemSelectedCommandMain}"
SelectedItem="{Binding ViewModelNavigation.SelectedItem, Mode=TwoWay}"
SelectionMode="Single" Margin="25,0,0,0" BackgroundColor="#F9F9F9">
<CollectionView ItemsSource="{Binding VMMenu.MenuItemsLivre}"
SelectionChangedCommand="{Binding VMNav.ItemSelectedCommandMain}"
SelectedItem="{Binding VMNav.SelectedItem, Mode=TwoWay}"
SelectionMode="Single" Margin="25,0,0,0" BackgroundColor="#F9F9F9">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="vm:ViewModelMenuItem">
<Grid RowDefinitions="Auto" Style="{StaticResource StyleCollectionGrid}" Padding="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="{Binding Icone}"
HeightRequest="25"
WidthRequest="25"/>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
Padding="5"
VerticalOptions="Center"/>
<Grid Grid.Column="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="2"
Text="{Binding Number}"
FontAttributes="Bold"
VerticalOptions="Center"
Margin="0,0,40,0"
HorizontalOptions="End"/>
<Image Grid.Column="2"
Source="chevron_right.svg"
HeightRequest="25"
WidthRequest="25"
HorizontalOptions="End"/>
</Grid>
<Rectangle Grid.ColumnSpan="4" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End">
<Rectangle.Triggers>
<DataTrigger TargetType="Rectangle" Binding="{Binding IsLastItem}" Value="true">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</Rectangle.Triggers>
</Rectangle>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="vm:ViewModelMenuItem">
<Grid RowDefinitions="Auto" Style="{StaticResource StyleCollectionGrid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="{Binding Icone}"
HeightRequest="25"
WidthRequest="25"/>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
Padding="5"
VerticalOptions="Center"/>
<Grid Grid.Column="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="2"
Text="{Binding Number}"
FontAttributes="Bold"
VerticalOptions="Center"
Margin="0,0,40,0"
HorizontalOptions="End"/>
<Image Grid.Column="2"
Source="chevron_right.svg"
HeightRequest="25"
WidthRequest="25"
HorizontalOptions="End"/>
</Grid>
<Rectangle Grid.ColumnSpan="4" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End">
<Rectangle.Triggers>
<DataTrigger TargetType="Rectangle" Binding="{Binding IsLastItem}" Value="true">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</Rectangle.Triggers>
</Rectangle>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<Rectangle HeightRequest="1" BackgroundColor="black" VerticalOptions="End"/>
<Label FontFamily="SF-Pro-Display-Heavy" FontSize="20" Padding="10">Filtres</Label>
<Rectangle HeightRequest="1" BackgroundColor="black" VerticalOptions="End"/>
<CollectionView ItemsSource="{Binding ViewModelMenu.MenuItemsFiltre}"
SelectionChangedCommand="{Binding ViewModelNavigation.ItemSelectedCommandFiltre}"
SelectedItem="{Binding ViewModelNavigation.SelectedItem, Mode=TwoWay}"
SelectionMode="Single" Margin="25,0,0,0" BackgroundColor="#F9F9F9">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="vm:ViewModelMenuItem">
<Grid RowDefinitions="Auto" Style="{StaticResource StyleCollectionGrid}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="{Binding Icone}"
HeightRequest="25"
WidthRequest="25"/>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
Padding="5"
VerticalOptions="Center"/>
<Grid Grid.Column="2" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="2"
Text="{Binding Number}"
FontAttributes="Bold"
VerticalOptions="Center"
Margin="0,0,40,0"
HorizontalOptions="End"/>
<Image Grid.Column="2"
Source="chevron_right.svg"
HeightRequest="25"
WidthRequest="25"
HorizontalOptions="End"/>
</Grid>
<Rectangle Grid.ColumnSpan="4" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End">
<Rectangle.Triggers>
<DataTrigger TargetType="Rectangle" Binding="{Binding IsLastItem}" Value="true">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</Rectangle.Triggers>
</Rectangle>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<CollectionView ItemsSource="{Binding VMMenu.MenuItemsFiltre}"
SelectionChangedCommand="{Binding VMNav.ItemSelectedCommandFiltre}"
SelectedItem="{Binding VMNav.SelectedItem, Mode=TwoWay}"
SelectionMode="Single" Margin="25,0,0,0" BackgroundColor="#F9F9F9">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="vm:ViewModelMenuItem">
<Grid RowDefinitions="Auto" Style="{StaticResource StyleCollectionGrid}" Padding="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="25" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="{Binding Icone}"
HeightRequest="25"
WidthRequest="25"/>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
Padding="5"
VerticalOptions="Center"/>
<Grid Grid.Column="2" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label FontFamily="SF-Compact-Display-Semibold" Grid.Column="2"
Text="{Binding Number}"
FontAttributes="Bold"
VerticalOptions="Center"
Margin="0,0,40,0"
HorizontalOptions="End"/>
<Image Grid.Column="2"
Source="chevron_right.svg"
HeightRequest="25"
WidthRequest="25"
HorizontalOptions="End"/>
</Grid>
<Rectangle Grid.ColumnSpan="4" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End">
<Rectangle.Triggers>
<DataTrigger TargetType="Rectangle" Binding="{Binding IsLastItem}" Value="true">
<Setter Property="IsVisible" Value="False"/>
</DataTrigger>
</Rectangle.Triggers>
</Rectangle>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage>

@ -39,12 +39,12 @@ namespace BookApp
builder.Services.AddSingleton<ViewModelNavigation>();
builder.Services.AddTransient<ViewModelMenu>();
builder.Services.AddSingleton<Filtrage>();
builder.Services.AddSingleton<GroupCollection>();
builder.Services.AddSingleton<CollectionFiltrage>();
builder.Services.AddSingleton<Filtrage>();
builder.Services.AddSingleton<Tous>();
builder.Services.AddSingleton<MainPage>();
builder.Services.AddSingleton<EmpruntsPrets>();
builder.Services.AddSingleton<GroupCollection>();
// transient pour recharger la data à l'execute

@ -20,7 +20,7 @@
HorizontalOptions="Start">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding ViewModelNavigation.BackButtonCommand}"
Command="{Binding VMNav.BackButtonCommand}"
NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
<Image.Behaviors>
@ -57,9 +57,9 @@
<ColumnDefinition Width="125"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Margin="10,10,10,0" Grid.Column="0" Source="{Binding ViewModelNavigation.SelectedBook.ImageLarge}"/>
<Image Margin="10,10,10,0" Grid.Column="0" Source="{Binding VMNav.SelectedBook.ImageLarge}"/>
<StackLayout Grid.Column="1">
<Label FontAttributes="Bold" FontSize="20" Text="{Binding ViewModelNavigation.SelectedBook.Title }"/>
<Label FontAttributes="Bold" FontSize="20" Text="{Binding VMNav.SelectedBook.Title }"/>
<Grid RowDefinitions="auto" VerticalOptions="EndAndExpand">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -84,13 +84,13 @@
</Grid>
<Rectangle Margin="25,0,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End"/>
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="Auteur"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding ViewModelNavigation.SelectedBook.Authors}"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding VMNav.SelectedBook.Authors}"/>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End"/>
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="Maison d'édition"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding ViewModelNavigation.SelectedBook.MaisonEdit}"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding VMNav.SelectedBook.MaisonEdit}"/>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End"/>
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="Résumer"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding ViewModelNavigation.SelectedBook.Format}"/>
<Label Margin="25,0,0,0" VerticalTextAlignment="Center" Text="{Binding VMNav.SelectedBook.Format}"/>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End" />
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="Details"/>
<Grid Margin="25,0,20,0">
@ -104,11 +104,11 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Text="Nombre de pages"/>
<Label Grid.Row="0" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding ViewModelNavigation.SelectedBook.NbPages}"/>
<Label Grid.Row="0" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding VMNav.SelectedBook.NbPages}"/>
<Label Grid.Row="1" Grid.Column="0" Text="Langue"/>
<Label Grid.Row="1" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding ViewModelNavigation.SelectedBook.Language}"/>
<Label Grid.Row="1" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding VMNav.SelectedBook.Language}"/>
<Label Grid.Row="2" Grid.Column="0" Text="ISBN"/>
<Label Grid.Row="2" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding ViewModelNavigation.SelectedBook.Status}"/>
<Label Grid.Row="2" Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding VMNav.SelectedBook.Status}"/>
</Grid>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End" />
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="Status de lecture"/>
@ -118,7 +118,7 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text="Status"/>
<Label Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding ViewModelNavigation.SelectedBook.Status}"/>
<Label Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding VMNav.SelectedBook.Status}"/>
</Grid>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End" />
<Label FontAttributes="Bold" Margin="25,0,0,0" VerticalTextAlignment="Center" Text="biliothèque"/>
@ -128,7 +128,7 @@
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Text="Ajouter le"/>
<Label Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding ViewModelNavigation.SelectedBook.PublishDate}"/>
<Label Grid.Column="1" HorizontalTextAlignment="End" Text="{Binding VMNav.SelectedBook.PublishDate}"/>
</Grid>
<Rectangle Margin="25,10,0,10" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End" />
<Rectangle HeightRequest="100" Fill="Transparent"/>

@ -20,7 +20,7 @@
HorizontalOptions="Start">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding ViewModelNavigation.BackButtonCommand}"
Command="{Binding VMNav.BackButtonCommand}"
NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
<Image.Behaviors>

@ -24,7 +24,7 @@
HorizontalOptions="Start">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding ViewModelNavigation.BackButtonCommand}"
Command="{Binding VMNav.BackButtonCommand}"
NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
<Image.Behaviors>
@ -68,37 +68,7 @@
<StackLayout>
<Rectangle HeightRequest="1" BackgroundColor="LightGray"/>
<SearchBar Placeholder="Search items..."/>
<CollectionView ItemsSource="{Binding bookViewModel.authorList}" VerticalOptions="FillAndExpand">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="model:Author">
<StackLayout Padding="5">
<Grid RowDefinitions="auto" Margin="5,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" HeightRequest="30"
WidthRequest="30" Source="Book.svg">
<Image.Behaviors>
<toolkit:IconTintColorBehavior TintColor="Red" />
</Image.Behaviors>
</Image>
<Label Grid.Column="1" Margin="10,0,0,0" VerticalTextAlignment="Center" Text="{Binding Name}"/>
<!-- <Label Grid.Column="2" VerticalTextAlignment="Center" Margin="0,0,40,0" HorizontalTextAlignment="End" Text="{Binding NbLivre}"/> -->
<Button Grid.Column="2"
ImageSource="chevron_right.svg"
HeightRequest="35"
WidthRequest="35"
VerticalOptions="Center"
BackgroundColor="White"
HorizontalOptions="End"/>
</Grid>
<Rectangle Margin="45,0,0,0" HeightRequest="1" BackgroundColor="LightGray" VerticalOptions="End" />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<composants:CollectionFiltrage/>
</StackLayout>
</ContentPage.Content>
</ContentPage>

@ -2,9 +2,9 @@
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:composants="clr-namespace:BookApp.Composants"
xmlns:vm="clr-namespace:BookApp.ViewModel"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="BookApp.Pages.Tous">
<Shell.BackButtonBehavior>
<BackButtonBehavior IsVisible="False" IsEnabled="False"/>
@ -22,7 +22,7 @@
HorizontalOptions="Start">
<Image.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding ViewModelNavigation.BackButtonCommand}"
Command="{Binding VMNav.BackButtonCommand}"
NumberOfTapsRequired="1" />
</Image.GestureRecognizers>
<Image.Behaviors>

@ -6,11 +6,13 @@ namespace BookApp.ViewModel;
public class ViewModelManager : BaseViewModel
{
public ManagerViewModel VMMrg { get; }
public ViewModelMenu ViewModelMenu { get; } = new ViewModelMenu();
public ViewModelNavigation ViewModelNavigation { get; } = new ViewModelNavigation();
public ViewModelMenu VMMenu { get; }
public ViewModelNavigation VMNav { get; }
public ViewModelManager(ManagerViewModel viewModel)
public ViewModelManager(ManagerViewModel vMMrg, ViewModelMenu viewModelMenu, ViewModelNavigation viewModelNavigation)
{
VMMrg = viewModel;
VMMrg = vMMrg;
VMMenu = viewModelMenu;
VMNav = viewModelNavigation;
}
}

@ -1,9 +1,5 @@
using Model;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Xml.Linq;
namespace VMWrapper
{
@ -12,8 +8,6 @@ namespace VMWrapper
{
private readonly ILibraryManager data;
public ObservableCollection<Author> authorList { get; private set; } =
new ObservableCollection<Author>();
public ObservableCollection<Book> bookList { get; private set; } =
new ObservableCollection<Book>();
public ObservableCollection<AuteurGroup> AuteurGroups { get; private set; } =
@ -22,7 +16,6 @@ namespace VMWrapper
public BookViewModel(ILibraryManager data)
{
this.data = data;
GetAuthors();
LoadBooksAsync();
}
@ -55,16 +48,5 @@ namespace VMWrapper
Name = name;
}
}
public void GetAuthors()
{
var objet = data.GetAuthorsByName("", 0, 10).Result.Item2;
authorList.Clear();
foreach (var author in objet)
{
authorList.Add(author);
}
}
}
}

@ -1,13 +1,36 @@
using System;
using Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace VMWrapper
{
public class FilterViewModel
{
public FilterViewModel() { }
private readonly ILibraryManager data;
public ObservableCollection<Author> authorList { get; private set; } =
new ObservableCollection<Author>();
public FilterViewModel(ILibraryManager data)
{
this.data = data;
GetAuthors();
}
public void GetAuthors()
{
var objet = data.GetAuthorsByName("", 0, 10).Result.Item2;
authorList.Clear();
foreach (var author in objet)
{
authorList.Add(author);
}
}
}
}

@ -8,11 +8,7 @@ namespace VMWrapper
public SearchBarViewModel searchBar { get; }
public BookViewModel bookVm { get; }
public ManagerViewModel(
FilterViewModel filterVm,
SearchBarViewModel searchBar,
BookViewModel bookVm
)
public ManagerViewModel(FilterViewModel filterVm, SearchBarViewModel searchBar, BookViewModel bookVm)
{
this.filterVm = filterVm;
this.searchBar = searchBar;

Loading…
Cancel
Save