Compare commits

..

91 Commits
jean ... master

Author SHA1 Message Date
Tony Fages ba5f3e8b9a Exclude test
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 1c0828e644 Exclude test
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 611b39bba7 Exclude test
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 46247dbe57 Exclude test
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages dfd4b23cf5 Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 9d2c1a7963 Merge branch 'master' of codefirst.iut.uca.fr:Verax/Blazor_SAE
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 849dd23da8 Add some Tests
1 year ago
Tony Fages 05cdfc4c6c Mise à jour de '.gitignore'
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 54fdb89520 Add some Tests
continuous-integration/drone/push Build is failing Details
1 year ago
Tony Fages 0d6511787e Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages 034deb078c Merge branch 'master' of codefirst.iut.uca.fr:Verax/Blazor_SAE
continuous-integration/drone/push Build is passing Details
1 year ago
Tony Fages f40fc50e75 Add some Tests
1 year ago
Tony Fages 40662b1340 Add some Tests
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE c55fd18aa2 Add CI for the project
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE ee38b16662 Add CI for the project
continuous-integration/drone/push Build encountered an error Details
1 year ago
Louis LABORIE d3dd10723b Try to deploy application 🔧🔧
continuous-integration/drone/push Build is passing Details
1 year ago
Louis LABORIE 0c6f568494 Try to deploy application 🔧🔧
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE c20b075a9e Try to deploy application 🔧🔧
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE 54649123b7 Try to deploy application 🔧🔧
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE 4db8b53d15 Try to deploy application 🔧🔧
continuous-integration/drone/push Build is failing Details
1 year ago
Louis LABORIE b7f6a53428 Try to deploy application 🔧🔧
continuous-integration/drone/push Build is failing Details
1 year ago
Siwa12100 82193d4f46 ajout du docker file
1 year ago
Tony Fages 7ec41bd809 Mise à jour de 'README.md'
1 year ago
Tony Fages ca3a694d04 Mise à jour de 'README.md'
1 year ago
Tony Fages 01a9e3c45d Transférer les fichiers vers 'img'
1 year ago
Tony Fages abf64a118b Mise à jour de 'README.md'
1 year ago
Tony Fages 8e91fb5d44 Mise à jour de 'README.md'
1 year ago
Tony Fages 2913fc54c3 Mise à jour de 'README.md'
1 year ago
Tony Fages 49dbc73ac1 Mise à jour de 'README.md'
1 year ago
Tony Fages 6038d39e40 Mise à jour de 'README.md'
1 year ago
Tony Fages a0579e24b1 Mise à jour de 'README.md'
1 year ago
Tony Fages 8e48b9af49 Mise à jour de 'README.md'
1 year ago
Tony Fages fe62b0c7fe Mise à jour de 'README.md'
1 year ago
Tony Fages e4bb180e88 Mise à jour de 'README.md'
1 year ago
Tony Fages a95416e168 Mise à jour de 'README.md'
1 year ago
Tony Fages 7bd238386f img pixel art
1 year ago
Tony Fages 9902fb2e34 Merge branch 'Tony'
1 year ago
Tony Fages da7b490c77 Hash
1 year ago
Tony Fages dbbb4033ba Mise à jour de 'README.md'
1 year ago
Tony Fages bf29b9c0ff Mise à jour de 'README.md'
1 year ago
Siwa12100 956c6299a7 mise au propre du code
1 year ago
Siwa12100 016e0e5194 ajout du service API
1 year ago
Tony Fages a572d7e517 Merge branch 'master' into Tony
1 year ago
Tony Fages 7948d0eecd Ajout Hash user localStorage
1 year ago
Siwa12100 d7d1e550ff correction et reaction de l'attribut de validation custom pour les pseudos
1 year ago
Tony Fages 025a8e1b0c Hash mdp
1 year ago
Tony Fages 350a17e5cf Merge branch 'master' into Tony
1 year ago
Tony Fages 0de9fee7f5 hash mdp
1 year ago
Siwa12100 8b4d5dee39 desactivation attribute custom
1 year ago
Tony Fages 3fd412c1eb Äjouter cache mdp Inscription + hash mdp Inscription
1 year ago
Tony Fages b367e07241 Ajout Visibilité mdp
1 year ago
Shana CASCARRA 6e8e9e4faf Image accueil
1 year ago
Shana CASCARRA a01e230f5f Probleme de la navBar dans index resolu
1 year ago
Shana CASCARRA b740616b5a Merge branch 'master' into vueNavBar
1 year ago
Siwa12100 cfbcc7558c fin du travail sur le formulaire d'ajout
1 year ago
Siwa12100 c06b573b4a travail sur la sécurisation des formulaires
1 year ago
Siwa12100 9b86d82819 travail sur la sécurisation des formulaires
1 year ago
Siwa12100 da9e64d5f0 Merge branch 'master' into travailFormulairesJean
1 year ago
Siwa12100 46866c3154 correction d'un bug sur la modification d'utilisateurs
1 year ago
Shana CASCARRA e5e6fc51fe oops
1 year ago
Shana CASCARRA 70c4d731f0 Fusion de master ici
1 year ago
Shana CASCARRA d63a631514 Ajout du layout dans les pages
1 year ago
Shana CASCARRA a754cc5b55 NavBar principale finie
1 year ago
Siwa12100 e88de6c2f4 correction d'un bug sur la modification d'utilisateurs
1 year ago
Siwa12100 bbdcc2715a fin du design du formulaire de modification
1 year ago
NoaSlld e6d1d0d82d update page index
1 year ago
Siwa12100 cd779622f0 travail sur le formulaire de modification
1 year ago
NoaSlld eb5e96ff39 uniformisation des boutons
1 year ago
Siwa12100 3b2cf13462 travail sur le formulaire de modification
1 year ago
Siwa12100 d7cf14078b travail sur le formulaire de modification
1 year ago
Siwa12100 eefcb7e18c travail sur le design
1 year ago
Siwa12100 2c29b4d6de mise au propre du formulaire
1 year ago
Siwa12100 347f6fceca Merge branch 'master' into authentificationJean
1 year ago
Siwa12100 cca3146dc1 travail sur l'authenfication
1 year ago
NoaSlld 585b91a7b6 vue liste utilisateurs finie
1 year ago
Siwa12100 7567409574 amelioration de authentification
1 year ago
Siwa12100 7db64c3384 maj
1 year ago
shcascarra e94d418636 bon je revise je ferai ce soir
1 year ago
NoaSlld 6773736997 page connecté/non connecté finie avec navbar temporaire
1 year ago
NoaSlld 3d43957fb4 page index finie
1 year ago
shcascarra bc607ef042 Création des fichiers pour le css
1 year ago
shcascarra 9ebacf1d1e les beaux boutons
1 year ago
Siwa12100 01d6c19051 maj
1 year ago
shcascarra a61ed5c0f4 Commencement de la nav
1 year ago
Siwa12100 f87e565581 travail sur l'authentification
1 year ago
Siwa12100 3b524fa29e premiere version de l'authentification fonctionnelle !
1 year ago
Siwa12100 9d2e07af6d mise au propre de la DataGrid
1 year ago
Siwa12100 f4b15139f5 reparation du repo...
1 year ago
Siwa12100 0de1a63ab9 reparation du repo...
1 year ago
Siwa12100 20a920db91 .vs enlevé
1 year ago
Siwa12100 2e0c524b00 merge jean
1 year ago

@ -0,0 +1,79 @@
kind: pipeline
type: docker
name: default
trigger:
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:8.0
commands:
- cd VeraxShield
- dotnet restore VeraxShield.sln
- dotnet build VeraxShield.sln -c Release --no-restore
- dotnet publish VeraxShield.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- name: tests
image: mcr.microsoft.com/dotnet/sdk:8.0
commands:
- cd VeraxShield
- dotnet restore VeraxShield.sln
- dotnet test VeraxShield.sln --no-restore
depends_on: [build]
- name: code-inspection
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8
secrets: [ SECRET_SONAR_LOGIN ]
environment:
sonar_host: https://codefirst.iut.uca.fr/sonar/
sonar_token:
from_secret: SECRET_SONAR_LOGIN # Secret de Drone
project_key: VeraxShield
commands:
- cd VeraxShield/
- dotnet restore VeraxShield.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="VeraxShield/wwwroot/**","VeraxShield/composants/**","VeraxShield/pages/**","VeraxShield/Properties/**","TestVeraxShield/**","VeraxShield/Program.cs","VeraxShield/services/UtilisateursDataService/UtilisateursDataServiceApi.cs","VeraxShield/services/UtilisateursDataService/UtilisateursDataServiceFactice.cs" /d:sonar.login=$${sonar_token}
- dotnet build VeraxShield.sln -c Release --no-restore
- dotnet test VeraxShield.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
- dotnet publish VeraxShield.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
when:
branch:
- master
event:
- push
- pull_request
depends_on: [build,tests]
- name: docker-build-and-push
image: plugins/docker
settings:
dockerfile: dockerfile
context: .
registry: hub.codefirst.iut.uca.fr
repo: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_blazor
username:
from_secret: SECRET_REGISTRY_USERNAME
password:
from_secret: SECRET_REGISTRY_PASSWORD
when:
branch:
- master
- rebase
- name: deploy-container
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest
environment:
IMAGENAME: hub.codefirst.iut.uca.fr/louis.laborie/sae_2a_blazor:latest
CONTAINERNAME: verax-blazor
COMMAND: create
OVERWRITE: true
CODEFIRST_CLIENTDRONE_ENV_ASPNETCORE_HTTP_PORTS: 80
ADMINS: louislaborie,tonyfages,noasillard,jeanmarcillac,shanacascarra
depends_on:
- docker-build-and-push

459
.gitignore vendored

