forked from ScoDoc/ScoDoc
Affichage référentiel de compétences (contrib Séb. L.)
This commit is contained in:
parent
53630f08de
commit
4477a25147
91
app/static/css/ref-competences.css
Normal file
91
app/static/css/ref-competences.css
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
:host{
|
||||||
|
font-family: Verdana;
|
||||||
|
background: #222;
|
||||||
|
display: block;
|
||||||
|
padding: 12px 32px;
|
||||||
|
color: #FFF;
|
||||||
|
max-width: 1000px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
h1{
|
||||||
|
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
/**********************/
|
||||||
|
/* Zone parcours */
|
||||||
|
/**********************/
|
||||||
|
.parcours{
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
.parcours>div{
|
||||||
|
background: #09c;
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
flex: 1;
|
||||||
|
transition: 0.1s;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
.parcours>div:hover,
|
||||||
|
.competence>div:hover{
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
.parcours>.focus{
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Zone compétences */
|
||||||
|
/**********************/
|
||||||
|
.competences{
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
.competence{
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
.competence>div{
|
||||||
|
padding: 4px 8px;
|
||||||
|
margin-top: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.comp1{background:#a44;}
|
||||||
|
.comp2{background:#84a}
|
||||||
|
.comp3{background:#a84}
|
||||||
|
.comp4{background:#8a4}
|
||||||
|
.comp5{background:#4a8}
|
||||||
|
.comp6{background:#48a}
|
||||||
|
|
||||||
|
.competence>.focus{
|
||||||
|
outline: 2px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************/
|
||||||
|
/* Zone AC */
|
||||||
|
/**********************/
|
||||||
|
h2{
|
||||||
|
display: table;
|
||||||
|
padding: 8px 16px;
|
||||||
|
font-size: 20px;
|
||||||
|
border-radius: 16px 0;
|
||||||
|
}
|
||||||
|
.AC li{
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
align-items: start;
|
||||||
|
gap: 4px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
border-bottom: 1px solid;
|
||||||
|
}
|
||||||
|
.AC li>div:nth-child(1){
|
||||||
|
padding: 2px 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.AC li>div:nth-child(2){
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
93
app/static/js/ref_competences.js
Normal file
93
app/static/js/ref_competences.js
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
class ref_competences extends HTMLElement {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.shadow = this.attachShadow({ mode: 'open' });
|
||||||
|
|
||||||
|
/* Template de base */
|
||||||
|
this.shadow.innerHTML = `
|
||||||
|
<div class=parcours></div>
|
||||||
|
<div class=competences></div>
|
||||||
|
<div class=ACs></div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
/* Style du module */
|
||||||
|
const styles = document.createElement('link');
|
||||||
|
styles.setAttribute('rel', 'stylesheet');
|
||||||
|
styles.setAttribute('href', '/ScoDoc/static/css/ref-competences.css');
|
||||||
|
|
||||||
|
this.shadow.appendChild(styles);
|
||||||
|
}
|
||||||
|
|
||||||
|
set setData(data) {
|
||||||
|
this.data = data;
|
||||||
|
/* this.shadow.querySelector("h1").innerText = "BUT " + data.specialite_long; */
|
||||||
|
this.parcours();
|
||||||
|
}
|
||||||
|
|
||||||
|
parcours() {
|
||||||
|
let parcoursDIV = this.shadow.querySelector(".parcours");
|
||||||
|
Object.entries(this.data.parcours).forEach(([cle, parcours]) => {
|
||||||
|
let div = document.createElement("div");
|
||||||
|
div.innerText = parcours.libelle;
|
||||||
|
div.addEventListener("click", (event) => { this.competences(event, cle) })
|
||||||
|
parcoursDIV.appendChild(div);
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
competences(event, cle) {
|
||||||
|
this.shadow.querySelector(".parcours>.focus")?.classList.remove("focus");
|
||||||
|
event.currentTarget.classList.add("focus");
|
||||||
|
|
||||||
|
/* Récupère une liste plate de toutes les compentences de toutes les années */
|
||||||
|
let bucketCompetences = [
|
||||||
|
Object.keys(this.data.parcours[
|
||||||
|
Object.keys(this.data.parcours)[0]
|
||||||
|
].annees[1].competences)
|
||||||
|
, Object.keys(this.data.parcours[cle].annees[2].competences)
|
||||||
|
, Object.keys(this.data.parcours[cle].annees[3].competences)
|
||||||
|
].flat();
|
||||||
|
|
||||||
|
/* Compte le nombre d'occurence de chaque compétence */
|
||||||
|
let competences = {};
|
||||||
|
bucketCompetences.forEach(competence => {
|
||||||
|
competences[competence] = ++competences[competence] || 1
|
||||||
|
})
|
||||||
|
|
||||||
|
/* Affichage */
|
||||||
|
let numComp = 1;
|
||||||
|
this.shadow.querySelector(".competences").innerHTML = "";
|
||||||
|
Object.entries(competences).forEach(([competence, nb]) => {
|
||||||
|
var divCompetence3ans = document.createElement("div");
|
||||||
|
divCompetence3ans.className = "competence";
|
||||||
|
let numTmp = numComp;
|
||||||
|
for (let i = 0; i < nb; i++) {
|
||||||
|
let divCompetence = document.createElement("div");
|
||||||
|
divCompetence.innerText = `${competence} ${i + 1}`;
|
||||||
|
divCompetence.className = "comp" + numTmp;
|
||||||
|
divCompetence.addEventListener("click", (event) => { this.AC(event, competence, numTmp, i + 1) })
|
||||||
|
divCompetence3ans.appendChild(divCompetence);
|
||||||
|
}
|
||||||
|
this.shadow.querySelector(".competences").appendChild(divCompetence3ans);
|
||||||
|
numComp++;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
AC(event, competence, numComp, annee) {
|
||||||
|
event.currentTarget.classList.toggle("focus");
|
||||||
|
if (this.shadow.querySelector(`[data-competence="${competence} ${annee}"]`)) {
|
||||||
|
this.shadow.querySelector(`[data-competence="${competence} ${annee}"]`).remove();
|
||||||
|
} else {
|
||||||
|
let output = `
|
||||||
|
<ul class=AC data-competence="${competence} ${annee}">
|
||||||
|
<h2 class=comp${numComp}>${competence} ${annee}</h2>
|
||||||
|
`;
|
||||||
|
Object.entries(this.data.competences[competence].niveaux["BUT" + annee].app_critiques).forEach(([num, contenu]) => {
|
||||||
|
output += `<li><div class=comp${numComp}>${num}</div><div>${contenu.libelle}</div></li>`;
|
||||||
|
})
|
||||||
|
this.shadow.querySelector(".ACs").innerHTML += output + "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
customElements.define('ref-competences', ref_competences);
|
@ -1,17 +1,40 @@
|
|||||||
{# -*- mode: jinja-html -*- #}
|
{# -*- mode: jinja-html -*- #}
|
||||||
{% extends "sco_page.html" %}
|
{% extends "sco_page.html" %}
|
||||||
|
{% block styles %}
|
||||||
|
{{super()}}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block app_content %}
|
{% block app_content %}
|
||||||
<h2>Référentiel de compétences {{ref.type_titre}} {{ref.specialite_long}}</h2>
|
<h2>Référentiel de compétences {{ref.type_titre}} {{ref.specialite_long}}</h2>
|
||||||
|
|
||||||
<div>
|
|
||||||
|
|
||||||
Chargé le {{ref.scodoc_date_loaded.strftime("%d/%m/%Y à %H:%M") if ref.scodoc_date_loaded else ""}} à partir du fichier <tt>{{ref.scodoc_orig_filename or "(inconnu)"}}</tt>.
|
<ref-competences></ref-competences>
|
||||||
|
|
||||||
|
<script src="/ScoDoc/static/js/ref_competences.js"></script>
|
||||||
|
|
||||||
|
<div class="help">
|
||||||
|
Référentiel chargé le {{ref.scodoc_date_loaded.strftime("%d/%m/%Y à %H:%M") if ref.scodoc_date_loaded else ""}} à partir du fichier <tt>{{ref.scodoc_orig_filename or "(inconnu)"}}</tt>.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="part2">
|
<div class="part2">
|
||||||
<a class="stdlink" href="{{url_for('notes.refcomp_table', scodoc_dept=g.scodoc_dept)}}">revenir à la liste des référentiels</a>
|
<a class="stdlink"
|
||||||
|
href="{{url_for('notes.refcomp_table', scodoc_dept=g.scodoc_dept)}}"
|
||||||
|
>revenir à la liste des référentiels</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block scripts %}
|
||||||
|
{{super()}}
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
let data_url = "{{data_source}}";
|
||||||
|
$.getJSON(data_url, function (data) {
|
||||||
|
document.querySelector("ref-competences").setData = data;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -49,8 +49,12 @@
|
|||||||
{{ moment.lang(g.locale) }}
|
{{ moment.lang(g.locale) }}
|
||||||
<script src="/ScoDoc/static/libjs/menu.js"></script>
|
<script src="/ScoDoc/static/libjs/menu.js"></script>
|
||||||
<script src="/ScoDoc/static/libjs/bubble.js"></script>
|
<script src="/ScoDoc/static/libjs/bubble.js"></script>
|
||||||
<script src="/ScoDoc/static/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
|
<script src="/ScoDoc/static/jQuery/jquery.js"></script>
|
||||||
|
<script src="/ScoDoc/static/jQuery/jquery-migrate-1.2.0.min.js"></script>
|
||||||
|
<script src="/ScoDoc/static/libjs/jquery.field.min.js"></script>
|
||||||
<script src="/ScoDoc/static/libjs/jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.min.js"></script>
|
<script src="/ScoDoc/static/libjs/jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.min.js"></script>
|
||||||
|
<script src="/ScoDoc/static/libjs/qtip/jquery.qtip-3.0.3.min.js"></script>
|
||||||
|
|
||||||
<script src="/ScoDoc/static/js/scodoc.js"></script>
|
<script src="/ScoDoc/static/js/scodoc.js"></script>
|
||||||
<script src="/ScoDoc/static/DataTables/datatables.min.js"></script>
|
<script src="/ScoDoc/static/DataTables/datatables.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
@ -49,6 +49,11 @@ def refcomp_show(refcomp_id):
|
|||||||
ref=ref,
|
ref=ref,
|
||||||
title="Référentiel de compétences",
|
title="Référentiel de compétences",
|
||||||
sco=ScoData(),
|
sco=ScoData(),
|
||||||
|
data_source=url_for(
|
||||||
|
"notes.refcomp",
|
||||||
|
scodoc_dept=g.scodoc_dept,
|
||||||
|
refcomp_id=refcomp_id,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user