diff --git a/public_html/entreaulas/proyectos.php b/public_html/entreaulas/proyectos.php index 08082bb..17f24e1 100644 --- a/public_html/entreaulas/proyectos.php +++ b/public_html/entreaulas/proyectos.php @@ -55,7 +55,22 @@ function save_project($proyectos_dir, $project_id, $data) { return $result; } -function list_projects($proyectos_dir) { +function get_project_breadcrumb($proyectos_dir, $project_id) { + $breadcrumb = []; + $current_id = $project_id; + + while ($current_id) { + $project = load_project($proyectos_dir, $current_id); + if (!$project) break; + + array_unshift($breadcrumb, $project); + $current_id = $project["parent_id"] ?? null; + } + + return $breadcrumb; +} + +function list_projects($proyectos_dir, $parent_id = null) { $projects = []; if (!is_dir($proyectos_dir)) { return $projects; @@ -64,7 +79,15 @@ function list_projects($proyectos_dir) { foreach ($files as $file) { $data = json_decode(file_get_contents($file), true); if ($data) { - $projects[] = $data; + // Filter by parent_id + $project_parent = $data["parent_id"] ?? null; + if ($parent_id === null && $project_parent === null) { + // Root level projects (no parent) + $projects[] = $data; + } elseif ($parent_id !== null && $project_parent === $parent_id) { + // Sub-projects of specified parent + $projects[] = $data; + } } else { error_log("Failed to decode JSON from file: $file"); } @@ -86,28 +109,62 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($action === "create_project") { $name = trim($_POST["name"] ?? ""); $description = trim($_POST["description"] ?? ""); + $parent_id = trim($_POST["parent_id"] ?? ""); if ($name !== "") { - $project_id = generate_id($name); - $project_data = [ - "id" => $project_id, - "name" => $name, - "description" => $description, - "created_at" => time(), - "updated_at" => time(), - "items" => [] - ]; - - save_project($proyectos_dir, $project_id, $project_data); - - // Create project directory - $project_dir = "$proyectos_dir/$project_id"; - if (!is_dir($project_dir)) { - mkdir($project_dir, 0755, true); + // Determine level based on parent + $level = 1; + if ($parent_id !== "") { + $parent = load_project($proyectos_dir, $parent_id); + if ($parent) { + $level = ($parent["level"] ?? 1) + 1; + // Enforce max 3 levels + if ($level > 3) { + $error = "No se pueden crear más de 3 niveles de sub-proyectos."; + } + } else { + $error = "Proyecto padre no encontrado."; + } } - header("Location: /entreaulas/proyectos.php?aulario=" . urlencode($aulario_id) . "&project=" . urlencode($project_id)); - exit; + if (empty($error)) { + $project_id = generate_id($name); + $project_data = [ + "id" => $project_id, + "name" => $name, + "description" => $description, + "created_at" => time(), + "updated_at" => time(), + "items" => [], + "subprojects" => [], + "parent_id" => $parent_id !== "" ? $parent_id : null, + "level" => $level + ]; + + save_project($proyectos_dir, $project_id, $project_data); + + // Create project directory + $project_dir = "$proyectos_dir/$project_id"; + if (!is_dir($project_dir)) { + mkdir($project_dir, 0755, true); + } + + // Update parent's subprojects list + if ($parent_id !== "") { + $parent = load_project($proyectos_dir, $parent_id); + if ($parent) { + if (!isset($parent["subprojects"])) { + $parent["subprojects"] = []; + } + $parent["subprojects"][] = $project_id; + $parent["updated_at"] = time(); + save_project($proyectos_dir, $parent_id, $parent); + } + } + + header("Location: /entreaulas/proyectos.php?aulario=" . urlencode($aulario_id) . "&project=" . urlencode($project_id)); + exit; + } } else { $error = "El nombre del proyecto es obligatorio."; } @@ -118,6 +175,21 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($project_id !== "") { $project_file = "$proyectos_dir/$project_id.json"; if (file_exists($project_file)) { + // Load project to get parent_id + $project = load_project($proyectos_dir, $project_id); + + // Remove from parent's subprojects list + if ($project && !empty($project["parent_id"])) { + $parent = load_project($proyectos_dir, $project["parent_id"]); + if ($parent && isset($parent["subprojects"])) { + $parent["subprojects"] = array_values(array_filter($parent["subprojects"], function($id) use ($project_id) { + return $id !== $project_id; + })); + $parent["updated_at"] = time(); + save_project($proyectos_dir, $project["parent_id"], $parent); + } + } + unlink($project_file); // Also delete project directory $project_dir = "$proyectos_dir/$project_id"; @@ -305,6 +377,9 @@ $view = $current_project ? "project" : "list";
= count($project["items"] ?? []) ?> elementos + + · = count($project["subprojects"]) ?> sub-proyectos +
= htmlspecialchars($project["description"]) ?>
= htmlspecialchars($subproject["description"]) ?>
+ ++ + = count($subproject["items"] ?? []) ?> elementos + + · = count($subproject["subprojects"]) ?> sub-proyectos + + +
+ +