@ -1,30 +1,429 @@
# ---> macOS # Created by https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudio,visualstudiocode
# General # Edit at https://www.toptal.com/developers/gitignore?templates=dotnetcore,visualstudio,visualstudiocode
.DS_Store
.AppleDouble ### DotnetCore ###
.LSOverride # .NET Core build folders
bin/
# Icon must end with two \r obj/
Icon
# Thumbnails
._* # Common node modules locations
/node_modules
# Files that might appear in the root of a volume /wwwroot/node_modules
.DocumentRevisions-V100
.fseventsd ### VisualStudioCode ###
.Spotlight-V100 .vscode/*
.TemporaryItems !.vscode/settings.json
.Trashes !.vscode/tasks.json
.VolumeIcon.icns !.vscode/launch.json
.com.apple.timemachine.donotpresent !.vscode/extensions.json
!.vscode/*.code-snippets
# Directories potentially created on remote AFP share
.AppleDB # Local History for Visual Studio Code
.AppleDesktop .history/
Network Trash Folder
Temporary Items # Built Visual Studio Code Extensions
.apdisk *.vsix
### VisualStudioCode Patch ###
.fake # Ignore all local history of files
.history
.ionide
### 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
# 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
*.code-workspace
# Local History for Visual Studio Code
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
### VisualStudio Patch ###
# Additional files built by Visual Studio
# End of https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudio,visualstudiocode

@ -1,2 +1,47 @@
# Blazor_SAE <h1 align="center">VeraxShield</h1>
<p align="center">
<img src="https://img.shields.io/badge/C%23-239120.svg?style=for-the-badge&logo=c-sharp&logoColor=white" alt="C#"/>
<img src="https://img.shields.io/badge/Blazor-512BD4.svg?style=for-the-badge&logo=blazor&logoColor=white" alt="Blazor"/>
<img src="https://img.shields.io/badge/.NET-512BD4.svg?style=for-the-badge&logo=.net&logoColor=white" alt=".NET"/>
<img src="https://img.shields.io/badge/HTML5-E34F26.svg?style=for-the-badge&logo=html5&logoColor=white" alt="HTML5"/>
<img src="https://img.shields.io/badge/CSS3-1572B6.svg?style=for-the-badge&logo=css3&logoColor=white" alt="CSS3"/>
</p>
## Description
VeraxShield est une application web avancée développée avec Blazor, représentant la partie administration de notre projet plus large, [Verax](https://codefirst.iut.uca.fr/git/Verax/Verax). Conçue pour offrir une interface de gestion intuitive, VeraxShield permet aux administrateurs de gérer efficacement les différents aspects du système Verax.
### Fonctionnalités Clés
- **Gestion des Utilisateurs** : Permet aux administrateurs de créer, modifier et supprimer des comptes utilisateurs. Inclut la gestion des rôles et des permissions pour un contrôle d'accès granulaire.
- **Notifications et Suivis des Actions** : Envoie des notifications sur les différentes actions des modérateurs afin pour assurer une meilleure gestion du système.
### Objectif du Projet
L'objectif principal de VeraxShield est de fournir une plateforme centralisée pour la gestion et le contrôle administratif du système Verax, en rationalisant les processus administratifs et en offrant une vue d'ensemble claire des opérations.
## Installation et Configuration
1. Clonez le dépôt : `git clone (https://codefirst.iut.uca.fr/git/Verax/Blazor_SAE.git)`
2. Ouvrez le fichier `VeraxShield.sln` avec Visual Studio.
3. Restaurez les packages nécessaires.
4. Lancez le projet depuis Visual Studio.
<h2 align="center">Equipe de Développement</h2>
<p align="center" >
<a href="https://codefirst.iut.uca.fr/git/louis.laborie" style="margin-right: 20px;">
<img src="img/Louis.png" width="50" height="50" title="Louis Laborie" alt="Louis Laborie"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/shana.cascarra" style="margin-right: 20px;">
<img src="img/Shana.png" width="50" height="50" title="Shana Cascarra" alt="Shana Cascarra"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/jean.marcillac" style="margin-right: 20px;">
<img src="img/Jean.png" width="50" height="50" title="Jean Marcillac" alt="Jean Marcillac"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/tony.fages" style="margin-right: 20px;">
<img src="img/Tony.png" width="50" height="50" title="Tony Fages" alt="Tony Fages"/>
</a>
<a href="https://codefirst.iut.uca.fr/git/noa.sillard" style="margin-right: 20px;">
<img src="img/Noa.png" width="50" height="50" title="Noa Sillard" alt="Noa Sillard"/>
</a>
<p>

@ -0,0 +1,15 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.VeraxShield.iml
/contentModel.xml
/modules.xml
/projectSettingsUpdater.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# GitHub Copilot persisted chat sessions
/copilot/chatSessions

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders>
<Path>../../Blazor_SAE</Path>
</attachedFolders>
<explicitIncludes />
<explicitExcludes />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,105 @@
using System.Security.Claims;
using Moq;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class AuthentificationServiceTests
{
private readonly AuthentificationService _authService;
private readonly Mock<IUtilisateursDataService> _mockDataService = new Mock<IUtilisateursDataService>();
public AuthentificationServiceTests()
{
_authService = new AuthentificationService(_mockDataService.Object);
}
[Fact]
public async Task Connexion_WithValidCredentials_ShouldSucceed()
{
// Arrange
var testUser = new Utilisateur("testUser", "Test", "User", "test@user.com", BCrypt.Net.BCrypt.HashPassword("password"), "User", false);
_mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur> { testUser });
var requete = new RequeteConnexion
{
Pseudo = "testUser",
MotDePasse = "password"
};
// Act & Assert
await _authService.Connexion(requete);
}
[Fact]
public async Task Connexion_WithInvalidCredentials_ShouldThrowException()
{
// Arrange
_mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur>());
var requete = new RequeteConnexion
{
Pseudo = "nonExistentUser",
MotDePasse = "wrongPassword"
};
// Act & Assert
await Assert.ThrowsAsync<Exception>(() => _authService.Connexion(requete));
}
[Fact]
public async Task Inscription_ShouldCreateNewUser()
{
// Arrange
var requete = new RequeteInscription
{
Pseudo = "newUser",
Nom = "New",
Prenom = "User",
Mail = "new@user.com",
MotDePasse = "newPassword"
};
// Setup the mock to verify that AjouterUtilisateur is called with a Utilisateur that matches the inscription details
_mockDataService.Setup(s => s.AjouterUtilisateur(It.IsAny<Utilisateur>()))
.Returns(Task.CompletedTask)
.Callback<Utilisateur>(u =>
{
Assert.Equal(requete.Pseudo, u.Pseudo);
Assert.True(BCrypt.Net.BCrypt.Verify(requete.MotDePasse, u.Mdp));
});
// Act
await _authService.Inscription(requete);
}
[Fact]
public async Task GetUtilisateur_ReturnsCorrectUser_WithClaims()
{
// Arrange
var expectedPseudo = "testUser";
var expectedRole = "User";
var testUser = new Utilisateur("testUser", "Test", "User", "test@user.com", BCrypt.Net.BCrypt.HashPassword("password"), "User", false);
var mockDataService = new Mock<IUtilisateursDataService>();
mockDataService.Setup(s => s.getAllUtilisateurs())
.ReturnsAsync(new List<Utilisateur> { testUser });
var authService = new AuthentificationService(mockDataService.Object);
// Act
var utilisateurCourant = await authService.GetUtilisateur(expectedPseudo);
utilisateurCourant.Claims.Add(ClaimTypes.Email, "test@user.com");
// Assert
Assert.NotNull(utilisateurCourant);
Assert.True(utilisateurCourant.EstAuthentifie);
Assert.Equal(expectedPseudo, utilisateurCourant.Pseudo);
}
}

@ -0,0 +1,85 @@
using Moq;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
using Xunit;
namespace VeraxShield.UnitTests
{
public class DonneurEtatTests
{
private readonly DonneurEtat _donneurEtat;
private readonly Mock<IAuthentificationService> _mockAuthService;
private readonly Mock<IUtilisateursDataService> _mockUserDataService;
public DonneurEtatTests()
{
_mockAuthService = new Mock<IAuthentificationService>();
_mockUserDataService = new Mock<IUtilisateursDataService>();
_donneurEtat = new DonneurEtat(_mockAuthService.Object, _mockUserDataService.Object);
}
[Fact]
public async Task Connexion_ValidCredentials_SetsCurrentUser()
{
// Arrange
var requeteConnexion = new RequeteConnexion { Pseudo = "testUser", MotDePasse = "testPass" };
var utilisateurCourant = new UtilisateurCourant
{
Pseudo = "testUser",
EstAuthentifie = true,
Claims = new Dictionary<string, string> { { ClaimTypes.Role, "User" } }
};
_mockAuthService.Setup(x => x.GetUtilisateur(requeteConnexion.Pseudo)).ReturnsAsync(utilisateurCourant);
_mockAuthService.Setup(x => x.Connexion(requeteConnexion)).Returns(Task.CompletedTask);
// Act
await _donneurEtat.Connexion(requeteConnexion);
// Assert
Assert.NotNull(_donneurEtat._utilisateurCourant);
Assert.True(_donneurEtat._utilisateurCourant.EstAuthentifie);
_mockAuthService.Verify(x => x.Connexion(requeteConnexion), Times.Once);
_mockAuthService.Verify(x => x.GetUtilisateur(requeteConnexion.Pseudo), Times.Once);
}
[Fact]
public async Task Deconnexion_ClearsCurrentUser()
{
// Arrange - assume user is logged in
_donneurEtat._utilisateurCourant = new UtilisateurCourant { EstAuthentifie = true };
// Act
await _donneurEtat.Deconnexion();
// Assert
Assert.Null(_donneurEtat._utilisateurCourant);
}
[Fact]
public async Task Inscription_ValidData_RegistersUser()
{
// Arrange
var requeteInscription = new RequeteInscription
{
Pseudo = "newUser",
MotDePasse = "newPass",
Mail = "newUser@test.com",
Nom = "New",
Prenom = "User"
};
_mockAuthService.Setup(x => x.Inscription(requeteInscription)).Returns(Task.CompletedTask);
// Act
await _donneurEtat.Inscription(requeteInscription);
// Assert - Since Inscription does not automatically log in the user, we check if the method was called.
_mockAuthService.Verify(x => x.Inscription(requeteInscription), Times.Once);
}
}
}

@ -0,0 +1,45 @@
using Moq;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class IAuthentificationServiceTests
{
private readonly Mock<IUtilisateursDataService> _mockDataService;
private readonly AuthentificationService _authService;
public IAuthentificationServiceTests()
{
_mockDataService = new Mock<IUtilisateursDataService>();
_authService = new AuthentificationService(_mockDataService.Object);
}
[Fact]
public async Task GetUtilisateur_ValidUser_ReturnsUser()
{
// Arrange
var expectedUser = new UtilisateurCourant { Pseudo = "user1", EstAuthentifie = true };
_mockDataService.Setup(x => x.getAllUtilisateurs()).ReturnsAsync(new List<Utilisateur>
{
new Utilisateur("user1", "Name", "Surname", "user1@example.com", "password", "User", false)
});
// Act
var result = await _authService.GetUtilisateur("user1");
// Assert
Assert.Equal(expectedUser.Pseudo, result.Pseudo);
Assert.True(result.EstAuthentifie);
}
[Fact]
public async Task GetUtilisateur_NonExistentUser_ThrowsException()
{
// Arrange
_mockDataService.Setup(x => x.getAllUtilisateurs()).ReturnsAsync(new List<Utilisateur>());
// Act & Assert
await Assert.ThrowsAsync<Exception>(() => _authService.GetUtilisateur("user2"));
}
}

@ -0,0 +1,25 @@
using Moq;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class IUtilisateursDataServiceTests
{
private readonly Mock<IUtilisateursDataService> _service = new Mock<IUtilisateursDataService>();
[Fact]
public async Task AjouterUtilisateur_AddsUserSuccessfully()
{
// Arrange
var user = new Utilisateur("testUser", "User", "Test", "dez", "password", "User", false);
_service.Setup(s => s.AjouterUtilisateur(It.IsAny<Utilisateur>()))
.Returns(Task.CompletedTask)
.Callback<Utilisateur>(u => Assert.Equal("testUser", u.Pseudo));
// Act
await _service.Object.AjouterUtilisateur(user);
// Assert is handled by the Callback
}
}

@ -0,0 +1,47 @@
namespace TestVeraxShield;
public class ModeleAppUtilisateurTests
{
[Fact]
public void Constructeur_DoitInitialiserProprietes()
{
// Arrange & Act
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
// Assert
Assert.Equal("pseudoTest", utilisateur.Pseudo);
Assert.Equal("NomTest", utilisateur.Nom);
Assert.Equal("PrenomTest", utilisateur.Prenom);
Assert.Equal("email@test.com", utilisateur.Mail);
Assert.Equal("motdepasse", utilisateur.MotDePasse);
Assert.Contains("RoleTest", utilisateur.Roles);
}
[Fact]
public void AjouterRole_DoItAjouterNouveauRole()
{
// Arrange
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
// Act
utilisateur.ajouterRole("NouveauRole");
// Assert
Assert.Contains("NouveauRole", utilisateur.Roles);
}
[Fact]
public void SupprimerRole_DoItSupprimerRoleExistant()
{
// Arrange
var utilisateur = new ModeleAppUtilisateur("pseudoTest", "NomTest", "PrenomTest", "email@test.com", "motdepasse", "RoleTest");
utilisateur.ajouterRole("NouveauRole");
// Act
utilisateur.supprimerRole("RoleTest");
// Assert
Assert.DoesNotContain("RoleTest", utilisateur.Roles);
}
}

@ -0,0 +1,57 @@
namespace TestVeraxShield;
public class ModeleCurrentUserTests
{
[Fact]
public void InitializesCorrectly()
{
var utilisateur = new UtilisateurCourant();
Assert.Null(utilisateur.Claims);
Assert.False(utilisateur.EstAuthentifie);
Assert.Null(utilisateur.Pseudo);
}
[Fact]
public void AddsAndUpdatesClaimsCorrectly()
{
var utilisateur = new UtilisateurCourant { Claims = new Dictionary<string, string>() };
utilisateur.Claims.Add("role", "user");
Assert.Equal("user", utilisateur.Claims["role"]);
utilisateur.Claims["role"] = "admin";
Assert.Equal("admin", utilisateur.Claims["role"]);
}
[Fact]
public void RemovesClaimsCorrectly()
{
var utilisateur = new UtilisateurCourant { Claims = new Dictionary<string, string>() };
utilisateur.Claims.Add("role", "user");
utilisateur.Claims.Remove("role");
Assert.False(utilisateur.Claims.ContainsKey("role"));
}
[Fact]
public void TogglesAuthenticationState()
{
var utilisateur = new UtilisateurCourant();
utilisateur.EstAuthentifie = true;
Assert.True(utilisateur.EstAuthentifie);
utilisateur.EstAuthentifie = false;
Assert.False(utilisateur.EstAuthentifie);
}
[Fact]
public void UpdatesPseudoCorrectly()
{
var utilisateur = new UtilisateurCourant();
utilisateur.Pseudo = "TestUser";
Assert.Equal("TestUser", utilisateur.Pseudo);
}
}

@ -0,0 +1,66 @@
using VeraxShield.modele.utilisateurs;
namespace TestVeraxShield;
public class ModeleUtilisateurTests
{
[Fact]
public void ConstructorAssignsPropertiesCorrectly()
{
// Arrange
string expectedPseudo = "TestPseudo";
string expectedNom = "TestNom";
string expectedPrenom = "TestPrenom";
string expectedRole = "TestRole";
string expectedMdp = "TestMdp";
string expectedMail = "test@mail.com";
bool expectedIsBan = true;
// Act
Utilisateur utilisateur = new Utilisateur(expectedPseudo, expectedNom, expectedPrenom, expectedRole, expectedMdp, expectedMail, expectedIsBan);
// Assert
Assert.Equal(expectedPseudo, utilisateur.Pseudo);
Assert.Equal(expectedNom, utilisateur.Nom);
Assert.Equal(expectedPrenom, utilisateur.Prenom);
Assert.Equal(expectedRole, utilisateur.Role);
Assert.Equal(expectedMdp, utilisateur.Mdp);
Assert.Equal(expectedMail, utilisateur.Mail);
Assert.Equal(expectedIsBan, utilisateur.IsBan);
}
[Theory]
[InlineData("NewPseudo", "NewNom", "NewPrenom", "NewRole", "NewMdp", "new@mail.com", false)]
[InlineData("AnotherPseudo", "AnotherNom", "AnotherPrenom", "AnotherRole", "AnotherMdp", "another@mail.com", true)]
public void PropertiesUpdateCorrectly(string pseudo, string nom, string prenom, string role, string mdp, string mail, bool isBan)
{
// Arrange
Utilisateur utilisateur = new Utilisateur(pseudo, nom, prenom, role, mdp, mail, isBan);
// Act - changing values to test setter
string updatedPseudo = pseudo + "Update";
string updatedNom = nom + "Update";
string updatedPrenom = prenom + "Update";
string updatedRole = role + "Update";
string updatedMdp = mdp + "Update";
string updatedMail = "updated@" + mail;
bool updatedIsBan = !isBan;
utilisateur.Pseudo = updatedPseudo;
utilisateur.Nom = updatedNom;
utilisateur.Prenom = updatedPrenom;
utilisateur.Role = updatedRole;
utilisateur.Mdp = updatedMdp;
utilisateur.Mail = updatedMail;
utilisateur.IsBan = updatedIsBan;
// Assert
Assert.Equal(updatedPseudo, utilisateur.Pseudo);
Assert.Equal(updatedNom, utilisateur.Nom);
Assert.Equal(updatedPrenom, utilisateur.Prenom);
Assert.Equal(updatedRole, utilisateur.Role);
Assert.Equal(updatedMdp, utilisateur.Mdp);
Assert.Equal(updatedMail, utilisateur.Mail);
Assert.Equal(updatedIsBan, utilisateur.IsBan);
}
}

@ -0,0 +1,47 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="bunit.web" Version="1.27.17" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0"/>
<PackageReference Include="Moq" Version="4.20.70" />
<PackageReference Include="RichardSzalay.MockHttp" Version="7.0.0" />
<PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VeraxShield\VeraxShield.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="factoriesTests\**" />
<Compile Remove="ModeleTests\**" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="factoriesTests\**" />
<EmbeddedResource Remove="ModeleTests\**" />
</ItemGroup>
<ItemGroup>
<None Remove="factoriesTests\**" />
<None Remove="ModeleTests\**" />
</ItemGroup>
</Project>

@ -0,0 +1,56 @@
using Microsoft.AspNetCore.Components;
using Moq;
using Newtonsoft.Json;
using RichardSzalay.MockHttp;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace TestVeraxShield;
public class UtilisateursDataServiceApiTests
{
private readonly MockHttpMessageHandler _mockHttp;
private readonly HttpClient _clientHttp;
private readonly Mock<NavigationManager> _mockNavigationManager;
private readonly UtilisateursDataServiceApi _service;
public UtilisateursDataServiceApiTests()
{
_mockHttp = new MockHttpMessageHandler();
// Mock the response for the API call
_mockHttp.When("https://Verax.com/api/utilisateurs/recuperer")
.Respond("application/json", JsonConvert.SerializeObject(new List<Utilisateur>
{
new Utilisateur("testUser", "User", "Test", "dez", "password", "User", false)
}));
_clientHttp = _mockHttp.ToHttpClient();
_clientHttp.BaseAddress = new System.Uri("https://Verax.com");
_mockNavigationManager = new Mock<NavigationManager>();
_service = new UtilisateursDataServiceApi(_clientHttp, _mockNavigationManager.Object);
}
[Fact]
public async Task GetAllUtilisateurs_ReturnsUsers()
{
// Act
var users = await _service.getAllUtilisateurs();
// Assert
Assert.Single(users);
Assert.Equal("testUser", users[0].Pseudo);
}
[Fact]
public async Task GetUtilisateurFromPseudo_ReturnsUser()
{
// Act
var user = await _service.getUtilisateurFromPseudo("testUser");
// Assert
Assert.Equal("testUser", user.Pseudo);
}
}

@ -0,0 +1,56 @@
namespace TestVeraxShield.factoriesTests;
using Xunit;
using VeraxShield.factories;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs;
public class UtilisateursFactoryTests
{
[Fact]
public void ConvertsToUtilisateur_WithNewPasswordHashing()
{
// Arrange
var modele = new FormulaireAjoutModele { Mdp = "newPassword", /* other properties */ };
// Act
var utilisateur = UtilisateursFactory.toUtilisateur(modele);
// Assert
Assert.NotEqual("newPassword", utilisateur.Mdp);
}
[Fact]
public void ConvertsToModele_FromUtilisateur()
{
// Arrange
var utilisateur = new Utilisateur("pseudo", "nom", "prenom", "role", "mdp", "mail", false);
// Act
var modele = UtilisateursFactory.toModele(utilisateur);
// Assert
}
[Fact]
public void ConvertsToModele_FromUtilisateurs()
{
// Arrange
var utilisateur = new Utilisateur("pseudo", "nom", "prenom", "role", "mdp", "mail", false);
// Act
var modele = UtilisateursFactory.toModele(utilisateur);
// Assert
Assert.Equal(utilisateur.Pseudo, modele.Pseudo);
Assert.Equal(utilisateur.Nom, modele.Nom);
Assert.Equal(utilisateur.Prenom, modele.Prenom);
Assert.Equal(utilisateur.Role, modele.Role);
Assert.Equal(utilisateur.Mail, modele.Mail);
Assert.Equal(utilisateur.IsBan, modele.IsBan);
}
}

