Fix dashboard stat tiles and add sidebar date filters

- Created Today tile: no longer limits to open statuses (count is all statuses)
- Closed Today tile: filters by closed_at range, not updated_at
- Add closed_from/closed_to support to TicketModel and DashboardController
- Add Created/Updated/Closed date range inputs to sidebar filter panel
- Apply button collects date inputs; Clear All removes them
- removeFilter handles date chip removal (clears both _from and _to)
- Active filter chips shown for date ranges

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 23:03:14 -04:00
parent dd98bfbd49
commit 603ba18067
4 changed files with 91 additions and 38 deletions
+23 -32
View File
@@ -259,6 +259,12 @@ function removeFilter(filterType, filterValue) {
}
} else if (filterType === 'search') {
params.delete('search');
} else if (filterType === 'created_from') {
params.delete('created_from'); params.delete('created_to');
} else if (filterType === 'updated_from') {
params.delete('updated_from'); params.delete('updated_to');
} else if (filterType === 'closed_from') {
params.delete('closed_from'); params.delete('closed_to');
} else {
params.delete(filterType);
}
@@ -310,44 +316,33 @@ function initSidebarFilters() {
applyFiltersBtn.addEventListener('click', () => {
const params = new URLSearchParams(window.location.search);
// Collect selected statuses
// Checkboxes
const selectedStatuses = Array.from(
document.querySelectorAll('.lt-filter-group input[name="status"]:checked')
).map(cb => cb.value);
// Collect selected categories
const selectedCategories = Array.from(
document.querySelectorAll('.lt-filter-group input[name="category"]:checked')
).map(cb => cb.value);
// Collect selected types
const selectedTypes = Array.from(
document.querySelectorAll('.lt-filter-group input[name="type"]:checked')
).map(cb => cb.value);
// Update URL parameters
if (selectedStatuses.length > 0) {
params.set('status', selectedStatuses.join(','));
} else {
params.delete('status');
}
if (selectedStatuses.length > 0) params.set('status', selectedStatuses.join(','));
else params.delete('status');
if (selectedCategories.length > 0) params.set('category', selectedCategories.join(','));
else params.delete('category');
if (selectedTypes.length > 0) params.set('type', selectedTypes.join(','));
else params.delete('type');
if (selectedCategories.length > 0) {
params.set('category', selectedCategories.join(','));
} else {
params.delete('category');
}
// Date inputs
const dateFields = ['created_from','created_to','updated_from','updated_to','closed_from','closed_to'];
dateFields.forEach(name => {
const el = document.getElementById('filter-' + name.replace('_', '-'));
if (el && el.value) params.set(name, el.value);
else params.delete(name);
});
if (selectedTypes.length > 0) {
params.set('type', selectedTypes.join(','));
} else {
params.delete('type');
}
// Reset to page 1 when filters change
params.set('page', '1');
// Reload with new parameters
window.location.search = params.toString();
});
}
@@ -355,14 +350,10 @@ function initSidebarFilters() {
if (clearFiltersBtn) {
clearFiltersBtn.addEventListener('click', () => {
const params = new URLSearchParams(window.location.search);
// Remove filter parameters
params.delete('status');
params.delete('category');
params.delete('type');
['status','category','type',
'created_from','created_to','updated_from','updated_to','closed_from','closed_to'
].forEach(k => params.delete(k));
params.set('page', '1');
// Reload with cleared filters
window.location.search = params.toString();
});
}