feat: implementa filtros e pesquisa AJAX na interface de militantes
This commit is contained in:
@@ -1 +1 @@
|
|||||||
otpauth://totp/Sistema%20de%20Controles:admin?secret=7QGUNVWKH6TOSVZS5PK2KPPLJP4QW7QY&issuer=Sistema%20de%20Controles
|
otpauth://totp/Sistema%20de%20Controles:admin?secret=NKUX7XZKAF6JOHO2NH6X23ZV64AQXEAX&issuer=Sistema%20de%20Controles
|
||||||
3
app.py
3
app.py
@@ -392,7 +392,8 @@ def listar_militantes():
|
|||||||
db = get_db_connection()
|
db = get_db_connection()
|
||||||
try:
|
try:
|
||||||
militantes = db.query(Militante).all()
|
militantes = db.query(Militante).all()
|
||||||
return render_template('listar_militantes.html', militantes=militantes, Militante=Militante)
|
celulas = db.query(Celula).order_by(Celula.nome).all()
|
||||||
|
return render_template('listar_militantes.html', militantes=militantes, Militante=Militante, celulas=celulas)
|
||||||
finally:
|
finally:
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,114 @@
|
|||||||
console.log('Carregando script militantes.js...');
|
console.log('Carregando script militantes.js...');
|
||||||
|
|
||||||
function carregarDetalhesMilitante(id) {
|
// Variáveis globais para controle dos filtros
|
||||||
// Pega o elemento clicado
|
let filtroAtual = 'todos';
|
||||||
const elemento = document.querySelector(`[data-militante-id="${id}"]`);
|
let filtroResponsabilidade = null;
|
||||||
|
let filtroCelula = null;
|
||||||
|
|
||||||
// Preenche os campos do modal com os dados do data-attributes
|
// Função para filtrar militantes
|
||||||
document.getElementById('militanteNome').textContent = elemento.dataset.militanteNome;
|
function filtrarMilitantes() {
|
||||||
document.getElementById('militanteCPF').textContent = elemento.dataset.militanteCpf;
|
const searchTerm = document.getElementById('searchInput').value.toLowerCase();
|
||||||
document.getElementById('militanteEmail').textContent = elemento.dataset.militanteEmail;
|
const rows = document.querySelectorAll('#militantesTable tbody tr');
|
||||||
document.getElementById('militanteTelefone').textContent = elemento.dataset.militanteTelefone;
|
let count = 0;
|
||||||
document.getElementById('militanteEndereco').textContent = elemento.dataset.militanteEndereco;
|
|
||||||
document.getElementById('militanteFiliado').textContent = elemento.dataset.militanteFiliado === 'True' ? 'Filiado' : 'Não Filiado';
|
|
||||||
|
|
||||||
// Configura os botões de ação com o ID correto
|
rows.forEach(row => {
|
||||||
const btnEditar = document.querySelector('#militanteModal .btn-primary');
|
let shouldShow = true;
|
||||||
const btnExcluir = document.querySelector('#militanteModal .btn-danger');
|
|
||||||
|
|
||||||
// Atualiza o formulário de edição com o ID correto
|
// Filtro de texto
|
||||||
const formEditar = document.getElementById('formEditarMilitante');
|
const textContent = row.textContent.toLowerCase();
|
||||||
if (formEditar) {
|
if (!textContent.includes(searchTerm)) {
|
||||||
formEditar.action = `/militantes/editar/${id}`;
|
shouldShow = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Atualiza o formulário de exclusão com o ID correto
|
// Filtro de status (filiado/não filiado)
|
||||||
const formExcluir = document.getElementById('deleteForm');
|
if (filtroAtual !== 'todos') {
|
||||||
if (formExcluir) {
|
const filiado = row.getAttribute('data-filiado');
|
||||||
formExcluir.action = `/militantes/excluir/${id}`;
|
if (filtroAtual === 'filiados' && filiado !== 'sim') {
|
||||||
|
shouldShow = false;
|
||||||
|
}
|
||||||
|
if (filtroAtual === 'nao-filiados' && filiado !== 'nao') {
|
||||||
|
shouldShow = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Abre o modal
|
// Filtro de responsabilidades
|
||||||
const modal = new bootstrap.Modal(document.getElementById('militanteModal'));
|
if (filtroResponsabilidade) {
|
||||||
modal.show();
|
const badges = row.querySelectorAll('.badge');
|
||||||
|
const hasResponsabilidade = Array.from(badges).some(badge =>
|
||||||
|
badge.textContent.toLowerCase() === filtroResponsabilidade.toLowerCase()
|
||||||
|
);
|
||||||
|
if (!hasResponsabilidade) {
|
||||||
|
shouldShow = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Função para preencher o modal de edição
|
// Filtro de célula
|
||||||
|
if (filtroCelula) {
|
||||||
|
const celula = row.querySelector('[data-celula]').getAttribute('data-celula');
|
||||||
|
if (celula !== filtroCelula) {
|
||||||
|
shouldShow = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aplicar visibilidade
|
||||||
|
row.style.display = shouldShow ? '' : 'none';
|
||||||
|
if (shouldShow) count++;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Atualizar contador
|
||||||
|
document.getElementById('countMilitantes').textContent = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configurar eventos quando o DOM estiver carregado
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// Configurar pesquisa
|
||||||
|
const searchInput = document.getElementById('searchInput');
|
||||||
|
if (searchInput) {
|
||||||
|
let timeoutId;
|
||||||
|
searchInput.addEventListener('input', function() {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
timeoutId = setTimeout(filtrarMilitantes, 300);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configurar filtros
|
||||||
|
document.querySelectorAll('.dropdown-item[data-filter]').forEach(item => {
|
||||||
|
item.addEventListener('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const filter = this.getAttribute('data-filter');
|
||||||
|
const celula = this.getAttribute('data-celula');
|
||||||
|
|
||||||
|
// Resetar filtros anteriores
|
||||||
|
if (filter === 'todos') {
|
||||||
|
filtroAtual = 'todos';
|
||||||
|
filtroResponsabilidade = null;
|
||||||
|
filtroCelula = null;
|
||||||
|
} else if (['filiados', 'nao-filiados'].includes(filter)) {
|
||||||
|
filtroAtual = filter;
|
||||||
|
filtroResponsabilidade = null;
|
||||||
|
filtroCelula = null;
|
||||||
|
} else if (['financas', 'imprensa', 'quadro-orientador'].includes(filter)) {
|
||||||
|
filtroAtual = 'todos';
|
||||||
|
filtroResponsabilidade = filter === 'financas' ? 'Finanças' :
|
||||||
|
filter === 'imprensa' ? 'Imprensa' :
|
||||||
|
'Quadro-Orientador';
|
||||||
|
filtroCelula = null;
|
||||||
|
} else if (filter === 'celula') {
|
||||||
|
filtroAtual = 'todos';
|
||||||
|
filtroResponsabilidade = null;
|
||||||
|
filtroCelula = celula;
|
||||||
|
}
|
||||||
|
|
||||||
|
filtrarMilitantes();
|
||||||
|
|
||||||
|
// Atualizar texto do botão de filtro
|
||||||
|
const filterText = this.textContent;
|
||||||
|
const dropdownButton = document.querySelector('.dropdown-toggle');
|
||||||
|
dropdownButton.innerHTML = `<i class="fas fa-filter me-2"></i>${filterText}`;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
console.log('DOM carregado');
|
console.log('DOM carregado');
|
||||||
|
|
||||||
// Configuração do modal de edição
|
// Configuração do modal de edição
|
||||||
@@ -310,52 +384,6 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pesquisa em tempo real
|
|
||||||
const searchInput = document.getElementById('searchInput');
|
|
||||||
if (searchInput) {
|
|
||||||
searchInput.addEventListener('input', function() {
|
|
||||||
const searchTerm = this.value.toLowerCase();
|
|
||||||
const rows = document.querySelectorAll('#militantesTable tbody tr');
|
|
||||||
let visibleCount = 0;
|
|
||||||
|
|
||||||
rows.forEach(row => {
|
|
||||||
const text = row.textContent.toLowerCase();
|
|
||||||
const isVisible = text.includes(searchTerm);
|
|
||||||
row.style.display = isVisible ? '' : 'none';
|
|
||||||
if (isVisible) visibleCount++;
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById('countMilitantes').textContent = visibleCount;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filtros
|
|
||||||
const filterButtons = document.querySelectorAll('[data-filter]');
|
|
||||||
filterButtons.forEach(button => {
|
|
||||||
button.addEventListener('click', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
const filter = this.getAttribute('data-filter');
|
|
||||||
const rows = document.querySelectorAll('#militantesTable tbody tr');
|
|
||||||
let visibleCount = 0;
|
|
||||||
|
|
||||||
rows.forEach(row => {
|
|
||||||
const filiado = row.getAttribute('data-filiado');
|
|
||||||
let isVisible = true;
|
|
||||||
|
|
||||||
if (filter === 'filiados') {
|
|
||||||
isVisible = filiado === 'sim';
|
|
||||||
} else if (filter === 'nao-filiados') {
|
|
||||||
isVisible = filiado === 'nao';
|
|
||||||
}
|
|
||||||
|
|
||||||
row.style.display = isVisible ? '' : 'none';
|
|
||||||
if (isVisible) visibleCount++;
|
|
||||||
});
|
|
||||||
|
|
||||||
document.getElementById('countMilitantes').textContent = visibleCount;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Ordenação
|
// Ordenação
|
||||||
const headers = document.querySelectorAll('#militantesTable th[data-sort]');
|
const headers = document.querySelectorAll('#militantesTable th[data-sort]');
|
||||||
headers.forEach(header => {
|
headers.forEach(header => {
|
||||||
|
|||||||
Reference in New Issue
Block a user