index.vue 2.96 KB
<template>
    <div :class="classObj" class="app-wrapper">
        <template v-if="layout === 'layout1'">
            <theme-navtl/>
        </template>
        <template v-else>
            <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
            <aside class="qg-page-left">
                <logo/>
                <sidebar :menus="menus" class="sidebar-container"/>
            </aside>
            <div class="main-container">
                <div :class="{'qg-fixed-header':true}">
                    <navbar/>
                </div>
                <breadcrumb id="breadcrumb-container" class="breadcrumb-container"/>
                <app-main/>
            </div>
        </template>
    </div>
</template>

<script>
    import {AppMain, Navbar, Sidebar, Breadcrumb} from './components';
    import ThemeNavtl from './theme/navtl/index';
    import ResizeMixin from './mixin/ResizeHandler';
    import {mapState} from 'vuex';
    import Logo from '@/layout/components/Logo';

    export default {
        name: 'Layout',
        components: {
            AppMain,
            Navbar,
            Sidebar,
            Breadcrumb,
            ThemeNavtl,
            Logo
        },
        mixins: [ResizeMixin],
        computed: {
            ...mapState({
                sidebar: state => state.app.sidebar,
                device: state => state.app.device,
                showSettings: state => state.settings.showSettings,
                needTagsView: state => state.settings.tagsView,
                fixedHeader: state => state.settings.fixedHeader,
                layout: state => state.app.layout,
                menus: state => state.permission.menus
            }),
            classObj() {
                return {
                    hideSidebar: !this.sidebar.opened,
                    openSidebar: this.sidebar.opened,
                    withoutAnimation: this.sidebar.withoutAnimation,
                    mobile: this.device === 'mobile',
                    layout2: this.layout === 'layout2'
                };
            }
        },
        methods: {
            handleClickOutside() {
                this.$store.dispatch('app/closeSideBar', {withoutAnimation: false});
            }
        }
    };
</script>

<style lang="scss" scoped>

    .app-wrapper {
        position: relative;
        height: 100%;
        width: 100%;

        &.mobile.openSidebar {
            position: fixed;
            top: 0;
        }
    }

    .drawer-bg {
        background: #000;
        opacity: 0.3;
        width: 100%;
        top: 0;
        height: 100%;
        position: absolute;
        z-index: 999;
    }

    .qg-fixed-header {
        position: fixed;
        top: 0;
        right: 0;
        z-index: 9;
        width: calc(100% - #{$sideBarWidth});
        transition: width 0.28s;
    }

    .hideSidebar .qg-fixed-header {
        width: calc(100% - 54px);
    }

    .mobile .qg-fixed-header {
        width: 100%;
    }
</style>