« Back to History
list.php
|
20260920_164915.php
Initial Domain Snapshot
Copy Code
<?php // Mandatory Error Display for Debugging ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); require_once __DIR__ . '/../../includes/bootstrap.php'; require_once __DIR__ . '/../../includes/header.php'; require_once __DIR__ . '/../../includes/sidebar.php'; $errMessage = ''; $successMessage = ''; $current_user_id = (int)($_SESSION['user_id'] ?? 1); // Backend Action Handlers if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; // 1. ADD NEW TASK if ($action === 'create_task') { $title = trim($_POST['title'] ?? ''); $description = trim($_POST['description'] ?? ''); $module_name = trim($_POST['module_name'] ?? ''); $priority = trim($_POST['priority'] ?? 'MEDIUM'); $status = trim($_POST['status'] ?? 'PENDING'); $due_date = !empty($_POST['due_date']) ? $_POST['due_date'] : null; if (empty($title)) { $errMessage = "Task Title is strictly required."; } else { try { $pdo->beginTransaction(); $stmt = $pdo->prepare("INSERT INTO project_tasks ( title, description, module_name, priority, status, due_date, created_by ) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([ $title, (!empty($description) ? $description : null), (!empty($module_name) ? $module_name : null), $priority, $status, $due_date, $current_user_id ]); $task_id = $pdo->lastInsertId(); // Audit Log $logStmt = $pdo->prepare("INSERT INTO project_activity_log (task_id, activity, details, created_by) VALUES (?, 'TASK_CREATED', ?, ?)"); $logStmt->execute([$task_id, "Task '{$title}' created in module '{$module_name}'", $current_user_id]); $pdo->commit(); $successMessage = "Task successfully created with ID: #" . $task_id; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } $errMessage = "Task Creation Error: " . $e->getMessage(); } } } // 2. QUICK STATUS UPDATE elseif ($action === 'update_task_status') { $task_id = (int)($_POST['task_id'] ?? 0); $status = trim($_POST['status'] ?? ''); if ($task_id > 0 && !empty($status)) { try { $pdo->beginTransaction(); $completed_at = ($status === 'COMPLETED') ? date('Y-m-d H:i:s') : null; $stmt = $pdo->prepare("UPDATE project_tasks SET status = ?, completed_at = ? WHERE id = ?"); $stmt->execute([$status, $completed_at, $task_id]); // Audit Log $logStmt = $pdo->prepare("INSERT INTO project_activity_log (task_id, activity, details, created_by) VALUES (?, 'STATUS_UPDATED', ?, ?)"); $logStmt->execute([$task_id, "Status updated to {$status}", $current_user_id]); $pdo->commit(); $successMessage = "Task status updated successfully."; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } $errMessage = "Status Update Error: " . $e->getMessage(); } } } // 3. DELETE TASK elseif ($action === 'delete_task') { $task_id = (int)($_POST['task_id'] ?? 0); if ($task_id > 0) { try { $pdo->beginTransaction(); $stmt = $pdo->prepare("DELETE FROM project_tasks WHERE id = ?"); $stmt->execute([$task_id]); // Audit Log $logStmt = $pdo->prepare("INSERT INTO project_activity_log (task_id, activity, details, created_by) VALUES (?, 'TASK_DELETED', ?, ?)"); $logStmt->execute([$task_id, "Task #{$task_id} permanently removed", $current_user_id]); $pdo->commit(); $successMessage = "Task permanently removed."; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } $errMessage = "Deletion Error: " . $e->getMessage(); } } } } // Fetch Filters $filter_status = trim($_GET['status'] ?? ''); $filter_priority = trim($_GET['priority'] ?? ''); $filter_module = trim($_GET['module'] ?? ''); $search_query = trim($_GET['search'] ?? ''); $where_clauses = ["1=1"]; $params = []; if (!empty($filter_status)) { $where_clauses[] = "status = ?"; $params[] = $filter_status; } if (!empty($filter_priority)) { $where_clauses[] = "priority = ?"; $params[] = $filter_priority; } if (!empty($filter_module)) { $where_clauses[] = "module_name = ?"; $params[] = $filter_module; } if (!empty($search_query)) { $where_clauses[] = "(title LIKE ? OR description LIKE ?)"; $params[] = '%' . $search_query . '%'; $params[] = '%' . $search_query . '%'; } $where_sql = implode(' AND ', $where_clauses); try { $stmt = $pdo->prepare(" SELECT t.*, (SELECT COUNT(*) FROM project_task_checklist WHERE task_id = t.id) as total_checklists, (SELECT COUNT(*) FROM project_task_checklist WHERE task_id = t.id AND is_done = 1) as completed_checklists, (SELECT COUNT(*) FROM project_comments WHERE task_id = t.id) as total_comments FROM project_tasks t WHERE {$where_sql} ORDER BY FIELD(t.priority, 'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'), t.id DESC "); $stmt->execute($params); $tasks = $stmt->fetchAll(); // Distinct Modules for Filter Dropdown $modStmt = $pdo->query("SELECT DISTINCT module_name FROM project_tasks WHERE module_name IS NOT NULL AND module_name != '' ORDER BY module_name ASC"); $available_modules = $modStmt->fetchAll(PDO::FETCH_COLUMN); } catch (PDOException $e) { $tasks = []; $available_modules = []; $errMessage = "Database Query Error: " . $e->getMessage(); } ?> <div class="container-fluid p-0" style="max-width: 1200px;"> <!-- Header Block --> <div class="d-flex justify-content-between align-items-center mb-4"> <div> <h4 class="m-0 fw-bold text-dark">Development Tasks Registry</h4> <small class="text-muted">Mister Manager ERP Sprint Execution & Feature Control Matrix</small> </div> <div class="d-flex gap-2"> <a href="/admin/development_board/tasks/dashboard.php" class="btn btn-sm btn-outline-secondary px-3"> <i class="bi bi-speedometer2 me-1"></i> Dashboard </a> <button type="button" class="btn btn-sm btn-primary px-3" data-bs-toggle="modal" data-bs-target="#addTaskModal"> <i class="bi bi-plus-lg me-1"></i> Add Task </button> </div> </div> <!-- Feedback Alerts --> <?php if (!empty($successMessage)): ?> <div class="alert alert-success small p-3 mb-4"><?= htmlspecialchars($successMessage) ?></div> <?php endif; ?> <?php if (!empty($errMessage)): ?> <div class="alert alert-danger small p-3 mb-4"><?= htmlspecialchars($errMessage) ?></div> <?php endif; ?> <!-- Filter Console Block --> <div class="card border-0 shadow-sm bg-white p-3 mb-4"> <form method="GET" action="list.php" class="row g-2 align-items-center"> <div class="col-md-3"> <input type="text" name="search" class="form-control form-control-sm" placeholder="Search title or details..." value="<?= htmlspecialchars($search_query) ?>"> </div> <div class="col-md-3"> <select name="module" class="form-select form-select-sm" onchange="this.form.submit()"> <option value="">-- All Modules --</option> <?php foreach ($available_modules as $mod): ?> <option value="<?= htmlspecialchars($mod) ?>" <?= $filter_module === $mod ? 'selected' : '' ?>><?= htmlspecialchars($mod) ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <select name="status" class="form-select form-select-sm" onchange="this.form.submit()"> <option value="">-- All Statuses --</option> <?php foreach (['PENDING', 'WORKING', 'TESTING', 'COMPLETED', 'HOLD', 'CANCELLED'] as $st): ?> <option value="<?= $st ?>" <?= $filter_status === $st ? 'selected' : '' ?>><?= $st ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2"> <select name="priority" class="form-select form-select-sm" onchange="this.form.submit()"> <option value="">-- All Priorities --</option> <?php foreach (['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'] as $pr): ?> <option value="<?= $pr ?>" <?= $filter_priority === $pr ? 'selected' : '' ?>><?= $pr ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-2 text-end"> <a href="list.php" class="btn btn-sm btn-outline-secondary w-100">Reset Filters</a> </div> </form> </div> <!-- Data Table Block --> <div class="card border-0 shadow-sm bg-white p-0"> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light small text-uppercase"> <tr> <th class="ps-3" style="width: 60px;">ID</th> <th>Task Overview</th> <th>Module</th> <th>Priority</th> <th>Status</th> <th>Checklist</th> <th>Due Date</th> <th class="text-end pe-3">Actions</th> </tr> </thead> <tbody> <?php if (!empty($tasks)): ?> <?php foreach ($tasks as $t): ?> <tr> <td class="ps-3 font-monospace text-muted small">#<?= $t['id'] ?></td> <td> <a href="detail.php?id=<?= $t['id'] ?>" class="text-dark fw-bold text-decoration-none"> <?= htmlspecialchars($t['title']) ?> </a> <div class="small text-muted"> <i class="bi bi-chat-left-text me-1"></i><?= $t['total_comments'] ?> comments </div> </td> <td> <span class="badge bg-light text-dark border font-monospace"> <?= htmlspecialchars($t['module_name'] ?: 'General') ?> </span> </td> <td> <?php $pBadge = match($t['priority']) { 'CRITICAL' => 'bg-danger', 'HIGH' => 'bg-warning text-dark', 'MEDIUM' => 'bg-info text-dark', 'LOW' => 'bg-secondary', default => 'bg-light text-dark' }; ?> <span class="badge <?= $pBadge ?>"><?= $t['priority'] ?></span> </td> <td> <form method="POST" action="list.php" class="m-0"> <input type="hidden" name="action" value="update_task_status"> <input type="hidden" name="task_id" value="<?= $t['id'] ?>"> <select name="status" class="form-select form-select-sm py-0" style="width: 125px; font-size: 0.8rem;" onchange="this.form.submit()"> <?php foreach (['PENDING', 'WORKING', 'TESTING', 'COMPLETED', 'HOLD', 'CANCELLED'] as $stOpt): ?> <option value="<?= $stOpt ?>" <?= $t['status'] === $stOpt ? 'selected' : '' ?>><?= $stOpt ?></option> <?php endforeach; ?> </select> </form> </td> <td> <?php if ($t['total_checklists'] > 0): ?> <span class="small font-monospace"><?= $t['completed_checklists'] ?> / <?= $t['total_checklists'] ?></span> <?php else: ?> <span class="text-muted small">-</span> <?php endif; ?> </td> <td class="small text-muted font-monospace"> <?= $t['due_date'] ? date('d M Y', strtotime($t['due_date'])) : '--' ?> </td> <td class="text-end pe-3"> <div class="btn-group btn-group-sm"> <a href="detail.php?id=<?= $t['id'] ?>" class="btn btn-outline-secondary" title="View Detail"> <i class="bi bi-eye"></i> </a> <form method="POST" action="list.php" class="d-inline" onsubmit="return confirm('Are you sure you want to delete this task?');"> <input type="hidden" name="action" value="delete_task"> <input type="hidden" name="task_id" value="<?= $t['id'] ?>"> <button type="submit" class="btn btn-outline-danger" title="Delete"> <i class="bi bi-trash"></i> </button> </form> </div> </td> </tr> <?php endforeach; ?> <?php else: ?> <tr> <td colspan="8" class="text-center py-4 text-muted"> No task records found in the registry. </td> </tr> <?php endif; ?> </tbody> </table> </div> </div> </div> <!-- Modal: Add New Task --> <div class="modal fade" id="addTaskModal" tabindex="-1" aria-labelledby="addTaskModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content border-0 shadow"> <form action="list.php" method="POST"> <input type="hidden" name="action" value="create_task"> <div class="modal-header bg-dark text-white py-3"> <h5 class="modal-title fw-bold" id="addTaskModalLabel">Create Development Task</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body p-4"> <div class="row g-3"> <div class="col-md-8"> <label class="form-label small fw-semibold">Task Title *</label> <input type="text" name="title" class="form-control form-control-sm" placeholder="e.g. Implement Master Data Sync Engine" required> </div> <div class="col-md-4"> <label class="form-label small fw-semibold">Target Module</label> <input type="text" name="module_name" class="form-control form-control-sm" placeholder="e.g. Kasab Module, Accounting"> </div> <div class="col-md-4"> <label class="form-label small fw-semibold">Priority Level</label> <select name="priority" class="form-select form-select-sm" required> <option value="LOW">LOW</option> <option value="MEDIUM" selected>MEDIUM</option> <option value="HIGH">HIGH</option> <option value="CRITICAL">CRITICAL</option> </select> </div> <div class="col-md-4"> <label class="form-label small fw-semibold">Initial Status</label> <select name="status" class="form-select form-select-sm" required> <option value="PENDING" selected>PENDING</option> <option value="WORKING">WORKING</option> <option value="TESTING">TESTING</option> </select> </div> <div class="col-md-4"> <label class="form-label small fw-semibold">Target Due Date</label> <input type="date" name="due_date" class="form-control form-control-sm"> </div> <div class="col-md-12"> <label class="form-label small fw-semibold">Detailed Specification / Notes</label> <textarea name="description" class="form-control form-control-sm" rows="4" placeholder="Describe logic requirements, SQL alterations, or API specs..."></textarea> </div> </div> </div> <div class="modal-footer bg-light"> <button type="button" class="btn btn-sm btn-outline-secondary" data-bs-dismiss="modal">Cancel</button> <button type="submit" class="btn btn-sm btn-primary px-4 fw-bold">Save Task Matrix</button> </div> </form> </div> </div> </div> <?php require_once __DIR__ . '/../../includes/footer.php'; ?>