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:
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