Last active
October 4, 2024 13:46
-
-
Save apsolut/f16921ae78fd4df288e7c0c5b20d96f4 to your computer and use it in GitHub Desktop.
Not the best, when using mouse going over disabled ones (disabled - ones that have zero items in list)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
document.addEventListener('DOMContentLoaded', function() { | |
const eventList = document.querySelector('.event-list'); | |
const searchInput = document.getElementById('searchInput'); | |
const eventTypeFilter = document.getElementById('eventTypeFilter'); | |
const industryFilter = document.getElementById('industryFilter'); | |
const countryFilter = document.getElementById('countryFilter'); | |
const toggleFiltersBtn = document.getElementById('toggleFilters'); | |
const filtersContainer = document.getElementById('filters'); | |
function getFilterCounts() { | |
const eventItems = eventList.querySelectorAll('.event-item'); | |
const counts = { | |
eventType: {}, | |
industry: {}, | |
country: {} | |
}; | |
eventItems.forEach(item => { | |
const type = item.dataset.eventType; | |
const industry = item.dataset.eventIndustry; | |
const country = item.dataset.eventCountry; | |
counts.eventType[type] = (counts.eventType[type] || 0) + 1; | |
counts.industry[industry] = (counts.industry[industry] || 0) + 1; | |
counts.country[country] = (counts.country[country] || 0) + 1; | |
}); | |
return counts; | |
} | |
function updateFilterOptions() { | |
const counts = getFilterCounts(); | |
updateSelectOptions(eventTypeFilter, counts.eventType); | |
updateSelectOptions(industryFilter, counts.industry); | |
updateSelectOptions(countryFilter, counts.country); | |
} | |
function updateSelectOptions(select, counts) { | |
Array.from(select.options).forEach(option => { | |
if (option.value !== 'All') { | |
const count = counts[option.value] || 0; | |
option.textContent = `${option.value} (${count})`; | |
option.disabled = count === 0; | |
} | |
}); | |
} | |
function filterEvents() { | |
const searchTerm = searchInput.value.toLowerCase(); | |
const eventType = eventTypeFilter.value; | |
const industry = industryFilter.value; | |
const country = countryFilter.value; | |
const eventItems = eventList.querySelectorAll('.event-item'); | |
eventItems.forEach(item => { | |
const title = item.querySelector('.event-title').textContent.toLowerCase(); | |
const description = item.querySelector('.event-description').textContent.toLowerCase(); | |
const itemEventType = (item.dataset.eventType || '').replace('⁠', '').trim(); | |
const itemIndustry = (item.dataset.eventIndustry || ''); | |
const itemCountry = (item.dataset.eventCountry || ''); | |
const matchesSearch = title.includes(searchTerm) || description.includes(searchTerm); | |
const matchesEventType = eventType === 'All' || itemEventType === eventType; | |
const matchesIndustry = industry === 'All' || itemIndustry === industry; | |
const matchesCountry = country === 'All' || itemCountry === country; | |
if (matchesSearch && matchesEventType && matchesIndustry && matchesCountry) { | |
item.style.display = ''; | |
} else { | |
item.style.display = 'none'; | |
} | |
}); | |
updateFilterOptions(); | |
updateNoResultsMessage(); | |
} | |
function updateNoResultsMessage() { | |
const visibleEvents = eventList.querySelectorAll('.event-item:not([style*="display: none"])'); | |
let noResultsMessage = document.getElementById('noResultsMessage'); | |
if (visibleEvents.length === 0) { | |
if (!noResultsMessage) { | |
let eventListMsg = document.querySelector('.event-list'); | |
noResultsMessage = document.createElement('p'); | |
noResultsMessage.id = 'noResultsMessage'; | |
noResultsMessage.textContent = eventListMsg.getAttribute('data-event-noevents') || 'No events found matching your criteria.'; | |
eventList.appendChild(noResultsMessage); | |
} | |
} else if (noResultsMessage) { | |
noResultsMessage.remove(); | |
} | |
} | |
function toggleFilters() { | |
filtersContainer.style.display = filtersContainer.style.display === 'none' ? 'block' : 'none'; | |
} | |
searchInput.addEventListener('input', filterEvents); | |
eventTypeFilter.addEventListener('change', filterEvents); | |
industryFilter.addEventListener('change', filterEvents); | |
countryFilter.addEventListener('change', filterEvents); | |
toggleFiltersBtn.addEventListener('click', toggleFilters); | |
// Initial filter to handle any default values and set up filter options | |
updateFilterOptions(); | |
filterEvents(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment