« Back to History
developer_tasks.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php header('X-Frame-Options: SAMEORIGIN'); error_reporting(E_ALL); ini_set('display_errors', '1'); require __DIR__ . '/../erp/modules/auth/auth.php'; require_login(); $u = auth_user(); if (strtolower((string)($u['role'] ?? '')) !== 'developer') { http_response_code(403); exit('403 - Developer access only.'); } $pdo = $GLOBALS['pdo'] ?? null; if (!$pdo) { require __DIR__ . '/../erp/core/db.php'; $pdo = $GLOBALS['pdo'] ?? null; } if (!$pdo instanceof PDO) { http_response_code(500); exit('Database connection not available.'); } function h($value) { return htmlspecialchars((string)($value ?? ''), ENT_QUOTES, 'UTF-8'); } function gv($key, $default = null) { return isset($_GET[$key]) ? trim((string)$_GET[$key]) : $default; } function pv($key, $default = null) { return isset($_POST[$key]) ? trim((string)$_POST[$key]) : $default; } $pdo->exec( "CREATE TABLE IF NOT EXISTS developer_tasks ( id INT AUTO_INCREMENT PRIMARY KEY, client_id INT NOT NULL DEFAULT 0, task_name VARCHAR(255) NOT NULL, priority VARCHAR(50) NOT NULL DEFAULT 'Medium', status VARCHAR(50) NOT NULL DEFAULT 'Pending', remark TEXT DEFAULT NULL, created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" ); $clients = $pdo->query( "SELECT id, client_name FROM developer_clients ORDER BY client_name, id" )->fetchAll(PDO::FETCH_ASSOC); $editId = (int)gv('edit', 0); $deleteId = (int)gv('delete', 0); $message = gv('msg', ''); $errors = []; $form = [ 'id' => 0, 'client_id' => '', 'task_name' => '', 'priority' => 'Medium', 'status' => 'Pending', 'remark' => '', ]; if ($deleteId > 0) { $stmt = $pdo->prepare('DELETE FROM developer_tasks WHERE id = ?'); $stmt->execute([$deleteId]); header('Location: developer_tasks.php?msg=' . urlencode('Task deleted successfully.')); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $form['id'] = (int)pv('id', 0); $form['client_id'] = pv('client_id', ''); $form['task_name'] = pv('task_name', ''); $form['priority'] = pv('priority', 'Medium'); $form['status'] = pv('status', 'Pending'); $form['remark'] = pv('remark', ''); if ($form['task_name'] === '') { $errors[] = 'Task name required hai.'; } if ($form['client_id'] !== '' && !ctype_digit((string)$form['client_id'])) { $errors[] = 'Client invalid hai.'; } if (!in_array($form['priority'], ['Low', 'Medium', 'High', 'Critical'], true)) { $errors[] = 'Priority invalid hai.'; } if (!in_array($form['status'], ['Pending', 'In Progress', 'Done', 'Blocked'], true)) { $errors[] = 'Status invalid hai.'; } if (!$errors) { if ($form['id'] > 0) { $stmt = $pdo->prepare( 'UPDATE developer_tasks SET client_id = :client_id, task_name = :task_name, priority = :priority, status = :status, remark = :remark, updated_at = NOW() WHERE id = :id' ); $stmt->execute([ ':client_id' => (int)$form['client_id'], ':task_name' => $form['task_name'], ':priority' => $form['priority'], ':status' => $form['status'], ':remark' => $form['remark'] !== '' ? $form['remark'] : null, ':id' => $form['id'], ]); header('Location: developer_tasks.php?msg=' . urlencode('Task updated successfully.')); exit; } $stmt = $pdo->prepare( 'INSERT INTO developer_tasks (client_id, task_name, priority, status, remark, updated_at) VALUES (:client_id, :task_name, :priority, :status, :remark, NOW())' ); $stmt->execute([ ':client_id' => (int)$form['client_id'], ':task_name' => $form['task_name'], ':priority' => $form['priority'], ':status' => $form['status'], ':remark' => $form['remark'] !== '' ? $form['remark'] : null, ]); header('Location: developer_tasks.php?msg=' . urlencode('Task created successfully.')); exit; } } if ($editId > 0 && $_SERVER['REQUEST_METHOD'] !== 'POST') { $stmt = $pdo->prepare('SELECT * FROM developer_tasks WHERE id = ? LIMIT 1'); $stmt->execute([$editId]); $task = $stmt->fetch(PDO::FETCH_ASSOC); if ($task) { $form['id'] = (int)$task['id']; $form['client_id'] = (string)$task['client_id']; $form['task_name'] = (string)$task['task_name']; $form['priority'] = (string)$task['priority']; $form['status'] = (string)$task['status']; $form['remark'] = (string)($task['remark'] ?? ''); } } $tasks = $pdo->query( "SELECT t.*, c.client_name FROM developer_tasks t LEFT JOIN developer_clients c ON c.id = t.client_id ORDER BY FIELD(t.status, 'Blocked', 'In Progress', 'Pending', 'Done'), FIELD(t.priority, 'Critical', 'High', 'Medium', 'Low'), t.id DESC" )->fetchAll(PDO::FETCH_ASSOC); ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Developer Tasks</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <style> body { background: #f4f7fb; color: #172033; } .page-shell { max-width: 1280px; margin: 0 auto; padding: 24px; } .hero, .panel { border: 1px solid #d9e2f0; border-radius: 18px; box-shadow: 0 12px 30px rgba(24,39,75,.08); } .hero { background: linear-gradient(135deg, #162033, #244f96); color: #fff; } .muted { color: #607086; } .badge-priority-Critical { background: #ffe1e1; color: #991b1b; } .badge-priority-High { background: #ffe9c7; color: #8a4b00; } .badge-priority-Medium { background: #e8f0ff; color: #174ea6; } .badge-priority-Low { background: #dcfce7; color: #166534; } .badge-status-Pending { background: #f3f4f6; color: #374151; } .badge-status-In\ Progress { background: #e0f2fe; color: #075985; } .badge-status-Done { background: #dcfce7; color: #166534; } .badge-status-Blocked { background: #ffe1e1; color: #991b1b; } .task-remark { max-width: 340px; white-space: pre-wrap; } </style> </head> <body> <div class="page-shell"> <div class="hero p-4 mb-4 d-flex justify-content-between align-items-center gap-3 flex-wrap"> <div> <h2 class="mb-1">Developer Tasks</h2> <div class="opacity-75">Only developer role users can access this task board.</div> </div> <div class="d-flex gap-2 flex-wrap"> <a href="dashboard.php" class="btn btn-light">Back to Dashboard</a> <a href="developer_client_create.php" class="btn btn-outline-light">Add Client</a> </div> </div> <?php if ($message !== ''): ?> <div class="alert alert-success"><?= h($message) ?></div> <?php endif; ?> <?php if ($errors): ?> <div class="alert alert-danger"> <strong>Save nahi hua:</strong> <ul class="mb-0 mt-2"> <?php foreach ($errors as $error): ?> <li><?= h($error) ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> <div class="row g-4"> <div class="col-lg-4"> <div class="panel bg-white p-4 h-100"> <h4 class="mb-3"><?= $form['id'] > 0 ? 'Edit Task' : 'Create Task' ?></h4> <form method="post"> <input type="hidden" name="id" value="<?= (int)$form['id'] ?>"> <div class="mb-3"> <label class="form-label fw-semibold">Client</label> <select name="client_id" class="form-select"> <option value="0">General / No Client</option> <?php foreach ($clients as $client): ?> <option value="<?= (int)$client['id'] ?>" <?= (string)$client['id'] === (string)$form['client_id'] ? 'selected' : '' ?>> <?= h($client['client_name']) ?> </option> <?php endforeach; ?> </select> </div> <div class="mb-3"> <label class="form-label fw-semibold">Task Name</label> <input type="text" name="task_name" class="form-control" value="<?= h($form['task_name']) ?>" required> </div> <div class="row g-3"> <div class="col-md-6"> <label class="form-label fw-semibold">Priority</label> <select name="priority" class="form-select"> <?php foreach (['Low', 'Medium', 'High', 'Critical'] as $priority): ?> <option value="<?= h($priority) ?>" <?= $form['priority'] === $priority ? 'selected' : '' ?>><?= h($priority) ?></option> <?php endforeach; ?> </select> </div> <div class="col-md-6"> <label class="form-label fw-semibold">Status</label> <select name="status" class="form-select"> <?php foreach (['Pending', 'In Progress', 'Done', 'Blocked'] as $status): ?> <option value="<?= h($status) ?>" <?= $form['status'] === $status ? 'selected' : '' ?>><?= h($status) ?></option> <?php endforeach; ?> </select> </div> </div> <div class="mt-3 mb-3"> <label class="form-label fw-semibold">Remark</label> <textarea name="remark" class="form-control" rows="5"><?= h($form['remark']) ?></textarea> </div> <div class="d-flex gap-2 flex-wrap"> <button class="btn btn-primary" type="submit"><?= $form['id'] > 0 ? 'Update Task' : 'Create Task' ?></button> <?php if ($form['id'] > 0): ?> <a href="developer_tasks.php" class="btn btn-outline-secondary">Cancel Edit</a> <?php endif; ?> </div> </form> </div> </div> <div class="col-lg-8"> <div class="panel bg-white p-4 h-100"> <div class="d-flex justify-content-between align-items-center gap-2 flex-wrap mb-3"> <h4 class="mb-0">Task List</h4> <span class="text-muted small">Total: <?= count($tasks) ?></span> </div> <div class="table-responsive"> <table class="table table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th>ID</th> <th>Client</th> <th>Task</th> <th>Priority</th> <th>Status</th> <th>Remark</th> <th>Updated</th> <th>Action</th> </tr> </thead> <tbody> <?php if (!$tasks): ?> <tr> <td colspan="8" class="text-center py-4 text-muted">Abhi koi task nahi hai.</td> </tr> <?php endif; ?> <?php foreach ($tasks as $task): ?> <?php $priorityClass = 'badge-priority-' . str_replace(' ', '-', (string)$task['priority']); $statusClass = 'badge-status-' . str_replace(' ', '-', (string)$task['status']); ?> <tr> <td><?= (int)$task['id'] ?></td> <td><?= h($task['client_name'] ?: 'General') ?></td> <td class="fw-semibold"><?= h($task['task_name']) ?></td> <td><span class="badge <?= h($priorityClass) ?>"><?= h($task['priority']) ?></span></td> <td><span class="badge <?= h($statusClass) ?>"><?= h($task['status']) ?></span></td> <td class="task-remark"><?= h($task['remark']) ?></td> <td><?= h($task['updated_at'] ?: $task['created_at']) ?></td> <td> <div class="d-flex gap-2 flex-wrap"> <a href="developer_tasks.php?edit=<?= (int)$task['id'] ?>" class="btn btn-sm btn-outline-primary">Edit</a> <a href="developer_tasks.php?delete=<?= (int)$task['id'] ?>" class="btn btn-sm btn-outline-danger" onclick="return confirm('Delete this task?');">Delete</a> </div> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> </div> </div> </body> </html>