exec("ALTER TABLE users ADD COLUMN mood TEXT DEFAULT NULL"); } catch(Exception $e) {} try { $pdo->exec("ALTER TABLE users ADD COLUMN mood_updated_at DATETIME DEFAULT NULL"); } catch(Exception $e) {} try { $pdo->exec("CREATE TABLE IF NOT EXISTS activity_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, action TEXT NOT NULL, detail TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE )"); } catch(Exception $e) {} // ── Task Counts ─────────────────────────────────────────────────────────────── $user_groups = get_user_groups($user_id); $my_group_ids = array_column($user_groups, 'id'); $group_in = $my_group_ids ? implode(',', array_fill(0, count($my_group_ids), '?')) : '0'; $params_tasks = array_merge([$user_id, $user_id], $my_group_ids, $my_group_ids, [$user_id]); $sql_tasks = "SELECT status, COUNT(*) as cnt FROM tasks WHERE (assignee_type='user' AND assignee_id=?) OR (assignor_type='user' AND assignor_id=?) OR (assignee_type='group' AND assignee_id IN ($group_in)) OR (assignor_type='group' AND assignor_group_id IN ($group_in)) OR (assignor_id=?) GROUP BY status"; $stmt = $pdo->prepare($sql_tasks); $stmt->execute($params_tasks); $task_counts = ['pending'=>0,'in_progress'=>0,'completed'=>0,'archived'=>0]; foreach($stmt->fetchAll() as $row) { if (isset($task_counts[$row['status']])) $task_counts[$row['status']] = $row['cnt']; } $total_tasks = $task_counts['pending'] + $task_counts['in_progress'] + $task_counts['completed']; // ── Password & Project counts ───────────────────────────────────────────────── $stmt = $pdo->prepare("SELECT COUNT(*) FROM passwords p LEFT JOIN password_shares ps ON p.id=ps.password_id WHERE p.owner_id=? OR (ps.share_type='user' AND ps.share_id=?)"); $stmt->execute([$user_id, $user_id]); $passwords_count = $stmt->fetchColumn(); $stmt = $pdo->prepare("SELECT COUNT(*) FROM projects p LEFT JOIN project_shares ps ON p.id=ps.project_id WHERE p.owner_id=? OR (ps.share_type='user' AND ps.share_id=?)"); $stmt->execute([$user_id, $user_id]); $projects_count = $stmt->fetchColumn(); // ── Notes count ─────────────────────────────────────────────────────────────── $notes_count = 0; try { $stmt = $pdo->prepare("SELECT COUNT(*) FROM notes WHERE owner_id=?"); $stmt->execute([$user_id]); $notes_count = $stmt->fetchColumn(); } catch(Exception $e) {} // ── Current user mood ───────────────────────────────────────────────────────── $me = query("SELECT username, profile_pic, mood, mood_updated_at FROM users WHERE id=?", [$user_id])->fetch(); $my_mood = $me['mood'] ?? null; // ── Team moods (all users + their mood) ────────────────────────────────────── $team_moods = query("SELECT id, username, mood, mood_updated_at, profile_pic FROM users WHERE mood IS NOT NULL AND id != ? ORDER BY mood_updated_at DESC", [$user_id])->fetchAll(); // ── Activity log ────────────────────────────────────────────────────────────── // Admin: No longer sees all activity by default. // Standard user/Admin: sees own activity + group members activity, BUT we hide admin activity from non-self. $is_admin_user = !empty($_SESSION['is_admin']); $peer_ids = [$user_id]; if ($my_group_ids) { $gin = implode(',', array_fill(0, count($my_group_ids), '?')); $peers = $pdo->prepare("SELECT DISTINCT user_id FROM user_groups WHERE group_id IN ($gin)"); $peers->execute($my_group_ids); $peer_ids = array_unique(array_merge($peer_ids, array_column($peers->fetchAll(), 'user_id'))); } // Ensure at least the user themselves is present if(empty($peer_ids)) { $peer_ids = [$user_id]; } // Get all admins except the current user $other_admins = []; try { $other_admins = $pdo->prepare("SELECT id FROM users WHERE is_admin = 1 AND id != ?"); $other_admins->execute([$user_id]); $other_admins = $other_admins->fetchAll(PDO::FETCH_COLUMN); } catch(Exception $e) {} // Filter out other admins from peer ids $peer_ids = array_filter($peer_ids, function($id) use ($other_admins) { return !in_array($id, $other_admins); }); $uid_in = implode(',', array_fill(0, count($peer_ids), '?')); $recent_logs = []; try { $stmt = $pdo->prepare("SELECT al.*, u.username FROM activity_log al LEFT JOIN users u ON al.user_id=u.id WHERE al.user_id IN ($uid_in) ORDER BY al.created_at DESC LIMIT 30"); $stmt->execute(array_values($peer_ids)); $recent_logs = $stmt->fetchAll(); } catch(Exception $e) {} // ── Task logs ───────────────────────────────────────────────────────────────── $task_logs = []; try { $group_in_tl = $my_group_ids ? implode(',', array_fill(0, count($my_group_ids), '?')) : '0'; $tl_params = array_merge([$user_id, $user_id], $my_group_ids, $my_group_ids); $admin_excl = $other_admins ? "AND t.assignor_id NOT IN (" . implode(',', array_fill(0, count($other_admins), '?')) . ")" : ""; if($other_admins) { $tl_params = array_merge($tl_params, $other_admins); } $stmt = $pdo->prepare("SELECT t.title, t.status, t.status_updated_at, u.username as assignor FROM tasks t LEFT JOIN users u ON t.assignor_id=u.id WHERE t.status_updated_at IS NOT NULL AND ( t.assignee_id=? OR t.assignor_id=? OR (t.assignee_type='group' AND t.assignee_id IN ($group_in_tl)) OR (t.assignor_type='group' AND t.assignor_group_id IN ($group_in_tl)) ) $admin_excl ORDER BY t.status_updated_at DESC LIMIT 30"); $stmt->execute($tl_params); $task_logs = $stmt->fetchAll(); } catch(Exception $e) {} ?> prepare("INSERT INTO activity_log (user_id, action, detail) VALUES (?, 'visit', 'Opened dashboard')")->execute([$user_id]); } catch(Exception $e) {} $_SESSION['dash_logged_today'] = date('Y-m-d'); } ?>
Groups: = implode(', ', array_map(fn($g) => htmlspecialchars($g['name']), $user_groups)) ?>
No team mood activity yet.
No activity yet.