@ -5,6 +5,8 @@ VisualStudioVersion = 17.8.34322.80
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VeraxShield", "VeraxShield\VeraxShield.csproj", "{40D16910-ADA7-496E-BA48-AA9D6FF1E502}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VeraxShield", "VeraxShield\VeraxShield.csproj", "{40D16910-ADA7-496E-BA48-AA9D6FF1E502}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestVeraxShield", "TestVeraxShield\TestVeraxShield.csproj", "{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -15,6 +17,10 @@ Global
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Debug|Any CPU.Build.0 = Debug|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.ActiveCfg = Release|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.Build.0 = Release|Any CPU {40D16910-ADA7-496E-BA48-AA9D6FF1E502}.Release|Any CPU.Build.0 = Release|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7924C3CD-C50B-41D1-8A93-C4E0AF0F1B3C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

@ -1,12 +1,14 @@
<Router AppAssembly="@typeof(App).Assembly"> <Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData"> <Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found> </Found>
<NotFound> <NotFound>
<PageTitle>Not found</PageTitle> <CascadingAuthenticationState>
<LayoutView Layout="@typeof(MainLayout)"> <VeraxShield.pages.erreurs.ErreurParDefaut/>
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView> </CascadingAuthenticationState>
</NotFound> </NotFound>
</Router> </Router>

@ -1,5 +0,0 @@
@page "/"
<h1>VeraxShield</h1>
<NavLink href="/utilisateurs/liste"> --> Liste des utilisateurs</NavLink>

@ -1,3 +0,0 @@
@using VeraxShield.composants
@using VeraxShield.composants.modals
@using VeraxShield.composants.formulaires

@ -1,11 +0,0 @@
@using VeraxShield.composants.formulaires
@page "/utilisateurs/ajouter"
<h1>Ajouter un utilisateur</h1>
<FormulaireAjout/>

@ -1,85 +0,0 @@
@using VeraxShield.modele.utilisateurs;
@page "/utilisateurs/liste"
<h1>Utilisateurs de Verax</h1>
<DataGrid TItem="Utilisateur"
Data="@Utilisateurs"
@bind-SelectedRow="@utilisateurSelectionne"
Responsive
ShowPager
ShowPageSizes
PagerPosition="DataGridPagerPosition.TopAndBottom"
PagerOptions="new(){ ButtonSize=Size.Small }"
OnUtilisateurSupprime="HandleUtilisateurSupprime">
<DataGridColumns>
<DataGridCommandColumn />
<DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Pseudo" Sortable="false" />
<DataGridColumn Field="@nameof(Utilisateur.Prenom)" Caption="Prenom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Nom)" Caption="Nom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.IsBan)" Caption="Banissement" Editable />
</DataGridColumns>
<PageButtonTemplate>
<Span TextColor="TextColor.Success">
@context.PageNumber
</Span>
</PageButtonTemplate>
<NextPageButtonTemplate><Icon Name="IconName.StepForward" TextColor="TextColor.Success" /></NextPageButtonTemplate>
<PreviousPageButtonTemplate><Icon Name="IconName.StepBackward" TextColor="TextColor.Success" /></PreviousPageButtonTemplate>
<LastPageButtonTemplate><Icon Name="IconName.Forward" TextColor="TextColor.Success" /></LastPageButtonTemplate>
<FirstPageButtonTemplate><Icon Name="IconName.Backward" TextColor="TextColor.Success" /></FirstPageButtonTemplate>
<TotalItemsTemplate><Badge Color="Color.Success">@context.TotalItems total items</Badge></TotalItemsTemplate>
<TotalItemsShortTemplate><Badge Color="Color.Success">@context.TotalItems</Badge></TotalItemsShortTemplate>
<ItemsPerPageTemplate></ItemsPerPageTemplate>
<PageSelectorTemplate>
<Select TextColor="TextColor.Success" @bind-SelectedValue="@context.CurrentPage" Size="Size.Small">
@for (int i = context.FirstVisiblePage; i <= context.LastVisiblePage; ++i)
{
var pageNumber = i;
<SelectItem Value="@pageNumber">@pageNumber</SelectItem>
}
</Select>
</PageSelectorTemplate>
<PageSizesTemplate>
<Select TextColor="TextColor.Success" @bind-SelectedValue="@context.CurrentPageSize" Size="Size.Small">
@foreach (var curPageSize in context.PageSizes)
{
<SelectItem Value="@curPageSize">@curPageSize</SelectItem>
}
</Select>
</PageSizesTemplate>
</DataGrid>
<div>
<NavLink class="btn btn-primary" href="/utilisateurs/ajouter" Match="NavLinkMatch.All">
<i class="fa fa-plus"></i> Ajouter
</NavLink>
</div>
<div>
<Button Color="Color.Primary" Clicked="@modifierUtilisateur">Modifier</Button>
</div>
<div>
<Button Color="Color.Primary" Clicked="@afficherModal">Supprimer</Button>
</div>
<div>
<ModalSuppressionUtilisateur
@ref ="Modal"
utilisateur="@utilisateurSelectionne"
modalFerme="fermetureModal"/>
</div>

@ -1,68 +0,0 @@
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.modals;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.pages.utilisateurs
{
public partial class ListeUtilisateurs
{
[Inject]
private IUtilisateursDataService utilisateursDataService { get; set; }
public List<Utilisateur> Utilisateurs { get; set; }
[Inject]
private NavigationManager NavigationManager { get; set; }
private Utilisateur? utilisateurSelectionne;
[Parameter]
public ModalSuppressionUtilisateur Modal {get; set;}
protected override async Task OnInitializedAsync()
{
//await this.utilisateursDataService.resetDataUtilisateurs();
this.utilisateurSelectionne = null;
this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
await base.OnInitializedAsync();
}
private async Task HandleUtilisateurSupprime()
{
this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
StateHasChanged(); // Actualiser la vue
}
public async Task fermetureModal(bool val) {
if (val) {
await this.supprimerUtilisateur(this.utilisateurSelectionne);
}
}
public async Task supprimerUtilisateur(Utilisateur u)
{
await this.utilisateursDataService.SupprimerUtilisateur(u);
this.Utilisateurs = await this.utilisateursDataService.getAllUtilisateurs();
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
public async Task afficherModal()
{
if (this.Modal != null) {
await this.Modal.afficher();
}
}
public void modifierUtilisateur()
{
if (this.utilisateurSelectionne != null)
{
this.NavigationManager.NavigateTo("/utilisateurs/modifier/" + utilisateurSelectionne.Pseudo);
}
}
}
}

@ -1,6 +0,0 @@
@page "/utilisateurs/modifier/{pseudo}"
<h1> Modifier l'utilisateur </h1>
<FormulaireModification Utilisateur="@Utilisateur" />

@ -5,6 +5,7 @@ using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome; using Blazorise.Icons.FontAwesome;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using VeraxShield.services.UtilisateursDataService; using VeraxShield.services.UtilisateursDataService;
@ -12,17 +13,17 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages(); builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
// Ajout du client http par défaut :
builder.Services.AddHttpClient(); builder.Services.AddHttpClient();
// Ajout du service de gestion des utilisateurs : // Service factice :
// On le met scoped, car c'est comme ça qu'est le service du localStorage alors sinon ça marche pas...
builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceFactice>(); builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceFactice>();
// Ajout du service pour le Blazored LocalStorage : // Utilisation de l'api :
//builder.Services.AddScoped<IUtilisateursDataService, UtilisateursDataServiceApi>();
builder.Services.AddBlazoredLocalStorage(); builder.Services.AddBlazoredLocalStorage();
// Ajout de Blazorise :
builder.Services builder.Services
.AddBlazorise(options => .AddBlazorise(options =>
{ {
@ -31,6 +32,11 @@ builder.Services
.AddBootstrapProviders() .AddBootstrapProviders()
.AddFontAwesomeIcons(); .AddFontAwesomeIcons();
builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<DonneurEtat>();
builder.Services.AddScoped<AuthenticationStateProvider>(s => s.GetRequiredService<DonneurEtat>());
builder.Services.AddScoped<IAuthentificationService, AuthentificationService>();
var app = builder.Build(); var app = builder.Build();

@ -1,28 +1,22 @@
{ {
"iisSettings": {
"iisExpress": {
"applicationUrl": "http://localhost:38362",
"sslPort": 44368
}
},
"profiles": { "profiles": {
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "http://localhost:5272",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5272"
}, },
"https": { "https": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"applicationUrl": "https://localhost:7112;http://localhost:5272",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"dotnetRunMessages": true,
"applicationUrl": "https://localhost:7112;http://localhost:5272"
}, },
"IIS Express": { "IIS Express": {
"commandName": "IISExpress", "commandName": "IISExpress",
@ -30,6 +24,24 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"WSL": {
"commandName": "WSL2",
"launchBrowser": true,
"launchUrl": "https://localhost:7112",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "https://localhost:7112;http://localhost:5272"
},
"distributionName": ""
}
},
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38362",
"sslPort": 44368
} }
} }
} }

@ -11,11 +11,12 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Blazored.LocalStorage" Version="4.4.0" /> <PackageReference Include="Blazored.LocalStorage" Version="4.4.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.4.0" /> <PackageReference Include="Blazorise.Bootstrap" Version="1.4.1" />
<PackageReference Include="Blazorise.Components" Version="1.4.0" /> <PackageReference Include="Blazorise.Components" Version="1.4.0" />
<PackageReference Include="Blazorise.DataGrid" Version="1.4.0" /> <PackageReference Include="Blazorise.DataGrid" Version="1.4.1" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.0" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>https</ActiveDebugProfile>
</PropertyGroup>
</Project>

@ -6,4 +6,6 @@
@using Blazored.LocalStorage @using Blazored.LocalStorage
@using Blazorise @using Blazorise
@using Blazorise.DataGrid @using Blazorise.DataGrid
@using Microsoft.AspNetCore.Components.Authorization

@ -1,19 +0,0 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "7.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

File diff suppressed because one or more lines are too long

@ -1,9 +0,0 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

@ -0,0 +1,33 @@
@inherits LayoutComponentBase
<head>
<link rel="stylesheet" href="css/composants/navBar/NavBarPrincipale.css" />
</head>
<Bar Breakpoint="Breakpoint.Desktop" class="bar-container">
<BarBrand>
<img class="logo" src="/ressources/images/logo/logo.png" Text="Logo de Verax" Fluid @onclick="@NavAccueil"/>
</BarBrand>
<BarToggler />
<BarMenu class="bar-menu">
<BarItem>
<BarLink class="bar-link" @onclick="@NavUtilisateurs">Utilisateurs</BarLink>
</BarItem>
<BarItem>
<BarLink class="bar-link" @onclick="@NavArticles">Articles</BarLink>
</BarItem>
<BarItem>
<BarLink class="bar-link" @onclick="@NavModerateurs">Modérateurs</BarLink>
</BarItem>
</BarMenu>
<BarEnd>
<BarItem class="bar-role">
@DonneurEtat.getUtilisateurCourant().Pseudo
</BarItem>
<BarItem>
<Button Color="Color.Primary" @onclick="@Deconnecter">Deconnexion</Button>
</BarItem>
</BarEnd>
</Bar>
@Body

@ -0,0 +1,39 @@
using Microsoft.AspNetCore.Components;
namespace VeraxShield.composants.affichages.navBar
{
public partial class NavBarPrincipale
{
[Inject]
private DonneurEtat DonneurEtat { get; set; }
[Inject]
private NavigationManager NavigationManager { get; set; }
private async Task NavUtilisateurs()
{
NavigationManager.NavigateTo("/utilisateurs/liste");
}
private async Task NavArticles()
{
NavigationManager.NavigateTo("/articles/liste");
}
private async Task NavModerateurs()
{
NavigationManager.NavigateTo("/moderateurs/liste");
}
private async Task Deconnecter()
{
await DonneurEtat.Deconnexion();
NavigationManager.NavigateTo("/connexion");
}
private async Task NavAccueil()
{
NavigationManager.NavigateTo("/");
}
}
}

@ -0,0 +1,102 @@
@using VeraxShield.modele.utilisateurs;
@using Microsoft.AspNetCore.Components;
@using VeraxShield.composants.modals;
@using VeraxShield.composants.affichages.navBar;
@layout NavBarPrincipale
<head>
<link rel="stylesheet" href="css/composants/affichages/utilisateurs/datagridUtilisateurs.css">
</head>
<DataGrid TItem="Utilisateur"
Data="@Utilisateurs"
@bind-SelectedRow="@UtilisateurSelectionne"
Responsive
ShowPager
ShowPageSizes
PagerPosition="DataGridPagerPosition.TopAndBottom"
PagerOptions="new(){ ButtonSize=Size.Small }"
OnUtilisateurSupprime="HandleUtilisateurSupprime">
<DataGridColumns>
<DataGridCommandColumn />
<DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Pseudo" Sortable="false" />
<DataGridColumn Field="@nameof(Utilisateur.Prenom)" Caption="Prenom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Nom)" Caption="Nom" Editable />
<DataGridColumn Field="@nameof(Utilisateur.IsBan)" Caption="Banissement" Editable >
<DisplayTemplate>
@if (context.IsBan)
{
<Badge Color="Color.Danger" Pill>Ban</Badge>
} else
{
<Badge Color="Color.Success" Pill>Valide</Badge>
}
</DisplayTemplate>
</DataGridColumn>
<DataGridColumn Field="@nameof(Utilisateur.Role)" Caption="role" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Mail)" Caption="mail" Editable />
<DataGridColumn Field="@nameof(Utilisateur.Pseudo)" Caption="Gerer">
<DisplayTemplate>
<button type="button" class="btn btn-primary editButton" @onclick="() => onClickBoutonSuppression(context.Pseudo)"><i class="fa fa-trash"></i> </button>
<button type="button" class="btn btn-primary editButton" @onclick="() => onClickBoutonModification(context.Pseudo)"><i class="fa fa-edit"></i> </button>
</DisplayTemplate>
</DataGridColumn>
</DataGridColumns>
<PageButtonTemplate>
<Span class="darkBlue">
@context.PageNumber
</Span>
</PageButtonTemplate>
<NextPageButtonTemplate><Icon Name="IconName.StepForward" class="darkBlue" /></NextPageButtonTemplate>
<PreviousPageButtonTemplate><Icon Name="IconName.StepBackward" class="darkBlue" /></PreviousPageButtonTemplate>
<LastPageButtonTemplate><Icon Name="IconName.Forward" class="darkBlue" /></LastPageButtonTemplate>
<FirstPageButtonTemplate><Icon Name="IconName.Backward" class="darkBlue" /></FirstPageButtonTemplate>
<TotalItemsTemplate><Badge class="darkBlue">@context.TotalItems utilisateurs</Badge></TotalItemsTemplate>
<TotalItemsShortTemplate><Badge class="darkBlue">@context.TotalItems</Badge></TotalItemsShortTemplate>
<ButtonRowTemplate>
<Button Class="editButton biggest" Clicked="boutonclick">+</Button>
</ButtonRowTemplate>
<ItemsPerPageTemplate></ItemsPerPageTemplate>
<PageSelectorTemplate>
<Select TextColor="TextColor.Success" @bind-SelectedValue="@context.CurrentPage" Size="Size.Small">
@for (int i = context.FirstVisiblePage; i <= context.LastVisiblePage; ++i)
{
var pageNumber = i;
<SelectItem Value="@pageNumber">@pageNumber</SelectItem>
}
</Select>
</PageSelectorTemplate>
<PageSizesTemplate>
<Select class="darkBlue" @bind-SelectedValue="@context.CurrentPageSize" Size="Size.Small">
@foreach (var curPageSize in context.PageSizes)
{
<SelectItem Value="@curPageSize">@curPageSize</SelectItem>
}
</Select>
</PageSizesTemplate>
</DataGrid>
<div>
<ModalSuppressionUtilisateur
utilisateur="@UtilisateurSelectionne"
@ref="Modal"
modalFerme="fermetureModal" />
</div>

