feat(features): edición de elementos + catálogo de tipos de elemento

- Migración: tabla feature_types + columnas feature_type_id (FK) e is_active en features.
  Modelo FeatureType; Feature gana featureType() + casts is_active.
- Catálogo de tipos (FeatureTypeManager, ruta /feature-types): CRUD con modal
  (nombre, descripción, color), contador de usos; gateado por edit layers.
- Editor de elementos del proyecto (FeatureManager, ruta projects.features):
  tabla Rappasoft ProjectFeaturesTable (filtros nombre/capa/tipo en cabecera),
  toggle activo/inactivo y borrado individual; modal para editar nombre/tipo/activo.
- Acceso: botón "Elementos" en el dashboard del proyecto (edit layers) y enlace a
  "Tipos de elemento" desde el editor.

Tests: FeatureManagementTest (6). Suite 87 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-25 16:12:47 +02:00
co-authored by Claude Opus 4.8
parent 1decb19bba
commit 3ee70cf48d
11 changed files with 640 additions and 2 deletions
+4
View File
@@ -83,6 +83,10 @@ Route::get('/reports/dashboard', ReportsDashboard::class)->name('reports.dashboa
// Rutas para el LayerManager:
Route::get('/projects/{project}/phases/{phase}/layers/manage', \App\Livewire\Layers\LayerManager::class)->name('layers.manage');
// Elementos del proyecto y catálogo de tipos de elemento
Route::get('/projects/{project}/features', \App\Livewire\Projects\FeatureManager::class)->middleware('can:edit layers')->name('projects.features');
Route::get('/feature-types', \App\Livewire\Projects\FeatureTypeManager::class)->middleware('can:edit layers')->name('feature-types');
// 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');