feat: added clear filter button to sets/parts/problems/minifigures

This commit is contained in:
FrederikBaerentsen
2025-11-06 18:53:19 +01:00
parent 7567cb51af
commit 346f8e9908
9 changed files with 125 additions and 0 deletions

View File

@@ -434,6 +434,38 @@ window.applyFiltersAndKeepState = function(tableId, storageKey) {
}
};
// Shared function to clear all filters for a page (works in both pagination and client-side modes)
window.clearPageFilters = function(tableId, filterParams) {
const isPaginationMode = window.isPaginationModeForPage(tableId);
if (isPaginationMode) {
// SERVER-SIDE PAGINATION MODE: Remove filter parameters from URL
const currentUrl = new URL(window.location);
// Remove all filter parameters
filterParams.forEach(param => {
currentUrl.searchParams.delete(param);
});
// Reset to page 1
currentUrl.searchParams.set('page', '1');
// Navigate to cleaned URL
window.location.href = currentUrl.toString();
} else {
// CLIENT-SIDE MODE: Reset all filter dropdowns to "all"
filterParams.forEach(param => {
const select = document.getElementById(`filter-${param}`);
if (select) {
select.value = 'all';
}
});
// Trigger filter application (will use existing filter logic)
window.applyPageFilters(tableId);
}
};
// Shared initialization for table pages (parts, problems, minifigures)
window.initializeTablePage = function(config) {
const {

View File

@@ -166,6 +166,14 @@ document.addEventListener("DOMContentLoaded", () => {
const currentOrder = urlParams.get('order');
window.initializeSortButtonStates(currentSort, currentOrder);
}
// Initialize clear filters button
const clearButton = document.getElementById('table-filter-clear');
if (clearButton) {
clearButton.addEventListener('click', () => {
window.clearPageFilters('minifigures', ['owner', 'problems', 'theme', 'year']);
});
}
});
function setupSortButtons() {

View File

@@ -23,5 +23,13 @@ document.addEventListener("DOMContentLoaded", () => {
},
hasColorDropdown: true
});
// Initialize clear filters button
const clearButton = document.getElementById('table-filter-clear');
if (clearButton) {
clearButton.addEventListener('click', () => {
window.clearPageFilters('parts', ['owner', 'color', 'theme', 'year']);
});
}
});

View File

@@ -23,4 +23,12 @@ document.addEventListener("DOMContentLoaded", () => {
},
hasColorDropdown: true
});
// Initialize clear filters button
const clearButton = document.getElementById('table-filter-clear');
if (clearButton) {
clearButton.addEventListener('click', () => {
window.clearPageFilters('problems', ['owner', 'color', 'theme', 'year', 'storage', 'tag']);
});
}
});

View File

@@ -22,6 +22,9 @@ document.addEventListener("DOMContentLoaded", () => {
// Initialize duplicate filter functionality
initializeDuplicateFilter();
// Initialize clear filters button
initializeClearFiltersButton();
if (searchInput && searchClear) {
if (isPaginationMode()) {
// PAGINATION MODE - Server-side search
@@ -704,4 +707,58 @@ function triggerGridRefresh() {
}
}
}
}
// Initialize clear filters button functionality
function initializeClearFiltersButton() {
const clearFiltersButton = document.getElementById('grid-filter-clear');
if (!clearFiltersButton) return;
clearFiltersButton.addEventListener('click', () => {
if (isPaginationMode()) {
// SERVER-SIDE PAGINATION MODE: Remove filter parameters from URL
const currentUrl = new URL(window.location);
// Remove all filter parameters
const filterParams = ['status', 'theme', 'year', 'owner', 'purchase_location', 'storage', 'tag', 'duplicate'];
filterParams.forEach(param => {
currentUrl.searchParams.delete(param);
});
// Reset to page 1
currentUrl.searchParams.set('page', '1');
// Navigate to cleaned URL
window.location.href = currentUrl.toString();
} else {
// CLIENT-SIDE MODE: Reset all filter dropdowns to empty string
const filterDropdowns = [
'grid-status',
'grid-theme',
'grid-year',
'grid-owner',
'grid-purchase-location',
'grid-storage',
'grid-tag'
];
filterDropdowns.forEach(dropdownId => {
const dropdown = document.getElementById(dropdownId);
if (dropdown) {
dropdown.value = '';
}
});
// Clear duplicate filter if active
const duplicateButton = document.getElementById('duplicate-filter-toggle');
if (duplicateButton && duplicateButton.classList.contains('btn-secondary')) {
duplicateButton.classList.remove('btn-secondary');
duplicateButton.classList.add('btn-outline-secondary');
applyDuplicateFilter(false);
}
// Trigger filtering if grid instance exists
triggerGridRefresh();
}
});
}

View File

@@ -23,6 +23,9 @@
<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#table-filter" aria-expanded="{% if config['SHOW_GRID_FILTERS'] %}true{% else %}false{% endif %}" aria-controls="table-filter">
<i class="ri-filter-line"></i> Filters
</button>
<button id="table-filter-clear" class="btn btn-outline-danger" type="button" title="Clear all filters">
<i class="ri-filter-off-line"></i> <span class="d-none d-md-inline">Clear</span>
</button>
</div>
</div>
</div>

View File

@@ -24,6 +24,9 @@
<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#table-filter" aria-expanded="{% if config['SHOW_GRID_FILTERS'] %}true{% else %}false{% endif %}" aria-controls="table-filter">
<i class="ri-filter-line"></i> Filters
</button>
<button id="table-filter-clear" class="btn btn-outline-danger" type="button" title="Clear all filters">
<i class="ri-filter-off-line"></i> <span class="d-none d-md-inline">Clear</span>
</button>
</div>
</div>
</div>

View File

@@ -24,6 +24,9 @@
<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#table-filter" aria-expanded="{% if config['SHOW_GRID_FILTERS'] %}true{% else %}false{% endif %}" aria-controls="table-filter">
<i class="ri-filter-line"></i> Filters
</button>
<button id="table-filter-clear" class="btn btn-outline-danger" type="button" title="Clear all filters">
<i class="ri-filter-off-line"></i> <span class="d-none d-md-inline">Clear</span>
</button>
</div>
</div>
</div>

View File

@@ -22,6 +22,9 @@
<button class="btn btn-outline-primary" type="button" data-bs-toggle="collapse" data-bs-target="#grid-filter" aria-expanded="{% if config['SHOW_GRID_FILTERS'] %}true{% else %}false{% endif %}" aria-controls="grid-filter">
<i class="ri-filter-line"></i> Filters
</button>
<button id="grid-filter-clear" class="btn btn-outline-danger" type="button" title="Clear all filters">
<i class="ri-filter-off-line"></i> <span class="d-none d-md-inline">Clear</span>
</button>
{% if config['SHOW_SETS_DUPLICATE_FILTER'] %}
<button class="btn {% if current_duplicate_filter %}btn-secondary{% else %}btn-outline-secondary{% endif %}" type="button" id="duplicate-filter-toggle" title="Show duplicate sets only">
<i class="ri-stack-line"></i> Duplicates