# prepaLoL ## Enoncé Réaliser une application MAUI avec un MVVM "maison". Je vous fournis le modèle, et peut-être quelques vues au fur et à mesure. J'attends de vous : - la réalisation d'un toolkit MVVM (bibliothèque de classes), - le _wrapping_ des classes du modèle par des VM (à chaque fois que c'est nécessaire), - l'utilisation de commandes pour les différentes fonctionnalités, - l'utilisation d'une VM _applicative_ (navigation, index, sélection...). Faites ce que vous pouvez avec, dans l'ordre : 1. l'affichage de la collection de Champions. La possibilité de naviguer de n en n champions (5 champions par page, ou 10, etc.) et la pagination doivent être gérées. 2. Permettez la sélection d'un champion pour le voir dans une page (on n'utilisera que ses propriétés simples (```Name```, ```Bio```, ```Icon```) puis ```LargeImage```). 3. Ajoutez la gestion des caractéristiques (```Characteristics```). 4. Ajoutez la gestion de la classe du champion. 5. Permettez la modification d'un champion existant (depuis la page du champion, et depuis un swipe sur l'item sélectionné dans la collection). 6. Permettez l'ajout d'un nouveau champion. 7. Ajoutez la gestion des skills. 8. Ajoutez la gestion des skins. ## Captures d'écrans Quelques captures d'écrans comme attendus : ## Diagramme de classes du modèle ```mermaid classDiagram class LargeImage{ +/Base64 : string } class Champion{ +/Name : string +/Bio : string +/Icon : string +/Characteristics : Dictionary~string, int~ ~ AddSkin(skin : Skin) bool ~ RemoveSkin(skin: Skin) bool + AddSkill(skill: Skill) bool + RemoveSkill(skill: Skill) bool + AddCharacteristics(someCharacteristics : params Tuple~string, int~[]) + RemoveCharacteristics(label : string) bool + this~label : string~ : int? } Champion --> "1" LargeImage : Image class ChampionClass{ <> Unknown, Assassin, Fighter, Mage, Marksman, Support, Tank, } Champion --> "1" ChampionClass : Class class Skin{ +/Name : string +/Description : string +/Icon : string +/Price : float } Skin --> "1" LargeImage : Image Champion "1" -- "*" Skin class Skill{ +/Name : string +/Description : string } class SkillType{ <> Unknown, Basic, Passive, Ultimate, } Skill --> "1" SkillType : Type Champion --> "*" Skill class Rune{ +/Name : string +/Description : string } Rune --> "1" LargeImage : Image class RuneFamily{ <> Unknown, Precision, Domination } Rune --> "1" RuneFamily : Family class Category{ <> Major, Minor1, Minor2, Minor3, OtherMinor1, OtherMinor2 } class RunePage{ +/Name : string +/this[category : Category] : Rune? - CheckRunes(newRuneCategory : Category) - CheckFamilies(cat1 : Category, cat2 : Category) bool? - UpdateMajorFamily(minor : Category, expectedValue : bool) } RunePage --> "*" Rune : Dictionary~Category,Rune~ ``` ## Diagramme de classes des interfaces de gestion de l'accès aux données ```mermaid classDiagram direction LR; class IGenericDataManager~T~{ <> GetNbItems() Task~int~ GetItems(index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~ GetNbItemsByName(substring : string) GetItemsByName(substring : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~ UpdateItem(oldItem : T, newItem : T) Task~T~~ AddItem(item : T) Task~T~ DeleteItem(item : T) Task~bool~ } class IChampionsManager{ <> GetNbItemsByCharacteristic(charName : string) GetItemsByCharacteristic(charName : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ GetNbItemsByClass(championClass : ChampionClass) GetItemsByClass(championClass : ChampionClass, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ GetNbItemsBySkill(skill : Skill?) GetItemsBySkill(skill : Skill?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ GetNbItemsBySkill(skill : string) GetItemsBySkill(skill : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ GetNbItemsByRunePage(runePage : RunePage?) GetItemsByRunePage(runePage : RunePage?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~ } class ISkinsManager{ <> GetNbItemsByChampion(champion : Champion?) GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Skin?~~ } class IRunesManager{ <> GetNbItemsByFamily(family : RuneFamily) GetItemsByFamily(family : RuneFamily, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Rune?~~ } class IRunePagesManager{ <> GetNbItemsByRune(rune : Rune?) GetItemsByRune(rune : Rune?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~ GetNbItemsByChampion(champion : Champion?) GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~ } IGenericDataManager~Champion?~ <|.. IChampionsManager : T--Champion? IGenericDataManager~Skin?~ <|.. ISkinsManager : T--Skin? IGenericDataManager~Rune?~ <|.. IRunesManager : T--Rune? IGenericDataManager~RunePage?~ <|.. IRunePagesManager : T--RunePage? class IDataManager{ <> } IChampionsManager <-- IDataManager : ChampionsMgr ISkinsManager <-- IDataManager : SkinsMgr IRunesManager <-- IDataManager : RunesMgr IRunePagesManager <-- IDataManager : RunePagesMgr ``` ## Diagramme de classes simplifié du Stub ```mermaid classDiagram direction TB; IDataManager <|.. StubData ChampionsManager ..|> IChampionsManager StubData --> ChampionsManager RunesManager ..|> IRunesManager StubData --> RunesManager RunePagesManager ..|> IRunePagesManager StubData --> RunePagesManager SkinsManager ..|> ISkinsManager StubData --> SkinsManager StubData --> RunesManager StubData --> "*" Champion StubData --> "*" Rune StubData --> "*" RunePages StubData --> "*" Skins ```