\r\n \r\n \r\n}\r\n\r\n\r\nexport default ProfilePictureById\r\n\r\n\r\n","import * as React from \"react\"\r\n\r\nimport styled from \"styled-components\"\r\n\r\nimport StudentContentCard from \"YConnect/PagesComponents/PrePostReport/Teacher.components/BestStudentScore/StudentContentCard\"\r\nimport ProfilePictureById from \"YConnect/PagesComponents/PrePostReport/Components/ProfilePictureById\"\r\n\r\n\r\nconst CardStyle = styled.div`\r\n align-items: center;\r\n width: 100%;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\n\r\nconst CardLoadingStyle = styled(CardStyle)`\r\n.loading {\r\n left: calc(50% - 20px);\r\n position: relative;\r\n width: 40px;\r\n height: 40px;\r\n border: 4px transparent solid;\r\n border-top: 4px ${props => props.theme.main.lightPurple} solid;\r\n border-radius: 30px;\r\n animation: preload .7s infinite;\r\n animation-timing-function: linear;\r\n}\r\n\r\n \r\n@-moz-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@-webkit-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n`\r\nconst BestStudentScoreStyle = styled.div`\r\n align-items: center;\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 250px;\r\n width: 100%;\r\n\r\n @media screen and (min-width: 1024px) {\r\n width: 70%;\r\n }\r\n\r\n`\r\n\r\nconst BestStudentStyle = styled.div`\r\n align-items: center;\r\n border-right: 1px solid #E1E6E7;\r\n display: flex;\r\n flex-flow: column wrap;\r\n justify-content: center;\r\n height: 100%;\r\n padding: 32px 0;\r\n text-align:center;\r\n width: 100%;\r\n \r\n @media screen and (min-width: 1024px) {\r\n text-align: left;\r\n width: 30%;\r\n }\r\n\r\n h5 {\r\n color: #565656;\r\n font-size: 17px;\r\n font-weight: 600;\r\n margin-bottom: 35px;\r\n }\r\n\r\n span {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n margin-top: 15px;\r\n @media screen and (min-width: 1024px) {\r\n margin: 0 16px;\r\n }\r\n }\r\n`\r\n\r\nconst BestStudentScore = ({\r\n bestStudent\r\n}:any) => \r\n
\r\n {\r\n bestStudent\r\n ? Object.keys(bestStudent).length > 0\r\n ? <>\r\n \r\n Best student score
\r\n \r\n { bestStudent && bestStudent.nome }\r\n \r\n \r\n > \r\n : \r\n
No data recorded!
\r\n
\r\n \r\n : \r\n \r\n \r\n }\r\n \r\n \r\n\r\n/*\r\n
No one student have the post-test done
\r\n*/\r\nexport default BestStudentScore","import styled from \"styled-components\"\r\n\r\nconst StudentScoreStyle = styled.div`\r\n\r\n .student-score-border {\r\n border: 1px solid rgba(0, 0, 0, 0.125);\r\n border-radius: 8px;\r\n display:flex;\r\n min-height: 400px;\r\n }\r\n\r\n header {\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n h2 {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n }\r\n }\r\n\r\n tr {\r\n td:last-child {\r\n color: ${props => props.theme.main.mainPurple};\r\n font-weight: 600;\r\n }\r\n }\r\n .bestStudents {\r\n tr:first-child {\r\n td:last-child {\r\n color: ${props => props.theme.main.greentextColor};\r\n }\r\n }\r\n }\r\n\r\n .user-avatar {\r\n align-items: center;\r\n display: flex;\r\n flex-flow: row wrap;\r\n\r\n figure {\r\n margin-right: 8px;\r\n }\r\n .best-crown {\r\n background-color: #4e2d78;\r\n border-radius: 50%;\r\n height: 25px;\r\n margin-left: 25px;\r\n margin-top: -15px;\r\n position: relative;\r\n width: 25px;\r\n @media screen and (min-width: 1024px) {\r\n margin-top: 10px;\r\n position: absolute;\r\n }\r\n .white-icon {\r\n height: 25px;\r\n padding: 3px;\r\n width: 25px;\r\n }\r\n }\r\n .student-name {\r\n max-width: 100px;\r\n overflow: hidden !important;\r\n text-decoration: none;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n }\r\n`\r\n\r\nexport default StudentScoreStyle","import * as React from \"react\"\r\nimport { useState } from \"react\"\r\nimport { UncontrolledTooltip } from \"reactstrap\"\r\nimport orderBy from \"lodash/orderBy\"\r\nimport styled from \"styled-components\"\r\n\r\nimport * as crown from \"YConnect/Assets/svg/crown.svg\"\r\nimport StudentScoreStyle from \"YConnect/PagesComponents/PrePostReport/Teacher.components/StudentScore.style\"\r\n\r\nimport ProfilePictureById from \"YConnect/PagesComponents/PrePostReport/Components/ProfilePictureById\"\r\n\r\nconst CardStyle = styled.div`\r\n align-items: center;\r\n width: 100%;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\nconst CardLoadingStyle = styled(CardStyle)`\r\n .loading {\r\n left: calc(50% - 20px);\r\n position: relative;\r\n width: 40px;\r\n height: 40px;\r\n border: 4px transparent solid;\r\n border-top: 4px ${props => props.theme.main.lightPurple} solid;\r\n border-radius: 30px;\r\n animation: preload .7s infinite;\r\n animation-timing-function: linear;\r\n }\r\n\r\n \r\n @-moz-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @-webkit-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n`\r\n\r\nconst StudentScoreTable = ({ \r\n title, \r\n isBest, \r\n isOrderable, \r\n students \r\n}: any) => {\r\n\r\n const [rankedStudentEvo, setRankedStudentEvo] = useState(\"score\")\r\n\r\n const setOrder = (e: any) => {\r\n setRankedStudentEvo(e.target.value)\r\n }\r\n \r\n return
\r\n \r\n \r\n {\r\n students \r\n ? students.length > 0 \r\n ?
\r\n
\r\n \r\n \r\n Name | \r\n Duration | \r\n Correct answers | \r\n {rankedStudentEvo === \"evolution\" ? \"Evolution\" : \"Score\"} | \r\n
\r\n \r\n \r\n {students && (rankedStudentEvo === \"evolution\" \r\n ? orderBy(students, \"evolucao\", \"desc\")\r\n : students\r\n ).map((student: any, key: any) => {\r\n return (\r\n \r\n \r\n \r\n {\r\n isBest \r\n && key === 0\r\n && \r\n  \r\n \r\n }\r\n {student.nome}\r\n \r\n {student.nome}\r\n \r\n | \r\n {Math.floor(student.duracao / 60)}:00 | \r\n {student.respCorretas} | \r\n \r\n {\r\n rankedStudentEvo === \"evolution\"\r\n ? `${student.evolucao}%`\r\n : `${(student.media * 100).toFixed(1)}%`\r\n }\r\n | \r\n
\r\n )\r\n })}\r\n\r\n \r\n
\r\n
\r\n :
No students!
\r\n :
\r\n \r\n \r\n }\r\n
\r\n \r\n}\r\n\r\n/*\r\n\r\n*/\r\nexport default StudentScoreTable","import * as React from \"react\"\r\nimport { Row, Col } from \"reactstrap\"\r\n\r\nimport TabReportStyle from \"YConnect/PagesComponents/PrePostReport/Teacher.report/TabReport.style\"\r\n\r\nimport ClassTeacher from \"YConnect/PagesComponents/PrePostReport/Teacher.components/ClassTeacher\"\r\nimport BestStudentScore from \"YConnect/PagesComponents/PrePostReport/Teacher.components/BestStudentScore\"\r\nimport StudentScoreTable from \"YConnect/PagesComponents/PrePostReport/Teacher.components/StudentScoreTable\"\r\n\r\n\r\nconst TabReport = ({\r\n isPost,\r\n teacherInfo, \r\n bestStudents,\r\n bestStudents2,\r\n semesterIdSelected,\r\n establishmentIdSelected\r\n}: any) => \r\n
\r\n \r\n \r\n student.flIsPre === (isPost?false:true))[0] || {}\r\n : undefined \r\n }/>\r\n \r\n \r\n
\r\n\r\n {\r\n semesterIdSelected\r\n && establishmentIdSelected\r\n && semesterIdSelected !== \"\"\r\n && establishmentIdSelected !== \"\"\r\n && \r\n \r\n student.flIsPre === (isPost?false:true))}\r\n isOrderable = {(isPost?true:false)}/>\r\n \r\n \r\n student.flIsPre === (isPost?false:true))}\r\n isOrderable = {(isPost?true:false)}/>\r\n \r\n
\r\n }\r\n\r\n \r\n\r\nexport default TabReport","import {useEffect, useReducer} from \"react\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport getRequestConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\ntype ReportAction = {\r\n name : string\r\n report ?: any \r\n}\r\n\r\nconst useReport = ({\r\n classIdSelected,\r\n courseIdSelected,\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected\r\n}: any) => {\r\n \r\n const [{\r\n teacherInfo,\r\n bestStudents,\r\n bestStudents2\r\n }, setReport] = useReducer((state:any, {name, report}:ReportAction) => {\r\n return {...state, [name]:report}\r\n }, {})\r\n\r\n useEffect(()=>{\r\n\r\n setReport({name:\"teacherInfo\", report: undefined})\r\n API\r\n .PrePostTest\r\n .GetProfessor({ \r\n idProfessor: teacherIdSelected\r\n }, getRequestConfig())\r\n .then((response: any) => setReport({name:\"teacherInfo\", report: response.data.professor}))\r\n\r\n\r\n setReport({name:\"bestStudents\", report: undefined})\r\n API\r\n .PrePostTest\r\n .GetBestRankedStudents({\r\n idProfessor : !(classIdSelected && classIdSelected !== \"\") ? teacherIdSelected: \"\",\r\n idClassebrs : classIdSelected,\r\n idCursobrs : courseIdSelected,\r\n idAnoSemestrebrs : semesterIdSelected,\r\n idEstabelecimentobrs : establishmentIdSelected,\r\n regionalbrs : \"\"\r\n }, getRequestConfig())\r\n .then((response:any) => setReport({name:\"bestStudents\", report: response.data.bestRankedStudents}))\r\n\r\n if(\r\n semesterIdSelected\r\n && establishmentIdSelected\r\n && semesterIdSelected !== \"\"\r\n && establishmentIdSelected !== \"\"\r\n ){\r\n setReport({name:\"bestStudents2\", report: undefined})\r\n API\r\n .PrePostTest\r\n .GetScoreTurma({\r\n idGrupoSt : classIdSelected || \"\",\r\n idCursoSt : courseIdSelected || \"\",\r\n idAnoSemestreSt : semesterIdSelected,\r\n idEstabelecimentoSt : establishmentIdSelected,\r\n regionalSt : \"\",\r\n idProfessorSt : teacherIdSelected\r\n\r\n }, getRequestConfig())\r\n .then((response:any) => setReport({name:\"bestStudents2\", report: response.data}))\r\n }\r\n\r\n }, [\r\n classIdSelected, \r\n courseIdSelected, \r\n semesterIdSelected, \r\n establishmentIdSelected\r\n ])\r\n\r\n return {teacherInfo, bestStudents, bestStudents2}\r\n}\r\n\r\nexport default useReport","import * as React from \"react\"\r\n\r\nimport TabStyle from \"YConnect/Styles/Tab.style\"\r\nimport TabContentStyle from \"YConnect/PagesComponents/PrePostReport/Components/TabContent.style\"\r\nimport TabReport from \"YConnect/PagesComponents/PrePostReport/Teacher.report/TabReport\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/Teacher.report/useReport\"\r\n\r\nconst TabsResult = ({\r\n classIdSelected,\r\n courseIdSelected,\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected\r\n}: any) => {\r\n\r\n const {\r\n teacherInfo,\r\n bestStudents,\r\n bestStudents2\r\n } = useReport({\r\n classIdSelected,\r\n courseIdSelected,\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected\r\n })\r\n\r\n return
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n}\r\n\r\nexport default TabsResult","import * as React from \"react\"\r\nimport {\r\n useState, \r\n useContext\r\n} from \"react\"\r\nimport { Row, Col} from \"reactstrap\"\r\n\r\nimport AverageResultScore from \"YConnect/PagesComponents/PrePostReport/Components/AverageResultScore\"\r\nimport StudentVision from \"YConnect/PagesComponents/PrePostReport/Components/StudentVision\"\r\nimport Filters from \"YConnect/Components/Filters\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/Components/useReport\"\r\nimport useQueryParams from \"YConnect/PagesComponents/PrePostReport/Components/useQueryParams\"\r\n\r\nimport useFilter from \"YConnect/PagesComponents/PrePostReport/Teacher.report/useFilter\"\r\nimport useCombo from \"YConnect/PagesComponents/PrePostReport/Teacher.report/useCombo\"\r\nimport TabsResult from \"YConnect/PagesComponents/PrePostReport/Teacher.report/TabsResult\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\n\r\nconst ReportContainer = ({\r\n queryParams,\r\n onChangeQueryParams\r\n}:any) => {\r\n\r\n const [hasFilterLoading, setHasFilterLoading] = useState(false)\r\n const { idProfessor }: any = useContext(UserContext)\r\n\r\n const {\r\n fiterState : [\r\n {\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected\r\n ],\r\n comboState:[\r\n {\r\n semestersCombo,\r\n establishmentsCombo,\r\n coursesCombo,\r\n classesCombo,\r\n studentsCombo,\r\n periodCombo\r\n }, \r\n setCombo\r\n ]\r\n } = useReport()\r\n\r\n useQueryParams({\r\n idSelecteds:{\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected,\r\n queryParams,\r\n onChangeQueryParams\r\n })\r\n\r\n useFilter({\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setIdSelected\r\n })\r\n\r\n useCombo({\r\n semesterIdSelected,\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n teacherIdSelected: idProfessor|| \"\",\r\n studentIdSelected,\r\n setHasFilterLoading,\r\n setCombo\r\n })\r\n \r\n const handleChangeFilter = (keystone:string, value:any) => setIdSelected({[keystone]:value})\r\n\r\n return <>\r\n
\r\n \r\n \r\n \r\n
\r\n {\r\n studentIdSelected\r\n ?
\r\n : semesterIdSelected\r\n && !studentIdSelected\r\n ? <>\r\n
\r\n
\r\n >\r\n : null\r\n }\r\n >\r\n}\r\n\r\nexport default ReportContainer","import { useEffect } from \"react\"\r\n\r\nconst useFilter = ({\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setIdSelected\r\n}:any) => {\r\n\r\n useEffect(() => setIdSelected({courseIdSelected:\"\"}), [establishmentIdSelected])\r\n useEffect(() => setIdSelected({classIdSelected:\"\"}), [courseIdSelected])\r\n useEffect(() => setIdSelected({studentIdSelected:\"\"}), [classIdSelected])\r\n useEffect(() => setIdSelected({periodIdSelected:\"\"}), [studentIdSelected])\r\n}\r\n\r\nexport default useFilter","import { useEffect, useContext } from \"react\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\n\r\nimport {\r\n GetSemestersCombo,\r\n GetCoursesCombo,\r\n GetClassesCombo2,\r\n GetStudentsCombo,\r\n GetRegionalsCombo,\r\n GetEstablishmentsCombo,\r\n GetPeriodsCombo\r\n} from \"YConnect/PagesComponents/PrePostReport/Components/Combo.util\"\r\n\r\nconst useCombo = ({\r\n regionalIdSelected,\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setHasFilterLoading,\r\n setCombo\r\n}:any) => {\r\n\r\n const { \r\n idUsuario, \r\n idProfessor, \r\n profiles, \r\n estabelecimentos\r\n }: any = useContext(UserContext)\r\n \r\n useEffect(()=>{\r\n setHasFilterLoading(true)\r\n Promise.all([\r\n GetCoursesCombo(),\r\n GetSemestersCombo({\r\n idProfile : idUsuario, \r\n idProfessor : idProfessor\r\n }),\r\n GetRegionalsCombo()\r\n ])\r\n .then(([\r\n coursesCombo,\r\n semestersCombo,\r\n regionalsCombo\r\n ]) => {\r\n setCombo({coursesCombo})\r\n setCombo({semestersCombo})\r\n setCombo({regionalsCombo})\r\n })\r\n .finally(() => setHasFilterLoading(false))\r\n\r\n if (profiles.indexOf(36) > -1) {\r\n GetEstablishmentsCombo({regional: \"\"})\r\n .then(establishmentsCombo => setCombo({establishmentsCombo}))\r\n } else {\r\n setCombo({\r\n establishmentsCombo:estabelecimentos.map(({nsu_estab, nm_estab}:any)=>({id:nsu_estab,value:nm_estab}))\r\n })\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n setHasFilterLoading(true)\r\n GetEstablishmentsCombo({regional: regionalIdSelected})\r\n .then(establishmentsCombo => setCombo({establishmentsCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n }, [regionalIdSelected])\r\n\r\n\r\n useEffect(()=>{\r\n setCombo({coursesCombo:[]})\r\n setHasFilterLoading(true)\r\n GetCoursesCombo()\r\n .then((coursesCombo:any) => setCombo({coursesCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n }, [establishmentIdSelected])\r\n\r\n \r\n useEffect(()=>{\r\n setCombo({classesCombo:[]})\r\n if(courseIdSelected && courseIdSelected!==\"\"){\r\n setHasFilterLoading(true)\r\n GetClassesCombo2({\r\n idAnoSemestre : semesterIdSelected, \r\n idEstabelecimento : establishmentIdSelected,\r\n idCurso : courseIdSelected,\r\n idProfessor : \"\"\r\n })\r\n .then((classesCombo:any) => setCombo({classesCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n } \r\n }, [courseIdSelected])\r\n\r\n useEffect(()=>{\r\n setCombo({studentsCombo:[]})\r\n if(classIdSelected && classIdSelected!==\"\"){\r\n setHasFilterLoading(true)\r\n GetStudentsCombo({idGrupo : classIdSelected})\r\n .then((studentsCombo:any) => setCombo({studentsCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n } \r\n }, [classIdSelected])\r\n\r\n useEffect(()=>{\r\n if(studentIdSelected && studentIdSelected!==\"\"){\r\n setCombo({periodCombo:[]});\r\n setHasFilterLoading(true);\r\n\r\n GetPeriodsCombo({id_curso_matricula:courseIdSelected, id_aluno_matricula:studentIdSelected})\r\n .then((periodCombo: any) => setCombo({periodCombo}))\r\n .finally(() => setHasFilterLoading(false));\r\n }\r\n }, [studentIdSelected])\r\n}\r\n\r\nexport default useCombo","\r\nimport styled from \"styled-components\"\r\n\r\nconst RankedClassStyle = styled.div`\r\n\r\n .order-header {\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n\r\n }\r\n\r\n .tabscore-title {\r\n color: #565656;\r\n font-weight: 600;\r\n font-size: 20px;\r\n }\r\n\r\n .rankedCard {\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n padding: 40px 10px;\r\n min-height: 296px;\r\n @media screen and (min-width: 1024px) {\r\n padding: 40px 30px;\r\n }\r\n }\r\n \r\n .ranked-item{\r\n align-items: center;\r\n display: flex; \r\n flex-flow: row wrap; \r\n justify-content: space-between; \r\n width: 100%;\r\n @media screen and (min-width: 1024px) {\r\n flex-flow: row nowrap; \r\n }\r\n\r\n .item-counter {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n width: 10%;\r\n }\r\n\r\n .item-about {\r\n width: 80%;\r\n }\r\n\r\n .item-progress {\r\n width: 40%;\r\n margin: 0 16px;\r\n }\r\n .item-percent {\r\n margin-left: 8px;\r\n width: 30%;\r\n @media screen and (min-width: 1024px) {\r\n width: 10%;\r\n }\r\n }\r\n }\r\n`\r\n\r\nexport default RankedClassStyle","import * as React from \"react\"\r\nimport orderBy from \"lodash/orderBy\"\r\nimport styled from \"styled-components\"\r\n\r\nimport LineProgressStyle from \"YConnect/Styles/LineProgress.style\"\r\nimport RankedClassStyle from \"YConnect/PagesComponents/PrePostReport/Components/RankedProgressBar/RankedClass.style\"\r\n\r\n\r\nconst CardLoadingStyle = styled.div`\r\n .loading {\r\n left: calc(50% - 20px);\r\n position: relative;\r\n width: 40px;\r\n height: 40px;\r\n border: 4px transparent solid;\r\n border-top: 4px ${props => props.theme.main.lightPurple} solid;\r\n border-radius: 30px;\r\n animation: preload .7s infinite;\r\n animation-timing-function: linear;\r\n }\r\n\r\n \r\n @-moz-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @-webkit-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n`\r\n\r\nconst CardLoading = () => \r\n
\r\n \r\n\r\n\r\nconst RankedProgressBar = ({\r\n title, \r\n isOrderable, \r\n prePost,\r\n className\r\n}:any) => {\r\n const [rankedStudentEvo, setRankedStudentEvo] = React.useState(\"score\")\r\n\r\n const setOrder = (e: any) => {\r\n setRankedStudentEvo(e.target.value)\r\n }\r\n\r\n return
\r\n \r\n \r\n {!prePost &&
}\r\n\r\n {\r\n prePost && \r\n (prePost.length > 0\r\n ? (rankedStudentEvo === \"evolution\" \r\n ? orderBy(prePost, \"evolucao\", \"desc\")\r\n : prePost\r\n ).map(({ escola, nome, mediaTurma, uf, evolucao }: any, key: any) => {\r\n return
\r\n
{key + 1}\r\n
\r\n {escola || nome} {uf ? `(${uf})` : null}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {\r\n rankedStudentEvo === \"evolution\"\r\n ? `${evolucao}%`\r\n : `${(mediaTurma * 100).toFixed(1)}%`\r\n }\r\n \r\n
\r\n })\r\n :
\r\n
No data recorded!
\r\n
\r\n )\r\n }\r\n
\r\n \r\n}\r\n\r\nexport default RankedProgressBar","import styled from \"styled-components\"\r\n\r\nconst TabReportStyle = styled.div`\r\n background-color: ${props => props.theme.main.backgroundWhite};\r\n`\r\n\r\nexport default TabReportStyle","import styled from \"styled-components\"\r\n\r\nconst MapLineStyle = styled.div`\r\n\r\n .map-line {\r\n border-bottom: 0.3px solid #C5CBCC;\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n width: 100%;\r\n\r\n .map-line-city {\r\n display: flex;\r\n flex-flow: row wrap;\r\n width: 75%;\r\n .counter {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n margin-right: 10px;\r\n }\r\n\r\n .rank {\r\n span {\r\n color: #00A281;\r\n }\r\n }\r\n .city {\r\n align-items: center;\r\n color: #565656;\r\n display: flex;\r\n margin-right: 8px;\r\n max-width: 150px;\r\n overflow: hidden !important;\r\n text-decoration: none;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n display: block;\r\n }\r\n }\r\n\r\n .map-line-percent {\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n margin: 0;\r\n .total-percent {\r\n font-size: 17px;\r\n font-weight: 600;\r\n }\r\n .difference-percent {\r\n color: #00A281;\r\n }\r\n }\r\n }\r\n`\r\n\r\nexport default MapLineStyle","const brazil = {\"type\":\"Topology\",\"arcs\":[[[45,6303],[766,-248],[799,-406]],[[1610,5649],[49,-21]],[[1659,5628],[-438,-293],[-467,25],[29,384],[-378,-140],[-405,593],[45,106]],[[8431,5482],[-362,240]],[[8069,5722],[-45,53]],[[8024,5775],[291,-24],[394,118]],[[8709,5869],[-278,-387]],[[4288,8624],[440,-61],[312,547],[185,-560],[172,-109],[-34,-240]],[[5363,8201],[-455,-467],[-297,599],[-296,130],[-27,161]],[[3554,6246],[-62,-349],[-710,-1]],[[2782,5896],[-457,201],[-119,-240],[-596,-208]],[[45,6303],[147,149],[70,341],[488,237],[154,-63],[132,741],[-157,291],[48,449],[387,4],[166,124],[67,-261],[347,-126],[486,379]],[[2380,8568],[150,-66],[116,-551],[-70,-109],[228,-194],[12,230],[202,-59],[110,276],[256,0]],[[3384,8095],[129,-341],[368,-260],[131,43],[-534,-1132],[76,-159]],[[7697,3580],[-2,-3]],[[7695,3577],[-123,90]],[[7572,3667],[-90,139],[172,314],[-331,90],[-105,156],[-388,69],[-102,133],[-469,-242],[9,95]],[[6268,4421],[-18,475]],[[6250,4896],[-112,395],[200,275]],[[6338,5566],[178,-187],[227,122],[33,239],[170,8]],[[6946,5748],[12,-6]],[[6958,5742],[359,176]],[[7317,5918],[130,-181],[313,223],[264,-185]],[[8069,5722],[-53,-332],[156,-161]],[[8172,5229],[-164,-323]],[[8008,4906],[-196,-214],[66,-510],[-63,-445],[-118,-157]],[[7945,6469],[-35,-288]],[[7910,6181],[-412,56]],[[7498,6237],[-157,613],[-16,473]],[[7325,7323],[318,11],[595,-475]],[[8238,6859],[-293,-390]],[[5982,4139],[1,-4]],[[5983,4135],[-218,0],[18,134],[199,-130]],[[7201,2991],[209,317],[-53,248],[215,111]],[[7695,3577],[-14,-272],[-275,-443]],[[7406,2862],[-205,129]],[[5169,3306],[-444,201],[-35,146]],[[4690,3653],[7,273],[439,485],[128,499]],[[5264,4910],[432,-111],[554,97]],[[6268,4421],[-198,-43],[-88,-239]],[[5983,4135],[5,-487],[-675,-154],[-144,-188]],[[5658,6733],[374,363],[232,667]],[[6264,7763],[22,-21]],[[6286,7742],[71,-36]],[[6357,7706],[235,-107]],[[6592,7599],[-22,-124],[644,-110]],[[7214,7365],[-263,-361],[16,-592],[-250,-21],[-320,-222],[-120,-304],[11,-324]],[[6288,5541],[-252,290],[130,263],[-282,192],[56,404],[-282,43]],[[4690,3653],[-682,211],[-367,-96]],[[3641,3768],[-128,314],[-415,2],[-46,551],[-121,108]],[[2931,4743],[256,293],[-47,298],[-351,31],[-7,531]],[[3554,6246],[122,-340],[187,-157],[1465,-107]],[[5328,5642],[-115,-391],[51,-341]],[[4418,2189],[-252,27],[-99,408],[-479,47],[-33,565],[153,370],[-67,162]],[[5169,3306],[-14,-150]],[[5155,3156],[-309,-491],[-163,-125]],[[4683,2540],[-265,-351]],[[7201,2991],[-89,-231],[-569,-167]],[[6543,2593],[-348,-119],[-249,712],[-304,-49],[-369,93],[-118,-74]],[[3384,8095],[0,234]],[[3384,8329],[358,186],[298,-38],[0,168],[248,-21]],[[5363,8201],[168,-209],[733,-229]],[[5658,6733],[118,-145],[-220,-238],[-1,-308],[-227,-400]],[[6946,5748],[12,-6]],[[7945,6469],[412,-132],[73,167],[320,-47]],[[8750,6457],[15,-257]],[[8765,6200],[-469,-184],[-54,250],[-332,-85]],[[4572,1658],[-223,161],[69,370]],[[4683,2540],[699,-67],[153,-430],[280,-143]],[[5815,1900],[-143,-146]],[[5672,1754],[21,-29]],[[5693,1725],[-442,-6],[-188,-173],[-491,112]],[[7317,5918],[181,319]],[[8765,6200],[-56,-331]],[[6338,5566],[-50,-25]],[[7214,7365],[111,-42]],[[6756,2431],[-1,7]],[[6755,2438],[-193,-79]],[[6562,2359],[-19,234]],[[7406,2862],[-236,-413],[-414,-18]],[[8238,6859],[395,-80],[117,-322]],[[4520,1436],[374,-25],[345,-271],[193,-17],[11,-210]],[[5443,913],[-310,-254],[-253,-335],[-87,-324],[-939,724],[-183,-18],[414,470],[435,260]],[[2931,4743],[-203,2],[-285,214],[-297,53],[-202,241],[-10,421],[-275,-46]],[[2380,8568],[-153,70],[21,332],[666,158],[59,165],[272,-305],[-104,-245],[51,-259],[192,-155]],[[4520,1436],[52,222]],[[5693,1725],[-35,-614]],[[5658,1111],[-215,-198]],[[6756,2431],[-1,7]],[[6562,2359],[-370,-122],[-377,-337]],[[8431,5482],[-259,-253]]],\"transform\":{\"scale\":[0.0044595563485477175,0.004119741740019369],\"translate\":[-73.9882431,-33.08763885]},\"objects\":{\"gadm36_BRA_1\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"arcs\":[[0,1,2]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.1_1\",\"NAME_1\":\"Acre\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.AC\"}},{\"arcs\":[[3,4,5,6]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.2_1\",\"NAME_1\":\"Alagoas\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.AL\"}},{\"arcs\":[[7,8]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.3_1\",\"NAME_1\":\"Amapá\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.AP\"}},{\"arcs\":[[9,10,-1,11,12,13]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.4_1\",\"NAME_1\":\"Amazonas\",\"VARNAME_1\":\"Amazone\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.AM\"}},{\"arcs\":[[14,15,16,17,18,19,20,21,22,-5,23,24,25]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.5_1\",\"NAME_1\":\"Bahia\",\"VARNAME_1\":\"Ba¡a\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.BA\"}},{\"arcs\":[[26,27,28,29,30]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.6_1\",\"NAME_1\":\"Ceará\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.CE\"}},{\"arcs\":[[31,32]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.7_1\",\"NAME_1\":\"Distrito Federal\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Distrito Federal\",\"ENGTYPE_1\":\"Federal District\",\"CC_1\":\"\",\"HASC_1\":\"BR.DF\"}},{\"arcs\":[[33,-16,34,35]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.8_1\",\"NAME_1\":\"Espírito Santo\",\"VARNAME_1\":\"Espiritu Santo\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.ES\"}},{\"arcs\":[[36,37,38,-18,39,-33,40]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.9_1\",\"NAME_1\":\"Goiás\",\"VARNAME_1\":\"Goiáz|Goyáz\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.GO\"}},{\"arcs\":[[41,42,43,44,45,46,47]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.10_1\",\"NAME_1\":\"Maranhão\",\"VARNAME_1\":\"São Luíz de Maranhão\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.MA\"}},{\"arcs\":[[48,49,50,-10,51,52,-38]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.12_1\",\"NAME_1\":\"Mato Grosso\",\"VARNAME_1\":\"Matto Grosso\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.MT\"}},{\"arcs\":[[53,-49,-37,54,55,56]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.11_1\",\"NAME_1\":\"Mato Grosso do Sul\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.MS\"}},{\"arcs\":[[-55,-41,-32,-40,-17,-34,57,58]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.13_1\",\"NAME_1\":\"Minas Gerais\",\"VARNAME_1\":\"Minas|Minas Geraes\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.MG\"}},{\"arcs\":[[-14,59,60,-9,61,-42,62,-52]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.14_1\",\"NAME_1\":\"Pará\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.PA\"}},{\"arcs\":[[64,65,66,-27]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.15_1\",\"NAME_1\":\"Paraíba\",\"VARNAME_1\":\"Parahyba\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.PB\"}},{\"arcs\":[[67,-57,68,69,70,71]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.16_1\",\"NAME_1\":\"Paraná\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.PR\"}},{\"arcs\":[[-6,-23,72,-28,-67,73]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.17_1\",\"NAME_1\":\"Pernambuco\",\"VARNAME_1\":\"Pernambouc\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.PE\"}},{\"arcs\":[[-64,-20,74,-47,75,-29,-73,-22]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.18_1\",\"NAME_1\":\"Piauí\",\"VARNAME_1\":\"Piauhy\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.PI\"}},{\"arcs\":[[76,77,78,-58,-36,79]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.19_1\",\"NAME_1\":\"Rio de Janeiro\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.RJ\"}},{\"arcs\":[[80,-65,-31]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.20_1\",\"NAME_1\":\"Rio Grande do Norte\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.RN\"}},{\"arcs\":[[81,82]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.21_1\",\"NAME_1\":\"Rio Grande do Sul\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.RS\"}},{\"arcs\":[[-2,-11,-51,83]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.22_1\",\"NAME_1\":\"Rondônia\",\"VARNAME_1\":\"Guaporé\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.RO\"}},{\"arcs\":[[84,-60,-13]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.23_1\",\"NAME_1\":\"Roraima\",\"VARNAME_1\":\"Rio Branco\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.RR\"}},{\"arcs\":[[85,-72,86,87,-82]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.24_1\",\"NAME_1\":\"Santa Catarina\",\"VARNAME_1\":\"Santa Catharina\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.SC\"}},{\"arcs\":[[-56,-59,-79,89,-69]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.25_1\",\"NAME_1\":\"São Paulo\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.SP\"}},{\"arcs\":[[-24,-4,90]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.26_1\",\"NAME_1\":\"Sergipe\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.SE\"}},{\"arcs\":[[-53,-63,-48,-75,-19,-39]],\"type\":\"Polygon\",\"properties\":{\"GID_0\":\"BRA\",\"NAME_0\":\"Brazil\",\"GID_1\":\"BRA.27_1\",\"NAME_1\":\"Tocantins\",\"VARNAME_1\":\"\",\"NL_NAME_1\":\"\",\"TYPE_1\":\"Estado\",\"ENGTYPE_1\":\"State\",\"CC_1\":\"\",\"HASC_1\":\"BR.TO\"}}]}}}\r\n\r\nexport default brazil","import styled from \"styled-components\"\r\n\r\nconst LegendMapStyle = styled.div`\r\n bottom: 10%;\r\n position: absolute;\r\n\r\n .legend-line {\r\n display:flex;\r\n margin: 8px 0;\r\n }\r\n\r\n .legend {\r\n align-items: center;\r\n display: flex;\r\n flex-flow: row wrap;\r\n }\r\n\r\n .circle {\r\n border-radius: 50%;\r\n display: block;\r\n height: 20px;\r\n margin-right: 11px;\r\n width: 20px;\r\n }\r\n`\r\n\r\nexport default LegendMapStyle","import * as React from \"react\"\r\nimport {\r\n ComposableMap,\r\n ZoomableGroup,\r\n Geographies,\r\n Geography,\r\n Markers,\r\n Marker,\r\n} from \"react-simple-maps\"\r\n\r\nimport { Col } from \"reactstrap\"\r\n\r\nimport BRAZIL_MAP from \"YConnect/Configs/Sources/brazil\"\r\n\r\nimport LegendMapStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestResultsByRegion/BrazilMap/LegendMap.style\"\r\n\r\nconst getCircleColor = (color: any) => {\r\n if(color <= 60) return \"#F7B700\"\r\n else if (color > 60 && color <= 79) return \"#00B5D3\"\r\n else return \"#643E94\"\r\n}\r\n\r\nconst BrazilMap = ({mapInfo}: any) => {\r\n \r\n //const wrapperStyles = {transform: `translate(10%, -25%)`}\r\n const wrapperStyles = {}\r\n\r\n return
\r\n
\r\n \r\n \r\n \r\n {(geographies, projection) => geographies.map((geography: any, key: any) => (\r\n \r\n ))}\r\n \r\n \r\n {\r\n mapInfo && mapInfo.map((city: any, i: any) => (\r\n \r\n \r\n \r\n ))\r\n }\r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n}\r\n\r\n\r\nexport default BrazilMap","import styled from \"styled-components\"\r\n\r\nconst ContentCardStyle = styled.div`\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n padding: 15px;\r\n`\r\n\r\nexport default ContentCardStyle","import styled from \"styled-components\"\r\n\r\nconst HeaderStyle = styled.div `\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n\r\n .tabscore-title {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n }\r\n`\r\n\r\nexport default HeaderStyle","import * as React from \"react\"\r\nimport styled from \"styled-components\"\r\n\r\nconst CardStyle = styled.div`\r\n align-items: center;\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\n\r\nconst CardLoadingStyle = styled(CardStyle)`\r\n.loading {\r\n left: calc(50% - 20px);\r\n position: relative;\r\n width: 40px;\r\n height: 40px;\r\n border: 4px transparent solid;\r\n border-top: 4px ${props => props.theme.main.lightPurple} solid;\r\n border-radius: 30px;\r\n animation: preload .7s infinite;\r\n animation-timing-function: linear;\r\n}\r\n\r\n \r\n@-moz-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@-webkit-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n`\r\n\r\nconst CardLoading = ({className}:any) => \r\n
\r\n \r\n \r\n\r\nexport default CardLoading","import * as React from \"react\"\r\nimport {useEffect, useState} from \"react\"\r\nimport { UncontrolledTooltip, Row } from \"reactstrap\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport getRequestConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\nimport MapLineStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestResultsByRegion/MapLine.style\"\r\nimport BrazilMap from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestResultsByRegion/BrazilMap\"\r\nimport ContentCardStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestResultsByRegion/ContentCard.style\"\r\nimport HeaderStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/Header.style\"\r\n\r\nimport CardLoading from \"YConnect/PagesComponents/PrePostReport/Components/CardLoading\"\r\n\r\nconst coordinates = [\r\n { \"coordinates\": [-70.55, -8.77], \"sigla\": \"AC\" },\r\n { \"coordinates\": [-35.73, -9.71], \"sigla\": \"AL\" },\r\n { \"coordinates\": [-61.66, -3.07], \"sigla\": \"AM\" },\r\n { \"coordinates\": [-51.77, 1.41], \"sigla\": \"AP\" },\r\n { \"coordinates\": [-38.51, -12.96], \"sigla\": \"BA\" },\r\n { \"coordinates\": [-38.54, -3.71], \"sigla\": \"CE\" },\r\n { \"coordinates\": [-47.86, -15.83], \"sigla\": \"DF\" },\r\n { \"coordinates\": [-40.34, -19.19], \"sigla\": \"ES\" },\r\n { \"coordinates\": [-49.31, -16.64], \"sigla\": \"GO\" },\r\n { \"coordinates\": [-44.30, -2.55], \"sigla\": \"MA\" },\r\n { \"coordinates\": [-55.42, -12.64], \"sigla\": \"MT\" },\r\n { \"coordinates\": [-54.54, -20.51], \"sigla\": \"MS\" },\r\n { \"coordinates\": [-44.38, -18.10], \"sigla\": \"MG\" },\r\n { \"coordinates\": [-52.29, -5.53], \"sigla\": \"PA\" },\r\n { \"coordinates\": [-35.55, -7.06], \"sigla\": \"PB\" },\r\n { \"coordinates\": [-51.55, -24.89], \"sigla\": \"PR\" },\r\n { \"coordinates\": [-35.07, -8.28], \"sigla\": \"PE\" },\r\n { \"coordinates\": [-43.68, -8.28], \"sigla\": \"PI\" },\r\n { \"coordinates\": [-43.15, -22.84], \"sigla\": \"RJ\" },\r\n { \"coordinates\": [-36.52, -5.22], \"sigla\": \"RN\" },\r\n { \"coordinates\": [-62.80, -11.22], \"sigla\": \"RO\" },\r\n { \"coordinates\": [-51.22, -30.01], \"sigla\": \"RS\" },\r\n { \"coordinates\": [-61.22, 1.89], \"sigla\": \"RR\" },\r\n { \"coordinates\": [-49.44, -27.33], \"sigla\": \"SC\" },\r\n { \"coordinates\": [-37.07, -10.90], \"sigla\": \"SE\" },\r\n { \"coordinates\": [-46.64, -23.55], \"sigla\": \"SP\" },\r\n { \"coordinates\": [-48.25, -10.25], \"sigla\": \"TO\" },\r\n]\r\n\r\nconst BestResultsByRegion = ({\r\n isPost,\r\n semesterIdSelected,\r\n regionalIdSelected\r\n}:any) => {\r\n\r\n const [mapInfo, setMapInfo] = useState()\r\n const [regionalsData, setRegionalsData] = useState()\r\n const [mapCoordinates, setMapCoordinates] = useState([])\r\n const [mapFilter, setMapFilter] = useState(\"national\")\r\n const [regionalCoordinates, setRegionalCoordinates] = useState([])\r\n\r\n useEffect(()=>{\r\n\r\n setMapInfo(undefined)\r\n setRegionalsData(undefined)\r\n setMapCoordinates([])\r\n setRegionalCoordinates([])\r\n setMapFilter(\"national\")\r\n\r\n \r\n\r\n if (semesterIdSelected && semesterIdSelected !== \"\") {\r\n API.PrePostTest.GetInformacoesRegiao({\r\n idAnoSemestreIr : semesterIdSelected, \r\n mock : false, \r\n pagina : 1, \r\n regionalIr : regionalIdSelected\r\n }, getRequestConfig())\r\n .then((response:any) => {\r\n setMapInfo(response.data.score)\r\n })\r\n\r\n API.PrePostTest.GetInformacoesRegional({\r\n idAnoSemestreRegiao : semesterIdSelected, \r\n regional : regionalIdSelected\r\n }, getRequestConfig())\r\n .then((response:any) => {\r\n \r\n setRegionalsData(response\r\n .data\r\n .score\r\n .region.filter(({fl_is_pre}:any) => fl_is_pre === (isPost?false:true)))\r\n })\r\n }\r\n }, [semesterIdSelected, regionalIdSelected])\r\n\r\n useEffect(() => {\r\n\r\n if(mapInfo && mapInfo.region){\r\n const pointsMap = mapInfo\r\n .region\r\n .reduce((acc:any, region:any) => {\r\n const state = coordinates.find((state) => state.sigla === region.sigla)\r\n if(state)\r\n acc.push({...state, ...region})\r\n\r\n return acc\r\n }, [])\r\n setMapCoordinates(pointsMap.filter((city: any) => city.fl_is_pre === (isPost?false:true)).slice(0, 10))\r\n }\r\n\r\n }, [mapInfo])\r\n\r\n\r\n useEffect(() => {\r\n\r\n if(regionalsData && coordinates) {\r\n\r\n const pointsMap = regionalsData\r\n .reduce((acc:any, region:any) => {\r\n const state = coordinates.find((state) => state.sigla === region.sigla)\r\n if(state)\r\n acc.push({...state, ...region})\r\n \r\n return acc\r\n }, [])\r\n\r\n setRegionalCoordinates(regionalsData.filter((city: any) => city.fl_is_pre === (isPost?false:true)).slice(0, 10))\r\n }\r\n\r\n }, [regionalsData])\r\n\r\n return <>\r\n
\r\n Best results by region
\r\n \r\n \r\n {!mapInfo &&
}\r\n {\r\n mapInfo \r\n &&
\r\n \r\n {\r\n window.innerWidth > 1024 \r\n && {\r\n const state = coordinates.find((state) => state.sigla === region.sigla)\r\n if(state)\r\n acc.push({...state, ...region})\r\n \r\n return acc\r\n }, [])} />\r\n }\r\n \r\n {\r\n mapFilter === \"national\"\r\n ? mapCoordinates \r\n && mapCoordinates.length > 0\r\n ? mapCoordinates.map((city: any, key: any) => {\r\n return \r\n
\r\n {key + 1}\r\n \r\n {city.nome}\r\n \r\n {city.nome}\r\n \r\n \r\n
\r\n
\r\n {(city.mediaRegion * 100).toFixed(1)}%\r\n
\r\n
\r\n })\r\n : No data!
\r\n : regionalCoordinates \r\n && regionalCoordinates.length > 0\r\n ? regionalCoordinates.map((city: any, key: any) => {\r\n return \r\n
\r\n {key + 1}\r\n \r\n {city.nome}\r\n \r\n {city.nome}\r\n \r\n \r\n
\r\n
\r\n {(city.mediaRegion * 100).toFixed(1)}%\r\n
\r\n
\r\n })\r\n : No data!
\r\n }\r\n \r\n
\r\n }\r\n >\r\n}\r\n\r\nexport default BestResultsByRegion","import styled from \"styled-components\"\r\n\r\nconst BestClassScoreStyle = styled.div `\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n min-height: 230px;\r\n margin-top: 10px;\r\n \r\n .best-class {\r\n border-bottom: 1px solid #E1E6E7;\r\n display: flex;\r\n flex-flow: row wrap;\r\n padding: 15px;\r\n .best-class-icon {\r\n background-color: #FFFFFF;\r\n border: 2px solid #E1E6E7;\r\n border-radius: 100%;\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: center;\r\n height: 60px;\r\n width: 60px;\r\n }\r\n .best-class-name {\r\n display: flex;\r\n flex-flow: column wrap;\r\n padding-left: 24px;\r\n\r\n .title {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n }\r\n\r\n .address {\r\n color: #989898;\r\n font-size: 14px;\r\n font-weight: 400;\r\n }\r\n }\r\n }\r\n .best-percent {\r\n align-items: center;\r\n border-bottom: 1px solid #E1E6E7;\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n padding: 15px;\r\n .title {\r\n color: #565656;\r\n font-size: 17px;\r\n font-weight: 600;\r\n width: 100%;\r\n }\r\n .percent {\r\n font-size: 42px;\r\n font-weight: 300;\r\n width: 50%;\r\n }\r\n .description {\r\n color: #00A281;\r\n font-size: 14px;\r\n font-weight: 400;\r\n width: 50%;\r\n }\r\n }\r\n\r\n .teacher-info {\r\n border-bottom: 1px solid #E1E6E7;\r\n padding: 15px;\r\n }\r\n`\r\n\r\nexport default BestClassScoreStyle","import * as React from \"react\"\r\nimport {useState, useEffect} from \"react\"\r\nimport styled from \"styled-components\"\r\n\r\nimport * as crown from \"YConnect/Assets/svg/crown.svg\"\r\nimport BestClassScoreStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestClassScore.style\"\r\nimport ReportTeacherInfo from \"YConnect/PagesComponents/PrePostReport/Components/ReportTeacherInfo\"\r\nimport HeaderStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.components/Header.style\"\r\n\r\nconst CardStyle2 = styled.div`\r\n align-items: center;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\n\r\nconst CardLoadingStyle = styled(CardStyle2)`\r\n.loading {\r\n left: calc(50% - 20px);\r\n position: relative;\r\n width: 40px;\r\n height: 40px;\r\n border: 4px transparent solid;\r\n border-top: 4px ${props => props.theme.main.lightPurple} solid;\r\n border-radius: 30px;\r\n animation: preload .7s infinite;\r\n animation-timing-function: linear;\r\n}\r\n\r\n \r\n@-moz-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@-webkit-keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n@keyframes preload {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n`\r\n\r\nconst CardStyle = styled.div`\r\nalign-items: center;\r\ndisplay: flex;\r\nflex-flow: row wrap;\r\nmin-height: 223px;\r\n`\r\n\r\nconst BestClassScore = ({\r\n isPost,\r\n bestClass\r\n}:any) => {\r\n\r\n const [score, setScore] = useState()\r\n\r\n useEffect(()=>{\r\n\r\n if(bestClass){\r\n setScore(bestClass.find((score:any) => score && score.fl_is_pre === !isPost) || {})\r\n }\r\n\r\n }, [bestClass])\r\n\r\n return <>\r\n
\r\n Best class score
\r\n \r\n\r\n
\r\n {\r\n score\r\n ? Object.keys(score).length > 0\r\n ? <>\r\n \r\n
\r\n

\r\n
\r\n
\r\n {score.nome}\r\n {score.endereco}\r\n
\r\n
\r\n \r\n
Overall percentage:
\r\n 0.7 ? \"#00A281\" : \"#FF1A4A\" }}\r\n >\r\n {(score.mediaTurma * 100).toFixed(1)}%\r\n \r\n \r\n \r\n \r\n
\r\n > \r\n : \r\n No one student have the post-test done
\r\n \r\n : \r\n \r\n \r\n }\r\n \r\n >\r\n}\r\n\r\nexport default BestClassScore","import * as React from \"react\"\r\nimport { Row, Col } from \"reactstrap\"\r\n\r\nimport RankedProgressBar from \"YConnect/PagesComponents/PrePostReport/Components/RankedProgressBar/index\"\r\nimport TabReportStyle from \"YConnect/PagesComponents/PrePostReport/Pearson.report/TabReport.style\"\r\n\r\nimport BestResultsByRegion from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestResultsByRegion\"\r\nimport BestClassScore from \"YConnect/PagesComponents/PrePostReport/Pearson.components/BestClassScore\"\r\n\r\nconst TabReport = ({ \r\n isPost,\r\n schoolInfo, \r\n bestClass, \r\n semesterIdSelected,\r\n regionalIdSelected\r\n}: any) => {\r\n\r\n return
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n \r\n \r\n high.fl_is_pre === (isPost?false:true))} />\r\n \r\n \r\n \r\n high.fl_is_pre === (isPost?false:true))} />\r\n \r\n
\r\n\r\n}\r\n \r\nexport default TabReport","import { useEffect, useReducer } from \"react\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport getRequestConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\ntype ReportAction = {\r\n name : string\r\n report ?: any \r\n}\r\n\r\nconst useReport = ({\r\n semesterIdSelected, \r\n regionalIdSelected, \r\n establishmentIdSelected, \r\n courseIdSelected, \r\n classIdSelected\r\n} : any) => {\r\n \r\n const [{\r\n schoolInfo,\r\n bestClass\r\n }, setReport] = useReducer((state:any, {name, report}:ReportAction) => {\r\n return {...state, [name]:report}\r\n }, {})\r\n\r\n useEffect(()=>{\r\n if (semesterIdSelected && semesterIdSelected !== \"\") {\r\n setReport({name:\"bestClass\", report: undefined})\r\n API.PrePostTest.GetBestClass({\r\n idAnoSemestrebc : semesterIdSelected, \r\n idCursobc : courseIdSelected, \r\n idEstabelecimentobc : establishmentIdSelected, \r\n idClassebc : classIdSelected,\r\n regional : regionalIdSelected\r\n \r\n }, getRequestConfig())\r\n .then((response:any) => setReport({name:\"bestClass\", report: response.data.scores || []}))\r\n\r\n setReport({name:\"schoolInfo\", report: undefined})\r\n API.PrePostTest.GetInformacoesEscolas({ \r\n idAnoSemestreEscolas : semesterIdSelected, \r\n idCurso : courseIdSelected, \r\n idEstabelecimento : establishmentIdSelected, \r\n idClasse : classIdSelected,\r\n regional : regionalIdSelected,\r\n }, getRequestConfig())\r\n .then((response: any) => setReport({name:\"schoolInfo\", report: response.data.score}))\r\n }\r\n }, [ \r\n semesterIdSelected, \r\n regionalIdSelected, \r\n establishmentIdSelected, \r\n courseIdSelected, \r\n classIdSelected\r\n ])\r\n\r\n return {schoolInfo, bestClass}\r\n}\r\n\r\nexport default useReport","import * as React from \"react\"\r\n\r\nimport TabStyle from \"YConnect/Styles/Tab.style\"\r\nimport TabContentStyle from \"YConnect/PagesComponents/PrePostReport/Components/TabContent.style\"\r\nimport TabReport from \"YConnect/PagesComponents/PrePostReport/Pearson.report/TabReport\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/Pearson.report/useReport\"\r\n\r\nconst TabsResult = ({ \r\n semesterIdSelected,\r\n regionalIdSelected,\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected\r\n} : any) => {\r\n\r\n const {\r\n schoolInfo,\r\n bestClass\r\n } = useReport({\r\n semesterIdSelected, \r\n regionalIdSelected, \r\n establishmentIdSelected, \r\n courseIdSelected, \r\n classIdSelected\r\n })\r\n\r\n return
\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nexport default TabsResult","import * as React from \"react\"\r\nimport {useState} from \"react\"\r\nimport { Row, Col} from \"reactstrap\"\r\n\r\nimport AverageResultScore from \"YConnect/PagesComponents/PrePostReport/Components/AverageResultScore\"\r\nimport StudentVision from \"YConnect/PagesComponents/PrePostReport/Components/StudentVision\"\r\nimport Filters from \"YConnect/Components/Filters\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/Components/useReport\"\r\nimport useQueryParams from \"YConnect/PagesComponents/PrePostReport/Components/useQueryParams\"\r\n\r\nimport useFilter from \"YConnect/PagesComponents/PrePostReport/Pearson.report/useFilter\"\r\nimport useCombo from \"YConnect/PagesComponents/PrePostReport/Pearson.report/useCombo\"\r\nimport TabsResult from \"YConnect/PagesComponents/PrePostReport/Pearson.report/TabsResult\"\r\n\r\nconst ReportContainer = ({\r\n queryParams,\r\n onChangeQueryParams\r\n}:any) => {\r\n\r\n const [hasFilterLoading, setHasFilterLoading] = useState(false)\r\n\r\n const {\r\n fiterState : [\r\n {\r\n regionalIdSelected,\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected\r\n ],\r\n comboState:[\r\n {\r\n regionalsCombo,\r\n establishmentsCombo,\r\n semestersCombo,\r\n coursesCombo,\r\n classesCombo,\r\n studentsCombo,\r\n periodCombo\r\n }, \r\n setCombo\r\n ]\r\n } = useReport()\r\n\r\n useQueryParams({\r\n idSelecteds:{\r\n regionalIdSelected,\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected,\r\n queryParams,\r\n onChangeQueryParams\r\n })\r\n\r\n useFilter({\r\n establishmentIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setIdSelected\r\n })\r\n\r\n useCombo({\r\n regionalIdSelected,\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setHasFilterLoading,\r\n setCombo\r\n })\r\n \r\n const handleChangeFilter = (keystone:string, value:any) => setIdSelected({[keystone]:value})\r\n\r\n return <>\r\n
\r\n \r\n \r\n \r\n
\r\n {\r\n !semesterIdSelected\r\n ? null\r\n : studentIdSelected\r\n ?
\r\n : !studentIdSelected\r\n ? <>\r\n
\r\n
\r\n >\r\n : null\r\n }\r\n >\r\n}\r\n\r\nexport default ReportContainer","import { useEffect } from \"react\"\r\n\r\nconst useFilter = ({\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setIdSelected\r\n}:any) => {\r\n\r\n useEffect(() => setIdSelected({semesterIdSelected:\"\"}), [establishmentIdSelected])\r\n useEffect(() => setIdSelected({courseIdSelected:\"\"}), [semesterIdSelected])\r\n useEffect(() => setIdSelected({teacherIdSelected:\"\"}), [courseIdSelected])\r\n useEffect(() => setIdSelected({classIdSelected:\"\"}), [teacherIdSelected])\r\n useEffect(() => setIdSelected({studentIdSelected:\"\"}), [classIdSelected])\r\n useEffect(() => setIdSelected({periodIdSelected:\"0\"}), [studentIdSelected])\r\n}\r\n\r\nexport default useFilter","import { useEffect, useContext } from \"react\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\n\r\nimport {\r\n GetSemestersCombo,\r\n GetCoursesCombo,\r\n GetTeachersCombo,\r\n GetClassesCombo,\r\n GetStudentsCombo,\r\n GetPeriodsCombo\r\n} from \"YConnect/PagesComponents/PrePostReport/Components/Combo.util\"\r\n\r\nconst useCombo = ({\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setHasFilterLoading,\r\n setCombo\r\n}:any) => {\r\n\r\n const { \r\n idUsuario, \r\n idProfessor, \r\n estabsSupervisor,\r\n estabelecimentos\r\n }: any = useContext(UserContext)\r\n \r\n useEffect(()=>{\r\n setHasFilterLoading(true)\r\n Promise.all([\r\n GetCoursesCombo(),\r\n GetSemestersCombo({\r\n idProfile : idUsuario, \r\n idProfessor : idProfessor\r\n })\r\n ])\r\n .then(([coursesCombo, semestersCombo]) => {\r\n setCombo({coursesCombo})\r\n setCombo({semestersCombo})\r\n })\r\n .finally(() => setHasFilterLoading(false))\r\n \r\n setCombo({\r\n establishmentsCombo: estabelecimentos.map(({nsu_estab, nm_estab}:any)=>({id:nsu_estab,value:nm_estab}))\r\n })\r\n }, [])\r\n\r\n useEffect(()=>{\r\n setCombo({teachersCombo:[]})\r\n if(courseIdSelected && courseIdSelected!==\"\"){\r\n setHasFilterLoading(true)\r\n Promise.all([\r\n GetClassesCombo({\r\n idAnoSemestre : semesterIdSelected || \"\",\r\n idEstabelecimento : estabsSupervisor[0].nsu_estab || \"\",\r\n idCurso : courseIdSelected || \"\",\r\n idProfessor : teacherIdSelected || \"\"\r\n }),\r\n GetTeachersCombo({\r\n idAnoSemestre : semesterIdSelected,\r\n idEstabelecimento :establishmentIdSelected || \"\",\r\n idCurso : courseIdSelected,\r\n })\r\n ])\r\n .then(([classesCombo, teachersCombo]) => {\r\n setCombo({classesCombo})\r\n setCombo({teachersCombo})\r\n })\r\n .finally(() => setHasFilterLoading(false))\r\n }\r\n }, [courseIdSelected])\r\n\r\n useEffect(()=>{\r\n setCombo({classesCombo:[]})\r\n if(semesterIdSelected && teacherIdSelected!==\"\"){\r\n setHasFilterLoading(true)\r\n GetClassesCombo({\r\n idAnoSemestre : semesterIdSelected || \"\",\r\n idProfessor : teacherIdSelected || \"\",\r\n idCurso : courseIdSelected || \"\",\r\n idEstabelecimento : establishmentIdSelected || \"\"\r\n })\r\n .then((classesCombo:any) => setCombo({classesCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n }\r\n }, [teacherIdSelected])\r\n\r\n useEffect(()=>{\r\n setCombo({studentsCombo:[]})\r\n if(classIdSelected && classIdSelected!==\"\"){\r\n setHasFilterLoading(true)\r\n GetStudentsCombo({idGrupo: classIdSelected})\r\n .then((studentsCombo:any) => setCombo({studentsCombo}))\r\n .finally(() => setHasFilterLoading(false))\r\n }\r\n }, [classIdSelected])\r\n\r\n useEffect(()=>{\r\n if(studentIdSelected && studentIdSelected!==\"\"){\r\n setCombo({periodCombo:[]});\r\n setHasFilterLoading(true);\r\n\r\n GetPeriodsCombo({id_curso_matricula:courseIdSelected, id_aluno_matricula:studentIdSelected})\r\n .then((periodCombo: any) => setCombo({periodCombo}))\r\n .finally(() => setHasFilterLoading(false));\r\n }\r\n }, [studentIdSelected])\r\n}\r\n\r\nexport default useCombo","import styled from \"styled-components\"\r\n\r\nconst BestRankedStudentsStyle = styled.div`\r\n\r\n .order-header {\r\n display: flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n }\r\n\r\n .tabscore-title {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n }\r\n\r\n .table-border {\r\n border: 1px solid rgba(0, 0, 0, 0.125);\r\n border-radius: 8px;\r\n min-height: 85%;\r\n }\r\n\r\n tr:first-child {\r\n td:last-child {\r\n color: ${props => props.theme.main.greentextColor};\r\n }\r\n }\r\n\r\n tbody > tr {\r\n border-bottom: 1px solid ${props => props.theme.main.lightGray};\r\n }\r\n\r\n tbody > tr:last-child {\r\n border-bottom: 0;\r\n }\r\n\r\n .best-crown {\r\n background-color: #4e2d78;\r\n border-radius: 50%;\r\n height: 25px;\r\n margin-left: 25px;\r\n margin-top: -65px;\r\n position: relative;\r\n width: 25px;\r\n @media screen and (min-width: 1024px) {\r\n margin-left: 45px;\r\n margin-top: 10px;\r\n position: absolute;\r\n }\r\n .white-icon {\r\n height: 25px;\r\n padding: 3px;\r\n width: 25px;\r\n }\r\n }\r\n\r\n .best-teacher {\r\n display: block;\r\n max-width: 100px;\r\n overflow: hidden !important;\r\n text-decoration: none;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .user-avatar {\r\n align-items: center;\r\n display: flex;\r\n flex-flow: row nowrap;\r\n\r\n h4 {\r\n margin: 0;\r\n margin-right: 16px;\r\n margin-top: 8px;\r\n }\r\n\r\n figure {\r\n margin-right: 8px;\r\n }\r\n\r\n .student-name {\r\n display: block;\r\n max-width: 80px;\r\n overflow: hidden !important;\r\n text-decoration: none;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n }\r\n`\r\n\r\nexport default BestRankedStudentsStyle","import * as React from \"react\"\r\nimport {UncontrolledTooltip} from \"reactstrap\"\r\nimport orderBy from \"lodash/orderBy\"\r\n\r\nimport * as crown from \"YConnect/Assets/svg/crown.svg\"\r\n\r\nimport ProfilePictureById from \"YConnect/PagesComponents/PrePostReport/Components/ProfilePictureById\"\r\n\r\nconst TableBestRankedStudents = ({\r\n isPost,\r\n rankedStudentEvo,\r\n bestRankedStudents\r\n}:any) => \r\n
\r\n
\r\n \r\n \r\n Name | \r\n Class | \r\n Teacher | \r\n Correct answers | \r\n {rankedStudentEvo === \"evolution\" ? \"Evolution\" : \"Score\"} | \r\n
\r\n \r\n \r\n {\r\n (\r\n rankedStudentEvo === \"evolution\"\r\n ? orderBy(bestRankedStudents, \"evolucao\", \"desc\")\r\n : bestRankedStudents\r\n )\r\n .filter(({flIsPre}:any) => flIsPre === !isPost)\r\n .map((student: any, key: any) => {\r\n return \r\n \r\n {key + 1}\r\n \r\n {student.nome}\r\n {key === 0\r\n ? \r\n  \r\n \r\n : null\r\n }\r\n \r\n {student.nome}\r\n \r\n | \r\n {student.nomeTurma} | \r\n \r\n {student.nomeProfessor}\r\n \r\n {student.nomeProfessor}\r\n \r\n | \r\n {student.respCorretas} | \r\n \r\n {\r\n rankedStudentEvo === \"evolution\"\r\n ? `${student.evolucao}%`\r\n : `${(student.media * 100).toFixed(1)}%`\r\n }\r\n | \r\n
\r\n })\r\n }\r\n \r\n
\r\n
\r\n\r\nexport default TableBestRankedStudents","import styled from \"styled-components\"\r\n\r\nconst CardBestRankedStudentsStyle = styled.div`\r\n border: 1px solid rgba(0, 0, 0, 0.125);\r\n border-radius: 8px;\r\n margin-bottom: 24px;\r\n\r\n .content {\r\n display: flex;\r\n flex-flow: row nowrap;\r\n justify-content: space-between;\r\n }\r\n\r\n .ranked-card {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\r\n padding: 16px;\r\n }\r\n\r\n .title {\r\n font-weight: bold;\r\n margin-right: 16px;\r\n }\r\n\r\n .information {\r\n text-align: end;\r\n }\r\n`\r\n\r\nexport default CardBestRankedStudentsStyle","import * as React from \"react\"\r\nimport orderBy from \"lodash/orderBy\"\r\n\r\nimport CardBestRankedStudentsStyle from \"YConnect/PagesComponents/PrePostReport/School.components/BestRankedStudents/CardBestRankedStudents.style\"\r\n\r\nconst CardBestRankedStudents = ({\r\n isPost,\r\n rankedStudentEvo,\r\n bestRankedStudents\r\n}:any) =>\r\n
\r\n {(rankedStudentEvo === \"evolution\"\r\n ? orderBy(bestRankedStudents, \"evolucao\", \"desc\")\r\n : bestRankedStudents\r\n )\r\n .filter(({flIsPre}:any) => flIsPre === !isPost)\r\n .map((student: any, key: any) => \r\n \r\n
\r\n \r\n Name\r\n \r\n \r\n {student.nome}\r\n \r\n
\r\n
\r\n \r\n Class\r\n \r\n \r\n {student.nomeTurma}\r\n \r\n
\r\n
\r\n \r\n Teacher\r\n \r\n \r\n {student.nomeProfessor}\r\n \r\n
\r\n
\r\n \r\n Correct answers\r\n \r\n \r\n {student.respCorretas}\r\n \r\n
\r\n
\r\n \r\n {rankedStudentEvo === \"evolution\" ? \"Evolution\" : \"Score\"}\r\n \r\n \r\n {\r\n rankedStudentEvo === \"evolution\"\r\n ? `${student.evolucao}%`\r\n : `${(student.media * 100).toFixed(1)}%`\r\n }\r\n \r\n
\r\n
\r\n )}\r\n \r\n\r\nexport default CardBestRankedStudents","import * as React from \"react\"\r\nimport {useState} from \"react\"\r\n\r\nimport BestRankedStudentsStyle from \"YConnect/PagesComponents/PrePostReport/School.components/BestRankedStudents.style\"\r\nimport TableBestRankedStudents from \"YConnect/PagesComponents/PrePostReport/School.components/BestRankedStudents/TableBestRankedStudents\"\r\nimport CardBestRankedStudents from \"YConnect/PagesComponents/PrePostReport/School.components/BestRankedStudents/CardBestRankedStudents\"\r\n\r\nimport CardLoading from \"YConnect/PagesComponents/PrePostReport/Components/CardLoading\"\r\n\r\nconst BestRankedStudents = ({\r\n isPost,\r\n isOrderable, \r\n bestRankedStudents\r\n}:any) => {\r\n const [rankedStudentEvo, setRankedStudentEvo] = useState(\"score\")\r\n\r\n const setOrder = (e: any) => setRankedStudentEvo(e.target.value)\r\n\r\n return
\r\n \r\n {\r\n bestRankedStudents \r\n ? window.innerWidth > 1024 \r\n ? \r\n : \r\n : \r\n \r\n /*No students!
*/\r\n }\r\n \r\n}\r\n\r\nexport default BestRankedStudents","import * as React from \"react\"\r\nimport styled from \"styled-components\"\r\n\r\nimport CardLoading from \"YConnect/PagesComponents/PrePostReport/Components/CardLoading\"\r\n\r\nconst H2Style = styled.h2`\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n`\r\n\r\nconst CardStyle = styled.div`\r\n align-items: center;\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\nconst AveragePositionStyle = styled.p`\r\n padding: 0 30px 0;\r\n`\r\n\r\nconst SchoolAverageScoreStyle = styled.div`\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n\r\n .averageScore {\r\n display:flex;\r\n flex-flow: column wrap;\r\n padding: 20px 20px 0;\r\n\r\n .percent {\r\n align-items: center;\r\n display: flex;\r\n flex-flow: row nowrap;\r\n .title {\r\n font-size: 42px;\r\n margin-right: 20px;\r\n }\r\n .subtitle {\r\n font-size: 14px;\r\n }\r\n }\r\n .score {\r\n display: flex;\r\n flex-flow: row nowrap;\r\n justify-content: space-between;\r\n small {\r\n color: #989898;\r\n font-size: 12px;\r\n }\r\n b {\r\n color: #565656;\r\n font-size: 16px;\r\n }\r\n }\r\n }\r\n`\r\n\r\nconst SchoolAverageScore = ({\r\n isPost,\r\n averageScore\r\n}:any) => {\r\n\r\n const newAverageScore = averageScore \r\n ? averageScore.filter((avg: any) => avg.fl_is_pre === !isPost?true:false)[0] || {}\r\n : {}\r\n\r\n return <>\r\n
School average score\r\n {\r\n (averageScore === undefined || averageScore.filter((avg: any) => avg.fl_is_pre === !isPost?true:false).length > 0) || Object.keys(newAverageScore).length !== 0\r\n ?(\r\n averageScore && newAverageScore && Object.keys(newAverageScore).length > 0\r\n ?
\r\n \r\n
\r\n 0.7 ? \"#00A281\" : \"#FF1A4A\" }}>\r\n {(newAverageScore.mediaEstablish * 100).toFixed(1)}%\r\n \r\n = 0 ? \"#00A281\" : \"#FF1A4A\" }}>\r\n {newAverageScore.porcentagemAvanco}% {newAverageScore.porcentagemAvanco >= 0 ? \"better\" : \"worse\"} than last semester\r\n \r\n
\r\n
\r\n National score: {(newAverageScore.porcentagemNacional * 100).toFixed(1)}%\r\n Regional score: {(newAverageScore.porcentagemRegional * 100).toFixed(1)}%\r\n
\r\n
\r\n
\r\n # {newAverageScore.rankRegional} on regional ranking \r\n # {newAverageScore.rankNacional} on national ranking \r\n \r\n :
)\r\n :
\r\n No data recorded!\r\n \r\n }\r\n >\r\n}\r\n\r\n\r\nexport default SchoolAverageScore","import styled from \"styled-components\"\r\n\r\nconst BestClassScoreStyle = styled.div`\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n\r\n header {\r\n align-items: center;\r\n display:flex;\r\n flex-flow: row wrap;\r\n justify-content: space-between;\r\n padding: 16px 16px 0;\r\n }\r\n\r\n .class-name {\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n }\r\n \r\n .class-percent {\r\n font-size: 42px;\r\n }\r\n\r\n .teacher {\r\n display: flex;\r\n flex-flow: row wrap;\r\n padding: 16px;\r\n\r\n .teacher-info {\r\n display: flex;\r\n flex-flow: column wrap;\r\n justify-content: center;\r\n @media screen and (min-width: 1024px) {\r\n padding-left: 16px;\r\n width: 75%;\r\n }\r\n }\r\n\r\n .name {\r\n color: #565656;\r\n font-size: 20px;\r\n }\r\n }\r\n`\r\n\r\nexport default BestClassScoreStyle","import * as React from \"react\"\r\nimport styled from \"styled-components\"\r\n\r\nimport convertPhoto from \"YConnect/Utils/ConvertPhoto.util\"\r\nimport BestClassScoreStyle from \"YConnect/PagesComponents/PrePostReport/School.components/BestClassScore.style\"\r\nimport ProfilePicture from \"YConnect/Components/ProfilePicture\"\r\n\r\nimport CardLoading from \"YConnect/PagesComponents/PrePostReport/Components/CardLoading\"\r\n\r\nconst CardStyle = styled.div`\r\n align-items: center;\r\n border: 1px solid #E1E6E7;\r\n border-radius: 8px;\r\n display: flex;\r\n flex-flow: row wrap;\r\n min-height: 223px;\r\n`\r\n\r\nconst H2Style = styled.h2`\r\n color: #565656;\r\n font-size: 20px;\r\n font-weight: 600;\r\n`\r\n\r\nconst BestClassScore = ({\r\n isPost,\r\n bestClassScore,\r\n className\r\n}:any) => {\r\n\r\n const bestTeacher = bestClassScore \r\n ? bestClassScore.filter((high: any) => high && high.fl_is_pre === (isPost?false:true))[0]\r\n : undefined\r\n\r\n return
\r\n
Best class score\r\n {\r\n (bestClassScore === undefined || bestClassScore.filter((high: any) => high && high.fl_is_pre === (isPost?false:true)).length > 0)\r\n ? (\r\n bestTeacher \r\n ?
\r\n \r\n {bestTeacher.nome}\r\n 0.7 ? \"#00A281\" : \"#FF1A4A\" }}>\r\n {(bestTeacher.mediaTurma * 100).toFixed(1)}%\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n Teacher\r\n {bestTeacher.professor && bestTeacher.professor.nomeCompleto}\r\n
\r\n \r\n \r\n :
)\r\n :
\r\n No data recorded!\r\n \r\n }\r\n
\r\n \r\n}\r\n \r\n\r\nexport default BestClassScore","import * as React from \"react\"\r\nimport { useEffect, useState } from \"react\"\r\nimport { Row, Col } from \"reactstrap\"\r\n\r\nimport RankedProgressBar from \"YConnect/PagesComponents/PrePostReport/Components/RankedProgressBar/index\"\r\nimport TabReportStyle from \"YConnect/PagesComponents/PrePostReport/School.report/TabReport.style\"\r\n\r\nimport BestRankedStudents from \"YConnect/PagesComponents/PrePostReport/School.components/BestRankedStudents\"\r\nimport SchoolAverageScore from \"YConnect/PagesComponents/PrePostReport/School.components/SchoolAverageScore\"\r\nimport BestClassScore from \"YConnect/PagesComponents/PrePostReport/School.components/BestClassScore\"\r\n\r\n\r\nconst TabReport = ({\r\n isPost,\r\n bestClassScore, \r\n rankedClasses, \r\n bestRankedStudents, \r\n averageScore\r\n}: any) => \r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n high.fl_is_pre === (isPost?false:true))} />\r\n \r\n \r\n high.fl_is_pre === (isPost?false:true))} />\r\n \r\n
\r\n >\r\n\r\nexport default TabReport","import { useEffect, useReducer } from \"react\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport getRequestConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\ntype ReportAction = {\r\n name : string\r\n report ?: any \r\n}\r\n\r\n\r\nconst useReport = ({\r\n semesterIdSelected,\r\n courseIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n idUsuario\r\n}: any) => {\r\n \r\n const [{\r\n averageScore,\r\n bestClassScore,\r\n rankedClasses,\r\n bestRankedStudents\r\n }, setReport] = useReducer((state:any, {name, report}:ReportAction) => {\r\n return {...state, [name]:report}\r\n }, {})\r\n\r\n useEffect(()=>{\r\n\r\n if(semesterIdSelected && semesterIdSelected !== \"\"){\r\n\r\n setReport({name:\"bestRankedStudents\", report: undefined})\r\n setReport({name:\"bestClassScore\", report: undefined})\r\n setReport({name:\"rankedClasses\", report: undefined})\r\n setReport({name:\"averageScore\", report: undefined})\r\n\r\n API\r\n .PrePostTest\r\n .GetBestRankedStudents({\r\n idAnoSemestrebrs : semesterIdSelected,\r\n idEstabelecimentobrs : establishmentIdSelected,\r\n idCursobrs : courseIdSelected,\r\n idClassebrs : classIdSelected,\r\n regionalbrs : \"\",\r\n idProfessor : teacherIdSelected\r\n }, getRequestConfig())\r\n .then((response: any) => \r\n setReport({name:\"bestRankedStudents\", report: response.data.bestRankedStudents}))\r\n\r\n API\r\n .PrePostTest\r\n .GetBestClassProfessor({\r\n idAnoSemestrebcp : semesterIdSelected,\r\n idEstabelecimentobcp : establishmentIdSelected,\r\n idCursobcp : courseIdSelected,\r\n idClassebcp : classIdSelected,\r\n regionalbcp : \"\"\r\n }, getRequestConfig())\r\n .then((response: any) => setReport({name:\"bestClassScore\", report: response.data.bestClassProfessorPrePost.filter((item:any) => item)}))\r\n \r\n\r\n API\r\n .PrePostTest\r\n .GetBestRankedClass({\r\n idAnoSemestrerc : semesterIdSelected,\r\n idEstabelecimentorc : establishmentIdSelected,\r\n idCursorc : courseIdSelected,\r\n idClasserc : classIdSelected,\r\n regionalrc : \"\",\r\n idProfessorrc : teacherIdSelected,\r\n }, getRequestConfig())\r\n .then((response: any) => \r\n setReport({name:\"rankedClasses\", report: response.data.classes}))\r\n\r\n\r\n API\r\n .PrePostTest\r\n .GetSchoolAverageScore({\r\n idAnoSemestreSas : semesterIdSelected,\r\n idOrientadorSas : idUsuario,\r\n regionalSas : \"\",\r\n idEstabelecimentoSas : establishmentIdSelected\r\n }, getRequestConfig())\r\n .then((response: any) => \r\n setReport({name:\"averageScore\", report: response.data.averageScores.filter((item:any) => item)}))\r\n }\r\n \r\n }, [ \r\n semesterIdSelected, \r\n courseIdSelected, \r\n teacherIdSelected, \r\n classIdSelected\r\n ])\r\n\r\n return {\r\n averageScore,\r\n bestClassScore,\r\n rankedClasses,\r\n bestRankedStudents\r\n }\r\n}\r\n\r\nexport default useReport","import * as React from \"react\"\r\nimport { useEffect, useReducer} from \"react\"\r\n\r\nimport TabStyle from \"YConnect/Styles/Tab.style\"\r\nimport TabContentStyle from \"YConnect/PagesComponents/PrePostReport/Components/TabContent.style\"\r\nimport TabReport from \"YConnect/PagesComponents/PrePostReport/School.report/TabReport\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/School.report/useReport\"\r\n\r\nconst TabsResult = ({\r\n semesterIdSelected,\r\n courseIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n idUsuario\r\n}: any) => {\r\n\r\n const {\r\n averageScore,\r\n bestClassScore,\r\n rankedClasses,\r\n bestRankedStudents\r\n } = useReport({ \r\n semesterIdSelected,\r\n courseIdSelected,\r\n establishmentIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n idUsuario\r\n })\r\n\r\n return
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n}\r\n\r\nexport default TabsResult","import * as React from \"react\"\r\nimport {\r\n useState, \r\n useContext\r\n} from \"react\"\r\nimport { Row, Col, Card} from \"reactstrap\"\r\n\r\nimport AverageResultScore from \"YConnect/PagesComponents/PrePostReport/Components/AverageResultScore\"\r\nimport StudentVision from \"YConnect/PagesComponents/PrePostReport/Components/StudentVision\"\r\nimport Filters from \"YConnect/Components/Filters\"\r\nimport useReport from \"YConnect/PagesComponents/PrePostReport/Components/useReport\"\r\nimport useQueryParams from \"YConnect/PagesComponents/PrePostReport/Components/useQueryParams\"\r\n\r\nimport useFilter from \"YConnect/PagesComponents/PrePostReport/School.report/useFilter\"\r\nimport useCombo from \"YConnect/PagesComponents/PrePostReport/School.report/useCombo\"\r\nimport TabsResult from \"YConnect/PagesComponents/PrePostReport/School.report/TabsResult\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\n\r\nconst ReportContainer = ({\r\n queryParams,\r\n onChangeQueryParams\r\n}:any) => {\r\n\r\n const { idUsuario, estabsSupervisor }: any = useContext(UserContext)\r\n const [hasFilterLoading, setHasFilterLoading] = useState(false)\r\n\r\n const {\r\n fiterState : [\r\n {\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected\r\n ],\r\n comboState:[\r\n {\r\n establishmentsCombo,\r\n semestersCombo,\r\n coursesCombo,\r\n teachersCombo,\r\n classesCombo,\r\n studentsCombo,\r\n periodCombo\r\n }, \r\n setCombo\r\n ]\r\n } = useReport()\r\n\r\n useQueryParams({\r\n idSelecteds:{\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n periodIdSelected\r\n },\r\n setIdSelected,\r\n queryParams,\r\n onChangeQueryParams\r\n })\r\n \r\n useFilter({\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setIdSelected\r\n })\r\n\r\n useCombo({\r\n establishmentIdSelected,\r\n semesterIdSelected,\r\n courseIdSelected,\r\n teacherIdSelected,\r\n classIdSelected,\r\n studentIdSelected,\r\n setHasFilterLoading,\r\n setCombo\r\n })\r\n\r\n const handleChangeFilter = (keystone:string, value:any) => setIdSelected({[keystone]:value})\r\n\r\n return <>\r\n {\r\n !estabsSupervisor.length\r\n ?
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n : <>\r\n
\r\n \r\n \r\n \r\n
\r\n {\r\n studentIdSelected\r\n ?
\r\n : semesterIdSelected\r\n && !studentIdSelected\r\n ? <>\r\n
\r\n
\r\n >\r\n : null\r\n }\r\n >\r\n }\r\n >\r\n}\r\n\r\nexport default ReportContainer","import * as React from \"react\"\r\nimport { useContext } from \"react\"\r\nimport { Container } from \"reactstrap\"\r\nimport qs from \"querystring\"\r\n\r\nimport { BreadcrumbPrePostReport } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport UserContext from \"YConnect/User.context\"\r\n\r\nimport TeacherReportContainer from \"YConnect/PagesComponents/PrePostReport/Teacher.report/Report.container\"\r\nimport PearsonReportContainer from \"YConnect/PagesComponents/PrePostReport/Pearson.report/Report.container\"\r\nimport SchoolReportContainer from \"YConnect/PagesComponents/PrePostReport/School.report/Report.container\"\r\n\r\nconst PrePostReportPage = ({location, history}:any) => {\r\n \r\n const queryParams = qs.parse(location.search.substr(1))\r\n\t\r\n\tconst handleChangeQueryParams = (newQueryParams:any) => {\r\n const search = qs.stringify(newQueryParams)\r\n\t\thistory.push({search: `?${search}`})\r\n }\r\n \r\n\r\n const { profiles, estabsSupervisor }: any = useContext(UserContext)\r\n\r\n return
\r\n \r\n \r\n {\r\n profiles.indexOf(12) > -1 && estabsSupervisor.length \r\n && Select parameters above to visualize reports - (*) Required fields
\r\n }\r\n {\r\n profiles.indexOf(6) > -1\r\n ? \r\n : profiles.indexOf(12) > -1\r\n ? \r\n : \r\n \r\n }\r\n \r\n}\r\n\r\nexport default PrePostReportPage","import * as React from \"react\"\r\nimport {Container, Card, Row, Col} from \"reactstrap\"\r\n\r\nimport * as pageNotFound from \"YConnect/Assets/svg/page-not-found.svg\"\r\n\r\nconst PageNotFoundPage = () => \r\n
\r\n \r\n \r\n
\r\n
\r\n Page not found!
\r\n We're sorry, the page you requested could not be found. Please go back, or contact support if needed.
\r\n \r\n \r\n\r\nexport default PageNotFoundPage","import * as React from \"react\"\r\nimport { Modal } from \"react-bootstrap\"\r\n\r\nimport { YLinkButtonStyle } from \"YConnect/Components/Button\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\n\r\ntype PostTestModalProps = {\r\n isShow: boolean\r\n onClose: () => void\r\n}\r\n\r\nconst PrePostTestExit = ({ isShow, onClose }: PostTestModalProps) =>\r\n
\r\n \r\n Are you sure you want to leave?\r\n \r\n \r\n If you leave the test before submitting, you will have to star over from the beginning. :(\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\nexport default PrePostTestExit\r\n","import styled from \"styled-components\"\r\nimport { Row } from \"reactstrap\"\r\n\r\n//TODO ExerciseTimelineStyle e ExerciseTimeline2Style muito parecido\r\nconst ExerciseTimeline2Style = styled(Row)`\r\n background-color: ${props => props.theme.main.mainPurple};\r\n border-bottom: 1px solid ${props => props.theme.main.borderLightGray};;\r\n height: 3px;\r\n\r\n .exercise-task {\r\n background-color: ${props => props.theme.main.backgroundRadioActive};\r\n border: 1px solid ${props => props.theme.main.borderLightGray};\r\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\r\n border-radius: 50px;\r\n height: 20px;\r\n padding: 4px;\r\n transform: translateY(-50%);\r\n width: 20px;\r\n\r\n img {\r\n filter: brightness(0.6);\r\n align-items: center;\r\n display: flex;\r\n justify-content: center;\r\n width: 10px;\r\n }\r\n\r\n &.active {\r\n background-color: ${props => props.theme.main.mainPurple};\r\n border: 1px solid ${props => props.theme.main.borderLightGray};\r\n\r\n img {\r\n filter: none;\r\n }\r\n }\r\n\r\n &.checked {\r\n background-color: ${props => props.theme.main.clickable};\r\n border: 1px solid ${props => props.theme.main.clickable};\r\n }\r\n }\r\n`\r\n\r\nexport default ExerciseTimeline2Style","import styled from \"styled-components\"\r\nimport { Col } from \"reactstrap\"\r\n\r\nconst ResultBoxStyle = styled(Col)`\r\n border: 1px solid ${props => props.theme.main.borderLightGray};\r\n border-radius: 8px;\r\n min-height: 303px;\r\n margin: auto;\r\n\r\n .row {\r\n margin-left: 0 !important;\r\n margin-right: 0 !important;\r\n }\r\n\r\n div.result {\r\n border-bottom: 1px solid ${props => props.theme.main.borderLightGray};\r\n min-height: 90px;\r\n align-self: center;\r\n\r\n .score {\r\n align-self: center;\r\n justify-content: center;\r\n\r\n .img {\r\n align-self: center;\r\n filter: ${props => props.theme.main.filterSvg};\r\n }\r\n\r\n .text {\r\n margin-left: 10px;\r\n font-weight: 400;\r\n line-height: 24px;\r\n\r\n p {\r\n font-size: 12px;\r\n font-weight: 400;\r\n line-height: 16px;\r\n width: 95px;\r\n text-align: left;\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n\r\n .overall {\r\n align-self: center;\r\n\r\n span {\r\n font-size: 42px;\r\n font-weight: 300;\r\n line-height: 50px;\r\n color: ${props => props.theme.main.successColor};\r\n font-size: inherit;\r\n }\r\n }\r\n }\r\n\r\n div.graphic {\r\n min-height: 213px;\r\n\r\n .texto {\r\n line-height: 28px;\r\n align-self: center;\r\n }\r\n\r\n .line-graphic {\r\n margin: auto;\r\n width: 90%;\r\n\r\n .progress-percentage {\r\n color: ${props => props.theme.main.successColor};\r\n font-weight: 600;\r\n }\r\n\r\n .line {\r\n background-color: ${props => props.theme.main.backgroundBtDisabled};\r\n border-radius: 2px;\r\n width: 100%;\r\n height: 3px;\r\n margin-top: 10px;\r\n }\r\n\r\n .line-progress {\r\n border-radius: 4.5px 0 0 4.5px;\r\n background-color: ${props => props.theme.main.successColor};\r\n height: 3px;\r\n margin-top: -4px;\r\n box-shadow: 1px 0px 3px 2px ${props => props.theme.main.successShadowColor};\r\n }\r\n\r\n .pointer-progress {\r\n margin-top: -7px;\r\n background-color: ${props => props.theme.main.backgroundWhite};\r\n border: 2px solid ${props => props.theme.main.successColor};\r\n border-radius: 100%;\r\n width: 12px;\r\n height: 12px;\r\n }\r\n\r\n .line-start {\r\n color: ${props => props.theme.main.title};\r\n font-weight: 400;\r\n line-height: 24px;\r\n text-align: left;\r\n }\r\n\r\n &.fail {\r\n .progress-percentage {\r\n color: ${props => props.theme.main.errorColor};\r\n }\r\n\r\n .line-progress {\r\n background-color: ${props => props.theme.main.errorColor};\r\n box-shadow: 1px 0px 3px 2px ${props => props.theme.main.errorShadowColor};\r\n }\r\n\r\n .pointer-progress {\r\n border-color: ${props => props.theme.main.errorShadowColor};\r\n }\r\n }\r\n }\r\n }\r\n`\r\n\r\nexport default ResultBoxStyle","import * as React from \"react\"\r\nimport { useState, useEffect, useContext } from \"react\"\r\nimport { Container, Row, Col } from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport { BreadcrumbPrePost } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport Loader from \"YConnect/Components/Loader\"\r\nimport ServerErrorPage from \"YConnect/Pages/ServerError.page\"\r\nimport { ButtonStyle, YLinkButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport GetNewHtmlReplaceImg from \"YConnect/Utils/GetNewHtmlReplaceImg.util\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\nimport DescryptoValue from \"YConnect/Utils/DescryptoValue\";\r\n\r\nimport * as pencil from \"YConnect/Assets/svg/pencil.svg\"\r\nimport * as test from \"YConnect/Assets/svg/test.svg\"\r\nimport * as clock from \"YConnect/Assets/svg/clock.svg\"\r\n\r\nimport PrePostTestExit from \"YConnect/Modals/PrePostTestExit.modal\"\r\n\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\nimport HeaderExerciseStyle from \"YConnect/Styles/HeaderExercise.style\"\r\nimport FooterStyle from \"YConnect/Styles/Footer.style\"\r\nimport FormStyle from \"YConnect/Styles/Form.style\"\r\nimport ExerciseTimeline2Style from \"YConnect/Styles/ExerciseTimeline2.style\"\r\nimport ResultBoxStyle from \"YConnect/Styles/ResultBox.style\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\nimport PrePostContext from \"YConnect/PrePost.context\"\r\n\r\nimport find from \"lodash/find\"\r\nimport moment from \"moment\"\r\n\r\n\r\nconst TimerDivStyle = styled.div`\r\n background-color: ${props => props.theme.main.backgroundWhite};\r\n border-radius: 8px;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n width: 198px;\r\n height: 65px;\r\n text-align: center;\r\n line-height: 4em;\r\n margin-bottom: 20px;\r\n\r\n span {\r\n color: ${props => props.theme.main.successColor};\r\n font-weight: bold;\r\n }\r\n`\r\n\r\nconst ResultTitleStyle = styled.span`\r\n color: ${props => props.theme.main.successColor};\r\n font-size: inherit;\r\n`\r\n\r\n\r\nconst BackButtonStyle = styled(ButtonStyle)`\r\n display: flex;\r\n flex-direction: row-reverse;\r\n align-items: center;\r\n justify-content: flex-end;\r\n font-weight: bold;\r\n border: none;\r\n padding: 0;\r\n width: auto;\r\n\r\n img {\r\n margin-right: 10px;\r\n padding-left: 0 !important;\r\n filter: ${props => props.theme.main.filterSvg};\r\n }\r\n`\r\n\r\nconst PrePostTestPage = (props?: any) => {\r\n\r\n const userContext:any = useContext(UserContext)\r\n const prePostUserContext:any = useContext(PrePostContext)\r\n\r\n const [isLoading, setLoading] = useState(true)\r\n const [error, setError] = useState(false)\r\n const [showResult, setShowResult] = useState(false)\r\n const [result, setResult] = useState()\r\n const [submitDisable, setSubmitDisable] = useState(true)\r\n const [formValues, setFormValues] = useState()\r\n const [contentExercise, setContentExercise] = useState()\r\n const [time, setTime] = useState(moment.duration(0))\r\n const [courseInfo, setCourseInfo] = useState({})\r\n const [showExitModal, setExitModal] = useState(false)\r\n\r\n const {\r\n params : { idTeste, idCurso }\r\n } = props.match\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n fetchCourseContent()\r\n setSubmitDisable(true)\r\n setContentExercise(null)\r\n }, [idCurso])\r\n\r\n useEffect(() => {\r\n if (formValues && formValues.valuesUpdated.exercise) {\r\n const answers = formValues.valuesUpdated.exercise\r\n\r\n if (answers.resposta !== -1) {\r\n setSubmitDisable(false)\r\n }\r\n }\r\n }, [formValues])\r\n\r\n useEffect(() => {\r\n let timer\r\n if (!showResult)\r\n timer = setInterval(() => setTime(time + 1000), 1000)\r\n return () => clearInterval(timer);\r\n }, [time, showResult])\r\n\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n setSubmitDisable(true)\r\n setContentExercise(null)\r\n fetchTestQuestion()\r\n }, [idTeste])\r\n\r\n const fetchCourseContent = async () => {\r\n try {\r\n const {data} = await API.Course.GetAll({\r\n id: idCurso,\r\n isDegustacao: false\r\n }, getConfig())\r\n\r\n const course = data.find(({id_curso}:any) => id_curso == idCurso)\r\n\r\n localStorage.setItem(\"courseInfo\", JSON.stringify(course))\r\n setCourseInfo(course)\r\n } catch (error) {\r\n setError(true)\r\n }\r\n }\r\n\r\n const DecryptPrePostTest = (content:any) => {\r\n\r\n content.questao.enunciado = DescryptoValue.descryptoString( content.questao.enunciado );\r\n content.questao.ppT_Alternativa_Yconnect = content.questao.ppT_Alternativa_Yconnect && content.questao.ppT_Alternativa_Yconnect.map((elem : object) => \r\n DescryptoValue.descryptoObject(elem)\r\n );\r\n content.questao.subenunciado = DescryptoValue.descryptoString( content.questao.subenunciado );\r\n\r\n return content;\r\n }\r\n\r\n const fetchTestQuestion = async () => {\r\n try {\r\n const { data } = await API.PrePostTest.Get({\r\n idQuestao: idTeste,\r\n idCurso: idCurso,\r\n idAluno: userContext.idUsuario,\r\n isAluno: isStudent()\r\n }, getConfig())\r\n\r\n if (data.acessoIndevido) {\r\n setError(true)\r\n }\r\n data.questao = DecryptPrePostTest(data.questao);\r\n setContentExercise(data.questao)\r\n if (isStudent()) {\r\n fetchTestQuestionTime(data.questao)\r\n if (data.questao.respostaUsuario !== -1) {\r\n setSubmitDisable(false)\r\n }\r\n } else {\r\n setLoading(false)\r\n }\r\n } catch (error) {\r\n setError(true)\r\n }\r\n }\r\n\r\n const fetchTestQuestionTime = async (exercise: any) => {\r\n try {\r\n const { data } = await API.PrePostTest.GetTime({\r\n idTesteAluno: exercise.idTesteAluno,\r\n }, getConfig())\r\n\r\n setTime(parseInt(data.tempoDecorridoTeste))\r\n setLoading(false)\r\n } catch (error) {\r\n setLoading(false)\r\n setError(true)\r\n }\r\n }\r\n\r\n const fetchSaveQuestion = async (type: string, idAlternativa: any, idQuestao: any) => {\r\n try {\r\n const response = await API.PrePostTest.SaveQuestion({\r\n idAlternativa: idAlternativa,\r\n idQuestao: idQuestao,\r\n idTesteAluno: contentExercise.idTesteAluno,\r\n tempoSessao: time,\r\n id: 1,\r\n tipo: type\r\n }, getConfig())\r\n\r\n if (type === 'next') {\r\n redirectPage(idCurso, contentExercise.idProximaQuestao)\r\n }\r\n\r\n if (type === 'check') {\r\n fetchGetResult(contentExercise.idTesteAluno)\r\n }\r\n } catch (error) {\r\n setError(true)\r\n }\r\n }\r\n\r\n\r\n const fetchGetResult = async (idTesteAluno: any) => {\r\n try {\r\n const response = await API.PrePostReport.GetStudentReport({\r\n idCurso: idCurso,\r\n idAluno: userContext.idUsuario,\r\n isAluno: true\r\n }, getConfig())\r\n\r\n const report = find(response.data.relatorio, { id_teste_aluno: Number(idTesteAluno) })\r\n\r\n userContext.cursoAtualBloqueadoPreTest = false\r\n localStorage.setItem('data', JSON.stringify(userContext))\r\n\r\n if(prePostUserContext\r\n && prePostUserContext.listPptTestAlunoYConnect\r\n && prePostUserContext.listPptTestAlunoYConnect[0]\r\n && prePostUserContext.listPptTestAlunoYConnect[0].aluno_curso){\r\n prePostUserContext.listPptTestAlunoYConnect[0].aluno_curso.fl_feito = true\r\n }\r\n\r\n props.onUpdatePrePost({...prePostUserContext})\r\n \r\n setResult(report)\r\n setShowResult(true)\r\n localStorage.removeItem(\"prepost\")\r\n } catch (error) {}\r\n }\r\n\r\n const redirectPage = (cursoId: any, testId: any) => {\r\n props.history.push({\r\n pathname: `/pre_post/test/${cursoId}/${testId}`\r\n })\r\n }\r\n\r\n const getAlunoCurso = () =>{\r\n const { aluno_curso } = (prePostUserContext \r\n && prePostUserContext.listPptTestAlunoYConnect\r\n && prePostUserContext.listPptTestAlunoYConnect[0]) || {}\r\n return aluno_curso;\r\n }\r\n\r\n const getPageTitle = () => {\r\n\r\n const { aluno_curso } = (prePostUserContext \r\n && prePostUserContext.listPptTestAlunoYConnect \r\n && prePostUserContext.listPptTestAlunoYConnect[0]) || {}\r\n\r\n if (isStudent()) {\r\n return `${courseInfo.titulo_curso}: ${aluno_curso && aluno_curso.fl_is_pre ? 'PRE TEST EVALUATION' : 'POST TEST EVALUATION'}`\r\n }\r\n\r\n return `${courseInfo.titulo_curso}: PRE/POST TEST EVALUATION`\r\n }\r\n\r\n const isStudent = () => {\r\n const { idProfessor, observador, colaborador, usuarioTrial, usuarioDegustacao } = userContext\r\n return (idProfessor == 0 && !observador && !colaborador && !usuarioTrial && !usuarioDegustacao)\r\n }\r\n\r\n const getTemplate = () => {\r\n let template = [\r\n {\r\n \"id\" : \"exercise\",\r\n \"type\" \t: 'PrePostTest',\r\n \"exercise\" : contentExercise\r\n }\r\n ]\r\n\r\n return template\r\n }\r\n\r\n const saveExercise = () => {\r\n setSubmitDisable(true)\r\n\r\n if (isStudent()) {\r\n const answer = formValues.valuesUpdated.exercise\r\n fetchSaveQuestion('previous', 0, contentExercise.idProximaQuestao)\r\n fetchSaveQuestion('next', answer.resposta, contentExercise.questao.id_questao)\r\n } else {\r\n redirectPage(idCurso, contentExercise.idProximaQuestao)\r\n }\r\n }\r\n\r\n const submit = () => {\r\n setSubmitDisable(true)\r\n\r\n if (isStudent()) {\r\n const answer = formValues.valuesUpdated.exercise\r\n fetchSaveQuestion('check', answer.resposta, contentExercise.questao.id_questao)\r\n } else {\r\n props.history.push({\r\n pathname: \"/\"\r\n })\r\n }\r\n }\r\n\r\n const renderTime = () => {\r\n const duration = moment.duration(time)\r\n return (\r\n
\r\n Your time: {moment.utc(duration.asMilliseconds()).format(\"HH:mm:ss\")}\r\n \r\n )\r\n }\r\n\r\n const renderBookLifeTime = () => (\r\n
\r\n
\r\n {[...Array(contentExercise.totalQuestoes)].map((x, i) => {\r\n return (\r\n \r\n

\r\n
\r\n )\r\n })}\r\n\r\n \r\n
\r\n )\r\n\r\n const renderResult = () => {\r\n const media_aluno = (result.media_aluno * 100).toFixed(1)\r\n const tempo_aluno = (result.tempo_aluno / 60 ).toFixed(0)\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n {media_aluno < 70 ? 'Keep Trying!' : 'Nice work!'} Your score is:
{result.qts_acertos} correct answers\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n

\r\n
\r\n \r\n
Duration:
\r\n {tempo_aluno} minutes\r\n
\r\n \r\n \r\n \r\n

\r\n
\r\n \r\n
Correct answers:
\r\n {result.qts_acertos} of {result.qtde_total_questoes}\r\n
\r\n \r\n \r\n \r\n Overall percentage: 70 ? '#00A281' : '#FF1A4A'}}>{media_aluno} %\r\n
\r\n \r\n
\r\n \r\n \r\n = 70 ? 'success' : 'fail'}`}>\r\n
\r\n {media_aluno} %\r\n \r\n
\r\n
\r\n
\r\n
\r\n 0\r\n 70%\r\n 100%\r\n
\r\n
\r\n \r\n \r\n {result.texto.replace('Y?zigi', 'Yázigi')}\r\n \r\n
\r\n \r\n >\r\n )\r\n }\r\n\r\n if (error) return
\r\n\r\n return (\r\n
\r\n {\r\n isLoading\r\n ? \r\n : <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderTime()}\r\n \r\n
\r\n\r\n \r\n \r\n {renderBookLifeTime()}\r\n {\r\n showResult ?\r\n renderResult()\r\n :\r\n <>\r\n \r\n \r\n Question {contentExercise.ordemQuestao} / {contentExercise.totalQuestoes}\r\n
\r\n \r\n \r\n \r\n >\r\n }\r\n { showResult ?\r\n \r\n 1024 ? 'Go back (Homepage)' : 'Back'}`} />\r\n \r\n \r\n :\r\n \r\n {\r\n contentExercise.idQuestaoAnterior != -1 ?\r\n 1024 ? `Back Question ${contentExercise.ordemQuestao - 1}/${contentExercise.totalQuestoes}` : 'Back'}`}\r\n link={`/pre_post/test/${idCurso}/${contentExercise.idQuestaoAnterior}`}\r\n icon=\"arrowPrevious\"\r\n />\r\n :\r\n 1024 ? 'Go back (Homepage)' : 'Back'}`}\r\n onClick={() => setExitModal(true)}\r\n icon=\"arrowPrevious\"\r\n />\r\n }\r\n\r\n \r\n {contentExercise.ordemQuestao < contentExercise.totalQuestoes ?\r\n \r\n :\r\n \r\n }\r\n \r\n \r\n }\r\n
\r\n
\r\n >\r\n }\r\n { setExitModal(false) }} />\r\n \r\n )\r\n}\r\nexport default PrePostTestPage\r\n","import * as React from \"react\"\r\nimport { Modal, FormGroup } from \"react-bootstrap\"\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\n\r\nimport styled from \"styled-components\";\r\n\r\nimport { YLinkButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport * as world from \"YConnect/Assets/svg/world.svg\"\r\n\r\n/** Style */\r\nconst GeneralStyle = styled(Modal)`\r\n .modal-content {\r\n width: 120% !important;\r\n }\r\n`\r\n\r\nconst BodyStyle = styled(Modal.Body)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n padding: 20px !important;\r\n border-radius: 10px 10px 0 0 !important;\r\n\r\n h1 {\r\n text-align: center;\r\n margin-top: 30px;\r\n }\r\n\r\n .body-message {\r\n text-align: center;\r\n margin-top: 25px;\r\n }\r\n`\r\n\r\nconst DivOvalStyle = styled.div`\r\n border-radius: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0,0,0,0.11);\r\n width: 204px;\r\n height: 204px;\r\n background: #643e94;\r\n padding: 19px;\r\n margin: auto;\r\n margin-top: -115px;\r\n\r\n div {\r\n background: white;\r\n border-radius: 100%;\r\n width: 100%;\r\n height: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n text-align: center;\r\n padding: 30px;\r\n\r\n img {\r\n margin: auto;\r\n width: 100%;\r\n height: auto;\r\n }\r\n }\r\n`\r\n\r\nconst FooterStyle = styled(Modal.Footer)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n justify-content: space-between;\r\n`\r\n\r\nconst ButtonCloseStyle = styled(YLinkButtonStyle)`\r\n border: none;\r\n padding: 0;\r\n\r\n img {\r\n padding-left: 10px !important;\r\n width: 25px;\r\n }\r\n`\r\n\r\n\r\ntype OrientationBatteryToFinalTestProps = {\r\n isShow: boolean\r\n onClose: () => void\r\n username: string\r\n prePost: any\r\n}\r\n\r\n\r\nconst OrientationBatteryToFinalTest = ({ isShow, onClose, username, idCourse }: OrientationBatteryToFinalTestProps) =>\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n