@ -0,0 +1,92 @@
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.factories;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
using VeraxShield.composants.modals;
namespace VeraxShield.composants.affichages.utilisateurs
{
public partial class DatagridUtilisateurs
{
[Inject]
private IUtilisateursDataService UtilisateursDataService { get; set; }
public static List<Utilisateur> Utilisateurs { get; set; }
[Inject]
private NavigationManager NavigationManager { get; set; }
[Inject]
private DonneurEtat DonneurEtat {get; set;}
public static Utilisateur? UtilisateurSelectionne { get; set; }
[Parameter]
public ModalSuppressionUtilisateur Modal {get; set;}
protected override async Task OnInitializedAsync()
{
DatagridUtilisateurs.UtilisateurSelectionne = null;
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
await base.OnInitializedAsync();
}
private async Task HandleUtilisateurSupprime()
{
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
StateHasChanged();
}
public async Task fermetureModal(bool suppressionConfirmee) {
if (suppressionConfirmee) {
await this.supprimerUtilisateur(DatagridUtilisateurs.UtilisateurSelectionne);
}
}
public async Task supprimerUtilisateur(Utilisateur u)
{
await this.UtilisateursDataService.SupprimerUtilisateur(u);
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
public async Task afficherModal()
{
if (this.Modal != null) {
await this.Modal.afficher();
}
}
public void modifierUtilisateur()
{
if (DatagridUtilisateurs.UtilisateurSelectionne != null)
{
this.NavigationManager.NavigateTo("/utilisateurs/modifier/" + DatagridUtilisateurs.UtilisateurSelectionne.Pseudo);
}
}
public async Task onClickBoutonSuppression(String pseudo)
{
DatagridUtilisateurs.UtilisateurSelectionne= await this.UtilisateursDataService.getUtilisateurFromPseudo(pseudo);
if (this.DonneurEtat._utilisateurCourant.Pseudo != DatagridUtilisateurs.UtilisateurSelectionne.Pseudo)
{
await this.afficherModal();
}
}
public async Task onClickBoutonModification(String pseudo)
{
DatagridUtilisateurs.UtilisateurSelectionne = await this.UtilisateursDataService.getUtilisateurFromPseudo(pseudo);
this.modifierUtilisateur();
}
public async Task boutonclick()
{
NavigationManager.NavigateTo("/utilisateurs/ajouter");
}
}
}

@ -0,0 +1,67 @@
@using Blazorise.Components;
@using System.ComponentModel.DataAnnotations;
<head>
<link rel="stylesheet" href="css/composants/authentification/FormulaireConnexion.css" />
</head>
<div class="connexion-container">
<h1 class="title-spacing"> Se connecter</h1>
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Requete">
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Requete.Pseudo">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group">
<TextEdit @bind-Text="@Requete.MotDePasse"
Type="@(showPassword ? "text" : "password")"
Class="form-control" Placeholder="Mot De Passe"/>
<span class="input-group-btn">
<button class="btn btn-default" type="button" @onclick="ToggleShowPassword">
<i class="@(showPassword ? "fa fa-eye-slash" : "fa fa-eye")"></i>
</button>
</span>
</div>
</FieldBody>
</Field>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Seedling" />
Se connecter</Button>
<Button Class="btn-s-inscrire" Clicked="@RedirectionInscription">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CreditCard" />
S'inscrire</Button>
</div>
<label class="text-danger">@Erreur</label>
</Validations>
</div>

@ -0,0 +1,58 @@
using Blazorise;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles;
namespace VeraxShield.composants.authentification
{
public partial class FormulaireConnexion
{
[Parameter]
public Validations Validations {get; set;}
public RequeteConnexion Requete {get; set;}
[Inject]
private NavigationManager NavigationManager {get; set;}
[Inject]
private DonneurEtat DonneurEtat {get; set;}
public String Erreur {get; set; }
public bool showPassword = false;
protected override async Task OnInitializedAsync()
{
this.Requete = new RequeteConnexion();
await base.OnInitializedAsync();
}
public async Task OnSubmit()
{
if (await this.Validations.ValidateAll())
{
try
{
await DonneurEtat.Connexion(this.Requete);
NavigationManager.NavigateTo("/");
} catch (Exception ex)
{
this.Erreur = ex.Message;
}
}
}
public async Task RedirectionInscription()
{
this.NavigationManager.NavigateTo("/inscription");
}
private void ToggleShowPassword()
{
showPassword = !showPassword;
}
}
}

@ -0,0 +1,131 @@
@using Blazorise.Components;
@using System.ComponentModel.DataAnnotations;
<head>
<link rel="stylesheet" href="css/composants/authentification/FormulaireConnexion.css" />
</head>
<div class="connexion-container">
<h1 class="title-spacing"> S'inscrire </h1>
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Requete">
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Requete.Pseudo">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Prenom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre prenom" @bind-Text="@Requete.Prenom">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Nom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre nom" @bind-Text="@Requete.Nom">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mail</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre mail" @bind-Text="@Requete.Mail">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group">
<TextEdit @bind-Text="@Requete.MotDePasse"
Type="@(showPassword ? "text" : "password")"
Class="form-control" Placeholder="Mot de passe" />
<span class="input-group-btn">
<button class="btn btn-default" type="button" @onclick="ToggleShowPassword">
<i class="@(showPassword ? "fa fa-eye-slash" : "fa fa-eye")"></i>
</button>
</span>
</div>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Confirmer le mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<div class="input-group">
<TextEdit @bind-Text="@Requete.MotDePasseConfirmation"
Type="@(showPasswordConf ? "text" : "password")"
Class="form-control" Placeholder="Confirmez mot de passe" />
<span class="input-group-btn">
<button class="btn btn-default" type="button" @onclick="ToggleShowPasswordConf">
<i class="@(showPasswordConf ? "fa fa-eye-slash" : "fa fa-eye")"></i>
</button>
</span>
</div>
</FieldBody>
</Field>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
S'inscrire</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
<label class="text-danger">@Erreur</label>
</Validations>
</div>

@ -0,0 +1,63 @@
using Blazorise;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.authentification
{
public partial class FormulaireInscription
{
[Parameter]
public Validations Validations {get; set;}
public RequeteInscription Requete {get; set;}
[Inject]
private NavigationManager NavigationManager {get; set;}
[Inject]
private DonneurEtat DonneurEtat {get; set;}
[Inject]
private IUtilisateursDataService UtilisateursDataService {get; set;}
public String Erreur {get; set; }
public bool showPassword {get; set;}
public bool showPasswordConf {get; set;}
protected override async Task OnInitializedAsync()
{
this.showPassword = false;
this.showPasswordConf = false;
this.Requete = new RequeteInscription();
DatagridUtilisateurs.Utilisateurs = await this.UtilisateursDataService.getAllUtilisateurs();
await base.OnInitializedAsync();
}
public async Task OnSubmit()
{
if (await this.Validations.ValidateAll())
{
await DonneurEtat.Inscription(this.Requete);
NavigationManager.NavigateTo("/connexion");
}
}
public async Task OnAnnulation()
{
this.NavigationManager.NavigateTo("/connexion");
}
private void ToggleShowPassword()
{
showPassword = !showPassword;
}
private void ToggleShowPasswordConf()
{
showPasswordConf = !showPasswordConf;
}
}
}

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
namespace VeraxShield.composants.formulaires.modeles
{
public class RequeteConnexion
{
[Required(ErrorMessage="le champ est obligatoire !")]
public string MotDePasse { get; set; }
[Required(ErrorMessage="le champ est obligatoire !")]
public string Pseudo { get; set; }
}
}

@ -0,0 +1,36 @@
using System.ComponentModel.DataAnnotations;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
namespace VeraxShield.composants.formulaires.modeles
{
public class RequeteInscription
{
[Required]
[RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage = "Le mot de passe doit contenir uniquement des caractères alphanumériques.")]
public string MotDePasse { get; set; }
[Required]
[Compare(nameof(MotDePasse), ErrorMessage = "Les mots de passe diffèrent !")]
public string MotDePasseConfirmation { get; set; }
[Required]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le nom doit contenir uniquement des lettres.")]
[StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")]
public string Nom { get; set; }
[Required]
[StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le prénom doit contenir uniquement des lettres.")]
public string Prenom {get; set;}
[Required]
[StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z0-9_]+$", ErrorMessage = "Le pseudo contient des caractères interdits.")]
[PseudoCorrect]
public string Pseudo { get; set; }
[Required]
[EmailAddress(ErrorMessage = "Veuillez entrer une adresse email valide.")]
public string Mail { get; set;}
}
}

@ -1,58 +1,115 @@
 @using Blazorise.Components
<EditForm Model="@Modele" OnValidSubmit="@ajouterUtilisateur"> @using System.ComponentModel.DataAnnotations;
<DataAnnotationsValidator /> <head>
<Microsoft.AspNetCore.Components.Forms.ValidationSummary /> <link rel="stylesheet" href="css/composants/formulaires/FormulaireAjout.css" />
</head>
<p>
<label for="pseudo"> <div class="formulaire-conteneur">
Pseudo :
<InputText id="pseudo" @bind-Value="Modele.Pseudo" /> <h1 class="title-spacing"> Ajouter un utilisateur </h1>
</label>
</p> <Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Modele">
<p> <div class="field-container">
<label for="prenom"> <Validation>
Prénom : <Field Horizontal>
<InputText id="prenom" @bind-Value="Modele.Prenom" /> <FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Pseudo</FieldLabel>
</label> <FieldBody ColumnSize="ColumnSize.Is10">
</p> <TextEdit Placeholder="Entrez son pseudo" @bind-Text="@Modele.Pseudo">
<Feedback>
<p> <ValidationError />
<label for="nom"> </Feedback>
Nom : </TextEdit>
<InputText id="nom" @bind-Value="Modele.Nom" /> </FieldBody>
</label> </Field>
</p> </Validation>
</div>
<p>
<label for="role"> <div class="field-container">
Role : <Validation>
<InputText id="role" @bind-Value="Modele.Role" /> <Field Horizontal>
</label> <FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Prenom</FieldLabel>
</p> <FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son prénom" @bind-Text="@Modele.Prenom">
<p> <Feedback>
<label for="mail"> <ValidationError />
Email : </Feedback>
<InputText id="mail" @bind-Value="Modele.Mail" /> </TextEdit>
</label> </FieldBody>
</p> </Field>
</Validation>
<p> </div>
<label for="mdp">
Mot de passe : <div class="field-container">
<InputText id="mdp" @bind-Value="Modele.Mdp" /> <Validation>
</label> <Field Horizontal>
</p> <FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Nom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<p> <TextEdit Placeholder="Entrez son nom" @bind-Text="@Modele.Nom">
<label> <Feedback>
Utilisateur banni : <ValidationError />
<InputCheckbox @bind-Value="Modele.IsBan" /> </Feedback>
</label> </TextEdit>
</p> </FieldBody>
</Field>
<button Type="Submit">Valider la création</button> </Validation>
</div>
</EditForm>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Mail</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son mail" @bind-Text="@Modele.Mail">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Role</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son role" @bind-Text="@Modele.Role">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2" Class="field-label">Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez son mot de passe" @bind-Text="@Modele.Mdp">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@OnSubmit">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
Ajouter</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
</Validations>
</div>

@ -1,4 +1,4 @@
using System.Runtime.InteropServices; using Blazorise;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.factories; using VeraxShield.factories;
@ -9,35 +9,42 @@ namespace VeraxShield.composants.formulaires
{ {
public partial class FormulaireAjout public partial class FormulaireAjout
{ {
[Inject]
private NavigationManager NavigationManager { get; set; } [Parameter]
public Validations Validations {get; set;}
private FormulaireAjoutModele Modele { get; set; } public FormulaireAjoutModele Modele {get; set;}
[Inject] [Inject]
private IUtilisateursDataService utilisateursDataService { get; set; } private NavigationManager NavigationManager {get; set;}
public FormulaireAjout()
{
} [Inject]
private IUtilisateursDataService utilisateursDataService { get; set; }
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
this.Modele = new FormulaireAjoutModele(); this.Modele = new FormulaireAjoutModele();
this.Modele.IsBan = false;
await base.OnInitializedAsync(); await base.OnInitializedAsync();
} }
public async void ajouterUtilisateur() public async Task OnSubmit()
{ {
Utilisateur nouvelUtilisateur = UtilisateursFactory.toUtilisateur(this.Modele); if (await this.Validations.ValidateAll())
await this.utilisateursDataService.AjouterUtilisateur(nouvelUtilisateur); {
if(this.Modele.Mdp == null)
//Console.WriteLine("Utilisateur bien ajouté !"); {
this.Modele.Mdp = this.Modele.Pseudo;
}
Utilisateur nouvelUtilisateur = UtilisateursFactory.toUtilisateur(this.Modele);
await this.utilisateursDataService.AjouterUtilisateur(nouvelUtilisateur);
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
}
public async Task OnAnnulation()
{
this.NavigationManager.NavigateTo("/utilisateurs/liste"); this.NavigationManager.NavigateTo("/utilisateurs/liste");
} }
} }
} }

