211 lines
8.0 KiB
Vue
211 lines
8.0 KiB
Vue
<template>
|
|
<div class="about content-wrapper">
|
|
<div class="container">
|
|
<div class="at-container">
|
|
<div class="at-container__inner">
|
|
<div class="row">
|
|
<div class="col-8 col-offset-8 about__alert-wrapper">
|
|
<at-alert
|
|
v-if="updateVersionMsg"
|
|
:message="updateVersionMsg"
|
|
class="about__alert"
|
|
type="success"
|
|
/>
|
|
|
|
<at-alert
|
|
v-if="knownVulnerableMsg"
|
|
:message="knownVulnerableMsg"
|
|
class="about__alert"
|
|
type="error"
|
|
/>
|
|
|
|
<at-alert v-if="infoMsg" :message="infoMsg" class="about__alert" type="info" />
|
|
</div>
|
|
<!-- /.col-8 -->
|
|
</div>
|
|
<!-- /.row -->
|
|
|
|
<div class="about__logo" />
|
|
|
|
<h2>Cattr</h2>
|
|
<p class="about__version">
|
|
<skeleton :loading="isLoading" width="80px">{{ appData.version || 'Undefined' }}</skeleton>
|
|
</p>
|
|
<p>
|
|
Instance ID:
|
|
<strong>
|
|
<skeleton :loading="isLoading" width="200px"
|
|
>{{ appData.instance_id || 'Undefined' }}
|
|
</skeleton>
|
|
</strong>
|
|
</p>
|
|
<at-tabs>
|
|
<at-tab-pane :label="$t('about.module_versions')" name="about_versions">
|
|
<p v-if="modulesData.length" class="about__table">
|
|
<at-table :columns="modulesColumns" :data="modulesData" />
|
|
</p>
|
|
<p v-else v-t="'about.no_modules'" />
|
|
</at-tab-pane>
|
|
<at-tab-pane
|
|
v-if="isAdmin"
|
|
:label="$t('about.module_storage')"
|
|
class="storage"
|
|
name="about_storage"
|
|
>
|
|
<StorageManagementTab />
|
|
</at-tab-pane>
|
|
</at-tabs>
|
|
<div><a class="about__link" href="https://cattr.app">cattr.app</a></div>
|
|
<div><a class="about__link" href="https://github.com/orgs/cattr-app/discussions">community</a></div>
|
|
</div>
|
|
<!-- /.at-container__inner -->
|
|
</div>
|
|
<!-- /.at-container -->
|
|
</div>
|
|
<!-- /.container -->
|
|
</div>
|
|
<!-- /.content-wrapper -->
|
|
</template>
|
|
|
|
<script>
|
|
import AboutService from '@/services/resource/about.service';
|
|
import { hasRole } from '@/utils/user';
|
|
import semverGt from 'semver/functions/gt';
|
|
import { Skeleton } from 'vue-loading-skeleton';
|
|
|
|
const aboutService = new AboutService();
|
|
|
|
export default {
|
|
name: 'About',
|
|
components: {
|
|
StorageManagementTab: () =>
|
|
import(/* webpackChunkName: "StorageManagementTab" */ '@/components/StorageManagementTab'),
|
|
Skeleton,
|
|
},
|
|
computed: {
|
|
isAdmin() {
|
|
return hasRole(this.$store.getters['user/user'], 'admin');
|
|
},
|
|
},
|
|
async mounted() {
|
|
this.isLoading = true;
|
|
try {
|
|
const { data } = await aboutService.getGeneralInfo();
|
|
this.appData = data.app;
|
|
this.modulesData = data.modules;
|
|
|
|
if (this.appData.vulnerable) {
|
|
this.knownVulnerableMsg = `${this.$i18n.t('message.vulnerable_version')} ${
|
|
this.appData.last_version
|
|
}`;
|
|
} else if (this.appData.last_version && this.appData.last_version !== this.appData.version) {
|
|
if (semverGt(this.appData.last_version, data.app.version)) {
|
|
this.updateVersionMsg = `${this.$i18n.t('message.update_version')} ${
|
|
this.appData.last_version
|
|
}`;
|
|
} else {
|
|
this.infoMsg = this.appData.message;
|
|
}
|
|
}
|
|
} catch ({ response }) {
|
|
if (process.env.NODE_ENV === 'development') {
|
|
console.warn(response ? response : 'request to about is canceled');
|
|
}
|
|
}
|
|
|
|
this.isLoading = false;
|
|
},
|
|
data() {
|
|
return {
|
|
appData: {},
|
|
modulesData: [],
|
|
knownVulnerableMsg: null,
|
|
updateVersionMsg: null,
|
|
isLoading: false,
|
|
infoMsg: null,
|
|
modulesColumns: [
|
|
{ title: this.$i18n.t('about.modules.name'), key: 'name' },
|
|
{ title: this.$i18n.t('about.modules.version'), key: 'version' },
|
|
{
|
|
title: this.$i18n.t('about.modules.status'),
|
|
render: (h, params) =>
|
|
h('AtAlert', {
|
|
props: {
|
|
message: Object.prototype.hasOwnProperty.call(params.item, 'lastVersion')
|
|
? semverGt(params.item.version, params.item.lastVersion)
|
|
? params.item.flashMessage
|
|
: params.item.version === params.item.lastVersion
|
|
? this.$i18n.t('about.modules.ok')
|
|
: params.item.vulnerable
|
|
? this.$i18n.t('about.modules.vulnerable')
|
|
: this.$i18n.t('about.modules.outdated')
|
|
: this.$i18n.t('about.modules.ok'),
|
|
type: Object.prototype.hasOwnProperty.call(params.item, 'lastVersion')
|
|
? semverGt(params.item.version, params.item.lastVersion)
|
|
? 'info'
|
|
: params.item.version === params.item.lastVersion
|
|
? 'success'
|
|
: params.item.vulnerable
|
|
? 'error'
|
|
: 'warning'
|
|
: 'info',
|
|
},
|
|
style: {
|
|
'text-align': 'center',
|
|
padding: '4px 8px 4px 16px',
|
|
},
|
|
}),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.about {
|
|
text-align: center;
|
|
|
|
p {
|
|
margin-bottom: $layout-01;
|
|
}
|
|
|
|
&__alert-wrapper {
|
|
margin-bottom: $layout-01;
|
|
}
|
|
|
|
&__alert {
|
|
margin-bottom: $layout-01;
|
|
}
|
|
|
|
&__logo {
|
|
background-image: url('../assets/logo.svg');
|
|
background-size: cover;
|
|
display: block;
|
|
height: 120px;
|
|
margin-bottom: $layout-01;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
width: 120px;
|
|
}
|
|
|
|
&__version {
|
|
color: $gray-3;
|
|
font-weight: bold;
|
|
}
|
|
|
|
&__link {
|
|
color: $gray-3;
|
|
}
|
|
|
|
&__table {
|
|
display: flex;
|
|
justify-content: center;
|
|
|
|
& > .at-table {
|
|
width: 50%;
|
|
}
|
|
}
|
|
}
|
|
</style>
|