From 69e37a100e636bc96e394b4a18fa849fdc37e69f Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:21:42 +0300 Subject: [PATCH 01/11] Add icons to package-owned navigation items --- src/LazyAdminServiceProvider.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/LazyAdminServiceProvider.php b/src/LazyAdminServiceProvider.php index f96adcc..671a243 100644 --- a/src/LazyAdminServiceProvider.php +++ b/src/LazyAdminServiceProvider.php @@ -468,7 +468,7 @@ public function packageBooted(): void $prefix = trim((string) config('lazy.admin.route.name', 'admin.'), '.'); $menu->group(__('lazy-admin::admin.navigation.overview')); - $menu->addItem($prefix.'.dashboard', __('lazy-admin::admin.navigation.dashboard')); + $menu->addItem($prefix.'.dashboard', __('lazy-admin::admin.navigation.dashboard'), iconView: 'lazy::icons.dashboard'); }, id: 'lazy-admin-dashboard', priority: 10); MenuFacade::register(function (MenuManager $menu): void { @@ -480,11 +480,11 @@ public function packageBooted(): void $menu->group(__('lazy-admin::admin.navigation.system')); if (! $enforce || $user?->can('settings.view')) { - $menu->addItem($prefix.'.setting.index', __('lazy-admin::admin.navigation.settings')); + $menu->addItem($prefix.'.setting.index', __('lazy-admin::admin.navigation.settings'), iconView: 'lazy::icons.settings'); } if (! $enforce || $user?->can('activity.view')) { - $menu->addItem($prefix.'.activity.index', __('lazy-admin::admin.navigation.activity_log')); + $menu->addItem($prefix.'.activity.index', __('lazy-admin::admin.navigation.activity_log'), iconView: 'lazy::icons.activity'); } } }, id: 'lazy-admin-system', priority: 90); @@ -508,6 +508,7 @@ public function packageBooted(): void $menu->addItem( $routeTarget, __('lazy-admin::admin.navigation.redirects'), + iconView: 'lazy::icons.redirect', ); }, id: 'lazy-admin-seo-redirects', priority: 70); } @@ -522,7 +523,8 @@ public function packageBooted(): void $menu->group(__('lazy-admin::admin.navigation.content')); $menu->addItem( $prefix.'.page.index', - __('Pages'), + __('lazy-admin::admin.navigation.pages'), + iconView: 'lazy::icons.page', ); } }, id: 'lazy-admin-pages', priority: 60); @@ -543,6 +545,7 @@ public function packageBooted(): void $menu->addItem( $prefix.'.access.index', __('lazy-admin::admin.navigation.access'), + iconView: 'lazy::icons.shield', ); }, id: 'lazy-admin-access', priority: 80); } From 40e3ccb17b530179c030a113177f1b62f93a84a2 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:21:52 +0300 Subject: [PATCH 02/11] Add activity navigation icon --- resources/views/icons/activity.blade.php | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/views/icons/activity.blade.php diff --git a/resources/views/icons/activity.blade.php b/resources/views/icons/activity.blade.php new file mode 100644 index 0000000..4e6f4e1 --- /dev/null +++ b/resources/views/icons/activity.blade.php @@ -0,0 +1 @@ + From 93b47c6aed2cb2a69c53e93eca75bb041df38f84 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:21:54 +0300 Subject: [PATCH 03/11] Add redirect navigation icon --- resources/views/icons/redirect.blade.php | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/views/icons/redirect.blade.php diff --git a/resources/views/icons/redirect.blade.php b/resources/views/icons/redirect.blade.php new file mode 100644 index 0000000..41bd34d --- /dev/null +++ b/resources/views/icons/redirect.blade.php @@ -0,0 +1 @@ + From f457363dfb2065400c82b7fd307871fb8efb4e9f Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:21:56 +0300 Subject: [PATCH 04/11] Add shield navigation icon --- resources/views/icons/shield.blade.php | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/views/icons/shield.blade.php diff --git a/resources/views/icons/shield.blade.php b/resources/views/icons/shield.blade.php new file mode 100644 index 0000000..f78d5a8 --- /dev/null +++ b/resources/views/icons/shield.blade.php @@ -0,0 +1 @@ + From 71bfdcc0011566a191c689e087d8a221abce92e6 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:24:21 +0300 Subject: [PATCH 05/11] Avoid missing profile route errors in partial admin test routes --- src/LazyAdminServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LazyAdminServiceProvider.php b/src/LazyAdminServiceProvider.php index 671a243..5815182 100644 --- a/src/LazyAdminServiceProvider.php +++ b/src/LazyAdminServiceProvider.php @@ -212,7 +212,7 @@ public function packageBooted(): void 'dashboardUrl' => Route::has('admin.dashboard') ? route('admin.dashboard') : url((string) config('lazy.admin.home', '/')), - 'profileUrl' => route(trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show'), + 'profileUrl' => Route::has($profileRoute = trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show') ? route($profileRoute) : null, 'settingsUrl' => Route::has('admin.setting.index') ? route('admin.setting.index') : null, 'logoUrl' => (static function (): ?string { $logo = setting('admin.logo', config('lazy.admin.logo')); From fd06fec122b3da232064b43d7495070516ca11bf Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:24:24 +0300 Subject: [PATCH 06/11] Remove inline PHP directive from permissions catalog --- resources/views/access/index.blade.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/views/access/index.blade.php b/resources/views/access/index.blade.php index 4bbd832..e9f4f59 100644 --- a/resources/views/access/index.blade.php +++ b/resources/views/access/index.blade.php @@ -321,7 +321,6 @@ class="min-w-0 flex-1"
@foreach ($permissions as $permission) - @php($isSystemPermission = in_array($permission->name, config('lazy.admin.permissions.defaults', []), true))
name, config('lazy.admin.permissions.defaults', []), true)) {{ $permission->name }} - @if ($isSystemPermission) + @if (in_array($permission->name, config('lazy.admin.permissions.defaults', []), true)) {{ __('lazy-admin::access.system_permission') }} @endif @endif - @if ($canDeletePermissions && ! $isSystemPermission) + @if ($canDeletePermissions && ! in_array($permission->name, config('lazy.admin.permissions.defaults', []), true)) - @if ($canDeletePermissions && ! $isSystemPermission) + @if ($canDeletePermissions && ! in_array($permission->name, config('lazy.admin.permissions.defaults', []), true)) Date: Sat, 10 Oct 2026 19:24:32 +0300 Subject: [PATCH 07/11] Provide login route for guest security test --- tests/Feature/UserSecurityTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Feature/UserSecurityTest.php b/tests/Feature/UserSecurityTest.php index 989d460..4e9c0ca 100644 --- a/tests/Feature/UserSecurityTest.php +++ b/tests/Feature/UserSecurityTest.php @@ -2,6 +2,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Schema; use Spatie\Permission\PermissionRegistrar; use Spatie\Permission\PermissionServiceProvider; @@ -11,6 +12,8 @@ beforeEach(function (): void { $this->withoutVite(); + Route::get('/login', fn () => 'Login')->name('login'); + Route::getRoutes()->refreshNameLookups(); config()->set([ 'database.connections.testing' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => ''], 'auth.providers.users.model' => User::class, From fe1eb6633db2de6c2ec1815b752ca4e441862790 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:24:47 +0300 Subject: [PATCH 08/11] Keep profile route lookup explicit and optional --- src/LazyAdminServiceProvider.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/LazyAdminServiceProvider.php b/src/LazyAdminServiceProvider.php index 5815182..034f50f 100644 --- a/src/LazyAdminServiceProvider.php +++ b/src/LazyAdminServiceProvider.php @@ -206,13 +206,14 @@ public function packageBooted(): void View::composer('lazy::header', static function ($view): void { $guard = (string) config('lazy.auth.guard', 'web'); $user = Auth::guard($guard)->user(); + $profileRoute = trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show'; $view->with([ 'user' => $user, 'dashboardUrl' => Route::has('admin.dashboard') ? route('admin.dashboard') : url((string) config('lazy.admin.home', '/')), - 'profileUrl' => Route::has($profileRoute = trim((string) config('lazy.admin.route.name', 'admin.'), '.').'.profile.show') ? route($profileRoute) : null, + 'profileUrl' => Route::has($profileRoute) ? route($profileRoute) : null, 'settingsUrl' => Route::has('admin.setting.index') ? route('admin.setting.index') : null, 'logoUrl' => (static function (): ?string { $logo = setting('admin.logo', config('lazy.admin.logo')); From 50e30ce6ebd2500294263527872ff570987a36f7 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:28:27 +0300 Subject: [PATCH 09/11] Narrow authentication types for PHPStan --- src/Controllers/LoginController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Controllers/LoginController.php b/src/Controllers/LoginController.php index 6c3531f..4ba2bdf 100644 --- a/src/Controllers/LoginController.php +++ b/src/Controllers/LoginController.php @@ -32,7 +32,9 @@ public function login(Request $request): RedirectResponse $field => $request->string('email')->toString(), 'password' => $request->string('password')->toString(), ]; - $candidate = $guard->getProvider()->retrieveByCredentials($credentials); + $candidate = method_exists($guard, 'getProvider') + ? $guard->getProvider()->retrieveByCredentials($credentials) + : null; if ($candidate && data_get($candidate, 'two_factor_secret')) { return back()->withErrors(['email' => __('auth.failed')])->onlyInput('email'); } From efb72af02c5206bf2580b51e1392130586872ba9 Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:28:30 +0300 Subject: [PATCH 10/11] Narrow authentication types for PHPStan --- src/Controllers/ProfileController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Controllers/ProfileController.php b/src/Controllers/ProfileController.php index 00faf07..8100056 100644 --- a/src/Controllers/ProfileController.php +++ b/src/Controllers/ProfileController.php @@ -54,7 +54,9 @@ public function password(Request $request): RedirectResponse 'password' => ['required', 'string', Password::defaults(), 'confirmed'], ]); $user->setAttribute('password', Hash::make($validated['password'])); - $user->setAttribute($user->getRememberTokenName(), Str::random(60)); + if (method_exists($user, 'getRememberTokenName')) { + $user->setAttribute($user->getRememberTokenName(), Str::random(60)); + } $user->save(); $request->session()->regenerate(); AdminActivity::log('password_changed', 'User password changed', $user, properties: ['self' => true]); From ddd1889065a5141a6559934904cf66ad5682fe7c Mon Sep 17 00:00:00 2001 From: Yurij Finiv Date: Sat, 10 Oct 2026 19:28:33 +0300 Subject: [PATCH 11/11] Narrow authentication types for PHPStan --- src/Controllers/UserController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Controllers/UserController.php b/src/Controllers/UserController.php index c7a0104..d3c15e5 100644 --- a/src/Controllers/UserController.php +++ b/src/Controllers/UserController.php @@ -141,7 +141,9 @@ public function password(Request $request, string $user): RedirectResponse ]); $model->setAttribute('password', Hash::make($request->string('password')->toString())); - $model->setAttribute($model->getRememberTokenName(), Str::random(60)); + if (method_exists($model, 'getRememberTokenName')) { + $model->setAttribute($model->getRememberTokenName(), Str::random(60)); + } $model->save(); $request->session()->regenerate(); AdminActivity::log('password_changed', 'User password changed', $model, properties: [