@ -1,58 +1,119 @@
<head>
<link rel="stylesheet" href="css/composants/formulaires/FormulaireModification.css">
</head>
<EditForm Model="@Modele" OnValidSubmit="@modifierUtilisateur"> <div class="formulaire-conteneur">
<DataAnnotationsValidator /> <h1 class="title-spacing"> Modifier l'utilisateur</h1>
<Microsoft.AspNetCore.Components.Forms.ValidationSummary />
<Validations @ref="Validations" Mode="ValidationMode.Manual" Model="Modele">
<p>
<label for="pseudo"> <div class="field-container">
Pseudo : <Validation>
<InputText id="pseudo" @bind-Value="Modele.Pseudo" /> <Field Horizontal>
</label> <FieldLabel ColumnSize="ColumnSize.Is2">Pseudo</FieldLabel>
</p> <FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez votre pseudo" @bind-Text="@Modele.Pseudo">
<p> <Feedback>
<label for="prenom"> <ValidationError />
Prénom : </Feedback>
<InputText id="prenom" @bind-Value="Modele.Prenom" /> </TextEdit>
</label> </FieldBody>
</p> </Field>
</Validation>
<p> </div>
<label for="nom">
Nom : <div class="field-container">
<InputText id="nom" @bind-Value="Modele.Nom" /> <Validation>
</label> <Field Horizontal>
</p> <FieldLabel ColumnSize="ColumnSize.Is2">Prenom</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<p> <TextEdit Placeholder="Entrez votre prenom" @bind-Text="@Modele.Prenom">
<label for="role"> <Feedback>
Role : <ValidationError />
<InputText id="role" @bind-Value="Modele.Role" /> </Feedback>
</label> </TextEdit>
</p> </FieldBody>
</Field>
<p> </Validation>
<label for="mail"> </div>
Email :
<InputText id="mail" @bind-Value="Modele.Mail" /> <div class="field-container">
</label> <Validation>
</p> <Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Nom</FieldLabel>
<p> <FieldBody ColumnSize="ColumnSize.Is10">
<label for="mdp"> <TextEdit Placeholder="Entrez votre nom" @bind-Text="@Modele.Nom">
Mot de passe : <Feedback>
<InputText id="mdp" @bind-Value="Modele.Mdp" /> <ValidationError />
</label> </Feedback>
</p> </TextEdit>
</FieldBody>
<p> </Field>
<label> </Validation>
Utilisateur banni : </div>
<InputCheckbox @bind-Value="Modele.IsBan" />
</label> <div class="field-container">
</p> <Validation>
<Field Horizontal>
<button Type="Submit">Valider la modification </button> <FieldLabel ColumnSize="ColumnSize.Is2">Mail</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
</EditForm> <TextEdit Placeholder="Entrez votre mail" @bind-Text="@Modele.Mail">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Role</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Entrez le role" @bind-Text="@Modele.Role">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div class="field-container">
<Validation>
<Field Horizontal>
<FieldLabel ColumnSize="ColumnSize.Is2">Modifier Mot de passe</FieldLabel>
<FieldBody ColumnSize="ColumnSize.Is10">
<TextEdit Placeholder="Nouveau mot de passe (facultatif)" @bind-Text="@Modele.Mdp">
<Feedback>
<ValidationError />
</Feedback>
</TextEdit>
</FieldBody>
</Field>
</Validation>
</div>
<div>
<Validation>
<Switch TValue="bool" @bind-Checked="@Modele.IsBan" Color="Color.Primary">Utilisateur banni</Switch>
</Validation>
</div>
<div class="btn-container">
<Button Class="btn-se-connecter" Clicked="@modifierUtilisateur">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.CheckCircle" />
Modifier</Button>
<Button Class="btn-s-inscrire" Clicked="@OnAnnulation">
<Icon Name="Blazorise.Icons.FontAwesome.FontAwesomeIcons.Reply" />
Annuler</Button>
</div>
</Validations>
</div>

