ScoDoc/static/mobile/static/js/main.1a008285.chunk.js.map

1 line
88 KiB
Plaintext

{"version":3,"sources":["reportWebVitals.js","ScoDoc/ScoNavBar.js","ScoDoc/Request.js","ScoDoc/SearchStudent.js","ScoDoc/Scolarite.js","ScoDoc/ChoixDept.js","ScoDoc/Login.js","ScoDoc/GestionSemestre/Accueil.js","ScoDoc/GestionSemestre/Absences/SaisieAbs.js","ScoDoc/GestionSemestre/Absences/SupprAbs.js","ScoDoc/GestionSemestre/Absences/JustAbs.js","ScoDoc/GestionSemestre/Absences.js","ScoDoc/GestionSemestre/Etudiants.js","ScoDoc/GestionSemestre/Bulletin.js","ScoDoc/GestionSemestre.js","ScoDoc/Etudiant.js","main.js","index.js"],"names":["reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ScoNavBar","props","state","logout","BASE_URL","window","$api_url","fetch","res","setState","catch","console","log","Navbar","bg","expand","Container","Brand","href","alt","src","width","height","className","Toggle","aria-controls","Collapse","id","Nav","Link","Button","variant","onClick","this","push","to","Component","get","url","method","verify","credentials","getJson","response","json","data","post","headers","body","SearchStudent","students","search_status","handleChangeSearch","bind","searchStudent","e","search","target","value","dept","location","split","length","toast","searched","Col","map","student","Row","label","type","onChange","result","Scolarite","dismissToast","semestres","getData","Accordion","defaultActiveKey","Card","Header","as","eventKey","Body","sem","index","etat","formsemestre_id","titre","modalite","semestre_id","anneescolaire","date_debut","date_fin","ChoixDept","depts","Login","login","pass","status","handleChangeLogin","handleChangePass","checkCredentials","preventDefault","btoa","getLogin","isMobile","document","cookie","placeholder","Accueil","semestre","responsables","SaisieAbs","openModal","isOpen","closeModal","onFormSubmit","formData","FormData","formDataObj","Object","fromEntries","entries","reqstr","etudid","hasOwnProperty","dateDebut","dateFin","postData","error","form","prevProps","open","Modal","show","onHide","closeButton","Title","Form","onSubmit","Group","ControlId","Label","Control","name","Check","inline","rows","Footer","SupprAbs","date","demijournee","JustAbs","Date","toISOString","substr","defaultValue","readOnly","checked","Absences","isDelOpen","isJustOpen","abs","absjust","key","setTimeout","size","style","datedmy","matin","motif","exams","ampm","Etudiants","dat","x","i","slice","filter","etud","nom_disp","prenom","Bulletin","bltn","datue","loaded","ls","elm","decision_ue","acronyme","blob","file","URL","createObjectURL","assign","Table","responsive","colSpan","Dropdown","note","Menu","Item","min","max","rang","ninscrits","ue","module","mod","replace","code","coefficient","getPdf","GestionSemestre","selectOptions","joined","concat","options","handleSelectChange","Tabs","Tab","title","Etudiant","formation","insemestre","nomprenom","photo_url","telephone","telephonemobile","email","emailperso","domicile","codepostaldomicile","villedomicile","bac","specialite","nomlycee","codepostallycee","villelycee","titreannee","Main","exact","path","component","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.1a008285.chunk.js","sourcesContent":["const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React, {Component} from \"react\";\r\nimport {Nav, Navbar, Button, Container} from 'react-bootstrap'\r\nimport { Redirect } from 'react-router-dom';\r\nimport './Style.css'\r\n\r\n/** Barre de navigation */\r\nclass ScoNavBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n logout: false\r\n };\r\n }\r\n\r\n logout() {\r\n let BASE_URL = window.$api_url\r\n\r\n fetch(BASE_URL + \"acl_users/logout\")\r\n .then(res => {this.setState({logout: true})})\r\n .catch(console.log)\r\n }\r\n\r\n render() {\r\n return (\r\n <Navbar bg=\"light\" expand=\"sm\">\r\n <Container>\r\n <Navbar.Brand href={window.$api_url + \"static/mobile/\"}>\r\n <img\r\n alt=\"ScodocLogo\"\r\n src=\"/ScoDoc/static/icons/scologo_img.png\"\r\n width=\"20\"\r\n height=\"30\"\r\n className=\"d-inline-block align-top\"\r\n />{' '}\r\n ScoDoc\r\n </Navbar.Brand>\r\n <Navbar.Toggle aria-controls=\"basic-navbar-nav\" />\r\n <Navbar.Collapse id=\"basic-navbar-nav\">\r\n <Nav className=\"ml-auto\">\r\n <Nav.Link href=\"/ScoDoc\">Version Desktop</Nav.Link>\r\n <Button variant=\"primary\" onClick={() => {this.logout()}}>Déconnexion</Button>\r\n </Nav>\r\n </Navbar.Collapse>\r\n </Container>\r\n {this.state.logout === true &&\r\n <Redirect push to=\"/\"/>\r\n }\r\n </Navbar>\r\n )\r\n }\r\n}\r\n\r\nexport default ScoNavBar","/**\r\n * Lance une requête GET a l'URL donnée en paramètre et retourne une Promise.\r\n * @param url {String} - URL de la requête\r\n * @returns {Promise<Response>}\r\n */\r\nexport function get(url) {\r\n return (\r\n fetch(url, {\r\n method: 'GET',\r\n verify: false,\r\n credentials: 'include',\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Lance une requête GET a l'URL donnée en paramètre et retourne une Promise.\r\n * Dans ce cas particulier, on ajoute un header d'authentification.\r\n * @param url {String} - URL de la requête\r\n * @param login {String} - Identifiant\r\n * @param pass {String} - Mot de passe\r\n * @returns {Promise<Response>}\r\n */\r\nexport function getLogin(url, login, pass) {\r\n return (\r\n fetch(url, {\r\n method: 'GET',\r\n verify: false,\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Authorization': 'Basic ' + btoa(login + \":\" + pass)\r\n },\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Lance une requête GET a l'URL donnée en paramètre et retourne les données JSON d'une Promise.\r\n * @param url {String} - URL de la requête\r\n * @returns {Promise<{data: any}>}\r\n */\r\nexport function getJson(url) {\r\n return get(url)\r\n .then(response => response.json()\r\n .then(data => ({data: data}))\r\n .then(res => {return res})\r\n );\r\n}\r\n\r\n/**\r\n * Lance une requête POST a l'URL donnée en paramètre et retourne une Promise.\r\n * @param url {String} - URL de la requête\r\n * @param data {String} - Données de la requête au format \"param1=val1&param2=val2...\"\r\n * @returns {Promise<Response>}\r\n */\r\nexport function post(url, data) {\r\n return (\r\n fetch(url, {\r\n method: 'POST',\r\n verify: false,\r\n credentials: 'include',\r\n headers: {'Content-Type': 'application/x-www-form-urlencoded'},\r\n body: data\r\n })\r\n )\r\n}","import React, {Component} from \"react\";\r\nimport {Link} from \"react-router-dom\";\r\nimport {Row, Col} from \"react-bootstrap\"\r\nimport {getJson} from \"./Request\";\r\n\r\n/** Module de recherche d'étudiant */\r\nclass SearchStudent extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n students: [],\r\n // Status possibles:\r\n // 0: Vide - 1: Pas de resultat - 2: Un ou plusieurs resultats\r\n search_status: 0,\r\n };\r\n this.handleChangeSearch = this.handleChangeSearch.bind(this)\r\n this.searchStudent = this.searchStudent.bind(this);\r\n }\r\n\r\n\r\n handleChangeSearch(e) {\r\n this.setState({ search: e.target.value });\r\n }\r\n\r\n /**\r\n * Lance une recherche de l'étudiant depuis l'API\r\n * @param search {String} - Texte recherché\r\n */\r\n searchStudent(search) {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/search_etud_by_name?term=' + search +'&format=json')\r\n .then(res => {\r\n this.setState({ students: res.data });\r\n if (this.state.students.length === 0) {\r\n this.setState({search_status: 1, toast: true});\r\n } else {\r\n this.setState({search_status: 2, toast: false});\r\n }\r\n })\r\n this.setState({searched: true})\r\n }\r\n\r\n /**\r\n * Presentation du résultat\r\n * @returns {JSX.Element} - Resultat au format JSX\r\n */\r\n result() {\r\n if (this.state.toast === true) {\r\n return (\r\n <div id=\"wrapDept\">\r\n Aucun étudiant trouvé\r\n </div>\r\n )\r\n } else if (this.state.search_status === 2) {\r\n return (\r\n <Col>\r\n {this.state.students.map((student) => {\r\n return (\r\n <Row id=\"wrapDept\">\r\n <Link to={`/${window.location.href.split('/')[7]}/Scolarite/Etudiant/${student.value}`}>\r\n <span>{student.label}</span>\r\n </Link>\r\n </Row>\r\n )\r\n })}\r\n </Col>\r\n )\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n <div className=\"input-group\">\r\n <input type=\"text\" id=\"search\" className=\"form-control\" onChange={this.handleChangeSearch}/>\r\n <div className=\"input-group-append\">\r\n <button type=\"button\" className=\"btn waves-effect waves-light btn-primary\" onClick={() => {this.searchStudent(this.state.search)}}>\r\n Rechercher\r\n </button>\r\n </div>\r\n </div>\r\n {this.result()}\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default SearchStudent","import React, {Component} from \"react\";\r\nimport {Link} from \"react-router-dom\";\r\nimport './Style.css'\r\nimport ScoNavBar from \"./ScoNavBar\";\r\nimport SearchStudent from './SearchStudent'\r\nimport {Accordion, Card, Button} from 'react-bootstrap'\r\nimport {getJson} from \"./Request\";\r\n\r\n/** Page de choix du semestre */\r\nclass Scolarite extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n semestres: [],\r\n students: [],\r\n toast: false\r\n };\r\n this.dismissToast = this.dismissToast.bind(this);\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère la liste des semestres depuis l'API\r\n */\r\n getData () {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/formsemestre_list?format=json')\r\n .then(res => {\r\n this.setState({ semestres: res.data });\r\n })\r\n }\r\n\r\n dismissToast = () => this.setState({toast: false})\r\n\r\n render() {\r\n return (\r\n <div>\r\n <ScoNavBar/>\r\n <section>\r\n <h1 id=\"pageTitle\">Scolarité</h1>\r\n </section>\r\n\r\n <Accordion defaultActiveKey=\"0\">\r\n <Card>\r\n <Card.Header>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"0\">\r\n Semestres en cours\r\n </Accordion.Toggle>\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"0\">\r\n <Card.Body>\r\n <div className=\"container\">\r\n <div className=\"row\">\r\n {this.state.semestres.map((sem, index) => {\r\n if (sem.etat === \"1\") {\r\n return (\r\n <div className=\"col-sm\" key={index} id=\"wrapDept\">\r\n <Link to={`/${window.location.href.split('/')[7]}/Scolarite/${sem.formsemestre_id}/GestionSem`}>\r\n <h4>{sem.titre} [{sem.modalite}]</h4>\r\n <p>Semestre {sem.semestre_id} - Année {sem.anneescolaire} [{sem.date_debut} - {sem.date_fin}]</p>\r\n </Link>\r\n </div>\r\n )\r\n }\r\n })}\r\n </div>\r\n </div>\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n <Card>\r\n <Card.Header>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"1\">\r\n Semestres passés\r\n </Accordion.Toggle>\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"1\">\r\n <Card.Body>\r\n {this.state.semestres.map((sem, index) => {\r\n if (sem.etat !== \"1\") {\r\n return (\r\n <div className=\"col-12\" key={index} id=\"wrapDept\">\r\n <Link to={`/${window.location.href.split('/')[7]}/Scolarite/${sem.formsemestre_id}/GestionSem`}>\r\n <h3>{sem.titre} [{sem.modalite}]</h3>\r\n <p>Semestre {sem.semestre_id} - Année {sem.anneescolaire} [{sem.date_debut} - {sem.date_fin}]</p>\r\n </Link>\r\n </div>\r\n )\r\n }\r\n })}\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n <Card>\r\n <Card.Header>\r\n <Accordion.Toggle as={Button} variant=\"link\" eventKey=\"2\">\r\n Recherche étudiant\r\n </Accordion.Toggle>\r\n </Card.Header>\r\n <Accordion.Collapse eventKey=\"2\">\r\n <Card.Body>\r\n <SearchStudent />\r\n </Card.Body>\r\n </Accordion.Collapse>\r\n </Card>\r\n </Accordion>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default Scolarite;","import React, {Component} from \"react\";\r\nimport {Link} from \"react-router-dom\";\r\nimport './Style.css'\r\nimport {getJson} from './Request'\r\n\r\n/** Page de choix du département */\r\nclass ChoixDept extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n // Liste des départements disponibles pour l'utilisateur\r\n depts: [],\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère la liste des départements depuis l'API\r\n */\r\n getData() {\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + 'list_depts?format=json')\r\n .then(res => {\r\n this.setState({ depts: res.data })\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n <h1 id=\"pageTitle\">Choix du département</h1>\r\n <div className=\"container\">\r\n <div className=\"row\">\r\n {this.state.depts.map((dept, index) => {\r\n return (\r\n <div className=\"col-sm\" key={index} id=\"wrapDept\">\r\n <Link to={`/${dept}/Scolarite`}>\r\n Département {dept}\r\n </Link>\r\n </div>\r\n )\r\n },)}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ChoixDept","import React, {Component} from \"react\";\r\nimport { isMobile } from 'react-device-detect';\r\nimport './Style.css'\r\nimport ChoixDept from \"./ChoixDept\";\r\nimport ScoNavBar from \"./ScoNavBar\";\r\nimport {getLogin} from \"./Request\";\r\n\r\n/** Page de Login */\r\nclass Login extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n login: \"\",\r\n pass: \"\",\r\n status: 0,\r\n };\r\n this.handleChangeLogin = this.handleChangeLogin.bind(this);\r\n this.handleChangePass = this.handleChangePass.bind(this);\r\n this.checkCredentials = this.checkCredentials.bind(this)\r\n }\r\n\r\n handleChangeLogin(e) {\r\n this.setState({ login: e.target.value });\r\n }\r\n\r\n handleChangePass(e) {\r\n this.setState({ pass: e.target.value });\r\n }\r\n\r\n /**\r\n * Verifie la validité des identifiants depuis l'API\r\n * @param e {event}\r\n */\r\n checkCredentials(e) {\r\n e.preventDefault();\r\n\r\n let login = this.state.login\r\n let pass = this.state.pass\r\n\r\n let BASE_URL = window.$api_url\r\n\r\n getLogin(BASE_URL, login, pass)\r\n .then(res => {\r\n this.setState({ status: res[\"status\"] });\r\n })\r\n .catch(console.log)\r\n }\r\n\r\n\r\n render() {\r\n return (\r\n <div>\r\n {!isMobile &&\r\n // TODO: Redirection mobile/desktop\r\n <span/>\r\n }\r\n {(this.state.status !== 0 && this.state.status !== 200) &&\r\n <div className=\"wrapper\">\r\n <div id=\"errorMsg\">\r\n <h2 id=\"loginTitle\">{\"⚠️\"} Login ou mot de passe incorrect</h2>\r\n </div>\r\n </div>\r\n }\r\n {document.cookie === \"\" &&\r\n <div className=\"wrapper\">\r\n <div id=\"formContent\">\r\n <h2 id=\"loginTitle\">Connexion a ScoDoc</h2>\r\n <form>\r\n <input type=\"text\" id=\"login\" placeholder=\"Identifiant\" onChange={this.handleChangeLogin}/>\r\n <input type=\"password\" id=\"password\" placeholder=\"Mot de passe\"\r\n onChange={this.handleChangePass}/>\r\n <button type=\"submit\" value=\"Log In\" onClick={this.checkCredentials}>Log in</button>\r\n </form>\r\n </div>\r\n </div>\r\n }\r\n <div>\r\n {document.cookie !== \"\" &&\r\n <ScoNavBar/>\r\n }{document.cookie !== \"\" &&\r\n <ChoixDept/>\r\n }\r\n </div>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Login","import React, {Component} from \"react\";\r\nimport '../Style.css'\r\nimport {getJson} from \"../Request\";\r\n\r\n/** Page d'accueil de la gestion du semestre */\r\nclass Accueil extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n semestre: {},\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère les données du semestre selectionné depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let sem = window.location.href.split('/')[9]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/formsemestre_list?format=json&formsemestre_id=' + sem)\r\n .then(res => {\r\n this.setState({ semestre: res.data[0]});\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n <h1 id=\"pageTitle\">{this.state.semestre.titre}<br/>\r\n Semestre {this.state.semestre.semestre_id} en {this.state.semestre.modalite}<br/>\r\n (Responsable: {this.state.semestre.responsables})</h1>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Accueil","import React, {Component} from \"react\";\r\nimport {Button, Col, Form, Modal} from \"react-bootstrap\";\r\nimport {post} from \"../../Request\";\r\n\r\n/** Module de saisie des absences */\r\nclass SaisieAbs extends Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n isOpen: false,\r\n form: {},\r\n error: false,\r\n etudid: \"\"\r\n }\r\n }\r\n\r\n openModal = () => this.setState({ isOpen: true });\r\n closeModal = () => this.setState({ isOpen: false });\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.open !== this.props.open) {\r\n this.setState({etudid: this.props.etudid})\r\n if (this.props.open === true) {\r\n this.setState({isOpen: true})\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gestion des données du formulaire\r\n * @param e {Event}\r\n */\r\n onFormSubmit = e => {\r\n // Traitement du formulaire\r\n // Empeche le bouton de rediriger ou actualiser la page\r\n e.preventDefault()\r\n // Recuperation des valeurs\r\n const formData = new FormData(e.target), formDataObj = Object.fromEntries(formData.entries())\r\n\r\n let reqstr = \"etudid=\" + this.state.etudid + \"&datedebut=\"\r\n\r\n if (formDataObj.hasOwnProperty('dateDebut') && formDataObj['dateDebut'] !== \"\") {\r\n let dateDebut = formDataObj['dateDebut'].split(\"-\")\r\n dateDebut = dateDebut[2] + \"/\" + dateDebut[1] + \"/\" + dateDebut[0]\r\n reqstr += dateDebut\r\n if (formDataObj.hasOwnProperty('dateFin') && formDataObj['dateFin'] !== \"\") {\r\n let dateFin = formDataObj['dateFin'].split(\"-\")\r\n dateFin = dateFin[2] + \"/\" + dateFin[1] + \"/\" + dateFin[0]\r\n reqstr += \"&datefin=\" + dateFin\r\n } else {\r\n reqstr += \"&datefin=\" + dateDebut\r\n }\r\n if (formDataObj.hasOwnProperty('duree')) {\r\n reqstr += \"&demijournee=\" + formDataObj['duree']\r\n }\r\n if (formDataObj.hasOwnProperty('estjust') && formDataObj.hasOwnProperty('motif') && formDataObj['motif'] !== \"\") {\r\n reqstr += \"&estjust=True&description=\" + formDataObj['motif']\r\n }\r\n this.postData(reqstr)\r\n } else {\r\n this.setState({error: true})\r\n }\r\n }\r\n\r\n /**\r\n * Envoie une requête POST a l'API\r\n * @param data {String} - Données à envoyer sous la forme param1=val1&param2=val2...\r\n */\r\n postData(data) {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n post(BASE_URL + dept + \"/Scolarite/Absences/doSignaleAbsence\", data)\r\n .then(response => {\r\n if (response.status === 200) {\r\n // Fermeture du modal\r\n this.closeModal()\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Modal show={this.state.isOpen} onHide={this.closeModal}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>Saisie d'absence</Modal.Title>\r\n </Modal.Header>\r\n\r\n <Modal.Body>\r\n {this.state.error &&\r\n <span>Erreur: La date de début ne doit pas être vide</span>\r\n }\r\n <Form onSubmit={this.onFormSubmit}>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"dateDebut\">\r\n <Form.Label>Date début</Form.Label>\r\n <Form.Control type=\"date\" name=\"dateDebut\"/>\r\n </Form.Group>\r\n <Form.Group as={Col} ControlId=\"dateFin\">\r\n <Form.Label>Date fin (Optionnel)</Form.Label>\r\n <Form.Control type=\"date\" name=\"dateFin\"/>\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"duree\">\r\n <Form.Check inline label=\"Journée(s)\" name=\"duree\" type=\"radio\" value=\"2\" />\r\n <Form.Check inline label=\"Matin(s)\" name=\"duree\" type=\"radio\" value=\"1\" />\r\n <Form.Check inline label=\"Après-midi\" name=\"duree\" type=\"radio\" value=\"0\" />\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"estjust\">\r\n <Form.Check label=\"Justifiée\" name=\"estjust\" type=\"checkbox\" id=\"estjust\" />\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"motif\">\r\n <Form.Label>Motif</Form.Label>\r\n <Form.Control as=\"textarea\" rows={3} name=\"motif\"/>\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Button type=\"submit\" variant=\"primary\">Sauvegarder</Button>\r\n </Form.Row>\r\n </Form>\r\n </Modal.Body>\r\n <Modal.Footer>\r\n\r\n <Button variant=\"secondary\" onClick={() => {this.closeModal()}}>Fermer</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n </>\r\n )\r\n }\r\n}\r\n\r\nexport default SaisieAbs","import React, {Component} from \"react\";\r\nimport {Button, Modal} from \"react-bootstrap\";\r\nimport {post} from \"../../Request\";\r\n\r\n/** Module de suppression des absences */\r\nclass SupprAbs extends Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n isOpen: false,\r\n etudid: \"\",\r\n }\r\n }\r\n\r\n openModal = () => this.setState({ isOpen: true });\r\n closeModal = () => this.setState({ isOpen: false });\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.open !== this.props.open) {\r\n this.setState({etudid: this.props.etudid})\r\n if (this.props.open === true) {\r\n this.setState({isOpen: true})\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Envoie une requête POST a l'API\r\n * @param data {String} - Données à envoyer sous la forme param1=val1&param2=val2...\r\n */\r\n postData() {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n let data = \"datedebut=\" + this.props.data.date + \"&datefin=\" + this.props.data.date +\r\n \"&demijournee=\" + this.props.data.demijournee + \"&etudid=\" + this.state.etudid\r\n post(BASE_URL + dept + \"/Scolarite/Absences/doAnnuleAbsence\", data)\r\n // Fermeture du modal\r\n this.setState({isOpen: false})\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Modal show={this.state.isOpen} onHide={this.closeModal}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>Suppression d'absence</Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body>\r\n <p>Etes-vous sûr.e de vouloir supprimer cette absence ?</p>\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <Button variant=\"danger\" onClick={() => {this.postData()}}>Supprimer</Button>\r\n <Button variant=\"secondary\" onClick={() => {this.closeModal()}}>Fermer</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n </>\r\n )\r\n }\r\n}\r\n\r\nexport default SupprAbs","import React, {Component} from \"react\";\r\nimport {Button, Col, Form, Modal} from \"react-bootstrap\";\r\nimport {post} from \"../../Request\";\r\n\r\n/** Module de justification des absences */\r\nclass JustAbs extends Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n isOpen: false,\r\n etudid: \"\",\r\n date: \"\"\r\n }\r\n }\r\n\r\n openModal = () => this.setState({ isOpen: true });\r\n closeModal = () => this.setState({ isOpen: false });\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.open !== this.props.open) {\r\n this.setState({etudid: this.props.etudid})\r\n if (this.props.open === true) {\r\n this.setState({isOpen: true})\r\n }\r\n // Recuperation et conversion de la date par defaut de l'absence (Format ISO demandé par les form Bootstrap)\r\n let date = this.props.data.date.split(\"/\")\r\n date = new Date(date[2] + \"-\" + date[1] + \"-\" + date[0])\r\n date = date.toISOString().substr(0,10);\r\n this.setState({date: date})\r\n }\r\n }\r\n\r\n /**\r\n * Envoie une requête POST a l'API\r\n * @param data {String} - Données à envoyer sous la forme param1=val1&param2=val2...\r\n */\r\n postData(data) {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n post(BASE_URL + dept + \"/Scolarite/Absences/doJustifAbsence\", data)\r\n // Fermeture du modal\r\n this.setState({isOpen: false})\r\n }\r\n\r\n /**\r\n * Gestion des données du formulaire\r\n * @param e {Event}\r\n */\r\n onFormSubmit = e => {\r\n // Traitement du formulaire\r\n // Empeche le bouton de rediriger ou actualiser la page\r\n e.preventDefault()\r\n // Recuperation des valeurs\r\n const formData = new FormData(e.target), formDataObj = Object.fromEntries(formData.entries())\r\n\r\n let reqstr = \"etudid=\" + this.state.etudid + \"&datedebut=\" + this.props.data.date\r\n\r\n if (formDataObj.hasOwnProperty('dateFin') && formDataObj['dateFin'] !== \"\") {\r\n let dateFin = formDataObj['dateFin'].split(\"-\")\r\n dateFin = dateFin[2] + \"/\" + dateFin[1] + \"/\" + dateFin[0]\r\n reqstr += \"&datefin=\" + dateFin\r\n } else {\r\n reqstr += \"&datefin=\" + this.props.data.date\r\n } if (formDataObj.hasOwnProperty('duree')) {\r\n reqstr += \"&demijournee=\" + formDataObj['duree']\r\n } else {\r\n reqstr += \"&demijournee=\" + this.props.data.demijournee\r\n } if (formDataObj.hasOwnProperty('motif') && formDataObj['motif'] !== \"\") {\r\n reqstr += \"&description=\" + formDataObj['motif']\r\n }\r\n this.postData(reqstr)\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n <Modal show={this.state.isOpen} onHide={this.closeModal}>\r\n <Modal.Header closeButton>\r\n <Modal.Title>Suppression d'absence</Modal.Title>\r\n </Modal.Header>\r\n <Modal.Body>\r\n <Form onSubmit={this.onFormSubmit}>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"dateDebut\">\r\n <Form.Label>Date début</Form.Label>\r\n <Form.Control type=\"date\" name=\"dateDebut\" defaultValue={this.state.date} readOnly/>\r\n </Form.Group>\r\n <Form.Group as={Col} ControlId=\"dateFin\">\r\n <Form.Label>Date fin (Optionnel)</Form.Label>\r\n <Form.Control type=\"date\" name=\"dateFin\" defaultValue={this.state.date}/>\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"duree\">\r\n <Form.Check inline label=\"Journée\" name=\"duree\" type=\"radio\" value=\"2\"/>\r\n <Form.Check inline label=\"Demie-journée\" name=\"duree\" type=\"radio\" defaultValue={this.props.data.demijournee} checked/>\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Form.Group as={Col} ControlId=\"motif\">\r\n <Form.Label>Motif</Form.Label>\r\n <Form.Control as=\"textarea\" rows={3} name=\"motif\"/>\r\n </Form.Group>\r\n </Form.Row>\r\n <Form.Row>\r\n <Button type=\"submit\" variant=\"primary\">Sauvegarder</Button>\r\n </Form.Row>\r\n </Form>\r\n </Modal.Body>\r\n <Modal.Footer>\r\n <Button variant=\"secondary\" onClick={() => {this.closeModal()}}>Fermer</Button>\r\n </Modal.Footer>\r\n </Modal>\r\n </>\r\n )\r\n }\r\n}\r\n\r\nexport default JustAbs","import React, {Component} from \"react\";\r\nimport {Button, Col} from 'react-bootstrap'\r\nimport '../Style.css'\r\nimport SaisieAbs from \"./Absences/SaisieAbs\";\r\nimport SupprAbs from \"./Absences/SupprAbs\";\r\nimport JustAbs from \"./Absences/JustAbs\";\r\nimport {getJson} from \"../Request\";\r\n\r\n/** Page de gestion des absences */\r\nclass Absences extends Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n // Gestion des fenetres modales\r\n // Ajout d'absences\r\n isOpen: false,\r\n // Suppression\r\n isDelOpen: false,\r\n // Justification\r\n isJustOpen: false,\r\n // Données de la liste des absences\r\n abs: [],\r\n absjust: [],\r\n // Données d'une absence selectionnée\r\n data: {}\r\n }\r\n }\r\n\r\n // Recuperation des données en cas de changement de props (dans notre cas, changement d'étudiant.e)\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.id !== this.props.id) {\r\n this.getData();\r\n }\r\n }\r\n\r\n // Recuperation des données lors du chargement de la page si un étudiant est selectionné\r\n componentDidMount() {\r\n if (this.props.id !== \"\") {this.getData()}\r\n }\r\n\r\n /**\r\n * Gère l'ouverture des Modal\r\n * @param key {String} - Correspond au type de modal [isOpen, isDelOpen, isJustOpen]\r\n * @param data {Object} - Objet contenant les données à transmettre\r\n */\r\n openModal(key, data) {\r\n this.setState({[key]: true}, () => setTimeout(() => {\r\n this.setState({[key]: false})\r\n }, 500))\r\n if (data) {this.setState({data: data})}\r\n }\r\n\r\n /**\r\n * Recupère les données d'absences depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let BASE_URL = window.$api_url\r\n if (this.state.id !== \"\") {\r\n // Recuperation des absences non-justifiées\r\n getJson(BASE_URL + dept + \"/Scolarite/Absences/ListeAbsEtud?format=json&absjust_only=0&etudid=\" + this.props.id)\r\n .then(res => this.setState({abs: res.data}));\r\n // Recuperation des absences justifiées\r\n getJson(BASE_URL + dept + \"/Scolarite/Absences/ListeAbsEtud?format=json&absjust_only=1&etudid=\" + this.props.id)\r\n .then(res => this.setState({absjust: res.data}));\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n {this.props.id !== \"\" &&\r\n // Gestion du modal de saisie\r\n <SaisieAbs open={this.state.isOpen} etudid={this.props.id}/>\r\n } {this.props.id !== \"\" &&\r\n // Gestion du modal de suppression\r\n <SupprAbs open={this.state.isDelOpen} etudid={this.props.id} data={this.state.data}/>\r\n } {this.props.id !== \"\" &&\r\n // Gestion du modal de justification\r\n <JustAbs open={this.state.isJustOpen} etudid={this.props.id} data={this.state.data}/>\r\n }\r\n <h1 id=\"pageTitle\">Gestion des absences</h1>\r\n {this.props.name !== \"\" &&\r\n <div className=\"col-sm\" id=\"wrapDept\">\r\n <h4>Absences de {this.props.name + \" \"}\r\n <Button variant=\"primary\" size=\"sm\" style={{\"margin-right\": \"2px\"}}\r\n onClick={() => this.openModal('isOpen', null)}>\r\n <span>+</span>\r\n </Button>\r\n <Button variant=\"secondary\" size=\"sm\" style={{\"margin-left\": \"2px\"}}\r\n onClick={() => this.getData()}>\r\n <span>🗘</span>\r\n </Button>\r\n </h4>\r\n {(this.state.abs.length === 0 && this.state.absjust.length === 0 && this.props.name !== \"\") &&\r\n <h6>Aucune absence de l'étudiant.e</h6>\r\n }\r\n {this.state.abs.map((abs) => {\r\n return (\r\n <div className=\"col-sm\" id=\"wrapDept\">\r\n <Col>\r\n <h5>{abs.datedmy} | {abs.matin}</h5>\r\n {abs.motif !== \"\" &&\r\n <span>Motif: {abs.motif}</span>\r\n } {abs.exams !== \"\" &&\r\n <span>Exam a rattraper: {abs.exams}</span>\r\n }\r\n </Col>\r\n <Col>\r\n {abs.motif === \"\" &&\r\n <Button variant=\"primary\" size=\"sm\" style={{\"margin-right\": \"2px\"}}\r\n onClick={() => this.openModal('isJustOpen', {\r\n date: abs.datedmy,\r\n demijournee: abs.ampm\r\n })}>\r\n Justifier\r\n </Button>\r\n }\r\n <Button variant=\"danger\" size=\"sm\" style={{\"margin-left\": \"2px\"}}\r\n onClick={() => this.openModal('isDelOpen', {\r\n date: abs.datedmy,\r\n demijournee: abs.ampm\r\n })}>\r\n Supprimer\r\n </Button>\r\n </Col>\r\n </div>\r\n )\r\n })}\r\n {this.state.absjust.map((abs) => {\r\n return (\r\n <div className=\"col-sm\" id=\"wrapDept\">\r\n <Col>\r\n <h5>{abs.datedmy} | {abs.matin}</h5>\r\n {abs.motif !== \"\" &&\r\n <span>Motif: {abs.motif}</span>\r\n } {abs.exams !== \"\" &&\r\n <span>Exam a rattraper: {abs.exams}</span>\r\n }\r\n </Col>\r\n <Col>\r\n <Button variant=\"danger\" size=\"sm\" style={{\"margin-left\": \"2px\"}}\r\n onClick={() => this.openModal('isDelOpen', {\r\n date: abs.datedmy,\r\n demijournee: abs.ampm\r\n })}>\r\n Supprimer\r\n </Button>\r\n </Col>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n }\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Absences","import React, {Component} from \"react\";\r\nimport {LazyLoadImage} from 'react-lazy-load-image-component';\r\nimport '../Style.css'\r\nimport {Link} from \"react-router-dom\";\r\nimport {getJson} from \"../Request\";\r\n\r\n/** Page de présentation des étudiants inscrits au semestre */\r\nclass Etudiants extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n // Liste des étudiants inscrits au semestre\r\n students: [],\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère la liste des étudiants inscrits au semestre depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let sem = window.location.href.split('/')[9]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/groups_view?with_codes=1&format=json&formsemestre_id=' + sem)\r\n .then(res => {\r\n // Gestion des données sous forme de tableau a deux colonnes\r\n const dat = res.data.map((x,i) => {\r\n return i % 2 === 0 ? res.data.slice(i, i+2) : null;\r\n }).filter(x => x != null);\r\n this.setState({ students: dat});\r\n })\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n <h1 id=\"pageTitle\">Liste des étudiants</h1>\r\n <div className=\"container\">\r\n {this.state.students.map((students) => {\r\n // Creation du tableau de deux colonnes\r\n return (\r\n <div className=\"row justify-content-center\">\r\n {students.map((etud, index) => {\r\n return (\r\n <div className=\"col\" key={index} id=\"wrapDept\">\r\n <Link to={`/${window.location.href.split('/')[7]}/Scolarite/Etudiant/${etud.etudid}`}>\r\n {/* Recuperation de la photo de l'etudiant */}\r\n <LazyLoadImage\r\n alt={`${etud.nom_disp} ${etud.prenom}`}\r\n src={`/ScoDoc/${window.location.href.split('/')[7]}/Scolarite/Notes/get_photo_image?etudid=${etud.etudid}`}\r\n width=\"102\"\r\n height=\"128\"\r\n className=\"d-inline-block align-top\"\r\n />{' '}<br/>\r\n {etud.nom_disp} {etud.prenom}\r\n </Link>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Etudiants","import React, {Component} from \"react\";\r\nimport {Table, Button, Dropdown} from \"react-bootstrap\"\r\nimport '../Style.css'\r\nimport {get, getJson} from \"../Request\";\r\n\r\n/** Page de présentation des bulletins étudiants */\r\nclass Bulletin extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n bltn: {},\r\n datue: {},\r\n loaded: false\r\n };\r\n this.getData = this.getData.bind(this);\r\n }\r\n\r\n /**\r\n * Recupère les données de bulletin depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let sem = window.location.href.split('/')[9]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/formsemestre_bulletinetud?formsemestre_id=' + sem +'&etudid=' +\r\n this.props.id +'&format=json')\r\n .then(res => {\r\n // Recuperation des données du bulletin\r\n this.setState({ bltn: res.data }, () => {\r\n // Recuperation d'un tableau CodeUE | NomUE\r\n let ls = {}\r\n for (let elm in this.state.bltn.decision_ue) {\r\n elm = this.state.bltn.decision_ue[elm]\r\n ls[elm.acronyme] = elm.titre\r\n }\r\n this.setState({datue: ls}, () => {\r\n // Marquage du bulletin comme \"chargé\"\r\n this.setState({loaded: true})\r\n })\r\n })\r\n })\r\n }\r\n\r\n /**\r\n * Recupère les données de bulletin en tant que \"blob\" pour un PDF depuis l'API\r\n */\r\n getPdf() {\r\n let BASE_URL = window.$api_url\r\n let dept = window.location.href.split('/')[6]\r\n let sem = window.location.href.split('/')[8]\r\n get(BASE_URL + dept + \"/Scolarite/Notes/formsemestre_bulletinetud?formsemestre_id=\" + sem +\r\n \"&etudid=\" + this.props.id + \"&format=pdf&version=selectedevals\")\r\n .then(res => res.blob())\r\n .then(blob => {\r\n let file = window.URL.createObjectURL(blob);\r\n window.location.assign(file);\r\n });\r\n }\r\n\r\n // Recuperation des données en cas de changement de props (dans notre cas, changement d'étudiant.e)\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.id !== this.props.id) {\r\n this.getData();\r\n }\r\n }\r\n\r\n // Recuperation des données lors du chargement de la page si un étudiant est selectionné\r\n componentDidMount() {\r\n if (this.props.id !== \"\") {this.getData()}\r\n }\r\n\r\n render() {\r\n return (\r\n <div className=\"wrapper\">\r\n <div style={{\"margin-bottom\": \"20px\"}}>\r\n <h1 id=\"pageTitle\">Bulletins de notes</h1>\r\n </div>\r\n {this.state.loaded === true &&\r\n <div>\r\n <Table responsive=\"sm\">\r\n <thead>\r\n <tr>\r\n <th colSpan=\"3\"/>\r\n <th>Note/20</th>\r\n </tr>\r\n <tr className=\"bigRow\">\r\n <th colSpan=\"3\">Moyenne générale</th>\r\n <th>\r\n <Dropdown>\r\n <Dropdown.Toggle variant=\"primary\" size=\"sm\" id=\"dropdown-basic\">\r\n {this.state.bltn.note.value}\r\n </Dropdown.Toggle>\r\n\r\n <Dropdown.Menu>\r\n <Dropdown.Item href=\"#\">Min: {this.state.bltn.note.min}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Max: {this.state.bltn.note.max}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Classement: {this.state.bltn.rang.value}/{this.state.bltn.rang.ninscrits}</Dropdown.Item>\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </th>\r\n </tr>\r\n </thead>\r\n {this.state.bltn.ue.map((ue) => {\r\n return (\r\n <tbody>\r\n <tr className=\"ueRow\">\r\n <td colSpan=\"3\">{ue.acronyme} - {this.state.datue[ue.acronyme]}</td>\r\n <td>\r\n <Dropdown>\r\n <Dropdown.Toggle variant=\"primary\" size=\"sm\" id={ue.acronyme}>\r\n {ue.note.value}\r\n </Dropdown.Toggle>\r\n\r\n <Dropdown.Menu>\r\n <Dropdown.Item href=\"#\">Min: {ue.note.min}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Max: {ue.note.max}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Classement: {ue.rang}/{this.state.bltn.rang.ninscrits}</Dropdown.Item>\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </td>\r\n </tr>\r\n {ue.module.map((mod) => {\r\n return (\r\n <tr>\r\n <td colSpan=\"3\">{mod.titre.replace(\"&apos;\", \"'\")}</td>\r\n <td>\r\n <Dropdown>\r\n <Dropdown.Toggle variant=\"primary\" size=\"sm\" id={mod.code}>\r\n {mod.note.value}\r\n </Dropdown.Toggle>\r\n\r\n <Dropdown.Menu>\r\n <Dropdown.Item href=\"#\">Min: {mod.note.min}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Max: {mod.note.max}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Classement: {mod.rang.value}/{this.state.bltn.rang.ninscrits}</Dropdown.Item>\r\n <Dropdown.Item href=\"#\">Coefficient: {mod.coefficient}</Dropdown.Item>\r\n </Dropdown.Menu>\r\n </Dropdown>\r\n </td>\r\n </tr>\r\n )\r\n })}\r\n </tbody>\r\n )\r\n })}\r\n </Table>\r\n <div>\r\n <Button className=\"btn-primary\" onClick={() => {this.getPdf()}}>Version PDF</Button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Bulletin","import React, {Component} from \"react\";\r\nimport {Tabs, Tab} from \"react-bootstrap\"\r\nimport Accueil from \"./GestionSemestre/Accueil\";\r\nimport Absences from \"./GestionSemestre/Absences\";\r\nimport Etudiants from \"./GestionSemestre/Etudiants\";\r\nimport ScoNavBar from \"./ScoNavBar\";\r\nimport Bulletin from \"./GestionSemestre/Bulletin\";\r\nimport Select from \"react-select\";\r\nimport {getJson} from \"./Request\";\r\n\r\n/** Page de gestion du semestre */\r\nclass GestionSemestre extends Component {\r\n constructor(props){\r\n super(props)\r\n this.state = {\r\n selectOptions: [],\r\n id: \"\",\r\n name: '',\r\n }\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère la liste des étudiants inscrits au semestre pour le Select depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let sem = window.location.href.split('/')[9]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/groups_view?with_codes=1&format=json&formsemestre_id=' + sem)\r\n .then(res => {\r\n // Création d'une liste pour le select\r\n res.data.map((student) => {\r\n let joined = this.state.selectOptions.concat({label: student.nom_disp + \" \" + student.prenom, value: student.etudid});\r\n this.setState({selectOptions: joined})\r\n })\r\n })\r\n }\r\n\r\n handleSelectChange(e){\r\n this.setState({id:e.value, name:e.label})\r\n }\r\n\r\n render() {\r\n return (\r\n <div>\r\n <ScoNavBar/>\r\n <div className=\"container\">\r\n <div className=\"row justify-content-center\">\r\n {/* Selection de l'étudiant pour les sous-composants */}\r\n <div className=\"col-sm\" id=\"wrapDept\">\r\n Choix de l'étudiant\r\n <Select className=\"mySelect\" options={this.state.selectOptions} onChange={this.handleSelectChange.bind(this)}/>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <Tabs defaultActiveKey=\"Accueil\" id=\"controlled-tab-example\">\r\n <Tab eventKey=\"Accueil\" title=\"Accueil\" >\r\n <Accueil />\r\n </Tab>\r\n <Tab eventKey=\"Absences\" title=\"Absences\">\r\n <Absences id={this.state.id} name={this.state.name}/>\r\n </Tab>\r\n <Tab eventKey=\"Bulletin\" title=\"Bulletins\">\r\n <Bulletin id={this.state.id} name={this.state.name}/>\r\n </Tab>\r\n <Tab eventKey=\"Etud\" title=\"Etudiants\">\r\n <Etudiants />\r\n </Tab>\r\n </Tabs>\r\n </div>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default GestionSemestre","import React, {Component} from \"react\";\r\nimport './Style.css'\r\nimport ScoNavBar from \"./ScoNavBar\";\r\nimport {getJson} from \"./Request\";\r\n\r\n/** Page d'information d'un étudiant' */\r\nclass Etudiant extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n // Données de l'étudiant\r\n etud: {},\r\n // Formation actuelle de l'étudiant\r\n formation: [],\r\n // Semestres correspondant a la formation de l'étudiant\r\n semestres: [],\r\n loaded: false\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.getData()\r\n }\r\n\r\n /**\r\n * Recupère les données de l'étudiant depuis l'API\r\n */\r\n getData() {\r\n let dept = window.location.href.split('/')[7]\r\n let etudid = window.location.href.split('/')[10]\r\n let BASE_URL = window.$api_url\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/etud_info?format=json&etudid=' + etudid)\r\n .then(res => {\r\n this.setState({ etud: res.data, formation: res.data.insemestre })\r\n // Recuperation des données de semestres pour la formation d'un étudiant\r\n res.data.insemestre.map((sem) => {\r\n getJson(BASE_URL + dept + '/Scolarite/Notes/formsemestre_list?format=json&formsemestre_id=' + sem.formsemestre_id)\r\n .then(res => {\r\n let joined = this.state.semestres.concat(res.data[0]);\r\n this.setState({ semestres: joined, loaded: true })\r\n })\r\n })\r\n })\r\n }\r\n\r\n render() {\r\n return(\r\n <div>\r\n <ScoNavBar/>\r\n <div className=\"wrapper\">\r\n <div id=\"wrapDept\">\r\n <h1>{this.state.etud.nomprenom}</h1>\r\n <img\r\n alt={`${this.state.etud.nomprenom}`}\r\n src={`/ScoDoc/${window.location.href.split('/')[7]}/Scolarite/Notes/${this.state.etud.photo_url}`}\r\n width=\"102\"\r\n height=\"128\"\r\n className=\"d-inline-block align-top\"\r\n />{' '}\r\n <div id=\"wrapDept\" className=\"col-sm\">\r\n <h3>Informations personnelles</h3>\r\n {this.state.etud.telephone !== \"\" || this.state.etud.telephonemobile !== \"\" ||\r\n this.state.etud.email !== \"\" || this.state.etud.emailperso !== \"\" ?\r\n <div className=\"col-sm\">\r\n <h4>Contact</h4>\r\n {this.state.etud.telephone !== \"\" && <a href={'tel:' + this.state.etud.telephone}>Téléphone: {this.state.etud.telephone}</a>}<br/>\r\n {this.state.etud.telephonemobile !== \"\" && <a href={'tel:' + this.state.etud.telephonemobile}>Mobile: {this.state.etud.telephonemobile}</a>}<br/>\r\n {this.state.etud.email !== \"\" && <a href={'mailto:' + this.state.etud.email}>Mail étudiant: {this.state.etud.email}</a>}<br/>\r\n {this.state.etud.emailperso !== \"\" && <a href={'mailto:' + this.state.etud.emailperso}>Mail personnel: {this.state.etud.emailperso}</a>}<br/>\r\n </div>\r\n :\r\n <div className=\"col-sm\">Aucun contact disponible</div>\r\n }\r\n\r\n {this.state.etud.domicile !== \"\" || this.state.etud.codepostaldomicile !== \"\" ||\r\n this.state.etud.villedomicile !== \"\" ?\r\n <div className=\"col-sm\">\r\n <h4>Lieu de résidence</h4>\r\n Domicile: {this.state.etud.domicile} -\r\n {\" \" + this.state.etud.codepostaldomicile} {this.state.etud.villedomicile}<br/>\r\n </div>\r\n :\r\n <div className=\"col-sm\">Aucune information de résidence disponible</div>\r\n }\r\n </div>\r\n\r\n <div id=\"wrapDept\" className=\"col-sm\">\r\n {this.state.etud.bac !== \"\" || this.state.etud.specialite !== \"\" ?\r\n <div className=\"col-sm\">\r\n <h4>Parcours</h4>\r\n Bac {this.state.etud.bac} {this.state.etud.specialite}\r\n {this.state.etud.nomlycee !== \"\" || this.state.etud.codepostallycee !== \"\" ||\r\n this.state.etud.villelycee !== \"\" ?\r\n <div>\r\n {\" \" + this.state.etud.nomlycee} ({this.state.etud.codepostallycee} {this.state.etud.villelycee})<br/>\r\n </div>\r\n : null}\r\n </div>\r\n : null}\r\n\r\n {this.state.loaded === true &&\r\n <div className=\"col-sm\">\r\n <h4>Formation actuelle</h4>\r\n {this.state.semestres.map((sem) => {\r\n return (\r\n <div>\r\n <b>{sem.titreannee}</b><br/>\r\n {sem.date_debut} - {sem.date_fin}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nexport default Etudiant","import React from 'react';\r\nimport {HashRouter, Route} from 'react-router-dom';\r\nimport Scolarite from './ScoDoc/Scolarite.js'\r\nimport Login from './ScoDoc/Login'\r\nimport GestionSemestre from \"./ScoDoc/GestionSemestre\";\r\nimport Etudiant from \"./ScoDoc/Etudiant\";\r\n\r\n\r\nconst Main = () => {\r\n return (\r\n /*<HashRouter>\r\n <Route exact path='/ScoDoc/static/mobile' component={Login}/>\r\n <Route exact path='/ScoDoc/static/mobile/:DEPT/Scolarite' component={Scolarite}/>\r\n <Route exact path='/ScoDoc/static/mobile/:DEPT/Scolarite/Etudiant/:EtudId' component={Etudiant}/>\r\n <Route exact path='/ScoDoc/static/mobile/:DEPT/Scolarite/:SEM/GestionSem' component={GestionSemestre}/>\r\n </HashRouter>*/\r\n <HashRouter>\r\n <Route exact path='/' component={Login}/>\r\n <Route exact path='/:DEPT/Scolarite' component={Scolarite}/>\r\n <Route exact path='/:DEPT/Scolarite/Etudiant/:EtudId' component={Etudiant}/>\r\n <Route exact path='/:DEPT/Scolarite/:SEM/GestionSem' component={GestionSemestre}/>\r\n </HashRouter>\r\n );\r\n}\r\n\r\nexport default Main;","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport {BrowserRouter} from \"react-router-dom\";\nimport reportWebVitals from './reportWebVitals';\nimport Main from \"./main\";\nimport 'bootstrap/dist/css/bootstrap.min.css'\n\nwindow.$api_url = '/ScoDoc/' // Global variable\n\nReactDOM.render(\n <BrowserRouter>\n <Main />\n </BrowserRouter>,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}