feat(rbac): human labels + descriptions for all 50 permissions
- Add Permissions::permissionLabels() mapping every slug to a human-readable RO label (e.g. 'clients.view_all' → 'Vezi toți clienții'). - RoleResource permission checkboxes now show translated labels as titles + technical slug as description (so admins see both the meaning and the key). - PermissionOverridesRelationManager Select 'permission_id' now shows 'Human label (technical.slug)' format, plus helper text explaining GRANT/DENY. Same format on the display column. - +57 translations (50 permission labels in RU/EN + role page supporting keys + module labels). All 306 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -132,6 +132,65 @@ class Permissions
|
||||
];
|
||||
}
|
||||
|
||||
/** Human-readable label for each permission slug. Used by role editor + audit UI. */
|
||||
public static function permissionLabels(): array
|
||||
{
|
||||
return [
|
||||
'clients.view_all' => 'Vezi toți clienții',
|
||||
'clients.view_own' => 'Vezi doar clienții proprii',
|
||||
'clients.create' => 'Adaugă client',
|
||||
'clients.edit' => 'Editează client',
|
||||
'clients.delete' => 'Șterge client',
|
||||
'clients.export' => 'Exportă clienți (CSV)',
|
||||
'vehicles.view_all' => 'Vezi toate mașinile',
|
||||
'vehicles.create' => 'Adaugă mașină',
|
||||
'vehicles.edit' => 'Editează mașină',
|
||||
'vehicles.delete' => 'Șterge mașină',
|
||||
'work_orders.view_all' => 'Vezi toate fișele',
|
||||
'work_orders.view_own_assigned' => 'Vezi doar fișele proprii asignate',
|
||||
'work_orders.create' => 'Deschide fișă nouă',
|
||||
'work_orders.edit' => 'Editează fișă',
|
||||
'work_orders.delete' => 'Șterge fișă',
|
||||
'work_orders.change_status' => 'Schimbă statusul fișei',
|
||||
'work_orders.approve_discount_5' => 'Aprobă discount ≤ 5%',
|
||||
'work_orders.approve_discount_20' => 'Aprobă discount ≤ 20%',
|
||||
'work_orders.approve_discount_any' => 'Aprobă discount fără limită',
|
||||
'work_orders.print' => 'Tipărește / PDF fișă',
|
||||
'finance.view_overview' => 'Vezi panou finanțe',
|
||||
'finance.view_pl' => 'Vezi profit & pierdere (P&L)',
|
||||
'finance.view_internal_margin' => 'Vezi marja internă (baza de salariu)',
|
||||
'finance.create_payment' => 'Înregistrează plată',
|
||||
'finance.delete_payment' => 'Șterge plată',
|
||||
'finance.create_expense' => 'Înregistrează cheltuială',
|
||||
'finance.export' => 'Exportă rapoarte financiare',
|
||||
'salaries.view_own' => 'Vezi propriul salariu',
|
||||
'salaries.view_all' => 'Vezi salariile tuturor',
|
||||
'salaries.calculate' => 'Calculează salarii',
|
||||
'salaries.mark_paid' => 'Marchează salariul ca plătit',
|
||||
'inventory.view' => 'Vezi stoc (piese)',
|
||||
'inventory.create_part' => 'Adaugă piesă în catalog',
|
||||
'inventory.edit_part' => 'Editează piesă',
|
||||
'inventory.delete_part' => 'Șterge piesă',
|
||||
'inventory.adjust_stock' => 'Ajustează stocul manual',
|
||||
'inventory.create_purchase' => 'Creează comandă de aprovizionare',
|
||||
'inventory.receive_goods' => 'Recepționează marfă',
|
||||
'suppliers.view' => 'Vezi furnizori',
|
||||
'suppliers.edit' => 'Editează furnizor',
|
||||
'suppliers.delete' => 'Șterge furnizor',
|
||||
'admin.users.view' => 'Vezi utilizatori',
|
||||
'admin.users.manage' => 'Gestionează utilizatori (creează/blochează)',
|
||||
'admin.roles.manage' => 'Editează roluri & drepturi',
|
||||
'admin.settings.edit' => 'Editează setările companiei',
|
||||
'admin.settings.integrations' => 'Configurează integrări externe',
|
||||
'admin.api_tokens.manage' => 'Gestionează tokene API',
|
||||
'admin.audit_log.view' => 'Vezi jurnalul de audit',
|
||||
'admin.backup.download' => 'Descarcă backup',
|
||||
'ai_assistant.use' => 'Folosește AI Assistant',
|
||||
'ai_assistant.configure_keys' => 'Configurează chei API pentru AI',
|
||||
'analytics.view' => 'Vezi rapoarte & analitică',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Role-permission matrix per TZ §2.4.
|
||||
* Returns: ['owner' => [perm1, perm2, ...], ...]
|
||||
|
||||
+13
-2
@@ -35,7 +35,14 @@ class PermissionOverridesRelationManager extends RelationManager
|
||||
->label(__('Drept'))
|
||||
->required()
|
||||
->searchable()
|
||||
->options(fn () => Permission::orderBy('name')->pluck('name', 'id'))
|
||||
->options(function () {
|
||||
$labels = Permissions::permissionLabels();
|
||||
return Permission::orderBy('name')->get()
|
||||
->mapWithKeys(fn ($p) => [
|
||||
$p->id => ($labels[$p->name] ? __($labels[$p->name]) . " ({$p->name})" : $p->name),
|
||||
])->all();
|
||||
})
|
||||
->helperText(__('Alege dreptul concret pe care vrei să-l acorzi (GRANT) sau să-l refuzi (DENY) pentru acest utilizator, indiferent de rolul lui.'))
|
||||
->columnSpanFull(),
|
||||
Forms\Components\Select::make('mode')
|
||||
->required()
|
||||
@@ -61,7 +68,11 @@ class PermissionOverridesRelationManager extends RelationManager
|
||||
Tables\Columns\TextColumn::make('permission.name')
|
||||
->label(__('Drept'))
|
||||
->searchable()
|
||||
->sortable(),
|
||||
->sortable()
|
||||
->formatStateUsing(function ($state) {
|
||||
$labels = Permissions::permissionLabels();
|
||||
return isset($labels[$state]) ? __($labels[$state]) . " ({$state})" : $state;
|
||||
}),
|
||||
Tables\Columns\TextColumn::make('mode')
|
||||
->badge()
|
||||
->colors(['success' => 'grant', 'danger' => 'deny'])
|
||||
|
||||
Reference in New Issue
Block a user