@ -1,5 +1,7 @@
using Blazorise;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles; using VeraxShield.composants.formulaires.modeles;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
using VeraxShield.factories; using VeraxShield.factories;
using VeraxShield.modele.utilisateurs; using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService; using VeraxShield.services.UtilisateursDataService;
@ -11,6 +13,9 @@ namespace VeraxShield.composants.formulaires
[Parameter] [Parameter]
public Utilisateur Utilisateur {get; set;} public Utilisateur Utilisateur {get; set;}
[Parameter]
public Validations Validations {get; set;}
public FormulaireAjoutModele Modele {get; set;} public FormulaireAjoutModele Modele {get; set;}
[Inject] [Inject]
@ -21,33 +26,47 @@ namespace VeraxShield.composants.formulaires
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
if (this.Utilisateur != null) if (this.Utilisateur != null)
{ {
Console.WriteLine("Le mec encore trouvé : " + this.Utilisateur.Pseudo);
Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true); Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true);
this.Modele = UtilisateursFactory.toModele(this.Utilisateur); this.Modele = UtilisateursFactory.toModele(this.Utilisateur);
} else } else
{ {
Console.WriteLine("Le mec nul cette fois...");
Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true); Utilisateur temp = new Utilisateur(" ", " ", " ", " ", " ", " ", true);
this.Modele = UtilisateursFactory.toModele(temp); this.Modele = UtilisateursFactory.toModele(temp);
} }
Console.WriteLine("Fin du onParameterEnfant");
await base.OnParametersSetAsync(); await base.OnParametersSetAsync();
} }
protected async Task modifierUtilisateur() protected async Task modifierUtilisateur()
{ {
Utilisateur temp = UtilisateursFactory.toUtilisateur(this.Modele);
await this.utilisateursDataService.MettreAJourUtilisateur(temp);
if (await this.Validations.ValidateAll())
{
if (this.Modele.Mdp == null)
{
this.Modele.Mdp = Utilisateur.Mdp;
}
Utilisateur temp = UtilisateursFactory.toUtilisateur(this.Modele);
if (this.Utilisateur.Pseudo != this.Modele.Pseudo)
{
await this.utilisateursDataService.MettreAJourUtilisateur(this.Utilisateur, temp);
}
else
{
await this.utilisateursDataService.MettreAJourUtilisateur(temp);
}
this.NavigationManager.NavigateTo("/utilisateurs/liste");
}
}
protected async Task OnAnnulation()
{
this.NavigationManager.NavigateTo("/utilisateurs/liste"); this.NavigationManager.NavigateTo("/utilisateurs/liste");
} }
} }

