Pour le binding

main
Liam MONCHANIN 2 years ago
commit 2f0035dabe

@ -0,0 +1,49 @@
kind: pipeline
type: docker
name: pipelinefordeveloppement
trigger:
branch:
- developpement
- master
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:7.0
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet build notus_without_maui.sln -c Release --no-restore /p:AndroidSdkDirectory=$ANDROID_SDK_ROOT -property:Aapt2ToolPath=$ANDROID_SDK_ROOT/build-tools/33.0.0
- dotnet publish notus_without_maui.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- name: tests
image: mcr.microsoft.com/dotnet/sdk:7.0
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet test notus_without_maui.sln --no-restore
depends_on: [build]
- name: sonar
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet7
secrets: [ Sonar_Login ]
environment:
sonar_host: https://codefirst.iut.uca.fr/sonar/
sonar_token:
from_secret: Sonar_Login
project_key: notus_ThMo
coverage_exclusions: "Tests/**/**,Notus_Console/**"
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions=$${coverage_exclusions} /d:sonar.login=$${sonar_token}
- dotnet build notus_without_maui.sln -c Release --no-restore
- dotnet test notus_without_maui.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:'**/coverage.cobertura.xml' -reporttypes:SonarQube -targetdir:"coveragereport" -verbosity:Verbose
- dotnet publish notus_without_maui.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
branch:
- developpement
depends_on: [build,tests]

400
.gitignore vendored

@ -0,0 +1,400 @@
# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml

File diff suppressed because it is too large Load Diff

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -0,0 +1,34 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class.csproj", "{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "..\Notus_Console\Notus_Console.csproj", "{F48CF8AB-163E-4D63-B210-BDA22BE5251D}"
ProjectSection(ProjectDependencies) = postProject
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B} = {CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Release|Any CPU.Build.0 = Release|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AA9469C-FA7B-4AF1-9C90-056193DA2415}
EndGlobalSection
EndGlobal

@ -0,0 +1,208 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract]
public class Database
{
[DataMember]
private List<Logo> DefaultLogoList;
[DataMember]
private List<Theme> ThemeList;
[DataMember]
private List<User> UserList;
public Database()
{
DefaultLogoList = new List<Logo>();
ThemeList = new List<Theme>();
UserList = new List<User>();
}
public List<Logo> GetDefaultLogoList() { return DefaultLogoList; }
public List<Theme> GetThemeList() { return ThemeList; }
public List<User> GetUserList() { return UserList; }
/// <summary>
/// recherche un utilisateur dans la liste d'utilisateur
/// </summary>
public List<User> SearchUser(string name)
{
List<User> searchedUsers = new List<User>();
string search = name.ToLower();
searchedUsers.AddRange(UserList.Where( user => user.GetUsername().ToLower().Contains(search)));
return searchedUsers;
}
/// <summary>
/// récupérer le lien d'un logo
/// </summary>
public string? GetLogoLink(string name)
{
foreach (Logo logo in DefaultLogoList)
{
if (logo.GetName() == name) { return logo.GetLogoLink(); }
}
throw new NotFoundException("No logo link found.");
}
/// <summary>
/// récupérer un utilisateur
/// </summary>
public User GetUser(string name)
{
foreach (User user in UserList)
{
if (user.GetUsername() == name)
{
return user;
}
}
throw new AlreadyUsedException("No user found with this username.");
}
/// <summary>
/// comparer le mot de passe entré avec celui de l'utilisateur
/// </summary>
public static bool ComparePassword(User user, string? password) => user.GetPassword() == password;
/// <summary>
/// rechercher un mail dans la liste d'utilisateur
/// </summary>
public bool FindEmail(string email)
{
foreach (User user in UserList)
{
if (string.Equals(user.GetEmail(), email))
{
return true;
}
}
return false;
}
/// <summary>
/// ajouter un utilisateur dans la liste d'utilisateur
/// </summary>
public void AddUser(User user)
{
foreach (User existingUser in UserList)
{
if (existingUser.GetUsername() == user.GetUsername())
{
throw new AlreadyUsedException("Username already used.");
}
else if (existingUser.GetEmail() == user.GetEmail())
{
throw new AlreadyUsedException("Email already used.");
}
}
UserList.Add(user);
}
/// <summary>
/// supprimer un utilisateur dans la liste d'utilisateur
/// </summary>
public void RemoveUser(User user)
{
if (UserList.Contains(user))
{
UserList.Remove(user);
}
else
{
throw new NotFoundException("User not found.");
}
}
/// <summary>
/// ajouter un theme dans la liste de theme
/// </summary>
public void AddTheme(Theme theme)
{
foreach (Theme existingTheme in ThemeList)
{
if (existingTheme.GetName() == theme.GetName())
{
throw new AlreadyUsedException("Theme already used.");
}
}
ThemeList.Add(theme);
}
/// <summary>
/// supprimer un theme dans la liste de theme
/// </summary>
public void RemoveTheme(Theme theme)
{
if (ThemeList.Contains(theme))
{
if (theme.GetName().Length > 6 && theme.GetName()[..6] != "Static" )
{
throw new AlreadyUsedException("This theme is used a default theme.");
}
ThemeList.Remove(theme);
}
else
{
throw new NotFoundException("Theme not found.");
}
}
/// <summary>
/// récupérer un theme
/// </summary>
public Theme GetTheme(string name)
{
foreach (Theme theme in ThemeList)
{
if (theme.GetName() == name)
{
return theme;
}
}
throw new NotFoundException("No theme found with this name.");
}
/// <summary>
/// modifier le nom d'un theme
/// </summary>
public void ModifyThemeName(Theme theme, string newName)
{
foreach (Theme existingTheme in ThemeList)
{
if (existingTheme.GetName() == theme.GetName())
{
existingTheme.SetName(newName);
return;
}
}
throw new NotFoundException("Theme not found.");
}
/// <summary>
/// modifier la liste de couleur d'un theme
/// </summary>
public void ModifyThemeColorList(Theme theme, List<string> newColorList)
{
foreach (Theme existingTheme in ThemeList)
{
if (existingTheme.GetName() == theme.GetName())
{
for (int i = 0; i < 3; i++)
{
existingTheme.ChangeColor(existingTheme.GetColor(i), newColorList[i]);
}
return;
}
}
}
}
}

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[Serializable]
public class NotAllowedException : Exception
{
public NotAllowedException(string message) : base(message)
{
}
protected NotAllowedException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable]
public class AlreadyUsedException : Exception
{
public AlreadyUsedException(string message) : base(message)
{
}
protected AlreadyUsedException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable]
public class NotFoundException : Exception
{
public NotFoundException(string message) : base(message)
{
}
protected NotFoundException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable]
public class AlreadyExistException : Exception
{
public AlreadyExistException(string message) : base(message)
{
}
protected AlreadyExistException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable]
public class FileException : Exception
{
public FileException(string message) : base(message)
{
}
protected FileException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
}

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public interface IManager
{
public void SaveDatabaseData(Database database);
public Database LoadDatabaseData();
}
}

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class Logo
{
private string Name { get; set; }
private string LogoLink { get; set; }
public Logo(string name, string logoLink)
{
Name = name;
LogoLink = logoLink;
}
public string GetName() { return Name; }
public string GetLogoLink() { return LogoLink; }
public void SetName(string name) { Name = name; }
public void SetLogoLink(string logoLink) { LogoLink = logoLink; }
public override string ToString() => $"Logo -> Name: {Name}\nLink: {LogoLink}";
}
}

@ -0,0 +1,141 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class Note
{
private string name;
public string Name
{
get { return name; }
private set { if (value == null) { name = "Unnamed Note"; } else { name = value; } }
}
private string Text { get; set; } = "";
private string logoPath;
public string LogoPath
{
get { return logoPath; }
private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } }
}
private DateOnly CreationDate { get; }
private DateOnly ModificationDate { get; set; }
private readonly List<NoteImage> ImageList;
private readonly List<User> Collaborators;
private readonly List<User> Editors;
private readonly User Owner;
public Note(string name, string logoPath, User owner)
{
Name = name;
LogoPath = logoPath;
CreationDate = DateOnly.FromDateTime(DateTime.Now);
ModificationDate = DateOnly.FromDateTime(DateTime.Now);
ImageList = new List<NoteImage>();
Collaborators = new List<User>();
Editors = new List<User>();
Owner = owner;
}
public string GetName() { return Name; }
public string GetLogoPath() { return LogoPath; }
public string GetText() { return Text; }
public DateOnly GetCreationDate() { return CreationDate; }
public DateOnly GetModificationDate() { return ModificationDate; }
public List<NoteImage> GetImageList() { return ImageList; }
public List<User> GetCollaborators() { return Collaborators; }
public List<User> GetEditors() { return Editors; }
public User GetOwner() { return Owner; }
public override string ToString() => $"Note -> Name: {Name}\nLogoPath: {LogoPath}";
public void SetName(string name) { Name = name; }
public void SetLogoPath(string logoPath) { LogoPath = logoPath; }
public void SetModificationDate() { ModificationDate = DateOnly.FromDateTime(DateTime.Now); }
/// <summary>
/// vérifier si l'utilisateur est le propriétaire de la note
/// </summary>
public bool VerifyOwner(User user)
{
return user == Owner;
}
public void AddImage(string imageLink, string position)
{
int newname = ImageList.Count + 1;
ImageList.Add(new NoteImage(newname, imageLink, position));
}
public void RemoveImage(int name)
{
foreach (NoteImage image in ImageList)
{
if (image.GetName() == name)
{
ImageList.Remove(image);
return;
}
}
throw new NotFoundException("Image not found");
}
public void AddText(string text)
{
Text = Text + "\n" + text;
}
/// <summary>
/// vérifier si l'utilisateur est un éditeur de la note
/// </summary>
public bool VerifyPrivilege(User user)
{
return Editors.Contains(user);
}
/// <summary>
/// ajouter un utilisateur en tant que coopérateur
/// </summary>
public void AddCollaborator(User owner, User user)
{
if (VerifyOwner(owner)) { Collaborators.Add(user); }
else { throw new NotAllowedException("User is not the owner"); }
user.GetNoteList().Add(this);
}
/// <summary>
/// supprimer un utilisateur en tant que coopérateur
/// </summary>
public void RemoveCollaborator(User owner, User user)
{
if (VerifyOwner(owner)) { Collaborators.Remove(user); }
else { throw new NotAllowedException("User is not the owner"); }
user.GetNoteList().Remove(this);
}
/// <summary>
/// passer un coopérateur en tant qu'éditeur
/// </summary>
public void AddEditor(User owner, User user)
{
if (VerifyOwner(owner)) { Editors.Add(user); }
else { throw new NotAllowedException("User is not the owner"); }
}
/// <summary>
/// supprimer un coopérateur de la liste des éditeurs
/// </summary>
public void RemoveEditor(User owner, User user)
{
if (VerifyOwner(owner)) { Editors.Remove(user); }
else { throw new NotAllowedException("User is not the owner"); }
}
}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class NoteImage
{
private int Name { get; set; }
private string ImageLink { get; set; }
private string Position { get; set; }
public NoteImage(int name, string imageLink, string position)
{
Name = name;
ImageLink = imageLink;
Position = position;
}
public int GetName() { return Name; }
public string GetImageLink() { return ImageLink; }
public string GetPosition() { return Position; }
public void SetName(int name) { Name = name; }
public void SetImageLink(string imageLink) { ImageLink = imageLink; }
public void SetPosition(string position) { Position = position; }
public override string ToString() => $"image -> name: {Name}\nlink: {ImageLink}";
}
}

