NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @namespace http://openuserjs.org/users/Francute // @name Sysacad Forro - Estado Académico // @description Mejora la página del estado académico en el sysacad (FRT-UTN). // @copyright Francute // @license MIT // @version 0.9.0 // @include http://sysacad.frt.utn.edu.ar/estadoAcademico.* // @homepageURL https://github.com/Francute/Sysacad-Estado-Academico---Script // @require https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js // @require https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js // @run-at document-end // ==/UserScript== // ==OpenUserJS== // @author Francute // ==/OpenUserJS== /* jshint ignore:start */ var inline_src = (<><![CDATA[ /* jshint ignore:end */ /* jshint esnext: false */ /* jshint esversion: 6 */ class Materia { constructor(filaMateria) { const campos = filaMateria.children; this.anoCursada = parseInt(campos[0].innerText); this.nombre = campos[1].innerText; this.estado = campos[2].innerText; this.plan = parseInt(campos[3].innerText); } esParteDeLaCarrera() { return this.anoCursada !== 0; } cursada() { return this.estado.length > 1; } regularizada() { return this.estado.search("Regularizada") !== -1; } aprobada() { return this.estado.search("Aprobada") !== -1; } notaConseguida() { return (this.aprobada()) ? parseInt(this.estado.split(" ")[2]) : "No aprobada"; } } function eliminarCabecera(textos) { textos.shift(); return textos; } const filasTabla = Array.from(document.querySelectorAll("tr.textoTabla")); const filasTodasLasMaterias = eliminarCabecera(filasTabla); const materias = filasTodasLasMaterias.map(fila => new Materia(fila)); const materiasCarrera = materias.filter(materia => materia.esParteDeLaCarrera()); const materiasCursadas = materiasCarrera.filter(materia => materia.cursada()); const materiasRegulares = materiasCursadas.filter(materia => materia.regularizada()); const materiasAprobadas = materiasCursadas.filter(materia => materia.aprobada()); const promedio = materiasAprobadas.reduce( ((sumaNotas, materia) => sumaNotas + materia.notaConseguida()), 0) / materiasAprobadas.length; /////////////////////////TODO LO DE ABAJO ES SOLO PARA LA VISTA///////////////////////// function agregarEstilos(textoCSS) { const elementoEstilosCSS = document.createElement("style"); const elementoTextoCSS = document.createTextNode(textoCSS); elementoEstilosCSS.appendChild(elementoTextoCSS); document.head.appendChild(elementoEstilosCSS); } function crearTabla(arrayFilas) { const elementoTabla = document.createElement("table"); elementoTabla.classList.add("reporte"); elementoTabla.setAttribute("align", "center"); const elementoCuerpo = document.createElement("tbody"); arrayFilas.forEach(fila => elementoCuerpo.appendChild(fila)); elementoTabla.appendChild(elementoCuerpo); return elementoTabla; } function crearCelda(tipoElemento, contenido) { const elementoCelda = document.createElement(tipoElemento); const textoCelda = document.createTextNode(contenido); elementoCelda.appendChild(textoCelda); return elementoCelda; } function crearFila(arrayContenidoCeldas) { const elementoFila = document.createElement("tr"); arrayContenidoCeldas.forEach(contenido => { elementoFila.appendChild(crearCelda("td", contenido)); }); return elementoFila; } function crearCabecera(arrayContenidoCeldas, anchoCeldas) { const elementoCabeza = document.createElement("thead"); const elementoFila = document.createElement("tr"); arrayContenidoCeldas.forEach(contenido => { const elementoCelda = crearCelda("th", contenido); elementoCelda.setAttribute("colspan", anchoCeldas); elementoFila.appendChild(elementoCelda); }); elementoCabeza.appendChild(elementoFila); return elementoCabeza; } function agregarElementoAntesDelVolver(elemento) { const elementoVolver = document.querySelector('p.textoTabla'); elementoVolver.parentElement.insertBefore(elemento, elementoVolver); } function agregarInformacionComunALaPagina() { const elementoTabla = crearTabla([ crearFila(['Materias cursadas', materiasCursadas.length]), crearFila(['Materias regularizadas', materiasRegulares.length]), crearFila(['Materias aprobadas', materiasAprobadas.length]), crearFila(['Promedio (Sin Aplazos)', '% ' + promedio]) ]); elementoTabla.classList.add("informacion"); agregarElementoAntesDelVolver(elementoTabla); } function agregarMateriasRegularesALaPagina() { const elementoTabla = crearTabla( materiasRegulares.map( (materia, indice) => crearFila( [indice + 1, materia.anoCursada, materia.nombre] ) ) ); elementoTabla.classList.add("regulares"); elementoTabla.appendChild(crearCabecera(['Materias Regularizadas'], 3)); agregarElementoAntesDelVolver(elementoTabla); } function agregarMateriasAprobadasALaPagina() { const elementoTabla = crearTabla( materiasAprobadas.map( (materia, indice) => crearFila( [indice + 1, materia.nombre, materia.notaConseguida()] ) ) ); elementoTabla.classList.add("aprobadas"); elementoTabla.appendChild(crearCabecera(['id', 'Materias Aprobadas', 'Nota'], 1)); agregarElementoAntesDelVolver(elementoTabla); } function reportar() { agregarInformacionComunALaPagina(); agregarMateriasRegularesALaPagina(); agregarMateriasAprobadasALaPagina(); } agregarEstilos('table.reporte {background-color: white; border-spacing: 0; border: .3rem solid #1565C0; margin-top: 1em; width: 700px; } table.reporte td {border: 1px solid black; } table.reporte th {background-color: #1565C0; font-size: 1.1em; color: white; text-transform: uppercase; } table.reporte td:first-child {background-color: #E3F2FD; font-weight: bold; text-align: center; } table.reporte.informacion td:first-child {text-align: right; } table.reporte.informacion td:last-child {font-weight: bold; } table.aprobadas td:last-child {font-weight: bold; text-align: center; } '); reportar(); /* jshint ignore:start */ ]]></>).toString(); var c = Babel.transform(inline_src, { presets: [ "es2015", "es2016" ] }); eval(c.code); /* jshint ignore:end */