@ -1,4 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.formulaires.modeles.attributsValidationCustoms;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.formulaires.modeles namespace VeraxShield.composants.formulaires.modeles
{ {
@ -6,23 +10,29 @@ namespace VeraxShield.composants.formulaires.modeles
{ {
[Required] [Required]
[StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le pseudo ne doit pas dépasser 20 caractères !")]
public String Pseudo { get; set; } [RegularExpression("^[a-zA-Z0-9_]+$", ErrorMessage = "Le pseudo contient des caractères interdits.")]
[PseudoCorrect]
public string Pseudo { get; set; }
[Required] [Required]
[StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le nom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le nom doit contenir uniquement des lettres.")]
public String Nom { get; set; } public String Nom { get; set; }
[Required] [Required]
[StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")] [StringLength(20, ErrorMessage = "Le prénom ne doit pas dépasser 20 caractères !")]
[RegularExpression("^[a-zA-Z]+$", ErrorMessage = "Le prénom doit contenir uniquement des lettres.")]
public String Prenom { get; set; } public String Prenom { get; set; }
[Required] [Required]
[EmailAddress(ErrorMessage = "Veuillez entrer une adresse email valide.")]
public String Mail { get; set; } public String Mail { get; set; }
[Required] [RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage = "Le mot de passe doit contenir uniquement des caractères alphanumériques.")]
public String Mdp { get; set; } public String Mdp { get; set; }
[Required] [Required]
[RoleExistant]
public String Role { get; set; } public String Role { get; set; }
[Required] [Required]
@ -40,12 +50,7 @@ namespace VeraxShield.composants.formulaires.modeles
public FormulaireAjoutModele() public FormulaireAjoutModele()
{ {
//Pseudo = "temporairementVide"; Mdp = null;
//Nom = "temporairementVide";
//Prenom = "temporairementVide";
//Mail = "temporairementVide";
//Mdp = "temporairementVide";
//IsBan = true;
} }
} }
} }

@ -0,0 +1,37 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.modele.utilisateurs;
using VeraxShield.services.UtilisateursDataService;
namespace VeraxShield.composants.formulaires.modeles.attributsValidationCustoms
{
public class PseudoCorrectAttribute : ValidationAttribute
{
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
{
bool pseudoExisteDeja = false;
var pseudo = (string)value;
foreach (Utilisateur u in DatagridUtilisateurs.Utilisateurs)
{
if ((u.Pseudo == pseudo))
{
if (DatagridUtilisateurs.UtilisateurSelectionne == null) {
return new ValidationResult("Le pseudo existe deja, choississez en un autre.");
}
if (DatagridUtilisateurs.UtilisateurSelectionne != null)
{
if (u.Pseudo != DatagridUtilisateurs.UtilisateurSelectionne.Pseudo)
{
return new ValidationResult("Le pseudo existe deja, choississez en un autre.");
}
}
}
}
return ValidationResult.Success;
}
}
}

@ -0,0 +1,33 @@
using System.ComponentModel.DataAnnotations;
namespace VeraxShield.composants.formulaires.modeles.attributsValidationCustoms
{
public class RoleExistantAttribute : ValidationAttribute
{
private List<string> RolesExistants {get; set;}
public RoleExistantAttribute()
{
this.RolesExistants = new List<string>();
this.RolesExistants.Add("admin");
this.RolesExistants.Add("modo");
this.RolesExistants.Add("invite");
this.RolesExistants.Add("redacteur");
}
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
{
var role = (string)value;
foreach (string roleListe in this.RolesExistants)
{
if (roleListe == role)
{
return ValidationResult.Success;;
}
}
return new ValidationResult("Le role n'existe pas.");
}
}
}

@ -1,4 +1,6 @@
using VeraxShield.composants.formulaires.modeles; using Blazorise.DataGrid;
using VeraxShield.composants.affichages.utilisateurs;
using VeraxShield.composants.formulaires.modeles;
using VeraxShield.modele.utilisateurs; using VeraxShield.modele.utilisateurs;
namespace VeraxShield.factories namespace VeraxShield.factories
@ -7,6 +9,21 @@ namespace VeraxShield.factories
{ {
public static Utilisateur toUtilisateur(FormulaireAjoutModele modele) public static Utilisateur toUtilisateur(FormulaireAjoutModele modele)
{ {
if (DatagridUtilisateurs.UtilisateurSelectionne != null )
{
if (DatagridUtilisateurs.UtilisateurSelectionne.Mdp != modele.Mdp)
{
var motDePasseClair = modele.Mdp;
modele.Mdp = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
}
}
else
{
var motDePasseClair = modele.Mdp;
modele.Mdp = BCrypt.Net.BCrypt.HashPassword(motDePasseClair);
}
Utilisateur temp = new Utilisateur( Utilisateur temp = new Utilisateur(
modele.Pseudo, modele.Pseudo,
modele.Nom, modele.Nom,
@ -25,7 +42,11 @@ namespace VeraxShield.factories
temp.Pseudo = u.Pseudo; temp.Pseudo = u.Pseudo;
temp.Nom = u.Nom; temp.Nom = u.Nom;
temp.Prenom = u.Prenom; temp.Prenom = u.Prenom;
temp.Mdp = u.Mdp;
// ici dehash
//temp.Mdp = u.Mdp;
temp.Role = u.Role; temp.Role = u.Role;
temp.Mail = u.Mail; temp.Mail = u.Mail;
temp.IsBan = u.IsBan; temp.IsBan = u.IsBan;

@ -0,0 +1,32 @@
public class ModeleAppUtilisateur
{
public string MotDePasse { get; set; }
public List<string> Roles { get; set; }
public string Pseudo { get; set; }
public string Prenom { get; set; }
public string Nom { get; set; }
public string Mail { get; set; }
public ModeleAppUtilisateur(string pseudo,string nom, string prenom, string mail, string mdp, String premierRole)
{
this.MotDePasse = mdp;
this.Pseudo = pseudo;
this.Mail = mail;
this.Prenom = prenom;
this.Nom = nom;
this.Roles = new List<string>();
this.Roles.Add(premierRole);
}
public void ajouterRole(string nouveauRole)
{
this.Roles.Add(nouveauRole);
}
public void supprimerRole(string ancienRole)
{
this.Roles.Remove(ancienRole);
}
}

@ -0,0 +1,6 @@
public class UtilisateurCourant
{
public Dictionary<string, string> Claims { get; set; }
public bool EstAuthentifie { get; set; }
public string Pseudo { get; set; }
}

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Ce code a été généré par un outil.
// Version du runtime :4.0.30319.42000
//
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
// le code est régénéré.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("VeraxShield")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7ff09d0e93993e805e6588d2aa68bf1231b10b20")]
[assembly: System.Reflection.AssemblyProductAttribute("VeraxShield")]
[assembly: System.Reflection.AssemblyTitleAttribute("VeraxShield")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Généré par la classe MSBuild WriteCodeFragment.

@ -1 +0,0 @@
019603838159e307d81084ff45aa139dc0d73907fb59a7996c80ec5247388f42

@ -1,75 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = VeraxShield
build_property.RootNamespace = VeraxShield
build_property.ProjectDir = C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 7.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield
build_property._RazorSourceGeneratorDebug =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/App.razor]
build_metadata.AdditionalFiles.TargetPath = QXBwLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/composants/formulaires/FormulaireAjout.razor]
build_metadata.AdditionalFiles.TargetPath = Y29tcG9zYW50c1xmb3JtdWxhaXJlc1xGb3JtdWxhaXJlQWpvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/composants/formulaires/FormulaireModification.razor]
build_metadata.AdditionalFiles.TargetPath = Y29tcG9zYW50c1xmb3JtdWxhaXJlc1xGb3JtdWxhaXJlTW9kaWZpY2F0aW9uLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/composants/formulaires/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Y29tcG9zYW50c1xmb3JtdWxhaXJlc1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/composants/modals/ModalSuppressionUtilisateur.razor]
build_metadata.AdditionalFiles.TargetPath = Y29tcG9zYW50c1xtb2RhbHNcTW9kYWxTdXBwcmVzc2lvblV0aWxpc2F0ZXVyLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/composants/modals/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Y29tcG9zYW50c1xtb2RhbHNcX0ltcG9ydHMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = TWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/Index.razor]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcSW5kZXgucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/utilisateurs/AjouterUtilisateur.razor]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcdXRpbGlzYXRldXJzXEFqb3V0ZXJVdGlsaXNhdGV1ci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/utilisateurs/ListeUtilisateurs.razor]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcdXRpbGlzYXRldXJzXExpc3RlVXRpbGlzYXRldXJzLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/utilisateurs/ModifierUtilisateur.razor]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcdXRpbGlzYXRldXJzXE1vZGlmaWVyVXRpbGlzYXRldXIucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcX0ltcG9ydHMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = X0ltcG9ydHMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/jeanm/OneDrive/Documents/BUT/Blazor_SAE/VeraxShield/VeraxShield/pages/_Host.cshtml]
build_metadata.AdditionalFiles.TargetPath = cGFnZXNcX0hvc3QuY3NodG1s
build_metadata.AdditionalFiles.CssScope =

