230 lines
6.9 KiB
TypeScript
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;
|