remove unused files

This commit is contained in:
liangping 2022-05-05 12:01:00 +08:00
parent b7f269cb35
commit e033e8f75b
95 changed files with 2 additions and 135395 deletions

View File

@ -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>

View File

@ -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>

View File

@ -35,10 +35,8 @@
import { import {
BLink, BNavbarNav, BLink, BNavbarNav,
} from 'bootstrap-vue' } from 'bootstrap-vue'
import Bookmarks from './components/Bookmarks.vue'
import SearchBar from './components/SearchBar.vue' import SearchBar from './components/SearchBar.vue'
import DarkToggler from './components/DarkToggler.vue' import DarkToggler from './components/DarkToggler.vue'
import NotificationDropdown from './components/NotificationDropdown.vue'
export default { export default {
components: { components: {
@ -46,10 +44,8 @@ export default {
// Navbar Components // Navbar Components
BNavbarNav, BNavbarNav,
Bookmarks,
SearchBar, SearchBar,
DarkToggler, DarkToggler,
NotificationDropdown,
}, },
props: { props: {
toggleVerticalMenuActive: { toggleVerticalMenuActive: {

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 */

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,10 +0,0 @@
export default {
watch: {
$route: {
immediate: true,
handler() {
this.updateIsActive()
},
},
},
}

View File

@ -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,
}
}

View File

@ -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>

View File

@ -1,10 +0,0 @@
export default {
watch: {
$route: {
immediate: true,
handler() {
this.updateIsActive()
},
},
},
}

View File

@ -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,
}
}

View File

@ -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>

View File

@ -1,10 +0,0 @@
export default {
watch: {
$route: {
immediate: true,
handler() {
this.updateIsActive()
},
},
},
}

View File

@ -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,
}
}

View File

@ -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>

View File

@ -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>

View File

@ -1,10 +0,0 @@
export default {
watch: {
$route: {
immediate: true,
handler() {
this.updateIsActive()
},
},
},
}

View File

@ -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,
}
}

View File

@ -1,11 +0,0 @@
import { $themeBreakpoints } from '@themeConfig'
export default {
watch: {
$route() {
if (this.$store.state.app.windowWidth < $themeBreakpoints.xl) {
this.isVerticalMenuActive = false
}
},
},
}

View File

@ -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,
}
}

View File

@ -22,13 +22,11 @@ import { useWindowSize, useCssVar } from '@vueuse/core'
import store from '@/store' import store from '@/store'
const LayoutVertical = () => import('@/layouts/vertical/LayoutVertical.vue') const LayoutVertical = () => import('@/layouts/vertical/LayoutVertical.vue')
const LayoutHorizontal = () => import('@/layouts/horizontal/LayoutHorizontal.vue')
const LayoutFull = () => import('@/layouts/full/LayoutFull.vue') const LayoutFull = () => import('@/layouts/full/LayoutFull.vue')
export default { export default {
components: { components: {
// Layouts // Layouts
LayoutHorizontal,
LayoutVertical, LayoutVertical,
LayoutFull, LayoutFull,
}, },
@ -54,7 +52,7 @@ export default {
} }
// Set Theme Breakpoints // Set Theme Breakpoints
const breakpoints = ['xs', 'sm', 'md', 'lg', 'xl'] const breakpoints = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl']
// eslint-disable-next-line no-plusplus // eslint-disable-next-line no-plusplus
for (let i = 0, len = breakpoints.length; i < len; i++) { for (let i = 0, len = breakpoints.length; i < len; i++) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

View File

@ -1,5 +0,0 @@
import useJwt from '@core/auth/jwt/useJwt'
import axios from '@axios'
const { jwt } = useJwt(axios, {})
export default jwt

View File

@ -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' }
}

View File

@ -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>

View File

@ -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)

View File

@ -1,8 +0,0 @@
export const initialAbility = [
{
action: 'read',
subject: 'Auth',
},
]
export const _ = undefined

View File

@ -1,5 +0,0 @@
import Vue from 'vue'
import { abilitiesPlugin } from '@casl/vue'
import ability from './ability'
Vue.use(abilitiesPlugin, ability)

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@ export const $themeConfig = {
app: { app: {
appName: 'PING.PUB', // Will update name in navigation menu (Branding) appName: 'PING.PUB', // Will update name in navigation menu (Branding)
// eslint-disable-next-line global-require // 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: { layout: {
isRTL: false, isRTL: false,