yunohost-admin/app/src/App.vue

168 lines
4.2 KiB
Vue
Raw Normal View History

2020-07-06 19:08:34 +02:00
<template>
2020-07-15 16:39:24 +02:00
<div id="app" class="container">
<header>
<b-navbar>
<b-navbar-brand to="/" exact exact-active-class="active">
<img alt="Yunohost logo" src="./assets/logo.png">
</b-navbar-brand>
<b-navbar-nav class="ml-auto">
<li class="nav-item">
<b-button href="/yunohost/sso"
variant="primary" size="sm" block
>
{{ $t('user_interface_link') }} <icon iname="user" />
</b-button>
</li>
<li class="nav-item" v-show="connected">
<b-button @click.prevent="logout" to="/logout"
variant="outline-dark" block size="sm"
>
{{ $t('logout') }} <icon iname="sign-out" />
</b-button>
</li>
</b-navbar-nav>
</b-navbar>
</header>
2020-07-07 18:56:12 +02:00
2020-07-27 11:19:32 +02:00
<breadcrumb v-if="$route.meta.breadcrumb" />
<main id="main">
2020-07-15 16:39:24 +02:00
<router-view v-if="isReady" />
</main>
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
<footer>
<nav>
<b-nav>
<b-nav-item href="https://yunohost.org/docs" target="_blank" link-classes="text-secondary">
<icon iname="book" /> Documentation
</b-nav-item>
<b-nav-item href="https://yunohost.org/help" target="_blank" link-classes="text-secondary">
<icon iname="life-ring" /> Need help?
</b-nav-item>
<b-nav-item href="https://donate.yunohost.org/" target="_blank" link-classes="text-secondary">
<icon iname="heart" /> Donate
</b-nav-item>
<i18n v-if="yunohost" path="footer_version" tag="b-nav-text"
2020-07-15 16:39:24 +02:00
id="yunohost-version" class="ml-auto"
>
<template v-slot:ynh>
<b-link href="https://yunohost.org">
YunoHost
</b-link>
</template>
<template v-slot:version>
{{ yunohost.version }}
2020-07-15 16:39:24 +02:00
</template>
<template v-slot:repo>
{{ yunohost.repo }}
2020-07-15 16:39:24 +02:00
</template>
</i18n>
</b-nav>
</nav>
</footer>
</div>
2020-07-06 19:08:34 +02:00
</template>
<script>
import { mapGetters } from 'vuex'
export default {
2020-07-15 16:39:24 +02:00
name: 'App',
data () {
2020-07-15 16:39:24 +02:00
return {
// isReady blocks the rendering of the rooter-view until we have a true info
// about the connected state of the user.
isReady: false
}
},
2020-07-15 16:39:24 +02:00
computed: {
...mapGetters(['connected', 'yunohost'])
2020-07-15 16:39:24 +02:00
},
2020-07-15 16:39:24 +02:00
methods: {
async logout () {
this.$store.dispatch('LOGOUT').then(() => {
this.$router.push({ name: 'login' })
})
2020-07-15 16:39:24 +02:00
}
},
// This hook is only triggered at page first load
2020-07-15 16:39:24 +02:00
async created () {
// From this hook the value of `connected` always come from the localStorage.
if (!this.connected) {
2020-07-15 16:39:24 +02:00
// user is not connected: allow the login view to be rendered.
this.isReady = true
return
}
// localStorage 'connected' value may be true, but session may have expired.
// Try to get the yunohost version.
this.$store.dispatch(
'GET_YUNOHOST_INFOS'
).catch(() => {
2020-07-15 16:39:24 +02:00
// Session expired, reset the 'connected' state and redirect with a query
// FIXME is there a case where the error may not be a 401 therefor requires
// better handling ?
this.$store.dispatch('RESET_CONNECTED')
this.$router.push({
name: 'login',
query: { redirect: this.$route.path !== '/login' ? this.$route.path : '/' }
})
}).finally(() => {
2020-07-15 16:39:24 +02:00
// in any case allow the router-view to be rendered
this.isReady = true
})
2020-07-15 16:39:24 +02:00
}
}
</script>
<style lang="scss">
@import '@/scss/main.scss';
2020-07-07 18:56:12 +02:00
#app > header {
2020-07-16 14:49:34 +02:00
border-bottom: $thin-border;
2020-07-15 16:39:24 +02:00
padding-top: 1rem;
margin-bottom: 1rem;
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
.navbar {
padding: 1rem 0;
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
img {
width: 70px;
}
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
.navbar-nav {
flex-direction: column;
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
li {
margin: .2rem 0;
}
icon {
margin-left: .5rem;
}
2020-07-07 18:56:12 +02:00
}
2020-07-15 16:39:24 +02:00
}
2020-07-07 18:56:12 +02:00
}
#app > footer {
2020-07-15 16:39:24 +02:00
padding: 1rem 0;
border-top: 1px solid #eee;
font-size: 0.875rem;
margin-top: 2rem;
2020-07-07 18:56:12 +02:00
2020-07-15 16:39:24 +02:00
.nav-item {
& + .nav-item a::before {
content: "•";
width: 1rem;
display: inline-block;
margin-left: -1.15rem;
}
&:first-child {
margin-left: -1rem;
2020-07-07 18:56:12 +02:00
}
2020-07-15 16:39:24 +02:00
}
2020-07-07 18:56:12 +02:00
}
</style>