From d550bab59619b7efaf2f5102350af05db2ef76e1 Mon Sep 17 00:00:00 2001 From: Tomasz Boruc Date: Sun, 30 Aug 2026 20:58:46 +0200 Subject: [PATCH] Poprawki w module ustawienia ( role) --- app/Http/Controllers/SettingsController.php | 30 +++++++++++++- resources/views/settings/index.blade.php | 43 +++++++++++++++++++++ routes/web.php | 1 + tests/Feature/AdvanceTest.php | 21 ++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index bb9d933..7677ad1 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -5,14 +5,18 @@ namespace App\Http\Controllers; use App\Models\AdvanceType; use Illuminate\Http\Request; use Illuminate\View\View; +use Spatie\Permission\Models\Permission; +use Spatie\Permission\Models\Role; class SettingsController extends Controller { public function index(): View { $advanceTypes = AdvanceType::orderBy('name')->get(); + $roles = Role::with('permissions')->orderBy('name')->get(); + $permissions = Permission::orderBy('name')->get(); - return view('settings.index', compact('advanceTypes')); + return view('settings.index', compact('advanceTypes', 'roles', 'permissions')); } public function storeAdvanceType(Request $request) @@ -57,4 +61,28 @@ class SettingsController extends Controller return redirect()->route('settings.index')->with('status', 'Rodzaj zaliczki został usunięty.'); } + + public function storeRolePermissions(Request $request) + { + $request->validate([ + 'permissions' => ['array'], + 'permissions.*' => ['array'], + 'permissions.*.*' => ['string'], + ]); + + foreach ($request->input('permissions', []) as $roleId => $selectedPermissions) { + $role = Role::find($roleId); + + if (! $role) { + continue; + } + + $allPermissions = Permission::pluck('name')->all(); + $selectedPermissions = is_array($selectedPermissions) ? $selectedPermissions : []; + + $role->syncPermissions(array_intersect($allPermissions, $selectedPermissions)); + } + + return redirect()->route('settings.index')->with('status', 'Uprawnienia ról zostały zaktualizowane.'); + } } diff --git a/resources/views/settings/index.blade.php b/resources/views/settings/index.blade.php index 6169a01..85d9a5f 100644 --- a/resources/views/settings/index.blade.php +++ b/resources/views/settings/index.blade.php @@ -107,6 +107,49 @@ + +
+ + + +
diff --git a/routes/web.php b/routes/web.php index dd7d867..68e0c9c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -40,6 +40,7 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::post('/settings/advance-types', [SettingsController::class, 'storeAdvanceType'])->name('settings.advance-types.store'); Route::put('/settings/advance-types/{advanceType}', [SettingsController::class, 'updateAdvanceType'])->name('settings.advance-types.update'); Route::delete('/settings/advance-types/{advanceType}', [SettingsController::class, 'destroyAdvanceType'])->name('settings.advance-types.destroy'); + Route::post('/settings/role-permissions', [SettingsController::class, 'storeRolePermissions'])->name('settings.role-permissions.store'); }); // Moduł Raporty diff --git a/tests/Feature/AdvanceTest.php b/tests/Feature/AdvanceTest.php index a6c9ad6..ae36149 100644 --- a/tests/Feature/AdvanceTest.php +++ b/tests/Feature/AdvanceTest.php @@ -115,6 +115,27 @@ test('manager can edit and delete an advance type from settings', function () { $this->assertDatabaseMissing('advance_types', ['id' => $type->id]); }); +test('manager can update role permissions from settings', function () { + Permission::firstOrCreate(['name' => 'users_access']); + Permission::firstOrCreate(['name' => 'raporty_access']); + Permission::firstOrCreate(['name' => 'flota_access']); + + $manager = User::factory()->create(); + $managerRole = Role::firstOrCreate(['name' => 'kierownik']); + $managerRole->givePermissionTo('users_access'); + $manager->assignRole($managerRole); + + $response = $this->actingAs($manager)->post(route('settings.role-permissions.store'), [ + 'permissions' => [ + $managerRole->id => ['users_access', 'raporty_access'], + ], + ]); + + $response->assertRedirect(route('settings.index')); + $this->assertTrue($managerRole->fresh()->hasPermissionTo('raporty_access')); + $this->assertFalse($managerRole->fresh()->hasPermissionTo('flota_access')); +}); + test('manager cannot delete an advance type that is still used in advances', function () { Permission::firstOrCreate(['name' => 'users_access']);