hasRole('Admin')) abort(403); $this->user = $user->load(['roles', 'company', 'projects.phases']); $this->notes = $user->notes ?? ''; $this->loadAvailableProjects(); $this->loadActivity(); } private function loadAvailableProjects(): void { $assignedIds = $this->user->projects->pluck('id'); $this->availableProjects = Project::whereNotIn('id', $assignedIds) ->orderBy('name')->get(); } private function loadActivity(): void { $this->recentInspections = Inspection::where('user_id', $this->user->id) ->with(['feature.layer.phase.project', 'template']) ->latest()->take(8)->get(); $this->recentIssues = Issue::where('reported_by', $this->user->id) ->with(['feature', 'project']) ->latest()->take(8)->get(); } // ── Tabs ───────────────────────────────────────────────────────────────── public function setTab(string $tab): void { $this->activeTab = $tab; } // ── Projects ────────────────────────────────────────────────────────────── public function assignProject(): void { $this->validate([ 'addProjectId' => 'required|exists:projects,id', 'addProjectRole' => 'nullable|string|max:100', ], [], ['addProjectId' => 'proyecto', 'addProjectRole' => 'rol en proyecto']); $this->user->projects()->attach($this->addProjectId, [ 'role_in_project' => $this->addProjectRole ?: null, ]); $this->user->load('projects.phases'); $this->addProjectId = null; $this->addProjectRole = ''; $this->loadAvailableProjects(); $this->dispatch('notify', 'Proyecto asignado.'); } public function removeProject(int $projectId): void { $this->user->projects()->detach($projectId); $this->user->load('projects.phases'); $this->loadAvailableProjects(); $this->dispatch('notify', 'Proyecto desasignado.'); } // ── Notes ───────────────────────────────────────────────────────────────── public function saveNotes(): void { $this->validate(['notes' => 'nullable|string']); $this->user->update(['notes' => $this->notes ?: null]); $this->editingNotes = false; $this->dispatch('notify', 'Notas guardadas.'); } public function render() { return view('livewire.user-view'); } }