mirror of
https://gitea.baerentsen.space/FrederikBaerentsen/BrickTracker.git
synced 2025-12-21 08:39:53 -06:00
feat: added clear filter button to sets/parts/problems/minifigures
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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']);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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']);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user