/* ============================================================ tasks.js — Recruitment Tasks (with saved searches & favorites) ============================================================ */ window.Views = window.Views || {}; window.Tasks = {}; Views.tasks = function () { const state = { filter: 'All' }; function render() { const el = document.getElementById('taskList'); if (!el) return; let list = DB.tasks; if (state.filter === 'Open') list = list.filter(t => !t.done); else if (state.filter === 'Completed') list = list.filter(t => t.done); else if (state.filter === 'Overdue') list = list.filter(t => !t.done && t.due < new Date('2026-07-09')); else if (['High', 'Medium', 'Low'].includes(state.filter)) list = list.filter(t => t.priority === state.filter); if (!list.length) { el.innerHTML = `
${UI.icon('check-square')}

All caught up

No tasks in this view.

`; return; } const prCls = { High: 'b-red', Medium: 'b-amber', Low: 'b-gray' }; el.innerHTML = list.map(t => { const overdue = !t.done && t.due < new Date('2026-07-09'); return `
${UI.icon('check')}
${t.title}
${UI.icon('users')} ${t.assignee} · ${t.type}
${UI.badge(t.priority, prCls[t.priority])}
${overdue ? 'Overdue · ' : 'Due '}${DB.fmtShort(t.due)}
`; }).join(''); el.querySelectorAll('.checkbox').forEach(chk => chk.onclick = e => { e.stopPropagation(); const t = DB.tasks.find(x => x.id === chk.dataset.id); t.done = !t.done; render(); App.updateBadges(); UI.toast(t.done ? 'Task completed' : 'Task reopened', t.done ? 'success' : 'info'); }); } Tasks._render = render; const openCount = DB.tasks.filter(t => !t.done).length; const overdueCount = DB.tasks.filter(t => !t.done && t.due < new Date('2026-07-09')).length; const filters = ['All', 'Open', 'Completed', 'Overdue', 'High', 'Medium', 'Low']; // saved searches sidebar const savedHtml = DB.savedSearches.map(s => `
${UI.icon('bookmark')}
${s.name}
${s.filters}
${s.count}
`).join(''); const html = `

Tasks

${openCount} open · ${overdueCount} overdue

${filters.map((f, i) => ``).join('')}

Saved Searches

Quick candidate filters
${savedHtml}
`; return { html, onMount() { render(); document.querySelectorAll('#taskSeg button').forEach(b => b.onclick = () => { document.querySelectorAll('#taskSeg button').forEach(x => x.classList.remove('active')); b.classList.add('active'); state.filter = b.dataset.f; render(); }); } }; }; Tasks.open = function (id) { const t = DB.tasks.find(x => x.id === id); const c = DB.getCandidate(t.candidateId); UI.modal({ title: t.title, subtitle: t.id + ' · ' + t.type, body: `
Assignee
${t.assignee}
Priority
${t.priority}
Due Date
${DB.fmtDate(t.due)}
Status
${t.done ? 'Completed' : 'Open'}
${c ? `
Candidate
${c.name}
` : ''}
`, footer: ` ${c ? `` : ''} ` }); }; Tasks._complete = function (id) { const t = DB.tasks.find(x => x.id === id); t.done = true; Tasks._render(); App.updateBadges(); UI.toast('Task completed', 'success'); }; Tasks.add = function () { const opt = arr => arr.map(o => ``).join(''); UI.modal({ title: 'New Task', subtitle: 'Create a recruitment task', body: `
Required
`, footer: `` }); }; Tasks._save = function () { const form = document.getElementById('taskForm'); UI.clearErrors(form); const f = Object.fromEntries(new FormData(form)); if (!f.title.trim()) { UI.fieldError(form.querySelector('[name=title]'), 'Required'); return; } DB.tasks.unshift({ id: 'TSK-' + (50001 + DB.tasks.length), title: f.title, candidateId: null, priority: f.priority, due: f.due ? new Date(f.due) : new Date('2026-07-16'), assignee: f.assignee, done: false, type: f.type }); UI.closeModal(); Tasks._render(); App.updateBadges(); UI.toast('Task created', 'success'); };