Skip to content

Commit 67fd9b0

Browse files
feat(Storage): use VirtualTable (#628)
1 parent 923d0ac commit 67fd9b0

40 files changed

+950
-401
lines changed

src/components/EmptyState/EmptyState.scss

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
}
2020

2121
&_size_m {
22-
position: relative;
23-
2422
width: 800px;
2523
height: 240px;
24+
}
25+
26+
&_position_center {
27+
position: relative;
28+
2629
margin: 0 auto;
2730
}
2831
}

src/components/EmptyState/EmptyState.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,26 @@ const sizes = {
1313
l: 350,
1414
};
1515

16-
interface EmptyStateProps {
16+
export interface EmptyStateProps {
1717
title: string;
1818
image?: ReactNode;
1919
description?: ReactNode;
2020
actions?: ReactNode[];
2121
size?: keyof typeof sizes;
22+
position?: 'left' | 'center';
2223
}
2324

24-
export const EmptyState = ({image, title, description, actions, size = 'm'}: EmptyStateProps) => {
25+
export const EmptyState = ({
26+
image,
27+
title,
28+
description,
29+
actions,
30+
size = 'm',
31+
position = 'center',
32+
}: EmptyStateProps) => {
2533
return (
2634
<div className={block({size})}>
27-
<div className={block('wrapper', {size})}>
35+
<div className={block('wrapper', {size, position})}>
2836
<div className={block('image')}>
2937
{image ? (
3038
image
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
import {EmptyState} from '../../EmptyState';
1+
import {EmptyState, type EmptyStateProps} from '../../EmptyState';
22
import {Illustration} from '../../Illustration';
33

44
import i18n from '../i18n';
55

6-
interface AccessDeniedProps {
6+
interface AccessDeniedProps extends Omit<EmptyStateProps, 'image' | 'title' | 'description'> {
77
title?: string;
88
description?: string;
99
}
1010

11-
export const AccessDenied = ({title, description}: AccessDeniedProps) => {
11+
export const AccessDenied = ({title, description, ...restProps}: AccessDeniedProps) => {
1212
return (
1313
<EmptyState
1414
image={<Illustration name="403" />}
1515
title={title || i18n('403.title')}
1616
description={description || i18n('403.description')}
17+
{...restProps}
1718
/>
1819
);
1920
};

src/components/ProblemFilter/ProblemFilter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {ProblemFilterValues} from '../../store/reducers/settings/settings';
55

66
interface ProblemFilterProps {
77
value: ProblemFilterValue;
8-
onChange: (value: string) => void;
8+
onChange: (value: ProblemFilterValue) => void;
99
className?: string;
1010
}
1111

src/components/UptimeFIlter/UptimeFilter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {NodesUptimeFilterValues, NodesUptimeFilterTitles} from '../../utils/node
44

55
interface UptimeFilterProps {
66
value: NodesUptimeFilterValues;
7-
onChange: (value: string) => void;
7+
onChange: (value: NodesUptimeFilterValues) => void;
88
className?: string;
99
}
1010

src/components/VirtualTable/VirtualTable.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@include body-2-typography();
1616

1717
&__table {
18-
width: 100%;
18+
width: max-content;
1919
max-width: 100%;
2020

2121
table-layout: fixed;

src/containers/Cluster/Cluster.tsx

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
1818
import {getClusterInfo} from '../../store/reducers/cluster/cluster';
1919
import {getClusterNodes} from '../../store/reducers/clusterNodes/clusterNodes';
2020
import {parseNodesToVersionsValues, parseVersionsToVersionToColorMap} from '../../utils/versions';
21-
import {useAutofetcher, useSetting, useTypedSelector} from '../../utils/hooks';
22-
import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../../utils/constants';
21+
import {useAutofetcher, useTypedSelector} from '../../utils/hooks';
2322

2423
import {InternalLink} from '../../components/InternalLink';
2524
import {Tenants} from '../Tenants/Tenants';
26-
import {Nodes} from '../Nodes/Nodes';
27-
import {VirtualNodes} from '../Nodes/VirtualNodes';
28-
import {Storage} from '../Storage/Storage';
25+
import {StorageWrapper} from '../Storage/StorageWrapper';
26+
import {NodesWrapper} from '../Nodes/NodesWrapper';
2927
import {Versions} from '../Versions/Versions';
3028

3129
import {ClusterInfo} from './ClusterInfo/ClusterInfo';
@@ -55,8 +53,6 @@ function Cluster({
5553
const match = useRouteMatch<{activeTab: string}>(routes.cluster);
5654
const {activeTab = clusterTabsIds.tenants} = match?.params || {};
5755

58-
const [useVirtualNodes] = useSetting<boolean>(USE_BACKEND_PARAMS_FOR_TABLES_KEY);
59-
6056
const location = useLocation();
6157
const queryParams = qs.parse(location.search, {
6258
ignoreQueryPrefix: true,
@@ -111,17 +107,20 @@ function Cluster({
111107
return <Tenants additionalTenantsProps={additionalTenantsProps} />;
112108
}
113109
case clusterTabsIds.nodes: {
114-
return useVirtualNodes ? (
115-
<VirtualNodes
110+
return (
111+
<NodesWrapper
116112
parentContainer={container.current}
117113
additionalNodesProps={additionalNodesProps}
118114
/>
119-
) : (
120-
<Nodes additionalNodesProps={additionalNodesProps} />
121115
);
122116
}
123117
case clusterTabsIds.storage: {
124-
return <Storage additionalNodesProps={additionalNodesProps} />;
118+
return (
119+
<StorageWrapper
120+
parentContainer={container.current}
121+
additionalNodesProps={additionalNodesProps}
122+
/>
123+
);
125124
}
126125
case clusterTabsIds.versions: {
127126
return <Versions versionToColor={versionToColor} />;

src/containers/Nodes/Nodes.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@ export const Nodes = ({path, additionalNodesProps = {}}: NodesProps) => {
106106
dispatch(setSearchValue(value));
107107
};
108108

109-
const handleProblemFilterChange = (value: string) => {
110-
dispatch(changeFilter(value as ProblemFilterValue));
109+
const handleProblemFilterChange = (value: ProblemFilterValue) => {
110+
dispatch(changeFilter(value));
111111
};
112112

113-
const handleUptimeFilterChange = (value: string) => {
114-
dispatch(setNodesUptimeFilter(value as NodesUptimeFilterValues));
113+
const handleUptimeFilterChange = (value: NodesUptimeFilterValues) => {
114+
dispatch(setNodesUptimeFilter(value));
115115
};
116116

117117
const renderControls = () => {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import type {AdditionalNodesProps} from '../../types/additionalProps';
2+
import {USE_BACKEND_PARAMS_FOR_TABLES_KEY} from '../../utils/constants';
3+
import {useSetting} from '../../utils/hooks';
4+
5+
import {VirtualNodes} from './VirtualNodes';
6+
import {Nodes} from './Nodes';
7+
8+
interface NodesWrapperProps {
9+
parentContainer?: Element | null;
10+
additionalNodesProps?: AdditionalNodesProps;
11+
}
12+
13+
export const NodesWrapper = ({parentContainer, ...props}: NodesWrapperProps) => {
14+
const [useVirtualTable] = useSetting<boolean>(USE_BACKEND_PARAMS_FOR_TABLES_KEY);
15+
16+
if (useVirtualTable) {
17+
return <VirtualNodes parentContainer={parentContainer} {...props} />;
18+
}
19+
20+
return <Nodes {...props} />;
21+
};

src/containers/Nodes/VirtualNodes.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,27 +72,17 @@ export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps
7272
return b('node', {unavailable: isUnavailableNode(row)});
7373
};
7474

75-
const handleSearchQueryChange = (value: string) => {
76-
setSearchValue(value);
77-
};
78-
const handleProblemFilterChange = (value: string) => {
79-
setProblemFilter(value as ProblemFilterValue);
80-
};
81-
const handleUptimeFilterChange = (value: string) => {
82-
setUptimeFilter(value as NodesUptimeFilterValues);
83-
};
84-
8575
const renderControls: RenderControls = ({totalEntities, foundEntities, inited}) => {
8676
return (
8777
<>
8878
<Search
89-
onChange={handleSearchQueryChange}
79+
onChange={setSearchValue}
9080
placeholder="Host name"
9181
className={b('search')}
9282
value={searchValue}
9383
/>
94-
<ProblemFilter value={problemFilter} onChange={handleProblemFilterChange} />
95-
<UptimeFilter value={uptimeFilter} onChange={handleUptimeFilterChange} />
84+
<ProblemFilter value={problemFilter} onChange={setProblemFilter} />
85+
<UptimeFilter value={uptimeFilter} onChange={setUptimeFilter} />
9686
<EntitiesCount
9787
total={totalEntities}
9888
current={foundEntities}
@@ -116,7 +106,7 @@ export const VirtualNodes = ({parentContainer, additionalNodesProps}: NodesProps
116106

117107
const renderErrorMessage: RenderErrorMessage = (error) => {
118108
if (error && error.status === 403) {
119-
return <AccessDenied />;
109+
return <AccessDenied position="left" />;
120110
}
121111

122112
return <ResponseError error={error} />;

0 commit comments

Comments
 (0)