Skip to content

Commit 344298a

Browse files
fix(StorageNodes): make fqdn similar to nodes page
1 parent 2009f56 commit 344298a

File tree

9 files changed

+116
-50
lines changed

9 files changed

+116
-50
lines changed

src/components/Icon/Icon.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ export const Icon = ({
3131
/>
3232
);
3333
};
34+
35+
// When used with uikit components Icon is considered as text element and corresponding styles are applied
36+
// IconWrapper overrides displayName to 'Icon', so it will be considered as an icon with right styles
37+
export const IconWrapper = (props: IconProps) => <Icon {...props} />;
38+
39+
IconWrapper.displayName = 'Icon';

src/components/Tooltips/NodeEndpointsTooltip/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/containers/Nodes/NodesTable.scss

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
.ydb-nodes-table {
2-
&__host-name-wrapper {
2+
&__host-field-wrapper {
33
display: flex;
44
}
55

6-
&__external-button {
7-
display: none;
8-
align-items: center;
9-
10-
margin-left: 4px;
6+
&__host-wrapper {
7+
display: flex;
118

12-
.yc-button__text {
13-
margin: 0 4px;
14-
}
9+
max-width: 330px;
1510
}
1611

17-
&__host-name {
12+
&__host {
1813
overflow: hidden;
1914
}
15+
16+
&__external-button {
17+
display: none;
18+
19+
margin-left: 4px;
20+
}
2021
}
2122

2223
.data-table__row:hover {

src/containers/Nodes/getNodesColumns.tsx

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import cn from 'bem-cn-lite';
22
import DataTable, {Column} from '@gravity-ui/react-data-table';
33
import {Button, Popover, PopoverBehavior} from '@gravity-ui/uikit';
44

5-
import {Icon} from '../../components/Icon';
5+
import {IconWrapper} from '../../components/Icon';
66
import EntityStatus from '../../components/EntityStatus/EntityStatus';
77
import PoolsGraph from '../../components/PoolsGraph/PoolsGraph';
88
import ProgressViewer from '../../components/ProgressViewer/ProgressViewer';
99
import {TabletsStatistic} from '../../components/TabletsStatistic';
10-
import {NodeEndpointsTooltip} from '../../components/Tooltips/NodeEndpointsTooltip';
10+
import {NodeEndpointsTooltip} from '../../components/Tooltips/NodeEndpointsTooltip/NodeEndpointsTooltip';
1111

1212
import {formatBytesToGigabyte} from '../../utils/index';
1313
import {INodesPreparedEntity} from '../../types/store/nodes';
@@ -47,29 +47,31 @@ export function getNodesColumns({
4747
return <span></span>;
4848
}
4949
return (
50-
<div className={b('host-name-wrapper')}>
50+
<div className={b('host-field-wrapper')}>
5151
<Popover
5252
content={<NodeEndpointsTooltip data={row} />}
5353
placement={['top', 'bottom']}
5454
behavior={PopoverBehavior.Immediate}
5555
>
56-
<EntityStatus
57-
name={row.Host}
58-
status={row.SystemState}
59-
path={getDefaultNodePath(row.NodeId)}
60-
hasClipboardButton
61-
className={b('host-name')}
62-
/>
63-
{nodeRef && (
64-
<Button
65-
size="s"
66-
href={nodeRef}
67-
className={b('external-button')}
68-
target="_blank"
69-
>
70-
<Icon name="external" />
71-
</Button>
72-
)}
56+
<div className={b('host-wrapper')}>
57+
<EntityStatus
58+
name={row.Host}
59+
status={row.SystemState}
60+
path={getDefaultNodePath(row.NodeId)}
61+
hasClipboardButton
62+
className={b('host')}
63+
/>
64+
{nodeRef && (
65+
<Button
66+
size="s"
67+
href={nodeRef}
68+
className={b('external-button')}
69+
target="_blank"
70+
>
71+
<IconWrapper name="external" />
72+
</Button>
73+
)}
74+
</div>
7375
</Popover>
7476
</div>
7577
);

src/containers/Storage/Storage.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class Storage extends React.Component {
7373
nodesUptimeFilter: PropTypes.string,
7474
setNodesUptimeFilter: PropTypes.func,
7575
setDataWasNotLoaded: PropTypes.func,
76+
additionalNodesInfo: PropTypes.object,
7677
};
7778

7879
componentDidMount() {
@@ -180,8 +181,14 @@ class Storage extends React.Component {
180181
}
181182

182183
renderDataTable() {
183-
const {flatListStorageEntities, visibleEntities, nodesUptimeFilter, nodes, storageType} =
184-
this.props;
184+
const {
185+
flatListStorageEntities,
186+
visibleEntities,
187+
nodesUptimeFilter,
188+
nodes,
189+
storageType,
190+
additionalNodesInfo,
191+
} = this.props;
185192

186193
return (
187194
<div className={b('table-wrapper')}>
@@ -201,6 +208,7 @@ class Storage extends React.Component {
201208
data={flatListStorageEntities}
202209
tableSettings={tableSettings}
203210
onShowAll={this.onShowAllNodes}
211+
additionalNodesInfo={additionalNodesInfo}
204212
/>
205213
)}
206214
</div>

src/containers/Storage/StorageNodes/StorageNodes.scss

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,36 @@
2020
margin-right: 0px;
2121
}
2222
}
23-
&__fqdn-wrapper {
23+
&__fqdn-field-wrapper {
2424
width: 330px;
2525
}
26-
&__fqdn {
27-
display: inline-block;
28-
overflow: hidden;
26+
&__fqdn-wrapper {
27+
display: flex;
28+
align-items: center;
2929

3030
max-width: 330px;
31-
32-
vertical-align: top;
33-
text-overflow: ellipsis;
3431
}
32+
&__fqdn {
33+
overflow: hidden;
34+
}
35+
3536
&__group-id {
3637
font-weight: 500;
3738
}
3839

3940
&__node_unavailable {
4041
opacity: 0.6;
4142
}
43+
44+
&__external-button {
45+
display: none;
46+
47+
margin-left: 4px;
48+
}
49+
}
50+
51+
.data-table__row:hover {
52+
.global-storage-nodes__external-button {
53+
display: inline-flex;
54+
}
4255
}

src/containers/Storage/StorageNodes/StorageNodes.tsx

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,20 @@ import _ from 'lodash';
22
import cn from 'bem-cn-lite';
33

44
import DataTable, {Column, Settings, SortOrder} from '@gravity-ui/react-data-table';
5-
import {Popover, PopoverBehavior} from '@gravity-ui/uikit';
5+
import {Button, Popover, PopoverBehavior} from '@gravity-ui/uikit';
6+
7+
import {NodeEndpointsTooltip} from '../../../components/Tooltips/NodeEndpointsTooltip/NodeEndpointsTooltip';
8+
import EntityStatus from '../../../components/EntityStatus/EntityStatus';
9+
import {IconWrapper} from '../../../components/Icon';
610

711
import {VisibleEntities} from '../../../store/reducers/storage';
8-
import {isUnavailableNode, NodesUptimeFilterValues} from '../../../utils/nodes';
12+
import {
13+
AdditionalNodesInfo,
14+
isUnavailableNode,
15+
NodesUptimeFilterValues,
16+
} from '../../../utils/nodes';
17+
18+
import {getDefaultNodePath} from '../../Node/NodePages';
919

1020
import {EmptyFilter} from '../EmptyFilter/EmptyFilter';
1121
import {PDisk} from '../PDisk';
@@ -33,6 +43,7 @@ interface StorageNodesProps {
3343
visibleEntities: keyof typeof VisibleEntities;
3444
nodesUptimeFilter: keyof typeof NodesUptimeFilterValues;
3545
onShowAll?: VoidFunction;
46+
additionalNodesInfo?: AdditionalNodesInfo;
3647
}
3748

3849
const tableColumnsNames: Record<TableColumnsIdsValues, string> = {
@@ -73,7 +84,10 @@ function StorageNodes({
7384
visibleEntities,
7485
onShowAll,
7586
nodesUptimeFilter,
87+
additionalNodesInfo,
7688
}: StorageNodesProps) {
89+
const getNodeRef = additionalNodesInfo?.getNodeRef;
90+
7791
const allColumns: Column<any>[] = [
7892
{
7993
name: TableColumnsIds.NodeId,
@@ -85,15 +99,37 @@ function StorageNodes({
8599
name: TableColumnsIds.FQDN,
86100
header: tableColumnsNames[TableColumnsIds.FQDN],
87101
width: 350,
88-
render: ({value}) => {
102+
render: ({row}) => {
103+
const nodeRef = getNodeRef ? getNodeRef(row) + 'internal' : undefined;
104+
if (!row.Host) {
105+
return <span></span>;
106+
}
89107
return (
90-
<div className={b('fqdn-wrapper')}>
108+
<div className={b('fqdn-field-wrapper')}>
91109
<Popover
92-
content={value as string}
93-
placement={['right']}
110+
content={<NodeEndpointsTooltip data={row} />}
111+
placement={['top', 'bottom']}
94112
behavior={PopoverBehavior.Immediate}
95113
>
96-
<span className={b('fqdn')}>{value as string}</span>
114+
<div className={b('fqdn-wrapper')}>
115+
<EntityStatus
116+
name={row.Host}
117+
showStatus={false}
118+
path={getDefaultNodePath(row.NodeId)}
119+
hasClipboardButton
120+
className={b('fqdn')}
121+
/>
122+
{nodeRef && (
123+
<Button
124+
size="s"
125+
href={nodeRef}
126+
className={b('external-button')}
127+
target="_blank"
128+
>
129+
<IconWrapper name="external" />
130+
</Button>
131+
)}
132+
</div>
97133
</Popover>
98134
</div>
99135
);

src/store/reducers/storage.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,10 @@ export const getFlatListStorageNodes = createSelector([getStorageNodes], (storag
305305
return {
306306
NodeId: node.NodeId,
307307
SystemState: systemState.SystemState,
308-
FQDN: systemState.Host,
309308
DataCenter: systemState.DataCenter,
310309
Rack: systemState.Rack,
310+
Host: systemState.Host,
311+
Endpoints: systemState.Endpoints,
311312
uptime: calcUptime(systemState.StartTime),
312313
StartTime: systemState.StartTime,
313314
PDisks: node.PDisks,
@@ -369,7 +370,7 @@ const filterByText = (entities, type, text) => {
369370

370371
return (
371372
entity.NodeId.toString().includes(cleanedFilter) ||
372-
entity.FQDN.toLowerCase().includes(cleanedFilter)
373+
entity.Host.toLowerCase().includes(cleanedFilter)
373374
);
374375
});
375376
};

src/utils/tooltip.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import cn from 'bem-cn-lite';
22
import {calcUptime} from '.';
33
import JSONTree from 'react-json-inspector';
44

5-
import {NodeEndpointsTooltip} from '../components/Tooltips/NodeEndpointsTooltip';
5+
import {NodeEndpointsTooltip} from '../components/Tooltips/NodeEndpointsTooltip/NodeEndpointsTooltip';
66

77
const poolB = cn('pool-tooltip');
88

0 commit comments

Comments
 (0)