From 418287d511405eb7564e8b86352f26f070968627 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 21 Jul 2026 20:54:59 +0200 Subject: [PATCH] fix(ui): align GitLab App create modal with GitHub Match the GitHub create modal layout: intro copy, name/group row, system-wide warning, self-hosted accordion (URL/API/SSH), and a bottom Continue button instead of a duplicate header Save. --- app/Livewire/Source/Gitlab/Create.php | 46 +++++++++-- .../livewire/source/gitlab/create.blade.php | 78 +++++++++++++++---- tests/Feature/GitlabSourceCreateModalTest.php | 50 ++++++++++++ 3 files changed, 156 insertions(+), 18 deletions(-) create mode 100644 tests/Feature/GitlabSourceCreateModalTest.php diff --git a/app/Livewire/Source/Gitlab/Create.php b/app/Livewire/Source/Gitlab/Create.php index 7f37219ec..200bd6d40 100644 --- a/app/Livewire/Source/Gitlab/Create.php +++ b/app/Livewire/Source/Gitlab/Create.php @@ -6,6 +6,7 @@ use App\Models\GitlabApp; use App\Rules\SafeExternalUrl; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Str; +use Illuminate\Validation\ValidationException; use Livewire\Component; class Create extends Component @@ -16,34 +17,62 @@ class Create extends Component public string $html_url = 'https://gitlab.com'; + public string $api_url = 'https://gitlab.com/api/v4'; + + public string $custom_user = 'git'; + + public int $custom_port = 22; + public bool $is_system_wide = false; public ?string $group_name = null; + private bool $shouldDeriveApiUrlAfterHtmlUrlUpdate = false; + public function mount() { $this->name = substr(generate_random_name(), 0, 30); } + public function updatingHtmlUrl(): void + { + $this->shouldDeriveApiUrlAfterHtmlUrlUpdate = blank($this->api_url) + || $this->api_url === $this->gitlabApiUrlFromHtmlUrl($this->html_url); + } + + public function updatedHtmlUrl(): void + { + if ($this->shouldDeriveApiUrlAfterHtmlUrlUpdate) { + $this->api_url = $this->gitlabApiUrlFromHtmlUrl($this->html_url); + } + } + public function createGitLabApp() { try { $this->authorize('createAnyResource'); + $this->html_url = rtrim($this->html_url, '/'); + $this->api_url = filled($this->api_url) + ? rtrim($this->api_url, '/') + : $this->gitlabApiUrlFromHtmlUrl($this->html_url); + $this->validate([ 'name' => 'required|string', 'html_url' => ['required', 'string', 'url', new SafeExternalUrl], + 'api_url' => ['required', 'string', 'url', new SafeExternalUrl], + 'custom_user' => 'required|string', + 'custom_port' => 'required|int', 'is_system_wide' => 'required|bool', 'group_name' => 'nullable|string', ]); - $htmlUrl = rtrim($this->html_url, '/'); - $apiUrl = $htmlUrl.'/api/v4'; - $gitlab_app = GitlabApp::create([ 'name' => $this->name, - 'api_url' => $apiUrl, - 'html_url' => $htmlUrl, + 'api_url' => $this->api_url, + 'html_url' => $this->html_url, + 'custom_user' => $this->custom_user, + 'custom_port' => $this->custom_port, 'is_system_wide' => $this->is_system_wide, 'group_name' => $this->group_name, 'webhook_token' => Str::random(32), @@ -55,8 +84,15 @@ class Create extends Component } return redirectRoute($this, 'source.gitlab.show', ['gitlab_app_uuid' => $gitlab_app->uuid]); + } catch (ValidationException $e) { + throw $e; } catch (\Throwable $e) { return handleError($e, $this); } } + + private function gitlabApiUrlFromHtmlUrl(string $htmlUrl): string + { + return rtrim($htmlUrl, '/').'/api/v4'; + } } diff --git a/resources/views/livewire/source/gitlab/create.blade.php b/resources/views/livewire/source/gitlab/create.blade.php index 61e2bedeb..4b053edb7 100644 --- a/resources/views/livewire/source/gitlab/create.blade.php +++ b/resources/views/livewire/source/gitlab/create.blade.php @@ -1,18 +1,70 @@ -