@ -0,0 +1,24 @@
using Microsoft.VisualBasic;
namespace Biblioteque_de_Class
{
public class PersistenceManager
{
private readonly IManager persistence;
public PersistenceManager(IManager pers)
{
persistence = pers;
}
public void SaveDatabaseData(Database database)
{
persistence.SaveDatabaseData(database);
}
public Database LoadDatabaseData()
{
return persistence.LoadDatabaseData();
}
}
}

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class Tags
{
private string Name { get; set; }
private string Color { get; set; }
public Tags(string name, string color)
{
Name = name;
Color = color;
}
public string GetName() { return Name; }
public string GetColor() { return Color; }
public void SetName(string name) { Name = name; }
public void SetColor(string color) { Color = color; }
public override string ToString() => $"tag -> name: {Name}\ncolor: {Color}";
}
}

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class Theme
{
private string Name { get; set; }
private readonly List<string> ColorList;
public Theme(string name, List<string> colorList)
{
Name = name;
ColorList = colorList;
}
public string GetName() { return Name; }
public void SetName(string name) { Name = name; }
public List<string> GetColorList() { return ColorList; }
public string GetColor(int index) { return ColorList[index]; }
public override string ToString() => $"name: {Name}\ncolor 1: {ColorList[0]}\ncolor 2: {ColorList[1]}\ncolor 3: {ColorList[2]}\n";
/// <summary>
/// Change a specific color of the theme.
/// </summary>
public void ChangeColor(string color, string newColor)
{
for (int i = 0; i < ColorList.Count; i++)
{
if (ColorList[i] == color)
{
ColorList[i] = newColor;
}
}
}
}
}

