Clément VERDOIRE 3 years ago
commit 575d3f7c21

@ -0,0 +1,6 @@
projectKey=jtt_crm
serverUrl=https://codefirst.iut.uca.fr/sonar
serverVersion=9.6.1.59531
dashboardUrl=https://codefirst.iut.uca.fr/sonar/dashboard?id=jtt_crm
ceTaskId=AYSvDEjizKKB0GF_0uUi
ceTaskUrl=https://codefirst.iut.uca.fr/sonar/api/ce/task?id=AYSvDEjizKKB0GF_0uUi

@ -0,0 +1,18 @@
{
"configurations": [
{
"name": "macos-clang-arm64",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "${default}",
"cppStandard": "${default}",
"intelliSenseMode": "macos-clang-arm64",
"compilerArgs": [
""
]
}
],
"version": 4
}

@ -0,0 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Runner: Debug Session",
"type": "lldb",
"request": "launch",
"args": [],
"cwd": "/Users/malanone/JTT_Production/JTT_CrM",
"program": "/Users/malanone/JTT_Production/JTT_CrM/build/Debug/outDebug"
}
]
}

@ -0,0 +1,36 @@
{
"C_Cpp_Runner.cCompilerPath": "clang",
"C_Cpp_Runner.cppCompilerPath": "clang++",
"C_Cpp_Runner.debuggerPath": "lldb",
"C_Cpp_Runner.cStandard": "",
"C_Cpp_Runner.cppStandard": "",
"C_Cpp_Runner.msvcBatchPath": "",
"C_Cpp_Runner.useMsvc": false,
"C_Cpp_Runner.warnings": [
"-Wall",
"-Wextra",
"-Wpedantic",
"-Wshadow",
"-Wformat=2",
"-Wconversion",
"-Wnull-dereference",
"-Wsign-conversion"
],
"C_Cpp_Runner.enableWarnings": true,
"C_Cpp_Runner.warningsAsError": false,
"C_Cpp_Runner.compilerArgs": [],
"C_Cpp_Runner.linkerArgs": [],
"C_Cpp_Runner.includePaths": [],
"C_Cpp_Runner.includeSearch": [
"*",
"**/*"
],
"C_Cpp_Runner.excludeSearch": [
"**/build",
"**/build/**",
"**/.*",
"**/.*/**",
"**/.vscode",
"**/.vscode/**"
]
}

