diff --git a/ui/src/admin/actions/index.js b/ui/src/admin/actions/index.js index b4ee6a7cf..eb77e26cd 100644 --- a/ui/src/admin/actions/index.js +++ b/ui/src/admin/actions/index.js @@ -6,12 +6,12 @@ import { createRole as createRoleAJAX, deleteUser as deleteUserAJAX, deleteRole as deleteRoleAJAX, - updateRoleUsers as updateRoleUsersAJAX, - updateRolePermissions as updateRolePermissionsAJAX, + updateRole as updateRoleAJAX, + updateUser as updateUserAJAX, } from 'src/admin/apis' + import {killQuery as killQueryProxy} from 'shared/apis/metaQuery' import {publishNotification} from 'src/shared/actions/notifications'; - import {ADMIN_NOTIFICATION_DELAY} from 'shared/constants' export const loadUsers = ({users}) => ({ @@ -191,7 +191,7 @@ export const deleteUserAsync = (user, addFlashMessage) => (dispatch) => { export const updateRoleUsersAsync = (role, users) => async (dispatch) => { try { - await updateRoleUsersAJAX(role.links.self, users) + await updateRoleAJAX(role.links.self, users, role.permissions) dispatch(publishNotification('success', 'Role users updated')) } catch (error) { dispatch(publishNotification('error', `Failed to update role: ${error.data.message}`)) @@ -200,9 +200,27 @@ export const updateRoleUsersAsync = (role, users) => async (dispatch) => { export const updateRolePermissionsAsync = (role, permissions) => async (dispatch) => { try { - await updateRolePermissionsAJAX(role.links.self, permissions) + await updateRoleAJAX(role.links.self, role.users, permissions) dispatch(publishNotification('success', 'Role permissions updated')) } catch (error) { dispatch(publishNotification('error', `Failed to updated role: ${error.data.message}`)) } } + +export const updateUserPermissionsAsync = (user, permissions) => async (dispatch) => { + try { + await updateUserAJAX(user.links.self, user.roles, permissions) + dispatch(publishNotification('success', 'User permissions updated')) + } catch (error) { + dispatch(publishNotification('error', `Failed to updated user: ${error.data.message}`)) + } +} + +export const updateUserRolesAsync = (user, roles) => async (dispatch) => { + try { + await updateUserAJAX(user.links.self, roles, user.permissions) + dispatch(publishNotification('success', 'User roles updated')) + } catch (error) { + dispatch(publishNotification('error', `Failed to updated user: ${error.data.message}`)) + } +} diff --git a/ui/src/admin/apis/index.js b/ui/src/admin/apis/index.js index 788e51e22..09517f837 100644 --- a/ui/src/admin/apis/index.js +++ b/ui/src/admin/apis/index.js @@ -97,26 +97,28 @@ export const deleteUser = async (url, addFlashMessage, username) => { } } -export const updateRoleUsers = async (url, users) => { +export const updateRole = async (url, users, permissions) => { try { await AJAX({ method: 'PATCH', url, data: { users, - }, - }) - } catch (error) { - console.error(error) - } -} - -export const updateRolePermissions = async (url, permissions) => { - try { - await AJAX({ - method: 'PATCH', - url, - data: { + permissions, + }, + }) + } catch (error) { + console.error(error) + } +} + +export const updateUser = async (url, roles, permissions) => { + try { + await AJAX({ + method: 'PATCH', + url, + data: { + roles, permissions, }, }) diff --git a/ui/src/admin/components/AdminTabs.js b/ui/src/admin/components/AdminTabs.js index b8aaae8d6..159d4ba71 100644 --- a/ui/src/admin/components/AdminTabs.js +++ b/ui/src/admin/components/AdminTabs.js @@ -25,6 +25,8 @@ const AdminTabs = ({ onFilterUsers, onUpdateRoleUsers, onUpdateRolePermissions, + onUpdateUserRoles, + onUpdateUserPermissions, }) => { let tabs = [ { @@ -42,6 +44,8 @@ const AdminTabs = ({ onEdit={onEditUser} onDelete={onDeleteUser} onFilter={onFilterUsers} + onUpdatePermissions={onUpdateUserPermissions} + onUpdateRoles={onUpdateUserRoles} /> ), }, @@ -124,6 +128,8 @@ AdminTabs.propTypes = { onUpdateRoleUsers: func.isRequired, onUpdateRolePermissions: func.isRequired, hasRoles: bool.isRequired, + onUpdateUserPermissions: func, + onUpdateUserRoles: func, } export default AdminTabs diff --git a/ui/src/admin/components/UserRow.js b/ui/src/admin/components/UserRow.js index d8aa090e0..6d5e513c3 100644 --- a/ui/src/admin/components/UserRow.js +++ b/ui/src/admin/components/UserRow.js @@ -19,7 +19,17 @@ const UserRow = ({ onSave, onCancel, onDelete, + onUpdatePermissions, + onUpdateRoles, }) => { + const handleUpdatePermissions = (allowed) => { + onUpdatePermissions(user, [{scope: 'all', allowed}]) + } + + const handleUpdateRoles = (roleNames) => { + onUpdateRoles(user, allRoles.filter(r => roleNames.find(rn => rn === r.name))) + } + if (isEditing) { return (