diff --git a/node_backend/uploads/1753304743847.csv b/node_backend/uploads/1753304743847.csv new file mode 100644 index 0000000000000000000000000000000000000000..2674a56aee36165817e5e8dc368d274fc0dc4adc --- /dev/null +++ b/node_backend/uploads/1753304743847.csv @@ -0,0 +1,26 @@ +"matricula","nombre","password","roles","id_carrera","telefono","correo" +"A1002","Admin","segura123","A","ISftw","4921456666","correo@personal.com" +"C0003","Coordinador electronica","segura123","C","IEInd","4921456666","correo@personal.com" +"AG0003","Admin G3","segura123","AG","","4921456666","correo@personal.com" +"C1111","cordsoft-prueba","segura123","C","ISftw","4021326553","stimpabo27@gmail.com" +"C1112","cordsoftSemi","","C","ISftwS","4021326553","stimpabo27@gmail.com" +"C0009","Coordinador electronica 2","","C","IEInd","4921456666","correo@personal.com" +"C0008","Coordinador software 3","","C","IEInd","4921456666","correo@personal.com" +"C0010","Coordinador Comp","","C","ISftwS","4921456666","correo@personal.com" +"P1001","Maria Carolina Estrada Lopez","segura123","D","","4921456666","correo@personal.com" +"P1000","Damian","segura123","D","","4921456666","docente@gmail.com" +"P1002","Sandra Esthela Rios Huerta","segura123","D","","4921456666","correo@personal.com" +"P1004","Stefano","segura123","D","","4021326553","stimpabo27@gmail.com" +"P1003","Jose Daniel Campos","segura123","D","","4921456666","correo@personal.com" +"P1007","Rafa","segura123","D","","4922425671","stimpabo27@gmail.com" +"T0014","Alessandra","segura123","T","","4921456666","correo@personal.com" +"T1111","Juan","segura123","T","","4921325678","tutor@gmail.com" +"T1234","Tutor","SEGURA123","T","","1231231231","ejemplo@gmail.com" +"T2322","tutorSemi","segura123","T","","1231231231","tutor@gmail.com" +"T3453","ejemplo","segura123","T","","1231231231","tutor@gmail.com" +"P1006","docenteSemi","segura123","D","","5553123344","ejemplo@gmail.com" +"P1005","Rafa2","segura123","D","","4021326553","stimpabo27@gmail.com" +"C0005","Coordinador de Robotica","","C","ICmp","4921456666","correo@personal.com" +"P1009","Ana Karen Alvarez Gonzalez","segura123","D","","4921456666","correo@personal.com" +"C0004","Coordinador software 2","","C","ICmp","4921456666","correo@personal.com" +"C0001","Coordinador software","segura123","C","ISftw","4921456666","correo@personal.com" \ No newline at end of file diff --git a/node_backend/uploads/1753306173344.csv b/node_backend/uploads/1753306173344.csv new file mode 100644 index 0000000000000000000000000000000000000000..5921480fd1fdd6f5c9558297486609bd483870c8 --- /dev/null +++ b/node_backend/uploads/1753306173344.csv @@ -0,0 +1,13 @@ +"matricula","nombre","password","roles","id_carrera","telefono","correo" +"A1002","Admin","segura123","A","ISftw","4921456666","correo@personal.com" +"C0003","Coordinador electronica","segura123","C","IEInd","4921456666","correo@personal.com" +"AG0003","Admin G3","segura123","AG","","4921456666","correo@personal.com" +"C1111","cordsoft-prueba","segura123","C","ISftw","4021326553","stimpabo27@gmail.com" +"P1001","Maria Carolina Estrada Lopez","segura123","D","","4921456666","correo@personal.com" +"P1000","Damian","segura123","D","","4921456666","docente@gmail.com" +"P1002","Sandra Esthela Rios Huerta","segura123","D","","4921456666","correo@personal.com" +"P1004","Stefano","segura123","D","","4021326553","stimpabo27@gmail.com" +"P1003","Jose Daniel Campos","segura123","D","","4921456666","correo@personal.com" +"P1007","Rafa","segura123","D","","4922425671","stimpabo27@gmail.com" +"T0014","Alessandra","segura123","T","","4921456666","correo@personal.com" +"T1111","Juan","segura123","T","","4921325678","tutor@gmail.com" \ No newline at end of file diff --git a/node_backend/uploads/1753306319822.csv b/node_backend/uploads/1753306319822.csv new file mode 100644 index 0000000000000000000000000000000000000000..5921480fd1fdd6f5c9558297486609bd483870c8 --- /dev/null +++ b/node_backend/uploads/1753306319822.csv @@ -0,0 +1,13 @@ +"matricula","nombre","password","roles","id_carrera","telefono","correo" +"A1002","Admin","segura123","A","ISftw","4921456666","correo@personal.com" +"C0003","Coordinador electronica","segura123","C","IEInd","4921456666","correo@personal.com" +"AG0003","Admin G3","segura123","AG","","4921456666","correo@personal.com" +"C1111","cordsoft-prueba","segura123","C","ISftw","4021326553","stimpabo27@gmail.com" +"P1001","Maria Carolina Estrada Lopez","segura123","D","","4921456666","correo@personal.com" +"P1000","Damian","segura123","D","","4921456666","docente@gmail.com" +"P1002","Sandra Esthela Rios Huerta","segura123","D","","4921456666","correo@personal.com" +"P1004","Stefano","segura123","D","","4021326553","stimpabo27@gmail.com" +"P1003","Jose Daniel Campos","segura123","D","","4921456666","correo@personal.com" +"P1007","Rafa","segura123","D","","4922425671","stimpabo27@gmail.com" +"T0014","Alessandra","segura123","T","","4921456666","correo@personal.com" +"T1111","Juan","segura123","T","","4921325678","tutor@gmail.com" \ No newline at end of file diff --git a/node_backend/uploads/1753308121000.csv b/node_backend/uploads/1753308121000.csv new file mode 100644 index 0000000000000000000000000000000000000000..fb87d08b7949cf9a1b7a584496ec8cc7841d1f4a --- /dev/null +++ b/node_backend/uploads/1753308121000.csv @@ -0,0 +1,28 @@ +matricula,nombre,password,roles,id_carrera,telefono,correo +A1002,Admin,segura123,A,ISftw,4921456666,correo@personal.com +C0003,Coordinador electronica,segura123,C,IEInd,4921456666,correo@personal.com +AG0003,Admin G3,segura123,AG,,4921456666,correo@personal.com +C1111,cordsoft-prueba,segura123,C,ISftw,4021326553,stimpabo27@gmail.com +C1112,cordsoftSemi,,C,ISftwS,4021326553,stimpabo27@gmail.com +C0009,Coordinador electronica 2,,C,IEInd,4921456666,correo@personal.com +C0008,Coordinador software 3,,C,IEInd,4921456666,correo@personal.com +C0010,Coordinador Comp,,C,ISftwS,4921456666,correo@personal.com +P1001,Maria Carolina Estrada Lopez,segura123,D,,4921456666,correo@personal.com +P1000,Damian,segura123,D,,4921456666,docente@gmail.com +P1002,Sandra Esthela Rios Huerta,segura123,D,,4921456666,correo@personal.com +P1004,Stefano,segura123,D,,4021326553,stimpabo27@gmail.com +P1003,Jose Daniel Campos,segura123,D,,4921456666,correo@personal.com +P1007,Rafa,segura123,D,,4922425671,stimpabo27@gmail.com +T0014,Alessandra,segura123,T,,4921456666,correo@personal.com +T1111,Juan,segura123,T,,4921325678,tutor@gmail.com +T1234,Tutor,SEGURA123,T,,1231231231,ejemplo@gmail.com +T2322,tutorSemi,segura123,T,,1231231231,tutor@gmail.com +T3453,ejemplo,segura123,T,,1231231231,tutor@gmail.com +P1006,docenteSemi,segura123,D,,5553123344,ejemplo@gmail.com +P1005,Rafa2,segura123,D,,4021326553,stimpabo27@gmail.com +C0005,Coordinador de Robotica,,C,ICmp,4921456666,correo@personal.com +P1009,Ana Karen Alvarez Gonzalez,segura123,D,,4921456666,correo@personal.com +C0004,Coordinador software 2,,C,ICmp,4921456666,correo@personal.com +C0001,Coordinador software,segura123,C,ISftw,4921456666,correo@personal.com +T1113,Estrella Lopez,segura123,T,,4921325678,tutor@gmail.com +T1114,Carlos Alberto,segura123,T,,4921325678,tutor@gmail.com diff --git a/react-app-native/components/HorarioSeleccion.js b/react-app-native/components/HorarioSeleccion.js index e2a2688619e762ffd363dda15f85e506748e5e9a..b63ee7d6fe757f7044992b1d628158ec5e315af4 100644 --- a/react-app-native/components/HorarioSeleccion.js +++ b/react-app-native/components/HorarioSeleccion.js @@ -16,11 +16,12 @@ function HorarioSeleccion() { const [mostrarModal, setMostrarModal] = useState(false); const [nombreAlumno, setNombreAlumno] = useState(route.params?.nombre || ""); const [matricula, setMatricula] = useState(null); + const API_URL = process.env.REACT_APP_API_URL; useEffect(() => { const fetchMaterias = async () => { try { - const response = await fetch("http://localhost:5000/api/materias"); + const response = await fetch(`${API_URL}/api/materias`); const data = await response.json(); const sortedData = data.sort((a, b) => a.grupo.localeCompare(b.grupo)); setMaterias(sortedData); diff --git a/react_frontend/src/components/AdministrarMateriasAG.js b/react_frontend/src/components/AdministrarMateriasAG.js index 22beb1922c624b2bbbc00ee0aa6503ddaafe9d05..48101af63c6e5c9bbf31716caa1bf7ad7bb216d6 100644 --- a/react_frontend/src/components/AdministrarMateriasAG.js +++ b/react_frontend/src/components/AdministrarMateriasAG.js @@ -12,6 +12,7 @@ const AdministrarMateriasAG = () => { const [loading, setLoading] = useState(true); const [mostrarModal, setMostrarModal] = useState(false); const [materiaAEliminar, setMateriaAEliminar] = useState(null); + const API_URL = process.env.REACT_APP_API_URL; const id_carrera = localStorage.getItem("id_carrera"); const navigate = useNavigate(); @@ -26,7 +27,7 @@ const AdministrarMateriasAG = () => { setLoading(true); try { const response = await axios.get( - `http://localhost:5000/api/materias` + `${API_URL}/api/materias` ); setMaterias(response.data); } catch (error) { @@ -39,7 +40,7 @@ const AdministrarMateriasAG = () => { // Cargar docentes desde el backend const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); } catch (error) { console.error("Error al obtener datos de docentes:", error); @@ -60,7 +61,7 @@ const AdministrarMateriasAG = () => { try { const response = await axios.post( - "http://localhost:5000/api/materias/exportar-csv/filtrados", + `${API_URL}/api/materias/exportar-csv/filtrados`, { ids }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AdministrarMateriasAdmin.js b/react_frontend/src/components/AdministrarMateriasAdmin.js index 7df937b7e76715005f3170360840ceeb14ab048e..091664b8134c3f6535066b3ed4f1145677c55229 100644 --- a/react_frontend/src/components/AdministrarMateriasAdmin.js +++ b/react_frontend/src/components/AdministrarMateriasAdmin.js @@ -13,6 +13,7 @@ const AdministrarMateriasAdmin = () => { const [loading, setLoading] = useState(true); const [mostrarModal, setMostrarModal] = useState(false); const [materiaAEliminar, setMateriaAEliminar] = useState(null); + const API_URL = process.env.REACT_APP_API_URL; const id_carrera = localStorage.getItem("id_carrera"); const navigate = useNavigate(); @@ -27,7 +28,7 @@ const AdministrarMateriasAdmin = () => { setLoading(true); try { const response = await axios.get( - `http://localhost:5000/api/materias/carrera/${id_carrera}` + `${API_URL}/api/materias/carrera/${id_carrera}` ); setMaterias(response.data); } catch (error) { @@ -40,7 +41,7 @@ const AdministrarMateriasAdmin = () => { // Cargar docentes desde el backend const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); } catch (error) { console.error("Error al obtener datos de docentes:", error); @@ -77,7 +78,7 @@ const AdministrarMateriasAdmin = () => { try { const response = await axios.post( - `http://localhost:5000/api/materias/exportar-csv/carrera-filtrados/${id_carrera}`, + `${API_URL}/api/materias/exportar-csv/carrera-filtrados/${id_carrera}`, { ids }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AdministrarMateriasCG.js b/react_frontend/src/components/AdministrarMateriasCG.js index 9b0423976b740d4301c150cb5e73a015ef05cc7d..a19025c6bd8891c9e9fb9e522e625e8c97056612 100644 --- a/react_frontend/src/components/AdministrarMateriasCG.js +++ b/react_frontend/src/components/AdministrarMateriasCG.js @@ -13,6 +13,9 @@ const AdministrarMateriasCG = () => { const [mostrarModal, setMostrarModal] = useState(false); const [materiaAEliminar, setMateriaAEliminar] = useState(null); + // Asegúrate de tener configurada la URL base en tu .env + const API_URL = process.env.REACT_APP_API_URL; + const id_carrera = localStorage.getItem("id_carrera"); const navigate = useNavigate(); @@ -26,7 +29,7 @@ const AdministrarMateriasCG = () => { setLoading(true); try { const response = await axios.get( - `http://localhost:5000/api/materias` + `${API_URL}/api/materias` ); setMaterias(response.data); } catch (error) { @@ -39,7 +42,7 @@ const AdministrarMateriasCG = () => { // Cargar docentes desde el backend const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); } catch (error) { console.error("Error al obtener datos de docentes:", error); @@ -55,7 +58,7 @@ const AdministrarMateriasCG = () => { const handleDelete = async () => { if (!materiaAEliminar) return; try { - await axios.delete(`http://localhost:5000/api/materias/${materiaAEliminar}`); + await axios.delete(`${API_URL}/api/materias/${materiaAEliminar}`); toast.success("Materia eliminada con éxito"); fetchMaterias(); // Recargar la lista de materias } catch (error) { diff --git a/react_frontend/src/components/AdministrarMateriasCoordinador.js b/react_frontend/src/components/AdministrarMateriasCoordinador.js index 466e49127420e38e7a0d280d08b78ce8b578ec22..c4c322c6f117e20a31533d49063362998e5c2c1b 100644 --- a/react_frontend/src/components/AdministrarMateriasCoordinador.js +++ b/react_frontend/src/components/AdministrarMateriasCoordinador.js @@ -15,7 +15,7 @@ const AdministrarMateriasCoordinador = () => { const [materiaAEliminar, setMateriaAEliminar] = useState(null); const [horasMaximas, setHorasMaximas] = useState(""); const [editMode, setEditMode] = useState(false); // Estado para controlar el modo de edición - + const API_URL = process.env.REACT_APP_API_URL; const id_carrera = localStorage.getItem("id_carrera"); const navigate = useNavigate(); @@ -30,7 +30,7 @@ const AdministrarMateriasCoordinador = () => { setLoading(true); try { const response = await axios.get( - `http://localhost:5000/api/materias/carrera/${id_carrera}` + `${API_URL}/api/materias/carrera/${id_carrera}` ); setMaterias(response.data); } catch (error) { @@ -43,7 +43,7 @@ const AdministrarMateriasCoordinador = () => { // Cargar docentes desde el backend const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); } catch (error) { console.error("Error al obtener datos de docentes:", error); @@ -59,7 +59,7 @@ const AdministrarMateriasCoordinador = () => { const handleDelete = async () => { if (!materiaAEliminar) return; try { - await axios.delete(`http://localhost:5000/api/materias/${materiaAEliminar}`); + await axios.delete(`${API_URL}/api/materias/${materiaAEliminar}`); toast.success("Materia eliminada con éxito"); fetchMaterias(); // Recargar la lista de materias } catch (error) { @@ -114,7 +114,7 @@ const AdministrarMateriasCoordinador = () => { try { const response = await axios.post( - `http://localhost:5000/api/materias/exportar-csv/carrera-filtrados/${id_carrera}`, + `${API_URL}/api/materias/exportar-csv/carrera-filtrados/${id_carrera}`, { ids }, { responseType: "blob" } ); @@ -140,7 +140,7 @@ const AdministrarMateriasCoordinador = () => { const fetchHorasCoordinador = async () => { try { const id_carrera = localStorage.getItem("id_carrera"); - const response = await axios.get(`http://localhost:5000/api/coordinadores/horas/${id_carrera}`); + const response = await axios.get(`${API_URL}/api/coordinadores/horas/${id_carrera}`); setHorasMaximas(response.data.horas); // Suponiendo que el backend regresa { horas: 40 } } catch (error) { console.error("Error al obtener las horas del coordinador:", error); @@ -160,7 +160,7 @@ const AdministrarMateriasCoordinador = () => { return; } - await axios.put(`http://localhost:5000/api/coordinadores/horas/${matricula}`, { + await axios.put(`${API_URL}/api/coordinadores/horas/${matricula}`, { horas: horasMaximas, }); toast.success(`Horas actualizadas a: ${horasMaximas}`); diff --git a/react_frontend/src/components/AdministrarPersonal.css b/react_frontend/src/components/AdministrarPersonal.css index 8872a7648bc253d78ae6ef92f38a568a320b5102..125d7027bb909ac7867c4cd5797a66e034726f5d 100644 --- a/react_frontend/src/components/AdministrarPersonal.css +++ b/react_frontend/src/components/AdministrarPersonal.css @@ -21,7 +21,7 @@ } .personal-scrollable-1 { - width: 50%; + width: 100%; max-height: 750px; text-align: center; margin: 0 auto; /* Centra el contenedor */ diff --git a/react_frontend/src/components/AdministrarPersonalAG.js b/react_frontend/src/components/AdministrarPersonalAG.js index 42d3e46e30d5c61f24f58ea6a8dcc24570d7ddc6..1abb4da513e10dfc6a3e7c39059b161ef63b20b2 100644 --- a/react_frontend/src/components/AdministrarPersonalAG.js +++ b/react_frontend/src/components/AdministrarPersonalAG.js @@ -9,7 +9,7 @@ const AdministrarPersonalAG = () => { const [personal, setPersonal] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); // Estado para el filtro de búsqueda - + const API_URL = process.env.REACT_APP_API_URL; const navigate = useNavigate(); useEffect(() => { const fetchPersonal = async () => { @@ -21,10 +21,10 @@ const AdministrarPersonalAG = () => { } try { - const response = await axios.get(`http://localhost:5000/api/personal`); + const response = await axios.get(`${API_URL}/api/personal`); const personalConCarrera = await Promise.all(response.data.map(async (persona) => { try { - const carreraResponse = await axios.get(`http://localhost:5000/api/admingen/carrera/${persona.matricula}`); + const carreraResponse = await axios.get(`${API_URL}/api/admingen/carrera/${persona.matricula}`); return { ...persona, id_carrera: carreraResponse.data.id_carrera }; } catch (error) { console.error(`Error al obtener id_carrera para ${matricula}:`, error.message); @@ -90,7 +90,7 @@ const AdministrarPersonalAG = () => { try { const response = await axios.post( - "http://localhost:5000/api/personal/exportar-csv/filtrados", + `${API_URL}/api/personal/exportar-csv/filtrados`, { matriculas }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AdministrarPersonalAdmin.js b/react_frontend/src/components/AdministrarPersonalAdmin.js index 41bc5060bcc868cc5beffdd062ad9b38e1b3dff1..f002681b21a101c77064f0ec9b77b516c5c06de2 100644 --- a/react_frontend/src/components/AdministrarPersonalAdmin.js +++ b/react_frontend/src/components/AdministrarPersonalAdmin.js @@ -20,7 +20,7 @@ const AdministrarPersonalAdmin = () => { } try { - const response = await axios.get(`http://localhost:5000/api/personal/carrera/${matricula}`); + const response = await axios.get(`${API_URL}/api/personal/carrera/${matricula}`); setPersonal(response.data); } catch (error) { console.error("Error al obtener datos del personal:", error.message); @@ -32,7 +32,7 @@ const AdministrarPersonalAdmin = () => { fetchPersonal(); }, []); - + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de tener configurada la URL base en tu .env const getRoleText = (roles) => { if (!Array.isArray(roles)) { @@ -81,7 +81,7 @@ const AdministrarPersonalAdmin = () => { try { const response = await axios.post( - `http://localhost:5000/api/personal/exportar-csv/carrera-filtrados/${id_carrera}`, + `${API_URL}/api/personal/exportar-csv/carrera-filtrados/${id_carrera}`, { matriculas }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AdministrarPersonalCG.js b/react_frontend/src/components/AdministrarPersonalCG.js index 3a2a91b74400e4e042c888d3e713799320408735..64dd2c4b586c5fe5a375b7061ed18f7614745985 100644 --- a/react_frontend/src/components/AdministrarPersonalCG.js +++ b/react_frontend/src/components/AdministrarPersonalCG.js @@ -11,6 +11,7 @@ const AdministrarPersonalCG = () => { const [searchTerm, setSearchTerm] = useState(""); // Estado para el filtro de búsqueda const [mostrarModal, setMostrarModal] = useState(false); const [usuarioAEliminar, setUsuarioAEliminar] = useState(null); + const API_URL = process.env.REACT_APP_API_URL; const navigate = useNavigate(); const id_carrera = localStorage.getItem("id_carrera"); @@ -24,10 +25,10 @@ const AdministrarPersonalCG = () => { return; } try { - const response = await axios.get(`http://localhost:5000/api/personal`); + const response = await axios.get(`${API_URL}/api/personal`); const personalConCarrera = await Promise.all(response.data.map(async (persona) => { try { - const carreraResponse = await axios.get(`http://localhost:5000/api/cordgen/carrera/${persona.matricula}`); + const carreraResponse = await axios.get(`${API_URL}/api/cordgen/carrera/${persona.matricula}`); return { ...persona, id_carrera: carreraResponse.data.id_carrera }; } catch (error) { console.error(`Error al obtener id_carrera para ${matricula}:`, error.message); @@ -54,7 +55,7 @@ const AdministrarPersonalCG = () => { const handleDelete = async () => { try { - await axios.delete(`http://localhost:5000/api/personal/${usuarioAEliminar}`); + await axios.delete(`${API_URL}/api/personal/${usuarioAEliminar}`); setPersonal(prevState => prevState.filter(persona => persona._id !== usuarioAEliminar)); toast.success("Personal eliminado con éxito"); } catch (error) { @@ -95,7 +96,7 @@ const AdministrarPersonalCG = () => { } try { const response = await axios.get( - `http://localhost:5000/api/personal/exportar-excel/carrera/${id_carrera}`, + `${API_URL}/api/personal/exportar-excel/carrera/${id_carrera}`, { responseType: "blob" } ); const url = window.URL.createObjectURL(new Blob([response.data])); diff --git a/react_frontend/src/components/AdministrarTutorados.js b/react_frontend/src/components/AdministrarTutorados.js index e77319904ff48e1a3e254ac3507dc03473b02d16..a6b02d54d1236609cac9955a16b46c588fc57c5d 100644 --- a/react_frontend/src/components/AdministrarTutorados.js +++ b/react_frontend/src/components/AdministrarTutorados.js @@ -9,6 +9,7 @@ function AdministrarTutorados() { const [searchTerm, setSearchTerm] = useState(""); // Estado para el filtro de búsqueda const navigate = useNavigate(); const { matriculaCord } = location.state || {}; + const API_URL = process.env.REACT_APP_API_URL; useEffect(() => { if (matriculaCord) { @@ -33,7 +34,7 @@ function AdministrarTutorados() { const fetchAlumnoDetails = async (alumnoId) => { try { - const alumnoResponse = await fetch(`http://localhost:5000/api/alumnos/${alumnoId}`); + const alumnoResponse = await fetch(`${API_URL}/api/alumnos/${alumnoId}`); if (!alumnoResponse.ok) { throw new Error(`Error al obtener detalles del alumno con ID ${alumnoId}`); @@ -57,7 +58,7 @@ function AdministrarTutorados() { return; } - const response = await fetch(`http://localhost:5000/api/coordinadores/matricula/${matricula}`); + const response = await fetch(`${API_URL}/api/coordinadores/matricula/${matricula}`); if (!response.ok) { throw new Error("Error al obtener los alumnos"); } @@ -78,7 +79,7 @@ function AdministrarTutorados() { // Obtener el estatus de cada alumno const fetchEstatus = async (alumno) => { try { - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) { throw new Error("Error al obtener el estatus del horario"); } diff --git a/react_frontend/src/components/AdministrarTutoradosAdmin.js b/react_frontend/src/components/AdministrarTutoradosAdmin.js index f3b3a4e955ffe35cb239b1a7340755b648a89ce9..6ff493ee84dcd7d2cb9b4370a27bb8c8fb1e4fab 100644 --- a/react_frontend/src/components/AdministrarTutoradosAdmin.js +++ b/react_frontend/src/components/AdministrarTutoradosAdmin.js @@ -9,6 +9,7 @@ function AdministrarTutoradosAdmin() { const [searchTerm, setSearchTerm] = useState(""); // Estado para el filtro de búsqueda const navigate = useNavigate(); const { matriculaAdmin } = location.state || {}; + const API_URL = process.env.REACT_APP_API_URL; useEffect(() => { if (matriculaAdmin) { @@ -33,7 +34,7 @@ function AdministrarTutoradosAdmin() { const fetchAlumnoDetails = async (alumnoId) => { try { - const alumnoResponse = await fetch(`http://localhost:5000/api/alumnos/${alumnoId}`); + const alumnoResponse = await fetch(`${API_URL}/api/alumnos/${alumnoId}`); if (!alumnoResponse.ok) { throw new Error(`Error al obtener detalles del alumno con ID ${alumnoId}`); @@ -57,7 +58,7 @@ function AdministrarTutoradosAdmin() { return; } - const response = await fetch(`http://localhost:5000/api/administradores/matricula/${matricula}`); + const response = await fetch(`${API_URL}/api/administradores/matricula/${matricula}`); if (!response.ok) { throw new Error("Error al obtener los alumnos"); } @@ -78,7 +79,7 @@ function AdministrarTutoradosAdmin() { // Obtener el estatus de cada alumno const fetchEstatus = async (alumno) => { try { - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) { throw new Error("Error al obtener el estatus del horario"); } diff --git a/react_frontend/src/components/AlumnoListAG.js b/react_frontend/src/components/AlumnoListAG.js index c0af9bd302f4f4cec86b90fe5e266c4341d0087a..0c1f89d2ab48d4c037cb3952c8f620d01cdd225c 100644 --- a/react_frontend/src/components/AlumnoListAG.js +++ b/react_frontend/src/components/AlumnoListAG.js @@ -16,19 +16,20 @@ const AlumnoListAG = () => { const [AlumnoAEliminar, setAlumnoAEliminar] = useState(null); const matriculaCord = localStorage.getItem("matricula"); const navigate = useNavigate(); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de tener configurada la URL base en tu .env useEffect(() => { const fetchAlumnos = async () => { try { // Obtener los alumnos asociados al coordinador - const response = await axios.get(`http://localhost:5000/api/alumnos`); + const response = await axios.get(`${API_URL}/api/alumnos`); const alumnosData = response.data; // Obtener los detalles del tutor para cada alumno const tutoresNombresTemp = {}; await Promise.all(alumnosData.map(async (alumno) => { if (alumno.tutor) { - const tutorResponse = await axios.get(`http://localhost:5000/api/coordinadores/alumnos/${alumno.tutor}`); + const tutorResponse = await axios.get(`${API_URL}/api/coordinadores/alumnos/${alumno.tutor}`); tutoresNombresTemp[alumno._id] = tutorResponse.data.nombre; // Extraer el nombre del tutor } })); @@ -36,7 +37,7 @@ const AlumnoListAG = () => { const fetchEstatus = async (alumno) => { try { // - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) { throw new Error("Error al obtener el estatus del horario"); } @@ -81,7 +82,7 @@ const AlumnoListAG = () => { try { const response = await axios.post( - "http://localhost:5000/api/alumnos/exportar-csv/filtrados", + `${API_URL}/api/alumnos/exportar-csv/filtrados`, { matriculas }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AlumnoListAdmin.js b/react_frontend/src/components/AlumnoListAdmin.js index e9f23841424f04996a5025abd6d103d81e6bdeaf..35f9c913a1f8e7b841070a7ae45bacd9fcc994b5 100644 --- a/react_frontend/src/components/AlumnoListAdmin.js +++ b/react_frontend/src/components/AlumnoListAdmin.js @@ -17,20 +17,21 @@ const AlumnoListAdmin = () => { const [loading, setLoading] = useState(true); const [AlumnoAEliminar, setAlumnoAEliminar] = useState(null); const matriculaAdmin = localStorage.getItem("matricula"); + const API_URL = process.env.REACT_APP_API_URL; const navigate = useNavigate(); useEffect(() => { const fetchAlumnos = async () => { try { // Obtener los alumnos asociados al administrador - const response = await axios.get(`http://localhost:5000/api/alumnos/carrera-admin/${matriculaAdmin}`); + const response = await axios.get(`${API_URL}/api/alumnos/carrera-admin/${matriculaAdmin}`); const alumnosData = response.data; // Obtener los detalles del tutor para cada alumno const tutoresNombresTemp = {}; await Promise.all(alumnosData.map(async (alumno) => { if (alumno.tutor) { - const tutorResponse = await axios.get(`http://localhost:5000/api/administradores/alumnos/${alumno.tutor}`); + const tutorResponse = await axios.get(`${API_URL}/api/administradores/alumnos/${alumno.tutor}`); tutoresNombresTemp[alumno._id] = tutorResponse.data.nombre; // Extraer el nombre del tutor } })); @@ -38,7 +39,7 @@ const AlumnoListAdmin = () => { const fetchEstatus = async (alumno) => { try { // - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) { throw new Error("Error al obtener el estatus del horario"); } @@ -72,7 +73,7 @@ const AlumnoListAdmin = () => { const handleDownloadCSV = async () => { const ids = alumnosFiltrados.map(a => a._id); const response = await axios.post( - `http://localhost:5000/api/alumnos/exportar-csv/carrera-filtrados/${id_carrera}`, + `${API_URL}/api/alumnos/exportar-csv/carrera-filtrados/${id_carrera}`, { ids }, { responseType: "blob" } ); diff --git a/react_frontend/src/components/AlumnoListCG.js b/react_frontend/src/components/AlumnoListCG.js index c61db7403d02b2118f311ea1169fa0514335e917..5e29d835349af2d794d7c66b659296da469562c0 100644 --- a/react_frontend/src/components/AlumnoListCG.js +++ b/react_frontend/src/components/AlumnoListCG.js @@ -17,11 +17,12 @@ const AlumnoListCG = () => { const matriculaCord = localStorage.getItem("matricula"); const id_carrera = localStorage.getItem("id_carrera"); const navigate = useNavigate(); + const API_URL = process.env.REACT_APP_API_URL; useEffect(() => { const fetchAlumnos = async () => { try { - const response = await axios.get(`http://localhost:5000/api/alumnos`); + const response = await axios.get(`${API_URL}/api/alumnos`); const alumnosData = response.data; // Obtener los nombres de los tutores @@ -29,7 +30,7 @@ const AlumnoListCG = () => { await Promise.all(alumnosData.map(async (alumno) => { if (alumno.tutor) { try { - const tutorResponse = await axios.get(`http://localhost:5000/api/coordinadores/alumnos/${alumno.tutor}`); + const tutorResponse = await axios.get(`${API_URL}/api/coordinadores/alumnos/${alumno.tutor}`); tutoresNombresTemp[alumno._id] = tutorResponse.data.nombre; } catch (error) { tutoresNombresTemp[alumno._id] = "Error al obtener tutor"; @@ -40,7 +41,7 @@ const AlumnoListCG = () => { // Obtener estatus para cada alumno const fetchEstatus = async (alumno) => { try { - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) throw new Error("Error al obtener el estatus del horario"); const estatusData = await estatusResponse.json(); return { ...alumno, estatus: estatusData.estatus }; @@ -60,7 +61,7 @@ const AlumnoListCG = () => { // Consultar el estado de comprobante por cada carrera await Promise.all(carrerasUnicas.map(async (carrera) => { try { - const res = await axios.get(`http://localhost:5000/api/coordinadores/comprobante-habilitado/${carrera}`); + const res = await axios.get(`${API_URL}/api/coordinadores/comprobante-habilitado/${carrera}`); comprobanteCarreraTemp[carrera] = res.data.comprobantePagoHabilitado; } catch (error) { comprobanteCarreraTemp[carrera] = true; // Por defecto true si falla @@ -75,7 +76,7 @@ const AlumnoListCG = () => { const fetchComprobantes = async () => { try { - const response = await axios.get('http://localhost:5000/api/alumnos/comprobantes/lista'); + const response = await axios.get(`${API_URL}/api/alumnos/comprobantes/lista`); setComprobantes(response.data); } catch (error) { setComprobantes([]); @@ -127,7 +128,7 @@ const AlumnoListCG = () => { const handleDelete = async () => { try { - await axios.delete(`http://localhost:5000/api/alumnos/${AlumnoAEliminar}`); + await axios.delete(`${API_URL}/api/alumnos/${AlumnoAEliminar}`); setAlumnos(prevState => prevState.filter(alumno => alumno._id !== AlumnoAEliminar)); toast.success("Alumno eliminado con éxito"); setMostrarModal(false); diff --git a/react_frontend/src/components/AlumnoListCoord.js b/react_frontend/src/components/AlumnoListCoord.js index de9527b1b46a8858173408264fb2e3d1a0970e11..e54e0879d3e8482ff207677b0b813614b1fab7fb 100644 --- a/react_frontend/src/components/AlumnoListCoord.js +++ b/react_frontend/src/components/AlumnoListCoord.js @@ -21,12 +21,14 @@ const AlumnoListCoord = () => { const [AlumnoAEliminar, setAlumnoAEliminar] = useState(null); const matriculaCord = localStorage.getItem("matricula"); const navigate = useNavigate(); + const API_URL = process.env.REACT_APP_API_URL; + useEffect(() => { // Obtener alumnos y tutores const fetchAlumnos = async () => { try { - const response = await axios.get(`http://localhost:5000/api/alumnos/carrera/${matriculaCord}`); + const response = await axios.get(`${API_URL}/api/alumnos/carrera/${matriculaCord}`); const alumnosData = response.data; // Obtener los nombres de los tutores @@ -34,7 +36,7 @@ const AlumnoListCoord = () => { await Promise.all(alumnosData.map(async (alumno) => { if (alumno.tutor) { try { - const tutorResponse = await axios.get(`http://localhost:5000/api/coordinadores/alumnos/${alumno.tutor}`); + const tutorResponse = await axios.get(`${API_URL}/api/coordinadores/alumnos/${alumno.tutor}`); tutoresNombresTemp[alumno._id] = tutorResponse.data.nombre; } catch (error) { tutoresNombresTemp[alumno._id] = "Error al obtener tutor"; @@ -45,7 +47,7 @@ const AlumnoListCoord = () => { // Obtener estatus de horario para cada alumno const fetchEstatus = async (alumno) => { try { - const estatusResponse = await fetch(`http://localhost:5000/api/tutores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/tutores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) throw new Error("Error al obtener el estatus del horario"); const estatusData = await estatusResponse.json(); return { ...alumno, estatus: estatusData.estatus }; @@ -66,7 +68,7 @@ const AlumnoListCoord = () => { // Obtener lista de comprobantes const fetchComprobantes = async () => { try { - const response = await axios.get('http://localhost:5000/api/alumnos/comprobantes/lista'); + const response = await axios.get(`${API_URL}/api/alumnos/comprobantes/lista`); setComprobantes(response.data); } catch (error) { console.error('Error al obtener la lista de comprobantes:', error); @@ -76,7 +78,7 @@ const AlumnoListCoord = () => { // Obtener si el comprobante está habilitado const fetchComprobanteHabilitado = async () => { try { - const res = await axios.get(`http://localhost:5000/api/coordinadores/comprobante-habilitado/${id_carrera}`); + const res = await axios.get(`${API_URL}/api/coordinadores/comprobante-habilitado/${id_carrera}`); setComprobanteHabilitado(res.data.comprobantePagoHabilitado); setMostrarComprobante(res.data.comprobantePagoHabilitado); // Sincroniza el estado visual } catch (error) { @@ -104,7 +106,7 @@ const AlumnoListCoord = () => { const handleDownloadCSV = async () => { const ids = alumnosFiltrados.map(a => a._id); const response = await axios.post( - `http://localhost:5000/api/alumnos/exportar-csv/carrera-filtrados/${id_carrera}`, + `${API_URL}/api/alumnos/exportar-csv/carrera-filtrados/${id_carrera}`, { ids }, { responseType: "blob" } ); @@ -138,7 +140,7 @@ const AlumnoListCoord = () => { setComprobanteHabilitado(nuevoEstado); setMostrarComprobante(nuevoEstado); try { - await axios.put(`http://localhost:5000/api/coordinadores/comprobante-habilitado/${id_carrera}`, { + await axios.put(`${API_URL}/api/coordinadores/comprobante-habilitado/${id_carrera}`, { comprobantePagoHabilitado: nuevoEstado }); toast.success(nuevoEstado ? "Comprobante habilitado" : "Comprobante deshabilitado"); @@ -159,7 +161,7 @@ const AlumnoListCoord = () => { const handleDelete = async () => { try { - await axios.delete(`http://localhost:5000/api/alumnos/${AlumnoAEliminar}`); + await axios.delete(`${API_URL}/api/alumnos/${AlumnoAEliminar}`); setAlumnos(prevState => prevState.filter(alumno => alumno._id !== AlumnoAEliminar)); toast.success("Alumno eliminado con éxito"); setMostrarModal(false); diff --git a/react_frontend/src/components/AsignarTutor.js b/react_frontend/src/components/AsignarTutor.js index 69317dd9c80811b78ba099cecc302b666c968dde..83a4d40f10c005d649b4bb7d4273180519ef1fd3 100644 --- a/react_frontend/src/components/AsignarTutor.js +++ b/react_frontend/src/components/AsignarTutor.js @@ -9,17 +9,18 @@ function AsignarTutor() { const location = useLocation(); const [personal, setPersonal] = useState([]); const [alumnos, setAlumnos] = useState([]); + const API_URL = process.env.REACT_APP_API_URL; useEffect(() => { // Fetch de personal desde el servidor - fetch("http://localhost:5000/api/personal") + fetch(`${API_URL}/api/personal`) .then((response) => response.json()) .then((data) => setPersonal(data)) .catch((error) => console.error("Error al obtener el personal:", error)); }, []); useEffect(() => { - axios.get('http://localhost:5000/api/alumnos') + axios.get(`${API_URL}/api/alumnos`) .then(response => { setAlumnos(response.data); }) diff --git a/react_frontend/src/components/CoordinadorTutor.js b/react_frontend/src/components/CoordinadorTutor.js index 271690dc0b5c8409592c21c5ee4319808f28a831..96ec650229b225e1c09a2d4cd9521ddc61aaedb6 100644 --- a/react_frontend/src/components/CoordinadorTutor.js +++ b/react_frontend/src/components/CoordinadorTutor.js @@ -7,6 +7,7 @@ function CoordinadorTutor() { const [error, setError] = useState(null); const location = useLocation(); const navigate = useNavigate(); + const API_URL = process.env.REACT_APP_API_URL; const { nombre, matricula: matriculaCoordinador } = location.state || {}; @@ -43,7 +44,7 @@ function CoordinadorTutor() { return; } - const response = await fetch(`http://localhost:5000/api/coordinadores/${matricula}`); + const response = await fetch(`${API_URL}/api/coordinadores/${matricula}`); if (!response.ok) { throw new Error("Error al obtener los alumnos"); } @@ -52,7 +53,7 @@ function CoordinadorTutor() { const fetchEstatus = async (alumno) => { try { - const estatusResponse = await fetch(`http://localhost:5000/api/coordinadores/estatus/${alumno.matricula}`); + const estatusResponse = await fetch(`${API_URL}/api/coordinadores/estatus/${alumno.matricula}`); if (!estatusResponse.ok) { throw new Error("Error al obtener el estatus del horario"); } diff --git a/react_frontend/src/components/CrearAlumno.js b/react_frontend/src/components/CrearAlumno.js index 06b64be49bc04c22dc6b7570bb602c9e8c6df1b1..ffc897ecc03bb5da08297f1a271b575f4e5a71b4 100644 --- a/react_frontend/src/components/CrearAlumno.js +++ b/react_frontend/src/components/CrearAlumno.js @@ -13,6 +13,7 @@ function CrearAlumno() { const id_carrera = localStorage.getItem("id_carrera"); const { matriculaCord } = location.state || {}; const [file, setFile] = useState(null); // Estado para el archivo + const API_URL = process.env.REACT_APP_API_URL; const [form, setForm] = useState({ nombre: "", matricula: "", @@ -27,7 +28,7 @@ function CrearAlumno() { useEffect(() => { const fetchTutores = async () => { try { - const response = await axios.get(`http://localhost:5000/api/coordinadores/tutores/${(matriculaCord)}`); + const response = await axios.get(`${API_URL}/api/coordinadores/tutores/${(matriculaCord)}`); setTutores(response.data); // Suponiendo que la API regresa un array de objetos [{_id, nombre}] } catch (error) { console.error("Error al obtener tutores:", error); @@ -53,7 +54,7 @@ function CrearAlumno() { try { const response = await axios.post( - `http://localhost:5000/api/alumnos/subir-csv/carrera/${id_carrera}`, // <-- Ahora incluye id_carrera + `${API_URL}/api/alumnos/subir-csv/carrera/${id_carrera}`, // <-- Ahora incluye id_carrera formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -88,7 +89,7 @@ function CrearAlumno() { const handleSubmit = async (e) => { e.preventDefault(); try { - const response = await axios.post("http://localhost:5000/api/alumnos", form); + const response = await axios.post(`${API_URL}/api/alumnos`, form); toast.success("Alumno agregado con éxito"); setForm({ nombre: "", matricula: "", correo: "", telefono: "", tutor: "" }); // Reset form toast.success("Alumno creado con exito"); @@ -102,7 +103,7 @@ function CrearAlumno() { const handleDownloadCSV = async () => { try { const response = await axios.get( - `http://localhost:5000/api/alumnos/exportar-csv/carrera/${id_carrera}`, + `${API_URL}/api/alumnos/exportar-csv/carrera/${id_carrera}`, { responseType: "blob", // Asegúrate de recibir el archivo como blob } diff --git a/react_frontend/src/components/CrearAlumnoCG.js b/react_frontend/src/components/CrearAlumnoCG.js index 10aa6a3122907614bc941121e93ddbdaa1334363..cb012529757b5bab82709275f38023c3c2f33c86 100644 --- a/react_frontend/src/components/CrearAlumnoCG.js +++ b/react_frontend/src/components/CrearAlumnoCG.js @@ -20,6 +20,7 @@ function CrearAlumnoCG() { tutor: "", // Nuevo campo para el tutor id_carrera: "", }); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno const carrerasPermitidas = { @@ -41,7 +42,7 @@ function CrearAlumnoCG() { useEffect(() => { const fetchTutores = async () => { try { - const response = await axios.get(`http://localhost:5000/api/cordgen/tutores`); + const response = await axios.get(`${API_URL}/api/cordgen/tutores`); // Asegurar que la respuesta tenga la propiedad tutors y sea un array antes de actualizar el estado if (Array.isArray(response.data.tutors)) { @@ -77,7 +78,7 @@ useEffect(() => { try { const response = await axios.post( - "http://localhost:5000/api/alumnos/subir-csv", + `${API_URL}/api/alumnos/subir-csv`, formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -111,7 +112,7 @@ useEffect(() => { const handleSubmit = async (e) => { e.preventDefault(); try { - const response = await axios.post("http://localhost:5000/api/cordgen/alumnos", form); + const response = await axios.post(`${API_URL}/api/cordgen/alumnos`, form); toast.success("Alumno agregado con éxito"); setForm({ nombre: "", matricula: "", correo: "", telefono: "", tutor: "" }); // Reset form navigate(-1); // Regresar a la página anterior @@ -124,7 +125,7 @@ useEffect(() => { const handleDownloadCSV = async () => { try { const response = await axios.get( - "http://localhost:5000/api/alumnos/exportar-csv", + `${API_URL}/api/alumnos/exportar-csv`, { responseType: "blob", // Asegúrate de recibir el archivo como blob } diff --git a/react_frontend/src/components/CrearMateria.js b/react_frontend/src/components/CrearMateria.js index 69b6696752ee41341d2489d216fbe0902ea8739b..9b0493edd3a14916686fa50e919f2c4cac0cc4ad 100644 --- a/react_frontend/src/components/CrearMateria.js +++ b/react_frontend/src/components/CrearMateria.js @@ -10,6 +10,7 @@ function CrearMateria() { const [mostrarModal, setMostrarModal] = useState(false); const [file, setFile] = useState(null); // Almacenar el archivo CSV const id_carrera = localStorage.getItem("id_carrera"); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno const [formData, setFormData] = useState({ id_materia: '', nombre: '', @@ -38,7 +39,7 @@ function CrearMateria() { useEffect(() => { const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); // Guardamos la lista de docentes con el nombre incluido } catch (error) { console.error("Error al obtener los docentes:", error); @@ -65,7 +66,7 @@ function CrearMateria() { try { const response = await axios.post( - `http://localhost:5000/api/materias/subir-csv-por-carrera?id_carrera=${id_carrera}`, + `${API_URL}/api/materias/subir-csv-por-carrera?id_carrera=${id_carrera}`, formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -88,7 +89,7 @@ function CrearMateria() { const handleDownloadCSV = async () => { try { const response = await axios.get( - `http://localhost:5000/api/materias/exportar-csv-por-carrera?id_carrera=${id_carrera}`, // Solo descarga materias de la carrera + `${API_URL}/api/materias/exportar-csv-por-carrera?id_carrera=${id_carrera}`, // Solo descarga materias de la carrera { responseType: "blob" } ); @@ -155,7 +156,7 @@ function CrearMateria() { ) }; - const response = await axios.post('http://localhost:5000/api/materias', finalData); + const response = await axios.post(`${API_URL}/api/materias`, finalData); toast.success('Materia creada con éxito'); setFormData({ id_materia: '', diff --git a/react_frontend/src/components/CrearMateriaCG.js b/react_frontend/src/components/CrearMateriaCG.js index 5560b4a92fa379d47d448339c76a30219978a3cd..264dfb37d684d6e9fe4f2852e67a600fc98b56f3 100644 --- a/react_frontend/src/components/CrearMateriaCG.js +++ b/react_frontend/src/components/CrearMateriaCG.js @@ -10,6 +10,7 @@ function CrearMateriaCG() { const [mostrarModal, setMostrarModal] = useState(false); const [mostrarCarrera, setMostrarCarrera] = useState(false); const [file, setFile] = useState(null); // Almacenar el archivo CSV + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno const [formData, setFormData] = useState({ id_materia: '', id_carrera: '', @@ -55,7 +56,7 @@ function CrearMateriaCG() { useEffect(() => { const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); // Guardamos la lista de docentes con el nombre incluido } catch (error) { console.error("Error al obtener los docentes:", error); @@ -82,7 +83,7 @@ function CrearMateriaCG() { try { await axios.post( - "http://localhost:5000/api/materias/subir-csv", // Cambiar la URL a 'materias' + `${API_URL}/api/materias/subir-csv`, // Cambiar la URL a 'materias' formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -98,7 +99,7 @@ function CrearMateriaCG() { const handleDownloadCSV = async () => { try { const response = await axios.get( - "http://localhost:5000/api/materias/exportar-csv", // Cambiar la URL a 'materias' + `${API_URL}/api/materias/exportar-csv`, // Cambiar la URL a 'materias' { responseType: "blob" } ); @@ -167,7 +168,7 @@ function CrearMateriaCG() { }; if (id_carrera === "ISftwS" || id_carrera === "IDsrS" || id_carrera === "IEIndS" || id_carrera === "ICmpS" || id_carrera === "IRMcaS" || id_carrera === "IElecS") { - const response = await axios.post('http://localhost:5000/api/materias', finalData); + const response = await axios.post(`${API_URL}/api/materias`, finalData); toast.success('Materia creada con éxito'); setFormData({ id_materia: '', @@ -181,7 +182,7 @@ function CrearMateriaCG() { docente: '' }); } else { - const response = await axios.post('http://localhost:5000/api/materias', finalData); + const response = await axios.post(`${API_URL}/api/materias`, finalData); toast.success('Materia creada con éxito'); setFormData({ id_materia: '', diff --git a/react_frontend/src/components/CrearPersonal.js b/react_frontend/src/components/CrearPersonal.js index 44ae8cba6704c0bccd1155d483ca6d4b8f23d2fd..69ae64d99b482726c070ac4e373fb0d7997022d2 100644 --- a/react_frontend/src/components/CrearPersonal.js +++ b/react_frontend/src/components/CrearPersonal.js @@ -18,6 +18,7 @@ function CrearPersonal() { }); const id_carrera = localStorage.getItem("id_carrera"); const matriculaCoord = localStorage.getItem("matricula"); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno const navigate = useNavigate(); @@ -72,7 +73,7 @@ function CrearPersonal() { e.preventDefault(); try { const formData = { ...form, id_carrera }; - const response = await axios.post("http://localhost:5000/api/personal", formData); + const response = await axios.post(`${API_URL}/api/personal`, formData); toast.success("Usuario agregado con éxito"); setForm({ nombre: "", matricula: "", correo: "", telefono: "", roles: "", password: "" }); } catch (error) { @@ -126,7 +127,7 @@ function CrearPersonal() { try { await axios.post( - `http://localhost:5000/api/personal/subir-csv/carrera/${id_carrera}`, // ✅ Ahora se pasa en la URL + `${API_URL}/api/personal/subir-csv/carrera/${id_carrera}`, // ✅ Ahora se pasa en la URL formData, { headers: { "Content-Type": "multipart/form-data", "x-matricula-coordinador": matriculaCoord // ✅ enviar matrícula del coordinador @@ -156,7 +157,7 @@ function CrearPersonal() { try { const response = await axios.get( - `http://localhost:5000/api/personal/exportar-csv/carrera/${id_carrera}`, + `${API_URL}/api/personal/exportar-csv/carrera/${id_carrera}`, { responseType: "blob" } // Recibir como blob para descarga ); diff --git a/react_frontend/src/components/CrearPersonalCG.js b/react_frontend/src/components/CrearPersonalCG.js index 68312ea3039cb1726c92c1501c2e48712a584d19..98b5badaa5e614b50a4dcd5c23ffdb97ca39d8ab 100644 --- a/react_frontend/src/components/CrearPersonalCG.js +++ b/react_frontend/src/components/CrearPersonalCG.js @@ -35,6 +35,8 @@ function CrearPersonal() { const navigate = useNavigate(); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno + const validarMatricula = (matricula) => { return /^(CG|AG)\d{4}$|^[A-Z]\d{4}$/.test(matricula); }; @@ -115,7 +117,7 @@ function CrearPersonal() { } try { - const response = await axios.post("http://localhost:5000/api/personal", form); + const response = await axios.post(`${API_URL}/api/personal`, form); toast.success("Usuario agregado con éxito"); setForm({ nombre: "", @@ -166,7 +168,7 @@ function CrearPersonal() { try { await axios.post( - "http://localhost:5000/api/personal/subir-csv", + `${API_URL}/api/personal/subir-csv`, formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -188,7 +190,7 @@ function CrearPersonal() { const handleDownloadCSV = async () => { try { const response = await axios.get( - "http://localhost:5000/api/personal/exportar-csv", + `${API_URL}/api/personal/exportar-csv`, { responseType: "blob" } ); diff --git a/react_frontend/src/components/CreateMateria.js b/react_frontend/src/components/CreateMateria.js index cd62b5840a637f352874eec306b148f2bcc65ba4..08674a1595b4a16cd244b34aa7c0ddccf01ed000 100644 --- a/react_frontend/src/components/CreateMateria.js +++ b/react_frontend/src/components/CreateMateria.js @@ -34,11 +34,12 @@ function CrearMateria() { const carrerasPermitidasSemiescolarizadas = ['ISftwS', 'IDsrS', 'IEIndS', 'ICmpS', 'IRMcaS', 'IElecS']; const [docentes, setDocentes] = useState([]); + const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno useEffect(() => { const fetchDocentes = async () => { try { - const response = await axios.get("http://localhost:5000/api/docentes"); + const response = await axios.get(`${API_URL}/api/docentes`); setDocentes(response.data); // Guardamos la lista de docentes con el nombre incluido } catch (error) { console.error("Error al obtener los docentes:", error); @@ -64,7 +65,7 @@ function CrearMateria() { try { await axios.post( - `http://localhost:5000/api/materias/subir-csv-por-carrera?id_carrera=${id_carrera}`, // Solo actualiza materias de la carrera + `${API_URL}/api/materias/subir-csv-por-carrera?id_carrera=${id_carrera}`, // Solo actualiza materias de la carrera formData, { headers: { "Content-Type": "multipart/form-data" } } ); @@ -81,7 +82,7 @@ function CrearMateria() { const handleDownloadCSV = async () => { try { const response = await axios.get( - `http://localhost:5000/api/materias/exportar-csv-por-carrera?id_carrera=${id_carrera}`, // Solo descarga materias de la carrera + `${API_URL}/api/materias/exportar-csv-por-carrera?id_carrera=${id_carrera}`, // Solo descarga materias de la carrera { responseType: "blob" } ); @@ -147,7 +148,7 @@ function CrearMateria() { ) }; - const response = await axios.post('http://localhost:5000/api/materias', finalData); + const response = await axios.post(`${API_URL}/api/materias`, finalData); toast.success('Materia creada con éxito'); setFormData({ id_materia: '', diff --git a/react_frontend/src/components/HistorialAcademico.js b/react_frontend/src/components/HistorialAcademico.js index 3b365f1f6dc4ed30242ca4144c4f7df2d817f26d..6da2d296e223d55790064ce100a8b0d4dbdf8c05 100644 --- a/react_frontend/src/components/HistorialAcademico.js +++ b/react_frontend/src/components/HistorialAcademico.js @@ -11,13 +11,15 @@ function getSemestreActual() { return `${año}-${periodo}`; } +const API_URL = process.env.REACT_APP_API_URL; // Asegúrate de que esta variable esté definida en tu entorno + function HistorialAcademico() { const [historiales, setHistoriales] = useState([]); const navigate = useNavigate(); useEffect(() => { // Obtener historiales académicos del backend - fetch('http://localhost:5000/api/historial') + fetch(`${API_URL}/api/historial`) .then(res => res.json()) .then(data => setHistoriales(data)) .catch(() => setHistoriales([])); @@ -44,15 +46,15 @@ const descargarArchivo = async (tipo) => { alert('ID de carrera no encontrado.'); return; } - url = `http://localhost:5000/api/personal/exportar-csv`; + url = `${API_URL}/api/personal/exportar-csv`; nombre = 'personal.csv'; // Cambia a .csv break; case 'alumnos': - url = 'http://localhost:5000/api/alumnos/exportar-csv'; + url = `${API_URL}/api/alumnos/exportar-csv`; nombre = 'alumnos.csv'; // Cambia a .csv break; case 'materias': - url = 'http://localhost:5000/api/materias/exportar-csv'; + url = `${API_URL}/api/materias/exportar-csv`; nombre = 'materias.csv'; // Cambia a .csv break; default: @@ -74,7 +76,7 @@ const descargarArchivo = async (tipo) => { const handleGenerarHistorialAcademico = async () => { try { - const response = await fetch('http://localhost:5000/api/historial/generar', { + const response = await fetch(`${API_URL}/api/historial/generar`, { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -103,7 +105,7 @@ const descargarArchivo = async (tipo) => { React.useEffect(() => { setLoading(true); - fetch(`http://localhost:5000/api/historial/fecha-borrado?semestre=${semestre}`) + fetch(`${API_URL}/api/historial/fecha-borrado?semestre=${semestre}`) .then(res => res.json()) .then(data => { setFechaBorrado(data.fecha_de_borrado ? data.fecha_de_borrado.substring(0, 10) : 'No registrada'); @@ -117,7 +119,7 @@ const descargarArchivo = async (tipo) => { if (!editFecha) return; setLoading(true); try { - const res = await fetch('http://localhost:5000/api/historial/fecha-borrado', { + const res = await fetch(`${API_URL}/api/historial/fecha-borrado`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ semestre, fecha_de_borrado: editFecha }) @@ -162,21 +164,21 @@ const descargarArchivo = async (tipo) => { {new Date(h.fecha_generacion).toLocaleString()} Descargar Descargar Descargar @@ -185,9 +187,9 @@ const descargarArchivo = async (tipo) => {