diff --git a/assets/src/js/functions/datatables.js b/assets/src/js/functions/datatables.js index 09258abfb..969d9f135 100755 --- a/assets/src/js/functions/datatables.js +++ b/assets/src/js/functions/datatables.js @@ -38,34 +38,32 @@ function start_datatables() { start_local_datatables(); $('.main-records').each(function () { - var $this = $(this); + const $this = $(this); // Controlla che la tabella non sia giĆ  inizializzata if (!$.fn.DataTable.isDataTable('#' + $this.attr('id'))) { - var id_module = $this.data('idmodule'); - var id_plugin = $this.data('idplugin'); - var id_parent = $this.data('idparent'); + const id_module = $this.data('idmodule'); + const id_plugin = $this.data('idplugin'); + const id_parent = $this.data('idparent'); // Parametri di ricerca da url o sessione - var search = getTableSearch(); + const search = getTableSearch(); - var column_search = []; + const column_search = []; $this.find("th").each(function () { - var id = $(this).attr('id').replace("th_", ""); - var single_value = search["search_" + id] ? search["search_" + id] : ""; + const id = $(this).attr('id').replace("th_", ""); + const single_value = search["search_" + id] ? search["search_" + id] : ""; column_search.push({ "sSearch": single_value, }); }); - var tempo_attesa_ricerche = (globals.tempo_attesa_ricerche * 1000); - $this.on('preInit.dt', function (ev, settings) { $('#mini-loader').show(); }); - var table = $this.DataTable({ + const table = $this.DataTable({ language: globals.translations.datatables, autoWidth: true, dom: "ti", @@ -97,82 +95,7 @@ function start_datatables() { style: 'multi', selector: 'td:first-child' }, - buttons: [ - { - extend: 'csv', - fieldSeparator: ";", - exportOptions: { - modifier: { - selected: true - }, - format: { - body: function (data, row, column, node) { - data = $('

' + data + '

').text(); - data_edit = data.replace('.', ''); // Rimozione punto delle migliaia - - return data_edit.match(/^[0-9,]+$/) ? data_edit : data; - } - } - } - }, - { - extend: 'copy', - exportOptions: { - modifier: { - selected: true - } - } - }, - { - extend: 'print', - autoPrint: true, - footer: true, - customize: function (win) { - $(win.document.body) - .css('font-size', '10pt') - .append( - '
' + $('#summable').text() + '
' - ); - $(win.document.body).find('table') - .addClass('compact') - .css('font-size', 'inherit'); - $(win.document.body).find('td:first-child') - .addClass('hide'); - $(win.document.body).find('th:first-child') - .addClass('hide'); - }, - exportOptions: { - modifier: { - selected: true - } - } - }, - { - extend: 'excel', - exportOptions: { - modifier: { - selected: true - }, - format: { - body: function (data, row, column, node) { - data = $('

' + data + '

').text(); - data_edit = data.replace('.', ''); // Fix specifico per i numeri italiani - data_edit = data_edit.replace(',', '.'); - - return data_edit.match(/^[0-9\.]+$/) ? data_edit : data; - } - } - } - }, - { - extend: 'pdf', - exportOptions: { - modifier: { - selected: true - } - } - }, - ], + buttons: getDatatablesButtons($this), scroller: { loadingIndicator: true, displayBuffer: globals.dataload_page_buffer, @@ -182,120 +105,9 @@ function start_datatables() { type: 'GET', dataSrc: "data", }, - initComplete: function (settings) { - var api = this.api(); - var search = getTableSearch(); - - api.columns('.search').every(function () { - var column = this; - - // Valore predefinito della ricerca - var tempo; - var header = $(column.header()); - var name = header.attr('id').replace('th_', ''); - - var value = search['search_' + name] ? search['search_' + name] : ''; - - $('
') - .appendTo(column.header()) - .on('keyup', function (e) { - clearInterval(tempo); - - // Fix del pulsante di pulizia ricerca e del messaggio sulla ricerca lenta - if (e.which != 9) { - if (!$(this).val()) { - if ($(this).parent().data("slow") != undefined) $("#slow").remove(); - $(this).removeClass('input-searching'); - $(this).next('.deleteicon').addClass('hide'); - } else { - if ($(this).parent().data("slow") != undefined && $("#slow").length == 0) { - $("#" + $this.attr('id') + "_info").parent().append(' ' + globals.translations.long + ''); - } - $(this).addClass('input-searching'); - $(this).next('.deleteicon').removeClass('hide'); - } - } - - function start_search(module_id, field, search_value) { - searchTable(module_id, field, search_value); - column.search(search_value).draw(); - } - - // Impostazione delle sessioni per le ricerche del modulo e del campo specificati - var module_id = $this.data('idmodule'); //+ "-" + $this.data('idplugin'); - var field = $(this).parent().attr('id').replace('th_', ''); - var value = $(this).val(); - if (e.keyCode == 13 || $(this).val() == '') { - start_search(module_id, field, value); - } else { - tempo = window.setTimeout(start_search, tempo_attesa_ricerche, module_id, field, value); - } - }); - }); - - // Disabilito l'ordinamento alla pressione del tasto invio sull' - $("thead input, .search").on('keypress', function (e) { - stopTableSorting(e); - }); - - // Disabilito l'ordinamento al click sull' - $("thead input, .deleteicon").click(function (e) { - stopTableSorting(e); - }); - - $('.deleteicon').on("click", function (e) { - resetTableSearch($(this).parent().attr("id").replace("th_", "")); - }); - }, - drawCallback: function (settings) { - var api = new $.fn.dataTable.Api(settings); - - $(".dataTables_sizing .deleteicon").addClass('hide'); - - $("[data-background]").each(function () { - $(this).parent().css("background", $(this).data("background")); - }); - - $("[data-color]").each(function () { - $(this).parent().css("color", $(this).data("color")); - }); - - $("[data-link]").each(function () { - var $link = $(this); - $(this).parent().not('.bound').addClass('bound').click(function (event) { - if ($link.data('type') === 'dialog') { - launch_modal(globals.translations.details, $link.data('link')); - } else { - openLink(event, $link.data('link')) - } - }); - $(this).parent().addClass("clickable"); - }); - - // Reimposto il flag sulle righe ricaricate selezionate in precedenza - var selected = $this.data('selected') ? $this.data('selected').split(';') : []; - table.rows().every(function (rowIdx) { - if ($.inArray(this.id().toString(), selected) !== -1) { - table.row(':eq(' + rowIdx + ')', { - page: 'current' - }).select(); - } - }); - }, - footerCallback: function (row, data, start, end, display) { - var i = -1; - var json = this.api().ajax.json(); - - this.api().columns().every(function () { - if (json.summable[i] !== undefined) { - $(this.footer()).addClass("text-right") - .attr("id", "summable") - .html(json.summable[i]); - } - - i++; - }); - } + initComplete: initComplete, + drawCallback: drawCallback, + footerCallback: footerCallback, }); table.on('processing.dt', function (e, settings, processing) { @@ -309,26 +121,30 @@ function start_datatables() { }); } +/** + * Funzione per evitare il sorting al click della colonna. + * Utilizzata per evitare il sorting nelle ricerche. + * @param {*} e + */ function stopTableSorting(e) { if (!e) var e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); } +/** + * Funzione per resettare il campo di ricerca in una specifica colonna. + * @param {string} type + */ function resetTableSearch(type) { if (type == null) $('[id^=th_] input').val('').trigger('keyup'); else $('[id^=th_' + type + '] input').val('').trigger('keyup'); } -function reset(type) { - return resetTableSearch(type); -} - /** * Sostituisce i caratteri speciali per la ricerca attraverso le tabelle Datatables. * - * @param string field - * + * @param {string} field * @return string */ function searchFieldName(field) { @@ -338,17 +154,21 @@ function searchFieldName(field) { /** * Salva nella sessione la ricerca per le tabelle Datatables. * - * @param int module_id - * @param string field - * @param mixed value + * @param {int} module_id + * @param {string} field + * @param {mixed} value */ function searchTable(module_id, field, value) { session_set('module_' + module_id + ',' + 'search_' + searchFieldName(field), value, 0); } +/** + * Restituisce i valori di ricerca impostati nell'URL della pagina. + * @returns {{}} + */ function getTableSearch() { // Parametri di ricerca da url o sessione - var search = getUrlVars(); + const search = getUrlVars(); globals.search.forEach(function (value, index, array) { if (search[array[index]] === undefined) { @@ -359,6 +179,220 @@ function getTableSearch() { return search; } +/** + * Restituisce i pulsanti da generare per la tabella Datatables. + * @returns + */ +function getDatatablesButtons(table) { + return [ + // Pulsante di esportazione CSV + { + extend: 'csv', + footer: true, + fieldSeparator: ";", + exportOptions: { + modifier: { + selected: true + }, + format: { + body: function (data, row, column, node) { + data = $('

' + data + '

').text(); + data_edit = data.replace('.', ''); // Rimozione punto delle migliaia + + return data_edit.match(/^[0-9,]+$/) ? data_edit : data; + } + } + } + }, + // Pulsante di esportazione tramite copia + { + extend: 'copy', + footer: true, + exportOptions: { + modifier: { + selected: true + } + } + }, + // Pulsante di esportazione via stampa della tabella + { + extend: 'print', + autoPrint: true, + footer: false, // Non funzionante in Firefox, e saltuarmente in Chrome + customize: function (win) { + const datatable = getTable(table).datatable; + + const footer = datatable.table().footer().children[0]; + console.log(footer); + + const body = $(win.document.body); + body.find('table') + .addClass('compact') + .css('font-size', 'inherit') + .append(footer); + + body.find('td:first-child, th:first-child') + .addClass('hide'); + + }, + exportOptions: { + modifier: { + selected: true + } + } + }, + // Pulsante di esportazione in formato Excel + { + extend: 'excel', + footer: true, + exportOptions: { + modifier: { + selected: true + }, + format: { + body: function (data, row, column, node) { + data = $('

' + data + '

').text(); + data_edit = data.replace('.', ''); // Fix specifico per i numeri italiani + data_edit = data_edit.replace(',', '.'); + + return data_edit.match(/^[0-9\.]+$/) ? data_edit : data; + } + } + } + }, + // Pulsante di esportazione in formato PDF + { + extend: 'pdf', + footer: true, + exportOptions: { + modifier: { + selected: true + } + } + }, + ]; +} + +function initComplete(settings) { + const api = this.api(); + const search = getTableSearch(); + + api.columns('.search').every(function () { + const column = this; + + // Valore predefinito della ricerca + let tempo; + const header = $(column.header()); + const name = header.attr('id').replace('th_', ''); + + const value = search['search_' + name] ? search['search_' + name] : ''; + + $('
') + .appendTo(column.header()) + .on('keyup', function (e) { + clearInterval(tempo); + + // Fix del pulsante di pulizia ricerca e del messaggio sulla ricerca lenta + if (e.which != 9) { + if (!$(this).val()) { + if ($(this).parent().data("slow") != undefined) $("#slow").remove(); + $(this).removeClass('input-searching'); + $(this).next('.deleteicon').addClass('hide'); + } else { + if ($(this).parent().data("slow") != undefined && $("#slow").length == 0) { + $("#" + $this.attr('id') + "_info").parent().append(' ' + globals.translations.long + ''); + } + $(this).addClass('input-searching'); + $(this).next('.deleteicon').removeClass('hide'); + } + } + + function start_search(module_id, field, search_value) { + searchTable(module_id, field, search_value); + column.search(search_value).draw(); + } + + // Impostazione delle sessioni per le ricerche del modulo e del campo specificati + const module_id = $this.data('idmodule'); //+ "-" + $this.data('idplugin'); + const field = $(this).parent().attr('id').replace('th_', ''); + const value = $(this).val(); + if (e.keyCode == 13 || $(this).val() == '') { + start_search(module_id, field, value); + } else { + const tempo_attesa_ricerche = (globals.tempo_attesa_ricerche * 1000); + + tempo = window.setTimeout(start_search, tempo_attesa_ricerche, module_id, field, value); + } + }); + }); + + // Disabilito l'ordinamento alla pressione del tasto invio sull' + $("thead input, .search").on('keypress', function (e) { + stopTableSorting(e); + }); + + // Disabilito l'ordinamento al click sull' + $("thead input, .deleteicon").click(function (e) { + stopTableSorting(e); + }); + + $('.deleteicon').on("click", function (e) { + resetTableSearch($(this).parent().attr("id").replace("th_", "")); + }); +} + +function drawCallback(settings) { + const table = getTable(settings.nTable); + const datatable = table.datatable; + + $(".dataTables_sizing .deleteicon").addClass('hide'); + + $("[data-background]").each(function () { + $(this).parent().css("background", $(this).data("background")); + }); + + $("[data-color]").each(function () { + $(this).parent().css("color", $(this).data("color")); + }); + + $("[data-link]").each(function () { + const $link = $(this); + $(this).parent().not('.bound').addClass('bound').click(function (event) { + if ($link.data('type') === 'dialog') { + launch_modal(globals.translations.details, $link.data('link')); + } else { + openLink(event, $link.data('link')) + } + }); + $(this).parent().addClass("clickable"); + }); + + // Reimposto il flag sulle righe ricaricate selezionate in precedenza + const selected = table.getSelectedRows(); + datatable.rows().every(function (rowIdx) { + if (selected.includes(this.id())) { + datatable.row(':eq(' + rowIdx + ')', { + page: 'current' + }).select(); + } + }); +} + +function footerCallback(row, data, start, end, display) { + let i = -1; + const json = this.api().ajax.json(); + + this.api().columns().every(function () { + if (json.summable[i] !== undefined) { + $(this.footer()).addClass("text-right") + .attr("id", "summable") + .html(json.summable[i]); + } + + i++; + }); +} + /** * Restituisce un oggetto che permette di gestire le tabelle DataTables. * @@ -425,13 +459,13 @@ function getTable(selector) { // Aggiornamento del footer nel caso sia richiesto if (globals.restrict_summables_to_selected) { - this.updateSelectedFooter(); + this.updateFooterForSelectedRows(); } }, addSelectedRows: function (row_ids) { row_ids = Array.isArray(row_ids) ? row_ids : [row_ids]; row_ids.forEach(function (item, index) { - selected.set(item, true); + selected.set(item.toString(), true); }); this.saveSelectedRows(); @@ -439,7 +473,7 @@ function getTable(selector) { removeSelectedRows: function (row_ids) { row_ids = Array.isArray(row_ids) ? row_ids : [row_ids]; row_ids.forEach(function (item, index) { - selected.delete(item); + selected.delete(item.toString()); }); this.saveSelectedRows(); @@ -449,12 +483,14 @@ function getTable(selector) { this.saveSelectedRows(); }, - // Aggiornamento dei campi summable - updateSelectedFooter: function () { - let datatable = this.datatable; + /** + * Nuovi valori dei campi summable + * @returns + */ + getSelectedRowsFooter: function () { let ids = this.getSelectedRows(); - $.ajax({ + return $.ajax({ url: globals.rootdir + "/ajax.php", type: "POST", dataType: "json", @@ -463,15 +499,23 @@ function getTable(selector) { id_plugin: this.id_plugin, op: "summable-results", ids: ids, - }, - success: function (response) { - for (let [column, value] of Object.entries(response)) { - let index = parseInt(column) + 1; - let sel = datatable.column(index).footer(); - $(sel).addClass("text-right") - .attr("id", "summable") - .html(value); - } + } + }); + }, + + /** + * Aggiornamento dei campi summable + */ + updateFooterForSelectedRows: function () { + let datatable = this.datatable; + + this.getSelectedRowsFooter().then(function (response) { + for (let [column, value] of Object.entries(response)) { + let index = parseInt(column) + 1; + let sel = datatable.column(index).footer(); + $(sel).addClass("text-right") + .attr("id", "summable") + .html(value); } }); },