ScoDoc-Lille/app/static/js/table_recap.js

376 lines
16 KiB
JavaScript

// Tableau recap notes
$(function () {
$(function () {
if ($('table.table_recap').length == 0) { return; }
let hidden_colums = [
"etud_codes", "identite_detail",
"partition_aux", "partition_rangs", "admission",
"col_empty"
];
// Etat (tri des colonnes) de la table:
const url = new URL(document.URL);
const formsemestre_id = url.searchParams.get("formsemestre_id");
const order_info_key = JSON.stringify([url.pathname, formsemestre_id]);
const etudids_key = JSON.stringify(["etudids", url.origin, formsemestre_id]);
const noms_key = JSON.stringify(["noms", url.origin, formsemestre_id]);
let order_info;
if (formsemestre_id) {
const x = localStorage.getItem(order_info_key);
if (x) {
try {
order_info = JSON.parse(x);
} catch (error) {
console.error(error);
}
}
}
const GROUP_RANK_NONE = 0;
const GROUP_RANK_GROUP_ONLY = 1;
const GROUP_RANK_ALL =2;
function button_on(but) {
but.classList.add("but_on");
but.classList.remove("but_off")
}
function button_off(but) {
but.classList.add("but_off");
but.classList.remove("but_on")
}
function update_buttons_group_rank(dt, status, group, but) {
console.log(" >>>> " + status + " => " + group);
if (status == GROUP_RANK_NONE) {
console.log("off");
button_off(but);
} else if (status == GROUP_RANK_ALL) {
console.log("on");
button_on(but);
} else { // GROUP_RANK_GROUP_ONLY
if (group == "partition_aux") {
console.log("on");
button_on(but);
} else {
console.log("off");
button_off(but);
}
}
}
function test_group_rank_visibility(dt) {
if (! dt.columns(".partition_aux").visible()[0]) {
return GROUP_RANK_NONE;
}
if (dt.columns(".partition_rangs").visible()[0]) {
return GROUP_RANK_ALL
}
return GROUP_RANK_GROUP_ONLY;
}
function set_group_rank_visibility(dt, status) {
let group_but = document.querySelector("button.dt-button.partition_aux");
let rang_but = document.querySelector("button.dt-button.partition_rangs");
switch (status) {
case GROUP_RANK_ALL:
dt.columns('.partition_aux').visible(true);
dt.columns('.partition_rangs').visible(true);
break;
case GROUP_RANK_GROUP_ONLY:
dt.columns('.partition_aux').visible(true);
dt.columns('.partition_rangs').visible(false);
break;
case GROUP_RANK_NONE:
dt.columns('.partition_aux').visible(false);
dt.columns('.partition_rangs').visible(false);
break;
}
}
// Les colonnes visibles sont mémorisées, il faut initialiser l'état des boutons
function update_buttons_labels(dt) {
// chaque bouton controle une classe stockée dans le data-group du span
document.querySelectorAll("button.dt-button").forEach(but => {
let g_span = but.querySelector("span > span");
if (g_span) {
let group = g_span.dataset["group"];
if (group) {
if ((group == "partition_aux") || (group == "partition_rangs")) {
status = test_group_rank_visibility(dt);
console.log("update: " + group + "(" + status + ")");
update_buttons_group_rank(dt, status, group, but);
// group hors partition/rang => si le group (= la 1ere col.) est visible, but_on
} else if (dt.columns("." + group).visible()[0]) {
button_on(but);
} else {
button_off(but);
}
}
}
});
}
// Changement visibilité groupes colonnes (boutons)
function toggle_col_but_visibility(e, dt, node, config) {
let group = node.children()[0].firstChild.dataset.group;
toggle_col_group_visibility(dt, group, node.hasClass("but_on"));
}
function toggle_col_ident_visibility(e, dt, node, config) {
let onoff = node.hasClass("but_on");
toggle_col_group_visibility(dt, "identite_detail", onoff);
toggle_col_group_visibility(dt, "identite_court", !onoff);
}
function toggle_col_ressources_visibility(e, dt, node, config) {
let onoff = node.hasClass("but_on");
toggle_col_group_visibility(dt, "col_res", onoff);
toggle_col_group_visibility(dt, "col_ue_bonus", onoff);
toggle_col_group_visibility(dt, "col_malus", onoff);
}
function toggle_col_group_visibility(dt, group, onoff) {
if (onoff) {
dt.columns('.' + group).visible(false);
} else {
dt.columns('.' + group).visible(true);
}
update_buttons_labels(dt);
}
function toggle_col_partition_group_visibility(e, dt, node, config) {
let status = test_group_rank_visibility(dt);
switch (status) {
case GROUP_RANK_NONE:
set_group_rank_visibility(dt, GROUP_RANK_GROUP_ONLY);
break;
case GROUP_RANK_ALL:
set_group_rank_visibility(dt, GROUP_RANK_GROUP_ONLY)
break;
case GROUP_RANK_GROUP_ONLY:
set_group_rank_visibility(dt, GROUP_RANK_NONE);
break;
}
update_buttons_labels(dt);
}
function toggle_col_partition_rank_visibility(e, dt, node, config) {
let status = test_group_rank_visibility(dt);
switch (status) {
case GROUP_RANK_NONE:
set_group_rank_visibility(dt, GROUP_RANK_ALL);
break;
case GROUP_RANK_ALL:
set_group_rank_visibility(dt, GROUP_RANK_NONE)
break;
case GROUP_RANK_GROUP_ONLY:
set_group_rank_visibility(dt, GROUP_RANK_ALL);
break;
}
update_buttons_labels(dt);
}
// Definition des boutons au dessus de la table:
let buttons = [
{
extend: 'copyHtml5',
text: 'Copier',
exportOptions: { orthogonal: 'export' }
},
{
extend: 'excelHtml5',
// footer: true, // ne fonctionne pas ?
exportOptions: { orthogonal: 'export' },
title: document.querySelector('table.table_recap').dataset.filename
},
{
// force affichage de toutes les colonnes
text: '<a title="Afficher toutes les colonnes">&#10036;</a>',
action: function (e, dt, node, config) {
dt.columns().visible(true);
update_buttons_labels(dt);
}
},
{
text: '<a title="Rétablir l\'affichage par défaut" class="clearreload">&#128260;</a>',
action: function (e, dt, node, config) {
localStorage.clear();
console.log("cleared localStorage");
location.reload();
}
},
{
text: '<span data-group="identite_detail">Civilité</span>',
action: toggle_col_ident_visibility,
},
{
text: '<span data-group="partition_aux"><a title="Affichage des groupes secondaires (la première partition est toujours affichée)">Groupes</a></span>',
action: toggle_col_partition_group_visibility,
},
{
text: '<span data-group="partition_rangs"><a title="Rangs dans les groupes (si activés dans les partitions concernées)">Groupes et Rg</a></span>',
action: toggle_col_partition_rank_visibility,
},
]; // fin des boutons communs à toutes les tables recap
if ($('table.table_recap').hasClass("jury")) {
// Table JURY:
// avec ou sans codes enregistrés
buttons.push(
{
text: '<span data-group="recorded_code">Codes jury</span>',
action: toggle_col_but_visibility,
});
if ($('table.table_recap').hasClass("apc")) {
// Boutons spécifiques à la table JURY BUT
buttons.push(
{
text: '<span data-group="cursus_but">Compétences</span>',
action: toggle_col_but_visibility,
});
buttons.push(
{
text: '<span data-group="col_rcue">RCUEs</span>',
action: toggle_col_but_visibility,
});
}
} else {
// BOUTONS SPECIFIQUES A LA TABLE RECAP NON JURY
buttons.push(
$('table.table_recap').hasClass("apc") ?
{
text: '<span data-group="col_res">Ressources</span>',
action: toggle_col_ressources_visibility,
} : {
name: "toggle_mod",
text: "Cacher les modules",
action: function (e, dt, node, config) {
let onoff = node.hasClass("but_on");
toggle_col_group_visibility(dt, "col_mod:not(.col_empty)", onoff);
toggle_col_group_visibility(dt, "col_ue_bonus", onoff);
toggle_col_group_visibility(dt, "col_malus", onoff);
}
}
);
if ($('table.table_recap').hasClass("apc")) {
buttons.push({
text: '<span data-group="col_sae">SAÉs</span>',
action: toggle_col_but_visibility,
});
}
// S'il y a des colonnes vides:
if ($('table.table_recap td.col_empty').length > 0) {
buttons.push({ // modules vides
text: '<span data-group="col_empty">Vides</span>',
action: toggle_col_but_visibility,
});
}
// Boutons admission (pas en jury)
if (!$('table.table_recap').hasClass("jury")) {
buttons.push(
{
text: '<span data-group="admission">Admission</span>',
action: toggle_col_but_visibility,
}
);
}
}
// Boutons évaluations (si présentes)
if ($('table.table_recap').hasClass("with_evaluations")) {
buttons.push(
{
text: '<span data-group="eval">Évaluations</span>',
action: toggle_col_but_visibility,
}
);
}
// ------------- LA TABLE ---------
try {
let table = $('table.table_recap').DataTable(
{
paging: false,
searching: true,
info: false,
autoWidth: false,
fixedHeader: {
header: true,
footer: false
},
orderCellsTop: true, // cellules ligne 1 pour tri
aaSorting: [], // Prevent initial sorting
colReorder: true,
stateSave: true, // enregistre état de la table (tris, ...)
"columnDefs": [
{
// cache les codes, le détail de l'identité, les groupes, les colonnes admission et les vides
targets: hidden_colums,
visible: false,
},
{
// Elimine les 0 à gauche pour les exports excel et les "copy"
targets: ["col_mod", "col_moy_gen", "col_moy_ue", "col_res", "col_sae", "evaluation", "col_rcue"],
render: function (data, type, row) {
return type === 'export' ? data.replace(/0(\d\..*)/, '$1') : data;
}
},
{
// Elimine les "+"" pour les exports
targets: ["col_ue_bonus", "col_malus"],
render: function (data, type, row) {
return type === 'export' ? data.replace(/.*\+(\d?\d?\.\d\d).*/m, '$1').replace(/0(\d\..*)/, '$1') : data;
}
},
{
// Elimine emoji warning sur UEs
targets: ["col_ues_validables"],
render: function (data, type, row) {
return type === 'export' ? data.replace(/(\d+\/\d+).*/, '$1') : data;
}
}
],
dom: 'Bfrtip',
buttons: buttons,
"drawCallback": function (settings) {
// permet de conserver l'ordre de tri des colonnes
let table = $('table.table_recap').DataTable();
let order_info = JSON.stringify(table.order());
if (formsemestre_id) {
localStorage.setItem(order_info_key, order_info);
}
let etudids = [];
document.querySelectorAll("td.identite_court").forEach(e => {
etudids.push(e.dataset.etudid);
});
let noms = [];
document.querySelectorAll("td.identite_court").forEach(e => {
noms.push(e.dataset.nomprenom);
});
localStorage.setItem(etudids_key, JSON.stringify(etudids));
localStorage.setItem(noms_key, JSON.stringify(noms));
},
"order": order_info,
}
);
update_buttons_labels(table);
} catch (error) {
// l'erreur peut etre causee par un ancien storage:
localStorage.removeItem(etudids_key);
localStorage.removeItem(noms_key);
localStorage.removeItem(order_info_key);
location.reload();
}
});
$('table.table_recap tbody').on('click', 'tr', function () {
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
}
else {
$('table.table_recap tr.selected').removeClass('selected');
$(this).addClass('selected');
}
});
// Pour montrer et surligner l'étudiant sélectionné:
$(function () {
let row_selected = document.querySelector(".row_selected");
if (row_selected) {
row_selected.scrollIntoView();
window.scrollBy(0, -125);
row_selected.classList.add("selected");
}
});
});