blob: ff967a2a93b91ba4da508d236548e7bff2fd1587 [file] [log] [blame]
<template>
<header class="rk-header">
<div class="rk-header-start">
<img class="mr10" :src="require('@/assets/img/logo.svg')"/>
<span class="logo">Rocketbot</span>
</div>
<nav class="rk-nav">
<router-link class="rk-nav-link" to="/" exact>Dashboard</router-link>
<router-link class="rk-nav-link" to="/topo">Topology</router-link>
<router-link class="rk-nav-link" to="/trace">Trace</router-link>
<router-link class="rk-nav-link" to="/alarm">Alarm</router-link>
</nav>
<div class="rk-header-end">
<div v-clickout="() => this.show = false">
<div class="flex-c cp" @click="show = !show;">
<span class="mr5 sm">{{time.start | dateformat}} ~ {{time.end | dateformat}}</span>
<Icon :type="show?'md-arrow-dropup':'md-arrow-dropdown'" class="mr10"/>
</div>
<RkToolTime ref="rktooltime" :show.sync="show" :propsTime="time"/>
</div>
<div class="rk-nav-auto cp flex-c mr10" @click="reload"><Icon type="md-refresh" class="mr5"/>reload</div>
<Dropdown trigger="click" placement="bottom-end">
<div class="rk-nav-logout cp"><Icon type="md-power" /></div>
<DropdownMenu slot="list">
<li class="ivu-dropdown-item" @click="logout">Logout</li>
</DropdownMenu>
</Dropdown>
</div>
</header>
</template>
<script lang="ts">
import Vue from 'vue';
import { Component, Prop } from 'vue-property-decorator';
import RkToolTime from '@/components/rk-tool-time.vue';
import getLocalTime from '@/utils/localtime';
@Component({
components: { RkToolTime },
})
export default class Header extends Vue {
show = false;
load = true;
@Prop() time: any;
logout() {
window.localStorage.setItem('skywalking-authority', 'guest');
this.$router.push('/login');
}
reload() {
const gap = this.time.end.getTime() - this.time.start.getTime();
const newEnd = getLocalTime(parseInt(window.localStorage.getItem('utc'), 10), new Date());
const newStart = getLocalTime(parseInt(window.localStorage.getItem('utc'), 10), new Date(new Date().getTime() - gap));
this.$store.dispatch('SET_DURATION', {
end: newEnd,
start: newStart,
step: this.time.step,
}).then(() => {
const el:any = this.$refs.rktooltime;
el.load = false;
this.$nextTick(() => { el.load = true; });
});
}
}
</script>
<style lang="scss" scoped>
.rk-header {
flex-shrink: 0;
z-index: 10;
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 30px;
background-color: #252a2f;
color: #e8e8e8;
width: 100%;
box-shadow: 0 1px 2px 0 rgba(0,0,0,.06);
.logo{
font-family: 'Avenir', Helvetica, Arial, sans-serif;
font-size: 18px;
padding-top: 2px;
}
}
.rk-header-start,.rk-header-end{
display: flex;
align-items: center;
}
.rk-nav-link{
margin-right: 20px;
padding: 5px 10px;
border-radius: 6px;
color: #e8e8e8;
opacity: .8;
will-change: opacity, background-color;
transition: opacity .3s, background-color .3s;
&:hover,&.active{
opacity: 1;
background-color: rgba(255,255,255,.07);
box-shadow: 0 3px 6px 0 rgba(0,0,0,.1), 0 1px 3px 0 rgba(0,0,0,.08);
}
}
.rk-nav-auto{
border-radius: 4px;
padding: 1px 6px;
background-color: rgba(255,255,255,.07);
box-shadow: 0 3px 6px 0 rgba(0,0,0,.1), 0 1px 3px 0 rgba(0,0,0,.08);
}
.rk-nav-logout{
border-radius: 50%;
padding:2px 5px;
background-color: rgba(255,255,255,.07);
box-shadow: 0 3px 6px 0 rgba(0,0,0,.1), 0 1px 3px 0 rgba(0,0,0,.08);
transition: color .3s;
&:hover{
color:rgb(226, 64, 36);
}
}
</style>