1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-06-09 01:17:06 +02:00

feat: add changeRole (#768)

* feat: add changeRole in project

* fix: update PR based on feedback

Co-authored-by: Fredrik Strand Oseberg <fredrik.no@gmail.com>
This commit is contained in:
Youssef Khedher 2022-03-07 09:26:31 +01:00 committed by GitHub
parent ee730e0708
commit ea401f3ec5
4 changed files with 34 additions and 31 deletions

View File

@ -1,23 +1,21 @@
/* eslint-disable react/jsx-no-target-blank */ /* eslint-disable react/jsx-no-target-blank */
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Alert } from '@material-ui/lab'; import { Alert } from '@material-ui/lab';
import { ProjectAccessAddUser } from './ProjectAccessAddUser/ProjectAccessAddUser'; import { ProjectAccessAddUser } from './ProjectAccessAddUser/ProjectAccessAddUser';
import PageContent from '../../common/PageContent'; import PageContent from '../../common/PageContent';
import useUiConfig from '../../../hooks/api/getters/useUiConfig/useUiConfig'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { useStyles } from './ProjectAccess.styles'; import { useStyles } from './ProjectAccess.styles';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { IProjectViewParams } from '../../../interfaces/params'; import { IProjectViewParams } from 'interfaces/params';
import usePagination from '../../../hooks/usePagination'; import usePagination from 'hooks/usePagination';
import PaginateUI from '../../common/PaginateUI/PaginateUI'; import PaginateUI from 'component/common/PaginateUI/PaginateUI';
import useToast from '../../../hooks/useToast'; import useToast from 'hooks/useToast';
import ConfirmDialogue from '../../common/Dialogue'; import ConfirmDialogue from 'component/common/Dialogue';
import useProjectAccess, { import useProjectAccess, {
IProjectAccessUser, IProjectAccessUser,
} from '../../../hooks/api/getters/useProjectAccess/useProjectAccess'; } from 'hooks/api/getters/useProjectAccess/useProjectAccess';
import useProjectApi from '../../../hooks/api/actions/useProjectApi/useProjectApi'; import useProjectApi from 'hooks/api/actions/useProjectApi/useProjectApi';
import HeaderTitle from '../../common/HeaderTitle'; import HeaderTitle from 'component/common/HeaderTitle';
import { ProjectAccessList } from './ProjectAccessList/ProjectAccessList'; import { ProjectAccessList } from './ProjectAccessList/ProjectAccessList';
export const ProjectAccess = () => { export const ProjectAccess = () => {
@ -28,7 +26,7 @@ export const ProjectAccess = () => {
const { isOss } = useUiConfig(); const { isOss } = useUiConfig();
const { page, pages, nextPage, prevPage, setPageIndex, pageIndex } = const { page, pages, nextPage, prevPage, setPageIndex, pageIndex } =
usePagination(access.users, 10); usePagination(access.users, 10);
const { removeUserFromRole, addUserToRole } = useProjectApi(); const { removeUserFromRole, changeUserRole } = useProjectApi();
const [showDelDialogue, setShowDelDialogue] = useState(false); const [showDelDialogue, setShowDelDialogue] = useState(false);
const [user, setUser] = useState<IProjectAccessUser | undefined>(); const [user, setUser] = useState<IProjectAccessUser | undefined>();
@ -48,7 +46,7 @@ export const ProjectAccess = () => {
} }
const handleRoleChange = const handleRoleChange =
(userId: number, currRoleId: number) => (userId: number) =>
async ( async (
evt: React.ChangeEvent<{ evt: React.ChangeEvent<{
name?: string; name?: string;
@ -57,13 +55,12 @@ export const ProjectAccess = () => {
) => { ) => {
const roleId = Number(evt.target.value); const roleId = Number(evt.target.value);
try { try {
await removeUserFromRole(projectId, currRoleId, userId); await changeUserRole(projectId, roleId, userId);
await addUserToRole(projectId, roleId, userId);
refetchProjectAccess(); refetchProjectAccess();
setToastData({ setToastData({
type: 'success', type: 'success',
title: 'User role changed successfully', title: 'Success',
text: 'User role changed successfully',
}); });
} catch (err: any) { } catch (err: any) {
setToastData({ setToastData({

View File

@ -2,16 +2,13 @@ import { List } from '@material-ui/core';
import { import {
IProjectAccessOutput, IProjectAccessOutput,
IProjectAccessUser, IProjectAccessUser,
} from '../../../../hooks/api/getters/useProjectAccess/useProjectAccess'; } from 'hooks/api/getters/useProjectAccess/useProjectAccess';
import { ProjectAccessListItem } from './ProjectAccessListItem/ProjectAccessListItem'; import { ProjectAccessListItem } from './ProjectAccessListItem/ProjectAccessListItem';
import React from 'react'; import React from 'react';
interface IProjectAccesListProps { interface IProjectAccesListProps {
page: IProjectAccessUser[]; page: IProjectAccessUser[];
handleRoleChange: ( handleRoleChange: (userId: number) => (
userId: number,
currRoleId: number
) => (
evt: React.ChangeEvent<{ evt: React.ChangeEvent<{
name?: string; name?: string;
value: unknown; value: unknown;

View File

@ -11,20 +11,17 @@ import { useParams } from 'react-router-dom';
import { import {
IProjectAccessOutput, IProjectAccessOutput,
IProjectAccessUser, IProjectAccessUser,
} from '../../../../../hooks/api/getters/useProjectAccess/useProjectAccess'; } from 'hooks/api/getters/useProjectAccess/useProjectAccess';
import { IProjectViewParams } from '../../../../../interfaces/params'; import { IProjectViewParams } from 'interfaces/params';
import PermissionIconButton from '../../../../common/PermissionIconButton/PermissionIconButton'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
import { UPDATE_PROJECT } from '../../../../providers/AccessProvider/permissions'; import { UPDATE_PROJECT } from 'component/providers/AccessProvider/permissions';
import { ProjectRoleSelect } from '../../ProjectRoleSelect/ProjectRoleSelect'; import { ProjectRoleSelect } from '../../ProjectRoleSelect/ProjectRoleSelect';
import { useStyles } from '../ProjectAccessListItem/ProjectAccessListItem.styles'; import { useStyles } from '../ProjectAccessListItem/ProjectAccessListItem.styles';
import React from 'react'; import React from 'react';
interface IProjectAccessListItemProps { interface IProjectAccessListItemProps {
user: IProjectAccessUser; user: IProjectAccessUser;
handleRoleChange: ( handleRoleChange: (userId: number) => (
userId: number,
currRoleId: number
) => (
evt: React.ChangeEvent<{ evt: React.ChangeEvent<{
name?: string; name?: string;
value: unknown; value: unknown;
@ -61,7 +58,7 @@ export const ProjectAccessListItem = ({
id={`role-${user.id}-select`} id={`role-${user.id}-select`}
key={user.id} key={user.id}
placeholder="Choose role" placeholder="Choose role"
onChange={handleRoleChange(user.id, user.roleId)} onChange={handleRoleChange(user.id)}
roles={access.roles} roles={access.roles}
value={user.roleId || -1} value={user.roleId || -1}
> >

View File

@ -155,6 +155,17 @@ const useProjectApi = () => {
} }
}; };
const changeUserRole = (
projectId: string,
roleId: number,
userId: number
) => {
const path = `api/admin/projects/${projectId}/users/${userId}/roles/${roleId}`;
const req = createRequest(path, { method: 'PUT' });
return makeRequest(req.caller, req.id);
};
return { return {
createProject, createProject,
validateId, validateId,
@ -164,6 +175,7 @@ const useProjectApi = () => {
removeEnvironmentFromProject, removeEnvironmentFromProject,
addUserToRole, addUserToRole,
removeUserFromRole, removeUserFromRole,
changeUserRole,
errors, errors,
loading, loading,
searchProjectUser, searchProjectUser,