xref: /openbmc/webui-vue/src/components/AppHeader/AppHeader.vue (revision 408657262515e015a2964aafb8a1c76fb5259699)
1a2988f40SDerick Montague<template>
2a2988f40SDerick Montague  <div>
36859203cSDerick Montague    <header id="page-header">
46859203cSDerick Montague      <a role="link" class="link-skip-nav btn btn-light" href="#main-content">
5e0b76c33SYoshie Muranaka        {{ $t('appHeader.skipToContent') }}
6dc04feb5SYoshie Muranaka      </a>
76859203cSDerick Montague
86859203cSDerick Montague      <b-navbar
96859203cSDerick Montague        variant="dark"
106859203cSDerick Montague        type="dark"
116859203cSDerick Montague        :aria-label="$t('appHeader.applicationHeader')"
126859203cSDerick Montague      >
13dc04feb5SYoshie Muranaka        <!-- Left aligned nav items -->
1474f8687dSYoshie Muranaka        <b-button
156859203cSDerick Montague          id="app-header-trigger"
1674f8687dSYoshie Muranaka          class="nav-trigger"
1774f8687dSYoshie Muranaka          aria-hidden="true"
1874f8687dSYoshie Muranaka          title="Open navigation"
1974f8687dSYoshie Muranaka          type="button"
2074f8687dSYoshie Muranaka          variant="link"
2174f8687dSYoshie Muranaka          @click="toggleNavigation"
2274f8687dSYoshie Muranaka        >
2374f8687dSYoshie Muranaka          <icon-close v-if="isNavigationOpen" />
2474f8687dSYoshie Muranaka          <icon-menu v-if="!isNavigationOpen" />
2574f8687dSYoshie Muranaka        </b-button>
26dc04feb5SYoshie Muranaka        <b-navbar-nav>
27e0b76c33SYoshie Muranaka          <b-nav-text>{{ $t('appHeader.bmcSystemManagement') }}</b-nav-text>
28b8b6f791SYoshie Muranaka        </b-navbar-nav>
29dc04feb5SYoshie Muranaka        <!-- Right aligned nav items -->
30b8b6f791SYoshie Muranaka        <b-navbar-nav class="ml-auto">
31b8b6f791SYoshie Muranaka          <b-nav-item>
32e0b76c33SYoshie Muranaka            {{ $t('appHeader.health') }}
331ace1d91SYoshie Muranaka            <status-icon :status="healthStatusIcon" />
34b8b6f791SYoshie Muranaka          </b-nav-item>
35b8b6f791SYoshie Muranaka          <b-nav-item>
36e0b76c33SYoshie Muranaka            {{ $t('appHeader.power') }}
37dc04feb5SYoshie Muranaka            <status-icon :status="hostStatusIcon" />
38b8b6f791SYoshie Muranaka          </b-nav-item>
396859203cSDerick Montague          <!-- Using LI elements instead of b-nav-item to support semantic button elements -->
406859203cSDerick Montague          <li class="nav-item">
416859203cSDerick Montague            <b-button id="app-header-refresh" variant="link" @click="refresh">
42e0b76c33SYoshie Muranaka              {{ $t('appHeader.refresh') }}
43dc04feb5SYoshie Muranaka              <icon-renew />
446859203cSDerick Montague            </b-button>
456859203cSDerick Montague          </li>
466859203cSDerick Montague          <li>
476859203cSDerick Montague            <b-button id="app-header-logout" variant="link" @click="logout">
48e0b76c33SYoshie Muranaka              {{ $t('appHeader.logOut') }}
49dc04feb5SYoshie Muranaka              <icon-avatar />
506859203cSDerick Montague            </b-button>
516859203cSDerick Montague          </li>
52b8b6f791SYoshie Muranaka        </b-navbar-nav>
53a2988f40SDerick Montague      </b-navbar>
54a2988f40SDerick Montague    </header>
553be801aaSYoshie Muranaka    <loading-bar />
56a2988f40SDerick Montague  </div>
57a2988f40SDerick Montague</template>
58a2988f40SDerick Montague
59a2988f40SDerick Montague<script>
60e2fd1567SDerick Montagueimport IconAvatar from '@carbon/icons-vue/es/user--avatar/20';
6174f8687dSYoshie Muranakaimport IconClose from '@carbon/icons-vue/es/close/20';
6274f8687dSYoshie Muranakaimport IconMenu from '@carbon/icons-vue/es/menu/20';
63e2fd1567SDerick Montagueimport IconRenew from '@carbon/icons-vue/es/renew/20';
64e2fd1567SDerick Montagueimport StatusIcon from '../Global/StatusIcon';
653be801aaSYoshie Muranakaimport LoadingBar from '../Global/LoadingBar';
6674f8687dSYoshie Muranaka
67a2988f40SDerick Montagueexport default {
68e2fd1567SDerick Montague  name: 'AppHeader',
693be801aaSYoshie Muranaka  components: {
703be801aaSYoshie Muranaka    IconAvatar,
713be801aaSYoshie Muranaka    IconClose,
723be801aaSYoshie Muranaka    IconMenu,
733be801aaSYoshie Muranaka    IconRenew,
743be801aaSYoshie Muranaka    StatusIcon,
753be801aaSYoshie Muranaka    LoadingBar
763be801aaSYoshie Muranaka  },
7774f8687dSYoshie Muranaka  data() {
7874f8687dSYoshie Muranaka    return {
7974f8687dSYoshie Muranaka      isNavigationOpen: false
8074f8687dSYoshie Muranaka    };
8174f8687dSYoshie Muranaka  },
82b8b6f791SYoshie Muranaka  computed: {
83b8b6f791SYoshie Muranaka    hostStatus() {
84e2fd1567SDerick Montague      return this.$store.getters['global/hostStatus'];
85dc04feb5SYoshie Muranaka    },
861ace1d91SYoshie Muranaka    healthStatus() {
871ace1d91SYoshie Muranaka      return this.$store.getters['eventLog/healthStatus'];
881ace1d91SYoshie Muranaka    },
89dc04feb5SYoshie Muranaka    hostStatusIcon() {
90dc04feb5SYoshie Muranaka      switch (this.hostStatus) {
91e2fd1567SDerick Montague        case 'on':
92e2fd1567SDerick Montague          return 'success';
93e2fd1567SDerick Montague        case 'error':
94e2fd1567SDerick Montague          return 'danger';
95e2fd1567SDerick Montague        case 'off':
96dc04feb5SYoshie Muranaka        default:
97e2fd1567SDerick Montague          return 'secondary';
98dc04feb5SYoshie Muranaka      }
991ace1d91SYoshie Muranaka    },
1001ace1d91SYoshie Muranaka    healthStatusIcon() {
1011ace1d91SYoshie Muranaka      switch (this.healthStatus) {
1021ace1d91SYoshie Muranaka        case 'good':
1031ace1d91SYoshie Muranaka          return 'success';
1041ace1d91SYoshie Muranaka        case 'warning':
1051ace1d91SYoshie Muranaka          return 'warning';
1061ace1d91SYoshie Muranaka        case 'critical':
1071ace1d91SYoshie Muranaka          return 'danger';
1081ace1d91SYoshie Muranaka        default:
1091ace1d91SYoshie Muranaka          return 'secondary';
1101ace1d91SYoshie Muranaka      }
111b8b6f791SYoshie Muranaka    }
112b8b6f791SYoshie Muranaka  },
11309e45cd4SDerick Montague  created() {
11409e45cd4SDerick Montague    this.getHostInfo();
1151ace1d91SYoshie Muranaka    this.getEvents();
11609e45cd4SDerick Montague  },
11774f8687dSYoshie Muranaka  mounted() {
11874f8687dSYoshie Muranaka    this.$root.$on(
11974f8687dSYoshie Muranaka      'change:isNavigationOpen',
12074f8687dSYoshie Muranaka      isNavigationOpen => (this.isNavigationOpen = isNavigationOpen)
12174f8687dSYoshie Muranaka    );
12274f8687dSYoshie Muranaka  },
123b8b6f791SYoshie Muranaka  methods: {
124b8b6f791SYoshie Muranaka    getHostInfo() {
125e2fd1567SDerick Montague      this.$store.dispatch('global/getHostStatus');
126e080a1a7SDerick Montague    },
1271ace1d91SYoshie Muranaka    getEvents() {
1281ace1d91SYoshie Muranaka      this.$store.dispatch('eventLog/getEventLogData');
1291ace1d91SYoshie Muranaka    },
130eb154bbcSYoshie Muranaka    refresh() {
131eb154bbcSYoshie Muranaka      this.$emit('refresh');
132eb154bbcSYoshie Muranaka    },
133e080a1a7SDerick Montague    logout() {
134c031b698SDerick Montague      this.$store.dispatch('authentication/logout');
13574f8687dSYoshie Muranaka    },
13674f8687dSYoshie Muranaka    toggleNavigation() {
13774f8687dSYoshie Muranaka      this.$root.$emit('toggle:navigation');
138b8b6f791SYoshie Muranaka    }
139a2988f40SDerick Montague  }
140a2988f40SDerick Montague};
141a2988f40SDerick Montague</script>
142a2988f40SDerick Montague
143b8b6f791SYoshie Muranaka<style lang="scss" scoped>
144*40865726SDerick Montague@import 'src/assets/styles/helpers';
145*40865726SDerick Montague
14675b48321SDerick Montague.link-skip-nav {
14775b48321SDerick Montague  position: absolute;
14875b48321SDerick Montague  top: -60px;
14975b48321SDerick Montague  left: 0.5rem;
15074f8687dSYoshie Muranaka  z-index: $zindex-popover;
15174f8687dSYoshie Muranaka  transition: $duration--moderate-01 $exit-easing--expressive;
15275b48321SDerick Montague  &:focus {
15375b48321SDerick Montague    top: 0.5rem;
15474f8687dSYoshie Muranaka    transition-timing-function: $entrance-easing--expressive;
15575b48321SDerick Montague  }
15675b48321SDerick Montague}
1571ace1d91SYoshie Muranaka.navbar-dark {
1581ace1d91SYoshie Muranaka  .navbar-text,
1596859203cSDerick Montague  .nav-link,
1606859203cSDerick Montague  .btn-link {
1611ace1d91SYoshie Muranaka    color: $white !important;
1626859203cSDerick Montague    fill: currentColor;
1631ace1d91SYoshie Muranaka  }
1641ace1d91SYoshie Muranaka}
1656859203cSDerick Montague
166dc04feb5SYoshie Muranaka.nav-item {
167dc04feb5SYoshie Muranaka  fill: $light;
168dc04feb5SYoshie Muranaka}
16974f8687dSYoshie Muranaka
17074f8687dSYoshie Muranaka.navbar {
17174f8687dSYoshie Muranaka  padding: 0;
17274f8687dSYoshie Muranaka  height: $header-height;
17374f8687dSYoshie Muranaka  overflow: hidden;
1746859203cSDerick Montague
1756859203cSDerick Montague  .btn-link {
1766859203cSDerick Montague    padding: $spacer / 2;
1776859203cSDerick Montague  }
17874f8687dSYoshie Muranaka}
17974f8687dSYoshie Muranaka
18074f8687dSYoshie Muranaka.navbar-nav {
18174f8687dSYoshie Muranaka  padding: 0 $spacer;
18274f8687dSYoshie Muranaka}
18374f8687dSYoshie Muranaka
18474f8687dSYoshie Muranaka.nav-trigger {
1857f970a1fSDerick Montague  fill: $light;
18674f8687dSYoshie Muranaka  width: $header-height;
18774f8687dSYoshie Muranaka  height: $header-height;
18874f8687dSYoshie Muranaka  transition: none;
18974f8687dSYoshie Muranaka
19074f8687dSYoshie Muranaka  svg {
19174f8687dSYoshie Muranaka    margin: 0;
19274f8687dSYoshie Muranaka  }
19374f8687dSYoshie Muranaka
19474f8687dSYoshie Muranaka  &:hover {
1957f970a1fSDerick Montague    fill: $light;
1967f970a1fSDerick Montague    background-color: $dark;
19774f8687dSYoshie Muranaka  }
19874f8687dSYoshie Muranaka
19974f8687dSYoshie Muranaka  @include media-breakpoint-up($responsive-layout-bp) {
20074f8687dSYoshie Muranaka    display: none;
20174f8687dSYoshie Muranaka  }
202dc04feb5SYoshie Muranaka}
203b8b6f791SYoshie Muranaka</style>
204