321 lines
11 KiB
TypeScript
321 lines
11 KiB
TypeScript
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;
|
|
}
|
|
}
|