revert - bug
This commit is contained in:
+125
-15
@@ -1,21 +1,131 @@
|
|||||||
export function buildURL(query) {
|
// Échapper les apostrophes dans les valeurs injectées dans la clause where
|
||||||
let url =
|
function echapperValeur(valeur) {
|
||||||
"https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/fr-esr-parcoursup/records?limit=10"
|
return String(valeur).replace(/'/g, "\\'");
|
||||||
|
|
||||||
if (query && query.trim() !== "") {
|
|
||||||
url += "&where=search(lib_for_voe_ins, '" + query + "')"
|
|
||||||
}
|
|
||||||
|
|
||||||
return url
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchFormations(query) {
|
// Construire l'URL de requête vers l'API Parcoursup
|
||||||
const url = buildURL(query)
|
export function construireURL(requete, limite = 20, decalage = 0, filtres = {}) {
|
||||||
const response = await fetch(url)
|
|
||||||
|
|
||||||
if (!response.ok) {
|
var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/fr-esr-parcoursup/records?";
|
||||||
throw new Error("Erreur HTTP")
|
|
||||||
|
url += "limit=" + limite;
|
||||||
|
url += "&offset=" + decalage;
|
||||||
|
|
||||||
|
var conditions = [];
|
||||||
|
|
||||||
|
if (requete && requete.trim() !== "") {
|
||||||
|
conditions.push("search(lib_for_voe_ins, '" + echapperValeur(requete.trim()) + "')");
|
||||||
}
|
}
|
||||||
|
|
||||||
return await response.json()
|
if (filtres.filiere && filtres.filiere !== "") {
|
||||||
|
conditions.push("fili='" + echapperValeur(filtres.filiere) + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filtres.selectivite && filtres.selectivite !== "") {
|
||||||
|
conditions.push("select_form='" + echapperValeur(filtres.selectivite) + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filtres.region && filtres.region !== "") {
|
||||||
|
conditions.push("region_etab_aff='" + echapperValeur(filtres.region) + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filtres.tauxMin && filtres.tauxMin > 0) {
|
||||||
|
conditions.push("taux_acces_ens>=" + filtres.tauxMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filtres.tauxMax && filtres.tauxMax < 100) {
|
||||||
|
conditions.push("taux_acces_ens<=" + filtres.tauxMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conditions.length > 0) {
|
||||||
|
url += "&where=" + encodeURIComponent(conditions.join(" AND "));
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Charger les formations depuis l'API Parcoursup
|
||||||
|
export async function chargerFormations(requete, limite = 20, decalage = 0, filtres = {}) {
|
||||||
|
|
||||||
|
var url = construireURL(requete, limite, decalage, filtres);
|
||||||
|
var reponse = await fetch(url);
|
||||||
|
|
||||||
|
if (!reponse.ok) {
|
||||||
|
throw new Error("Erreur HTTP " + reponse.status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return await reponse.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Charger l'historique d'une formation sur plusieurs années
|
||||||
|
export async function chargerHistoriqueFormation(codUai, nomFormation) {
|
||||||
|
|
||||||
|
var jeuDeDonnees = {
|
||||||
|
2020: "fr-esr-parcoursup_2020",
|
||||||
|
2021: "fr-esr-parcoursup_2021",
|
||||||
|
2022: "fr-esr-parcoursup_2022",
|
||||||
|
2023: "fr-esr-parcoursup_2023",
|
||||||
|
2024: "fr-esr-parcoursup_2024",
|
||||||
|
2025: "fr-esr-parcoursup"
|
||||||
|
};
|
||||||
|
|
||||||
|
var historique = [];
|
||||||
|
var nomCourt = echapperValeur((nomFormation || "").substring(0, 40));
|
||||||
|
var codeUai = echapperValeur(codUai);
|
||||||
|
var annees = [2020, 2021, 2022, 2023, 2024, 2025];
|
||||||
|
|
||||||
|
for (var i = 0; i < annees.length; i++) {
|
||||||
|
|
||||||
|
var annee = annees[i];
|
||||||
|
var dataset = jeuDeDonnees[annee];
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
var where =
|
||||||
|
"cod_uai='" + codeUai + "' AND search(lib_for_voe_ins, '" + nomCourt + "')";
|
||||||
|
|
||||||
|
var url = "https://data.enseignementsup-recherche.gouv.fr/api/explore/v2.1/catalog/datasets/"
|
||||||
|
+ dataset + "/records?"
|
||||||
|
+ "limit=5"
|
||||||
|
+ "&where=" + encodeURIComponent(where)
|
||||||
|
+ "&select=" + encodeURIComponent("cod_uai,lib_for_voe_ins,voe_tot,acc_tot,pct_sansmention,pct_ab,pct_b,pct_tb,pct_tbf,pct_bg,pct_bt,pct_bp");
|
||||||
|
|
||||||
|
var reponse = await fetch(url);
|
||||||
|
|
||||||
|
if (reponse.ok) {
|
||||||
|
|
||||||
|
var donnees = await reponse.json();
|
||||||
|
|
||||||
|
if (donnees.results && donnees.results.length > 0) {
|
||||||
|
|
||||||
|
var ligne = donnees.results[0];
|
||||||
|
var taux = 0;
|
||||||
|
|
||||||
|
if (ligne.voe_tot && ligne.voe_tot > 0) {
|
||||||
|
taux = Math.round((ligne.acc_tot / ligne.voe_tot) * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
historique.push({
|
||||||
|
annee: annee,
|
||||||
|
tauxAcces: taux,
|
||||||
|
candidats: ligne.voe_tot || 0,
|
||||||
|
admis: ligne.acc_tot || 0,
|
||||||
|
pctSansMention: ligne.pct_sansmention || 0,
|
||||||
|
pctAB: ligne.pct_ab || 0,
|
||||||
|
pctB: ligne.pct_b || 0,
|
||||||
|
pctTB: ligne.pct_tb || 0,
|
||||||
|
pctTBF: ligne.pct_tbf || 0,
|
||||||
|
pctGeneral: ligne.pct_bg || 0,
|
||||||
|
pctTechno: ligne.pct_bt || 0,
|
||||||
|
pctPro: ligne.pct_bp || 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("Erreur pour l'année " + annee + " :", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return historique;
|
||||||
}
|
}
|
||||||
+523
-32
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,428 @@
|
|||||||
<detail-view>
|
<detail-view>
|
||||||
<div if={ props.formation } class="detail-card">
|
<div if={ props.formation } class="detail-page">
|
||||||
<h2>{ props.formation.nom }</h2>
|
<h2>Formation</h2>
|
||||||
<p><b>Établissement :</b> { props.formation.etablissement }</p>
|
<h1 class="formation-title">{ props.formation.etablissement } - { props.formation.nom }</h1>
|
||||||
|
<div class="formation-meta">
|
||||||
<p><b>Ville :</b> { props.formation.ville }</p>
|
<p><b>Ville :</b> { props.formation.ville }</p>
|
||||||
<p><b>Département :</b> { props.formation.departement }</p>
|
<p><b>Département :</b> { props.formation.departement } { props.formation.departementLib }</p>
|
||||||
<p><b>Filière :</b> { props.formation.filiere }</p>
|
<p><b>Académie :</b> { props.formation.academie }</p>
|
||||||
<p><b>Sélectivité :</b> { props.formation.selectivite }</p>
|
<p>{ props.formation.contrat }</p>
|
||||||
<p><b>Capacité :</b> { props.formation.capacite }</p>
|
<p><b>Capacité :</b> { props.formation.capacite }</p>
|
||||||
<p><b>Candidats :</b> { props.formation.candidats }</p>
|
|
||||||
<p><b>Admis :</b> { props.formation.admis }</p>
|
|
||||||
<p><b>Taux d'accès :</b> { props.formation.tauxAcces }%</p>
|
|
||||||
<button onclick={ () => props.onback() }>Retour</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="detail-grid">
|
||||||
|
<div>
|
||||||
|
<h2>Phase principale d'admission</h2>
|
||||||
|
<table class="detail-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Bac</th>
|
||||||
|
<th>Voeux</th>
|
||||||
|
<th>Classés</th>
|
||||||
|
<th>Propositions</th>
|
||||||
|
<th>Acceptés</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Gén</td>
|
||||||
|
<td>{ props.formation.voePPGeneral }</td>
|
||||||
|
<td>{ props.formation.classesPPGeneral }</td>
|
||||||
|
<td>{ props.formation.propositionsPPGeneral }</td>
|
||||||
|
<td>{ props.formation.acceptesPPGeneral }</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Techno</td>
|
||||||
|
<td>{ props.formation.voePPTechno }</td>
|
||||||
|
<td>{ props.formation.classesPPTechno }</td>
|
||||||
|
<td>{ props.formation.propositionsPPTechno }</td>
|
||||||
|
<td>{ props.formation.acceptesPPTechno }</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pro</td>
|
||||||
|
<td>{ props.formation.voePPPro }</td>
|
||||||
|
<td>{ props.formation.classesPPPro }</td>
|
||||||
|
<td>{ props.formation.propositionsPPPro }</td>
|
||||||
|
<td>{ props.formation.acceptesPPPro }</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Autres</td>
|
||||||
|
<td>{ props.formation.voePPAutres }</td>
|
||||||
|
<td>{ props.formation.classesPPAutres }</td>
|
||||||
|
<td>{ props.formation.propositionsPPAutres }</td>
|
||||||
|
<td>{ props.formation.acceptesPPAutres }</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="total-row">
|
||||||
|
<td>Total</td>
|
||||||
|
<td>{ props.formation.voePPTotal }</td>
|
||||||
|
<td>{ props.formation.classesPPTotal }</td>
|
||||||
|
<td>{ props.formation.propositionsPPTotal }</td>
|
||||||
|
<td>{ props.formation.acceptesPPTotal }</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="timeline-box">
|
||||||
|
<h3>Vitesse de remplissage</h3>
|
||||||
|
<div class="timeline">
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="timeline-dot"></div>
|
||||||
|
<div>
|
||||||
|
<b>Ouverture 30 mai</b><br />
|
||||||
|
{ props.formation.pctDebutPhase }%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="timeline-dot"></div>
|
||||||
|
<div>
|
||||||
|
<b>16 juin</b><br />
|
||||||
|
{ props.formation.pctDateBac }%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="timeline-dot"></div>
|
||||||
|
<div>
|
||||||
|
<b>11 juillet</b><br />
|
||||||
|
{ props.formation.pctFinPhase }%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Phase complémentaire d'admission</h2>
|
||||||
|
<table class="detail-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Bac</th>
|
||||||
|
<th>Voeux</th>
|
||||||
|
<th>Classés</th>
|
||||||
|
<th>Propositions</th>
|
||||||
|
<th>Acceptés</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Gén</td>
|
||||||
|
<td>{ props.formation.voePCGeneral }</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Techno</td>
|
||||||
|
<td>{ props.formation.voePCTechno }</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Pro</td>
|
||||||
|
<td>{ props.formation.voePCPro }</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Autres</td>
|
||||||
|
<td>{ props.formation.voePCAutres }</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr class="total-row">
|
||||||
|
<td>Total</td>
|
||||||
|
<td>{ props.formation.voePCTotal }</td>
|
||||||
|
<td>{ props.formation.classesPCTotal }</td>
|
||||||
|
<td>{ props.formation.acceptesPCTotal }</td>
|
||||||
|
<td>{ props.formation.acceptesPCTotal }</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- ==================== GRAPHIQUES CHARTS.CSS ==================== -->
|
||||||
|
|
||||||
|
<h2 class="charts-heading">Profil des admis</h2>
|
||||||
|
|
||||||
|
<div class="charts-section">
|
||||||
|
<div class="chart-wrapper">
|
||||||
|
<h3>Répartition par type de bac</h3>
|
||||||
|
<div id="chart-bac" ref="graphBac"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chart-wrapper">
|
||||||
|
<h3>Mentions au bac des admis</h3>
|
||||||
|
<div id="chart-mentions" ref="graphMentions"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chart-wrapper chart-full">
|
||||||
|
<h3>Profil sociologique</h3>
|
||||||
|
<div id="chart-profil" ref="graphProfil"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ==================== ÉVOLUTION HISTORIQUE ==================== -->
|
||||||
|
|
||||||
|
<h2 class="charts-heading">Évolution depuis 2020</h2>
|
||||||
|
|
||||||
|
<div if={ state.chargementHistorique } class="message">
|
||||||
|
Chargement de l'historique...
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div if={ !state.chargementHistorique && state.historique.length === 0 } class="message">
|
||||||
|
Aucune donnée historique disponible pour cette formation.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="charts-section" if={ state.historique.length > 0 }>
|
||||||
|
<div class="chart-wrapper">
|
||||||
|
<h3>Taux d'accès par année</h3>
|
||||||
|
<div id="chart-evolution-taux" ref="graphTaux"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chart-wrapper">
|
||||||
|
<h3>Nombre de candidats et admis</h3>
|
||||||
|
<div id="chart-evolution-candidats" ref="graphCandidats"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chart-wrapper chart-full">
|
||||||
|
<h3>Évolution des mentions au bac</h3>
|
||||||
|
<div ref="graphMentionsHist"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button onclick={ retourListe } class="btn-retour">Retour à la liste</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
|
||||||
|
state: {
|
||||||
|
historique: [],
|
||||||
|
chargementHistorique: false
|
||||||
|
},
|
||||||
|
|
||||||
|
onMounted() {
|
||||||
|
this.afficherGraphiques();
|
||||||
|
this.chargerHistorique();
|
||||||
|
},
|
||||||
|
|
||||||
|
onUpdated() {
|
||||||
|
this.afficherGraphiques();
|
||||||
|
|
||||||
|
if (this.state.historique.length > 0) {
|
||||||
|
this.afficherGraphiquesHistoriques();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Retour à la liste des résultats
|
||||||
|
retourListe() {
|
||||||
|
this.props.onback();
|
||||||
|
},
|
||||||
|
|
||||||
|
// Limiter une valeur entre 0 et 1 pour Charts.css
|
||||||
|
limiterValeur(val) {
|
||||||
|
if (val === null || val === undefined || isNaN(val)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var v = val / 100;
|
||||||
|
|
||||||
|
if (v > 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (v < 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.round(v * 100) / 100;
|
||||||
|
},
|
||||||
|
|
||||||
|
afficherGraphiques() {
|
||||||
|
var f = this.props.formation;
|
||||||
|
if (!f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var graphBac = this.$('[ref="graphBac"]');
|
||||||
|
var graphMentions = this.$('[ref="graphMentions"]');
|
||||||
|
var graphProfil = this.$('[ref="graphProfil"]');
|
||||||
|
|
||||||
|
if (graphBac) {
|
||||||
|
graphBac.innerHTML = this.construireGraphiqueColonnes([
|
||||||
|
{ label: 'Général', valeur: f.pctGeneral, couleur: '#3d7fff' },
|
||||||
|
{ label: 'Techno', valeur: f.pctTechno, couleur: '#f59e0b' },
|
||||||
|
{ label: 'Pro', valeur: f.pctPro, couleur: '#10b981' }
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (graphMentions) {
|
||||||
|
graphMentions.innerHTML = this.construireGraphiqueColonnes([
|
||||||
|
{ label: 'Sans', valeur: f.pctSansMention, couleur: '#94a3b8' },
|
||||||
|
{ label: 'AB', valeur: f.pctAB, couleur: '#60a5fa' },
|
||||||
|
{ label: 'Bien', valeur: f.pctB, couleur: '#34d399' },
|
||||||
|
{ label: 'TB', valeur: f.pctTB, couleur: '#fbbf24' },
|
||||||
|
{ label: 'TB Féli.', valeur: f.pctTBF, couleur: '#f472b6' }
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (graphProfil) {
|
||||||
|
graphProfil.innerHTML = this.construireGraphiqueBarres([
|
||||||
|
{ label: 'Femmes', valeur: f.pctFemmes, couleur: '#a78bfa' },
|
||||||
|
{ label: 'Boursiers', valeur: f.pctBoursiers, couleur: '#fb923c' },
|
||||||
|
{ label: 'Néo-bac', valeur: f.pctNeoBac, couleur: '#2dd4bf' }
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async chargerHistorique() {
|
||||||
|
var f = this.props.formation;
|
||||||
|
if (!f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var codUai = f.id.split('-')[0];
|
||||||
|
|
||||||
|
if (!codUai || !window.chargerHistoriqueFormation) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.update({ chargementHistorique: true });
|
||||||
|
|
||||||
|
try {
|
||||||
|
var historique = await window.chargerHistoriqueFormation(codUai, f.nom);
|
||||||
|
this.update({ historique: historique, chargementHistorique: false });
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Erreur chargement historique :', e);
|
||||||
|
this.update({ historique: [], chargementHistorique: false });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
afficherGraphiquesHistoriques() {
|
||||||
|
var historique = this.state.historique;
|
||||||
|
if (!historique || historique.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var graphTaux = this.$('[ref="graphTaux"]');
|
||||||
|
var graphCandidats = this.$('[ref="graphCandidats"]');
|
||||||
|
var graphMentionsHist = this.$('[ref="graphMentionsHist"]');
|
||||||
|
|
||||||
|
// Graphique : taux d'accès par année
|
||||||
|
if (graphTaux) {
|
||||||
|
var elementsAnnee = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < historique.length; i++) {
|
||||||
|
elementsAnnee.push({
|
||||||
|
label: '' + historique[i].annee,
|
||||||
|
valeur: historique[i].tauxAcces,
|
||||||
|
couleur: '#1a936f'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
graphTaux.innerHTML = this.construireGraphiqueColonnes(elementsAnnee);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Graphique : candidats vs admis
|
||||||
|
if (graphCandidats) {
|
||||||
|
var maxCandidats = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < historique.length; i++) {
|
||||||
|
if (historique[i].candidats > maxCandidats) {
|
||||||
|
maxCandidats = historique[i].candidats;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var lignes = '';
|
||||||
|
|
||||||
|
for (var i = 0; i < historique.length; i++) {
|
||||||
|
var h = historique[i];
|
||||||
|
var tailleCand = 0;
|
||||||
|
var tailleAdmis = 0;
|
||||||
|
|
||||||
|
if (maxCandidats > 0) {
|
||||||
|
tailleCand = Math.round((h.candidats / maxCandidats) * 100) / 100;
|
||||||
|
tailleAdmis = Math.round((h.admis / maxCandidats) * 100) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
lignes += '<tr>';
|
||||||
|
lignes += '<th scope="row">' + h.annee + '</th>';
|
||||||
|
lignes += '<td style="--size: ' + tailleCand + '; --color: #2a5298;">';
|
||||||
|
lignes += '<span class="data">' + h.candidats + '</span></td>';
|
||||||
|
lignes += '<td style="--size: ' + tailleAdmis + '; --color: #1a936f;">';
|
||||||
|
lignes += '<span class="data">' + h.admis + '</span></td>';
|
||||||
|
lignes += '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
graphCandidats.innerHTML = '<table class="charts-css column multiple show-labels show-primary-axis show-4-secondary-axes data-spacing-10">'
|
||||||
|
+ '<thead><tr><th scope="col">Année</th><th scope="col">Candidats</th><th scope="col">Admis</th></tr></thead>'
|
||||||
|
+ '<tbody>' + lignes + '</tbody></table>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tableau : évolution des mentions
|
||||||
|
if (graphMentionsHist) {
|
||||||
|
var tableau = '<table class="detail-table">';
|
||||||
|
tableau += '<thead><tr><th>Année</th><th>Sans mention</th><th>AB</th><th>Bien</th><th>TB</th><th>TB Féli.</th></tr></thead>';
|
||||||
|
tableau += '<tbody>';
|
||||||
|
|
||||||
|
for (var i = 0; i < historique.length; i++) {
|
||||||
|
var h = historique[i];
|
||||||
|
tableau += '<tr>';
|
||||||
|
tableau += '<td><b>' + h.annee + '</b></td>';
|
||||||
|
tableau += '<td>' + h.pctSansMention + '%</td>';
|
||||||
|
tableau += '<td>' + h.pctAB + '%</td>';
|
||||||
|
tableau += '<td>' + h.pctB + '%</td>';
|
||||||
|
tableau += '<td>' + h.pctTB + '%</td>';
|
||||||
|
tableau += '<td>' + h.pctTBF + '%</td>';
|
||||||
|
tableau += '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
tableau += '</tbody></table>';
|
||||||
|
graphMentionsHist.innerHTML = tableau;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
construireGraphiqueColonnes(elements) {
|
||||||
|
var lignes = '';
|
||||||
|
|
||||||
|
for (var i = 0; i < elements.length; i++) {
|
||||||
|
var el = elements[i];
|
||||||
|
var taille = this.limiterValeur(el.valeur);
|
||||||
|
var affiche = el.valeur || 0;
|
||||||
|
|
||||||
|
lignes += '<tr>';
|
||||||
|
lignes += '<th scope="row">' + el.label + '</th>';
|
||||||
|
lignes += '<td style="--size: ' + taille + '; --color: ' + el.couleur + ';">';
|
||||||
|
lignes += '<span class="data">' + affiche + '%</span>';
|
||||||
|
lignes += '</td></tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<table class="charts-css column show-labels show-primary-axis show-4-secondary-axes data-spacing-10">'
|
||||||
|
+ '<thead><tr><th scope="col">Type</th><th scope="col">%</th></tr></thead>'
|
||||||
|
+ '<tbody>' + lignes + '</tbody></table>';
|
||||||
|
},
|
||||||
|
|
||||||
|
construireGraphiqueBarres(elements) {
|
||||||
|
var lignes = '';
|
||||||
|
|
||||||
|
for (var i = 0; i < elements.length; i++) {
|
||||||
|
var el = elements[i];
|
||||||
|
var taille = this.limiterValeur(el.valeur);
|
||||||
|
var affiche = el.valeur || 0;
|
||||||
|
|
||||||
|
lignes += '<tr>';
|
||||||
|
lignes += '<th scope="row">' + el.label + '</th>';
|
||||||
|
lignes += '<td style="--size: ' + taille + '; --color: ' + el.couleur + ';">';
|
||||||
|
lignes += '<span class="data">' + affiche + '%</span>';
|
||||||
|
lignes += '</td></tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<table class="charts-css bar show-labels show-primary-axis show-4-secondary-axes data-spacing-14">'
|
||||||
|
+ '<thead><tr><th scope="col">Catégorie</th><th scope="col">%</th></tr></thead>'
|
||||||
|
+ '<tbody>' + lignes + '</tbody></table>';
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
</detail-view>
|
</detail-view>
|
||||||
@@ -1,53 +1,120 @@
|
|||||||
<map-view>
|
<map-view>
|
||||||
<div class="map-box">
|
<div class="map-box">
|
||||||
<h3>Carte des formations</h3>
|
<h3>Carte des formations</h3>
|
||||||
<div id="map"></div>
|
<div class="map" ref="carte"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
|
|
||||||
onMounted() {
|
onMounted() {
|
||||||
this.map = L.map(this.root.querySelector('#map')).setView([46.8, 2.5], 6)
|
var divCarte = this.$('div[ref="carte"]');
|
||||||
|
|
||||||
|
this.carte = L.map(divCarte).setView([46.8, 2.5], 6);
|
||||||
|
this.groupeMarqueurs = L.layerGroup().addTo(this.carte);
|
||||||
|
this.marqueursIndex = {};
|
||||||
|
|
||||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||||
attribution: '© OpenStreetMap contributors'
|
attribution: '© OpenStreetMap contributors'
|
||||||
}).addTo(this.map)
|
}).addTo(this.carte);
|
||||||
|
|
||||||
this.markersLayer = L.layerGroup().addTo(this.map)
|
this.afficherMarqueurs();
|
||||||
this.refreshMarkers()
|
|
||||||
|
var composant = this;
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
if (composant.carte) {
|
||||||
|
composant.carte.invalidateSize();
|
||||||
|
}
|
||||||
|
}, 200);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
if (composant.carte) {
|
||||||
|
composant.carte.invalidateSize();
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
window.mapFocus = function(id) {
|
||||||
|
composant.centrerSurFormation(id);
|
||||||
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
onUpdated() {
|
onUpdated() {
|
||||||
this.refreshMarkers()
|
this.afficherMarqueurs();
|
||||||
|
|
||||||
|
var composant = this;
|
||||||
|
|
||||||
|
if (this.carte) {
|
||||||
|
setTimeout(function() {
|
||||||
|
composant.carte.invalidateSize();
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
composant.carte.invalidateSize();
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
refreshMarkers() {
|
onBeforeUnmount() {
|
||||||
if (!this.map || !this.markersLayer) {
|
if (this.carte) {
|
||||||
return
|
this.carte.remove();
|
||||||
|
this.carte = null;
|
||||||
|
}
|
||||||
|
window.mapFocus = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
afficherMarqueurs() {
|
||||||
|
if (!this.carte || !this.groupeMarqueurs) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.markersLayer.clearLayers()
|
this.groupeMarqueurs.clearLayers();
|
||||||
|
this.marqueursIndex = {};
|
||||||
|
|
||||||
const points = []
|
var coordonnees = [];
|
||||||
|
var formations = this.props.results || [];
|
||||||
|
|
||||||
for (let i = 0; i < this.props.results.length; i++) {
|
for (var i = 0; i < formations.length; i++) {
|
||||||
const f = this.props.results[i]
|
var f = formations[i];
|
||||||
|
|
||||||
if (f.latitude && f.longitude) {
|
if (f.latitude != null && f.longitude != null) {
|
||||||
const marker = L.marker([f.latitude, f.longitude])
|
var marqueur = L.marker([f.latitude, f.longitude]);
|
||||||
marker.bindPopup(`<b>${f.nom}</b><br>${f.ville}`)
|
marqueur.bindPopup('<b>' + f.nom + '</b><br>' + f.ville);
|
||||||
marker.addTo(this.markersLayer)
|
marqueur.addTo(this.groupeMarqueurs);
|
||||||
|
|
||||||
points.push([f.latitude, f.longitude])
|
this.marqueursIndex[f.id] = marqueur;
|
||||||
|
coordonnees.push([f.latitude, f.longitude]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (points.length > 0) {
|
if (coordonnees.length > 0) {
|
||||||
this.map.fitBounds(points, { padding: [20, 20] })
|
this.carte.fitBounds(coordonnees, { padding: [20, 20] });
|
||||||
} else {
|
} else {
|
||||||
this.map.setView([46.8, 2.5], 6)
|
this.carte.setView([46.8, 2.5], 6);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
centrerSurFormation(id) {
|
||||||
|
var marqueur = this.marqueursIndex[id];
|
||||||
|
|
||||||
|
if (marqueur && this.carte) {
|
||||||
|
var divCarte = this.$('div[ref="carte"]');
|
||||||
|
|
||||||
|
if (divCarte) {
|
||||||
|
divCarte.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||||
|
}
|
||||||
|
|
||||||
|
var composant = this;
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
composant.carte.invalidateSize();
|
||||||
|
composant.carte.setView(marqueur.getLatLng(), 13, { animate: true });
|
||||||
|
marqueur.openPopup();
|
||||||
|
}, 400);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</map-view>
|
</map-view>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<result-list>
|
<result-list>
|
||||||
<div class="results">
|
<div class="results">
|
||||||
|
|
||||||
<div class="message" if={ props.results.length === 0 && props.hasSearched && !props.loading }>
|
<div class="message" if={ props.results.length === 0 && props.hasSearched && !props.loading }>
|
||||||
Aucun résultat trouvé
|
Aucun résultat trouvé
|
||||||
</div>
|
</div>
|
||||||
@@ -8,13 +9,41 @@
|
|||||||
Chargement...
|
Chargement...
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div each={ (f, i) in props.results } key={ f.id } class="card">
|
<div each={ (formation, index) in props.results } key={ formation.id } class="card">
|
||||||
<h3>{ f.nom }</h3>
|
<h3>{ formation.nom }</h3>
|
||||||
<p><b>Établissement :</b> { f.etablissement }</p>
|
<p><b>Établissement :</b> { formation.etablissement }</p>
|
||||||
<p><b>Ville :</b> { f.ville } ({ f.departement })</p>
|
<p><b>Ville :</b> { formation.ville } ({ formation.departement })</p>
|
||||||
<p><b>Filière :</b> { f.filiere }</p>
|
<p><b>Filière :</b> { formation.filiere }</p>
|
||||||
<p><b>Taux d'accès :</b> { f.tauxAcces }%</p>
|
<p><b>Taux d'accès :</b> { formation.tauxAcces }%</p>
|
||||||
<button onclick={ () => props.ondetail(i) }>Voir détail</button>
|
|
||||||
|
<button onclick={ afficherDetail.bind(this, index) }>Voir détail</button>
|
||||||
|
<button onclick={ ajouterALaSelection.bind(this, index) }>Ajouter à la sélection</button>
|
||||||
|
<button onclick={ localiserSurCarte.bind(this, formation) } if={ formation.latitude != null }>Localiser</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
|
||||||
|
// Déclencher l'affichage du détail d'une formation
|
||||||
|
afficherDetail(index) {
|
||||||
|
this.props.ondetail(index);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Ajouter une formation à la sélection
|
||||||
|
ajouterALaSelection(index) {
|
||||||
|
this.props.onselect(index);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Centrer la carte sur la formation
|
||||||
|
localiserSurCarte(formation) {
|
||||||
|
if (window.mapFocus) {
|
||||||
|
window.mapFocus(formation.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
</result-list>
|
</result-list>
|
||||||
@@ -2,26 +2,146 @@
|
|||||||
<div class="search-bar">
|
<div class="search-bar">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Ex : BUT informatique"
|
placeholder="Ex : BUT informatique, Licence droit..."
|
||||||
oninput={ updateQuery }
|
oninput={ updateQuery }
|
||||||
value={ state.query }
|
value={ state.query }
|
||||||
|
onkeydown={ handleKey }
|
||||||
/>
|
/>
|
||||||
<button onclick={ submitSearch }>Rechercher</button>
|
<button onclick={ submitSearch }>Rechercher</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="filters-toggle">
|
||||||
|
<button class="btn btn-small btn-outline" onclick={ toggleFilters }>
|
||||||
|
{ state.labelFiltres }
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filters-panel" if={ state.showFilters }>
|
||||||
|
<div class="filter-row">
|
||||||
|
<div class="filter-item">
|
||||||
|
<label>Type de formation</label>
|
||||||
|
<select onchange={ updateFiliere }>
|
||||||
|
<option value="">Tous</option>
|
||||||
|
<option value="BTS">BTS</option>
|
||||||
|
<option value="BUT">BUT</option>
|
||||||
|
<option value="Licence">Licence</option>
|
||||||
|
<option value="Licence_Las">Licence - L.AS</option>
|
||||||
|
<option value="CPGE">CPGE</option>
|
||||||
|
<option value="Ecole de Commerce">École de Commerce</option>
|
||||||
|
<option value="IFSI">IFSI</option>
|
||||||
|
<option value="PASS">PASS</option>
|
||||||
|
<option value="EFTS">EFTS</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filter-item">
|
||||||
|
<label>Sélectivité</label>
|
||||||
|
<select onchange={ updateSelectivite }>
|
||||||
|
<option value="">Toutes</option>
|
||||||
|
<option value="formation sélective">Sélective</option>
|
||||||
|
<option value="formation non sélective">Non sélective</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filter-item">
|
||||||
|
<label>Région</label>
|
||||||
|
<select onchange={ updateRegion }>
|
||||||
|
<option value="">Toutes</option>
|
||||||
|
<option value="Auvergne-Rhône-Alpes">Auvergne-Rhône-Alpes</option>
|
||||||
|
<option value="Bourgogne-Franche-Comté">Bourgogne-Franche-Comté</option>
|
||||||
|
<option value="Bretagne">Bretagne</option>
|
||||||
|
<option value="Centre-Val de Loire">Centre-Val de Loire</option>
|
||||||
|
<option value="Corse">Corse</option>
|
||||||
|
<option value="Grand Est">Grand Est</option>
|
||||||
|
<option value="Guadeloupe">Guadeloupe</option>
|
||||||
|
<option value="Guyane">Guyane</option>
|
||||||
|
<option value="Hauts-de-France">Hauts-de-France</option>
|
||||||
|
<option value="Ile-de-France">Île-de-France</option>
|
||||||
|
<option value="La Réunion">La Réunion</option>
|
||||||
|
<option value="Martinique">Martinique</option>
|
||||||
|
<option value="Mayotte">Mayotte</option>
|
||||||
|
<option value="Normandie">Normandie</option>
|
||||||
|
<option value="Nouvelle-Aquitaine">Nouvelle-Aquitaine</option>
|
||||||
|
<option value="Occitanie">Occitanie</option>
|
||||||
|
<option value="Pays de la Loire">Pays de la Loire</option>
|
||||||
|
<option value="Provence-Alpes-Côte d'Azur">PACA</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filter-row">
|
||||||
|
<div class="filter-item">
|
||||||
|
<label>Taux d'accès min (%)</label>
|
||||||
|
<input type="number" min="0" max="100" value={ state.tauxMin } oninput={ updateTauxMin } placeholder="0" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filter-item">
|
||||||
|
<label>Taux d'accès max (%)</label>
|
||||||
|
<input type="number" min="0" max="100" value={ state.tauxMax } oninput={ updateTauxMax } placeholder="100" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
state: {
|
state: {
|
||||||
query: ''
|
query: '',
|
||||||
|
showFilters: false,
|
||||||
|
labelFiltres: 'Filtres avancés',
|
||||||
|
filiere: '',
|
||||||
|
selectivite: '',
|
||||||
|
region: '',
|
||||||
|
tauxMin: 0,
|
||||||
|
tauxMax: 100
|
||||||
},
|
},
|
||||||
|
|
||||||
updateQuery(e) {
|
updateQuery(e) {
|
||||||
this.update({ query: e.target.value })
|
this.update({ query: e.target.value });
|
||||||
|
},
|
||||||
|
|
||||||
|
handleKey(e) {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
this.submitSearch();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toggleFilters() {
|
||||||
|
var visible = !this.state.showFilters;
|
||||||
|
var label = visible ? 'Masquer les filtres' : 'Filtres avancés';
|
||||||
|
this.update({ showFilters: visible, labelFiltres: label });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateFiliere(e) {
|
||||||
|
this.update({ filiere: e.target.value });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateSelectivite(e) {
|
||||||
|
this.update({ selectivite: e.target.value });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateRegion(e) {
|
||||||
|
this.update({ region: e.target.value });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateTauxMin(e) {
|
||||||
|
this.update({ tauxMin: Number(e.target.value) });
|
||||||
|
},
|
||||||
|
|
||||||
|
updateTauxMax(e) {
|
||||||
|
this.update({ tauxMax: Number(e.target.value) });
|
||||||
},
|
},
|
||||||
|
|
||||||
submitSearch() {
|
submitSearch() {
|
||||||
this.props.onsearch(this.state.query)
|
var filters = {
|
||||||
}
|
filiere: this.state.filiere,
|
||||||
|
selectivite: this.state.selectivite,
|
||||||
|
region: this.state.region,
|
||||||
|
tauxMin: this.state.tauxMin,
|
||||||
|
tauxMax: this.state.tauxMax
|
||||||
|
};
|
||||||
|
|
||||||
|
this.props.onsearch(this.state.query, filters);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
</search-bar>
|
</search-bar>
|
||||||
+91
-17
@@ -1,23 +1,97 @@
|
|||||||
export function createFormation(raw) {
|
// Créer un objet formation à partir des données brutes de l'API
|
||||||
let taux = 0
|
export function creerFormation(brut) {
|
||||||
|
|
||||||
if (raw.voe_tot && raw.voe_tot > 0) {
|
var taux = 0;
|
||||||
taux = Math.round((raw.acc_tot / raw.voe_tot) * 100)
|
var latitude = null;
|
||||||
|
var longitude = null;
|
||||||
|
|
||||||
|
if (brut.voe_tot && brut.voe_tot > 0) {
|
||||||
|
taux = Math.round((brut.acc_tot / brut.voe_tot) * 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (brut.g_olocalisation_des_formations) {
|
||||||
|
latitude = brut.g_olocalisation_des_formations.lat;
|
||||||
|
longitude = brut.g_olocalisation_des_formations.lon;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: raw.cod_uai + "-" + raw.lib_for_voe_ins,
|
id: brut.cod_uai + "-" + brut.lib_for_voe_ins,
|
||||||
nom: raw.lib_for_voe_ins,
|
|
||||||
etablissement: raw.g_ea_lib_vx,
|
nom: brut.lib_for_voe_ins,
|
||||||
ville: raw.ville_etab,
|
etablissement: brut.g_ea_lib_vx,
|
||||||
departement: raw.dep,
|
ville: brut.ville_etab,
|
||||||
filiere: raw.fili,
|
departement: brut.dep,
|
||||||
selectivite: raw.select_form,
|
departementLib: brut.dep_lib,
|
||||||
capacite: raw.capa_fin,
|
region: brut.region_etab_aff,
|
||||||
candidats: raw.voe_tot,
|
academie: brut.acad_mies,
|
||||||
admis: raw.acc_tot,
|
contrat: brut.contrat_etab,
|
||||||
|
|
||||||
|
filiere: brut.fili,
|
||||||
|
selectivite: brut.select_form,
|
||||||
|
|
||||||
|
capacite: brut.capa_fin,
|
||||||
|
candidats: brut.voe_tot,
|
||||||
|
admis: brut.acc_tot,
|
||||||
tauxAcces: taux,
|
tauxAcces: taux,
|
||||||
latitude: raw.g_olocalisation_des_formations ? raw.g_olocalisation_des_formations.lat : null,
|
|
||||||
longitude: raw.g_olocalisation_des_formations ? raw.g_olocalisation_des_formations.lon : null
|
latitude: latitude,
|
||||||
}
|
longitude: longitude,
|
||||||
|
|
||||||
|
pctFemmes: brut.pct_f,
|
||||||
|
pctBoursiers: brut.pct_bours,
|
||||||
|
pctNeoBac: brut.pct_neobac,
|
||||||
|
|
||||||
|
pctGeneral: brut.pct_bg,
|
||||||
|
pctTechno: brut.pct_bt,
|
||||||
|
pctPro: brut.pct_bp,
|
||||||
|
|
||||||
|
pctSansMention: brut.pct_sansmention,
|
||||||
|
pctAB: brut.pct_ab,
|
||||||
|
pctB: brut.pct_b,
|
||||||
|
pctTB: brut.pct_tb,
|
||||||
|
pctTBF: brut.pct_tbf,
|
||||||
|
|
||||||
|
pctDebutPhase: brut.pct_acc_debutpp,
|
||||||
|
pctDateBac: brut.pct_acc_datebac,
|
||||||
|
pctFinPhase: brut.pct_acc_finpp,
|
||||||
|
|
||||||
|
admisDebutPhase: brut.acc_debutpp,
|
||||||
|
admisDateBac: brut.acc_datebac,
|
||||||
|
admisFinPhase: brut.acc_finpp,
|
||||||
|
|
||||||
|
// Phase principale
|
||||||
|
voePPGeneral: brut.nb_voe_pp_bg,
|
||||||
|
voePPTechno: brut.nb_voe_pp_bt,
|
||||||
|
voePPPro: brut.nb_voe_pp_bp,
|
||||||
|
voePPAutres: brut.nb_voe_pp_at,
|
||||||
|
voePPTotal: brut.nb_voe_pp,
|
||||||
|
|
||||||
|
classesPPGeneral: brut.nb_cla_pp_bg,
|
||||||
|
classesPPTechno: brut.nb_cla_pp_bt,
|
||||||
|
classesPPPro: brut.nb_cla_pp_bp,
|
||||||
|
classesPPAutres: brut.nb_cla_pp_at,
|
||||||
|
classesPPTotal: brut.nb_cla_pp,
|
||||||
|
|
||||||
|
propositionsPPGeneral: brut.prop_tot_bg,
|
||||||
|
propositionsPPTechno: brut.prop_tot_bt,
|
||||||
|
propositionsPPPro: brut.prop_tot_bp,
|
||||||
|
propositionsPPAutres: brut.prop_tot_at,
|
||||||
|
propositionsPPTotal: brut.prop_tot,
|
||||||
|
|
||||||
|
acceptesPPGeneral: brut.acc_bg,
|
||||||
|
acceptesPPTechno: brut.acc_bt,
|
||||||
|
acceptesPPPro: brut.acc_bp,
|
||||||
|
acceptesPPAutres: brut.acc_at,
|
||||||
|
acceptesPPTotal: brut.acc_pp,
|
||||||
|
|
||||||
|
// Phase complémentaire
|
||||||
|
voePCGeneral: brut.nb_voe_pc_bg,
|
||||||
|
voePCTechno: brut.nb_voe_pc_bt,
|
||||||
|
voePCPro: brut.nb_voe_pc_bp,
|
||||||
|
voePCAutres: brut.nb_voe_pc_at,
|
||||||
|
voePCTotal: brut.nb_voe_pc,
|
||||||
|
|
||||||
|
classesPCTotal: brut.nb_cla_pc,
|
||||||
|
acceptesPCTotal: brut.acc_pc
|
||||||
|
};
|
||||||
}
|
}
|
||||||
+37
-19
@@ -3,38 +3,56 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Parcoursup Riot</title>
|
<title>Parcoursup Explorer</title>
|
||||||
|
|
||||||
<link rel="stylesheet" href="./style.css" />
|
<link rel="stylesheet" href="./style.css" />
|
||||||
<link
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
||||||
rel="stylesheet"
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/charts.css/dist/charts.min.css" />
|
||||||
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/riot@9/riot+compiler.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/riot@9/riot+compiler.min.js"></script>
|
||||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<app></app>
|
<app></app>
|
||||||
|
|
||||||
<script src="./components/search-bar.riot" type="riot"></script>
|
<script src="./components/search-bar.riot" type="riot"></script>
|
||||||
<script src="./components/result-list.riot" type="riot"></script>
|
<script src="./components/result-list.riot" type="riot"></script>
|
||||||
<script src="./components/detail-view.riot" type="riot"></script>
|
<script src="./components/detail-view.riot" type="riot"></script>
|
||||||
<script src="./components/map-view.riot" type="riot"></script>
|
<script src="./components/map-view.riot" type="riot"></script>
|
||||||
<script src="./app.riot" type="riot"></script>
|
<script src="./components/auth-panel.riot" type="riot"></script>
|
||||||
|
<script src="./app.riot" type="riot"></script>
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import { fetchFormations } from './api.js'
|
import { chargerFormations, chargerHistoriqueFormation } from './api.js'
|
||||||
import { createFormation } from './formation.js'
|
import { creerFormation } from './formation.js'
|
||||||
|
import {
|
||||||
|
auth,
|
||||||
|
db,
|
||||||
|
createAccount,
|
||||||
|
login,
|
||||||
|
logout,
|
||||||
|
onUserChanged,
|
||||||
|
saveUserData,
|
||||||
|
loadUserData
|
||||||
|
} from './firebase.js'
|
||||||
|
|
||||||
window.fetchFormations = fetchFormations
|
window.chargerFormations = chargerFormations
|
||||||
window.createFormation = createFormation
|
window.creerFormation = creerFormation
|
||||||
</script>
|
window.chargerHistoriqueFormation = chargerHistoriqueFormation
|
||||||
|
|
||||||
<script>
|
window.firebaseServices = {
|
||||||
riot.compile().then(() => {
|
auth,
|
||||||
|
db,
|
||||||
|
createAccount,
|
||||||
|
login,
|
||||||
|
logout,
|
||||||
|
onUserChanged,
|
||||||
|
saveUserData,
|
||||||
|
loadUserData
|
||||||
|
}
|
||||||
|
|
||||||
|
await riot.compile()
|
||||||
riot.mount('app')
|
riot.mount('app')
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
+864
-60
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user