summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/environments/components/environments_app.vue
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/environments/components/environments_app.vue')
-rw-r--r--app/assets/javascripts/environments/components/environments_app.vue60
1 files changed, 44 insertions, 16 deletions
diff --git a/app/assets/javascripts/environments/components/environments_app.vue b/app/assets/javascripts/environments/components/environments_app.vue
index f44182e822b..55e6a891e27 100644
--- a/app/assets/javascripts/environments/components/environments_app.vue
+++ b/app/assets/javascripts/environments/components/environments_app.vue
@@ -1,7 +1,9 @@
<script>
-import { GlBadge, GlPagination, GlTab, GlTabs } from '@gitlab/ui';
+import { GlBadge, GlPagination, GlSearchBoxByType, GlTab, GlTabs } from '@gitlab/ui';
+import { debounce } from 'lodash';
import { s__, __, sprintf } from '~/locale';
import { updateHistory, setUrlParams, queryToObject } from '~/lib/utils/url_utility';
+import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import environmentAppQuery from '../graphql/queries/environment_app.query.graphql';
import pollIntervalQuery from '../graphql/queries/poll_interval.query.graphql';
import pageInfoQuery from '../graphql/queries/page_info.query.graphql';
@@ -31,6 +33,7 @@ export default {
StopEnvironmentModal,
GlBadge,
GlPagination,
+ GlSearchBoxByType,
GlTab,
GlTabs,
},
@@ -41,11 +44,10 @@ export default {
return {
scope: this.scope,
page: this.page ?? 1,
+ search: this.search,
};
},
- pollInterval() {
- return this.interval;
- },
+ pollInterval: 3000,
},
interval: {
query: pollIntervalQuery,
@@ -80,10 +82,11 @@ export default {
next: __('Next'),
prev: __('Prev'),
goto: (page) => sprintf(__('Go to page %{page}'), { page }),
+ searchPlaceholder: s__('Environments|Search by environment name'),
},
modalId: 'enable-review-app-info',
data() {
- const { page = '1', scope } = queryToObject(window.location.search);
+ const { page = '1', search = '', scope } = queryToObject(window.location.search);
return {
interval: undefined,
isReviewAppModalVisible: false,
@@ -97,6 +100,7 @@ export default {
environmentToStop: {},
environmentToChangeCanary: {},
weight: 0,
+ search,
};
},
computed: {
@@ -112,6 +116,9 @@ export default {
hasEnvironments() {
return this.environments.length > 0 || this.folders.length > 0;
},
+ hasSearch() {
+ return Boolean(this.search);
+ },
availableCount() {
return this.environmentApp?.availableCount;
},
@@ -152,11 +159,19 @@ export default {
return this.pageInfo?.perPage;
},
},
+ watch: {
+ interval(val) {
+ this.$apollo.queries.environmentApp.stopPolling();
+ this.$apollo.queries.environmentApp.startPolling(val);
+ },
+ },
mounted() {
window.addEventListener('popstate', this.syncPageFromQueryParams);
+ window.addEventListener('popstate', this.syncSearchFromQueryParams);
},
destroyed() {
window.removeEventListener('popstate', this.syncPageFromQueryParams);
+ window.removeEventListener('popstate', this.syncSearchFromQueryParams);
this.$apollo.queries.environmentApp.stopPolling();
},
methods: {
@@ -173,23 +188,24 @@ export default {
moveToPage(page) {
this.page = page;
updateHistory({
- url: setUrlParams({ page: this.page }),
+ url: setUrlParams({ page: this.page, scope: this.scope, search: this.search }),
title: document.title,
});
- this.resetPolling();
},
+ setSearch: debounce(function setSearch(input) {
+ this.search = input;
+ this.moveToPage(1);
+ }, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
syncPageFromQueryParams() {
const { page = '1' } = queryToObject(window.location.search);
this.page = parseInt(page, 10);
},
- resetPolling() {
- this.$apollo.queries.environmentApp.stopPolling();
+ syncSearchFromQueryParams() {
+ const { search = '' } = queryToObject(window.location.search);
+ this.search = search;
+ },
+ refetchEnvironments() {
this.$apollo.queries.environmentApp.refetch();
- this.$nextTick(() => {
- if (this.interval) {
- this.$apollo.queries.environmentApp.startPolling(this.interval);
- }
- });
},
},
ENVIRONMENTS_SCOPE,
@@ -237,12 +253,19 @@ export default {
</template>
</gl-tab>
</gl-tabs>
+ <gl-search-box-by-type
+ class="gl-mb-4"
+ :value="search"
+ :placeholder="$options.i18n.searchPlaceholder"
+ @input="setSearch"
+ />
<template v-if="hasEnvironments">
<environment-folder
v-for="folder in folders"
:key="folder.name"
class="gl-mb-3"
:scope="scope"
+ :search="search"
:nested-environment="folder"
/>
<environment-item
@@ -250,10 +273,15 @@ export default {
:key="environment.name"
class="gl-mb-3 gl-border-gray-100 gl-border-1 gl-border-b-solid"
:environment="environment.latest"
- @change="resetPolling"
+ @change="refetchEnvironments"
/>
</template>
- <empty-state v-else :help-path="helpPagePath" :scope="scope" />
+ <empty-state
+ v-else-if="!$apollo.queries.environmentApp.loading"
+ :help-path="helpPagePath"
+ :scope="scope"
+ :has-term="hasSearch"
+ />
<gl-pagination
align="center"
:total-items="totalItems"