39443-vm/frontend/src/menuAside.ts
2026-04-04 19:09:02 +00:00

230 lines
6.9 KiB
TypeScript

import * as icon from '@mdi/js';
import { MenuAsideItem } from './interfaces';
import { getRoleLaneFromUser } from './helpers/roleLanes';
export const buildMenuAside = (currentUser?: any): MenuAsideItem[] => {
const roleLane = getRoleLaneFromUser(currentUser);
const isSuperAdmin = roleLane === 'super_admin';
const isAdmin = roleLane === 'admin';
const isConcierge = roleLane === 'concierge';
const isCustomer = roleLane === 'customer';
const operationsLabel = isCustomer ? 'My Stay' : isConcierge ? 'Stay Delivery' : 'Operations';
const operationsMenu: MenuAsideItem[] = [
{
href: '/booking_requests/booking_requests-list',
label: isCustomer ? 'My Requests' : isAdmin ? 'Incoming Requests' : 'Requests',
icon: icon.mdiClipboardTextOutline,
permissions: 'READ_BOOKING_REQUESTS',
},
{
href: '/approval_steps/approval_steps-list',
label: isCustomer ? 'Approval Status' : 'Approvals',
icon: icon.mdiCheckDecagram,
permissions: 'READ_APPROVAL_STEPS',
},
{
href: '/reservations/reservations-list',
label: isCustomer ? 'My Stays' : isConcierge ? 'Active Stays' : 'Stays',
icon: icon.mdiCalendarCheck,
permissions: 'READ_RESERVATIONS',
},
{
href: '/service_requests/service_requests-list',
label: isCustomer ? 'Support' : 'Service Queue',
icon: icon.mdiRoomService,
permissions: 'READ_SERVICE_REQUESTS',
},
{
href: '/invoices/invoices-list',
label: isCustomer ? 'Billing' : 'Invoices',
icon: icon.mdiFileDocument,
permissions: 'READ_INVOICES',
},
{
href: '/documents/documents-list',
label: isCustomer ? 'My Documents' : isConcierge ? 'Guest Documents' : 'Documents',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiPaperclip' in icon ? icon['mdiPaperclip' as keyof typeof icon] : icon.mdiFileDocument,
permissions: 'READ_DOCUMENTS',
},
];
const menuAside: MenuAsideItem[] = [
{
href: '/command-center',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiShieldHomeOutline' in icon ? icon['mdiShieldHomeOutline' as keyof typeof icon] : icon.mdiViewDashboardOutline,
label: 'Command Center',
},
{
label: operationsLabel,
icon: icon.mdiClipboardTextOutline,
permissions: [
'READ_BOOKING_REQUESTS',
'READ_APPROVAL_STEPS',
'READ_RESERVATIONS',
'READ_SERVICE_REQUESTS',
'READ_INVOICES',
'READ_DOCUMENTS',
],
menu: operationsMenu,
},
];
if (!isCustomer) {
menuAside.push({
label: 'Portfolio',
icon: icon.mdiHomeCity,
permissions: [
'READ_TENANTS',
'READ_ORGANIZATIONS',
'READ_PROPERTIES',
'READ_UNITS',
'READ_NEGOTIATED_RATES',
'READ_UNIT_TYPES',
'READ_AMENITIES',
'CREATE_TENANTS',
'CREATE_ORGANIZATIONS',
'CREATE_PROPERTIES',
'CREATE_UNIT_TYPES',
'CREATE_UNITS',
],
menu: [
{
href: '/portfolio-import',
label: 'Import Center',
icon: icon.mdiFileUploadOutline,
permissions: [
'CREATE_TENANTS',
'CREATE_ORGANIZATIONS',
'CREATE_PROPERTIES',
'CREATE_UNIT_TYPES',
'CREATE_UNITS',
],
},
{
href: '/tenants/tenants-list',
label: 'Tenants',
icon: icon.mdiDomain,
permissions: 'READ_TENANTS',
},
{
href: '/organizations/organizations-list',
label: 'Organizations',
icon: icon.mdiOfficeBuildingOutline,
permissions: 'READ_ORGANIZATIONS',
},
{
href: '/properties/properties-list',
label: 'Properties',
icon: icon.mdiHomeCity,
permissions: 'READ_PROPERTIES',
},
{
href: '/units/units-list',
label: 'Units',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiDoor' in icon ? icon['mdiDoor' as keyof typeof icon] : icon.mdiHomeCity,
permissions: 'READ_UNITS',
},
{
href: '/negotiated_rates/negotiated_rates-list',
label: 'Negotiated Rates',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiTag' in icon ? icon['mdiTag' as keyof typeof icon] : icon.mdiFileDocument,
permissions: 'READ_NEGOTIATED_RATES',
},
],
});
}
if (isSuperAdmin || isAdmin) {
const adminMenu: MenuAsideItem[] = [
{
href: '/users/users-list',
label: 'Users',
icon: icon.mdiAccountGroup,
permissions: 'READ_USERS',
},
];
if (isSuperAdmin) {
adminMenu.push(
{
href: '/roles/roles-list',
label: 'Roles',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: icon.mdiShieldAccountVariantOutline ?? icon.mdiAccountGroup,
permissions: 'READ_ROLES',
},
{
href: '/permissions/permissions-list',
label: 'Permissions',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: icon.mdiShieldAccountOutline ?? icon.mdiAccountGroup,
permissions: 'READ_PERMISSIONS',
},
{
href: '/notifications/notifications-list',
label: 'Notifications',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiBell' in icon ? icon['mdiBell' as keyof typeof icon] : icon.mdiFileDocument,
permissions: 'READ_NOTIFICATIONS',
},
{
href: '/audit_logs/audit_logs-list',
label: 'Audit Logs',
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
icon: 'mdiClipboardPulse' in icon ? icon['mdiClipboardPulse' as keyof typeof icon] : icon.mdiClipboardTextOutline,
permissions: 'READ_AUDIT_LOGS',
},
{
href: '/job_runs/job_runs-list',
label: 'Job Runs',
icon: icon.mdiClockOutline,
permissions: 'READ_JOB_RUNS',
},
);
}
menuAside.push({
label: 'Administration',
icon: icon.mdiAccountGroup,
permissions: isSuperAdmin
? ['READ_USERS', 'READ_ROLES', 'READ_PERMISSIONS', 'READ_NOTIFICATIONS', 'READ_AUDIT_LOGS', 'READ_JOB_RUNS']
: ['READ_USERS'],
menu: adminMenu,
});
}
menuAside.push(
{
href: '/profile',
label: 'Profile',
icon: icon.mdiAccountCircle,
withDevider: true,
},
{
href: '/api-docs',
target: '_blank',
label: 'Swagger API',
icon: icon.mdiFileCode,
permissions: 'READ_API_DOCS',
},
);
return menuAside;
};
export default buildMenuAside;