\r\n
\r\n \r\n
\r\n\r\n Hello, {username}! :)
\r\n\r\n \r\n Well done! Now, you can try to do the Final Test again, available on the \"Resources\" area of your course, or you can move on to the Written Test!\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\nexport default OrientationBatteryToFinalTest\r\n","import * as React from \"react\"\r\nimport { useState, useEffect, useContext } from \"react\"\r\nimport { Container, Row, Col, Tooltip } from \"reactstrap\"\r\nimport * as toastr from \"toastr\";\r\nimport moment from \"moment\"\r\n\r\nimport * as pencil from \"YConnect/Assets/svg/pencil.svg\"\r\nimport * as checked from \"YConnect/Assets/svg/checked.svg\"\r\nimport * as remove from \"YConnect/Assets/svg/close-btn.svg\"\r\n\r\nimport Breadcrumb from \"YConnect/Components/Breadcrumb\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport Loader from \"YConnect/Components/Loader\"\r\nimport ServerErrorPage from \"YConnect/Pages/ServerError.page\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\nimport { ButtonStyle, YLinkButtonStyle } from \"YConnect/Components/Button\"\r\nimport API from \"YConnect/API\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\nimport GetNewHtmlReplaceImg from \"YConnect/Utils/GetNewHtmlReplaceImg.util\"\r\nimport DescryptoValue from \"YConnect/Utils/DescryptoValue\";\r\nimport ExerciseTemplate, { getTemplateType } from \"YConnect/Enums/ExerciseTemplate\"\r\n\r\nimport HeaderExerciseStyle from \"YConnect/Styles/HeaderExercise.style\"\r\nimport ExerciseTimelineStyle from \"YConnect/Styles/ExerciseTimeline.style\"\r\nimport HeaderScoreStyle from \"YConnect/Styles/HeaderScore.style\"\r\nimport FormStyle from \"YConnect/Styles/Form.style\"\r\nimport FooterStyle from \"YConnect/Styles/Footer.style\"\r\nimport HomeworkLabelStyle from \"YConnect/Styles/HomeworkLabel.style\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\nimport PrePostContext from \"YConnect/PrePost.context\"\r\n\r\nimport OrientationToFinalTest from \"YConnect/Modals/OrientationBatteryToFinalTest.modal\"\r\n\r\nimport styled from \"styled-components\"\r\n\r\nconst H3Style = styled.h3`\r\n i{\r\n font-size: 22px;\r\n }\r\n\r\n u{\r\n font-size: 22px;\r\n }\r\n\r\n b{\r\n font-size: 19px;\r\n }\r\n`\r\nconst TimerDivStyle = styled.div`\r\n background-color: ${props => props.theme.main.backgroundWhite};\r\n border-radius: 8px;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n width: 198px;\r\n height: 65px;\r\n text-align: center;\r\n line-height: 4em;\r\n margin-bottom: 20px;\r\n\r\n span {\r\n color: ${props => props.theme.main.successColor};\r\n font-weight: bold;\r\n }\r\n`\r\nconst FormStyleBattery = styled(FormStyle)`\r\n .view-answers{\r\n display: none;\r\n }\r\n`\r\nconst FooterStyleFlexEnd = styled(FooterStyle)`\r\n justify-content: flex-end;\r\n`\r\n\r\nconst TitleCategoryStyle = styled.h1`\r\n color: #79b100;\r\n`\r\n\r\nconst TestBatteryPage = ({\r\n onUpdatePrePost,\r\n match,\r\n location,\r\n onCheckTag\r\n}: any) => {\r\n\r\n const userContext: any = useContext(UserContext)\r\n const prePostUserContext: any = useContext(PrePostContext)\r\n\r\n\r\n const [width, setWidth] = useState(window.innerWidth)\r\n\r\n const [formValues, setFormValues] = useState()\r\n const [canSubmit, setSubmit] = useState(false)\r\n const [isLoading, setLoading] = useState(true)\r\n const [batteryExercise, setBatteryExercise] = useState([])\r\n const [time, setTime] = useState(moment.duration(0))\r\n const [numQuestion, setNumQuestion] = useState(0)\r\n const [rerenderTemplate, setRerenderTemplate] = useState(true)\r\n const [answeredQuestions, setAnsweredQuestions] = useState
>([])\r\n const [showResult, setShowResult] = useState(false)\r\n const [error, setError] = useState(false)\r\n const [totalQuestions, setTotalQuestions] = useState(0)\r\n\r\n const [batteryModal, setBatteryModal] = useState(false);\r\n\r\n const {\r\n params: { idCurso, idCourse, idUnidade, sectionName, orderId, idExercise }\r\n } = match\r\n\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setWidth(window.innerWidth)\r\n }\r\n window.addEventListener(\"resize\", handleResize)\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize)\r\n }\r\n })\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n fetchExerciseContentBattery()\r\n setSubmit(false)\r\n }, [idCourse])\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n }, [idUnidade, sectionName, orderId])\r\n\r\n useEffect(() => {\r\n setShowResult(false)\r\n }, [idExercise])\r\n\r\n useEffect(() => {\r\n setSubmit(false)\r\n if (formValues && formValues.valuesUpdated.exercise) {\r\n const answers = formValues.valuesUpdated.exercise\r\n if (batteryExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.TYPE_IN\r\n || batteryExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CATYPE_IN\r\n ) {\r\n let quant = 0\r\n answers.resposta.map(item => {\r\n if (item) {\r\n quant += Object.keys(item).length\r\n }\r\n })\r\n\r\n if (quant === answers.qntd_respostas) {\r\n setSubmit(true)\r\n }\r\n } else if (batteryExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CHOOSE_MULTIPLE\r\n || batteryExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CACHOOSE_MULTIPLE\r\n || batteryExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.VIDEO_CHOOSE_MULTIPLE\r\n ) {\r\n if (answers.resposta) {\r\n setSubmit(true)\r\n }\r\n } else if (answers.qntd_respostas === (answers.resposta.filter(Boolean)).length) {\r\n setSubmit(true)\r\n }\r\n answeredQuestions[numQuestion] = answers\r\n setAnsweredQuestions(answeredQuestions)\r\n }\r\n }, [formValues])\r\n\r\n useEffect(() => {\r\n if (rerenderTemplate == false) {\r\n setRerenderTemplate(true)\r\n }\r\n }, [rerenderTemplate])\r\n\r\n const handleBatteryModal = () => {\r\n setBatteryModal(!batteryModal)\r\n }\r\n const DecryptExtraSupport = (content:any) => {\r\n\r\n const dataDescrypt = content && content.map((elem : object) => {\r\n elem.enunciado = DescryptoValue.descryptoString( elem.enunciado);\r\n elem.nome_categoria = DescryptoValue.descryptoString( elem.nome_categoria);\r\n elem.conteudo_exercicio = DescryptoValue.descryptoString( elem.conteudo_exercicio);\r\n elem.texto = DescryptoValue.descryptoString( elem.texto);\r\n elem.respostas_Exercicio_Yconnect = elem.respostas_Exercicio_Yconnect.map( (respostas: Object)=>\r\n DescryptoValue.descryptoObject( respostas )\r\n ); \r\n elem.midia_Yconnect = elem.midia_Yconnect.map( (midia: Object)=>\r\n DescryptoValue.descryptoObject( midia )\r\n );\r\n\r\n return elem; \r\n }\r\n );\r\n return dataDescrypt;\r\n }\r\n\r\n const fetchExerciseContentBattery = async () => {\r\n try {\r\n const { idUsuario } = userContext\r\n\r\n const { data } = await API.BatteryTest.GetPerguntasRespostasBateria({\r\n id_curso: idCurso,\r\n id_aluno_bateria: idUsuario\r\n }, getConfig())\r\n const dataDescrypt = DecryptExtraSupport(data);\r\n setBatteryExercise(dataDescrypt)\r\n setTotalQuestions(data.length)\r\n setLoading(false)\r\n } catch (error) {\r\n setError(true)\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const fetchSaveProva = async (\r\n idUsuario: number,\r\n idCurso: number,\r\n answers: any) => {\r\n\r\n window.innerWidth > 1024 ? window.scrollTo(0, 0) : window.scrollTo(0, 170);\r\n\r\n try {\r\n await API.BatteryTest\r\n .saveRespostasProva({\r\n bateriaTeste: {\r\n id_aluno: idUsuario,\r\n id_curso: idCurso,\r\n pontuacao: Math.round(answers.reduce((acc: number, act: any) => acc + act.correto, 0) * (100 / totalQuestions))\r\n },\r\n listaBateria: answers\r\n }, getConfig())\r\n\r\n setLoading(false)\r\n setShowResult(true)\r\n\r\n } catch (e) {\r\n setError(true)\r\n setLoading(false)\r\n toastr.error(\"unable to finish:\", \"Error!\")\r\n }\r\n }\r\n\r\n const saveTestBattery = () => {\r\n const { idUsuario } = userContext\r\n const { params } = match\r\n\r\n setLoading(true)\r\n fetchSaveProva(idUsuario, params.idCurso, getAnswers())\r\n handleBatteryModal()\r\n }\r\n\r\n\r\n const nextExercise = () => {\r\n setSubmit(false)\r\n setRerenderTemplate(false)\r\n if (numQuestion + 1 < totalQuestions) {\r\n setNumQuestion(numQuestion + 1)\r\n }\r\n console.log('getAnswers', getAnswers())\r\n }\r\n\r\n const getBreadcrumbLinks = () => {\r\n const curso = userContext.cursosVigentes.find(({ id_curso }: any) => id_curso == match.params.idCurso) || {titulo_curso:'Current course'}\r\n return [\r\n { path: '/', label: 'Homepage' },\r\n { path: '/courses', label: 'Courses' },\r\n { path: `/courses/${match.params.idCurso}/view-book`, label: curso.titulo_curso },\r\n { path: '', label: 'Extra support' }\r\n ]\r\n }\r\n\r\n const renderBookType = () => {\r\n return Extra support\r\n }\r\n\r\n const renderBookLifeTime = () => \r\n\r\n const getTemplate = (position: number) => {\r\n const { idUsuario } = userContext\r\n let type;\r\n\r\n if (batteryExercise[position]) {\r\n type = getTemplateType(batteryExercise[position].template_Yconnect)\r\n }\r\n\r\n let template = [\r\n {\r\n \"id\": \"exercise\",\r\n \"type\": type,\r\n \"exercise\": batteryExercise[position],\r\n \"studentId\": idUsuario,\r\n \"attempts\": 0,\r\n \"isStudent\": false,\r\n }\r\n ]\r\n\r\n position++;\r\n\r\n return template\r\n }\r\n\r\n const getPageTitle = () => {\r\n return `Extra support`\r\n }\r\n\r\n useEffect(() => {\r\n let timer\r\n if (!showResult)\r\n timer = setInterval(() => setTime(time + 1000), 1000)\r\n return () => clearInterval(timer);\r\n }, [time, showResult])\r\n\r\n const renderTime = () => {\r\n const duration = moment.duration(time)\r\n return (\r\n \r\n Your time: {moment.utc(duration.asMilliseconds()).format(\"HH:mm:ss\")}\r\n \r\n )\r\n }\r\n\r\n const isStudent = () => {\r\n const { idProfessor, observador, colaborador, usuarioTrial, usuarioDegustacao } = userContext\r\n return (idProfessor == 0 && !observador && !colaborador && !usuarioTrial && !usuarioDegustacao)\r\n }\r\n\r\n const getAnswers = () => {\r\n const answers = []\r\n for (let i = 0; i < answeredQuestions.length; i++) {\r\n const answer = answeredQuestions[i]\r\n answers[i] = {\r\n correto: parseInt(answer.qntd_acertos / answer.qntd_respostas, 10),\r\n id_exercicio: batteryExercise[i].id_exercicio,\r\n resposta: answer.resposta instanceof Number || answer.resposta instanceof String\r\n ? answer.resposta : JSON.stringify(answer.resposta)\r\n }\r\n }\r\n return answers;\r\n }\r\n\r\n const renderResult = () => {\r\n const answers = getAnswers();\r\n const qntd_acertos = answers.reduce((acc: number, act: any) => acc + act.correto, 0)\r\n const qntd_erros = totalQuestions - qntd_acertos;\r\n const { params } = match\r\n\r\n return \r\n
\r\n
\r\n {qntd_erros > 0 ? 'Keep Trying!' : 'Nice work!'} Your score is:\r\n
\r\n \r\n
\r\n \r\n {qntd_acertos} right\r\n \r\n
\r\n \r\n {qntd_erros} wrong\r\n
\r\n \r\n
\r\n
Keep studying and getting better
\r\n \r\n
\r\n
{ setShowResult(false) }}\r\n link=\"/courses\"\r\n />\r\n \r\n \r\n \r\n \r\n Or\r\n \r\n \r\n { setShowResult(false) }}\r\n link={`/courses/${params.idCurso}/`}\r\n />\r\n \r\n \r\n }\r\n\r\n if (error) return \r\n\r\n\r\n return \r\n {isLoading\r\n ? \r\n : <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderTime()}\r\n \r\n
\r\n\r\n {batteryExercise.length > 0 &&\r\n \r\n \r\n {renderBookType()}\r\n {renderBookLifeTime()}\r\n {\r\n showResult\r\n ? renderResult()\r\n : <>\r\n \r\n \r\n {`${batteryExercise[numQuestion].nome_categoria}`}\r\n \r\n \r\n {`Question ${numQuestion + 1} of ${totalQuestions}`}\r\n
\r\n \r\n \r\n {rerenderTemplate &&\r\n {\r\n field.isDisabledViewAnswers = true\r\n return field\r\n })}/>\r\n }\r\n >\r\n }\r\n\r\n {\r\n batteryModal ?\r\n \r\n : <> >\r\n }\r\n\r\n {showResult\r\n ? \r\n \r\n \r\n : \r\n {numQuestion + 1 < totalQuestions ?\r\n \r\n :\r\n \r\n }\r\n \r\n }\r\n
\r\n
\r\n }\r\n >\r\n }\r\n \r\n}\r\n\r\nexport default TestBatteryPage\r\n","import * as React from \"react\"\r\nimport { Modal, FormGroup } from \"react-bootstrap\"\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\n\r\nimport styled from \"styled-components\";\r\n\r\nimport { YLinkButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport * as world from \"YConnect/Assets/svg/world.svg\"\r\n\r\n/** Style */\r\nconst GeneralStyle = styled(Modal)`\r\n .modal-content {\r\n width: 120% !important;\r\n }\r\n`\r\n\r\nconst BodyStyle = styled(Modal.Body)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n padding: 20px !important;\r\n border-radius: 10px 10px 0 0 !important;\r\n\r\n h1 {\r\n text-align: center;\r\n margin-top: 30px;\r\n }\r\n\r\n .body-message {\r\n text-align: center;\r\n margin-top: 25px;\r\n }\r\n`\r\n\r\nconst DivOvalStyle = styled.div`\r\n border-radius: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0,0,0,0.11);\r\n width: 204px;\r\n height: 204px;\r\n background: #643e94;\r\n padding: 19px;\r\n margin: auto;\r\n margin-top: -115px;\r\n\r\n div {\r\n background: white;\r\n border-radius: 100%;\r\n width: 100%;\r\n height: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n text-align: center;\r\n padding: 30px;\r\n\r\n img {\r\n margin: auto;\r\n width: 100%;\r\n height: auto;\r\n }\r\n }\r\n`\r\n\r\nconst FooterStyle = styled(Modal.Footer)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n justify-content: space-between;\r\n`\r\n\r\nconst ButtonCloseStyle = styled(YLinkButtonStyle)`\r\n border: none;\r\n padding: 0;\r\n\r\n img {\r\n padding-left: 10px !important;\r\n width: 25px;\r\n }\r\n`\r\n\r\n\r\ntype OrientationFinalTestToBatteryProps = {\r\n isShow: boolean\r\n onClose: () => void\r\n username: string\r\n prePost: any\r\n}\r\n\r\nconst OrientationFinalTestToBattery = ({ isShow, onClose, username, idCourse, segundaProva, WTFinished }: OrientationFinalTestToBatteryProps) => {\r\n\r\n return <>\r\n {\r\n segundaProva\r\n ?\r\n \r\n \r\n \r\n \r\n
\r\n \r\n

