merge Alexandre's branch
continuous-integration/drone/push Build is passing Details

pull/65/head
Roxane ROSSETTO 2 years ago
commit 825acb7707

@ -39,12 +39,13 @@ namespace ConsoleApp.Menu
Recipe recipe = new Recipe( Recipe recipe = new Recipe(
title: title, title: title,
type: RecipeType.Unspecified,
id: null, id: null,
authorMail: masterMgr.CurrentConnectedUser?.Mail, authorMail: masterMgr.CurrentConnectedUser?.Mail,
picture: "", picture: null)
ingredients: new List<Ingredient>(), {
preparationSteps: steps.ToArray() PreparationSteps = steps
); };
masterMgr.AddRecipe(recipe); masterMgr.AddRecipe(recipe);
return null; return null;

@ -1,118 +1,119 @@
using Model; using Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Runtime.Serialization.Json; using System.Runtime.Serialization.Json;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
namespace DataPersistence namespace DataPersistence
{ {
/// <summary> /// <summary>
/// Define a serializer to manage JSON files. /// Define a serializer to manage JSON files.
/// </summary> /// </summary>
public class DataContractJSON : IDataManager public class DataContractJSON : IDataManager
{ {
#region Attributes #region Attributes
private string _jsonFolderPath; private string _jsonFolderPath;
private DataContractJsonSerializerSettings _dataContractJsonSerializerSettings; private DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;
#endregion #endregion
#region Constructors #region Constructors
/// <summary> /// <summary>
/// Constructor of the DataContractJSON serializer. /// Constructor of the DataContractJSON serializer.
/// </summary> /// </summary>
/// <param name="jsonFolderPath">Give the default path where to load and save the data (by default is the current execution dir).</param> /// <param name="jsonFolderPath">Give the default path where to load and save the data (by default is the current execution dir).</param>
/// <param name="dataContractJsonSerializerSettings">Give another set of DataContractJson serializer setting to write file</param> /// <param name="dataContractJsonSerializerSettings">Give another set of DataContractJson serializer setting to write file</param>
public DataContractJSON(string jsonFolderPath = "", public DataContractJSON(string jsonFolderPath = "",
DataContractJsonSerializerSettings? dataContractJsonSerializerSettings = null) DataContractJsonSerializerSettings? dataContractJsonSerializerSettings = null)
{ {
_jsonFolderPath = jsonFolderPath; _jsonFolderPath = jsonFolderPath;
if (dataContractJsonSerializerSettings is null) if (dataContractJsonSerializerSettings is null)
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings() _dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings()
{ {
KnownTypes = new[] KnownTypes = new[]
{ {
typeof(Recipe), typeof(Recipe),
typeof(Review), typeof(RecipeType),
typeof(User), typeof(Review),
typeof(Ingredient), typeof(User),
typeof(Quantity) typeof(Ingredient),
} typeof(Quantity)
}; }
else };
_dataContractJsonSerializerSettings = dataContractJsonSerializerSettings; else
} _dataContractJsonSerializerSettings = dataContractJsonSerializerSettings;
#endregion }
#endregion
#region IDataManager implementation
public void Export<T>(T obj, string pathToExport) #region IDataManager implementation
where T : class public void Export<T>(T obj, string pathToExport)
{ where T : class
var jsonSerializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings); {
using (FileStream stream = File.Create(Path.Combine(_jsonFolderPath, pathToExport))) var jsonSerializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings);
{ using (FileStream stream = File.Create(Path.Combine(_jsonFolderPath, pathToExport)))
using (var jsonWriter = JsonReaderWriterFactory.CreateJsonWriter( {
stream: stream, using (var jsonWriter = JsonReaderWriterFactory.CreateJsonWriter(
encoding: System.Text.Encoding.UTF8, stream: stream,
ownsStream: false, encoding: System.Text.Encoding.UTF8,
indent: true)) ownsStream: false,
{ indent: true))
jsonSerializer.WriteObject(jsonWriter, obj); {
} jsonSerializer.WriteObject(jsonWriter, obj);
} }
} }
}
public KeyValuePair<string, T> Import<T>(string pathToImport)
where T : class public KeyValuePair<string, T> Import<T>(string pathToImport)
{ where T : class
T? obj; {
var jsonSerializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings); T? obj;
using (FileStream stream = File.OpenRead(Path.Combine(_jsonFolderPath, pathToImport))) var jsonSerializer = new DataContractJsonSerializer(typeof(T), _dataContractJsonSerializerSettings);
{ using (FileStream stream = File.OpenRead(Path.Combine(_jsonFolderPath, pathToImport)))
obj = jsonSerializer.ReadObject(stream) as T; {
} obj = jsonSerializer.ReadObject(stream) as T;
}
if (obj is null)
throw new ArgumentNullException("obj"); if (obj is null)
throw new ArgumentNullException("obj");
string typeName = typeof(T).Name;
return new KeyValuePair<string, T>(typeName, obj); string typeName = typeof(T).Name;
} return new KeyValuePair<string, T>(typeName, obj);
}
public Dictionary<string, List<object>> Load()
{ public Dictionary<string, List<object>> Load()
Dictionary<string, List<object>>? elements = new Dictionary<string, List<object>>(); {
var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings); Dictionary<string, List<object>>? elements = new Dictionary<string, List<object>>();
using (FileStream stream = File.OpenRead(Path.Combine(_jsonFolderPath, "data.json"))) var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings);
{ using (FileStream stream = File.OpenRead(Path.Combine(_jsonFolderPath, "data.json")))
elements = jsonSerializer.ReadObject(stream) as Dictionary<string, List<object>>; {
} elements = jsonSerializer.ReadObject(stream) as Dictionary<string, List<object>>;
}
if (elements is null)
throw new ArgumentNullException("elements"); if (elements is null)
throw new ArgumentNullException("elements");
return elements;
} return elements;
}
public void Save(Dictionary<string, List<object>> elements)
{ public void Save(Dictionary<string, List<object>> elements)
var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings); {
using (FileStream stream = File.Create(Path.Combine(_jsonFolderPath, "data.json"))) var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings);
{ using (FileStream stream = File.Create(Path.Combine(_jsonFolderPath, "data.json")))
using (var jsonWriter = JsonReaderWriterFactory.CreateJsonWriter( {
stream: stream, using (var jsonWriter = JsonReaderWriterFactory.CreateJsonWriter(
encoding: System.Text.Encoding.UTF8, stream: stream,
ownsStream: false, encoding: System.Text.Encoding.UTF8,
indent: true)) ownsStream: false,
{ indent: true))
jsonSerializer.WriteObject(jsonWriter, elements); {
} jsonSerializer.WriteObject(jsonWriter, elements);
} }
} }
#endregion }
} #endregion
} }
}

