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

490 lines
14 KiB
JavaScript
Raw Normal View History

/* global Vue */
/* global timeago */
window.Vue = require('vue');
window.timeago = require('vendor/timeago');
require('../../lib/utils/text_utility');
require('../../vue_shared/components/commit');
require('./environment_actions');
require('./environment_external_url');
require('./environment_stop');
require('./environment_rollback');
require('./environment_terminal_button');
2016-11-09 13:52:26 -05:00
2016-10-14 13:38:13 -04:00
(() => {
/**
* Envrionment Item Component
2016-10-26 11:00:16 -04:00
*
2017-02-03 14:47:56 -05:00
* Renders a table row for each environment.
*/
2016-10-26 11:00:16 -04:00
2016-10-14 13:38:13 -04:00
window.gl = window.gl || {};
2017-01-05 05:10:22 -05:00
window.gl.environmentsList = window.gl.environmentsList || {};
window.gl.environmentsList.timeagoInstance = new timeago(); // eslint-disable-line
2016-10-26 11:00:16 -04:00
gl.environmentsList.EnvironmentItem = Vue.component('environment-item', {
2016-10-26 11:00:16 -04:00
components: {
2017-01-05 05:07:34 -05:00
'commit-component': gl.CommitComponent,
'actions-component': gl.environmentsList.ActionsComponent,
'external-url-component': gl.environmentsList.ExternalUrlComponent,
'stop-component': gl.environmentsList.StopComponent,
'rollback-component': gl.environmentsList.RollbackComponent,
'terminal-button-component': gl.environmentsList.TerminalButtonComponent,
},
2016-10-14 13:38:13 -04:00
props: {
model: {
type: Object,
required: true,
default: () => ({}),
},
canCreateDeployment: {
type: Boolean,
required: false,
default: false,
},
canReadEnvironment: {
type: Boolean,
required: false,
default: false,
},
2016-12-08 06:42:56 -05:00
commitIconSvg: {
type: String,
required: false,
},
playIconSvg: {
type: String,
required: false,
},
2016-12-14 19:59:04 -05:00
terminalIconSvg: {
type: String,
required: false,
},
2016-10-14 13:38:13 -04:00
},
2016-10-24 07:42:01 -04:00
2016-10-14 13:38:13 -04:00
computed: {
/**
* Verifies if `last_deployment` key exists in the current Envrionment.
* This key is required to render most of the html - this method works has
* an helper.
*
* @returns {Boolean}
*/
hasLastDeploymentKey() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment)) {
return true;
}
return false;
},
/**
* Verifies is the given environment has manual actions.
* Used to verify if we should render them or nor.
*
* @returns {Boolean|Undefined}
*/
hasManualActions() {
2017-02-03 14:47:56 -05:00
return this.model.latest.last_deployment &&
this.model.latest.last_deployment.manual_actions &&
this.model.latest.last_deployment.manual_actions.length > 0;
},
/**
2017-02-07 07:30:33 -05:00
* Returns the value of the `stop_action?` key provided in the response.
*
* @returns {Boolean}
*/
2017-02-07 07:30:33 -05:00
hasStopAction() {
return this.model['stop_action?'];
},
/**
* Verifies if the `deployable` key is present in `last_deployment` key.
* Used to verify whether we should or not render the rollback partial.
*
* @returns {Boolean|Undefined}
*/
canRetry() {
return this.hasLastDeploymentKey &&
2017-02-03 14:47:56 -05:00
this.model.latest.last_deployment &&
this.model.latest.last_deployment.deployable;
},
2016-11-29 13:54:34 -05:00
/**
* Verifies if the date to be shown is present.
*
* @returns {Boolean|Undefined}
*/
canShowDate() {
2017-02-03 14:47:56 -05:00
return this.model.latest.last_deployment &&
this.model.latest.last_deployment.deployable &&
this.model.latest.last_deployment.deployable !== undefined;
},
2016-11-07 15:52:04 -05:00
/**
* Human readable date.
*
* @returns {String}
*/
createdDate() {
2017-01-05 05:07:34 -05:00
return gl.environmentsList.timeagoInstance.format(
2017-02-03 14:47:56 -05:00
this.model.latest.last_deployment.deployable.created_at,
2016-11-29 13:54:34 -05:00
);
},
2016-11-07 15:52:04 -05:00
/**
* Returns the manual actions with the name parsed.
*
* @returns {Array.<Object>|Undefined}
2016-11-07 15:52:04 -05:00
*/
manualActions() {
if (this.hasManualActions) {
2017-02-03 14:47:56 -05:00
return this.model.latest.last_deployment.manual_actions.map((action) => {
const parsedAction = {
name: gl.text.humanize(action.name),
2016-11-17 11:17:22 -05:00
play_path: action.play_path,
};
return parsedAction;
});
}
return [];
},
/**
* Builds the string used in the user image alt attribute.
*
* @returns {String}
*/
userImageAltDescription() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.user &&
this.model.latest.last_deployment.user.username) {
return `${this.model.latest.last_deployment.user.username}'s avatar'`;
}
return '';
},
2016-11-09 06:26:27 -05:00
/**
* If provided, returns the commit tag.
*
* @returns {String|Undefined}
*/
commitTag() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.tag) {
return this.model.latest.last_deployment.tag;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
/**
* If provided, returns the commit ref.
*
* @returns {Object|Undefined}
*/
commitRef() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.ref) {
return this.model.latest.last_deployment.ref;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
2016-11-09 06:26:27 -05:00
/**
* If provided, returns the commit url.
*
* @returns {String|Undefined}
*/
commitUrl() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.commit &&
this.model.latest.last_deployment.commit.commit_path) {
return this.model.latest.last_deployment.commit.commit_path;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
/**
* If provided, returns the commit short sha.
*
* @returns {String|Undefined}
*/
commitShortSha() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.commit &&
this.model.latest.last_deployment.commit.short_id) {
return this.model.latest.last_deployment.commit.short_id;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
/**
* If provided, returns the commit title.
*
* @returns {String|Undefined}
*/
2016-11-09 06:26:27 -05:00
commitTitle() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.commit &&
this.model.latest.last_deployment.commit.title) {
return this.model.latest.last_deployment.commit.title;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
/**
* If provided, returns the commit tag.
*
* @returns {Object|Undefined}
*/
2016-11-09 06:26:27 -05:00
commitAuthor() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.commit &&
this.model.latest.last_deployment.commit.author) {
return this.model.latest.last_deployment.commit.author;
}
2016-11-09 06:26:27 -05:00
return undefined;
},
2016-11-09 12:53:06 -05:00
/**
2016-11-17 11:17:22 -05:00
* Verifies if the `retry_path` key is present and returns its value.
*
* @returns {String|Undefined}
*/
2016-11-09 13:52:26 -05:00
retryUrl() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.deployable &&
this.model.latest.last_deployment.deployable.retry_path) {
return this.model.latest.last_deployment.deployable.retry_path;
2016-11-09 13:52:26 -05:00
}
return undefined;
},
/**
* Verifies if the `last?` key is present and returns its value.
*
* @returns {Boolean|Undefined}
*/
2016-11-09 13:52:26 -05:00
isLastDeployment() {
2017-02-03 14:47:56 -05:00
return this.model.latest.last_deployment &&
this.model.latest.last_deployment['last?'];
2016-11-09 13:52:26 -05:00
},
2016-11-14 06:17:02 -05:00
/**
* Builds the name of the builds needed to display both the name and the id.
*
* @returns {String}
*/
2016-11-14 06:17:02 -05:00
buildName() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.deployable) {
return `${this.model.latest.last_deployment.deployable.name} #${this.model.latest.last_deployment.deployable.id}`;
2016-11-14 06:17:02 -05:00
}
return '';
2016-11-14 06:17:02 -05:00
},
/**
* Builds the needed string to show the internal id.
*
* @returns {String}
*/
2016-11-14 06:17:02 -05:00
deploymentInternalId() {
2017-02-03 14:47:56 -05:00
if (this.model.latest.last_deployment &&
this.model.latest.last_deployment.iid) {
return `#${this.model.latest.last_deployment.iid}`;
2016-11-14 06:17:02 -05:00
}
return '';
},
/**
* Verifies if the user object is present under last_deployment object.
*
* @returns {Boolean}
*/
deploymentHasUser() {
2017-02-03 14:47:56 -05:00
return !this.$options.isObjectEmpty(this.model.latest.last_deployment) &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment.user);
},
/**
* Returns the user object nested with the last_deployment object.
* Used to render the template.
*
* @returns {Object}
*/
deploymentUser() {
2017-02-03 14:47:56 -05:00
if (!this.$options.isObjectEmpty(this.model.latest.last_deployment) &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment.user)) {
return this.model.latest.last_deployment.user;
}
return {};
},
2016-11-17 16:46:41 -05:00
/**
* Verifies if the build name column should be rendered by verifing
* if all the information needed is present
* and if the environment is not a folder.
*
* @returns {Boolean}
*/
shouldRenderBuildName() {
2017-02-03 14:47:56 -05:00
return !this.model.isFolder &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment) &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable);
2016-11-17 16:46:41 -05:00
},
/**
* Verifies if deplyment internal ID should be rendered by verifing
* if all the information needed is present
* and if the environment is not a folder.
*
* @returns {Boolean}
*/
shouldRenderDeploymentID() {
2017-02-03 14:47:56 -05:00
return !this.model.isFolder &&
!this.$options.isObjectEmpty(this.model.latest.last_deployment) &&
this.model.latest.last_deployment.iid !== undefined;
2016-11-17 16:46:41 -05:00
},
2016-10-14 13:38:13 -04:00
},
2016-11-17 16:32:43 -05:00
/**
* Helper to verify if certain given object are empty.
* Should be replaced by lodash _.isEmpty - https://lodash.com/docs/4.17.2#isEmpty
* @param {Object} object
* @returns {Bollean}
*/
isObjectEmpty(object) {
for (const key in object) { // eslint-disable-line
if (hasOwnProperty.call(object, key)) {
return false;
}
}
return true;
},
template: `
<tr>
2017-02-03 14:47:56 -05:00
<td>
<a v-if="!model.isFolder"
2016-11-14 06:17:02 -05:00
class="environment-name"
2017-02-03 14:47:56 -05:00
:href="model.latest.environment_path">
2016-11-21 06:45:22 -05:00
{{model.name}}
</a>
2017-02-03 14:47:56 -05:00
<a v-else class="folder-name">
<span class="folder-icon">
2017-02-03 14:47:56 -05:00
<i class="fa fa-caret-right" aria-hidden="true"></i>
<i class="fa fa-folder" aria-hidden="true"></i>
</span>
2016-11-21 06:45:22 -05:00
<span>
{{model.name}}
</span>
2016-11-21 06:45:22 -05:00
<span class="badge">
2017-02-03 14:47:56 -05:00
{{model.size}}
2016-11-21 06:45:22 -05:00
</span>
2017-02-03 14:47:56 -05:00
</a>
</td>
<td class="deployment-column">
2016-11-21 08:57:27 -05:00
<span v-if="shouldRenderDeploymentID">
2016-11-21 06:45:22 -05:00
{{deploymentInternalId}}
</span>
2017-02-03 14:47:56 -05:00
<span v-if="!model.isFolder && deploymentHasUser">
by
<a :href="deploymentUser.web_url" class="js-deploy-user-container">
<img class="avatar has-tooltip s20"
:src="deploymentUser.avatar_url"
:alt="userImageAltDescription"
:title="deploymentUser.username" />
</a>
</span>
</td>
<td class="environments-build-cell">
2016-11-17 16:46:41 -05:00
<a v-if="shouldRenderBuildName"
class="build-link"
2017-02-03 14:47:56 -05:00
:href="model.latest.last_deployment.deployable.build_path">
2016-11-21 06:45:22 -05:00
{{buildName}}
</a>
</td>
<td>
2017-02-03 14:47:56 -05:00
<div v-if="!model.isFolder && hasLastDeploymentKey" class="js-commit-component">
<commit-component
:tag="commitTag"
2016-12-08 06:54:08 -05:00
:commit-ref="commitRef"
:commit-url="commitUrl"
:short-sha="commitShortSha"
:title="commitTitle"
2016-12-08 06:48:19 -05:00
:author="commitAuthor"
:commit-icon-svg="commitIconSvg">
</commit-component>
</div>
2017-02-03 14:47:56 -05:00
<p v-if="!model.isFolder && !hasLastDeploymentKey" class="commit-title">
No deployments yet
</p>
</td>
<td>
2017-02-03 14:47:56 -05:00
<span v-if="!model.isFolder && canShowDate"
2016-11-21 06:45:22 -05:00
class="environment-created-date-timeago">
{{createdDate}}
</span>
</td>
<td class="hidden-xs">
2017-02-03 14:47:56 -05:00
<div v-if="!model.isFolder">
2016-11-17 16:46:41 -05:00
<div v-if="hasManualActions && canCreateDeployment"
class="inline js-manual-actions-container">
<actions-component
2016-12-08 06:42:56 -05:00
:play-icon-svg="playIconSvg"
2016-11-09 13:52:26 -05:00
:actions="manualActions">
</actions-component>
2016-11-09 12:36:42 -05:00
</div>
2016-11-09 13:52:26 -05:00
2017-02-03 14:47:56 -05:00
<div v-if="model.latest.external_url && canReadEnvironment"
2016-11-17 16:46:41 -05:00
class="inline js-external-url-container">
<external-url-component
2017-02-03 14:47:56 -05:00
:external-url="model.latest.external_url">
2016-12-08 06:54:08 -05:00
</external-url-component>
</div>
2016-11-09 13:52:26 -05:00
2017-02-07 07:30:33 -05:00
<div v-if="hasStopAction && canCreateDeployment"
2016-11-17 16:46:41 -05:00
class="inline js-stop-component-container">
<stop-component
2017-02-03 14:47:56 -05:00
:stop-url="model.latest.stop_path">
2016-11-09 13:52:26 -05:00
</stop-component>
</div>
2017-02-03 14:47:56 -05:00
<div v-if="model.latest.terminal_path"
2016-12-14 19:59:04 -05:00
class="inline js-terminal-button-container">
<terminal-button-component
:terminal-icon-svg="terminalIconSvg"
2017-02-03 14:47:56 -05:00
:terminal-path="model.latest.terminal_path">
2016-12-14 19:59:04 -05:00
</terminal-button-component>
</div>
2016-11-17 16:46:41 -05:00
<div v-if="canRetry && canCreateDeployment"
class="inline js-rollback-component-container">
<rollback-component
2016-12-08 06:54:08 -05:00
:is-last-deployment="isLastDeployment"
:retry-url="retryUrl">
2016-11-09 13:52:26 -05:00
</rollback-component>
</div>
</div>
</td>
</tr>
`,
});
2016-10-20 07:09:35 -04:00
})();