\r\n
\r\n \r\n
\r\n\r\n Hello, {username}! :)
\r\n\r\n {\r\n WTFinished == null ?\r\n \r\n Let's put your writing skills into practice. You still need some help with some topics studied in this program, talk to your teacher about the difficulties you had.\r\n
\r\n : You concluded all of your tests, congratulations!
\r\n }\r\n\r\n \r\n \r\n \r\n {\r\n WTFinished == null &&\r\n \r\n }\r\n\r\n \r\n \r\n : \r\n \r\n \r\n \r\n
\r\n \r\n

\r\n
\r\n \r\n
\r\n\r\n Hello, {username}! :)
\r\n\r\n \r\n You still need help with some topics studied in this program. The following activities are to practice these topics before you take the test again.\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n }\r\n\r\nexport default OrientationFinalTestToBattery\r\n","import * as React from \"react\"\r\nimport { Modal, FormGroup } from \"react-bootstrap\"\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\n\r\nimport styled from \"styled-components\";\r\n\r\nimport { YLinkButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport * as world from \"YConnect/Assets/svg/world.svg\"\r\n\r\n/** Style */\r\nconst GeneralStyle = styled(Modal)`\r\n .modal-content {\r\n width: 120% !important;\r\n }\r\n`\r\n\r\nconst BodyStyle = styled(Modal.Body)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n padding: 20px !important;\r\n border-radius: 10px 10px 0 0 !important;\r\n\r\n h1 {\r\n text-align: center;\r\n margin-top: 30px;\r\n }\r\n\r\n .body-message {\r\n text-align: center;\r\n margin-top: 25px;\r\n }\r\n`\r\n\r\nconst DivOvalStyle = styled.div`\r\n border-radius: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0,0,0,0.11);\r\n width: 204px;\r\n height: 204px;\r\n background: #643e94;\r\n padding: 19px;\r\n margin: auto;\r\n margin-top: -115px;\r\n\r\n div {\r\n background: white;\r\n border-radius: 100%;\r\n width: 100%;\r\n height: 100%;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n text-align: center;\r\n padding: 30px;\r\n\r\n img {\r\n margin: auto;\r\n width: 100%;\r\n height: auto;\r\n }\r\n }\r\n`\r\n\r\nconst FooterStyle = styled(Modal.Footer)`\r\n background: ${props => props.theme.main.backgroundWhite};\r\n justify-content: space-between;\r\n flex-wrap: unset !important;\r\n`\r\n\r\nconst ButtonCloseStyle = styled(YLinkButtonStyle)`\r\n border: none;\r\n padding: 0;\r\n\r\n img {\r\n padding-left: 10px !important;\r\n width: 25px;\r\n }\r\n`\r\n\r\n\r\ntype OrientationAprovedFinalTestProps = {\r\n isShow: boolean\r\n onClose: () => void\r\n username: string\r\n prePost: any\r\n}\r\n\r\n\r\n\r\nconst OrientationAprovedFinalTest = ({ isShow, onClose, username, idCourse, WTFinished }: OrientationAprovedFinalTestProps) =>\r\n \r\n \r\n \r\n \r\n
\r\n \r\n

