ajout ajouter page repertoire (pas fini)

master
Maxence LANONE 3 years ago
commit ab9251a6fc

@ -4,7 +4,6 @@
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=jtt_crm&metric=alert_status&token=4e704a73064f9dd9388eb33b182fcfe6f8aed2a4)](https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm)
[![Code Smells](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=jtt_crm&metric=code_smells&token=4e704a73064f9dd9388eb33b182fcfe6f8aed2a4)](https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=jtt_crm&metric=ncloc&token=4e704a73064f9dd9388eb33b182fcfe6f8aed2a4)](https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=jtt_crm&metric=alert_status&token=4e704a73064f9dd9388eb33b182fcfe6f8aed2a4)](https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm)
[![Bugs](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=jtt_crm&metric=bugs&token=4e704a73064f9dd9388eb33b182fcfe6f8aed2a4)](https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm)

16
package-lock.json generated

@ -32,6 +32,7 @@
"react-big-calendar": "^1.5.0",
"react-datepicker": "^4.8.0",
"react-dom": "^18.2.0",
"react-loading": "^2.0.3",
"react-router-dom": "^6.4.2",
"react-scripts": "^5.0.1",
"sass": "^1.55.0",
@ -14941,6 +14942,15 @@
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"node_modules/react-loading": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/react-loading/-/react-loading-2.0.3.tgz",
"integrity": "sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A==",
"peerDependencies": {
"prop-types": "^15.6.0",
"react": ">=0.14.0"
}
},
"node_modules/react-onclickoutside": {
"version": "6.12.2",
"resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz",
@ -28394,6 +28404,12 @@
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"react-loading": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/react-loading/-/react-loading-2.0.3.tgz",
"integrity": "sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A==",
"requires": {}
},
"react-onclickoutside": {
"version": "6.12.2",
"resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz",

@ -27,6 +27,7 @@
"react-big-calendar": "^1.5.0",
"react-datepicker": "^4.8.0",
"react-dom": "^18.2.0",
"react-loading": "^2.0.3",
"react-router-dom": "^6.4.2",
"react-scripts": "^5.0.1",
"sass": "^1.55.0",

@ -86,6 +86,20 @@ app.get('/User/Auth/:login/:pwd', (req, res) => {
});
});
app.get('/User/Auth/Password/:id/:pwd', (req, res) => {
const id = req.params.id;
const pwd = req.params.pwd;
let sql = 'SELECT login FROM users WHERE iduser = ? AND password = ?';
db.query(sql, [id, pwd], (err, result) => {
if (err) throw err;
console.log(result);
res.send(result);
});
});
app.get('/User/Role/:login', (req, res) => {
const login = req.params.login;
@ -155,11 +169,38 @@ app.put('/User/Update/:id', (req, res) => {
const id = req.params.id;
let form = req.body;
const sql = `UPDATE users SET lastname = ?, firstname = ?, idrole = ?, login = ?, password = ?, phone = ?, mail = ? WHERE (iduser = ?)`;
db.query(sql, [form.lastname, form.firstname, form.idrole, form.login, form.password, form.phone, form.mail, id], (err, result) => {
const sql = `UPDATE users SET lastname = ?, firstname = ?, idrole = ?, login = ?, phone = ?, mail = ? WHERE (iduser = ?)`;
db.query(sql, [form.lastname, form.firstname, form.idrole, form.login, form.phone, form.mail, id], (err, result) => {
if (err) throw err;
console.log(result);
res.send('Post update...');
});
});
app.put('/User/Update/Password/:id', (req, res) => {
const id = req.params.id;
let form = req.body;
console.log(form.newPassword);
const sql = `UPDATE users SET password = ? WHERE (iduser = ?)`;
db.query(sql, [form.newPassword, id], (err, result) => {
if (err) throw err;
console.log(result);
res.send('Post password update...');
});
});
app.delete('/User/Delete/:id', (req, res) => {
const id = req.params.id;
const sql = `DELETE FROM users WHERE (iduser = ?)`;
db.query(sql, [id], (err, result) => {
if (err) throw err;
console.log(result);
res.send('Post added...');
res.send('Post delete...');
});
});

@ -12,29 +12,35 @@ import Admin_create from './pages/Admin_create';
import Calendrier from './pages/Calendrier';
import Repertoire from './pages/Repertoire';
import Parametres from './pages/Parametres';
import Chargement from './pages/Chargement';
import { Component } from 'fullcalendar';
import RestartPassword from './pages/RestartPassword';
const App = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Connexion />} />
<Route path="/Admin_create" element={<Admin_create />} />
<Route path="/Account" element={<Compte />} />
<Route path="/Admin_list" element={<Admin_list />} />
<Route path="/Admin_modif" element={<Admin_modif />} />
<Route path="/Admin_devis" element={<Admin_devis />} />
<Route path="/Admin_supp" element={<Admin_supp />} />
<Route path="/Dashboard" element={<Dashboard />} />
<Route path="/Analyse" element={<Analyse />} />
<Route path="/Calendrier" element={<Calendrier />} />
<Route path="/Repertoire" element={<Repertoire />} />
<Route path="/Parametres" element={<Parametres />} />
</Routes>
</BrowserRouter>
);
<Chargement/>
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Connexion />} />
<Route path="/Admin_create" element={<Admin_create />} />
<Route path="/Account" element={<Compte />} />
<Route path="/Admin_list" element={<Admin_list />} />
<Route path="/Admin_modif" element={<Admin_modif />} />
<Route path="/Admin_supp" element={<Admin_supp />} />
<Route path="/Dashboard" element={<Dashboard />} />
<Route path="/Analyse" element={<Analyse />} />
<Route path="/Calendrier" element={<Calendrier />} />
<Route path="/Repertoire" element={<Repertoire />} />
<Route path="/Parametres" element={<Parametres />} />
<Route path="/Chargement" element={<Chargement />} />
</Routes>
</BrowserRouter>
);
}