@ -1,123 +1,124 @@
using Model; using Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
namespace DataPersistence namespace DataPersistence
{ {
/// <summary> /// <summary>
/// Define a serializer to manage XML files. /// Define a serializer to manage XML files.
/// </summary> /// </summary>
public class DataContractXML : IDataManager public class DataContractXML : IDataManager
{ {
#region Attributes #region Attributes
private string _xmlFolderPath; private string _xmlFolderPath;
private XmlWriterSettings _xmlWriterSettings; private XmlWriterSettings _xmlWriterSettings;
private DataContractSerializerSettings _dataContractSerializerSettings; private DataContractSerializerSettings _dataContractSerializerSettings;
#endregion #endregion
#region Constructors #region Constructors
/// <summary> /// <summary>
/// Constructor of a DataContractXML serializer. /// Constructor of a DataContractXML serializer.
/// </summary> /// </summary>
/// <param name="xmlFolderPath">Give the default path where to load and save the data (by default is the current execution dir).</param> /// <param name="xmlFolderPath">Give the default path where to load and save the data (by default is the current execution dir).</param>
/// <param name="xmlWriterSettings">Give another set of XML setting to write file.</param> /// <param name="xmlWriterSettings">Give another set of XML setting to write file.</param>
/// <param name="dataContractSerializerSettings">Give another set of DataContract serializer setting to write file</param> /// <param name="dataContractSerializerSettings">Give another set of DataContract serializer setting to write file</param>
public DataContractXML(string xmlFolderPath = "", public DataContractXML(string xmlFolderPath = "",
XmlWriterSettings? xmlWriterSettings = null, XmlWriterSettings? xmlWriterSettings = null,
DataContractSerializerSettings? dataContractSerializerSettings = null) DataContractSerializerSettings? dataContractSerializerSettings = null)
{ {
_xmlFolderPath = xmlFolderPath; _xmlFolderPath = xmlFolderPath;
if (xmlWriterSettings is null) if (xmlWriterSettings is null)
_xmlWriterSettings = new XmlWriterSettings() { Indent = true }; _xmlWriterSettings = new XmlWriterSettings() { Indent = true };
else else
_xmlWriterSettings = xmlWriterSettings; _xmlWriterSettings = xmlWriterSettings;
if (dataContractSerializerSettings is null) if (dataContractSerializerSettings is null)
_dataContractSerializerSettings = new DataContractSerializerSettings() _dataContractSerializerSettings = new DataContractSerializerSettings()
{ {
KnownTypes = new Type[] KnownTypes = new Type[]
{ {
typeof(Recipe), typeof(Recipe),
typeof(Review), typeof(RecipeType),
typeof(User), typeof(Review),
typeof(Ingredient), typeof(User),
typeof(Quantity), typeof(Ingredient),
typeof(PasswordSHA256) typeof(Quantity),
}, typeof(PasswordSHA256)
PreserveObjectReferences = true },
}; PreserveObjectReferences = true
else };
_dataContractSerializerSettings = dataContractSerializerSettings; else
} _dataContractSerializerSettings = dataContractSerializerSettings;
#endregion }
#endregion
#region IDataManager implementation
public void Export<T>(T obj, string pathToExport) #region IDataManager implementation
where T : class public void Export<T>(T obj, string pathToExport)
{ where T : class
bool restore = _dataContractSerializerSettings.PreserveObjectReferences; {
_dataContractSerializerSettings.PreserveObjectReferences = false; bool restore = _dataContractSerializerSettings.PreserveObjectReferences;
var serializer = new DataContractSerializer(typeof(T), _dataContractSerializerSettings); _dataContractSerializerSettings.PreserveObjectReferences = false;
using (TextWriter textWriter = File.CreateText(Path.Combine(_xmlFolderPath, pathToExport))) var serializer = new DataContractSerializer(typeof(T), _dataContractSerializerSettings);
{ using (TextWriter textWriter = File.CreateText(Path.Combine(_xmlFolderPath, pathToExport)))
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, _xmlWriterSettings)) {
{ using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, _xmlWriterSettings))
serializer.WriteObject(xmlWriter, obj); {
} serializer.WriteObject(xmlWriter, obj);
} }
_dataContractSerializerSettings.PreserveObjectReferences = restore; }
} _dataContractSerializerSettings.PreserveObjectReferences = restore;
}
public KeyValuePair<string, T> Import<T>(string pathToImport)
where T : class public KeyValuePair<string, T> Import<T>(string pathToImport)
{ where T : class
T? obj; {
var serializer = new DataContractSerializer(typeof(T), _dataContractSerializerSettings); T? obj;
using (Stream s = File.OpenRead(Path.Combine(_xmlFolderPath, pathToImport))) var serializer = new DataContractSerializer(typeof(T), _dataContractSerializerSettings);
{ using (Stream s = File.OpenRead(Path.Combine(_xmlFolderPath, pathToImport)))
obj = serializer.ReadObject(s) as T; {
} obj = serializer.ReadObject(s) as T;
}
if (obj is null)
throw new ArgumentNullException("obj"); if (obj is null)
throw new ArgumentNullException("obj");
string typeName = typeof(T).Name;
return new KeyValuePair<string, T>(typeName, obj); string typeName = typeof(T).Name;
} return new KeyValuePair<string, T>(typeName, obj);
}
public Dictionary<string, List<object>> Load()
{ public Dictionary<string, List<object>> Load()
Dictionary<string, List<object>>? elements; {
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings); Dictionary<string, List<object>>? elements;
using (Stream s = File.OpenRead(Path.Combine(_xmlFolderPath, "data.xml"))) var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings);
{ using (Stream s = File.OpenRead(Path.Combine(_xmlFolderPath, "data.xml")))
elements = serializer.ReadObject(s) as Dictionary<string, List<object>>; {
} elements = serializer.ReadObject(s) as Dictionary<string, List<object>>;
}
if (elements is null)
throw new ArgumentNullException("elements"); if (elements is null)
throw new ArgumentNullException("elements");
return elements;
} return elements;
}
public void Save(Dictionary<string, List<object>> elements)
{ public void Save(Dictionary<string, List<object>> elements)
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings); {
using (TextWriter textWriter = File.CreateText(Path.Combine(_xmlFolderPath, "data.xml"))) var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings);
{ using (TextWriter textWriter = File.CreateText(Path.Combine(_xmlFolderPath, "data.xml")))
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, _xmlWriterSettings)) {
{ using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, _xmlWriterSettings))
serializer.WriteObject(xmlWriter, elements); {
} serializer.WriteObject(xmlWriter, elements);
} }
} }
#endregion }
} #endregion
} }
}