\r\n
\r\n \r\n
\r\n\r\n Hello, {username}! :)
\r\n\r\n {\r\n WTFinished == null ?\r\n \r\n Well done! Now it’s time to put your writing skills into practice.\r\n
\r\n : \r\n You concluded all of your tests, congratulations!\r\n
\r\n }\r\n\r\n \r\n \r\n \r\n {\r\n WTFinished == null &&\r\n \r\n }\r\n \r\n \r\n\r\nexport default OrientationAprovedFinalTest\r\n","import * as React from \"react\"\r\nimport { useState, useEffect, useContext } from \"react\"\r\nimport { Link } from \"react-router-dom\"\r\nimport { Container, Row, Col, Card, Tooltip } from \"reactstrap\"\r\nimport * as toastr from \"toastr\";\r\nimport moment from \"moment\"\r\n\r\nimport * as pencil from \"YConnect/Assets/svg/pencil.svg\"\r\nimport * as pencilGreen from \"YConnect/Assets/svg/pencilGreen.svg\"\r\nimport * as checked from \"YConnect/Assets/svg/checked.svg\"\r\nimport * as remove from \"YConnect/Assets/svg/close-btn.svg\"\r\nimport * as warning from \"YConnect/Assets/svg/warning.svg\"\r\n\r\nimport Breadcrumb from \"YConnect/Components/Breadcrumb\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport Loader from \"YConnect/Components/Loader\"\r\nimport ServerErrorPage from \"YConnect/Pages/ServerError.page\"\r\nimport { BackLinkStyle } from \"YConnect/Styles/BackLink.style\"\r\nimport { ButtonStyle, YLinkButtonStyle } from \"YConnect/Components/Button\"\r\nimport API from \"YConnect/API\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\nimport GetNewHtmlReplaceImg from \"YConnect/Utils/GetNewHtmlReplaceImg.util\"\r\nimport DescryptoValue from \"YConnect/Utils/DescryptoValue\";\r\nimport ExerciseTemplate, { getTemplateType } from \"YConnect/Enums/ExerciseTemplate\"\r\n\r\nimport HeaderExerciseStyle from \"YConnect/Styles/HeaderExercise.style\"\r\nimport ExerciseTimelineStyle from \"YConnect/Styles/ExerciseTimeline.style\"\r\nimport HeaderScoreStyle from \"YConnect/Styles/HeaderScore.style\"\r\nimport FormStyle from \"YConnect/Styles/Form.style\"\r\nimport FooterStyle from \"YConnect/Styles/Footer.style\"\r\nimport HomeworkLabelStyle from \"YConnect/Styles/HomeworkLabel.style\"\r\n\r\nimport UserContext from \"YConnect/User.context\"\r\nimport PrePostContext from \"YConnect/PrePost.context\"\r\n\r\nimport styled from \"styled-components\"\r\n\r\nimport OrientationToBattery from \"YConnect/Modals/OrientationFinalTestToBattery.modal\"\r\nimport OrientationFinalTestAproved from \"YConnect/Modals/OrientationAprovedFinalTest.modal\"\r\n\r\nconst H3Style = styled.h3`\r\n i{\r\n font-size: 22px;\r\n }\r\n\r\n u{\r\n font-size: 22px;\r\n }\r\n\r\n b{\r\n font-size: 19px;\r\n }\r\n`\r\n\r\nconst TitleCategoryStyle = styled.h1`\r\n color: #79b100;\r\n`\r\n\r\nconst TimerDivStyle = styled.div`\r\n background-color: ${props => props.theme.main.backgroundWhite};\r\n border-radius: 8px;\r\n box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.11);\r\n width: 198px;\r\n height: 65px;\r\n text-align: center;\r\n line-height: 4em;\r\n margin-bottom: 20px;\r\n\r\n span {\r\n color: ${props => props.theme.main.successColor};\r\n font-weight: bold;\r\n }\r\n`\r\nconst FormStyleFinal = styled(FormStyle)`\r\n .view-answers{\r\n display: none;\r\n }\r\n`\r\n\r\nconst FooterStyleFlexEnd = styled(FooterStyle)`\r\n justify-content: flex-end;\r\n`\r\n\r\nconst AssessmentFinal2Page = ({\r\n onUpdatePrePost,\r\n match,\r\n location,\r\n onCheckTag\r\n}: any) => {\r\n\r\n const userContext: any = useContext(UserContext)\r\n const prePostUserContext: any = useContext(PrePostContext)\r\n\r\n\r\n const [width, setWidth] = useState(window.innerWidth)\r\n\r\n const [formValues, setFormValues] = useState()\r\n const [canSubmit, setSubmit] = useState(false)\r\n const [isLoading, setLoading] = useState(true)\r\n const [assessmentExercise, setAssessmentExercise] = useState([])\r\n const [time, setTime] = useState(moment.duration(0))\r\n const [numQuestion, setNumQuestion] = useState(0)\r\n const [rerenderTemplate, setRerenderTemplate] = useState(true)\r\n const [answeredQuestions, setAnsweredQuestions] = useState>([])\r\n const [showResult, setShowResult] = useState(false)\r\n const [error, setError] = useState(false)\r\n const [totalQuestions, setTotalQuestions] = useState(0)\r\n\r\n const [modalToBatery, setModalToBatery] = useState(false);\r\n const [modalAproved, setModalAproved] = useState(false)\r\n\r\n const [followPontuation, setFollowPontuation] = useState(Number);\r\n const [dataFinalTest, setDataFinalTest] = useState();\r\n\r\n const [isSegundaProva, setIsSegundaProva] = useState(false);\r\n const [wtSended, setWTSended] = useState()\r\n\r\n const [testFinished, setTestFinished] = useState(false)\r\n\r\n const idsMultinivel = [69, 70, 82, 83, 85, 86, 87];\r\n\r\n const {\r\n params: { idCurso, idCourse, idUnidade, sectionName, orderId, idExercise }\r\n } = match\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setWidth(window.innerWidth)\r\n }\r\n window.addEventListener(\"resize\", handleResize)\r\n return () => {\r\n window.removeEventListener(\"resize\", handleResize)\r\n }\r\n })\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n fetchExerciseContentAssessment()\r\n setSubmit(false)\r\n getPontuacaoFinal()\r\n }, [idCourse])\r\n\r\n useEffect(() => {\r\n setLoading(true)\r\n }, [idUnidade, sectionName, orderId])\r\n\r\n useEffect(() => {\r\n setShowResult(false)\r\n }, [idExercise])\r\n\r\n useEffect(() => {\r\n setSubmit(false)\r\n if (formValues && formValues.valuesUpdated.exercise) {\r\n const answers = formValues.valuesUpdated.exercise\r\n if (assessmentExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.TYPE_IN\r\n || assessmentExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CATYPE_IN\r\n ) {\r\n let quant = 0\r\n answers.resposta.map(item => {\r\n if (item) {\r\n quant += Object.keys(item).length\r\n }\r\n })\r\n\r\n if (quant === answers.qntd_respostas) {\r\n setSubmit(true)\r\n }\r\n } else if (assessmentExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CHOOSE_MULTIPLE\r\n || assessmentExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.CACHOOSE_MULTIPLE\r\n || assessmentExercise[numQuestion].template_Yconnect.nome === ExerciseTemplate.VIDEO_CHOOSE_MULTIPLE\r\n ) {\r\n if (answers.resposta) {\r\n setSubmit(true)\r\n }\r\n } else if (answers.qntd_respostas === (answers.resposta.filter(Boolean)).length) {\r\n setSubmit(true)\r\n }\r\n answeredQuestions[numQuestion] = answers\r\n setAnsweredQuestions(answeredQuestions)\r\n }\r\n }, [formValues])\r\n\r\n useEffect(() => {\r\n if (rerenderTemplate == false) {\r\n setRerenderTemplate(true)\r\n }\r\n }, [rerenderTemplate])\r\n\r\n\r\n const handleModalBatery = () => {\r\n setModalToBatery(!modalToBatery)\r\n }\r\n\r\n const handleModalAproved = () => {\r\n setModalAproved(!modalAproved)\r\n }\r\n\r\n const DecryptFinalTest = (content:any) => {\r\n\r\n const dataDescrypt = content && content.map((elem : object) => {\r\n elem.enunciado = DescryptoValue.descryptoString( elem.enunciado);\r\n elem.nome_categoria = DescryptoValue.descryptoString( elem.nome_categoria);\r\n elem.conteudo_exercicio = DescryptoValue.descryptoString( elem.conteudo_exercicio);\r\n elem.texto = DescryptoValue.descryptoString( elem.texto);\r\n elem.respostas_Exercicio_Yconnect = elem.respostas_Exercicio_Yconnect.map( (respostas: Object)=>\r\n DescryptoValue.descryptoObject( respostas )\r\n );\r\n\r\n elem.exercicio_Yconnect.midia_Yconnect = elem.exercicio_Yconnect.midia_Yconnect && elem.exercicio_Yconnect.midia_Yconnect.map((midiaRespostas:object) =>\r\n DescryptoValue.descryptoObject( midiaRespostas\r\n ));\r\n\r\n elem.midia_Yconnect = elem.midia_Yconnect.map( (midia: Object)=>\r\n DescryptoValue.descryptoObject( midia )\r\n );\r\n\r\n return elem;\r\n }\r\n );\r\n return dataDescrypt;\r\n }\r\n\r\n const fetchExerciseContentAssessment = async () => {\r\n try {\r\n const { idUsuario } = userContext\r\n\r\n const { data } = await API.AssessmentFinalTest.GetPerguntasRespostasProva({\r\n id_curso: idCurso,\r\n id_aluno_prova: idUsuario\r\n }, getConfig())\r\n\r\n const dataDescrypt = DecryptFinalTest(data);\r\n setAssessmentExercise(dataDescrypt)\r\n setTotalQuestions(data.length)\r\n setLoading(false)\r\n } catch (error) {\r\n setError(true)\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const getPontuacaoFinal = async () => {\r\n const { idUsuario } = userContext\r\n\r\n const finalTestScore = await API.AssessmentFinalTest.GetNotasFinal(\r\n {\r\n id_curso: idCurso,\r\n id_aluno_nota_final: idUsuario\r\n },\r\n getConfig()\r\n );\r\n setDataFinalTest(finalTestScore.data)\r\n }\r\n\r\n useEffect(() => {\r\n if (dataFinalTest && dataFinalTest.length > 0) {\r\n setIsSegundaProva(true)\r\n setWTSended(dataFinalTest[0].data_finalizacao_written_test)\r\n }\r\n\r\n alreadyFinishedTest()\r\n }, [dataFinalTest])\r\n\r\n const fetchSaveProva = async (\r\n idUsuario: number,\r\n idCurso: number,\r\n answers: any) => {\r\n\r\n window.innerWidth > 1024 ? window.scrollTo(0, 0) : window.scrollTo(0, 170);\r\n\r\n try {\r\n await API.AssessmentFinalTest\r\n .saveRespostasProva({\r\n provaFinal: {\r\n id_aluno: idUsuario,\r\n id_curso: idCurso,\r\n pontuacao: Math.round(answers.reduce((acc: number, act: any) => acc + act.correto, 0) * (1 / totalQuestions))\r\n },\r\n listaProva: answers\r\n }, getConfig())\r\n\r\n setFollowPontuation(Math.round(answers.reduce((acc: number, act: any) => acc + act.correto, 0) * (1 / totalQuestions)))\r\n if(idsMultinivel.includes(idCurso)) {\r\n if (Math.round(answers.reduce((acc: number, act: any) => acc + act.correto, 0) * (1 / totalQuestions)) >= 70) {\r\n handleModalAproved()\r\n }\r\n else if (Math.round(answers.reduce((acc: number, act: any) => acc + act.correto, 0) * (1 / totalQuestions)) < 70) {\r\n handleModalBatery()\r\n }\r\n setLoading(false)\r\n setShowResult(true)\r\n } else {\r\n handleModalAproved()\r\n setLoading(false)\r\n setShowResult(true)\r\n }\r\n\r\n\r\n } catch (e) {\r\n setError(true)\r\n setLoading(false)\r\n toastr.error(\"unable to finish:\", \"Error!\")\r\n }\r\n }\r\n\r\n const saveAsssessmentFinal = () => {\r\n const { idUsuario } = userContext\r\n const { params } = match\r\n\r\n setLoading(true)\r\n fetchSaveProva(idUsuario, params.idCurso, getAnswers())\r\n }\r\n\r\n\r\n const nextExercise = () => {\r\n // getModalPontuacao()\r\n setSubmit(false)\r\n setRerenderTemplate(false)\r\n if (numQuestion + 1 < totalQuestions) {\r\n setNumQuestion(numQuestion + 1)\r\n }\r\n }\r\n\r\n const getBreadcrumbLinks = () => {\r\n const curso = userContext.cursosVigentes.find(({ id_curso }: any) => id_curso == match.params.idCurso) || {titulo_curso:'Current course'}\r\n\r\n return [\r\n { path: '/', label: 'Homepage' },\r\n { path: '/courses', label: 'Courses' },\r\n { path: `/courses/${match.params.idCurso}/view-book`, label: curso.titulo_curso },\r\n { path: '', label: 'Final Test' }\r\n ]\r\n }\r\n\r\n const renderBookType = () => {\r\n return Final Test\r\n }\r\n\r\n const renderBookLifeTime = () => \r\n\r\nconst renderBookPencil = () => \r\n\r\n const getTemplate = (position: number) => {\r\n const { idUsuario } = userContext\r\n let type;\r\n\r\n if (assessmentExercise[position]) {\r\n type = getTemplateType(assessmentExercise[position].template_Yconnect)\r\n }\r\n\r\n let template = [\r\n {\r\n \"id\": \"exercise\",\r\n \"type\": type,\r\n \"exercise\": assessmentExercise[position],\r\n \"studentId\": idUsuario,\r\n \"attempts\": 0,\r\n \"isStudent\": false,\r\n }\r\n ]\r\n\r\n position++;\r\n\r\n return template\r\n }\r\n\r\n const getPageTitle = () => {\r\n return `Final Test`\r\n }\r\n\r\n\r\n useEffect(() => {\r\n let timer\r\n if (!showResult)\r\n timer = setInterval(() => setTime(time + 1000), 1000)\r\n return () => clearInterval(timer);\r\n }, [time, showResult])\r\n\r\n const renderTime = () => {\r\n const duration = moment.duration(time)\r\n return (\r\n \r\n Your time: {moment.utc(duration.asMilliseconds()).format(\"HH:mm:ss\")}\r\n \r\n )\r\n }\r\n\r\n const isStudent = () => {\r\n const { idProfessor, observador, colaborador, usuarioTrial, usuarioDegustacao } = userContext\r\n return (idProfessor == 0 && !observador && !colaborador && !usuarioTrial && !usuarioDegustacao)\r\n }\r\n\r\n const getAnswers = () => {\r\n const answers = []\r\n for (let i = 0; i < answeredQuestions.length; i++) {\r\n const answer = answeredQuestions[i]\r\n answers[i] = {\r\n correto: Number((answer.qntd_acertos / answer.qntd_respostas).toFixed(2))*100,\r\n id_exercicio: assessmentExercise[i].id_exercicio,\r\n resposta: typeof answer.resposta === \"string\" || typeof answer.resposta === \"number\"\r\n ? answer.resposta : JSON.stringify(answer.resposta)\r\n }\r\n }\r\n return answers;\r\n }\r\n\r\n const alreadyFinishedTest = () => {\r\n const paramCourse = Number(match.params.idCurso)\r\n\r\n if (isStudent && idsMultinivel.includes(paramCourse) && dataFinalTest && dataFinalTest.length > 1) {\r\n setTestFinished(true)\r\n }\r\n\r\n else if (isStudent && !idsMultinivel.includes(paramCourse) && dataFinalTest && dataFinalTest.length > 0 && dataFinalTest[0].pontuacao >= 0) {\r\n setTestFinished(true)\r\n }\r\n }\r\n\r\n // console.log(Math.round(getAnswers().reduce((acc: number, act: any) => acc + act.correto, 0) * (100 / totalQuestions)))\r\n\r\n const renderResult = () => {\r\n const answers = getAnswers();\r\n let qntd_meia_resposta = 0;\r\n let qntd_acertos = 0;\r\n let qntd_erros = 0;\r\n\r\n for(let index = 0; index < answers.length; index++) {\r\n const act = answers[index].correto;\r\n if(act < 100 && act > 0){\r\n qntd_meia_resposta++;\r\n }\r\n else if(act === 100){\r\n qntd_acertos++;\r\n }\r\n else{\r\n qntd_erros++;\r\n }\r\n }\r\n\r\n // const qntd_acertos = answers.reduce((acc: number, act: any) => acc + act.correto, 0)\r\n // const qntd_erros = totalQuestions - qntd_acertos - qntd_meiaResposta;\r\n const { params } = match\r\n\r\n return \r\n
\r\n
\r\n {qntd_erros > 0 ? 'Keep Trying!' : 'Nice work!'} Your score is:\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n\r\n {qntd_acertos} right\r\n \r\n\r\n \r\n \r\n
\r\n \r\n {qntd_erros} wrong\r\n \r\n\r\n \r\n \r\n
\r\n \r\n {qntd_meia_resposta} half the answer\r\n \r\n\r\n
\r\n \r\n
\r\n \r\n
\r\n
Keep studying and getting better
\r\n \r\n
\r\n
{ setShowResult(false) }}\r\n link=\"/courses\"\r\n />\r\n \r\n \r\n \r\n \r\n Or\r\n \r\n \r\n { setShowResult(false) }}\r\n link={`/courses/${params.idCurso}/`}\r\n />\r\n \r\n \r\n }\r\n\r\n if (error) return \r\n\r\n const _popupCenter = (url: string, title: string, w: number, h: number) => {\r\n // Fixes dual-screen position Most browsers Firefox\r\n const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : window.screenX;\r\n const dualScreenTop = window.screenTop != undefined ? window.screenTop : window.screenY;\r\n\r\n const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;\r\n const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;\r\n\r\n const systemZoom = width / window.screen.availWidth;\r\n const left = (width - w) / 2 / systemZoom + dualScreenLeft\r\n const top = (height - h) / 2 / systemZoom + dualScreenTop\r\n const newWindow = window.open(url, title, 'scrollbars=yes, width=' + w / systemZoom + ', height=' + h / systemZoom + ', top=' + top + ', left=' + left);\r\n\r\n if (window.focus) newWindow.focus();\r\n }\r\n\r\n return \r\n {isLoading\r\n ? \r\n : <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {renderTime()}\r\n \r\n
\r\n\r\n \r\n\r\n \r\n\r\n {assessmentExercise.length > 0 && !testFinished &&\r\n \r\n \r\n {renderBookType()}\r\n {assessmentExercise.length < 20 ? renderBookLifeTime() : renderBookPencil()}\r\n {\r\n showResult\r\n ? renderResult()\r\n : <>\r\n \r\n \r\n {`${assessmentExercise[numQuestion].nome_categoria}`}\r\n \r\n \r\n {`Question ${numQuestion + 1} of ${totalQuestions}`}\r\n
\r\n \r\n \r\n {rerenderTemplate &&\r\n {\r\n field.isDisabledViewAnswers = true\r\n return field\r\n })}/>\r\n }\r\n >\r\n }\r\n\r\n {showResult\r\n ? \r\n \r\n \r\n : \r\n {numQuestion + 1 < totalQuestions ?\r\n \r\n :\r\n \r\n }\r\n \r\n }\r\n
\r\n
\r\n }\r\n\r\n {testFinished &&\r\n \r\n \r\n \r\n
\r\n
\r\n You already finished the test!
\r\n You can check your result in reports!
\r\n \r\n \r\n }\r\n >\r\n }\r\n \r\n}\r\n\r\nexport default AssessmentFinal2Page\r\n","import * as React from \"react\"\r\nimport {\r\n useEffect, useState, useContext, useRef\r\n} from \"react\"\r\nimport {Container, Row, Col, Card} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport { BreadcrumbExplore } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport API from \"YConnect/API\"\r\nimport UserContext from \"YConnect/User.context\"\r\nimport { ButtonStyle, LinkStyle } from \"YConnect/Components/Button\"\r\nimport Table from \"YConnect/Components/Table\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\nimport * as toastr from \"toastr\"\r\n\r\nimport AlphaBlackStyle from \"YConnect/Styles/AlphaBlack.style\"\r\nimport { CSSTransition } from \"react-transition-group\"\r\n\r\nimport * as remove from \"YConnect/Assets/svg/remove.svg\"\r\nimport * as arrowNext from \"YConnect/Assets/svg/arrow-next.svg\"\r\nimport * as arrowPrevious from \"YConnect/Assets/svg/arrow-previous.svg\"\r\nimport { FormGroup } from \"react-bootstrap\"\r\nimport Select from \"react-select\"\r\n\r\nconst FormGroupStyled = styled.div`\r\n @media (min-width: 768px) {\r\n width: 50%;\r\n }\r\n`\r\n\r\nconst ButtonStyleNew = styled(ButtonStyle)`\r\n width: 100%;\r\n @media (min-width: 768px) {\r\n width: 25%;\r\n }\r\n\r\n img {\r\n filter: grayscale(100%) brightness(0) invert(1);\r\n }\r\n`\r\n\r\nconst ButtonStyleWhiteIcon = styled(ButtonStyle)`\r\n img {\r\n filter: invert(1);\r\n width: 33px;\r\n }\r\n`\r\n\r\nconst ExplorePage = () => {\r\n \r\n const CONFIG_TABLE_EXPLORE: Array = [\r\n {\r\n keystone: \"codigo_multi\",\r\n label: \"Code\"\r\n },\r\n {\r\n keystone: \"nm_estab\",\r\n label: \"Name\"\r\n },\r\n {\r\n label: \"Action\",\r\n formatter: (data: any) => {\r\n return removeExploreSchool(data.nsu_estab)}>
Remove\r\n }\r\n }\r\n ];\r\n\r\n const [establishments, setEstablishments] = useState();\r\n\r\n const [exploreEstabs, setExploreEstabs] = useState([]);\r\n const [hasNextExplore, setNextExplore] = useState(false);\r\n const [hasPreviousExplore, setPreviousExplore] = useState(false);\r\n const [totalExplore, setTotalExplore] = useState(0);\r\n const [currentPage, setCurrentPage] = useState(1)\r\n \r\n const [newEstabToAdd, setNewEstabToAdd] = useState()\r\n \r\n \r\n const [exploreSearch, setExploreSearch] = useState('');\r\n const [composeMenu, setComposeMenu] = useState(false)\r\n const [isSaving, setSaving] = useState(false);\r\n\r\n const { idUsuario }:any = useContext(UserContext);\r\n\r\n const startSchools = currentPage === 1 ? 1 : 10 * (currentPage - 1) + 1;\r\n const endSchools = currentPage === 1 ? currentPage + 9 : 10 * (currentPage - 1) + 10;\r\n\r\n const useOutsideClick = (ref: any) => {\r\n const handleClickOutside = (event: any) => {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n setComposeMenu(false)\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n });\r\n }\r\n\r\n const wrapperRef = useRef(null);\r\n useOutsideClick(wrapperRef);\r\n\r\n useEffect(() => {\r\n getExploreEstabs();\r\n getEstabsNotExplore();\r\n }, []);\r\n\r\n const getExploreEstabs = (schoolName = '', page = 1) => {\r\n API.ExploreReport.GetExplore({ nomeEscola: schoolName, pagina: page }, getConfig())\r\n .then((response: any) => {\r\n setPreviousExplore(response.data.estabelecimentoPaginado.hasPrev);\r\n setNextExplore(response.data.estabelecimentoPaginado.hasNext);\r\n setTotalExplore(response.data.estabelecimentoPaginado.totalEstabelecimentos)\r\n setExploreEstabs(response.data.estabelecimentoPaginado.estabelecimentos);\r\n })\r\n }\r\n\r\n const getEstabsNotExplore = () => {\r\n API.ExploreReport.GetAll({ nomeEscola: ''}, getConfig()).then((res: any) => setEstablishments(res.data.listaEscolasIsNotExplore))\r\n }\r\n\r\n const handleSearch = () => {\r\n setCurrentPage(1);\r\n getExploreEstabs(exploreSearch);\r\n }\r\n\r\n const handleNextPage = () => {\r\n if (hasNextExplore) {\r\n getExploreEstabs(exploreSearch, currentPage + 1)\r\n setCurrentPage(currentPage + 1)\r\n }\r\n };\r\n\r\n const handlePreviousPage = () => {\r\n if (hasPreviousExplore) {\r\n getExploreEstabs(exploreSearch, currentPage - 1)\r\n setCurrentPage(currentPage - 1)\r\n }\r\n };\r\n\r\n const addNewEstab = async () => {\r\n setSaving(true)\r\n API.ExploreReport.UpdateExplore({ idEscola: newEstabToAdd.value, isExplore: true, idUsuario: idUsuario}, getConfig())\r\n .then(() => {\r\n setComposeMenu(false);\r\n toastr.success('School added with success!', 'Success');\r\n getExploreEstabs();\r\n getEstabsNotExplore();\r\n }).catch((e: any) => {\r\n toastr.error('An error has occurred!', 'Error');\r\n })\r\n .finally(() => setSaving(false))\r\n\r\n }\r\n\r\n const removeExploreSchool = (id: number) => {\r\n setCurrentPage(1);\r\n API.ExploreReport.UpdateExplore({ idEscola: id, isExplore: false, idUsuario: idUsuario}, getConfig())\r\n .then(() => {\r\n setComposeMenu(false);\r\n toastr.success('School has been removed with success!', 'Success');\r\n getExploreEstabs();\r\n }).catch((e: any) => {\r\n toastr.error('An error has occurred!', 'Error');\r\n })\r\n }\r\n\r\n return <>\r\n \r\n \r\n \r\n \r\n setComposeMenu(true)}\r\n size = {'small'} \r\n icon = {'plus'}\r\n />\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n {
\r\n

handlePreviousPage()}\r\n />\r\n
\r\n Showing {startSchools} - {hasNextExplore ? endSchools : totalExplore} of {totalExplore}\r\n \r\n

