ganttTransformer->transform($project->id); $milestones = Milestone::where('project_id', $project->id)->orderBy('target_date')->get(); $tasks = Task::where('project_id', $project->id)->select('id', 'ulid', 'name')->get(); return Inertia::render('TimelineScheduling::Schedule/Gantt', [ 'project' => $project->only('id', 'ulid', 'name', 'code'), 'ganttData' => $ganttData, 'milestones' => $milestones, 'tasks' => $tasks, ]); } // --- API: Gantt JSON data --- public function ganttData(Project $project) { return response()->json($this->ganttTransformer->transform($project->id)); } // --- Update task schedule (drag-and-drop) --- public function updateSchedule(Request $request, Project $project, Task $task) { $validated = $request->validate([ 'start_date' => 'required|date', 'end_date' => 'required|date|after_or_equal:start_date', ]); $task->update($validated); return response()->json(['success' => true]); } // --- Dependencies --- public function storeDependency(Request $request) { $validated = $request->validate([ 'task_id' => 'required|string', 'predecessor_id' => 'required|string|different:task_id', 'dependency_type' => 'required|in:FS,FF,SS,SF', 'lag_days' => 'nullable|integer', ]); $taskId = Task::resolveUlidToId($validated['task_id']); $predecessorId = Task::resolveUlidToId($validated['predecessor_id']); TaskDependency::updateOrCreate( ['task_id' => $taskId, 'predecessor_id' => $predecessorId], ['dependency_type' => $validated['dependency_type'], 'lag_days' => $validated['lag_days'] ?? 0], ); return back()->with('success', 'Dependency added.'); } public function destroyDependency(TaskDependency $dependency) { $dependency->delete(); return back()->with('success', 'Dependency removed.'); } // --- Milestones --- public function storeMilestone(Request $request) { $validated = $request->validate([ 'project_id' => 'required|string', 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'target_date' => 'required|date', 'is_critical' => 'nullable|boolean', ]); $validated['project_id'] = Project::resolveUlidToId($validated['project_id']); Milestone::create($validated); return back()->with('success', 'Milestone created.'); } public function achieveMilestone(Milestone $milestone) { $milestone->update(['achieved_date' => now()->toDateString()]); return back()->with('success', 'Milestone marked as achieved.'); } public function destroyMilestone(Milestone $milestone) { $milestone->delete(); return back()->with('success', 'Milestone deleted.'); } }