/* ═══ CYPHER-HR Leaves Module ═══ */ const Leaves = { async adminView() { try { const leaves = await App.api('/api/leaves'); const pending = leaves.filter(l => l.status === 'pending'); const processed = leaves.filter(l => l.status !== 'pending'); return `
${pending.length === 0 ? '

No pending requests

' : ` ${pending.map(l => ``).join('')}
EmployeeTypeStartEndReasonActions
${App.avatar(l)}${l.first_name} ${l.last_name}
${l.leave_type} ${App.formatDate(l.start_date)} ${App.formatDate(l.end_date)} ${l.reason || '—'}
`}
${processed.length === 0 ? '

No processed requests

' : ` ${processed.map(l => ``).join('')}
EmployeeTypeDatesStatusRemarks
${App.avatar(l)}${l.first_name} ${l.last_name}
${l.leave_type} ${App.formatDate(l.start_date)} - ${App.formatDate(l.end_date)} ${App.statusBadge(l.status)} ${l.admin_remarks || '—'}
`}
`; } catch (err) { return `
${err.message}
`; } }, switchTab(tab, btn) { document.querySelectorAll('.tab').forEach(t => t.classList.remove('active')); document.querySelectorAll('.tab-content').forEach(t => t.classList.remove('active')); btn.classList.add('active'); document.getElementById(tab === 'pending' ? 'tabPending' : 'tabProcessed').classList.add('active'); }, async approve(id) { showModal('Approve Leave', `
`); }, async processApprove(e, id) { e.preventDefault(); try { await App.api(`/api/leaves/${id}/approve`, { method: 'PUT', body: JSON.stringify({ admin_remarks: document.getElementById('approveRemarks').value }) }); closeModal(); App.toast('Leave approved'); if (App.user.role === 'admin') Admin.navigate('leaves'); } catch (err) { App.toast(err.message, 'error'); } }, async reject(id) { showModal('Reject Leave', `
`); }, async processReject(e, id) { e.preventDefault(); try { await App.api(`/api/leaves/${id}/reject`, { method: 'PUT', body: JSON.stringify({ admin_remarks: document.getElementById('rejectRemarks').value }) }); closeModal(); App.toast('Leave rejected'); if (App.user.role === 'admin') Admin.navigate('leaves'); } catch (err) { App.toast(err.message, 'error'); } } };