@ -3,6 +3,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace DataPersistence namespace DataPersistence
@ -21,77 +22,123 @@ namespace DataPersistence
nameof(Recipe), nameof(Recipe),
new List<object>(new[] new List<object>(new[]
{ {
new Recipe( new Recipe("Cookies classiques", RecipeType.Dessert, null, "admin@mctg.fr", "")
title: "Cookies classiques", {
id: 50, Ingredients = new List<Ingredient>
authorMail: "admin@mctg.fr",
picture : "room_service_icon.png",
ingredients: new List<Ingredient>(new[]
{ {
new Ingredient("Patates", new Quantity(23, Unit.unit)), new Ingredient("Patates", new Quantity(23, Unit.unit)),
new Ingredient("Farine", new Quantity(23, Unit.G)) new Ingredient("Farine", new Quantity(23, Unit.G))
}), },
preparationSteps: new[] PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Faire cuire."), new PreparationStep(1, "Faire cuire."),
new PreparationStep(2, "Manger.") new PreparationStep(2, "Manger.")
}), },
Reviews = new List<Review>
{
new Review(4, "Bonne recette, je recommande !"),
new Review(3, "Bof bof, mais mangeable...")
}
},
new Recipe( new Recipe(
authorMail: "admin@mctg.fr",
title: "Cookies au chocolat", title: "Cookies au chocolat",
id: null, type: RecipeType.Dessert)
preparationSteps: new[] {
Ingredients = new List<Ingredient>
{
new Ingredient("Farine", new Quantity(200, Unit.G))
},
PreparationSteps = new List<PreparationStep>()
{ {
new PreparationStep(1, "Moulinez la pâte."), new PreparationStep(1, "Moulinez la pâte."),
new PreparationStep(2, "Faire cuire pendant une bonne heure."), new PreparationStep(2, "Faire cuire pendant une bonne heure."),
new PreparationStep(3, "Sortir du four et mettre dans un plat.") new PreparationStep(3, "Sortir du four et mettre dans un plat.")
}), }
},
new Recipe( new Recipe(
title: "Gateau nature", id: null, title: "Gateau nature",
authorMail: "admin@mctg.fr", type: RecipeType.Dessert)
preparationSteps: new[] {
Ingredients = new List<Ingredient>
{
new Ingredient("Farine", new Quantity(200, Unit.G)),
new Ingredient("Lait", new Quantity(2, Unit.L))
},
PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Achetez les ingrédients."), new PreparationStep(1, "Achetez les ingrédients."),
new PreparationStep(2, "Préparez le matériel. Ustensiles et tout."), new PreparationStep(2, "Préparez le matériel. Ustensiles et tout."),
new PreparationStep(3, "Pleurez.") new PreparationStep(3, "Pleurez.")
}), },
Reviews = new List<Review>
{
new Review("pedrosamigos@hotmail.com", 5, "C'était vraiment IN-CROY-ABLE !!!")
}
},
new Recipe( new Recipe(
title: "Gateau au pommes", id: null, title: "Gateau au pommes",
authorMail: "admin@mctg.fr", type: RecipeType.Dessert)
preparationSteps: new[] {
PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Achetez les légumes."), new PreparationStep(1, "Achetez les légumes."),
new PreparationStep(2, "Préparez le plat. Ustensiles et préchauffez le four."), new PreparationStep(2, "Préparez le plat. Ustensiles et préchauffez le four."),
new PreparationStep(3, "Coupez les pommes en morceaux et disposez-les sur le plat."), new PreparationStep(3, "Coupez les pommes en morceaux et disposez-les sur le plat."),
new PreparationStep(4, "Mettez enfin le plat au four, puis une fois cuit, dégustez !") new PreparationStep(4, "Mettez enfin le plat au four, puis une fois cuit, dégustez !")
}), }
},
new Recipe( new Recipe(
title: "Gateau au chocolat", id: null, title: "Gateau au chocolat",
authorMail: "pedrosamigos@hotmail.com", type: RecipeType.Dessert,
preparationSteps: new[] id: null, authorMail: "pedrosamigos@hotmail.com")
{
Ingredients = new List<Ingredient>
{
new Ingredient("Mais", new Quantity(2, Unit.kG)),
new Ingredient("Sachet pépites de chocolat", new Quantity(1, Unit.unit)),
new Ingredient("Dinde", new Quantity(2, Unit.G))
},
PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Ajouter les oeufs."), new PreparationStep(1, "Ajouter les oeufs."),
new PreparationStep(2, "Ajouter la farine."), new PreparationStep(2, "Ajouter la farine."),
new PreparationStep(3, "Ajouter 100g de chocolat fondu."), new PreparationStep(3, "Ajouter 100g de chocolat fondu."),
new PreparationStep(4, "Mélanger le tout."), new PreparationStep(4, "Mélanger le tout."),
new PreparationStep(5, "Faire cuire 45h au four traditionnel.") new PreparationStep(5, "Faire cuire 45h au four traditionnel.")
}), }
},
new Recipe( new Recipe(
title: "Dinde au jambon", title: "Dinde au jambon",
id: null, type: RecipeType.Dish,
authorMail: "pedrosamigos@hotmail.com", id: null, authorMail: "pedrosamigos@hotmail.com")
preparationSteps: new[] {
Ingredients = new List<Ingredient>
{
new Ingredient("Morceaux de bois", new Quantity(2, Unit.unit)),
new Ingredient("Sachet gélatine", new Quantity(1, Unit.unit)),
new Ingredient("Jambon", new Quantity(2, Unit.kG))
},
PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Faire une cuisson bien sec de la dinde à la poêle"), new PreparationStep(1, "Faire une cuisson bien sec de la dinde à la poêle"),
new PreparationStep(2, "Mettre la dinde au frigo."), new PreparationStep(2, "Mettre la dinde au frigo."),
new PreparationStep(3, "Mettre le jambon dans le micro-onde."), new PreparationStep(3, "Mettre le jambon dans le micro-onde."),
new PreparationStep(4, "Faire chauffer 3min."), new PreparationStep(4, "Faire chauffer 3min."),
new PreparationStep(5, "Présentez sur un plat la dinde et le jambon : Miam !") new PreparationStep(5, "Présentez sur un plat la dinde et le jambon : Miam !")
}), }
},
new Recipe( new Recipe(
title: "Poulet au curry", id: null, title: "Poulet au curry",
authorMail: "pedrosamigos@hotmail.com", type: RecipeType.Dish,
preparationSteps: new[] id: null, authorMail: "pedrosamigos@hotmail.com")
{
Ingredients = new List<Ingredient>
{
new Ingredient("Pissenlis", new Quantity(200, Unit.unit)),
new Ingredient("Boule de pétanque", new Quantity(10, Unit.unit)),
new Ingredient("Poivre", new Quantity(4, Unit.mG))
},
PreparationSteps = new List<PreparationStep>
{ {
new PreparationStep(1, "Trouvez des épices de curry."), new PreparationStep(1, "Trouvez des épices de curry."),
new PreparationStep(2, "Trouvez maintenant du poulet."), new PreparationStep(2, "Trouvez maintenant du poulet."),
@ -99,7 +146,12 @@ namespace DataPersistence
new PreparationStep(4, "Parsemez d'épices curry la tête de la poule."), new PreparationStep(4, "Parsemez d'épices curry la tête de la poule."),
new PreparationStep(5, "Mettre le tout au four traditionnel 30min."), new PreparationStep(5, "Mettre le tout au four traditionnel 30min."),
new PreparationStep(6, "Dégustez en famille !") new PreparationStep(6, "Dégustez en famille !")
}) },
Reviews = new List<Review>
{
new Review(5, "Meilleure recette que j'ai avalé de tout les temps !!!!!!!")
}
}
}) })
#endregion #endregion
}, },

