186 lines
7.4 KiB
HTML
186 lines
7.4 KiB
HTML
{{ define "main" }}
|
|
{{/* Pass the current section to the JavaScript via data attributes */}}
|
|
{{/* Also add a data attribute mapping section names to category names */}}
|
|
<div class="tabs" id="tabs"
|
|
data-current-section="{{ .Section }}"
|
|
data-section-mappings='{
|
|
"books": "Books",
|
|
"movies": "Movies",
|
|
"tvseries": "TV Series",
|
|
"recipes": "Recipes",
|
|
"youtube": "YouTube",
|
|
"music": "Music",
|
|
"concerts": "Concerts",
|
|
"restaurants": "Restaurants"
|
|
}'>
|
|
{{ $categories := slice "Books" "Movies" "TV Series" "Recipes" "YouTube" "Music" "Concerts" "Restaurants" }}
|
|
{{ range $i, $cat := $categories }}
|
|
<div class="tab" data-tab="{{ $cat }}">{{ $cat }}</div>
|
|
{{ end }}
|
|
</div>
|
|
|
|
<div class="cards" id="cards">
|
|
{{ range .Site.RegularPages }}
|
|
{{ if not (eq .Params.draft true) }}
|
|
{{ partial "card.html" . }}
|
|
{{ end }}
|
|
{{ end }}
|
|
</div>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
console.log('SCRIPT: DOMContentLoaded event fired.');
|
|
|
|
const tabsContainer = document.getElementById('tabs');
|
|
console.log('SCRIPT: tabsContainer:', tabsContainer);
|
|
if (!tabsContainer) {
|
|
console.error('SCRIPT ERROR: Could not find tabsContainer (#tabs). Stopping script.');
|
|
return;
|
|
}
|
|
|
|
const originalTabs = Array.from(tabsContainer.querySelectorAll('.tab'));
|
|
console.log('SCRIPT: originalTabs (from HTML):', originalTabs, 'Count:', originalTabs.length);
|
|
|
|
const cardsContainer = document.getElementById('cards');
|
|
console.log('SCRIPT: cardsContainer:', cardsContainer);
|
|
if (!cardsContainer) {
|
|
console.error('SCRIPT ERROR: Could not find cardsContainer (#cards). Stopping script.');
|
|
return;
|
|
}
|
|
const allCards = Array.from(cardsContainer.children);
|
|
console.log('SCRIPT: allCards (direct children of #cards):', allCards, 'Count:', allCards.length);
|
|
|
|
const currentSection = tabsContainer.getAttribute('data-current-section');
|
|
console.log('SCRIPT: currentSection (from data-current-section):', currentSection);
|
|
let sectionMappings = {};
|
|
try {
|
|
const mappingsAttr = tabsContainer.getAttribute('data-section-mappings');
|
|
console.log('SCRIPT: data-section-mappings attribute:', mappingsAttr);
|
|
if (mappingsAttr) {
|
|
sectionMappings = JSON.parse(mappingsAttr);
|
|
}
|
|
console.log('SCRIPT: parsed sectionMappings:', sectionMappings);
|
|
} catch (e) {
|
|
console.error('SCRIPT ERROR: Error parsing section mappings:', e);
|
|
}
|
|
|
|
const currentCategory = sectionMappings[currentSection] || null;
|
|
console.log('SCRIPT: currentCategory (mapped from currentSection):', currentCategory);
|
|
|
|
const knownCategories = originalTabs.map(tab => tab.getAttribute('data-tab'));
|
|
console.log('SCRIPT: knownCategories (from originalTabs):', knownCategories);
|
|
|
|
console.log('SCRIPT: Creating and prepending "All" tab...');
|
|
const allTab = document.createElement('div');
|
|
allTab.className = 'tab';
|
|
allTab.textContent = 'All';
|
|
allTab.setAttribute('data-tab', 'all');
|
|
tabsContainer.prepend(allTab);
|
|
console.log('SCRIPT: "All" tab prepended:', allTab);
|
|
|
|
function activateTabAndFilter(selectedCategory) {
|
|
console.log('FUNC activateTabAndFilter: Filtering by category:', selectedCategory);
|
|
|
|
document.querySelectorAll('#tabs .tab').forEach(t => {
|
|
if (t.getAttribute('data-tab') === selectedCategory) {
|
|
t.classList.add('active');
|
|
} else {
|
|
t.classList.remove('active');
|
|
}
|
|
});
|
|
console.log('FUNC activateTabAndFilter: Active states updated for tabs.');
|
|
|
|
// Get the consumed filter status from window global
|
|
const consumedFilter = window.currentConsumedFilter || 'consumed';
|
|
console.log('FUNC activateTabAndFilter: Current consumed filter is:', consumedFilter);
|
|
|
|
let visibleCount = 0;
|
|
allCards.forEach(cardLinkElement => {
|
|
const cardDiv = cardLinkElement.querySelector('.card');
|
|
if (!cardDiv) {
|
|
console.warn('FUNC activateTabAndFilter: Card structure issue: .card div not found inside', cardLinkElement);
|
|
cardLinkElement.style.display = 'none';
|
|
return;
|
|
}
|
|
|
|
// Check category visibility first
|
|
let categoryVisible = false;
|
|
if (selectedCategory === 'all') {
|
|
categoryVisible = true;
|
|
} else {
|
|
const cardCategoryAttr = cardDiv.getAttribute('data-category');
|
|
categoryVisible = (cardCategoryAttr === selectedCategory);
|
|
}
|
|
|
|
// Now check consumed status
|
|
const cardData = cardLinkElement.querySelector('meta[name="card-data"]');
|
|
let consumedStatus;
|
|
if (cardData) {
|
|
try {
|
|
const cardDataObj = JSON.parse(cardData.getAttribute('content'));
|
|
consumedStatus = cardDataObj.consumed;
|
|
} catch (e) {
|
|
console.warn('FUNC activateTabAndFilter: Error parsing card data:', e);
|
|
}
|
|
}
|
|
|
|
// Determine visibility based on consumed filter
|
|
let consumedVisible = true; // Default to true if no consumed status is specified
|
|
|
|
if (consumedFilter === 'consumed') {
|
|
// Show only consumed=true or consumed not specified
|
|
consumedVisible = (consumedStatus !== false);
|
|
} else if (consumedFilter === 'not-consumed') {
|
|
// Show only consumed=false
|
|
consumedVisible = (consumedStatus === false);
|
|
}
|
|
// If consumedFilter is 'all', then consumedVisible remains true
|
|
|
|
// Final visibility is the combination of both filters
|
|
const isVisible = categoryVisible && consumedVisible;
|
|
cardLinkElement.style.display = isVisible ? '' : 'none';
|
|
if (isVisible) visibleCount++;
|
|
});
|
|
|
|
console.log('FUNC activateTabAndFilter: Visible cards after filtering:', visibleCount);
|
|
}
|
|
|
|
let initialCategoryToDisplay = 'all';
|
|
if (currentSection && currentCategory && knownCategories.includes(currentCategory)) {
|
|
initialCategoryToDisplay = currentCategory;
|
|
}
|
|
console.log('SCRIPT: initialCategoryToDisplay determined as:', initialCategoryToDisplay);
|
|
|
|
console.log('SCRIPT: Attaching click listeners to tabs...');
|
|
const allTabsForListeners = document.querySelectorAll('#tabs .tab');
|
|
console.log('SCRIPT: Found', allTabsForListeners.length, 'tabs to attach listeners to.');
|
|
allTabsForListeners.forEach((tab, index) => {
|
|
console.log(`SCRIPT: Attaching listener to tab ${index + 1}:`, tab);
|
|
tab.addEventListener('click', function() {
|
|
console.log('EVENT HANDLER: Tab clicked:', this);
|
|
const categoryToFilter = this.getAttribute('data-tab');
|
|
console.log('EVENT HANDLER: Category to filter (from data-tab):', categoryToFilter);
|
|
if (!categoryToFilter) {
|
|
console.error('EVENT HANDLER ERROR: data-tab attribute is missing or empty for the clicked tab:', this);
|
|
return;
|
|
}
|
|
activateTabAndFilter(categoryToFilter);
|
|
});
|
|
});
|
|
console.log('SCRIPT: Finished attaching click listeners.');
|
|
|
|
console.log('SCRIPT: Calling activateTabAndFilter for initial page load with category:', initialCategoryToDisplay);
|
|
activateTabAndFilter(initialCategoryToDisplay);
|
|
console.log('SCRIPT: Initial page load filtering complete.');
|
|
|
|
// Listen for consumed filter changes from the sidebar
|
|
document.addEventListener('consumedFilterChanged', function(event) {
|
|
console.log('EVENT: consumedFilterChanged received in list.html with filterType:', event.detail.filterType);
|
|
// Re-apply the current category filter when the consumed filter changes
|
|
const currentCategory = document.querySelector('#tabs .tab.active').getAttribute('data-tab');
|
|
activateTabAndFilter(currentCategory);
|
|
});
|
|
|
|
});
|
|
</script>
|
|
{{ end }}
|