@ -0,0 +1,271 @@
using Microsoft.VisualBasic.FileIO;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Runtime.Serialization;
namespace Biblioteque_de_Class
{
[DataContract]
public class User
{
[DataMember]
private string Username { get; set; }
[DataMember]
private string Email { get; set; }
[DataMember]
private string Password { get; set; }
private Theme Theme;
[DataMember]
private List<Note> NoteList;
[DataMember]
private List<Tags> TagList;
[DataMember]
private List<Note> FavList;
[DataMember]
private bool IsConnected { get; set; }
[DataMember]
private Dictionary<Note, List<Tags>> NoteTagged;
public User(string username, string email, string password)
{
Username = username;
Email = email;
Password = password;
NoteList = new List<Note>();
TagList = new List<Tags>();
FavList = new List<Note>();
NoteTagged = new Dictionary<Note, List<Tags>>();
}
public string GetUsername() { return Username; }
public string GetEmail() { return Email; }
public string GetPassword() { return Password; }
public Theme GetTheme() { return Theme; }
public List<Note> GetNoteList() { return NoteList; }
public List<Tags> GetTagList() { return TagList; }
public List<Note> GetFavList() { return FavList; }
public bool GetIsConnected() { return IsConnected; }
public Dictionary<Note, List<Tags>> GetNoteTagged() { return NoteTagged; }
public List<Tags> GetNoteTaggedList(Note note) { return NoteTagged[note]; }
public void SetUsername(string username) { Username = username; }
public void SetEmail(string email) { Email = email; }
public void SetPassword(string password) { Password = password; }
public void SetTheme(Theme theme) { Theme = theme; }
public void SetIsConnected(bool isConnected) { IsConnected = isConnected; }
public override string ToString() => $"username: {Username}\nemail: {Email}\npassword: {Password}\nOwned notes: {NoteList.Count}";
/// <summary>
/// rechercher une note dans la liste de note de l'utilisateur et la liste de note favoris de l'utilisateur
/// </summary>
public List<Note> SearchNoteByName(List<Note> ToResearchIntoList, string name)
{
List<Note> searchedNotes = new List<Note>();
string search = name.ToLower();
foreach (Note note in ToResearchIntoList)
{
if (note.GetName().ToLower().Contains(search))
{
searchedNotes.Add(note);
}
}
return searchedNotes;
}
/// <summary>
/// rechercher un tag dans la liste de tag de l'utilisateur
/// </summary>
public List<Tags> SearchTagByName(List<Tags> ToResearchIntoList, string name)
{
List<Tags> searchedTags = new List<Tags>();
string search = name.ToLower();
foreach (Tags tag in ToResearchIntoList)
{
if (tag.GetName().ToLower().Contains(search))
{
searchedTags.Add(tag);
}
}
return searchedTags;
}
public List<Note> SearchNoteByDate(List<Note> ToResearchIntoList, string name, DateOnly FirstDate, DateOnly SecondeDate)
{
List<Note> searchedNotes = new List<Note>();
string search = name.ToLower();
foreach (Note note in ToResearchIntoList)
{
if (note.GetName().ToLower().Contains(search) && note.GetCreationDate() >= FirstDate && note.GetCreationDate() <= SecondeDate || note.GetModificationDate() >= FirstDate && note.GetModificationDate() <= SecondeDate)
{
searchedNotes.Add(note);
}
}
return searchedNotes;
}
public Note GetNoteByName(string name)
{
foreach (Note note in NoteList)
{
if (note.GetName() == name)
{
return note;
}
}
throw new NotFoundException("Note not found");
}
public Tags GetTagByName(string name)
{
foreach (Tags tag in TagList)
{
if (tag.GetName() == name)
{
return tag;
}
}
throw new NotFoundException("Tag not found");
}
/// <summary>
/// ajouter une note dans la liste de note favorite de l'utilisateur
/// </summary>
public void AddFavorite(Note note)
{
if (FavList.Contains(note))
{
throw new AlreadyExistException("Note already in favorites");
}
FavList.Add(note);
}
/// <summary>
/// supprimer une note dans la liste de note favorite de l'utilisateur
/// </summary>
public void RemoveFavorite(Note note)
{
if (FavList.Contains(note))
{
FavList.Remove(note);
}
else
{
throw new NotFoundException("Note not found");
}
}
/// <summary>
///creer une note
/// </summary>
public void CreateNote(string name, string imagePath)
{
foreach (Note existingNote in NoteList)
{
if (existingNote.GetName() == name)
{
throw new AlreadyExistException("Note already exists");
}
}
Note note = new Note(name, imagePath, this);
NoteList.Add(note);
NoteTagged.Add(note, new List<Tags>());
}
/// <summary>
/// supprimer une note
/// </summary>
public void DeleteNote(string note)
{
foreach (Note existingNote in NoteList)
{
if (existingNote.GetName() == note)
{
NoteList.Remove(existingNote);
NoteTagged.Remove(existingNote);
return;
}
}
throw new NotFoundException("Note not found");
}
/// <summary>
/// creer un tag
/// </summary>
public void CreateTag(string name, string color)
{
foreach (Tags tag in TagList)
{
if (tag.GetName() == name)
{
throw new AlreadyExistException("Tag already exists");
}
}
TagList.Add(new Tags(name, color));
}
/// <summary>
/// supprimer un tag
/// </summary>
public void DeleteTag(string name)
{
foreach (Tags tag in TagList)
{
if (tag.GetName() == name)
{
TagList.Remove(tag);
return;
}
}
}
/// <summary>
/// ajouter un tag a une note
/// </summary>
public void AddTagToNoteList(Note note, Tags tagToAdd)
{
if (!TagList.Contains(tagToAdd))
{
throw new NotFoundException("Tag not found");
}
if (!NoteList.Contains(note))
{
throw new NotFoundException("Note not found");
}
NoteTagged[note].Add(tagToAdd);
}
/// <summary>
/// supprimer un tag a une note
/// </summary>
public void RemoveTagFromNoteList(Note note, Tags tagToRemove)
{
if (!TagList.Contains(tagToRemove))
{
throw new NotFoundException("Tag not found");
}
if (!NoteList.Contains(note))
{
throw new NotFoundException("Note not found");
}
NoteTagged[note].Remove(tagToRemove);
}
/// <summary>
/// ajouter plusieur tag a une note
/// </summary>
public void AddTagsToNoteList(Note note, List<Tags> tags)
{
NoteTagged.Add(note, tags);
}
/// <summary>
///supprimer tout les tags d'une note
/// </summary>
public void RemoveTagsFromNoteList(Note note)
{
NoteTagged.Remove(note);
}
}
}

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
<ProjectReference Include="..\Notus_Persistence\Notus_Persistance.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,647 @@
using Biblioteque_de_Class;
using Notus_Persistance;
using System.Collections;
using System.Security.Cryptography;
using System.Text;
// load database
PersistenceManager manager = new(new Stub());
Database db = manager.LoadDatabaseData();
foreach(User user in db.GetUserList())
{
user.SetPassword(GetSHA256Hash(user.GetPassword()));
}
// initialization zone==============================================================================
bool continuerboucle = false;
bool menu = true, connection = false, inscription = false;
bool note=false, tags=false, para=false, paraCompte=false, theme=false;
// déclaration d'un user qui sera utiliser pour servir de personne connecté dans l'app
User u = new("", "", "");
User uvide = new("", "", "");
uvide.SetIsConnected(false);
// déclaration d'une note qui sera utiliser pour servir de note selectionnée
Note n = new("","",uvide);
List<Note> researchlist = new();
// factorisation
bool continuer()
{
continuerboucle = false;
while(!continuerboucle)
{
Console.WriteLine("\nContinuer ? (O/n)");
switch (Console.ReadLine())
{
case "O":
return true;
case null:
return true;
case "o":
return true;
case "n":
return false;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
continuerboucle = true;
break;
}
}
return false;
}
bool choix_note()
{
Console.WriteLine("\nChoisissez le nom de la note");
string? wantedModifyNote = Console.ReadLine();
wantedModifyNote??= "";
try
{
n = u.GetNoteByName(wantedModifyNote);
}catch (Exception ex) { Console.WriteLine(ex.Message); return false; }
return true;
}
void displayNote()
{
foreach (Note note in u.GetNoteList())
{
Console.WriteLine(note.GetName() + "\n");
}
}
void displayTag()
{
foreach (Tags tag in u.GetTagList())
{
Console.WriteLine(tag.GetName() + "\n");
}
}
void displayTheme()
{
foreach (Theme theme in db.GetThemeList())
{
Console.WriteLine(theme.GetName() + "\n");
}
}
List<string>? choix_couleur()
{
List<string> colorList = new();
Console.WriteLine("Fond : ");
string? wantedNewThemeFond = Console.ReadLine();
if(wantedNewThemeFond == null){ return null; }
else if(wantedNewThemeFond[0].ToString() != "#"){
Console.WriteLine("\nLa couleur doit être au format hexadécimal.\n");
return null;
}else if(wantedNewThemeFond.Length != 7)
{
string toadd="";
for(int i = 7- wantedNewThemeFond.Length; i!=0; i--){toadd += "0";}
wantedNewThemeFond += toadd;
return null;
}
Console.WriteLine("Texte : ");
string? wantedNewThemeTexte = Console.ReadLine();
if(wantedNewThemeTexte == null){ return null; }
else if(wantedNewThemeTexte[0].ToString() != "#"){
Console.WriteLine("\nLa couleur doit être au format hexadécimal.\n");
return null;
}else if(wantedNewThemeTexte.Length != 7)
{
string toadd="";
for(int i = 7- wantedNewThemeTexte.Length; i!=0; i--){toadd += "0";}
wantedNewThemeTexte += toadd;
return null;
}
Console.WriteLine("Bouton : ");
string? wantedNewThemeBouton = Console.ReadLine();
if(wantedNewThemeBouton == null){ return null; }
else if(wantedNewThemeBouton[0].ToString() != "#"){
Console.WriteLine("\nLa couleur doit être au format hexadécimal.\n");
return null;
}else if(wantedNewThemeBouton.Length != 7)
{
string toadd="";
for(int i = 7- wantedNewThemeBouton.Length; i!=0; i--){toadd += "0";}
wantedNewThemeBouton += toadd;
return null;
}
colorList.Add(wantedNewThemeFond);
colorList.Add(wantedNewThemeTexte);
colorList.Add(wantedNewThemeBouton);
return colorList;
}
static string GetSHA256Hash(string input)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
while (menu)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| starting menu |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1 / - connection - |");
Console.WriteLine("| 2 / - inscription - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1": ///Connexion
connection = true; break;
case "2":///Creer un compte
inscription = true; break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
//connection
while (connection)
{
connection = false;
Console.WriteLine("\nEntrez un nom : ");
string? nom = Console.ReadLine();
if (nom == null) { continue; }
Console.WriteLine("\nEntrez un password :");
string? password = Console.ReadLine();
if (password == null) { continue; }
password = GetSHA256Hash(password);
try
{
u = db.GetUser(nom);
}
catch (AlreadyUsedException ex)
{
Console.WriteLine(ex.Message);
connection = true;
}
if (!connection)
{
if (Database.ComparePassword(u, password))
{
u.SetIsConnected(true);
Console.WriteLine("\nConnection réussie !\n");
menu = false;
}
else
{
Console.WriteLine("\nWrong PassWord !\n");
connection = true;
continuerboucle = true;
u = uvide;
}
}
while (continuerboucle) { connection = continuer(); }
}
//inscription
while (inscription)
{
Console.WriteLine("\nEntrez un nom :");
string? nom = Console.ReadLine();
if (nom == null) { continue; }
Console.WriteLine("\nEntrez un password :");
string? password = Console.ReadLine();
if (password == null) { continue; }
try
{
u = db.GetUser(nom);
}
catch (AlreadyUsedException)
{
password = GetSHA256Hash(password);
u = new User(nom, "", password);
db.AddUser(u);
db.GetUser(nom).SetIsConnected(true);
Console.WriteLine("\nConnection réussie !\n");
menu = false;
break;
}
Console.WriteLine("\nNom d'utilisateur déjà utilisé. \n");
while (continuerboucle) { inscription = continuer(); }
}
}
//une fois connecté ou inscription fait
while (u.GetIsConnected())
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| menu |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - rechercher note - |");
Console.WriteLine("| 2/ - note - |");
Console.WriteLine("| 3/ - tags - |");
Console.WriteLine("| 4/ - paramêtres - |");
Console.WriteLine("| 5/ - se déconnecter - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
researchlist = u.GetNoteList();
Console.WriteLine("\nEntrez la note que vous cherchez. ");
string? wantedSearchNote = Console.ReadLine();
Console.WriteLine("\nChercher par tags ? (o/N) ");
Console.WriteLine("\nChercher par date ? (o/N) ");
break;
case "2":
note = true;
break;
case "3":
tags = true;
break;
case "4":
para = true;
break;
case "5":
Console.WriteLine("\ndéconnecté! \n");
u.SetIsConnected(false);
u = uvide;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
while(note)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| menu - note |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - afficher la liste des notes - |");
Console.WriteLine("| 2/ - afficher une note - |");
Console.WriteLine("| 3/ - modifier une note - |");
Console.WriteLine("| 4/ - écrire dans une note - |");
Console.WriteLine("| 5/ - créer note - |");
Console.WriteLine("| 6/ - supprimer note - |");
Console.WriteLine("| 7/ - retour - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("note actuelle : " + n.GetName());
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
displayNote();
break;
case "2":
if (!choix_note()) { break; }
Console.WriteLine("\n" + n.GetName() + " :");
Console.WriteLine(n.GetText());
break;
case "3":
if (!choix_note()) { break;}
Console.WriteLine("\nChoisissez le nouveau nom de la note (entrer - nom par defaut)");
string? wantedNewNameNote = Console.ReadLine();
wantedNewNameNote??= "";
n.SetName(wantedNewNameNote);
break;
case "4":
if (!choix_note()) { break; }
Console.WriteLine(n.GetText());
Console.WriteLine("\nEntrez le texte à ajouter");
string? wantedTextNote = Console.ReadLine();
wantedTextNote??= "";
n.AddText(wantedTextNote);
break;
case "5":
Console.WriteLine("\nChoisissez le nom de la note (entrer - nom par defaut)");
string? wantedNameNote = Console.ReadLine();
wantedNameNote ??= "";
u.CreateNote(wantedNameNote, "");
break;
case "6":
Console.WriteLine("\nChoisissez le nom de la note");
string? wantedDeleteNote = Console.ReadLine();
wantedDeleteNote ??= "";
try
{
u.DeleteNote(wantedDeleteNote);
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
break;
case "7":
note = false;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
}
while (tags)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| menu - tags |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - créer tag - |");
Console.WriteLine("| 2/ - ajouter tag - |");
Console.WriteLine("| 3/ - supprimer tag - |");
Console.WriteLine("| 4/ - retour - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
Console.WriteLine("\nChoisissez le nom du tag.");
string? wantedNameTag = Console.ReadLine();
wantedNameTag??= "NoName" + u.GetTagList().Count.ToString();
Console.WriteLine("\nChoisissez la couleur du tag.");
string? wantedColorTag = Console.ReadLine();
wantedColorTag??= "#000000";
if (wantedColorTag[0] != '#') { wantedColorTag = "#" + wantedColorTag; }
else if (wantedColorTag.Length < 7) { string toadd=""; for(int i = 7-wantedColorTag.Length; i!=0; i--){toadd += "0";} wantedColorTag += toadd ;}
else if (wantedColorTag.Length > 7) { wantedColorTag = wantedColorTag[..7];}
u.CreateTag(wantedNameTag,wantedColorTag);
break;
case "2":
Note wantedAddNote;
Tags wantedAddTag;
Console.WriteLine("\n Plusieurs tags à ajouter ? (o/N)");
string? wantedAddMultipleTag = Console.ReadLine();
wantedAddMultipleTag ??= "N";
if(wantedAddMultipleTag == "o" || wantedAddMultipleTag == "O"){
displayNote();
Console.WriteLine("\nDonnez le nom de la note à laquelle ajouter des tags : ");
string? wantedAddNameNote = Console.ReadLine();
wantedAddNameNote??= "";
try{
wantedAddNote = u.GetNoteByName(wantedAddNameNote);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
displayTag();
Console.WriteLine("\nChoisissez les noms des tags séparés par des espaces.");
string? wantedAddNameTags = Console.ReadLine();
wantedAddNameTags??= "";
string[] wantedAddNameTagsList = wantedAddNameTags.Split(' ');
foreach(string wantedAddNameTag in wantedAddNameTagsList)
{
try
{
wantedAddTag = u.GetTagByName(wantedAddNameTag);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
try
{
u.AddTagToNoteList(wantedAddNote, wantedAddTag);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
}
}else if(wantedAddMultipleTag == "n" || wantedAddMultipleTag == "N"){
displayNote();
Console.WriteLine("\nChoisissez le nom de la note.");
string? wantedAddNameNote = Console.ReadLine();
wantedAddNameNote??= "";
displayTag();
Console.WriteLine("\nChoisissez le nom du tag.");
string? wantedAddNameTag = Console.ReadLine();
wantedAddNameTag??= "";
try
{
wantedAddNote = u.GetNoteByName(wantedAddNameNote);
wantedAddTag = u.GetTagByName(wantedAddNameTag);
u.AddTagToNoteList(wantedAddNote, wantedAddTag);
}catch (Exception ex) { Console.WriteLine(ex.Message); }
}else{
Console.WriteLine("\nEntrez un choix valide.\n");
}
break;
case "3":
displayNote();
Note wantedRemoveNote;
Tags wantedRemoveTag;
Console.WriteLine("\n Choisissez le nom de la note à laquelle supprimer des tags : ");
string? wantedRemoveNameNote = Console.ReadLine();
wantedRemoveNameNote??= "";
try{
wantedRemoveNote = u.GetNoteByName(wantedRemoveNameNote);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
foreach( Tags t in u.GetNoteTaggedList(wantedRemoveNote))
{
Console.WriteLine(t.GetName() + "\n");
}
Console.WriteLine("\nChoisissez le nom du tag à supprimer.");
string? wantedRemoveNameTag = Console.ReadLine();
wantedRemoveNameTag??= "";
try {
wantedRemoveTag = u.GetTagByName(wantedRemoveNameTag);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
try
{
u.RemoveTagFromNoteList(wantedRemoveNote, wantedRemoveTag);
}catch (Exception ex) { Console.WriteLine(ex.Message); }
break;
case "4":
tags = false;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
}
while(para)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| menu - paramêtre |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - modifier compte - |");
Console.WriteLine("| 2/ - thèmes - |");
Console.WriteLine("| 3/ - supprimer un compte - |");
Console.WriteLine("| 4/ - retour - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
paraCompte = true;
break;
case "2":
theme = true;
break;
case "3":
Console.WriteLine("\nÊtes-vous sûr de vouloir supprimer votre compte ? (o/N)");
string? wantedDelete = Console.ReadLine();
wantedDelete??= "N";
if( wantedDelete == "o" || wantedDelete == "O"){
db.RemoveUser(u);
Console.WriteLine("\nVotre compte a bien été supprimé.\n");
para = false;
u = uvide;
break;
}else if( wantedDelete == "n" || wantedDelete == "N"){
break;
}
break;
case "4":
para = false;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
while (paraCompte)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| paramêtre - compte |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - modifier pseudo - |");
Console.WriteLine("| 2/ - modifier mot de passe - |");
Console.WriteLine("| 3/ - retour - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
Console.WriteLine("\nChoisissez le nouveau pseudo.");
string? wantedNewPseudo = Console.ReadLine();
if(wantedNewPseudo == null){break;}
u.SetUsername(wantedNewPseudo);
break;
case "2":
Console.WriteLine("\nChoisissez le nouveau mot de passe.");
string? wantedNewPassword = Console.ReadLine();
if(wantedNewPassword == null){break;}
else if(wantedNewPassword.Length < 8){
Console.WriteLine("\nLe mot de passe doit contenir au moins 8 caractères.\n");
break;
}
wantedNewPassword = GetSHA256Hash(wantedNewPassword);
if(wantedNewPassword == u.GetPassword()){
Console.WriteLine("\nLe nouveau mot de passe doit être différent de l'ancien.\n");
break;
}
u.SetPassword(wantedNewPassword);
break;
case "3":
paraCompte = false;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
}
while (theme)
{
Console.WriteLine("\n|--------------------------------------|");
Console.WriteLine("| |");
Console.WriteLine("| paramêtre - thèmes |");
Console.WriteLine("| |");
Console.WriteLine("|--------------------------------------|--------|");
Console.WriteLine("| |");
Console.WriteLine("| 1/ - choisir un thème - |");
Console.WriteLine("| 2/ - créer un thème - |");
Console.WriteLine("| 3/ - supprimer un thème - |");
Console.WriteLine("| 4/ - modifier un thème - |");
Console.WriteLine("| 5/ - retour - |");
Console.WriteLine("| |");
Console.WriteLine("|-----------------------------------------------|\n");
Console.WriteLine("rentrez votre choix.");
switch (Console.ReadLine())
{
case "1":
Theme twantedTheme;
displayTheme();
Console.WriteLine("\nChoisissez le nom du thème.");
string? wantedTheme = Console.ReadLine();
if(wantedTheme==null){break;}
try
{
twantedTheme = db.GetTheme(wantedTheme);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
u.SetTheme(twantedTheme);
break;
case "2":
List<string>? themeList;
Console.WriteLine("\nChoisissez le nom du thème.");
string? wantedNewThemeName = Console.ReadLine();
if(wantedNewThemeName==null){break;}
Console.WriteLine("\nChoisissez la couleur du thème.");
themeList = choix_couleur();
if(themeList == null) { break;}
db.AddTheme(new Theme(wantedNewThemeName, themeList));
break;
case "3":
Theme t;
Console.WriteLine("\nChoisissez le nom du thème à supprimer.");
string? wantedRemoveTheme = Console.ReadLine();
if(wantedRemoveTheme == null) {break;}
try{
t = db.GetTheme(wantedRemoveTheme);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
try{
db.RemoveTheme(t);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
break;
case "4":
displayTheme();
Theme themeToModify;
Console.WriteLine("\nChoisissez le nom du thème à modifier.");
string? wantedModifyTheme = Console.ReadLine();
if(wantedModifyTheme == null){break;}
try{
themeToModify = db.GetTheme(wantedModifyTheme);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
Console.WriteLine("\nChoisissez le nouveau nom du thème.");
string? wantedNewNameTheme = Console.ReadLine();
if(wantedNewNameTheme == null) {break;}
try{
db.ModifyThemeName(themeToModify, wantedNewNameTheme);
}catch (Exception ex) { Console.WriteLine(ex.Message); break;}
Console.WriteLine("\nChoisissez les nouvelles couleurs du thème.");
List<string>? couleurlist = choix_couleur();
if(couleurlist == null) { break;}
db.ModifyThemeColorList(themeToModify, couleurlist);
break;
case "5":
theme = false;
break;
default:
Console.WriteLine("\nEntrez un choix valide.\n");
break;
}
}
}
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,68 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace Notus_Persistance
{
public class Stub : IManager
{
public void SaveDatabaseData(Database database)
{
throw new NotImplementedException();
}
//Loaders
Database IManager.LoadDatabaseData()
{
Database database = new Database();
Note nselect;
User uselect;
// add some users
database.AddUser(new User("Nicolas", "leHeros@gmail.com", "Feur"));
database.AddUser(new User("Benjamin", "labsent@gmail.com", "Moto2005"));
database.AddUser(new User("Liam", "liammonchanin@gmail.com", "Baguette"));
database.AddUser(new User("Brigitte", "Macroutte@gmail.com", "49Trois"));
// add some notes and tags to go faster
foreach(User user in database.GetUserList().Where(x => x.GetUsername().Contains("m")))
{
user.CreateNote("Note 1", "");
user.CreateNote("Note 2", "");
user.CreateNote("Note 3", "");
user.CreateTag("Tag 1","#FA0034");
user.CreateTag("Tag 2", "#2500A4");
}
// add note to user for sharing note test mixed with tag
uselect = (User)database.GetUserList().Where(x => x.GetUsername() == "Nicolas");
uselect.CreateNote("Note 4", "Logo_1");
uselect.CreateTag("Tag 3", "#00FF00");
nselect = (Note)uselect.GetNoteList().Where(x => x.GetName() == "Note 4");
uselect.AddTagToNoteList(nselect, (Tags)uselect.GetTagList().Where(x => x.GetName() == "Tag 3"));
nselect.AddCollaborator(uselect,(User)database.GetUserList().Where(x => x.GetUsername() == "Benjamin"));
uselect = (User)database.GetUserList().Where(x => x.GetUsername() == "Benjamin");
uselect.CreateTag("Tag 4", "#FF0000");
// add some default logos and themes
database.GetDefaultLogoList().Add(new Logo("Logo_1", "logo"));
database.GetDefaultLogoList().Add(new Logo("Logo_2", "logo"));
database.GetDefaultLogoList().Add(new Logo("Logo_3", "logo"));
List<string> colorListHexaCode = new("FF0000,00FF00,0000FF".Split(','));
database.AddTheme(new Theme("Theme_1", colorListHexaCode));
colorListHexaCode = new("FF00FF,00FFFF,FFFF00".Split(','));
database.AddTheme(new Theme("Theme_2", colorListHexaCode));
colorListHexaCode = new("000000,FFFFFF,000000".Split(','));
database.AddTheme(new Theme("Theme_3", colorListHexaCode));
return database;
}
}
}

@ -0,0 +1,69 @@
using Biblioteque_de_Class;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Xml;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.Json;
namespace Notus_Persistance
{
public class ToJSON : IManager
{
private const string DatabaseDataFilePath = "data.json";
private const string UserDataFilePath = "userdata.json";
private const string NoteDataFilePath = "notedata.json";
private const string ThemeDataFilePath = "themedata.json";
private const string LogoDataFilePath = "logodata.json";
private const string TagsDataFilePath = "tagsdata.json";
private const string NoteImageDataFilePath = "noteImagedata.json";
private static DataContractJsonSerializer DatabasejsonSerializer = new DataContractJsonSerializer(typeof(Database));
private static DataContractJsonSerializer UserjsonSerializer = new DataContractJsonSerializer(typeof(User));
private static DataContractJsonSerializer NotejsonSerializer = new DataContractJsonSerializer(typeof(Note));
private static DataContractJsonSerializer ThemejsonSerializer = new DataContractJsonSerializer(typeof(Theme));
private static DataContractJsonSerializer LogojsonSerializer = new DataContractJsonSerializer(typeof(Logo));
private static DataContractJsonSerializer TagsjsonSerializer = new DataContractJsonSerializer(typeof(Tags));
private static DataContractJsonSerializer NoteImagejsonSerializer = new DataContractJsonSerializer(typeof(NoteImage));
public void SaveDatabaseData(Database database)
{
using (FileStream fileStream = File.Create(DatabaseDataFilePath))
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(
fileStream,
System.Text.Encoding.UTF8,
false,
true))//<- this boolean says that we sant indentation
{
DatabasejsonSerializer.WriteObject(writer, database);
}
}
}
public Database LoadDatabaseData()
{
if (File.Exists(DatabaseDataFilePath))
{
using (FileStream fileStream = File.OpenRead(DatabaseDataFilePath))
{
Database? database = (Database?)DatabasejsonSerializer.ReadObject(fileStream);
if (database == null)
{
throw new FileException("Failed to load database. The loaded object is null.");
}
else
{
return database;
}
}
}
else
{
throw new FileException("No data file found.");
}
}
}
}

@ -0,0 +1,28 @@
using Biblioteque_de_Class;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Xml;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_Persistance
{
public class ToXML : IManager
{
private const string DataFilePath = "data.xml";
private const string XmlDataFilePath = "userdata.xml";
public void SaveDatabaseData(Database database)
{
throw new NotImplementedException();
}
public Database LoadDatabaseData()
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,36 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Persistance", "Notus_Persistence\Notus_Persistance.csproj", "{184478A9-E14F-42E0-B963-B3A4474C9C1C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Notus_UnitTest_Database", "Tests\Notus_UnitTest_Database\Notus_UnitTest_Database.csproj", "{EE443C17-B31D-4AD0-9141-920876E7DF79}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.Build.0 = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.Build.0 = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.Build.0 = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

@ -0,0 +1,39 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class AddThemeTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void AddTheme_NewTheme_ThemeAddedToList()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
database.AddTheme(theme);
CollectionAssert.Contains(database.GetThemeList(), theme);
}
[Test]
public void AddTheme_ExistingTheme_ThrowsException()
{
List<string> listcolor = new();
Theme theme = new Theme("ocean", listcolor);
database.AddTheme(theme);
Assert.Throws<AlreadyUsedException>(() => database.AddTheme(theme), "Theme already used.");
}
}
}

@ -0,0 +1,51 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class AddUserTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void AddUser_ValidUser_UserAddedToList()
{
User user = new User("John", "rien", "choco") ;
user.SetEmail("john@example.com");
database.AddUser(user);
CollectionAssert.Contains(database.GetUserList(), user);
}
[Test]
public void AddUser_DuplicateUsername_ThrowsException()
{
User existingUser = new User("John1", "rien", "choco");
existingUser.SetEmail("john1@example.com");
database.GetUserList().Add(existingUser);
User newUser = new User("John1", "rien", "choco");
newUser.SetEmail("Jane@example.com");
Assert.Throws<AlreadyUsedException>(() => database.AddUser(newUser), "Username already used.");
}
[Test]
public void AddUser_DuplicateEmail_ThrowsException()
{
User existingUser = new User("John2", "rien", "choco");
existingUser.SetEmail("john2@example.com");
database.GetUserList().Add(existingUser);
User newUser = new User("Jane", "rien", "choco");
newUser.SetEmail("john2@example.com");
Assert.Throws<AlreadyUsedException>(() => database.AddUser(newUser), "Email already used.");
}
}
}

@ -0,0 +1,42 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
[TestFixture]
public class ComparePasswordTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
User user = new User("John","rien","choco");
user.SetPassword("password123");
database.GetUserList().Add(user);
}
[Test]
public void ComparePassword_CorrectPassword_ReturnsTrue()
{
User user = database.GetUserList()[0];
string password = "password123";
var result = Database.ComparePassword(user, password);
Assert.That(result, Is.True);
}
[Test]
public void ComparePassword_IncorrectPassword_ReturnsFalse()
{
User user = database.GetUserList()[0];
string password = "incorrectPassword";
var result = Database.ComparePassword(user, password);
Assert.That(result, Is.False);
}
}
}

@ -0,0 +1,39 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class FindMailTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
User user = new User("John","rien","choco");
user.SetEmail("john@example.com");
database.GetUserList().Add(user);
}
[Test]
public void FindEmail_ExistingEmail_ReturnsTrue()
{
string email = "john@example.com";
bool result = database.FindEmail(email);
Assert.IsTrue(result);
}
[Test]
public void FindEmail_NonExistingEmail_ReturnsFalse()
{
string email = "jane@example.com";
bool result = database.FindEmail(email);
Assert.IsFalse(result);
}
}
}

@ -0,0 +1,32 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Database
{
[TestFixture]
public class GetLogoLinksTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
database.GetDefaultLogoList().Add(new Logo("Logo1", "link1"));
database.GetDefaultLogoList().Add(new Logo("Logo2", "link2"));
database.GetDefaultLogoList().Add(new Logo("Logo3", "link3"));
}
[Test]
public void GetLogoLink_LogoExists_ReturnsLogoLink()
{
Assert.That(database.GetLogoLink("Logo2"), Is.EqualTo("link2"));
}
[Test]
public void GetLogoLink_LogoDoesNotExist_ThrowsException()
{
string logoName = "Logo4";
Assert.Throws<NotFoundException>(() => database.GetLogoLink(logoName));
}
}
}

