debian-mirror-gitlab/app/assets/javascripts/clusters/components/application_row.vue

373 lines
11 KiB
Vue
Raw Normal View History

2018-03-17 18:26:18 +05:30
<script>
2018-12-13 13:39:08 +05:30
/* eslint-disable vue/require-default-prop */
2019-03-02 22:35:43 +05:30
import { GlLink } from '@gitlab/ui';
import TimeagoTooltip from '../../vue_shared/components/time_ago_tooltip.vue';
2018-12-13 13:39:08 +05:30
import { s__, sprintf } from '../../locale';
import eventHub from '../event_hub';
import identicon from '../../vue_shared/components/identicon.vue';
import loadingButton from '../../vue_shared/components/loading_button.vue';
import {
APPLICATION_STATUS,
2019-03-02 22:35:43 +05:30
REQUEST_SUBMITTED,
2018-12-13 13:39:08 +05:30
REQUEST_FAILURE,
2019-03-02 22:35:43 +05:30
UPGRADE_REQUESTED,
2018-12-13 13:39:08 +05:30
} from '../constants';
2018-03-17 18:26:18 +05:30
2018-12-13 13:39:08 +05:30
export default {
components: {
loadingButton,
identicon,
2019-03-02 22:35:43 +05:30
TimeagoTooltip,
GlLink,
2018-12-13 13:39:08 +05:30
},
props: {
id: {
type: String,
required: true,
},
title: {
type: String,
required: true,
},
titleLink: {
type: String,
required: false,
},
manageLink: {
type: String,
required: false,
},
logoUrl: {
type: String,
required: false,
default: null,
},
disabled: {
type: Boolean,
required: false,
default: false,
},
status: {
type: String,
required: false,
},
statusReason: {
type: String,
required: false,
},
requestStatus: {
type: String,
required: false,
},
requestReason: {
type: String,
required: false,
},
2019-03-02 22:35:43 +05:30
version: {
type: String,
required: false,
},
chartRepo: {
type: String,
required: false,
},
upgradeAvailable: {
type: Boolean,
required: false,
},
2018-12-13 13:39:08 +05:30
installApplicationRequestParams: {
type: Object,
required: false,
default: () => ({}),
},
},
computed: {
isUnknownStatus() {
return !this.isKnownStatus && this.status !== null;
},
isKnownStatus() {
return Object.values(APPLICATION_STATUS).includes(this.status);
},
2019-03-02 22:35:43 +05:30
isInstalling() {
return (
this.status === APPLICATION_STATUS.SCHEDULED ||
this.status === APPLICATION_STATUS.INSTALLING ||
(this.requestStatus === REQUEST_SUBMITTED && !this.statusReason && !this.isInstalled)
);
},
2018-12-13 13:39:08 +05:30
isInstalled() {
return (
this.status === APPLICATION_STATUS.INSTALLED ||
this.status === APPLICATION_STATUS.UPDATED ||
2019-03-02 22:35:43 +05:30
this.status === APPLICATION_STATUS.UPDATING ||
this.status === APPLICATION_STATUS.UPDATE_ERRORED
);
},
canInstall() {
if (this.isInstalling) {
return false;
}
return (
this.status === APPLICATION_STATUS.NOT_INSTALLABLE ||
this.status === APPLICATION_STATUS.INSTALLABLE ||
this.status === APPLICATION_STATUS.ERROR ||
this.isUnknownStatus
2018-12-13 13:39:08 +05:30
);
},
hasLogo() {
return !!this.logoUrl;
},
identiconId() {
// generate a deterministic integer id for the identicon background
return this.id.charCodeAt(0);
},
rowJsClass() {
return `js-cluster-application-row-${this.id}`;
},
installButtonLoading() {
2019-03-02 22:35:43 +05:30
return !this.status || this.status === APPLICATION_STATUS.SCHEDULED || this.isInstalling;
2018-12-13 13:39:08 +05:30
},
installButtonDisabled() {
// Avoid the potential for the real-time data to say APPLICATION_STATUS.INSTALLABLE but
// we already made a request to install and are just waiting for the real-time
// to sync up.
return (
((this.status !== APPLICATION_STATUS.INSTALLABLE &&
this.status !== APPLICATION_STATUS.ERROR) ||
2019-03-02 22:35:43 +05:30
this.isInstalling) &&
2018-12-13 13:39:08 +05:30
this.isKnownStatus
);
},
installButtonLabel() {
let label;
2019-03-02 22:35:43 +05:30
if (this.canInstall) {
2018-12-13 13:39:08 +05:30
label = s__('ClusterIntegration|Install');
2019-03-02 22:35:43 +05:30
} else if (this.isInstalling) {
2018-12-13 13:39:08 +05:30
label = s__('ClusterIntegration|Installing');
2019-03-02 22:35:43 +05:30
} else if (this.isInstalled) {
2018-12-13 13:39:08 +05:30
label = s__('ClusterIntegration|Installed');
}
2018-03-17 18:26:18 +05:30
2018-12-13 13:39:08 +05:30
return label;
},
showManageButton() {
return this.manageLink && this.status === APPLICATION_STATUS.INSTALLED;
},
manageButtonLabel() {
return s__('ClusterIntegration|Manage');
},
hasError() {
2019-03-02 22:35:43 +05:30
return (
!this.isInstalling &&
(this.status === APPLICATION_STATUS.ERROR || this.requestStatus === REQUEST_FAILURE)
);
2018-12-13 13:39:08 +05:30
},
generalErrorDescription() {
return sprintf(s__('ClusterIntegration|Something went wrong while installing %{title}'), {
title: this.title,
});
},
2019-03-02 22:35:43 +05:30
versionLabel() {
if (this.upgradeFailed) {
return s__('ClusterIntegration|Upgrade failed');
} else if (this.isUpgrading) {
return s__('ClusterIntegration|Upgrading');
}
return s__('ClusterIntegration|Upgraded');
},
upgradeRequested() {
return this.requestStatus === UPGRADE_REQUESTED;
},
upgradeSuccessful() {
return this.status === APPLICATION_STATUS.UPDATED;
},
upgradeFailed() {
if (this.isUpgrading) {
return false;
}
return this.status === APPLICATION_STATUS.UPDATE_ERRORED;
},
upgradeFailureDescription() {
2019-05-30 16:15:17 +05:30
return sprintf(
s__(
'ClusterIntegration|Something went wrong when upgrading %{title}. Please check the logs and try again.',
),
{
title: this.title,
},
);
2019-03-02 22:35:43 +05:30
},
upgradeSuccessDescription() {
return sprintf(s__('ClusterIntegration|%{title} upgraded successfully.'), {
title: this.title,
});
},
upgradeButtonLabel() {
let label;
if (this.upgradeAvailable && !this.upgradeFailed && !this.isUpgrading) {
label = s__('ClusterIntegration|Upgrade');
} else if (this.isUpgrading) {
2019-05-30 16:15:17 +05:30
label = s__('ClusterIntegration|Upgrading');
2019-03-02 22:35:43 +05:30
} else if (this.upgradeFailed) {
2019-05-30 16:15:17 +05:30
label = s__('ClusterIntegration|Retry upgrade');
2019-03-02 22:35:43 +05:30
}
return label;
},
isUpgrading() {
// Since upgrading is handled asynchronously on the backend we need this check to prevent any delay on the frontend
return (
this.status === APPLICATION_STATUS.UPDATING ||
(this.upgradeRequested && !this.upgradeSuccessful)
);
},
},
watch: {
status() {
if (this.status === APPLICATION_STATUS.UPDATE_ERRORED) {
eventHub.$emit('upgradeFailed', this.id);
}
},
2018-12-13 13:39:08 +05:30
},
methods: {
installClicked() {
eventHub.$emit('installApplication', {
id: this.id,
params: this.installApplicationRequestParams,
});
},
2019-03-02 22:35:43 +05:30
upgradeClicked() {
eventHub.$emit('upgradeApplication', {
id: this.id,
params: this.installApplicationRequestParams,
});
},
dismissUpgradeSuccess() {
eventHub.$emit('dismissUpgradeSuccess', this.id);
},
2018-12-13 13:39:08 +05:30
},
};
2018-03-17 18:26:18 +05:30
</script>
<template>
<div
2018-12-05 23:21:45 +05:30
:class="[
rowJsClass,
isInstalled && 'cluster-application-installed',
2019-02-15 15:39:39 +05:30
disabled && 'cluster-application-disabled',
2018-12-05 23:21:45 +05:30
]"
class="cluster-application-row gl-responsive-table-row gl-responsive-table-row-col-span"
2018-03-17 18:26:18 +05:30
>
2019-02-15 15:39:39 +05:30
<div class="gl-responsive-table-row-layout" role="row">
<div class="table-section append-right-8 section-align-top" role="gridcell">
2018-12-05 23:21:45 +05:30
<img
v-if="hasLogo"
:src="logoUrl"
:alt="`${title} logo`"
class="cluster-application-logo avatar s40"
/>
2019-02-15 15:39:39 +05:30
<identicon v-else :entity-id="identiconId" :entity-name="title" size-class="s40" />
2018-12-05 23:21:45 +05:30
</div>
2019-02-15 15:39:39 +05:30
<div class="table-section cluster-application-description section-wrap" role="gridcell">
2018-12-05 23:21:45 +05:30
<strong>
<a
v-if="titleLink"
:href="titleLink"
target="blank"
rel="noopener noreferrer"
class="js-cluster-application-title"
>
{{ title }}
</a>
2019-02-15 15:39:39 +05:30
<span v-else class="js-cluster-application-title"> {{ title }} </span>
2018-12-05 23:21:45 +05:30
</strong>
2018-03-27 19:54:05 +05:30
<slot name="description"></slot>
2018-12-05 23:21:45 +05:30
<div
v-if="hasError || isUnknownStatus"
class="cluster-application-error text-danger prepend-top-10"
>
<p class="js-cluster-application-general-error-message append-bottom-0">
{{ generalErrorDescription }}
</p>
<ul v-if="statusReason || requestReason">
2019-02-15 15:39:39 +05:30
<li v-if="statusReason" class="js-cluster-application-status-error-message">
2018-12-05 23:21:45 +05:30
{{ statusReason }}
</li>
2019-02-15 15:39:39 +05:30
<li v-if="requestReason" class="js-cluster-application-request-error-message">
2018-12-05 23:21:45 +05:30
{{ requestReason }}
</li>
</ul>
</div>
2019-03-02 22:35:43 +05:30
<div
2019-05-30 16:15:17 +05:30
v-if="(upgradeSuccessful || upgradeFailed) && !upgradeAvailable"
2019-03-02 22:35:43 +05:30
class="form-text text-muted label p-0 js-cluster-application-upgrade-details"
>
{{ versionLabel }}
<span v-if="upgradeSuccessful"> to</span>
<gl-link
v-if="upgradeSuccessful"
:href="chartRepo"
target="_blank"
class="js-cluster-application-upgrade-version"
>
chart v{{ version }}
</gl-link>
</div>
<div
v-if="upgradeFailed && !isUpgrading"
class="bs-callout bs-callout-danger cluster-application-banner mt-2 mb-0 js-cluster-application-upgrade-failure-message"
>
{{ upgradeFailureDescription }}
</div>
<div
v-if="upgradeRequested && upgradeSuccessful"
class="bs-callout bs-callout-success cluster-application-banner mt-2 mb-0 p-0 pl-3"
>
{{ upgradeSuccessDescription }}
<button class="close cluster-application-banner-close" @click="dismissUpgradeSuccess">
&times;
</button>
</div>
<loading-button
v-if="upgradeAvailable || upgradeFailed || isUpgrading"
class="btn btn-primary js-cluster-application-upgrade-button mt-2"
:loading="isUpgrading"
:disabled="isUpgrading"
:label="upgradeButtonLabel"
@click="upgradeClicked"
/>
2018-03-17 18:26:18 +05:30
</div>
<div
2018-12-05 23:21:45 +05:30
:class="{ 'section-25': showManageButton, 'section-15': !showManageButton }"
2018-11-08 19:23:39 +05:30
class="table-section table-button-footer section-align-top"
2018-03-17 18:26:18 +05:30
role="gridcell"
>
2019-02-15 15:39:39 +05:30
<div v-if="showManageButton" class="btn-group table-action-buttons">
<a :href="manageLink" :class="{ disabled: disabled }" class="btn">
2018-03-17 18:26:18 +05:30
{{ manageButtonLabel }}
</a>
</div>
<div class="btn-group table-action-buttons">
<loading-button
:loading="installButtonLoading"
2018-12-05 23:21:45 +05:30
:disabled="disabled || installButtonDisabled"
2018-03-17 18:26:18 +05:30
:label="installButtonLabel"
2018-11-08 19:23:39 +05:30
class="js-cluster-application-install-button"
2018-03-17 18:26:18 +05:30
@click="installClicked"
/>
</div>
</div>
</div>
</div>
</template>