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.');
}
}