(function(){'use strict'; const KEY='focus_desk_tasks'; function load(){try{const r=localStorage.getItem(KEY);if(!r)return[];const d=JSON.parse(r);return Array.isArray(d)?d.filter(t=>t&&typeof t.id==='string'&&typeof t.title==='string'&&typeof t.completed==='boolean'):[];}catch(_){return[];}} function save(){localStorage.setItem(KEY,JSON.stringify(tasks));} let tasks=load(); function uid(){return Date.now().toString(36)+Math.random().toString(36).slice(2,7);} const $=id=>document.getElementById(id); const createForm=$('create-form'),titleIn=$('task-title-input'),notesIn=$('task-notes-input'),priSel=$('task-priority-select'),dueIn=$('task-due-input'),titleErr=$('title-error'); const searchIn=$('search-input'),statusF=$('status-filter-select'),priF=$('priority-filter-select'); const taskList=$('task-list'),emptyEl=$('empty-state'); const cTotal=document.querySelector('[data-testid="count-total"]'),cActive=document.querySelector('[data-testid="count-active"]'),cDone=document.querySelector('[data-testid="count-completed"]'); const editModal=$('edit-modal'),editForm=$('edit-form'),editTitleIn=$('edit-title-input'),editNotesIn=$('edit-notes-input'),editPri=$('edit-priority-select'),editDue=$('edit-due-input'),editTitleErr=$('edit-title-error'),cancelBtn=$('cancel-edit'); let editId=null; function esc(s){const d=document.createElement('div');d.textContent=s;return d.innerHTML;} function fmtDate(iso){if(!iso)return'';const[y,m,d]=iso.split('-').map(Number);return new Date(y,m-1,d).toLocaleDateString(undefined,{month:'short',day:'numeric',year:'numeric'});} function overdue(iso){if(!iso)return false;const[y,m,d]=iso.split('-').map(Number),due=new Date(y,m-1,d),now=new Date();now.setHours(0,0,0,0);return due{ 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 done=tasks.filter(t=>t.completed).length; cTotal.textContent=tasks.length;cActive.textContent=tasks.length-done;cDone.textContent=done; const list=filtered(); if(!list.length){taskList.innerHTML='';emptyEl.classList.remove('hidden');return;} emptyEl.classList.add('hidden'); const frag=document.createDocumentFragment(); list.forEach(t=>frag.appendChild(buildEl(t))); taskList.innerHTML='';taskList.appendChild(frag); } function buildEl(t){ const li=document.createElement('li'); li.setAttribute('data-testid','task-item'); li.dataset.id=t.id;li.dataset.priority=t.priority||'medium'; li.className='task-item'+(t.completed?' completed':''); const pl=t.priority?t.priority[0].toUpperCase()+t.priority.slice(1):'Medium'; const dueHtml=t.due?`Due ${fmtDate(t.due)}`:''; li.innerHTML=``+ `
${esc(t.title)}
`+ (t.notes?`
${esc(t.notes)}
`:'')+ `
${pl}${dueHtml}
`+ `
`+ ``+ `
`; li.querySelector('[data-testid="task-toggle"]').addEventListener('change',()=>{const tk=tasks.find(x=>x.id===t.id);if(tk){tk.completed=!tk.completed;save();render();}}); li.querySelector('[data-testid="task-edit"]').addEventListener('click',()=>openEdit(t.id)); li.querySelector('[data-testid="task-delete"]').addEventListener('click',()=>{tasks=tasks.filter(x=>x.id!==t.id);save();render();}); return li; } function openEdit(id){ const t=tasks.find(x=>x.id===id);if(!t)return; editId=id;editTitleIn.value=t.title;editNotesIn.value=t.notes||'';editPri.value=t.priority||'medium';editDue.value=t.due||''; editTitleErr.textContent='';editModal.classList.remove('hidden');editTitleIn.focus(); } function closeEdit(){editModal.classList.add('hidden');editId=null;} editForm.addEventListener('submit',e=>{ e.preventDefault(); if(!editTitleIn.value.trim()){editTitleErr.textContent='Title is required.';editTitleIn.focus();return;} editTitleErr.textContent=''; const t=tasks.find(x=>x.id===editId); if(t){t.title=editTitleIn.value.trim();t.notes=editNotesIn.value.trim();t.priority=editPri.value;t.due=editDue.value||'';} save();render();closeEdit(); }); cancelBtn.addEventListener('click',closeEdit); editModal.addEventListener('click',e=>{if(e.target===editModal)closeEdit();}); document.addEventListener('keydown',e=>{if(e.key==='Escape'&&!editModal.classList.contains('hidden'))closeEdit();}); createForm.addEventListener('submit',e=>{ e.preventDefault(); if(!titleIn.value.trim()){titleErr.textContent='Title is required.';titleIn.focus();return;} titleErr.textContent=''; tasks.unshift({id:uid(),title:titleIn.value.trim(),notes:notesIn.value.trim(),priority:priSel.value||'medium',due:dueIn.value||'',completed:false,createdAt:Date.now()}); save();render();createForm.reset();priSel.value='medium';titleIn.focus(); }); searchIn.addEventListener('input',render); statusF.addEventListener('change',render); priF.addEventListener('change',render); render(); })();