import { createRouter, createWebHistory } from "vue-router"; import Login from "@/views/Login.vue"; import { isAuthenticated } from "./authGuard"; import { isSetup } from "./setupGuard"; import { abilityAndNavUpdate } from "./adminGuard"; import type { PermissionType, PermissionSection, PermissionModule } from "@/types/permissionTypes"; import { config } from "../config"; import { setBackupPage } from "./backupGuard"; 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: "/reset", name: "reset", component: () => import("@/views/RouterView.vue"), children: [ { path: "", name: "reset-start", component: () => import("@/views/reset/Start.vue"), }, { path: "reset", name: "reset-reset", component: () => import("@/views/reset/Reset.vue"), props: (route) => ({ mail: route.query.mail, token: route.query.token }), }, ], }, { path: "/invite", name: "invite", component: () => import("@/views/RouterView.vue"), children: [ { path: "verify", name: "invite-verify", component: () => import("@/views/invite/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/admin/ViewSelect.vue"), }, { path: "operation", name: "admin-operation", component: () => import("@/views/RouterView.vue"), meta: { type: "read", section: "operation" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-operation-default", redirect: { name: "admin-operation-mission" }, }, { path: "mission", name: "admin-operation-mission", component: () => import("@/views/admin/ViewSelect.vue"), meta: { type: "read", section: "operation", module: "mission" }, beforeEnter: [abilityAndNavUpdate], }, ], }, { path: "configuration", name: "admin-configuration", component: () => import("@/views/RouterView.vue"), meta: { type: "read", section: "configuration" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-configuration-default", component: () => import("@/views/admin/ViewSelect.vue"), meta: { type: "read", section: "configuration" }, beforeEnter: [abilityAndNavUpdate], }, { path: "force", name: "admin-configuration-force", component: () => import("@/views/admin/ViewSelect.vue"), meta: { type: "read", section: "configuration", module: "force" }, beforeEnter: [abilityAndNavUpdate], }, ], }, { path: "management", name: "admin-management", component: () => import("@/views/RouterView.vue"), meta: { type: "read", section: "management" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-management-default", component: () => import("@/views/admin/ViewSelect.vue"), meta: { type: "read", section: "management" }, beforeEnter: [abilityAndNavUpdate], }, { path: "user", name: "admin-management-user-route", component: () => import("@/views/RouterView.vue"), meta: { type: "read", section: "management", module: "user" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-management-user", component: () => import("@/views/admin/management/user/User.vue"), }, { path: "invites", name: "admin-management-user-invites", component: () => import("@/views/admin/management/user/Invite.vue"), }, { path: ":id/edit", name: "admin-management-user-edit", component: () => import("@/views/admin/management/user/UserEdit.vue"), meta: { type: "update", section: "management", module: "user" }, beforeEnter: [abilityAndNavUpdate], props: true, }, { path: ":id/permission", name: "admin-management-user-permission", component: () => import("@/views/admin/management/user/UserEditPermission.vue"), meta: { type: "update", section: "management", module: "user" }, beforeEnter: [abilityAndNavUpdate], props: true, }, { path: ":id/roles", name: "admin-management-user-roles", component: () => import("@/views/admin/management/user/UserEditRoles.vue"), meta: { type: "update", section: "management", module: "user" }, beforeEnter: [abilityAndNavUpdate], props: true, }, ], }, { path: "role", name: "admin-management-role-route", component: () => import("@/views/RouterView.vue"), meta: { type: "read", section: "management", module: "role" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-management-role", component: () => import("@/views/admin/management/role/Role.vue"), }, { path: ":id/edit", name: "admin-management-role-edit", component: () => import("@/views/admin/management/role/RoleEdit.vue"), meta: { type: "update", section: "management", module: "role" }, beforeEnter: [abilityAndNavUpdate], props: true, }, { path: ":id/permission", name: "admin-management-role-permission", component: () => import("@/views/admin/management/role/RoleEditPermission.vue"), meta: { type: "update", section: "management", module: "role" }, beforeEnter: [abilityAndNavUpdate], props: true, }, ], }, { path: "backup", name: "admin-management-backup-route", component: () => import("@/views/admin/management/backup/BackupRouting.vue"), meta: { type: "read", section: "management", module: "backup" }, beforeEnter: [abilityAndNavUpdate], children: [ { path: "", name: "admin-management-backup", redirect: { name: "admin-management-backup-generated" }, }, { path: "generated", name: "admin-management-backup-generated", component: () => import("@/views/admin/management/backup/GeneratedBackup.vue"), beforeEnter: [setBackupPage], }, { path: "uploads", name: "admin-management-backup-uploaded", component: () => import("@/views/admin/management/backup/UploadedBackup.vue"), beforeEnter: [setBackupPage], }, ], }, { path: "version", name: "admin-management-version", component: () => import("@/views/admin/management/version/VersionDisplay.vue"), meta: { admin: true }, beforeEnter: [abilityAndNavUpdate], }, ], }, { path: ":pathMatch(.*)*", name: "admin-404", component: () => import("@/views/notFound.vue"), }, ], }, { path: "/account", name: "account", component: () => import("@/views/account/View.vue"), beforeEnter: [isAuthenticated], children: [ { path: "", name: "account-default", component: () => import("@/views/account/ViewSelect.vue"), }, { path: "me", name: "account-me", component: () => import("@/views/account/Me.vue"), }, { path: "logindata", name: "account-logindata", component: () => import("@/views/account/LoginData.vue"), }, { path: "permission", name: "account-permission", component: () => import("@/views/account/Permission.vue"), }, { path: "administration", name: "account-administration", component: () => import("@/views/account/Administration.vue"), }, { path: ":pathMatch(.*)*", name: "account-404", component: () => import("@/views/notFound.vue"), }, ], }, { path: "/nopermissions", name: "nopermissions", component: () => import("@/views/NoPermission.vue"), }, { path: "/:pathMatch(.*)*", name: "404", component: () => import("@/views/notFound.vue"), }, ], }); router.afterEach((to, from) => { document.title = config.app_name_overwrite || "FF Operation"; }); export default router; declare module "vue-router" { interface RouteMeta { admin?: boolean; type?: PermissionType | "admin"; section?: PermissionSection; module?: PermissionModule; } }