Skip to content

Commit 093e79a

Browse files
fix: hide dev ui links for users with viewer rights (#1824)
1 parent 2e618f4 commit 093e79a

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

src/components/BasicNodeViewer/BasicNodeViewer.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import React from 'react';
33
import {ArrowUpRightFromSquare} from '@gravity-ui/icons';
44
import {Icon} from '@gravity-ui/uikit';
55

6+
import {selectIsUserAllowedToMakeChanges} from '../../store/reducers/authentication/authentication';
67
import type {PreparedNode} from '../../store/reducers/node/types';
78
import type {AdditionalNodesProps} from '../../types/additionalProps';
89
import {cn} from '../../utils/cn';
910
import {
1011
createDeveloperUIInternalPageHref,
1112
createDeveloperUILinkWithNodeId,
1213
} from '../../utils/developerUI/developerUI';
14+
import {useTypedSelector} from '../../utils/hooks';
1315
import {EntityStatus} from '../EntityStatus/EntityStatus';
1416
import {Tags} from '../Tags';
1517

@@ -24,6 +26,8 @@ interface BasicNodeViewerProps {
2426
}
2527

2628
export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNodeViewerProps) => {
29+
const isUserAllowedToMakeChanges = useTypedSelector(selectIsUserAllowedToMakeChanges);
30+
2731
let developerUIInternalHref: string | undefined;
2832

2933
if (additionalNodesProps?.getNodeRef) {
@@ -42,7 +46,7 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo
4246
<React.Fragment>
4347
<div className={b('title')}>Node</div>
4448
<EntityStatus status={node.SystemState} name={node.Host} />
45-
{developerUIInternalHref && (
49+
{developerUIInternalHref && isUserAllowedToMakeChanges ? (
4650
<a
4751
rel="noopener noreferrer"
4852
className={b('link', {external: true})}
@@ -51,7 +55,7 @@ export const BasicNodeViewer = ({node, additionalNodesProps, className}: BasicNo
5155
>
5256
<Icon data={ArrowUpRightFromSquare} />
5357
</a>
54-
)}
58+
) : null}
5559

5660
<div className={b('id')}>
5761
<label className={b('label')}>NodeID</label>

src/containers/Header/Header.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {Breadcrumbs} from '@gravity-ui/uikit';
44

55
import {InternalLink} from '../../components/InternalLink';
66
import {LinkWithIcon} from '../../components/LinkWithIcon/LinkWithIcon';
7+
import {selectIsUserAllowedToMakeChanges} from '../../store/reducers/authentication/authentication';
78
import {useClusterBaseInfo} from '../../store/reducers/cluster/cluster';
89
import {cn} from '../../utils/cn';
910
import {DEVELOPER_UI_TITLE} from '../../utils/constants';
@@ -23,6 +24,7 @@ interface HeaderProps {
2324

2425
function Header({mainPage}: HeaderProps) {
2526
const {page, pageBreadcrumbsOptions} = useTypedSelector((state) => state.header);
27+
const isUserAllowedToMakeChanges = useTypedSelector(selectIsUserAllowedToMakeChanges);
2628

2729
const clusterInfo = useClusterBaseInfo();
2830

@@ -78,10 +80,12 @@ function Header({mainPage}: HeaderProps) {
7880
}}
7981
/>
8082

81-
<LinkWithIcon
82-
title={DEVELOPER_UI_TITLE}
83-
url={createDeveloperUIInternalPageHref()}
84-
/>
83+
{isUserAllowedToMakeChanges ? (
84+
<LinkWithIcon
85+
title={DEVELOPER_UI_TITLE}
86+
url={createDeveloperUIInternalPageHref()}
87+
/>
88+
) : null}
8589
</header>
8690
);
8791
};

src/containers/Node/NodeStructure/Pdisk.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {PDiskInfo} from '../../../components/PDiskInfo/PDiskInfo';
1010
import {ProgressViewer} from '../../../components/ProgressViewer/ProgressViewer';
1111
import {StatusIcon} from '../../../components/StatusIcon/StatusIcon';
1212
import {VDiskInfo} from '../../../components/VDiskInfo/VDiskInfo';
13+
import {selectIsUserAllowedToMakeChanges} from '../../../store/reducers/authentication/authentication';
1314
import type {
1415
PreparedStructurePDisk,
1516
PreparedStructureVDisk,
@@ -22,6 +23,7 @@ import {cn} from '../../../utils/cn';
2223
import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants';
2324
import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters';
2425
import {createVDiskDeveloperUILink} from '../../../utils/developerUI/developerUI';
26+
import {useTypedSelector} from '../../../utils/hooks';
2527
import i18n from '../i18n';
2628

2729
import {PDiskTitleBadge} from './PDiskTitleBadge';
@@ -56,10 +58,12 @@ function getColumns({
5658
pDiskId,
5759
selectedVdiskId,
5860
nodeId,
61+
withDeveloperUILink,
5962
}: {
6063
pDiskId: number | undefined;
6164
selectedVdiskId?: string;
6265
nodeId?: string | number;
66+
withDeveloperUILink?: boolean;
6367
}) {
6468
const columns: Column<PreparedStructureVDisk>[] = [
6569
{
@@ -85,7 +89,7 @@ function getColumns({
8589
return (
8690
<div className={b('vdisk-id', {selected: row.id === selectedVdiskId})}>
8791
<span>{vDiskSlotId}</span>
88-
{vdiskInternalViewerLink && (
92+
{vdiskInternalViewerLink && withDeveloperUILink ? (
8993
<Button
9094
size="s"
9195
className={b('external-button', {hidden: true})}
@@ -95,7 +99,7 @@ function getColumns({
9599
>
96100
<Icon data={ArrowUpRightFromSquare} />
97101
</Button>
98-
)}
102+
) : null}
99103
</div>
100104
);
101105
},
@@ -167,6 +171,8 @@ export function PDisk({
167171
nodeId,
168172
unfolded: unfoldedFromProps,
169173
}: PDiskProps) {
174+
const isUserAllowedToMakeChanges = useTypedSelector(selectIsUserAllowedToMakeChanges);
175+
170176
const [unfolded, setUnfolded] = React.useState(unfoldedFromProps ?? false);
171177

172178
const {TotalSize = 0, AvailableSize = 0, Device, PDiskId, Type, vDisks} = data;
@@ -186,7 +192,12 @@ export function PDisk({
186192
<DataTable
187193
theme="yandex-cloud"
188194
data={vDisks}
189-
columns={getColumns({nodeId, pDiskId: PDiskId, selectedVdiskId})}
195+
columns={getColumns({
196+
nodeId,
197+
pDiskId: PDiskId,
198+
selectedVdiskId,
199+
withDeveloperUILink: isUserAllowedToMakeChanges,
200+
})}
190201
settings={{...DEFAULT_TABLE_SETTINGS, dynamicRender: false}}
191202
rowClassName={(row) => {
192203
return row.id === selectedVdiskId ? b('selected-vdisk') : '';

0 commit comments

Comments
 (0)