forked from ddrilling/asb_cloud_front
142 lines
4.4 KiB
React
142 lines
4.4 KiB
React
|
import { Button, Modal } from 'antd'
|
|||
|
import { useEffect, useState } from 'react'
|
|||
|
import { AdminUserRoleService } from '../../services/api'
|
|||
|
import LoaderPortal from '../../components/LoaderPortal'
|
|||
|
import { invokeWebApiWrapperAsync } from '../../components/factory'
|
|||
|
import { EditableTable, makeActionHandler, makeColumn, makeSelectColumn } from '../../components/Table'
|
|||
|
|
|||
|
export const toHexString = (num, size) => '0x' + ('0'.repeat(size) + num.toString(16).toUpperCase()).slice(-size)
|
|||
|
|
|||
|
const columns = [
|
|||
|
makeColumn('Имена прав', 'name', {
|
|||
|
width: 400,
|
|||
|
editable: true,
|
|||
|
formItemRules: [{
|
|||
|
required: true,
|
|||
|
message: 'Пожалуйста, введите имя права'
|
|||
|
}],
|
|||
|
}),
|
|||
|
]
|
|||
|
|
|||
|
export const RolePermissions = ({ value, onChange }) => {
|
|||
|
const [isModalVisible, setIsModalVisible] = useState(false)
|
|||
|
const [list, setList] = useState([])
|
|||
|
|
|||
|
const save = () => {
|
|||
|
const newValue = list.map((value) => value.name)
|
|||
|
if(!onChange(newValue))
|
|||
|
setIsModalVisible(false)
|
|||
|
}
|
|||
|
|
|||
|
const add = (permission) => {
|
|||
|
permission.key = Date.now()
|
|||
|
setList((prevList) => {
|
|||
|
if (!prevList) prevList = []
|
|||
|
prevList.push(permission)
|
|||
|
return prevList
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
const edit = (permission) => {
|
|||
|
if (!permission.key) return
|
|||
|
const idx = list.findIndex(v => v.key === permission.key)
|
|||
|
if (idx < 0) return
|
|||
|
setList((prevList) => {
|
|||
|
prevList[idx] = permission
|
|||
|
return prevList
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
const remove = (permission) => {
|
|||
|
if (!permission.key) return
|
|||
|
const idx = list.findIndex(v => v.key === permission.key)
|
|||
|
if (idx < 0) return
|
|||
|
setList((prevList) => {
|
|||
|
prevList.splice(idx, 1)
|
|||
|
return prevList
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
return (
|
|||
|
<>
|
|||
|
<Button type={'link'} onClick={() => setIsModalVisible(true)}>Редактировать</Button>
|
|||
|
<Modal
|
|||
|
title={'Права доступа'}
|
|||
|
centered
|
|||
|
visible={isModalVisible}
|
|||
|
width={750}
|
|||
|
onCancel={() => setIsModalVisible(false)}
|
|||
|
onOk={save}
|
|||
|
okText={'Сохранить'}
|
|||
|
>
|
|||
|
<EditableTable
|
|||
|
size={'small'}
|
|||
|
bordered
|
|||
|
columns={columns}
|
|||
|
dataSource={list}
|
|||
|
onRowAdd={add}
|
|||
|
onRowEdit={edit}
|
|||
|
onRowDelete={remove}
|
|||
|
/>
|
|||
|
</Modal>
|
|||
|
</>
|
|||
|
)
|
|||
|
}
|
|||
|
|
|||
|
export const RoleController = () => {
|
|||
|
const [roles, setRoles] = useState([])
|
|||
|
const [showLoader, setShowLoader] = useState(false)
|
|||
|
const [columns, setColumns] = useState([])
|
|||
|
|
|||
|
const updateTable = () => invokeWebApiWrapperAsync(
|
|||
|
async () => {
|
|||
|
const roles = await AdminUserRoleService.getAll()
|
|||
|
setRoles(roles)
|
|||
|
},
|
|||
|
setShowLoader,
|
|||
|
`Не удалось загрузить список прав`
|
|||
|
)
|
|||
|
|
|||
|
useEffect(() => {
|
|||
|
const options = roles?.map((r) => ({ value: r.id, label: r.caption })) ?? []
|
|||
|
setColumns([
|
|||
|
makeColumn('Название', 'caption', { width: 200, editable: true }),
|
|||
|
makeSelectColumn('Роль-родитель', 'idParent', options, options[0], {
|
|||
|
width: 200,
|
|||
|
editable: true
|
|||
|
}),
|
|||
|
makeColumn('Права доступа', 'permissions', {
|
|||
|
width: 200,
|
|||
|
editable: true,
|
|||
|
input: <RolePermissions />,
|
|||
|
render: (permissions) => permissions?.join(', ') ?? '',
|
|||
|
})
|
|||
|
])
|
|||
|
}, [roles])
|
|||
|
|
|||
|
useEffect(updateTable, [])
|
|||
|
|
|||
|
const handlerProps = {
|
|||
|
service: AdminUserRoleService,
|
|||
|
setLoader: setShowLoader,
|
|||
|
errorMsg: `Не удалось выполнить операцию`,
|
|||
|
onComplete: updateTable
|
|||
|
}
|
|||
|
|
|||
|
return (
|
|||
|
<LoaderPortal show={showLoader}>
|
|||
|
<EditableTable
|
|||
|
size={'small'}
|
|||
|
bordered
|
|||
|
columns={columns}
|
|||
|
dataSource={roles}
|
|||
|
onRowAdd={makeActionHandler('insert', handlerProps)}
|
|||
|
onRowEdit={makeActionHandler('update', handlerProps)}
|
|||
|
onRowDelete={makeActionHandler('delete', handlerProps)}
|
|||
|
/>
|
|||
|
</LoaderPortal>
|
|||
|
)
|
|||
|
}
|
|||
|
|
|||
|
export default RoleController
|