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

@ -1,14 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract(IsReference = true)]
public class Note
public class Note : INotifyPropertyChanged
{
[DataMember]
public int id { get; init; }
@ -18,11 +15,17 @@ namespace Biblioteque_de_Class
public string 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]
public string Text { get; private set; } = "";
private string text;
public string Text {
get => text;
set {
text = value;
OnPropertyChanged(nameof(Text));
} }
[DataMember]
private string logoPath;
@ -30,7 +33,7 @@ namespace Biblioteque_de_Class
public string 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]
@ -45,7 +48,23 @@ namespace Biblioteque_de_Class
public List<User> Editors { get; private set; }
[DataMember]
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)
{
id = initId;

@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
@ -11,10 +13,40 @@ namespace Biblioteque_de_Class
public class Tags
{
[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]
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)
{
Name = name;

@ -6,29 +6,158 @@ using System.Runtime.Serialization;
namespace Biblioteque_de_Class
{
[DataContract]
public class User
public class User : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
[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]
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]
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]
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]
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]
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]
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]
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)]
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]
public Dictionary<Note, List<Tags>> NoteTagged { get; set; }
public List<Theme> AddedTheme { get; set; }
private List<Theme> addedTheme;
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)
{
@ -161,6 +290,7 @@ namespace Biblioteque_de_Class
throw new AlreadyExistException("Note already in favorites");
}
FavList.Add(note);
note.IsFavorite = true;
}
/// <summary>
@ -171,6 +301,7 @@ namespace Biblioteque_de_Class
if (FavList.Contains(note))
{
FavList.Remove(note);
note.IsFavorite = false;
}
else
{
@ -183,11 +314,14 @@ namespace Biblioteque_de_Class
/// </summary>
public Note CreateNote(string name, string imagePath)
{
foreach (Note existingNote in NoteList)
if (name != "")
{
if (existingNote.Name == name)
foreach (Note existingNote in NoteList)
{
throw new AlreadyExistException("Note already exists");
if (existingNote.Name == name)
{
throw new AlreadyExistException("Note already exists");
}
}
}
Note note;

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

@ -1,6 +1,8 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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"
x:Class="notus.App">
<Application.Resources>
@ -11,4 +13,5 @@
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

@ -6,15 +6,54 @@ namespace notus;
public partial class App : Application
{
public PersistenceManager manager = new PersistenceManager(new Stub());
public Database db = new Database();
public PersistenceManager Mgr { get; private set; } = new PersistenceManager(new Stub());
public Database db = new Database();
public App()
{
InitializeComponent();
db = manager.LoadDatabaseData();
db = Mgr.LoadDatabaseData();
BindingContext = db;
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,12 +3,14 @@
x:Class="notus.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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"
Shell.FlyoutBehavior="Locked"
Shell.FlyoutWidth="30"
Shell.NavBarIsVisible="True"
Shell.NavBarIsVisible="False"
Shell.BackgroundColor="Grey">
<ShellContent
Title="main_page"
ContentTemplate="{DataTemplate local:MainPage}"

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

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

@ -1,28 +1,46 @@
using Biblioteque_de_Class;
using Windows.UI.Core;
namespace notus;
public partial class ConnecPage : ContentPage
{
string mail = "";
string MDP = "";
User selectUser = (Application.Current as App).SelectedUser;
Database db = (Application.Current as App).db;
public string Username { get; set; }
public string Password { get; set; }
public ConnecPage()
{
{
InitializeComponent();
}
BindingContext = this;
}
private async void Valid_Clicked(object sender, EventArgs e)
private void Connec_Clicked(object sender, EventArgs e)
{
mail = Mail.Text;
MDP = Password.Text;
if ((Application.Current as App).db.SearchUser(mail, MDP))
try
{
selectUser = db.GetUser(Username);
}
catch (NotFoundException)
{
await Navigation.PushAsync(new RecherPage());
DisplayAlert("Erreur", "Cet utilisateur n'existe pas" , "OK");
return;
}
if (Database.ComparePassword(selectUser, HashCodeModel.GetSHA256Hash(Password).ToString()))
{
selectUser.IsConnected = true;
(Application.Current as App).SelectedUser = selectUser;
Navigation.PushAsync(new RecherPage());
}
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" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.InscrPage"
Title="InscrPage">
Title="InscrPage"
BackgroundColor="#1C1C1C">
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<Grid>
<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.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.6*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<Grid BackgroundColor="#1C1C1C">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Entry
Placeholder="Pseudo"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
<Grid.ColumnDefinitions>
<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"
VerticalOptions="Center"
Text="Inscription"
TextColor="#74fabd"
FontSize="80"
FontFamily="strong"
/>
<Entry
Placeholder="Pseudo"
FontSize="22"
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="3"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
Text="{Binding Username}"
/>
<Entry
<Entry
Placeholder="Mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="2"
FontSize="22"
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="5"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
Text="{Binding Password}"
/>
<Entry
<Entry
Placeholder ="Verif mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="3"
FontSize="22"
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="7"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
Text="{Binding RePassword}"
/>
<Button
Text="Valider"
Grid.Column="1"
Grid.Row="4"
HorizontalOptions="End"
VerticalOptions="Center"
WidthRequest="110"
HeightRequest="70"
BackgroundColor="#74fabd"
TextColor="Black"
CornerRadius="10"
Clicked="Valid_Clicked"
/>
<Button
WidthRequest="80"
Grid.Column="2"
Grid.ColumnSpan="1"
Grid.Row="9"
Text="Valider"
TextColor="Black"
BackgroundColor="#74fabd"
Clicked="Inscription_Clicked"
/>
<Label
x:Name="userUser"
Text="User Already exist."
IsVisible="false"
Grid.Column="1"
Grid.Row="4"
TextColor="Red"
/>
<Label
x:Name="shortPassword"
Text="Password to short."
IsVisible="false"
Grid.Column="1"
Grid.Row="6"
TextColor="Red"
/>
</Grid>
</ContentPage>

@ -1,14 +1,47 @@
namespace notus;
using Biblioteque_de_Class;
namespace notus;
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()
{
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());
}
private void Back_Clicked(object sender, EventArgs e)
{
Navigation.PopAsync();
}
}

@ -6,69 +6,174 @@
Title="ProfilPage"
BackgroundColor="#1C1C1C">
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<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"
/>
<Button
Text="Modifier Profil"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="4"
VerticalOptions="Center"
HeightRequest="80"
FontSize="30"
/>
<Grid Grid.Column="0">
<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>
<Button
Text="Modifier Theme"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="5"
FontSize="30"
VerticalOptions="Start"
HeightRequest="80"
/>
<Image Source="{Binding ProfilPicture}"
HorizontalOptions="Center"
VerticalOptions="Center"
Grid.Row="1"
BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="250"
Margin="0,0,0,30"
/>
<Label
Text="Profil"
FontSize="30"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="3"
VerticalOptions="End"
HeightRequest="80"
<Label Text="{Binding Username}" VerticalOptions="Center"
Grid.Row="2"
BackgroundColor="#4A4A4A"
WidthRequest="260"
HeightRequest="60"
TextColor="#74fabd"/>
<Button
VerticalOptions="End"
Text="Modifier Profil"
TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A"
Grid.Row="4"
HeightRequest="80"
FontSize="30"
Margin="0,20,0,0"
Clicked="Modify_Profil"
/>
<Button
VerticalOptions="Center"
Text="Modifier Theme"
TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A"
Grid.Row="5"
HeightRequest="80"
FontSize="30"
Margin="0,20,0,0"
Clicked="Modify_Theme"
/>
<ImageButton
Source="profil.png"
Aspect="AspectFit"
Grid.Column="1"
Grid.Row="2"
WidthRequest="550"
HeightRequest="250"
BackgroundColor="#6E6E6E"
CornerRadius="10"
Clicked="ProfilClicked"
<Button
VerticalOptions="Start"
Text="se déconnecter"
FontSize="30"
TextColor="#74fabd"
WidthRequest="300"
BackgroundColor="#4A4A4A"
Grid.Row="6"
HeightRequest="80"
Margin="0,20,0,0"
Clicked="Disconnect_Clicked"
/>
</Grid>
</Grid>
<Grid x:Name="TagsZone" Grid.Column="1" Margin="40" BackgroundColor="#4A4A4A" IsVisible="True">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="250"/>
<RowDefinition Height="40"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<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 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>

@ -1,17 +1,101 @@
using Microsoft.Maui.Controls;
using Biblioteque_de_Class;
using Notus_Persistance;
using NHibernate.Mapping;
using System.Collections.ObjectModel;
namespace notus;
public partial class ProfilPage : ContentPage
{
public ProfilPage()
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()
{
InitializeComponent();
Username = SelectedUser.Username;
Password = SelectedUser.Password;
ProfilPicture = SelectedUser.Picture;
BindingContext = this;
}
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;
}
void ProfilClicked(System.Object sender, System.EventArgs e)
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"
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"
Title="RecherPage"
Title="Main Page"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Shell.BackButtonBehavior>
<BackButtonBehavior
IsVisible="False"
IsEnabled="False"/>
</Shell.BackButtonBehavior>
<ContentPage.Content>
<Grid>
<Border
Background="#6E6E6E"
Grid.Column="0"
Grid.RowSpan="9"
/>
<ImageButton
Source="profl.png"
Aspect="AspectFit"
Grid.Column="4"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="200"
HeightRequest="120"
BackgroundColor="#6E6E6E"
CornerRadius="10"
Clicked="Profil_Clicked"
/>
<ImageButton
Source="supp.png"
Aspect="AspectFill"
Grid.Column="2"
Grid.Row="0"
Margin="20"
HorizontalOptions="End"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Label x:Name="NomNote"
Text="{Binding Name}"
Grid.Column="1"
Grid.Row="0"
TextColor="#74fabd"
Margin="20"
FontSize="34"
BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="50"
HorizontalOptions="Center"
VerticalOptions="Start"
/>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="MasterColumn" Width="320" />
<ColumnDefinition x:Name="DetailColumn" Width="*" />
</Grid.ColumnDefinitions>
<ImageButton
Source="edit.png"
Aspect="AspectFit"
Grid.Column="1"
Grid.Row="0"
Margin="20"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Entry
Placeholder="Rechercher"
HorizontalOptions="Start"
Margin="20"
VerticalOptions="Center"
WidthRequest="300"
HeightRequest="50"
FontSize="25"
Grid.Column="0"
Grid.Row="0"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Border Background="#6E6E6E" Grid.Column="0" Grid.RowSpan="3" />
<Grid Margin="0,11,0,13" Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ListView x:Name="ListNote"
Grid.Column="0"
Grid.Row="2"
Grid.RowSpan="5"
ItemsSource="{Binding NoteList}"
/>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<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" />
<CheckBox x:Name="FavoritesCheckBox" CheckedChanged="FavoritesFilter_CheckedChanged" WidthRequest="50" HeightRequest="50" Margin="40,0,0,0" HorizontalOptions="Start" VerticalOptions="Center" Grid.Row="1" />
<ImageButton Source="tagsfilter.png" BackgroundColor="#4A4A4A" Clicked="TagsFilter_Clicked" WidthRequest="50" HeightRequest="50" CornerRadius="50" Margin="20" HorizontalOptions="Center" VerticalOptions="Center" Grid.Row="1"/>
<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>
<ListView ItemsSource="{Binding NoteList, Mode=TwoWay}" ItemSelected="NoteListView_ItemSelected" VerticalOptions="StartAndExpand">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" HeightRequest="40" Padding="3" Margin="3" BackgroundColor="#4A4A4A" MinimumWidthRequest="400" MaximumWidthRequest="400">
<CheckBox IsChecked="{Binding IsFavorite, Mode=TwoWay}" CheckedChanged="FavoriteCheckBox_CheckedChanged" HeightRequest="20" HorizontalOptions="End" VerticalOptions="Center"/>
<StackLayout Orientation="Horizontal">
<Image Source="{Binding LogoPath}" HorizontalOptions="Start" VerticalOptions="Center"/>
<Label Text="{Binding Name}" TextColor="#74fabd" HorizontalOptions="Center" VerticalOptions="Center"/>
</StackLayout>
</StackLayout>
</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>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="350" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<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" />
<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" />
<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" />
<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"/>
<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"/>
<Editor
x:Name="textZone"
Placeholder="Text"
FontSize="18"
Text="{Binding Text, Mode=TwoWay}"
TextColor="#74fabd" BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2"
VerticalTextAlignment="Start"
Margin="20"
TextChanged="OnEditorTextChanged"
Completed="OnEditorCompleted"/>
<Grid
x:Name="AddUser_Zone"
Grid.Row="1"
Grid.Column="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"
WidthRequest="70"
HeightRequest="50"
HorizontalOptions="End"
VerticalOptions="End"
Margin="0,0,20,20"
Clicked="Valid_Clicked"
BackgroundColor="#4A4A4A"/>
</Grid>
</Grid>
</Grid>
</ContentPage.Content>
<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>
</ContentPage>

@ -1,23 +1,361 @@
using Microsoft.Maui.Controls;
using Biblioteque_de_Class;
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
namespace notus
{
PersistenceManager manager = (Application.Current as App).manager;
public RecherPage()
{
manager.LoadDatabaseData();
InitializeComponent();
ListNote.BindingContext = manager;
NomNote.BindingContext = manager;
}
private async void Profil_Clicked(object sender, EventArgs e)
public partial class RecherPage : ContentPage, INotifyPropertyChanged
{
await Navigation.PushAsync(new ProfilPage());
private ObservableCollection<Note> noteList;
public ObservableCollection<Note> NoteList
{
get { return noteList; }
set
{
noteList = value;
OnPropertyChanged(nameof(NoteList));
}
}
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;
}
}
}
private string name;
public string Name
{
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()
{
InitializeComponent();
allNotes = new ObservableCollection<Note>(SelectedUser.NoteList);
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)
{
(Application.Current as App).SelectedUser = SelectedUser;
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">
<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>
<!-- 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> -->

Loading…
Cancel
Save