From 3bb27e94dc3fe20a051d23ff16ad5cb4f904b539 Mon Sep 17 00:00:00 2001
From: Angelo Gulina <agulina@gitlab.com>
Date: Wed, 7 Oct 2020 16:05:20 +0200
Subject: [PATCH] Avoid New Environment button glitching when changing tabs

---
 .../components/environments_app.vue           |  4 +--
 ...umping-button-on-the-environments-page.yml |  5 ++++
 .../environments/environments_app_spec.js     | 30 ++++++++++++++++++-
 3 files changed, 36 insertions(+), 3 deletions(-)
 create mode 100644 changelogs/unreleased/250571-jumping-button-on-the-environments-page.yml

diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index 18f698553496f..8c4d374ebe7d8 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -145,7 +145,7 @@ export default {
           class="gl-mb-3 gl-flex-fill-1"
         />
         <gl-button
-          v-if="canCreateEnvironment && !isLoading"
+          v-if="canCreateEnvironment"
           :href="newEnvironmentPath"
           category="primary"
           variant="success"
@@ -181,7 +181,7 @@ export default {
               class="gl-mb-3 gl-lg-mr-3 gl-lg-mb-0"
             />
             <gl-button
-              v-if="canCreateEnvironment && !isLoading"
+              v-if="canCreateEnvironment"
               :href="newEnvironmentPath"
               category="primary"
               variant="success"
diff --git a/changelogs/unreleased/250571-jumping-button-on-the-environments-page.yml b/changelogs/unreleased/250571-jumping-button-on-the-environments-page.yml
new file mode 100644
index 0000000000000..73d01d0f6203d
--- /dev/null
+++ b/changelogs/unreleased/250571-jumping-button-on-the-environments-page.yml
@@ -0,0 +1,5 @@
+---
+title: Avoid New Environment button glitching when changing tabs
+merge_request: 44603
+author:
+type: fixed
diff --git a/spec/frontend/environments/environments_app_spec.js b/spec/frontend/environments/environments_app_spec.js
index 22b066fae414b..a21eff6aa45f3 100644
--- a/spec/frontend/environments/environments_app_spec.js
+++ b/spec/frontend/environments/environments_app_spec.js
@@ -1,9 +1,10 @@
+import { GlButton } from '@gitlab/ui';
 import { mount, shallowMount } from '@vue/test-utils';
 import MockAdapter from 'axios-mock-adapter';
-import axios from '~/lib/utils/axios_utils';
 import Container from '~/environments/components/container.vue';
 import EmptyState from '~/environments/components/empty_state.vue';
 import EnvironmentsApp from '~/environments/components/environments_app.vue';
+import axios from '~/lib/utils/axios_utils';
 import { environment, folder } from './mock_data';
 
 describe('Environment', () => {
@@ -40,6 +41,7 @@ describe('Environment', () => {
     return axios.waitForAll();
   };
 
+  const findNewEnvironmentButton = () => wrapper.find(GlButton);
   const findEnvironmentsTabAvailable = () => wrapper.find('.js-environments-tab-available > a');
   const findEnvironmentsTabStopped = () => wrapper.find('.js-environments-tab-stopped > a');
 
@@ -175,4 +177,30 @@ describe('Environment', () => {
       expect(wrapper.find('.text-center > a.btn').text()).toContain('Show all');
     });
   });
+
+  describe('environment button', () => {
+    describe('when user can create environment', () => {
+      beforeEach(() => {
+        mockRequest([environment]);
+        wrapper = mount(EnvironmentsApp, { propsData: mockData });
+      });
+
+      it('should render', () => {
+        expect(findNewEnvironmentButton().exists()).toBe(true);
+      });
+    });
+
+    describe('when user can not create environment', () => {
+      beforeEach(() => {
+        mockRequest([environment]);
+        wrapper = mount(EnvironmentsApp, {
+          propsData: { ...mockData, canCreateEnvironment: false },
+        });
+      });
+
+      it('should not render', () => {
+        expect(findNewEnvironmentButton().exists()).toBe(false);
+      });
+    });
+  });
 });
-- 
GitLab