fix(filtros): corrigir extração de selos e melhorar UX do filtro
- Corrigir lógica de extração de selos para usar códigos exatos - Filtro agora exige todos os selos selecionados (AND em vez de OR) - Botão Aplicar volta: seleção não dispara filtro automaticamente - Layout dos controles unificado em barra com fundo
This commit is contained in:
@@ -36,8 +36,15 @@ const SELOS_CONFIG = {
|
||||
|
||||
function FiltroSelos({ selecionados, onChange }) {
|
||||
const [aberto, setAberto] = useState(false);
|
||||
const [selosTemp, setSelosTemp] = useState([]);
|
||||
const ref = useRef(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (aberto) {
|
||||
setSelosTemp([...selecionados]);
|
||||
}
|
||||
}, [aberto, selecionados]);
|
||||
|
||||
useEffect(() => {
|
||||
const handleClickOutside = (e) => {
|
||||
if (ref.current && !ref.current.contains(e.target)) {
|
||||
@@ -49,18 +56,27 @@ function FiltroSelos({ selecionados, onChange }) {
|
||||
}, []);
|
||||
|
||||
const toggleSelo = (codigo) => {
|
||||
if (selecionados.includes(codigo)) {
|
||||
onChange(selecionados.filter((s) => s !== codigo));
|
||||
if (selosTemp.includes(codigo)) {
|
||||
setSelosTemp(selosTemp.filter((s) => s !== codigo));
|
||||
} else {
|
||||
onChange([...selecionados, codigo]);
|
||||
setSelosTemp([...selosTemp, codigo]);
|
||||
}
|
||||
};
|
||||
|
||||
const limparTemp = () => {
|
||||
setSelosTemp([]);
|
||||
};
|
||||
|
||||
const limparFiltros = (e) => {
|
||||
e.stopPropagation();
|
||||
onChange([]);
|
||||
};
|
||||
|
||||
const aplicarFiltro = () => {
|
||||
onChange(selosTemp);
|
||||
setAberto(false);
|
||||
};
|
||||
|
||||
const totalSelos = Object.values(SELOS_CONFIG).reduce(
|
||||
(acc, g) => acc + g.selos.length,
|
||||
0
|
||||
@@ -90,9 +106,9 @@ function FiltroSelos({ selecionados, onChange }) {
|
||||
<div className="filtro-selos-dropdown">
|
||||
<div className="filtro-selos-header">
|
||||
<span>Selecione os selos para filtrar</span>
|
||||
{selecionados.length > 0 && (
|
||||
<button className="filtro-limpar-todos" onClick={limparFiltros}>
|
||||
Limpar ({selecionados.length})
|
||||
{selosTemp.length > 0 && (
|
||||
<button className="filtro-limpar-todos" onClick={limparTemp}>
|
||||
Limpar ({selosTemp.length})
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
@@ -105,11 +121,11 @@ function FiltroSelos({ selecionados, onChange }) {
|
||||
{grupo.selos.map((selo) => (
|
||||
<label
|
||||
key={selo.codigo}
|
||||
className={`filtro-selo-item ${selecionados.includes(selo.codigo) ? 'selecionado' : ''}`}
|
||||
className={`filtro-selo-item ${selosTemp.includes(selo.codigo) ? 'selecionado' : ''}`}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={selecionados.includes(selo.codigo)}
|
||||
checked={selosTemp.includes(selo.codigo)}
|
||||
onChange={() => toggleSelo(selo.codigo)}
|
||||
/>
|
||||
<span className="selo-icone">{selo.icone}</span>
|
||||
@@ -123,9 +139,9 @@ function FiltroSelos({ selecionados, onChange }) {
|
||||
|
||||
<div className="filtro-selos-footer">
|
||||
<span className="filtro-info">
|
||||
{selecionados.length} de {totalSelos} selecionado{selecionados.length !== 1 ? 's' : ''}
|
||||
{selosTemp.length} de {totalSelos} selecionado{selosTemp.length !== 1 ? 's' : ''}
|
||||
</span>
|
||||
<button className="filtro-aplicar" onClick={() => setAberto(false)}>
|
||||
<button className="filtro-aplicar" onClick={aplicarFiltro}>
|
||||
Aplicar
|
||||
</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user