@ -0,0 +1,36 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class GetThemeTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void GetTheme_ExistingTheme_ReturnsTheme()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
database.GetThemeList().Add(theme);
Theme retrievedTheme = database.GetTheme("ocean");
Assert.That(retrievedTheme, Is.EqualTo(theme));
}
[Test]
public void GetTheme_NonExistingTheme_ThrowsException()
{
Assert.Throws<NotFoundException>(() => database.GetTheme("NonExistingTheme"), "No theme found with this name.");
}
}
}

@ -0,0 +1,36 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Database
{
[TestFixture]
public class GetUserTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
database.GetUserList().Add(new User("John","rien","choco"));
database.GetUserList().Add(new User("Alice", "rien", "choco"));
database.GetUserList().Add(new User("Bob", "rien", "choco"));
}
[Test]
public void GetUser_UserExists_ReturnsUser()
{
string userName = "Alice";
User user = database.GetUser(userName);
Assert.IsNotNull(user);
Assert.That(user.GetUsername(), Is.EqualTo(userName));
}
[Test]
public void GetUser_UserDoesNotExist_ThrowsException()
{
string userName = "Eve";
Assert.Throws<AlreadyUsedException>(() => database.GetUser(userName));
}
}
}

@ -0,0 +1,33 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class ModifyThemeColorListTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void ModifyThemeColorList_ExistingTheme_ModifiesColors()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
database.GetThemeList().Add(theme);
List<string> newColorList = new List<string> { "Red", "Green", "Blue" };
database.ModifyThemeColorList(theme, newColorList);
Assert.That(theme.GetColor(0), Is.EqualTo(newColorList[0]));
Assert.That(theme.GetColor(1), Is.EqualTo(newColorList[1]));
Assert.That(theme.GetColor(2), Is.EqualTo(newColorList[2]));
}
}
}

