Files
mbmanager-dashboard/src/router/index.js
T
2026-08-19 04:23:18 +03:30

247 lines
9.2 KiB
JavaScript

import AppLayout from '@/layout/AppLayout.vue';
import { createRouter, createWebHistory } from 'vue-router';
import axios from 'axios';
import Cookies from 'js-cookie';
const loginGuard = async (to, from, next) => {
const token = Cookies.get('bm-token');
if (!token) {
next('/auth/login'); // Redirect to log in if no token
return;
}
try {
const response = await axios.get('/api/users/user/get-self', {
headers: {
Authorization: `Bearer ${token}`
},
withCredentials: true
});
next();
} catch (error) {
console.log('Authentication error:', error);
next('/auth/login');
}
};
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
component: AppLayout,
beforeEnter: loginGuard,
children: [
{
path: '/',
name: 'dashboard',
component: () => import('@/views/Dashboard.vue')
},
{
path: '/property/create-property',
name: 'create-property',
component: () => import('@/views/pages/Property/CreateProperty.vue')
},
{
path: '/property/edit-property/:propertyId',
name: 'edit-property',
component: () => import('@/views/pages/Property/CreateProperty.vue')
},
{
path: '/property/list-properties',
name: 'list-properties',
component: () => import('@/views/pages/Property/ListProperties.vue')
},
// Aliases for backward compatibility
{
path: '/belonging/create-belonging',
name: 'create-belonging',
component: () => import('@/views/pages/Property/CreateProperty.vue')
},
{
path: '/belonging/edit-belonging/:belongingId',
name: 'edit-belonging',
component: () => import('@/views/pages/Property/CreateProperty.vue')
},
{
path: '/belonging/list-belongings',
name: 'list-belongings',
component: () => import('@/views/pages/Property/ListProperties.vue')
},
{
path: '/categories/list-categories',
name: 'list-categories',
component: () => import('@/views/pages/Category/ListCategories.vue')
},
{
path: '/features/list-features',
name: 'list-features',
component: () => import('@/views/pages/Features/ListFeatures.vue')
},
{
path: '/transactions/list-transactions',
name: 'list-transactions',
component: () => import('@/views/pages/Transaction/ListTransactions.vue')
},
// ─── Warehouse Items ──────────────────────────────────────────
{
path: '/warehouse-items/list',
name: 'list-warehouse-items',
component: () => import('@/views/pages/WarehouseItems/ListWarehouseItems.vue')
},
{
path: '/warehouse-items/stock/:itemId',
name: 'warehouse-item-stock',
component: () => import('@/views/pages/WarehouseItems/WarehouseItemStockView.vue')
},
{
path: '/warehouse-items/create-transaction',
name: 'create-warehouse-transaction',
component: () => import('@/views/pages/WarehouseItems/CreateWarehouseTransaction.vue')
},
{
path: '/warehouse-items/transactions',
name: 'warehouse-item-transactions',
component: () => import('@/views/pages/WarehouseItems/ListWarehouseItemTransactions.vue')
},
{
path: '/warehouse-items/warehouses',
name: 'list-warehouses',
component: () => import('@/views/pages/WarehouseItems/ListWarehouses.vue')
},
// ─── Users & Roles ───────────────────────────────────────────
{
path: '/users/list-users',
name: 'list-users',
component: () => import('@/views/pages/Users/ListUsers.vue')
},
{
path: '/roles/list-roles',
name: 'list-roles',
component: () => import('@/views/pages/Roles/ListRoles.vue')
},
{
path: '/uikit/formlayout',
name: 'formlayout',
component: () => import('@/views/uikit/FormLayout.vue')
},
{
path: '/uikit/input',
name: 'input',
component: () => import('@/views/uikit/InputDoc.vue')
},
{
path: '/uikit/button',
name: 'button',
component: () => import('@/views/uikit/ButtonDoc.vue')
},
{
path: '/uikit/table',
name: 'table',
component: () => import('@/views/uikit/TableDoc.vue')
},
{
path: '/uikit/list',
name: 'list',
component: () => import('@/views/uikit/ListDoc.vue')
},
{
path: '/uikit/tree',
name: 'tree',
component: () => import('@/views/uikit/TreeDoc.vue')
},
{
path: '/uikit/panel',
name: 'panel',
component: () => import('@/views/uikit/PanelsDoc.vue')
},
{
path: '/uikit/overlay',
name: 'overlay',
component: () => import('@/views/uikit/OverlayDoc.vue')
},
{
path: '/uikit/media',
name: 'media',
component: () => import('@/views/uikit/MediaDoc.vue')
},
{
path: '/uikit/message',
name: 'message',
component: () => import('@/views/uikit/MessagesDoc.vue')
},
{
path: '/uikit/file',
name: 'file',
component: () => import('@/views/uikit/FileDoc.vue')
},
{
path: '/uikit/menu',
name: 'menu',
component: () => import('@/views/uikit/MenuDoc.vue')
},
{
path: '/uikit/charts',
name: 'charts',
component: () => import('@/views/uikit/ChartDoc.vue')
},
{
path: '/uikit/misc',
name: 'misc',
component: () => import('@/views/uikit/MiscDoc.vue')
},
{
path: '/uikit/timeline',
name: 'timeline',
component: () => import('@/views/uikit/TimelineDoc.vue')
},
{
path: '/pages/empty',
name: 'empty',
component: () => import('@/views/pages/Empty.vue')
},
{
path: '/pages/crud',
name: 'crud',
component: () => import('@/views/pages/Crud.vue')
},
{
path: '/documentation',
name: 'documentation',
component: () => import('@/views/pages/Documentation.vue')
}
]
},
{
path: '/landing',
name: 'landing',
component: () => import('@/views/pages/Landing.vue')
},
{
path: '/pages/notfound',
name: 'notfound',
component: () => import('@/views/pages/NotFound.vue')
},
{
path: '/auth/login',
name: 'login',
component: () => import('@/views/pages/auth/Login.vue')
},
{
path: '/auth/access',
name: 'accessDenied',
component: () => import('@/views/pages/auth/Access.vue')
},
{
path: '/auth/error',
name: 'error',
component: () => import('@/views/pages/auth/Error.vue')
}
]
});
export default router;