@ -287,6 +287,41 @@ app.get('/Contact/AllWithCustomerName', (req, res) => {
});
});
app.get('/Entreprise/All', (req, res) => {
let sql = 'SELECT idcustomer,name FROM customers ORDER BY name';
db.query(sql, (err, result) => {
if (err) throw err;
console.log(result);
res.send(result);
});
});
app.get('/Contact/Exist/:phone', (req, res) => {
const phone = req.params.phone
let sql = 'SELECT idcontact FROM contacts WHERE phone = ?';
db.query(sql, [phone], (err, result) => {
if (err) throw err;
console.log(result);
res.send(result);
});
});
app.post('/Contact/Add', (req, res) => {
let form = req.body;
console.log("on est dans le form",form);
const sql = `INSERT INTO contacts(firstname,lastname, mail, phone, iduser, idcustomer) VALUES ('${form.firstname}', '${form.lastname}', '${form.mail}', '${form.phone}', '${form.iduser}', '${form.idcustomer}' )`;
db.query(sql , (err, result) => {
if (err) throw err;
console.log(result);
res.send('Post added...' + result.insertId);
});
});
app.get('/Contact/:iduser', (req, res) => {
const iduser = req.params.iduser;
@ -303,7 +338,7 @@ app.post('/Event/Add', (req, res) => {
let form = req.body;
console.log(form);
console.log("on est dans le form d'un event ",form);
const sql = `INSERT INTO events(date,starttime,endtime,comment,idusersend,iduserreceive,idcontact) VALUES ('${form.date}', '${form.starttime}', '${form.endtime}', '${form.comment}', '${form.idusersend}', '${form.iduserreceive}', '${form.idcontact}')`;
db.query(sql , (err, result) => {
@ -317,7 +352,7 @@ app.get('/Event/:iduser', (req, res) => {
const iduser = req.params.iduser;
let sql = 'SELECT * FROM events e where e.iduserreceive = ?';
let sql = 'SELECT e.date,e.starttime,e.endtime,e.comment FROM events e where e.iduserreceive = ?';
db.query(sql,[iduser], (err, result) => {
if (err) throw err;
@ -325,4 +360,4 @@ app.get('/Event/:iduser', (req, res) => {
console.log(result);
res.send(result);
});
});
});

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

@ -1,42 +1,97 @@
import React, {useState} from 'react'
import {useNavigate} from 'react-router-dom';
import React, { useState, useEffect } from 'react';
import axios from 'axios'
import NavigationDashboard from '../NavigationDashboard.js';
import CryptoJS from 'crypto-js';
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";
import { Button } from '@mui/material';
import Session from 'react-session-api';
// HERE ABOVE useHistory IS REPLACED WITH useNavigate
function AddContact(props) {
const navigate=useNavigate();
const [User, setUser] = useState({name:"", email:""});
let add = (e) => {
e.preventDefault();
if(User.name === "" || User.email === ""){
alert("All fields are mandatory!!!");
return
}
// THIS IS USED TO SHOW THE LIST DATA ON THE APP.JS FILE
props.addContactHandler(User);
// THIS IS USED FOR WHEN THE ADD BUTTON IS PRESSED THE INPUT FILED AGAIN GETS EMPTY
setUser({name:"", email:""});
//console.log(props);
navigate('/');
}
const api = axios.create({
baseURL: 'http://localhost:8080'
})
function AddContact() {
const [loginError, setLoginError] = useState(false);
const [entreprises, setEntreprises] = useState([]);
const [selectedIdEntreprise, setSelectedIdEntreprise] = useState(1);
const navigate = useNavigate();
useEffect(() => {
api.get('/Entreprise/All').then((response) => {
setEntreprises(response.data);
});
}, []);
function handleChangeEntreprise(event) {
setSelectedIdEntreprise(event.target.value);
console.log("je suis dans handleChangeEntreprise");
};
function checkAdd(event) {
event.preventDefault();
const formData = new FormData(event.currentTarget);
const values = Object.fromEntries(formData.entries());
api.get('/Contact/Exist/' + values.phone).then((response) => {
const login = response.data;
if (login.length > 0) {
setLoginError(true);
}
else {
setLoginError(false);
const newContact = { firstname: values.firstname, lastname: values.lastname, phone: values.phone, mail: values.mail, iduser: Session.get('idUser'), idcustomer: selectedIdEntreprise };
api.post('/Contact/Add', newContact).then(function (response) {
console.log(response.data);
});
navigate("/Repertoire");
}
});
};
return (
<div className='ui main'>
<h2>Add Contact</h2>
<form className='ui form' onSubmit={add}>
<div className='field'>
<label>Name</label>
<input type="text" name="Name" placeholder='Name' value={User.name} onChange={e => setUser({...User, name: e.target.value})}/>
</div>
<div className='field'>
<label>Email</label>
<input type="text" name="Email" placeholder='Email' value={User.email} onChange={e => setUser({...User, email: e.target.value})}/>
</div>
<button className='ui secondary button'>Add</button>
</form>
<div className='addContactPage'>
<h2>Ajouter un nouveau contact</h2>
<div className="Formulaire">
<form className="form" onSubmit={checkAdd}>
<table className="Formulaire_de_connexion">
<tr>
<div className="texte_côté">
<p>Nom :</p>
<p>Prénom :</p>
<p>Téléphone :</p>
<p>Email :</p>
<p>Entreprise :</p>
</div>
</tr>
<tr>
<input id="nom" name='firstname' className="texte_zone" type="text" placeholder="Nom..." required />
<input id="prenom" name='lastname' className="texte_zone" type="text" placeholder="Prénom..." required />
<input id="phone" name='phone' className="texte_zone" type="tel"
placeholder="Téléphone..." pattern="[0-9]{10}" required />
<input id="email" name='mail' className="texte_zone" type="email" placeholder="Email..." required />
<Select name='idcustomer' value={selectedIdEntreprise} onChange={handleChangeEntreprise}>
{entreprises.map(entreprise => (<MenuItem value={entreprise.idcustomer}>{entreprise.name}</MenuItem>))}
</Select>
</tr>
</table>
<p>{loginError === true ? "Le contact existe déja" : ''}</p>
<div className="bouton_submit">
<button className="bouton_val" type="submit">Valider</button>
<NavLink className="bouton_ann" to="/Repertoire">Retour</NavLink>
</div>
</form>
</div>
</div>
)
}
export default AddContact
export default AddContact;

@ -1,11 +0,0 @@
import React from 'react';
const Menu = () => {
return (
<div>
</div>
);
};
export default Menu;

@ -28,6 +28,7 @@ function Admin_create() {
function handleChangeRole(event){
setSelectedIdRole(event.target.value);
console.log(event.target.value);
};
function checkAdd(event){

@ -132,7 +132,6 @@ const Analyse = () => {
for(let i = 0; i < lineDatas.length; i++)
{
console.log(lineDatas);
dataH.labels[i] = lineDatas[i].month +"/" +lineDatas[i].year;
dataH.datasets[0].data[i] = lineDatas[i].total;
}

@ -32,40 +32,37 @@ const localizer = dateFnsLocalizer({
function Calendrier(){
const [contacts, setContacts] = useState([]);
const [events, setEvents] = useState([]);
const [selectedContact, setSelectedContact] = useState(1);
const [allEvents, setAllEvents] = useState([]);
useEffect(() =>{
const apiString = '/Contact/' + Session.get("idUser");
api.get(apiString).then((response) => {
setContacts(response.data);
useEffect(() =>{
const apiString = '/Contact/' + Session.get("idUser");
api.get(apiString).then((response) => {
setContacts(response.data);
setSelectedContact(response.data[0].idcontact)
});
const apiStringEvent = '/Event/' + Session.get("idUser");
api.get(apiStringEvent).then((response) => {
setEvents(response.data);
});
});
events.forEach(event => {
const newEvent = { title: event.comment, start: new Date(event.date+" "+event.starttime), end: new Date(event.date+" "+event.endtime) };
setAllEvents([...allEvents, newEvent]);
console.log("here");
});
}, []);
const apiStringEvent = '/Event/' + Session.get("idUser");
api.get(apiStringEvent).then((response) => {
setAllEvents([]);
response.data.forEach(event => {
const newEvent = { title: event.comment, start: new Date(event.date+" "+event.starttime), end: new Date(event.date+" "+event.endtime) };
setAllEvents(allEvents => [...allEvents, newEvent]);
});
});
}, []);
const [theme, setTheme] = useState("light");
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
const [titre, setTitre] = useState("");
const [jour , setJour] = useState(new Date());
const [heureDebut, setHeureDebut] = useState(new Date());
const [heureFin, setHeureFin] = useState(new Date());
const [allEvents, setAllEvents] = useState(events);
function handleAddEvent() {
const newEvent = { title: titre, start: new Date(jour+" "+heureDebut), end: new Date(jour+" "+heureFin) };
const newEventBD = { date: jour,starttime: heureDebut,endtime: heureFin,comment: titre, idusersend: Session.get("idUser"),iduserreceive: Session.get("idUser"), idcontact: selectedContact};

@ -4,7 +4,9 @@ import axios from 'axios';
import user from '../images/user.jpg';
import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell } from '@mui/material';
import { Paper } from '@mui/material';
import { NavLink } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import Session from 'react-session-api';
const api = axios.create({
baseURL: 'http://localhost:8080'
@ -12,7 +14,7 @@ const api = axios.create({
function Repertoire() {
const [theme, setTheme] = useState("light");
const [theme, setTheme] = useState("light");
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
@ -21,11 +23,13 @@ function Repertoire() {
const [SearchTerm, setSearchTerm] = useState("");
const [SearchResults, setSearchResults] = useState([]);
const [customers, setCustomers] = useState([]);
useEffect(() => {
api.get('/Contact/AllWithCustomerName').then((response) => {
const apiString = '/Contact/' + Session.get("idUser");
api.get(apiString).then((response) => {
setContacts(response.data);
console.log("response.data", response.data);
setSearchTerm(response.data[0].idcontact);
});
}, []);
@ -56,7 +60,9 @@ function Repertoire() {
<i class="uil uil-search search-icon"></i>
</span>
</div>
<button className="boutonAddContact">Ajouter</button>
<NavLink to="/Repertoire/add">
<button className="boutonAddContact">Ajouter</button>
</NavLink>
</span>
<TableContainer component={Paper} className="tabListContact">
<Table>
@ -113,6 +119,44 @@ function Repertoire() {
);
};
function AddContact(props) {
const navigate = useNavigate();
const [User, setUser] = useState({ name: "", email: "" });
let add = (e) => {
e.preventDefault();
if (User.name === "" || User.email === "") {
alert("All fields are mandatory!!!");
return
}
// THIS IS USED TO SHOW THE LIST DATA ON THE APP.JS FILE
props.addContactHandler(User);
// THIS IS USED FOR WHEN THE ADD BUTTON IS PRESSED THE INPUT FILED AGAIN GETS EMPTY
setUser({ name: "", email: "" });
//console.log(props);
navigate('/');
}
return (
<div className='ui main'>
<h2>Add Contact</h2>
<form className='ui form' onSubmit={add}>
<div className='field'>
<label>Name</label>
<input type="text" name="Name" placeholder='Name' value={User.name} onChange={e => setUser({ ...User, name: e.target.value })} />
</div>
<div className='field'>
<label>Email</label>
<input type="text" name="Email" placeholder='Email' value={User.email} onChange={e => setUser({ ...User, email: e.target.value })} />
</div>
<button className='ui secondary button'>Add</button>
</form>
</div>
);
};
// function Repertoire() {
// // NOW WITH THE USE OF HOOKS WE WILL GET THE CONTACTS

@ -171,6 +171,8 @@ body {
width: 100%;
justify-content: space-between;
.boutonAddContact {
display: flex;
justify-content: center;
@ -180,6 +182,7 @@ body {
margin: 30px 30px;
border-radius: 25px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
text-decoration-line: none;
}
.input_box {

@ -0,0 +1,8 @@
.addContactPage{
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}

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