(function() { const initApp = () => { const appContainer = document.getElementById('work-agenda-app'); if (!appContainer) return; // --- 1. ESTADO DE LA APLICACIÓN --- const state = new Proxy({ tasks: [], filter: 'all', loading: true, editingTaskId: null }, { set(target, property, value) { target[property] = value; if (property === 'tasks' || property === 'filter' || property === 'loading') { renderApp(); } return true; } }); // --- HELPER PARA LAS URLS CON TOKEN --- const getApiUrl = (endpoint = '') => { const config = window.WorkAgendaConfig || { root: '/wp-json/work-agenda/v1/', token: '' }; const separator = endpoint.includes('?') ? '&' : '?'; return `${config.root}${endpoint}${separator}token=${config.token}`; }; // --- 2. SERVICIOS API --- const API = { async fetchTasks() { state.loading = true; try { const response = await fetch(getApiUrl('tasks')); const data = await response.json(); state.tasks = Array.isArray(data) ? data : []; } catch (err) { console.error("Error cargando tareas:", err); state.tasks = []; } finally { state.loading = false; } }, async createTask(taskData) { try { const response = await fetch(getApiUrl('tasks'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(taskData) }); const newTask = await response.json(); if (newTask && newTask.id) { state.tasks = [newTask, ...state.tasks]; } } catch (err) { console.error("Error al guardar tarea:", err); } }, async updateTask(id, taskData) { state.tasks = state.tasks.map(t => t.id == id ? { ...t, ...taskData } : t); try { await fetch(getApiUrl(`tasks/${id}`), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(taskData) }); } catch (err) { console.error("Error al actualizar tarea:", err); API.fetchTasks(); } }, async toggleTaskStatus(id, currentStatus) { const newStatus = currentStatus === 'pending' ? 'completed' : 'pending'; state.tasks = state.tasks.map(t => t.id == id ? { ...t, status: newStatus } : t); try { await fetch(getApiUrl(`tasks/${id}`), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: newStatus }) }); } catch (err) { console.error("Error al actualizar estado:", err); API.fetchTasks(); } } }; // --- 3. COMPONENTES Y RENDERIZADO DE LA INTERFAZ --- function renderApp() { if (state.loading) { appContainer.innerHTML = `
Cargando tu Agenda...
`; return; } const pendingCount = state.tasks.filter(t => t.status === 'pending').length; const completedCount = state.tasks.filter(t => t.status === 'completed').length; const totalCount = state.tasks.length; const progressPercentage = totalCount > 0 ? Math.round((completedCount / totalCount) * 100) : 0; appContainer.innerHTML = `

Mi Agenda

${state.tasks.length === 0 ? '

¡Todo listo por hoy! No tienes tareas.

' : ''} ${state.tasks.map(task => `
`).join('')}

Crear Nueva Tarea

`; // --- 4. ASIGNACIÓN DE EVENTOS EN TIEMPO REAL --- const modal = document.getElementById('wa-task-modal'); const form = document.getElementById('wa-task-form'); const modalTitle = document.getElementById('wa-modal-title'); document.getElementById('wa-open-modal-btn').addEventListener('click', () => { state.editingTaskId = null; modalTitle.innerText = "Crear Nueva Tarea"; form.reset(); modal.classList.add('open'); }); document.getElementById('wa-close-modal-btn').addEventListener('click', () => modal.classList.remove('open')); document.querySelectorAll('.wa-clickable-content').forEach(content => { content.addEventListener('click', () => { const id = content.getAttribute('data-id'); const task = state.tasks.find(t => t.id == id); if (task) { state.editingTaskId = id; modalTitle.innerText = "Editar Tarea"; document.getElementById('task-title').value = task.title; document.getElementById('task-desc').value = task.description || ''; document.getElementById('task-priority').value = task.priority; document.getElementById('task-due').value = task.due_date ? task.due_date.substring(0, 10) : ''; modal.classList.add('open'); } }); }); form.addEventListener('submit', async (e) => { e.preventDefault(); const title = document.getElementById('task-title').value; const description = document.getElementById('task-desc').value; const priority = document.getElementById('task-priority').value; const due_date = document.getElementById('task-due').value || null; modal.classList.remove('open'); if (state.editingTaskId) { await API.updateTask(state.editingTaskId, { title, description, priority, due_date }); } else { await API.createTask({ title, description, priority, due_date }); } form.reset(); }); document.querySelectorAll('.wa-checkbox').forEach(box => { box.addEventListener('click', (e) => { e.stopPropagation(); const id = e.target.getAttribute('data-id'); const status = e.target.getAttribute('data-status'); API.toggleTaskStatus(id, status); }); }); } API.fetchTasks(); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initApp); } else { initApp(); } })();