diff --git a/app/Filament/Resources/RoleResource.php b/app/Filament/Resources/RoleResource.php index 6cdbbbc..da5c4e8 100644 --- a/app/Filament/Resources/RoleResource.php +++ b/app/Filament/Resources/RoleResource.php @@ -35,6 +35,76 @@ class RoleResource extends Resource return auth()->user()?->can('role.viewAny') ?? false; } + /** + * 获取权限分组标签页 + */ + protected static function getPermissionTabs(): array + { + // 模块名称和图标映射 + $moduleConfig = [ + 'document' => ['name' => '文档管理', 'icon' => 'heroicon-o-document-text'], + 'system-setting' => ['name' => '系统设置', 'icon' => 'heroicon-o-cog-6-tooth'], + 'activity-log' => ['name' => '操作日志', 'icon' => 'heroicon-o-clipboard-document-list'], + 'terminal' => ['name' => '终端管理', 'icon' => 'heroicon-o-computer-desktop'], + 'sop-template' => ['name' => 'SOP模板', 'icon' => 'heroicon-o-document-text'], + 'group' => ['name' => '分组管理', 'icon' => 'heroicon-o-user-group'], + 'user' => ['name' => '用户管理', 'icon' => 'heroicon-o-users'], + 'role' => ['name' => '角色管理', 'icon' => 'heroicon-o-shield-check'], + ]; + + // 操作名称映射 + $actionNames = [ + 'viewAny' => '查看列表', + 'view' => '查看详情', + 'create' => '创建', + 'update' => '编辑', + 'delete' => '删除', + 'download' => '下载', + 'export' => '导出', + 'sync' => '同步', + 'publish' => '发布', + 'archive' => '归档', + ]; + + // 按模块分组权限 + $groupedPermissions = Permission::all() + ->groupBy(function ($permission) { + return explode('.', $permission->name)[0]; + }); + + $tabs = []; + + foreach ($groupedPermissions as $module => $permissions) { + $config = $moduleConfig[$module] ?? ['name' => $module, 'icon' => 'heroicon-o-square-3-stack-3d']; + + // 构建该模块的权限选项 + $options = $permissions->mapWithKeys(function ($permission) use ($actionNames) { + $action = explode('.', $permission->name)[1] ?? ''; + $actionName = $actionNames[$action] ?? $action; + return [$permission->name => $actionName]; + })->toArray(); + + $tabs[] = Forms\Components\Tabs\Tab::make($config['name']) + ->icon($config['icon']) + ->schema([ + Forms\Components\CheckboxList::make('permissions') + ->label('') + ->relationship('permissions', 'name') + ->options($options) + ->columns(2) + ->bulkToggleable() + ->disabled(fn (?Role $record): bool => $record?->name === 'super-admin') + ->helperText(fn (?Role $record): string => + $record?->name === 'super-admin' + ? 'super-admin 角色拥有所有权限,不可修改' + : '选择该模块的权限' + ), + ]); + } + + return $tabs; + } + public static function form(Form $form): Form { return $form @@ -67,61 +137,9 @@ class RoleResource extends Resource Forms\Components\Section::make('权限配置') ->schema([ - Forms\Components\CheckboxList::make('permissions') - ->label('权限') - ->relationship('permissions', 'name') - ->options(function () { - return Permission::all() - ->groupBy(function ($permission) { - // 按模块分组(取权限名称的第一部分) - return explode('.', $permission->name)[0]; - }) - ->map(function ($permissions, $module) { - // 模块名称映射 - $moduleNames = [ - 'document' => '文档管理', - 'system-setting' => '系统设置', - 'activity-log' => '操作日志', - 'terminal' => '终端管理', - 'sop-template' => 'SOP模板', - 'group' => '分组管理', - 'user' => '用户管理', - 'role' => '角色管理', - ]; - - $moduleName = $moduleNames[$module] ?? $module; - - return $permissions->pluck('name', 'name') - ->mapWithKeys(function ($name) use ($moduleName) { - // 操作名称映射 - $action = explode('.', $name)[1] ?? ''; - $actionNames = [ - 'viewAny' => '查看列表', - 'view' => '查看详情', - 'create' => '创建', - 'update' => '编辑', - 'delete' => '删除', - 'download' => '下载', - 'export' => '导出', - 'sync' => '同步', - 'publish' => '发布', - 'archive' => '归档', - ]; - - $actionName = $actionNames[$action] ?? $action; - $label = "{$moduleName} - {$actionName}"; - - return [$name => $label]; - }); - }) - ->flatten() - ->toArray(); - }) - ->columns(3) - ->searchable() - ->bulkToggleable() - ->helperText('选择该角色拥有的权限') - ->disabled(fn (?Role $record): bool => $record?->name === 'super-admin'), + Forms\Components\Tabs::make('权限分组') + ->tabs(self::getPermissionTabs()) + ->columnSpanFull(), ]) ->description('配置角色的权限,super-admin 角色拥有所有权限且不可修改'), ]); diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php index ad58466..74724e0 100644 --- a/app/Filament/Resources/UserResource.php +++ b/app/Filament/Resources/UserResource.php @@ -35,6 +35,71 @@ class UserResource extends Resource return auth()->user()?->can('user.view') ?? false; } + /** + * 获取权限分组标签页 + */ + protected static function getPermissionTabs(): array + { + // 模块名称和图标映射 + $moduleConfig = [ + 'document' => ['name' => '文档管理', 'icon' => 'heroicon-o-document-text'], + 'system-setting' => ['name' => '系统设置', 'icon' => 'heroicon-o-cog-6-tooth'], + 'activity-log' => ['name' => '操作日志', 'icon' => 'heroicon-o-clipboard-document-list'], + 'terminal' => ['name' => '终端管理', 'icon' => 'heroicon-o-computer-desktop'], + 'sop-template' => ['name' => 'SOP模板', 'icon' => 'heroicon-o-document-text'], + 'group' => ['name' => '分组管理', 'icon' => 'heroicon-o-user-group'], + 'user' => ['name' => '用户管理', 'icon' => 'heroicon-o-users'], + 'role' => ['name' => '角色管理', 'icon' => 'heroicon-o-shield-check'], + ]; + + // 操作名称映射 + $actionNames = [ + 'viewAny' => '查看列表', + 'view' => '查看详情', + 'create' => '创建', + 'update' => '编辑', + 'delete' => '删除', + 'download' => '下载', + 'export' => '导出', + 'sync' => '同步', + 'publish' => '发布', + 'archive' => '归档', + ]; + + // 按模块分组权限 + $groupedPermissions = \Spatie\Permission\Models\Permission::all() + ->groupBy(function ($permission) { + return explode('.', $permission->name)[0]; + }); + + $tabs = []; + + foreach ($groupedPermissions as $module => $permissions) { + $config = $moduleConfig[$module] ?? ['name' => $module, 'icon' => 'heroicon-o-square-3-stack-3d']; + + // 构建该模块的权限选项 + $options = $permissions->mapWithKeys(function ($permission) use ($actionNames) { + $action = explode('.', $permission->name)[1] ?? ''; + $actionName = $actionNames[$action] ?? $action; + return [$permission->name => $actionName]; + })->toArray(); + + $tabs[] = Forms\Components\Tabs\Tab::make($config['name']) + ->icon($config['icon']) + ->schema([ + Forms\Components\CheckboxList::make('permissions') + ->label('') + ->relationship('permissions', 'name') + ->options($options) + ->columns(2) + ->bulkToggleable() + ->helperText('选择该模块的直接权限(会叠加到角色权限之上)'), + ]); + } + + return $tabs; + } + public static function form(Form $form): Form { return $form @@ -86,53 +151,9 @@ class UserResource extends Resource Forms\Components\Section::make('直接权限') ->description('为用户分配额外的权限,这些权限会叠加到角色权限之上') ->schema([ - Forms\Components\CheckboxList::make('permissions') - ->label('权限列表') - ->relationship('permissions', 'name') - ->columns(3) - ->gridDirection('row') - ->options(function () { - return \Spatie\Permission\Models\Permission::all() - ->groupBy(function ($permission) { - return explode('.', $permission->name)[0]; - }) - ->map(function ($permissions, $module) { - $moduleNames = [ - 'document' => '文档管理', - 'sop' => 'SOP模板', - 'terminal' => '终端管理', - 'user' => '用户管理', - 'role' => '角色管理', - 'group' => '分组管理', - 'system' => '系统设置', - 'activity' => '操作日志', - ]; - return $permissions->pluck('name', 'name') - ->mapWithKeys(function ($name) use ($moduleNames) { - $parts = explode('.', $name); - $module = $parts[0]; - $action = $parts[1] ?? ''; - $actionNames = [ - 'view' => '查看', - 'create' => '创建', - 'update' => '编辑', - 'delete' => '删除', - 'export' => '导出', - 'import' => '导入', - 'publish' => '发布', - 'archive' => '归档', - 'download' => '下载', - 'sync' => '同步', - ]; - $label = ($moduleNames[$module] ?? $module) . ' - ' . ($actionNames[$action] ?? $action); - return [$name => $label]; - }); - }) - ->flatten() - ->toArray(); - }) - ->searchable() - ->bulkToggleable(), + Forms\Components\Tabs::make('权限分组') + ->tabs(self::getPermissionTabs()) + ->columnSpanFull(), ]) ->collapsible() ->collapsed(),