Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
3134068
Add segment page
kyle-ssg Aug 5, 2025
5d97da7
Add segment page
kyle-ssg Aug 5, 2025
ea9eef4
add my to breadcrumb
kyle-ssg Aug 5, 2025
df8de68
Migrate feature override row to component
kyle-ssg Aug 12, 2025
c953bec
Update frontend/web/components/Breadcrumb.tsx
kyle-ssg Aug 26, 2025
c77bb77
safe handle url push
kyle-ssg Aug 26, 2025
da52a0d
Merge remote-tracking branch 'origin/feat/segment-page' into feat/seg…
kyle-ssg Aug 26, 2025
a9d3d33
Offset 2
kyle-ssg Aug 26, 2025
ab16a33
Merge branch 'refs/heads/main' into feat/segment-page
matthewelwell Aug 29, 2025
00c331f
Merge branch 'main' into feat/segment-page
kyle-ssg Sep 16, 2025
a438251
Merge remote-tracking branch 'origin/feat/segment-page' into feat/seg…
kyle-ssg Sep 16, 2025
f4fdcf6
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Sep 16, 2025
5fa2c8f
fix feature override import
kyle-ssg Sep 16, 2025
b526540
Fix tests
kyle-ssg Sep 16, 2025
36d5c78
Merge branch 'feat/segment-page' into chore/componentise-feature-over…
kyle-ssg Sep 16, 2025
3b246bd
Fix segment tab classes
kyle-ssg Sep 23, 2025
53f967a
Fix segment tab classes
kyle-ssg Sep 23, 2025
73d31a1
Add toast
kyle-ssg Sep 23, 2025
6e19718
Add manageSegmentsPermission to create segment
kyle-ssg Sep 23, 2025
3c90c18
Refactor remove segment
kyle-ssg Sep 23, 2025
b7826e9
Merge branch 'feat/segment-page' into chore/componentise-feature-over…
kyle-ssg Sep 23, 2025
5bf0aac
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Sep 23, 2025
3d51e9c
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Sep 23, 2025
0633e23
fix identity override
kyle-ssg Sep 23, 2025
b8f706a
Componentise overrides
kyle-ssg Sep 23, 2025
c7fd718
Componentise overrides
kyle-ssg Sep 23, 2025
c5d433a
Refactor
kyle-ssg Sep 30, 2025
ec576fb
Improve feature override row refactoring
kyle-ssg Sep 30, 2025
149fc8c
CTA Feature override
kyle-ssg Sep 30, 2025
596f736
re-add tests
kyle-ssg Sep 30, 2025
022c27d
Refactor
kyle-ssg Sep 30, 2025
480a0a8
Chore/componentise feature override row improved (#6118)
kyle-ssg Sep 30, 2025
9d6f43a
Refactor
kyle-ssg Sep 30, 2025
f91a243
Merge branch 'chore/componentise-feature-override-row-improved' into …
kyle-ssg Sep 30, 2025
661872f
Permission fix
kyle-ssg Sep 30, 2025
162fceb
fix identifier
kyle-ssg Sep 30, 2025
e52f9f9
Fix identityName param
kyle-ssg Sep 30, 2025
0ba5c15
Fix edit permission check
kyle-ssg Sep 30, 2025
80811d5
Componentise feature filters
kyle-ssg Sep 30, 2025
a5dc772
Fix segment override logic
kyle-ssg Sep 30, 2025
4d340e3
Fix identity override logic
kyle-ssg Sep 30, 2025
3ee508e
Fix identity override logic
kyle-ssg Sep 30, 2025
7971ac7
Merge branch 'chore/componentise-feature-override-row' into chore/com…
kyle-ssg Sep 30, 2025
657fd59
QA
kyle-ssg Oct 7, 2025
ce67965
Merge branch 'chore/componentise-feature-override-row' into chore/com…
kyle-ssg Oct 7, 2025
12eee3a
Make filtering consistent across user and features page
kyle-ssg Oct 7, 2025
f061a48
simplify filters
kyle-ssg Oct 7, 2025
2939e21
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Oct 7, 2025
e441e03
Merge branch 'chore/componentise-feature-override-row' into chore/com…
kyle-ssg Oct 7, 2025
10719cb
re-add loading logic
kyle-ssg Oct 7, 2025
b790d58
Simplify loading logic
kyle-ssg Oct 7, 2025
17ea4ba
Don't assume code references exist
kyle-ssg Oct 7, 2025
772e147
Don't assume code references exist
kyle-ssg Oct 7, 2025
f3ba094
fix text wrapping
kyle-ssg Oct 7, 2025
7b18f28
Fix tag filter in url
kyle-ssg Oct 7, 2025
b4724ca
Merge branch 'chore/componentise-feature-filters' into feat/segment-f…
kyle-ssg Oct 7, 2025
eb0be4b
Update frontend/web/components/feature-page/FeatureFilters.tsx
kyle-ssg Oct 14, 2025
6174bd5
Remove releasePipelines
kyle-ssg Oct 14, 2025
9b562f6
Merge remote-tracking branch 'origin/chore/componentise-feature-filte…
kyle-ssg Oct 14, 2025
dbb085a
remove sortToHeader
kyle-ssg Oct 14, 2025
f7e3cff
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Oct 14, 2025
ba3b42e
Claude context
kyle-ssg Oct 14, 2025
9746d13
Claude context
kyle-ssg Oct 14, 2025
5955f25
Claude context
kyle-ssg Oct 14, 2025
efedbdc
Add api-sync / optmimise contexts
kyle-ssg Oct 21, 2025
cae73d7
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Oct 21, 2025
23a6495
Add api-sync / optimise contexts
kyle-ssg Oct 21, 2025
af5bfda
Merge remote-tracking branch 'origin/chore/claude-context' into chore…
kyle-ssg Oct 21, 2025
acd5420
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Oct 21, 2025
29bae85
Merge branch 'chore/componentise-feature-override-row' into chore/com…
kyle-ssg Oct 21, 2025
162daef
Fix table value filter
kyle-ssg Oct 21, 2025
8b6d03d
Merge branch 'chore/componentise-feature-filters' into feat/segment-f…
kyle-ssg Oct 21, 2025
2058123
Fixes
kyle-ssg Oct 21, 2025
a1c5d83
Use unified endpoint for segment feature states
kyle-ssg Oct 21, 2025
143f02e
namespace segment tab
kyle-ssg Oct 21, 2025
dcb6632
Merge branch 'feat/segment-feature-state-view' into feat/segment-feat…
kyle-ssg Oct 21, 2025
6934c5f
Tests
kyle-ssg Oct 21, 2025
72e8214
Clean up types
kyle-ssg Oct 21, 2025
21697fe
chore: componentise feature filters (#6119)
kyle-ssg Oct 28, 2025
ee90b70
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Oct 28, 2025
ac641db
Update contexts
kyle-ssg Nov 4, 2025
0c03b8f
Update contexts
kyle-ssg Nov 4, 2025
fb2df65
Update contexts
kyle-ssg Nov 4, 2025
b064e81
Update contexts
kyle-ssg Nov 4, 2025
27019de
Update contexts
kyle-ssg Nov 4, 2025
96c81d6
Update contexts
kyle-ssg Nov 4, 2025
4a3bafa
Update contexts
kyle-ssg Nov 4, 2025
4b846d9
Update contexts
kyle-ssg Nov 4, 2025
6cbde85
Merge branch 'main' into chore/claude-context
kyle-ssg Nov 4, 2025
dd7b743
Update contexts
kyle-ssg Nov 10, 2025
6a8f202
Update frontend/web/components/feature-page/FeatureFilters.tsx
kyle-ssg Nov 11, 2025
ad8a35d
Update frontend/web/components/feature-page/FeatureFilters.tsx
kyle-ssg Nov 11, 2025
659abf1
return early if key fields are null
kyle-ssg Nov 11, 2025
a00269e
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Nov 11, 2025
ae76a46
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 11, 2025
1b90569
Remove !
kyle-ssg Nov 11, 2025
43e32ad
Remove !
kyle-ssg Nov 11, 2025
7dcb60c
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 11, 2025
0ed455b
Unused import
kyle-ssg Nov 11, 2025
1381fb0
Fix sort order types
kyle-ssg Nov 11, 2025
0ac5ded
Re-add remove segment button
kyle-ssg Nov 11, 2025
df85873
Update claude contexts
kyle-ssg Nov 11, 2025
a26b39a
Update claude contexts
kyle-ssg Nov 11, 2025
9ef5383
Fix sortorder functionality
kyle-ssg Nov 11, 2025
2ed1777
QA feedback
kyle-ssg Nov 11, 2025
e800bcc
QA feedback
kyle-ssg Nov 11, 2025
24572d7
Adjust environment select
kyle-ssg Nov 11, 2025
212de78
Adjust fetching and loading logic
kyle-ssg Nov 11, 2025
f55b8ef
Adjust fetching and loading logic
kyle-ssg Nov 11, 2025
4974a76
Prevent toggle feature from segment page
kyle-ssg Nov 16, 2025
68c09cb
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Nov 18, 2025
1a6b706
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Nov 18, 2025
62262c1
clean up confirm toggle function
kyle-ssg Nov 18, 2025
5b9588a
fix vertical alignment for feature row
kyle-ssg Nov 18, 2025
189b701
Merge branch 'feat/segment-feature-state-view' into chore/create-flag…
kyle-ssg Nov 18, 2025
102d47a
Create flag migration
kyle-ssg Dec 2, 2025
f443064
Highlight segment when opening a feature
kyle-ssg Dec 2, 2025
aae4428
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Dec 2, 2025
454d9b7
Highlight segment when opening a feature
kyle-ssg Dec 2, 2025
a734a6c
Merge branch 'chore/componentise-feature-override-row' into feat/segm…
kyle-ssg Dec 2, 2025
d4d2f0b
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 2, 2025
01393b4
Merge branch 'refs/heads/feat/segment-feature-state-view' into chore/…
kyle-ssg Dec 2, 2025
142c32e
Migrate tabs
kyle-ssg Dec 2, 2025
752ce06
Add settings and value tabs
kyle-ssg Dec 2, 2025
a4c4c55
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Dec 2, 2025
aec8e29
Revert claude changes
kyle-ssg Dec 2, 2025
8c40502
Merge remote-tracking branch 'origin/chore/create-flag-migration' int…
kyle-ssg Dec 2, 2025
fd08db6
Migrate components
kyle-ssg Dec 2, 2025
2732306
Revert changes
kyle-ssg Dec 2, 2025
1c117d7
feat: segment feature state view (#6137)
kyle-ssg Dec 2, 2025
c3ad50e
Fixes
kyle-ssg Dec 3, 2025
b9f4933
Merge branch 'main' into chore/componentise-feature-override-row
kyle-ssg Dec 3, 2025
cf3119b
Fixes
kyle-ssg Dec 3, 2025
14f7c5b
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
b2b275b
Fixes
kyle-ssg Dec 3, 2025
984e6e3
Fix merge hell
kyle-ssg Dec 3, 2025
51860b9
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
52a2dc7
Fix merge hell
kyle-ssg Dec 3, 2025
2a4a8a5
Fix segment override permission check and project flag cache keys
kyle-ssg Dec 3, 2025
83c5a9f
Merge branch 'chore/componentise-feature-override-row' into chore/cre…
kyle-ssg Dec 3, 2025
13b67d0
Fix has changed check for overrides
kyle-ssg Dec 3, 2025
99a69bb
Fix has changed check for overrides
kyle-ssg Dec 3, 2025
76251b2
Revert unecessary import changes
kyle-ssg Dec 3, 2025
924424f
Edit change request
kyle-ssg Dec 3, 2025
c39b418
chore: Rename CreateFlag (#6388)
kyle-ssg Dec 9, 2025
fa183df
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 9, 2025
9cb2da0
Merge remote-tracking branch 'origin/chore/create-flag-migration' int…
kyle-ssg Dec 9, 2025
1eccdea
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
76f0d4a
Edit change request permissions
kyle-ssg Dec 16, 2025
1b6e719
Only allow delete / edit your own change request
kyle-ssg Dec 16, 2025
a89df89
Enumerate permission types
kyle-ssg Dec 16, 2025
932be79
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Dec 16, 2025
1316759
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
a81aad6
Fix merge import
kyle-ssg Dec 16, 2025
bd1c041
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
ae5582e
Merge branch 'feat/edit-versioned-change-request' into chore/permissi…
kyle-ssg Dec 16, 2025
c8e5429
Remove unused state
kyle-ssg Dec 16, 2025
7cf7c8b
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Dec 16, 2025
0313fd7
Merge branch 'feat/edit-versioned-change-request' into chore/permissi…
kyle-ssg Dec 16, 2025
7b4029c
Migrate permissions to enum
kyle-ssg Dec 16, 2025
6bc28f1
Migrate permissions to enum
kyle-ssg Dec 16, 2025
512696b
Small typos
kyle-ssg Dec 16, 2025
2afaba5
Fix identity override permission
kyle-ssg Dec 16, 2025
5907ed3
Fix import name
kyle-ssg Dec 16, 2025
a1825eb
Update frontend/common/constants.ts
kyle-ssg Jan 6, 2026
39fa2a4
Update frontend/web/components/modals/create-feature/index.js
kyle-ssg Jan 6, 2026
fc49c2b
Update frontend/web/components/modals/create-feature/index.js
kyle-ssg Jan 6, 2026
42704e8
Merge main into chore/create-flag-migration
kyle-ssg Jan 6, 2026
6f090f5
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
a6e4bf5
Fix import
kyle-ssg Jan 6, 2026
0a90074
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
3a47014
Maintain change request date when editing, improve toast message
kyle-ssg Jan 6, 2026
f23186d
Fix conflict
kyle-ssg Jan 6, 2026
1dd143b
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 6, 2026
cdd78a1
Improve permission types
kyle-ssg Jan 13, 2026
d329c91
Improve permission types
kyle-ssg Jan 13, 2026
58b4245
Refactor permission descriptions
kyle-ssg Jan 13, 2026
6bbf06a
Merge branch 'main' into chore/create-flag-migration
kyle-ssg Jan 13, 2026
62fa702
Merge branch 'chore/create-flag-migration' into feat/edit-versioned-c…
kyle-ssg Jan 13, 2026
0f3407a
Merge feat/edit-versioned-change-request into chore/permission-types
kyle-ssg Jan 13, 2026
0c1fcb4
Unused imports
kyle-ssg Jan 13, 2026
6d6c865
Refactor Constants.environmentPermissions usages
kyle-ssg Jan 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions frontend/common/constants.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import { OAuthType } from './types/requests'
import { SegmentCondition } from './types/responses'
import Utils from './utils/utils'

import Project from './project'
import { integrationCategories } from 'components/pages/IntegrationsPage'
import {
EnvironmentPermission,
EnvironmentPermissionDescriptions,
OrganisationPermission,
OrganisationPermissionDescriptions,
ProjectPermission,
ProjectPermissionDescriptions,
} from './types/permissions.types'

const keywords = {
FEATURE_FUNCTION: 'myCoolFeature',
FEATURE_NAME: 'my_cool_feature',
Expand Down Expand Up @@ -252,8 +260,13 @@ const Constants = {
value: '',
} as SegmentCondition,
defaultTagColor: '#3d4db6',
environmentPermissions: (perm: string) =>
`To manage this feature you need the <i>${perm}</i> permission for this environment.<br/>Please contact a member of this environment who has administrator privileges.`,
environmentPermissions: (perm: EnvironmentPermission) => {
const description =
perm === 'ADMIN'
? 'Administrator'
: EnvironmentPermissionDescriptions[perm]
return `To manage this feature you need the <i>${description}</i> permission for this environment.<br/>Please contact a member of this environment who has administrator privileges.`
},
events: {
'ACCEPT_INVITE': (org: any) => ({
'category': 'Invite',
Expand Down Expand Up @@ -623,8 +636,13 @@ const Constants = {
modals: {
'PAYMENT': 'Payment Modal',
},
organisationPermissions: (perm: string) =>
`To manage this feature you need the <i>${perm}</i> permission for this organisastion.<br/>Please contact a member of this organisation who has administrator privileges.`,
organisationPermissions: (perm: OrganisationPermission) => {
const description =
perm === 'ADMIN'
? 'Administrator'
: OrganisationPermissionDescriptions[perm]
return `To manage this feature you need the <i>${description}</i> permission for this organisation.<br/>Please contact a member of this organisation who has administrator privileges.`
},
pages: {
'ACCOUNT': 'Account Page',
'AUDIT_LOG': 'Audit Log Page',
Expand Down Expand Up @@ -656,8 +674,11 @@ const Constants = {
'#FFBE71',
'#F57C78',
],
projectPermissions: (perm: string) =>
`To use this feature you need the <i>${perm}</i> permission for this project.<br/>Please contact a member of this project who has administrator privileges.`,
projectPermissions: (perm: ProjectPermission) => {
const description =
perm === 'ADMIN' ? 'Administrator' : ProjectPermissionDescriptions[perm]
return `To use this feature you need the <i>${description}</i> permission for this project.<br/>Please contact a member of this project who has administrator privileges.`
},
resourceTypes: {
GITHUB_ISSUE: {
id: 1,
Expand Down
202 changes: 186 additions & 16 deletions frontend/common/providers/Permission.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,93 @@
import React, { FC, ReactNode, useMemo } from 'react'
import { useGetPermissionQuery } from 'common/services/usePermission'
import { PermissionLevel } from 'common/types/requests'
import AccountStore from 'common/stores/account-store'
import intersection from 'lodash/intersection'
import { cloneDeep } from 'lodash'
import Utils from 'common/utils/utils'
import Constants from 'common/constants'
import {
ADMIN_PERMISSION,
EnvironmentPermission,
OrganisationPermission,
ProjectPermission,
} from 'common/types/permissions.types'

type PermissionType = {
id: any
permission: string
/**
* Base props shared across all permission levels
*/
type BasePermissionProps = {
id: number | string
tags?: number[]
level: PermissionLevel
children: (data: { permission: boolean; isLoading: boolean }) => ReactNode
children:
| ReactNode
| ((data: { permission: boolean; isLoading: boolean }) => ReactNode)
fallback?: ReactNode
permissionName?: string
showTooltip?: boolean
}

/**
* Discriminated union types for each permission level
* This means we can detect a mismatch between level and permission
*/
type OrganisationLevelProps = BasePermissionProps & {
level: 'organisation'
permission: OrganisationPermission
}

type ProjectLevelProps = BasePermissionProps & {
level: 'project'
permission: ProjectPermission
}

type EnvironmentLevelProps = BasePermissionProps & {
level: 'environment'
permission: EnvironmentPermission
}

type PermissionType =
| OrganisationLevelProps
| ProjectLevelProps
| EnvironmentLevelProps

type UseHasPermissionParams = {
id: number | string
level: 'organisation' | 'project' | 'environment'
permission: OrganisationPermission | ProjectPermission | EnvironmentPermission
tags?: number[]
}

/**
* Hook to check if the current user has a specific permission
*
* Fetches permission data and checks if the user has the requested permission.
* Supports tag-based permissions where additional permissions can be granted
* based on tag intersection.
*
* @param {Object} params - The permission check parameters
* @param {number | string} params.id - The resource ID to check permissions for
* @param {PermissionLevel} params.level - The permission level to check at
* @param {string} params.permission - The permission key to check
* @param {number[]} [params.tags] - Optional tag IDs for tag-based permission checking
* @returns {Object} Object containing permission status and loading state
* @returns {boolean} returns.isLoading - Whether the permission data is still loading
* @returns {boolean} returns.isSuccess - Whether the permission data was fetched successfully
* @returns {boolean} returns.permission - Whether the user has the requested permission
*/
export const useHasPermission = ({
id,
level,
permission,
tags,
}: Omit<PermissionType, 'children'>) => {
}: UseHasPermissionParams) => {
const {
data: permissionsData,
isLoading,
isSuccess,
} = useGetPermissionQuery({ id: `${id}`, level }, { skip: !id || !level })
} = useGetPermissionQuery(
{ id: id as number, level },
{ skip: !id || !level },
)
const data = useMemo(() => {
if (!tags?.length || !permissionsData?.tag_based_permissions)
return permissionsData
Expand All @@ -45,11 +109,68 @@ export const useHasPermission = ({
}
}

/**
* Permission component for conditional rendering based on user permissions
*
* This component checks if the current user has a specific permission and conditionally
* renders its children. It supports multiple rendering patterns:
*
* @example
* // Basic usage with simple children
* <Permission level="project" permission="CREATE_FEATURE" id={projectId}>
* <Button>Create Feature</Button>
* </Permission>
*
* @example
* // Using render function to access permission state
* <Permission level="project" permission="CREATE_FEATURE" id={projectId}>
* {({ permission, isLoading }) => (
* <Button disabled={!permission || isLoading}>Create Feature</Button>
* )}
* </Permission>
*
* @example
* // With tooltip on permission denial
* <Permission
* level="project"
* permission="CREATE_FEATURE"
* id={projectId}
* showTooltip
* permissionName="Create Features"
* >
* <Button>Create Feature</Button>
* </Permission>
*
* @example
* // With fallback content
* <Permission
* level="project"
* permission="DELETE_FEATURE"
* id={projectId}
* fallback={<Text>You don't have permission to delete features</Text>}
* >
* <Button>Delete Feature</Button>
* </Permission>
*
* @example
* // With tag-based permissions
* <Permission
* level="project"
* permission="UPDATE_FEATURE"
* id={projectId}
* tags={[tagId1, tagId2]}
* >
* <Button>Update Feature</Button>
* </Permission>
*/
const Permission: FC<PermissionType> = ({
children,
fallback,
id,
level,
permission,
permissionName,
showTooltip = false,
tags,
}) => {
const { isLoading, permission: hasPermission } = useHasPermission({
Expand All @@ -58,14 +179,63 @@ const Permission: FC<PermissionType> = ({
permission,
tags,
})
return (
<>
{children({
isLoading,
permission: hasPermission || AccountStore.isAdmin(),
}) || null}
</>
)

const finalPermission = hasPermission || AccountStore.isAdmin()

const getPermissionDescription = (): string => {
if (permission === ADMIN_PERMISSION) {
switch (level) {
case 'environment':
return Constants.environmentPermissions(ADMIN_PERMISSION)
case 'project':
return Constants.projectPermissions(ADMIN_PERMISSION)
default:
return Constants.organisationPermissions(ADMIN_PERMISSION)
}
}

switch (level) {
case 'environment':
return Constants.environmentPermissions(
permission as EnvironmentPermission,
)
case 'project':
return Constants.projectPermissions(permission as ProjectPermission)
default:
return Constants.organisationPermissions(
permission as OrganisationPermission,
)
}
}

const tooltipMessage = permissionName || getPermissionDescription()

if (typeof children === 'function') {
const renderedChildren = children({
isLoading,
permission: finalPermission,
})

if (finalPermission || !showTooltip) {
return <>{renderedChildren || null}</>
}

return Utils.renderWithPermission(
finalPermission,
tooltipMessage,
renderedChildren,
)
}

if (finalPermission) {
return <>{children}</>
}

if (showTooltip) {
return Utils.renderWithPermission(finalPermission, tooltipMessage, children)
}

return <>{fallback || null}</>
}

export default Permission
Loading
Loading