Skip to content

Commit 808b0c4

Browse files
committed
feat: implement simple and narrow vertical progress bar
1 parent 4cb2d7f commit 808b0c4

File tree

6 files changed

+95
-7
lines changed

6 files changed

+95
-7
lines changed

src/components/ProgressViewer/ProgressViewer.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
align-items: center;
1313

1414
min-width: 150px;
15+
16+
&_vertical {
17+
min-width: unset;
18+
}
1519
height: 23px;
1620
padding: 0 4px;
1721

@@ -58,6 +62,12 @@
5862
left: 0;
5963

6064
height: 100%;
65+
66+
&_vertical {
67+
width: 100%;
68+
bottom: 0;
69+
top: auto;
70+
}
6171
}
6272

6373
&__text {

src/components/ProgressViewer/ProgressViewer.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ export interface ProgressViewerProps {
4848
inverseColorize?: boolean;
4949
warningThreshold?: number;
5050
dangerThreshold?: number;
51+
vertical?: boolean;
52+
hideCapacity?: boolean;
5153
}
5254

5355
export function ProgressViewer({
@@ -56,11 +58,13 @@ export function ProgressViewer({
5658
formatValues = defaultFormatValues,
5759
percents,
5860
className,
61+
vertical,
5962
size = 'xs',
6063
colorizeProgress,
6164
inverseColorize,
6265
warningThreshold = 60,
6366
dangerThreshold = 80,
67+
hideCapacity,
6468
}: ProgressViewerProps) {
6569
const theme = useTheme();
6670

@@ -89,12 +93,16 @@ export function ProgressViewer({
8993
fillWidth = 100;
9094
}
9195

92-
const lineStyle = {
93-
width: fillWidth + '%',
94-
};
96+
const lineStyle = vertical
97+
? {
98+
height: fillWidth + '%',
99+
}
100+
: {
101+
width: fillWidth + '%',
102+
};
95103

96104
const renderContent = () => {
97-
if (isNumeric(capacity)) {
105+
if (isNumeric(capacity) && !hideCapacity) {
98106
return `${valueText} ${divider} ${capacityText}`;
99107
}
100108

@@ -103,8 +111,8 @@ export function ProgressViewer({
103111

104112
if (isNumeric(value)) {
105113
return (
106-
<div className={b({size, theme, status}, className)}>
107-
<div className={b('line')} style={lineStyle}></div>
114+
<div className={b({size, theme, status, vertical}, className)}>
115+
<div className={b('line', {vertical})} style={lineStyle}></div>
108116
<span className={b('text')}>{renderContent()}</span>
109117
</div>
110118
);

src/components/nodesColumns/columns.tsx

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import type {TPoolStats} from '../../types/api/nodes';
55
import type {TTabletStateInfo} from '../../types/api/tablet';
66
import {valueIsDefined} from '../../utils';
77
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
8-
import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters';
8+
import {
9+
formatStorageValues,
10+
formatStorageValuesToGb,
11+
} from '../../utils/dataFormatters/dataFormatters';
912
import {getSpaceUsageSeverity} from '../../utils/storage';
1013
import type {Column} from '../../utils/tableUtils/types';
1114
import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
@@ -111,6 +114,29 @@ export function getMemoryColumn<
111114
resizeMinWidth: 170,
112115
};
113116
}
117+
export function getRAMColumn<T extends {MemoryUsed?: string; MemoryLimit?: string}>(): Column<T> {
118+
return {
119+
name: NODES_COLUMNS_IDS.RAM,
120+
header: NODES_COLUMNS_TITLES.RAM,
121+
sortAccessor: ({MemoryUsed = 0}) => Number(MemoryUsed),
122+
defaultOrder: DataTable.DESCENDING,
123+
render: ({row}) => (
124+
<ProgressViewer
125+
value={row.MemoryUsed}
126+
capacity={row.MemoryLimit}
127+
formatValues={(value, total) =>
128+
formatStorageValues(value, total, 'gb', undefined, true)
129+
}
130+
colorizeProgress
131+
vertical
132+
hideCapacity
133+
/>
134+
),
135+
align: DataTable.LEFT,
136+
width: 85,
137+
resizeMinWidth: 40,
138+
};
139+
}
114140
export function getSharedCacheUsageColumn<
115141
T extends {SharedCacheUsed?: string | number; SharedCacheLimit?: string | number},
116142
>(): Column<T> {
@@ -143,6 +169,34 @@ export function getCpuColumn<T extends {PoolStats?: TPoolStats[]}>(): Column<T>
143169
resizeMinWidth: 60,
144170
};
145171
}
172+
export function getTotalCpuColumn<T extends {PoolStats?: TPoolStats[]}>(): Column<T> {
173+
return {
174+
name: NODES_COLUMNS_IDS.TotalCPU,
175+
header: NODES_COLUMNS_TITLES.TotalCPU,
176+
sortAccessor: ({PoolStats = []}) => Math.max(...PoolStats.map(({Usage}) => Number(Usage))),
177+
defaultOrder: DataTable.DESCENDING,
178+
render: ({row}) => {
179+
if (!row.PoolStats) {
180+
return EMPTY_DATA_PLACEHOLDER;
181+
}
182+
183+
const totalPoolUsage = row.PoolStats.reduce((acc, pool) => acc + (pool.Usage || 0), 0);
184+
185+
return (
186+
<ProgressViewer
187+
value={totalPoolUsage}
188+
capacity={1}
189+
colorizeProgress
190+
percents
191+
vertical
192+
/>
193+
);
194+
},
195+
align: DataTable.LEFT,
196+
width: 85,
197+
resizeMinWidth: 40,
198+
};
199+
}
146200
export function getLoadAverageColumn<T extends {LoadAveragePercents?: number[]}>(): Column<T> {
147201
return {
148202
name: NODES_COLUMNS_IDS.LoadAverage,

src/components/nodesColumns/constants.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ export const NODES_COLUMNS_IDS = {
1414
Version: 'Version',
1515
Uptime: 'Uptime',
1616
Memory: 'Memory',
17+
RAM: 'RAM',
1718
CPU: 'CPU',
19+
TotalCPU: 'TotalCPU',
1820
LoadAverage: 'LoadAverage',
1921
Load: 'Load',
2022
DiskSpaceUsage: 'DiskSpaceUsage',
@@ -54,9 +56,15 @@ export const NODES_COLUMNS_TITLES = {
5456
get Memory() {
5557
return i18n('memory');
5658
},
59+
get RAM() {
60+
return i18n('ram');
61+
},
5762
get CPU() {
5863
return i18n('cpu');
5964
},
65+
get TotalCPU() {
66+
return i18n('totalcpu');
67+
},
6068
get LoadAverage() {
6169
return i18n('load-average');
6270
},
@@ -94,7 +102,9 @@ export const NODES_COLUMNS_TO_DATA_FIELDS: Record<NodesColumnId, NodesRequiredFi
94102
Version: ['Version'],
95103
Uptime: ['Uptime'],
96104
Memory: ['Memory'],
105+
RAM: ['Memory'],
97106
CPU: ['CPU'],
107+
TotalCPU: ['CPU'],
98108
LoadAverage: ['LoadAverage'],
99109
Load: ['LoadAverage'],
100110
DiskSpaceUsage: ['DiskSpaceUsage'],

src/components/nodesColumns/i18n/en.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
"version": "Version",
88
"uptime": "Uptime",
99
"memory": "Memory",
10+
"ram": "RAM",
1011
"cpu": "CPU",
12+
"totalcpu": "TotalCPU",
1113
"disk-usage": "Disk usage",
1214
"tablets": "Tablets",
1315
"load-average": "Load Average",

src/containers/Nodes/columns/columns.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import {
66
getMemoryColumn,
77
getNodeIdColumn,
88
getNodeNameColumn,
9+
getRAMColumn,
910
getRackColumn,
1011
getTabletsColumn,
12+
getTotalCpuColumn,
1113
getUptimeColumn,
1214
getVersionColumn,
1315
} from '../../../components/nodesColumns/columns';
@@ -26,7 +28,9 @@ export function getNodesColumns(params: GetNodesColumnsParams): Column<NodesPrep
2628
getVersionColumn<NodesPreparedEntity>(),
2729
getUptimeColumn<NodesPreparedEntity>(),
2830
getMemoryColumn<NodesPreparedEntity>(),
31+
getRAMColumn<NodesPreparedEntity>(),
2932
getCpuColumn<NodesPreparedEntity>(),
33+
getTotalCpuColumn<NodesPreparedEntity>(),
3034
getLoadAverageColumn<NodesPreparedEntity>(),
3135
getTabletsColumn<NodesPreparedEntity>(params),
3236
];

0 commit comments

Comments
 (0)