diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue index d5382b264..d25fe43a2 100644 --- a/src/components/Navbar.vue +++ b/src/components/Navbar.vue @@ -32,7 +32,7 @@ defineEmits(['toggle-drawer']); - + New customer diff --git a/src/components/UserPanel.vue b/src/components/UserPanel.vue index 679ec6859..1d97bfbc9 100644 --- a/src/components/UserPanel.vue +++ b/src/components/UserPanel.vue @@ -3,14 +3,15 @@ import { onMounted, computed } from 'vue'; import { Dark, useQuasar } from 'quasar'; import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; -import axios from 'axios'; import { useState } from 'src/composables/useState'; import { useSession } from 'src/composables/useSession'; +import { useRole } from 'src/composables/useRole'; const quasar = useQuasar(); const state = useState(); const session = useSession(); +const role = useRole(); const router = useRouter(); const { t, locale } = useI18n(); @@ -28,11 +29,10 @@ const token = session.getToken(); onMounted(async () => { try { - const { data } = await axios.get('/api/accounts/acl'); - const roles = data.roles.map(userRoles => userRoles.role.name); - - state.setUser(data.user); - state.setRoles(roles); + const stateRoles = state.getRoles().value + if (stateRoles.length === 0) { + await role.fetch(); + } } catch (error) { quasar.notify({ message: t('errors.statusUnauthorized'), diff --git a/src/composables/useRole.js b/src/composables/useRole.js index 8d9ae8b8d..5cf4c3e29 100644 --- a/src/composables/useRole.js +++ b/src/composables/useRole.js @@ -1,9 +1,20 @@ import { useState } from './useState'; +import axios from 'axios'; + + +const state = useState(); export function useRole() { + async function fetch() { + const { data } = await axios.get('/api/accounts/acl'); + const roles = data.roles.map(userRoles => userRoles.role.name); + + state.setUser(data.user); + state.setRoles(roles); + } + function hasAny(roles) { - const { getRoles } = useState(); - const roleStore = getRoles(); + const roleStore = state.getRoles(); for (const role of roles) { if (roleStore.value.indexOf(role) !== -1) return true; @@ -13,6 +24,7 @@ export function useRole() { } return { + fetch, hasAny, }; } diff --git a/src/composables/useSession.js b/src/composables/useSession.js index 3a60c33b9..e52829ba7 100644 --- a/src/composables/useSession.js +++ b/src/composables/useSession.js @@ -1,4 +1,5 @@ import { useState } from './useState'; +import { useRole } from './useRole'; export function useSession() { function getToken() { @@ -29,6 +30,14 @@ export function useSession() { }); } + async function login(token, keepLogin) { + const { fetch } = useRole(); + + setToken({ token, keepLogin }); + + await fetch(); + } + function isLoggedIn() { const localToken = localStorage.getItem('token'); const sessionToken = sessionStorage.getItem('token'); @@ -40,6 +49,7 @@ export function useSession() { getToken, setToken, destroy, + login, isLoggedIn, }; } diff --git a/src/pages/Customer/Card/CustomerBasicData.vue b/src/pages/Customer/Card/CustomerBasicData.vue index 97af8c637..b4e913ad5 100644 --- a/src/pages/Customer/Card/CustomerBasicData.vue +++ b/src/pages/Customer/Card/CustomerBasicData.vue @@ -1,3 +1,3 @@ \ No newline at end of file diff --git a/src/pages/Customer/Card/CustomerCard.vue b/src/pages/Customer/Card/CustomerCard.vue index d386fb094..152c8cfdc 100644 --- a/src/pages/Customer/Card/CustomerCard.vue +++ b/src/pages/Customer/Card/CustomerCard.vue @@ -4,7 +4,7 @@ - + Descriptor diff --git a/src/pages/Dashboard/Dashboard.vue b/src/pages/Dashboard/Dashboard.vue index 3b1ac8f33..f02d33f3f 100644 --- a/src/pages/Dashboard/Dashboard.vue +++ b/src/pages/Dashboard/Dashboard.vue @@ -1,13 +1,9 @@ @@ -19,9 +15,8 @@ const isSalesPerson = computed(() => hasAny(['salesPerson'])); rounded class="bg-orange text-white q-mb-lg" > - {{ isSalesPerson }} + Employee notification message diff --git a/src/pages/Login/Login.vue b/src/pages/Login/Login.vue index 2c18a4283..a49222ab4 100644 --- a/src/pages/Login/Login.vue +++ b/src/pages/Login/Login.vue @@ -32,17 +32,19 @@ async function onSubmit() { password: password.value, }); - session.setToken({ - token: data.token, - keepLogin: keepLogin.value, - }); + await session.login(data.token, keepLogin.value); quasar.notify({ message: t('login.loginSuccess'), type: 'positive', }); - await router.push({ path: '/dashboard' }); + const currentRoute = router.currentRoute.value; + if (currentRoute.query && currentRoute.query.redirect) { + router.push(currentRoute.query.redirect); + } else { + router.push({ name: 'Dashboard' }); + } } catch (error) { if (axios.isAxiosError(error)) { const errorCode = error.response && error.response.status; diff --git a/src/router/index.js b/src/router/index.js index 476d34a81..221671eb0 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -36,18 +36,18 @@ export default route(function (/* { store, ssrContext } */) { Router.beforeEach((to, from, next) => { const { isLoggedIn } = session; - if (!isLoggedIn && to.name !== 'Login') { - next({ path: '/login', query: { redirect: to.fullPath } }); + if (!isLoggedIn() && to.name !== 'Login') { + next({ name: 'Login', query: { redirect: to.fullPath } }); } else { - const pathRoutes = to.matched; - const droles = pathRoutes.every(route => { + const matches = to.matched; + const hasRequiredRoles = matches.every(route => { const meta = route.meta; - if (meta.roles) + if (meta && meta.roles) return role.hasAny(meta.roles) return true; }); - if (droles) { + if (hasRequiredRoles) { next(); } else { next({ path: '/' }); diff --git a/src/router/routes.js b/src/router/routes.js index e40a9ef89..d4b63df1d 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -6,7 +6,7 @@ const routes = [ path: '/login', name: 'Login', meta: { title: 'logIn' }, - component: () => import('../pages/Login/Login.vue'), + component: () => import('../pages/Login/Login.vue') }, { path: '/',