-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathMappingPage.js
More file actions
127 lines (115 loc) · 4.41 KB
/
MappingPage.js
File metadata and controls
127 lines (115 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import React, { useEffect, useState, useContext } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { useTranslation } from 'react-i18next'
import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle'
import MappingAddDialogForm from './MappingAddDialogForm'
import { Card, Col, CardBody, FormGroup, Button } from 'Components'
import Box from '@mui/material/Box'
import GluuViewWrapper from 'Routes/Apps/Gluu/GluuViewWrapper'
import GluuLoader from 'Routes/Apps/Gluu/GluuLoader'
import { getMapping, addNewRolePermissions } from 'Plugins/admin/redux/features/mappingSlice'
import { getRoles } from 'Plugins/admin/redux/features/apiRoleSlice'
import { getPermissions } from 'Plugins/admin/redux/features/apiPermissionSlice'
import MappingItem from './MappingItem'
import { buildPayload, MAPPING_WRITE, MAPPING_READ } from 'Utils/PermChecker'
import SetTitle from 'Utils/SetTitle'
import { ThemeContext } from 'Context/theme/themeContext'
import { useCedarling } from '@/cedarling'
function MappingPage() {
const dispatch = useDispatch()
const { t } = useTranslation()
SetTitle(t('titles.mapping'))
const { hasCedarPermission, authorize } = useCedarling()
const { items: mapping, loading } = useSelector((state) => state.mappingReducer)
const apiRoles = useSelector((state) => state.apiRoleReducer.items)
const permissionLoading = useSelector((state) => state.apiPermissionReducer.loading)
const { permissions: cedarPermissions } = useSelector((state) => state.cedarPermissions)
const [modal, setModal] = useState(false)
const toggle = () => setModal(!modal)
const options = []
const userAction = {}
const theme = useContext(ThemeContext)
const selectedTheme = theme.state.theme
const authorizePermissions = async () => {
const permissions = [MAPPING_READ, MAPPING_WRITE]
try {
for (const permission of permissions) {
await authorize([permission])
}
} catch (error) {
console.error('Error authorizing mapping permissions:', error)
}
}
useEffect(() => {
authorizePermissions()
doFetchList()
doFetchRoles()
doFetchPermissionsList()
}, [])
useEffect(() => {}, [cedarPermissions])
function doFetchPermissionsList() {
buildPayload(userAction, 'PERMISSIONS', options)
dispatch(getPermissions({ payload: userAction }))
}
function onAddConfirmed(mappingData) {
const existing = (mapping || []).find((m) => m?.role === mappingData.role)
const mergedPermissions = Array.from(
new Set([...(existing?.permissions || []), ...(mappingData?.permissions || [])]),
)
const payload = { role: mappingData.role, permissions: mergedPermissions }
buildPayload(userAction, 'Add new mapping', payload)
dispatch(addNewRolePermissions({ data: payload }))
toggle()
}
function doFetchList() {
buildPayload(userAction, 'ROLES_MAPPING', options)
dispatch(getMapping({ action: userAction }))
}
function doFetchRoles() {
buildPayload(userAction, 'ROLES', options)
dispatch(getRoles({ action: userAction }))
}
function showMappingDialog() {
toggle()
}
return (
<GluuLoader blocking={loading || permissionLoading}>
<Card style={applicationStyle.mainCard}>
<CardBody>
<GluuViewWrapper canShow={hasCedarPermission(MAPPING_READ)}>
{hasCedarPermission(MAPPING_WRITE) && (
<FormGroup row>
<Col sm={10}></Col>
<Col sm={2}>
<Box display="flex" justifyContent="flex-end">
<Button
type="button"
color={`primary-${selectedTheme}`}
style={applicationStyle.buttonStyle}
onClick={showMappingDialog}
>
<i className="fa fa-plus me-2"></i>
{t('actions.add_mapping')}
</Button>
</Box>
</Col>
</FormGroup>
)}
{mapping.map((candidate, idx) => (
<MappingItem key={idx} candidate={candidate} roles={apiRoles} />
))}
</GluuViewWrapper>
<FormGroup row />
<MappingAddDialogForm
roles={apiRoles}
handler={toggle}
modal={modal}
mapping={mapping}
onAccept={onAddConfirmed}
/>
</CardBody>
</Card>
</GluuLoader>
)
}
export default MappingPage