Merge branch 'developpement'
continuous-integration/drone/push Build is passing Details

master
Matheo THIERRY 2 years ago
commit 5d4ed6dd06

@ -78,7 +78,7 @@ namespace Biblioteque_de_Class
return user; return user;
} }
} }
throw new AlreadyUsedException("No user found with this username."); throw new NotFoundException("No user found with this username.");
} }
/// <summary> /// <summary>
@ -112,12 +112,16 @@ namespace Biblioteque_de_Class
{ {
throw new AlreadyUsedException("Username already used."); throw new AlreadyUsedException("Username already used.");
} }
else if (existingUser.Email == user.Email) else if (user.Email != "")
{
if (existingUser.Email == user.Email)
{ {
throw new AlreadyUsedException("Email already used."); throw new AlreadyUsedException("Email already used.");
} }
} }
}
UserList.Add(user); UserList.Add(user);
user.CreateNote("", ""); // création d'une note vide pour l'utilisateur
} }
/// <summary> /// <summary>

@ -1,14 +1,11 @@
using System; using System.ComponentModel;
using System.Collections.Generic; using System.Drawing;
using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class namespace Biblioteque_de_Class
{ {
[DataContract(IsReference = true)] [DataContract(IsReference = true)]
public class Note public class Note : INotifyPropertyChanged
{ {
[DataMember] [DataMember]
public int id { get; init; } public int id { get; init; }
@ -18,11 +15,17 @@ namespace Biblioteque_de_Class
public string Name public string Name
{ {
get { return name; } get { return name; }
set { if (value == null) { name = "Unnamed Note"; } else { name = value; } } set { if (value == "") { name = "Unnamed Note"; } else { name = value; } OnPropertyChanged(nameof(Name)); }
} }
[DataMember] [DataMember]
public string Text { get; private set; } = ""; private string text;
public string Text {
get => text;
set {
text = value;
OnPropertyChanged(nameof(Text));
} }
[DataMember] [DataMember]
private string logoPath; private string logoPath;
@ -30,7 +33,7 @@ namespace Biblioteque_de_Class
public string LogoPath public string LogoPath
{ {
get { return logoPath; } get { return logoPath; }
private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } } private set { if (value == "") { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } OnPropertyChanged(nameof(LogoPath)); }
} }
[DataMember] [DataMember]
@ -45,7 +48,23 @@ namespace Biblioteque_de_Class
public List<User> Editors { get; private set; } public List<User> Editors { get; private set; }
[DataMember] [DataMember]
public User Owner { get; private set; } public User Owner { get; private set; }
public bool isfavorite;
public bool IsFavorite
{
get => isfavorite;
set
{
isfavorite = value;
OnPropertyChanged(nameof(IsFavorite));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public Note(int initId,string name, string logoPath, User owner) public Note(int initId,string name, string logoPath, User owner)
{ {
id = initId; id = initId;

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text; using System.Text;
@ -11,9 +13,39 @@ namespace Biblioteque_de_Class
public class Tags public class Tags
{ {
[DataMember] [DataMember]
public string Name { get; set; } private string name;
public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
OnPropertyChanged(nameof(Name));
}
}
}
[DataMember] [DataMember]
public string Color { get; set; } private string color;
public string Color
{
get { return color; }
set
{
if (color != value)
{
color = value;
OnPropertyChanged(nameof(Color));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public Tags(string name, string color) public Tags(string name, string color)
{ {

@ -6,29 +6,158 @@ using System.Runtime.Serialization;
namespace Biblioteque_de_Class namespace Biblioteque_de_Class
{ {
[DataContract] [DataContract]
public class User public class User : INotifyPropertyChanged
{ {
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[DataMember] [DataMember]
public string Username { get; set; } private string username;
public string Username
{
get { return username; }
set
{
if (username == value)
return;
username = value;
OnPropertyChanged(nameof(Username));
}
}
[DataMember] [DataMember]
public string Email { get; private set; } private string email;
public string Email
{
get { return email; }
set
{
if (email == value)
return;
email = value;
OnPropertyChanged(nameof(Email));
}
}
[DataMember] [DataMember]
public string Password { get; private set; } private string password;
public string Password
{
get { return password; }
set
{
if (password == value)
return;
password = value;
OnPropertyChanged(nameof(Password));
}
}
[DataMember] [DataMember]
public string Picture { get; private set; } private string picture;
public string Picture
{
get { return picture; }
set
{
if (picture == value)
return;
picture = value;
OnPropertyChanged(nameof(Picture));
}
}
[DataMember] [DataMember]
public Theme UseTheme { get; set; } private Theme useTheme;
public Theme UseTheme
{
get { return useTheme; }
set
{
if (useTheme == value)
return;
useTheme = value;
OnPropertyChanged(nameof(UseTheme));
}
}
[DataMember] [DataMember]
public List<Note> NoteList { get; set; } private List<Note> noteList;
public List<Note> NoteList
{
get { return noteList; }
set
{
if (noteList == value)
return;
noteList = value;
OnPropertyChanged(nameof(NoteList));
}
}
[DataMember] [DataMember]
public List<Tags> TagList { get; private set; } private List<Tags> tagList;
public List<Tags> TagList
{
get { return tagList; }
set
{
if (tagList == value)
return;
tagList = value;
OnPropertyChanged(nameof(TagList));
}
}
[DataMember] [DataMember]
public List<Note> FavList { get; private set; } private List<Note> favList;
public List<Note> FavList
{
get { return favList; }
set
{
if (favList == value)
return;
favList = value;
OnPropertyChanged(nameof(FavList));
}
}
[DataMember(EmitDefaultValue = false)] [DataMember(EmitDefaultValue = false)]
public bool IsConnected { get; set; } private bool isConnected;
public bool IsConnected
{
get { return isConnected; }
set
{
if (isConnected == value)
return;
isConnected = value;
OnPropertyChanged(nameof(IsConnected));
}
}
[DataMember]
private Dictionary<Note, List<Tags>> noteTagged;
public Dictionary<Note, List<Tags>> NoteTagged
{
get { return noteTagged; }
set
{
if (noteTagged == value)
return;
noteTagged = value;
OnPropertyChanged(nameof(NoteTagged));
}
}
[DataMember] [DataMember]
public Dictionary<Note, List<Tags>> NoteTagged { get; set; } private List<Theme> addedTheme;
public List<Theme> AddedTheme { get; set; } public List<Theme> AddedTheme
{
get { return addedTheme; }
set
{
if (addedTheme == value)
return;
addedTheme = value;
OnPropertyChanged(nameof(AddedTheme));
}
}
public User(string username, string email, string password) public User(string username, string email, string password)
{ {
@ -161,6 +290,7 @@ namespace Biblioteque_de_Class
throw new AlreadyExistException("Note already in favorites"); throw new AlreadyExistException("Note already in favorites");
} }
FavList.Add(note); FavList.Add(note);
note.IsFavorite = true;
} }
/// <summary> /// <summary>
@ -171,6 +301,7 @@ namespace Biblioteque_de_Class
if (FavList.Contains(note)) if (FavList.Contains(note))
{ {
FavList.Remove(note); FavList.Remove(note);
note.IsFavorite = false;
} }
else else
{ {
@ -182,6 +313,8 @@ namespace Biblioteque_de_Class
///creer une note ///creer une note
/// </summary> /// </summary>
public Note CreateNote(string name, string imagePath) public Note CreateNote(string name, string imagePath)
{
if (name != "")
{ {
foreach (Note existingNote in NoteList) foreach (Note existingNote in NoteList)
{ {
@ -190,6 +323,7 @@ namespace Biblioteque_de_Class
throw new AlreadyExistException("Note already exists"); throw new AlreadyExistException("Note already exists");
} }
} }
}
Note note; Note note;
if (NoteList.Count == 0) { note = new Note(0, name, imagePath, this); } if (NoteList.Count == 0) { note = new Note(0, name, imagePath, this); }
else { note = new Note(NoteList[NoteList.Count - 1].id + 1, name, imagePath, this); } else { note = new Note(NoteList[NoteList.Count - 1].id + 1, name, imagePath, this); }

@ -63,7 +63,7 @@ namespace UnitTests_Model
public void GetUser_UserDoesNotExist_ThrowsException() public void GetUser_UserDoesNotExist_ThrowsException()
{ {
string userName = "Eve"; string userName = "Eve";
Assert.Throws<AlreadyUsedException>(() => database.GetUser(userName)); Assert.Throws<NotFoundException>(() => database.GetUser(userName));
} }
// ComparePassword tests // ComparePassword tests

@ -1,6 +1,8 @@
<?xml version = "1.0" encoding = "UTF-8" ?> <?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:model="clr-namespace:Biblioteque_de_Class;assembly=Biblioteque_de_Class"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:notus" xmlns:local="clr-namespace:notus"
x:Class="notus.App"> x:Class="notus.App">
<Application.Resources> <Application.Resources>
@ -11,4 +13,5 @@
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>
</Application> </Application>

@ -6,15 +6,54 @@ namespace notus;
public partial class App : Application public partial class App : Application
{ {
public PersistenceManager manager = new PersistenceManager(new Stub()); public PersistenceManager Mgr { get; private set; } = new PersistenceManager(new Stub());
public Database db = new Database(); public Database db = new Database();
public App() public App()
{ {
InitializeComponent(); InitializeComponent();
db = manager.LoadDatabaseData(); db = Mgr.LoadDatabaseData();
BindingContext = db;
MainPage = new AppShell(); MainPage = new AppShell();
} }
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
// Set minimum height and width
window.MinimumHeight = 670;
window.MinimumWidth = 1200;
return window;
}
private User selecUser;
public User SelectedUser
{
get
{
return selecUser;
}
set
{
selecUser = value;
OnPropertyChanged(nameof(SelectedUser));
}
}
private Note selecNote;
public Note SelectedNote
{
get
{
return selecNote;
}
set
{
selecNote = value;
OnPropertyChanged(nameof(SelectedNote));
}
}
} }

@ -3,10 +3,12 @@
x:Class="notus.AppShell" x:Class="notus.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:model="clr-namespace:Biblioteque_de_Class;assembly=Biblioteque_de_Class"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:notus" xmlns:local="clr-namespace:notus"
Shell.FlyoutBehavior="Locked" Shell.FlyoutBehavior="Locked"
Shell.FlyoutWidth="30" Shell.FlyoutWidth="30"
Shell.NavBarIsVisible="True" Shell.NavBarIsVisible="False"
Shell.BackgroundColor="Grey"> Shell.BackgroundColor="Grey">
<ShellContent <ShellContent

@ -1,7 +1,11 @@
namespace notus; using Biblioteque_de_Class;
using Notus_Persistance;
namespace notus;
public partial class AppShell : Shell{ public partial class AppShell : Shell{
public AppShell(){ public AppShell(){
InitializeComponent(); InitializeComponent();
} }
} }

@ -5,15 +5,19 @@
x:Class="notus.ConnecPage" x:Class="notus.ConnecPage"
Title="ConnecPage" Title="ConnecPage"
BackgroundColor="#1C1C1C"> BackgroundColor="#1C1C1C">
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="2*"/> <RowDefinition Height="2*"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="80"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/> <RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/> <RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="4*"/> <RowDefinition Height="4*"/>
@ -27,6 +31,21 @@
<ColumnDefinition Width="4*"/> <ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<ImageButton
Source="return.png"
Aspect="AspectFit"
Grid.Column="0"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
Margin="10,10,0,0"
CornerRadius="50"
Clicked="Back_Clicked"
/>
<Label <Label
Grid.Column="1" Grid.Column="1"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
@ -39,18 +58,19 @@
FontFamily="strong" FontFamily="strong"
/> />
<Entry x:Name="Mail" <Entry x:Name="username"
Grid.Column="1" Grid.Column="1"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Grid.Row="3" Grid.Row="3"
FontSize="22" FontSize="22"
Placeholder="entrer votre e-mail" Placeholder="entrer votre Username"
PlaceholderColor="#74fabd" PlaceholderColor="#74fabd"
TextColor="#74fabd" TextColor="#74fabd"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
Text="{Binding Username}"
/> />
<Entry x:Name="Password" <Entry x:Name="password"
Grid.Column="1" Grid.Column="1"
Grid.ColumnSpan="3" Grid.ColumnSpan="3"
Grid.Row="5" Grid.Row="5"
@ -60,21 +80,23 @@
TextColor="#74fabd" TextColor="#74fabd"
IsPassword="true" IsPassword="true"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
Text="{Binding Password}"
/> />
<Button <Button
WidthRequest="80"
Grid.Column="2" Grid.Column="2"
Grid.ColumnSpan="1" Grid.ColumnSpan="1"
Grid.Row="7" Grid.Row="7"
Text="Valider" Text="Valider"
TextColor="Black" TextColor="Black"
BackgroundColor="#74fabd" BackgroundColor="#74fabd"
Clicked="Valid_Clicked" Clicked="Connec_Clicked"
/> />
<Label <Label
x:Name="ResultSearch" x:Name="ResultSearch"
Text="Mail ou mot de passe incorrect." Text="Incorrect email or password."
IsVisible="false" IsVisible="false"
Grid.Column="2" Grid.Column="2"
Grid.Row="7" Grid.Row="7"

@ -1,28 +1,46 @@
using Biblioteque_de_Class; using Biblioteque_de_Class;
using Windows.UI.Core;
namespace notus; namespace notus;
public partial class ConnecPage : ContentPage public partial class ConnecPage : ContentPage
{ {
string mail = ""; User selectUser = (Application.Current as App).SelectedUser;
string MDP = ""; Database db = (Application.Current as App).db;
public string Username { get; set; }
public string Password { get; set; }
public ConnecPage() public ConnecPage()
{ {
InitializeComponent(); InitializeComponent();
BindingContext = this;
} }
private async void Valid_Clicked(object sender, EventArgs e) private void Connec_Clicked(object sender, EventArgs e)
{
try
{
selectUser = db.GetUser(Username);
}
catch (NotFoundException)
{ {
mail = Mail.Text; DisplayAlert("Erreur", "Cet utilisateur n'existe pas" , "OK");
MDP = Password.Text; return;
if ((Application.Current as App).db.SearchUser(mail, MDP)) }
if (Database.ComparePassword(selectUser, HashCodeModel.GetSHA256Hash(Password).ToString()))
{ {
await Navigation.PushAsync(new RecherPage()); selectUser.IsConnected = true;
(Application.Current as App).SelectedUser = selectUser;
Navigation.PushAsync(new RecherPage());
} }
else else
{ {
ResultSearch.IsVisible = true; DisplayAlert("Erreur", "Le mot de passe est incorrect", "OK");
return;
}
} }
private void Back_Clicked(object sender, EventArgs e)
{
Navigation.PopAsync();
} }
} }

@ -1,82 +1,133 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.InscrPage" x:Class="notus.InscrPage"
Title="InscrPage"> Title="InscrPage"
BackgroundColor="#1C1C1C">
<Grid BackgroundColor="#1C1C1C"> <Shell.BackButtonBehavior>
<Grid.ColumnDefinitions> <BackButtonBehavior
<ColumnDefinition Width="1*"/> IsVisible="False"
<ColumnDefinition Width="Auto"/> IsEnabled="False"/>
<ColumnDefinition Width="1*"/> </Shell.BackButtonBehavior>
</Grid.ColumnDefinitions> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="80"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="150"/> <RowDefinition Height="1.8*"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1.6*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Entry <Grid.ColumnDefinitions>
Placeholder="Pseudo" <ColumnDefinition Width="4*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="0.9*"/>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<ImageButton
Source="return.png"
Aspect="AspectFit"
Grid.Column="0"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
Margin="10,10,0,0"
CornerRadius="50"
Clicked="Back_Clicked"
/>
<Label
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="1"
HorizontalOptions="Center" HorizontalOptions="Center"
VerticalOptions="Center" VerticalOptions="Center"
WidthRequest="600" Text="Inscription"
HeightRequest="100" TextColor="#74fabd"
FontSize="32" FontSize="80"
FontFamily="strong"
/>
<Entry
Placeholder="Pseudo"
FontSize="22"
Grid.Column="1" Grid.Column="1"
Grid.Row="1" Grid.ColumnSpan="3"
Grid.Row="3"
TextColor="#74fabd" TextColor="#74fabd"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd" PlaceholderColor="#74fabd"
Text="{Binding Username}"
/> />
<Entry <Entry
Placeholder="Mot de passe" Placeholder="Mot de passe"
HorizontalOptions="Center" FontSize="22"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1" Grid.Column="1"
Grid.Row="2" Grid.ColumnSpan="3"
Grid.Row="5"
IsPassword="true" IsPassword="true"
TextColor="#74fabd" TextColor="#74fabd"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd" PlaceholderColor="#74fabd"
Text="{Binding Password}"
/> />
<Entry <Entry
Placeholder ="Verif mot de passe" Placeholder ="Verif mot de passe"
HorizontalOptions="Center" FontSize="22"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1" Grid.Column="1"
Grid.Row="3" Grid.ColumnSpan="3"
Grid.Row="7"
IsPassword="true" IsPassword="true"
TextColor="#74fabd" TextColor="#74fabd"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd" PlaceholderColor="#74fabd"
Text="{Binding RePassword}"
/> />
<Button <Button
WidthRequest="80"
Grid.Column="2"
Grid.ColumnSpan="1"
Grid.Row="9"
Text="Valider" Text="Valider"
TextColor="Black"
BackgroundColor="#74fabd"
Clicked="Inscription_Clicked"
/>
<Label
x:Name="userUser"
Text="User Already exist."
IsVisible="false"
Grid.Column="1" Grid.Column="1"
Grid.Row="4" Grid.Row="4"
HorizontalOptions="End" TextColor="Red"
VerticalOptions="Center" />
WidthRequest="110"
HeightRequest="70" <Label
BackgroundColor="#74fabd" x:Name="shortPassword"
TextColor="Black" Text="Password to short."
CornerRadius="10" IsVisible="false"
Clicked="Valid_Clicked" Grid.Column="1"
Grid.Row="6"
TextColor="Red"
/> />
</Grid> </Grid>
</ContentPage> </ContentPage>

@ -1,14 +1,47 @@
namespace notus; using Biblioteque_de_Class;
namespace notus;
public partial class InscrPage : ContentPage public partial class InscrPage : ContentPage
{ {
Database datab = (Application.Current as App).db;
public string Username { get; set; }
public string Password { get; set; }
public string RePassword { get; set; }
public InscrPage() public InscrPage()
{ {
InitializeComponent(); InitializeComponent();
BindingContext = this;
} }
private async void Valid_Clicked(object sender, EventArgs e) private async void Inscription_Clicked(object sender, EventArgs e)
{
if (Password.Length < 8) { shortPassword.IsVisible = true; return; }
if (Password != RePassword)
{
await DisplayAlert("Erreur", "Les mots de passe ne sont pas identiques", "OK");
return;
}
else if (Username == null || Password == null)
{
await DisplayAlert("Erreur", "Veuillez remplir tous les champs", "OK");
return;
}
try
{ {
datab.AddUser(new User(Username,"",Password));
}
catch (AlreadyUsedException)
{
userUser.IsVisible = true;
return;
}
(Application.Current as App).SelectedUser = datab.GetUser(Username);
await Navigation.PushAsync(new RecherPage()); await Navigation.PushAsync(new RecherPage());
} }
private void Back_Clicked(object sender, EventArgs e)
{
Navigation.PopAsync();
}
} }

@ -6,69 +6,174 @@
Title="ProfilPage" Title="ProfilPage"
BackgroundColor="#1C1C1C"> BackgroundColor="#1C1C1C">
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<Grid> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="6*"/>
</Grid.ColumnDefinitions>
<ImageButton
Source="return.png"
Aspect="AspectFit"
Grid.Column="0"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
Margin="10,10,0,0"
CornerRadius="50"
Clicked="Back_Clicked"
/>
<Grid Grid.Column="0">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="1*"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="250"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="20"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="20"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="90"/>
<RowDefinition Height="1.5*"/> <RowDefinition Height="100"/>
<RowDefinition Height="90"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Image Source="{Binding ProfilPicture}"
<ColumnDefinition Width="1*"/> HorizontalOptions="Center"
<ColumnDefinition Width="1*"/> VerticalOptions="Center"
<ColumnDefinition Width="1*"/> Grid.Row="1"
</Grid.ColumnDefinitions> BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="250"
Margin="0,0,0,30"
/>
<Label Text="{Binding Username}" VerticalOptions="Center"
Grid.Row="2"
BackgroundColor="#4A4A4A"
WidthRequest="260"
HeightRequest="60"
TextColor="#74fabd"/>
<Button <Button
VerticalOptions="End"
Text="Modifier Profil" Text="Modifier Profil"
TextColor="#74fabd" TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="4" Grid.Row="4"
VerticalOptions="Center"
HeightRequest="80" HeightRequest="80"
FontSize="30" FontSize="30"
Margin="0,20,0,0"
Clicked="Modify_Profil"
/> />
<Button <Button
VerticalOptions="Center"
Text="Modifier Theme" Text="Modifier Theme"
TextColor="#74fabd" TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="5" Grid.Row="5"
FontSize="30"
VerticalOptions="Start"
HeightRequest="80" HeightRequest="80"
FontSize="30"
Margin="0,20,0,0"
Clicked="Modify_Theme"
/> />
<Label <Button
Text="Profil" VerticalOptions="Start"
Text="se déconnecter"
FontSize="30" FontSize="30"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
TextColor="#74fabd" TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A" BackgroundColor="#4A4A4A"
Grid.Column="1" Grid.Row="6"
Grid.Row="3"
VerticalOptions="End"
HeightRequest="80" HeightRequest="80"
Margin="0,20,0,0"
Clicked="Disconnect_Clicked"
/> />
<ImageButton </Grid>
Source="profil.png"
Aspect="AspectFit" <Grid x:Name="TagsZone" Grid.Column="1" Margin="40" BackgroundColor="#4A4A4A" IsVisible="True">
Grid.Column="1" <Grid.RowDefinitions>
Grid.Row="2" <RowDefinition Height="1*"/>
WidthRequest="550" <RowDefinition Height="250"/>
HeightRequest="250" <RowDefinition Height="40"/>
BackgroundColor="#6E6E6E" <RowDefinition Height="1*"/>
CornerRadius="10" </Grid.RowDefinitions>
Clicked="ProfilClicked" <ScrollView Grid.Row="1" VerticalScrollBarVisibility="Always" HorizontalScrollBarVisibility="Never">
/> <StackLayout x:Name="TagListContainer" Padding="10" Spacing="5">
<ListView x:Name="TagListView" SeparatorVisibility="None" BackgroundColor="Transparent">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<BoxView Grid.Column="0" BackgroundColor="{Binding Color}" WidthRequest="40" />
<Label Grid.Column="1" Text="{Binding Name}" VerticalTextAlignment="Center" />
<Button Grid.Column="2" Text="Modify" Clicked="Modify_Clicked"/>
<Button Grid.Column="3" Text="Delete" Clicked="Delete_Clicked" VerticalOptions="End"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ScrollView>
<Grid Grid.Row="2" HorizontalOptions="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Text="Add" Command="{Binding AddTagCommand}" HorizontalOptions="Center" />
</Grid> </Grid>
</Grid>
<Grid x:Name="ProfilZone" Grid.Column="1" Margin="40" BackgroundColor="#4A4A4A" IsVisible="false">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="250"/>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="90"/>
<RowDefinition Height="100"/>
<RowDefinition Height="90"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
</Grid>
<Grid x:Name="ThemeZone" Grid.Column="1" Margin="40" BackgroundColor="#4A4A4A" IsVisible="false">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="250"/>
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
<RowDefinition Height="90"/>
<RowDefinition Height="100"/>
<RowDefinition Height="90"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
</Grid>
</Grid>
</ContentPage> </ContentPage>

@ -1,17 +1,101 @@
using Microsoft.Maui.Controls; using Microsoft.Maui.Controls;
using Biblioteque_de_Class; using Biblioteque_de_Class;
using Notus_Persistance; using Notus_Persistance;
using NHibernate.Mapping;
using System.Collections.ObjectModel;
namespace notus; namespace notus;
public partial class ProfilPage : ContentPage public partial class ProfilPage : ContentPage
{ {
public User SelectedUser = (Application.Current as App).SelectedUser;
private string username;
public string Username
{
get => username;
set
{
username = value;
OnPropertyChanged(nameof(Username));
(Application.Current as App).SelectedUser.Username = username;
}
}
private string password;
public string Password
{
get => password;
set
{
password = value;
OnPropertyChanged(nameof(Password));
(Application.Current as App).SelectedUser.Password = password;
}
}
private string profilPicture;
public string ProfilPicture
{
get => profilPicture;
set
{
profilPicture = value;
OnPropertyChanged(nameof(ProfilPicture));
(Application.Current as App).SelectedUser.Picture = profilPicture;
}
}
public ProfilPage() public ProfilPage()
{ {
InitializeComponent(); InitializeComponent();
Username = SelectedUser.Username;
Password = SelectedUser.Password;
ProfilPicture = SelectedUser.Picture;
BindingContext = this;
} }
void ProfilClicked(System.Object sender, System.EventArgs e) private void Back_Clicked(object sender, EventArgs e)
{ {
Navigation.PopAsync();
}
private void Disconnect_Clicked(object sender, EventArgs e)
{
(Application.Current as App).SelectedUser.IsConnected = false;
Navigation.PopAsync();
Navigation.PopAsync();
Navigation.PopAsync();
(Application.Current as App).SelectedUser = null;
}
private void AddTag_Clicked(object sender, EventArgs e)
{
// Handle add tag action
// Show color picker and name input dialog
// Create a new Tag object and add it to the Tags collection
}
private void Modify_Clicked(object sender, EventArgs e)
{
// Handle modify action for the tag
}
private void Delete_Clicked(object sender, EventArgs e)
{
// Handle delete action for the tag
}
private void Modify_Profil(object sender, EventArgs e)
{
if (ProfilZone.IsVisible == true) { ProfilZone.IsVisible = false; return; }
ThemeZone.IsVisible = false;
ProfilZone.IsVisible = true;
}
private void Modify_Theme(object sender, EventArgs e)
{
if (ThemeZone.IsVisible == true) { ThemeZone.IsVisible = false; return;}
ProfilZone.IsVisible = false;
ThemeZone.IsVisible = true;
} }
} }

@ -1,134 +1,152 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2021/maui/toolkit"
xmlns:muxc = "using:Microsoft.UI.Xaml.Controls"
x:Class="notus.RecherPage" x:Class="notus.RecherPage"
Title="RecherPage" Title="Main Page"
BackgroundColor="#1C1C1C"> BackgroundColor="#1C1C1C">
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<ContentPage.Content>
<Grid> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="MasterColumn" Width="320" />
<ColumnDefinition x:Name="DetailColumn" Width="*" />
</Grid.ColumnDefinitions>
<Border Background="#6E6E6E" Grid.Column="0" Grid.RowSpan="3" />
<Grid Margin="0,11,0,13" Grid.Column="0">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto" />
<RowDefinition Height="1.5*"/> <RowDefinition Height="Auto" />
<RowDefinition Height="1*"/> <RowDefinition Height="*" />
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*" />
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Border <SearchBar Placeholder="Search Note" Text="{Binding SearchNoteText}" HorizontalOptions="Start" Margin="10" VerticalOptions="Center" WidthRequest="300" HeightRequest="50" FontSize="25" TextColor="#74fabd" BackgroundColor="#4A4A4A" PlaceholderColor="#74fabd" TextChanged="OnSearchNoteTextChanged" />
Background="#6E6E6E" <CheckBox x:Name="FavoritesCheckBox" CheckedChanged="FavoritesFilter_CheckedChanged" WidthRequest="50" HeightRequest="50" Margin="40,0,0,0" HorizontalOptions="Start" VerticalOptions="Center" Grid.Row="1" />
Grid.Column="0" <ImageButton Source="tagsfilter.png" BackgroundColor="#4A4A4A" Clicked="TagsFilter_Clicked" WidthRequest="50" HeightRequest="50" CornerRadius="50" Margin="20" HorizontalOptions="Center" VerticalOptions="Center" Grid.Row="1"/>
Grid.RowSpan="9" <ImageButton Source="Datefilter.png" BackgroundColor="#4A4A4A" Clicked="DatesFilter_Clicked" WidthRequest="50" HeightRequest="50" CornerRadius="50" Margin="20" HorizontalOptions="End" VerticalOptions="Center" Grid.Row="1"/>
/> <ScrollView x:Name="TheScrollView" Grid.Row="2" Grid.Column="0" VerticalOptions="Start" Margin="5,5,5,5">
<ContentView>
<ImageButton <ListView ItemsSource="{Binding NoteList, Mode=TwoWay}" ItemSelected="NoteListView_ItemSelected" VerticalOptions="StartAndExpand">
Source="profl.png" <ListView.ItemTemplate>
Aspect="AspectFit" <DataTemplate>
Grid.Column="4" <ViewCell>
Grid.Row="0" <StackLayout Orientation="Horizontal" HeightRequest="40" Padding="3" Margin="3" BackgroundColor="#4A4A4A" MinimumWidthRequest="400" MaximumWidthRequest="400">
HorizontalOptions="Start" <CheckBox IsChecked="{Binding IsFavorite, Mode=TwoWay}" CheckedChanged="FavoriteCheckBox_CheckedChanged" HeightRequest="20" HorizontalOptions="End" VerticalOptions="Center"/>
VerticalOptions="Start" <StackLayout Orientation="Horizontal">
WidthRequest="200" <Image Source="{Binding LogoPath}" HorizontalOptions="Start" VerticalOptions="Center"/>
HeightRequest="120" <Label Text="{Binding Name}" TextColor="#74fabd" HorizontalOptions="Center" VerticalOptions="Center"/>
BackgroundColor="#6E6E6E" </StackLayout>
CornerRadius="10" </StackLayout>
Clicked="Profil_Clicked" </ViewCell>
/> </DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView>
</ScrollView>
</Grid>
<ImageButton Source="create.png" BackgroundColor="#4A4A4A" Clicked="CreateNote_Clicked" WidthRequest="50" HeightRequest="50" CornerRadius="50" Margin="20" HorizontalOptions="Start" VerticalOptions="End" />
<Grid Grid.Row="0" Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ImageButton <Grid.ColumnDefinitions>
Source="supp.png" <ColumnDefinition Width="350" />
Aspect="AspectFill" <ColumnDefinition Width="*" />
Grid.Column="2" </Grid.ColumnDefinitions>
Grid.Row="0"
Margin="20"
HorizontalOptions="End"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Label x:Name="NomNote" <ImageButton Source="{Binding LogoPath}" Aspect="AspectFit" Grid.Column="0" Grid.Row="0" Margin="20" HorizontalOptions="Start" VerticalOptions="Start" WidthRequest="50" HeightRequest="50" BackgroundColor="#4A4A4A" CornerRadius="50" />
Text="{Binding Name}" <Entry Text="{Binding Name}" Grid.Column="0" Grid.Row="0" TextColor="#74fabd" Margin="20" FontSize="21" BackgroundColor="#4A4A4A" WidthRequest="250" HeightRequest="50" HorizontalOptions="End" VerticalOptions="Start" />
Grid.Column="1" <ImageButton Source="supp.png" Clicked="Delete_Note" Aspect="AspectFill" Grid.Column="2" Grid.Row="0" Margin="20" HorizontalOptions="Start" VerticalOptions="Start" WidthRequest="50" HeightRequest="50" BackgroundColor="#4A4A4A" CornerRadius="50" />
Grid.Row="0" <ImageButton Source="AddUser.png" Clicked="AddUser_Clicked" Grid.Column="2" Grid.Row="0" BackgroundColor="#4A4A4A" Margin="120,20,20,20" HorizontalOptions="Start" VerticalOptions="Start" WidthRequest="50" HeightRequest="50" CornerRadius="50"/>
TextColor="#74fabd" <ImageButton Source="{Binding ProfilPicture}" Clicked="Profil_Clicked" Aspect="AspectFit" Grid.Column="2" Grid.Row="0" HorizontalOptions="End" VerticalOptions="Start" WidthRequest="200" HeightRequest="120" BackgroundColor="#6E6E6E"/>
Margin="20"
FontSize="34"
BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="50"
HorizontalOptions="Center"
VerticalOptions="Start"
/>
<ImageButton <Editor
Source="edit.png" x:Name="textZone"
Aspect="AspectFit" Placeholder="Text"
Grid.Column="1" FontSize="18"
Grid.Row="0" Text="{Binding Text, Mode=TwoWay}"
TextColor="#74fabd" BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
VerticalTextAlignment="Start"
Margin="20" Margin="20"
HorizontalOptions="Start" TextChanged="OnEditorTextChanged"
VerticalOptions="Start" Completed="OnEditorCompleted"/>
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Entry <Grid
Placeholder="Rechercher" x:Name="AddUser_Zone"
HorizontalOptions="Start" Grid.Row="1"
Margin="20"
VerticalOptions="Center"
WidthRequest="300"
HeightRequest="50"
FontSize="25"
Grid.Column="0" Grid.Column="0"
Grid.Row="0" Grid.ColumnSpan="2"
BackgroundColor="#6E6E6E"
IsVisible="false"
Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<SearchBar Placeholder="Search User" Text="{Binding SearchNoteText}" HorizontalOptions="Start" Margin="20" VerticalOptions="Center" WidthRequest="400" HeightRequest="50" FontSize="25" TextColor="#74fabd" BackgroundColor="#4A4A4A" PlaceholderColor="#74fabd" TextChanged="OnSearchNoteTextChanged" />
<ScrollView x:Name="UserListScrollView" Grid.Row="0" Grid.RowSpan="4" Grid.Column="0" Grid.ColumnSpan="3" VerticalOptions="Start" HorizontalOptions="Start" Margin="20,90,0,0" BackgroundColor="#4A4A4A" MinimumWidthRequest="600" MaximumWidthRequest="600">
<ContentView>
<ListView ItemsSource="{Binding UserList, Mode=TwoWay}" ItemSelected="NoteListView_ItemSelected" VerticalOptions="StartAndExpand">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" HeightRequest="40" Padding="3" Margin="3" BackgroundColor="#4A4A4A" MinimumWidthRequest="300" MaximumWidthRequest="300">
<CheckBox IsChecked="{Binding AJouter, Mode=TwoWay}" CheckedChanged="AddUserCheckBox_CheckedChanged" HeightRequest="20" HorizontalOptions="End" VerticalOptions="Center"/>
<Image Source="{Binding ProfilPictureUser}" HorizontalOptions="Start" VerticalOptions="Center"/>
<Label Text="{Binding UserNameUser}" TextColor="#74fabd" HorizontalOptions="Center" VerticalOptions="Center"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentView>
</ScrollView>
<Button
x:Name="Valid"
Text="Valid"
Grid.Row="3"
Grid.Column="3"
TextColor="#74fabd" TextColor="#74fabd"
BackgroundColor="#4A4A4A" WidthRequest="70"
PlaceholderColor="#74fabd" HeightRequest="50"
/> HorizontalOptions="End"
VerticalOptions="End"
Margin="0,0,20,20"
Clicked="Valid_Clicked"
BackgroundColor="#4A4A4A"/>
<ListView x:Name="ListNote"
Grid.Column="0"
Grid.Row="2"
Grid.RowSpan="5"
ItemsSource="{Binding NoteList}"
/>
<Editor
Placeholder="Texte"
IsSpellCheckEnabled="True"
FontSize="20"
HorizontalOptions="Start"
VerticalOptions="Center"
Margin="20"
WidthRequest="800"
HeightRequest="750"
Grid.Column="1"
Grid.ColumnSpan="4"
Grid.Row="4"
Grid.RowSpan="3"
TextColor="White"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
</Grid> </Grid>
</Grid>
</Grid>
</ContentPage.Content>
</ContentPage> </ContentPage>

@ -1,23 +1,361 @@
using Microsoft.Maui.Controls; using Microsoft.Maui.Controls;
using Biblioteque_de_Class; using Biblioteque_de_Class;
using Notus_Persistance; using Notus_Persistance;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Microsoft.Maui;
using System.Globalization;
using System.Drawing;
namespace notus
{
public partial class RecherPage : ContentPage, INotifyPropertyChanged
{
private ObservableCollection<Note> noteList;
public ObservableCollection<Note> NoteList
{
get { return noteList; }
set
{
noteList = value;
OnPropertyChanged(nameof(NoteList));
}
}
namespace notus; private ObservableCollection<Note> allNotes; // Store all notes initially
private Database db = (Application.Current as App).db;
public User SelectedUser = (Application.Current as App).SelectedUser;
public Note SelectedNote
{
get => (Application.Current as App).SelectedNote;
set
{
if ((Application.Current as App).SelectedNote != value)
{
(Application.Current as App).SelectedNote = value;
OnPropertyChanged(nameof(SelectedNote));
NoteList = new ObservableCollection<Note>(SelectedUser.NoteList);
allNotes = new ObservableCollection<Note>(NoteList);
Name = SelectedNote.Name;
Text = SelectedNote.Text;
LogoPath = SelectedNote.LogoPath;
}
}
}
public partial class RecherPage : ContentPage private string name;
{ public string Name
PersistenceManager manager = (Application.Current as App).manager; {
get { return name; }
set
{
if (name != value)
{
name = value;
OnPropertyChanged(nameof(Name));
if (SelectedNote != null)
{
try
{
SelectedNote.ChangeName(SelectedUser, value);
}
catch (NotAllowedException)
{
Name = SelectedNote.Name;
}
}
}
}
}
private string text;
public string Text
{
get { return text; }
set
{
if (text != value)
{
text = value;
OnPropertyChanged(nameof(Text));
if (SelectedNote != null)
{
try
{
SelectedNote.VerifyPrivilege(SelectedUser);
}
catch (NotAllowedException)
{
Text = SelectedNote.Text;
return;
}
SelectedNote.Text = value;
}
}
}
}
private string logoPath;
public string LogoPath
{
get { return logoPath; }
set
{
if (logoPath != value)
{
logoPath = value;
OnPropertyChanged(nameof(LogoPath));
if (SelectedNote != null)
{
try
{
SelectedNote.ChangeLogo(SelectedUser, value);
}
catch (NotAllowedException)
{
LogoPath = SelectedNote.LogoPath;
}
}
}
}
}
public string SearchNoteText { get; set; }
public string ProfilPicture { get; set; }
public RecherPage() public RecherPage()
{ {
manager.LoadDatabaseData();
InitializeComponent(); InitializeComponent();
ListNote.BindingContext = manager; allNotes = new ObservableCollection<Note>(SelectedUser.NoteList);
NomNote.BindingContext = manager; NoteList = allNotes;
SelectedNote = SelectedUser.NoteList
.OrderByDescending(note => note.ModificationDate)
.FirstOrDefault();
(Application.Current as App).SelectedNote = SelectedNote;
Name = SelectedNote.Name;
Text = SelectedNote.Text;
LogoPath = SelectedNote.LogoPath;
ProfilPicture = SelectedUser.Picture;
BindingContext = this;
}
private void CreateNote_Clicked(object sender, EventArgs e)
{
SelectedUser.CreateNote("", "");
SelectedNote = SelectedUser.NoteList[SelectedUser.NoteList.Count - 1];
} }
private async void Profil_Clicked(object sender, EventArgs e) private async void Profil_Clicked(object sender, EventArgs e)
{ {
(Application.Current as App).SelectedUser = SelectedUser;
await Navigation.PushAsync(new ProfilPage()); await Navigation.PushAsync(new ProfilPage());
} }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
void OnEditorTextChanged(object sender, TextChangedEventArgs e)
{
string newText = e.NewTextValue;
if (SelectedNote != null)
{
SelectedNote.Text = newText;
(Application.Current as App).SelectedNote = SelectedNote;
}
Text = SelectedNote.Text;
}
void OnEditorCompleted(object sender, EventArgs e)
{
if (SelectedNote != null)
{
SelectedNote.Text = ((Editor)sender).Text;
(Application.Current as App).SelectedNote = SelectedNote;
}
}
private void NoteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem is Note selectedNote)
{
SelectedNote = selectedNote;
(Application.Current as App).SelectedNote = SelectedNote;
Name = SelectedNote.Name;
Text = SelectedNote.Text;
LogoPath = SelectedNote.LogoPath;
}
}
private void AddUser_Clicked(object sender, EventArgs e)
{
if (AddUser_Zone.IsVisible)
AddUser_Zone.IsVisible = false;
else
AddUser_Zone.IsVisible = true;
}
private void Valid_Clicked(object sender, EventArgs e)
{
AddUser_Zone.IsVisible = false;
}
private void AddUserCheckBox_CheckedChanged(object sender, CheckedChangedEventArgs e)
{
}
public void Delete_Note(object sender, EventArgs e)
{
if (SelectedNote != null)
{
SelectedUser.NoteList.Remove(SelectedNote);
if (SelectedUser.NoteList.Count == 0)
{
SelectedUser.CreateNote("","");
}
SelectedNote = SelectedUser.NoteList.FirstOrDefault(); // Select the first note in the list (or null if empty)
}
}
private int windowHeight;
public int WindowHeight
{
get { return windowHeight; }
set
{
if (windowHeight != value)
{
windowHeight = value - 300;
OnPropertyChanged(nameof(WindowHeight));
UpdateScrollViewHeight();
}
}
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
if (WindowHeight != (int)height)
{
WindowHeight = (int)height;
UpdateScrollViewHeight();
}
}
private void UpdateScrollViewHeight()
{
double availableHeight = WindowHeight;
TheScrollView.MaximumHeightRequest = availableHeight;
UserListScrollView.MinimumHeightRequest = availableHeight;
UserListScrollView.MaximumHeightRequest = availableHeight;
}
private bool isFavoritesFilterChecked = false;
private List<Tags> selectedTags = new List<Tags>();
private DateOnly startDate;
private DateOnly endDate;
private bool isfavorite;
public bool IsFavorite
{
get => isfavorite;
set
{
if (IsFavorite != value)
{
IsFavorite = value;
OnPropertyChanged(nameof(IsFavorite));
}
}
}
void OnSearchNoteTextChanged(object sender, TextChangedEventArgs e)
{
string searchText = e.NewTextValue;
if (string.IsNullOrEmpty(searchText))
{
ApplyFilters();
}
else
{
var filteredNotes = NoteList.Where(note => note.Name.Contains(searchText));
NoteList = new ObservableCollection<Note>(filteredNotes);
}
}
private void FavoritesFilter_CheckedChanged(object sender, CheckedChangedEventArgs e)
{
isFavoritesFilterChecked = e.Value;
ApplyFilters();
}
private void TagsFilter_Clicked(object sender, EventArgs e)
{
ApplyFilters();
}
private void DatesFilter_Clicked(object sender, EventArgs e)
{
ApplyFilters();
}
private void ApplyFilters()
{
var filteredNotes = allNotes;
if (isFavoritesFilterChecked)
{
var FavfilteredNotes = allNotes.Where(note => SelectedUser.FavList.Contains(note));
NoteList = new ObservableCollection<Note>(FavfilteredNotes);
filteredNotes = NoteList;
}
if (selectedTags.Count > 0)
{
filteredNotes = (ObservableCollection<Note>)filteredNotes.Where(note => SelectedUser.NoteTagged[note].Any(tag => selectedTags.Contains(tag)));
}
if (startDate != default && endDate != default)
{
filteredNotes = (ObservableCollection<Note>)filteredNotes.Where(note => note.CreationDate >= startDate && note.CreationDate <= endDate || note.ModificationDate >= startDate && note.ModificationDate <= endDate);
}
foreach (var note in filteredNotes)
{
note.IsFavorite = SelectedUser.FavList.Contains(note);
IsFavorite = note.IsFavorite;
}
NoteList = new ObservableCollection<Note>(filteredNotes);
}
private void FavoriteCheckBox_CheckedChanged(object sender, CheckedChangedEventArgs e)
{
CheckBox checkBox = (CheckBox)sender;
Note note = checkBox.BindingContext as Note;
if (note != null)
{
if (e.Value)
{
if(note.IsFavorite == false)
SelectedUser.AddFavorite(note);
(Application.Current as App).SelectedUser = SelectedUser;
allNotes = new ObservableCollection<Note>(SelectedUser.NoteList);
}
else
{
if (note.IsFavorite == true)
SelectedUser.RemoveFavorite(note);
(Application.Current as App).SelectedUser = SelectedUser;
allNotes = new ObservableCollection<Note>(SelectedUser.NoteList);
}
}
}
}
} }

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks> <!--<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>-->
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks> <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET --> <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> --> <!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->

Loading…
Cancel
Save