remove unused files
@ -1,72 +0,0 @@
|
||||
<template>
|
||||
<div class="navbar-container d-flex content align-items-center">
|
||||
|
||||
<!-- Nav Menu Toggler -->
|
||||
<ul class="nav navbar-nav d-xl-none">
|
||||
<li class="nav-item">
|
||||
<b-link
|
||||
class="nav-link"
|
||||
@click="toggleVerticalMenuActive"
|
||||
>
|
||||
<feather-icon
|
||||
icon="MenuIcon"
|
||||
size="21"
|
||||
/>
|
||||
</b-link>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Left Col -->
|
||||
<div class="bookmark-wrapper align-items-center flex-grow-1 d-none d-lg-flex">
|
||||
<bookmarks />
|
||||
</div>
|
||||
|
||||
<!-- Right Col -->
|
||||
<b-navbar-nav class="nav align-items-center ml-auto">
|
||||
<dark-Toggler class="d-none d-lg-block" />
|
||||
<search-bar />
|
||||
<notification-dropdown />
|
||||
<template #button-content>
|
||||
<b-button
|
||||
v-ripple.400="'rgba(255, 255, 255, 0.15)'"
|
||||
variant="primary"
|
||||
class="btn-icon"
|
||||
>
|
||||
<feather-icon icon="SettingsIcon" />
|
||||
</b-button>
|
||||
</template>
|
||||
</b-navbar-nav>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
BLink, BNavbarNav, BButton,
|
||||
} from 'bootstrap-vue'
|
||||
import Bookmarks from './components/Bookmarks.vue'
|
||||
// import Locale from './components/Locale.vue'
|
||||
import DarkToggler from './components/DarkToggler.vue'
|
||||
import SearchBar from './components/SearchBar.vue'
|
||||
import NotificationDropdown from './components/NotificationDropdown.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BLink,
|
||||
|
||||
// Navbar Components
|
||||
BNavbarNav,
|
||||
Bookmarks,
|
||||
DarkToggler,
|
||||
SearchBar,
|
||||
NotificationDropdown,
|
||||
BButton,
|
||||
},
|
||||
props: {
|
||||
toggleVerticalMenuActive: {
|
||||
type: Function,
|
||||
default: () => {},
|
||||
},
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
@ -1,46 +0,0 @@
|
||||
<template>
|
||||
<div class="navbar-header d-xl-block d-none">
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="nav-item">
|
||||
<b-link
|
||||
class="navbar-brand"
|
||||
to="/"
|
||||
>
|
||||
<span class="brand-logo">
|
||||
<b-img
|
||||
:src="appLogoImage"
|
||||
alt="logo"
|
||||
/>
|
||||
</span>
|
||||
<h2 class="brand-text mb-0">
|
||||
{{ appName }}
|
||||
</h2>
|
||||
</b-link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { BLink, BImg } from 'bootstrap-vue'
|
||||
import { $themeConfig } from '@themeConfig'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BLink,
|
||||
BImg,
|
||||
},
|
||||
setup() {
|
||||
// App Name
|
||||
const { appName, appLogoImage } = $themeConfig.app
|
||||
return {
|
||||
appName,
|
||||
appLogoImage,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -35,10 +35,8 @@
|
||||
import {
|
||||
BLink, BNavbarNav,
|
||||
} from 'bootstrap-vue'
|
||||
import Bookmarks from './components/Bookmarks.vue'
|
||||
import SearchBar from './components/SearchBar.vue'
|
||||
import DarkToggler from './components/DarkToggler.vue'
|
||||
import NotificationDropdown from './components/NotificationDropdown.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@ -46,10 +44,8 @@ export default {
|
||||
|
||||
// Navbar Components
|
||||
BNavbarNav,
|
||||
Bookmarks,
|
||||
SearchBar,
|
||||
DarkToggler,
|
||||
NotificationDropdown,
|
||||
},
|
||||
props: {
|
||||
toggleVerticalMenuActive: {
|
||||
|
@ -1,196 +0,0 @@
|
||||
<template>
|
||||
<b-navbar-nav class="nav">
|
||||
<b-nav-item
|
||||
v-for="(bookmark, index) in bookmarks"
|
||||
:id="`bookmark-${index}`"
|
||||
:key="index"
|
||||
:to="bookmark.route"
|
||||
>
|
||||
<feather-icon
|
||||
:icon="bookmark.icon"
|
||||
size="21"
|
||||
/>
|
||||
<b-tooltip
|
||||
triggers="hover"
|
||||
:target="`bookmark-${index}`"
|
||||
:title="bookmark.title"
|
||||
:delay="{ show: 1000, hide: 50 }"
|
||||
/>
|
||||
</b-nav-item>
|
||||
<b-nav-item-dropdown
|
||||
link-classes="bookmark-star"
|
||||
lazy
|
||||
@hidden="resetsearchQuery"
|
||||
>
|
||||
<feather-icon
|
||||
slot="button-content"
|
||||
icon="StarIcon"
|
||||
size="21"
|
||||
class="text-warning"
|
||||
/>
|
||||
|
||||
<!-- Dropdown Content -->
|
||||
<li style="min-width:300px">
|
||||
<div class="p-1">
|
||||
<b-form-input
|
||||
id="boomark-search-input"
|
||||
v-model="searchQuery"
|
||||
placeholder="Explore Vuexy..."
|
||||
autofocus
|
||||
/>
|
||||
</div>
|
||||
<vue-perfect-scrollbar
|
||||
:settings="perfectScrollbarSettings"
|
||||
class="search-list search-list-bookmark scroll-area"
|
||||
:class="{'show': filteredData.pages && filteredData.pages.length }"
|
||||
tagname="ul"
|
||||
>
|
||||
|
||||
<b-dropdown-item
|
||||
v-for="(suggestion, index) in filteredData.pages || bookmarks"
|
||||
:key="index"
|
||||
class="suggestion-group-suggestion cursor-pointer"
|
||||
link-class="d-flex align-items-center"
|
||||
:to="suggestion.route"
|
||||
@mouseenter="currentSelected = index"
|
||||
>
|
||||
<feather-icon
|
||||
:icon="suggestion.icon"
|
||||
class="mr-75"
|
||||
size="18"
|
||||
/>
|
||||
<span class="align-middle">{{ suggestion.title }}</span>
|
||||
<feather-icon
|
||||
icon="StarIcon"
|
||||
class="ml-auto"
|
||||
size="16"
|
||||
:class="{'text-warning': suggestion.isBookmarked}"
|
||||
@click.stop.prevent="toggleBookmarked(suggestion)"
|
||||
/>
|
||||
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
v-show="!(filteredData.pages && filteredData.pages.length) && searchQuery"
|
||||
disabled
|
||||
>
|
||||
No Results Found.
|
||||
</b-dropdown-item></vue-perfect-scrollbar>
|
||||
</li>
|
||||
</b-nav-item-dropdown>
|
||||
|
||||
</b-navbar-nav>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
BNavbarNav, BNavItem, BTooltip, BNavItemDropdown, BFormInput, BDropdownItem,
|
||||
} from 'bootstrap-vue'
|
||||
import VuePerfectScrollbar from 'vue-perfect-scrollbar'
|
||||
import useAutoSuggest from '@core/components/app-auto-suggest/useAutoSuggest'
|
||||
import { ref, watch } from '@vue/composition-api'
|
||||
import router from '@/router'
|
||||
import store from '@/store'
|
||||
import searchAndBookmarkData from '../search-and-bookmark-data'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BNavbarNav, BNavItem, BTooltip, BNavItemDropdown, BFormInput, VuePerfectScrollbar, BDropdownItem,
|
||||
},
|
||||
setup() {
|
||||
const searchAndBookmarkDataPages = ref(searchAndBookmarkData.pages)
|
||||
const bookmarks = ref(searchAndBookmarkData.pages.data.filter(page => page.isBookmarked))
|
||||
const currentSelected = ref(-1)
|
||||
|
||||
const perfectScrollbarSettings = {
|
||||
maxScrollbarLength: 60,
|
||||
}
|
||||
|
||||
const {
|
||||
searchQuery,
|
||||
resetsearchQuery,
|
||||
filteredData,
|
||||
} = useAutoSuggest({ data: { pages: searchAndBookmarkDataPages.value }, searchLimit: 6 })
|
||||
|
||||
watch(searchQuery, val => {
|
||||
store.commit('app/TOGGLE_OVERLAY', Boolean(val))
|
||||
})
|
||||
|
||||
watch(filteredData, val => {
|
||||
currentSelected.value = val.pages && !val.pages.length ? -1 : 0
|
||||
})
|
||||
|
||||
const suggestionSelected = () => {
|
||||
const suggestion = filteredData.value.pages[currentSelected.value]
|
||||
router.push(suggestion.route).catch(() => {})
|
||||
resetsearchQuery()
|
||||
}
|
||||
|
||||
const toggleBookmarked = item => {
|
||||
// Find Index of item/page in bookmarks' array
|
||||
const pageIndexInBookmarks = bookmarks.value.findIndex(i => i.route === item.route)
|
||||
|
||||
// If index is > -1 => Item is bookmarked => Remove item from bookmarks array using index
|
||||
// Else => Item is not bookmarked => Add item to bookmarks' array
|
||||
if (pageIndexInBookmarks > -1) {
|
||||
bookmarks.value[pageIndexInBookmarks].isBookmarked = false
|
||||
bookmarks.value.splice(pageIndexInBookmarks, 1)
|
||||
} else {
|
||||
bookmarks.value.push(item)
|
||||
bookmarks.value[bookmarks.value.length - 1].isBookmarked = true
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
bookmarks,
|
||||
perfectScrollbarSettings,
|
||||
currentSelected,
|
||||
suggestionSelected,
|
||||
toggleBookmarked,
|
||||
|
||||
// AutoSuggest
|
||||
searchQuery,
|
||||
resetsearchQuery,
|
||||
filteredData,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@core/scss/base/bootstrap-extended/include';
|
||||
|
||||
ul
|
||||
{
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.nav-bookmar-content-overlay {
|
||||
position: fixed;
|
||||
opacity: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
-webkit-transition: all 0.7s;
|
||||
transition: all 0.7s;
|
||||
z-index: -1;
|
||||
|
||||
&:not(.show) {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&.show {
|
||||
cursor: pointer;
|
||||
z-index: 10;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,177 +0,0 @@
|
||||
<template>
|
||||
<b-nav-item-dropdown
|
||||
class="dropdown-cart mr-25"
|
||||
menu-class="dropdown-menu-media"
|
||||
right
|
||||
@show="fetchItems"
|
||||
>
|
||||
<template #button-content>
|
||||
<feather-icon
|
||||
:badge="$store.state['app-ecommerce'].cartItemsCount"
|
||||
class="text-body"
|
||||
icon="ShoppingCartIcon"
|
||||
size="21"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<!-- Header -->
|
||||
<li class="dropdown-menu-header">
|
||||
<div class="dropdown-header d-flex">
|
||||
<h4 class="notification-title mb-0 mr-auto">
|
||||
My Cart
|
||||
</h4>
|
||||
<b-badge
|
||||
pill
|
||||
variant="light-primary"
|
||||
>
|
||||
{{ $store.state['app-ecommerce'].cartItemsCount }} Items
|
||||
</b-badge>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Cart Items -->
|
||||
<vue-perfect-scrollbar
|
||||
v-if="items.length"
|
||||
:settings="perfectScrollbarSettings"
|
||||
class="scrollable-container media-list scroll-area"
|
||||
tagname="li"
|
||||
>
|
||||
<b-media
|
||||
v-for="item in items"
|
||||
:key="item.name"
|
||||
>
|
||||
<template #aside>
|
||||
<b-img
|
||||
:src="item.image"
|
||||
:alt="item.name"
|
||||
rounded
|
||||
width="62px"
|
||||
/>
|
||||
</template>
|
||||
<feather-icon
|
||||
icon="XIcon"
|
||||
class="cart-item-remove cursor-pointer"
|
||||
@click.stop="removeItemFromCart(item.id)"
|
||||
/>
|
||||
<div class="media-heading">
|
||||
<h6 class="cart-item-title">
|
||||
<b-link class="text-body">
|
||||
{{ item.name }}
|
||||
</b-link>
|
||||
</h6>
|
||||
<small class="cart-item-by">By {{ item.brand }}</small>
|
||||
</div>
|
||||
|
||||
<div class="cart-item-qty ml-1">
|
||||
<b-form-spinbutton
|
||||
v-model="item.qty"
|
||||
min="1"
|
||||
size="sm"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<h5 class="cart-item-price">
|
||||
${{ item.price }}
|
||||
</h5>
|
||||
</b-media>
|
||||
</vue-perfect-scrollbar>
|
||||
|
||||
<!-- Cart Footer -->
|
||||
<li
|
||||
v-if="items.length"
|
||||
class="dropdown-menu-footer"
|
||||
>
|
||||
<div class="d-flex justify-content-between mb-1">
|
||||
<h6 class="font-weight-bolder mb-0">
|
||||
Total:
|
||||
</h6>
|
||||
<h6 class="text-primary font-weight-bolder mb-0">
|
||||
${{ totalAmount }}
|
||||
</h6>
|
||||
</div>
|
||||
<b-button
|
||||
v-ripple.400="'rgba(255, 255, 255, 0.15)'"
|
||||
variant="primary"
|
||||
block
|
||||
:to="{ name: 'apps-e-commerce-checkout' }"
|
||||
>
|
||||
Checkout
|
||||
</b-button>
|
||||
</li>
|
||||
|
||||
<p
|
||||
v-if="!items.length"
|
||||
class="m-0 p-1 text-center"
|
||||
>
|
||||
Your cart is empty
|
||||
</p>
|
||||
</b-nav-item-dropdown>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import {
|
||||
// BNavItemDropdown, BBadge, BMedia, BLink, BImg, BFormSpinbutton, BButton,
|
||||
// } from 'bootstrap-vue'
|
||||
// import VuePerfectScrollbar from 'vue-perfect-scrollbar'
|
||||
// import Ripple from 'vue-ripple-directive'
|
||||
|
||||
// export default {
|
||||
// components: {
|
||||
// BNavItemDropdown,
|
||||
// BBadge,
|
||||
// BMedia,
|
||||
// BLink,
|
||||
// BImg,
|
||||
// BFormSpinbutton,
|
||||
// VuePerfectScrollbar,
|
||||
// BButton,
|
||||
// },
|
||||
// directives: {
|
||||
// Ripple,
|
||||
// },
|
||||
// data() {
|
||||
// return {
|
||||
// items: [],
|
||||
// perfectScrollbarSettings: {
|
||||
// maxScrollbarLength: 60,
|
||||
// wheelPropagation: false,
|
||||
// },
|
||||
// }
|
||||
// },
|
||||
// computed: {
|
||||
// totalAmount() {
|
||||
// let total = 0
|
||||
// this.items.forEach(i => { total += i.price })
|
||||
// return total
|
||||
// },
|
||||
// },
|
||||
// methods: {
|
||||
// fetchItems() {
|
||||
// this.$store.dispatch('app-ecommerce/fetchCartProducts')
|
||||
// .then(response => {
|
||||
// this.items = response.data.products
|
||||
// })
|
||||
// },
|
||||
// removeItemFromCart(productId) {
|
||||
// this.$store.dispatch('app-ecommerce/removeProductFromCart', { productId })
|
||||
// .then(() => {
|
||||
// const itemIndex = this.items.findIndex(p => p.id === productId)
|
||||
// this.items.splice(itemIndex, 1)
|
||||
|
||||
// // Update count in cart items state
|
||||
// this.$store.commit('app-ecommerce/UPDATE_CART_ITEMS_COUNT', this.items.length)
|
||||
// })
|
||||
// },
|
||||
// },
|
||||
// }
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dropdown-cart {
|
||||
.media {
|
||||
.media-aside {
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,189 +0,0 @@
|
||||
<template>
|
||||
<b-nav-item-dropdown
|
||||
class="dropdown-notification mr-25"
|
||||
menu-class="dropdown-menu-media"
|
||||
right
|
||||
>
|
||||
<template #button-content>
|
||||
<feather-icon
|
||||
badge="6"
|
||||
badge-classes="bg-danger"
|
||||
class="text-body"
|
||||
icon="BellIcon"
|
||||
size="21"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<!-- Header -->
|
||||
<li class="dropdown-menu-header">
|
||||
<div class="dropdown-header d-flex">
|
||||
<h4 class="notification-title mb-0 mr-auto">
|
||||
Notifications
|
||||
</h4>
|
||||
<b-badge
|
||||
pill
|
||||
variant="light-primary"
|
||||
>
|
||||
6 New
|
||||
</b-badge>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- Notifications -->
|
||||
<vue-perfect-scrollbar
|
||||
v-once
|
||||
:settings="perfectScrollbarSettings"
|
||||
class="scrollable-container media-list scroll-area"
|
||||
tagname="li"
|
||||
>
|
||||
<!-- Account Notification -->
|
||||
<b-link
|
||||
v-for="notification in notifications"
|
||||
:key="notification.subtitle"
|
||||
>
|
||||
<b-media>
|
||||
<template #aside>
|
||||
<b-avatar
|
||||
size="32"
|
||||
:src="notification.avatar"
|
||||
:text="notification.avatar"
|
||||
:variant="notification.type"
|
||||
/>
|
||||
</template>
|
||||
<p class="media-heading">
|
||||
<span class="font-weight-bolder">
|
||||
{{ notification.title }}
|
||||
</span>
|
||||
</p>
|
||||
<small class="notification-text">{{ notification.subtitle }}</small>
|
||||
</b-media>
|
||||
</b-link>
|
||||
|
||||
<!-- System Notification Toggler -->
|
||||
<div class="media d-flex align-items-center">
|
||||
<h6 class="font-weight-bolder mr-auto mb-0">
|
||||
System Notifications
|
||||
</h6>
|
||||
<b-form-checkbox
|
||||
:checked="true"
|
||||
switch
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- System Notifications -->
|
||||
<b-link
|
||||
v-for="notification in systemNotifications"
|
||||
:key="notification.subtitle"
|
||||
>
|
||||
<b-media>
|
||||
<template #aside>
|
||||
<b-avatar
|
||||
size="32"
|
||||
:variant="notification.type"
|
||||
>
|
||||
<feather-icon :icon="notification.icon" />
|
||||
</b-avatar>
|
||||
</template>
|
||||
<p class="media-heading">
|
||||
<span class="font-weight-bolder">
|
||||
{{ notification.title }}
|
||||
</span>
|
||||
</p>
|
||||
<small class="notification-text">{{ notification.subtitle }}</small>
|
||||
</b-media>
|
||||
</b-link>
|
||||
</vue-perfect-scrollbar>
|
||||
|
||||
<!-- Cart Footer -->
|
||||
<li class="dropdown-menu-footer"><b-button
|
||||
v-ripple.400="'rgba(255, 255, 255, 0.15)'"
|
||||
variant="primary"
|
||||
block
|
||||
>Read all notifications</b-button>
|
||||
</li>
|
||||
</b-nav-item-dropdown>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
BNavItemDropdown, BBadge, BMedia, BLink, BAvatar, BButton, BFormCheckbox,
|
||||
} from 'bootstrap-vue'
|
||||
import VuePerfectScrollbar from 'vue-perfect-scrollbar'
|
||||
import Ripple from 'vue-ripple-directive'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BNavItemDropdown,
|
||||
BBadge,
|
||||
BMedia,
|
||||
BLink,
|
||||
BAvatar,
|
||||
VuePerfectScrollbar,
|
||||
BButton,
|
||||
BFormCheckbox,
|
||||
},
|
||||
directives: {
|
||||
Ripple,
|
||||
},
|
||||
setup() {
|
||||
/* eslint-disable global-require */
|
||||
const notifications = [
|
||||
{
|
||||
title: 'Congratulation Sam 🎉',
|
||||
avatar: require('@/assets/images/avatars/6-small.png'),
|
||||
subtitle: 'Won the monthly best seller badge',
|
||||
type: 'light-success',
|
||||
},
|
||||
{
|
||||
title: 'New message received',
|
||||
avatar: require('@/assets/images/avatars/9-small.png'),
|
||||
subtitle: 'You have 10 unread messages',
|
||||
type: 'light-info',
|
||||
},
|
||||
{
|
||||
title: 'Revised Order 👋',
|
||||
avatar: 'MD',
|
||||
subtitle: 'MD Inc. order updated',
|
||||
type: 'light-danger',
|
||||
},
|
||||
]
|
||||
/* eslint-disable global-require */
|
||||
|
||||
const systemNotifications = [
|
||||
{
|
||||
title: 'Server down',
|
||||
subtitle: 'USA Server is down due to hight CPU usage',
|
||||
type: 'light-danger',
|
||||
icon: 'XIcon',
|
||||
},
|
||||
{
|
||||
title: 'Sales report generated',
|
||||
subtitle: 'Last month sales report generated',
|
||||
type: 'light-success',
|
||||
icon: 'CheckIcon',
|
||||
},
|
||||
{
|
||||
title: 'High memory usage',
|
||||
subtitle: 'BLR Server using high memory',
|
||||
type: 'light-warning',
|
||||
icon: 'AlertTriangleIcon',
|
||||
},
|
||||
]
|
||||
|
||||
const perfectScrollbarSettings = {
|
||||
maxScrollbarLength: 60,
|
||||
wheelPropagation: false,
|
||||
}
|
||||
|
||||
return {
|
||||
notifications,
|
||||
systemNotifications,
|
||||
perfectScrollbarSettings,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -1,162 +0,0 @@
|
||||
<template>
|
||||
<b-nav-item-dropdown
|
||||
right
|
||||
toggle-class="d-flex align-items-center dropdown-user-link"
|
||||
class="dropdown-user"
|
||||
>
|
||||
<template #button-content>
|
||||
<div class="d-sm-flex d-none user-nav">
|
||||
<p class="user-name font-weight-bolder mb-0">
|
||||
{{ userData.fullName || userData.username }}
|
||||
</p>
|
||||
<span class="user-status">{{ userData.role }}</span>
|
||||
</div>
|
||||
<b-avatar
|
||||
size="40"
|
||||
:src="userData.avatar"
|
||||
variant="light-primary"
|
||||
badge
|
||||
class="badge-minimal"
|
||||
badge-variant="success"
|
||||
>
|
||||
<feather-icon
|
||||
v-if="!userData.fullName"
|
||||
icon="UserIcon"
|
||||
size="22"
|
||||
/>
|
||||
</b-avatar>
|
||||
</template>
|
||||
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'pages-profile'}"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="UserIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Profile</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'apps-email' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="MailIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Inbox</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'apps-todo' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="CheckSquareIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Task</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'apps-chat' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="MessageSquareIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Chat</span>
|
||||
</b-dropdown-item>
|
||||
|
||||
<b-dropdown-divider />
|
||||
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'pages-account-setting' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="SettingsIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Settings</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'pages-pricing' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="CreditCardIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Pricing</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
:to="{ name: 'pages-faq' }"
|
||||
link-class="d-flex align-items-center"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="HelpCircleIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>FAQ</span>
|
||||
</b-dropdown-item>
|
||||
<b-dropdown-item
|
||||
link-class="d-flex align-items-center"
|
||||
@click="logout"
|
||||
>
|
||||
<feather-icon
|
||||
size="16"
|
||||
icon="LogOutIcon"
|
||||
class="mr-50"
|
||||
/>
|
||||
<span>Logout</span>
|
||||
</b-dropdown-item></b-nav-item-dropdown>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
BNavItemDropdown, BDropdownItem, BDropdownDivider, BAvatar,
|
||||
} from 'bootstrap-vue'
|
||||
import { initialAbility } from '@/libs/acl/config'
|
||||
import useJwt from '@/auth/jwt/useJwt'
|
||||
import { avatarText } from '@core/utils/filter'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BNavItemDropdown,
|
||||
BDropdownItem,
|
||||
BDropdownDivider,
|
||||
BAvatar,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
userData: JSON.parse(localStorage.getItem('userData')),
|
||||
avatarText,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
logout() {
|
||||
// Remove userData from localStorage
|
||||
// ? You just removed token from localStorage. If you like, you can also make API call to backend to blacklist used token
|
||||
localStorage.removeItem(useJwt.jwtConfig.storageTokenKeyName)
|
||||
localStorage.removeItem(useJwt.jwtConfig.storageRefreshTokenKeyName)
|
||||
|
||||
// Remove userData from localStorage
|
||||
localStorage.removeItem('userData')
|
||||
|
||||
// Reset ability
|
||||
this.$ability.update(initialAbility)
|
||||
|
||||
// Redirect to login page
|
||||
this.$router.push({ name: 'auth-login' })
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
@ -1,295 +0,0 @@
|
||||
/* eslint-disable */
|
||||
// prettier-ignore
|
||||
export default {
|
||||
pages: {
|
||||
key: 'title',
|
||||
data: [
|
||||
{ title: 'Access Control', route: { name: 'access-control' }, icon: 'ShieldIcon', isBookmarked: false },
|
||||
{ title: 'Account Settings', route: { name: 'pages-account-setting' }, icon: 'SettingsIcon', isBookmarked: false },
|
||||
{ title: 'Advance Card', route: { name: 'card-advance' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Alerts', route: { name: 'components-alert' }, icon: 'AlertTriangleIcon', isBookmarked: false },
|
||||
{ title: 'Analytics Cards', route: { name: 'card-analytic' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Apex Chart', route: { name: 'charts-apex-chart' }, icon: 'PieChartIcon', isBookmarked: false },
|
||||
{ title: 'Aspect', route: { name: 'components-aspect' }, icon: 'AirplayIcon', isBookmarked: false },
|
||||
{ title: 'Auto Suggest', route: { name: 'extensions-auto-suggest' }, icon: 'AlignLeftIcon', isBookmarked: false },
|
||||
{ title: 'Avatar', route: { name: 'components-avatar' }, icon: 'UserIcon', isBookmarked: false },
|
||||
{ title: 'Badge', route: { name: 'components-badge' }, icon: 'TagIcon', isBookmarked: false },
|
||||
{ title: 'Basic Card', route: { name: 'card-basic' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Blog Detail', route: { name: 'pages-blog-detail', params: { id: 1 } }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Blog Edit', route: { name: 'pages-blog-edit', params: { id: 1 } }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Blog List', route: { name: 'pages-blog-list' }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Breadcrumb', route: { name: 'components-breadcrumb' }, icon: 'HomeIcon', isBookmarked: false },
|
||||
{ title: 'BS Table', route: { name: 'table-bs-table' }, icon: 'GridIcon', isBookmarked: false },
|
||||
{ title: 'Button Group', route: { name: 'components-button-group' }, icon: 'BoldIcon', isBookmarked: false },
|
||||
{ title: 'Button Toolbar', route: { name: 'components-button-toolbar' }, icon: 'BoldIcon', isBookmarked: false },
|
||||
{ title: 'Button', route: { name: 'components-button' }, icon: 'BoldIcon', isBookmarked: false },
|
||||
{ title: 'Calendar App', route: { name: 'apps-calendar' }, icon: 'CalendarIcon', isBookmarked: true },
|
||||
{ title: 'Calendar Component', route: { name: 'components-calendar' }, icon: 'CalendarIcon', isBookmarked: false },
|
||||
{ title: 'Card Actions', route: { name: 'card-action' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Carousel', route: { name: 'components-carousel' }, icon: 'CopyIcon', isBookmarked: false },
|
||||
{ title: 'Chartjs', route: { name: 'charts-chartjs' }, icon: 'PieChartIcon', isBookmarked: false },
|
||||
{ title: 'Chat', route: { name: 'apps-chat' }, icon: 'MessageSquareIcon', isBookmarked: true },
|
||||
{ title: 'Checkbox', route: { name: 'forms-element-checkbox' }, icon: 'CheckSquareIcon', isBookmarked: false },
|
||||
{ title: 'Checkout', route: { name: 'apps-e-commerce-checkout' }, icon: 'DollarSignIcon', isBookmarked: false },
|
||||
{ title: 'Clipboard', route: { name: 'extensions-clipboard' }, icon: 'ClipboardIcon', isBookmarked: false },
|
||||
{ title: 'Collapse', route: { name: 'components-collapse' }, icon: 'PlusIcon', isBookmarked: false },
|
||||
{ title: 'Colors', route: { name: 'ui-colors' }, icon: 'DropletIcon', isBookmarked: false },
|
||||
{ title: 'Coming Soon', route: { name: 'misc-coming-soon' }, icon: 'ClockIcon', isBookmarked: false },
|
||||
{ title: 'Context Menu', route: { name: 'extensions-context-menu' }, icon: 'MoreVerticalIcon', isBookmarked: false },
|
||||
{ title: 'Dashboard Analytics', route: { name: 'dashboard-analytics' }, icon: 'ActivityIcon', isBookmarked: false },
|
||||
{ title: 'Dashboard ECommerce', route: { name: 'dashboard-ecommerce' }, icon: 'ShoppingCartIcon', isBookmarked: false },
|
||||
{ title: 'Date Time Picker', route: { name: 'extensions-date-time-picker' }, icon: 'ClockIcon', isBookmarked: false },
|
||||
{ title: 'Drag & Drop', route: { name: 'extensions-drag-and-drop' }, icon: 'CopyIcon', isBookmarked: false },
|
||||
{ title: 'Dropdown', route: { name: 'components-dropdown' }, icon: 'MoreHorizontalIcon', isBookmarked: false },
|
||||
{ title: 'Echart', route: { name: 'charts-echart' }, icon: 'PieChartIcon', isBookmarked: false },
|
||||
{ title: 'Email', route: { name: 'apps-email' }, icon: 'MailIcon', isBookmarked: true },
|
||||
{ title: 'Embed', route: { name: 'components-embed' }, icon: 'TvIcon', isBookmarked: false },
|
||||
{ title: 'Error 404', route: { name: 'error-404' }, icon: 'AlertTriangleIcon', isBookmarked: false },
|
||||
{ title: 'Error', route: { name: 'misc-error' }, icon: 'AlertTriangleIcon', isBookmarked: false },
|
||||
{ title: 'FAQ', route: { name: 'pages-faq' }, icon: 'HelpCircleIcon', isBookmarked: false },
|
||||
{ title: 'Feather', route: { name: 'ui-feather' }, icon: 'FeatherIcon', isBookmarked: false },
|
||||
{ title: 'File Input', route: { name: 'forms-element-file-input' }, icon: 'FileIcon', isBookmarked: false },
|
||||
{ title: 'Forgot Password V1', route: { name: 'auth-forgot-password-v1' }, icon: 'KeyIcon', isBookmarked: false },
|
||||
{ title: 'Forgot Password V2', route: { name: 'auth-forgot-password-v2' }, icon: 'KeyIcon', isBookmarked: false },
|
||||
{ title: 'Form Datepicker', route: { name: 'forms-element-datepicker' }, icon: 'ClockIcon', isBookmarked: false },
|
||||
{ title: 'Form Layout', route: { name: 'form-layout' }, icon: 'GridIcon', isBookmarked: false },
|
||||
{ title: 'Form Rating', route: { name: 'forms-element-rating' }, icon: 'StarIcon', isBookmarked: false },
|
||||
{ title: 'Form Repeater', route: { name: 'form-repeater' }, icon: 'StarIcon', isBookmarked: false },
|
||||
{ title: 'Form Tag', route: { name: 'forms-element-tag' }, icon: 'TagIcon', isBookmarked: false },
|
||||
{ title: 'Form Timepicker', route: { name: 'forms-element-timepicker' }, icon: 'ClockIcon', isBookmarked: false },
|
||||
{ title: 'Form Validation', route: { name: 'form-validation' }, icon: 'CheckCircleIcon', isBookmarked: false },
|
||||
{ title: 'Form Wizard', route: { name: 'form-wizard' }, icon: 'GitCommitIcon', isBookmarked: false },
|
||||
{ title: 'Good Table', route: { name: 'table-good-table' }, icon: 'GridIcon', isBookmarked: false },
|
||||
{ title: 'I18n', route: { name: 'extensions-i18n' }, icon: 'GlobeIcon', isBookmarked: false },
|
||||
{ title: 'Image', route: { name: 'components-image' }, icon: 'ImageIcon', isBookmarked: false },
|
||||
{ title: 'Input Group', route: { name: 'forms-element-input-group' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Input Mask', route: { name: 'forms-element-input-mask' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Input', route: { name: 'forms-element-input' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Invoice Add', route: { name: 'apps-invoice-add' }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Invoice Edit', route: { name: 'apps-invoice-edit', params: { id: 4987 } }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Invoice List', route: { name: 'apps-invoice-list' }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Invoice Preview', route: { name: 'apps-invoice-preview', params: { id: 4987 } }, icon: 'FileTextIcon', isBookmarked: false },
|
||||
{ title: 'Knowledge Base Category', route: { name: 'pages-knowledge-base-category' }, icon: 'InfoIcon', isBookmarked: false, },
|
||||
{ title: 'Knowledge Base Question', route: { name: 'pages-knowledge-base-question' }, icon: 'InfoIcon', isBookmarked: false, },
|
||||
{ title: 'Knowledge Base', route: { name: 'pages-knowledge-base' }, icon: 'InfoIcon', isBookmarked: false },
|
||||
{ title: 'Leaflet', route: { name: 'maps-leaflet' }, icon: 'MapPinIcon', isBookmarked: false },
|
||||
{ title: 'List Group', route: { name: 'components-list-group' }, icon: 'ListIcon', isBookmarked: false },
|
||||
{ title: 'Login V1', route: { name: 'auth-login-v1' }, icon: 'LogInIcon', isBookmarked: false },
|
||||
{ title: 'Login V2', route: { name: 'auth-login-v2' }, icon: 'LogInIcon', isBookmarked: false },
|
||||
{ title: 'Media Objects', route: { name: 'components-media' }, icon: 'ImageIcon', isBookmarked: false },
|
||||
{ title: 'Modal', route: { name: 'components-modal' }, icon: 'CopyIcon', isBookmarked: false },
|
||||
{ title: 'Nav', route: { name: 'components-nav' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Not Authorized', route: { name: 'misc-not-authorized' }, icon: 'XOctagonIcon', isBookmarked: false },
|
||||
{ title: 'Overlay', route: { name: 'components-overlay' }, icon: 'CopyIcon', isBookmarked: false },
|
||||
{ title: 'Pagination Nav', route: { name: 'components-pagination-nav' }, icon: 'HashIcon', isBookmarked: false },
|
||||
{ title: 'Pagination', route: { name: 'components-pagination' }, icon: 'HashIcon', isBookmarked: false },
|
||||
{ title: 'Pill Badge', route: { name: 'components-pill-badge' }, icon: 'TagIcon', isBookmarked: false },
|
||||
{ title: 'Pill', route: { name: 'components-pill' }, icon: 'TagIcon', isBookmarked: false },
|
||||
{ title: 'Popover', route: { name: 'components-popover' }, icon: 'TagIcon', isBookmarked: false },
|
||||
{ title: 'Pricing', route: { name: 'pages-pricing' }, icon: 'DollarSignIcon', isBookmarked: false },
|
||||
{ title: 'Product Details', route: { name: 'apps-e-commerce-product-details', params: { slug: 'apple-watch-series-5-27' } }, icon: 'BoxIcon', isBookmarked: false, },
|
||||
{ title: 'Profile', route: { name: 'pages-profile' }, icon: 'UserIcon', isBookmarked: false },
|
||||
{ title: 'Progress', route: { name: 'components-progress' }, icon: 'ChevronsRightIcon', isBookmarked: false },
|
||||
{ title: 'Quill Editor', route: { name: 'extensions-quill-editor' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Radio', route: { name: 'forms-element-radio' }, icon: 'DiscIcon', isBookmarked: false },
|
||||
{ title: 'Register V1', route: { name: 'auth-register-v1' }, icon: 'UserPlusIcon', isBookmarked: false },
|
||||
{ title: 'Register V2', route: { name: 'auth-register-v2' }, icon: 'UserPlusIcon', isBookmarked: false },
|
||||
{ title: 'Reset Password V1', route: { name: 'auth-reset-password-v1' }, icon: 'KeyIcon', isBookmarked: false },
|
||||
{ title: 'Reset Password V2', route: { name: 'auth-reset-password-v2' }, icon: 'KeyIcon', isBookmarked: false },
|
||||
{ title: 'Select', route: { name: 'forms-element-select' }, icon: 'AlignCenterIcon', isBookmarked: false },
|
||||
{ title: 'Shop', route: { name: 'apps-e-commerce-shop' }, icon: 'ArchiveIcon', isBookmarked: false },
|
||||
{ title: 'Sidebar', route: { name: 'components-sidebar' }, icon: 'SidebarIcon', isBookmarked: false },
|
||||
{ title: 'Slider', route: { name: 'extensions-slider' }, icon: 'GitCommitIcon', isBookmarked: false },
|
||||
{ title: 'Spinbutton', route: { name: 'forms-element-spinbutton' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Spinner', route: { name: 'components-spinner' }, icon: 'LoaderIcon', isBookmarked: false },
|
||||
{ title: 'Statistics Cards', route: { name: 'card-statistic' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Sweet Alert', route: { name: 'extensions-sweet-alert' }, icon: 'BellIcon', isBookmarked: false },
|
||||
{ title: 'Swiper', route: { name: 'extensions-swiper' }, icon: 'ImageIcon', isBookmarked: false },
|
||||
{ title: 'Switch', route: { name: 'forms-element-switch' }, icon: 'ToggleRightIcon', isBookmarked: false },
|
||||
{ title: 'Tab', route: { name: 'components-tab' }, icon: 'CreditCardIcon', isBookmarked: false },
|
||||
{ title: 'Textarea', route: { name: 'forms-element-textarea' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Time', route: { name: 'components-time' }, icon: 'ClockIcon', isBookmarked: false },
|
||||
{ title: 'Timeline', route: { name: 'components-timeline' }, icon: 'GitCommitIcon', isBookmarked: false },
|
||||
{ title: 'Toastification', route: { name: 'extensions-toastification' }, icon: 'BellIcon', isBookmarked: false },
|
||||
{ title: 'Toasts', route: { name: 'components-toasts' }, icon: 'BellIcon', isBookmarked: false },
|
||||
{ title: 'Todo', route: { name: 'apps-todo' }, icon: 'CheckSquareIcon', isBookmarked: true },
|
||||
{ title: 'Tooltip', route: { name: 'components-tooltip' }, icon: 'CopyIcon', isBookmarked: false },
|
||||
{ title: 'Tour', route: { name: 'extensions-tour' }, icon: 'GlobeIcon', isBookmarked: false },
|
||||
// { title: 'Tree', route: { name: 'extensions-tree' }, icon: 'GitCommitIcon', isBookmarked: false },
|
||||
{ title: 'Typography', route: { name: 'ui-typography' }, icon: 'TypeIcon', isBookmarked: false },
|
||||
{ title: 'Under Maintenance', route: { name: 'misc-under-maintenance' }, icon: 'MonitorIcon', isBookmarked: false },
|
||||
{ title: 'Users Edit', route: { name: 'apps-users-edit', params: { id: 21 } }, icon: 'UserIcon', isBookmarked: false },
|
||||
{ title: 'Users List', route: { name: 'apps-users-list' }, icon: 'UserIcon', isBookmarked: false },
|
||||
{ title: 'Users View', route: { name: 'apps-users-view', params: { id: 21 } }, icon: 'UserIcon', isBookmarked: false },
|
||||
{ title: 'Vue Select', route: { name: 'extensions-vue-select' }, icon: 'AlignCenterIcon', isBookmarked: false },
|
||||
{ title: 'Wishlist', route: { name: 'apps-e-commerce-wishlist' }, icon: 'HeartIcon', isBookmarked: false },
|
||||
],
|
||||
},
|
||||
files: {
|
||||
key: 'file_name',
|
||||
data: [
|
||||
{
|
||||
file_name: "Joe's CV",
|
||||
from: 'Stacy Watson',
|
||||
icon: require('@/assets/images/icons/doc.png'),
|
||||
size: '1.7 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Passport Image',
|
||||
from: 'Ben Sinitiere',
|
||||
icon: require('@/assets/images/icons/jpg.png'),
|
||||
size: ' 52 kb',
|
||||
},
|
||||
{
|
||||
file_name: 'Questions',
|
||||
from: 'Charleen Patti',
|
||||
icon: require('@/assets/images/icons/doc.png'),
|
||||
size: '1.5 gb',
|
||||
},
|
||||
{
|
||||
file_name: 'Parenting Guide',
|
||||
from: 'Doyle Blatteau',
|
||||
icon: require('@/assets/images/icons/doc.png'),
|
||||
size: '2.3 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Class Notes',
|
||||
from: 'Gwen Greenlow',
|
||||
icon: require('@/assets/images/icons/doc.png'),
|
||||
size: ' 30 kb',
|
||||
},
|
||||
{
|
||||
file_name: 'Class Attendance',
|
||||
from: 'Tom Alred',
|
||||
icon: require('@/assets/images/icons/xls.png'),
|
||||
size: '52 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Company Salary',
|
||||
from: 'Nellie Dezan',
|
||||
icon: require('@/assets/images/icons/xls.png'),
|
||||
size: '29 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Company Logo',
|
||||
from: 'Steve Sheldon',
|
||||
icon: require('@/assets/images/icons/jpg.png'),
|
||||
size: '1.3 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Crime Rates',
|
||||
from: 'Sherlock Holmes',
|
||||
icon: require('@/assets/images/icons/xls.png'),
|
||||
size: '37 kb',
|
||||
},
|
||||
{
|
||||
file_name: 'Ulysses',
|
||||
from: 'Theresia Wrenne',
|
||||
icon: require('@/assets/images/icons/pdf.png'),
|
||||
size: '7.2 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'War and Peace',
|
||||
from: 'Goldie Highnote',
|
||||
icon: require('@/assets/images/icons/pdf.png'),
|
||||
size: '10.5 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'Vedas',
|
||||
from: 'Ajay Patel',
|
||||
icon: require('@/assets/images/icons/pdf.png'),
|
||||
size: '8.3 mb',
|
||||
},
|
||||
{
|
||||
file_name: 'The Trial',
|
||||
from: 'Sirena Linkert',
|
||||
icon: require('@/assets/images/icons/pdf.png'),
|
||||
size: '1.5 mb',
|
||||
},
|
||||
],
|
||||
},
|
||||
contacts: {
|
||||
key: 'name',
|
||||
data: [
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-4.jpg'),
|
||||
name: 'Rena Brant',
|
||||
email: 'nephrod@preany.co.uk',
|
||||
time: '21/05/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-2.jpg'),
|
||||
name: 'Mariano Packard',
|
||||
email: 'seek@sparaxis.org',
|
||||
time: '14/01/2018',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-24.jpg'),
|
||||
name: 'Risa Montufar',
|
||||
email: 'vagary@unblist.org',
|
||||
time: '10/08/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-15.jpg'),
|
||||
name: 'Maragaret Cimo',
|
||||
email: 'designed@insanely.net',
|
||||
time: '01/12/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-7.jpg'),
|
||||
name: 'Jona Prattis',
|
||||
email: 'unwieldable@unblist.org',
|
||||
time: '21/05/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-5.jpg'),
|
||||
name: 'Edmond Chicon',
|
||||
email: 'museist@anaphyte.co.uk',
|
||||
time: '15/11/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-25.jpg'),
|
||||
name: 'Abbey Darden',
|
||||
email: 'astema@defectively.co.uk',
|
||||
time: '07/05/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-10.jpg'),
|
||||
name: 'Seema Moallankamp',
|
||||
email: 'fernando@storkish.co.uk',
|
||||
time: '13/08/2017',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-2.jpg'),
|
||||
name: 'Charleen Warmington',
|
||||
email: 'furphy@cannibal.net',
|
||||
time: '11/08/1891',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-25.jpg'),
|
||||
name: 'Geri Linch',
|
||||
email: 'insignia@markab.org',
|
||||
time: '18/01/2015',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-23.jpg'),
|
||||
name: 'Shellie Muster',
|
||||
email: 'maxillary@equalize.co.uk',
|
||||
time: '26/07/2019',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-20.jpg'),
|
||||
name: 'Jesenia Vanbramer',
|
||||
email: 'hypotony@phonetist.net',
|
||||
time: '12/09/2017',
|
||||
},
|
||||
{
|
||||
img: require('@/assets/images/portrait/small/avatar-s-23.jpg'),
|
||||
name: 'Mardell Channey',
|
||||
email: 'peseta@myrica.com',
|
||||
time: '11/11/2019',
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
/* eslint-enable */
|
@ -1,216 +0,0 @@
|
||||
<template>
|
||||
<div
|
||||
class="horizontal-layout"
|
||||
:class="[layoutClasses]"
|
||||
:data-col="isNavMenuHidden ? '1-column' : null"
|
||||
style="height:inherit"
|
||||
>
|
||||
|
||||
<!-- NAVBAR -->
|
||||
<b-navbar
|
||||
:style="{
|
||||
backgroundColor: navbarType === 'static' && scrolledTo && skin === 'light' ? 'white' : null,
|
||||
boxShadow: navbarType === 'static' && scrolledTo ? 'rgba(0, 0, 0, 0.05) 0px 4px 20px 0px' : null,
|
||||
}"
|
||||
:toggleable="false"
|
||||
class="header-navbar navbar-shadow align-items-center navbar-brand-center navbar-fixed"
|
||||
:class="{'fixed-top': $store.getters['app/currentBreakPoint'] !== 'xl'}"
|
||||
>
|
||||
<slot
|
||||
name="navbar"
|
||||
:toggleVerticalMenuActive="toggleVerticalMenuActive"
|
||||
>
|
||||
<app-navbar-horizontal-layout-brand />
|
||||
<app-navbar-horizontal-layout :toggle-vertical-menu-active="toggleVerticalMenuActive" />
|
||||
</slot>
|
||||
</b-navbar>
|
||||
<!--/ NAVBAR -->
|
||||
|
||||
<div class="horizontal-menu-wrapper">
|
||||
<div
|
||||
v-if="!isNavMenuHidden"
|
||||
class="header-navbar navbar-expand-sm navbar navbar-horizontal navbar-light navbar-shadow menu-border d-none d-xl-block"
|
||||
:class="[navbarMenuTypeClass]"
|
||||
>
|
||||
<horizontal-nav-menu />
|
||||
</div>
|
||||
|
||||
<!-- Vertical Nav Menu -->
|
||||
<vertical-nav-menu
|
||||
:is-vertical-menu-active="isVerticalMenuActive"
|
||||
:toggle-vertical-menu-active="toggleVerticalMenuActive"
|
||||
class="d-block d-xl-none"
|
||||
>
|
||||
<template #header="slotProps">
|
||||
<slot
|
||||
name="vertical-menu-header"
|
||||
v-bind="slotProps"
|
||||
/>
|
||||
</template>
|
||||
</vertical-nav-menu>
|
||||
<!-- /Vertical Nav Menu -->
|
||||
</div>
|
||||
|
||||
<!-- Vertical Nav Menu Overlay -->
|
||||
<div
|
||||
class="sidenav-overlay"
|
||||
:class="overlayClasses"
|
||||
@click="isVerticalMenuActive = false"
|
||||
/>
|
||||
<!-- /Vertical Nav Menu Overlay -->
|
||||
|
||||
<!-- CONTENT -->
|
||||
<!-- CONTENT TYPE: Left -->
|
||||
<transition
|
||||
:name="routerTransition"
|
||||
mode="out-in"
|
||||
>
|
||||
<component
|
||||
:is="layoutContentRenderer"
|
||||
:key="layoutContentRenderer === 'layout-content-renderer-left' ? $route.meta.navActiveLink || $route.name : null"
|
||||
>
|
||||
<template
|
||||
v-for="(index, name) in $scopedSlots"
|
||||
v-slot:[name]="data"
|
||||
>
|
||||
<slot
|
||||
:name="name"
|
||||
v-bind="data"
|
||||
/>
|
||||
</template>
|
||||
</component>
|
||||
</transition>
|
||||
<!--/ Content -->
|
||||
<!--/ CONTENT -->
|
||||
|
||||
<!-- Footer -->
|
||||
<footer
|
||||
class="footer footer-light"
|
||||
:class="[footerTypeClass]"
|
||||
>
|
||||
<slot name="footer">
|
||||
<app-footer />
|
||||
</slot>
|
||||
</footer>
|
||||
|
||||
<slot name="customizer" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import AppBreadcrumb from '@core/layouts/components/AppBreadcrumb.vue'
|
||||
import AppNavbarHorizontalLayout from '@core/layouts/components/app-navbar/AppNavbarHorizontalLayout.vue'
|
||||
import AppNavbarHorizontalLayoutBrand from '@core/layouts/components/app-navbar/AppNavbarHorizontalLayoutBrand.vue'
|
||||
import AppFooter from '@core/layouts/components/AppFooter.vue'
|
||||
import useAppConfig from '@core/app-config/useAppConfig'
|
||||
import { BNavbar } from 'bootstrap-vue'
|
||||
import { useScrollListener } from '@core/comp-functions/misc/event-listeners'
|
||||
|
||||
import { onUnmounted } from '@vue/composition-api'
|
||||
|
||||
// Content Renderer
|
||||
import LayoutContentRendererDefault from '@core/layouts/components/layout-content-renderer/LayoutContentRendererDefault.vue'
|
||||
import LayoutContentRendererLeft from '@core/layouts/components/layout-content-renderer/LayoutContentRendererLeft.vue'
|
||||
import LayoutContentRendererLeftDetached from '@core/layouts/components/layout-content-renderer/LayoutContentRendererLeftDetached.vue'
|
||||
import useLayoutHorizontal from './useLayoutHorizontal'
|
||||
import HorizontalNavMenu from './components/horizontal-nav-menu/HorizontalNavMenu.vue'
|
||||
|
||||
// Vertical Menu
|
||||
/* eslint-disable import/order */
|
||||
import VerticalNavMenu from '@core/layouts/layout-vertical/components/vertical-nav-menu/VerticalNavMenu.vue'
|
||||
import useVerticalLayout from '@core/layouts/layout-vertical/useVerticalLayout'
|
||||
import mixinLayoutHorizontal from './mixinLayoutHorizontal'
|
||||
/* eslint-enable import/order */
|
||||
|
||||
export default {
|
||||
components: {
|
||||
AppBreadcrumb,
|
||||
AppNavbarHorizontalLayout,
|
||||
AppNavbarHorizontalLayoutBrand,
|
||||
AppFooter,
|
||||
HorizontalNavMenu,
|
||||
|
||||
BNavbar,
|
||||
|
||||
// Content Renderer
|
||||
LayoutContentRendererDefault,
|
||||
LayoutContentRendererLeft,
|
||||
LayoutContentRendererLeftDetached,
|
||||
|
||||
// Vertical Menu
|
||||
VerticalNavMenu,
|
||||
},
|
||||
mixins: [mixinLayoutHorizontal],
|
||||
computed: {
|
||||
layoutContentRenderer() {
|
||||
const rendererType = this.$route.meta.contentRenderer
|
||||
if (rendererType === 'sidebar-left') return 'layout-content-renderer-left'
|
||||
if (rendererType === 'sidebar-left-detached') return 'layout-content-renderer-left-detached'
|
||||
return 'layout-content-renderer-default'
|
||||
},
|
||||
},
|
||||
setup() {
|
||||
const {
|
||||
skin,
|
||||
navbarType,
|
||||
footerType,
|
||||
routerTransition,
|
||||
isNavMenuHidden,
|
||||
} = useAppConfig()
|
||||
|
||||
// Vertical Menu
|
||||
const {
|
||||
isVerticalMenuActive, toggleVerticalMenuActive, overlayClasses, resizeHandler,
|
||||
} = useVerticalLayout(navbarType, footerType)
|
||||
|
||||
// Resize handler
|
||||
resizeHandler()
|
||||
window.addEventListener('resize', resizeHandler)
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('resize', resizeHandler)
|
||||
})
|
||||
|
||||
const {
|
||||
navbarMenuTypeClass,
|
||||
layoutClasses,
|
||||
footerTypeClass,
|
||||
} = useLayoutHorizontal(navbarType, footerType, isVerticalMenuActive)
|
||||
|
||||
// Scroll Listener
|
||||
const { scrolledTo } = useScrollListener()
|
||||
|
||||
return {
|
||||
// skin
|
||||
skin,
|
||||
|
||||
// Layout
|
||||
layoutClasses,
|
||||
|
||||
// Navbar
|
||||
navbarType,
|
||||
navbarMenuTypeClass,
|
||||
|
||||
// Menu Hidden
|
||||
isNavMenuHidden,
|
||||
|
||||
// Router Transition
|
||||
routerTransition,
|
||||
|
||||
// Footer
|
||||
footerTypeClass,
|
||||
|
||||
// Scroll Listeners
|
||||
scrolledTo,
|
||||
|
||||
// Vertical Menu
|
||||
isVerticalMenuActive,
|
||||
toggleVerticalMenuActive,
|
||||
overlayClasses,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import "~@core/scss/base/themes/bordered-layout.scss";
|
||||
</style>
|
@ -1,25 +0,0 @@
|
||||
<template>
|
||||
<div class="navbar-container main-menu-content">
|
||||
<horizontal-nav-menu-items :items="navMenuItems" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import navMenuItems from '@/navigation/horizontal'
|
||||
import HorizontalNavMenuItems from './components/horizontal-nav-menu-items/HorizontalNavMenuItems.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HorizontalNavMenuItems,
|
||||
},
|
||||
setup() {
|
||||
return {
|
||||
navMenuItems,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@import "~@core/scss/base/core/menu/menu-types/horizontal-menu.scss";
|
||||
</style>
|
@ -1,96 +0,0 @@
|
||||
<template>
|
||||
<li
|
||||
v-if="canViewVerticalNavMenuGroup(item)"
|
||||
class="dropdown dropdown-submenu"
|
||||
:class="{
|
||||
'show': isOpen,
|
||||
'disabled': item.disabled,
|
||||
'sidebar-group-active active open': isActive,
|
||||
'openLeft': openChildDropdownOnLeft
|
||||
}"
|
||||
@mouseenter="() => updateGroupOpen(true)"
|
||||
@mouseleave="() => updateGroupOpen(false)"
|
||||
>
|
||||
<b-link
|
||||
class="dropdown-item"
|
||||
href="#"
|
||||
:class="{'dropdown-toggle': item.children}"
|
||||
@click="() => updateGroupOpen(!isOpen)"
|
||||
>
|
||||
<feather-icon :icon="item.icon || 'CircleIcon'" />
|
||||
<span class="menu-title">{{ t(item.title) }}</span>
|
||||
</b-link>
|
||||
<ul
|
||||
ref="refChildDropdown"
|
||||
class="dropdown-menu"
|
||||
>
|
||||
<component
|
||||
:is="resolveNavItemComponent(child)"
|
||||
v-for="child in item.children"
|
||||
:key="child.header || child.title"
|
||||
ref="groupChild"
|
||||
:item="child"
|
||||
/>
|
||||
</ul>
|
||||
</li>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { BLink } from 'bootstrap-vue'
|
||||
import { resolveHorizontalNavMenuItemComponent as resolveNavItemComponent } from '@core/layouts/utils'
|
||||
import { useUtils as useI18nUtils } from '@core/libs/i18n'
|
||||
import { useUtils as useAclUtils } from '@core/libs/acl'
|
||||
import HorizontalNavMenuLink from '../horizontal-nav-menu-link/HorizontalNavMenuLink.vue'
|
||||
|
||||
// Composition Function
|
||||
import useHorizontalNavMenuGroup from './useHorizontalNavMenuGroup'
|
||||
import mixinHorizontalNavMenuGroup from './mixinHorizontalNavMenuGroup'
|
||||
|
||||
export default {
|
||||
name: 'HorizontalNavMenuGroup',
|
||||
components: {
|
||||
HorizontalNavMenuLink,
|
||||
BLink,
|
||||
},
|
||||
mixins: [mixinHorizontalNavMenuGroup],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const {
|
||||
refChildDropdown,
|
||||
isActive,
|
||||
isOpen,
|
||||
updateGroupOpen,
|
||||
updateIsActive,
|
||||
openChildDropdownOnLeft,
|
||||
} = useHorizontalNavMenuGroup(props.item)
|
||||
|
||||
const { t } = useI18nUtils()
|
||||
const { canViewVerticalNavMenuGroup } = useAclUtils()
|
||||
|
||||
return {
|
||||
refChildDropdown,
|
||||
openChildDropdownOnLeft,
|
||||
resolveNavItemComponent,
|
||||
isOpen,
|
||||
isActive,
|
||||
updateGroupOpen,
|
||||
updateIsActive,
|
||||
|
||||
// ACL
|
||||
canViewVerticalNavMenuGroup,
|
||||
|
||||
// i18n
|
||||
t,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
@ -1,10 +0,0 @@
|
||||
export default {
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.updateIsActive()
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
// eslint-disable-next-line object-curly-newline
|
||||
import { ref, nextTick } from '@vue/composition-api'
|
||||
// import store from '@/store'
|
||||
import { isNavGroupActive } from '@core/layouts/utils'
|
||||
|
||||
export default function useHorizontalNavMenuGroup(item) {
|
||||
// ------------------------------------------------
|
||||
// childDropdown
|
||||
// ------------------------------------------------
|
||||
const refChildDropdown = ref(null)
|
||||
const openChildDropdownOnLeft = ref(false)
|
||||
|
||||
// ------------------------------------------------
|
||||
// isActive
|
||||
// ------------------------------------------------
|
||||
const isOpen = ref(false)
|
||||
|
||||
const updateGroupOpen = val => {
|
||||
isOpen.value = val
|
||||
if (val) {
|
||||
nextTick(() => {
|
||||
const childDropdownWidth = refChildDropdown.value.offsetWidth
|
||||
const windowContentWidth = window.innerWidth - 16
|
||||
const { left: childDropdownLeft } = refChildDropdown.value.getBoundingClientRect()
|
||||
const shallDropLeft = childDropdownLeft + childDropdownWidth - windowContentWidth
|
||||
openChildDropdownOnLeft.value = shallDropLeft > 0
|
||||
|
||||
// Add scroll to child dd if don't have much space
|
||||
|
||||
const refChildDropdownTop = refChildDropdown.value.getBoundingClientRect().top
|
||||
const refChildDropdownHeight = refChildDropdown.value.getBoundingClientRect().height
|
||||
if (window.innerHeight - refChildDropdownTop - refChildDropdownHeight - 28 < 1) {
|
||||
const maxHeight = window.innerHeight - refChildDropdownTop - 70
|
||||
refChildDropdown.value.style.maxHeight = `${maxHeight}px`
|
||||
refChildDropdown.value.style.overflowY = 'auto'
|
||||
refChildDropdown.value.style.overflowX = 'hidden'
|
||||
}
|
||||
})
|
||||
} else {
|
||||
openChildDropdownOnLeft.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------
|
||||
// isActive
|
||||
// ------------------------------------------------
|
||||
const isActive = ref(false)
|
||||
|
||||
const updateIsActive = () => {
|
||||
isActive.value = isNavGroupActive(item.children)
|
||||
}
|
||||
|
||||
return {
|
||||
isOpen,
|
||||
isActive,
|
||||
updateGroupOpen,
|
||||
updateIsActive,
|
||||
refChildDropdown,
|
||||
openChildDropdownOnLeft,
|
||||
}
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
<template>
|
||||
<li
|
||||
v-if="canViewHorizontalNavMenuHeaderGroup(item)"
|
||||
class="dropdown nav-item"
|
||||
:class="{
|
||||
'sidebar-group-active active open': isActive,
|
||||
'show': isOpen,
|
||||
}"
|
||||
@mouseenter="() => updateGroupOpen(true)"
|
||||
@mouseleave="() => updateGroupOpen(false)"
|
||||
>
|
||||
<b-link class="nav-link dropdown-toggle d-flex align-items-center">
|
||||
<feather-icon
|
||||
size="14"
|
||||
:icon="item.icon"
|
||||
/>
|
||||
<span>{{ t(item.header) }}</span>
|
||||
</b-link>
|
||||
<ul class="dropdown-menu">
|
||||
<component
|
||||
:is="resolveHorizontalNavMenuItemComponent(child)"
|
||||
v-for="child in item.children"
|
||||
:key="child.title"
|
||||
:item="child"
|
||||
/>
|
||||
</ul>
|
||||
</li>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { BLink } from 'bootstrap-vue'
|
||||
import { resolveHorizontalNavMenuItemComponent } from '@core/layouts/utils'
|
||||
import { useUtils as useAclUtils } from '@core/libs/acl'
|
||||
import { useUtils as useI18nUtils } from '@core/libs/i18n'
|
||||
import useHorizontalNavMenuHeaderGroup from './useHorizontalNavMenuHeaderGroup'
|
||||
import mixinHorizontalNavMenuHeaderGroup from './mixinHorizontalNavMenuHeaderGroup'
|
||||
|
||||
import HorizontalNavMenuGroup from '../horizontal-nav-menu-group/HorizontalNavMenuGroup.vue'
|
||||
import HorizontalNavMenuLink from '../horizontal-nav-menu-link/HorizontalNavMenuLink.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BLink,
|
||||
HorizontalNavMenuGroup,
|
||||
HorizontalNavMenuLink,
|
||||
},
|
||||
mixins: [mixinHorizontalNavMenuHeaderGroup],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const {
|
||||
isActive,
|
||||
updateIsActive,
|
||||
isOpen,
|
||||
updateGroupOpen,
|
||||
} = useHorizontalNavMenuHeaderGroup(props.item)
|
||||
|
||||
const { t } = useI18nUtils()
|
||||
const { canViewHorizontalNavMenuHeaderGroup } = useAclUtils()
|
||||
|
||||
return {
|
||||
isOpen,
|
||||
isActive,
|
||||
updateGroupOpen,
|
||||
updateIsActive,
|
||||
resolveHorizontalNavMenuItemComponent,
|
||||
|
||||
// ACL
|
||||
canViewHorizontalNavMenuHeaderGroup,
|
||||
|
||||
// i18n
|
||||
t,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
@ -1,10 +0,0 @@
|
||||
export default {
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.updateIsActive()
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
import { ref } from '@vue/composition-api'
|
||||
import { isNavGroupActive } from '@core/layouts/utils'
|
||||
|
||||
export default function useHorizontalNavMenuHeaderGroup(item) {
|
||||
// ------------------------------------------------
|
||||
// isOpen
|
||||
// ------------------------------------------------
|
||||
const isOpen = ref(false)
|
||||
|
||||
const updateGroupOpen = val => {
|
||||
// eslint-disable-next-line no-use-before-define
|
||||
isOpen.value = val
|
||||
}
|
||||
|
||||
// ------------------------------------------------
|
||||
// isActive
|
||||
// ------------------------------------------------
|
||||
const isActive = ref(false)
|
||||
|
||||
const updateIsActive = () => {
|
||||
isActive.value = isNavGroupActive(item.children)
|
||||
}
|
||||
|
||||
return {
|
||||
isOpen,
|
||||
isActive,
|
||||
updateGroupOpen,
|
||||
updateIsActive,
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
<template>
|
||||
<li
|
||||
v-if="canViewHorizontalNavMenuHeaderLink(item)"
|
||||
class="nav-item"
|
||||
:class="{'sidebar-group-active active': isActive}"
|
||||
>
|
||||
<b-link
|
||||
class="nav-link"
|
||||
:to="{ name: item.route }"
|
||||
>
|
||||
<feather-icon
|
||||
size="14"
|
||||
:icon="item.icon"
|
||||
/>
|
||||
<span>{{ t(item.title) }}</span>
|
||||
</b-link>
|
||||
</li>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { BLink } from 'bootstrap-vue'
|
||||
import { useUtils as useI18nUtils } from '@core/libs/i18n'
|
||||
import { useUtils as useAclUtils } from '@core/libs/acl'
|
||||
import useHorizontalNavMenuHeaderLink from './useHorizontalNavMenuHeaderLink'
|
||||
import mixinHorizontalNavMenuHeaderLink from './mixinHorizontalNavMenuHeaderLink'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BLink,
|
||||
},
|
||||
mixins: [mixinHorizontalNavMenuHeaderLink],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { isActive, updateIsActive } = useHorizontalNavMenuHeaderLink(props.item)
|
||||
|
||||
const { t } = useI18nUtils()
|
||||
const { canViewHorizontalNavMenuHeaderLink } = useAclUtils()
|
||||
|
||||
return {
|
||||
isActive,
|
||||
updateIsActive,
|
||||
|
||||
// ACL
|
||||
canViewHorizontalNavMenuHeaderLink,
|
||||
|
||||
// i18n
|
||||
t,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
@ -1,10 +0,0 @@
|
||||
export default {
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.updateIsActive()
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import { ref } from '@vue/composition-api'
|
||||
import { isNavLinkActive } from '@core/layouts/utils'
|
||||
|
||||
export default function useHorizontalNavMenuHeaderGroup(item) {
|
||||
// ------------------------------------------------
|
||||
// isActive
|
||||
// ------------------------------------------------
|
||||
const isActive = ref(false)
|
||||
|
||||
const updateIsActive = () => {
|
||||
isActive.value = isNavLinkActive(item)
|
||||
}
|
||||
|
||||
return {
|
||||
isActive,
|
||||
updateIsActive,
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
<template>
|
||||
<ul
|
||||
id="main-menu-navigation"
|
||||
class="nav navbar-nav"
|
||||
>
|
||||
<component
|
||||
:is="resolveNavComponent(item)"
|
||||
v-for="item in items"
|
||||
:key="item.header || item.title"
|
||||
:item="item"
|
||||
/>
|
||||
</ul>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HorizontalNavMenuHeaderLink from '../horizontal-nav-menu-header-link/HorizontalNavMenuHeaderLink.vue'
|
||||
import HorizontalNavMenuHeaderGroup from '../horizontal-nav-menu-header-group/HorizontalNavMenuHeaderGroup.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HorizontalNavMenuHeaderLink,
|
||||
HorizontalNavMenuHeaderGroup,
|
||||
},
|
||||
props: {
|
||||
items: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup() {
|
||||
const resolveNavComponent = item => {
|
||||
if (item.children) return 'horizontal-nav-menu-header-group'
|
||||
return 'horizontal-nav-menu-header-link'
|
||||
}
|
||||
|
||||
return {
|
||||
resolveNavComponent,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
@ -1,60 +0,0 @@
|
||||
<template>
|
||||
<li
|
||||
v-if="canViewHorizontalNavMenuLink(item)"
|
||||
:class="{
|
||||
'active': isActive,
|
||||
'disabled': item.disabled
|
||||
}"
|
||||
>
|
||||
<b-link
|
||||
v-bind="linkProps"
|
||||
class="dropdown-item"
|
||||
>
|
||||
<feather-icon
|
||||
:icon="item.icon || 'CircleIcon'"
|
||||
size="24"
|
||||
/>
|
||||
<span class="menu-title">{{ t(item.title) }}</span>
|
||||
</b-link>
|
||||
</li>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { BLink } from 'bootstrap-vue'
|
||||
import { useUtils as useI18nUtils } from '@core/libs/i18n'
|
||||
import { useUtils as useAclUtils } from '@core/libs/acl'
|
||||
import useHorizontalNavMenuLink from './useHorizontalNavMenuLink'
|
||||
import mixinHorizontalNavMenuLink from './mixinHorizontalNavMenuLink'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BLink,
|
||||
},
|
||||
mixins: [mixinHorizontalNavMenuLink],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
setup(props) {
|
||||
const { isActive, linkProps, updateIsActive } = useHorizontalNavMenuLink(props.item)
|
||||
|
||||
const { t } = useI18nUtils()
|
||||
const { canViewHorizontalNavMenuLink } = useAclUtils()
|
||||
|
||||
return {
|
||||
isActive,
|
||||
linkProps,
|
||||
updateIsActive,
|
||||
|
||||
// ACL
|
||||
canViewHorizontalNavMenuLink,
|
||||
|
||||
// i18n
|
||||
t,
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
</script>
|
@ -1,10 +0,0 @@
|
||||
export default {
|
||||
watch: {
|
||||
$route: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.updateIsActive()
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import { ref } from '@vue/composition-api'
|
||||
import { isNavLinkActive, navLinkProps } from '@core/layouts/utils'
|
||||
|
||||
export default function useHorizontalNavMenuLink(item) {
|
||||
const isActive = ref(false)
|
||||
|
||||
const linkProps = navLinkProps(item)
|
||||
|
||||
const updateIsActive = () => {
|
||||
isActive.value = isNavLinkActive(item)
|
||||
}
|
||||
|
||||
return {
|
||||
isActive,
|
||||
linkProps,
|
||||
updateIsActive,
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
import { $themeBreakpoints } from '@themeConfig'
|
||||
|
||||
export default {
|
||||
watch: {
|
||||
$route() {
|
||||
if (this.$store.state.app.windowWidth < $themeBreakpoints.xl) {
|
||||
this.isVerticalMenuActive = false
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
import { computed } from '@vue/composition-api'
|
||||
import store from '@/store'
|
||||
|
||||
export default function useLayoutHorizontal(navbarMenuType, footerType, isVerticalMenuActive) {
|
||||
const currentBreakpoint = computed(() => store.getters['app/currentBreakPoint'])
|
||||
|
||||
const layoutClasses = computed(() => {
|
||||
const classes = []
|
||||
|
||||
if (currentBreakpoint.value === 'xl') {
|
||||
classes.push('horizontal-menu')
|
||||
} else {
|
||||
classes.push('vertical-overlay-menu')
|
||||
// classes.push('vertical-layout')
|
||||
classes.push(isVerticalMenuActive.value ? 'menu-open' : 'menu-hide')
|
||||
}
|
||||
|
||||
// Navbar
|
||||
classes.push(`navbar-${navbarMenuType.value}`)
|
||||
|
||||
// Footer
|
||||
if (footerType.value === 'sticky') classes.push('footer-fixed')
|
||||
if (footerType.value === 'static') classes.push('footer-static')
|
||||
if (footerType.value === 'hidden') classes.push('footer-hidden')
|
||||
|
||||
return classes
|
||||
})
|
||||
|
||||
// const resizeHandler = () => {
|
||||
// isVerticalMenuActive.value = window.innerWidth >= 1200
|
||||
|
||||
// if (window.innerWidth >= 1200) currentBreakpoint.value = 'xl'
|
||||
// else if (window.innerWidth >= 992) currentBreakpoint.value = 'lg'
|
||||
// else if (window.innerWidth >= 768) currentBreakpoint.value = 'md'
|
||||
// else if (window.innerWidth >= 576) currentBreakpoint.value = 'sm'
|
||||
// else currentBreakpoint.value = 'xs'
|
||||
// }
|
||||
|
||||
const navbarMenuTypeClass = computed(() => {
|
||||
if (navbarMenuType.value === 'sticky') return 'fixed-top'
|
||||
if (navbarMenuType.value === 'static') return ''
|
||||
if (navbarMenuType.value === 'hidden') return 'd-none'
|
||||
return 'floating-nav'
|
||||
})
|
||||
|
||||
const footerTypeClass = computed(() => {
|
||||
if (footerType.value === 'static') return 'footer-static'
|
||||
if (footerType.value === 'hidden') return 'd-none'
|
||||
return ''
|
||||
})
|
||||
|
||||
return {
|
||||
layoutClasses,
|
||||
navbarMenuTypeClass,
|
||||
footerTypeClass,
|
||||
}
|
||||
}
|
@ -22,13 +22,11 @@ import { useWindowSize, useCssVar } from '@vueuse/core'
|
||||
import store from '@/store'
|
||||
|
||||
const LayoutVertical = () => import('@/layouts/vertical/LayoutVertical.vue')
|
||||
const LayoutHorizontal = () => import('@/layouts/horizontal/LayoutHorizontal.vue')
|
||||
const LayoutFull = () => import('@/layouts/full/LayoutFull.vue')
|
||||
|
||||
export default {
|
||||
components: {
|
||||
// Layouts
|
||||
LayoutHorizontal,
|
||||
LayoutVertical,
|
||||
LayoutFull,
|
||||
},
|
||||
@ -54,7 +52,7 @@ export default {
|
||||
}
|
||||
|
||||
// Set Theme Breakpoints
|
||||
const breakpoints = ['xs', 'sm', 'md', 'lg', 'xl']
|
||||
const breakpoints = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl']
|
||||
|
||||
// eslint-disable-next-line no-plusplus
|
||||
for (let i = 0, len = breakpoints.length; i < len; i++) {
|
||||
|
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 6.4 KiB |
@ -1,170 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150" xml:space="preserve"> <image id="image0" width="150" height="150" x="0" y="0"
|
||||
href="data:image/png;base64,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" />
|
||||
</svg>
|
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 3.4 KiB |
@ -1 +0,0 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="facebook-f" class="svg-inline--fa fa-facebook-f fa-w-9" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 264 512"><path fill="currentColor" d="M215.8 85H264V3.6C255.7 2.5 227.1 0 193.8 0 124.3 0 76.7 42.4 76.7 120.3V192H0v91h76.7v229h94V283h73.6l11.7-91h-85.3v-62.7c0-26.3 7.3-44.3 45.1-44.3z"></path></svg>
|
Before Width: | Height: | Size: 388 B |
@ -1 +0,0 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="github-alt" class="svg-inline--fa fa-github-alt fa-w-15" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><path fill="currentColor" d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"></path></svg>
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1 +0,0 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="google" class="svg-inline--fa fa-google fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 488 512"><path fill="currentColor" d="M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z"></path></svg>
|
Before Width: | Height: | Size: 479 B |
@ -1 +0,0 @@
|
||||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="twitter" class="svg-inline--fa fa-twitter fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>
|
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 41 KiB |
@ -1,5 +0,0 @@
|
||||
import useJwt from '@core/auth/jwt/useJwt'
|
||||
import axios from '@axios'
|
||||
|
||||
const { jwt } = useJwt(axios, {})
|
||||
export default jwt
|
@ -1,27 +0,0 @@
|
||||
import useJwt from '@/auth/jwt/useJwt'
|
||||
|
||||
/**
|
||||
* Return if user is logged in
|
||||
* This is completely up to you and how you want to store the token in your frontend application
|
||||
* e.g. If you are using cookies to store the application please update this function
|
||||
*/
|
||||
// eslint-disable-next-line arrow-body-style
|
||||
export const isUserLoggedIn = () => {
|
||||
return localStorage.getItem('userData') && localStorage.getItem(useJwt.jwtConfig.storageTokenKeyName)
|
||||
}
|
||||
|
||||
export const getUserData = () => JSON.parse(localStorage.getItem('userData'))
|
||||
|
||||
/**
|
||||
* This function is used for demo purpose route navigation
|
||||
* In real app you won't need this function because your app will navigate to same route for each users regardless of ability
|
||||
* Please note role field is just for showing purpose it's not used by anything in frontend
|
||||
* We are checking role just for ease
|
||||
* NOTE: If you have different pages to navigate based on user ability then this function can be useful. However, you need to update it.
|
||||
* @param {String} userRole Role of user
|
||||
*/
|
||||
export const getHomeRouteForLoggedInUser = userRole => {
|
||||
if (userRole === 'admin') return '/'
|
||||
if (userRole === 'client') return { name: 'access-control' }
|
||||
return { name: 'auth-login' }
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
<template>
|
||||
<layout-horizontal>
|
||||
|
||||
<router-view />
|
||||
|
||||
<template #navbar="{ toggleVerticalMenuActive }">
|
||||
<app-navbar-horizontal-layout-brand />
|
||||
<navbar :toggle-vertical-menu-active="toggleVerticalMenuActive" />
|
||||
</template>
|
||||
|
||||
<!-- <app-customizer
|
||||
v-if="showCustomizer"
|
||||
slot="customizer"
|
||||
/> -->
|
||||
</layout-horizontal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LayoutHorizontal from '@core/layouts/layout-horizontal/LayoutHorizontal.vue'
|
||||
// import AppCustomizer from '@core/layouts/components/app-customizer/AppCustomizer.vue'
|
||||
// import { $themeConfig } from '@themeConfig'
|
||||
import AppNavbarHorizontalLayoutBrand from '@core/layouts/components/app-navbar/AppNavbarHorizontalLayoutBrand.vue'
|
||||
import Navbar from '../components/Navbar.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LayoutHorizontal,
|
||||
// AppCustomizer,
|
||||
Navbar,
|
||||
AppNavbarHorizontalLayoutBrand,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// showCustomizer: $themeConfig.layout.customizer,
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
@ -1,11 +0,0 @@
|
||||
import { Ability } from '@casl/ability'
|
||||
import { initialAbility } from './config'
|
||||
|
||||
// Read ability from localStorage
|
||||
// * Handles auto fetching previous abilities if already logged in user
|
||||
// ? You can update this if you store user abilities to more secure place
|
||||
// ! Anyone can update localStorage so be careful and please update this
|
||||
const userData = JSON.parse(localStorage.getItem('userData'))
|
||||
const existingAbility = userData ? userData.ability : null
|
||||
|
||||
export default new Ability(existingAbility || initialAbility)
|
@ -1,8 +0,0 @@
|
||||
export const initialAbility = [
|
||||
{
|
||||
action: 'read',
|
||||
subject: 'Auth',
|
||||
},
|
||||
]
|
||||
|
||||
export const _ = undefined
|
@ -1,5 +0,0 @@
|
||||
import Vue from 'vue'
|
||||
import { abilitiesPlugin } from '@casl/vue'
|
||||
import ability from './ability'
|
||||
|
||||
Vue.use(abilitiesPlugin, ability)
|
@ -1,5 +0,0 @@
|
||||
import ability from './ability'
|
||||
|
||||
export const canNavigate = to => to.matched.some(route => ability.can(route.meta.action || 'read', route.meta.resource))
|
||||
|
||||
export const _ = undefined
|
133168
src/libs/es6.js
@ -11,7 +11,7 @@ export const $themeConfig = {
|
||||
app: {
|
||||
appName: 'PING.PUB', // Will update name in navigation menu (Branding)
|
||||
// eslint-disable-next-line global-require
|
||||
appLogoImage: require('@/assets/images/logo/logo.svg'), // Will update logo in navigation menu (Branding)
|
||||
appLogoImage: '/logo.svg', // Will update logo in navigation menu (Branding)
|
||||
},
|
||||
layout: {
|
||||
isRTL: false,
|
||||
|