mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01: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:
		
							parent
							
								
									ee730e0708
								
							
						
					
					
						commit
						ea401f3ec5
					
				@ -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({
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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}
 | 
				
			||||||
                >
 | 
					                >
 | 
				
			||||||
 | 
				
			|||||||
@ -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,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user