// 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); } } } // 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) { // si le group (= la 1ere col.) est visible, but_on if (dt.columns("." + group).visible()[0]) { but.classList.add("but_on"); but.classList.remove("but_off"); } else { but.classList.add("but_off"); but.classList.remove("but_on"); } } } }); } // 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); } // 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">✴</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">🔄</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_but_visibility, }, { text: '<span data-group="partition_rangs"><a title="Rangs dans les groupes (si activés dans les partitions concernées)">Rg</a></span>', action: toggle_col_but_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"); } }); // Ajoute bulle aide sur colonne RCUEs $(function () { // explication colonne RCUEs let th = document.querySelector( "table.table_recap.apc th.col_rcues_validables" ); th.title = "RCUEs validables avec ces notes"; }); });