(function (A, D) {
function getOrderDisplayFields(o) {
const status = D.getEffectiveStatus(o, A.state.orderStatuses);
const done = D.isCompleted(o, A.state.orderStatuses);
const statusText = done ? (status === 'Gereed' ? 'Gereed' : 'Opname gereed') : 'Op te nemen';
return {
orderText: o.order + '/' + o.operatie,
typeText: o.objectsoort,
omschrText: o.omschrijving,
hoevhText: o.hoeveelheid + ' ' + o.eenheid,
statusText
};
}
function matchesColumnFilters(o) {
const d = getOrderDisplayFields(o);
const lc = s => s.toLowerCase();
const f = A.state.columnFilters;
if (f.order && !lc(d.orderText).includes(lc(f.order))) return false;
if (f.type && !lc(d.typeText).includes(lc(f.type))) return false;
if (f.omschrijving && !lc(d.omschrText).includes(lc(f.omschrijving))) return false;
if (f.hoeveelheid && !lc(d.hoevhText).includes(lc(f.hoeveelheid))) return false;
if (f.status && !lc(d.statusText).includes(lc(f.status))) return false;
return true;
}
function renderSummaryCards() {
const { orders, orderStatuses } = A.state;
const remaining = orders.filter(o => !D.isCompleted(o, orderStatuses));
const wissels = remaining.filter(o => o.objectsoort === 'Wissel').length;
const overwegen = remaining.filter(o => o.objectsoort === 'Overwegbevloering').length;
const spoorMeters = remaining.filter(o => o.objectsoort === 'Spoor')
.reduce((sum, o) => sum + o.hoeveelheid, 0);
document.getElementById('summaryCards').innerHTML = `
☷
${wissels}
Wissels nog op te nemen
▩
${overwegen}
Overwegbevloeringen nog op te nemen
⋮
${spoorMeters} m
Meter spoor nog op te nemen
∑
${remaining.length} / ${orders.length}
Totaal nog uit te voeren
`;
const done = orders.filter(o => D.isCompleted(o, orderStatuses)).length;
const pct = orders.length > 0 ? Math.round((done / orders.length) * 100) : 0;
document.getElementById('progressFill').style.width = pct + '%';
document.getElementById('progressText').textContent = `${done} van ${orders.length} voltooid (${pct}%)`;
}
function renderOrderTable(onRowClick) {
const tbody = document.getElementById('orderTableBody');
const filtered = A.state.orders.filter(o => {
if (A.state.currentFilter === 'open' && D.isCompleted(o, A.state.orderStatuses)) return false;
if (A.state.currentFilter !== 'alle' && A.state.currentFilter !== 'open'
&& o.objectsoort !== A.state.currentFilter) return false;
return matchesColumnFilters(o);
});
tbody.innerHTML = filtered.map(o => {
const d = getOrderDisplayFields(o);
const done = D.isCompleted(o, A.state.orderStatuses);
const typeClass = o.objectsoort === 'Wissel' ? 'wissel'
: o.objectsoort === 'Overwegbevloering' ? 'overweg' : 'spoor';
const statusClass = done ? 'done' : 'open';
return `
| ${o.order}/${o.operatie} |
${o.objectsoort} |
${o.omschrijving} |
${o.hoeveelheid} ${o.eenheid} |
${d.statusText} |
`;
}).join('');
tbody.querySelectorAll('tr[data-order-key]').forEach(tr => {
tr.addEventListener('click', () => onRowClick(tr.dataset.orderKey));
});
}
A.renderOverviewScreen = function (onRowClick) {
renderSummaryCards();
renderOrderTable(onRowClick);
};
A.setFilter = function (filter, onRowClick) {
A.state.currentFilter = filter;
document.querySelectorAll('.filter-btn').forEach(b => {
b.classList.toggle('active', b.dataset.filter === filter);
});
renderOrderTable(onRowClick);
};
A.setColumnFilter = function (col, value, onRowClick) {
A.state.columnFilters[col] = value;
renderOrderTable(onRowClick);
};
A.initColumnResize = function () {
const table = document.getElementById('orderTable');
if (!table) return;
const cols = table.querySelectorAll('colgroup col');
const handles = table.querySelectorAll('.col-resize');
handles.forEach(handle => {
handle.addEventListener('mousedown', startResize);
handle.addEventListener('touchstart', startResize, { passive: false });
});
function startResize(e) {
e.preventDefault();
e.stopPropagation();
const colIdx = parseInt(e.target.dataset.col);
const col = cols[colIdx];
if (!col) return;
const th = e.target.parentElement;
const startX = e.type === 'touchstart' ? e.touches[0].clientX : e.clientX;
const startWidth = th.offsetWidth;
e.target.classList.add('dragging');
function onMove(ev) {
const clientX = ev.type === 'touchmove' ? ev.touches[0].clientX : ev.clientX;
const newWidth = Math.max(50, startWidth + (clientX - startX));
col.style.width = newWidth + 'px';
}
function onUp() {
e.target.classList.remove('dragging');
document.removeEventListener('mousemove', onMove);
document.removeEventListener('mouseup', onUp);
document.removeEventListener('touchmove', onMove);
document.removeEventListener('touchend', onUp);
}
document.addEventListener('mousemove', onMove);
document.addEventListener('mouseup', onUp);
document.addEventListener('touchmove', onMove, { passive: false });
document.addEventListener('touchend', onUp);
}
};
})(window.App.Application, window.App.Domain);