diff --git a/app/Livewire/RoleView.php b/app/Livewire/RoleView.php index f61c413..36006d3 100644 --- a/app/Livewire/RoleView.php +++ b/app/Livewire/RoleView.php @@ -81,9 +81,17 @@ class RoleView extends Component ->orderBy('name') ->get(); + $order = [ + 'Proyectos', 'Fases y progreso', 'Capas y elementos', 'Inspecciones', + 'Incidencias', 'Empresas', 'Usuarios', 'Roles', 'Informes', 'Archivos', 'General', + ]; + $grouped = Permission::orderBy('name')->get() - ->groupBy(fn ($perm) => $this->sectionFor($perm->name)) - ->sortKeys(); + ->groupBy(fn ($perm) => $perm->group ?: $this->sectionFor($perm->name)) + ->sortBy(function ($perms, $section) use ($order) { + $i = array_search($section, $order, true); + return $i === false ? 999 : $i; + }); return view('livewire.roles.role-view', [ 'users' => $users, diff --git a/database/migrations/2026_06_17_180000_add_group_and_description_to_permissions_table.php b/database/migrations/2026_06_17_180000_add_group_and_description_to_permissions_table.php new file mode 100644 index 0000000..34950f9 --- /dev/null +++ b/database/migrations/2026_06_17_180000_add_group_and_description_to_permissions_table.php @@ -0,0 +1,35 @@ +getTable(), 'group')) { + $table->string('group')->nullable()->after('name'); + } + if (! Schema::hasColumn($table->getTable(), 'description')) { + $table->string('description')->nullable()->after('group'); + } + }); + } + + public function down(): void + { + $table = config('permission.table_names.permissions', 'permissions'); + + Schema::table($table, function (Blueprint $table) { + foreach (['group', 'description'] as $col) { + if (Schema::hasColumn($table->getTable(), $col)) { + $table->dropColumn($col); + } + } + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6e50bba..9f5e27e 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -25,6 +25,7 @@ class DatabaseSeeder extends Seeder $this->call([ RolesAndPermissionsSeeder::class, + PermissionCatalogSeeder::class, ProjectExampleSeeder::class, ]); } diff --git a/database/seeders/PermissionCatalogSeeder.php b/database/seeders/PermissionCatalogSeeder.php new file mode 100644 index 0000000..f226488 --- /dev/null +++ b/database/seeders/PermissionCatalogSeeder.php @@ -0,0 +1,92 @@ + [ + 'view projects' => 'Ver listado y fichas de proyectos', + 'create projects' => 'Crear proyectos', + 'edit projects' => 'Editar datos del proyecto', + 'delete projects' => 'Eliminar proyectos', + 'export projects' => 'Exportar proyectos (Excel/PDF)', + ], + 'Fases y progreso' => [ + 'view phases' => 'Ver fases del proyecto', + 'manage phases' => 'Crear, editar, ordenar y eliminar fases', + 'update progress' => 'Actualizar el porcentaje de progreso', + ], + 'Capas y elementos' => [ + 'view layers' => 'Ver capas y elementos en el mapa', + 'upload layers' => 'Subir/importar capas', + 'edit layers' => 'Editar capas y elementos', + 'delete layers' => 'Eliminar capas/elementos', + ], + 'Inspecciones' => [ + 'view inspections' => 'Ver inspecciones e historial', + 'create inspections' => 'Registrar inspecciones', + 'delete inspections' => 'Eliminar inspecciones', + 'manage templates' => 'Gestionar plantillas de inspección', + ], + 'Incidencias' => [ + 'view issues' => 'Ver incidencias', + 'create issues' => 'Crear incidencias', + 'edit issues' => 'Editar, resolver y cerrar incidencias', + 'delete issues' => 'Eliminar incidencias', + ], + 'Empresas' => [ + 'view companies' => 'Ver empresas', + 'create companies' => 'Crear empresas', + 'edit companies' => 'Editar empresas', + 'delete companies' => 'Eliminar empresas', + ], + 'Usuarios' => [ + 'view users' => 'Ver usuarios', + 'create users' => 'Crear usuarios', + 'edit users' => 'Editar usuarios', + 'delete users' => 'Eliminar usuarios', + 'assign users' => 'Asignar usuarios/roles a proyectos', + ], + 'Roles' => [ + 'manage roles' => 'Crear/editar/borrar roles y asignar permisos', + ], + 'Informes' => [ + 'view reports' => 'Ver panel de informes', + 'export reports' => 'Exportar informes', + ], + 'Archivos' => [ + 'view media' => 'Ver archivos/galería', + 'upload media' => 'Subir archivos', + 'delete media' => 'Eliminar archivos', + ], + 'General' => [ + 'manage all' => 'Súper-admin: acceso total al sistema', + ], + ]; + + foreach ($catalog as $group => $permissions) { + foreach ($permissions as $name => $description) { + Permission::updateOrCreate( + ['name' => $name, 'guard_name' => $guard], + ['group' => $group, 'description' => $description] + ); + } + } + + app(PermissionRegistrar::class)->forgetCachedPermissions(); + } +} diff --git a/resources/views/livewire/roles/role-view.blade.php b/resources/views/livewire/roles/role-view.blade.php index 0746027..e5cb9ff 100644 --- a/resources/views/livewire/roles/role-view.blade.php +++ b/resources/views/livewire/roles/role-view.blade.php @@ -110,9 +110,14 @@
@foreach($perms as $perm)