label */ public const ROLES = [ 'owner' => 'Promotor', 'constructor' => 'Constructor', 'subcontractor' => 'Subcontratista', 'consultant' => 'Consultor', 'supplier' => 'Proveedor', 'other' => 'Otro', ]; public function configure(): void { $this->setPrimaryKey('id') ->setDefaultSort('companies.name', 'asc') ->setSortingPillsEnabled(false) ->setAdditionalSelects(['companies.id as id', 'company_project.role_in_project as role_in_project']); } #[On('project-companies-changed')] public function refreshRows(): void { // no-op: triggers re-render so the builder re-runs. } public function builder(): Builder { return Company::query() ->join('company_project', 'company_project.company_id', '=', 'companies.id') ->where('company_project.project_id', $this->projectId); } public function columns(): array { return [ Column::make('Empresa', 'name') ->sortable() ->searchable() ->format(function ($value, $row) { $initial = strtoupper(mb_substr($value ?? '?', 0, 1)); $html = '
'.$initial.'
'.e($value).''; if ($row->tax_id) { $html .= '
'.e($row->tax_id).'
'; } $html .= '
'; return $html; }) ->html(), Column::make('Rol', 'role_in_project') ->label(function ($row) { $current = $row->role_in_project; if (! Auth::user()->can('assign companies')) { return ''.(self::ROLES[$current] ?? ucfirst((string) $current)).''; } $opts = ''; foreach (self::ROLES as $val => $label) { $opts .= ''; } return ''; }) ->html(), Column::make('Acciones') ->label(function ($row) { if (! Auth::user()->can('assign companies')) { return ''; } return '
'; }) ->html(), ]; } public function filters(): array { return [ SelectFilter::make('Rol', 'role') ->options(['' => 'Rol: todos'] + self::ROLES) ->filter(fn (Builder $query, string $value) => $query->where('company_project.role_in_project', $value)), ]; } public function changeRole($companyId, $role): void { abort_unless(Auth::user()->can('assign companies'), 403); if (! array_key_exists($role, self::ROLES)) { return; } \App\Models\Project::findOrFail($this->projectId) ->companies()->updateExistingPivot($companyId, ['role_in_project' => $role]); $this->dispatch('project-companies-changed'); $this->dispatch('notify', 'Rol actualizado.'); } public function removeCompany($companyId): void { abort_unless(Auth::user()->can('assign companies'), 403); \App\Models\Project::findOrFail($this->projectId)->companies()->detach($companyId); $this->dispatch('project-companies-changed'); $this->dispatch('notify', 'Empresa eliminada del proyecto.'); } }