@ -1,8 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -12,14 +14,28 @@ namespace Model.Managers
/// <summary> /// <summary>
/// The Main manager of the model. /// The Main manager of the model.
/// </summary> /// </summary>
public class MasterManager public class MasterManager : INotifyPropertyChanged
{ {
#region Attributes & Properties #region Attributes & Properties
public event PropertyChangedEventHandler? PropertyChanged;
private RecipeCollection _recipesInSearch = new RecipeCollection("");
/// <summary> /// <summary>
/// The currently connected user. 'null' if no user is connected. /// The currently connected user. 'null' if no user is connected.
/// </summary> /// </summary>
public User? CurrentConnectedUser { get; private set; } public User? CurrentConnectedUser { get; private set; }
public RecipeCollection RecipesInSearch
{
get => _recipesInSearch;
set
{
_recipesInSearch = value;
OnPropertyChange();
}
}
/// <summary> /// <summary>
/// The collection of all recipes loaded. /// The collection of all recipes loaded.
/// </summary> /// </summary>
@ -46,6 +62,7 @@ namespace Model.Managers
DataMgr = new DataManager(dataManager); DataMgr = new DataManager(dataManager);
CurrentConnectedUser = null; CurrentConnectedUser = null;
Recipes = DataMgr.GetRecipes("all recipes"); Recipes = DataMgr.GetRecipes("all recipes");
RecipesInSearch = DataMgr.GetRecipes("search on");
Users = DataMgr.GetUsers(); Users = DataMgr.GetUsers();
} }
#endregion #endregion
@ -63,11 +80,13 @@ namespace Model.Managers
if (Users is null || Users.Count == 0) if (Users is null || Users.Count == 0)
throw new ArgumentNullException("There is no users registred."); throw new ArgumentNullException("There is no users registred.");
#if DEBUG
if (mail == "admin") if (mail == "admin")
{ {
CurrentConnectedUser = Users.FirstOrDefault(u => u.Mail == "admin@mctg.fr"); CurrentConnectedUser = Users.FirstOrDefault(u => u.Mail == "admin@mctg.fr");
return true; return true;
} }
#endif
User? user = Users.Find(u => u.Mail == mail); User? user = Users.Find(u => u.Mail == mail);
@ -129,7 +148,14 @@ namespace Model.Managers
/// <returns>The current connected user's personal recipes.</returns> /// <returns>The current connected user's personal recipes.</returns>
public RecipeCollection GetCurrentUserRecipes() public RecipeCollection GetCurrentUserRecipes()
=> new RecipeCollection("User recipes", => new RecipeCollection("User recipes",
DataMgr.GetRecipes().FindAll(r => r.AuthorMail == CurrentConnectedUser?.Mail).ToArray()); DataMgr.GetRecipes().ToList().FindAll(r => r.AuthorMail == CurrentConnectedUser?.Mail).ToArray());
/// <summary>
/// Notify property change handler.
/// </summary>
/// <param name="propertyName">the name of the property that change.</param>
public void OnPropertyChange([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
} }
#endregion #endregion
} }

