<template> <div id="app"> <Navbar/> <div id="wrapper" :class="$store.state.show_sidebar ? 'squished' : null"> <div id="page-content-wrapper"> <div class="container"> <b-alert v-if="$sysinfo.host_oper_mode.is_devel" show variant="warning"> <b-row> <b-col cols="1" style="margin-top: auto; margin-bottom: auto" class="vertical-center"> <font-awesome-icon :icon="['fas', 'dumpster-fire']" size="3x"></font-awesome-icon> </b-col> <b-col style="margin-top: auto; margin-bottom: auto"> <span><b> WIP!</b> Diese Anwendung befindet sich in aktiver Entwicklung. Einige Features könnten eingeschränkt funktionieren oder unerwartete Ergebnisse liefern.</span> </b-col> </b-row> </b-alert> <b-breadcrumb :items="breadcrumbs"/> <router-view v-bind:key="$store.state.reload_count"/> <Footer/> </div> </div> <b-card id="sidebar-wrapper" no-body :class="$store.state.show_sidebar ? 'hide' : null"> <Sidebar/> </b-card> </div> <b-modal content-class="text-center" centered id="net-suite-error" hide-footer hide-header size="lg"> <h1> <font-awesome-icon icon="poo-storm" size="3x"></font-awesome-icon> </h1> <h3>Etwas ist schief gelaufen...</h3> <CopyField class="shadow" variant="danger" :text="global_error" multiline/> <hr/> <a target="_blank" href="https://git.scc.kit.edu/scc-net/netvs/netvs-core/issues"> <font-awesome-icon icon="bug"/> Fehler melden</a> | Unterstützung für diese Anwendung und die API: <a href="mailto:netvs@scc.kit.edu">netvs∂scc.kit.edu</a> </b-modal> </div> </template> <script> import Navbar from './components/Navbar' import CopyField from './components/CopyField' import Footer from './components/Footer' import Sidebar from './components/Sidebar' import {EventBus} from '@/eventbus' export default { components: {Sidebar, Footer, Navbar, CopyField}, data() { return { global_error: null, breadcrumbs: [] } }, watch: { $route() { let m = this.$router.currentRoute.matched m = m[m.length - 1] this.breadcrumbs = this.getBreadcrumbs(m) } }, methods: { getBreadcrumbs(m) { const res = [{text: m.meta.resolveName(this.$route.params), path: m.path}] while ((m.meta && m.meta.resolveParents) || m.parent) { if (m.meta && m.meta.resolveParents) { const parents = m.meta.resolveParents(this.$route.params) for (let i = 0; i < parents.length; i++) { if (typeof parents[i] === 'object' && 'text' in parents[i] && 'to' in parents[i]) { res.unshift(parents[i]) continue } m = this.$router.resolve(parents[i]).resolved.matched m = m[m.length - 1] res.unshift({text: m.meta.resolveName(this.$route.params), to: parents[i]}) } } else { m = m.parent res.unshift({text: m.meta.resolveName(this.$route.params), to: m.path}) } } return res } }, mounted() { window.console.log('%c ', `font-size:0px; padding: 200px; background:url(${window.location.protocol}//${window.location.hostname}:${window.location.port}/important.webp) no-repeat; background-position: center; background-size: contain;`) const self = this EventBus.$on('error', (payload) => { window.console.debug('evbus trigger') window.console.debug(payload) if ('response' in payload) { if (payload.response.status === 401) { return } self.global_error = payload.response.data } else { self.global_error = payload } self.global_error = JSON.stringify(self.global_error, null, 4) this.$bvModal.show('net-suite-error') }) } } </script> <style lang="scss"> //@import '../node_modules/bootstrap/scss/bootstrap.scss'; @import '../node_modules/bootstrap-vue/dist/bootstrap-vue.css'; //@import '../node_modules/bootswatch/dist/flatly/bootstrap.css'; @import '../node_modules/bootswatch/dist/darkly/bootstrap.css'; @import 'assets/css/net-suite.css'; @import 'assets/css/net-suite-devel.css'; @import 'assets/css/net-suite-test.css'; $sidebar-width: 380px; @media screen and (min-width: 981px) { #wrapper { transition: padding-right .5s; } #wrapper.squished { padding-right: $sidebar-width; } #sidebar-wrapper { height: 100%; width: $sidebar-width; position: fixed; z-index: 1; top: 0; right: -$sidebar-width; transition: right .5s; padding-top: 50px; background: #F7F7F7; } #sidebar-wrapper.hide { right: 0px; } } @media screen and (max-width: 980px) { #sidebar-wrapper { height: 100%; width: 100%; position: fixed; z-index: 999; top: -100%; transition: top .5s; padding-top: 50px; background: #F7F7F7; } #sidebar-wrapper.hide { top: 0; } } .collapse-icon { transition: transform; transition-duration: 250ms; } .not-collapsed > .collapse-icon { transform: rotate(-180deg); } </style>