(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);