portal_publico/static/js/search.js

50 lines
2.0 KiB
JavaScript

document.addEventListener("DOMContentLoaded", () => {
const input = document.getElementById("app-search-input");
if (!input) return;
const searchEmpty = document.getElementById("search-empty");
const navSections = Array.from(document.querySelectorAll(".sidebar [data-section]"));
const navGroups = navSections.filter((section) => section.classList.contains("nav-group"));
// Guarda quais grupos já estavam abertos manualmente antes da busca começar, pra
// restaurar esse estado exato quando o campo for limpo — sem isso, um grupo que a
// busca abre pra mostrar o resultado ficava aberto pra sempre, mesmo sem busca ativa.
let gruposAbertosAntesDaBusca = null;
input.addEventListener("input", () => {
const term = input.value.trim().toLowerCase();
const cards = Array.from(document.querySelectorAll("#app-card-grid .app-card"));
let visibleCards = 0;
cards.forEach((card) => {
const label = card.querySelector(".app-card__label").textContent.toLowerCase();
const match = !term || label.includes(term);
card.hidden = !match;
if (match) visibleCards += 1;
});
if (searchEmpty) searchEmpty.hidden = !term || visibleCards !== 0 || cards.length === 0;
if (term && !gruposAbertosAntesDaBusca) {
gruposAbertosAntesDaBusca = new Set(navGroups.filter((group) => group.classList.contains("is-open")));
}
navSections.forEach((section) => {
if (section.hidden) return; // respeita a visibilidade por persona
const text = section.textContent.toLowerCase();
const match = !term || text.includes(term);
section.classList.toggle("is-search-hidden", !match);
section.style.display = match ? "" : "none";
if (term && section.classList.contains("nav-group")) {
section.classList.toggle("is-open", match);
}
});
if (!term && gruposAbertosAntesDaBusca) {
navGroups.forEach((group) => {
group.classList.toggle("is-open", gruposAbertosAntesDaBusca.has(group));
});
gruposAbertosAntesDaBusca = null;
}
});
});