From 6be1cfb6ab5cc0c7c98f1f842e6ba43302f32ea9 Mon Sep 17 00:00:00 2001 From: deathcat Date: Wed, 11 Feb 2026 12:27:52 -0800 Subject: [PATCH] Finalize three-state toggle feature --- db.php | 2 +- index.php | 95 ++++++++++++++++++++++++++------------------ toggle_highlight.php | 33 +++++++++------ 3 files changed, 79 insertions(+), 51 deletions(-) diff --git a/db.php b/db.php index c8fb1ca..3d483a8 100644 --- a/db.php +++ b/db.php @@ -1,5 +1,5 @@ ${project.tasks.map(task => `
- ${task.name} + ${task.name}
@@ -615,31 +622,43 @@ document.querySelectorAll('.project-column').forEach(col => { }); }); - document.querySelectorAll('[data-task-id]').forEach(span => { - span.addEventListener('click', () => { - const taskId = span.dataset.taskId; - const isHighlighted = span.classList.toggle('highlighted'); + document.querySelectorAll('[data-task-id]').forEach(span => { + span.addEventListener('click', () => { + const taskId = span.dataset.taskId; - fetch('toggle_highlight.php', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ type: 'task', id: taskId, highlighted: isHighlighted }) - }); - }); - }); + fetch('toggle_highlight.php', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ type: 'task', id: taskId }) + }) + .then(res => res.json()) + .then(data => { + if (!data.success) return; - document.querySelectorAll('[data-subtask-id]').forEach(span => { - span.addEventListener('click', () => { - const subtaskId = span.dataset.subtaskId; - const isHighlighted = span.classList.toggle('highlighted'); + span.classList.toggle('highlighted', data.highlighted === 1); + span.classList.toggle('completed', data.highlighted === 2); + }); + }); + }); - fetch('toggle_highlight.php', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ type: 'subtask', id: subtaskId, highlighted: isHighlighted }) - }); - }); - }); + document.querySelectorAll('[data-subtask-id]').forEach(span => { + span.addEventListener('click', () => { + const subtaskId = span.dataset.subtaskId; + + fetch('toggle_highlight.php', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ type: 'subtask', id: subtaskId }) + }) + .then(res => res.json()) + .then(data => { + if (!data.success) return; + + span.classList.toggle('highlighted', data.highlighted === 1); + span.classList.toggle('completed', data.highlighted === 2); + }); + }); + }); let itemToDelete = null; diff --git a/toggle_highlight.php b/toggle_highlight.php index 5494b35..b16562f 100644 --- a/toggle_highlight.php +++ b/toggle_highlight.php @@ -3,19 +3,28 @@ require 'db.php'; $data = json_decode(file_get_contents('php://input'), true); -$type = $data['type']; -$id = intval($data['id']); -$highlighted = isset($data['highlighted']) && $data['highlighted'] ? 1 : 0; +$type = $data['type'] ?? ''; +$id = intval($data['id'] ?? 0); + +if ($id <= 0 || ($type !== 'task' && $type !== 'subtask')) { + echo json_encode(['success' => false, 'error' => 'Invalid request']); + exit; +} if ($type === 'task') { - $stmt = $pdo->prepare("UPDATE tasks SET highlighted = ? WHERE id = ?"); - $stmt->execute([$highlighted, $id]); - echo json_encode(['success' => true]); -} elseif ($type === 'subtask') { - $stmt = $pdo->prepare("UPDATE subtasks SET highlighted = ? WHERE id = ?"); - $stmt->execute([$highlighted, $id]); - echo json_encode(['success' => true]); + $stmt = $pdo->prepare("UPDATE tasks SET highlighted = (highlighted + 1) % 3 WHERE id = ?"); + $stmt->execute([$id]); + + $stmt = $pdo->prepare("SELECT highlighted FROM tasks WHERE id = ?"); + $stmt->execute([$id]); + $newState = intval($stmt->fetchColumn()); } else { - echo json_encode(['success' => false, 'error' => 'Invalid type']); + $stmt = $pdo->prepare("UPDATE subtasks SET highlighted = (highlighted + 1) % 3 WHERE id = ?"); + $stmt->execute([$id]); + + $stmt = $pdo->prepare("SELECT highlighted FROM subtasks WHERE id = ?"); + $stmt->execute([$id]); + $newState = intval($stmt->fetchColumn()); } -?> + +echo json_encode(['success' => true, 'highlighted' => $newState]);