handleNextPage()}\r\n />\r\n
}\r\n
\r\n \r\n\r\n {\r\n window.innerWidth > 768 \r\n ? \r\n : exploreEstabs.map((item: any, key: any) => {\r\n return (\r\n \r\n
\r\n
\r\n Code\r\n {item.codigo_multi}\r\n
\r\n
\r\n Name\r\n {item.nm_estab}\r\n
\r\n
\r\n
Action\r\n
removeExploreSchool(item.nsu_estab)}>\r\n Remove
\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n })\r\n }\r\n \r\n \r\n \r\n \r\n\r\n\r\n {composeMenu && }\r\n \r\n \r\n
\r\n Add new school\r\n setComposeMenu(false)} \r\n />\r\n
\r\n
\r\n \r\n {establishments \r\n && \r\n
\r\n \r\n
\r\n
\r\n \r\n >\r\n}\r\n\r\nexport default ExplorePage","import * as React from \"react\"\r\nimport {\r\n useEffect, useState, useContext\r\n} from \"react\"\r\nimport {Container, Row, Col, Card} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport { BreadcrumbSettings } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport UserContext from \"YConnect/User.context\"\r\nimport VirtualClassesCard from \"YConnect/Components/VirtualClassesCard\"\r\n\r\nimport * as manageUser from \"YConnect/Assets/svg/manage-user-icon.svg\"\r\nimport * as explore from \"YConnect/Assets/svg/yazigi-explore-icon.svg\"\r\nimport * as upload from \"YConnect/Assets/svg/upload-file-icon.svg\"\r\n\r\nimport * as tasksIcon from \"YConnect/Assets/png/tasks-256x256.png\"\r\n\r\nconst ReportCardStyle = styled.div`\r\n align-items: center;\r\n border-bottom: 2px solid ${props => props.theme.main.clickable};\r\n color: ${props => props.theme.main.textColor};\r\n cursor: pointer;\r\n display: flex;\r\n flex-flow: row nowrap;\r\n justify-content: flex-start;\r\n text-decoration: none;\r\n &:hover {\r\n color: ${props => props.theme.main.textColor};\r\n text-decoration: none;\r\n }\r\n\r\n .report-type {\r\n display: flex;\r\n flex-flow: column;\r\n justify-content: flex-start;\r\n margin-left: 20px;\r\n\r\n h4, p {\r\n margin: 0;\r\n }\r\n }\r\n\r\n`\r\n\r\nconst SettingsPage = () => {\r\n\r\n const { profiles }:any = useContext(UserContext)\r\n\r\n return \r\n \r\n \r\n \r\n {\r\n !(profiles.indexOf(11) > -1) &&\r\n \r\n window.location.href = \"#/manage-users\"}>\r\n \r\n
\r\n \r\n \r\n
Manage Users
\r\n
Manage users from YConnect.
\r\n
\r\n \r\n \r\n }\r\n\r\n \r\n window.location.href = \"#/virtual-classes\"}>\r\n \r\n
\r\n \r\n \r\n
Virtual Classroom
\r\n
Manage Virtual Classrooms.
\r\n
\r\n \r\n \r\n {\r\n profiles.indexOf(6) > -1\r\n || profiles.indexOf(36) > -1\r\n ? <>\r\n \r\n window.location.href = \"#/explore\"}>\r\n \r\n
\r\n \r\n \r\n
Yázigi Explore
\r\n
Manage schools from Yázigi Explore
\r\n
\r\n \r\n \r\n\r\n \r\n window.location.href = \"#/upload-card\"}>\r\n \r\n
\r\n \r\n \r\n
Yázigi Card Upload
\r\n
Manage cards from Yázigi Explore.
\r\n
\r\n \r\n \r\n >\r\n : null\r\n }\r\n
\r\n\r\n \r\n}\r\n\r\n\r\nexport default SettingsPage\r\n","import * as React from \"react\"\r\nimport {\r\n useEffect,\r\n useState,\r\n useContext,\r\n useRef\r\n} from \"react\"\r\nimport {Container, Row, Col, Card} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport Loader from \"YConnect/Components/Loader\"\r\nimport { BreadcrumbCard } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport PageTitle from \"YConnect/Components/PageTitle\"\r\nimport API from \"YConnect/API\"\r\nimport UserContext from \"YConnect/User.context\"\r\nimport { ButtonStyle, LinkStyle } from \"YConnect/Components/Button\"\r\nimport Table from \"YConnect/Components/Table\"\r\nimport * as toastr from \"toastr\"\r\n\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\nimport AlphaBlackStyle from \"YConnect/Styles/AlphaBlack.style\"\r\nimport { CSSTransition } from \"react-transition-group\"\r\n\r\nimport * as remove from \"YConnect/Assets/svg/remove.svg\"\r\nimport * as arrowNext from \"YConnect/Assets/svg/arrow-next.svg\"\r\nimport * as arrowPrevious from \"YConnect/Assets/svg/arrow-previous.svg\"\r\nimport { FormGroup } from \"react-bootstrap\"\r\nimport formatDate from \"YConnect/Utils/FormatDate.util\"\r\n\r\nimport Axios from \"axios\"\r\nimport getBaseURLWebApi from \"YConnect/Utils/GetBaseURLWebAPI.util\"\r\n\r\nconst FormGroupStyled = styled.div`\r\n @media (min-width: 768px) {\r\n width: 50%\r\n }\r\n`\r\n\r\nconst ButtonStyleNew = styled(ButtonStyle)`\r\n width: 100%\r\n @media (min-width: 768px) {\r\n width: 25%\r\n }\r\n\r\n img {\r\n filter: grayscale(100%) brightness(0) invert(1)\r\n }\r\n`\r\n\r\nconst ButtonStyleWhiteIcon = styled(ButtonStyle)`\r\n img {\r\n filter: invert(1)\r\n width: 33px\r\n }\r\n`\r\n\r\nconst CardPage = () => {\r\n\r\n const CONFIG_TABLE_EXPLORE: Array = [\r\n {\r\n label: \"Title & file\",\r\n formatter: (data: any) => {data.title_file}
{data.name_file}
\r\n },\r\n {\r\n label: \"Type & weight\",\r\n formatter: (data: any) => <>{data.explore_type}
{data.size_file} kb>\r\n },\r\n {\r\n label: \"Date\",\r\n formatter: (data: any) => formatDate(data.data_file, false)\r\n },\r\n {\r\n label: \"Action\",\r\n formatter: (data: any) => {\r\n return removeExploreSchool(data.exploreId)}>
Remove\r\n }\r\n }\r\n ]\r\n\r\n const [exploreCards, setExploreCards] = useState([])\r\n const [hasNextExplore, setNextExplore] = useState(false)\r\n const [hasPreviousExplore, setPreviousExplore] = useState(false)\r\n const [totalExplore, setTotalExplore] = useState(0)\r\n const [currentPage, setCurrentPage] = useState(1)\r\n\r\n\r\n const [uploadNameCard, setNameCard] = useState(\"\")\r\n const [uploadTypeCard, setTypeCard] = useState(\"art\")\r\n\r\n\r\n const [exploreSearch, setExploreSearch] = useState(\"\")\r\n const [composeMenu, setComposeMenu] = useState(false)\r\n const [cardFile, setCardFile] = useState()\r\n const [invalidFormat, setInvalidFormat] = useState(false)\r\n const [isLoading, setLoading] = useState(false)\r\n const [isSaving, setSaving] = useState(false)\r\n\r\n const { idUsuario }:any = useContext(UserContext)\r\n\r\n const startSchools = currentPage === 1 ? 1 : 10 * (currentPage - 1) + 1\r\n const endSchools = currentPage === 1 ? currentPage + 9 : 10 * (currentPage - 1) + 10\r\n\r\n const getSchoolCards = (cardName = \"\", type = \"\", page = 1) => {\r\n setLoading(true)\r\n API.Downloads.Explore({ nomeFicha: cardName, type: type, pagina: page }, getConfig())\r\n .then((response: any) => {\r\n setPreviousExplore(response.data.fichasExplorePaginado.hasPrev)\r\n setNextExplore(response.data.fichasExplorePaginado.hasNext)\r\n setTotalExplore(response.data.fichasExplorePaginado.totalFichas)\r\n setExploreCards(response.data.fichasExplorePaginado.fichaExplore)\r\n })\r\n .finally(() => setLoading(false))\r\n }\r\n\r\n const useOutsideClick = (ref: any) => {\r\n const handleClickOutside = (event: any) => {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n setComposeMenu(false)\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"mousedown\", handleClickOutside)\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside)\r\n }\r\n })\r\n }\r\n\r\n const wrapperRef = useRef(null)\r\n useOutsideClick(wrapperRef)\r\n\r\n\r\n useEffect(() => {\r\n getSchoolCards()\r\n }, [])\r\n\r\n\r\n const handleSearch = () => {\r\n setCurrentPage(1)\r\n getSchoolCards(exploreSearch)\r\n }\r\n\r\n const handleNextPage = () => {\r\n if (hasNextExplore) {\r\n getSchoolCards(exploreSearch, \"\", currentPage + 1)\r\n setCurrentPage(currentPage + 1)\r\n }\r\n }\r\n\r\n const handlePreviousPage = () => {\r\n if (hasPreviousExplore) {\r\n getSchoolCards(exploreSearch, \"\", currentPage - 1)\r\n setCurrentPage(currentPage - 1)\r\n }\r\n }\r\n\r\n const addNewCard = async () => {\r\n setSaving(true)\r\n const data = new FormData()\r\n data.append(\"type\", uploadTypeCard.toUpperCase())\r\n\r\n for (const file of cardFile) {\r\n data.append(\"ficha[]\", file)\r\n }\r\n\r\n data.append(\"idUsuario\", idUsuario)\r\n\r\n API.ExploreReport.UploadCard(data, getConfig())\r\n .then((res: any) => {\r\n setComposeMenu(false)\r\n toastr.success(\"Uploaded with success!\", \"Success\")\r\n getSchoolCards()\r\n setNameCard(\"\")\r\n })\r\n .catch((err: any) => {\r\n toastr.error(err.response.data.message, \"Error\")\r\n })\r\n .finally(() => setSaving(false))\r\n }\r\n\r\n const removeExploreSchool = (id: number) => {\r\n setCurrentPage(1)\r\n Axios.delete(`${getBaseURLWebApi()}/api/explore?exploreId=${id}&idUsuario=${idUsuario}`, {\r\n headers: {\r\n Authorization: localStorage.getItem(\"Authorization\")\r\n }\r\n })\r\n .then((res: any) => {\r\n setComposeMenu(false)\r\n toastr.success(\"Card has been removed with success!\", \"Success\")\r\n getSchoolCards()\r\n }).catch((err: any) => {\r\n toastr.error(err.response.data.message, \"Error\")\r\n })\r\n }\r\n\r\n return <>\r\n \r\n \r\n \r\n \r\n setComposeMenu(true)}\r\n size = {\"small\"}\r\n icon = {\"plus\"}\r\n />\r\n
\r\n \r\n\r\n {\r\n isLoading\r\n ? \r\n : \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n {
\r\n

handlePreviousPage()}\r\n />\r\n
\r\n Showing {startSchools} - {hasNextExplore ? endSchools : totalExplore} of {totalExplore}\r\n \r\n

handleNextPage()}\r\n />\r\n
}\r\n
\r\n \r\n\r\n {\r\n window.innerWidth > 768\r\n ? \r\n : exploreCards.map((item: any, key: any) => {\r\n return (\r\n \r\n
\r\n
\r\n Name\r\n {item.nm_estab}\r\n
\r\n
\r\n
Action\r\n
removeExploreSchool(item.exploreId)}>\r\n Remove
\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n })\r\n }\r\n \r\n \r\n \r\n }\r\n\r\n \r\n\r\n\r\n {composeMenu && }\r\n \r\n \r\n
\r\n Add new card\r\n setComposeMenu(false)}\r\n />\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n setCardFile(e.target.files)}\r\n multiple\r\n />\r\n \r\n {invalidFormat &&
Invalid file format! Please, insert a PDF file.}\r\n
\r\n \r\n
\r\n
\r\n \r\n >\r\n}\r\n\r\nexport default CardPage\r\n","import * as React from \"react\"\r\nimport {useEffect, useState} from \"react\"\r\nimport {Container, Card} from \"reactstrap\"\r\nimport qs from \"querystring\"\r\n\r\nimport * as yconnectIcon from \"YConnect/Assets/png/favicon-256x256.png\"\r\nimport API from \"YConnect/API\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\nconst RedirectPage = ({location}:any) => {\r\n\r\n const queryParams = qs.parse(location.search.substr(1))\r\n\r\n const [link, setLink] = useState()\r\n \r\n useEffect(()=>{\r\n if(queryParams && queryParams.link) setLink(queryParams.link)\r\n }, [queryParams])\r\n\r\n useEffect(()=>{\r\n if(link) redirect()\r\n }, [link])\r\n\r\n const redirect = () => {\r\n API.UrlExterna.Get({id: link}, getConfig())\r\n .then(({data}:any) =>{\r\n window.location = data\r\n })\r\n }\r\n \r\n return \r\n \r\n 
\r\n Please, wait a moment
\r\n You are being redirected.
\r\n \r\n \r\n \r\n}\r\n\r\nexport default RedirectPage\r\n\r\n\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Document, Page, pdfjs } from 'react-pdf';\r\nimport styled from \"styled-components\"\r\nimport { Row, Col } from \"reactstrap\"\r\nimport { ButtonStyle, LinkStyle } from \"YConnect/Components/Button\"\r\n\r\npdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;\r\n\r\n\r\nconst ButtonStyleNew = styled(ButtonStyle)`\r\n width: 100%\r\n place-content: center;\r\n max-width: 9rem;\r\n flex-direction: column;\r\n\r\n @media (min-width: 768px) {\r\n //width: 60%\r\n width: 25%\r\n }\r\n\r\n //font-size: 1rem !important;\r\n\r\n &.rotate{\r\n transform: rotate(180deg);\r\n }\r\n\r\n img{\r\n padding: 0px !important;\r\n }\r\n`\r\nconst CurrentPage = styled.p`\r\n // font-size: 1rem !important;\r\n text-align: -webkit-center;\r\n top: 10px;\r\n position: relative;\r\n`\r\n\r\n\r\nconst ContainerStyle = styled.div`\r\n\r\n .react-pdf__Page__canvas {\r\n margin: 0 50%;\r\n }\r\n .react-pdf__Page__svg {\r\n width: -webkit-fill-available !important;\r\n height: auto !important;\r\n overflow-x: overlay !important;\r\n }\r\n .react-pdf__Page__textContent{\r\n display:none;\r\n }\r\n\r\n .react-pdf__message,\r\n .react-pdf__message--error{\r\n font-size: 1rem;\r\n }\r\n`\r\n\r\nconst ResizedFont = styled.div`\r\n * {\r\n font-size: 1px;\r\n }\r\n\r\n g > path:nth-child(1)\r\n {\r\n fill-opacity: 1;\r\n }\r\n`\r\n\r\nconst CentralizedPDF = styled.div`\r\n * {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin: 0 auto;\r\n }\r\n`\r\n\r\nfunction PDFViwer(props: any) {\r\n const [numPages, setNumPages] = useState(null);\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const [pageDown, setPageDown] = useState(false);\r\n const [scaleController, setScaleController] = useState(1.05);\r\n const [canvasPDF, setCanvasPDF] = useState();\r\n const [convertedHeight, setConvertedHeight] = useState();\r\n const [convertedWidth, setConvertedWidth] = useState();\r\n\r\n function onDocumentLoadSuccess({ numPages }) {\r\n setNumPages(numPages);\r\n setCanvasPDF(document.getElementsByClassName('react-pdf__Page__canvas'))\r\n }\r\n\r\n useEffect(() => {\r\n setTimeout(() => {\r\n if (canvasPDF && canvasPDF.length > 0) {\r\n setConvertedHeight(parseInt(canvasPDF[0]?.style.height, 10))\r\n setConvertedWidth(parseInt(canvasPDF[0]?.style.width, 10))\r\n\r\n if (convertedWidth > 1000) {\r\n setConvertedWidth(1052)\r\n }\r\n }\r\n }, 100);\r\n }, [numPages, pageNumber])\r\n\r\n function loadResolutionPDF () {\r\n canvasPDF[0].style.height = (`${convertedHeight.toString()+'px'}`)\r\n canvasPDF[0].style.width = (`${convertedWidth.toString()+'px'}`)\r\n }\r\n\r\n useEffect(() => {\r\n if (convertedWidth > 1000) {\r\n canvasPDF[0].style.width = '1052px'\r\n }\r\n }, [convertedWidth, pageNumber])\r\n\r\n function setPage(showZoom = false) {\r\n return (\r\n numPages != null\r\n ? <>\r\n \r\n \r\n {pageNumber > 1\r\n ? {\r\n setTimeout(() => {\r\n setPageDown(true)\r\n }, 3000);\r\n setTimeout(() => {\r\n loadResolutionPDF();\r\n }, 100);\r\n setPageDown(false);\r\n setPageNumber(pageNumber - 1);\r\n }}\r\n size=\"xlarge\"\r\n className=\"rotate\" />\r\n : null\r\n }\r\n \r\n \r\n Page {pageNumber} of {numPages}\r\n \r\n \r\n {pageNumber < numPages\r\n ? {\r\n setTimeout(() => {\r\n setPageDown(true)\r\n }, 3000);\r\n setTimeout(() => {\r\n loadResolutionPDF();\r\n }, 100);\r\n setPageDown(false);\r\n setPageNumber(pageNumber + 1);\r\n }}\r\n size=\"xlarge\"\r\n />\r\n : null\r\n }\r\n \r\n
\r\n \r\n {\r\n window.innerWidth > 768 && showZoom\r\n ? <>\r\n \r\n {\r\n canvasPDF[0].style.height = (`${(convertedHeight - 50).toString()+'px'}`)\r\n canvasPDF[0].style.width = (`${(convertedWidth - 50).toString()+'px'}`)\r\n\r\n setConvertedHeight(parseInt(canvasPDF[0].style.height, 10))\r\n setConvertedWidth(parseInt(canvasPDF[0].style.width, 10))\r\n }}\r\n size=\"xlarge\"\r\n />\r\n \r\n \r\n 829 && convertedWidth > 1052}\r\n icon=\"plusGreen\"\r\n\r\n onClick={() => {\r\n canvasPDF[0].style.height = (`${(convertedHeight + 50).toString()+'px'}`)\r\n canvasPDF[0].style.width = (`${(convertedWidth + 50).toString()+'px'}`)\r\n\r\n setConvertedHeight(parseInt(canvasPDF[0].style.height, 10))\r\n setConvertedWidth(parseInt(canvasPDF[0].style.width, 10))\r\n\r\n }}\r\n size=\"xlarge\"\r\n />\r\n \r\n >\r\n : null\r\n }\r\n
\r\n >\r\n : null\r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {setPage(true)}\r\n
\r\n \r\n \r\n 768 ? scaleController : 0.5}//1.76 página de pé // 0.86 página deitada\r\n // renderMode=\"svg\"\r\n pageNumber={pageNumber}\r\n />\r\n \r\n \r\n \r\n {pageDown && screen.width > 768 ? setPage() : null}\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default PDFViwer;\r\n","const MainTheme = {\r\n/** background color */\r\nbackgroundPage : \"#f0f5f6\",\r\nbackgroundWhite : \"#fff\",\r\n\r\n/** main colors */\r\nmainPurple : \"#4e2d78\",\r\nerrorShadowColor : \"#ff1a4a59\",\r\nerrorColor : \"#FF1A4A\",\r\nsuccessShadowColor : \"#30dab7b0\",\r\nsuccessColor : \"#00A281\",\r\nerrorColor2 : \"#FF1A4A\",\r\nsuccessColor2 : \"#00A281\",\r\nlightPurple : \"#643E94\",\r\nlightPurpleInvert : \"#643E94\",\r\nlightIvory : \"#EEEEE0\",\r\nlightGray : \"#f5f5f5\",\r\nlightGreen : \"#BFD747\",\r\nlightBlue : \"#00b5d3\",\r\ndarkPurple : \"#2C134C\",\r\nborderLightGray : \"#f0f5f6\",\r\nfilterSvg : \"unset\",\r\nfilterSvgGreen : \"unset\",\r\nblockedSvg : \"invert(1)\",\r\nline : \"#c9c9c9\",\r\nboxShadow : \"rgba(0, 0, 0, 0.11)\",\r\nblocked : \"#e5e5e5\",\r\n\r\n/** text color */\r\ntextColor : \"#424242\",\r\ntextColor2 : \"#424242\",\r\ntextLightGray : \"#c5cbcc\",\r\nmutedTextColor : \"#6c757d\",\r\ngreentextColor : \"#79b100\",\r\ntitle : \"#565656\",\r\ntextWhite : \"#fff\",\r\ntextWhite2 : \"#fff\",\r\nlinkHoverColor : \"#000\",\r\ngrayScale : \"grayscale(1)\",\r\nbrightness : \"brightness(100)\",\r\ntextBlocked : \"#6a6a6a\",\r\ntextInvert : \"#fff\",\r\n\r\n\r\n/** buttons */\r\nclickable : \"#79b100\",\r\nbackgroundBtDisabled : \"#E1E6E7\",\r\ncolorBtDisabled : \"#989898\",\r\nbackgroundRadioActive : \"#F0F5F6\",\r\nbackgroundRadioActiveText : \"#79b100\",\r\ninputDisabled : \"#e9ecef\",\r\nbtnDisabledText : \"#989898\",\r\n\r\n/** Global style */\r\nfontFamily : \"Panton-Regular, arial\",\r\nbodyFontSize : \"16px\",\r\n\r\n/** Nanbar desktop */\r\npaddingLink : \"0 10px\",\r\npaddingLinkLx : \"0 23px\",\r\n\r\n/** Messages */\r\nselectedLine : \"#00B5D3\",\r\nhoverMessage : \"#f5f5f5\",\r\nfocusSelect : \"#F5F5F5\",\r\nselectText : \"#fff\",\r\n\r\n/** Tabs */\r\ntabTextActive: \"#4e2d78\",\r\n\r\n/** Tables */\r\nlineTable: \"#4e2d78\",\r\n\r\n}\r\n\r\nexport default MainTheme\r\n","import * as React from \"react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { Container } from \"reactstrap\";\r\nimport styled from \"styled-components\";\r\n\r\nimport Loader from \"YConnect/Components/Loader\";\r\n\r\nimport PDFViewer from \"YConnect/Components/PDFViewer\";\r\n\r\nimport API from \"YConnect/API\";\r\n\r\nimport GetNewHtmlReplaceImg from \"YConnect/Utils/GetNewHtmlReplaceImg.util\";\r\n\r\nimport getBaseURLWebAPI from \"YConnect/Utils/GetBaseURLWebAPI.util\";\r\n\r\nimport { Card } from \"reactstrap\";\r\nimport MainTheme from \"YConnect/Themes/Main.theme.ts\";\r\n\r\nfunction replaceAll(str: string, needle: string, replacement: string) {\r\n return str.split(needle).join(replacement);\r\n}\r\n\r\nconst ContainerStyle = styled(Container)`\r\n margin-top: 15px;\r\n\r\n @media (max-width: 768px) {\r\n margin-top: 80px !important;\r\n margin-bottom: 78px !important;\r\n p {\r\n font-size: 1.1rem;\r\n }\r\n }\r\n\r\n .card {\r\n width: 100%;\r\n\r\n .title {\r\n color: ${MainTheme.mainPurple};\r\n margin-bottom: 2rem;\r\n\r\n h1 {\r\n font-weight: bold;\r\n }\r\n }\r\n }\r\n`;\r\n\r\nconst ContentStyle = styled(Container)`\r\n /* quadro left */\r\n div {\r\n display: inline-block !important;\r\n }\r\n\r\n p,\r\n h2 {\r\n text-align: center;\r\n }\r\n\r\n img {\r\n min-width: auto !important;\r\n width: 100%;\r\n }\r\n\r\n .pressImage {\r\n object-fit: contain;\r\n max-height: 27rem;\r\n height: fit-content;\r\n margin-bottom: 3rem;\r\n }\r\n`\r\n\r\nconst PressPage = ({ match: { params } }: any) => {\r\n const [data, setData] = useState()\r\n const [date, setDate] = useState()\r\n const [response, setResponse] = useState()\r\n\r\n const fetch = () => API.Chamada.Get(params)\r\n .then(({ data }: any) => {\r\n setData(data)\r\n setResponse(true)\r\n })\r\n\r\n useEffect(() => {\r\n fetch();\r\n }, [params.id]);\r\n\r\n useEffect(() => {\r\n if (data) {\r\n const date = new Date(data.dt_exibicao);\r\n const day =\r\n date.getDate() < 9 ? `0${date.getDate()}` : date.getDate();\r\n const month =\r\n date.getMonth() + 1 < 9\r\n ? `0${date.getMonth() + 1}`\r\n : date.getMonth() + 1;\r\n setDate(`${day}/${month}/${date.getFullYear()}`);\r\n }\r\n }, [data]);\r\n\r\n if (response) {\r\n if (data) {\r\n return \r\n {/**/}\r\n \r\n {data.unit != null && data.unit.length > 0\r\n ? data.unit\r\n : null}\r\n
\r\n \r\n \r\n
{data.titulo}
\r\n {/* */}\r\n \r\n {data.img != null && data.img.length > 0 && data.img.endsWith('.pdf')\r\n ? /* */\r\n : null}\r\n \r\n {data.img != null && data.img.length > 0 && !data.img.endsWith('.pdf')\r\n ? < img className=\"pressImage\" src={replaceAll(data.img, \"img/\", `${getBaseURLWebAPI()}/img/`)} />\r\n : null\r\n }\r\n \r\n \r\n \r\n \r\n }\r\n return \r\n \r\n \r\n
No content
\r\n \r\n \r\n \r\n }\r\n return ;\r\n}\r\n\r\nexport default PressPage;\r\n","import * as React from \"react\"\r\nimport { useEffect, useRef, useState } from \"react\"\r\nimport { CSSTransition } from \"react-transition-group\"\r\nimport {Fragment} from \"react\"\r\nimport {Row, Col, Card} from \"reactstrap\"\r\n\r\n\r\nimport AlphaBlackStyle from \"YConnect/Styles/AlphaBlack.style\"\r\nimport AccessibilityStyle from \"YConnect/Styles/Accessibility.style\"\r\nimport { LinkStyle } from \"YConnect/Components/Button\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\nconst getDataFormat = (strDate:string) => {\r\n\r\n const date = new Date(strDate)\r\n const [\r\n year, month, day\r\n ] = [\r\n date.getFullYear(),\r\n date.getMonth()+1,\r\n date.getDate()\r\n ]\r\n\r\n return `${day<10?\"0\"+day:day}/${month<10?\"0\"+month:month}/${year}`\r\n}\r\n\r\nconst HistoricoDeIntegracaoModal = ({hasShow, idAluno, onClose}:any) => {\r\n\r\n const [historyList, setHistoryList] = useState()\r\n\r\n useEffect(() => {\r\n API.HistoricoReintegracao.Get({id:idAluno}, getConfig())\r\n .then(({data}:any) => setHistoryList(data))\r\n }, [])\r\n\r\n useEffect(() => {\r\n if(hasShow){\r\n API.HistoricoReintegracao.Get({id:idAluno}, getConfig())\r\n .then(({data}:any) => setHistoryList(data))\r\n }\r\n }, [hasShow])\r\n\r\n const useOutsideClick = (ref: any) => {\r\n const handleClickOutside = (event: any) => {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n onClose()\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"mousedown\", handleClickOutside)\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\r\n })\r\n }\r\n\r\n const wrapperRef = useRef(null)\r\n useOutsideClick(wrapperRef)\r\n\r\n\r\n return \r\n {hasShow && }\r\n \r\n \r\n \r\n \r\n Histórico de Integração\r\n \r\n
\r\n {\r\n historyList\r\n && historyList.map(({data_historico, responsavel, curso, motivo}:any, key:number) => \r\n \r\n \r\n \r\n {getDataFormat(data_historico)}\r\n Colaborador {responsavel} integrou o aluno no {curso}\r\n \"{motivo}\"\r\n \r\n \r\n
)\r\n }\r\n \r\n \r\n \r\n}\r\n\r\nexport default HistoricoDeIntegracaoModal","import * as React from \"react\"\r\nimport { Modal, FormGroup } from \"react-bootstrap\"\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nconst ConfirmacaoDeReintegracaoModal = ({\r\n hasShow,\r\n onConfirm,\r\n onClose\r\n}:any) => \r\n \r\n Reset Activities
\r\n \r\n \r\n Are you sure you want to reset this student's reports?\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n\r\nexport default ConfirmacaoDeReintegracaoModal\r\n","import * as React from \"react\"\r\nimport {useState, useEffect, useContext} from \"react\"\r\nimport {Container, Row, Col} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\nimport * as toastr from \"toastr\"\r\n\r\nimport API from \"YConnect/API\"\r\nimport { BreadcrumbReintegrateStudent } from \"YConnect/Components/BreadCrumbList.tsx\"\r\nimport Loader from \"YConnect/Components/Loader\"\r\nimport UserContext from \"YConnect/User.context\"\r\nimport getConfig from \"YConnect/Utils/GetRequestConfig.util\"\r\n\r\nimport SelectField from \"YConnect/Fields/Forms/Select.field\"\r\nimport TextAreaField from \"YConnect/Fields/Forms/Textarea.field\"\r\n\r\nimport {ButtonStyle} from \"YConnect/Components/Button\"\r\n\r\nimport HistoricoDeIntegracaoModal from \"YConnect/Modals/HistoricoDeIntegracao.modal\"\r\nimport ConfirmacaoDeReintegracaoModal from \"YConnect/Modals/ConfirmacaoDeReintegracao.modal\"\r\n\r\nconst NewButtonStyle = styled(ButtonStyle)`\r\n width:auto!important;\r\n`\r\n\r\nconst ReintegrateStudentPage = ({match}:any) => {\r\n\r\n const [listCourses, setListCourses] = useState()\r\n const [student, setStudent] = useState()\r\n\r\n const [idCourse, setIdCourse] = useState()\r\n const [motive, setMotive] = useState()\r\n\r\n const [hasLoading, setHasLoading] = useState(true)\r\n const [showModalHistory, setShowModalHistory] = useState(false)\r\n const [showModalConfirmacao, setShowModalConfirmacao] = useState(false)\r\n const [hasShowForm, setHasShowForm] = useState(true)\r\n\r\n const {idUsuario}:any = useContext(UserContext)\r\n\r\n const {idAluno} = match.params\r\n\r\n useEffect(() => {\r\n API.Aluno.Buscar({id:idAluno, opt:1}, getConfig())\r\n .then(({data}:any) => setStudent(data))\r\n\r\n\r\n API.Usuario.GetCursos({idAluno, opt:1}, getConfig())\r\n .then(({data}:any) => setListCourses(data))\r\n }, [])\r\n\r\n useEffect(()=>{\r\n if(student) setHasLoading(false)\r\n }, [student])\r\n\r\n\r\n const handleConfirmReintegrate = () => {\r\n\r\n setShowModalConfirmacao(false)\r\n setHasLoading(true)\r\n\r\n API.ZerarNota.Put({\r\n codigoResponsavel : idUsuario,\r\n codigoUsuario : idAluno,\r\n codigoCurso : idCourse,\r\n descricao : motive\r\n })\r\n .then(({data}:any) => {\r\n\r\n\r\n setHasShowForm(false)\r\n setTimeout(()=> setHasShowForm(true), 500)\r\n toastr.success(data)\r\n\r\n })\r\n .catch(({response:{data}}:any) => {\r\n\r\n toastr.error(data)\r\n })\r\n .finally(()=> setHasLoading(false))\r\n\r\n }\r\n\r\n const handleInputChange = (keystone:string, value:any) =>{\r\n if(keystone === \"course\")\r\n setIdCourse(value)\r\n else if(keystone === \"motive\")\r\n setMotive(value)\r\n }\r\n\r\n return \r\n \r\n {student\r\n && \r\n \r\n Reset Activities : {student.nome_aluno+\" \"+student.sobrenome_aluno}
\r\n \r\n
}\r\n {hasShowForm && \r\n \r\n \r\n ({id:id_curso, value:titulo_curso})):[]}/>\r\n\r\n \r\n
\r\n \r\n setShowModalHistory(true)}/>\r\n
\r\n \r\n window.location.href = \"#/manage-users\"}/>\r\n setShowModalConfirmacao(true)}/>\r\n
\r\n\r\n \r\n
}\r\n\r\n {hasLoading && }\r\n\r\n {\r\n setShowModalHistory(false)}/>\r\n\r\n }\r\n\r\n setShowModalConfirmacao(false)}/>\r\n \r\n}\r\n\r\nexport default ReintegrateStudentPage\r\n","import * as React from \"react\"\r\nimport { useState, useEffect } from \"react\"\r\nimport qs from \"querystring\"\r\nimport {Button} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport * as logo from \"YConnect/Assets/png/yconnect-logo-purple.png\"\r\nimport * as yazigiLogo from \"YConnect/Assets/png/logo-yazigi-purple.png\"\r\nimport * as GSE from \"YConnect/Assets/png/logo-GSE.png\"\r\n\r\n\r\nimport API from \"YConnect/API\"\r\n\r\n\r\nconst ButtonStyle = styled(Button)`\r\n\tmargin-bottom: 10px;\r\n\tbackground: #79b100;\r\n border: 2px solid #79b100;\r\n border-radius: 50px;\r\n`\r\n\r\nconst ConfirmEmailPage = ({location}: any) => {\r\n\r\n const [loading, setLoading] = useState()\r\n const [message, setMessage] = useState()\r\n\r\n useEffect(() => {\r\n const {\r\n token,\r\n idUsuario\r\n } = qs.parse(location.search.substr(1))\r\n\r\n setLoading(true)\r\n\r\n API\r\n .ConfirmarEmail\r\n .Put({idUsuario})\r\n .then(({data}:any) => setMessage(\"Endereço de e-mail confirmado com sucesso.\"))\r\n .catch((err: any) => setMessage(\"Erro ao tentar confirmar endereço de e-mail.\"))\r\n .finally(() => setLoading(false))\r\n\r\n }, [location])\r\n\r\n\r\n\r\n return \r\n \r\n \r\n
\r\n \r\n \r\n {message &&
{message}
}\r\n {loading &&
}\r\n \r\n\r\n
\r\n {message && \r\n window.location.href = \"#/login\"}>\r\n\t\t\t\t\t\t\tAcessar YConnect\r\n\t\t\t\t\t\t\r\n
}\r\n \r\n \r\n \r\n}\r\n\r\nexport default ConfirmEmailPage","import * as React from \"react\"\r\nimport {useEffect, useState, useCallback, useRef} from \"react\"\r\nimport {Row, Col} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport SelectField from \"YConnect/Fields/Forms/Select.field\"\r\n\r\ntype ExerciseCardHeaderProps = {\r\n Order : number\r\n newExerciseType ?: number\r\n newExerciseTitle ?: string\r\n newLearningObjective ?: number\r\n LearningObjectiveId ?: number\r\n listExerciseType ?: Array\r\n listLearningObjective ?: Array\r\n ExerciseType ?: ExerciseTypeType\r\n ExerciseTitle ?: string\r\n onCancel ?: any\r\n onUpdate ?: any\r\n onEditQuestion ?: any\r\n onChangeNewExerciseType ?: any\r\n onChangeNewExerciseTitle ?: any\r\n onChangeLearningObjective ?: any\r\n onRemove ?: any\r\n Removable ?: any\r\n isLearningTrack ?: boolean\r\n isNew ?: boolean\r\n onChangeEditOpen ?: any\r\n editOpen ?: number\r\n index ?: number\r\n isCreating ?: boolean\r\n}\r\n\r\nconst SelectFieldStyle = styled(SelectField)`\r\n width:200px;\r\n .form-group{\r\n margin:0px!important;\r\n }\r\n`\r\nconst StyledInput = styled.input`\r\n height: 4rem;\r\n padding: 1rem;\r\n width:90%;\r\n\r\n ::placeholder {\r\n color: #bbb;\r\n opacity: 1;\r\n }\r\n`\r\nconst ButtonRotatedIcon = styled.div`\r\n transform: rotate(180deg);\r\n`\r\n\r\nconst StyledCeterCol = styled(Col)`\r\n place-self: center;\r\n`\r\n\r\nconst ExerciseCardHeader = ({\r\n ExerciseType,\r\n ExerciseTitle,\r\n listExerciseType,\r\n listLearningObjective,\r\n newExerciseType,\r\n newExerciseTitle,\r\n newLearningObjective,\r\n LearningObjectiveId,\r\n Order,\r\n onEditQuestion,\r\n onCancel,\r\n onUpdate,\r\n onChangeNewExerciseType,\r\n onChangeNewExerciseTitle,\r\n onChangeLearningObjective,\r\n onRemove,\r\n Removable,\r\n isLearningTrack,\r\n isNew,\r\n onChangeEditOpen,\r\n editOpen,\r\n index,\r\n isCreating\r\n}:ExerciseCardHeaderProps) => {\r\n\r\n const [colapsed, setColapsed] = useState(true)\r\n const [isOpen] = useState(editOpen === index)\r\n\r\n const inputRef = useRef(null)\r\n\r\n const onColapse =() =>{\r\n setColapsed(!colapsed)\r\n\r\n if(colapsed){\r\n onChangeNewExerciseType(ExerciseType.Id)\r\n onChangeNewExerciseTitle(ExerciseTitle)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if(inputRef.current) {\r\n inputRef.current.focus()\r\n }\r\n }, [editOpen])\r\n\r\n const handleEdit = useCallback(() => {\r\n if(isOpen) {\r\n onChangeEditOpen(-1)\r\n } else {\r\n onChangeEditOpen(index)\r\n }\r\n }, [])\r\n\r\n useEffect(()=>{\r\n if(ExerciseType && isLearningTrack && onChangeNewExerciseType){\r\n onChangeNewExerciseType(ExerciseType.Id)\r\n }\r\n }, [ExerciseType])\r\n\r\n const colapseButton = \r\n\r\n const editButton = \r\n\r\n return <>\r\n \r\n \r\n \r\n
\r\n {\r\n isNew ?\r\n \r\n Exercise {Order} / {\r\n ExerciseType && {ExerciseType.Description}\r\n }
\r\n \r\n : \r\n Exercise {Order} / {\r\n ExerciseType && {ExerciseType.Description}\r\n }
\r\n \r\n }\r\n\r\n {\r\n !ExerciseType\r\n && \r\n ({id:Id, value:Description}))}\r\n onChange={(_:string, value:any) => onChangeNewExerciseType && onChangeNewExerciseType(value)}/>\r\n \r\n }\r\n {\r\n (!ExerciseType || isLearningTrack) && isNew\r\n && \r\n {onChangeNewExerciseTitle && onChangeNewExerciseTitle(e.target.value)}}\r\n />\r\n \r\n }\r\n {\r\n {ExerciseTitle}
\r\n \r\n }\r\n {\r\n Removable\r\n && \r\n \r\n \r\n
\r\n \r\n }\r\n {\r\n onCancel\r\n && \r\n \r\n \r\n }\r\n {\r\n isLearningTrack && isNew\r\n && ({id:Id, value:`${Objective} - ${Description}`}))}\r\n onChange = {(_:string, value:any) => onChangeLearningObjective && onChangeLearningObjective(value)}/>\r\n }\r\n {\r\n onEditQuestion\r\n && \r\n \r\n \r\n }\r\n\r\n\r\n { onEditQuestion &&\r\n \r\n {\r\n isOpen?\r\n editButton\r\n :\r\n \r\n {editButton}\r\n \r\n }\r\n \r\n }\r\n
\r\n {\r\n isOpen && editOpen !== -1 && isCreating !== undefined\r\n && \r\n {\r\n !isLearningTrack &&\r\n \r\n ({id:Id, value:Description}))}\r\n onChange={(_:string, value:any) => onChangeNewExerciseType && onChangeNewExerciseType(value)}/>\r\n }\r\n\r\n {\r\n isLearningTrack\r\n && ({id:Id, value:`${Objective} - ${Description}`}))}\r\n onChange = {(_:string, value:any) => onChangeLearningObjective && onChangeLearningObjective(value)}/>\r\n }\r\n \r\n {onChangeNewExerciseTitle && onChangeNewExerciseTitle(e.target.value)}}\r\n ref={inputRef}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n }\r\n >\r\n\r\n}\r\n\r\nexport default ExerciseCardHeader\r\n","import * as React from \"react\"\r\nimport {Card} from \"reactstrap\"\r\n\r\nimport ExerciseCardHeader from \"YConnect/PagesComponents/CMS/CardHeaders/Exercise.cardHeader\"\r\n\r\ntype ExerciseCardProps = {\r\n exerciseIdSelected : number\r\n listExercises : Array\r\n listExerciseType : Array\r\n onCancel : any\r\n}\r\n\r\nconst ExerciseCard = ({\r\n exerciseIdSelected, \r\n listExercises,\r\n listExerciseType,\r\n onCancel\r\n}:ExerciseCardProps)=>{\r\n\r\n const {\r\n Order, \r\n ExerciseTypeId\r\n } = listExercises.find(({Id}) => Id == exerciseIdSelected)\r\n\r\n return \r\n Id == ExerciseTypeId)) || {}} \r\n onCancel = {onCancel}/>\r\n \r\n}\r\n \r\nexport default ExerciseCard","\r\nimport styled from \"styled-components\"\r\n\r\nconst ButtonGreenStyled = styled.button`\r\n border: 2px solid #79b100;\r\n border-radius: 50px;\r\n background: #79b100;\r\n color: #fff;\r\n padding: 5px 15px 5px 15px;\r\n font-weight:bold;\r\n\r\n &:hover {\r\n background: #fff;\r\n color: #79b100;\r\n }\r\n`\r\n\r\nexport default ButtonGreenStyled","import styled from \"styled-components\"\r\n\r\nconst ButtonWhiteStyled = styled.button`\r\n border: 2px solid #79b100;\r\n border-radius: 50px;\r\n background: #fff;\r\n color: #79b100;\r\n padding: 5px 15px 5px 15px;\r\n font-weight:bold;\r\n\r\n &:hover {\r\n background: #79b100;\r\n color: #fff;\r\n }\r\n`\r\nexport default ButtonWhiteStyled","\r\nexport enum ExerciseDescription {\r\n CHOOSE_MULTIPLE = \"Choose Multiple\",\r\n CHOOSE_MULTIPLE_AUDIO = \"Choose Multiple - Audio Control\",\r\n CHOOSE_MULTIPLE_LONG_TEXT = \"Choose Multiple - Long Text\",\r\n CHOOSE_MULTIPLE_IMG = \"Choose Multiple with Image\",\r\n CHOOSE_MULTIPLE_VIDEO = \"Choose Multiple - Video Control\",\r\n CLICK_LISTEN_IMG = \"Click and Audio / Listening with images\",\r\n MATCH_TEXT = \"Match Text\",\r\n DIALOGO = \"Dialogue\",\r\n DRAG_DROP = \"Drag and Drop\",\r\n DRAG_DROP_VIDEO = \"Drag and Drop Video\",\r\n DRAG_DROP_LONG_TEXT = \"Drag and Drop - Long Text\",\r\n DRAG_DROP_AUDIO = \"Drag and Drop - Audio Control\",\r\n DRAG_DROP_IMG = \"Drag and Drop with Image\",\r\n DRAG_DROP_TEXT_IMG = \"Drag and Drop - Text and Image\",\r\n UNSCRAMBLE = \"Unscramble - List\",\r\n UNSCRAMBLE_IMG = \"Unscramble with Image\",\r\n UNSCRAMBLE_AUDIO = \"Unscramble - Audio Control\",\r\n TYPE_IN = \"Type In\",\r\n TYPE_IN_IMG = \"Type In with Image\",\r\n TYPE_IN_LONG_TEXT = \"Type In - Long Text\",\r\n TYPE_IN_AUDIO = \"Type In - Audio Control\",\r\n TYPE_IN_ORDENADO = \"Type In Ordered\",\r\n}\r\n\r\nexport default ExerciseDescription;","import * as React from \"react\"\r\nimport {Fragment} from \"react\"\r\n\r\nimport {\r\n Card,\r\n Row,\r\n Col\r\n} from \"reactstrap\"\r\n\r\n\r\nimport ButtonGreenStyled from \"YConnect/PagesComponents/CMS/Styleds/ButtonGreen.styled\"\r\nimport ButtonWhiteStyled from \"YConnect/PagesComponents/CMS/Styleds/ButtonWhite.styled\"\r\n\r\nimport ExerciseTemplate from \"YConnect/Enums/ExerciseTemplate\"\r\nimport ExerciseDescription from \"YConnect/Enums/ExerciseDescription\"\r\n\r\ntype ListButtonTypeQuestionProps = {\r\n listTemplates:Array\r\n onSelectTemplate:any\r\n templateIdSelected:number\r\n}\r\n\r\nconst ListButtonTypeQuestion = ({\r\n listTemplates,\r\n onSelectTemplate,\r\n templateIdSelected\r\n}:ListButtonTypeQuestionProps) =>\r\n\r\n {\r\n listTemplates\r\n && listTemplates\r\n .filter(({Name, Description}:any)=>\r\n Description === ExerciseDescription.CHOOSE_MULTIPLE\r\n || Description === ExerciseDescription.CHOOSE_MULTIPLE_AUDIO\r\n || Description === ExerciseDescription.CHOOSE_MULTIPLE_LONG_TEXT\r\n || Description === ExerciseDescription.TYPE_IN\r\n || Description === ExerciseDescription.TYPE_IN_IMG\r\n || Description === ExerciseDescription.TYPE_IN_LONG_TEXT\r\n || Description === ExerciseDescription.TYPE_IN_AUDIO\r\n || Description === ExerciseDescription.CHOOSE_MULTIPLE_IMG\r\n || Description === ExerciseDescription.DIALOGO\r\n || Description === ExerciseDescription.DRAG_DROP\r\n || Description === ExerciseDescription.DRAG_DROP_VIDEO\r\n || Description === ExerciseDescription.DRAG_DROP_LONG_TEXT\r\n || Description === ExerciseDescription.DRAG_DROP_AUDIO\r\n || Description === ExerciseDescription.DRAG_DROP_IMG\r\n || Description === ExerciseDescription.DRAG_DROP_TEXT_IMG\r\n || Name === ExerciseTemplate.OPEN_QUESTION\r\n || Description === ExerciseDescription.UNSCRAMBLE\r\n || Description === ExerciseDescription.UNSCRAMBLE_IMG\r\n || Description === ExerciseDescription.UNSCRAMBLE_AUDIO\r\n || Description === ExerciseDescription.CHOOSE_MULTIPLE_VIDEO\r\n || Description === ExerciseDescription.TYPE_IN_ORDENADO\r\n || Description === ExerciseDescription.MATCH_TEXT\r\n || Description === ExerciseDescription.CLICK_LISTEN_IMG)\r\n .sort((a, b) => {\r\n if (a.Description > b.Description) {\r\n return 1\r\n }\r\n if (a.Description < b.Description) {\r\n return -1\r\n }\r\n return 0\r\n })\r\n .map(({Id, Description}, key) => {\r\n const props = {\r\n key,\r\n className:\"mx-1 mb-2\",\r\n onClick:() => {\r\n onSelectTemplate(Id)\r\n },\r\n children:Description\r\n }\r\n return Id == templateIdSelected\r\n ? \r\n : \r\n })\r\n }\r\n\r\n\r\n\r\ntype QuestionChooseTypeCardProps = {\r\n listTemplates:Array\r\n templateIdSelected:number\r\n onSelectTemplate:any\r\n}\r\n\r\nconst TitleNewQuestion = () =>\r\n \r\n New Question
\r\n Choose template for following question
\r\n \r\n\r\n\r\n\r\nconst QuestionChooseTypeCard = ({\r\n listTemplates,\r\n templateIdSelected,\r\n onSelectTemplate\r\n}:QuestionChooseTypeCardProps)=>{\r\n\r\n return \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n}\r\n\r\nexport default QuestionChooseTypeCard\r\n","import styled from \"styled-components\"\r\nimport { Card } from \"reactstrap\"\r\n\r\nconst CardNewStyled = styled(Card)`\r\n border: 2px solid #00b5d3;\r\n`\r\n\r\nexport default CardNewStyled","import * as React from \"react\"\r\n\r\nimport {Row, Col} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\n\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\n\r\nimport { connect } from \"react-redux\"\r\nimport { bindActionCreators } from \"redux\"\r\n\r\nconst ButtonAdvancedStyled = styled.button`\r\n font-size:medium;\r\n border: 2px solid #79b100;\r\n background: ${props => props.actived ? \"#79b100\":\"#fff\"};\r\n color: ${props => !props.actived ? \"#79b100\":\"#fff\"};\r\n padding: 5px 5px 5px 5px;\r\n font-weight:bold;\r\n\r\n &:hover {\r\n background: #f0f5f6;\r\n color: #79b100!important;\r\n }\r\n`\r\n\r\n\r\nconst ButtonRotatedIcon = styled.div`\r\n transform: rotate(180deg);\r\n`\r\n\r\ntype QuestionCardHeaderProps = {\r\n questionOrder : number\r\n listTemplates : Array\r\n templateIdSelected : number\r\n onCancel ?: any\r\n onToggleAdvantedEditor ?: any\r\n QueryParams : any\r\n onColapse : any\r\n colapsed : boolean\r\n}\r\n\r\nconst QuestionCardHeader = ({\r\n questionOrder,\r\n listTemplates,\r\n templateIdSelected,\r\n onToggleAdvantedEditor,\r\n QueryParams,\r\n onCancel,\r\n onColapse,\r\n colapsed,\r\n}:QuestionCardHeaderProps) => {\r\n\r\n const template = (listTemplates && listTemplates.find(({Id})=> templateIdSelected == Id))||{}\r\n\r\n const colapseButton = \r\n\r\n return \r\n \r\n \r\n \r\n Question {questionOrder} / {template && {template.Description}}\r\n\r\n
\r\n \r\n {\r\n onToggleAdvantedEditor\r\n && \r\n\r\n {/*\r\n advanced editor\r\n */}\r\n \r\n }\r\n \r\n {\r\n onCancel\r\n && \r\n \r\n \r\n }\r\n\r\n {\r\n onColapse &&\r\n \r\n {colapsed?\r\n colapseButton\r\n :\r\n \r\n {colapseButton}\r\n \r\n }\r\n \r\n }\r\n
\r\n\r\n}\r\n\r\n\r\nconst mapDispatchToProps = (dispatch:any) => bindActionCreators({\r\n\r\n}, dispatch)\r\n\r\nconst mapStateToProps = ({QueryParams}:any) => ({\r\n\tQueryParams\r\n})\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(QuestionCardHeader)\r\n","import {useState, useEffect} from \"react\"\r\n\r\nconst useEditableTableState = (initialDataState:any) => {\r\n\r\n const [dataState, setDataState] = useState>(initialDataState)\r\n\r\n const updateLine = (key:number, property:any, value:any) =>{\r\n const newDataState = dataState.reduce((newState:Array, state:any, index:number) => {\r\n if(index === key){\r\n return [\r\n ...newState, \r\n {\r\n ...state, \r\n ...{ \r\n type: value !== \"\" ? \"ADDED\" : \"NEW\", \r\n row:{\r\n ...state.row, \r\n [property]:value\r\n }\r\n }\r\n }\r\n ]\r\n }else{\r\n return [...newState, state]\r\n }\r\n }, [])\r\n\r\n setDataState(newDataState)\r\n return newDataState.filter(({type}:any) => type !== \"NEW\").map(({row}:any) => row)\r\n }\r\n\r\n const addDataNewLine = () =>{\r\n setDataState([\r\n ...dataState.map((state:any) => ({...state, type:\"ADDED\"})),\r\n {\r\n type:\"NEW\",\r\n row:{}\r\n }\r\n ])\r\n }\r\n\r\n\r\n useEffect(() => {\r\n\r\n if(dataState){\r\n const data = dataState.filter(({type}:any) => type === \"NEW\")\r\n if(data){\r\n if(data.length === 0){\r\n addDataNewLine()\r\n }else if(data.length > 1){\r\n const index = dataState.indexOf(data[0])\r\n removeLine(index)\r\n }\r\n }\r\n }\r\n \r\n }, [dataState])\r\n\r\n const removeLine = (key:number) => {\r\n const newDataState = dataState.reduce((newDataState, state, index) => {\r\n if(index !== key){\r\n return [...newDataState, {...state, row:{...state.row}}]\r\n }else{\r\n return newDataState\r\n }\r\n }, [])\r\n\r\n setDataState(newDataState)\r\n return newDataState.filter(({type}:any) => type !== \"NEW\").map(({row}:any) => row)\r\n }\r\n\r\n const getValues = (newDataState:Array) =>{\r\n return (newDataState || dataState)\r\n .map(({row}:any) => row)\r\n //TODO Só vale para Answer\r\n .filter(({Awnser}:any) => Awnser && Awnser !== \"\")\r\n .map((row:any) => ({...row, IsCorret:!!row.IsCorret})) //Order:idx+1,\r\n }\r\n\r\n\r\n return {\r\n dataState,\r\n getValues,\r\n updateLine,\r\n addDataNewLine,\r\n removeLine,\r\n setDataState\r\n }\r\n}\r\n\r\nexport default useEditableTableState","import * as React from \"react\"\r\nimport {useEffect} from \"react\"\r\nimport {\r\n Row,\r\n Col\r\n} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\nimport Table from \"YConnect/Components/Table\"\r\n\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\nimport useEditableTableState from \"YConnect/PagesComponents/CMS/Hooks/useEditableTableState\"\r\n\r\nconst TableStyled = styled(Table)`\r\n .table{\r\n min-height: auto;\r\n }\r\n td, th {\r\n padding:10px;\r\n }\r\n`\r\n\r\nconst INITIAL_DATA_STATE = [\r\n {\r\n type:\"NEW\",\r\n row:{}\r\n }\r\n]\r\n\r\n\r\nconst GetStateByValues = (values:Array) => \r\n values && values.length > 0\r\n ? [...values.map((answer) => ({type:\"ADDED\", row:answer})), {type:\"NEW\",row:{}}]\r\n : INITIAL_DATA_STATE\r\n\r\n\r\ntype AnswersEditableTableProps = {\r\n values?:Array\r\n onChange:any\r\n}\r\n \r\nconst AnswersEditableTable = ({\r\n values,\r\n onChange\r\n}:AnswersEditableTableProps) => {\r\n\r\n const {\r\n dataState,\r\n getValues,\r\n updateLine,\r\n addDataNewLine,\r\n removeLine\r\n } = useEditableTableState(GetStateByValues(values))\r\n\r\n const handleUpdateRow = (key:number, property:string, value:any) => updateLine(key, property, value)\r\n const handleAddNewRow = () => addDataNewLine()\r\n const handleRemoveRow = (key:number) => removeLine(key)\r\n\r\n useEffect(()=>{\r\n if(dataState){\r\n const values = getValues()\r\n .filter(({Awnser}:any) => Awnser && Awnser !== \"\")\r\n .map((row:any) => ({...row, IsCorret:!!row.IsCorret}))\r\n onChange(values)\r\n }\r\n }, [dataState])\r\n\r\n const config : Array = [\r\n {\r\n label : \"Answer\",\r\n formatter : (state:any, key:number) => \r\n handleUpdateRow(key, \"Awnser\", value)}\r\n value={state.row[\"Awnser\"] || \"\"}/>\r\n },\r\n {\r\n label : \"Is Correct\",\r\n formatter : (state:any, key:number) => \r\n handleUpdateRow(key, \"IsCorret\", checked)} \r\n checked={!!state.row[\"IsCorret\"]}/>\r\n },\r\n {\r\n formatter : (state:any, key:any) => \r\n \r\n {\r\n state.type === \"ADDED\"\r\n && \r\n handleRemoveRow(key)}/>\r\n
\r\n }\r\n \r\n }\r\n ]\r\n\r\n return \r\n}\r\n\r\nexport default AnswersEditableTable","import * as React from \"react\"\r\nimport {useEffect} from \"react\"\r\nimport {\r\n Row,\r\n Col\r\n} from \"reactstrap\"\r\nimport styled from \"styled-components\"\r\nimport Table from \"YConnect/Components/Table\"\r\n\r\nimport { ButtonStyle } from \"YConnect/Components/Button\"\r\nimport useEditableTableState from \"YConnect/PagesComponents/CMS/Hooks/useEditableTableState\"\r\n\r\n\r\nconst TableStyled = styled(Table)`\r\n .table{\r\n min-height: auto;\r\n }\r\n td, th {\r\n padding:10px;\r\n }\r\n`\r\n\r\nconst INITIAL_DATA_STATE = [\r\n {\r\n type:\"NEW\",\r\n row:{}\r\n }\r\n]\r\n\r\nconst GetStateByValues = (values:Array) => \r\n values && values.length > 0\r\n ? [...values.map((exerciseMedia) => ({type:\"ADDED\", row:exerciseMedia})), {type:\"NEW\",row:{}}]\r\n : INITIAL_DATA_STATE\r\n\r\ntype MediasEditableTableProps = {\r\n values?:Array\r\n onChange:any\r\n}\r\n\r\nconst MediasEditableTable = ({\r\n values,\r\n onChange\r\n}:MediasEditableTableProps) => {\r\n\r\n const {\r\n dataState,\r\n getValues,\r\n updateLine,\r\n addDataNewLine,\r\n removeLine\r\n } = useEditableTableState(GetStateByValues(values))\r\n\r\n const handleUpdateRow = (key:number, property:string, value:any) => updateLine(key, property, value)\r\n const handleAddNewRow = () => addDataNewLine()\r\n const handleRemoveRow = (key:number) => removeLine(key)\r\n\r\n useEffect(()=>{\r\n if(dataState){\r\n const values = getValues()\r\n .filter(({Source}:any) => Source && Source !== \"\")\r\n .map((row:any, key:number) => ({...row, Order:key+1}))\r\n onChange(values)\r\n }\r\n }, [dataState])\r\n\r\n const config : Array = [\r\n {\r\n label : \"Source\",\r\n formatter : (state:any, key:number) => \r\n handleUpdateRow(key, \"Source\", value)}\r\n value={state.row[\"Source\"] || \"\"}/>\r\n },\r\n {\r\n label : \"Type\",\r\n formatter : (state:any, key:number) => \r\n handleUpdateRow(key, \"MediaType\", value)}\r\n value={state.row[\"MediaType\"] || \"\"}/>\r\n },\r\n {\r\n formatter : (state:any, key:any) => \r\n \r\n {\r\n state.type === \"ADDED\"\r\n && \r\n