Skip to content

Commit 3f041de

Browse files
feat: use features versions from backend (#1097)
1 parent a41bbff commit 3f041de

File tree

17 files changed

+104
-65
lines changed

17 files changed

+104
-65
lines changed

src/components/PDiskInfo/PDiskInfo.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {getPDiskPagePath} from '../../routes';
2+
import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks';
23
import {valueIsDefined} from '../../utils';
34
import {formatBytes} from '../../utils/bytesParsers';
45
import {cn} from '../../utils/cn';
@@ -21,15 +22,15 @@ const b = cn('ydb-pdisk-info');
2122
interface GetPDiskInfoOptions<T extends PreparedPDisk> {
2223
pDisk?: T;
2324
nodeId?: number | string | null;
24-
isPDiskPage?: boolean;
25+
withPDiskPageLink?: boolean;
2526
isUserAllowedToMakeChanges?: boolean;
2627
}
2728

2829
// eslint-disable-next-line complexity
2930
function getPDiskInfo<T extends PreparedPDisk>({
3031
pDisk,
3132
nodeId,
32-
isPDiskPage = false,
33+
withPDiskPageLink,
3334
isUserAllowedToMakeChanges,
3435
}: GetPDiskInfoOptions<T>) {
3536
const {
@@ -147,7 +148,7 @@ function getPDiskInfo<T extends PreparedPDisk>({
147148
const additionalInfo: InfoViewerItem[] = [];
148149

149150
const shouldDisplayLinks =
150-
(!isPDiskPage || isUserAllowedToMakeChanges) &&
151+
(withPDiskPageLink || isUserAllowedToMakeChanges) &&
151152
valueIsDefined(PDiskId) &&
152153
valueIsDefined(nodeId);
153154

@@ -162,7 +163,7 @@ function getPDiskInfo<T extends PreparedPDisk>({
162163
label: pDiskInfoKeyset('links'),
163164
value: (
164165
<span className={b('links')}>
165-
{!isPDiskPage && (
166+
{withPDiskPageLink && (
166167
<LinkWithIcon
167168
title={pDiskInfoKeyset('pdisk-page')}
168169
url={pDiskPagePath}
@@ -190,15 +191,16 @@ interface PDiskInfoProps<T extends PreparedPDisk> extends GetPDiskInfoOptions<T>
190191
export function PDiskInfo<T extends PreparedPDisk>({
191192
pDisk,
192193
nodeId,
193-
isPDiskPage = false,
194+
withPDiskPageLink,
194195
className,
195196
}: PDiskInfoProps<T>) {
196197
const {isUserAllowedToMakeChanges} = useTypedSelector((state) => state.authentication);
198+
const diskPagesAvailable = useDiskPagesAvailable();
197199

198200
const [generalInfo, statusInfo, spaceInfo, additionalInfo] = getPDiskInfo({
199201
pDisk,
200202
nodeId,
201-
isPDiskPage,
203+
withPDiskPageLink: withPDiskPageLink && diskPagesAvailable,
202204
isUserAllowedToMakeChanges,
203205
});
204206

src/components/VDisk/VDisk.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import React from 'react';
22

33
import {STRUCTURE} from '../../containers/Node/NodePages';
44
import routes, {createHref, getVDiskPagePath} from '../../routes';
5+
import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks';
56
import type {NodesMap} from '../../types/store/nodesList';
67
import {valueIsDefined} from '../../utils';
78
import {cn} from '../../utils/cn';
8-
import {USE_SEPARATE_DISKS_PAGES_KEY} from '../../utils/constants';
99
import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters';
1010
import {isFullVDiskData} from '../../utils/disks/helpers';
1111
import type {PreparedVDisk} from '../../utils/disks/types';
12-
import {useSetting} from '../../utils/hooks';
1312
import {DiskStateProgressBar} from '../DiskStateProgressBar/DiskStateProgressBar';
1413
import {InternalLink} from '../InternalLink';
1514
import {VDiskPopup} from '../VDiskPopup/VDiskPopup';
@@ -27,7 +26,7 @@ interface VDiskProps {
2726
export const VDisk = ({data = {}, nodes, compact}: VDiskProps) => {
2827
const isFullData = isFullVDiskData(data);
2928

30-
const [useSeparateDisksPages] = useSetting(USE_SEPARATE_DISKS_PAGES_KEY);
29+
const diskPagesAvailable = useDiskPagesAvailable();
3130

3231
const [isPopupVisible, setIsPopupVisible] = React.useState(false);
3332

@@ -44,7 +43,7 @@ export const VDisk = ({data = {}, nodes, compact}: VDiskProps) => {
4443
let vDiskPath: string | undefined;
4544

4645
if (
47-
useSeparateDisksPages &&
46+
diskPagesAvailable &&
4847
valueIsDefined(data.VDiskSlotId) &&
4948
valueIsDefined(data.PDiskId) &&
5049
valueIsDefined(data.NodeId)

src/components/VDiskInfo/VDiskInfo.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {getVDiskPagePath} from '../../routes';
2+
import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks';
23
import {valueIsDefined} from '../../utils';
34
import {cn} from '../../utils/cn';
45
import {formatStorageValuesToGb, stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters';
@@ -20,17 +21,19 @@ const b = cn('ydb-vdisk-info');
2021

2122
interface VDiskInfoProps<T extends PreparedVDisk> extends Omit<InfoViewerProps, 'info'> {
2223
data?: T;
23-
isVDiskPage?: boolean;
24+
withVDiskPageLink?: boolean;
2425
withTitle?: boolean;
2526
}
2627

2728
// eslint-disable-next-line complexity
2829
export function VDiskInfo<T extends PreparedVDisk>({
2930
data,
30-
isVDiskPage,
31+
withVDiskPageLink,
3132
withTitle,
3233
...infoViewerProps
3334
}: VDiskInfoProps<T>) {
35+
const diskPagesAvailable = useDiskPagesAvailable();
36+
3437
const {
3538
AllocatedSize,
3639
DiskSpace,
@@ -151,7 +154,7 @@ export function VDiskInfo<T extends PreparedVDisk>({
151154
label: vDiskInfoKeyset('links'),
152155
value: (
153156
<span className={b('links')}>
154-
{!isVDiskPage && (
157+
{withVDiskPageLink && diskPagesAvailable && (
155158
<LinkWithIcon
156159
title={vDiskInfoKeyset('vdisk-page')}
157160
url={vDiskPagePath}

src/containers/App/Content.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {SlotComponent} from '../../components/slots/types';
1010
import routes from '../../routes';
1111
import type {RootState} from '../../store';
1212
import {getUser} from '../../store/reducers/authentication/authentication';
13+
import {capabilitiesApi} from '../../store/reducers/capabilities/capabilities';
1314
import {nodesListApi} from '../../store/reducers/nodesList';
1415
import {cn} from '../../utils/cn';
1516
import {useTypedDispatch, useTypedSelector} from '../../utils/hooks';
@@ -144,6 +145,7 @@ export function Content(props: ContentProps) {
144145
<Route key="single-cluster">
145146
<GetUser />
146147
<GetNodesList />
148+
<GetCapabilities />
147149
<Header mainPage={mainPage} />
148150
<Switch>
149151
{routesSlots.map((route) => {
@@ -185,6 +187,11 @@ function GetNodesList() {
185187
return null;
186188
}
187189

190+
function GetCapabilities() {
191+
capabilitiesApi.useGetClusterCapabilitiesQuery(undefined);
192+
return null;
193+
}
194+
188195
interface ContentWrapperProps {
189196
singleClusterMode: boolean;
190197
isAuthenticated: boolean;

src/containers/Node/NodeStructure/Pdisk.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ function getColumns({
140140
return (
141141
<Popover
142142
placement={['right']}
143-
content={<VDiskInfo data={row} withTitle />}
143+
content={<VDiskInfo data={row} withTitle withVDiskPageLink />}
144144
tooltipContentClassName={b('vdisk-details')}
145145
>
146146
<Button
@@ -202,7 +202,12 @@ export function PDisk({
202202

203203
return (
204204
<div>
205-
<PDiskInfo pDisk={data} nodeId={nodeId} className={b('pdisk-details')} />
205+
<PDiskInfo
206+
pDisk={data}
207+
nodeId={nodeId}
208+
className={b('pdisk-details')}
209+
withPDiskPageLink
210+
/>
206211
<div className={b('vdisks-container')}>
207212
<div className={b('vdisks-header')}>VDisks</div>
208213
{renderVDisks()}

src/containers/PDiskPage/PDiskPage.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,7 @@ export function PDiskPage() {
166166
if (pDiskLoading) {
167167
return <InfoViewerSkeleton className={pdiskPageCn('info')} rows={10} />;
168168
}
169-
return (
170-
<PDiskInfo
171-
pDisk={pDiskData}
172-
nodeId={nodeId}
173-
className={pdiskPageCn('info')}
174-
isPDiskPage
175-
/>
176-
);
169+
return <PDiskInfo pDisk={pDiskData} nodeId={nodeId} className={pdiskPageCn('info')} />;
177170
};
178171

179172
const renderTabs = () => {

src/containers/Storage/PDisk/PDisk.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ import {InternalLink} from '../../../components/InternalLink';
55
import {PDiskPopup} from '../../../components/PDiskPopup/PDiskPopup';
66
import {VDiskWithDonorsStack} from '../../../components/VDisk/VDiskWithDonorsStack';
77
import routes, {createHref, getPDiskPagePath} from '../../../routes';
8+
import {useDiskPagesAvailable} from '../../../store/reducers/capabilities/hooks';
89
import type {TVDiskStateInfo} from '../../../types/api/vdisk';
910
import {valueIsDefined} from '../../../utils';
1011
import {cn} from '../../../utils/cn';
11-
import {USE_SEPARATE_DISKS_PAGES_KEY} from '../../../utils/constants';
1212
import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters';
1313
import type {PreparedPDisk} from '../../../utils/disks/types';
14-
import {useSetting} from '../../../utils/hooks';
1514
import {STRUCTURE} from '../../Node/NodePages';
1615

1716
import './PDisk.scss';
@@ -27,7 +26,7 @@ interface PDiskProps {
2726
export const PDisk = ({nodeId, data = {}, vDisks}: PDiskProps) => {
2827
const [isPopupVisible, setIsPopupVisible] = React.useState(false);
2928

30-
const [useSeparateDisksPages] = useSetting(USE_SEPARATE_DISKS_PAGES_KEY);
29+
const diskPagesAvailable = useDiskPagesAvailable();
3130

3231
const anchor = React.useRef(null);
3332

@@ -75,7 +74,7 @@ export const PDisk = ({nodeId, data = {}, vDisks}: PDiskProps) => {
7574
{pdiskId: data.PDiskId || ''},
7675
);
7776

78-
if (useSeparateDisksPages && valueIsDefined(data.PDiskId)) {
77+
if (diskPagesAvailable && valueIsDefined(data.PDiskId)) {
7978
pDiskPath = getPDiskPagePath(data.PDiskId, nodeId);
8079
}
8180

src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import React from 'react';
55

66
import {NavigationTree} from 'ydb-ui-components';
77

8-
import {USE_DIRECTORY_OPERATIONS} from '../../../../lib';
8+
import {useCreateDirectoryFeatureAvailable} from '../../../../store/reducers/capabilities/hooks';
99
import {schemaApi} from '../../../../store/reducers/schema/schema';
1010
import type {EPathType, TEvDescribeSchemeResult} from '../../../../types/api/schema';
11-
import {useQueryExecutionSettings, useSetting, useTypedDispatch} from '../../../../utils/hooks';
11+
import {useQueryExecutionSettings, useTypedDispatch} from '../../../../utils/hooks';
1212
import {isChildlessPathType, mapPathTypeToNavigationTreeType} from '../../utils/schema';
1313
import {getActions} from '../../utils/schemaActions';
1414
import {getControls} from '../../utils/schemaControls';
@@ -23,7 +23,7 @@ interface SchemaTreeProps {
2323
}
2424

2525
export function SchemaTree(props: SchemaTreeProps) {
26-
const [useDirectoryActions] = useSetting<boolean>(USE_DIRECTORY_OPERATIONS);
26+
const createDirectoryFeatureAvailable = useCreateDirectoryFeatureAvailable();
2727
const {rootPath, rootName, rootType, currentPath, onActivePathUpdate} = props;
2828
const dispatch = useTypedDispatch();
2929

@@ -114,7 +114,7 @@ export function SchemaTree(props: SchemaTreeProps) {
114114
setActivePath: onActivePathUpdate,
115115
updateQueryExecutionSettings: (settings) =>
116116
setQueryExecutionSettings({...querySettings, ...settings}),
117-
showCreateDirectoryDialog: useDirectoryActions
117+
showCreateDirectoryDialog: createDirectoryFeatureAvailable
118118
? handleOpenCreateDirectoryDialog
119119
: undefined,
120120
})}

src/containers/UserSettings/i18n/en.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,6 @@
4545
"settings.queryUseMultiSchema.title": "Allow queries with multiple result sets",
4646
"settings.queryUseMultiSchema.description": "Use 'multi' schema for queries. It enables queries with multiple result sets. It returns nothing on versions 23-3 and older",
4747

48-
"settings.useSeparateDisksPages.title": "Use separate PDisk and VDisk pages",
49-
"settings.useSeparateDisksPages.description": "Use separate pages instead of node structure tab",
50-
51-
"settings.useDirectoryOperations.title": "Enable operations with directories",
52-
5348
"settings.useClusterBalancerAsBackend.title": "Use cluster balancer as backend",
5449
"settings.useClusterBalancerAsBackend.description": "By default random cluster node is used as backend. It causes saved links to become invalid after some time, when node is restarted. Using balancer as backend fixes it",
5550

src/containers/UserSettings/settings.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ import {
1313
SHOW_DOMAIN_DATABASE_KEY,
1414
THEME_KEY,
1515
USE_CLUSTER_BALANCER_AS_BACKEND_KEY,
16-
USE_DIRECTORY_OPERATIONS,
1716
USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY,
1817
USE_PAGINATED_TABLES_KEY,
19-
USE_SEPARATE_DISKS_PAGES_KEY,
2018
} from '../../utils/constants';
2119
import {Lang, defaultLang} from '../../utils/i18n';
2220
import {ClusterModeGuard} from '../ClusterModeGuard';
@@ -127,17 +125,6 @@ export const queryUseMultiSchemaSetting: SettingProps = {
127125
description: i18n('settings.queryUseMultiSchema.description'),
128126
};
129127

130-
export const useSeparateDisksPagesSetting: SettingProps = {
131-
settingKey: USE_SEPARATE_DISKS_PAGES_KEY,
132-
title: i18n('settings.useSeparateDisksPages.title'),
133-
description: i18n('settings.useSeparateDisksPages.description'),
134-
};
135-
136-
export const useDirectoryActionsSetting: SettingProps = {
137-
settingKey: USE_DIRECTORY_OPERATIONS,
138-
title: i18n('settings.useDirectoryOperations.title'),
139-
};
140-
141128
export const useClusterBalancerAsBackendSetting: SettingProps = {
142129
settingKey: USE_CLUSTER_BALANCER_AS_BACKEND_KEY,
143130
title: i18n('settings.useClusterBalancerAsBackend.title'),
@@ -175,13 +162,7 @@ export const appearanceSection: SettingsSection = {
175162
export const experimentsSection: SettingsSection = {
176163
id: 'experimentsSection',
177164
title: i18n('section.experiments'),
178-
settings: [
179-
useNodesEndpointSetting,
180-
usePaginatedTables,
181-
queryUseMultiSchemaSetting,
182-
useSeparateDisksPagesSetting,
183-
useDirectoryActionsSetting,
184-
],
165+
settings: [useNodesEndpointSetting, usePaginatedTables, queryUseMultiSchemaSetting],
185166
};
186167
export const devSettingsSection: SettingsSection = {
187168
id: 'devSettingsSection',

0 commit comments

Comments
 (0)