debian-mirror-gitlab/app/assets/javascripts/environments/components/environment.vue

269 lines
7.6 KiB
Vue
Raw Normal View History

2017-08-17 22:00:37 +05:30
<script>
/* global Flash */
2017-09-10 17:25:29 +05:30
import Visibility from 'visibilityjs';
2017-08-17 22:00:37 +05:30
import EnvironmentsService from '../services/environments_service';
2017-09-10 17:25:29 +05:30
import environmentTable from './environments_table.vue';
2017-08-17 22:00:37 +05:30
import EnvironmentsStore from '../stores/environments_store';
2017-09-10 17:25:29 +05:30
import loadingIcon from '../../vue_shared/components/loading_icon.vue';
import tablePagination from '../../vue_shared/components/table_pagination.vue';
2017-08-17 22:00:37 +05:30
import '../../lib/utils/common_utils';
import eventHub from '../event_hub';
2017-09-10 17:25:29 +05:30
import Poll from '../../lib/utils/poll';
import environmentsMixin from '../mixins/environments_mixin';
2017-08-17 22:00:37 +05:30
export default {
components: {
2017-09-10 17:25:29 +05:30
environmentTable,
tablePagination,
loadingIcon,
2017-08-17 22:00:37 +05:30
},
2017-09-10 17:25:29 +05:30
mixins: [
environmentsMixin,
],
2017-08-17 22:00:37 +05:30
data() {
const environmentsData = document.querySelector('#environments-list-view').dataset;
const store = new EnvironmentsStore();
return {
store,
state: store.state,
visibility: 'available',
isLoading: false,
cssContainerClass: environmentsData.cssClass,
endpoint: environmentsData.environmentsDataEndpoint,
canCreateDeployment: environmentsData.canCreateDeployment,
canReadEnvironment: environmentsData.canReadEnvironment,
canCreateEnvironment: environmentsData.canCreateEnvironment,
projectEnvironmentsPath: environmentsData.projectEnvironmentsPath,
projectStoppedEnvironmentsPath: environmentsData.projectStoppedEnvironmentsPath,
newEnvironmentPath: environmentsData.newEnvironmentPath,
helpPagePath: environmentsData.helpPagePath,
2017-09-10 17:25:29 +05:30
isMakingRequest: false,
2017-08-17 22:00:37 +05:30
// Pagination Properties,
paginationInformation: {},
pageNumber: 1,
};
},
computed: {
scope() {
return gl.utils.getParameterByName('scope');
},
canReadEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canReadEnvironment);
},
canCreateDeploymentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateDeployment);
},
canCreateEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateEnvironment);
},
},
/**
* Fetches all the environments and stores them.
* Toggles loading property.
*/
created() {
2017-09-10 17:25:29 +05:30
const scope = gl.utils.getParameterByName('scope') || this.visibility;
const page = gl.utils.getParameterByName('page') || this.pageNumber;
2017-08-17 22:00:37 +05:30
this.service = new EnvironmentsService(this.endpoint);
2017-09-10 17:25:29 +05:30
const poll = new Poll({
resource: this.service,
method: 'get',
data: { scope, page },
successCallback: this.successCallback,
errorCallback: this.errorCallback,
notificationCallback: (isMakingRequest) => {
this.isMakingRequest = isMakingRequest;
},
});
if (!Visibility.hidden()) {
this.isLoading = true;
poll.makeRequest();
}
Visibility.change(() => {
if (!Visibility.hidden()) {
poll.restart();
} else {
poll.stop();
}
});
2017-08-17 22:00:37 +05:30
eventHub.$on('toggleFolder', this.toggleFolder);
eventHub.$on('postAction', this.postAction);
},
2017-09-10 17:25:29 +05:30
beforeDestroy() {
2017-08-17 22:00:37 +05:30
eventHub.$off('toggleFolder');
eventHub.$off('postAction');
},
methods: {
2017-09-10 17:25:29 +05:30
toggleFolder(folder) {
2017-08-17 22:00:37 +05:30
this.store.toggleFolder(folder);
if (!folder.isOpen) {
2017-09-10 17:25:29 +05:30
this.fetchChildEnvironments(folder, true);
2017-08-17 22:00:37 +05:30
}
},
/**
* Will change the page number and update the URL.
*
* @param {Number} pageNumber desired page to go to.
* @return {String}
*/
changePage(pageNumber) {
const param = gl.utils.setParamInURL('page', pageNumber);
gl.utils.visitUrl(param);
return param;
},
fetchEnvironments() {
const scope = gl.utils.getParameterByName('scope') || this.visibility;
2017-09-10 17:25:29 +05:30
const page = gl.utils.getParameterByName('page') || this.pageNumber;
2017-08-17 22:00:37 +05:30
this.isLoading = true;
2017-09-10 17:25:29 +05:30
return this.service.get({ scope, page })
.then(this.successCallback)
.catch(this.errorCallback);
2017-08-17 22:00:37 +05:30
},
2017-09-10 17:25:29 +05:30
fetchChildEnvironments(folder, showLoader = false) {
this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', showLoader);
2017-08-17 22:00:37 +05:30
2017-09-10 17:25:29 +05:30
this.service.getFolderContent(folder.folder_path)
2017-08-17 22:00:37 +05:30
.then(resp => resp.json())
2017-09-10 17:25:29 +05:30
.then(response => this.store.setfolderContent(folder, response.environments))
.then(() => this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', false))
2017-08-17 22:00:37 +05:30
.catch(() => {
// eslint-disable-next-line no-new
new Flash('An error occurred while fetching the environments.');
2017-09-10 17:25:29 +05:30
this.store.updateEnvironmentProp(folder, 'isLoadingFolderContent', false);
2017-08-17 22:00:37 +05:30
});
},
postAction(endpoint) {
2017-09-10 17:25:29 +05:30
if (!this.isMakingRequest) {
this.isLoading = true;
this.service.postAction(endpoint)
.then(() => this.fetchEnvironments())
.catch(() => new Flash('An error occured while making the request.'));
}
},
successCallback(resp) {
this.saveData(resp);
// We need to verify if any folder is open to also update it
const openFolders = this.store.getOpenFolders();
if (openFolders.length) {
openFolders.forEach(folder => this.fetchChildEnvironments(folder));
}
},
errorCallback() {
this.isLoading = false;
// eslint-disable-next-line no-new
new Flash('An error occurred while fetching the environments.');
2017-08-17 22:00:37 +05:30
},
},
};
</script>
<template>
<div :class="cssContainerClass">
<div class="top-area">
<ul
v-if="!isLoading"
class="nav-links">
<li :class="{ active: scope === null || scope === 'available' }">
<a :href="projectEnvironmentsPath">
Available
<span class="badge js-available-environments-count">
{{state.availableCounter}}
</span>
</a>
</li>
<li :class="{ active : scope === 'stopped' }">
<a :href="projectStoppedEnvironmentsPath">
Stopped
<span class="badge js-stopped-environments-count">
{{state.stoppedCounter}}
</span>
</a>
</li>
</ul>
<div
v-if="canCreateEnvironmentParsed && !isLoading"
class="nav-controls">
<a
:href="newEnvironmentPath"
class="btn btn-create">
New environment
</a>
</div>
</div>
2017-09-10 17:25:29 +05:30
<div class="environments-container">
<loading-icon
label="Loading environments"
size="3"
v-if="isLoading"
/>
2017-08-17 22:00:37 +05:30
<div
class="blank-state blank-state-no-icon"
v-if="!isLoading && state.environments.length === 0">
<h2 class="blank-state-title js-blank-state-title">
You don't have any environments right now.
</h2>
<p class="blank-state-text">
Environments are places where code gets deployed, such as staging or production.
<br />
<a :href="helpPagePath">
Read more about environments
</a>
</p>
<a
v-if="canCreateEnvironmentParsed"
:href="newEnvironmentPath"
class="btn btn-create js-new-environment-button">
2017-09-10 17:25:29 +05:30
New environment
2017-08-17 22:00:37 +05:30
</a>
</div>
<div
class="table-holder"
v-if="!isLoading && state.environments.length > 0">
<environment-table
:environments="state.environments"
:can-create-deployment="canCreateDeploymentParsed"
:can-read-environment="canReadEnvironmentParsed"
2017-09-10 17:25:29 +05:30
/>
2017-08-17 22:00:37 +05:30
</div>
<table-pagination
v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
:change="changePage"
:pageInfo="state.paginationInformation" />
</div>
</div>
</template>