Technician
This commit is contained in:
@@ -5,6 +5,7 @@ let invoices = [];
|
||||
let filterCustomer = localStorage.getItem('inv_filterCustomer') || '';
|
||||
let filterStatus = localStorage.getItem('inv_filterStatus') || 'unpaid';
|
||||
let groupBy = localStorage.getItem('inv_groupBy') || 'none';
|
||||
let filterWorker = localStorage.getItem('inv_filterWorker') || '';
|
||||
|
||||
const OVERDUE_DAYS = 30;
|
||||
|
||||
@@ -194,6 +195,7 @@ function saveSettings() {
|
||||
localStorage.setItem('inv_filterStatus', filterStatus);
|
||||
localStorage.setItem('inv_groupBy', groupBy);
|
||||
localStorage.setItem('inv_filterCustomer', filterCustomer);
|
||||
localStorage.setItem('inv_filterWorker', filterWorker);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
@@ -237,6 +239,13 @@ function getFilteredInvoices() {
|
||||
const s = filterCustomer.toLowerCase();
|
||||
f = f.filter(i => (i.customer_name || '').toLowerCase().includes(s));
|
||||
}
|
||||
if (filterWorker) {
|
||||
if (filterWorker === '__none__') {
|
||||
f = f.filter(i => !i.worker);
|
||||
} else {
|
||||
f = f.filter(i => i.worker === filterWorker);
|
||||
}
|
||||
}
|
||||
f.sort((a, b) => (parseLocalDate(b.invoice_date) || 0) - (parseLocalDate(a.invoice_date) || 0));
|
||||
return f;
|
||||
}
|
||||
@@ -563,6 +572,13 @@ export function injectToolbar() {
|
||||
class="px-3 py-1.5 border border-gray-300 rounded-md text-sm w-48 focus:ring-blue-500 focus:border-blue-500">
|
||||
</div>
|
||||
<div class="w-px h-8 bg-gray-300"></div>
|
||||
<div class="flex items-center gap-2">
|
||||
<label class="text-sm font-medium text-gray-700">Worker:</label>
|
||||
<select id="invoice-filter-worker" class="px-3 py-1.5 border border-gray-300 rounded-md text-sm bg-white">
|
||||
<option value="">All</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="w-px h-8 bg-gray-300"></div>
|
||||
<div class="flex items-center gap-2">
|
||||
<label class="text-sm font-medium text-gray-700">Group:</label>
|
||||
<select id="invoice-group-by" class="px-3 py-1.5 border border-gray-300 rounded-md text-sm bg-white">
|
||||
@@ -592,6 +608,11 @@ export function injectToolbar() {
|
||||
document.getElementById('invoice-group-by').addEventListener('change', (e) => {
|
||||
groupBy = e.target.value; saveSettings(); renderInvoiceView();
|
||||
});
|
||||
// Worker-Filter befüllen und verdrahten
|
||||
populateWorkerFilter();
|
||||
document.getElementById('invoice-filter-worker').addEventListener('change', (e) => {
|
||||
filterWorker = e.target.value; saveSettings(); renderInvoiceView();
|
||||
});
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
@@ -806,6 +827,33 @@ async function _saveSentDates(invoiceId) {
|
||||
alert('Network error.');
|
||||
}
|
||||
}
|
||||
|
||||
async function populateWorkerFilter() {
|
||||
const sel = document.getElementById('invoice-filter-worker');
|
||||
if (!sel) return;
|
||||
|
||||
// Worker aus den geladenen Rechnungen
|
||||
const fromInvoices = new Set(invoices.map(i => i.worker).filter(Boolean));
|
||||
|
||||
// Plus konfigurierte Liste aus Settings
|
||||
try {
|
||||
const result = await window.API.settings.get('invoice_workers');
|
||||
if (result && result.value) {
|
||||
result.value.split(',').map(w => w.trim()).filter(Boolean)
|
||||
.forEach(w => fromInvoices.add(w));
|
||||
}
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
const workers = [...fromInvoices].sort();
|
||||
const hasNoWorker = invoices.some(i => !i.worker);
|
||||
|
||||
sel.innerHTML =
|
||||
`<option value="">All</option>` +
|
||||
workers.map(w => `<option value="${w}">${w}</option>`).join('') +
|
||||
(hasNoWorker ? `<option value="__none__">— No worker —</option>` : '');
|
||||
|
||||
sel.value = filterWorker;
|
||||
}
|
||||
// ============================================================
|
||||
// Expose
|
||||
// ============================================================
|
||||
|
||||
Reference in New Issue
Block a user