// 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: '', action: function (e, dt, node, config) { dt.columns().visible(true); update_buttons_labels(dt); } }, { text: '🔄', action: function (e, dt, node, config) { localStorage.clear(); console.log("cleared localStorage"); location.reload(); } }, { text: 'Civilité', action: toggle_col_ident_visibility, }, { text: 'Groupes', action: toggle_col_partition_group_visibility, }, { text: 'Groupes et Rg', 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: 'Codes jury', action: toggle_col_but_visibility, }); if ($('table.table_recap').hasClass("apc")) { // Boutons spécifiques à la table JURY BUT buttons.push( { text: 'Compétences', action: toggle_col_but_visibility, }); buttons.push( { text: 'RCUEs', action: toggle_col_but_visibility, }); } } else { // BOUTONS SPECIFIQUES A LA TABLE RECAP NON JURY buttons.push( $('table.table_recap').hasClass("apc") ? { text: 'Ressources', 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: 'SAÉs', 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: 'Vides', action: toggle_col_but_visibility, }); } // Boutons admission (pas en jury) if (!$('table.table_recap').hasClass("jury")) { buttons.push( { text: 'Admission', action: toggle_col_but_visibility, } ); } } // Boutons évaluations (si présentes) if ($('table.table_recap').hasClass("with_evaluations")) { buttons.push( { text: 'Évaluations', 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"); } }); });