@ -0,0 +1,40 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class ModifyThemeNameTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void ModifyThemeName_ExistingTheme_ModifiesName()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
database.GetThemeList().Add(theme);
string newName = "Light";
database.ModifyThemeName(theme, newName);
Assert.That(theme.GetName(), Is.EqualTo(newName));
}
[Test]
public void ModifyThemeName_NonExistingTheme_ThrowsException()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
string newName = "Light";
Assert.Throws<NotFoundException>(() => database.ModifyThemeName(theme, newName), "Theme not found.");
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,38 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class RemoveThemeTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void RemoveTheme_NewTheme_ThemeAddedToList()
{
List<string> listcolor = new List<string>() { "Blue", "Dark", "Grey" };
Theme theme = new Theme("ocean", listcolor);
database.AddTheme(theme);
database.RemoveTheme(theme);
CollectionAssert.DoesNotContain(database.GetThemeList(), theme);
}
[Test]
public void RemoveTheme_ExistingTheme_ThrowsException()
{
List<string> listcolor = new();
Theme theme = new Theme("ocean", listcolor);
Assert.Throws<NotFoundException>(() => database.RemoveTheme(theme), "Theme already used.");
}
}
}

@ -0,0 +1,38 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Database
{
public class RemoveUserTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
}
[Test]
public void RemoveUser_ExistingUser_UserRemovedFromList()
{
User user = new User("John","rien","choco");
user.SetEmail("john@example.com");
database.GetUserList().Add(user);
database.RemoveUser(user);
CollectionAssert.DoesNotContain(database.GetUserList(), user);
}
[Test]
public void RemoveUser_NonExistingUser_ThrowsException()
{
User user = new User("John", "rien", "choco");
user.SetEmail("john@example.com");
Assert.Throws<NotFoundException>(() => database.RemoveUser(user), "User not found.");
}
}
}

@ -0,0 +1,54 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Database
{
[TestFixture]
public class SearchUserTests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
database.GetUserList().Add(new User("John", "john@example.com", "choco"));
database.GetUserList().Add(new User("Jane", "jane@example.com", "choco"));
database.GetUserList().Add(new User("Alice", "alice@example.com", "choco"));
}
[Test]
public void SearchUser_UserExists_ReturnsMatchingUsers()
{
string searchName = "Jo";
List<User> searchedUsers = database.SearchUser(searchName);
Assert.That(searchedUsers.Count, Is.EqualTo(1));
Assert.That(searchedUsers[0].GetUsername(), Is.EqualTo("John"));
}
[Test]
public void SearchUser_UserDoesNotExist_ReturnsEmptyList()
{
string searchName = "Bob";
List<User> searchedUsers = database.SearchUser(searchName);
Assert.IsEmpty(searchedUsers);
}
[Test]
public void SearchUser_CaseInsensitiveSearch_ReturnsMatchingUsers()
{
string searchName = "ALICE";
List<User> searchedUsers = database.SearchUser(searchName);
Assert.That(searchedUsers.Count, Is.EqualTo(1));
Assert.That(searchedUsers[0].GetUsername(), Is.EqualTo("Alice"));
}
[Test]
public void SearchUser_PartialMatch_ReturnsMatchingUsers()
{
string searchName = "ane";
List<User> searchedUsers = database.SearchUser(searchName);
Assert.That(searchedUsers.Count, Is.EqualTo(1));
Assert.That(searchedUsers[0].GetUsername(), Is.EqualTo("Jane"));
}
}
}

@ -0,0 +1 @@
global using NUnit.Framework;

