mirror of
https://github.com/Unleash/unleash.git
synced 2025-05-22 01:16:07 +02:00
Feat project segments permissions (#3346)
- Adds `UPDATE_PROJECT_SEGMENT` permission checks; - Allows `PermissionIconButton` to evaluate multiple permissions, just like `PermissionButton`; - Also includes a possible fix for `hasAccess` in `AccessProvider`.
This commit is contained in:
parent
6b165f3663
commit
2c2da4ad3f
@ -13,7 +13,7 @@ import {
|
|||||||
} from 'hooks/useHasAccess';
|
} from 'hooks/useHasAccess';
|
||||||
|
|
||||||
interface IPermissionIconButtonProps {
|
interface IPermissionIconButtonProps {
|
||||||
permission: string;
|
permission: string | string[];
|
||||||
projectId?: string;
|
projectId?: string;
|
||||||
environmentId?: string;
|
environmentId?: string;
|
||||||
className?: string;
|
className?: string;
|
||||||
|
@ -70,22 +70,12 @@ const checkPermission = (
|
|||||||
if (
|
if (
|
||||||
p.permission === permission &&
|
p.permission === permission &&
|
||||||
(p.project === project || p.project === '*') &&
|
(p.project === project || p.project === '*') &&
|
||||||
(p.environment === environment || p.environment === '*')
|
(!p.environment ||
|
||||||
|
p.environment === environment ||
|
||||||
|
p.environment === '*')
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
return p.permission === permission && !p.project && !p.environment;
|
||||||
p.permission === permission &&
|
|
||||||
(p.project === project || p.project === '*') &&
|
|
||||||
!Boolean(p.environment)
|
|
||||||
) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
p.permission === permission &&
|
|
||||||
p.project === undefined &&
|
|
||||||
p.environment === null
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
@ -39,3 +39,4 @@ export const SKIP_CHANGE_REQUEST = 'SKIP_CHANGE_REQUEST';
|
|||||||
export const READ_PROJECT_API_TOKEN = 'READ_PROJECT_API_TOKEN';
|
export const READ_PROJECT_API_TOKEN = 'READ_PROJECT_API_TOKEN';
|
||||||
export const CREATE_PROJECT_API_TOKEN = 'CREATE_PROJECT_API_TOKEN';
|
export const CREATE_PROJECT_API_TOKEN = 'CREATE_PROJECT_API_TOKEN';
|
||||||
export const DELETE_PROJECT_API_TOKEN = 'DELETE_PROJECT_API_TOKEN';
|
export const DELETE_PROJECT_API_TOKEN = 'DELETE_PROJECT_API_TOKEN';
|
||||||
|
export const UPDATE_PROJECT_SEGMENT = 'UPDATE_PROJECT_SEGMENT';
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
import { CREATE_SEGMENT } from 'component/providers/AccessProvider/permissions';
|
import {
|
||||||
|
CREATE_SEGMENT,
|
||||||
|
UPDATE_PROJECT_SEGMENT,
|
||||||
|
} from 'component/providers/AccessProvider/permissions';
|
||||||
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
|
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
|
||||||
import { NAVIGATE_TO_CREATE_SEGMENT } from 'utils/testIds';
|
import { NAVIGATE_TO_CREATE_SEGMENT } from 'utils/testIds';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
@ -17,7 +20,8 @@ export const CreateSegmentButton = () => {
|
|||||||
navigate('/segments/create');
|
navigate('/segments/create');
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
permission={CREATE_SEGMENT}
|
permission={[CREATE_SEGMENT, UPDATE_PROJECT_SEGMENT]}
|
||||||
|
projectId={projectId}
|
||||||
data-testid={NAVIGATE_TO_CREATE_SEGMENT}
|
data-testid={NAVIGATE_TO_CREATE_SEGMENT}
|
||||||
>
|
>
|
||||||
New segment
|
New segment
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
import { ISegment } from 'interfaces/segment';
|
import { ISegment } from 'interfaces/segment';
|
||||||
import { Edit } from '@mui/icons-material';
|
import { Edit } from '@mui/icons-material';
|
||||||
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
|
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
|
||||||
import { UPDATE_SEGMENT } from 'component/providers/AccessProvider/permissions';
|
import {
|
||||||
|
UPDATE_SEGMENT,
|
||||||
|
UPDATE_PROJECT_SEGMENT,
|
||||||
|
} from 'component/providers/AccessProvider/permissions';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
|
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
|
||||||
|
|
||||||
@ -24,7 +27,8 @@ export const EditSegmentButton = ({ segment }: IEditSegmentButtonProps) => {
|
|||||||
navigate(`/segments/edit/${segment.id}`);
|
navigate(`/segments/edit/${segment.id}`);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
permission={UPDATE_SEGMENT}
|
permission={[UPDATE_SEGMENT, UPDATE_PROJECT_SEGMENT]}
|
||||||
|
projectId={projectId}
|
||||||
tooltipProps={{ title: 'Edit segment' }}
|
tooltipProps={{ title: 'Edit segment' }}
|
||||||
>
|
>
|
||||||
<Edit data-loading />
|
<Edit data-loading />
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
import { ISegment } from 'interfaces/segment';
|
import { ISegment } from 'interfaces/segment';
|
||||||
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
|
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
|
||||||
import { DELETE_SEGMENT } from 'component/providers/AccessProvider/permissions';
|
import {
|
||||||
|
DELETE_SEGMENT,
|
||||||
|
UPDATE_PROJECT_SEGMENT,
|
||||||
|
} from 'component/providers/AccessProvider/permissions';
|
||||||
import { Delete } from '@mui/icons-material';
|
import { Delete } from '@mui/icons-material';
|
||||||
import { SEGMENT_DELETE_BTN_ID } from 'utils/testIds';
|
import { SEGMENT_DELETE_BTN_ID } from 'utils/testIds';
|
||||||
import { useSegments } from 'hooks/api/getters/useSegments/useSegments';
|
import { useSegments } from 'hooks/api/getters/useSegments/useSegments';
|
||||||
@ -10,12 +13,14 @@ import { SegmentDelete } from 'component/segments/SegmentDelete/SegmentDelete';
|
|||||||
import { useSegmentsApi } from 'hooks/api/actions/useSegmentsApi/useSegmentsApi';
|
import { useSegmentsApi } from 'hooks/api/actions/useSegmentsApi/useSegmentsApi';
|
||||||
import { formatUnknownError } from 'utils/formatUnknownError';
|
import { formatUnknownError } from 'utils/formatUnknownError';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
import { useOptionalPathParam } from 'hooks/useOptionalPathParam';
|
||||||
|
|
||||||
interface IRemoveSegmentButtonProps {
|
interface IRemoveSegmentButtonProps {
|
||||||
segment: ISegment;
|
segment: ISegment;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => {
|
export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => {
|
||||||
|
const projectId = useOptionalPathParam('projectId');
|
||||||
const { refetchSegments } = useSegments();
|
const { refetchSegments } = useSegments();
|
||||||
const { deleteSegment } = useSegmentsApi();
|
const { deleteSegment } = useSegmentsApi();
|
||||||
const { setToastData, setToastApiError } = useToast();
|
const { setToastData, setToastApiError } = useToast();
|
||||||
@ -40,7 +45,8 @@ export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => {
|
|||||||
<>
|
<>
|
||||||
<PermissionIconButton
|
<PermissionIconButton
|
||||||
onClick={() => toggleModal(true)}
|
onClick={() => toggleModal(true)}
|
||||||
permission={DELETE_SEGMENT}
|
permission={[DELETE_SEGMENT, UPDATE_PROJECT_SEGMENT]}
|
||||||
|
projectId={projectId}
|
||||||
tooltipProps={{ title: 'Remove segment' }}
|
tooltipProps={{ title: 'Remove segment' }}
|
||||||
data-testid={`${SEGMENT_DELETE_BTN_ID}_${segment.name}`}
|
data-testid={`${SEGMENT_DELETE_BTN_ID}_${segment.name}`}
|
||||||
>
|
>
|
||||||
|
Loading…
Reference in New Issue
Block a user