Clément VERDOIRE 3 years ago
commit fde99e6195

@ -3,6 +3,19 @@ const express = require('express');
const cors=require("cors");
const bodyparser = require('body-parser');
const nodemailer = require('nodemailer');
// Créer un transporteur de mail
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 587,
// secure: true, // utiliser SSL
auth: {
user: 'stageodinnonoffi@gmail.com',
pass: 'pjjlofjkpnfpwkiz'
}
});
const db = mysql.createConnection({
host: 'lfbn-cle-1-568-58.w92-157.abo.wanadoo.fr',
user: 'crmuser',
@ -360,4 +373,27 @@ app.get('/Event/:iduser', (req, res) => {
console.log(result);
res.send(result);
});
});
app.post('/Mail/Avertir', (req, res) => {
// Définir les options du mail
let form = req.body;
console.log(form)
let mailOptions = {
from: '"JTT CRM" <JTT@CRM.fr>',
to: 'Jeremy.DUCOURTHIALE@etu.uca.fr',
subject: form.objet,
text: form.raison
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
res.send(false)
} else {
console.log('Email sent: ' + info.response);
res.send(true)
}
});
});

@ -21,6 +21,7 @@
"fullcalendar": "^5.11.3",
"googleapis": "^105.0.0",
"mysql": "^2.18.1",
"nodemailer": "^6.8.0",
"parser": "^0.1.4"
},
"devDependencies": {
@ -2286,6 +2287,14 @@
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
"peer": true
},
"node_modules/nodemailer": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz",
"integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/nodemon": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
@ -4636,6 +4645,11 @@
"integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
"peer": true
},
"nodemailer": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz",
"integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ=="
},
"nodemon": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",

@ -21,6 +21,7 @@
"fullcalendar": "^5.11.3",
"googleapis": "^105.0.0",
"mysql": "^2.18.1",
"nodemailer": "^6.8.0",
"parser": "^0.1.4"
},
"description": "",

@ -13,6 +13,7 @@ import Calendrier from './pages/Calendrier';
import Repertoire from './pages/Repertoire';
import Parametres from './pages/Parametres';
import Chargement from './pages/Chargement';
import MailPourAdmin from './pages/MailPourAdmin';
import AddContact from './components/Contact/AddContact'
import { Component } from 'fullcalendar';
import RestartPassword from './pages/RestartPassword';
@ -41,6 +42,7 @@ const App = () => {
<Route path="/Repertoire" element={<Repertoire />} />
<Route path="/Parametres" element={<Parametres />} />
<Route path="/Chargement" element={<Chargement />} />
<Route path="/MailPourAdmin" element={<MailPourAdmin />} />
<Route path="/Repertoire/add" element={<AddContact />} />
</Routes>
</BrowserRouter>

@ -0,0 +1,99 @@
import React, {useState} from 'react';
import NavigationDashboard from '../components/NavigationDashboard';
import axios from 'axios';
import Session from 'react-session-api';
import { useNavigate } from 'react-router-dom';
const api = axios.create({
baseURL: 'http://localhost:8080'
})
const MailPourAdmin = () => {
const [mailError, setMailError] = useState(false);
const [objetError, setObjetError] = useState(false);
const [descriptionError, setDescriptionError] = useState(false);
const [theme, setTheme] = useState("light");
const navigate = useNavigate();
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
function sendMail(e) {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const values = Object.fromEntries(formData.entries());
console.log(values);
if (values.objet === '') {
setObjetError(true)
} else {
setObjetError(false)
}
if (values.raison === '') {
setDescriptionError(true)
} else {
setDescriptionError(false)
}
if (values.objet === '' || values.raison === '') {
return
}
values.objet = values.objet + "[user id : " + Session.get("idUser") + "]"
api.post('/Mail/Avertir',values).then (function(response) {
if (response.data) {
navigate('/dashboard')
}
else {
setMailError(true)
// e.reset();
}
});
}
return (
<body className={theme}>
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
<div className="page_mailAdmin">
<div className="haut_de_page">
<h2 className="titre">Avertir un administrateur</h2>
<div className="rechLogo">
<img className="logo" srcSet="./LogoApp.svg" />
</div>
</div>
<div className="bas_de_page">
<NavigationDashboard />
<form className="form" onSubmit={sendMail}>
<div className="Mail">
<div className="object">
<p className="name">Objet</p>
<input name="objet" type="text" placeholder="Objet de l'alerte" />
</div>
<div className="value">
<p className="name">Raison</p>
<textarea name="raison" placeholder="Raison de l'alerte" rows="10" cols="180" />
</div>
<p>{mailError === true?"Le mail n'a pas pu être envoyé":''}</p>
<p>{objetError === true?"L'objet est obligatoire":''}</p>
<p>{descriptionError === true?"La description est obligatoire":''}</p>
<div className="submit">
<button className="button" type="submit">
Envoyer
</button>
</div>
</div>
</form>
</div>
</div>
</body>
);
};
export default MailPourAdmin;

@ -37,7 +37,9 @@ const Parametre = () => {
<div className="one_milieu">
<p className="text_one_milieu">Signaler un problème</p>
<div className='bouton_submit'>
<button className="bouton_signalerPB" type="submit">Signaler</button>
<NavLink to="/MailPourAdmin">
<button className="bouton_signalerPB" >Signaler</button>
</NavLink>
</div>
</div>
<div className="one_bas">

@ -0,0 +1,201 @@
body {
.page_mailAdmin {
display: flex;
flex-direction: column;
justify-content: space-evenly;
width: auto;
height: 100vh;
.haut_de_page {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 50px;
width: auto;
height: 10%;
align-items: center;
margin: 10px 10px 5px 10px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.titre {
font-size: 40px;
}
.rechLogo {
display: flex;
flex-direction: row;
justify-content: space-between;
.logo {
display: flex;
width: 100px;
height: 100px;
}
}
}
.bas_de_page {
display: flex;
flex-direction: row;
justify-content: space-between;
width: auto;
height: 86%;
.nav_bar_verticale {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 5%;
margin: 5px 5px 10px 10px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.parti_one {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: 100%;
height: 18%;
}
.parti_two {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
height: 35%;
}
.parti_three {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
margin-top: 15px;
width: 100%;
height: 18%;
}
.parti_four {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: 100%;
height: 18%;
}
.button {
display: flex;
object-fit: cover;
background-color: transparent;
border: none;
cursor: pointer;
.logo_nav_bar{
display: flex;
margin: 10px;
height: 50px;
width: 50px;
}
}
}
.Mail {
display: flex;
flex-direction: column;
justify-content: space-evenly;
width: 94.3%;
height: auto;
margin: 5px 10px 10px 5px;
background: rgba(255, 255, 255, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.object {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin: 13px;
width: auto;
height: 40%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.input {
margin: 13px;
width: 65%;
}
}
.value {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin-left: 13px;
margin-right: 13px;
width: auto;
height: 40%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.textArea {
resize: none;
margin: 13px;
}
}
.submit {
display: flex;
flex-direction: column;
justify-content: space-evenly;
margin: 13px;
width: auto;
height: 15%;
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px);
.button {
width: 20%;
margin: 13px;
}
}
}
}
}
}

@ -8,4 +8,5 @@
@import "./components/parametre";
@import "./components/repertoire";
@import "./components/chargement";
@import "./components/contact/addContact";
@import "./components/contact/addContact";;
@import "./components/mailPourAdmin";
Loading…
Cancel
Save