Replace loan checkbox with 3-option dropdown on pending table

Loans filter now offers: All Workers / With loans only / Without loans.
Replaces the simpler exclude-only checkbox for more flexibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Konrad du Plessis 2026-03-24 22:57:14 +02:00
parent 1b6ade87af
commit 3bb75c5615

View File

@ -233,9 +233,13 @@
<input type="checkbox" class="form-check-input" id="pendingOverdueOnly">
<label class="form-check-label text-muted small" for="pendingOverdueOnly">Overdue only</label>
</div>
<div class="form-check mb-0">
<input type="checkbox" class="form-check-input" id="pendingExcludeLoans">
<label class="form-check-label text-muted small" for="pendingExcludeLoans">Exclude workers with loans</label>
<div class="d-flex align-items-center gap-2">
<label class="text-muted small mb-0" for="pendingLoanFilter">Loans:</label>
<select id="pendingLoanFilter" class="form-select form-select-sm" style="width: auto;">
<option value="">All Workers</option>
<option value="with">With loans only</option>
<option value="without">Without loans</option>
</select>
</div>
</div>
@ -802,25 +806,27 @@ document.addEventListener('DOMContentLoaded', function() {
var pendingTable = document.getElementById('pendingTable');
var pendingTeamFilter = document.getElementById('pendingTeamFilter');
var pendingOverdueOnly = document.getElementById('pendingOverdueOnly');
var pendingExcludeLoans = document.getElementById('pendingExcludeLoans');
var pendingLoanFilter = document.getElementById('pendingLoanFilter');
if (pendingTable && pendingTeamFilter) {
function applyPendingFilters() {
var team = pendingTeamFilter.value;
var overdueOnly = pendingOverdueOnly ? pendingOverdueOnly.checked : false;
var excludeLoans = pendingExcludeLoans ? pendingExcludeLoans.checked : false;
var loanMode = pendingLoanFilter ? pendingLoanFilter.value : '';
var rows = pendingTable.querySelectorAll('tbody tr[data-team]');
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var teamMatch = !team || row.dataset.team === team;
var overdueMatch = !overdueOnly || row.dataset.overdue === 'true';
var loanMatch = !excludeLoans || row.dataset.hasLoan !== 'true';
var loanMatch = !loanMode
|| (loanMode === 'with' && row.dataset.hasLoan === 'true')
|| (loanMode === 'without' && row.dataset.hasLoan !== 'true');
row.style.display = (teamMatch && overdueMatch && loanMatch) ? '' : 'none';
}
}
pendingTeamFilter.addEventListener('change', applyPendingFilters);
if (pendingOverdueOnly) pendingOverdueOnly.addEventListener('change', applyPendingFilters);
if (pendingExcludeLoans) pendingExcludeLoans.addEventListener('change', applyPendingFilters);
if (pendingLoanFilter) pendingLoanFilter.addEventListener('change', applyPendingFilters);
}
// =================================================================