From ce2ea0544ef29863adaa8a5298a015614d63380c Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:33:21 +0200 Subject: [PATCH] feat(auth): improve OAuth buttons and OIDC settings layout Add provider icons and full-width centered login buttons, organize OIDC fields, and remove hardcoded user IDs from the seeder. --- database/seeders/UserSeeder.php | 2 - resources/views/auth/login.blade.php | 6 +- .../views/livewire/settings-oauth.blade.php | 55 +++++++++++-------- tests/Feature/LoginPageBrandingTest.php | 22 ++++++++ tests/Feature/SettingsOauthTest.php | 21 +++++++ tests/Feature/UserSeederTest.php | 16 ++++++ 6 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 tests/Feature/UserSeederTest.php diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 2ac615cc01..19d3aa42e8 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -15,12 +15,10 @@ class UserSeeder extends Seeder 'email' => 'test@example.com', ]); User::factory()->create([ - 'id' => 1, 'name' => 'Normal User (but in root team)', 'email' => 'test2@example.com', ]); User::factory()->create([ - 'id' => 2, 'name' => 'Normal User (not in root team)', 'email' => 'test3@example.com', ]); diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index b0b0dd4a3a..12eb57867c 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -80,10 +80,14 @@ @if ($enabled_oauth_providers->isNotEmpty())
Or continue with
-
+
@foreach ($enabled_oauth_providers as $provider_setting) + @if ($provider_setting->provider !== 'oidc') + + @endif {{ $provider_setting->loginLabel() }} @endforeach diff --git a/resources/views/livewire/settings-oauth.blade.php b/resources/views/livewire/settings-oauth.blade.php index 4a394a0b9d..822c035b31 100644 --- a/resources/views/livewire/settings-oauth.blade.php +++ b/resources/views/livewire/settings-oauth.blade.php @@ -55,14 +55,39 @@
- - - + @if ($provider === 'oidc') + + + + + + +
+ +
+ @else + + + + @endif @if ($provider === 'azure') @endif - @if ($provider === 'oidc') - - - - - @endif
diff --git a/tests/Feature/LoginPageBrandingTest.php b/tests/Feature/LoginPageBrandingTest.php index 5d60290abd..ffe7da67ce 100644 --- a/tests/Feature/LoginPageBrandingTest.php +++ b/tests/Feature/LoginPageBrandingTest.php @@ -37,6 +37,28 @@ test('auth pages use the Coollabs purple background glow', function () { ->not->toMatch('/\.auth-shell\s*\{[^}]*color-mix\(in oklab, var\(--color-accent\) 9%, transparent\)/s'); }); +test('external login providers are centered and full width', function () { + $login = file_get_contents(resource_path('views/auth/login.blade.php')); + + expect($login) + ->toContain('class="flex flex-col gap-2"') + ->toContain('class="w-full justify-center"') + ->not->toContain('sm:w-[calc(50%-0.25rem)]'); +}); + +test('external login providers display their icons except oidc', function () { + $login = file_get_contents(resource_path('views/auth/login.blade.php')); + + expect($login) + ->toContain("@if (\$provider_setting->provider !== 'oidc')") + ->toContain("asset('svgs/'.\$provider_setting->provider.'.svg')") + ->toContain('class="size-5 shrink-0 dark:invert"'); + + foreach (['authentik', 'azure', 'bitbucket', 'clerk', 'discord', 'github', 'gitlab', 'google', 'infomaniak', 'zitadel'] as $provider) { + expect(public_path("svgs/{$provider}.svg"))->toBeFile(); + } +}); + test('error pages use the Coollabs purple background glow', function () { $styles = file_get_contents(resource_path('css/app.css')); diff --git a/tests/Feature/SettingsOauthTest.php b/tests/Feature/SettingsOauthTest.php index 6849b3d79a..95ea47e948 100644 --- a/tests/Feature/SettingsOauthTest.php +++ b/tests/Feature/SettingsOauthTest.php @@ -94,6 +94,27 @@ it('shows oidc fields with a naked okta issuer url example', function () { ->assertDontSee('/oauth2/default', false); }); +it('groups oidc fields in the expected desktop order', function () { + $view = file_get_contents(resource_path('views/livewire/settings-oauth.blade.php')); + $fields = [ + 'redirect_uri', + 'base_url', + 'client_id', + 'client_secret', + 'scopes', + 'clock_skew_seconds', + 'custom_label', + ]; + $positions = array_map( + fn (string $field): int|false => strpos($view, "id=\"oauth_settings_map.{{ \$provider }}.$field\""), + $fields, + ); + + expect($positions)->not->toContain(false) + ->and($positions)->toBe(collect($positions)->sort()->values()->all()) + ->and($view)->toContain('
'); +}); + it('shows provider enable controls as settings section actions', function () { actingAsInstanceAdmin(); diff --git a/tests/Feature/UserSeederTest.php b/tests/Feature/UserSeederTest.php new file mode 100644 index 0000000000..d8ccf86510 --- /dev/null +++ b/tests/Feature/UserSeederTest.php @@ -0,0 +1,16 @@ +seed(UserSeeder::class); + + $user = User::factory()->create(); + + expect(User::query()->orderBy('id')->pluck('id')->all())->toBe([0, 1, 2, 3]) + ->and($user->id)->toBe(3); +});