feat(filtros): adicionar filtro multi-select por selos no ranking

- Backend: extrair selos de detalhes e filtrar por eles
- API: endpoint /ranking/selos e parâmetro selos em /ranking/paginado
- Frontend: componente FiltroSelos com dropdown e seleção múltipla
- Selos disponíveis: funções, premiações, orientações
This commit is contained in:
Frederico Castro
2025-12-15 12:32:24 -03:00
parent d215e9ac76
commit c294d4cc77
6 changed files with 527 additions and 11 deletions

View File

@@ -2,6 +2,7 @@ import { useState, useEffect, useRef } from 'react';
import Header from './components/Header';
import ConsultorCard from './components/ConsultorCard';
import CompararModal from './components/CompararModal';
import FiltroSelos from './components/FiltroSelos';
import { rankingService } from './services/api';
import './App.css';
@@ -21,6 +22,7 @@ function App() {
const [buscando, setBuscando] = useState(false);
const [selecionados, setSelecionados] = useState([]);
const [modalAberto, setModalAberto] = useState(false);
const [filtroSelos, setFiltroSelos] = useState([]);
const toggleSelecionado = (consultor) => {
setSelecionados((prev) => {
@@ -42,7 +44,7 @@ function App() {
useEffect(() => {
loadRanking();
}, [page, pageSize]);
}, [page, pageSize, filtroSelos]);
const loadRanking = async (retryCount = 0) => {
const MAX_RETRIES = 10;
@@ -52,7 +54,7 @@ function App() {
setLoading(true);
setError(null);
setProcessMessage('');
const response = await rankingService.getRanking(page, pageSize);
const response = await rankingService.getRanking(page, pageSize, filtroSelos);
setConsultores(response.consultores);
setTotal(response.total);
setTotalPages(response.total_pages || 0);
@@ -105,7 +107,7 @@ function App() {
throw new Error('Timeout: processamento demorou mais que 45 minutos');
}
const response = await rankingService.getRanking(page, pageSize);
const response = await rankingService.getRanking(page, pageSize, filtroSelos);
setConsultores(response.consultores);
setTotal(response.total);
setTotalPages(response.total_pages || 0);
@@ -191,6 +193,11 @@ function App() {
</select>
</label>
<FiltroSelos
selecionados={filtroSelos}
onChange={(selos) => { setFiltroSelos(selos); setPage(1); }}
/>
<form className="search-box" onSubmit={handleSubmitBuscar}>
<input
type="text"