debian-mirror-gitlab/app/assets/javascripts/environments/mixins/environments_mixin.js

185 lines
5 KiB
JavaScript
Raw Normal View History

2018-03-17 18:26:18 +05:30
/**
* Common code between environmets app and folder view
*/
import _ from 'underscore';
import Visibility from 'visibilityjs';
import Poll from '../../lib/utils/poll';
2018-12-13 13:39:08 +05:30
import { getParameterByName } from '../../lib/utils/common_utils';
2018-03-17 18:26:18 +05:30
import { s__ } from '../../locale';
import Flash from '../../flash';
import eventHub from '../event_hub';
import EnvironmentsStore from '../stores/environments_store';
import EnvironmentsService from '../services/environments_service';
import tablePagination from '../../vue_shared/components/table_pagination.vue';
import environmentTable from '../components/environments_table.vue';
import tabs from '../../vue_shared/components/navigation_tabs.vue';
import container from '../components/container.vue';
2017-09-10 17:25:29 +05:30
export default {
2018-03-17 18:26:18 +05:30
components: {
environmentTable,
container,
tabs,
tablePagination,
},
data() {
const store = new EnvironmentsStore();
return {
store,
state: store.state,
isLoading: false,
isMakingRequest: false,
scope: getParameterByName('scope') || 'available',
page: getParameterByName('page') || '1',
requestData: {},
2018-11-18 11:00:15 +05:30
environmentInStopModal: {},
2018-03-17 18:26:18 +05:30
};
},
2017-09-10 17:25:29 +05:30
methods: {
saveData(resp) {
2018-11-08 19:23:39 +05:30
this.isLoading = false;
if (_.isEqual(resp.config.params, this.requestData)) {
this.store.storeAvailableCount(resp.data.available_count);
this.store.storeStoppedCount(resp.data.stopped_count);
this.store.storeEnvironments(resp.data.environments);
this.store.setPagination(resp.headers);
}
2017-09-10 17:25:29 +05:30
},
2018-03-17 18:26:18 +05:30
/**
* Handles URL and query parameter changes.
* When the user uses the pagination or the tabs,
* - update URL
* - Make API request to the server with new parameters
* - Update the polling function
* - Update the internal state
*/
updateContent(parameters) {
this.updateInternalState(parameters);
// fetch new data
2018-12-13 13:39:08 +05:30
return this.service
.fetchEnvironments(this.requestData)
2018-03-17 18:26:18 +05:30
.then(response => this.successCallback(response))
.then(() => {
// restart polling
this.poll.restart({ data: this.requestData });
})
.catch(() => {
this.errorCallback();
// restart polling
this.poll.restart();
});
},
errorCallback() {
this.isLoading = false;
Flash(s__('Environments|An error occurred while fetching the environments.'));
},
2018-11-18 11:00:15 +05:30
postAction({ endpoint, errorMessage }) {
2018-03-17 18:26:18 +05:30
if (!this.isMakingRequest) {
this.isLoading = true;
2018-12-13 13:39:08 +05:30
this.service
.postAction(endpoint)
2018-03-17 18:26:18 +05:30
.then(() => this.fetchEnvironments())
.catch(() => {
this.isLoading = false;
2018-11-18 11:00:15 +05:30
Flash(errorMessage || s__('Environments|An error occurred while making the request.'));
2018-03-17 18:26:18 +05:30
});
}
},
fetchEnvironments() {
this.isLoading = true;
2018-12-13 13:39:08 +05:30
return this.service
.fetchEnvironments(this.requestData)
2018-03-17 18:26:18 +05:30
.then(this.successCallback)
.catch(this.errorCallback);
},
2018-11-18 11:00:15 +05:30
updateStopModal(environment) {
this.environmentInStopModal = environment;
},
stopEnvironment(environment) {
const endpoint = environment.stop_path;
2018-12-13 13:39:08 +05:30
const errorMessage = s__(
'Environments|An error occurred while stopping the environment, please try again',
);
2018-11-18 11:00:15 +05:30
this.postAction({ endpoint, errorMessage });
},
2018-03-17 18:26:18 +05:30
},
computed: {
tabs() {
return [
{
name: s__('Available'),
scope: 'available',
count: this.state.availableCounter,
isActive: this.scope === 'available',
},
{
name: s__('Stopped'),
scope: 'stopped',
count: this.state.stoppedCounter,
isActive: this.scope === 'stopped',
},
];
},
},
/**
* Fetches all the environments and stores them.
* Toggles loading property.
*/
created() {
this.service = new EnvironmentsService(this.endpoint);
this.requestData = { page: this.page, scope: this.scope };
this.poll = new Poll({
resource: this.service,
2018-11-08 19:23:39 +05:30
method: 'fetchEnvironments',
2018-03-17 18:26:18 +05:30
data: this.requestData,
successCallback: this.successCallback,
errorCallback: this.errorCallback,
2018-12-13 13:39:08 +05:30
notificationCallback: isMakingRequest => {
2018-03-17 18:26:18 +05:30
this.isMakingRequest = isMakingRequest;
},
});
if (!Visibility.hidden()) {
this.isLoading = true;
this.poll.makeRequest();
} else {
this.fetchEnvironments();
}
Visibility.change(() => {
if (!Visibility.hidden()) {
this.poll.restart();
} else {
this.poll.stop();
}
});
eventHub.$on('postAction', this.postAction);
2018-11-18 11:00:15 +05:30
eventHub.$on('requestStopEnvironment', this.updateStopModal);
eventHub.$on('stopEnvironment', this.stopEnvironment);
2018-03-17 18:26:18 +05:30
},
2018-11-18 11:00:15 +05:30
beforeDestroy() {
eventHub.$off('postAction', this.postAction);
eventHub.$off('requestStopEnvironment', this.updateStopModal);
eventHub.$off('stopEnvironment', this.stopEnvironment);
2017-09-10 17:25:29 +05:30
},
};