prepare("INSERT INTO projects (name, is_folder, parent_id, owner_id) VALUES (?, 1, ?, ?)"); $stmt->execute([$_POST['name'], $parent_id, $user_id]); notify_user($user_id, "New folder created: {$_POST['name']}", ['action'=>'Created', 'module'=>'Folder', 'item'=>$_POST['name']]); } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_item'])) { $item = query("SELECT name FROM projects WHERE id=?", [$_POST['item_id']])->fetch(); $ctx = ['action'=>'Deleted', 'module'=>'File/Folder', 'item'=>$item['name']??'Item']; // Notify shared recipients before deletion $shares = query("SELECT share_type, share_id FROM project_shares WHERE project_id=?", [$_POST['item_id']])->fetchAll(); foreach($shares as $sh) { if($sh['share_type'] === 'user') notify_user($sh['share_id'], "Shared item '{$item['name']}' deleted.", $ctx); else notify_group($sh['share_id'], "Shared group item '{$item['name']}' deleted.", $ctx); } $stmt = $pdo->prepare("DELETE FROM projects WHERE id=? AND owner_id=?"); $stmt->execute([$_POST['item_id'], $user_id]); notify_user($user_id, "Item deleted: " . ($item['name']??'Item'), $ctx); } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edit_item'])) { $stmt = $pdo->prepare("UPDATE projects SET name=? WHERE id=? AND owner_id=?"); $stmt->execute([$_POST['new_name'], $_POST['item_id'], $user_id]); $ctx = ['action'=>'Renamed', 'module'=>'File/Folder', 'item'=>$_POST['new_name']]; notify_user($user_id, "Item renamed to '{$_POST['new_name']}'", $ctx); // Notify shared $shares = query("SELECT share_type, share_id FROM project_shares WHERE project_id=?", [$_POST['item_id']])->fetchAll(); foreach($shares as $sh) { if($sh['share_type'] === 'user') notify_user($sh['share_id'], "Shared item renamed to '{$_POST['new_name']}'", $ctx); else notify_group($sh['share_id'], "Shared group item renamed to '{$_POST['new_name']}'", $ctx); } } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_file']) && isset($_FILES['file'])) { $name = $_FILES['file']['name']; $tmp_name = $_FILES['file']['tmp_name']; $size = $_FILES['file']['size']; $path = 'uploads/' . time() . '_' . $name; move_uploaded_file($tmp_name, $path); $stmt = $pdo->prepare("INSERT INTO projects (name, is_folder, parent_id, file_path, owner_id) VALUES (?, 0, ?, ?, ?)"); $stmt->execute([$name, $parent_id, $path, $user_id]); notify_user($user_id, "File uploaded: $name", ['action'=>'Uploaded', 'module'=>'File', 'item'=>$name]); echo "OK"; exit; } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['share_project'])) { $pr_id = $_POST['project_id']; $share = $_POST['share_target']; $parts = explode('_', $share, 2); if(count($parts)===2) { $stmt = $pdo->prepare("INSERT INTO project_shares (project_id, share_type, share_id) VALUES (?, ?, ?)"); $stmt->execute([$pr_id, $parts[0], $parts[1]]); $pr = query("SELECT name FROM projects WHERE id=?", [$pr_id])->fetch(); $msg = "A project/file '{$pr['name']}' has been shared with you."; $ctx = ['action'=>'Shared', 'module'=>'File/Folder', 'item'=>$pr['name'], 'user'=>$_SESSION['username']??'System']; if($parts[0] === 'user') notify_user($parts[1], $msg, $ctx); else notify_group($parts[1], $msg, $ctx); } } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['remove_project_share'])) { $share_id = (int)$_POST['share_id']; $chk = query("SELECT ps.id FROM project_shares ps JOIN projects p ON ps.project_id=p.id WHERE ps.id=? AND p.owner_id=?", [$share_id, $user_id])->fetch(); if($chk) { $pdo->prepare("DELETE FROM project_shares WHERE id=?")->execute([$share_id]); } } // ── Fetch current folder content ────────────────────────────────────────────── $user_groups = get_user_groups($user_id); $my_group_ids = array_column($user_groups, 'id'); $group_in = implode(',', array_fill(0, count($my_group_ids), '?')) ?: '0'; $parent_cond = $parent_id ? "p.parent_id = ?" : "p.parent_id IS NULL"; $sql = "SELECT p.*, (p.owner_id = ?) as is_mine, u.username as owner_name FROM projects p LEFT JOIN project_shares ps ON p.id = ps.project_id LEFT JOIN users u ON p.owner_id = u.id WHERE ($parent_cond) AND ( p.owner_id = ? OR (ps.share_type='user' AND ps.share_id = ?) OR (ps.share_type='group' AND ps.share_id IN ($group_in)) ) GROUP BY p.id ORDER BY p.is_folder DESC, p.name ASC"; $params = [$user_id]; if($parent_id) $params[] = $parent_id; $params = array_merge($params, [$user_id, $user_id], $my_group_ids); $stmt = $pdo->prepare($sql); $stmt->execute($params); $items = $stmt->fetchAll(); $all_users = query("SELECT id, username FROM users WHERE id != ?", [$user_id])->fetchAll(); $all_groups = query("SELECT * FROM groups")->fetchAll(); // ── Build breadcrumb path ───────────────────────────────────────────────────── $breadcrumbs = []; $cur_id = $parent_id; while($cur_id) { $node = query("SELECT id, name, parent_id FROM projects WHERE id=?", [$cur_id])->fetch(); if(!$node) break; array_unshift($breadcrumbs, $node); $cur_id = $node['parent_id']; } // ── Helper: file size ───────────────────────────────────────────────────────── function fmt_size($bytes) { if(!$bytes) return '—'; if($bytes < 1024) return $bytes . ' B'; if($bytes < 1048576) return round($bytes/1024,1) . ' KB'; return round($bytes/1048576,1) . ' MB'; } function get_file_icon($name, $is_folder) { if($is_folder) return '📁'; $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); $map = [ 'pdf'=>'📄','doc'=>'📝','docx'=>'📝','xls'=>'📊','xlsx'=>'📊','ppt'=>'📑','pptx'=>'📑', 'jpg'=>'🖼','jpeg'=>'🖼','png'=>'🖼','gif'=>'🖼','webp'=>'🖼','svg'=>'🖼', 'mp4'=>'🎬','avi'=>'🎬','mov'=>'🎬','mp3'=>'🎵','wav'=>'🎵', 'zip'=>'🗜','rar'=>'🗜','7z'=>'🗜','tar'=>'🗜', 'php'=>'⚙','js'=>'⚙','css'=>'🎨','html'=>'🌐','txt'=>'📃','md'=>'📃', 'sh'=>'💻','py'=>'🐍', ]; return $map[$ext] ?? '📄'; } ?>