gitlab-org--gitlab-foss/app/assets/javascripts/environments/components/environment.js.es6

194 lines
6.1 KiB
JavaScript
Raw Normal View History

/* eslint-disable no-param-reassign, no-new */
/* global Flash */
2017-02-17 10:54:54 -05:00
const Vue = window.Vue = require('vue');
window.Vue.use(require('vue-resource'));
2017-02-09 06:38:59 -05:00
const EnvironmentsService = require('../services/environments_service');
const EnvironmentTable = require('./environments_table');
2017-02-16 06:29:45 -05:00
const EnvironmentsStore = require('../stores/environments_store');
2017-02-09 07:18:47 -05:00
require('../../vue_shared/components/table_pagination');
2017-02-13 09:49:19 -05:00
require('../../lib/utils/common_utils');
2017-02-17 10:54:54 -05:00
require('../../vue_shared/vue_resource_interceptor');
2017-02-09 06:52:22 -05:00
module.exports = Vue.component('environment-component', {
components: {
'environment-table': EnvironmentTable,
2017-02-09 07:18:47 -05:00
'table-pagination': gl.VueGlPagination,
2017-02-09 06:52:22 -05:00
},
data() {
const environmentsData = document.querySelector('#environments-list-view').dataset;
2017-02-16 06:29:45 -05:00
const store = new EnvironmentsStore();
2017-02-09 06:52:22 -05:00
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,
commitIconSvg: environmentsData.commitIconSvg,
playIconSvg: environmentsData.playIconSvg,
terminalIconSvg: environmentsData.terminalIconSvg,
2017-02-09 07:18:47 -05:00
// Pagination Properties,
paginationInformation: {},
pageNumber: 1,
2017-02-09 06:52:22 -05:00
};
},
computed: {
scope() {
2017-02-13 09:49:19 -05:00
return gl.utils.getParameterByName('scope');
},
2017-02-09 06:52:22 -05:00
canReadEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canReadEnvironment);
},
2017-02-09 06:52:22 -05:00
canCreateDeploymentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateDeployment);
},
2017-02-09 06:52:22 -05:00
canCreateEnvironmentParsed() {
return gl.utils.convertPermissionToBoolean(this.canCreateEnvironment);
},
2017-02-09 06:52:22 -05:00
},
/**
* Fetches all the environments and stores them.
* Toggles loading property.
*/
created() {
2017-02-13 09:49:19 -05:00
const scope = gl.utils.getParameterByName('scope') || this.visibility;
const pageNumber = gl.utils.getParameterByName('page') || this.pageNumber;
2017-02-09 07:18:47 -05:00
const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`;
2017-02-09 06:52:22 -05:00
const service = new EnvironmentsService(endpoint);
this.isLoading = true;
return service.all()
.then(resp => ({
headers: resp.headers,
body: resp.json(),
}))
.then((response) => {
this.store.storeAvailableCount(response.body.available_count);
this.store.storeStoppedCount(response.body.stopped_count);
this.store.storeEnvironments(response.body.environments);
this.store.setPagination(response.headers);
2017-02-09 06:52:22 -05:00
})
.then(() => {
this.isLoading = false;
})
.catch(() => {
this.isLoading = false;
new Flash('An error occurred while fetching the environments.', 'alert');
});
},
methods: {
toggleRow(model) {
return this.store.toggleFolder(model.name);
},
2017-02-09 07:18:47 -05:00
/**
* 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;
2017-02-09 07:18:47 -05:00
},
2017-02-09 06:52:22 -05:00
},
template: `
<div :class="cssContainerClass">
<div class="top-area">
<ul v-if="!isLoading" class="nav-links">
2017-02-13 09:49:19 -05:00
<li v-bind:class="{ 'active': scope === null || scope === 'available' }">
2017-02-09 06:52:22 -05:00
<a :href="projectEnvironmentsPath">
Available
<span class="badge js-available-environments-count">
{{state.availableCounter}}
</span>
</a>
</li>
<li v-bind: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-02-09 06:52:22 -05:00
<div class="environments-container">
<div class="environments-list-loading text-center" v-if="isLoading">
<i class="fa fa-spinner fa-spin"></i>
</div>
2017-02-09 06:52:22 -05:00
<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>
2017-02-09 06:52:22 -05:00
</p>
<a v-if="canCreateEnvironmentParsed"
:href="newEnvironmentPath"
class="btn btn-create js-new-environment-button">
New Environment
</a>
</div>
2017-02-09 06:52:22 -05:00
<div class="table-holder"
v-if="!isLoading && state.environments.length > 0">
<environment-table
:environments="state.environments"
:can-create-deployment="canCreateDeploymentParsed"
:can-read-environment="canReadEnvironmentParsed"
:play-icon-svg="playIconSvg"
:terminal-icon-svg="terminalIconSvg"
:commit-icon-svg="commitIconSvg">
</environment-table>
2017-02-09 07:18:47 -05:00
<table-pagination v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
2017-02-09 07:18:47 -05:00
:change="changePage"
:pageInfo="state.paginationInformation">
2017-02-09 07:18:47 -05:00
</table-pagination>
</div>
</div>
2017-02-09 06:52:22 -05:00
</div>
`,
});