@ -1,17 +0,0 @@
// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

@ -1 +0,0 @@
d5ac7ab69059af111e9d7125adeb7b174ca570725d4b64a544cca7bd11ac7ca0

@ -1,18 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Ce code a été généré par un outil.
// Version du runtime :4.0.30319.42000
//
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
// le code est régénéré.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFact" +
"ory, Microsoft.AspNetCore.Mvc.Razor")]
// Généré par la classe MSBuild WriteCodeFragment.

@ -1 +0,0 @@
b6db3d3d769bf7d4e4e9ba5aabf655e09c7239c2b4702b38f5cb1ea5a9587451

@ -1,47 +0,0 @@
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\appsettings.Development.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\appsettings.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.staticwebassets.runtime.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.exe
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.deps.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.runtimeconfig.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\VeraxShield.pdb
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.AssemblyInfoInputs.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.AssemblyInfo.cs
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.csproj.CoreCompileInputs.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.MvcApplicationPartsAssemblyInfo.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.RazorAssemblyInfo.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.RazorAssemblyInfo.cs
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets.build.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets.development.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets\msbuild.VeraxShield.Microsoft.AspNetCore.StaticWebAssets.props
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets\msbuild.build.VeraxShield.props
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets\msbuild.buildMultiTargeting.VeraxShield.props
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets\msbuild.buildTransitive.VeraxShield.props
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\staticwebassets.pack.json
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\scopedcss\bundle\VeraxShield.styles.css
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\refint\VeraxShield.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.pdb
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.genruntimeconfig.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\ref\VeraxShield.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazored.LocalStorage.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.csproj.AssemblyReference.cache
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\obj\Debug\net7.0\VeraxShield.csproj.CopyComplete
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.Bootstrap.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.DataGrid.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.Icons.FontAwesome.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.Licensing.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\DeepCloner.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.AspNetCore.Authorization.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.AspNetCore.Components.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.AspNetCore.Components.Forms.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.AspNetCore.Components.Web.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.AspNetCore.Metadata.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.Extensions.Options.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Microsoft.JSInterop.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.Components.dll
C:\Users\jeanm\OneDrive\Documents\BUT\Blazor_SAE\VeraxShield\VeraxShield\bin\Debug\net7.0\Blazorise.Snackbar.dll

@ -1 +0,0 @@
a5ef9924292fc9d83e22623a89ae80f245a08dda172e8ca4fdd9cef47b726341

@ -1,875 +0,0 @@
{
"Version": 1,
"Hash": "1Y9UOHIbbBoRdzjCG27pKoNvUjVEgsDTJMI1/wI3o2s=",
"Source": "VeraxShield",
"BasePath": "_content/VeraxShield",
"Mode": "Default",
"ManifestType": "Build",
"ReferencedProjectsConfiguration": [],
"DiscoveryPatterns": [
{
"Name": "VeraxShield\\wwwroot",
"Source": "VeraxShield",
"ContentRoot": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\",
"BasePath": "_content/VeraxShield",
"Pattern": "**"
}
],
"Assets": [
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\blazorise.bootstrap.css",
"SourceId": "Blazorise.Bootstrap",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Bootstrap",
"RelativePath": "blazorise.bootstrap.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\blazorise.bootstrap.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\blazorise.bootstrap.min.css",
"SourceId": "Blazorise.Bootstrap",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Bootstrap",
"RelativePath": "blazorise.bootstrap.min.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\blazorise.bootstrap.min.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\modal.js",
"SourceId": "Blazorise.Bootstrap",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Bootstrap",
"RelativePath": "modal.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\modal.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\tooltip.js",
"SourceId": "Blazorise.Bootstrap",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Bootstrap",
"RelativePath": "tooltip.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.bootstrap\\1.4.0\\staticwebassets\\tooltip.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.datagrid\\1.4.0\\staticwebassets\\datagrid.js",
"SourceId": "Blazorise.DataGrid",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.datagrid\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.DataGrid",
"RelativePath": "datagrid.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.datagrid\\1.4.0\\staticwebassets\\datagrid.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\blazorise.snackbar.css",
"SourceId": "Blazorise.Snackbar",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Snackbar",
"RelativePath": "blazorise.snackbar.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\blazorise.snackbar.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\blazorise.snackbar.min.css",
"SourceId": "Blazorise.Snackbar",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise.Snackbar",
"RelativePath": "blazorise.snackbar.min.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise.snackbar\\1.4.0\\staticwebassets\\blazorise.snackbar.min.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\blazorise.css",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "blazorise.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\blazorise.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\blazorise.min.css",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "blazorise.min.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\blazorise.min.css"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\breakpoint.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "breakpoint.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\breakpoint.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\button.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "button.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\button.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\closable.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "closable.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\closable.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\colorPicker.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "colorPicker.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\colorPicker.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\datePicker.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "datePicker.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\datePicker.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\dragDrop.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "dragDrop.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\dragDrop.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\dropdown.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "dropdown.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\dropdown.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\fileEdit.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "fileEdit.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\fileEdit.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\filePicker.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "filePicker.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\filePicker.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\floatingUi.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "floatingUi.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\floatingUi.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\inputMask.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "inputMask.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\inputMask.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\io.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "io.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\io.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\memoEdit.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "memoEdit.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\memoEdit.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\numericPicker.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "numericPicker.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\numericPicker.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\observer.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "observer.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\observer.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\table.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "table.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\table.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\textEdit.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "textEdit.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\textEdit.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\theme.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "theme.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\theme.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\timePicker.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "timePicker.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\timePicker.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\tooltip.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "tooltip.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\tooltip.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\utilities.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "utilities.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\utilities.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\DateTimeMaskValidator.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "validators/DateTimeMaskValidator.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\DateTimeMaskValidator.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\NoValidator.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "validators/NoValidator.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\NoValidator.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\NumericMaskValidator.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "validators/NumericMaskValidator.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\NumericMaskValidator.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\RegExMaskValidator.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "validators/RegExMaskValidator.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\validators\\RegExMaskValidator.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\autoNumeric.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/autoNumeric.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\autoNumeric.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\Behave.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/Behave.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\Behave.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\flatpickr.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/flatpickr.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\flatpickr.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\floating-ui.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/floating-ui.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\floating-ui.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\floating-ui-core.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/floating-ui-core.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\floating-ui-core.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\inputmask.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/inputmask.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\inputmask.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\jsencrypt.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/jsencrypt.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\jsencrypt.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\Pickr.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/Pickr.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\Pickr.js"
},
{
"Identity": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\sha512.js",
"SourceId": "Blazorise",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\",
"BasePath": "_content/Blazorise",
"RelativePath": "vendors/sha512.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\jeanm\\.nuget\\packages\\blazorise\\1.4.0\\staticwebassets\\vendors\\sha512.js"
},
{
"Identity": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\css\\site.css",
"SourceId": "VeraxShield",
"SourceType": "Discovered",
"ContentRoot": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\",
"BasePath": "_content/VeraxShield",
"RelativePath": "css/site.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "PreferTarget",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\css\\site.css"
},
{
"Identity": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\data\\fakeUtilisateurs.json",
"SourceId": "VeraxShield",
"SourceType": "Discovered",
"ContentRoot": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\",
"BasePath": "_content/VeraxShield",
"RelativePath": "data/fakeUtilisateurs.json",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"AssetMergeBehavior": "PreferTarget",
"AssetMergeSource": "",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\data\\fakeUtilisateurs.json"
}
]
}

File diff suppressed because one or more lines are too long

@ -1,29 +0,0 @@
{
"Files": [
{
"Id": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\css\\site.css",
"PackagePath": "staticwebassets\\css\\site.css"
},
{
"Id": "C:\\Users\\jeanm\\OneDrive\\Documents\\BUT\\Blazor_SAE\\VeraxShield\\VeraxShield\\wwwroot\\data\\fakeUtilisateurs.json",
"PackagePath": "staticwebassets\\data\\fakeUtilisateurs.json"
},
{
"Id": "obj\\Debug\\net7.0\\staticwebassets\\msbuild.VeraxShield.Microsoft.AspNetCore.StaticWebAssets.props",
"PackagePath": "build\\Microsoft.AspNetCore.StaticWebAssets.props"
},
{
"Id": "obj\\Debug\\net7.0\\staticwebassets\\msbuild.build.VeraxShield.props",
"PackagePath": "build\\VeraxShield.props"
},
{
"Id": "obj\\Debug\\net7.0\\staticwebassets\\msbuild.buildMultiTargeting.VeraxShield.props",
"PackagePath": "buildMultiTargeting\\VeraxShield.props"
},
{
"Id": "obj\\Debug\\net7.0\\staticwebassets\\msbuild.buildTransitive.VeraxShield.props",
"PackagePath": "buildTransitive\\VeraxShield.props"
}
],
"ElementsToRemove": []
}

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

Loading…
Cancel
Save