Implement update role permissions
parent
43fb06285b
commit
703c352e21
|
@ -5,6 +5,7 @@ import {
|
||||||
deleteRole as deleteRoleAJAX,
|
deleteRole as deleteRoleAJAX,
|
||||||
deleteUser as deleteUserAJAX,
|
deleteUser as deleteUserAJAX,
|
||||||
addUsersToRole as addUsersToRoleAJAX,
|
addUsersToRole as addUsersToRoleAJAX,
|
||||||
|
updateRolePermissions as updateRolePermissionsAJAX,
|
||||||
} from 'src/admin/apis'
|
} from 'src/admin/apis'
|
||||||
import {killQuery as killQueryProxy} from 'shared/apis/metaQuery'
|
import {killQuery as killQueryProxy} from 'shared/apis/metaQuery'
|
||||||
import {publishNotification} from 'src/shared/actions/notifications';
|
import {publishNotification} from 'src/shared/actions/notifications';
|
||||||
|
@ -148,8 +149,17 @@ export const deleteUserAsync = (user, addFlashMessage) => (dispatch) => {
|
||||||
export const addUsersToRoleAsync = (users, role) => async (dispatch) => {
|
export const addUsersToRoleAsync = (users, role) => async (dispatch) => {
|
||||||
try {
|
try {
|
||||||
await addUsersToRoleAJAX(role.links.self, users)
|
await addUsersToRoleAJAX(role.links.self, users)
|
||||||
dispatch(publishNotification('success', 'Role upated successfully'))
|
dispatch(publishNotification('success', 'Role users updated'))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(publishNotification('error', `Failed to update role: ${error.data.message}`))
|
dispatch(publishNotification('error', `Failed to update role: ${error.data.message}`))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const updateRolePermissionsAsync = (permissions, role) => async (dispatch) => {
|
||||||
|
try {
|
||||||
|
await updateRolePermissionsAJAX(role.links.self, permissions)
|
||||||
|
dispatch(publishNotification('success', 'Role permissions updated'))
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(publishNotification('error', `Failed to updated role: ${error.data.message}`))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -87,3 +87,17 @@ export const addUsersToRole = async (url, users) => {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const updateRolePermissions = async (url, permissions) => {
|
||||||
|
try {
|
||||||
|
await AJAX({
|
||||||
|
method: 'PATCH',
|
||||||
|
url,
|
||||||
|
data: {
|
||||||
|
permissions,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ const AdminTabs = ({
|
||||||
onFilterRoles,
|
onFilterRoles,
|
||||||
onFilterUsers,
|
onFilterUsers,
|
||||||
onAddUsersToRole,
|
onAddUsersToRole,
|
||||||
|
onUpdateRolePermissions,
|
||||||
}) => {
|
}) => {
|
||||||
const hasRoles = !!source.links.roles
|
const hasRoles = !!source.links.roles
|
||||||
|
|
||||||
|
@ -40,7 +41,16 @@ const AdminTabs = ({
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Roles',
|
type: 'Roles',
|
||||||
component: (<RolesTable roles={roles} allUsers={users} onDelete={onDeleteRole} onFilter={onFilterRoles} onAddUsersToRole={onAddUsersToRole}/>),
|
component: (
|
||||||
|
<RolesTable
|
||||||
|
roles={roles}
|
||||||
|
allUsers={users}
|
||||||
|
onDelete={onDeleteRole}
|
||||||
|
onFilter={onFilterRoles}
|
||||||
|
onAddUsersToRole={onAddUsersToRole}
|
||||||
|
onUpdateRolePermissions={onUpdateRolePermissions}
|
||||||
|
/>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'Queries',
|
type: 'Queries',
|
||||||
|
@ -96,6 +106,7 @@ AdminTabs.propTypes = {
|
||||||
onFilterRoles: func.isRequired,
|
onFilterRoles: func.isRequired,
|
||||||
onFilterUsers: func.isRequired,
|
onFilterUsers: func.isRequired,
|
||||||
onAddUsersToRole: func.isRequired,
|
onAddUsersToRole: func.isRequired,
|
||||||
|
onUpdateRolePermissions: func.isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default AdminTabs
|
export default AdminTabs
|
||||||
|
|
|
@ -4,7 +4,7 @@ import _ from 'lodash'
|
||||||
import MultiSelectDropdown from 'shared/components/MultiSelectDropdown'
|
import MultiSelectDropdown from 'shared/components/MultiSelectDropdown'
|
||||||
import DeleteRow from 'src/admin/components/DeleteRow'
|
import DeleteRow from 'src/admin/components/DeleteRow'
|
||||||
|
|
||||||
const PERMISSIONS = [
|
const ALL_PERMISSIONS = [
|
||||||
"NoPermissions",
|
"NoPermissions",
|
||||||
"ViewAdmin",
|
"ViewAdmin",
|
||||||
"ViewChronograf",
|
"ViewChronograf",
|
||||||
|
@ -32,14 +32,19 @@ const RoleRow = ({
|
||||||
allUsers,
|
allUsers,
|
||||||
onDelete,
|
onDelete,
|
||||||
onAddUsersToRole,
|
onAddUsersToRole,
|
||||||
|
onUpdateRolePermissions,
|
||||||
}) => {
|
}) => {
|
||||||
const wrapUsers = (u) => {
|
const handleAddUsers = (u) => {
|
||||||
const updatedUsers = u.map((n) => {
|
const updatedUsers = u.map((n) => ({name: n}))
|
||||||
return {name: n}
|
|
||||||
})
|
|
||||||
onAddUsersToRole(updatedUsers, role)
|
onAddUsersToRole(updatedUsers, role)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleAddPermisisons = (allowed) => {
|
||||||
|
onUpdateRolePermissions([{scope: 'all', allowed}], role)
|
||||||
|
}
|
||||||
|
|
||||||
|
const perms = _.get(permissions, ['0', 'allowed'], [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
<td>{name}</td>
|
<td>{name}</td>
|
||||||
|
@ -47,10 +52,10 @@ const RoleRow = ({
|
||||||
{
|
{
|
||||||
permissions && permissions.length ?
|
permissions && permissions.length ?
|
||||||
<MultiSelectDropdown
|
<MultiSelectDropdown
|
||||||
items={PERMISSIONS}
|
items={ALL_PERMISSIONS}
|
||||||
selectedItems={_.get(permissions, ['0', 'allowed'], [])}
|
selectedItems={perms}
|
||||||
label={'Select Permissions'}
|
label={perms.length ? '' : 'Select Permissions'}
|
||||||
onApply={() => '// TODO'}
|
onApply={handleAddPermisisons}
|
||||||
/> : '\u2014'
|
/> : '\u2014'
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
|
@ -60,7 +65,8 @@ const RoleRow = ({
|
||||||
<MultiSelectDropdown
|
<MultiSelectDropdown
|
||||||
items={allUsers.map((u) => u.name)}
|
items={allUsers.map((u) => u.name)}
|
||||||
selectedItems={users.map((u) => u.name)}
|
selectedItems={users.map((u) => u.name)}
|
||||||
onApply={wrapUsers}
|
label={users.length ? '' : 'Select Users'}
|
||||||
|
onApply={handleAddUsers}
|
||||||
/> : '\u2014'
|
/> : '\u2014'
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
|
@ -91,6 +97,7 @@ RoleRow.propTypes = {
|
||||||
onDelete: func.isRequired,
|
onDelete: func.isRequired,
|
||||||
allUsers: arrayOf(shape()),
|
allUsers: arrayOf(shape()),
|
||||||
onAddUsersToRole: func.isRequired,
|
onAddUsersToRole: func.isRequired,
|
||||||
|
onUpdateRolePermissions: func.isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default RoleRow
|
export default RoleRow
|
||||||
|
|
|
@ -3,7 +3,14 @@ import RoleRow from 'src/admin/components/RoleRow'
|
||||||
import EmptyRow from 'src/admin/components/EmptyRow'
|
import EmptyRow from 'src/admin/components/EmptyRow'
|
||||||
import FilterBar from 'src/admin/components/FilterBar'
|
import FilterBar from 'src/admin/components/FilterBar'
|
||||||
|
|
||||||
const RolesTable = ({roles, allUsers, onDelete, onFilter, onAddUsersToRole}) => (
|
const RolesTable = ({
|
||||||
|
roles,
|
||||||
|
allUsers,
|
||||||
|
onDelete,
|
||||||
|
onFilter,
|
||||||
|
onAddUsersToRole,
|
||||||
|
onUpdateRolePermissions,
|
||||||
|
}) => (
|
||||||
<div className="panel panel-info">
|
<div className="panel panel-info">
|
||||||
<FilterBar type="roles" onFilter={onFilter} />
|
<FilterBar type="roles" onFilter={onFilter} />
|
||||||
<div className="panel-body">
|
<div className="panel-body">
|
||||||
|
@ -20,7 +27,14 @@ const RolesTable = ({roles, allUsers, onDelete, onFilter, onAddUsersToRole}) =>
|
||||||
{
|
{
|
||||||
roles.length ?
|
roles.length ?
|
||||||
roles.filter(r => !r.hidden).map((role) =>
|
roles.filter(r => !r.hidden).map((role) =>
|
||||||
<RoleRow key={role.name} allUsers={allUsers} role={role} onDelete={onDelete} onAddUsersToRole={onAddUsersToRole}/>
|
<RoleRow
|
||||||
|
key={role.name}
|
||||||
|
allUsers={allUsers}
|
||||||
|
role={role}
|
||||||
|
onDelete={onDelete}
|
||||||
|
onAddUsersToRole={onAddUsersToRole}
|
||||||
|
onUpdateRolePermissions={onUpdateRolePermissions}
|
||||||
|
/>
|
||||||
) : <EmptyRow tableName={'Roles'} />
|
) : <EmptyRow tableName={'Roles'} />
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -51,6 +65,7 @@ RolesTable.propTypes = {
|
||||||
onFilter: func,
|
onFilter: func,
|
||||||
allUsers: arrayOf(shape()),
|
allUsers: arrayOf(shape()),
|
||||||
onAddUsersToRole: func.isRequired,
|
onAddUsersToRole: func.isRequired,
|
||||||
|
onUpdateRolePermissions: func.isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default RolesTable
|
export default RolesTable
|
||||||
|
|
|
@ -11,6 +11,7 @@ import {
|
||||||
deleteRoleAsync,
|
deleteRoleAsync,
|
||||||
deleteUserAsync,
|
deleteUserAsync,
|
||||||
addUsersToRoleAsync,
|
addUsersToRoleAsync,
|
||||||
|
updateRolePermissionsAsync,
|
||||||
filterRoles as filterRolesAction,
|
filterRoles as filterRolesAction,
|
||||||
filterUsers as filterUsersAction,
|
filterUsers as filterUsersAction,
|
||||||
} from 'src/admin/actions'
|
} from 'src/admin/actions'
|
||||||
|
@ -32,6 +33,7 @@ class AdminPage extends Component {
|
||||||
this.handleDeleteRole = ::this.handleDeleteRole
|
this.handleDeleteRole = ::this.handleDeleteRole
|
||||||
this.handleDeleteUser = ::this.handleDeleteUser
|
this.handleDeleteUser = ::this.handleDeleteUser
|
||||||
this.handleAddUsersToRole = ::this.handleAddUsersToRole
|
this.handleAddUsersToRole = ::this.handleAddUsersToRole
|
||||||
|
this.handleUpdateRolePermissions = ::this.handleUpdateRolePermissions
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
@ -82,6 +84,10 @@ class AdminPage extends Component {
|
||||||
this.props.addUsersToRole(users, role)
|
this.props.addUsersToRole(users, role)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleUpdateRolePermissions(permissions, role) {
|
||||||
|
this.props.updateRolePermissions(permissions, role)
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {users, roles, source, filterUsers, filterRoles, addFlashMessage} = this.props
|
const {users, roles, source, filterUsers, filterRoles, addFlashMessage} = this.props
|
||||||
|
|
||||||
|
@ -116,6 +122,7 @@ class AdminPage extends Component {
|
||||||
onFilterRoles={filterRoles}
|
onFilterRoles={filterRoles}
|
||||||
addFlashMessage={addFlashMessage}
|
addFlashMessage={addFlashMessage}
|
||||||
onAddUsersToRole={this.handleAddUsersToRole}
|
onAddUsersToRole={this.handleAddUsersToRole}
|
||||||
|
onUpdateRolePermissions={this.handleUpdateRolePermissions}
|
||||||
/> :
|
/> :
|
||||||
<span>Loading...</span>
|
<span>Loading...</span>
|
||||||
}
|
}
|
||||||
|
@ -155,6 +162,7 @@ AdminPage.propTypes = {
|
||||||
filterRoles: func,
|
filterRoles: func,
|
||||||
filterUsers: func,
|
filterUsers: func,
|
||||||
addUsersToRole: func,
|
addUsersToRole: func,
|
||||||
|
updateRolePermissions: func,
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapStateToProps = ({admin: {users, roles}}) => ({
|
const mapStateToProps = ({admin: {users, roles}}) => ({
|
||||||
|
@ -174,6 +182,7 @@ const mapDispatchToProps = (dispatch) => ({
|
||||||
filterRoles: bindActionCreators(filterRolesAction, dispatch),
|
filterRoles: bindActionCreators(filterRolesAction, dispatch),
|
||||||
filterUsers: bindActionCreators(filterUsersAction, dispatch),
|
filterUsers: bindActionCreators(filterUsersAction, dispatch),
|
||||||
addUsersToRole: bindActionCreators(addUsersToRoleAsync, dispatch),
|
addUsersToRole: bindActionCreators(addUsersToRoleAsync, dispatch),
|
||||||
|
updateRolePermissions: bindActionCreators(updateRolePermissionsAsync, dispatch),
|
||||||
})
|
})
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(AdminPage)
|
export default connect(mapStateToProps, mapDispatchToProps)(AdminPage)
|
||||||
|
|
Loading…
Reference in New Issue