feat(permissions): full permission catalogue grouped by section
- Migration: add 'group' and 'description' columns to the permissions table. - PermissionCatalogSeeder (idempotent updateOrCreate): full catalogue across 11 sections — Proyectos, Fases y progreso, Capas y elementos, Inspecciones, Incidencias, Empresas, Usuarios, Roles, Informes, Archivos, General. Sets group + description on existing and creates the new ones; does NOT touch role assignments. Registered in DatabaseSeeder. - RoleView: group permission toggles by the 'group' column in a defined section order and show each permission's description. DB updated locally (migrate + seed run). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$table = config('permission.table_names.permissions', 'permissions');
|
||||
|
||||
Schema::table($table, function (Blueprint $table) {
|
||||
if (! Schema::hasColumn($table->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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -25,6 +25,7 @@ class DatabaseSeeder extends Seeder
|
||||
|
||||
$this->call([
|
||||
RolesAndPermissionsSeeder::class,
|
||||
PermissionCatalogSeeder::class,
|
||||
ProjectExampleSeeder::class,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Seeders;
|
||||
|
||||
use Illuminate\Database\Seeder;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Spatie\Permission\PermissionRegistrar;
|
||||
|
||||
class PermissionCatalogSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Full permission catalogue, grouped by section.
|
||||
* Idempotent: updates group/description on existing permissions and
|
||||
* creates the missing ones. Does NOT change role assignments.
|
||||
*/
|
||||
public function run(): void
|
||||
{
|
||||
$guard = config('auth.defaults.guard', 'web');
|
||||
|
||||
$catalog = [
|
||||
'Proyectos' => [
|
||||
'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();
|
||||
}
|
||||
}
|
||||
@@ -110,9 +110,14 @@
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-2">
|
||||
@foreach($perms as $perm)
|
||||
<label class="flex items-center justify-between gap-3 cursor-pointer py-1">
|
||||
<span class="text-sm">{{ $perm->name }}</span>
|
||||
<div class="min-w-0">
|
||||
<span class="text-sm">{{ $perm->name }}</span>
|
||||
@if($perm->description)
|
||||
<p class="text-xs text-gray-400 leading-tight">{{ $perm->description }}</p>
|
||||
@endif
|
||||
</div>
|
||||
<input type="checkbox"
|
||||
class="toggle toggle-primary toggle-sm"
|
||||
class="toggle toggle-primary toggle-sm shrink-0"
|
||||
wire:key="perm-{{ $role->id }}-{{ $perm->id }}"
|
||||
@checked(in_array($perm->name, $rolePerms, true))
|
||||
wire:click="togglePermission('{{ $perm->name }}')" />
|
||||
|
||||
Reference in New Issue
Block a user