Files
fitme3070.pt/assets/js/datatables-init.js
T
2026-10-26 10:13:29 +00:00

70 lines
2.9 KiB
JavaScript

// DataTables (classic jQuery plugin) init, partilhado pelas listagens do
// backoffice que já tinham exportação CSV (audit 6.9). Cliente-only — todas
// as tabelas aqui são pequenas (bem abaixo de 60 linhas), por isso sem
// server-side processing nem AJAX.
//
// Tradução pt-PT oficial da DataTables (i18n/pt-PT.json), inline: não se
// carrega de CDN nenhum, pela mesma razão que o Roboto e o FontAwesome
// passaram a ser servidos daqui (RGPD — sem pedidos a terceiros antes do
// consentimento).
var DATATABLES_PT_PT = {
decimal: ',',
emptyTable: 'Não existem dados disponíveis na tabela',
info: 'A mostrar registos de _START_ até _END_ de um total de _TOTAL_ registos',
infoEmpty: 'A mostrar registos de 0 até 0 de um total de 0 registos',
infoFiltered: '(filtrados de um total de _MAX_ registos)',
infoPostFix: '',
thousands: '.',
lengthMenu: 'Mostrar _MENU_ registos',
loadingRecords: 'A carregar...',
processing: 'A processar...',
search: 'Pesquisar:',
zeroRecords: 'Não foram encontrados resultados',
paginate: {
first: 'Primeiro',
last: 'Último',
next: 'Seguinte',
previous: 'Anterior'
},
aria: {
sortAscending: ': ativar para ordenar a coluna de forma ascendente',
sortDescending: ': ativar para ordenar a coluna de forma descendente'
},
select: {
rows: {
_: 'Selecionadas %d linhas',
0: 'Nenhuma linha selecionada',
1: 'Selecionada 1 linha'
}
}
};
// opts pode trazer columnDefs (p.ex. marcar a coluna de Ações como
// orderable:false/searchable:false) e qualquer outra opção da DataTable —
// é feito merge profundo por cima destes valores por omissão.
function initDataTable(selector, opts) {
if (!window.jQuery || !jQuery.fn || !jQuery.fn.DataTable) return null;
var $table = jQuery(selector);
if (!$table.length) return null;
// Listagem vazia: as páginas desenham uma única linha <td colspan> com a
// mensagem, que a DataTables rejeita (nº de colunas errado → erro). Tira-se
// a linha e a mensagem dela (com links) passa a ser o emptyTable.
var language = DATATABLES_PT_PT;
var $rows = $table.find('tbody > tr');
var $only = $rows.length === 1 ? $rows.children('td[colspan]') : jQuery();
if ($only.length === 1 && $rows.children().length === 1) {
language = jQuery.extend({}, DATATABLES_PT_PT, { emptyTable: $only.html() });
$rows.remove();
}
return $table.DataTable(jQuery.extend(true, {
language: language,
pageLength: 25,
lengthMenu: [[10, 25, 50, -1], [10, 25, 50, 'Todos']],
responsive: true,
// Sem ordenação inicial: a ordem que a página já desenha (mais
// recente primeiro, ordem manual, etc.) é a que faz sentido por
// omissão — impor uma coluna aqui só a desfazia sem avisar.
order: []
}, opts || {}));
}