@ -0,0 +1,28 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class AddCollaboratorTests
{
[Test]
public void AddCollaborator_WhenUserIsOwner_CollaboratorAdded()
{
User owner = new User("Owner", "owner@example.com", "password");
User collaborator = new User("Collaborator1", "collaborator1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddCollaborator(owner, collaborator);
Assert.Contains(collaborator, note.GetCollaborators());
}
[Test]
public void AddCollaborator_WhenUserIsNotOwner_ThrowsException()
{
User owner = new User("Owner", "owner@example.com", "password");
User collaborator = new User("Collaborator1", "collaborator1@example.com", "password");
User user = new User("User1", "user1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
Assert.Throws<NotAllowedException>(() => note.AddCollaborator(user, collaborator));
}
}
}

@ -0,0 +1,29 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class AddEditorTests
{
[Test]
public void AddEditor_WhenUserIsOwner_EditorAdded()
{
User owner = new User("Owner", "owner@example.com", "password");
User editor = new User("Editor1", "editor1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddEditor(owner, editor);
Assert.IsTrue(note.GetEditors().Contains(editor));
}
[Test]
public void AddEditor_WhenUserIsNotOwner_ThrowsException()
{
User owner = new User("Owner", "owner@example.com", "password");
User editor = new User("Editor1", "editor1@example.com", "password");
User user = new User("User1", "user1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
Assert.Throws<NotAllowedException>(() => note.AddEditor(user, editor));
}
}
}

@ -0,0 +1,23 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
public class AddImageTests
{
[Test]
public void AddImage_WhenImageLinkIsValid_ImageAddedToList()
{
User owner = new User("Owner", "owner@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
string imageLink = "image.png";
string position = "top";
note.AddImage(imageLink, position);
Assert.That(note.GetImageList().Count, Is.EqualTo(1));
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,36 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class RemoveCollaboratorTests
{
[Test]
public void RemoveCollaborator_WhenUserIsOwner_CollaboratorRemoved()
{
User owner = new User("Owner", "owner@example.com", "password");
User collaborator = new User("Collaborator1", "collaborator1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddCollaborator(owner, collaborator);
note.RemoveCollaborator(owner, collaborator);
Assert.IsFalse(note.GetCollaborators().Contains(collaborator));
}
[Test]
public void RemoveCollaborator_WhenUserIsNotOwner_ThrowsException()
{
User owner = new User("Owner", "owner@example.com", "password");
User collaborator = new User("Collaborator1", "collaborator1@example.com", "password");
User user = new User("User1", "user1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddCollaborator(owner, collaborator);
Assert.Throws<NotAllowedException>(() => note.RemoveCollaborator(user, collaborator));
}
}
}

@ -0,0 +1,36 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class RemoveEditorTests
{
[Test]
public void RemoveEditor_WhenUserIsOwner_EditorRemoved()
{
User owner = new User("Owner", "owner@example.com", "password");
User editor = new User("Editor1", "editor1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddEditor(owner, editor);
note.RemoveEditor(owner, editor);
Assert.IsFalse(note.GetEditors().Contains(editor));
}
[Test]
public void RemoveEditor_WhenUserIsNotOwner_ThrowsException()
{
User owner = new User("Owner", "owner@example.com", "password");
User editor = new User("Editor1", "editor1@example.com", "password");
User user = new User("User1", "user1@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddEditor(owner, editor);
Assert.Throws<NotAllowedException>(() => note.RemoveEditor(user, editor));
}
}
}

@ -0,0 +1,31 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class RemoveImageTests
{
[Test]
public void RemoveImage_WhenImageExists_ImageRemovedFromList()
{
User owner = new User("Owner", "owner@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
note.AddImage("image.png", "top");
note.RemoveImage(1);
Assert.That(note.GetImageList().Count, Is.EqualTo(0));
}
[Test]
public void RemoveImage_WhenImageDoesNotExist_ExceptionThrown()
{
User owner = new User("Owner", "owner@example.com", "password");
Note note = new Note("Test Note", "logo.png", owner);
Assert.Throws<NotFoundException>(() => note.RemoveImage(1));
}
}
}

@ -0,0 +1,80 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class SetTests
{
private User owner;
private Note note;
[SetUp]
public void Setup()
{
owner = new User("John","rien","choco");
note = new Note("note","logo.png",owner);
}
[Test]
public void GetName_ShouldReturnName()
{
string actualName = note.GetName();
Assert.That(actualName, Is.EqualTo("note"));
}
[Test]
public void GetLogoPath_ShouldReturnLogoPath()
{
string actualLogoPath = note.GetLogoPath();
Assert.That(actualLogoPath, Is.EqualTo("logo.png"));
}
[Test]
public void GetCreationDate_ShouldReturnCreationDate()
{
DateOnly actualCreationDate = note.GetCreationDate();
Assert.That(actualCreationDate, Is.EqualTo(DateOnly.FromDateTime(DateTime.Now)));
}
[Test]
public void GetModificationDate_ShouldReturnModificationDate()
{
DateOnly actualModificationDate = note.GetModificationDate();
Assert.That(actualModificationDate, Is.EqualTo(DateOnly.FromDateTime(DateTime.Now)));
}
[Test]
public void GetImageList_ShouldReturnImageList()
{
List<NoteImage> actualImageList = note.GetImageList();
Assert.That(actualImageList, Is.EqualTo(new List<NoteImage>()));
}
[Test]
public void GetCollaborators_ShouldReturnCollaborators()
{
List<User> actualCollaborators = note.GetCollaborators();
Assert.That(actualCollaborators, Is.EqualTo(new List<User>()));
}
[Test]
public void GetEditors_ShouldReturnEditors()
{
List<User> actualEditors = note.GetEditors();
Assert.That(actualEditors, Is.EqualTo(new List<User>()));
}
[Test]
public void GetOwner_ShouldReturnOwner()
{
User actualOwner = note.GetOwner();
Assert.That(actualOwner, Is.EqualTo(owner));
}
}
}

@ -0,0 +1 @@
global using NUnit.Framework;

@ -0,0 +1,26 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class VerifyOwnerTests
{
[Test]
public void VerifyOwner_UserIsOwner_ReturnsTrue()
{
User owner = new User("John", "john@example.com", "choco");
Note note = new Note("My Note", "path/to/logo.png", owner);
bool isOwner = note.VerifyOwner(owner);
Assert.IsTrue(isOwner);
}
[Test]
public void VerifyOwner_UserIsNotOwner_ReturnsFalse()
{
User owner = new User("John", "john@example.com", "choco");
User anotherUser = new User("Jane", "jane@example.com", "choco");
Note note = new Note("My Note", "path/to/logo.png", owner);
bool isOwner = note.VerifyOwner(anotherUser);
Assert.IsFalse(isOwner);
}
}
}

@ -0,0 +1,32 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Notus_UnitTest_Note
{
[TestFixture]
public class VerifyPrivilegeTests
{
[Test]
public void VerifyPrivilege_WhenUserIsEditor_ReturnsTrue()
{
User editor = new User("Editor1", "editor1@example.com", "password");
Note note = new Note("Test Note", "logo.png", new User("Owner", "owner@example.com", "password"));
note.AddEditor(note.GetOwner(), editor);
bool result = note.VerifyPrivilege(editor);
Assert.IsTrue(result);
}
[Test]
public void VerifyPrivilege_WhenUserIsNotEditor_ThrowsException()
{
User editor = new User("Editor1", "editor1@example.com", "password");
Note note = new Note("Test Note", "logo.png", new User("Owner", "owner@example.com", "password"));
bool result = note.VerifyPrivilege(editor);
Assert.IsFalse(result);
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,59 @@
using Biblioteque_de_Class;
namespace Notus_UnitTest_User
{
[TestFixture]
public class SearchNoteByNameTests
{
private User owner;
private string searchName;
[SetUp]
public void SetUp()
{
owner = new("Owner", "owner@example.com", "password");
owner.CreateNote("Note 1", "image1.png");
owner.CreateNote("Note 2", "image2.png");
owner.CreateNote("Another Note", "image3.png");
owner.AddFavorite(owner.GetNoteList()[0]);
owner.AddFavorite(owner.GetNoteList()[1]);
owner.AddFavorite(owner.GetNoteList()[2]);
searchName = "note";
}
[Test]
public void SearchNoteByName_WhenMatchingNotesExist_NotesReturned()
{
List<Note> result = owner.SearchNoteByName(owner.GetNoteList(),"note");
Assert.That(result, Has.Count.EqualTo(3));
CollectionAssert.Contains(result, owner.GetNoteList()[0]);
CollectionAssert.Contains(result, owner.GetNoteList()[1]);
CollectionAssert.Contains(result, owner.GetNoteList()[2]);
}
[Test]
public void SearchNoteByName_WhenNoMatchingNotesExist_EmptyListReturned()
{
List<Note> result = owner.SearchNoteByName(owner.GetNoteList(), "test");
Assert.That(result, Is.Empty);
}
[Test]
public void SearchFavoriteNoteByName_ShouldReturnMatchingNotes()
{
List<Note> searchedNotes = owner.SearchNoteByName(owner.GetFavList(), searchName);
Assert.That(searchedNotes, Has.Count.EqualTo(3));
CollectionAssert.Contains(searchedNotes, owner.GetNoteList()[0]);
CollectionAssert.Contains(searchedNotes, owner.GetNoteList()[1]);
CollectionAssert.Contains(searchedNotes, owner.GetNoteList()[2]);
}
[Test]
public void SearchFavoriteNoteByName_ShouldReturnEmptyList_WhenNoMatchFound()
{
searchName = "nonexistent";
List<Note> searchedNotes = owner.SearchNoteByName(owner.GetFavList(), searchName);
Assert.That(searchedNotes, Is.Empty);
}
}
}

@ -0,0 +1 @@
global using NUnit.Framework;

@ -0,0 +1,71 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Vue", "notus_vue\Notus_Vue.csproj", "{561264A1-4611-40FB-A662-3EF65550CA71}"
ProjectSection(ProjectDependencies) = postProject
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB} = {0A5E5F33-6B39-42BF-A46D-0752EDB666FB}
{184478A9-E14F-42E0-B963-B3A4474C9C1C} = {184478A9-E14F-42E0-B963-B3A4474C9C1C}
{7B7F1062-9498-44E5-AC77-84BC90A3B730} = {7B7F1062-9498-44E5-AC77-84BC90A3B730}
{92DD50C5-EEAD-44ED-AEFF-E21935725477} = {92DD50C5-EEAD-44ED-AEFF-E21935725477}
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF} = {AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}
{EE443C17-B31D-4AD0-9141-920876E7DF79} = {EE443C17-B31D-4AD0-9141-920876E7DF79}
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "Notus_Console\Notus_Console.csproj", "{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Persistance", "Notus_Persistence\Notus_Persistance.csproj", "{184478A9-E14F-42E0-B963-B3A4474C9C1C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_UnitTest_Database", "Tests\Notus_UnitTest_Database\Notus_UnitTest_Database.csproj", "{EE443C17-B31D-4AD0-9141-920876E7DF79}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_UnitTest_Note", "Tests\Notus_UnitTest_Note\Notus_UnitTest_Note.csproj", "{7B7F1062-9498-44E5-AC77-84BC90A3B730}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_UnitTest_User", "Tests\Notus_UnitTest_User\Notus_UnitTest_User.csproj", "{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{561264A1-4611-40FB-A662-3EF65550CA71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{561264A1-4611-40FB-A662-3EF65550CA71}.Debug|Any CPU.Build.0 = Debug|Any CPU
{561264A1-4611-40FB-A662-3EF65550CA71}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{561264A1-4611-40FB-A662-3EF65550CA71}.Release|Any CPU.ActiveCfg = Release|Any CPU
{561264A1-4611-40FB-A662-3EF65550CA71}.Release|Any CPU.Build.0 = Release|Any CPU
{561264A1-4611-40FB-A662-3EF65550CA71}.Release|Any CPU.Deploy.0 = Release|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.Build.0 = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.Build.0 = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.Build.0 = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.Build.0 = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.Build.0 = Release|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Release|Any CPU.Build.0 = Release|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

@ -0,0 +1,14 @@
<?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:local="clr-namespace:notus"
x:Class="notus.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

@ -0,0 +1,14 @@

namespace notus;
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="notus.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:notus"
Shell.FlyoutBehavior="Locked"
Shell.FlyoutWidth="30"
Shell.NavBarIsVisible="False">
<ShellContent
Title="main_page"
ContentTemplate="{DataTemplate local:MainPage}"
Route="MainPage" />
<ShellContent
Title="connexion_page"
ContentTemplate="{DataTemplate local:ConnecPage}"
Route="ConnecPage" />
<ShellContent
Title="recherche_page"
ContentTemplate="{DataTemplate local:RecherPage}"
Route="RecherPage"/>
<ShellContent
Title="Inscription_Page"
ContentTemplate="{DataTemplate local:InscrPage}"
Route="InscrPage"/>
</Shell>

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

@ -0,0 +1,74 @@
<?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.ConnecPage"
Title="ConnecPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<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="4*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="0.9*"/>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Connection"
TextColor="#74fabd"
FontSize="80"
FontFamily="strong"/>
<Entry
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="3"
FontSize="22"
Placeholder="entrer votre e-mail"
PlaceholderColor="#74fabd"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"/>
<Entry
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="5"
FontSize="22"
Placeholder="entrer votre mot de passe"
PlaceholderColor="#74fabd"
TextColor="#74fabd"
IsPassword="true"
BackgroundColor="#4A4A4A"/>
<Button
Grid.Column="2"
Grid.ColumnSpan="1"
Grid.Row="7"
Text="Valider"
TextColor="Black"
BackgroundColor="#74fabd"/>
</Grid>
</ContentPage>

@ -0,0 +1,9 @@
namespace notus;
public partial class ConnecPage : ContentPage
{
public ConnecPage()
{
InitializeComponent();
}
}

@ -0,0 +1,84 @@
<?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"
x:Class="notus.InscrPage"
Title="InscrPage">
<Grid BackgroundColor="#1C1C1C">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="350"/>
<ColumnDefinition Width="700"/>
<ColumnDefinition Width="500"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="200"/>
</Grid.RowDefinitions>
<Entry
Placeholder="Pseudo"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="1"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Entry
Placeholder="Mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="2"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Entry
Placeholder ="Verif mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="3"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Button
Text="Valider"
Grid.Column="1"
Grid.Row="4"
HorizontalOptions="End"
VerticalOptions="Center"
WidthRequest="110"
HeightRequest="70"
BackgroundColor="#74fabd"
TextColor="Black"
CornerRadius="10"
/>
</Grid>
</ContentPage>

@ -0,0 +1,9 @@
namespace notus;
public partial class InscrPage : ContentPage
{
public InscrPage()
{
InitializeComponent();
}
}

@ -0,0 +1,57 @@
<?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.MainPage"
Title="Mainpage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="5*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Notus"
TextColor="#74fabd"
FontSize="120"
FontAttributes="Bold"
FontFamily="strong"/>
<Button
CornerRadius="50"
Text="Connection"
TextColor="#74fabd"
FontSize="30"
Grid.Row="2"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"/>
<Button
CornerRadius="50"
Text="Inscription"
TextColor="#74fabd"
FontSize="30"
Grid.Row="3"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"/>
</Grid>
</ContentPage>

@ -0,0 +1,8 @@
namespace notus;
public partial class MainPage : ContentPage{
public MainPage(){
InitializeComponent();
}
}

@ -0,0 +1,26 @@
using CommunityToolkit.Maui;
using Microsoft.Extensions.Logging;
namespace notus;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

@ -0,0 +1,10 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace notus;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}

@ -0,0 +1,15 @@
using Android.App;
using Android.Runtime;
namespace notus;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>

@ -0,0 +1,9 @@
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

@ -0,0 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

@ -0,0 +1,16 @@
using System;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
namespace notus;
class Program : MauiApplication
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
static void Main(string[] args)
{
var app = new Program();
app.Run(args);
}
}

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="maui-application-id-placeholder" version="0.0.0" api-version="7" xmlns="http://tizen.org/ns/packages">
<profile name="common" />
<ui-application appid="maui-application-id-placeholder" exec="notus.dll" multiple="false" nodisplay="false" taskmanage="true" type="dotnet" launch_mode="single">
<label>maui-application-title-placeholder</label>
<icon>maui-appicon-placeholder</icon>
<metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
</ui-application>
<shortcut-list />
<privileges>
<privilege>http://tizen.org/privilege/internet</privilege>
</privileges>
<dependencies />
<provides-appdefined-privileges />
</manifest>

@ -0,0 +1,8 @@
<maui:MauiWinUIApplication
x:Class="notus.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:notus.WinUI">
</maui:MauiWinUIApplication>

@ -0,0 +1,24 @@
using Microsoft.UI.Xaml;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace notus.WinUI;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="494D7E06-83EF-4532-A5F2-A2652E51FDBB" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="$placeholder$"
Description="$placeholder$"
Square150x150Logo="$placeholder$.png"
Square44x44Logo="$placeholder$.png"
BackgroundColor="transparent">
<uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
<uap:SplashScreen Image="$placeholder$.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="notus.WinUI.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
</windowsSettings>
</application>
</assembly>

@ -0,0 +1,9 @@
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

@ -0,0 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

@ -0,0 +1,8 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

@ -0,0 +1,120 @@
<?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.RecherPage"
Title="RecherPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<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="380"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="0.9*"/>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="190"/>
</Grid.ColumnDefinitions>
<Border
Background="#6E6E6E"
Grid.Column="0"
Grid.RowSpan="9"
/>
<ImageButton
Source="Profil.png"
Aspect="AspectFit"
Grid.Column="4"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="200"
HeightRequest="120"
BackgroundColor="#6E6E6E"
CornerRadius="10"
/>
<ImageButton
Source="Supp.png"
Aspect="AspectFit"
Grid.Column="2"
Grid.Row="0"
Margin="20"
HorizontalOptions="Center"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Label
Text="{Binding Note.name}"
Grid.Column="1"
Grid.Row="0"
TextColor="#74fabd"
Margin="20"
FontSize="34"
BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="50"
HorizontalOptions="Start"
VerticalOptions="Start"
/>
<ImageButton
x:Name="Edit"
Source="Edit.png"
Aspect="AspectFit"
Grid.Column="1"
Grid.Row="0"
Margin="20"
HorizontalOptions="Center"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Entry
Placeholder="Rechercher"
HorizontalOptions="Start"
Margin="20"
VerticalOptions="Center"
WidthRequest="300"
HeightRequest="50"
FontSize="32"
Grid.Column="0"
Grid.Row="0"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Editor
Placeholder="Texte"
HorizontalOptions="Start"
VerticalOptions="Center"
Margin="20"
WidthRequest="670"
HeightRequest="670"
Grid.Column="1"
Grid.ColumnSpan="4"
Grid.Row="4"
Grid.RowSpan="3"
TextColor="Black"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
</Grid>
</ContentPage>

@ -0,0 +1,22 @@
using Biblioteque_de_Class;
using Notus_Persistance;
using System.Runtime.InteropServices;
namespace notus;
public partial class RecherPage : ContentPage
{
public PersistenceManager mana { get; private set; } = new (new Stub());
public RecherPage()
{
InitializeComponent();
BindingContext = this;
Edit.Clicked += Edit_Clicked;
}
private void Edit_Clicked(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="456" height="456" fill="#512BD4" />
</svg>

After

Width:  |  Height:  |  Size: 228 B

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,93 @@
<svg width="419" height="519" viewBox="0 0 419 519" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M284.432 247.568L284.004 221.881C316.359 221.335 340.356 211.735 355.308 193.336C382.408 159.996 372.893 108.183 372.786 107.659L398.013 102.831C398.505 105.432 409.797 167.017 375.237 209.53C355.276 234.093 324.719 246.894 284.432 247.568Z" fill="#8A6FE8"/>
<path d="M331.954 109.36L361.826 134.245C367.145 138.676 375.055 137.959 379.497 132.639C383.928 127.32 383.211 119.41 377.891 114.969L348.019 90.0842C342.7 85.6531 334.79 86.3702 330.348 91.6896C325.917 97.0197 326.634 104.929 331.954 109.36Z" fill="#8A6FE8"/>
<path d="M407.175 118.062L417.92 94.2263C420.735 87.858 417.856 80.4087 411.488 77.5831C405.12 74.7682 397.67 77.6473 394.845 84.0156L383.831 108.461L407.175 118.062Z" fill="#8A6FE8"/>
<path d="M401.363 105.175L401.234 69.117C401.181 62.1493 395.498 56.541 388.53 56.5945C381.562 56.648 375.954 62.3313 376.007 69.2989L376.018 96.11L401.363 105.175Z" fill="#8A6FE8"/>
<path d="M386.453 109.071L378.137 73.9548C376.543 67.169 369.757 62.9628 362.971 64.5575C356.185 66.1523 351.979 72.938 353.574 79.7237L362.04 115.482L386.453 109.071Z" fill="#8A6FE8"/>
<path d="M381.776 142.261C396.359 142.261 408.181 130.44 408.181 115.857C408.181 101.274 396.359 89.4527 381.776 89.4527C367.194 89.4527 355.372 101.274 355.372 115.857C355.372 130.44 367.194 142.261 381.776 142.261Z" fill="url(#paint0_radial)"/>
<path d="M248.267 406.979C248.513 384.727 245.345 339.561 222.376 301.736L199.922 315.372C220.76 349.675 222.323 389.715 221.841 407.182C221.798 408.627 235.263 409.933 248.267 406.979Z" fill="url(#paint1_linear)"/>
<path d="M221.841 406.936L242.637 406.84L262.052 518.065L220.311 518.258C217.132 518.269 214.724 515.711 214.938 512.532L221.841 406.936Z" fill="#522CD5"/>
<path d="M306.566 488.814C310.173 491.661 310.109 495.782 309.831 500.127L308.964 513.452C308.803 515.839 306.727 517.798 304.34 517.809L260.832 518.012C258.125 518.023 256.08 515.839 256.262 513.142L256.551 499.335C256.883 494.315 255.192 492.474 251.307 487.744C244.649 479.663 224.967 435.62 226.84 406.925L248.256 406.829C249.691 423.858 272.167 461.682 306.566 488.814Z" fill="url(#paint2_linear)"/>
<path d="M309.82 500.127C310.023 497.088 310.077 494.176 308.889 491.715L254.635 491.961C256.134 494.166 256.765 496.092 256.562 499.314L256.273 513.121C256.091 515.828 258.146 518.012 260.843 517.99L304.34 517.798C306.727 517.787 308.803 515.828 308.964 513.442L309.82 500.127Z" fill="url(#paint3_radial)"/>
<path d="M133.552 407.471C133.103 385.22 135.864 340.021 158.49 301.993L181.073 315.425C160.545 349.921 159.346 389.972 159.989 407.428C160.042 408.884 146.578 410.318 133.552 407.471Z" fill="url(#paint4_linear)"/>
<path d="M110.798 497.152C110.765 494.187 111.204 491.575 112.457 487.23C131.882 434.132 133.52 407.364 133.52 407.364L159.999 407.246C159.999 407.246 161.819 433.512 181.716 486.427C183.289 490.195 183.471 493.641 183.674 496.831L183.792 513.816C183.803 516.374 181.716 518.483 179.158 518.494L177.873 518.504L116.781 518.782L115.496 518.793C112.927 518.804 110.83 516.728 110.819 514.159L110.798 497.152Z" fill="url(#paint5_linear)"/>
<path d="M110.798 497.152C110.798 496.67 110.808 496.199 110.83 495.739C110.969 494.262 111.643 492.603 114.875 492.582L180.207 492.282C182.561 492.367 183.343 494.176 183.589 495.311C183.621 495.814 183.664 496.328 183.696 496.82L183.813 513.806C183.824 515.411 183.011 516.824 181.769 517.669C181.031 518.172 180.132 518.472 179.179 518.483L177.895 518.494L116.802 518.772L115.528 518.782C114.244 518.793 113.077 518.269 112.232 517.434C111.386 516.599 110.862 515.432 110.851 514.148L110.798 497.152Z" fill="url(#paint6_radial)"/>
<path d="M314.979 246.348C324.162 210.407 318.008 181.777 318.008 181.777L326.452 181.734L326.656 181.574C314.262 115.75 256.326 66.0987 186.949 66.4198C108.796 66.773 45.7233 130.424 46.0765 208.577C46.4297 286.731 110.08 349.803 188.234 349.45C249.905 349.172 302.178 309.474 321.304 254.343C321.872 251.999 321.797 247.804 314.979 246.348Z" fill="url(#paint7_radial)"/>
<path d="M310.237 279.035L65.877 280.148C71.3998 289.428 77.95 298.012 85.3672 305.761L290.972 304.829C298.336 297.005 304.8 288.368 310.237 279.035Z" fill="#D8CFF7"/>
<path d="M235.062 312.794L280.924 312.585L280.74 272.021L234.877 272.23L235.062 312.794Z" fill="#512BD4"/>
<path d="M243.001 297.626C242.691 297.626 242.434 297.53 242.22 297.327C242.006 297.123 241.899 296.866 241.899 296.588C241.899 296.299 242.006 296.042 242.22 295.839C242.434 295.625 242.691 295.528 243.001 295.528C243.312 295.528 243.568 295.635 243.782 295.839C243.996 296.042 244.114 296.299 244.114 296.588C244.114 296.877 244.007 297.123 243.793 297.327C243.568 297.519 243.312 297.626 243.001 297.626Z" fill="white"/>
<path d="M255.192 297.434H253.212L247.967 289.203C247.839 289 247.721 288.775 247.636 288.55H247.593C247.636 288.786 247.657 289.299 247.657 290.091L247.668 297.444H245.912L245.891 286.228H247.999L253.062 294.265C253.276 294.597 253.415 294.833 253.479 294.95H253.511C253.458 294.651 253.437 294.148 253.437 293.441L253.426 286.217H255.17L255.192 297.434Z" fill="white"/>
<path d="M263.733 297.412L257.589 297.423L257.568 286.206L263.465 286.195V287.779L259.387 287.79L259.398 290.969L263.155 290.958V292.532L259.398 292.542L259.409 295.86L263.733 295.85V297.412Z" fill="white"/>
<path d="M272.445 287.758L269.298 287.769L269.32 297.401H267.5L267.479 287.769L264.343 287.779V286.195L272.434 286.174L272.445 287.758Z" fill="white"/>
<path d="M315.279 246.337C324.355 210.836 318.457 182.483 318.308 181.798L171.484 182.462C171.484 182.462 162.226 181.563 162.268 190.018C162.311 198.463 162.761 222.341 162.878 248.746C162.9 254.172 167.363 256.773 170.863 256.751C170.874 256.751 311.618 252.213 315.279 246.337Z" fill="url(#paint8_radial)"/>
<path d="M227.685 246.798C227.685 246.798 250.183 228.827 254.571 225.499C258.959 222.17 262.812 221.977 266.869 225.445C270.925 228.913 293.616 246.498 293.616 246.498L227.685 246.798Z" fill="#A08BE8"/>
<path d="M320.748 256.141C320.748 256.141 324.943 248.414 315.279 246.348C315.289 246.305 170.927 246.894 170.927 246.894C167.566 246.905 163.232 244.925 162.846 241.671C162.857 244.004 162.878 246.369 162.889 248.756C162.91 253.68 166.582 256.27 169.878 256.698C170.21 256.73 170.542 256.773 170.874 256.773L180.742 256.73L320.748 256.141Z" fill="#512BD4"/>
<path d="M206.4 233.214C212.511 233.095 217.302 224.667 217.102 214.39C216.901 204.112 211.785 195.878 205.674 195.997C199.563 196.116 194.772 204.544 194.973 214.821C195.173 225.099 200.289 233.333 206.4 233.214Z" fill="#512BD4"/>
<path d="M306.249 214.267C306.356 203.989 301.488 195.605 295.377 195.541C289.266 195.478 284.225 203.758 284.118 214.037C284.011 224.315 288.878 232.699 294.99 232.763C301.101 232.826 306.142 224.545 306.249 214.267Z" fill="#512BD4"/>
<path d="M205.905 205.291C208.152 203.022 211.192 202.016 214.157 202.262C215.912 205.495 217.014 209.733 217.111 214.389C217.164 217.3 216.811 220.04 216.158 222.513C212.669 223.519 208.752 222.662 205.979 219.922C201.912 215.909 201.88 209.348 205.905 205.291Z" fill="#8065E0"/>
<path d="M294.996 204.285C297.255 202.016 300.294 200.999 303.259 201.256C305.164 204.628 306.309 209.209 306.256 214.239C306.224 216.808 305.892 219.259 305.303 221.485C301.793 222.523 297.843 221.678 295.061 218.916C291.004 214.892 290.972 208.342 294.996 204.285Z" fill="#8065E0"/>
<path d="M11.6342 357.017C10.9171 354.716 -5.72611 300.141 21.3204 258.903C36.9468 235.078 63.3083 221.035 99.6664 217.15L102.449 243.276C74.3431 246.273 54.4676 256.345 43.3579 273.202C23.0971 303.941 36.5722 348.733 36.7113 349.183L11.6342 357.017Z" fill="url(#paint9_linear)"/>
<path d="M95.1498 252.802C109.502 252.802 121.137 241.167 121.137 226.815C121.137 212.463 109.502 200.828 95.1498 200.828C80.7976 200.828 69.1628 212.463 69.1628 226.815C69.1628 241.167 80.7976 252.802 95.1498 252.802Z" fill="url(#paint10_radial)"/>
<path d="M72.0098 334.434L33.4683 329.307C26.597 328.397 20.2929 333.214 19.3725 340.085C18.4627 346.956 23.279 353.26 30.1504 354.181L68.6919 359.308C75.5632 360.217 81.8673 355.401 82.7878 348.53C83.6975 341.658 78.8705 335.344 72.0098 334.434Z" fill="#8A6FE8"/>
<path d="M3.73535 367.185L7.35297 393.076C8.36975 399.968 14.7702 404.731 21.6629 403.725C28.5556 402.708 33.3185 396.308 32.3124 389.415L28.5984 362.861L3.73535 367.185Z" fill="#8A6FE8"/>
<path d="M15.5194 374.988L34.849 405.427C38.6058 411.292 46.4082 413.005 52.2735 409.248C58.1387 405.491 59.8512 397.689 56.0945 391.823L41.7953 369.144L15.5194 374.988Z" fill="#8A6FE8"/>
<path d="M26.0511 363.739L51.8026 389.019C56.7688 393.911 64.7532 393.846 69.6445 388.88C74.5358 383.914 74.4715 375.929 69.516 371.038L43.2937 345.297L26.0511 363.739Z" fill="#8A6FE8"/>
<path d="M26.4043 381.912C40.987 381.912 52.8086 370.091 52.8086 355.508C52.8086 340.925 40.987 329.104 26.4043 329.104C11.8216 329.104 0 340.925 0 355.508C0 370.091 11.8216 381.912 26.4043 381.912Z" fill="url(#paint11_radial)"/>
<path d="M184.73 63.6308L157.819 66.5892L158.561 38.5412L177.888 36.4178L184.73 63.6308Z" fill="#8A6FE8"/>
<path d="M170.018 41.647C180.455 39.521 187.193 29.3363 185.067 18.8988C182.941 8.46126 172.757 1.72345 162.319 3.84944C151.882 5.97543 145.144 16.1601 147.27 26.5976C149.396 37.0351 159.58 43.773 170.018 41.647Z" fill="#D8CFF7"/>
<path d="M196.885 79.385C198.102 79.2464 198.948 78.091 198.684 76.8997C195.851 64.2818 183.923 55.5375 170.773 56.9926C157.622 58.4371 147.886 69.5735 147.865 82.4995C147.863 83.7232 148.949 84.6597 150.168 84.5316L196.885 79.385Z" fill="url(#paint12_radial)"/>
<defs>
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(382.004 103.457) scale(26.4058)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<linearGradient id="paint1_linear" x1="214.439" y1="303.482" x2="236.702" y2="409.505" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="231.673" y1="404.144" x2="297.805" y2="522.048" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(280.957 469.555) rotate(-0.260742) scale(45.8326)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<linearGradient id="paint4_linear" x1="166.061" y1="303.491" x2="144.763" y2="409.709" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="146.739" y1="407.302" x2="147.246" y2="518.627" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(148.63 470.023) rotate(179.739) scale(50.2476)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<radialGradient id="paint7_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(219.219 153.929) rotate(179.739) scale(140.935)">
<stop offset="0.4744" stop-color="#A08BE8"/>
<stop offset="0.8618" stop-color="#8065E0"/>
</radialGradient>
<radialGradient id="paint8_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(314.861 158.738) rotate(179.739) scale(146.053)">
<stop offset="0.0933" stop-color="#E1DFDD"/>
<stop offset="0.6573" stop-color="white"/>
</radialGradient>
<linearGradient id="paint9_linear" x1="54.1846" y1="217.159" x2="54.1846" y2="357.022" gradientUnits="userSpaceOnUse">
<stop offset="0.3344" stop-color="#9780E6"/>
<stop offset="0.8488" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint10_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.3494 218.071) rotate(-0.260742) scale(25.9924)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint11_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.805 345.043) scale(26.4106)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint12_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(169.113 67.3662) rotate(-32.2025) scale(21.0773)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

@ -0,0 +1,15 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="Primary">#512BD4</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
<Color x:Key="Yellow100Accent">#F7B548</Color>
<Color x:Key="Yellow200Accent">#FFD590</Color>
<Color x:Key="Yellow300Accent">#FFE5B9</Color>
<Color x:Key="Cyan100Accent">#28C2D1</Color>
<Color x:Key="Cyan200Accent">#7BDDEF</Color>
<Color x:Key="Cyan300Accent">#C3F2F4</Color>
<Color x:Key="Blue100Accent">#3E8EED</Color>
<Color x:Key="Blue200Accent">#72ACF1</Color>
<Color x:Key="Blue300Accent">#A7CBF6</Color>
</ResourceDictionary>

@ -0,0 +1,405 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,10"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>

@ -0,0 +1,88 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<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> -->
<OutputType>Exe</OutputType>
<RootNamespace>Notus_Vue</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Display name -->
<ApplicationTitle>notus</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>com.companyname.notus</ApplicationId>
<ApplicationIdGuid>a687bb8a-5777-44d0-996e-4ed7d05f27b4</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
<!-- Images -->
<MauiImage Include="Resources\Images\*" />
<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
<ProjectReference Include="..\Notus_Persistence\Notus_Persistance.csproj" />
<ProjectReference Include="..\Tests\Notus_UnitTest_Database\Notus_UnitTest_Database.csproj" />
<ProjectReference Include="..\Tests\Notus_UnitTest_Note\Notus_UnitTest_Note.csproj" />
<ProjectReference Include="..\Tests\Notus_UnitTest_User\Notus_UnitTest_User.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="ConnecPage.xaml.cs">
<DependentUpon>ConnecPage.xaml</DependentUpon>
</Compile>
<Compile Update="InscrPage.xaml.cs">
<DependentUpon>InscrPage.xaml</DependentUpon>
</Compile>
<Compile Update="RecherPage.xaml.cs">
<DependentUpon>RecherPage.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<MauiXaml Update="ConnecPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="InscrPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="RecherPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>
</Project>

@ -0,0 +1,55 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "Notus_Console\Notus_Console.csproj", "{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Persistance", "Notus_Persistence\Notus_Persistance.csproj", "{184478A9-E14F-42E0-B963-B3A4474C9C1C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_UnitTest_Database", "Tests\Notus_UnitTest_Database\Notus_UnitTest_Database.csproj", "{EE443C17-B31D-4AD0-9141-920876E7DF79}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Notus_UnitTest_Note", "Tests\Notus_UnitTest_Note\Notus_UnitTest_Note.csproj", "{7B7F1062-9498-44E5-AC77-84BC90A3B730}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Notus_UnitTest_User", "Tests\Notus_UnitTest_User\Notus_UnitTest_User.csproj", "{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.Build.0 = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.Build.0 = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.Build.0 = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.Build.0 = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE443C17-B31D-4AD0-9141-920876E7DF79}.Release|Any CPU.Build.0 = Release|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B7F1062-9498-44E5-AC77-84BC90A3B730}.Release|Any CPU.Build.0 = Release|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save