setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); } // Create tables if they don't exist $create_groups_table = "CREATE TABLE IF NOT EXISTS groups ( group_id SERIAL PRIMARY KEY, group_name VARCHAR(255) NOT NULL UNIQUE )"; $create_tasks_table = "CREATE TABLE IF NOT EXISTS tasks ( task_id SERIAL PRIMARY KEY, group_id INT NOT NULL, task VARCHAR(255) NOT NULL, isdone BOOLEAN DEFAULT FALSE, task_desc VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (group_id) REFERENCES groups(group_id) ON DELETE CASCADE )"; $conn->exec($create_groups_table); $conn->exec($create_tasks_table); // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['add_group'])) { $group_name = trim($_POST['group_name']); if (!empty($group_name)) { try { $stmt = $conn->prepare("INSERT INTO groups (group_name) VALUES (?)"); $stmt->execute([$group_name]); } catch (PDOException $e) { $error_message = "Error adding group: Group name might already exist."; } } } if (isset($_POST['add_task'])) { $group_id = $_POST['group_id']; $task = trim($_POST['task']); $task_desc = trim($_POST['task_desc']); if (!empty($task) && !empty($group_id)) { // If task_desc is empty, provide a default value since it's NOT NULL if (empty($task_desc)) { $task_desc = "No description provided"; } $stmt = $conn->prepare("INSERT INTO tasks (group_id, task, task_desc, isdone) VALUES (?, ?, ?, FALSE)"); $stmt->execute([$group_id, $task, $task_desc]); } } if (isset($_POST['toggle_task'])) { $task_id = $_POST['task_id']; $stmt = $conn->prepare("UPDATE tasks SET isdone = NOT isdone WHERE task_id = ?"); $stmt->execute([$task_id]); } if (isset($_POST['delete_task'])) { $task_id = $_POST['task_id']; $stmt = $conn->prepare("DELETE FROM tasks WHERE task_id = ?"); $stmt->execute([$task_id]); } if (isset($_POST['delete_group'])) { $group_id = $_POST['group_id']; $stmt = $conn->prepare("DELETE FROM groups WHERE group_id = ?"); $stmt->execute([$group_id]); } if (isset($_POST['edit_task'])) { $task_id = $_POST['task_id']; $task = trim($_POST['task']); $task_desc = trim($_POST['task_desc']); if (!empty($task)) { // If task_desc is empty, provide a default value since it's NOT NULL if (empty($task_desc)) { $task_desc = "No description provided"; } $stmt = $conn->prepare("UPDATE tasks SET task = ?, task_desc = ? WHERE task_id = ?"); $stmt->execute([$task, $task_desc, $task_id]); } } } // Fetch all groups $groups_result = $conn->query("SELECT * FROM groups ORDER BY group_name"); $groups = $groups_result->fetchAll(PDO::FETCH_ASSOC); // Fetch all tasks with group names and creation date $tasks_result = $conn->query(" SELECT t.task_id, t.group_id, t.task, t.isdone, t.task_desc, t.created_at, g.group_name FROM tasks t JOIN groups g ON t.group_id = g.group_id ORDER BY g.group_name, t.created_at DESC "); $tasks_data = $tasks_result->fetchAll(PDO::FETCH_ASSOC); // Group tasks by group name $tasks = []; foreach ($tasks_data as $row) { $tasks[$row['group_name']][] = $row; } // Get task statistics $stats_result = $conn->query(" SELECT g.group_name, COUNT(t.task_id) as total_tasks, COUNT(CASE WHEN t.isdone = TRUE THEN 1 END) as completed_tasks, COUNT(CASE WHEN t.isdone = FALSE THEN 1 END) as pending_tasks FROM groups g LEFT JOIN tasks t ON g.group_id = t.group_id GROUP BY g.group_id, g.group_name ORDER BY g.group_name "); $stats = $stats_result->fetchAll(PDO::FETCH_ASSOC); ?>
No tasks yet. Create a group and add some tasks to get started!