Allow to register custom role permissions (#1208)

This commit is contained in:
Boy132 2025-04-04 09:30:45 +02:00 committed by GitHub
parent c3b8b71f9c
commit 20f271041a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 78 additions and 24 deletions

View File

@ -2,8 +2,6 @@
namespace App\Filament\Admin\Resources; namespace App\Filament\Admin\Resources;
use App\Enums\RolePermissionModels;
use App\Enums\RolePermissionPrefixes;
use App\Filament\Admin\Resources\RoleResource\Pages; use App\Filament\Admin\Resources\RoleResource\Pages;
use App\Models\Role; use App\Models\Role;
use Filament\Forms\Components\Actions\Action; use Filament\Forms\Components\Actions\Action;
@ -95,32 +93,16 @@ class RoleResource extends Resource
public static function form(Form $form): Form public static function form(Form $form): Form
{ {
$permissions = []; $permissionSections = [];
foreach (RolePermissionModels::cases() as $model) { foreach (Role::getPermissionList() as $model => $permissions) {
$options = []; $options = [];
foreach (RolePermissionPrefixes::cases() as $prefix) { foreach ($permissions as $permission) {
$options[$prefix->value . ' ' . strtolower($model->value)] = Str::headline($prefix->value); $options[$permission . ' ' . strtolower($model)] = Str::headline($permission);
} }
if (array_key_exists($model->value, Role::MODEL_SPECIFIC_PERMISSIONS)) { $permissionSections[] = self::makeSection($model, $options);
foreach (Role::MODEL_SPECIFIC_PERMISSIONS[$model->value] as $permission) {
$options[$permission . ' ' . strtolower($model->value)] = Str::headline($permission);
}
}
$permissions[] = self::makeSection($model->value, $options);
}
foreach (Role::SPECIAL_PERMISSIONS as $model => $prefixes) {
$options = [];
foreach ($prefixes as $prefix) {
$options[$prefix . ' ' . strtolower($model)] = Str::headline($prefix);
}
$permissions[] = self::makeSection($model, $options);
} }
return $form return $form
@ -137,7 +119,7 @@ class RoleResource extends Resource
->hidden(), ->hidden(),
Fieldset::make(trans('admin/role.permissions')) Fieldset::make(trans('admin/role.permissions'))
->columns(3) ->columns(3)
->schema($permissions) ->schema($permissionSections)
->hidden(fn (Get $get) => $get('name') === Role::ROOT_ADMIN), ->hidden(fn (Get $get) => $get('name') === Role::ROOT_ADMIN),
Placeholder::make('permissions') Placeholder::make('permissions')
->label(trans('admin/role.permissions')) ->label(trans('admin/role.permissions'))

View File

@ -2,6 +2,8 @@
namespace App\Models; namespace App\Models;
use App\Enums\RolePermissionModels;
use App\Enums\RolePermissionPrefixes;
use Spatie\Permission\Models\Role as BaseRole; use Spatie\Permission\Models\Role as BaseRole;
/** /**
@ -41,6 +43,76 @@ class Role extends BaseRole
], ],
]; ];
/** @var array<string, array<string>> */
protected static array $customPermissions = [];
/** @param array<string, array<string>> $customPermissions */
public static function registerCustomPermissions(array $customPermissions): void
{
static::$customPermissions = [
...static::$customPermissions,
...$customPermissions,
];
}
public static function registerCustomDefaultPermissions(string $model): void
{
$permissions = [];
foreach (RolePermissionPrefixes::cases() as $prefix) {
$permissions[] = $prefix->value;
}
static::registerCustomPermissions([
$model => $permissions,
]);
}
/** @return array<string, array<string>> */
public static function getPermissionList(): array
{
$allPermissions = [];
// Standard permissions for our default model
foreach (RolePermissionModels::cases() as $model) {
$allPermissions[$model->value] ??= [];
foreach (RolePermissionPrefixes::cases() as $prefix) {
array_push($allPermissions[$model->value], $prefix->value);
}
if (array_key_exists($model->value, Role::MODEL_SPECIFIC_PERMISSIONS)) {
foreach (static::MODEL_SPECIFIC_PERMISSIONS[$model->value] as $permission) {
array_push($allPermissions[$model->value], $permission);
}
}
}
// Special permissions for our default models
foreach (static::SPECIAL_PERMISSIONS as $model => $prefixes) {
$allPermissions[$model] ??= [];
foreach ($prefixes as $prefix) {
array_push($allPermissions[$model], $prefix);
}
}
// Custom third party permissions
foreach (static::$customPermissions as $model => $prefixes) {
$allPermissions[$model] ??= [];
foreach ($prefixes as $prefix) {
array_push($allPermissions[$model], $prefix);
}
}
foreach ($allPermissions as $model => $permissions) {
$allPermissions[$model] = array_unique($permissions);
}
return $allPermissions;
}
public function isRootAdmin(): bool public function isRootAdmin(): bool
{ {
return $this->name === self::ROOT_ADMIN; return $this->name === self::ROOT_ADMIN;