xref: /openbmc/webui-vue/src/components/AppHeader/AppHeader.vue (revision 13cdbcdaa63b1eb4590e63ce14e026b97bce0037)
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">
31*13cdbcdaSDixsie Wolmers          <b-nav-item to="/health/event-logs">
32e0b76c33SYoshie Muranaka            {{ $t('appHeader.health') }}
331ace1d91SYoshie Muranaka            <status-icon :status="healthStatusIcon" />
34b8b6f791SYoshie Muranaka          </b-nav-item>
35*13cdbcdaSDixsie Wolmers          <b-nav-item to="/control/server-power-operations">
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';
95a3cbc659SYoshie Muranaka        case 'diagnosticMode':
96a3cbc659SYoshie Muranaka          return 'warning';
97e2fd1567SDerick Montague        case 'off':
98dc04feb5SYoshie Muranaka        default:
99e2fd1567SDerick Montague          return 'secondary';
100dc04feb5SYoshie Muranaka      }
1011ace1d91SYoshie Muranaka    },
1021ace1d91SYoshie Muranaka    healthStatusIcon() {
1031ace1d91SYoshie Muranaka      switch (this.healthStatus) {
104ce9a3ef3SYoshie Muranaka        case 'OK':
1051ace1d91SYoshie Muranaka          return 'success';
106ce9a3ef3SYoshie Muranaka        case 'Warning':
1071ace1d91SYoshie Muranaka          return 'warning';
108ce9a3ef3SYoshie Muranaka        case 'Critical':
1091ace1d91SYoshie Muranaka          return 'danger';
1101ace1d91SYoshie Muranaka        default:
1111ace1d91SYoshie Muranaka          return 'secondary';
1121ace1d91SYoshie Muranaka      }
113b8b6f791SYoshie Muranaka    }
114b8b6f791SYoshie Muranaka  },
11509e45cd4SDerick Montague  created() {
11609e45cd4SDerick Montague    this.getHostInfo();
1171ace1d91SYoshie Muranaka    this.getEvents();
11809e45cd4SDerick Montague  },
11974f8687dSYoshie Muranaka  mounted() {
12074f8687dSYoshie Muranaka    this.$root.$on(
12174f8687dSYoshie Muranaka      'change:isNavigationOpen',
12274f8687dSYoshie Muranaka      isNavigationOpen => (this.isNavigationOpen = isNavigationOpen)
12374f8687dSYoshie Muranaka    );
12474f8687dSYoshie Muranaka  },
125b8b6f791SYoshie Muranaka  methods: {
126b8b6f791SYoshie Muranaka    getHostInfo() {
127e2fd1567SDerick Montague      this.$store.dispatch('global/getHostStatus');
128e080a1a7SDerick Montague    },
1291ace1d91SYoshie Muranaka    getEvents() {
1301ace1d91SYoshie Muranaka      this.$store.dispatch('eventLog/getEventLogData');
1311ace1d91SYoshie Muranaka    },
132eb154bbcSYoshie Muranaka    refresh() {
133eb154bbcSYoshie Muranaka      this.$emit('refresh');
134eb154bbcSYoshie Muranaka    },
135e080a1a7SDerick Montague    logout() {
136c031b698SDerick Montague      this.$store.dispatch('authentication/logout');
13774f8687dSYoshie Muranaka    },
13874f8687dSYoshie Muranaka    toggleNavigation() {
13974f8687dSYoshie Muranaka      this.$root.$emit('toggle:navigation');
140b8b6f791SYoshie Muranaka    }
141a2988f40SDerick Montague  }
142a2988f40SDerick Montague};
143a2988f40SDerick Montague</script>
144a2988f40SDerick Montague
145b8b6f791SYoshie Muranaka<style lang="scss" scoped>
14640865726SDerick Montague@import 'src/assets/styles/helpers';
14740865726SDerick Montague
14875b48321SDerick Montague.link-skip-nav {
14975b48321SDerick Montague  position: absolute;
15075b48321SDerick Montague  top: -60px;
15175b48321SDerick Montague  left: 0.5rem;
15274f8687dSYoshie Muranaka  z-index: $zindex-popover;
15374f8687dSYoshie Muranaka  transition: $duration--moderate-01 $exit-easing--expressive;
15475b48321SDerick Montague  &:focus {
15575b48321SDerick Montague    top: 0.5rem;
15674f8687dSYoshie Muranaka    transition-timing-function: $entrance-easing--expressive;
15775b48321SDerick Montague  }
15875b48321SDerick Montague}
1591ace1d91SYoshie Muranaka.navbar-dark {
1601ace1d91SYoshie Muranaka  .navbar-text,
1616859203cSDerick Montague  .nav-link,
1626859203cSDerick Montague  .btn-link {
1631ace1d91SYoshie Muranaka    color: $white !important;
1646859203cSDerick Montague    fill: currentColor;
1651ace1d91SYoshie Muranaka  }
1661ace1d91SYoshie Muranaka}
1676859203cSDerick Montague
168dc04feb5SYoshie Muranaka.nav-item {
169dc04feb5SYoshie Muranaka  fill: $light;
170dc04feb5SYoshie Muranaka}
17174f8687dSYoshie Muranaka
17274f8687dSYoshie Muranaka.navbar {
17374f8687dSYoshie Muranaka  padding: 0;
17474f8687dSYoshie Muranaka  height: $header-height;
17574f8687dSYoshie Muranaka  overflow: hidden;
1766859203cSDerick Montague
1776859203cSDerick Montague  .btn-link {
1786859203cSDerick Montague    padding: $spacer / 2;
1796859203cSDerick Montague  }
18074f8687dSYoshie Muranaka}
18174f8687dSYoshie Muranaka
18274f8687dSYoshie Muranaka.navbar-nav {
18374f8687dSYoshie Muranaka  padding: 0 $spacer;
18474f8687dSYoshie Muranaka}
18574f8687dSYoshie Muranaka
18674f8687dSYoshie Muranaka.nav-trigger {
1877f970a1fSDerick Montague  fill: $light;
18874f8687dSYoshie Muranaka  width: $header-height;
18974f8687dSYoshie Muranaka  height: $header-height;
19074f8687dSYoshie Muranaka  transition: none;
19174f8687dSYoshie Muranaka
19274f8687dSYoshie Muranaka  svg {
19374f8687dSYoshie Muranaka    margin: 0;
19474f8687dSYoshie Muranaka  }
19574f8687dSYoshie Muranaka
19674f8687dSYoshie Muranaka  &:hover {
1977f970a1fSDerick Montague    fill: $light;
1987f970a1fSDerick Montague    background-color: $dark;
19974f8687dSYoshie Muranaka  }
20074f8687dSYoshie Muranaka
20174f8687dSYoshie Muranaka  @include media-breakpoint-up($responsive-layout-bp) {
20274f8687dSYoshie Muranaka    display: none;
20374f8687dSYoshie Muranaka  }
204dc04feb5SYoshie Muranaka}
205b8b6f791SYoshie Muranaka</style>
206