@ -19,6 +19,9 @@ namespace Model
[DataMember(Name = "image")] [DataMember(Name = "image")]
private string _image = ""; private string _image = "";
[DataMember(Name = "authorMail")]
private string _authorMail = "";
#endregion #endregion
#region Properties #region Properties
@ -32,15 +35,22 @@ namespace Model
/// List of reviews of this recipe. /// List of reviews of this recipe.
/// </summary> /// </summary>
[DataMember(Name = "reviews")] [DataMember(Name = "reviews")]
public List<Review> Reviews { get; private set; } public List<Review> Reviews { get; set; }
/// <summary> /// <summary>
/// AuthorMail's mail of the recipe. /// AuthorMail's mail of the recipe.
/// </summary> /// </summary>
[DataMember(Name = "authorMail")] public string? AuthorMail
public string? AuthorMail { get; private set; } {
get => _authorMail;
public string Toto { get; set; } = "Coucou"; set
{
if (string.IsNullOrEmpty(value))
_authorMail = "admin@mctg.fr";
else
_authorMail = value;
}
}
/// <summary> /// <summary>
/// The Title of the recipe. <br/> /// The Title of the recipe. <br/>
@ -74,6 +84,7 @@ namespace Model
} }
} }
/// <summary>
/// The list of ingredients. /// The list of ingredients.
/// </summary> /// </summary>
[DataMember(Name = "ingredient")] [DataMember(Name = "ingredient")]
@ -85,30 +96,34 @@ namespace Model
/// </summary> /// </summary>
[DataMember(Name = "preparation-steps")] [DataMember(Name = "preparation-steps")]
public List<PreparationStep> PreparationSteps { get; set; } public List<PreparationStep> PreparationSteps { get; set; }
/// <summary>
/// The type of recipe.
/// </summary>
[DataMember(Name = "type")]
public RecipeType Type { get; private set; }
#endregion #endregion
#region Constructors #region Constructors
/// <summary> /// <summary>
/// Construct a new recipe. /// Construct a new recipe.
/// </summary> /// </summary>
/// <param _name="title">The title of the recipe</param> /// <param name="title">The title of the recipe</param>
/// <param _name="id">The id of the recipe. If not given, get a new id.</param> /// <param name="type">The type of the recipe.</param>
/// <param _name="authorMail">The name of the user that create this recipe.</param> /// <param name="id">The id of the recipe. If not given, get a new id.</param>
/// <param _name="picture"> The image that represent the recipe</param> /// <param name="authorMail">The name of the user that create this recipe.</param>
/// <param _name="reviews">Thr list of reviews.</param> /// <param name="picture"> The image that represent the recipe</param>
/// <param _name="ingredients">Thr list of ingredients.</param> public Recipe(string title, RecipeType type, int? id, string? authorMail, string? picture)
/// <param _name="preparationSteps">The steps of the preparation of the meal</param>
public Recipe(string title, int? id, string? authorMail, string? picture,
List<Review> reviews, List<Ingredient> ingredients,
params PreparationStep[] preparationSteps)
{ {
Title = title; Title = title;
Type = type;
Image = picture; Image = picture;
PreparationSteps = new List<PreparationStep>(preparationSteps);
Ingredients = ingredients;
Reviews = reviews;
AuthorMail = authorMail; AuthorMail = authorMail;
PreparationSteps = new List<PreparationStep>();
Ingredients = new List<Ingredient>();
Reviews = new List<Review>();
if (id == null) if (id == null)
{ {
var randomGenerator = RandomNumberGenerator.Create(); var randomGenerator = RandomNumberGenerator.Create();
@ -119,46 +134,20 @@ namespace Model
else Id = (int)id; else Id = (int)id;
} }
public Recipe(string title, RecipeType type, int? id, string? authorMail)
/// <summary> : this(title, type, id, authorMail, null)
/// <inheritdoc cref="Recipe.Recipe(string, int?, List{Review}, PreparationStep[])"/>
/// </summary>
/// <param _name="title">The title of the recipe.</param>
/// <param _name="id">The id of the recipe. If not given, get a new id.</param>
/// <param _name="authorMail">Mail of the user that create the recipe</param>
/// <param _name="preparationSteps">The steps of the preparation of the meal.</param>
public Recipe(string title, int? id, string? authorMail, params PreparationStep[] preparationSteps)
: this(title, id, authorMail, null, new List<Review>(), new List<Ingredient>(), preparationSteps)
{ {
} }
/// <summary> public Recipe(string title, RecipeType type)
/// <inheritdoc cref="Recipe.Recipe(string, int?, List{Review}, PreparationStep[])"/> : this(title, type, null, null)
/// </summary>
/// <param _name="title">The title of the recipe.</param>
/// <param _name="id">The id of the recipe. If not given, get a new id.</param>
/// <param _name="authorMail">Mail of the user that create the recipe</param>
/// <param _name="picture">Mail of the user that create the recipe</param>
/// <param _name="ingredients">List of ingredients that compose the recipe. </param>
/// <param _name="preparationSteps">The steps of the preparation of the meal.</param>
public Recipe(string title, int? id, string? authorMail, string? picture, List<Ingredient> ingredients, params PreparationStep[] preparationSteps)
: this(title, id, authorMail, picture, new List<Review>(), ingredients, preparationSteps)
{ {
} }
/// <summary> public Recipe(string title)
/// <inheritdoc cref="Recipe.Recipe(string, int?, List{Review}, PreparationStep[])"/> : this(title, RecipeType.Unspecified)
/// </summary>
/// <param _name="title">The title of the recipe.</param>
/// <param _name="id">The id of the recipe. If not given, get a new id.</param>
/// <param _name="picture">Image that reppresent the recipe.</param>
/// <param _name="preparationSteps">The steps of the preparation of the meal.</param>
public Recipe()
: this("", null, null, null, new List<Review>(), new List<Ingredient>(),new PreparationStep[0])
{ {
} }
#endregion #endregion
#region Methods #region Methods

@ -1,106 +1,118 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Text; using System.Text;
namespace Model namespace Model
{ {
/// <summary> /// <summary>
/// Define a collection of <see cref="Recipe"/>. /// Define a collection of <see cref="Recipe"/>.
/// <br/>This class implement <see cref="IList"/> and <see cref="IEquatable{T}"/>. /// <br/>This class is derived from <see cref="ObservableCollection{Recipe}"/>
/// </summary> /// and implement <see cref="IEquatable{RecipeCollection}"/> and <see cref="ICloneable"/>.
public class RecipeCollection : List<Recipe>, IEquatable<RecipeCollection> /// </summary>
{ public class RecipeCollection : ObservableCollection<Recipe>, IEquatable<RecipeCollection>, ICloneable
#region Attributes {
private string _description = ""; #region Attributes
#endregion private string _description = "";
#endregion
#region Properties
/// <summary> #region Properties
/// A short description of what this collection contain. <br/> /// <summary>
/// Set to "No description." when the value passed is null, empty or contain white spaces. /// A short description of what this collection contain. <br/>
/// </summary> /// Set to "No description." when the value passed is null, empty or contain white spaces.
public string Description /// </summary>
{ public string Description
get => _description; {
set get => _description;
{ set
if (string.IsNullOrWhiteSpace(value)) {
_description = "No description."; if (string.IsNullOrWhiteSpace(value))
else _description = "No description.";
_description = value; else
} _description = value;
} }
#endregion }
#endregion
#region Constructors
/// <summary> #region Constructors
/// Construct a new collection of _recipes. /// <summary>
/// </summary> /// Construct a new collection of _recipes.
/// <param _name="description">A short description of what this list will contain</param> /// </summary>
/// <param _name="recipes">Recipes to add in this new collection</param> /// <param _name="description">A short description of what this list will contain</param>
public RecipeCollection(string description, params Recipe[] recipes) /// <param _name="recipes">Recipes to add in this new collection</param>
: base(recipes) public RecipeCollection(string description, params Recipe[] recipes)
{ : base(recipes)
Description = description; {
} Description = description;
#endregion }
#endregion
#region Methods
/// <summary> #region Methods
/// Find a recipe in this list by giving the id. /// <summary>
/// </summary> /// Find a recipe in this list by giving the id.
/// <param _name="id">The id of the list we are looking for</param> /// </summary>
/// <returns>The recipe of the id given</returns> /// <param _name="id">The id of the list we are looking for</param>
/// <exception cref="ArgumentException"/> /// <returns>The recipe of the id given</returns>
public Recipe? GetRecipeById(int id) /// <exception cref="ArgumentException"/>
{ public Recipe? GetRecipeById(int id)
Recipe? recipe = this.Find(r => r.Id == id); {
if (recipe == null) throw new ArgumentException("No _recipes match the given id."); Recipe? recipe = this.ToList().Find(r => r.Id == id);
return recipe;
} if (recipe == null) throw new ArgumentException("No _recipes match the given id.");
return recipe;
/// <summary> }
/// Utility to find a recipe by his _name.
/// </summary> /// <summary>
/// <param _name="str">The string for the search</param> /// Utility to find a recipe by his _name.
/// <returns>A collection of Recipe where their Title contain the string.</returns> /// </summary>
public RecipeCollection ResearchByName(string str) /// <param _name="str">The string for the search</param>
{ /// <returns>A collection of Recipe where their Title contain the string.</returns>
return new RecipeCollection( public RecipeCollection ResearchByName(string str)
description: $"Results of the research: {str}", {
recipes: this.FindAll(x => x.Title.ToLower().Contains(str.ToLower())).ToArray()); if (string.IsNullOrEmpty(str))
} return this;
public virtual bool Equals(RecipeCollection? other) return new RecipeCollection(
{ description: $"Results of the research: {str}",
if (other == null) return false; recipes: this.ToList().FindAll(x => x.Title.ToLower().Contains(str.ToLower())).ToArray());
if (other == this) return true; }
return this.Description.Equals(other.Description);
} public virtual bool Equals(RecipeCollection? other)
{
public override bool Equals(object? obj) if (other == null) return false;
{ if (other == this) return true;
var item = obj as RecipeCollection; return this.Description.Equals(other.Description);
if (item == null) return false; }
return Equals(obj);
} public override bool Equals(object? obj)
{
public override int GetHashCode() var item = obj as RecipeCollection;
{ if (item == null) return false;
return Description.GetHashCode(); return Equals(obj);
} }
public override string ToString() public override int GetHashCode()
{ {
StringBuilder sb = new StringBuilder($"[RecipeCollection] - {Description}:\n"); return Description.GetHashCode();
foreach (Recipe r in this) }
{
sb.AppendFormat("\t - {0}\n", r.ToString()); public override string ToString()
} {
return sb.ToString(); StringBuilder sb = new StringBuilder($"[RecipeCollection] - {Description}:\n");
} foreach (Recipe r in this)
#endregion {
} sb.AppendFormat("\t - {0}\n", r.ToString());
} }
return sb.ToString();
}
public object Clone()
{
return new RecipeCollection(
description: this.Description,
recipes: this.ToArray());
}
#endregion
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Model
{
public enum RecipeType
{
Unspecified,
Starter,
Dish,
Dessert
}
}

@ -8,9 +8,8 @@ namespace Model_UnitTests
public void TestVoidConstructor() public void TestVoidConstructor()
{ {
Recipe r = new Recipe( Recipe r = new Recipe(
title: "test recipe", title: "test recipe", type: RecipeType.Unspecified);
id: null,
authorMail: "test@test.fr");
Assert.NotNull(r.Title); Assert.NotNull(r.Title);
} }
} }

@ -35,31 +35,14 @@ namespace Views
//collection de recette de l'application //collection de recette de l'application
public RecipeCollection AllRecipes { get; set; } public RecipeCollection AllRecipes { get; set; }
//const int WindowWidth = 1200;
//const int WindowHeight = 800;
public App() public App()
{ {
CurrentUser = MasterMgr.DataMgr.GetUsers().Last(); CurrentUser = MasterMgr.CurrentConnectedUser;
AllRecipes = MasterMgr.DataMgr.GetRecipes("All recipes"); AllRecipes = MasterMgr.DataMgr.GetRecipes("All recipes");
CurrentRecipe = MasterMgr.DataMgr.GetRecipes().First(); CurrentRecipe = MasterMgr.DataMgr.GetRecipes().First();
InitializeComponent(); InitializeComponent();
// Microsoft.Maui.Handlers.WindowHandler.Mapper.AppendToMapping(nameof(IWindow), (handler, view) =>
// {
//#if WINDOWS
// var mauiWindow = handler.VirtualView;
// var nativeWindow = handler.PlatformView;
// nativeWindow.Activate();
// IntPtr windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(nativeWindow);
// WindowId windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(windowHandle);
// AppWindow appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
// appWindow.Resize(new SizeInt32(WindowWidth, WindowHeight));
//#endif
// });
/* - Comment(ctrl-k + ctrl-c)/Uncomment(ctrl-k + ctrl-u) to change page - */
UserAppTheme = AppTheme.Light; UserAppTheme = AppTheme.Light;
MainPage = new MyProfil(); MainPage = new MyProfil();
//MainPage = new MyPosts(); //MainPage = new MyPosts();

@ -16,18 +16,20 @@
HorizontalOptions="Start" Padding="10, 10, 0, 0"/> HorizontalOptions="Start" Padding="10, 10, 0, 0"/>
<!-- Header --> <!-- Header -->
<ImageButton Source="person_default.png" HorizontalOptions="Center" <ImageButton Source="person_default.png" HorizontalOptions="Center"
BackgroundColor="{StaticResource Secondary}" BackgroundColor="{StaticResource Secondary}"
WidthRequest="100" HeightRequest="100" WidthRequest="100" HeightRequest="100"
CornerRadius="50" Margin="0, 30, 0, 10" CornerRadius="50" Margin="0, 30, 0, 10"
BorderWidth="5" BorderColor="Black" BorderWidth="5" BorderColor="Black"
IsEnabled="{Binding IsNotConnected, Source={x:Reference fl}}" IsEnabled="{Binding IsNotConnected, Source={x:Reference fl}}"
Grid.RowSpan="2"/> Grid.RowSpan="2"
Clicked="ProfileButton_Clicked"/>
</Grid> </Grid>
<Button Text="Connection" ImageSource="login_icon.png" <Button Text="Connection" ImageSource="login_icon.png"
Style="{StaticResource button2}" Style="{StaticResource button2}"
IsVisible="{Binding IsNotConnected, Source={x:Reference fl}}" IsVisible="{Binding IsNotConnected, Source={x:Reference fl}}"
IsEnabled="{Binding IsNotConnected, Source={x:Reference fl}}"/> IsEnabled="{Binding IsNotConnected, Source={x:Reference fl}}"
Clicked="ConnectionButton_Clicked"/>
<StackLayout BindingContext="{Binding user}"> <StackLayout BindingContext="{Binding user}">
<Label Text="{Binding Name}" <Label Text="{Binding Name}"
HorizontalOptions="Center" Margin="0,15" HorizontalOptions="Center" Margin="0,15"
@ -40,7 +42,6 @@
TextColor="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" TextColor="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}"
IsVisible="{Binding IsNotConnected, Converter={toolkit:InvertedBoolConverter} ,Source={x:Reference fl}}"/> IsVisible="{Binding IsNotConnected, Converter={toolkit:InvertedBoolConverter} ,Source={x:Reference fl}}"/>
</StackLayout> </StackLayout>
</VerticalStackLayout> </VerticalStackLayout>

@ -17,6 +17,7 @@ public partial class ContainerFlyout : ContentView
} }
#region Bindable XAML Properties
// Bind MyFlyoutContent // Bind MyFlyoutContent
public static readonly BindableProperty MyFlyoutContentProperty = public static readonly BindableProperty MyFlyoutContentProperty =
BindableProperty.Create("MyFlyoutContent", typeof(View), typeof(ContainerFlyout), new Grid()); BindableProperty.Create("MyFlyoutContent", typeof(View), typeof(ContainerFlyout), new Grid());
@ -46,4 +47,15 @@ public partial class ContainerFlyout : ContentView
get => (bool)GetValue(NeedReturnProperty); get => (bool)GetValue(NeedReturnProperty);
set => SetValue(NeedReturnProperty, value); set => SetValue(NeedReturnProperty, value);
} }
#endregion
public async void ProfileButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new MyProfil());
}
public async void ConnectionButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new Login());
}
} }

