mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01: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'; | ||||
| 
 | ||||
| interface IPermissionIconButtonProps { | ||||
|     permission: string; | ||||
|     permission: string | string[]; | ||||
|     projectId?: string; | ||||
|     environmentId?: string; | ||||
|     className?: string; | ||||
|  | ||||
| @ -70,22 +70,12 @@ const checkPermission = ( | ||||
|     if ( | ||||
|         p.permission === permission && | ||||
|         (p.project === project || p.project === '*') && | ||||
|         (p.environment === environment || p.environment === '*') | ||||
|         (!p.environment || | ||||
|             p.environment === environment || | ||||
|             p.environment === '*') | ||||
|     ) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     if ( | ||||
|         p.permission === permission && | ||||
|         (p.project === project || p.project === '*') && | ||||
|         !Boolean(p.environment) | ||||
|     ) { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     return ( | ||||
|         p.permission === permission && | ||||
|         p.project === undefined && | ||||
|         p.environment === null | ||||
|     ); | ||||
|     return p.permission === permission && !p.project && !p.environment; | ||||
| }; | ||||
|  | ||||
| @ -39,3 +39,4 @@ export const SKIP_CHANGE_REQUEST = 'SKIP_CHANGE_REQUEST'; | ||||
| export const READ_PROJECT_API_TOKEN = 'READ_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 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 { NAVIGATE_TO_CREATE_SEGMENT } from 'utils/testIds'; | ||||
| import { useNavigate } from 'react-router-dom'; | ||||
| @ -17,7 +20,8 @@ export const CreateSegmentButton = () => { | ||||
|                     navigate('/segments/create'); | ||||
|                 } | ||||
|             }} | ||||
|             permission={CREATE_SEGMENT} | ||||
|             permission={[CREATE_SEGMENT, UPDATE_PROJECT_SEGMENT]} | ||||
|             projectId={projectId} | ||||
|             data-testid={NAVIGATE_TO_CREATE_SEGMENT} | ||||
|         > | ||||
|             New segment | ||||
|  | ||||
| @ -1,7 +1,10 @@ | ||||
| import { ISegment } from 'interfaces/segment'; | ||||
| import { Edit } from '@mui/icons-material'; | ||||
| 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 { useOptionalPathParam } from 'hooks/useOptionalPathParam'; | ||||
| 
 | ||||
| @ -24,7 +27,8 @@ export const EditSegmentButton = ({ segment }: IEditSegmentButtonProps) => { | ||||
|                     navigate(`/segments/edit/${segment.id}`); | ||||
|                 } | ||||
|             }} | ||||
|             permission={UPDATE_SEGMENT} | ||||
|             permission={[UPDATE_SEGMENT, UPDATE_PROJECT_SEGMENT]} | ||||
|             projectId={projectId} | ||||
|             tooltipProps={{ title: 'Edit segment' }} | ||||
|         > | ||||
|             <Edit data-loading /> | ||||
|  | ||||
| @ -1,6 +1,9 @@ | ||||
| import { ISegment } from 'interfaces/segment'; | ||||
| 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 { SEGMENT_DELETE_BTN_ID } from 'utils/testIds'; | ||||
| 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 { formatUnknownError } from 'utils/formatUnknownError'; | ||||
| import { useState } from 'react'; | ||||
| import { useOptionalPathParam } from 'hooks/useOptionalPathParam'; | ||||
| 
 | ||||
| interface IRemoveSegmentButtonProps { | ||||
|     segment: ISegment; | ||||
| } | ||||
| 
 | ||||
| export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => { | ||||
|     const projectId = useOptionalPathParam('projectId'); | ||||
|     const { refetchSegments } = useSegments(); | ||||
|     const { deleteSegment } = useSegmentsApi(); | ||||
|     const { setToastData, setToastApiError } = useToast(); | ||||
| @ -40,7 +45,8 @@ export const RemoveSegmentButton = ({ segment }: IRemoveSegmentButtonProps) => { | ||||
|         <> | ||||
|             <PermissionIconButton | ||||
|                 onClick={() => toggleModal(true)} | ||||
|                 permission={DELETE_SEGMENT} | ||||
|                 permission={[DELETE_SEGMENT, UPDATE_PROJECT_SEGMENT]} | ||||
|                 projectId={projectId} | ||||
|                 tooltipProps={{ title: 'Remove segment' }} | ||||
|                 data-testid={`${SEGMENT_DELETE_BTN_ID}_${segment.name}`} | ||||
|             > | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user