(function ($) { $(document).ready(function () { // --- JavaScript for Return URL on Form Submission --- // Listen for submission on any form that *might* contain a 'return_url' input $('form').on('submit', function () { var $form = $(this); var $returnUrlInput = $form.find('input[name="return_url"]'); if ($returnUrlInput.length > 0) { $returnUrlInput.val(window.location.href); } }); // --- End JavaScript for Return URL on Form Submission --- // --- JavaScript for Collapsible Headers (independent toggling + edit mode logic) --- $('.collapsible-header').on('click', function () { var $button = $(this); var targetId = $button.data('target-id'); var $targetContent = $('#' + targetId); $targetContent.toggleClass('is-hidden'); $button.toggleClass('is-collapsed'); var isExpanded = $button.attr('aria-expanded') === 'true'; $button.attr('aria-expanded', !isExpanded); // --- LOGIC FOR tagged-item-edit-mode --- if ($targetContent.hasClass('edit-tags-collapsible')) { var $taggedItemContainer = $targetContent.closest('.tagged-item-container'); if ($taggedItemContainer.length > 0) { if ($targetContent.hasClass('is-hidden')) { $taggedItemContainer.removeClass('tagged-item-edit-mode'); } else { $taggedItemContainer.addClass('tagged-item-edit-mode'); } } } // --- END LOGIC --- }); // --- End JavaScript for Collapsible Headers --- var $allTaggedItems = $('.tagged-item-list .tagged-item-container'); var totalItems = $allTaggedItems.length; var $clearAllBtn = $('#clearAllFiltersBtn'); var $toggleAdminControlsBtn = $('#toggleAdminControls'); var filterParamMap = { 'tag_filter': 'tags', 'search_term': 'q', 'letter_filter': 'letter' }; // Event listeners for applying filters $('.tag-filter-sidebar input[type="checkbox"]').on('change', function () { applyFilters(); }); $('#searchBarFilter').on('input', function () { applyFilters(); }); // --- LETTER FILTERS CLICK HANDLER --- $('.letter-filters button').on('click', function () { var $thisButton = $(this); var selectedLetterOnButton = $thisButton.data('letter'); var isActive = $thisButton.hasClass('is-active-letter-filter'); // Toggle the active state for the clicked button $('.letter-filters button').removeClass('is-active-letter-filter'); if (!isActive) { $thisButton.addClass('is-active-letter-filter'); } // If it WAS active, then clicking it again will just clear the active class, which is correct for toggling off. // Always re-apply filters after a letter button click applyFilters(); }); // --- END LETTER FILTERS CLICK HANDLER --- // Event listeners for removing active filters from the display $('#activeTagFilters').on('click', '.active-tag-item[data-filter-type="tag"]', function () { var tagToRemove = $(this).data('tag-value'); $('.tag-filter-sidebar input[type="checkbox"][value="' + tagToRemove + '"]').prop('checked', false); applyFilters(); }); $('#activeTagFilters').on('click', '.active-tag-item[data-filter-type="search"]', function () { $('#searchBarFilter').val(''); applyFilters(); }); // --- ACTIVE LETTER FILTER REMOVAL --- $('#activeTagFilters').on('click', '.active-tag-item[data-filter-type="letter"]', function () { var letterToRemove = $(this).data('tag-value'); // Ensure the corresponding letter button is deactivated $('.letter-filters button[data-letter="' + letterToRemove + '"]').removeClass('is-active-letter-filter'); applyFilters(); }); // --- END ACTIVE LETTER FILTER REMOVAL --- // Clear all filters button $clearAllBtn.on('click', function () { $('.tag-filter-sidebar input[type="checkbox"]').prop('checked', false); $('#searchBarFilter').val(''); $('.letter-filters button').removeClass('is-active-letter-filter'); applyFilters(); }); // Toggle Admin Controls Visibility (if #toggleAdminControls exists) if ($toggleAdminControlsBtn.length) { $toggleAdminControlsBtn.on('click', function () { $('.tag-admin-control').toggleClass('is-hidden'); }); } // --- MAIN FILTER APPLICATION LOGIC --- function applyFilters() { var selectedTags = []; $('.tag-filter-sidebar input[type="checkbox"]:checked').each(function () { selectedTags.push($(this).val()); }); var searchTerm = $('#searchBarFilter').val().toLowerCase().trim(); // Correctly get the currently active letter filter var selectedLetter = $('.letter-filters button.is-active-letter-filter').data('letter') || ''; $allTaggedItems.each(function () { var $item = $(this).find('a.tagged-item'); var itemTags = []; $item.find('.tagged-item-tags .item-tag').each(function () { itemTags.push($(this).text().trim()); }); var itemFullText = $item.text().toLowerCase(); var itemNameFirstChar = $item.find('.tagged-item-name').text().trim().charAt(0); var matchesTags = true; if (selectedTags.length > 0) { for (var i = 0; i < selectedTags.length; i++) { if (!itemTags.includes(selectedTags[i])) { matchesTags = false; break; } } } var matchesSearch = true; if (searchTerm.length > 0) { matchesSearch = itemFullText.includes(searchTerm); } // --- LETTER MATCHING LOGIC --- var matchesLetter = true; if (selectedLetter.length > 0) { // Check if item's first character matches selected letter or is a number for '0-9' if (selectedLetter === '0-9') { matchesLetter = !isNaN(parseInt(itemNameFirstChar, 10)); } else { matchesLetter = (itemNameFirstChar.toLowerCase() === selectedLetter.toLowerCase()); } } // --- END LETTER MATCHING LOGIC --- var showItem = matchesTags && matchesSearch && matchesLetter; if (showItem) { $item.parent().removeClass('is-hidden').removeAttr('aria-hidden'); } else { $item.parent().addClass('is-hidden').attr('aria-hidden', 'true'); } }); $allTaggedItems.find('.item-tag').removeClass('is-active-tag'); if (selectedTags.length > 0) { $allTaggedItems.each(function () { var $item = $(this); if (!$item.hasClass('is-hidden')) { $item.find('.item-tag').each(function () { var $itemTag = $(this); if (selectedTags.includes($itemTag.text().trim())) { $itemTag.addClass('is-active-tag'); } }); } }); } updateActiveFiltersDisplay(selectedTags, searchTerm, selectedLetter); updateItemCountDisplay(); updateUrlParameters(selectedTags, searchTerm, selectedLetter); } // --- END MAIN FILTER APPLICATION LOGIC --- // Functions for updating the display of active filters, item count, and URL // --- updateActiveFiltersDisplay --- function updateActiveFiltersDisplay(selectedTags, searchTerm, selectedLetter) { var $activeTagFilters = $('#activeTagFilters'); $activeTagFilters.empty(); $.each(selectedTags, function (index, tagValue) { var $activeTag = $(''); $activeTag.text(tagValue); $activeTag.attr('data-tag-value', tagValue); var $removeButton = $('').html('×'); $activeTag.append($removeButton); $activeTagFilters.append($activeTag); }); if (searchTerm.length > 0) { var $activeSearchTag = $(''); $activeSearchTag.text('Search: "' + searchTerm + '"'); $activeSearchTag.attr('data-tag-value', searchTerm); var $removeButton = $('').html('×'); $activeSearchTag.append($removeButton); $activeTagFilters.append($activeSearchTag); } // Ensure the letter filter is correctly displayed when selected if (selectedLetter.length > 0) { var displayLetter = (selectedLetter === '0-9') ? '0-9' : selectedLetter.toUpperCase(); var $activeLetterTag = $(''); $activeLetterTag.text('Starts with: "' + displayLetter + '"'); $activeLetterTag.attr('data-tag-value', selectedLetter); var $removeButton = $('').html('×'); $activeLetterTag.append($removeButton); $activeTagFilters.append($activeLetterTag); } } // --- END updateActiveFiltersDisplay --- function updateItemCountDisplay() { var visibleItemsCount = $('.tagged-item-list .tagged-item-container:not(.is-hidden)').length; var $itemCountDiv = $('.item-count'); if (visibleItemsCount === totalItems) { $itemCountDiv.text('Showing ' + totalItems); } else { $itemCountDiv.text('Showing ' + visibleItemsCount + ' of ' + totalItems); } } function updateUrlParameters(tags, searchTerm, selectedLetter) { var url = new URL(window.location.href); var params = url.searchParams; params.delete(filterParamMap['tag_filter']); params.delete(filterParamMap['search_term']); params.delete(filterParamMap['letter_filter']); tags.forEach(function (tag) { params.append(filterParamMap['tag_filter'], tag); }); if (searchTerm.length > 0) { params.set(filterParamMap['search_term'], searchTerm); } if (selectedLetter.length > 0) { params.set(filterParamMap['letter_filter'], selectedLetter); } history.pushState(null, '', url.toString()); } function initializeFiltersFromUrl() { var urlParams = new URLSearchParams(window.location.search); var urlTags = urlParams.getAll(filterParamMap['tag_filter']); var urlSearchTerm = urlParams.get(filterParamMap['search_term']) || ''; var urlLetter = urlParams.get(filterParamMap['letter_filter']) || ''; if (urlTags.length > 0) { urlTags.forEach(function (tag) { $('.tag-filter-sidebar input[type="checkbox"][value="' + tag + '"]').prop('checked', true); }); } if (urlSearchTerm.length > 0) { $('#searchBarFilter').val(urlSearchTerm); } if (urlLetter.length > 0) { var targetButtonDataValue = (urlLetter === '0-9') ? '0-9' : urlLetter.toUpperCase(); $('.letter-filters button[data-letter="' + targetButtonDataValue + '"]').addClass('is-active-letter-filter'); } applyFilters(); } initializeFiltersFromUrl(); }); })(jQuery);