@ -4,46 +4,55 @@
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:local="clr-namespace:Views" xmlns:local="clr-namespace:Views"
xmlns:model="clr-namespace:Model;assembly=Model" xmlns:model="clr-namespace:Model;assembly=Model"
x:Class="Views.Home"> x:Class="Views.Home"
x:Name="homepage">
<local:ContainerBase <local:ContainerBase
IsNotConnected="True"> IsNotConnected="{Binding IsNotConnected, Source={x:Reference homepage}}"
NeedReturn="{Binding NeedReturn, Source={x:Reference homepage}}">
<!-- Flyout --> <!-- Flyout -->
<local:ContainerBase.MyFlyoutContent> <local:ContainerBase.MyFlyoutContent>
<VerticalStackLayout Grid.Row="1"> <VerticalStackLayout Grid.Row="1">
<!-- Research --> <!-- Research -->
<Button <Label
Text="Recherche" Text="Recherche de recettes :" FontSize="14"
ImageSource="search_icon.png" Margin="20, 10, 15, 0"/>
MaximumHeightRequest="20"
Style="{StaticResource button1}"/>
<SearchBar <SearchBar
Placeholder="Mots-clés (ex.: rapide, fromage)" Placeholder="Mots-clés (ex.: rapide, fromage)"
FontAttributes="Italic" TextColor="Black" FontAttributes="Italic" TextColor="Black"
BackgroundColor="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray300}}" BackgroundColor="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray300}}"
Margin="15, 10, 15, 40"/> Margin="15, 10, 15, 40"
SearchButtonPressed="SearchBar_SearchButtonPressed"/>
<!-- Direct research --> <!-- Direct research -->
<Button
Text="Toutes les recettes"
ImageSource="home_icon.png"
Style="{StaticResource button1}"
Clicked="AllRecipes_Clicked"/>
<Button <Button
Text="Entrées" Text="Entrées"
ImageSource="flatware_icon.png" ImageSource="flatware_icon.png"
Style="{StaticResource button1}"/> Style="{StaticResource button1}"
Clicked="Entrees_Clicked"/>
<Button <Button
Text="Plats" Text="Plats"
ImageSource="room_service_icon.png" ImageSource="room_service_icon.png"
Style="{StaticResource button1}"/> Style="{StaticResource button1}"
Clicked="Plats_Clicked"/>
<Button <Button
Text="Desserts" Text="Desserts"
ImageSource="coffee_icon.png" ImageSource="coffee_icon.png"
Style="{StaticResource button1}"/> Style="{StaticResource button1}"
Clicked="Desserts_Clicked"/>
</VerticalStackLayout> </VerticalStackLayout>
</local:ContainerBase.MyFlyoutContent> </local:ContainerBase.MyFlyoutContent>
<!-- Master --> <!-- Master -->
<local:ContainerBase.MyContent> <local:ContainerBase.MyContent>
<ScrollView> <ScrollView>
<StackLayout BindingContext="{Binding AllRecipes}" MinimumWidthRequest="400"> <StackLayout BindingContext="{Binding RecipesDisplayed}" MinimumWidthRequest="400">
<!--Modification du prof apportée sur le stacklayout pour empecher l'affichage d'une seule case recipe--> <!--Modification du prof apportée sur le stacklayout pour empecher l'affichage d'une seule case recipe-->
<Label <Label
Text="{Binding Description}" Text="{Binding Description}"
@ -62,42 +71,14 @@
<BindableLayout.ItemTemplate> <BindableLayout.ItemTemplate>
<DataTemplate x:DataType="model:Recipe"> <DataTemplate x:DataType="model:Recipe">
<Border Style="{StaticResource recipeCase}">
<Grid RowDefinitions="*, 40">
<!--<local:RecipeCase
CaseImageSource="room_service_icon.png"
Title="{Binding Title}"/>-->
<ImageButton <local:RecipeCase
Grid.Row="0" VerticalOptions="Fill" CaseImageSource="{Binding Image}"
Source="{Binding Image}" RecipeTitle="{Binding Title}"/>
Clicked="OnImageClicked"/>
<Label
Text="{Binding Title}" FontSize="18"
Grid.Row="1" HorizontalOptions="Center"/>
</Grid>
</Border>
</DataTemplate> </DataTemplate>
</BindableLayout.ItemTemplate> </BindableLayout.ItemTemplate>
<!--<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>
<local:RecipeCase CaseImageSource="room_service_icon.png"/>-->
</FlexLayout> </FlexLayout>
</StackLayout> </StackLayout>
</ScrollView> </ScrollView>

@ -2,29 +2,97 @@
using DataPersistence; using DataPersistence;
using Model; using Model;
using Model.Managers; using Model.Managers;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace Views namespace Views
{ {
public partial class Home : ContentPage public partial class Home : ContentPage
{ {
public MasterManager MasterMgr => (App.Current as App).MasterMgr; public MasterManager MasterMgr => (App.Current as App).MasterMgr;
public User user => (App.Current as App).CurrentUser; public User? user => (App.Current as App).CurrentUser;
public Recipe Recipe => (App.Current as App).CurrentRecipe; public RecipeCollection AllRecipe => (App.Current as App).AllRecipes;
public RecipeCollection AllRecipes => (App.Current as App).AllRecipes;
private readonly RecipeCollection _recipesDisplayed;
public ReadOnlyObservableCollection<Recipe> RecipesDisplayed { get; private set; }
public static readonly BindableProperty IsNotConnectedProperty =
BindableProperty.Create("IsNotConnected", typeof(bool), typeof(bool));
public bool IsNotConnected
{
get => (bool)GetValue(IsNotConnectedProperty);
set => SetValue(IsNotConnectedProperty, value);
}
public static readonly BindableProperty NeedReturnProperty =
BindableProperty.Create("NeedReturn", typeof(bool), typeof(bool));
public bool NeedReturn
{
get => (bool)GetValue(NeedReturnProperty);
set => SetValue(NeedReturnProperty, value);
}
public Home() public Home()
{ {
//DataMgr = new DataManager(new Stubs()); _recipesDisplayed = (RecipeCollection)AllRecipe.Clone();
//AllRecipes = new RecipeCollection("Toutes les recettes", DataMgr.Data[nameof(Recipe)].Cast<Recipe>().ToArray()); RecipesDisplayed = new ReadOnlyObservableCollection<Recipe>(_recipesDisplayed);
InitializeComponent();
BindingContext = this;
IsNotConnected = true;
NeedReturn = false;
}
public Home(RecipeCollection recipesDisplayed)
{
_recipesDisplayed = recipesDisplayed;
InitializeComponent(); InitializeComponent();
BindingContext = this; BindingContext = this;
IsNotConnected = true;
NeedReturn = true;
}
private void ModifyRecipesDisplayed(RecipeCollection recipes)
{
_recipesDisplayed.Clear();
_recipesDisplayed.Description = recipes.Description;
foreach (Recipe recipe in recipes)
{
_recipesDisplayed.Add(recipe);
}
}
private void SearchBar_SearchButtonPressed(object sender, EventArgs e)
{
string searchStr = (sender as SearchBar).Text;
ModifyRecipesDisplayed(AllRecipe.ResearchByName(searchStr));
} }
public void OnImageClicked(object sender, EventArgs e) public void OnImageClicked(object sender, EventArgs e)
{ {
(App.Current as App).CurrentRecipe = (Recipe)(sender as ImageButton).BindingContext; (App.Current as App).CurrentRecipe = (Recipe)(sender as ImageButton).BindingContext;
Navigation.PushModalAsync(new ViewRecette()); Navigation.PushModalAsync(new ViewRecette());
} }
private void Entrees_Clicked(object sender, EventArgs e)
{
ModifyRecipesDisplayed(new RecipeCollection("Entrées", AllRecipe.ToList().FindAll(r => r.Type == RecipeType.Starter).ToArray()));
}
private void Plats_Clicked(object sender, EventArgs e)
{
ModifyRecipesDisplayed(new RecipeCollection("Plats", AllRecipe.ToList().FindAll(r => r.Type == RecipeType.Dish).ToArray()));
}
private void Desserts_Clicked(object sender, EventArgs e)
{
ModifyRecipesDisplayed(new RecipeCollection("Desserts", AllRecipe.ToList().FindAll(r => r.Type == RecipeType.Dessert).ToArray()));
}
private void AllRecipes_Clicked(object sender, EventArgs e)
{
ModifyRecipesDisplayed(AllRecipe);
}
} }
} }

