// Função para converter data DD/MM/YYYY para objeto Date function converterDataParaComparacao(dataStr) { console.log('Convertendo data para comparação:', dataStr); if (!dataStr) return null; try { // Se já estiver no formato ISO if (/^\d{4}-\d{2}-\d{2}/.test(dataStr)) { const data = new Date(dataStr); console.log('Data ISO convertida:', data); return data; } // Se estiver no formato DD/MM/YYYY if (/^\d{2}\/\d{2}\/\d{4}/.test(dataStr)) { const [dia, mes, ano] = dataStr.split('/').map(Number); const data = new Date(ano, mes - 1, dia); console.log('Data DD/MM/YYYY convertida:', data); return data; } console.warn('Formato de data não reconhecido:', dataStr); return null; } catch (error) { console.error('Erro ao converter data:', error, 'Data:', dataStr); return null; } } // Função para ordenar tabelas function configurarOrdenacaoTabela(tabelaId) { console.log('Configurando ordenação para tabela:', tabelaId); const table = document.getElementById(tabelaId); if (!table) { console.warn('Tabela não encontrada:', tabelaId); return; } const headers = table.querySelectorAll('th[data-sort]'); headers.forEach(header => { if (header.dataset.sort) { header.addEventListener('click', () => { const column = header.dataset.sort; const tbody = table.getElementsByTagName('tbody')[0]; const rows = Array.from(tbody.getElementsByTagName('tr')); console.log('Ordenando coluna:', column); rows.sort((a, b) => { const aValue = a.querySelector(`td[data-${column}]`).dataset[column]; const bValue = b.querySelector(`td[data-${column}]`).dataset[column]; // Ordenação por data if (column === 'data' || column === 'data_vencimento' || column === 'data_alteracao' || column === 'data_pagamento' || column === 'data_venda' || column === 'data_relatorio') { const aDate = converterDataParaComparacao(aValue); const bDate = converterDataParaComparacao(bValue); // Se alguma data for inválida if (!aDate && !bDate) return 0; if (!aDate) return 1; if (!bDate) return -1; return aDate - bDate; } // Ordenação por valor monetário if (column === 'valor' || column === 'valor_total' || column === 'valor_antigo' || column === 'valor_novo') { const aNum = parseFloat(aValue.replace(/[^\d,-]/g, '').replace(',', '.')); const bNum = parseFloat(bValue.replace(/[^\d,-]/g, '').replace(',', '.')); return aNum - bNum; } // Ordenação padrão para texto return aValue.localeCompare(bValue); }); // Alternar direção da ordenação if (header.classList.contains('asc')) { rows.reverse(); header.classList.remove('asc'); header.classList.add('desc'); console.log('Ordenação descendente'); } else { header.classList.remove('desc'); header.classList.add('asc'); console.log('Ordenação ascendente'); } // Atualizar tabela tbody.innerHTML = ''; rows.forEach(row => tbody.appendChild(row)); }); } }); } // Configurar ordenação para todas as tabelas que precisam document.addEventListener('DOMContentLoaded', function() { console.log('Configurando ordenação para todas as tabelas...'); const tabelas = [ 'materiaisTable', 'vendasTable', 'cotasTable', 'pagamentosTable' ]; tabelas.forEach(tabelaId => { configurarOrdenacaoTabela(tabelaId); }); }); document.addEventListener('DOMContentLoaded', function() { console.log('Carregando script table_sort.js...'); // Função para comparar datas no formato DD/MM/YYYY function compararDatas(a, b) { if (!a || !b) return 0; const [diaA, mesA, anoA] = a.split('/').map(Number); const [diaB, mesB, anoB] = b.split('/').map(Number); const dataA = new Date(anoA, mesA - 1, diaA); const dataB = new Date(anoB, mesB - 1, diaB); return dataA - dataB; } // Função para comparar valores monetários function compararValores(a, b) { const valorA = parseFloat(a.replace('R$ ', '').replace('.', '').replace(',', '.')); const valorB = parseFloat(b.replace('R$ ', '').replace('.', '').replace(',', '.')); if (isNaN(valorA)) return -1; if (isNaN(valorB)) return 1; return valorA - valorB; } // Configurar ordenação para todas as tabelas com classe 'table-sort' document.querySelectorAll('table.table-sort').forEach(tabela => { const tbody = tabela.querySelector('tbody'); const headers = tabela.querySelectorAll('th[data-sort]'); headers.forEach(header => { const tipoOrdenacao = header.dataset.sort; header.addEventListener('click', () => { const rows = Array.from(tbody.querySelectorAll('tr')); const colIndex = Array.from(header.parentNode.children).indexOf(header); rows.sort((rowA, rowB) => { const cellA = rowA.children[colIndex].dataset[tipoOrdenacao] || rowA.children[colIndex].textContent.trim(); const cellB = rowB.children[colIndex].dataset[tipoOrdenacao] || rowB.children[colIndex].textContent.trim(); switch (tipoOrdenacao) { case 'data': return compararDatas(cellA, cellB); case 'valor': return compararValores(cellA, cellB); case 'numero': return parseFloat(cellA) - parseFloat(cellB); default: return cellA.localeCompare(cellB); } }); if (header.classList.contains('asc')) { rows.reverse(); header.classList.remove('asc'); header.classList.add('desc'); } else { header.classList.remove('desc'); header.classList.add('asc'); } // Remover classes de ordenação de outros headers headers.forEach(h => { if (h !== header) { h.classList.remove('asc', 'desc'); } }); // Atualizar tabela tbody.innerHTML = ''; rows.forEach(row => tbody.appendChild(row)); }); }); }); });