import { createRouter, createWebHistory, createWebHashHistory } from "vue-router"; import Login from "../views/Login.vue"; import { isAuthenticated } from "./authGuards"; import { loadAccountData } from "./accountGuard"; import { isSetup } from "./setupGuard"; import { abilityAndNavUpdate } from "./adminGuard"; import type { PermissionType, PermissionSection, PermissionModule } from "../types/permissionTypes"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: "/", redirect: { name: "admin" }, }, { path: "/login", name: "login", component: Login, }, { path: "/setup", name: "setup", component: () => import("../views/RouterView.vue"), beforeEnter: [isSetup], children: [ { path: "", name: "setup-create", component: () => import("../views/setup/Setup.vue"), }, { path: "verify", name: "setup-verify", component: () => import("../views/setup/Verify.vue"), props: (route) => ({ mail: route.query.mail, token: route.query.token }), }, ], }, { path: "/admin", name: "admin", component: () => import("../views/admin/View.vue"), beforeEnter: [isAuthenticated], children: [ { path: "", name: "admin-default", component: () => import("../views/RouterView.vue"), }, { path: "club", name: "admin-club", component: () => import("../views/RouterView.vue"), meta: { type: "read", section: "club" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-club-default", component: () => import("../views/admin/ViewSelect.vue"), }, { path: "members", name: "admin-club-members", component: () => import("../views/admin/members/Overview.vue"), }, { path: "calendar", name: "admin-club-calendar", component: () => import("../views/admin/members/Overview.vue"), }, { path: "newsletter", name: "admin-club-newsletter", component: () => import("../views/admin/members/Overview.vue"), }, { path: "protocol", name: "admin-club-protocol", component: () => import("../views/admin/members/Overview.vue"), }, ], }, { path: "settings", name: "admin-settings", component: () => import("../views/RouterView.vue"), meta: { type: "read", section: "settings" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-settings-default", component: () => import("../views/admin/ViewSelect.vue"), }, { path: "qualification", name: "admin-settings-qualification", component: () => import("../views/admin/members/Overview.vue"), }, { path: "award", name: "admin-settings-award", component: () => import("../views/admin/members/Overview.vue"), }, { path: "executive-position", name: "admin-settings-executive_position", component: () => import("../views/admin/members/Overview.vue"), }, { path: "communication", name: "admin-settings-communication", component: () => import("../views/admin/members/Overview.vue"), }, ], }, { path: "user", name: "admin-user", component: () => import("../views/RouterView.vue"), meta: { type: "read", section: "user" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-user-default", component: () => import("../views/admin/ViewSelect.vue"), }, { path: "user", name: "admin-user-user", component: () => import("../views/admin/user/User.vue"), }, { path: "role", name: "admin-user-role", component: () => import("../views/admin/user/Role.vue"), }, ], }, { path: ":pathMatch(.*)*", name: "admin-404", component: () => import("../views/notFound.vue"), }, ], }, { path: "/nopermissions", name: "nopermissions", component: () => import("../views/NoPermission.vue"), }, { path: "/:pathMatch(.*)*", name: "404", component: () => import("../views/notFound.vue"), }, ], }); export default router; declare module "vue-router" { interface RouteMeta { type?: PermissionType | "admin"; section?: PermissionSection; module?: PermissionModule; } }