@ -8,12 +8,14 @@
<Border Style="{StaticResource recipeCase}"> <Border Style="{StaticResource recipeCase}">
<Grid RowDefinitions="*, 40"> <Grid RowDefinitions="*, 40">
<Image <ImageButton
Grid.Row="0" VerticalOptions="Fill" Grid.Row="0" VerticalOptions="Fill"
Source="{Binding CaseImageSource, Source={x:Reference rCase}}"/> Source="{Binding CaseImageSource, Source={x:Reference rCase}}"
Clicked="ImageButton_Clicked"/>
<Label Text="Recette 1" FontSize="18"
Grid.Row="1" HorizontalOptions="Center"/> <Label
Grid.Row="1" HorizontalOptions="Center" VerticalOptions="Center"
Text="{Binding RecipeTitle, Source={x:Reference rCase}}"/>
</Grid> </Grid>
</Border> </Border>

@ -1,18 +1,32 @@
namespace Views; namespace Views;
public partial class RecipeCase : ContentView public partial class RecipeCase : ContentView
{ {
public RecipeCase() public RecipeCase()
{ {
InitializeComponent(); InitializeComponent();
} }
public static readonly BindableProperty CaseImageSourceProperty = public static readonly BindableProperty CaseImageSourceProperty =
BindableProperty.Create("CaseImageSource", typeof(ImageSource), typeof(Image)); BindableProperty.Create("CaseImageSource", typeof(ImageSource), typeof(Image));
public ImageSource CaseImageSource public ImageSource CaseImageSource
{ {
get => (ImageSource)GetValue(CaseImageSourceProperty); get => (ImageSource)GetValue(CaseImageSourceProperty);
set => SetValue(CaseImageSourceProperty, value); set => SetValue(CaseImageSourceProperty, value);
} }
}
public static readonly BindableProperty RecipeTitleProperty =
BindableProperty.Create("RecipeTitle", typeof(string), typeof(Label));
public string RecipeTitle
{
get => (string)GetValue(RecipeTitleProperty);
set => SetValue(RecipeTitleProperty, value);
}
private async void ImageButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new ViewRecette());
}
}

@ -1,24 +1,24 @@
namespace Views; namespace Views;
public partial class ReturnButton : ContentView public partial class ReturnButton : ContentView
{ {
public ReturnButton() public ReturnButton()
{ {
InitializeComponent(); InitializeComponent();
}
// bind NeedReturn
public static readonly BindableProperty NeedReturnProperty =
BindableProperty.Create("NeedReturn", typeof(bool), typeof(Border), false);
public bool NeedReturn
{
get => (bool)GetValue(NeedReturnProperty);
set => SetValue(NeedReturnProperty, value);
} }
public void OnClickedReturn(object sender, EventArgs e) // bind NeedReturn
{ public static readonly BindableProperty NeedReturnProperty =
BindableProperty.Create("NeedReturn", typeof(bool), typeof(Border), false);
public bool NeedReturn
{
get => (bool)GetValue(NeedReturnProperty);
set => SetValue(NeedReturnProperty, value);
}
public void OnClickedReturn(object sender, EventArgs e)
{
Navigation.PopModalAsync(); Navigation.PopModalAsync();
} }
} }

@ -30,7 +30,7 @@
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion> <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion> <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
<Configurations>Debug;Release;CI</Configurations> <Configurations>Debug;Release</Configurations>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

Loading…
Cancel
Save