netgescon-day0/resources/views/filament/components/sidebar-search.blade.php

96 lines
4.0 KiB
PHP

<div class="px-4 py-2 border-b border-gray-100 dark:border-gray-800/60 mb-2">
<div class="relative">
<input
type="text"
id="sidebar-menu-search"
placeholder="Cerca menù (es. anagrafica, nominativi, unità)..."
class="w-full text-xs rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950 px-3 py-1.5 focus:border-amber-400 focus:ring-1 focus:ring-amber-400 focus:outline-none dark:text-gray-100 shadow-sm transition-all"
/>
<div class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-gray-400">
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
</svg>
</div>
</div>
</div>
<script>
(function () {
const customKeywords = {
'anagrafica': ['anagrafica unica', 'anagrafica', 'rubrica', 'persone'],
'nominativi': ['nominativi', 'condomini', 'inquilini', 'proprietari'],
'unita': ['unità immobiliare', 'scheda unità', 'selettore unità', 'unita-immobiliare'],
'fornitori': ['fornitori', 'gestione fornitori', 'archivio fornitori']
};
function filterSidebarMenu(query) {
query = (query || '').toLowerCase().trim();
const sidebarNav = document.querySelector('.fi-sidebar-nav');
const scrollPos = sidebarNav ? sidebarNav.scrollTop : 0;
const groups = document.querySelectorAll('.fi-sidebar-group');
groups.forEach(group => {
const items = group.querySelectorAll('.fi-sidebar-item');
let hasVisibleItems = false;
items.forEach(item => {
const text = item.textContent.toLowerCase();
const href = (item.querySelector('a')?.getAttribute('href') || '').toLowerCase();
let isMatch = query === '' || text.includes(query) || href.includes(query);
if (!isMatch && query.length >= 2) {
for (const [key, synonyms] of Object.entries(customKeywords)) {
if (key.includes(query) || query.includes(key)) {
if (synonyms.some(s => text.includes(s) || href.includes(s))) {
isMatch = true;
break;
}
}
}
}
if (isMatch) {
item.style.display = '';
hasVisibleItems = true;
} else {
item.style.display = 'none';
}
});
if (query !== '' && !hasVisibleItems) {
group.style.display = 'none';
} else {
group.style.display = '';
}
});
if (sidebarNav) {
sidebarNav.scrollTop = scrollPos;
}
}
document.addEventListener('input', function (e) {
if (e.target && e.target.id === 'sidebar-menu-search') {
filterSidebarMenu(e.target.value);
}
});
document.addEventListener('keyup', function (e) {
if (e.target && e.target.id === 'sidebar-menu-search') {
filterSidebarMenu(e.target.value);
}
});
// Initialize on DOM Ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () {
const searchInput = document.getElementById('sidebar-menu-search');
if (searchInput && searchInput.value) {
filterSidebarMenu(searchInput.value);
}
});
}
})();
</script>