debut : ajout choix de la formation avec cache
This commit is contained in:
commit
a47647e376
27
index.html
Normal file
27
index.html
Normal file
@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
||||
<script src="./riot/suiviformation.riot" type="riot"></script>
|
||||
<script src="./riot/choixformation.riot" type="riot"></script>
|
||||
<script src="./riot/app.riot" type="riot"></script>
|
||||
<script src="./js/model.js" type="text/javascript"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/7.1.0/riot+compiler.min.js" integrity="sha512-sSGKGR9MvL0bUx3CScaBb56crXwspwDkL/JnB0IrLFQfw3uvSUlITQtsTtDZctshhv5wdwIt+qZeN8zThRF4Dw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<title>S4WEB</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<app></app>
|
||||
<script>
|
||||
|
||||
riot.compile().then(() => {
|
||||
riot.mount('app', {})
|
||||
})
|
||||
|
||||
localStorage.clear()
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
21
js/model.js
Normal file
21
js/model.js
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
|
||||
async function getFiliere(search){
|
||||
try {
|
||||
let xhr=new XMLHttpRequest();
|
||||
xhr.open("get", `https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-parcoursup&sort=tri&facet=fili&timezone=Europe%2FBerlin&q=${search}`);
|
||||
xhr.responseType = "json";
|
||||
|
||||
xhr.onload=() =>{
|
||||
if(xhr.status == 200){
|
||||
resolbe(xhr.response)
|
||||
}else{
|
||||
PromiseRejectionEvent(xhr.statusText)
|
||||
}
|
||||
}
|
||||
|
||||
xhr.onerror= () => PromiseRejectionEvent("Erreur Reseau");
|
||||
return xhr.send();
|
||||
} catch (error){}
|
||||
return null;
|
||||
}
|
18
riot/app.riot
Normal file
18
riot/app.riot
Normal file
@ -0,0 +1,18 @@
|
||||
<app>
|
||||
<choixformation isSelected={isSelected}></choixformation>
|
||||
<script>
|
||||
export default function todos() {
|
||||
return {
|
||||
onBeforeMount(props, state) {
|
||||
// initial state
|
||||
this.state = {
|
||||
};
|
||||
},
|
||||
isSelected(formation){
|
||||
console.log(formation +"is selected")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</app>
|
211
riot/choixformation.riot
Normal file
211
riot/choixformation.riot
Normal file
@ -0,0 +1,211 @@
|
||||
<choixformation>
|
||||
<suiviformation formation={state.filiere} type={state.type} detail={state.detail} resetToDetail={resetToDetail} resetToFili={resetToFili} resetToType={resetToType}></suiviformation>
|
||||
|
||||
<div class="column is-4 m-5">
|
||||
<search-list start="start" label="Formation">
|
||||
<div class="control has-icons-left">
|
||||
<input class="input" type="search" placeholder="Formation" id="input" oninput={search} if={!state.filiere}>
|
||||
<input class="input" type="search" placeholder="Formation" id="input" oninput={search} if={state.filiere && !state.type}>
|
||||
<input class="input" type="search" placeholder="Formation" id="input" oninput={search} if={state.filiere && state.type}>
|
||||
<span class="icon is-small is-left"><i class="fas fa-search"></i></span>
|
||||
</div>
|
||||
<my-list start="start" label="Formation">
|
||||
<div class="box m-3 scrollable">
|
||||
<div class="columns is-mobile is-vcentered">
|
||||
<div class="column p-1">
|
||||
<p class="menu-label is-unselectable" if={!state.filiere}>Filière</p>
|
||||
<p class="menu-label is-unselectable" if={state.filiere && !state.type}>Type de filière</p>
|
||||
<p class="menu-label is-unselectable" if={state.filiere && state.type}>choix de la formation</p>
|
||||
</div>
|
||||
<div class="column p-1"></div>
|
||||
</div>
|
||||
<ul class="menu-list">
|
||||
|
||||
<!--
|
||||
liste des filières:
|
||||
-->
|
||||
<div if={!state.filiere}>
|
||||
<li class="columns is-vcentered" each={item in state.find}>
|
||||
|
||||
<a if={item.name.includes(state.recherche)} class="column is-unselectable " style="transform: translateX(0px); opacity: 1;" onclick={changeFiliere} id={item.name}>
|
||||
{item.name}
|
||||
<span class="tag has-background-primary is-pulled-right has-text-white">
|
||||
{item.count}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
liste des type filières:
|
||||
-->
|
||||
<div if={state.filiere && !state.type}>
|
||||
<li class="columns is-vcentered" each={tipe in state.find}>
|
||||
<a if={tipe.name.includes(state.recherche)} class="column is-unselectable " style="transform: translateX(0px); opacity: 1;" onclick={changeType} id={tipe.name}>
|
||||
{tipe.name}
|
||||
<span class="tag has-background-primary is-pulled-right has-text-white">
|
||||
{tipe.count}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
|
||||
<!--
|
||||
liste du choix de la filière:
|
||||
-->
|
||||
<div if={state.filiere && state.type}>
|
||||
<li class="columns is-vcentered" each={item in state.find}>
|
||||
<a if={item.name.includes(state.recherche)} class="column is-unselectable " style="transform: translateX(0px); opacity: 1;" onclick={changeDetail} id={item.name}>
|
||||
{item.name}
|
||||
<span class="tag has-background-primary is-pulled-right has-text-white">
|
||||
{item.count}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</my-list>
|
||||
</search-list>
|
||||
</div>
|
||||
<script>
|
||||
export default function todos() {
|
||||
return {
|
||||
onBeforeMount(props, state) {
|
||||
// initial state
|
||||
this.state = {
|
||||
filiere: '',
|
||||
type: '',
|
||||
detail: '',
|
||||
find: '',
|
||||
recherche: ''
|
||||
};
|
||||
this.getFili();
|
||||
},
|
||||
|
||||
|
||||
async getFili() {
|
||||
if(!localStorage.getItem(`filiere`)){
|
||||
try {
|
||||
let rep = await fetch(`https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-parcoursup&q=&sort=tri&facet=fili&timezone=Europe%2FBerlin`);
|
||||
rep = await rep.json();
|
||||
localStorage.setItem(`filiere`, JSON.stringify(rep["facet_groups"][0]["facets"]))
|
||||
this.update({
|
||||
find: rep["facet_groups"][0]["facets"]
|
||||
});
|
||||
} catch (error) {
|
||||
}
|
||||
}else{
|
||||
this.update({
|
||||
find: JSON.parse(localStorage.getItem(`filiere`))
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
async getType() {
|
||||
if(!localStorage.getItem(`${this.state.filiere}`)){
|
||||
try {
|
||||
|
||||
let rep = await fetch(`https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-parcoursup&q=&sort=tri&facet=form_lib_voe_acc&refine.fili=${this.state.filiere}&timezone=Europe%2FBerlin`);
|
||||
rep = await rep.json();
|
||||
localStorage.setItem(`${this.state.filiere}`, JSON.stringify(rep["facet_groups"][0]["facets"]))
|
||||
this.update({
|
||||
find: rep["facet_groups"][0]["facets"]
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
}
|
||||
}else{
|
||||
this.update({
|
||||
find: JSON.parse(localStorage.getItem(`${this.state.filiere}`))
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
async getDetails() {
|
||||
if(!localStorage.getItem(`${this.state.type}`)){
|
||||
try {
|
||||
|
||||
let rep = await fetch(`https://data.enseignementsup-recherche.gouv.fr/api/records/1.0/search/?dataset=fr-esr-parcoursup&q=&sort=tri&facet=fil_lib_voe_acc&refine.form_lib_voe_acc=${this.state.type}&timezone=Europe%2FBerlin`);
|
||||
rep = await rep.json();
|
||||
localStorage.setItem(`${this.state.type}`, JSON.stringify(rep["facet_groups"][0]["facets"]))
|
||||
this.update({
|
||||
find: rep["facet_groups"][0]["facets"]
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
}
|
||||
}else{
|
||||
this.update({
|
||||
find: JSON.parse(localStorage.getItem(`${this.state.type}`))
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
changeFiliere(e) {
|
||||
this.update({
|
||||
filiere: e.target.id,
|
||||
recherche: '',
|
||||
find: ''
|
||||
})
|
||||
this.getType();
|
||||
},
|
||||
|
||||
|
||||
changeType(e) {
|
||||
this.update({
|
||||
type: e.target.id,
|
||||
recherche: '',
|
||||
find: ''
|
||||
})
|
||||
this.getDetails()
|
||||
},
|
||||
|
||||
changeDetail(e){
|
||||
this.update({
|
||||
detail: e.target.id
|
||||
})
|
||||
this.props.isSelected(e.target.id)
|
||||
},
|
||||
|
||||
search(e){
|
||||
this.update({
|
||||
recherche: e.target.value
|
||||
})
|
||||
},
|
||||
|
||||
resetToFili(){
|
||||
this.update({
|
||||
recherche: '',
|
||||
filiere: '',
|
||||
type: '',
|
||||
detail: ''
|
||||
})
|
||||
this.getFili();
|
||||
},
|
||||
|
||||
resetToType(){
|
||||
this.update({
|
||||
recherche: '',
|
||||
detail: '',
|
||||
type: ''
|
||||
})
|
||||
this.getType()
|
||||
},
|
||||
|
||||
resetToDetail(){
|
||||
this.update({
|
||||
recherche: '',
|
||||
detail: ''
|
||||
})
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
</script>
|
||||
</choixformation>
|
25
riot/suiviformation.riot
Normal file
25
riot/suiviformation.riot
Normal file
@ -0,0 +1,25 @@
|
||||
<suiviformation>
|
||||
<div class="content is-large" style="text-align: center;">
|
||||
|
||||
<h4 if={props.formation && !props.type}><a onclick={props.resetToFili}>{props.formation}</a></h4>
|
||||
<h4 if={props.formation && props.type && !props.detail}><a onclick={props.resetToFili}>{props.formation}</a> / <a onclick={props.resetToType}>{props.type}</a></h4>
|
||||
<h4 if={props.formation && props.type && props.detail}><a onclick={props.resetToFili}>{props.formation}</a> / <a onclick={props.resetToType}>{props.type}</a> / <a onclick={props.resetToDetail}>{props.detail}</a></h4>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
export default function todos(){
|
||||
return {
|
||||
onBeforeMount(props, state) {
|
||||
// initial state
|
||||
this.state = {
|
||||
formation: '',
|
||||
type: '',
|
||||
detail: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</suiviformation>
|
Loading…
Reference in New Issue
Block a user