Théo DUPIN 3 years ago
commit 702b51af12

Binary file not shown.

@ -0,0 +1,9 @@
{
"ExpandedNodes": [
"",
"\\src",
"\\src\\components"
],
"SelectedNode": "\\src\\components\\Menu.js",
"PreviewInSolutionExplorer": false
}

Binary file not shown.

@ -0,0 +1,12 @@
cd server-api
npm install --save body-parser
npm install --save cors
npm install --save mysql
npm install --save express
npm install -g nodemon
npm install --save-dev nodemon
npm install --save axios
npm install @mui/material @emotion/react @emotion/styled

@ -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) [![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) [![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) [![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) [![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)

224
package-lock.json generated

@ -15,12 +15,12 @@
"@fullcalendar/list": "^5.11.3", "@fullcalendar/list": "^5.11.3",
"@fullcalendar/react": "^5.11.2", "@fullcalendar/react": "^5.11.2",
"@fullcalendar/timegrid": "^5.11.3", "@fullcalendar/timegrid": "^5.11.3",
"@mui/material": "^5.10.13", "@mui/material": "^5.10.15",
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0", "@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
"addeventlistener": "^2.0.0", "addeventlistener": "^2.0.0",
"axios": "^1.1.3", "axios": "^1.2.0",
"chart": "^0.1.2", "chart": "^0.1.2",
"chart.js": "^3.9.1", "chart.js": "^3.9.1",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
@ -1813,11 +1813,11 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.19.0", "version": "7.20.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
"dependencies": { "dependencies": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.10"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -3234,14 +3234,14 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
}, },
"node_modules/@mui/base": { "node_modules/@mui/base": {
"version": "5.0.0-alpha.105", "version": "5.0.0-alpha.107",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.105.tgz", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.107.tgz",
"integrity": "sha512-4IPBcJQIgVVXQvN6DQMoCHed52GBtwSqYs0jD0dDcMR3o76AodQtpEeWFz3p7mJoc6f/IHBl9U6jEfL1r/kM4g==", "integrity": "sha512-HX/BD8CSe+Y/dpbZ5aKJScJhKQ/Hw6du2yd68Upv2cO67bwixyZ64h3aNcdDu7RQzI7nrZQm0JykffP1Orgq0g==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@emotion/is-prop-valid": "^1.2.0", "@emotion/is-prop-valid": "^1.2.0",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"@popperjs/core": "^2.11.6", "@popperjs/core": "^2.11.6",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@ -3271,25 +3271,25 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
}, },
"node_modules/@mui/core-downloads-tracker": { "node_modules/@mui/core-downloads-tracker": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.15.tgz",
"integrity": "sha512-zWkWPV/SaNdsIdxAWiuVGZ+Ue3BkfSIlU/BFIrJmuUcwiIa7gQsbI/DOpj1KzLvqZhdEe2wC1aG4nCHfzgc1Hg==", "integrity": "sha512-xFcS0LpdF0Q1qJrrNsYUv9PU+ovvhCEPTOMw2jcpEFtl3CA87dLpvztORR5oE2UBFjWF7qLQLOwboQU1+xC7Cw==",
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/mui" "url": "https://opencollective.com/mui"
} }
}, },
"node_modules/@mui/material": { "node_modules/@mui/material": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.15.tgz",
"integrity": "sha512-TkkT1rNc0/hhL4/+zv4gYcA6egNWBH/1Tz+azoTnQIUdZ32fgwFI2pFX2KVJNTt30xnLznxDWtTv7ilmJQ52xw==", "integrity": "sha512-OqoHfUtVMppFHgk2M95j+pR8MWfLKhzSdz4aKEfIpFrHIHbYang+oY7Iy/exX+vqpZSEGHgHQ0cGX0hGTGx9cg==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/base": "5.0.0-alpha.105", "@mui/base": "5.0.0-alpha.107",
"@mui/core-downloads-tracker": "^5.10.13", "@mui/core-downloads-tracker": "^5.10.15",
"@mui/system": "^5.10.13", "@mui/system": "^5.10.15",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"@types/react-transition-group": "^4.4.5", "@types/react-transition-group": "^4.4.5",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"csstype": "^3.1.1", "csstype": "^3.1.1",
@ -3329,12 +3329,12 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
}, },
"node_modules/@mui/private-theming": { "node_modules/@mui/private-theming": {
"version": "5.10.9", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.9.tgz", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.15.tgz",
"integrity": "sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg==", "integrity": "sha512-l7CsUj5kYdYz118/JHSvZZTYE9WnIWwln0td5jYATnYw9cNX4ygD6AkKOUYZ1Jitp1YLJqcO8jCP9E5/Nql9IQ==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
}, },
"engines": { "engines": {
@ -3355,12 +3355,12 @@
} }
}, },
"node_modules/@mui/styled-engine": { "node_modules/@mui/styled-engine": {
"version": "5.10.8", "version": "5.10.14",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.8.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.14.tgz",
"integrity": "sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw==", "integrity": "sha512-bgKdM57ExogWpIfhL/ngSlzF4FhbH00vYF+Y5VALTob4uslFqje0xzoWmbfcCn4cZt2NXxZJIwhsq4vzo5itlw==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@emotion/cache": "^11.10.3", "@emotion/cache": "^11.10.5",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
}, },
@ -3386,15 +3386,15 @@
} }
}, },
"node_modules/@mui/system": { "node_modules/@mui/system": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.15.tgz",
"integrity": "sha512-Xzx26Asu5fVlm0ucm+gnJmeX4Y1isrpVDvqxX4yJaOT7Fzmd8Lfq9ih3QMfZajns5LMtUiOuCQlVFRtUG5IY7A==", "integrity": "sha512-WZmgmpYTMXAaD++QetaaM/miwhNh1JJY1dH7MJH/3Fuv3r3gnhfzE6A55lDqWxkQmlWUO2DCn/cnNZ0FkSdZUg==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/private-theming": "^5.10.9", "@mui/private-theming": "^5.10.15",
"@mui/styled-engine": "^5.10.8", "@mui/styled-engine": "^5.10.14",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
@ -3425,9 +3425,9 @@
} }
}, },
"node_modules/@mui/types": { "node_modules/@mui/types": {
"version": "7.2.0", "version": "7.2.1",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.1.tgz",
"integrity": "sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==", "integrity": "sha512-c5mSM7ivD8EsqK6HUi9hQPr5V7TJ/IRThUQ9nWNYPdhCGriTSQV4vL6DflT99LkM+wLiIS1rVjphpEWxERep7A==",
"peerDependencies": { "peerDependencies": {
"@types/react": "*" "@types/react": "*"
}, },
@ -3438,11 +3438,11 @@
} }
}, },
"node_modules/@mui/utils": { "node_modules/@mui/utils": {
"version": "5.10.9", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.9.tgz", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.15.tgz",
"integrity": "sha512-2tdHWrq3+WCy+G6TIIaFx3cg7PorXZ71P375ExuX61od1NOAJP1mK90VxQ8N4aqnj2vmO3AQDkV4oV2Ktvt4bA==", "integrity": "sha512-6AW4MLBUijJi31hxx+6utTJM2q/4hbO+QiMdtwM+f4Iy+BfFnh/elhb08apxNYLfuugPnXXpkDmzEjg+8uDU9g==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@types/prop-types": "^15.7.5", "@types/prop-types": "^15.7.5",
"@types/react-is": "^16.7.1 || ^17.0.0", "@types/react-is": "^16.7.1 || ^17.0.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@ -5490,9 +5490,9 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.1.3", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
"integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.0", "follow-redirects": "^1.15.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
@ -15205,9 +15205,9 @@
} }
}, },
"node_modules/regenerator-runtime": { "node_modules/regenerator-runtime": {
"version": "0.13.9", "version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
}, },
"node_modules/regenerator-transform": { "node_modules/regenerator-transform": {
"version": "0.15.0", "version": "0.15.0",
@ -19105,11 +19105,11 @@
} }
}, },
"@babel/runtime": { "@babel/runtime": {
"version": "7.19.0", "version": "7.20.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
"integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
"requires": { "requires": {
"regenerator-runtime": "^0.13.4" "regenerator-runtime": "^0.13.10"
} }
}, },
"@babel/runtime-corejs3": { "@babel/runtime-corejs3": {
@ -20102,14 +20102,14 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
}, },
"@mui/base": { "@mui/base": {
"version": "5.0.0-alpha.105", "version": "5.0.0-alpha.107",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.105.tgz", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.107.tgz",
"integrity": "sha512-4IPBcJQIgVVXQvN6DQMoCHed52GBtwSqYs0jD0dDcMR3o76AodQtpEeWFz3p7mJoc6f/IHBl9U6jEfL1r/kM4g==", "integrity": "sha512-HX/BD8CSe+Y/dpbZ5aKJScJhKQ/Hw6du2yd68Upv2cO67bwixyZ64h3aNcdDu7RQzI7nrZQm0JykffP1Orgq0g==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@emotion/is-prop-valid": "^1.2.0", "@emotion/is-prop-valid": "^1.2.0",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"@popperjs/core": "^2.11.6", "@popperjs/core": "^2.11.6",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@ -20124,21 +20124,21 @@
} }
}, },
"@mui/core-downloads-tracker": { "@mui/core-downloads-tracker": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.15.tgz",
"integrity": "sha512-zWkWPV/SaNdsIdxAWiuVGZ+Ue3BkfSIlU/BFIrJmuUcwiIa7gQsbI/DOpj1KzLvqZhdEe2wC1aG4nCHfzgc1Hg==" "integrity": "sha512-xFcS0LpdF0Q1qJrrNsYUv9PU+ovvhCEPTOMw2jcpEFtl3CA87dLpvztORR5oE2UBFjWF7qLQLOwboQU1+xC7Cw=="
}, },
"@mui/material": { "@mui/material": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.15.tgz",
"integrity": "sha512-TkkT1rNc0/hhL4/+zv4gYcA6egNWBH/1Tz+azoTnQIUdZ32fgwFI2pFX2KVJNTt30xnLznxDWtTv7ilmJQ52xw==", "integrity": "sha512-OqoHfUtVMppFHgk2M95j+pR8MWfLKhzSdz4aKEfIpFrHIHbYang+oY7Iy/exX+vqpZSEGHgHQ0cGX0hGTGx9cg==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/base": "5.0.0-alpha.105", "@mui/base": "5.0.0-alpha.107",
"@mui/core-downloads-tracker": "^5.10.13", "@mui/core-downloads-tracker": "^5.10.15",
"@mui/system": "^5.10.13", "@mui/system": "^5.10.15",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"@types/react-transition-group": "^4.4.5", "@types/react-transition-group": "^4.4.5",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"csstype": "^3.1.1", "csstype": "^3.1.1",
@ -20155,53 +20155,53 @@
} }
}, },
"@mui/private-theming": { "@mui/private-theming": {
"version": "5.10.9", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.9.tgz", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.15.tgz",
"integrity": "sha512-BN7/CnsVPVyBaQpDTij4uV2xGYHHHhOgpdxeYLlIu+TqnsVM7wUeF+37kXvHovxM6xmL5qoaVUD98gDC0IZnHg==", "integrity": "sha512-l7CsUj5kYdYz118/JHSvZZTYE9WnIWwln0td5jYATnYw9cNX4ygD6AkKOUYZ1Jitp1YLJqcO8jCP9E5/Nql9IQ==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
} }
}, },
"@mui/styled-engine": { "@mui/styled-engine": {
"version": "5.10.8", "version": "5.10.14",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.8.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.14.tgz",
"integrity": "sha512-w+y8WI18EJV6zM/q41ug19cE70JTeO6sWFsQ7tgePQFpy6ToCVPh0YLrtqxUZXSoMStW5FMw0t9fHTFAqPbngw==", "integrity": "sha512-bgKdM57ExogWpIfhL/ngSlzF4FhbH00vYF+Y5VALTob4uslFqje0xzoWmbfcCn4cZt2NXxZJIwhsq4vzo5itlw==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@emotion/cache": "^11.10.3", "@emotion/cache": "^11.10.5",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
} }
}, },
"@mui/system": { "@mui/system": {
"version": "5.10.13", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.13.tgz", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.15.tgz",
"integrity": "sha512-Xzx26Asu5fVlm0ucm+gnJmeX4Y1isrpVDvqxX4yJaOT7Fzmd8Lfq9ih3QMfZajns5LMtUiOuCQlVFRtUG5IY7A==", "integrity": "sha512-WZmgmpYTMXAaD++QetaaM/miwhNh1JJY1dH7MJH/3Fuv3r3gnhfzE6A55lDqWxkQmlWUO2DCn/cnNZ0FkSdZUg==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@mui/private-theming": "^5.10.9", "@mui/private-theming": "^5.10.15",
"@mui/styled-engine": "^5.10.8", "@mui/styled-engine": "^5.10.14",
"@mui/types": "^7.2.0", "@mui/types": "^7.2.1",
"@mui/utils": "^5.10.9", "@mui/utils": "^5.10.15",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"csstype": "^3.1.1", "csstype": "^3.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
} }
}, },
"@mui/types": { "@mui/types": {
"version": "7.2.0", "version": "7.2.1",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.0.tgz", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.1.tgz",
"integrity": "sha512-lGXtFKe5lp3UxTBGqKI1l7G8sE2xBik8qCfrLHD5olwP/YU0/ReWoWT7Lp1//ri32dK39oPMrJN8TgbkCSbsNA==", "integrity": "sha512-c5mSM7ivD8EsqK6HUi9hQPr5V7TJ/IRThUQ9nWNYPdhCGriTSQV4vL6DflT99LkM+wLiIS1rVjphpEWxERep7A==",
"requires": {} "requires": {}
}, },
"@mui/utils": { "@mui/utils": {
"version": "5.10.9", "version": "5.10.15",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.9.tgz", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.15.tgz",
"integrity": "sha512-2tdHWrq3+WCy+G6TIIaFx3cg7PorXZ71P375ExuX61od1NOAJP1mK90VxQ8N4aqnj2vmO3AQDkV4oV2Ktvt4bA==", "integrity": "sha512-6AW4MLBUijJi31hxx+6utTJM2q/4hbO+QiMdtwM+f4Iy+BfFnh/elhb08apxNYLfuugPnXXpkDmzEjg+8uDU9g==",
"requires": { "requires": {
"@babel/runtime": "^7.19.0", "@babel/runtime": "^7.20.1",
"@types/prop-types": "^15.7.5", "@types/prop-types": "^15.7.5",
"@types/react-is": "^16.7.1 || ^17.0.0", "@types/react-is": "^16.7.1 || ^17.0.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
@ -21711,9 +21711,9 @@
"integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==" "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w=="
}, },
"axios": { "axios": {
"version": "1.1.3", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
"integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", "integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
"requires": { "requires": {
"follow-redirects": "^1.15.0", "follow-redirects": "^1.15.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
@ -28595,9 +28595,9 @@
} }
}, },
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.13.9", "version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
}, },
"regenerator-transform": { "regenerator-transform": {
"version": "0.15.0", "version": "0.15.0",

@ -10,12 +10,12 @@
"@fullcalendar/list": "^5.11.3", "@fullcalendar/list": "^5.11.3",
"@fullcalendar/react": "^5.11.2", "@fullcalendar/react": "^5.11.2",
"@fullcalendar/timegrid": "^5.11.3", "@fullcalendar/timegrid": "^5.11.3",
"@mui/material": "^5.10.13", "@mui/material": "^5.10.15",
"@testing-library/jest-dom": "^5.16.5", "@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0", "@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0", "@testing-library/user-event": "^13.5.0",
"addeventlistener": "^2.0.0", "addeventlistener": "^2.0.0",
"axios": "^1.1.3", "axios": "^1.2.0",
"chart": "^0.1.2", "chart": "^0.1.2",
"chart.js": "^3.9.1", "chart.js": "^3.9.1",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",

@ -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) => { app.get('/User/Role/:login', (req, res) => {
const login = req.params.login; const login = req.params.login;
@ -155,18 +169,45 @@ app.put('/User/Update/:id', (req, res) => {
const id = req.params.id; const id = req.params.id;
let form = req.body; let form = req.body;
const sql = `UPDATE users SET lastname = ?, firstname = ?, idrole = ?, login = ?, password = ?, phone = ?, mail = ? WHERE (iduser = ?)`; 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.password, form.phone, form.mail, id], (err, result) => { 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; if (err) throw err;
console.log(result); console.log(result);
res.send('Post added...'); res.send('Post delete...');
}); });
}); });
//Api pour les contacts de la page repertoire //Api pour les contacts de la page repertoire
app.get('/Contact/All', (req, res) => { app.get('/Contact/AllWithCustomerName', (req, res) => {
let sql = 'SELECT * FROM contacts ORDER BY idcontact'; let sql = 'SELECT c.*, cu.name FROM contacts c, customers cu WHERE cu.idCustomer = c.idCustomer ORDER BY idcontact';
db.query(sql, (err, result) => { db.query(sql, (err, result) => {
if (err) throw err; if (err) throw err;
console.log(result); console.log(result);

@ -4,6 +4,7 @@ import Compte from './pages/Compte';
import Connexion from './pages/Connexion'; import Connexion from './pages/Connexion';
import Admin_modif from './pages/Admin_modif'; import Admin_modif from './pages/Admin_modif';
import Admin_supp from './pages/Admin_supp'; import Admin_supp from './pages/Admin_supp';
import Admin_devis from './pages/Admin_devis';
import Dashboard from './pages/Dashboard'; import Dashboard from './pages/Dashboard';
import Analyse from './pages/Analyse'; import Analyse from './pages/Analyse';
import Admin_list from './pages/Admin_list'; import Admin_list from './pages/Admin_list';
@ -13,6 +14,8 @@ import Repertoire from './pages/Repertoire';
import Parametres from './pages/Parametres'; import Parametres from './pages/Parametres';
import Chargement from './pages/Chargement'; import Chargement from './pages/Chargement';
import { Component } from 'fullcalendar'; import { Component } from 'fullcalendar';
import RestartPassword from './pages/RestartPassword';

@ -6,24 +6,25 @@ const NavigationAdmin = (props) => {
return ( return (
<div className="nav_bar_verticale"> <div className="nav_bar_verticale">
<img className="logo" srcSet="./LogoApp.svg"></img> <div className="logoCRM">
<NavLink className="create_user" to="/Admin_create"> <img className="logo" srcSet="./LogoApp.svg"></img>
<button id="bouton_créer" className="bouton" type="button" value="Créer un utilisateur" onClick={changeColor}>Créer utilisateur</button> </div>
</NavLink> <div className="BoutonNav">
<NavLink className="modify_user" to="/Admin_modif" state={{ iduser: props.iduser }}> <NavLink className="create_user" to="/Admin_create">
<button id="bouton_modif" className="bouton" type="button" value="Modifier un utilisateur" onClick={changeColor}>Modifier utilisateur</button> <button id="bouton_créer" className="bouton" type="button" value="Créer un utilisateur">Créer utilisateur</button>
</NavLink> </NavLink>
<NavLink className="delete_user" to="/Admin_supp"> <NavLink className="modify_user" to="/Admin_modif" state={{ iduser: props.iduser }}>
<button id="bouton_sup" className="bouton" type="button" value="Supprimer un utilisateur" onClick={changeColor}>Supprimer utilisateur</button> <button id="bouton_modif" className="bouton" type="button" value="Modifier un utilisateur">Modifier utilisateur</button>
</NavLink> </NavLink>
<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">
<button id="bouton_devis" className="bouton" type="button" value="Devis">Devis</button>
</NavLink>
</div>
</div> </div>
); );
}; };
function changeColor() {
let b1 = document.querySelector('button');
b1.style.backgroundColor = "rgb(170,170,170)";
}
export default NavigationAdmin; export default NavigationAdmin;

@ -36,7 +36,6 @@ function Admin_create() {
const formData = new FormData(event.currentTarget); const formData = new FormData(event.currentTarget);
const values = Object.fromEntries(formData.entries()); const values = Object.fromEntries(formData.entries());
{/* Verif value login exist déja */}
console.log(values.firstname); console.log(values.firstname);
api.get('/User/Exist/'+ values.login).then((response) => { api.get('/User/Exist/'+ values.login).then((response) => {
const login = response.data; const login = response.data;
@ -58,8 +57,7 @@ function Admin_create() {
return ( return (
<div className="page_admin"> <div className="page_admin">
{/*<NavigationAdmin />*/} <NavigationAdmin />
{/* Create a admin page */}
<div className="Titre_Formulaire"> <div className="Titre_Formulaire">
<p className="Titre">Admin</p> <p className="Titre">Admin</p>
<p className="Sous-titre">Création d'utilisateur</p> <p className="Sous-titre">Création d'utilisateur</p>

@ -0,0 +1,24 @@
import React, { useState, useEffect } from 'react';
import axios from 'axios'
import NavigationAdmin from '../components/NavigationAdmin.js';
import { TableContainer,Table,TableHead,TableBody,TableRow,TableCell } from '@mui/material';
import { Paper } from '@mui/material';
const api = axios.create({
baseURL: 'http://localhost:8080'
})
const Admin_devis = () => {
return (
<div className="page_admin">
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
<NavigationAdmin />
<div className="devis">
<p className="Titre">Devis</p>
</div>
</div>
);
};
export default Admin_devis;

@ -10,6 +10,11 @@ const api = axios.create({
function Admin_list() { function Admin_list() {
const [theme, setTheme] = useState("light");
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme"))
}
const [users, setUsers] = useState([]); const [users, setUsers] = useState([]);
const [selectedIdUser, setSelectedIdUser] = useState(); const [selectedIdUser, setSelectedIdUser] = useState();
@ -24,10 +29,10 @@ function Admin_list() {
setSelectedIdUser(iduser); setSelectedIdUser(iduser);
}; };
return ( return (
<div className="page_admin"> <body className="page_admin">
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link> <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}/> <NavigationAdmin iduser={selectedIdUser}/>
<div className="Titre_Formulaire_Rech"> <div className="Titre_Formulaire_Rech">
<p className="Titre">Admin</p> <p className="Titre">Admin</p>
@ -39,28 +44,6 @@ function Admin_list() {
<i class="uil uil-search search-icon"></i> <i class="uil uil-search search-icon"></i>
</span> </span>
</div> </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 }}> <TableContainer component={Paper} sx={{ maxHeight: 0.8 }}>
<Table aria-label="simple table" size="small" stickyHeader> <Table aria-label="simple table" size="small" stickyHeader>
<TableHead > <TableHead >
@ -94,7 +77,7 @@ function Admin_list() {
</TableContainer> </TableContainer>
</div> </div>
</div> </div>
</div> </body>
); );
}; };

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

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

@ -1,13 +1,18 @@
import { Component } from '@fullcalendar/core'; 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 NavigationDashboard from '../components/NavigationDashboard';
import img1 from '../img/logo_personEntouré.svg'; import img1 from '../img/logo_personEntouré.svg';
import axios from 'axios'
const api = axios.create({
baseURL: 'http://localhost:8080'
})
function Compte() { 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) { if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme")) setTheme(localStorage.getItem("theme"))
} }
@ -18,11 +23,8 @@ function Compte() {
setFile(URL.createObjectURL(e.target.files[0])); setFile(URL.createObjectURL(e.target.files[0]));
} }
const [modification, setModification] = useState(false);
const modificationHandler = () => { const modificationHandler = () => {
setModification((modification) => !modification) setModification((modification) => !modification)
console.log("modificationHandler")
console.log(modification) console.log(modification)
} }
@ -66,6 +68,7 @@ function Compte() {
<div className="name"> <div className="name">
<div className="presentationNom"> <div className="presentationNom">
<p id="texte" className="def">Nom Complet :</p> <p id="texte" className="def">Nom Complet :</p>
<p>{}</p>
<p id="texte" className="nom">Mateo Centeno</p> <p id="texte" className="nom">Mateo Centeno</p>
</div> </div>
<div className='bouton_submit'> <div className='bouton_submit'>

@ -1,26 +1,17 @@
import NavigationDashboard from '../components/NavigationDashboard'; import NavigationDashboard from '../components/NavigationDashboard';
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Switch, Route, Routes } from 'react-router-dom';
import { v4 as uuid } from 'uuid';
import Header from '../components/Contact/Header';
import AddContact from '../components/Contact/AddContact'
import ContactList from '../components/Contact/ContactList';
import ContactDetail from '../components/Contact/ContactDetail';
import EditContact from '../components/Contact/EditContact';
import axios from 'axios'; import axios from 'axios';
import user from '../images/user.jpg'; import user from '../images/user.jpg';
import { Link, useLocation } from 'react-router-dom';
import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell } from '@mui/material'; import { TableContainer, Table, TableHead, TableBody, TableRow, TableCell } from '@mui/material';
import { Paper } from '@mui/material'; import { Paper } from '@mui/material';
const api = axios.create({ const api = axios.create({
baseURL: 'http://localhost:8080' baseURL: 'http://localhost:8080'
}) })
function Repertoire() { function Repertoire() {
const [theme, setTheme] = useState("light"); const [theme, setTheme] = useState("light");
if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) { if (localStorage.getItem('theme') && localStorage.getItem("theme") !== '' && localStorage.getItem("theme") !== theme) {
setTheme(localStorage.getItem("theme")) setTheme(localStorage.getItem("theme"))
@ -29,80 +20,102 @@ function Repertoire() {
const [contacts, setContacts] = useState([]); const [contacts, setContacts] = useState([]);
const [SearchTerm, setSearchTerm] = useState(""); const [SearchTerm, setSearchTerm] = useState("");
const [SearchResults, setSearchResults] = useState([]); const [SearchResults, setSearchResults] = useState([]);
const [customers, setCustomers] = useState([]);
useEffect(() => { useEffect(() => {
api.get('/Contact/All').then((response) => { api.get('/Contact/AllWithCustomerName').then((response) => {
setContacts(response.data); setContacts(response.data);
setSearchTerm(response.data[0].idcontact); setSearchTerm(response.data[0].idcontact);
}); });
}, []); }, []);
return ( useEffect(() => {
api.get('/Customer/All').then((response) => {
<body className={theme}> setCustomers(response.data);
});
}, []);
return (
<div className={theme} id="page_repertoire">
{/* Create an account page */}
<link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link> <link rel="stylesheet" href="https://unicons.iconscout.com/release/v4.0.0/css/line.css"></link>
<div className="haut_de_page">
<div className="page_Repertoire"> <h2 className="titre">Repertoire</h2>
{/* Create an account page */} <div className="rechLogo">
<div className="haut_de_page"> <div className="input_box">
<h2 className="titre">Repertoire</h2> <input type="search" placeholder="Rechercher..." />
<div className="rechLogo"> <span className="search">
<i class="uil uil-search search-icon"></i>
</span>
</div>
<img className="logo" srcSet="./LogoApp.svg" />
</div>
</div>
<div className="bas_de_page">
<NavigationDashboard />
<div className="contenu">
<span className="searchAndAddButton">
<div className="input_box"> <div className="input_box">
<input type="search" placeholder="Rechercher..."/> <input type="search" placeholder="Rechercher..." />
<span className="search"> <span className="search">
<i class="uil uil-search search-icon"></i> <i class="uil uil-search search-icon"></i>
</span> </span>
</div> </div>
<img className="logo" srcSet="./LogoApp.svg"/> <button className="boutonAddContact">Ajouter</button>
</div> </span>
<TableContainer component={Paper} className="tabListContact">
<Table>
<TableHead>
<TableRow>
<TableCell>Photo</TableCell>
<TableCell>Nom</TableCell>
<TableCell>Prénom</TableCell>
<TableCell>Entreprise</TableCell>
</TableRow>
</TableHead>
<TableBody>
{contacts.map((contact) => (
<TableRow key={contact.idcontact}>
<TableCell><img className="photoContact" src={user} /></TableCell>
<TableCell>{contact.lastname}</TableCell>
<TableCell>{contact.firstname}</TableCell>
<TableCell>{contact.name}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
</div> </div>
<div className="bas_de_page"> {/* <TableContainer component={Paper} sx={{ maxHeight: 0.8 }} className="tabListContact">
<NavigationDashboard /> <Table aria-label="simple table" size="small" stickyHeader>
<div className="Repertoire"> <TableHead >
<div className="Titre_Formulaire_Rech"> <TableRow>
<p className="Titre">Repertoire</p> <TableCell sx={{ bgcolor: 'info.main' }} align="center">Entreprise</TableCell>
<p className="Sous-titre">Liste des utilisateurs</p> <TableCell sx={{ bgcolor: 'info.main' }} align="left">Nom</TableCell>
<div className="rechLogo"> <TableCell sx={{ bgcolor: 'info.main' }} align="center">Prénom</TableCell>
<div className="input_box">
<input type="search" placeholder="Rechercher..." /> </TableRow>
<span className="search"> </TableHead>
<i class="uil uil-search search-icon"></i> <TableBody >
</span> {contacts.map((contact) => (
</div> <TableRow
<TableContainer component={Paper} sx={{ maxHeight: 0.8 }}> key={contact.idcontact}
<Table aria-label="simple table" size="small" stickyHeader> hover
<TableHead > // onClick={(event) => handleClick(event, contact.idcontact)}
<TableRow> // selected={contact.idcontact === selectedIdcontact}
<TableCell sx={{ bgcolor: 'info.main' }} align="left">Nom</TableCell> >
<TableCell sx={{ bgcolor: 'info.main' }} align="center">Prénom</TableCell>
<TableCell sx={{ bgcolor: 'info.main' }} align="center">Identifiant</TableCell> <TableCell align="center">{contact.idcustomer.name}</TableCell>
<TableCell sx={{ bgcolor: 'info.main' }} align="center">Téléphone</TableCell> <TableCell align="left">{contact.lastname}</TableCell>
<TableCell align="center">{contact.firstname}</TableCell>
</TableRow> </TableRow>
</TableHead> ))}
<TableBody > </TableBody>
{contacts.map((contact) => ( </Table>
<TableRow </TableContainer> */}
key={contact.idcontact}
hover
// onClick={(event) => handleClick(event, contact.idcontact)}
// selected={contact.idcontact === selectedIdcontact}
>
<TableCell align="left">{contact.lastname}</TableCell>
<TableCell align="center">{contact.firstname}</TableCell>
<TableCell align="center">{contact.phone}</TableCell>
<TableCell align="center">{contact.mail}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
</div>
</div>
</div>
</div>
</div> </div>
</body> </div>
); );
}; };

@ -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;

@ -1,3 +1,8 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {
.page_admin { .page_admin {
@ -8,63 +13,86 @@ body {
.nav_bar_verticale { .nav_bar_verticale {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 200px; justify-content: space-around;
margin: 10px;
width: 230px;
background: rgba(255, 255, 255, 0.143); background: rgba(255, 255, 255, 0.143);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px); backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(1.5px); -webkit-backdrop-filter: blur(1.5px);
border-radius: 15px; border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.18); border: 1px solid rgba(255, 255, 255, 0.18);
margin: 10px;
.create_user {
padding: 5px;
text-decoration: none;
align-self: center;
}
.modify_user { .logoCRM {
padding: 5px; display: flex;
text-decoration: none; flex-direction: column;
align-self: center; justify-content: space-around;
} align-items: center;
.delete_user { .logo {
padding: 5px; max-width: 150px;
text-decoration: none; max-height: 150px;
align-self: center; }
} }
.BoutonNav {
.bouton {
display: flex; display: flex;
justify-content: center; flex-direction: column;
align-items: center; justify-content: space-evenly;
position: relative; height: 450px;
width: 180px; margin-bottom: 180px;
height: 100px;
border-radius: 10px; .create_user {
font-size: 13.5px; display: flex;
font-weight: bold; padding: 5px;
transition: 1s box-shadow; text-decoration: none;
border: none; align-self: center;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
background-color: rgb(163, 163, 163, 0.371);
border: 1px solid rgba(255,255,255,0.1);
backdrop-filter: blur(30px);
color: rgb(255, 255, 255);
cursor: pointer;
font-size: 17px;
&:hover{
box-shadow: 0, 5px, 35px, 0 rgba(0, 0, 0, 1);
color: white;
background-color: rgba(114, 114, 114, 0.371);
} }
.modify_user {
display: flex;
padding: 5px;
text-decoration: none;
align-self: center;
}
.delete_user {
display: flex;
padding: 5px;
text-decoration: none;
align-self: center;
}
.list_devis {
display: flex;
padding: 5px;
text-decoration: none;
align-self: center;
}
.bouton {
display: flex;
justify-content: center;
align-items: center;
width: 150px;
height: 60px;
font-size: 17px;
font-weight: bold;
transition: 1s box-shadow;
border: none;
cursor: pointer;
color: white;
background-color: grey;
border-radius: 15px;
&:active{ &:hover {
background-color:rgba(68, 68, 68, 0.972); color: white;
background-color: rgba(114, 114, 114, 0.371);
}
&:active {
background-color: rgba(68, 68, 68, 0.972);
}
} }
} }
} }
@ -74,14 +102,14 @@ body {
.Titre_Formulaire{ .Titre_Formulaire{
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin: 10px 10px 10px 0px;
padding: 10px;
flex-basis: 100%; flex-basis: 100%;
background: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.3);
border-radius: 15px; border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px); backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px);
margin: 10px;
padding: 10px;
.Titre { .Titre {
display: flex; display: flex;
@ -198,42 +226,43 @@ body {
margin-top: 5%; margin-top: 5%;
.bouton_val{ .bouton_val{
//display: flex; display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 150px;
height: 40px;
font-size: 20px;
text-decoration: none;
color: white;
background-color: grey; background-color: grey;
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(30px);
color: rgb(255, 255, 255);
cursor: pointer;
font-size: 15px;
border-radius: 15px; border-radius: 15px;
width: 20%; border: 0;
&:hover { &:hover {
box-shadow: 0, 5px, 35px, 0 rgba(0, 0, 0, 1);
color: white; color: white;
background-color: rgba(114, 114, 114, 0.371); background-color: rgba(114, 114, 114, 0.371);
} }
&:active { &:active {
background-color: rgba(68, 68, 68, 0.972); background-color: rgba(68, 68, 68, 0.972);
} }
} }
.bouton_ann{ .bouton_ann{
//display: flex; display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 150px;
height: 40px;
font-size: 20px;
text-decoration: none;
color: white;
background-color: grey; background-color: grey;
border: 0px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(30px);
color: rgb(255, 255, 255);
cursor: pointer;
font-size: 15px;
border-radius: 15px; border-radius: 15px;
width: 20%;
text-decoration: none;
text-align: center;
&:hover { &:hover {
box-shadow: 0, 5px, 35px, 0 rgba(0, 0, 0, 1);
color: white; color: white;
background-color: rgba(114, 114, 114, 0.371); background-color: rgba(114, 114, 114, 0.371);
} }
@ -248,14 +277,14 @@ body {
.Titre_Formulaire_Rech{ .Titre_Formulaire_Rech{
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin: 10px 10px 10px 0px;
padding: 10px;
flex-basis: 100%; flex-basis: 100%;
background: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.3);
border-radius: 15px; border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(3px); backdrop-filter: blur(3px);
-webkit-backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px);
margin: 10px;
padding: 10px;
.Titre { .Titre {
display: flex; display: flex;
@ -469,5 +498,24 @@ body {
} }
} }
} }
.devis {
display: flex;
flex-direction: column;
width: 100%;
margin: 10px 10px 10px 0;
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 {
display: flex;
margin: 10px;
font-size: 70px;
font-weight: bold;
}
}
} }
} }

@ -1,7 +1,4 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {

@ -1,7 +1,4 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {

@ -1,7 +1,4 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {

@ -1,7 +1,3 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {
.page_connexion { .page_connexion {

@ -1,7 +1,4 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {
.page_dashboard { .page_dashboard {

@ -1,8 +1,3 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {
background-color: $alice-blue; background-color: $alice-blue;
color: black; color: black;

@ -1,17 +1,12 @@
.dark{
background-color: $xiketic;
color: white;
}
body { body {
.page_Repertoire { #page_repertoire {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-evenly; justify-content: space-evenly;
width: auto; width: auto;
height: 100vh; height: 100vh;
.haut_de_page { .haut_de_page {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -21,7 +16,7 @@ body {
height: 10%; height: 10%;
align-items: center; align-items: center;
margin: 10px 10px 5px 10px; margin: 10px 10px 5px 10px;
background: rgba(255, 255, 255, 0.3); background: rgba(255, 255, 255, 0.3);
border-radius: 15px; border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
@ -31,7 +26,7 @@ body {
.titre { .titre {
font-size: 40px; font-size: 40px;
} }
.rechLogo { .rechLogo {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -85,9 +80,9 @@ body {
width: 100px; width: 100px;
height: 100px; height: 100px;
} }
} }
} }
.bas_de_page { .bas_de_page {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -98,7 +93,7 @@ body {
.nav_bar_verticale { .nav_bar_verticale {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-around; justify-content: space-evenly;
align-items: center; align-items: center;
width: 5%; width: 5%;
margin: 5px 5px 10px 10px; margin: 5px 5px 10px 10px;
@ -153,7 +148,7 @@ body {
border: none; border: none;
cursor: pointer; cursor: pointer;
.logo_nav_bar{ .logo_nav_bar {
display: flex; display: flex;
margin: 10px; margin: 10px;
height: 50px; height: 50px;
@ -162,15 +157,105 @@ body {
} }
} }
.Repertoire { .contenu {
display: flex; width: 100%;
flex-direction: row;
justify-content: space-between;
width: 94.3%;
height: auto;
margin: 5px 10px 10px 5px;
.searchAndAddButton {
height: 100px;
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
justify-content: space-between;
.boutonAddContact {
display: flex;
justify-content: center;
align-items: center;
height: 40px;
min-width: 150px;
margin: 30px 30px;
border-radius: 25px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
}
.input_box {
display: flex;
justify-content: center;
align-items: center;
position: relative;
height: 40px;
max-width: 350px;
width: 100%;
margin: 30px 30px;
border-radius: 25px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
input {
position: relative;
width: 100%;
height: 100%;
padding: 0 15px 0 65px;
outline: none;
border: none;
border-radius: 25px;
font-size: 16px;
font-weight: 400;
color: #333;
}
.search {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 60px;
border-radius: 25px 0 0 25px;
.search-icon {
font-size: 30px;
color: black;
}
}
}
}
.tabListContact {
margin-bottom: 20px;
padding-right: 10px;
height: 82%;
scroll-behavior: smooth;
overflow-y: scroll;
&::-webkit-scrollbar {
width: 15px;
}
&::-webkit-scrollbar-track {
background: #f1f1f1;
}
&::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
&::-webkit-scrollbar-thumb:hover {
background: #555;
}
.photoContact{
width: 50px;
height: 50px;
border-radius: 50%;
object-fit: cover;
border: 1px solid black;
}
}
} }
} }
} }
} }

@ -14,19 +14,7 @@ $rufous: #9b2915ff;
$xiketic: #020114ff; $xiketic: #020114ff;
$beau-blue: #b1c5d2; $beau-blue: #b1c5d2;
/* SCSS HSL */
$alice-blue: hsla(204, 28%, 93%, 1);
$blue-munsell: hsla(190, 100%, 32%, 1);
$malachite: hsla(142, 80%, 55%, 1);
$rufous: hsla(9, 76%, 35%, 1);
$xiketic: hsla(243, 90%, 4%, 1);
/* SCSS RGB */
$alice-blue: rgba(232, 238, 242, 1);
$blue-munsell: rgba(0, 136, 163, 1);
$malachite: rgba(50, 232, 117, 1);
$rufous: rgba(155, 41, 21, 1);
$xiketic: rgb(21, 18, 75);
/* SCSS Gradient */ /* SCSS Gradient */
$gradient-top: linear-gradient(0deg, #e8eef2ff, #0088a3ff, #32e875ff, #9b2915ff, #020114ff); $gradient-top: linear-gradient(0deg, #e8eef2ff, #0088a3ff, #32e875ff, #9b2915ff, #020114ff);
@ -59,4 +47,9 @@ body {
li { li {
list-style-type: none; list-style-type: none;
}
.dark{
background-color: $xiketic;
color: white;
} }
Loading…
Cancel
Save