Projekt

Obecné

Profil

Stáhnout (3.05 KB) Statistiky
| Větev: | Tag: | Revize:
1
import { OverridableComponent } from '@mui/material/OverridableComponent'
2
import HomeIcon from '@mui/icons-material/Home'
3
import { MenuBook } from '@mui/icons-material'
4
import LibraryBooksIcon from '@mui/icons-material/LibraryBooks'
5
import MapIcon from '@mui/icons-material/Map'
6
import PersonIcon from '@mui/icons-material/Person'
7
import LoginIcon from '@mui/icons-material/Login'
8
import { SvgIconTypeMap } from '@mui/material'
9
import DataSaverOffIcon from '@mui/icons-material/DataSaverOff'
10
import LogoutIcon from '@mui/icons-material/Logout'
11

    
12
export interface NavigationMenuItem {
13
    name: string
14
    path: string
15
    // All privileges that can access this menu item
16
    accessibleTo: Set<string>
17
    icon: OverridableComponent<SvgIconTypeMap<{}, 'svg'>>
18
    position: number,
19
    isDialog?: boolean
20
}
21

    
22
const visitorRole = 'VISITOR'
23
const visitorRoleOnly = 'VISITOR_ONLY'
24
const loggedInRole = 'LOGGED_IN'
25
const visitorAccess = new Set([visitorRole])
26
const adminAccess = new Set(['ADMIN'])
27
const loggedInAccess = new Set([loggedInRole])
28

    
29
const items: NavigationMenuItem[] = [
30
    {
31
        name: 'Home',
32
        path: '/',
33
        accessibleTo: visitorAccess,
34
        icon: HomeIcon,
35
        position: 0,
36
    },
37
    {
38
        name: 'Catalog',
39
        path: '/catalog',
40
        accessibleTo: visitorAccess,
41
        icon: MenuBook,
42
        position: 1,
43
    },
44
    {
45
        name: 'Map',
46
        path: '/map',
47
        accessibleTo: visitorAccess,
48
        icon: MapIcon,
49
        position: 2,
50
    },
51
    {
52
        name: 'Sources',
53
        path: '/sources',
54
        accessibleTo: visitorAccess,
55
        icon: LibraryBooksIcon,
56
        position: 3,
57
    },
58
    // TODO add statistics
59
    {
60
        name: 'Admin',
61
        path: '/admin',
62
        accessibleTo: adminAccess,
63
        icon: PersonIcon,
64
        position: 5,
65
    },
66
    // TODO move this to the top
67
    {
68
        name: 'Login',
69
        path: '/login',
70
        accessibleTo: new Set([visitorRoleOnly]),
71
        icon: LoginIcon,
72
        position: 5,
73
        isDialog: true
74
    },
75
    {
76
        name: 'Statistics',
77
        path: '/stats',
78
        accessibleTo: adminAccess,
79
        icon: DataSaverOffIcon,
80
        position: 4,
81
    },
82
    {
83
        name: 'Logout',
84
        path: '/logout',
85
        accessibleTo: loggedInAccess,
86
        icon: LogoutIcon,
87
        position: 1337,
88
    }
89
]
90

    
91
const getNavigationItems = (_userRoles: string[]): NavigationMenuItem[] => {
92
    const userRoles: string[] = [..._userRoles]
93
    // Add visitor role if not present and visitor role only if user has no roles
94
    if (!userRoles || userRoles.length === 0) {
95
        userRoles.push( visitorRole, visitorRoleOnly)
96
    } else {
97
        userRoles.push(visitorRole)
98
        userRoles.push(loggedInRole)
99
    }
100

    
101
    return items // else return everything the user has privileges to
102
        .filter((item) => {
103
            // If the user has any of the roles that are required to access this item
104
            // then return it
105
            return userRoles.some((role) => item.accessibleTo.has(role))
106
        })
107
        .sort((a, b) => a.position - b.position)
108
}
109

    
110
export default getNavigationItems
(3-3/3)