(() => { 'use strict'; const KEY = 'focusdesk_tasks'; function load() { try { const raw = localStorage.getItem(KEY); if (!raw) return []; const p = JSON.parse(raw); if (!Array.isArray(p)) return []; return p.filter(t => t && typeof t.id === 'string' && typeof t.title === 'string'); } catch { return []; } } const save = ts => localStorage.setItem(KEY, JSON.stringify(ts)); const uid = () => Date.now().toString(36) + Math.random().toString(36).slice(2, 7); function fmtDate(iso) { if (!iso) return ''; const [y,m,d] = iso.split('-').map(Number); return new Date(y,m-1,d).toLocaleDateString('en-US',{month:'short',day:'numeric',year:'numeric'}); } function overdue(iso) { if (!iso) return false; const t = new Date(); t.setHours(0,0,0,0); const [y,m,d] = iso.split('-').map(Number); return new Date(y,m-1,d) < t; } let tasks = load(), editingId = null; const $ = id => document.getElementById(id); const $t = s => document.querySelector(`[data-testid="${s}"]`); const createForm = $('create-form'); const titleInput = $t('task-title'); const notesInput = $t('task-notes'); const priorityInput= $t('task-priority'); const dueInput = $t('task-due'); const titleError = $('title-error'); const searchInput = $t('search'); const statusFilter = $t('status-filter'); const priFilter = $t('priority-filter'); const taskList = $t('task-list'); const emptyState = $t('empty-state'); const emptyMsg = $('empty-message'); const emptySub = $('empty-sub'); const cTotal = $t('count-total'); const cActive = $t('count-active'); const cDone = $t('count-completed'); const editModal = $('edit-modal'); const editForm = $('edit-form'); const editTitle = $t('edit-title'); const editNotes = $('edit-notes-input'); const editPri = $('edit-priority-input'); const editDue = $('edit-due-input'); const editTitleErr = $('edit-title-error'); const cancelBtn = $('cancel-edit'); function getFiltered() { const q = searchInput.value.trim().toLowerCase(); const st = statusFilter.value, pr = priFilter.value; return tasks.filter(t => { if (st === 'active' && t.completed) return false; if (st === 'completed' && !t.completed) return false; if (pr !== 'all' && t.priority !== pr) return false; if (q && !t.title.toLowerCase().includes(q) && !(t.notes||'').toLowerCase().includes(q)) return false; return true; }); } function render() { const filtered = getFiltered(); const done = tasks.filter(t => t.completed).length; cTotal.textContent = tasks.length; cActive.textContent = tasks.length - done; cDone.textContent = done; taskList.innerHTML = ''; if (!filtered.length) { emptyState.hidden = false; const filtering = searchInput.value.trim() || statusFilter.value !== 'all' || priFilter.value !== 'all'; if (!tasks.length) { emptyMsg.textContent = 'No tasks yet'; emptySub.textContent = 'Add your first task to get started.'; } else if (filtering) { emptyMsg.textContent = 'No matching tasks'; emptySub.textContent = 'Try adjusting your search or filters.'; } else { emptyMsg.textContent = 'All done!'; emptySub.textContent = 'Great work – nothing left to show.'; } return; } emptyState.hidden = true; const PL = {low:'Low',medium:'Medium',high:'High'}; filtered.forEach(task => { const li = document.createElement('li'); li.className = 'task-item' + (task.completed ? ' completed' : ''); li.dataset.testid = 'task-item'; li.dataset.priority = task.priority; const dueHtml = task.due ? `${fmtDate(task.due)}` : ''; li.innerHTML = `