Skip to content

Commit dcb5529

Browse files
authored
Merge branch 'main' into feat/issue-1398
2 parents ed0b462 + 73e9e6b commit dcb5529

File tree

11 files changed

+87
-61
lines changed

11 files changed

+87
-61
lines changed

src/components/VDiskInfo/VDiskInfo.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {getVDiskPagePath} from '../../routes';
44
import {selectIsUserAllowedToMakeChanges} from '../../store/reducers/authentication/authentication';
55
import {valueIsDefined} from '../../utils';
66
import {cn} from '../../utils/cn';
7-
import {formatStorageValuesToGb, stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters';
7+
import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters';
88
import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI';
99
import {getSeverityColor} from '../../utils/disks/helpers';
1010
import type {PreparedVDisk} from '../../utils/disks/types';
@@ -201,10 +201,7 @@ function VDiskTitle<T extends PreparedVDisk>({data}: VDiskTitleProps<T>) {
201201
return (
202202
<div className={b('title')}>
203203
{vDiskInfoKeyset('vdiks-title')}
204-
<EntityStatus
205-
status={getSeverityColor(data.Severity)}
206-
name={stringifyVdiskId(data.VDiskId)}
207-
/>
204+
<EntityStatus status={getSeverityColor(data.Severity)} name={data.StringifiedId} />
208205
</div>
209206
);
210207
}

src/components/VDiskPopup/VDiskPopup.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ import {Label, Popup} from '@gravity-ui/uikit';
55

66
import {selectNodeHostsMap} from '../../store/reducers/nodesList';
77
import {EFlag} from '../../types/api/enums';
8-
import type {TVDiskStateInfo} from '../../types/api/vdisk';
98
import {valueIsDefined} from '../../utils';
109
import {cn} from '../../utils/cn';
1110
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
12-
import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters';
1311
import {isFullVDiskData} from '../../utils/disks/helpers';
14-
import type {UnavailableDonor} from '../../utils/disks/types';
12+
import type {PreparedVDisk, UnavailableDonor} from '../../utils/disks/types';
1513
import {useTypedSelector} from '../../utils/hooks';
1614
import {bytesToGB, bytesToSpeed} from '../../utils/utils';
1715
import type {InfoViewerItem} from '../InfoViewer';
@@ -42,9 +40,9 @@ const prepareUnavailableVDiskData = (data: UnavailableDonor) => {
4240
return vdiskData;
4341
};
4442

45-
const prepareVDiskData = (data: TVDiskStateInfo) => {
43+
const prepareVDiskData = (data: PreparedVDisk) => {
4644
const {
47-
VDiskId,
45+
StringifiedId,
4846
VDiskState,
4947
SatisfactionRank,
5048
DiskSpace,
@@ -58,7 +56,7 @@ const prepareVDiskData = (data: TVDiskStateInfo) => {
5856
} = data;
5957

6058
const vdiskData: InfoViewerItem[] = [
61-
{label: 'VDisk', value: stringifyVdiskId(VDiskId)},
59+
{label: 'VDisk', value: StringifiedId},
6260
{label: 'State', value: VDiskState ?? 'not available'},
6361
];
6462

@@ -132,7 +130,7 @@ const prepareVDiskData = (data: TVDiskStateInfo) => {
132130
};
133131

134132
interface VDiskPopupProps extends PopupProps {
135-
data: TVDiskStateInfo | UnavailableDonor;
133+
data: PreparedVDisk | UnavailableDonor;
136134
}
137135

138136
export const VDiskPopup = ({data, ...props}: VDiskPopupProps) => {

src/containers/Authentication/Authentication.tsx

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function Authentication({closable = false}: AuthenticationProps) {
2424
const history = useHistory();
2525
const location = useLocation();
2626

27-
const [authenticate, {error, isLoading}] = authenticationApi.useAuthenticateMutation(undefined);
27+
const [authenticate, {isLoading}] = authenticationApi.useAuthenticateMutation(undefined);
2828

2929
const {returnUrl} = parseQuery(location);
3030

@@ -34,15 +34,6 @@ function Authentication({closable = false}: AuthenticationProps) {
3434
const [passwordError, setPasswordError] = React.useState('');
3535
const [showPassword, setShowPassword] = React.useState(false);
3636

37-
React.useEffect(() => {
38-
if (isUserError(error)) {
39-
setLoginError(error.data.error);
40-
}
41-
if (isPasswordError(error)) {
42-
setPasswordError(error.data.error);
43-
}
44-
}, [error]);
45-
4637
const onLoginUpdate = (value: string) => {
4738
setLogin(value);
4839
setLoginError('');
@@ -54,18 +45,28 @@ function Authentication({closable = false}: AuthenticationProps) {
5445
};
5546

5647
const onLoginClick = () => {
57-
authenticate({user: login, password}).then(() => {
58-
if (returnUrl) {
59-
const decodedUrl = decodeURIComponent(returnUrl.toString());
60-
61-
// to prevent page reload we use router history
62-
// history navigates relative to origin
63-
// so we remove origin to make it work properly
64-
const url = new URL(decodedUrl);
65-
const path = url.pathname + url.search;
66-
history.replace(path);
67-
}
68-
});
48+
authenticate({user: login, password})
49+
.unwrap()
50+
.then(() => {
51+
if (returnUrl) {
52+
const decodedUrl = decodeURIComponent(returnUrl.toString());
53+
54+
// to prevent page reload we use router history
55+
// history navigates relative to origin
56+
// so we remove origin to make it work properly
57+
const url = new URL(decodedUrl);
58+
const path = url.pathname + url.search;
59+
history.replace(path);
60+
}
61+
})
62+
.catch((error) => {
63+
if (isUserError(error)) {
64+
setLoginError(error.data.error);
65+
}
66+
if (isPasswordError(error)) {
67+
setPasswordError(error.data.error);
68+
}
69+
});
6970
};
7071

7172
const onEnterClick = (e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {

src/containers/Storage/Disks/Disks.tsx

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

33
import {VDisk} from '../../../components/VDisk/VDisk';
44
import {cn} from '../../../utils/cn';
5-
import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters';
65
import {getPDiskId} from '../../../utils/disks/helpers';
76
import type {PreparedVDisk} from '../../../utils/disks/types';
87
import {PDisk} from '../PDisk';
@@ -30,7 +29,7 @@ export function Disks({vDisks = [], viewContext}: DisksProps) {
3029
<div className={b('vdisks-wrapper')}>
3130
{vDisks?.map((vDisk) => (
3231
<VDiskItem
33-
key={stringifyVdiskId(vDisk.VDiskId)}
32+
key={vDisk.StringifiedId}
3433
vDisk={vDisk}
3534
inactive={!isVdiskActive(vDisk, viewContext)}
3635
highlightedVDisk={highlightedVDisk}
@@ -64,7 +63,7 @@ function VDiskItem({vDisk, highlightedVDisk, inactive, setHighlightedVDisk}: Dis
6463
// Do not show PDisk popup for VDisk
6564
const vDiskToShow = {...vDisk, PDisk: undefined};
6665

67-
const vDiskId = stringifyVdiskId(vDisk.VDiskId);
66+
const vDiskId = vDisk.StringifiedId;
6867

6968
return (
7069
<div
@@ -87,7 +86,7 @@ function VDiskItem({vDisk, highlightedVDisk, inactive, setHighlightedVDisk}: Dis
8786
}
8887

8988
function PDiskItem({vDisk, highlightedVDisk, setHighlightedVDisk}: DisksItemProps) {
90-
const vDiskId = stringifyVdiskId(vDisk.VDiskId);
89+
const vDiskId = vDisk.StringifiedId;
9190

9291
if (!vDisk.PDisk) {
9392
return null;

src/containers/Storage/PDisk/PDisk.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {VDisk} from '../../../components/VDisk/VDisk';
77
import routes, {createHref, getPDiskPagePath} from '../../../routes';
88
import {valueIsDefined} from '../../../utils';
99
import {cn} from '../../../utils/cn';
10-
import {stringifyVdiskId} from '../../../utils/dataFormatters/dataFormatters';
1110
import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types';
1211
import {STRUCTURE} from '../../Node/NodePages';
1312
import type {StorageViewContext} from '../types';
@@ -65,7 +64,7 @@ export const PDisk = ({
6564
{vDisks.map((vdisk) => {
6665
return (
6766
<div
68-
key={stringifyVdiskId(vdisk.VDiskId)}
67+
key={vdisk.StringifiedId}
6968
className={b('vdisks-item')}
7069
style={{
7170
// 1 is small enough for empty disks to be of the minimum width

src/containers/Storage/StorageGroups/columns/StorageGroupsColumns.scss

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,17 @@
2222
}
2323
}
2424
}
25+
2526
&__pool-name-wrapper {
26-
width: 230px;
27+
overflow: hidden;
28+
29+
white-space: nowrap;
30+
text-overflow: ellipsis;
31+
direction: rtl;
32+
}
33+
34+
&__pool-name {
35+
unicode-bidi: plaintext;
2736
}
2837

2938
&__group-id {

src/containers/Storage/StorageGroups/columns/columns.tsx

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {getStorageGroupPath} from '../../../../routes';
1313
import {valueIsDefined} from '../../../../utils';
1414
import {cn} from '../../../../utils/cn';
1515
import {EMPTY_DATA_PLACEHOLDER} from '../../../../utils/constants';
16-
import {formatNumber, stringifyVdiskId} from '../../../../utils/dataFormatters/dataFormatters';
16+
import {formatNumber} from '../../../../utils/dataFormatters/dataFormatters';
1717
import {isSortableStorageProperty} from '../../../../utils/storage';
1818
import {formatToMs} from '../../../../utils/timeParsers';
1919
import {bytesToGB, bytesToSpeed} from '../../../../utils/utils';
@@ -33,18 +33,17 @@ const poolNameColumn: StorageGroupsColumn = {
3333
header: STORAGE_GROUPS_COLUMNS_TITLES.PoolName,
3434
width: 250,
3535
render: ({row}) => {
36-
const splitted = row.PoolName?.split('/');
37-
return (
38-
splitted && (
39-
<CellWithPopover
40-
wrapperClassName={b('pool-name-wrapper')}
41-
content={row.PoolName}
42-
placement={['right']}
43-
behavior={PopoverBehavior.Immediate}
44-
>
45-
{splitted[splitted.length - 1]}
46-
</CellWithPopover>
47-
)
36+
return row.PoolName ? (
37+
<CellWithPopover
38+
content={row.PoolName}
39+
placement={['right']}
40+
behavior={PopoverBehavior.Immediate}
41+
className={b('pool-name-wrapper')}
42+
>
43+
<span className={b('pool-name')}>{row.PoolName}</span>
44+
</CellWithPopover>
45+
) : (
46+
EMPTY_DATA_PLACEHOLDER
4847
);
4948
},
5049
align: DataTable.LEFT,
@@ -218,7 +217,7 @@ const getVDisksColumn = (data?: GetStorageColumnsData): StorageGroupsColumn => (
218217
<div className={b('vdisks-wrapper')}>
219218
{row.VDisks?.map((vDisk) => (
220219
<VDiskWithDonorsStack
221-
key={stringifyVdiskId(vDisk.VDiskId)}
220+
key={vDisk.StringifiedId}
222221
data={vDisk}
223222
inactive={!isVdiskActive(vDisk, data?.viewContext)}
224223
className={b('vdisks-item')}

src/containers/VDiskPage/VDiskPage.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {setHeaderBreadcrumbs} from '../../store/reducers/header/header';
1919
import {vDiskApi} from '../../store/reducers/vdisk/vdisk';
2020
import {valueIsDefined} from '../../utils';
2121
import {cn} from '../../utils/cn';
22-
import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters';
2322
import {getSeverityColor, getVDiskSlotBasedId} from '../../utils/disks/helpers';
2423
import {useAutoRefreshInterval, useTypedDispatch, useTypedSelector} from '../../utils/hooks';
2524
import {StorageWrapper} from '../Storage/StorageWrapper';
@@ -142,7 +141,7 @@ export function VDiskPage() {
142141
className={vDiskPageCn('title')}
143142
entityName={vDiskPageKeyset('vdisk')}
144143
status={getSeverityColor(Severity)}
145-
id={stringifyVdiskId(vDiskData?.VDiskId)}
144+
id={vDiskData?.StringifiedId}
146145
/>
147146
);
148147
};

src/store/reducers/storage/utils.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,20 +263,40 @@ export function prepareGroupsResponse(data: StorageGroupsResponse): PreparedStor
263263
} = group;
264264

265265
const vDisks = VDisks.map((disk) => {
266-
const whiteboardVDisk = disk.Whiteboard;
267-
const whiteboardPDisk = disk.PDisk?.Whiteboard;
266+
const {
267+
Whiteboard: whiteboardVDisk,
268+
PDisk,
269+
VDiskId,
270+
NodeId,
271+
AllocatedSize,
272+
AvailableSize,
273+
DiskSpace,
274+
Status,
275+
} = disk;
276+
const whiteboardPDisk = PDisk?.Whiteboard;
268277

269-
const NodeId = disk.NodeId;
270278
const PDiskId = whiteboardPDisk?.PDiskId;
271279

272280
const whiteboardVDiskData = {
273281
...whiteboardVDisk,
274282
PDiskId,
275283
NodeId,
284+
AllocatedSize,
285+
AvailableSize,
286+
DiskSpace,
287+
Status,
276288
PDisk: {...whiteboardPDisk, NodeId},
277289
};
278290

279-
return prepareVDiskData(whiteboardVDiskData);
291+
const preparedVDiskData = prepareVDiskData(whiteboardVDiskData);
292+
293+
return {
294+
...preparedVDiskData,
295+
// There might be no Whiteboard data if cluster is not healthy
296+
// StringifiedId is formed from Whiteboard.VDiskId object
297+
// Use VDiskId string from backend in such case
298+
StringifiedId: preparedVDiskData.StringifiedId || VDiskId,
299+
};
280300
});
281301

282302
const diskSpaceStatus = getGroupDiskSpaceStatus(group);

src/utils/disks/prepareDisks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {TPDiskInfo, TPDiskStateInfo} from '../../types/api/pdisk';
22
import type {TVDiskStateInfo} from '../../types/api/vdisk';
3+
import {stringifyVdiskId} from '../dataFormatters/dataFormatters';
34

45
import {calculatePDiskSeverity} from './calculatePDiskSeverity';
56
import {calculateVDiskSeverity} from './calculateVDiskSeverity';
@@ -28,12 +29,15 @@ export function prepareVDiskData(vdiskState: TVDiskStateInfo = {}): PreparedVDis
2829

2930
const Severity = calculateVDiskSeverity(vdiskState);
3031

32+
const StringifiedId = stringifyVdiskId(vdiskState.VDiskId);
33+
3134
return {
3235
...vdiskState,
3336
PDisk,
3437
PDiskId,
3538
Donors,
3639
Severity,
40+
StringifiedId,
3741

3842
TotalSize: total,
3943
AllocatedPercent: allocatedPercent,

0 commit comments

Comments
 (0)