@ -16,7 +16,7 @@ const NavigationAdmin = (props) => {
<NavLink className="modify_user" to="/Admin_modif" state={{ iduser: props.iduser }}>
<button id="bouton_modif" className="bouton" type="button" value="Modifier un utilisateur">Modifier utilisateur</button>
</NavLink>
<NavLink className="delete_user" to="/Admin_supp">
<NavLink className="delete_user" to="/Admin_supp" state={{ iduser: props.iduser }}>
<button id="bouton_sup" className="bouton" type="button" value="Supprimer un utilisateur">Supprimer utilisateur</button>
</NavLink>
<NavLink className="list_devis" to="/Admin_devis">

@ -36,7 +36,6 @@ function Admin_create() {
const formData = new FormData(event.currentTarget);
const values = Object.fromEntries(formData.entries());
{/* Verif value login exist déja */}
console.log(values.firstname);
api.get('/User/Exist/'+ values.login).then((response) => {
const login = response.data;

@ -33,7 +33,6 @@ function Admin_list() {
return (
<body className="page_admin">
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
{/* Create a page to delete an user in the admin page*/}
<NavigationAdmin iduser={selectedIdUser}/>
<div className="Titre_Formulaire_Rech">
<p className="Titre">Admin</p>
@ -45,28 +44,6 @@ function Admin_list() {
<i class="uil uil-search search-icon"></i>
</span>
</div>
{/*
<form className="formulaire">
<table className="Formulaire_de_recherche">
<tr className="tr_bouton">
<div className="bouton_personnes">
<p className="bouton_personne1">
<strong>Dupont Jacques</strong>
</p>
<p className="bouton_personne2">
<strong>Carreau Alexis</strong>
</p>
</div>
</tr>
<tr>
<div id="style" className='bouton_submit'>
<button className="bouton_sup" type="submit" onClick="document.getElementById('style').style.backgroundColor='green'">Supprimer</button>
<button className="bouton_ann" type="submit" onClick="document.getElementById('style').style.backgroundColor='red'">Annuler</button>
</div>
</tr>
</table>
</form>
*/}
<TableContainer component={Paper} sx={{ maxHeight: 0.8 }}>
<Table aria-label="simple table" size="small" stickyHeader>
<TableHead >

@ -2,10 +2,11 @@ import axios from 'axios'
import React, { useState, useEffect } from 'react';
import NavigationAdmin from '../components/NavigationAdmin.js';
import Admin from './Admin_create.js';
import { useLocation } from "react-router-dom"
import { useLocation } from "react-router-dom";
import Select, { SelectChangeEvent } from '@mui/material/Select';
import MenuItem from '@mui/material/MenuItem';
import { NavLink } from 'react-router-dom';
import { useNavigate } from "react-router-dom";
const api = axios.create({
baseURL: 'http://localhost:8080'
@ -24,6 +25,8 @@ function Admin_modif() {
const [mail, setMail] = useState();
const [login, setLogin] = useState();
const navigate = useNavigate();
useEffect(() =>{
api.get('/Role/All/').then((response) => {
setRoles(response.data);
@ -38,9 +41,9 @@ function Admin_modif() {
setLastName(response.data[0].lastname);
setFirstName(response.data[0].firstname);
setLogin(response.data[0].login);
setPhone(response.data[0].phone);
setMail(response.data[0].mail);
setLogin(response.data[0].login);
});
}, []);
@ -81,12 +84,13 @@ function Admin_modif() {
api.put(apiString, values).then((response) => {
console.log(response.data);
});
navigate("/Admin_list");
}
return (
<div className="page_admin">
<NavigationAdmin />
{/* Create a admin page */}
<div className="Titre_Formulaire">
<p className="Titre">Admin</p>
<p className="Sous-titre">Modification d'utilisateur</p>
@ -97,15 +101,16 @@ function Admin_modif() {
<div className="texte_côté">
<p>Nom :</p>
<p>Prénom :</p>
<p>Login :</p>
<p>Rôle :</p>
<p>Identifiant :</p>
<p>Identifiant :</p>
<p>Mot de passe :</p>
<p>Téléphone :</p>
<p>Mail :</p>
</div>
</tr>
<tr>
<input id="nom" value={lastName} onChange={handleChangeLastName} name="lastname" className="texte_zone" type="text" placeholder="Nom..." required/>
<input id="prenom" value={firstName} onChange={handleChangeFirstName} name="firstname" className="texte_zone" type="text" placeholder="Prénom..." required/>
<input id="identifiant" value={login} onChange={handleChangeLogin} name="login" className="texte_zone" type="text" placeholder="Identifiant..." required/>
<Select
name="idrole"
value={selectedIdRole}
@ -121,9 +126,7 @@ function Admin_modif() {
<input id="identifiant" value={login} onChange={handleChangeLogin} name="login" className="texte_zone" type="text" placeholder="Identifiant..." required/>
</tr>
<tr>
<div className="button_submit">
<button className="bouton_réini">Réinitialiser le mot de passe</button>
</div>
<NavLink className="button_submit" to="/RestartPassword" state={{ iduser:iduser }}>Réinitialiser le mot de passe</NavLink>
</tr>
</table>
<div className="bouton_submit">

@ -1,44 +1,52 @@
import React, { useState, useEffect } from 'react';
import axios from 'axios'
import NavigationAdmin from '../components/NavigationAdmin.js';
import { NavLink, useLocation } from "react-router-dom";
import { TableContainer,Table,TableHead,TableBody,TableRow,TableCell } from '@mui/material';
import { Paper } from '@mui/material';
import { useNavigate } from "react-router-dom";
const api = axios.create({
baseURL: 'http://localhost:8080'
})
const Admin_supp = () => {
function Admin_supp(){
const [users, setUsers] = useState([]);
const [selectedIdUser, setSelectedIdUser] = useState();
const location = useLocation();
const { iduser } = location.state;
const [selectedUser, setSelectedUsers] = useState([]);
const navigate = useNavigate();
useEffect(() =>{
api.get('/User/All/').then((response) => {
setUsers(response.data);
setSelectedIdUser(response.data[0].iduser);
const apiString = '/User/Id/' + iduser;
api.get(apiString).then((response) => {
console.log(response.data[0]);
setSelectedUsers(response.data[0]);
});
}, []);
const handleClick = (event, iduser) => {
setSelectedIdUser(iduser);
};
function checkDelete(event){
event.preventDefault();
const apiString = '/User/Delete/' + iduser;
api.delete(apiString).then((response) => {
console.log(response.data);
});
navigate("/Admin_list");
}
return (
<div className="page_admin">
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
{/* Create a page to delete an user in the admin page*/}
<NavigationAdmin />
<div className="Titre_Formulaire_Rech">
<p className="Titre">Admin</p>
<p className="Sous-titre">Supression d'utilisateur</p>
<div className="rechLogo">
<div className="input_box">
<input type="search" placeholder="Rechercher..."/>
<span className="search">
<i class="uil uil-search search-icon"></i>
</span>
</div>
<TableContainer component={Paper} sx={{ maxHeight: 0.8 }}>
<Table aria-label="simple table" size="small" stickyHeader>
<TableHead >
@ -48,29 +56,24 @@ const Admin_supp = () => {
<TableCell sx={{ bgcolor: 'info.main'}} align="center">Identifiant</TableCell>
<TableCell sx={{ bgcolor: 'info.main'}} align="center">Téléphone</TableCell>
<TableCell sx={{ bgcolor: 'info.main'}} align="center">Email</TableCell>
<TableCell sx={{ bgcolor: 'info.main'}} align="center">Rôle</TableCell>
</TableRow>
</TableHead>
<TableBody >
{users.map((user) => (
<TableRow
key={user.iduser}
hover
onClick={(event) => handleClick(event, user.iduser)}
selected={user.iduser === selectedIdUser}
>
<TableCell align="left">{user.lastname}</TableCell>
<TableCell align="center">{user.firstname}</TableCell>
<TableCell align="center">{user.login}</TableCell>
<TableCell align="center">{user.phone}</TableCell>
<TableCell align="center">{user.mail}</TableCell>
<TableCell align="center">{user.name}</TableCell>
</TableRow>
))}
<TableRow>
<TableCell align="left">{selectedUser.lastname}</TableCell>
<TableCell align="center">{selectedUser.firstname}</TableCell>
<TableCell align="center">{selectedUser.login}</TableCell>
<TableCell align="center">{selectedUser.phone}</TableCell>
<TableCell align="center">{selectedUser.mail}</TableCell>
</TableRow>
</TableBody>
</Table>
</TableContainer>
</div>
<div className="bouton_submit">
<button onClick={checkDelete}>Valider</button>
<NavLink className="bouton_ann" to="/Admin_list">Retour</NavLink>
</div>
</div>
</div>
);

@ -0,0 +1,16 @@
import React from 'react';
import ReactLoading from 'react-loading';
const Chargement = () => {
return(
<div className="chargement">
<img className="logo" srcSet="./LogoApp.svg"></img>
<ReactLoading type="bars" color="#a9a9a9" />
</div>
);
}
export default Chargement;

@ -1,13 +1,18 @@
import { Component } from '@fullcalendar/core';
import React, { useState } from 'react';
import userEvent from '@testing-library/user-event';
import React, { useEffect, useState } from 'react';
import NavigationDashboard from '../components/NavigationDashboard';
import img1 from '../img/logo_personEntouré.svg';
import axios from 'axios'
const api = axios.create({
baseURL: 'http://localhost:8080'
})
function Compte() {
const [theme, setTheme] = useState("light");
const [theme, setTheme] = useState("light");
const [modification, setModification] = useState(false);
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
@ -18,6 +23,11 @@ function Compte() {
setFile(URL.createObjectURL(e.target.files[0]));
}
const modificationHandler = () => {
setModification((modification) => !modification)
console.log(modification)
}
return (
<body className={theme}>
@ -58,10 +68,11 @@ function Compte() {
<div className="name">
<div className="presentationNom">
<p id="texte" className="def">Nom Complet :</p>
<p>{}</p>
<p id="texte" className="nom">Mateo Centeno</p>
</div>
<div className='bouton_submit'>
<button id="bouton" className="bouton_modifierNom" type="submit">Modifier</button>
<button id="bouton" className="bouton_modifierNom" type="submit" onClick={modificationHandler}>{!modification ? "Modifier" : "Envoyer"}</button>
</div>
</div>
</div>

@ -1,9 +1,10 @@
import axios from 'axios'
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import CryptoJS from 'crypto-js';
import Admin from './Admin_create.js'
import Dashboard from './Dashboard.js'
import Admin_list from './Admin_list.js';
import Chargement from './Chargement.js';
const api = axios.create({
baseURL: 'http://localhost:8080'
@ -58,6 +59,15 @@ function Connexion() {
});
}
const [loader, setLoader] = useState(true);
useEffect(() => {
setTimeout(() => {
setLoader(false);
}, 3000)
}, [])
if (auth === "Succeed") {
const apiString = '/User/role/' + login;
api.get(apiString).then((response) => {
@ -77,7 +87,9 @@ function Connexion() {
return (<Dashboard />);
}
else {
return (
return loader ?(
<Chargement/>
) : (
<div className="page_connexion">
<img className="logo" srcSet="./LogoApp.svg"></img>
<form onSubmit={chechAuth} className="formulaire_de_connexion">

@ -0,0 +1,105 @@
import axios from 'axios'
import React, { useState, useEffect } from 'react';
import NavigationAdmin from '../components/NavigationAdmin.js';
import Admin from './Admin_create.js';
import { useLocation } from "react-router-dom";
import Select, { SelectChangeEvent } from '@mui/material/Select';
import MenuItem from '@mui/material/MenuItem';
import { NavLink } from 'react-router-dom';
import CryptoJS from 'crypto-js';
import { useNavigate } from "react-router-dom";
const api = axios.create({
baseURL: 'http://localhost:8080'
})
function RestartPassword() {
const location = useLocation();
const { iduser } = location.state;
console.log(iduser);
const [password, setPassword] = useState("");
const [confPassword, setConfPassword] = useState("");
const [newPassword, setNewPassword] = useState("");
const navigate = useNavigate();
function handleChangePassword(event){
setPassword(event.target.value);
};
function handleChangeConfPassword(event){
setConfPassword(event.target.value);
};
function handleChangeNewPassword(event){
setNewPassword(event.target.value);
};
function checkRestartPassword(event){
const formData = new FormData(event.currentTarget);
const values = Object.fromEntries(formData.entries());
event.preventDefault();
if(password === confPassword)
{
const apiString = '/User/Auth/Password/' + iduser + "/" + CryptoJS.SHA256(confPassword).toString(CryptoJS.enc.Hex);
api.get(apiString).then((response) => {
const login = response.data;
if (login.length > 0){
console.log(values.newPassword);
values.newPassword = CryptoJS.SHA256(newPassword).toString(CryptoJS.enc.Hex);
const apiStringUpdate = '/User/Update/Password/' + iduser;
api.put(apiStringUpdate, values).then((response) => {
console.log(response.data);
});
navigate("/Admin_list");
}
else{
console.log("trt");
}
});
}
}
return (
<div className="page_admin">
<NavigationAdmin />
{/* Create a admin page */}
<div className="Titre_Formulaire">
<p className="Titre">Admin</p>
<p className="Sous-titre">Modification d'utilisateur</p>
<div className="Formulaire">
<form className="form" onSubmit={checkRestartPassword}>
<table className="Formulaire_de_connexion">
<tr>
<div className="texte_côté">
<p>Mot de passe :</p>
<p>Confirmation mot de passe :</p>
<p>Nouveau mot de passe :</p>
</div>
</tr>
<tr>
<input id="MotDePasse" value={password} onChange={handleChangePassword} name='password' className="texte_zone" type="text" placeholder="Mot de passe..." required/>
<input id="ConfirmeMotDePasse" value={confPassword} onChange={handleChangeConfPassword} name='confimPassword' className="texte_zone" type="text" placeholder="Confirmation mot de passe..." required/>
<input id="NouvMotDePasse" value={newPassword} onChange={handleChangeNewPassword} name='newPassword' className="texte_zone" type="text" placeholder="Nouveau mot de passe..." required/>
</tr>
</table>
<div className="bouton_submit">
<button className="bouton_val" type="submit">Valider</button>
<NavLink className="bouton_ann" to="/Admin_list">Retour</NavLink>
</div>
</form>
</div>
</div>
</div>
);
};
export default RestartPassword;

@ -0,0 +1,12 @@
.chargement {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
}
.logo{
height: 200px;
width:200px;
}

@ -6,4 +6,5 @@
@import "./components/analyse";
@import "./components/calendrier";
@import "./components/parametre";
@import "./components/repertoire"
@import "./components/repertoire";
@import "./components/chargement"
Loading…
Cancel
Save