DONE: layout letter with letterhead and footer, notification for newly...

This commit is contained in:
ISMAIL MASSERAN
2026-06-28 02:16:49 +00:00
parent 94ecbe5887
commit 034ecf947f
400 changed files with 29802 additions and 5446 deletions
+35 -14
View File
@@ -1,11 +1,16 @@
import { createRouter, createWebHistory } from 'vue-router'
import Layout from '@/themes'
import DocsLayout from '@/docs/DocsLayout.vue'
import { hasAnyActiveRolePermission } from '@/core/utils/activeRolePermission'
import { getRouteRequiredPermissions } from '@/core/utils/routePermission'
import { authPublicRoutes, resolvePostAuthRoute } from '@/modules/auth'
import { membershipApplicationPublicRoutes, membershipApplicationLayoutRoutes } from '@/modules/membership-application'
import { profileLayoutRoutes } from '@/modules/profile'
import { pinia } from '@/pinia'
import { useAuthStore } from '@/stores/auth'
import { userLayoutRoutes } from '@/modules/user'
import { roleLayoutRoutes } from '@/modules/role'
import { activityLayoutRoutes } from '@/modules/activity'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
@@ -182,6 +187,9 @@ const router = createRouter({
},
...profileLayoutRoutes,
...userLayoutRoutes,
...roleLayoutRoutes,
...activityLayoutRoutes,
...membershipApplicationLayoutRoutes,
// Docs Layout
{
path: '/',
@@ -243,11 +251,6 @@ const router = createRouter({
name: "combobox",
component: () => import("../docs/pages/combobox.vue"),
},
{
path: "data-table",
name: "data-table",
component: () => import("../docs/pages/data-table.vue"),
},
{
path: "datepicker",
name: "datepicker",
@@ -278,11 +281,6 @@ const router = createRouter({
name: "menu",
component: () => import("../docs/pages/menu.vue"),
},
{
path: "native-select",
name: "native-select",
component: () => import("../docs/pages/native-select.vue"),
},
{
path: "pagination",
name: "pagination",
@@ -368,15 +366,21 @@ const router = createRouter({
],
},
...authPublicRoutes,
...membershipApplicationPublicRoutes,
{
path: '/error-page',
name: 'error-page',
component: () => import('../views/ErrorPage.vue'),
},
{
path: '/forbidden',
name: 'forbidden',
component: () => import('../views/ForbiddenPage.vue'),
},
],
})
const PUBLIC_ROUTE_NAMES = new Set(['login', 'register', 'verify-email'])
const PUBLIC_ROUTE_NAMES = new Set(['login', 'register', 'verify-email', 'membership-application-apply'])
router.beforeEach(async (to) => {
const authStore = useAuthStore(pinia)
@@ -405,12 +409,16 @@ router.beforeEach(async (to) => {
}
// Redirect authenticated users away from login/register/verify-email.
if (PUBLIC_ROUTE_NAMES.has(routeName) && authStore.isAuthenticated) {
if (
authStore.isAuthenticated &&
PUBLIC_ROUTE_NAMES.has(routeName) &&
routeName !== 'membership-application-apply'
) {
return resolvePostAuthRoute(authStore.user)
}
// Other auth pages (privacy, terms, etc.).
if (to.meta?.module === 'auth' || PUBLIC_ROUTE_NAMES.has(routeName)) {
// Public routes (auth pages, membership application, privacy, terms, etc.).
if (to.meta?.public === true || to.meta?.module === 'auth' || PUBLIC_ROUTE_NAMES.has(routeName)) {
return true
}
@@ -430,6 +438,19 @@ router.beforeEach(async (to) => {
return { name: 'account-pending' }
}
const requiredPermissions = getRouteRequiredPermissions(to)
if (
requiredPermissions.length &&
!hasAnyActiveRolePermission(
authStore.user,
authStore.activeRole,
requiredPermissions,
)
) {
return { name: 'forbidden' }
}
return true
})