124 lines
3.2 KiB
Vue
124 lines
3.2 KiB
Vue
|
<template>
|
||
|
<div class="sidenav navbar navbar-vertical fixed-left navbar-expand-xs navbar-light bg-white"
|
||
|
@mouseenter="$sidebar.onMouseEnter()"
|
||
|
@mouseleave="$sidebar.onMouseLeave()"
|
||
|
:data="backgroundColor">
|
||
|
<div class="scrollbar-inner" ref="sidebarScrollArea">
|
||
|
<div class="sidenav-header d-flex align-items-center">
|
||
|
<a class="navbar-brand" href="#">
|
||
|
<img :src="logo" class="navbar-brand-img" alt="Sidebar logo">
|
||
|
</a>
|
||
|
<div class="ml-auto">
|
||
|
<!-- Sidenav toggler -->
|
||
|
<div class="sidenav-toggler d-none d-xl-block"
|
||
|
:class="{'active': !$sidebar.isMinimized }"
|
||
|
@click="minimizeSidebar">
|
||
|
<div class="sidenav-toggler-inner">
|
||
|
<i class="sidenav-toggler-line"></i>
|
||
|
<i class="sidenav-toggler-line"></i>
|
||
|
<i class="sidenav-toggler-line"></i>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<slot></slot>
|
||
|
<div class="navbar-inner">
|
||
|
<ul class="navbar-nav">
|
||
|
<slot name="links">
|
||
|
<sidebar-item
|
||
|
v-for="(link, index) in sidebarLinks"
|
||
|
:key="link.name + index"
|
||
|
:link="link"
|
||
|
>
|
||
|
<sidebar-item
|
||
|
v-for="(subLink, index) in link.children"
|
||
|
:key="subLink.name + index"
|
||
|
:link="subLink"
|
||
|
>
|
||
|
</sidebar-item>
|
||
|
</sidebar-item>
|
||
|
</slot>
|
||
|
</ul>
|
||
|
<slot name="links-after"></slot>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</template>
|
||
|
<script>
|
||
|
export default {
|
||
|
name: 'sidebar',
|
||
|
props: {
|
||
|
title: {
|
||
|
type: String,
|
||
|
default: 'Creative Tim',
|
||
|
description: 'Sidebar title'
|
||
|
},
|
||
|
shortTitle: {
|
||
|
type: String,
|
||
|
default: 'CT',
|
||
|
description: 'Sidebar short title'
|
||
|
},
|
||
|
logo: {
|
||
|
type: String,
|
||
|
default: 'https://demos.creative-tim.com/vue-argon-dashboard-pro/img/brand/green.png',
|
||
|
description: 'Sidebar app logo'
|
||
|
},
|
||
|
backgroundColor: {
|
||
|
type: String,
|
||
|
default: 'vue',
|
||
|
validator: value => {
|
||
|
let acceptedValues = [
|
||
|
'',
|
||
|
'vue',
|
||
|
'blue',
|
||
|
'green',
|
||
|
'orange',
|
||
|
'red',
|
||
|
'primary'
|
||
|
];
|
||
|
return acceptedValues.indexOf(value) !== -1;
|
||
|
},
|
||
|
description:
|
||
|
'Sidebar background color (vue|blue|green|orange|red|primary)'
|
||
|
},
|
||
|
sidebarLinks: {
|
||
|
type: Array,
|
||
|
default: () => [],
|
||
|
description:
|
||
|
"List of sidebar links as an array if you don't want to use components for these."
|
||
|
},
|
||
|
autoClose: {
|
||
|
type: Boolean,
|
||
|
default: true,
|
||
|
description:
|
||
|
'Whether sidebar should autoclose on mobile when clicking an item'
|
||
|
}
|
||
|
},
|
||
|
provide() {
|
||
|
return {
|
||
|
autoClose: this.autoClose
|
||
|
};
|
||
|
},
|
||
|
methods: {
|
||
|
minimizeSidebar() {
|
||
|
if (this.$sidebar) {
|
||
|
this.$sidebar.toggleMinimize();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
beforeDestroy() {
|
||
|
if (this.$sidebar.showSidebar) {
|
||
|
this.$sidebar.showSidebar = false;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
</script>
|
||
|
<style>
|
||
|
@media (min-width: 992px) {
|
||
|
.navbar-search-form-mobile,
|
||
|
.nav-mobile-menu {
|
||
|
display: none;
|
||
|
}
|
||
|
}
|
||
|
</style>
|