refactor(livewire): organizar componentes y vistas por dominio en subnamespaces

- app/Livewire: 34 componentes agrupados en Issues/, Projects/, Phases/,
  Companies/, Users/, Admin/, Inspections/, Layers/, Media/, Common/
  (Client/, Reports/, Forms/, Actions/ ya estaban). Namespaces actualizados.
- resources/views/livewire: vistas sueltas movidas a subcarpetas espejo
  (companies/, users/, phases/, roles/, inspections/, media/, common/);
  render() actualizado.
- Referencias actualizadas sin romper nada: rutas (FQN, nombres de ruta intactos),
  tags <livewire:...>/@livewire() a alias con punto, y use de los tests.
- No tocado: Volt de Breeze (auth/profile/navigation), y el portal cliente
  (user-nav/client-projects) que ya tenía referencias inconsistentes.

Verificado: 69 rutas OK, vistas compilan, suite 69 passing (solo 2 pre-existentes
sqlite). autoload regenerado con --ignore-platform-reqs (PHP 8.2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-19 16:54:09 +02:00
parent 9c164bb7ef
commit 7d390872c3
68 changed files with 191 additions and 107 deletions
+24 -24
View File
@@ -4,10 +4,10 @@ use App\Http\Controllers\ProfileController;
use App\Livewire\Reports\ReportsDashboard;
use App\Http\Controllers\ProjectController;
use App\Http\Controllers\OfflineSyncController;
use App\Livewire\ProjectMap;
use App\Livewire\ProjectList;
use App\Livewire\PhaseProgress;
use App\Livewire\PhaseGantt;
use App\Livewire\Projects\ProjectMap;
use App\Livewire\Projects\ProjectList;
use App\Livewire\Phases\PhaseProgress;
use App\Livewire\Phases\PhaseGantt;
use App\Http\Controllers\ProjectReportController;
use Illuminate\Support\Facades\Route;
@@ -97,8 +97,8 @@ Route::get('/reports/dashboard', ReportsDashboard::class)->name('reports.dashboa
// Gestión de proyectos
// ------------------------------------------------------------
// Create/Edit handled by unified Livewire component
Route::get('/projects/create', \App\Livewire\ProjectForm::class)->name('projects.create');
Route::get('/projects/{project}/edit', \App\Livewire\ProjectForm::class)->name('projects.edit');
Route::get('/projects/create', \App\Livewire\Projects\ProjectForm::class)->name('projects.create');
Route::get('/projects/{project}/edit', \App\Livewire\Projects\ProjectForm::class)->name('projects.edit');
Route::resource('projects', ProjectController::class)->except(['create', 'edit']);
// Ruta personalizada para ver el mapa de un proyecto específico
Route::get('/projects/{project}/map', [ProjectController::class, 'map'])->name('projects.map');
@@ -111,21 +111,21 @@ Route::get('/reports/dashboard', ReportsDashboard::class)->name('reports.dashboa
})->name('projects.templates')->middleware('can:edit projects');
// Rutas para el LayerManager:
Route::get('/projects/{project}/phases/{phase}/layers/manage', \App\Livewire\LayerManager::class)->name('layers.manage');
Route::get('/projects/{project}/phases/{phase}/layers/manage', \App\Livewire\Layers\LayerManager::class)->name('layers.manage');
// Cronograma Gantt y reporte del proyecto
Route::get('/projects/{project}/gantt', PhaseGantt::class)->name('projects.gantt');
Route::get('/projects/{project}/report', [ProjectReportController::class, 'show'])->name('projects.report');
// Issues del proyecto
Route::get('/projects/{project}/issues', \App\Livewire\IssueManager::class)->name('projects.issues');
Route::get('/projects/{project}/issues/create', \App\Livewire\IssueForm::class)->name('projects.issues.create');
Route::get('/projects/{project}/issues/checklists', \App\Livewire\IssueChecklistManager::class)->name('projects.issues.checklists');
Route::get('/projects/{project}/issues/{issue}', \App\Livewire\IssueDetail::class)->name('projects.issues.show');
Route::get('/projects/{project}/issues/{issue}/edit', \App\Livewire\IssueForm::class)->name('projects.issues.edit');
Route::get('/projects/{project}/issues', \App\Livewire\Issues\IssueManager::class)->name('projects.issues');
Route::get('/projects/{project}/issues/create', \App\Livewire\Issues\IssueForm::class)->name('projects.issues.create');
Route::get('/projects/{project}/issues/checklists', \App\Livewire\Issues\IssueChecklistManager::class)->name('projects.issues.checklists');
Route::get('/projects/{project}/issues/{issue}', \App\Livewire\Issues\IssueDetail::class)->name('projects.issues.show');
Route::get('/projects/{project}/issues/{issue}/edit', \App\Livewire\Issues\IssueForm::class)->name('projects.issues.edit');
// Dashboard por proyecto
Route::get('/projects/{project}/dashboard', \App\Livewire\ProjectDashboard::class)->name('projects.dashboard');
Route::get('/projects/{project}/dashboard', \App\Livewire\Projects\ProjectDashboard::class)->name('projects.dashboard');
// Cliente: portal cliente
Route::middleware(['auth', 'role:client'])->prefix('client')->name('client.')->group(function () {
@@ -137,24 +137,24 @@ Route::get('/reports/dashboard', ReportsDashboard::class)->name('reports.dashboa
// Admin: gestión de usuarios y roles (cada ruta protegida por su permiso)
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/users', function () { return view('admin.users'); })->middleware('can:view users')->name('users');
Route::get('/users/create', \App\Livewire\UserForm::class)->middleware('can:create users')->name('users.create');
Route::get('/users/{user}', \App\Livewire\UserView::class)->middleware('can:view users')->name('users.show');
Route::get('/users/{user}/edit', \App\Livewire\UserForm::class)->middleware('can:edit users')->name('users.edit');
Route::get('/users/create', \App\Livewire\Users\UserForm::class)->middleware('can:create users')->name('users.create');
Route::get('/users/{user}', \App\Livewire\Users\UserView::class)->middleware('can:view users')->name('users.show');
Route::get('/users/{user}/edit', \App\Livewire\Users\UserForm::class)->middleware('can:edit users')->name('users.edit');
Route::get('/roles', function () { return view('admin.roles'); })->middleware('can:manage roles')->name('roles');
Route::get('/roles/create', \App\Livewire\RoleForm::class)->middleware('can:manage roles')->name('roles.create');
Route::get('/roles/{role}/edit', \App\Livewire\RoleForm::class)->middleware('can:manage roles')->name('roles.edit');
Route::get('/roles/{role}', \App\Livewire\RoleView::class)->middleware('can:manage roles')->name('roles.show');
Route::get('/permissions', \App\Livewire\RolePermissionManager::class)->middleware('can:manage roles')->name('permissions');
Route::get('/roles/create', \App\Livewire\Admin\RoleForm::class)->middleware('can:manage roles')->name('roles.create');
Route::get('/roles/{role}/edit', \App\Livewire\Admin\RoleForm::class)->middleware('can:manage roles')->name('roles.edit');
Route::get('/roles/{role}', \App\Livewire\Admin\RoleView::class)->middleware('can:manage roles')->name('roles.show');
Route::get('/permissions', \App\Livewire\Admin\RolePermissionManager::class)->middleware('can:manage roles')->name('permissions');
});
// Gestor de medios
Route::get('/projects/{project}/media', function (\App\Models\Project $project) {
return view('projects.media', compact('project'));
})->name('projects.media');
Route::get('/companies', \App\Livewire\CompanyManagement::class)->name('companies.manage');
Route::get('/companies/create', \App\Livewire\CompanyForm::class)->name('companies.create');
Route::get('/companies/{company}', \App\Livewire\CompanyView::class)->name('companies.show');
Route::get('/companies/{company}/edit', \App\Livewire\CompanyForm::class)->name('companies.edit');
Route::get('/companies', \App\Livewire\Companies\CompanyManagement::class)->name('companies.manage');
Route::get('/companies/create', \App\Livewire\Companies\CompanyForm::class)->name('companies.create');
Route::get('/companies/{company}', \App\Livewire\Companies\CompanyView::class)->name('companies.show');
Route::get('/companies/{company}/edit', \App\Livewire\Companies\CompanyForm::class)->name('companies.edit');
// ------------------------------------------------------------
// Sincronización offline (para trabajadores en campo)