ProjetRIOT/javascript/main-controller.js

205 lines
7.2 KiB
JavaScript
Raw Normal View History

/*
Parcoursup API (PAPI)
Comprend un set de wrapper afin d'accéder plus aisément aux informations de l'API parcoursup
*/
class PAPI {
static dataset = "fr-esr-parcoursup";
static timezone = "Europe%2FBerlin";
static searchURL = `https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=${PAPI.dataset}&timezone=${PAPI.timezone}`;
static async fetchFilieres() {
if (localStorage.getItem("filis")) return JSON.parse(localStorage.getItem("filis"));
let request = await fetch(`${PAPI.searchURL}&rows=0&sort=tri&facet=fili`);
let result = await request.json();
let response = result["facet_groups"][0]["facets"];
localStorage.setItem("filis", JSON.stringify(response));
return response;
}
static async fetchFiliere(filiere) {
if (localStorage.getItem("fili." + filiere)) return JSON.parse(localStorage.getItem("fili." + filiere));
2023-03-31 11:37:06 +02:00
let url = `${PAPI.searchURL}&rows=0&sort=tri&facet=form_lib_voe_acc&refine.fili=${filiere}`;
url = url.replace("+", "%2B");
let request = await fetch(url);
let result = await request.json();
let response = result["facet_groups"][0]["facets"];
localStorage.setItem("fili." + filiere, JSON.stringify(response));
return response;
}
static async fetchSpecialites(filiere, specialite) {
if (localStorage.getItem(`spe.${filiere}.${specialite}`)) return JSON.parse(localStorage.getItem(`spe.${filiere}.${specialite}`));
2023-03-31 11:37:06 +02:00
let url = `${PAPI.searchURL}&rows=0&sort=tri&facet=fil_lib_voe_acc&refine.form_lib_voe_acc=${specialite}&refine.fili=${filiere}`;
url = url.replace("+", "%2B");
let request = await fetch(url);
let result = await request.json();
let response = result["facet_groups"][0]["facets"];
localStorage.setItem(`spe.${filiere}.${specialite}`, JSON.stringify(response));
return response;
}
static async fetchEtablissement(filiere, sousfiliere, soussousfiliere) {
if (localStorage.getItem(`eta.${filiere}.${sousfiliere}.${soussousfiliere}`)) return JSON.parse(localStorage.getItem(`eta.${filiere}.${sousfiliere}.${soussousfiliere}`));
2023-03-31 11:37:06 +02:00
let url = `${PAPI.searchURL}&rows=10000&refine.fil_lib_voe_acc=${soussousfiliere}&refine.form_lib_voe_acc=${sousfiliere}&refine.fili=${filiere}`;
url = url.replace("+", "%2B");
let request = await fetch(url);
let result = await request.json();
let response = result["records"];
localStorage.setItem(`eta.${filiere}.${sousfiliere}.${soussousfiliere}`, JSON.stringify(response));
return response;
}
}
2023-03-28 13:42:53 +02:00
var mainController = {
css: null,
2023-03-29 22:56:14 +02:00
exports: {
2023-03-31 14:22:25 +02:00
updateCourse(course) {
this.updateList(course);
this.update({
course: course,
shouldShowInfos: course != null
});
},
updateList(course) {
course = course || this.state.course;
PAPI.fetchEtablissement(course.fili, course.sousfili, course.soussousfili).then(response => {
response.forEach(etablissement => {
// calcul la moyenne
let pct_sansmention = etablissement.fields.pct_sansmention;
let pct_AB = etablissement.fields.pct_ab;
let pct_B = etablissement.fields.pct_b;
let pct_TB = etablissement.fields.pct_tb;
let pct_TBF = etablissement.fields.pct_tbf;
// On prend la moyenne des moyennes comprises dans la mention
// Exemple : Assez bien est entre 12 et 14 donc 13.
etablissement.fields.moyenne = (pct_TBF * 19 + pct_TB * 17 + pct_B * 15 + pct_AB * 13 + pct_sansmention * 11) / 100;
});
this.update({
2023-03-31 14:22:25 +02:00
schoolListUpdating: true,
schoolList: response
});
2023-03-31 14:22:25 +02:00
this.update({
schoolListUpdating: false
});
});
},
onMounted(props, state) {
this.update({
course: null,
2023-03-31 14:22:25 +02:00
schoolList: [],
2023-03-31 17:23:49 +02:00
school: null,
popupEnabled: false,
shouldShowInfos: false
2023-03-29 22:01:50 +02:00
});
2023-03-31 17:07:25 +02:00
},
clearCache(e) {
localStorage.clear();
e.target.textContent = "Cache vidé !";
setTimeout(() => {
e.target.textContent = "Vider le cache";
}, 3000);
},
popup(school) {
this.update({
school: school,
popupEnabled: true
});
},
closePopup() {
this.update({
popupEnabled: false
});
2023-03-29 22:56:14 +02:00
}
},
2023-03-31 22:27:45 +02:00
template: (template, expressionTypes, bindingTypes, getComponent) => template('<div class="columns"><div class="column is-one-third"><div class="box p-3 m-2" style="display: flex"><img class="m-auto" src="./resources/logo-parcoursup.svg"/></div><search expr27="expr27"></search><button expr28="expr28" class="button is-danger ml-2 is-outlined">Vider le cache</button></div><div class="column pl-0"><fili-info expr29="expr29"></fili-info><school expr30="expr30"></school></div></div><school-info expr31="expr31"></school-info>', [{
2023-03-28 13:42:53 +02:00
type: bindingTypes.TAG,
getComponent: getComponent,
evaluate: _scope => 'search',
slots: [],
2023-03-29 22:56:14 +02:00
attributes: [{
type: expressionTypes.ATTRIBUTE,
2023-03-29 22:01:50 +02:00
name: 'updateCourse',
evaluate: _scope => _scope.updateCourse
2023-03-29 22:56:14 +02:00
}],
2023-03-31 22:27:45 +02:00
redundantAttribute: 'expr27',
selector: '[expr27]'
2023-03-31 17:07:25 +02:00
}, {
2023-03-31 22:27:45 +02:00
redundantAttribute: 'expr28',
selector: '[expr28]',
2023-03-31 17:07:25 +02:00
expressions: [{
type: expressionTypes.EVENT,
name: 'onclick',
evaluate: _scope => _scope.clearCache
}]
2023-03-28 13:42:53 +02:00
}, {
type: bindingTypes.TAG,
getComponent: getComponent,
evaluate: _scope => 'fili-info',
slots: [],
2023-03-30 00:54:13 +02:00
attributes: [{
type: expressionTypes.ATTRIBUTE,
name: 'schoolList',
evaluate: _scope => _scope.state.schoolList
}, {
2023-03-30 00:54:13 +02:00
type: expressionTypes.ATTRIBUTE,
name: 'course',
evaluate: _scope => _scope.state.course
}, {
type: expressionTypes.ATTRIBUTE,
name: 'shouldShowInfos',
evaluate: _scope => _scope.state.shouldShowInfos
}],
2023-03-31 22:27:45 +02:00
redundantAttribute: 'expr29',
selector: '[expr29]'
2023-03-28 13:42:53 +02:00
}, {
type: bindingTypes.TAG,
getComponent: getComponent,
evaluate: _scope => 'school',
slots: [],
2023-03-30 00:54:13 +02:00
attributes: [{
2023-03-31 17:07:25 +02:00
type: expressionTypes.ATTRIBUTE,
name: 'popup',
evaluate: _scope => _scope.popup
}, {
type: expressionTypes.ATTRIBUTE,
name: 'schoolList',
2023-03-31 14:22:25 +02:00
evaluate: _scope => _scope.state.schoolList
}, {
type: expressionTypes.ATTRIBUTE,
2023-03-31 14:22:25 +02:00
name: 'schoolListUpdating',
evaluate: _scope => _scope.state.schoolListUpdating
2023-03-30 19:28:40 +02:00
}, {
2023-03-30 00:54:13 +02:00
type: expressionTypes.ATTRIBUTE,
name: 'course',
evaluate: _scope => _scope.state.course
}, {
type: expressionTypes.ATTRIBUTE,
name: 'shouldShowInfos',
evaluate: _scope => _scope.state.shouldShowInfos
}],
2023-03-31 22:27:45 +02:00
redundantAttribute: 'expr30',
selector: '[expr30]'
2023-03-28 13:42:53 +02:00
}, {
type: bindingTypes.TAG,
getComponent: getComponent,
evaluate: _scope => 'school-info',
slots: [],
2023-03-31 17:07:25 +02:00
attributes: [{
type: expressionTypes.ATTRIBUTE,
name: 'closeWindow',
evaluate: _scope => _scope.closePopup
}, {
type: expressionTypes.ATTRIBUTE,
name: 'popupEnabled',
evaluate: _scope => _scope.state.popupEnabled
}, {
type: expressionTypes.ATTRIBUTE,
name: 'school',
evaluate: _scope => _scope.state.school
}],
2023-03-31 22:27:45 +02:00
redundantAttribute: 'expr31',
selector: '[expr31]'
2023-03-28 13:42:53 +02:00
}]),
name: 'main-controller'
};
export { mainController as default };