diff --git a/.eslintrc b/.eslintrc index 310e61218..925b92484 100644 --- a/.eslintrc +++ b/.eslintrc @@ -32,5 +32,6 @@ }, ], "curly": ["error", "all"], + "no-negated-condition": "off", }, } diff --git a/src/components/PDiskInfo/PDiskInfo.tsx b/src/components/PDiskInfo/PDiskInfo.tsx index f5e959f26..89f022ec5 100644 --- a/src/components/PDiskInfo/PDiskInfo.tsx +++ b/src/components/PDiskInfo/PDiskInfo.tsx @@ -1,7 +1,7 @@ import {Flex} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {getPDiskPagePath} from '../../routes'; -import {valueIsDefined} from '../../utils'; import {formatBytes} from '../../utils/bytesParsers'; import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; import {createPDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; @@ -52,13 +52,13 @@ function getPDiskInfo({ const generalInfo: InfoViewerItem[] = []; - if (valueIsDefined(Category)) { + if (!isNil(Category)) { generalInfo.push({label: pDiskInfoKeyset('type'), value: Type}); } - if (valueIsDefined(Path)) { + if (!isNil(Path)) { generalInfo.push({label: pDiskInfoKeyset('path'), value: Path}); } - if (valueIsDefined(Guid)) { + if (!isNil(Guid)) { generalInfo.push({label: pDiskInfoKeyset('guid'), value: Guid}); } // SerialNumber could be an empty string "" @@ -77,19 +77,19 @@ function getPDiskInfo({ const statusInfo: InfoViewerItem[] = []; - if (valueIsDefined(StatusV2)) { + if (!isNil(StatusV2)) { statusInfo.push({label: pDiskInfoKeyset('drive-status'), value: StatusV2}); } - if (valueIsDefined(State)) { + if (!isNil(State)) { statusInfo.push({label: pDiskInfoKeyset('state'), value: State}); } - if (valueIsDefined(Device)) { + if (!isNil(Device)) { statusInfo.push({ label: pDiskInfoKeyset('device'), value: , }); } - if (valueIsDefined(Realtime)) { + if (!isNil(Realtime)) { statusInfo.push({ label: pDiskInfoKeyset('realtime'), value: , @@ -109,13 +109,13 @@ function getPDiskInfo({ /> ), }); - if (valueIsDefined(NumActiveSlots) && valueIsDefined(ExpectedSlotCount)) { + if (!isNil(NumActiveSlots) && !isNil(ExpectedSlotCount)) { spaceInfo.push({ label: pDiskInfoKeyset('slots'), value: , }); } - if (valueIsDefined(LogUsedSize) && valueIsDefined(LogTotalSize)) { + if (!isNil(LogUsedSize) && !isNil(LogTotalSize)) { spaceInfo.push({ label: pDiskInfoKeyset('log-size'), value: ( @@ -127,7 +127,7 @@ function getPDiskInfo({ ), }); } - if (valueIsDefined(SystemSize)) { + if (!isNil(SystemSize)) { spaceInfo.push({ label: pDiskInfoKeyset('system-size'), value: formatBytes({value: SystemSize}), @@ -135,12 +135,8 @@ function getPDiskInfo({ } const additionalInfo: InfoViewerItem[] = []; - const shouldDisplayLinks = - (withPDiskPageLink || isUserAllowedToMakeChanges) && - valueIsDefined(PDiskId) && - valueIsDefined(nodeId); - + (withPDiskPageLink || isUserAllowedToMakeChanges) && !isNil(PDiskId) && !isNil(nodeId); if (shouldDisplayLinks) { const pDiskPagePath = getPDiskPagePath(PDiskId, nodeId); const pDiskInternalViewerPath = createPDiskDeveloperUILink({ diff --git a/src/components/PDiskPopup/PDiskPopup.tsx b/src/components/PDiskPopup/PDiskPopup.tsx index dcc1025c8..db9ffcff2 100644 --- a/src/components/PDiskPopup/PDiskPopup.tsx +++ b/src/components/PDiskPopup/PDiskPopup.tsx @@ -1,11 +1,11 @@ import React from 'react'; import {Flex} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {getPDiskPagePath} from '../../routes'; import {selectNodesMap} from '../../store/reducers/nodesList'; import {EFlag} from '../../types/api/enums'; -import {valueIsDefined} from '../../utils'; import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import {createPDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; import type {PreparedPDisk} from '../../utils/disks/types'; @@ -76,7 +76,7 @@ export const preparePDiskData = ( pdiskData.push({label: 'Device', value: Device}); } - if (withDeveloperUILink && valueIsDefined(NodeId) && valueIsDefined(PDiskId)) { + if (withDeveloperUILink && !isNil(NodeId) && !isNil(PDiskId)) { const pDiskInternalViewerPath = createPDiskDeveloperUILink({ nodeId: NodeId, pDiskId: PDiskId, @@ -111,7 +111,7 @@ interface PDiskPopupProps { export const PDiskPopup = ({data}: PDiskPopupProps) => { const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges(); const nodesMap = useTypedSelector(selectNodesMap); - const nodeData = valueIsDefined(data.NodeId) ? nodesMap?.get(data.NodeId) : undefined; + const nodeData = !isNil(data.NodeId) ? nodesMap?.get(data.NodeId) : undefined; const info = React.useMemo( () => preparePDiskData(data, nodeData, isUserAllowedToMakeChanges), [data, nodeData, isUserAllowedToMakeChanges], diff --git a/src/components/StorageGroupInfo/StorageGroupInfo.tsx b/src/components/StorageGroupInfo/StorageGroupInfo.tsx index 886a54662..c15ee6242 100644 --- a/src/components/StorageGroupInfo/StorageGroupInfo.tsx +++ b/src/components/StorageGroupInfo/StorageGroupInfo.tsx @@ -1,7 +1,7 @@ import {Flex} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import type {PreparedStorageGroup} from '../../store/reducers/storage/types'; -import {valueIsDefined} from '../../utils'; import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; import {formatToMs} from '../../utils/timeParsers'; import {bytesToSpeed} from '../../utils/utils'; @@ -43,40 +43,40 @@ export function StorageGroupInfo({data, className, ...infoViewerProps}: StorageG const storageGroupInfoFirstColumn = []; - if (valueIsDefined(GroupGeneration)) { + if (!isNil(GroupGeneration)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('group-generation'), value: GroupGeneration, }); } - if (valueIsDefined(ErasureSpecies)) { + if (!isNil(ErasureSpecies)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('erasure-species'), value: ErasureSpecies, }); } - if (valueIsDefined(MediaType)) { + if (!isNil(MediaType)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('media-type'), value: MediaType, }); } - if (valueIsDefined(Encryption)) { + if (!isNil(Encryption)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('encryption'), value: Encryption ? storageGroupInfoKeyset('yes') : storageGroupInfoKeyset('no'), }); } - if (valueIsDefined(Overall)) { + if (!isNil(Overall)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('overall'), value: , }); } - if (valueIsDefined(State)) { + if (!isNil(State)) { storageGroupInfoFirstColumn.push({label: storageGroupInfoKeyset('state'), value: State}); } - if (valueIsDefined(MissingDisks)) { + if (!isNil(MissingDisks)) { storageGroupInfoFirstColumn.push({ label: storageGroupInfoKeyset('missing-disks'), value: MissingDisks, @@ -85,7 +85,7 @@ export function StorageGroupInfo({data, className, ...infoViewerProps}: StorageG const storageGroupInfoSecondColumn = []; - if (valueIsDefined(Used) && valueIsDefined(Limit)) { + if (!isNil(Used) && !isNil(Limit)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('used-space'), value: ( @@ -98,61 +98,61 @@ export function StorageGroupInfo({data, className, ...infoViewerProps}: StorageG ), }); } - if (valueIsDefined(Available)) { + if (!isNil(Available)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('available'), value: formatStorageValuesToGb(Number(Available)), }); } - if (valueIsDefined(Usage)) { + if (!isNil(Usage)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('usage'), value: `${Usage.toFixed(2)}%`, }); } - if (valueIsDefined(DiskSpace)) { + if (!isNil(DiskSpace)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('disk-space'), value: , }); } - if (valueIsDefined(Latency)) { + if (!isNil(Latency)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency'), value: , }); } - if (valueIsDefined(LatencyPutTabletLogMs)) { + if (!isNil(LatencyPutTabletLogMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-put-tablet-log'), value: formatToMs(LatencyPutTabletLogMs), }); } - if (valueIsDefined(LatencyPutUserDataMs)) { + if (!isNil(LatencyPutUserDataMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-put-user-data'), value: formatToMs(LatencyPutUserDataMs), }); } - if (valueIsDefined(LatencyGetFastMs)) { + if (!isNil(LatencyGetFastMs)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('latency-get-fast'), value: formatToMs(LatencyGetFastMs), }); } - if (valueIsDefined(AllocationUnits)) { + if (!isNil(AllocationUnits)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('allocation-units'), value: AllocationUnits, }); } - if (valueIsDefined(Read)) { + if (!isNil(Read)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('read-throughput'), value: bytesToSpeed(Number(Read)), }); } - if (valueIsDefined(Write)) { + if (!isNil(Write)) { storageGroupInfoSecondColumn.push({ label: storageGroupInfoKeyset('write-throughput'), value: bytesToSpeed(Number(Write)), diff --git a/src/components/VDisk/utils.ts b/src/components/VDisk/utils.ts index f738878b8..ec46b50eb 100644 --- a/src/components/VDisk/utils.ts +++ b/src/components/VDisk/utils.ts @@ -1,7 +1,8 @@ +import {isNil} from 'lodash'; + import {getDefaultNodePath} from '../../containers/Node/NodePages'; import {getVDiskPagePath} from '../../routes'; import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk'; -import {valueIsDefined} from '../../utils'; import {stringifyVdiskId} from '../../utils/dataFormatters/dataFormatters'; import {isFullVDiskData} from '../../utils/disks/helpers'; @@ -11,13 +12,9 @@ export function getVDiskLink(data: TVDiskStateInfo | TVSlotId) { const isFullData = isFullVDiskData(data); const VDiskSlotId = isFullData ? data.VDiskSlotId : data.VSlotId; - if ( - valueIsDefined(VDiskSlotId) && - valueIsDefined(data.PDiskId) && - valueIsDefined(data.NodeId) - ) { + if (!isNil(VDiskSlotId) && !isNil(data.PDiskId) && !isNil(data.NodeId)) { vDiskPath = getVDiskPagePath(VDiskSlotId, data.PDiskId, data.NodeId); - } else if (valueIsDefined(data.NodeId) && isFullVDiskData(data)) { + } else if (!isNil(data.NodeId) && isFullVDiskData(data)) { vDiskPath = getDefaultNodePath( data.NodeId, { diff --git a/src/components/VDiskInfo/VDiskInfo.tsx b/src/components/VDiskInfo/VDiskInfo.tsx index cf71b2cf9..15c0c5b87 100644 --- a/src/components/VDiskInfo/VDiskInfo.tsx +++ b/src/components/VDiskInfo/VDiskInfo.tsx @@ -1,9 +1,9 @@ import React from 'react'; import {Flex} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {getVDiskPagePath} from '../../routes'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters'; import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; @@ -61,13 +61,13 @@ export function VDiskInfo({ const vdiskInfo = []; - if (valueIsDefined(VDiskSlotId)) { + if (!isNil(VDiskSlotId)) { vdiskInfo.push({label: vDiskInfoKeyset('slot-id'), value: VDiskSlotId}); } - if (valueIsDefined(StoragePoolName)) { + if (!isNil(StoragePoolName)) { vdiskInfo.push({label: vDiskInfoKeyset('pool-name'), value: StoragePoolName}); } - if (valueIsDefined(VDiskState)) { + if (!isNil(VDiskState)) { vdiskInfo.push({ label: vDiskInfoKeyset('state-status'), value: VDiskState, @@ -86,69 +86,68 @@ export function VDiskInfo({ ), }); } - if (valueIsDefined(Kind)) { + if (!isNil(Kind)) { vdiskInfo.push({label: vDiskInfoKeyset('kind'), value: Kind}); } - if (valueIsDefined(Guid)) { + if (!isNil(Guid)) { vdiskInfo.push({label: vDiskInfoKeyset('guid'), value: Guid}); } - if (valueIsDefined(IncarnationGuid)) { + if (!isNil(IncarnationGuid)) { vdiskInfo.push({label: vDiskInfoKeyset('incarnation-guid'), value: IncarnationGuid}); } - if (valueIsDefined(InstanceGuid)) { + if (!isNil(InstanceGuid)) { vdiskInfo.push({label: vDiskInfoKeyset('instance-guid'), value: InstanceGuid}); } - if (valueIsDefined(Replicated)) { + if (!isNil(Replicated)) { vdiskInfo.push({ label: vDiskInfoKeyset('replication-status'), value: Replicated ? vDiskInfoKeyset('yes') : vDiskInfoKeyset('no'), }); } - if (valueIsDefined(DiskSpace)) { + if (!isNil(DiskSpace)) { vdiskInfo.push({ label: vDiskInfoKeyset('space-status'), value: , }); } - if (valueIsDefined(SatisfactionRank?.FreshRank?.Flag)) { + if (!isNil(SatisfactionRank?.FreshRank?.Flag)) { vdiskInfo.push({ label: vDiskInfoKeyset('fresh-rank-satisfaction'), value: , }); } - if (valueIsDefined(SatisfactionRank?.LevelRank?.Flag)) { + if (!isNil(SatisfactionRank?.LevelRank?.Flag)) { vdiskInfo.push({ label: vDiskInfoKeyset('level-rank-satisfaction'), value: , }); } - if (valueIsDefined(FrontQueues)) { + if (!isNil(FrontQueues)) { vdiskInfo.push({ label: vDiskInfoKeyset('front-queues'), value: , }); } - if (valueIsDefined(HasUnreadableBlobs)) { + if (!isNil(HasUnreadableBlobs)) { vdiskInfo.push({ label: vDiskInfoKeyset('has-unreadable-blobs'), value: HasUnreadableBlobs ? vDiskInfoKeyset('yes') : vDiskInfoKeyset('no'), }); } - if (valueIsDefined(ReadThroughput)) { + if (!isNil(ReadThroughput)) { vdiskInfo.push({ label: vDiskInfoKeyset('read-throughput'), value: bytesToSpeed(ReadThroughput), }); } - if (valueIsDefined(WriteThroughput)) { + if (!isNil(WriteThroughput)) { vdiskInfo.push({ label: vDiskInfoKeyset('write-throughput'), value: bytesToSpeed(WriteThroughput), }); } - const diskParamsDefined = - valueIsDefined(PDiskId) && valueIsDefined(NodeId) && valueIsDefined(VDiskSlotId); + const diskParamsDefined = !isNil(PDiskId) && !isNil(NodeId) && !isNil(VDiskSlotId); if (diskParamsDefined) { const links: React.ReactNode[] = []; diff --git a/src/components/VDiskPopup/VDiskPopup.tsx b/src/components/VDiskPopup/VDiskPopup.tsx index b008c7445..aba806c11 100644 --- a/src/components/VDiskPopup/VDiskPopup.tsx +++ b/src/components/VDiskPopup/VDiskPopup.tsx @@ -1,11 +1,11 @@ import React from 'react'; import {Flex, Label} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {getVDiskPagePath} from '../../routes'; import {selectNodesMap} from '../../store/reducers/nodesList'; import {EFlag} from '../../types/api/enums'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import {createVDiskDeveloperUILink} from '../../utils/developerUI/developerUI'; @@ -41,12 +41,7 @@ const prepareUnavailableVDiskData = (data: UnavailableDonor, withDeveloperUILink {label: 'VSlotId', value: VSlotId ?? EMPTY_DATA_PLACEHOLDER}, ); - if ( - withDeveloperUILink && - valueIsDefined(NodeId) && - valueIsDefined(PDiskId) && - valueIsDefined(VSlotId) - ) { + if (withDeveloperUILink && !isNil(NodeId) && !isNil(PDiskId) && !isNil(VSlotId)) { const vDiskInternalViewerPath = createVDiskDeveloperUILink({ nodeId: NodeId, pDiskId: PDiskId, @@ -152,12 +147,7 @@ const prepareVDiskData = (data: PreparedVDisk, withDeveloperUILink?: boolean) => }); } - if ( - withDeveloperUILink && - valueIsDefined(NodeId) && - valueIsDefined(PDiskId) && - valueIsDefined(VDiskSlotId) - ) { + if (withDeveloperUILink && !isNil(NodeId) && !isNil(PDiskId) && !isNil(VDiskSlotId)) { const vDiskInternalViewerPath = createVDiskDeveloperUILink({ nodeId: NodeId, pDiskId: PDiskId, @@ -205,7 +195,7 @@ export const VDiskPopup = ({data}: VDiskPopupProps) => { ); const nodesMap = useTypedSelector(selectNodesMap); - const nodeData = valueIsDefined(data.NodeId) ? nodesMap?.get(data.NodeId) : undefined; + const nodeData = !isNil(data.NodeId) ? nodesMap?.get(data.NodeId) : undefined; const pdiskInfo = React.useMemo( () => isFullData && diff --git a/src/components/nodesColumns/columns.tsx b/src/components/nodesColumns/columns.tsx index afe910147..558f7fec0 100644 --- a/src/components/nodesColumns/columns.tsx +++ b/src/components/nodesColumns/columns.tsx @@ -1,9 +1,9 @@ import DataTable from '@gravity-ui/react-data-table'; import {DefinitionList} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import type {TMemoryStats, TPoolStats} from '../../types/api/nodes'; import type {TTabletStateInfo} from '../../types/api/tablet'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants'; import { @@ -313,7 +313,7 @@ export function getDiskSpaceUsageColumn(): name: NODES_COLUMNS_IDS.DiskSpaceUsage, header: NODES_COLUMNS_TITLES.DiskSpaceUsage, render: ({row}) => { - return valueIsDefined(row.DiskSpaceUsage) ? ( + return !isNil(row.DiskSpaceUsage) ? ( , ); } } const {StorageTotal, StorageUsed} = cluster; - if (valueIsDefined(StorageTotal) && valueIsDefined(StorageUsed)) { + if (!isNil(StorageTotal) && !isNil(StorageUsed)) { metricsCards.push( , ); } const {MemoryTotal, MemoryUsed} = cluster; - if (valueIsDefined(MemoryTotal) && valueIsDefined(MemoryUsed)) { + if (!isNil(MemoryTotal) && !isNil(MemoryUsed)) { metricsCards.push( , ); diff --git a/src/containers/Node/NodeStructure/Pdisk.tsx b/src/containers/Node/NodeStructure/Pdisk.tsx index 5e17e9cb9..da687a62f 100644 --- a/src/containers/Node/NodeStructure/Pdisk.tsx +++ b/src/containers/Node/NodeStructure/Pdisk.tsx @@ -4,6 +4,7 @@ import {ArrowUpRightFromSquare, CircleInfoFill} from '@gravity-ui/icons'; import DataTable from '@gravity-ui/react-data-table'; import type {Column} from '@gravity-ui/react-data-table'; import {ArrowToggle, Button, Icon, Popover} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import isEmpty from 'lodash/isEmpty'; import {PDiskInfo} from '../../../components/PDiskInfo/PDiskInfo'; @@ -17,7 +18,6 @@ import type { import {EFlag} from '../../../types/api/enums'; import {EVDiskState} from '../../../types/api/vdisk'; import type {ValueOf} from '../../../types/common'; -import {valueIsDefined} from '../../../utils'; import {cn} from '../../../utils/cn'; import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters'; @@ -73,11 +73,7 @@ function getColumns({ const vDiskSlotId = row.VDiskSlotId; let vdiskInternalViewerLink = null; - if ( - valueIsDefined(nodeId) && - valueIsDefined(pDiskId) && - valueIsDefined(vDiskSlotId) - ) { + if (!isNil(nodeId) && !isNil(pDiskId) && !isNil(vDiskSlotId)) { vdiskInternalViewerLink = createVDiskDeveloperUILink({ nodeId, pDiskId, diff --git a/src/containers/PDiskPage/PDiskPage.tsx b/src/containers/PDiskPage/PDiskPage.tsx index d7efbbfd8..a19e45984 100644 --- a/src/containers/PDiskPage/PDiskPage.tsx +++ b/src/containers/PDiskPage/PDiskPage.tsx @@ -3,6 +3,7 @@ import React from 'react'; import {ArrowRotateLeft} from '@gravity-ui/icons'; import {Icon, Tabs} from '@gravity-ui/uikit'; import {skipToken} from '@reduxjs/toolkit/query'; +import {isNil} from 'lodash'; import {Helmet} from 'react-helmet-async'; import {StringParam, useQueryParams} from 'use-query-params'; import {z} from 'zod'; @@ -20,7 +21,6 @@ import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks'; import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; import {pDiskApi} from '../../store/reducers/pdisk/pdisk'; import type {EDecommitStatus} from '../../types/api/pdisk'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {getPDiskId, getSeverityColor} from '../../utils/disks/helpers'; import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks'; @@ -70,8 +70,7 @@ export function PDiskPage() { nodeId: StringParam, pDiskId: StringParam, }); - - const pDiskParamsDefined = valueIsDefined(nodeId) && valueIsDefined(pDiskId); + const pDiskParamsDefined = !isNil(nodeId) && !isNil(pDiskId); const pDiskTab = pDiskTabSchema.parse(activeTab); diff --git a/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx b/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx index c0e50afda..d7f3ae803 100644 --- a/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx +++ b/src/containers/PDiskPage/PDiskSpaceDistribution/PDiskSpaceDistribution.tsx @@ -1,3 +1,5 @@ +import {isNil} from 'lodash'; + import {DiskStateProgressBar} from '../../../components/DiskStateProgressBar/DiskStateProgressBar'; import {HoverPopup} from '../../../components/HoverPopup/HoverPopup'; import type {InfoViewerItem} from '../../../components/InfoViewer'; @@ -13,7 +15,6 @@ import type { SlotItem, SlotItemType, } from '../../../store/reducers/pdisk/types'; -import {valueIsDefined} from '../../../utils'; import {formatBytes} from '../../../utils/bytesParsers'; import {cn} from '../../../utils/cn'; import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters'; @@ -78,9 +79,7 @@ function Slot({item, pDiskId, nodeId}: SlotProps) { const renderContent = () => { if (isVDiskSlot(item)) { const vDiskPagePath = - valueIsDefined(item.SlotData?.VDiskSlotId) && - valueIsDefined(pDiskId) && - valueIsDefined(nodeId) + !isNil(item.SlotData?.VDiskSlotId) && !isNil(pDiskId) && !isNil(nodeId) ? getVDiskPagePath(item.SlotData.VDiskSlotId, pDiskId, nodeId) : undefined; @@ -185,7 +184,7 @@ function SlotContent({id, title, used, total}: SlotContentProps) { return (
- {valueIsDefined(id) ? {id} : null} + {!isNil(id) ? {id} : null} {title} {renderSize()} @@ -213,7 +212,7 @@ function LogInfo({data}: LogInfoProps) { }, ]; - if (valueIsDefined(SystemSize)) { + if (!isNil(SystemSize)) { info.push({ label: pDiskPageKeyset('label.system-size'), value: formatBytes({value: SystemSize}), diff --git a/src/containers/Storage/PDisk/PDisk.tsx b/src/containers/Storage/PDisk/PDisk.tsx index 2609607ed..160c59c4c 100644 --- a/src/containers/Storage/PDisk/PDisk.tsx +++ b/src/containers/Storage/PDisk/PDisk.tsx @@ -1,12 +1,13 @@ import React from 'react'; +import {isNil} from 'lodash'; + import {DiskStateProgressBar} from '../../../components/DiskStateProgressBar/DiskStateProgressBar'; import {HoverPopup} from '../../../components/HoverPopup/HoverPopup'; import {InternalLink} from '../../../components/InternalLink'; import {PDiskPopup} from '../../../components/PDiskPopup/PDiskPopup'; import {VDisk} from '../../../components/VDisk/VDisk'; import {getPDiskPagePath} from '../../../routes'; -import {valueIsDefined} from '../../../utils'; import {cn} from '../../../utils/cn'; import type {PreparedPDisk, PreparedVDisk} from '../../../utils/disks/types'; import type {StorageViewContext} from '../types'; @@ -38,7 +39,7 @@ export const PDisk = ({ viewContext, }: PDiskProps) => { const {NodeId, PDiskId} = data; - const pDiskIdsDefined = valueIsDefined(NodeId) && valueIsDefined(PDiskId); + const pDiskIdsDefined = !isNil(NodeId) && !isNil(PDiskId); const anchorRef = React.useRef(null); diff --git a/src/containers/Storage/StorageGroups/columns/columns.tsx b/src/containers/Storage/StorageGroups/columns/columns.tsx index 07fccf54b..95352ea75 100644 --- a/src/containers/Storage/StorageGroups/columns/columns.tsx +++ b/src/containers/Storage/StorageGroups/columns/columns.tsx @@ -1,13 +1,13 @@ import {ShieldKeyhole} from '@gravity-ui/icons'; import DataTable from '@gravity-ui/react-data-table'; import {Icon, Label, Popover, PopoverBehavior} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {CellWithPopover} from '../../../../components/CellWithPopover/CellWithPopover'; import {EntityStatus} from '../../../../components/EntityStatus/EntityStatus'; import {StatusIcon} from '../../../../components/StatusIcon/StatusIcon'; import {UsageLabel} from '../../../../components/UsageLabel/UsageLabel'; import {getStorageGroupPath} from '../../../../routes'; -import {valueIsDefined} from '../../../../utils'; import {cn} from '../../../../utils/cn'; import {EMPTY_DATA_PLACEHOLDER} from '../../../../utils/constants'; import {formatNumber} from '../../../../utils/dataFormatters/dataFormatters'; @@ -115,7 +115,7 @@ const usageColumn: StorageGroupsColumn = { width: 85, resizeMinWidth: 75, render: ({row}) => { - return valueIsDefined(row.Usage) ? ( + return !isNil(row.Usage) ? ( ) : ( EMPTY_DATA_PLACEHOLDER @@ -129,7 +129,7 @@ const diskSpaceUsageColumn: StorageGroupsColumn = { width: 115, resizeMinWidth: 75, render: ({row}) => { - return valueIsDefined(row.DiskSpaceUsage) ? ( + return !isNil(row.DiskSpaceUsage) ? ( { - return valueIsDefined(row.LatencyPutTabletLogMs) + return !isNil(row.LatencyPutTabletLogMs) ? formatToMs(row.LatencyPutTabletLogMs) : EMPTY_DATA_PLACEHOLDER; }, @@ -228,7 +228,7 @@ const allocationUnitsColumn: StorageGroupsColumn = { header: STORAGE_GROUPS_COLUMNS_TITLES.AllocationUnits, width: 150, render: ({row}) => { - return valueIsDefined(row.AllocationUnits) + return !isNil(row.AllocationUnits) ? formatNumber(row.AllocationUnits) : EMPTY_DATA_PLACEHOLDER; }, diff --git a/src/containers/Storage/utils/index.ts b/src/containers/Storage/utils/index.ts index 331e86475..1e7a56f85 100644 --- a/src/containers/Storage/utils/index.ts +++ b/src/containers/Storage/utils/index.ts @@ -1,9 +1,10 @@ import React from 'react'; +import {isNil} from 'lodash'; + import {selectNodesMap} from '../../../store/reducers/nodesList'; import type {PreparedStorageGroup} from '../../../store/reducers/storage/types'; import type {Erasure} from '../../../types/api/storage'; -import {valueIsDefined} from '../../../utils'; import type {PreparedVDisk} from '../../../utils/disks/types'; import {generateEvaluator} from '../../../utils/generateEvaluator'; import {useTypedSelector} from '../../../utils/hooks'; @@ -29,19 +30,19 @@ export const getDegradedSeverity = (group: PreparedStorageGroup) => { export function isVdiskActive(vDisk: PreparedVDisk, viewContext?: StorageViewContext) { let isActive = true; - if (valueIsDefined(vDisk.VDiskId?.GroupID) && viewContext?.groupId) { + if (!isNil(vDisk.VDiskId?.GroupID) && viewContext?.groupId) { isActive &&= String(vDisk.VDiskId.GroupID) === viewContext.groupId; } - if (valueIsDefined(vDisk.NodeId) && viewContext?.nodeId) { + if (!isNil(vDisk.NodeId) && viewContext?.nodeId) { isActive &&= String(vDisk.NodeId) === viewContext.nodeId; } - if (valueIsDefined(vDisk.PDiskId) && viewContext?.pDiskId) { + if (!isNil(vDisk.PDiskId) && viewContext?.pDiskId) { isActive &&= String(vDisk.PDiskId) === viewContext.pDiskId; } - if (valueIsDefined(vDisk.VDiskSlotId) && viewContext?.vDiskSlotId) { + if (!isNil(vDisk.VDiskSlotId) && viewContext?.vDiskSlotId) { isActive &&= String(vDisk.VDiskSlotId) === viewContext.vDiskSlotId; } @@ -57,11 +58,7 @@ const DEFAULT_ENTITIES_COUNT = 10; export function getStorageNodesInitialEntitiesCount( context?: StorageViewContext, ): number | undefined { - if ( - valueIsDefined(context?.nodeId) || - valueIsDefined(context?.pDiskId) || - valueIsDefined(context?.vDiskSlotId) - ) { + if (!isNil(context?.nodeId) || !isNil(context?.pDiskId) || !isNil(context?.vDiskSlotId)) { return 1; } @@ -75,10 +72,10 @@ export function getStorageNodesInitialEntitiesCount( export function getStorageGroupsInitialEntitiesCount( context?: StorageViewContext, ): number | undefined { - if (valueIsDefined(context?.groupId)) { + if (!isNil(context?.groupId)) { return 1; } - if (valueIsDefined(context?.vDiskSlotId)) { + if (!isNil(context?.vDiskSlotId)) { return 1; } diff --git a/src/containers/StorageGroupPage/StorageGroupPage.tsx b/src/containers/StorageGroupPage/StorageGroupPage.tsx index edfc9cb66..3a4b4caae 100644 --- a/src/containers/StorageGroupPage/StorageGroupPage.tsx +++ b/src/containers/StorageGroupPage/StorageGroupPage.tsx @@ -1,6 +1,7 @@ import React from 'react'; import {skipToken} from '@reduxjs/toolkit/query'; +import {isNil} from 'lodash'; import {Helmet} from 'react-helmet-async'; import {StringParam, useQueryParams} from 'use-query-params'; @@ -16,7 +17,6 @@ import { import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; import {storageApi} from '../../store/reducers/storage/storage'; import {EFlag} from '../../types/api/enums'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks'; import {PaginatedStorage} from '../Storage/PaginatedStorage'; @@ -41,7 +41,7 @@ export function StorageGroupPage() { const shouldUseGroupsHandler = useStorageGroupsHandlerAvailable(); const capabilitiesLoaded = useCapabilitiesLoaded(); const groupQuery = storageApi.useGetStorageGroupsInfoQuery( - valueIsDefined(groupId) + !isNil(groupId) ? {groupId, shouldUseGroupsHandler, with: 'all', fieldsRequired: 'all'} : skipToken, { diff --git a/src/containers/Tablets/Tablets.tsx b/src/containers/Tablets/Tablets.tsx index 284435e53..104b3673b 100644 --- a/src/containers/Tablets/Tablets.tsx +++ b/src/containers/Tablets/Tablets.tsx @@ -1,8 +1,8 @@ import {skipToken} from '@reduxjs/toolkit/query'; +import {isNil} from 'lodash'; import {selectTabletsWithFqdn, tabletsApi} from '../../store/reducers/tablets'; import type {TabletsApiRequestParams} from '../../types/store/tablets'; -import {valueIsDefined} from '../../utils'; import {useAutoRefreshInterval, useTypedSelector} from '../../utils/hooks'; import {TabletsTable} from './TabletsTable'; @@ -17,7 +17,7 @@ export function Tablets({nodeId, path, database}: TabletsProps) { const [autoRefreshInterval] = useAutoRefreshInterval(); let params: TabletsApiRequestParams = {}; - if (valueIsDefined(nodeId)) { + if (!isNil(nodeId)) { params = {nodeId, database}; } else if (path) { params = {path, database}; diff --git a/src/containers/Tenant/Acl/Acl.tsx b/src/containers/Tenant/Acl/Acl.tsx index 9d85d9a32..e94bbe5c1 100644 --- a/src/containers/Tenant/Acl/Acl.tsx +++ b/src/containers/Tenant/Acl/Acl.tsx @@ -4,12 +4,12 @@ import {DefinitionList} from '@gravity-ui/components'; import type {DefinitionListItem} from '@gravity-ui/components'; import {SquareCheck} from '@gravity-ui/icons'; import {Icon} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import {ResponseError} from '../../../components/Errors/ResponseError'; import {Loader} from '../../../components/Loader'; import {schemaAclApi} from '../../../store/reducers/schemaAcl/schemaAcl'; import type {TACE} from '../../../types/api/acl'; -import {valueIsDefined} from '../../../utils'; import {cn} from '../../../utils/cn'; import i18n from './i18n'; @@ -113,7 +113,7 @@ function getAclListItems(acl?: TACE[]): DefinitionListItem[] { } return undefined; }) - .filter(valueIsDefined), + .filter((value) => !isNil(value)), }; }); } diff --git a/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.tsx b/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.tsx index b96e78fef..bf5976446 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/TableInfo/prepareTableInfo.tsx @@ -1,4 +1,5 @@ import {Text} from '@gravity-ui/uikit'; +import {isNil} from 'lodash'; import omit from 'lodash/omit'; import {toFormattedSize} from '../../../../../components/FormattedBytes/utils'; @@ -18,7 +19,6 @@ import type { TTTLSettings, } from '../../../../../types/api/schema'; import {EPathType} from '../../../../../types/api/schema'; -import {valueIsDefined} from '../../../../../utils'; import {formatBytes, formatNumber} from '../../../../../utils/dataFormatters/dataFormatters'; import {formatDurationToShortTimeFormat} from '../../../../../utils/timeParsers'; import {isNumeric} from '../../../../../utils/utils'; @@ -129,7 +129,7 @@ const prepareTableGeneralInfo = (PartitionConfig: TPartitionConfig, TTLSettings? } } - if (valueIsDefined(EnableFilterByKey)) { + if (!isNil(EnableFilterByKey)) { generalTableInfo.push({ label: i18n('label.bloom-filter'), value: EnableFilterByKey ? i18n('enabled') : i18n('disabled'), diff --git a/src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx b/src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx index 4f9b8070f..2f9f88a0f 100644 --- a/src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx +++ b/src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx @@ -3,6 +3,7 @@ // In this case we can store state of tree - uploaded entities, opened nodes, selected entity and so on import React from 'react'; +import {isNil} from 'lodash'; import {NavigationTree} from 'ydb-ui-components'; import {getConnectToDBDialog} from '../../../../components/ConnectToDB/ConnectToDBDialog'; @@ -11,7 +12,6 @@ import {selectIsDirty, selectUserInput} from '../../../../store/reducers/query/q import {schemaApi} from '../../../../store/reducers/schema/schema'; import {tableSchemaDataApi} from '../../../../store/reducers/tableSchemaData'; import type {EPathType, TEvDescribeSchemeResult} from '../../../../types/api/schema'; -import {valueIsDefined} from '../../../../utils'; import { useQueryExecutionSettings, useTypedDispatch, @@ -85,10 +85,9 @@ export function SchemaTree(props: SchemaTreeProps) { const childItems = Children.map((childData) => { const {Name = '', PathType, PathSubType, ChildrenExist} = childData; - const isChildless = isChildlessPathType(PathType, PathSubType) || - (valueIsDefined(ChildrenExist) && !ChildrenExist); + (!isNil(ChildrenExist) && !ChildrenExist); return { name: Name, diff --git a/src/containers/VDiskPage/VDiskPage.tsx b/src/containers/VDiskPage/VDiskPage.tsx index 922e11be0..159fd7f90 100644 --- a/src/containers/VDiskPage/VDiskPage.tsx +++ b/src/containers/VDiskPage/VDiskPage.tsx @@ -3,6 +3,7 @@ import React from 'react'; import {ArrowsOppositeToDots} from '@gravity-ui/icons'; import {Icon} from '@gravity-ui/uikit'; import {skipToken} from '@reduxjs/toolkit/query'; +import {isNil} from 'lodash'; import {Helmet} from 'react-helmet-async'; import {StringParam, useQueryParams} from 'use-query-params'; @@ -17,7 +18,6 @@ import {useDiskPagesAvailable} from '../../store/reducers/capabilities/hooks'; import {setHeaderBreadcrumbs} from '../../store/reducers/header/header'; import {vDiskApi} from '../../store/reducers/vdisk/vdisk'; import type {ModifyDiskResponse} from '../../types/api/modifyDisk'; -import {valueIsDefined} from '../../utils'; import {cn} from '../../utils/cn'; import {getSeverityColor, getVDiskSlotBasedId} from '../../utils/disks/helpers'; import {useAutoRefreshInterval, useTypedDispatch} from '../../utils/hooks'; @@ -49,7 +49,7 @@ export function VDiskPage() { const [autoRefreshInterval] = useAutoRefreshInterval(); const params = - valueIsDefined(nodeId) && valueIsDefined(pDiskId) && valueIsDefined(vDiskSlotId) + !isNil(nodeId) && !isNil(pDiskId) && !isNil(vDiskSlotId) ? {nodeId, pDiskId, vDiskSlotId} : skipToken; const { @@ -63,11 +63,11 @@ export function VDiskPage() { const {NodeHost, NodeId, NodeType, NodeDC, PDiskId, PDiskType, Severity, VDiskId} = vDiskData; const {GroupID, GroupGeneration, Ring, Domain, VDisk} = VDiskId || {}; const vDiskIdParamsDefined = - valueIsDefined(GroupID) && - valueIsDefined(GroupGeneration) && - valueIsDefined(Ring) && - valueIsDefined(Domain) && - valueIsDefined(VDisk); + !isNil(GroupID) && + !isNil(GroupGeneration) && + !isNil(Ring) && + !isNil(Domain) && + !isNil(VDisk); const handleEvictVDisk = async (isRetry?: boolean) => { if (vDiskIdParamsDefined) { @@ -181,7 +181,7 @@ export function VDiskPage() { }; const renderStorageInfo = () => { - if (valueIsDefined(GroupID) && valueIsDefined(nodeId)) { + if (!isNil(GroupID) && !isNil(nodeId)) { return (
{vDiskPageKeyset('storage')}
diff --git a/src/store/reducers/pdisk/utils.ts b/src/store/reducers/pdisk/utils.ts index e0daa5d7c..1a6586a63 100644 --- a/src/store/reducers/pdisk/utils.ts +++ b/src/store/reducers/pdisk/utils.ts @@ -1,6 +1,8 @@ +import {isNil} from 'lodash'; + import type {TPDiskInfoResponse} from '../../../types/api/pdisk'; import type {TEvSystemStateResponse} from '../../../types/api/systemState'; -import {getArray, valueIsDefined} from '../../../utils'; +import {getArray} from '../../../utils'; import {getSpaceSeverity} from '../../../utils/disks/helpers'; import { prepareWhiteboardPDiskData, @@ -39,8 +41,7 @@ export function preparePDiskDataResponse([pdiskResponse = {}, nodeResponse]: [ } = preparedPDisk; let logSlot: SlotItem<'log'> | undefined; - - if (valueIsDefined(LogTotalSize)) { + if (!isNil(LogTotalSize)) { const usagePercent = (Number(LogUsedSize) * 100) / Number(LogTotalSize); logSlot = { diff --git a/src/utils/disks/helpers.ts b/src/utils/disks/helpers.ts index 84c35aac1..f84c71d3f 100644 --- a/src/utils/disks/helpers.ts +++ b/src/utils/disks/helpers.ts @@ -1,4 +1,5 @@ -import {valueIsDefined} from '..'; +import {isNil} from 'lodash'; + import {EFlag} from '../../types/api/enums'; import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk'; import {generateEvaluator} from '../generateEvaluator'; @@ -19,7 +20,7 @@ export function isFullVDiskData( const getSpaceFlag = generateEvaluator([EFlag.Green, EFlag.Yellow, EFlag.Red]); export const getSpaceSeverity = (allocatedPercent?: number) => { - return valueIsDefined(allocatedPercent) ? getColorSeverity(getSpaceFlag(allocatedPercent)) : 0; + return !isNil(allocatedPercent) ? getColorSeverity(getSpaceFlag(allocatedPercent)) : 0; }; export function getSeverityColor(severity: number | undefined) { @@ -35,7 +36,7 @@ export function getColorSeverity(color?: EFlag) { } export function getPDiskId(nodeId?: string | number | null, pDiskId?: string | number | null) { - if (valueIsDefined(nodeId) && valueIsDefined(pDiskId)) { + if (!isNil(nodeId) && !isNil(pDiskId)) { return `${nodeId}-${pDiskId}`; } return undefined; diff --git a/src/utils/index.ts b/src/utils/index.ts index 8957aa474..a90ff0dce 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -2,10 +2,6 @@ export const getArray = (arrayLength: number) => { return [...Array(arrayLength).keys()]; }; -export function valueIsDefined(value: T | null | undefined): value is T { - return value !== null && value !== undefined; -} - export async function wait(time: number, value?: T): Promise { return new Promise((resolve) => { setTimeout(() => resolve(value), time); diff --git a/src/utils/nodes.ts b/src/utils/nodes.ts index 48c34d568..1640e2e1a 100644 --- a/src/utils/nodes.ts +++ b/src/utils/nodes.ts @@ -1,3 +1,4 @@ +import {isNil} from 'lodash'; import {z} from 'zod'; import {ProblemFilterValues} from '../store/reducers/settings/settings'; @@ -9,8 +10,6 @@ import type {NodesMap} from '../types/store/nodesList'; import {HOUR_IN_SECONDS} from './constants'; -import {valueIsDefined} from '.'; - export enum NodesUptimeFilterValues { 'All' = 'All', 'SmallUptime' = 'SmallUptime', @@ -33,7 +32,7 @@ export const isUnavailableNode = < export const prepareNodesMap = (nodesList?: TNodeInfo[]) => { return nodesList?.reduce((nodeHosts, node) => { - if (valueIsDefined(node.Id)) { + if (!isNil(node.Id)) { nodeHosts.set(node.Id, { Host: node.Host, DC: node.PhysicalLocation?.DataCenterId, @@ -46,7 +45,7 @@ export const prepareNodesMap = (nodesList?: TNodeInfo[]) => { export function calculateLoadAveragePercents(node: TSystemStateInfo = {}) { const {LoadAverage, NumberOfCpus} = node; - if (!valueIsDefined(LoadAverage) || !valueIsDefined(NumberOfCpus)) { + if (isNil(LoadAverage) || isNil(NumberOfCpus)) { return undefined; } @@ -76,7 +75,7 @@ export function prepareNodeSystemState( // 0 limit means that limit is not set, so it should be undefined const SharedCacheLimit = Number(systemState.SharedCacheStats?.LimitBytes) || undefined; - const SharedCacheUsed = valueIsDefined(systemState.SharedCacheStats?.UsedBytes) + const SharedCacheUsed = !isNil(systemState.SharedCacheStats?.UsedBytes) ? Number(systemState.SharedCacheStats?.UsedBytes) : undefined;