diff --git a/src/main/resources/static/app.js b/src/main/resources/static/app.js index 293f51a..f416823 100644 --- a/src/main/resources/static/app.js +++ b/src/main/resources/static/app.js @@ -3,25 +3,11 @@ const API_BASE = '/api/tasks'; const taskInput = document.getElementById('taskInput'); const addBtn = document.getElementById('addBtn'); const taskList = document.getElementById('taskList'); -const totalCount = document.getElementById('totalCount'); -const pendingCount = document.getElementById('pendingCount'); -const doneCount = document.getElementById('doneCount'); - -function updateStats(tasks) { - const total = tasks.length; - const done = tasks.filter(t => t.completed).length; - const pending = total - done; - - totalCount.textContent = total; - pendingCount.textContent = pending; - doneCount.textContent = done; -} async function fetchTasks() { try { const response = await fetch(API_BASE); const tasks = await response.json(); - updateStats(tasks); renderTasks(tasks); } catch (error) { console.error('Error fetching tasks:', error); @@ -32,64 +18,29 @@ function renderTasks(tasks) { taskList.innerHTML = ''; if (tasks.length === 0) { - taskList.innerHTML = ` -
- / - no tasks yet -
type above to add your first task
-
- `; + taskList.innerHTML = '
No tasks yet. Add one above!
'; return; } - // Show pending tasks first, then completed - const sorted = [...tasks].sort((a, b) => { - if (a.completed !== b.completed) return a.completed ? 1 : -1; - return 0; - }); - - sorted.forEach((task, index) => { + tasks.forEach(task => { const li = document.createElement('li'); li.className = `task-item ${task.completed ? 'completed' : ''}`; - li.style.animationDelay = `${index * 0.04}s`; - - const indexSpan = document.createElement('span'); - indexSpan.className = 'task-index'; - indexSpan.textContent = String(index + 1).padStart(2, '0'); - - const checkboxWrapper = document.createElement('label'); - checkboxWrapper.className = 'checkbox-wrapper'; const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.checked = task.completed; checkbox.addEventListener('change', () => toggleTask(task)); - const checkboxCustom = document.createElement('span'); - checkboxCustom.className = 'checkbox-custom'; - checkboxCustom.innerHTML = ``; - - checkboxWrapper.appendChild(checkbox); - checkboxWrapper.appendChild(checkboxCustom); - - const nameSpan = document.createElement('span'); - nameSpan.className = 'task-name'; - nameSpan.textContent = task.name; + const span = document.createElement('span'); + span.textContent = task.name; const deleteBtn = document.createElement('button'); deleteBtn.className = 'delete-btn'; - deleteBtn.textContent = 'del'; - deleteBtn.addEventListener('click', (e) => { - e.stopPropagation(); - li.style.transition = 'all 0.3s ease'; - li.style.opacity = '0'; - li.style.transform = 'translateX(20px)'; - setTimeout(() => deleteTask(task.id), 250); - }); + deleteBtn.textContent = 'Delete'; + deleteBtn.addEventListener('click', () => deleteTask(task.id)); - li.appendChild(indexSpan); - li.appendChild(checkboxWrapper); - li.appendChild(nameSpan); + li.appendChild(checkbox); + li.appendChild(span); li.appendChild(deleteBtn); taskList.appendChild(li); }); @@ -97,13 +48,7 @@ function renderTasks(tasks) { async function addTask() { const name = taskInput.value.trim(); - if (!name) { - // Subtle shake on empty submit - taskInput.parentElement.style.animation = 'none'; - taskInput.parentElement.offsetHeight; // reflow - taskInput.parentElement.style.animation = 'shake 0.4s ease'; - return; - } + if (!name) return; try { const response = await fetch(API_BASE, { @@ -158,19 +103,6 @@ async function deleteTask(id) { } } -// Add shake animation dynamically -const styleEl = document.createElement('style'); -styleEl.textContent = ` - @keyframes shake { - 0%, 100% { transform: translateX(0); } - 20% { transform: translateX(-4px); } - 40% { transform: translateX(4px); } - 60% { transform: translateX(-3px); } - 80% { transform: translateX(2px); } - } -`; -document.head.appendChild(styleEl); - addBtn.addEventListener('click', addTask); taskInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { @@ -178,9 +110,4 @@ taskInput.addEventListener('keypress', (e) => { } }); -// Focus input on page load -window.addEventListener('load', () => { - taskInput.focus(); -}); - fetchTasks(); diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index b268439..4bee4ff 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -3,28 +3,8 @@ - todo. - - - + Todo App -
-
- -
-
-
task manager
-

todo.

-
-
- 0 total - 0 pending - 0 done -
-
- -
-
-
+
- - -
+
+

Todo List

+
+ +
- -
    - -
    - press Enter to add -
    -