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 = implode(',', array_fill(0, max(count($my_group_ids), 1), '?')) ?: '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 ───────────────────────────────────────────────────────── $my_mood = $current_user['mood'] ?? null; // ── Team moods (all users + their mood) ────────────────────────────────────── $team_moods = query("SELECT id, username, mood, mood_updated_at FROM users WHERE mood IS NOT NULL AND id != ? ORDER BY mood_updated_at DESC", [$user_id])->fetchAll(); // ── Activity log (user + their groups, last 20) ─────────────────────────────── $recent_logs = []; try { // Collect relevant user IDs: current user + members of same groups $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'))); } $uid_in = implode(',', array_fill(0, count($peer_ids), '?')); $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 20"); $stmt->execute($peer_ids); $recent_logs = $stmt->fetchAll(); } catch(Exception $e) {} // ── Auto-log task changes for history (read recent task status changes) ─────── $task_logs = []; try { // Include group-assigned tasks too $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); $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)) ) 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'); } ?>

👋 Welcome, !

Groups: htmlspecialchars($g['name']), $user_groups)) ?>

Your Mood
Currently:
My Tasks
⏳ Pending 🔵 In Progress ✅ Done
Password Vault
🔐 Stored items
Projects & Files
📁 Items
Notes
📝 Notes saved

👥 Team Mood

Live from colleagues

No one else has set a mood yet.

Your mood is visible to your team:

🕓 Recent Activity

You & your groups
$l['created_at'], 'user' => $l['username'] ?? 'System', 'action' => $l['action'], 'detail' => $l['detail'] ?? '', ]; } foreach($task_logs as $l) { $status_label = ['pending'=>'moved to Pending','in_progress'=>'started In Progress','completed'=>'marked Completed','archived'=>'archived'][$l['status']] ?? $l['status']; $feed[] = [ 'time' => $l['status_updated_at'], 'user' => $l['assignor'] ?? 'Someone', 'action' => 'task_status', 'detail' => '"'.htmlspecialchars(mb_substr($l['title'],0,30)).'" '.$status_label, ]; } usort($feed, fn($a,$b) => strtotime($b['time']) - strtotime($a['time'])); $feed = array_slice($feed, 0, 30); $action_icons = [ 'visit' => '🌐', 'mood_set' => '😊', 'task_status' => '✅', ]; ?>

No activity yet.