";
arrayPartitions.forEach((partition) => {
@@ -168,6 +159,58 @@
document.querySelector("#zoneChoix>.etudiants").innerHTML = output;
}
+ function templateFiltres_partition(partition) {
+ let div = document.createElement("div");
+ div.dataset.idpartition = partition.id;
+ if (partition.groups_editable == false) {
+ div.classList.add("nonEditable");
+ }
+ div.innerHTML = `
+
+
`;
+
+ div.querySelector(".move").addEventListener("mousedown", moveStart);
+ div.querySelector(".modif").addEventListener("click", editText);
+ div.querySelector(".suppr").addEventListener("click", suppr);
+ div.querySelector(".onoff").addEventListener("click", masquerPartitions);
+ div.querySelector("[data-idgroupe]").addEventListener("click", filtre);
+ div.querySelector(".ajoutGroupe").addEventListener("click", addGroupe);
+
+ return div;
+ }
+
+ function templateFiltres_groupe(groupe) {
+ let div = document.createElement("div");
+ div.dataset.idgroupe = groupe.id;
+ div.innerHTML = `
+
`;
+
+ div.addEventListener("click", filtre);
+ div.querySelector(".move").addEventListener("mousedown", moveStart);
+ div.querySelector(".modif").addEventListener("click", editText);
+ div.querySelector(".suppr").addEventListener("click", suppr);
+
+ return div;
+ }
+
function templateGroupe_zoneGroupes(idGroupe, name) {
return `
${name}
@@ -179,6 +222,24 @@
return `
${etudiant.nom_disp} ${etudiant.prenom}
`
}
+ function listeGroupesAutoaffectation() {
+ let output = '
';
+
+ document.querySelectorAll('#zonePartitions .filtres>div').forEach(partition => {
+
+ output += `
";
+
+ })
+
+ document.querySelector("#affectationFrom").innerHTML = output;
+ document.querySelector("#affectationTo").innerHTML = output;
+
+ }
+
/******************************/
/* Gestionnaire d'événements */
/******************************/
@@ -187,11 +248,11 @@
if (!editing) {
document.querySelector("body").classList.toggle("editionActivated");
return;
- }
+ }
this.checked = true;
- if(!editing.classList.contains("highlight")) {
+ if (!editing.classList.contains("highlight")) {
editing.classList.add("highlight");
- setTimeout(()=>{editing.classList.remove("highlight")}, 1000);
+ setTimeout(() => { editing.classList.remove("highlight") }, 1000);
}
}
function processEvents() {
@@ -199,26 +260,25 @@
/* Edition partitions */
/*--------------------*/
document.querySelector(".edition>input").addEventListener("input", setEditMode);
- document.querySelectorAll(".ajoutPartition, .ajoutGroupe").forEach(btnPlus => { btnPlus.addEventListener("click", addPartition) })
- document.querySelectorAll(".modif").forEach(btn => { btn.addEventListener("click", editText) })
- document.querySelectorAll(".suppr").forEach(btn => { btn.addEventListener("click", suppr) })
- document.querySelectorAll(".move").forEach(btn => { btn.addEventListener("mousedown", moveStart) })
-
- /*---------*/
- /* Filtres */
- /*---------*/
- document.querySelectorAll(".filtres>div>div>div>div:not(.editing)").forEach(btn => { btn.addEventListener("click", filtre) })
+ document.querySelectorAll(".ajoutPartition").forEach(btnPlus => { btnPlus.addEventListener("click", addPartition) })
/*--------------------*/
/* Changement groupe */
/*--------------------*/
document.querySelectorAll("label").forEach(btn => { btn.addEventListener("mousedown", (event) => { event.preventDefault() }) });
document.querySelectorAll(".etudiants input").forEach(input => { input.addEventListener("input", assignment) })
+ document.querySelector(".affectationGo").addEventListener("click", affectationGo);
}
/**********************/
/* Filtrage */
/**********************/
+ function masquerPartitions() {
+ let idPartition = this.closest("[data-idpartition]").dataset.idpartition;
+ document.querySelectorAll(`[data-idpartition="${idPartition}"]`).forEach(e => {
+ e.classList.toggle("hide");
+ })
+ }
function filtre() {
if (document.querySelector("body").classList.contains("editionActivated")) {
return;
@@ -241,7 +301,7 @@
})
}
- if (!this.dataset.idgroupe) {
+ /*if (!this.dataset.idgroupe) {
// Partitions
let groupesSelected = [];
this.parentElement.querySelectorAll(":not(.unselect)").forEach(e => {
@@ -257,39 +317,51 @@
e.classList.add("hide")
}
})
- } else {
- // Groupes
- let groupesSelected = {};
+ } else {*/
+ // Groupes
+ let groupesSelected = {};
- this.parentElement.parentElement.querySelectorAll("[data-idgroupe]:not(.unselect)").forEach(e => {
- let idpartition = e.parentElement.dataset.idpartition;
- if (!groupesSelected[idpartition]) {
- groupesSelected[idpartition] = [];
- }
- groupesSelected[idpartition].push(e.dataset.idgroupe)
- })
- document.querySelectorAll("#zoneChoix .etudiants>div").forEach(e => {
- let found = true;
- Object.entries(groupesSelected).forEach(([idpartition, tabGroupes]) => {
- if (!tabGroupes.includes(
- e.querySelector(`[data-idpartition="${idpartition}"] input:checked`).value
- )
- ) {
- found = false
- }
- })
-
- if (found) {
- e.classList.remove("hide")
- } else {
- e.classList.add("hide")
+ this.parentElement.parentElement.querySelectorAll("[data-idgroupe]:not(.unselect)").forEach(e => {
+ let idpartition = e.parentElement.dataset.idpartition;
+ if (!groupesSelected[idpartition]) {
+ groupesSelected[idpartition] = [];
+ }
+ groupesSelected[idpartition].push(e.dataset.idgroupe)
+ })
+ document.querySelectorAll("#zoneChoix .etudiants>div").forEach(e => {
+ let found = true;
+ Object.entries(groupesSelected).forEach(([idpartition, tabGroupes]) => {
+ if (!tabGroupes.includes(
+ e.querySelector(`[data-idpartition="${idpartition}"] input:checked`).value
+ )
+ ) {
+ found = false
}
})
- }
+
+ if (found) {
+ e.classList.remove("hide")
+ } else {
+ e.classList.add("hide")
+ }
+ })
+ //}
}
/****************************/
/* Affectation à un groupe */
/****************************/
+ function affectationGo(){
+ let from = document.querySelector("#affectationFrom").value;
+ let to = document.querySelector("#affectationTo").value;
+
+ if(!from || !to){
+ return;
+ }
+
+ document.querySelectorAll(`#zoneChoix .etudiants [value="${from}"]:checked`).forEach(groupeSelected=>{
+ groupeSelected.closest(".grpPartitions").querySelector(`[value="${to}"]`).click();
+ })
+ }
function assignment() {
let groupe = this.parentElement.parentElement.parentElement.parentElement;
let nom = groupe.children[0].dataset.nom;
@@ -346,32 +418,12 @@
/****************************/
function addPartition() {
let date = new Date;
- if (this.classList.contains("ajoutPartition")) {
- // Partition
- var name = "Nouvelle " + date.getSeconds();
- let params = (new URL(document.location)).searchParams;
- let formsemestre_id = params.get('formsemestre_id');
- var url = "/ScoDoc/{{formsemestre.departement.acronym}}/api/formsemestre/" + formsemestre_id + "/partition/create";
- var payload = { partition_name: name };
- } else {
- // Groupe
- var name = "Nouveau " + date.getSeconds();
- var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/partition/${this.parentElement.dataset.idpartition}/group/create`;
- var payload = { group_name: name };
- }
- var div = document.createElement("div");
- div.innerHTML = `
-
||
-
${name}
-
✏️
-
❌`;
- div.querySelector(".modif").addEventListener("click", editText);
- div.querySelector(".suppr").addEventListener("click", suppr);
- div.querySelector(".move").addEventListener("mousedown", moveStart);
- this.parentElement.insertBefore(div, this);
-
- div.querySelector(".modif").click();
+ var name = "Nouvelle " + date.getSeconds();
+ let params = (new URL(document.location)).searchParams;
+ let formsemestre_id = params.get('formsemestre_id');
+ var url = "/ScoDoc/{{formsemestre.departement.acronym}}/api/formsemestre/" + formsemestre_id + "/partition/create";
+ var payload = { partition_name: name };
// Save
fetch(url,
@@ -390,76 +442,110 @@
div.remove();
return;
}
- if (this.classList.contains("ajoutPartition")) {
- div.dataset.idpartition = r.id;
- // Ajout dans la zone masques
- div = document.createElement("div");
- div.dataset.idpartition = r.id;
- div.innerHTML = `
-
Non affectés - ${name}
-
+
`;
-
- div.querySelector("div").addEventListener("click", filtre);
- div.querySelector(".ajoutGroupe").addEventListener("click", addPartition);
-
- document.querySelector("#zonePartitions .masques>div").appendChild(div);
-
- // Ajout de la zone pour chaque étudiant
- let outputGroupes = "";
-
- document.querySelectorAll("#zoneChoix .grpPartitions").forEach(e => {
- let etudid = e.previousElementSibling.dataset.etudid;
-
- // Préparation pour la section suivante
- let etudiant = {
- etudid: etudid,
- nom_disp: e.previousElementSibling.dataset.nom,
- prenom: e.previousElementSibling.dataset.prenom
- }
- outputGroupes += templateEtudiant_zoneGroupes(etudiant);
- ////////////////////////
-
- let div = document.createElement("div");
- div.className = "partition";
- div.dataset.idpartition = r.id;
- div.innerHTML = `
-
${name}
-
- `;
- div.querySelector("input").addEventListener("input", assignment);
- e.appendChild(div);
- });
-
- // Ajout de la zone groupes
- document.querySelector("#zoneGroupes>.groupes").innerHTML += `
-
-
${name}
-
-
Non affecté(s)
-
${outputGroupes}
-
-
`;
- } else {
- div.dataset.idgroupe = r.id;
-
- // Ajout du bouton pour chaque étudiant
- let idpartition = this.parentElement.dataset.idpartition;
- document.querySelectorAll(`#zoneChoix .etudiants [data-idpartition="${idpartition}"]`).forEach(e => {
- let etudid = e.parentElement.parentElement.dataset.etudid;
- let label = document.createElement("label");
- label.innerHTML = `
${name}`;
- label.querySelector("input").addEventListener("input", assignment);
- e.appendChild(label);
- })
-
- // Ajout du groupe dans la zone Groupes
- document.querySelector(`#zoneGroupes .partition[data-idpartition="${idpartition}"]`).innerHTML += templateGroupe_zoneGroupes(r.id, name);
+ // Ajout dans la zone filtres
+ let partition = {
+ id: r.id,
+ partition_name: name
}
+ let divPartition = templateFiltres_partition(partition);
+ document.querySelector("#zonePartitions .filtres").appendChild(divPartition);
+ divPartition.querySelector(".modif").click();
+
+ // Ajout de la zone pour chaque étudiant
+ let outputGroupes = "";
+
+ document.querySelectorAll("#zoneChoix .grpPartitions").forEach(e => {
+ let etudid = e.previousElementSibling.dataset.etudid;
+
+ // Préparation pour la section suivante
+ let etudiant = {
+ etudid: etudid,
+ nom_disp: e.previousElementSibling.dataset.nom,
+ prenom: e.previousElementSibling.dataset.prenom
+ }
+ outputGroupes += templateEtudiant_zoneGroupes(etudiant);
+ ////////////////////////
+
+ let div = document.createElement("div");
+ div.className = "partition";
+ div.dataset.idpartition = r.id;
+ div.innerHTML = `
+
${name}
+
+ `;
+ div.querySelector("input").addEventListener("input", assignment);
+ e.appendChild(div);
+ });
+
+ // Ajout de la zone groupes
+ document.querySelector("#zoneGroupes>.groupes").innerHTML += `
+
+
${name}
+
+
Non affecté(s)
+
${outputGroupes}
+
+
`;
+
+ listeGroupesAutoaffectation();
+ })
+ .catch(error => {
+ document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
+ })
+ }
+
+ function addGroupe() {
+ let date = new Date;
+ // Groupe
+ var name = "Nouveau " + date.getSeconds();
+ let idPartition = this.parentElement.previousElementSibling.dataset.idpartition;
+ var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/partition/${idPartition}/group/create`;
+ var payload = { group_name: name };
+
+ fetch(url,
+ {
+ method: "POST",
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(payload)
+ })
+ .then(r => { return r.json() })
+ .then(r => {
+ if (r.message == "invalid partition_name" || r.message == "invalid group_name") {
+ message("Le nom " + name + " existe déjà");
+ return;
+ }
+
+ let groupe = {
+ id: r.id,
+ group_name: name
+ }
+ let divGroupe = templateFiltres_groupe(groupe);
+ this.parentElement.insertBefore(divGroupe, this);
+
+ // Ajout du bouton pour chaque étudiant
+ document.querySelectorAll(`#zoneChoix .etudiants [data-idpartition="${idPartition}"]`).forEach(e => {
+ let etudid = e.parentElement.previousElementSibling.dataset.etudid;
+ let label = document.createElement("label");
+ label.innerHTML = `
${name}`;
+ label.querySelector("input").addEventListener("input", assignment);
+ e.appendChild(label);
+ })
+
+ // Ajout du groupe dans la zone Groupes
+ document.querySelector(`#zoneGroupes .partition[data-idpartition="${idPartition}"]`).innerHTML += templateGroupe_zoneGroupes(r.id, name);
+
+ // Lancement de l'édition du nom
+ divGroupe.querySelector(".modif").click();
+
+ listeGroupesAutoaffectation();
})
.catch(error => {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
@@ -474,6 +560,7 @@
e.classList.add("editingText");
e.setAttribute("contenteditable", "true");
e.addEventListener("keydown", writing);
+ e.addEventListener("focusout", () => { saveEditing(this.previousElementSibling) });
// On sélectionne la zone
const range = document.createRange();
@@ -506,7 +593,6 @@
var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/partition/${obj.parentElement.dataset.idpartition}/edit`;
var payload = { partition_name: obj.innerText }
- document.querySelector(`.masques [data-idpartition="${obj.parentElement.dataset.idpartition}"][data-idgroupe="aucun"]`).innerText = "Non affectés - " + obj.innerText;
document.querySelectorAll(`#zoneChoix .etudiants [data-idpartition="${obj.parentElement.dataset.idpartition}"]>div`).forEach(e => { e.innerText = obj.innerText });
document.querySelector(`#zoneGroupes [data-idpartition="${obj.parentElement.dataset.idpartition}"]>h3`).innerText = obj.innerText;
} else {
@@ -531,6 +617,7 @@
if (!r) {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
}
+ listeGroupesAutoaffectation();
})
.catch(error => {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
@@ -586,6 +673,7 @@
if (r.OK != true) {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
}
+ listeGroupesAutoaffectation();
})
}
@@ -600,14 +688,21 @@
function moveStart(event) {
moveData.x = event.pageX;
moveData.y = event.pageY;
- moveData.element = this.parentElement;
+ if (this.parentElement.dataset.idpartition) {
+ moveData.element = this.parentElement.parentElement;
+ } else {
+ moveData.element = this.parentElement;
+ }
moveData.element.classList.add("moving");
moveData.element.parentElement.classList.add('grabbing');
document.body.addEventListener("mousemove", move);
- moveData.element.parentElement.querySelectorAll("div:not([data-idgroupe=aucun])").forEach(e => {
- e.addEventListener("mouseup", newPosition)
- })
document.body.addEventListener("mouseup", moveEnd);
+ Array.from(moveData.element.parentElement.children).forEach(e => {
+ if ((e.dataset.idpartition && e.classname != "nonEditable") ||
+ (e.dataset.idgroupe != "aucun")) {
+ e.addEventListener("mouseup", newPosition)
+ }
+ })
}
function move(event) {
@@ -621,24 +716,28 @@
moveData.element.parentElement.classList.remove('grabbing');
moveData.element.style.transform = "";
moveData.element.classList.remove("moving");
- moveData.element.parentElement.querySelectorAll("div:not([data-idgroupe=aucun])").forEach(e => {
- e.removeEventListener("mouseup", newPosition)
+ Array.from(moveData.element.parentElement.children).forEach(e => {
+ if ((e.dataset.idpartition && e.classname != "nonEditable") ||
+ (e.dataset.idgroupe && e.dataset.idgroupe != "aucun")) {
+ e.removeEventListener("mouseup", newPosition)
+ }
})
moveData = {};
}
- function newPosition() {
+ function newPosition(event) {
moveData.element.parentElement.insertBefore(moveData.element, this);
let positions = [];
Array.from(moveData.element.parentElement.children).forEach(e => {
- if ((e.dataset.idpartition && e.dataset.idgroupe != "aucun") || (e.dataset.idgroupe && e.dataset.idgroupe != "aucun")) {
- positions.push(parseInt(e.dataset.idgroupe || e.dataset.idpartition))
+ if ((e.dataset.idpartition && e.classname != "nonEditable") ||
+ (e.dataset.idgroupe && e.dataset.idgroupe != "aucun")) {
+ positions.push(parseInt(e.dataset.idpartition || e.dataset.idgroupe))
}
})
// Save positions
- if (this.parentElement.parentElement.parentElement.className == "partitions") {
+ if (this.dataset.idpartition) {
let params = (new URL(document.location)).searchParams;
let formsemestre_id = params.get('formsemestre_id');
var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/formsemestre/${formsemestre_id}/partitions/order`;
@@ -659,14 +758,15 @@
})
})
} else {
- var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/partition/${this.parentElement.dataset.idpartition}/groups/order`;
+ let idPartition = this.closest("[data-idpartition]").dataset.idpartition;
+ var url = `/ScoDoc/{{formsemestre.departement.acronym}}/api/partition/${idPartition}/groups/order`;
- document.querySelectorAll(`#zoneChoix .etudiants .partition[data-idpartition="${this.parentElement.dataset.idpartition}"]`).forEach(partition => {
+ document.querySelectorAll(`#zoneChoix .etudiants .partition[data-idpartition="${idPartition}"]`).forEach(partition => {
positions.forEach(position => {
partition.append(partition.querySelector(`[value="${position}"]`).parentElement)
})
})
- document.querySelectorAll(`#zoneGroupes .partition[data-idpartition="${this.parentElement.dataset.idpartition}"]`).forEach(partition => {
+ document.querySelectorAll(`#zoneGroupes .partition[data-idpartition="${idPartition}"]`).forEach(partition => {
positions.forEach(position => {
partition.append(partition.querySelector(`[data-idgroupe="${position}"]`))
})
@@ -687,11 +787,11 @@
if (!r) {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
}
+ listeGroupesAutoaffectation();
})
.catch(error => {
document.querySelector("main").innerHTML = "
Une erreur s'est produite lors de la sauvegarde des données.
";
})
-
}
/*************************/