From 5256a49dd4601adce7eab799c665a7d842be3a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:26:19 -0600 Subject: [PATCH 01/34] Se agregaron las dependencias de axios, font awesome free solid svg icons y react-fontawesome --- web/package-lock.json | 86 +++++++++++++++++++++++++++++++++++++++++-- web/package.json | 6 +++ 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 202bff49..56b6f8ca 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,6 +8,8 @@ "name": "web", "version": "0.1.0", "dependencies": { + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", @@ -15,11 +17,15 @@ "@types/node": "^16.18.87", "@types/react": "^18.2.64", "@types/react-dom": "^18.2.21", + "axios": "^1.6.8", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" + }, + "devDependencies": { + "tailwindcss": "^3.4.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2381,6 +2387,52 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz", + "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz", + "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz", + "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.5.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -5223,6 +5275,29 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -8308,9 +8383,9 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -14522,6 +14597,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", diff --git a/web/package.json b/web/package.json index 600a7e75..0df47da9 100644 --- a/web/package.json +++ b/web/package.json @@ -3,6 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/free-solid-svg-icons": "^6.5.1", + "@fortawesome/react-fontawesome": "^0.2.0", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", @@ -10,6 +12,7 @@ "@types/node": "^16.18.87", "@types/react": "^18.2.64", "@types/react-dom": "^18.2.21", + "axios": "^1.6.8", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", @@ -39,5 +42,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "tailwindcss": "^3.4.1" } } -- GitLab From 34f8bdbf8cbaeff240ceeb864e7cb254c8920af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:27:12 -0600 Subject: [PATCH 02/34] =?UTF-8?q?Se=20agrega=20la=20pagina=20de=20login=20?= =?UTF-8?q?como=20la=20p=C3=A1gina=20principal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/App.tsx | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index a53698aa..730f36e7 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,24 +1,10 @@ -import React from 'react'; -import logo from './logo.svg'; import './App.css'; +import { LoginPage } from './pages/login_page/login_page'; function App() { return (
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
+
); } -- GitLab From 3a940796273b48d3f54da1c53ed74a59a7c23a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:27:38 -0600 Subject: [PATCH 03/34] =?UTF-8?q?Se=20crea=20la=20p=C3=A1gina=20de=20inici?= =?UTF-8?q?o=20de=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/login_page/login_page.tsx | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 web/src/pages/login_page/login_page.tsx diff --git a/web/src/pages/login_page/login_page.tsx b/web/src/pages/login_page/login_page.tsx new file mode 100644 index 00000000..cb9b0f6d --- /dev/null +++ b/web/src/pages/login_page/login_page.tsx @@ -0,0 +1,53 @@ +import { usePasswoordVisibility } from "../../hooks/usePasswordVisibility" +import "./styles/styles.css" +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faEye , faEyeSlash} from "@fortawesome/free-solid-svg-icons"; + +export const LoginPage = () => { + const { + values, + handleClickShowPassword, + handleMouseDownPassword, + } = usePasswoordVisibility(); + + + return ( +
+
+
+ Inicia sesión +
+
+
+ + +
+
+ + + +
+ +
+ +
+
+
+
+ ) + +} \ No newline at end of file -- GitLab From d779fae057aa9d2de44e153f1e4040b8962eeee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:28:00 -0600 Subject: [PATCH 04/34] =?UTF-8?q?Se=20crea=20el=20archivo=20para=20la=20p?= =?UTF-8?q?=C3=A1gina=20de=20inicio=20de=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/login_page/styles/styles.css | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 web/src/pages/login_page/styles/styles.css diff --git a/web/src/pages/login_page/styles/styles.css b/web/src/pages/login_page/styles/styles.css new file mode 100644 index 00000000..91b5d62c --- /dev/null +++ b/web/src/pages/login_page/styles/styles.css @@ -0,0 +1,122 @@ +@import url('https://fonts.googleapis.com/css?family=Poppins:400,500,600,700&display=swap'); + +* { + margin: 10; + padding: 0; + font-family: 'Poppins', sans-serif; + box-sizing: border-box; +} + +.login-page-root{ + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + width: 100vw; +} + +.login-form-container{ + border-radius: 15px; + background: white; + display: grid; + place-items: center; + box-shadow: 0px 15px 20px rgba(0,0,0,0.1); +} + +.login-form-container .title{ + font-size: 35px; + font-weight: 600; + width: 100%; + color: white; + line-height: 50px; + text-align: center; + user-select: none; + border-radius: 15px 15px 0 0; + background: linear-gradient(-140deg,#413d3d, rgb(0, 0, 0)) +} + +.login-form-container form{ + padding: 10px 40px 50px 30px; +} + +.login-form-container .login-form-field{ + position: relative; + height: 50px; + width: 100%; + margin-top: 20px; +} + +.login-form-container form .login-form-field input{ + height: 100%; + width: 100%; + outline: none; + font-size: 17px; + padding-left: 20px; + padding-right: 30px; + border: 1px solid lightgray; + border-radius: 15px; + transition: all 0.3s ease; +} + +.login-form-container form .login-form-field input:focus, +form .login-form-field input:valid{ + border-color: #4158d0; +} + +.login-form-container form .login-form-field label{ + position: absolute; + top: 50%; + left: 20px; + color: #999999; + font-weight: 400; + font-size: 17px; + pointer-events: none; + transform: all 0.3s ease; + transform: translateY(-50%); +} + +.login-form-container form .login-form-field .pass-visibility-button{ + position: absolute; + top: 50%; + right: 5px; + transform: translateY(-50%); + transform: all 0.3s ease; + cursor: pointer; +} + + +form .login-form-field input:focus ~ label, +form .login-form-field input:valid ~ label, +form .login-form-field input[type="email"]:not(:placeholder-shown) ~ label, +form .login-form-field input[type="email"]:focus ~ label { + top: 0%; + color: #4158d0; + font-size: 16px; + background-color: white; + transform: translateY(-50%); +} + +.login-form-container form .login-form-button { + height: 50px; + width: 100%; + margin-top: 20px; + position: relative; +} + +form .login-form-button input{ + color: white; + border: none; + padding-left: 0; + margin-top: -10px; + font-size: 20px; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + background: black; + width: 100%; + border-radius: 5px; +} + +form .login-form-button input:active { + transform: scale(0.95); +} \ No newline at end of file -- GitLab From dbc3e70b6efb7678e884359e83d8b0c8b4c5b968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:28:42 -0600 Subject: [PATCH 05/34] Se crean las constantes para los roles de SUPERADMIN y ADMIN --- web/src/infraestructure/entities/user.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 web/src/infraestructure/entities/user.ts diff --git a/web/src/infraestructure/entities/user.ts b/web/src/infraestructure/entities/user.ts new file mode 100644 index 00000000..a600d77e --- /dev/null +++ b/web/src/infraestructure/entities/user.ts @@ -0,0 +1,19 @@ +import { UserRole } from "../../constants/roles"; + +export interface UserEntity { + name?: string; + lastName?: string; + email: string; + role: UserRole; +} + +export interface LoggedInUser { + user: UserEntity; + token: string; +} + +export interface UserInfo { + name?: string; + lastName?: string; + email: string; +} \ No newline at end of file -- GitLab From 8eaa84fc53741a51c052d1a1f7299fc3af0a0414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:28:58 -0600 Subject: [PATCH 06/34] Se crea el enumerado para los roles --- web/src/constants/roles.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 web/src/constants/roles.ts diff --git a/web/src/constants/roles.ts b/web/src/constants/roles.ts new file mode 100644 index 00000000..02cddf70 --- /dev/null +++ b/web/src/constants/roles.ts @@ -0,0 +1,7 @@ +export enum UserRole { + ADMIN = "admin", + SUPERADMIN = "superadmin", +} + +export const SUPERADMIN_ROLES = [UserRole.SUPERADMIN]; +export const ADMIN_ROLES = [UserRole.ADMIN, UserRole.SUPERADMIN]; \ No newline at end of file -- GitLab From b305f09c1e7dc2e77cff9387aff523be6b06ad1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:29:32 -0600 Subject: [PATCH 07/34] Se crea la constante para la ruta de la API --- web/src/constants/api_url.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/src/constants/api_url.ts diff --git a/web/src/constants/api_url.ts b/web/src/constants/api_url.ts new file mode 100644 index 00000000..43f27f05 --- /dev/null +++ b/web/src/constants/api_url.ts @@ -0,0 +1 @@ +export const APIUrl: String = ""; \ No newline at end of file -- GitLab From 28c2979410eea0dca9c5e043122bf64a6600d1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:29:56 -0600 Subject: [PATCH 08/34] Se crea el modelo para un usuario logeado --- web/src/data/models/prod/LoggedInUserModel.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 web/src/data/models/prod/LoggedInUserModel.ts diff --git a/web/src/data/models/prod/LoggedInUserModel.ts b/web/src/data/models/prod/LoggedInUserModel.ts new file mode 100644 index 00000000..e69909a9 --- /dev/null +++ b/web/src/data/models/prod/LoggedInUserModel.ts @@ -0,0 +1,5 @@ +export interface LoggedInUserModel { + email: string; + role: string; + token: string; +} \ No newline at end of file -- GitLab From 07d1611314dd2a2339b39a6b1b47935347318b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:30:19 -0600 Subject: [PATCH 09/34] =?UTF-8?q?Se=20crea=20el=20hook=20para=20cambiar=20?= =?UTF-8?q?el=20estado=20de=20la=20visibilidad=20de=20la=20contrase=C3=B1a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/hooks/usePasswordVisibility.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 web/src/hooks/usePasswordVisibility.tsx diff --git a/web/src/hooks/usePasswordVisibility.tsx b/web/src/hooks/usePasswordVisibility.tsx new file mode 100644 index 00000000..23108a82 --- /dev/null +++ b/web/src/hooks/usePasswordVisibility.tsx @@ -0,0 +1,20 @@ +import { useState } from "react" + +export const usePasswoordVisibility = () => { + const [values, setValues] = useState({ + showPassword: false, + }); + + const handleClickShowPassword = () => { + setValues({ + ...values, + showPassword: !values.showPassword, + }); + }; + + const handleMouseDownPassword = (event: any) => { + event.preventDefault(); + }; + + return {values, handleClickShowPassword, handleMouseDownPassword}; +} \ No newline at end of file -- GitLab From 1f00f2e7dc1fd0047955bd1992f0826f08b712d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:30:43 -0600 Subject: [PATCH 10/34] Se crea la interface para los valores que van a ser enviados en el POST --- web/src/infraestructure/entities/login_form_values.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 web/src/infraestructure/entities/login_form_values.ts diff --git a/web/src/infraestructure/entities/login_form_values.ts b/web/src/infraestructure/entities/login_form_values.ts new file mode 100644 index 00000000..78456b1e --- /dev/null +++ b/web/src/infraestructure/entities/login_form_values.ts @@ -0,0 +1,4 @@ +export interface LoginFormValues { + email : string + password : string +}; \ No newline at end of file -- GitLab From ec1879768b3b7177272d0a1ecdd69ee2507ff5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:31:05 -0600 Subject: [PATCH 11/34] =?UTF-8?q?Se=20crea=20la=20l=C3=B3gica=20del=20inic?= =?UTF-8?q?io=20de=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datasources/prod/login_datasource.ts | 29 +++++++++++++++++++ .../repositories/prod/login_repository.ts | 13 +++++++++ .../datasources/login_datasource.ts | 6 ++++ .../repositories/login_repository.ts | 6 ++++ 4 files changed, 54 insertions(+) create mode 100644 web/src/data/datasources/prod/login_datasource.ts create mode 100644 web/src/data/repositories/prod/login_repository.ts create mode 100644 web/src/infraestructure/datasources/login_datasource.ts create mode 100644 web/src/infraestructure/repositories/login_repository.ts diff --git a/web/src/data/datasources/prod/login_datasource.ts b/web/src/data/datasources/prod/login_datasource.ts new file mode 100644 index 00000000..7c006413 --- /dev/null +++ b/web/src/data/datasources/prod/login_datasource.ts @@ -0,0 +1,29 @@ +import { LoginDatasourceInf } from "../../../infraestructure/datasources/login_datasource"; +import { LoginFormValues } from "../../../infraestructure/entities/login_form_values"; +import axios from "axios"; +import { LoggedInUser } from "../../../infraestructure/entities/user"; +import { LoggedInUserModel } from "../../models/prod/LoggedInUserModel"; +import { UserRole } from "../../../constants/roles"; +import { APIUrl } from "../../../constants/api_url"; + +export class LoginDatasourceProd implements LoginDatasourceInf{ + async getToken(form: LoginFormValues): Promise { + const {email, password} = form; + const {data} = await axios.post( + APIUrl + "/api/auth/login", + { + email: email, + password: password, + } + ); + const user: LoggedInUser = { + user: { + email: data.email, + role: data.role === UserRole.SUPERADMIN ? UserRole.SUPERADMIN : UserRole.ADMIN, + }, + token: data.token, + }; + + return user; + } +} \ No newline at end of file diff --git a/web/src/data/repositories/prod/login_repository.ts b/web/src/data/repositories/prod/login_repository.ts new file mode 100644 index 00000000..69c0694f --- /dev/null +++ b/web/src/data/repositories/prod/login_repository.ts @@ -0,0 +1,13 @@ +import { LoginDatasourceInf } from "../../../infraestructure/datasources/login_datasource"; +import { LoginFormValues } from "../../../infraestructure/entities/login_form_values"; +import { LoggedInUser } from "../../../infraestructure/entities/user"; +import { LoginRepositoryInf } from "../../../infraestructure/repositories/login_repository"; + +export class LoginRepositoryProd implements LoginRepositoryInf{ + constructor( + private datasource: LoginDatasourceInf + ){} + async getToken(form: LoginFormValues): Promise { + return this.datasource.getToken(form); + } +} \ No newline at end of file diff --git a/web/src/infraestructure/datasources/login_datasource.ts b/web/src/infraestructure/datasources/login_datasource.ts new file mode 100644 index 00000000..762def1d --- /dev/null +++ b/web/src/infraestructure/datasources/login_datasource.ts @@ -0,0 +1,6 @@ +import { LoginFormValues } from "../entities/login_form_values"; +import { LoggedInUser } from "../entities/user"; + +export interface LoginDatasourceInf { + getToken(form: LoginFormValues): Promise; +} diff --git a/web/src/infraestructure/repositories/login_repository.ts b/web/src/infraestructure/repositories/login_repository.ts new file mode 100644 index 00000000..886c8ecc --- /dev/null +++ b/web/src/infraestructure/repositories/login_repository.ts @@ -0,0 +1,6 @@ +import { LoginFormValues } from "../entities/login_form_values"; +import { LoggedInUser } from "../entities/user"; + +export interface LoginRepositoryInf{ + getToken(form: LoginFormValues): Promise; +} \ No newline at end of file -- GitLab From f15f250e621a905ed34e0809b4a55a5bd789182a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 22 Mar 2024 13:31:23 -0600 Subject: [PATCH 12/34] =?UTF-8?q?Se=20crea=20el=20hook=20para=20el=20inici?= =?UTF-8?q?o=20de=20sesi=C3=B3n=20(vac=C3=ADo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/hooks/useLogin.tsx | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web/src/hooks/useLogin.tsx diff --git a/web/src/hooks/useLogin.tsx b/web/src/hooks/useLogin.tsx new file mode 100644 index 00000000..e69de29b -- GitLab From 82c0200ac4d13851d230e84514d64b2d2a23e472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:23:09 -0600 Subject: [PATCH 13/34] Se agregaron las librerias de react router y react hook form --- web/package-lock.json | 55 +++++++++++++++++++++++++++++++++++++++++++ web/package.json | 2 ++ 2 files changed, 57 insertions(+) diff --git a/web/package-lock.json b/web/package-lock.json index 56b6f8ca..f63ba279 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -20,6 +20,8 @@ "axios": "^1.6.8", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.2", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -3390,6 +3392,14 @@ } } }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -14885,6 +14895,21 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, + "node_modules/react-hook-form": { + "version": "7.51.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.2.tgz", + "integrity": "sha512-y++lwaWjtzDt/XNnyGDQy6goHskFualmDlf+jzEZvjvz6KWDf7EboL7pUvRCzPTJd0EOPpdekYaQLEvvG6m6HA==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -14898,6 +14923,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", diff --git a/web/package.json b/web/package.json index 0df47da9..51d196f7 100644 --- a/web/package.json +++ b/web/package.json @@ -15,6 +15,8 @@ "axios": "^1.6.8", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.2", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" -- GitLab From 568e805fb7c3e540f67d1b4e4b41b9fd2211b6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:27:41 -0600 Subject: [PATCH 14/34] Se crea la constante que contiene el url de la API --- web/src/constants/api_url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/constants/api_url.ts b/web/src/constants/api_url.ts index 43f27f05..b712d339 100644 --- a/web/src/constants/api_url.ts +++ b/web/src/constants/api_url.ts @@ -1 +1 @@ -export const APIUrl: String = ""; \ No newline at end of file +export const APIUrl: String = "http://localhost:3005"; \ No newline at end of file -- GitLab From 17453fe94a4fe536d4b288fc4fd400b0d33bd76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:28:22 -0600 Subject: [PATCH 15/34] Se agrega el campo de nombre del usuario logeado --- web/src/data/models/prod/LoggedInUserModel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/data/models/prod/LoggedInUserModel.ts b/web/src/data/models/prod/LoggedInUserModel.ts index e69909a9..8f73d45b 100644 --- a/web/src/data/models/prod/LoggedInUserModel.ts +++ b/web/src/data/models/prod/LoggedInUserModel.ts @@ -1,5 +1,6 @@ export interface LoggedInUserModel { email: string; + name: string; role: string; token: string; } \ No newline at end of file -- GitLab From 6c34ebf6b278e4dba3e485d0fbad9e88f38a89d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:28:58 -0600 Subject: [PATCH 16/34] =?UTF-8?q?Se=20modifica=20la=20ruta=20de=20inicio?= =?UTF-8?q?=20de=20sesi=C3=B3n=20en=20la=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/data/datasources/prod/login_datasource.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/src/data/datasources/prod/login_datasource.ts b/web/src/data/datasources/prod/login_datasource.ts index 7c006413..c2d7f535 100644 --- a/web/src/data/datasources/prod/login_datasource.ts +++ b/web/src/data/datasources/prod/login_datasource.ts @@ -10,7 +10,7 @@ export class LoginDatasourceProd implements LoginDatasourceInf{ async getToken(form: LoginFormValues): Promise { const {email, password} = form; const {data} = await axios.post( - APIUrl + "/api/auth/login", + APIUrl + "/admin/signin", { email: email, password: password, @@ -19,6 +19,7 @@ export class LoginDatasourceProd implements LoginDatasourceInf{ const user: LoggedInUser = { user: { email: data.email, + name: data.name, role: data.role === UserRole.SUPERADMIN ? UserRole.SUPERADMIN : UserRole.ADMIN, }, token: data.token, -- GitLab From 0fa871270ba7e7f671466d634a1b857b57829740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:30:06 -0600 Subject: [PATCH 17/34] =?UTF-8?q?Se=20crea=20el=20archivo=20para=20revisar?= =?UTF-8?q?,=20iniciar=20y=20cerrar=20la=20sesi=C3=B3n=20de=20usuario?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/context/auth_context.tsx | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 web/src/context/auth_context.tsx diff --git a/web/src/context/auth_context.tsx b/web/src/context/auth_context.tsx new file mode 100644 index 00000000..2648700d --- /dev/null +++ b/web/src/context/auth_context.tsx @@ -0,0 +1,68 @@ +import { UserEntity } from "../infraestructure/entities/user"; +import axios from "axios"; +import { UserRole } from "../constants/roles"; +import { ReactNode, createContext, useContext, useEffect, useState } from "react"; + +type AuthContextType = { + user: UserEntity | null; + login: (user: UserEntity, token: string) => void; + logout: () => void; +}; + +const AuthContext = createContext({ + user: null, + login: () => {}, + logout: () => {} +}); + +type AuthContextProviderProps = { + children: ReactNode; +} + +export const AuthContextProvider = ({children} : AuthContextProviderProps) => { + const [user, setUser] = useState(null); + const saveSession = async (user: UserEntity, token: string) => { + setUser(user); + localStorage.setItem("token",token); + localStorage.setItem("user",JSON.stringify(user)); + axios.defaults.headers.common["Authorization"] = `${token}`; + } + + const deleteSession = async () => { + setUser(null); + localStorage.removeItem("token"); + localStorage.removeItem("user"); + axios.defaults.headers.common["Authorization"] = ""; + } + + const login = async (user: UserEntity, token: string) => { + await saveSession(user, token); + } + + const logout = async () => { + await deleteSession(); + } + + const checkSession = async () => { + const token = localStorage.getItem("token"); + const user = localStorage.getItem("user"); + if(token && user){ + const sessionUser = JSON.parse(user); + await saveSession({email: sessionUser.email as string, role: sessionUser.role as UserRole}, token); + } + } + + useEffect(() => { + checkSession(); + }, []); + + const value = {user, login, logout}; + return {children} +}; + +export const useAuth = () => { + if(AuthContext == undefined){ + throw new Error("useAuth debe se usado dentro de un AuthContextProvider"); + } + return useContext(AuthContext); +}; \ No newline at end of file -- GitLab From 9487d853d196a3593001a945a0847c49c5fda2ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:30:42 -0600 Subject: [PATCH 18/34] =?UTF-8?q?Se=20crea=20el=20custom=20hook=20para=20i?= =?UTF-8?q?niciar=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/hooks/useLogin.tsx | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/web/src/hooks/useLogin.tsx b/web/src/hooks/useLogin.tsx index e69de29b..6a8ec169 100644 --- a/web/src/hooks/useLogin.tsx +++ b/web/src/hooks/useLogin.tsx @@ -0,0 +1,41 @@ +import { SubmitHandler, useForm } from "react-hook-form" +import { LoginFormValues } from "../infraestructure/entities/login_form_values" +import { LoginRepositoryProd } from "../data/repositories/prod/login_repository"; +import { LoginDatasourceProd } from "../data/datasources/prod/login_datasource"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import { useAuth } from "../context/auth_context"; +const loginDatasource = new LoginDatasourceProd(); +const loginRepository = new LoginRepositoryProd(loginDatasource); + +export const useLogin = () => { + const {login, user} = useAuth(); + const navigate = useNavigate(); + const { + register, + handleSubmit, + setError, + formState: {errors}, + } = useForm(); + + const onSubmit: SubmitHandler = (data: LoginFormValues) => { + const authenticate = async () => { + try{ + const {user, token } = await loginRepository.getToken(data); + await login(user, token); + navigate("/"); + }catch(error: any){ + + } + } + authenticate(); + } + + useEffect(() => { + if(user) { + navigate("/"); + } + }, []); + + return { register, handleSubmit, onSubmit, errors }; +} \ No newline at end of file -- GitLab From 1068e87539c0fc4c30c72e30868745b337ddd30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:31:28 -0600 Subject: [PATCH 19/34] =?UTF-8?q?Se=20modifica=20el=20archivo=20para=20inc?= =?UTF-8?q?orporar=20el=20uso=20del=20hook=20de=20inicio=20de=20sesi=C3=B3?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/login_page/login_page.tsx | 93 +++++++++++++------------ 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/web/src/pages/login_page/login_page.tsx b/web/src/pages/login_page/login_page.tsx index cb9b0f6d..6cbc8ce2 100644 --- a/web/src/pages/login_page/login_page.tsx +++ b/web/src/pages/login_page/login_page.tsx @@ -2,52 +2,59 @@ import { usePasswoordVisibility } from "../../hooks/usePasswordVisibility" import "./styles/styles.css" import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faEye , faEyeSlash} from "@fortawesome/free-solid-svg-icons"; +import { useLogin } from "../../hooks/useLogin"; export const LoginPage = () => { - const { - values, - handleClickShowPassword, - handleMouseDownPassword, - } = usePasswoordVisibility(); + const { + values, + handleClickShowPassword, + handleMouseDownPassword, + } = usePasswoordVisibility(); + const { + register, + handleSubmit, + errors, + onSubmit + } = useLogin(); - return ( -
-
-
- Inicia sesión -
-
-
- - -
-
- - - -
- -
- -
-
-
+ return ( +
+
+
+ Inicia sesión
- ) - +
+
+ + +
+
+ + + +
+
+ +
+
+
+
+ ) } \ No newline at end of file -- GitLab From e3f2d36b518c7d950fb86e5dfff599f243583c96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:31:58 -0600 Subject: [PATCH 20/34] =?UTF-8?q?Se=20crea=20la=20ruta=20para=20el=20inici?= =?UTF-8?q?o=20de=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/router/login_route.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 web/src/router/login_route.tsx diff --git a/web/src/router/login_route.tsx b/web/src/router/login_route.tsx new file mode 100644 index 00000000..b401a7fb --- /dev/null +++ b/web/src/router/login_route.tsx @@ -0,0 +1,10 @@ +import { Navigate, Outlet } from "react-router-dom"; +import { useAuth } from "../context/auth_context"; + +export const LoginRoute = () => { + const {user} = useAuth(); + if(user){ + return ; + } + return ; +} \ No newline at end of file -- GitLab From a450714891283ccf714e0c2fc9fe0986c292c675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:32:20 -0600 Subject: [PATCH 21/34] Se crea una ruta protegida generica --- web/src/router/protected_route.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 web/src/router/protected_route.tsx diff --git a/web/src/router/protected_route.tsx b/web/src/router/protected_route.tsx new file mode 100644 index 00000000..2a412f38 --- /dev/null +++ b/web/src/router/protected_route.tsx @@ -0,0 +1,15 @@ +import { Navigate, Outlet } from "react-router-dom"; +import { useAuth } from "../context/auth_context"; + +interface ProtectedRouteProps { + allowedRoles?: string[]; +} + +export const ProtectedRoute = ({allowedRoles}: ProtectedRouteProps) => { + const {user} = useAuth(); + if(!user){ + return ; + } + + return ; +} \ No newline at end of file -- GitLab From 2867da9141b8072e441f0e335e12e0e70a5f715c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Fri, 12 Apr 2024 10:32:36 -0600 Subject: [PATCH 22/34] Se crea el archivo de las rutas --- web/src/router/router.tsx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 web/src/router/router.tsx diff --git a/web/src/router/router.tsx b/web/src/router/router.tsx new file mode 100644 index 00000000..9e051b3a --- /dev/null +++ b/web/src/router/router.tsx @@ -0,0 +1,27 @@ +import { createBrowserRouter } from "react-router-dom"; +import { SUPERADMIN_ROLES, ADMIN_ROLES } from "../constants/roles"; +import { LoginPage } from "../pages/login_page/login_page"; +import { ProtectedRoute } from "./protected_route"; +import { SuperAdminHomePage } from "../pages/home/super_admin_page/super_admin_home_page"; + +export const router = createBrowserRouter([ + { + element: , + children: [ + { + index: true, + path: "/", + element: + } + ] + }, + { + element: , + children: [ + { + path: "/login", + element: + } + ] + } +]); \ No newline at end of file -- GitLab From 477ea95680b0b877163c5fb12a228d39ab849e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 09:33:28 -0600 Subject: [PATCH 23/34] =?UTF-8?q?Se=20agrega=20el=20router=20para=20ir=20a?= =?UTF-8?q?=20la=20p=C3=A1gina=20de=20login=20en=20caso=20de=20que=20no=20?= =?UTF-8?q?se=20encuentre=20la=20sesi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/App.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 730f36e7..2ed99ae6 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,10 +1,19 @@ +import { RouterProvider } from 'react-router-dom'; import './App.css'; -import { LoginPage } from './pages/login_page/login_page'; +import { AuthContextProvider } from './context/auth_context'; +import { MessageContextProvider } from './context/message_context'; +import { router } from './router/router'; +import { SuperAdminHomePage } from './pages/home/super_admin_page/super_admin_home_page'; + function App() { return (
- + + + + +
); } -- GitLab From 816333802704758aef1386841726ab1e7c776ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 09:33:59 -0600 Subject: [PATCH 24/34] Se agrega el paquete de react pro sidebar --- web/package-lock.json | 210 ++++++++++++++++++++++++++++++++++++++++++ web/package.json | 1 + 2 files changed, 211 insertions(+) diff --git a/web/package-lock.json b/web/package-lock.json index f63ba279..8d194350 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -21,6 +21,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.2", + "react-pro-sidebar": "^1.1.0", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", @@ -2296,6 +2297,163 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -3392,6 +3550,15 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@remix-run/router": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", @@ -6008,6 +6175,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -8359,6 +8531,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9023,6 +9200,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -14915,6 +15105,21 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-pro-sidebar": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-pro-sidebar/-/react-pro-sidebar-1.1.0.tgz", + "integrity": "sha512-rdRJ4PeMsqWq9n69AmF6et6qCbhCF1KEBgjAH8vIiLxE1k5fMxtRYo0k4asxW8qpIH6sqahiMxrxVVoObv8orQ==", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@popperjs/core": "^2.11.6", + "classnames": "^2.3.2" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -16354,6 +16559,11 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", diff --git a/web/package.json b/web/package.json index 51d196f7..f36efbd5 100644 --- a/web/package.json +++ b/web/package.json @@ -16,6 +16,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.2", + "react-pro-sidebar": "^1.1.0", "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "typescript": "^4.9.5", -- GitLab From ede11e32539410648a03003b28106015a0b2fcb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 09:37:07 -0600 Subject: [PATCH 25/34] Se elimina el import innecesario --- web/src/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/web/src/App.tsx b/web/src/App.tsx index 2ed99ae6..8dff12f1 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -3,7 +3,6 @@ import './App.css'; import { AuthContextProvider } from './context/auth_context'; import { MessageContextProvider } from './context/message_context'; import { router } from './router/router'; -import { SuperAdminHomePage } from './pages/home/super_admin_page/super_admin_home_page'; function App() { -- GitLab From 446219ceafe8792e3b48abac695f5460f36e0593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 09:39:08 -0600 Subject: [PATCH 26/34] Se agrega la imagen de perfil para superadmin y admin --- .../images/Admin-595b40b65ba036ed117d36fe.png | Bin 0 -> 108308 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web/src/components/admin_panel_navbar/assets/images/Admin-595b40b65ba036ed117d36fe.png diff --git a/web/src/components/admin_panel_navbar/assets/images/Admin-595b40b65ba036ed117d36fe.png b/web/src/components/admin_panel_navbar/assets/images/Admin-595b40b65ba036ed117d36fe.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e44e0c59cb9d29b25a8c922f4ea1fdc3cab308 GIT binary patch literal 108308 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 Date: Thu, 18 Apr 2024 10:50:01 -0600 Subject: [PATCH 27/34] =?UTF-8?q?Se=20crea=20la=20barra=20de=20navegaci?= =?UTF-8?q?=C3=B3n=20para=20el=20panel=20de=20admin=20y=20superadmin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin_panel_navbar/admin_navbar.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 web/src/components/admin_panel_navbar/admin_navbar.tsx diff --git a/web/src/components/admin_panel_navbar/admin_navbar.tsx b/web/src/components/admin_panel_navbar/admin_navbar.tsx new file mode 100644 index 00000000..424bd063 --- /dev/null +++ b/web/src/components/admin_panel_navbar/admin_navbar.tsx @@ -0,0 +1,45 @@ +import { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faSignOut, faUser } from "@fortawesome/free-solid-svg-icons"; +import { useAuth } from "../../context/auth_context"; +import { Link } from "react-router-dom"; +import './assets/styles/style.css'; + +export const AdminPanelNavBar = () => { + const {user, logout} = useAuth(); + const [toggle, setToggle] = useState(false); + + const handleLogout = () => { + logout(); + }; + + return ( +

+
+ setToggle(!toggle)}/> + {toggle && +
+
+
+ +

Superadmin

+
+
+ + + +

Editar cuenta

+ + + + +

Cerrar sesión

+ +
+
+ } +
+
+ ); +} \ No newline at end of file -- GitLab From 3fc419e39b38ef302ab6d2ef424c1ee276eff2ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:50:24 -0600 Subject: [PATCH 28/34] =?UTF-8?q?Se=20crea=20el=20archivo=20de=20estilos?= =?UTF-8?q?=20para=20la=20barra=20de=20navegaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/styles/style.css | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 web/src/components/admin_panel_navbar/assets/styles/style.css diff --git a/web/src/components/admin_panel_navbar/assets/styles/style.css b/web/src/components/admin_panel_navbar/assets/styles/style.css new file mode 100644 index 00000000..0762a670 --- /dev/null +++ b/web/src/components/admin_panel_navbar/assets/styles/style.css @@ -0,0 +1,90 @@ +:root { + --shadow: 0px 2px 8px 0px gray; +} + +.navbar{ + height: 40px; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + box-shadow: var(--shadow); + +} + +.profile{ + position: absolute; + right: 20px; +} + +.user-pic{ + width: 30px; + border-radius: 50%; + cursor: pointer; + background: white; +} + +.profile-sub-menu-wrap{ + position: absolute; + top: 100%; + right: 10%; + max-width: 400px; + overflow: hidden; + transition: max-height 0.5s; +} + +.sub-menu{ + background: white; + padding: 10px; + margin: 10px; +} + +.user-info{ + display: flex; + align-items: center; +} + +.user-info img{ + width: 60px; + margin-right: 15px; + border-radius: 50%; +} + +.user-info h3{ + font-weight: 500; +} + +.sub-menu hr{ + border: 0; + height: 1px; + width: 100%; + background: #ccc ; + margin: 15px 0 10px; +} + +.sub-menu-link{ + display: flex; + align-items: center; + text-decoration: none; + color: #525252; +} + +.sub-menu-link:hover .sub-menu-link-icon{ + transform: scale(1.1); +} + +.sub-menu-link:hover p{ + font-weight: 600; +} + +.sub-menu-link p{ + user-select: none; +} + +.sub-menu-link .sub-menu-link-icon{ + width: 20px; + background: #E5E5E5; + border-radius: 50%; + padding: 8px; + margin-right: 15px; +} \ No newline at end of file -- GitLab From 5bbd606b4f4e27ec98eca7d69ee262742da860ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:52:11 -0600 Subject: [PATCH 29/34] =?UTF-8?q?Se=20crea=20un=20contexto=20para=20el=20m?= =?UTF-8?q?ensaje=20de=20confirmaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/context/message_context.tsx | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 web/src/context/message_context.tsx diff --git a/web/src/context/message_context.tsx b/web/src/context/message_context.tsx new file mode 100644 index 00000000..1ce309be --- /dev/null +++ b/web/src/context/message_context.tsx @@ -0,0 +1,47 @@ +import { createContext, ReactNode, useContext, useState } from "react"; + +type MessageContextType = { + isVisible: boolean; + message: string; + showMessage: (message: string) => void; + hideMessage: () => void; +} + +const MessageContext = createContext({ + isVisible: false, + message: "", + showMessage: () => {}, + hideMessage: () => {} +}); + +type MessageContextProviderProps = { + children: ReactNode; +} + +export const MessageContextProvider = ({children}: MessageContextProviderProps) => { + const [isVisible, setIsVisible] = useState(false); + const [message, setMessage] = useState(""); + const showMessage = (message: string) => { + setIsVisible(true); + setMessage(message); + setTimeout(() => { + setIsVisible(false); + setMessage(""); + }, 3000); + }; + + const hideMessage = () => { + setIsVisible(false); + setMessage(""); + }; + + const value = {isVisible, message, showMessage, hideMessage}; + return {children} +} + +export const useMessage = () => { + if(MessageContext == undefined){ + throw new Error("useMessage debe se usado dentro de un MessageContextProvider"); + } + return useContext(MessageContext); +}; \ No newline at end of file -- GitLab From 3908e0e3da33e6fcf71f413d4e7a4775fb3b8a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:52:59 -0600 Subject: [PATCH 30/34] Se crea la pagina y los estilos para el panel de superadmin --- .../super_admin_page/assets/styles/style.css | 19 +++++++++ .../super_admin_home_page.tsx | 41 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 web/src/pages/home/super_admin_page/assets/styles/style.css create mode 100644 web/src/pages/home/super_admin_page/super_admin_home_page.tsx diff --git a/web/src/pages/home/super_admin_page/assets/styles/style.css b/web/src/pages/home/super_admin_page/assets/styles/style.css new file mode 100644 index 00000000..3ccfed0b --- /dev/null +++ b/web/src/pages/home/super_admin_page/assets/styles/style.css @@ -0,0 +1,19 @@ +:root { + --shadow: 0px 2px 8px 0px gray; +} + + +.superdmin-panel-root{ + display: flex; + height: 100%; + width: 100%; +} + + +.superadmin-panel-body{ + height: 100vh; + flex-grow: 1; + display: flex; + flex-direction: column; + background: #ECEAFF; +} diff --git a/web/src/pages/home/super_admin_page/super_admin_home_page.tsx b/web/src/pages/home/super_admin_page/super_admin_home_page.tsx new file mode 100644 index 00000000..9c6d16fa --- /dev/null +++ b/web/src/pages/home/super_admin_page/super_admin_home_page.tsx @@ -0,0 +1,41 @@ +import { Menu, MenuItem, Sidebar } from "react-pro-sidebar" +import './assets/styles/style.css'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faMonument, faSignOut, faUser, faUserTie } from "@fortawesome/free-solid-svg-icons"; +import { useState } from "react"; +import { useAuth } from "../../../context/auth_context"; +import { Link } from "react-router-dom"; +import { AdminPanelNavBar } from "../../../components/admin_panel_navbar/admin_navbar"; +import { SidebarHeader } from "../../../components/sidebar_header/sidebar_header"; +import { SuperadminPanelTownScreen } from "../../../components/sa_panel_town/sa_panel_town_screen/sa_panel_town_screen"; +import { SuperadminPanelAdminScreen } from "../../../components/sa_panel_admin/sa_panel_admin_screen/sa_panel_admin_screen"; + +export const SuperAdminHomePage = () => { + const [collapsed, setCollapsed] = useState(true); + const [townPanel, setTownPanel] = useState(true); + + return ( +
+ setCollapsed(false)} + onMouseOut={() => setCollapsed(true)}> + + + } onClick={() => setTownPanel(true)}> + Pueblos + + + } onClick={() => setTownPanel(false)}> + Administradores + + + +
+ +
+ {townPanel ? : } +
+
+
+ ) +} \ No newline at end of file -- GitLab From ae4301eadf486166fe5a6d7ad97d4fa1a514179b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:53:45 -0600 Subject: [PATCH 31/34] Se crea el componente y sus estilos para el encabezado de la barra lateral del panel de admin y superadmin --- .../sidebar_header/assets/css/styles.css | 11 +++++++++++ .../sidebar_header/sidebar_header.tsx | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 web/src/components/sidebar_header/assets/css/styles.css create mode 100644 web/src/components/sidebar_header/sidebar_header.tsx diff --git a/web/src/components/sidebar_header/assets/css/styles.css b/web/src/components/sidebar_header/assets/css/styles.css new file mode 100644 index 00000000..f47166b7 --- /dev/null +++ b/web/src/components/sidebar_header/assets/css/styles.css @@ -0,0 +1,11 @@ +.sidebar_header { + height: 64px; + min-height: 64px; + display: flex; + align-items: center; + padding: 0 20px; +} + +.sidebar_header_content{ + +} \ No newline at end of file diff --git a/web/src/components/sidebar_header/sidebar_header.tsx b/web/src/components/sidebar_header/sidebar_header.tsx new file mode 100644 index 00000000..f23c496b --- /dev/null +++ b/web/src/components/sidebar_header/sidebar_header.tsx @@ -0,0 +1,18 @@ +import { UserRole } from '../../constants/roles'; +import { useAuth } from '../../context/auth_context'; +import './assets/css/styles.css'; + +export const SidebarHeader = () => { + const {user} = useAuth(); + if(!user){ + return null; + } + + return ( +
+
+

{user.role==UserRole.SUPERADMIN ? 'Superadmin': 'Admin'} Panel

+
+
+ ); +} \ No newline at end of file -- GitLab From d300b1bf89e4c1a4836540df4fae39e7789b3476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:55:29 -0600 Subject: [PATCH 32/34] =?UTF-8?q?Se=20modifican=20los=20cokores=20de=20alg?= =?UTF-8?q?unos=20componentes=20de=20la=20pagina=20de=20inicio=20de=20sesi?= =?UTF-8?q?=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/pages/login_page/styles/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/pages/login_page/styles/styles.css b/web/src/pages/login_page/styles/styles.css index 91b5d62c..1d17cb07 100644 --- a/web/src/pages/login_page/styles/styles.css +++ b/web/src/pages/login_page/styles/styles.css @@ -60,7 +60,7 @@ .login-form-container form .login-form-field input:focus, form .login-form-field input:valid{ - border-color: #4158d0; + border-color: black; } .login-form-container form .login-form-field label{ @@ -90,7 +90,7 @@ form .login-form-field input:valid ~ label, form .login-form-field input[type="email"]:not(:placeholder-shown) ~ label, form .login-form-field input[type="email"]:focus ~ label { top: 0%; - color: #4158d0; + color: black; font-size: 16px; background-color: white; transform: translateY(-50%); -- GitLab From 3d4b9ef678431fd86549cfbf80b1447a93a1aa20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:56:08 -0600 Subject: [PATCH 33/34] =?UTF-8?q?Se=20crea=20el=20componente=20y=20los=20e?= =?UTF-8?q?stilos=20para=20el=20apartado=20donde=20se=20administran=20los?= =?UTF-8?q?=20pueblos=20m=C3=A1gicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sa_panel_town_screen/css/styles.css | 20 +++++++++++++++++++ .../sa_panel_town_screen.tsx | 15 ++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 web/src/components/sa_panel_town/sa_panel_town_screen/css/styles.css create mode 100644 web/src/components/sa_panel_town/sa_panel_town_screen/sa_panel_town_screen.tsx diff --git a/web/src/components/sa_panel_town/sa_panel_town_screen/css/styles.css b/web/src/components/sa_panel_town/sa_panel_town_screen/css/styles.css new file mode 100644 index 00000000..2713080d --- /dev/null +++ b/web/src/components/sa_panel_town/sa_panel_town_screen/css/styles.css @@ -0,0 +1,20 @@ +.sa_panel_town_content{ + background: gray; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} + +.town_panel_header{ + display: flex; + width: 100%; + align-items: center; + justify-content: center; +} + +.town_add_btn{ + position: absolute; + top: 50%; + right: 5px; +} \ No newline at end of file diff --git a/web/src/components/sa_panel_town/sa_panel_town_screen/sa_panel_town_screen.tsx b/web/src/components/sa_panel_town/sa_panel_town_screen/sa_panel_town_screen.tsx new file mode 100644 index 00000000..dc7bab0f --- /dev/null +++ b/web/src/components/sa_panel_town/sa_panel_town_screen/sa_panel_town_screen.tsx @@ -0,0 +1,15 @@ +import './css/styles.css' + +export const SuperadminPanelTownScreen = () => { + return ( +
+
+ Administrar pueblos mágicos +
+
+ +
+
+ ); +} \ No newline at end of file -- GitLab From 2b67846c422d66cb8e48ace8b78673b0ceb1360b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20Luna=20Hern=C3=A1ndez?= <42101656@uaz.edu.mx> Date: Thu, 18 Apr 2024 10:56:33 -0600 Subject: [PATCH 34/34] Se crea el componente del apartado donde se administran a los admins --- .../sa_panel_admin_screen/sa_panel_admin_screen.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 web/src/components/sa_panel_admin/sa_panel_admin_screen/sa_panel_admin_screen.tsx diff --git a/web/src/components/sa_panel_admin/sa_panel_admin_screen/sa_panel_admin_screen.tsx b/web/src/components/sa_panel_admin/sa_panel_admin_screen/sa_panel_admin_screen.tsx new file mode 100644 index 00000000..b91f5961 --- /dev/null +++ b/web/src/components/sa_panel_admin/sa_panel_admin_screen/sa_panel_admin_screen.tsx @@ -0,0 +1,8 @@ + +export const SuperadminPanelAdminScreen = () => { + return ( +
+ +
+ ); +} \ No newline at end of file -- GitLab