0
0
Fork 0

Router improvements and load roles on login

This commit is contained in:
Joan Sanchez 2022-04-05 16:30:53 +02:00
parent f20cd84df9
commit 7f3010869b
10 changed files with 49 additions and 30 deletions

View File

@ -32,7 +32,7 @@ defineEmits(['toggle-drawer']);
<q-icon name="arrow_drop_down" size="s" /> <q-icon name="arrow_drop_down" size="s" />
<q-menu> <q-menu>
<q-list style="min-width: 150px"> <q-list style="min-width: 150px">
<q-item clickable> <q-item :to="{ path: '/customer/create' }" clickable>
<q-item-section>New customer</q-item-section> <q-item-section>New customer</q-item-section>
</q-item> </q-item>
<q-item clickable> <q-item clickable>

View File

@ -3,14 +3,15 @@ import { onMounted, computed } from 'vue';
import { Dark, useQuasar } from 'quasar'; import { Dark, useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import axios from 'axios';
import { useState } from 'src/composables/useState'; import { useState } from 'src/composables/useState';
import { useSession } from 'src/composables/useSession'; import { useSession } from 'src/composables/useSession';
import { useRole } from 'src/composables/useRole';
const quasar = useQuasar(); const quasar = useQuasar();
const state = useState(); const state = useState();
const session = useSession(); const session = useSession();
const role = useRole();
const router = useRouter(); const router = useRouter();
const { t, locale } = useI18n(); const { t, locale } = useI18n();
@ -28,11 +29,10 @@ const token = session.getToken();
onMounted(async () => { onMounted(async () => {
try { try {
const { data } = await axios.get('/api/accounts/acl'); const stateRoles = state.getRoles().value
const roles = data.roles.map(userRoles => userRoles.role.name); if (stateRoles.length === 0) {
await role.fetch();
state.setUser(data.user); }
state.setRoles(roles);
} catch (error) { } catch (error) {
quasar.notify({ quasar.notify({
message: t('errors.statusUnauthorized'), message: t('errors.statusUnauthorized'),

View File

@ -1,9 +1,20 @@
import { useState } from './useState'; import { useState } from './useState';
import axios from 'axios';
const state = useState();
export function useRole() { 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) { function hasAny(roles) {
const { getRoles } = useState(); const roleStore = state.getRoles();
const roleStore = getRoles();
for (const role of roles) { for (const role of roles) {
if (roleStore.value.indexOf(role) !== -1) return true; if (roleStore.value.indexOf(role) !== -1) return true;
@ -13,6 +24,7 @@ export function useRole() {
} }
return { return {
fetch,
hasAny, hasAny,
}; };
} }

View File

@ -1,4 +1,5 @@
import { useState } from './useState'; import { useState } from './useState';
import { useRole } from './useRole';
export function useSession() { export function useSession() {
function getToken() { function getToken() {
@ -29,6 +30,14 @@ export function useSession() {
}); });
} }
async function login(token, keepLogin) {
const { fetch } = useRole();
setToken({ token, keepLogin });
await fetch();
}
function isLoggedIn() { function isLoggedIn() {
const localToken = localStorage.getItem('token'); const localToken = localStorage.getItem('token');
const sessionToken = sessionStorage.getItem('token'); const sessionToken = sessionStorage.getItem('token');
@ -40,6 +49,7 @@ export function useSession() {
getToken, getToken,
setToken, setToken,
destroy, destroy,
login,
isLoggedIn, isLoggedIn,
}; };
} }

View File

@ -1,3 +1,3 @@
<template> <template>
<q-card>asd</q-card> <q-card>Basic Data</q-card>
</template> </template>

View File

@ -4,7 +4,7 @@
<q-card square> <q-card square>
<router-link :to="{ path: '/customer/list' }"> <router-link :to="{ path: '/customer/list' }">
<q-icon name="arrow_back" size="md" color="primary" /> <q-icon name="arrow_back" size="md" color="primary" />
</router-link> </router-link>Descriptor
</q-card> </q-card>
</div> </div>

View File

@ -1,13 +1,9 @@
<script setup> <script setup>
import { ref, computed } from 'vue'; import { ref } from 'vue';
import { useRole } from '/src/composables/useRole';
const slide = ref('style'); const slide = ref('style');
const slideText = 'Description text'; const slideText = 'Description text';
const { hasAny } = useRole();
const isSalesPerson = computed(() => hasAny(['salesPerson']));
</script> </script>
@ -19,9 +15,8 @@ const isSalesPerson = computed(() => hasAny(['salesPerson']));
rounded rounded
class="bg-orange text-white q-mb-lg" class="bg-orange text-white q-mb-lg"
> >
{{ isSalesPerson }} Employee notification message
<template #action> <template #action>
<q-btn flat label="Turn ON Wifi" />
<q-btn flat label="Dismiss" /> <q-btn flat label="Dismiss" />
</template> </template>
</q-banner> </q-banner>

View File

@ -32,17 +32,19 @@ async function onSubmit() {
password: password.value, password: password.value,
}); });
session.setToken({ await session.login(data.token, keepLogin.value);
token: data.token,
keepLogin: keepLogin.value,
});
quasar.notify({ quasar.notify({
message: t('login.loginSuccess'), message: t('login.loginSuccess'),
type: 'positive', 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) { } catch (error) {
if (axios.isAxiosError(error)) { if (axios.isAxiosError(error)) {
const errorCode = error.response && error.response.status; const errorCode = error.response && error.response.status;

View File

@ -36,18 +36,18 @@ export default route(function (/* { store, ssrContext } */) {
Router.beforeEach((to, from, next) => { Router.beforeEach((to, from, next) => {
const { isLoggedIn } = session; const { isLoggedIn } = session;
if (!isLoggedIn && to.name !== 'Login') { if (!isLoggedIn() && to.name !== 'Login') {
next({ path: '/login', query: { redirect: to.fullPath } }); next({ name: 'Login', query: { redirect: to.fullPath } });
} else { } else {
const pathRoutes = to.matched; const matches = to.matched;
const droles = pathRoutes.every(route => { const hasRequiredRoles = matches.every(route => {
const meta = route.meta; const meta = route.meta;
if (meta.roles) if (meta && meta.roles)
return role.hasAny(meta.roles) return role.hasAny(meta.roles)
return true; return true;
}); });
if (droles) { if (hasRequiredRoles) {
next(); next();
} else { } else {
next({ path: '/' }); next({ path: '/' });

View File

@ -6,7 +6,7 @@ const routes = [
path: '/login', path: '/login',
name: 'Login', name: 'Login',
meta: { title: 'logIn' }, meta: { title: 'logIn' },
component: () => import('../pages/Login/Login.vue'), component: () => import('../pages/Login/Login.vue')
}, },
{ {
path: '/', path: '/',